IDE: conditional compiler options: editing

git-svn-id: trunk@17950 -
This commit is contained in:
mattias 2008-12-26 11:32:17 +00:00
parent 4598b5b3a6
commit 98dfb8d966
4 changed files with 267 additions and 17 deletions

View File

@ -27,52 +27,62 @@ object CompOptsConditionalsFrame: TCompOptsConditionalsFrame
Options = [tvoAutoExpand, tvoAutoInsertMark, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoRowSelect, tvoShowButtons, tvoShowLines, tvoShowSeparators, tvoToolTips]
end
object COCPopupMenu: TPopupMenu
OnPopup = COCPopupMenuPopup
left = 48
top = 48
object InsertAboveMenuItem: TMenuItem
Caption = 'InsertAboveMenuItem'
RightJustify = False
ShowAlwaysCheckable = False
OnClick = InsertAboveMenuItemClick
end
object InsertBelowMenuItem: TMenuItem
Caption = 'InsertBelowMenuItem'
RightJustify = False
ShowAlwaysCheckable = False
OnClick = InsertBelowMenuItemClick
end
object InsertChildMenuItem: TMenuItem
Caption = 'InsertChildMenuItem'
RightJustify = False
ShowAlwaysCheckable = False
OnClick = InsertChildMenuItemClick
end
object DeleteMenuItem: TMenuItem
Caption = 'DeleteMenuItem'
RightJustify = False
ShowAlwaysCheckable = False
OnClick = DeleteMenuItemClick
end
object MoveUpMenuItem: TMenuItem
Caption = 'MoveUpMenuItem'
RightJustify = False
ShowAlwaysCheckable = False
OnClick = MoveUpMenuItemClick
end
object MoveDownMenuItem: TMenuItem
Caption = 'MoveDownMenuItem'
RightJustify = False
ShowAlwaysCheckable = False
OnClick = MoveDownMenuItemClick
end
object MoveLvlUpMenuItem: TMenuItem
Caption = 'MoveLvlUpMenuItem'
RightJustify = False
ShowAlwaysCheckable = False
OnClick = MoveLvlUpMenuItemClick
end
object MoveLvlDownMenuItem: TMenuItem
Caption = 'MoveLvlDownMenuItem'
RightJustify = False
ShowAlwaysCheckable = False
OnClick = MoveLvlDownMenuItemClick
end
object PropertiesMenuItem: TMenuItem
Caption = 'PropertiesMenuItem'
RightJustify = False
ShowAlwaysCheckable = False
OnClick = PropertiesMenuItemClick
end
end
end

View File

@ -11,19 +11,25 @@ LazarusResources.Add('TCompOptsConditionalsFrame','FORMDATA',[
+'oAutoExpand'#17'tvoAutoInsertMark'#17'tvoAutoItemHeight'#16'tvoHideSelectio'
+'n'#21'tvoKeepCollapsedNodes'#11'tvoReadOnly'#12'tvoRowSelect'#14'tvoShowBut'
+'tons'#12'tvoShowLines'#17'tvoShowSeparators'#11'tvoToolTips'#0#0#0#10'TPopu'
+'pMenu'#12'COCPopupMenu'#4'left'#2'0'#3'top'#2'0'#0#9'TMenuItem'#19'InsertAb'
+'oveMenuItem'#7'Caption'#6#19'InsertAboveMenuItem'#12'RightJustify'#8#19'Sho'
+'wAlwaysCheckable'#8#0#0#9'TMenuItem'#19'InsertBelowMenuItem'#7'Caption'#6#19
+'InsertBelowMenuItem'#12'RightJustify'#8#19'ShowAlwaysCheckable'#8#0#0#9'TMe'
+'nuItem'#19'InsertChildMenuItem'#7'Caption'#6#19'InsertChildMenuItem'#12'Rig'
+'htJustify'#8#19'ShowAlwaysCheckable'#8#0#0#9'TMenuItem'#14'DeleteMenuItem'#7
+'Caption'#6#14'DeleteMenuItem'#12'RightJustify'#8#19'ShowAlwaysCheckable'#8#0
+#0#9'TMenuItem'#14'MoveUpMenuItem'#7'Caption'#6#14'MoveUpMenuItem'#12'RightJ'
+'ustify'#8#19'ShowAlwaysCheckable'#8#0#0#9'TMenuItem'#16'MoveDownMenuItem'#7
+'Caption'#6#16'MoveDownMenuItem'#12'RightJustify'#8#19'ShowAlwaysCheckable'#8
+#0#0#9'TMenuItem'#17'MoveLvlUpMenuItem'#7'Caption'#6#17'MoveLvlUpMenuItem'#12
+'RightJustify'#8#19'ShowAlwaysCheckable'#8#0#0#9'TMenuItem'#19'MoveLvlDownMe'
+'nuItem'#7'Caption'#6#19'MoveLvlDownMenuItem'#12'RightJustify'#8#19'ShowAlwa'
+'ysCheckable'#8#0#0#9'TMenuItem'#18'PropertiesMenuItem'#7'Caption'#6#18'Prop'
+'ertiesMenuItem'#12'RightJustify'#8#19'ShowAlwaysCheckable'#8#0#0#0#0
+'pMenu'#12'COCPopupMenu'#7'OnPopup'#7#17'COCPopupMenuPopup'#4'left'#2'0'#3't'
+'op'#2'0'#0#9'TMenuItem'#19'InsertAboveMenuItem'#7'Caption'#6#19'InsertAbove'
+'MenuItem'#12'RightJustify'#8#19'ShowAlwaysCheckable'#8#7'OnClick'#7#24'Inse'
+'rtAboveMenuItemClick'#0#0#9'TMenuItem'#19'InsertBelowMenuItem'#7'Caption'#6
+#19'InsertBelowMenuItem'#12'RightJustify'#8#19'ShowAlwaysCheckable'#8#7'OnCl'
+'ick'#7#24'InsertBelowMenuItemClick'#0#0#9'TMenuItem'#19'InsertChildMenuItem'
+#7'Caption'#6#19'InsertChildMenuItem'#12'RightJustify'#8#19'ShowAlwaysChecka'
+'ble'#8#7'OnClick'#7#24'InsertChildMenuItemClick'#0#0#9'TMenuItem'#14'Delete'
+'MenuItem'#7'Caption'#6#14'DeleteMenuItem'#12'RightJustify'#8#19'ShowAlwaysC'
+'heckable'#8#7'OnClick'#7#19'DeleteMenuItemClick'#0#0#9'TMenuItem'#14'MoveUp'
+'MenuItem'#7'Caption'#6#14'MoveUpMenuItem'#12'RightJustify'#8#19'ShowAlwaysC'
+'heckable'#8#7'OnClick'#7#19'MoveUpMenuItemClick'#0#0#9'TMenuItem'#16'MoveDo'
+'wnMenuItem'#7'Caption'#6#16'MoveDownMenuItem'#12'RightJustify'#8#19'ShowAlw'
+'aysCheckable'#8#7'OnClick'#7#21'MoveDownMenuItemClick'#0#0#9'TMenuItem'#17
+'MoveLvlUpMenuItem'#7'Caption'#6#17'MoveLvlUpMenuItem'#12'RightJustify'#8#19
+'ShowAlwaysCheckable'#8#7'OnClick'#7#22'MoveLvlUpMenuItemClick'#0#0#9'TMenuI'
+'tem'#19'MoveLvlDownMenuItem'#7'Caption'#6#19'MoveLvlDownMenuItem'#12'RightJ'
+'ustify'#8#19'ShowAlwaysCheckable'#8#7'OnClick'#7#24'MoveLvlDownMenuItemClic'
+'k'#0#0#9'TMenuItem'#18'PropertiesMenuItem'#7'Caption'#6#18'PropertiesMenuIt'
+'em'#12'RightJustify'#8#19'ShowAlwaysCheckable'#8#7'OnClick'#7#23'Properties'
+'MenuItemClick'#0#0#0#0
]);

View File

@ -24,7 +24,7 @@ unit Options_Compiler_Conditionals;
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, ComCtrls, Menus,
Classes, SysUtils, FileProcs, LResources, Forms, ComCtrls, Menus, Dialogs,
ProjectIntf, IDEImagesIntf,
CompOptsModes;
@ -44,13 +44,27 @@ type
MoveLvlUpMenuItem: TMenuItem;
MoveDownMenuItem: TMenuItem;
MoveUpMenuItem: TMenuItem;
procedure COCPopupMenuPopup(Sender: TObject);
procedure DeleteMenuItemClick(Sender: TObject);
procedure InsertAboveMenuItemClick(Sender: TObject);
procedure InsertBelowMenuItemClick(Sender: TObject);
procedure InsertChildMenuItemClick(Sender: TObject);
procedure MoveDownMenuItemClick(Sender: TObject);
procedure MoveLvlDownMenuItemClick(Sender: TObject);
procedure MoveLvlUpMenuItemClick(Sender: TObject);
procedure MoveUpMenuItemClick(Sender: TObject);
procedure PropertiesMenuItemClick(Sender: TObject);
private
FConditionals: TCompOptConditionals;
FNodeTypeImageIDs: array[TCOCNodeType] of integer;
procedure SetConditionals(const AValue: TCompOptConditionals);
procedure FillTreeView;
procedure ConsistencyCheck;
function NodeToCaption(Node: TCompOptCondNode): string;
function NodeToImageIndex(Node: TCompOptCondNode): integer;
function GetSelectedNode(out COCNode: TCompOptCondNode;
out TVNode: TTreeNode; RootAsDefault: boolean): boolean;
procedure CreateNewNode(AttachMode: TNodeAttachMode);
public
constructor Create(TheOwner: TComponent); override;
property Conditionals: TCompOptConditionals read FConditionals write SetConditionals;
@ -60,6 +74,118 @@ implementation
{ TCompOptsConditionalsFrame }
procedure TCompOptsConditionalsFrame.COCPopupMenuPopup(Sender: TObject);
var
COCNode: TCompOptCondNode;
TVNode: TTreeNode;
HasSelection: Boolean;
begin
GetSelectedNode(COCNode,TVNode);
HasSelection:=COCNode<>nil;
NormalNodeIsSelectd:=HasSelection and (COCNode<>Conditionals.Root);
InsertAboveMenuItem.Enabled:=NormalNodeIsSelectd;
InsertBelowMenuItem.Enabled:=NormalNodeIsSelectd;
InsertChildMenuItem.Enabled:=true;
DeleteMenuItem.Enabled:=NormalNodeIsSelectd;
PropertiesMenuItem.Enabled:=NormalNodeIsSelectd;
MoveLvlDownMenuItem.Enabled:=NormalNodeIsSelectd and (TVNode.GetPrevSibling<>nil);
MoveLvlUpMenuItem.Enabled:=NormalNodeIsSelectd and (COCNode.Parent.Parent<>nil);
MoveDownMenuItem.Enabled:=NormalNodeIsSelectd and (TVNode.GetNextSibling<>nil);
MoveUpMenuItem.Enabled:=NormalNodeIsSelectd and (TVNode.GetPrevSibling<>nil);
end;
procedure TCompOptsConditionalsFrame.DeleteMenuItemClick(Sender: TObject);
var
COCNode: TCompOptCondNode;
TVNode: TTreeNode;
begin
if not GetSelectedNode(COCNode,TVNode,false) then exit;
if Conditionals.Root=COCNode then exit;
if MessageDlg('Delete?',
'Delete the node "'+TVNode.Text+'"?',mtConfirmation,[mbYes,mbNo],0)<>mrYes
then
exit;
TVNode.Delete;
COCNode.Free;
ConsistencyCheck;
end;
procedure TCompOptsConditionalsFrame.InsertAboveMenuItemClick(Sender: TObject);
begin
CreateNewNode(naInsert);
end;
procedure TCompOptsConditionalsFrame.InsertBelowMenuItemClick(Sender: TObject);
begin
CreateNewNode(naInsertBehind);
end;
procedure TCompOptsConditionalsFrame.InsertChildMenuItemClick(Sender: TObject);
begin
CreateNewNode(naAddChildFirst);
end;
procedure TCompOptsConditionalsFrame.MoveDownMenuItemClick(Sender: TObject);
// move selected node below sibling
var
COCNode: TCompOptCondNode;
TVNode: TTreeNode;
begin
if not GetSelectedNode(COCNode,TVNode,false) then exit;
if TVNode.GetNextSibling=nil then exit;
TVNode.MoveTo(TVNode.GetNextSibling,naInsertBehind);
COCNode.Index:=COCNode.Index+1;
ConsistencyCheck;
end;
procedure TCompOptsConditionalsFrame.MoveLvlDownMenuItemClick(Sender: TObject);
// make selected node a child of previous sibling
var
COCNode: TCompOptCondNode;
TVNode: TTreeNode;
Sibling: TCompOptCondNode;
begin
if not GetSelectedNode(COCNode,TVNode,false) then exit;
if Conditionals.Root=COCNode then exit;
if TVNode.GetPrevSibling=nil then exit;
TVNode.MoveTo(TVNode.GetPrevSibling,naAddChild);
Sibling:=COCNode.Parent.Childs[COCNode.Index-1];
COCNode.Move(Sibling,Sibling.Count);
ConsistencyCheck;
end;
procedure TCompOptsConditionalsFrame.MoveLvlUpMenuItemClick(Sender: TObject);
// make selected node a sibling of its parent (below parent)
var
COCNode: TCompOptCondNode;
TVNode: TTreeNode;
begin
if not GetSelectedNode(COCNode,TVNode,false) then exit;
if COCNode.Parent=nil then exit;
if COCNode.Parent.Parent=nil then exit;
TVNode.MoveTo(TVNode.Parent,naInsertBehind);
COCNode.Move(COCNode.Parent.Parent,COCNode.Parent.Index+1);
ConsistencyCheck;
end;
procedure TCompOptsConditionalsFrame.MoveUpMenuItemClick(Sender: TObject);
// move selected node above sibling
var
COCNode: TCompOptCondNode;
TVNode: TTreeNode;
begin
if not GetSelectedNode(COCNode,TVNode,false) then exit;
if TVNode.GetPrevSibling=nil then exit;
TVNode.MoveTo(TVNode.GetPrevSibling,naInsert);
COCNode.Index:=COCNode.Index-1;
ConsistencyCheck;
end;
procedure TCompOptsConditionalsFrame.PropertiesMenuItemClick(Sender: TObject);
begin
end;
procedure TCompOptsConditionalsFrame.SetConditionals(
const AValue: TCompOptConditionals);
begin
@ -76,7 +202,7 @@ procedure TCompOptsConditionalsFrame.FillTreeView;
i: Integer;
begin
if COCNode=nil then exit;
TVNode:=COCTreeView.Items.AddChild(ParentTVNode,NodeToCaption(COCNode));
TVNode:=COCTreeView.Items.AddChildObject(ParentTVNode,NodeToCaption(COCNode),COCNode);
TVNode.ImageIndex:=FNodeTypeImageIDs[COCNode.NodeType];
TVNode.StateIndex:=TVNode.ImageIndex;
for i:=0 to COCNode.Count-1 do
@ -90,6 +216,36 @@ begin
Add(Conditionals.Root,nil);
end;
COCTreeView.EndUpdate;
ConsistencyCheck;
end;
procedure TCompOptsConditionalsFrame.ConsistencyCheck;
procedure CheckNode(COCNode: TCompOptCondNode; TVNode: TTreeNode);
var
i: Integer;
ChildTVNode: TTreeNode;
begin
if COCNode=nil then
RaiseCatchableException('');
if TVNode=nil then
RaiseCatchableException('');
if COCNode<>TCompOptCondNode(TVNode.Data) then
RaiseCatchableException('');
ChildTVNode:=TVNode.GetFirstChild;
for i:=0 to COCNode.Count-1 do begin
CheckNode(COCNode.Childs[i],ChildTVNode);
ChildTVNode:=ChildTVNode.GetNextSibling;
end;
end;
begin
if Conditionals=nil then begin
if COCTreeView.Items.Count>0 then
RaiseCatchableException('');
end else begin
CheckNode(Conditionals.Root,COCTreeView.Items.GetFirstNode);
end;
end;
function TCompOptsConditionalsFrame.NodeToCaption(Node: TCompOptCondNode
@ -124,6 +280,47 @@ begin
Result:=ValidUTF8String(Result);
end;
function TCompOptsConditionalsFrame.NodeToImageIndex(Node: TCompOptCondNode
): integer;
begin
end;
function TCompOptsConditionalsFrame.GetSelectedNode(out
COCNode: TCompOptCondNode; out TVNode: TTreeNode;
RootAsDefault: boolean): boolean;
begin
COCNode:=nil;
TVNode:=COCTreeView.Selected;
if TVNode=nil then begin
if RootAsDefault then begin
TVNode:=COCTreeView.Items.GetFirstNode;
COCNode:=TCompOptCondNode(TVNode.Data);
end;
end else begin
COCNode:=TCompOptCondNode(TVNode.Data);
end;
Result:=COCNode<>nil;
end;
procedure TCompOptsConditionalsFrame.CreateNewNode(AttachMode: TNodeAttachMode
);
var
TVNode: TTreeNode;
COCNode: TCompOptCondNode;
s: String;
NewTVNode: TTreeNode;
begin
if not GetSelectedNode(COCNode,TVNode,true) then exit;
NewCOCNode:=TCompOptCondNode.Create(COCNode.Owner);
s:=NodeToCaption(COCNode);
NewTVNode:=COCTreeView.Items.AddObject(TVNode,s,COCNode);
NewTVNode.MoveTo(TVNode,naAddChildFirst);
NewTVNode.ImageIndex:=FNodeTypeImageIDs[NewCOCNode.NodeType];
NewTVNode.StateIndex:=NewTVNode.ImageIndex;
ConsistencyCheck;
end;
constructor TCompOptsConditionalsFrame.Create(TheOwner: TComponent);
var
nt: TCOCNodeType;

View File

@ -106,6 +106,8 @@ type
FValueType: TCOCValueType;
function GetChilds(Index: integer): TCompOptCondNode;
function GetCount: integer;
function GetIndex: integer;
procedure SetIndex(const AValue: integer);
procedure SetNodeType(const AValue: TCOCNodeType);
procedure SetValue(const AValue: string);
procedure SetValueType(const AValue: TCOCValueType);
@ -117,6 +119,7 @@ type
procedure AddLast(Child: TCompOptCondNode);
procedure Insert(Index: integer; Child: TCompOptCondNode);
procedure Move(OldIndex, NewIndex: integer);
procedure Move(NewParent: TCompOptCondNode; NewIndex: integer);
procedure Delete(Index: integer);
procedure Assign(Source: TCompOptCondNode);
property NodeType: TCOCNodeType read FNodeType write SetNodeType;
@ -126,6 +129,7 @@ type
property Parent: TCompOptCondNode read FParent;
property Count: integer read GetCount;
property Childs[Index: integer]: TCompOptCondNode read GetChilds;
property Index: integer read GetIndex write SetIndex;
end;
{ TLazCompOptConditionals }
@ -946,6 +950,23 @@ begin
Result:=fChilds.Count;
end;
function TCompOptCondNode.GetIndex: integer;
begin
if Parent=nil then
Result:=-1
else
Result:=Parent.fChilds.IndexOf(Self);
end;
procedure TCompOptCondNode.SetIndex(const AValue: integer);
var
OldIndex: LongInt;
begin
OldIndex:=GetIndex;
if OldIndex=AValue then exit;
Parent.Move(OldIndex,AValue);
end;
procedure TCompOptCondNode.SetValue(const AValue: string);
begin
if FValue=AValue then exit;
@ -1018,6 +1039,22 @@ begin
Changed;
end;
procedure TCompOptCondNode.Move(NewParent: TCompOptCondNode; NewIndex: integer
);
begin
if (NewParent=Parent) and (NewIndex=Index) then exit;
if FParent<>nil then begin
FParent.fChilds.Remove(Self);
FParent.Changed;
end;
FParent:=NewParent;
if FParent<>nil then begin
if (NewIndex<0) or (NewIndex>FParent.Count) then
NewIndex:=FParent.Count;
FParent.fChilds.Insert(NewIndex,Self);
end;
end;
procedure TCompOptCondNode.Delete(Index: integer);
begin
Childs[Index].Free;