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] Options = [tvoAutoExpand, tvoAutoInsertMark, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoRowSelect, tvoShowButtons, tvoShowLines, tvoShowSeparators, tvoToolTips]
end end
object COCPopupMenu: TPopupMenu object COCPopupMenu: TPopupMenu
OnPopup = COCPopupMenuPopup
left = 48 left = 48
top = 48 top = 48
object InsertAboveMenuItem: TMenuItem object InsertAboveMenuItem: TMenuItem
Caption = 'InsertAboveMenuItem' Caption = 'InsertAboveMenuItem'
RightJustify = False RightJustify = False
ShowAlwaysCheckable = False ShowAlwaysCheckable = False
OnClick = InsertAboveMenuItemClick
end end
object InsertBelowMenuItem: TMenuItem object InsertBelowMenuItem: TMenuItem
Caption = 'InsertBelowMenuItem' Caption = 'InsertBelowMenuItem'
RightJustify = False RightJustify = False
ShowAlwaysCheckable = False ShowAlwaysCheckable = False
OnClick = InsertBelowMenuItemClick
end end
object InsertChildMenuItem: TMenuItem object InsertChildMenuItem: TMenuItem
Caption = 'InsertChildMenuItem' Caption = 'InsertChildMenuItem'
RightJustify = False RightJustify = False
ShowAlwaysCheckable = False ShowAlwaysCheckable = False
OnClick = InsertChildMenuItemClick
end end
object DeleteMenuItem: TMenuItem object DeleteMenuItem: TMenuItem
Caption = 'DeleteMenuItem' Caption = 'DeleteMenuItem'
RightJustify = False RightJustify = False
ShowAlwaysCheckable = False ShowAlwaysCheckable = False
OnClick = DeleteMenuItemClick
end end
object MoveUpMenuItem: TMenuItem object MoveUpMenuItem: TMenuItem
Caption = 'MoveUpMenuItem' Caption = 'MoveUpMenuItem'
RightJustify = False RightJustify = False
ShowAlwaysCheckable = False ShowAlwaysCheckable = False
OnClick = MoveUpMenuItemClick
end end
object MoveDownMenuItem: TMenuItem object MoveDownMenuItem: TMenuItem
Caption = 'MoveDownMenuItem' Caption = 'MoveDownMenuItem'
RightJustify = False RightJustify = False
ShowAlwaysCheckable = False ShowAlwaysCheckable = False
OnClick = MoveDownMenuItemClick
end end
object MoveLvlUpMenuItem: TMenuItem object MoveLvlUpMenuItem: TMenuItem
Caption = 'MoveLvlUpMenuItem' Caption = 'MoveLvlUpMenuItem'
RightJustify = False RightJustify = False
ShowAlwaysCheckable = False ShowAlwaysCheckable = False
OnClick = MoveLvlUpMenuItemClick
end end
object MoveLvlDownMenuItem: TMenuItem object MoveLvlDownMenuItem: TMenuItem
Caption = 'MoveLvlDownMenuItem' Caption = 'MoveLvlDownMenuItem'
RightJustify = False RightJustify = False
ShowAlwaysCheckable = False ShowAlwaysCheckable = False
OnClick = MoveLvlDownMenuItemClick
end end
object PropertiesMenuItem: TMenuItem object PropertiesMenuItem: TMenuItem
Caption = 'PropertiesMenuItem' Caption = 'PropertiesMenuItem'
RightJustify = False RightJustify = False
ShowAlwaysCheckable = False ShowAlwaysCheckable = False
OnClick = PropertiesMenuItemClick
end end
end end
end end

View File

@ -11,19 +11,25 @@ LazarusResources.Add('TCompOptsConditionalsFrame','FORMDATA',[
+'oAutoExpand'#17'tvoAutoInsertMark'#17'tvoAutoItemHeight'#16'tvoHideSelectio' +'oAutoExpand'#17'tvoAutoInsertMark'#17'tvoAutoItemHeight'#16'tvoHideSelectio'
+'n'#21'tvoKeepCollapsedNodes'#11'tvoReadOnly'#12'tvoRowSelect'#14'tvoShowBut' +'n'#21'tvoKeepCollapsedNodes'#11'tvoReadOnly'#12'tvoRowSelect'#14'tvoShowBut'
+'tons'#12'tvoShowLines'#17'tvoShowSeparators'#11'tvoToolTips'#0#0#0#10'TPopu' +'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' +'pMenu'#12'COCPopupMenu'#7'OnPopup'#7#17'COCPopupMenuPopup'#4'left'#2'0'#3't'
+'oveMenuItem'#7'Caption'#6#19'InsertAboveMenuItem'#12'RightJustify'#8#19'Sho' +'op'#2'0'#0#9'TMenuItem'#19'InsertAboveMenuItem'#7'Caption'#6#19'InsertAbove'
+'wAlwaysCheckable'#8#0#0#9'TMenuItem'#19'InsertBelowMenuItem'#7'Caption'#6#19 +'MenuItem'#12'RightJustify'#8#19'ShowAlwaysCheckable'#8#7'OnClick'#7#24'Inse'
+'InsertBelowMenuItem'#12'RightJustify'#8#19'ShowAlwaysCheckable'#8#0#0#9'TMe' +'rtAboveMenuItemClick'#0#0#9'TMenuItem'#19'InsertBelowMenuItem'#7'Caption'#6
+'nuItem'#19'InsertChildMenuItem'#7'Caption'#6#19'InsertChildMenuItem'#12'Rig' +#19'InsertBelowMenuItem'#12'RightJustify'#8#19'ShowAlwaysCheckable'#8#7'OnCl'
+'htJustify'#8#19'ShowAlwaysCheckable'#8#0#0#9'TMenuItem'#14'DeleteMenuItem'#7 +'ick'#7#24'InsertBelowMenuItemClick'#0#0#9'TMenuItem'#19'InsertChildMenuItem'
+'Caption'#6#14'DeleteMenuItem'#12'RightJustify'#8#19'ShowAlwaysCheckable'#8#0 +#7'Caption'#6#19'InsertChildMenuItem'#12'RightJustify'#8#19'ShowAlwaysChecka'
+#0#9'TMenuItem'#14'MoveUpMenuItem'#7'Caption'#6#14'MoveUpMenuItem'#12'RightJ' +'ble'#8#7'OnClick'#7#24'InsertChildMenuItemClick'#0#0#9'TMenuItem'#14'Delete'
+'ustify'#8#19'ShowAlwaysCheckable'#8#0#0#9'TMenuItem'#16'MoveDownMenuItem'#7 +'MenuItem'#7'Caption'#6#14'DeleteMenuItem'#12'RightJustify'#8#19'ShowAlwaysC'
+'Caption'#6#16'MoveDownMenuItem'#12'RightJustify'#8#19'ShowAlwaysCheckable'#8 +'heckable'#8#7'OnClick'#7#19'DeleteMenuItemClick'#0#0#9'TMenuItem'#14'MoveUp'
+#0#0#9'TMenuItem'#17'MoveLvlUpMenuItem'#7'Caption'#6#17'MoveLvlUpMenuItem'#12 +'MenuItem'#7'Caption'#6#14'MoveUpMenuItem'#12'RightJustify'#8#19'ShowAlwaysC'
+'RightJustify'#8#19'ShowAlwaysCheckable'#8#0#0#9'TMenuItem'#19'MoveLvlDownMe' +'heckable'#8#7'OnClick'#7#19'MoveUpMenuItemClick'#0#0#9'TMenuItem'#16'MoveDo'
+'nuItem'#7'Caption'#6#19'MoveLvlDownMenuItem'#12'RightJustify'#8#19'ShowAlwa' +'wnMenuItem'#7'Caption'#6#16'MoveDownMenuItem'#12'RightJustify'#8#19'ShowAlw'
+'ysCheckable'#8#0#0#9'TMenuItem'#18'PropertiesMenuItem'#7'Caption'#6#18'Prop' +'aysCheckable'#8#7'OnClick'#7#21'MoveDownMenuItemClick'#0#0#9'TMenuItem'#17
+'ertiesMenuItem'#12'RightJustify'#8#19'ShowAlwaysCheckable'#8#0#0#0#0 +'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 interface
uses uses
Classes, SysUtils, FileUtil, LResources, Forms, ComCtrls, Menus, Classes, SysUtils, FileProcs, LResources, Forms, ComCtrls, Menus, Dialogs,
ProjectIntf, IDEImagesIntf, ProjectIntf, IDEImagesIntf,
CompOptsModes; CompOptsModes;
@ -44,13 +44,27 @@ type
MoveLvlUpMenuItem: TMenuItem; MoveLvlUpMenuItem: TMenuItem;
MoveDownMenuItem: TMenuItem; MoveDownMenuItem: TMenuItem;
MoveUpMenuItem: 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 private
FConditionals: TCompOptConditionals; FConditionals: TCompOptConditionals;
FNodeTypeImageIDs: array[TCOCNodeType] of integer; FNodeTypeImageIDs: array[TCOCNodeType] of integer;
procedure SetConditionals(const AValue: TCompOptConditionals); procedure SetConditionals(const AValue: TCompOptConditionals);
procedure FillTreeView; procedure FillTreeView;
procedure ConsistencyCheck;
function NodeToCaption(Node: TCompOptCondNode): string; function NodeToCaption(Node: TCompOptCondNode): string;
function NodeToImageIndex(Node: TCompOptCondNode): integer; function NodeToImageIndex(Node: TCompOptCondNode): integer;
function GetSelectedNode(out COCNode: TCompOptCondNode;
out TVNode: TTreeNode; RootAsDefault: boolean): boolean;
procedure CreateNewNode(AttachMode: TNodeAttachMode);
public public
constructor Create(TheOwner: TComponent); override; constructor Create(TheOwner: TComponent); override;
property Conditionals: TCompOptConditionals read FConditionals write SetConditionals; property Conditionals: TCompOptConditionals read FConditionals write SetConditionals;
@ -60,6 +74,118 @@ implementation
{ TCompOptsConditionalsFrame } { 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( procedure TCompOptsConditionalsFrame.SetConditionals(
const AValue: TCompOptConditionals); const AValue: TCompOptConditionals);
begin begin
@ -76,7 +202,7 @@ procedure TCompOptsConditionalsFrame.FillTreeView;
i: Integer; i: Integer;
begin begin
if COCNode=nil then exit; 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.ImageIndex:=FNodeTypeImageIDs[COCNode.NodeType];
TVNode.StateIndex:=TVNode.ImageIndex; TVNode.StateIndex:=TVNode.ImageIndex;
for i:=0 to COCNode.Count-1 do for i:=0 to COCNode.Count-1 do
@ -90,6 +216,36 @@ begin
Add(Conditionals.Root,nil); Add(Conditionals.Root,nil);
end; end;
COCTreeView.EndUpdate; 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; end;
function TCompOptsConditionalsFrame.NodeToCaption(Node: TCompOptCondNode function TCompOptsConditionalsFrame.NodeToCaption(Node: TCompOptCondNode
@ -124,6 +280,47 @@ begin
Result:=ValidUTF8String(Result); Result:=ValidUTF8String(Result);
end; 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); constructor TCompOptsConditionalsFrame.Create(TheOwner: TComponent);
var var
nt: TCOCNodeType; nt: TCOCNodeType;

View File

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