IDE: conditional compiler options editing

git-svn-id: trunk@17975 -
This commit is contained in:
mattias 2008-12-29 10:13:17 +00:00
parent 6951814ac4
commit 48c3eea1ce
5 changed files with 171 additions and 53 deletions

View File

@ -43,18 +43,31 @@ type
ValueTypeLabel: TLabel;
ValueLabel: TLabel;
PropsGroupBox: TGroupBox;
procedure ButtonPanel1OkClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure NodeTypeComboBoxEditingDone(Sender: TObject);
procedure ValueEditEditingDone(Sender: TObject);
procedure ValueTypeComboBoxEditingDone(Sender: TObject);
private
FNode: TCompOptCondNode;
procedure SetNode(const AValue: TCompOptCondNode);
procedure NodeChanged;
procedure NodeTypeChanged;
FOriginalNode: TCompOptCondNode;
FNodeType: TCOCNodeType;
FValueType: TCOCValueType;
FValue: string;
function GetNodeType: TCOCNodeType;
function GetValue: string;
function GetValueType: TCOCValueType;
procedure SetNodeType(const AValue: TCOCNodeType);
procedure SetOriginalNode(const AValue: TCompOptCondNode);
procedure SetValue(const AValue: string);
procedure SetValueType(const AValue: TCOCValueType);
procedure UpdateNodeTypeControls;
procedure UpdateValueControls;
public
property Node: TCompOptCondNode read FNode write SetNode;
end;
property OriginalNode: TCompOptCondNode read FOriginalNode write SetOriginalNode;
property NodeType: TCOCNodeType read GetNodeType write SetNodeType;
property ValueType: TCOCValueType read GetValueType write SetValueType;
property Value: string read GetValue write SetValue;
end;
function EditCompOptCondProperties(Node: TCompOptCondNode): TModalResult;
@ -66,7 +79,7 @@ var
begin
CompOptCondPropsDialog:=TCompOptCondPropsDialog.Create(nil);
try
CompOptCondPropsDialog.Node:=Node;
CompOptCondPropsDialog.OriginalNode:=Node;
Result:=CompOptCondPropsDialog.ShowModal;
finally
CompOptCondPropsDialog.Free;
@ -80,46 +93,108 @@ var
nt: TCOCNodeType;
vt: TCOCValueType;
begin
Caption:='Properties of conditional compiler option';
Caption:=lisPropertiesOfConditionalCompilerOption;
PropsGroupBox.Caption:=lisHlpOptsProperties;
NodeTypeLabel.Caption:='Type:';
ValueTypeLabel.Caption:='Action:';
ValueLabel.Caption:='Value:';
NodeTypeLabel.Caption:=lisUIDType;
ValueTypeLabel.Caption:=lisAction;
ValueLabel.Caption:=lisValue;
ValueTypeComboBox.Items.Clear;
NodeTypeComboBox.Items.Clear;
for nt:=Low(TCOCNodeType) to High(TCOCNodeType) do
NodeTypeComboBox.Items.Add(COCNodeTypeLocalizedName(nt));
for vt:=Low(TCOCValueType) to High(TCOCValueType) do
ValueTypeComboBox.Items.Add(COCValueTypeLocalizedName(vt));
ButtonPanel1.OKButton.OnClick:=@ButtonPanel1OkClick;
end;
procedure TCompOptCondPropsDialog.ButtonPanel1OkClick(Sender: TObject);
begin
if FOriginalNode<>nil then begin
FOriginalNode.NodeType:=NodeType;
FOriginalNode.ValueType:=ValueType;
FOriginalNode.Value:=Value;
end;
ModalResult:=mrOk;
end;
procedure TCompOptCondPropsDialog.NodeTypeComboBoxEditingDone(Sender: TObject);
begin
NodeTypeChanged;
GetNodeType;
UpdateValueControls;
end;
procedure TCompOptCondPropsDialog.ValueEditEditingDone(Sender: TObject);
begin
GetValue;
UpdateValueControls;
end;
procedure TCompOptCondPropsDialog.ValueTypeComboBoxEditingDone(Sender: TObject);
begin
GetValueType;
UpdateValueControls;
end;
procedure TCompOptCondPropsDialog.SetNode(const AValue: TCompOptCondNode);
procedure TCompOptCondPropsDialog.SetOriginalNode(const AValue: TCompOptCondNode);
begin
if FNode=AValue then exit;
FNode:=AValue;
NodeChanged;
if FOriginalNode=AValue then exit;
FOriginalNode:=AValue;
if FOriginalNode<>nil then begin
FNodeType:=FOriginalNode.NodeType;
FValueType:=FOriginalNode.ValueType;
FValue:=FOriginalNode.Value;
end else begin
FNodeType:=cocntNone;
FValueType:=cocvtNone;
FValue:='';
end;
UpdateNodeTypeControls;
end;
procedure TCompOptCondPropsDialog.NodeChanged;
function TCompOptCondPropsDialog.GetNodeType: TCOCNodeType;
var
i: LongInt;
begin
i:=NodeTypeComboBox.Items.IndexOf(NodeTypeComboBox.Text);
if i<0 then
FNodeType:=cocntNone
else
FNodeType:=TCOCNodeType(i);
Result:=FNodeType;
end;
function TCompOptCondPropsDialog.GetValue: string;
begin
FValue:=ValueEdit.Text;
Result:=FValue;
end;
function TCompOptCondPropsDialog.GetValueType: TCOCValueType;
var
i: LongInt;
begin
i:=ValueTypeComboBox.Items.IndexOf(ValueTypeComboBox.Text);
if i<0 then
FValueType:=cocvtNone
else
FValueType:=TCOCValueType(i);
Result:=FValueType;
end;
procedure TCompOptCondPropsDialog.SetNodeType(const AValue: TCOCNodeType);
begin
if FNodeType=AValue then exit;
FNodeType:=AValue;
UpdateNodeTypeControls;
end;
procedure TCompOptCondPropsDialog.UpdateNodeTypeControls;
var
NodeTypeStr: String;
begin
if Node=nil then begin
if OriginalNode=nil then begin
NodeTypeLabel.Enabled:=false;
NodeTypeComboBox.Enabled:=false;
ValueTypeLabel.Enabled:=false;
@ -128,35 +203,49 @@ begin
ValueEdit.Enabled:=false;
ValueButton.Enabled:=false;
end else begin
NodeTypeStr:=COCNodeTypeLocalizedName(Node.NodeType);
NodeTypeStr:=COCNodeTypeLocalizedName(FNodeType);
NodeTypeLabel.Enabled:=true;
NodeTypeComboBox.ItemIndex:=NodeTypeComboBox.Items.IndexOf(NodeTypeStr);
NodeTypeComboBox.Text:=NodeTypeStr;
NodeTypeChanged;
ValueEdit.Text:=Node.Value;
UpdateValueControls;
end;
end;
procedure TCompOptCondPropsDialog.NodeTypeChanged;
procedure TCompOptCondPropsDialog.UpdateValueControls;
var
s: String;
begin
if Node=nil then exit;
ValueTypeLabel.Enabled:=Node.NodeType in [cocntAddValue];
ValueTypeLabel.Enabled:=FNodeType in [cocntAddValue];
ValueTypeComboBox.Enabled:=ValueTypeLabel.Enabled;
s:=COCValueTypeLocalizedName(Node.ValueType);
s:=COCValueTypeLocalizedName(fValueType);
ValueTypeComboBox.ItemIndex:=ValueTypeComboBox.Items.IndexOf(s);
ValueTypeComboBox.Text:=s;
ValueLabel.Enabled:=Node.NodeType in [cocntNone,cocntIf,
cocntIfdef,cocntIfNdef,cocntElseIf,cocntAddValue];
ValueLabel.Enabled:=fNodeType in [cocntNone,cocntIf,
cocntIfdef,cocntIfNdef,cocntElseIf,cocntAddValue];
ValueEdit.Enabled:=ValueLabel.Enabled;
ValueButton.Enabled:=ValueLabel.Enabled;
case Node.NodeType of
case fNodeType of
cocntNone: ValueLabel.Caption:=lisResult;
cocntIf, cocntElseIf: ValueLabel.Caption:=lisExpression;
cocntIfdef, cocntIfNdef: ValueLabel.Caption:=lisCodeToolsDefsVariable;
cocntAddValue: ValueLabel.Caption:=lisAddValue;
else ValueLabel.Caption:='?';
end;
ValueEdit.Text:=FValue;
end;
procedure TCompOptCondPropsDialog.SetValue(const AValue: string);
begin
if FValue=AValue then exit;
FValue:=AValue;
ValueEdit.Text:=FValue;
end;
procedure TCompOptCondPropsDialog.SetValueType(const AValue: TCOCValueType);
begin
if FValueType=AValue then exit;
FValueType:=AValue;
UpdateValueControls;
end;
initialization

View File

@ -8,8 +8,8 @@ object CompOptsConditionalsFrame: TCompOptsConditionalsFrame
Ctl3D = False
TabOrder = 0
Visible = False
DesignLeft = 429
DesignTop = 305
DesignLeft = 434
DesignTop = 329
object COCTreeView: TTreeView
Left = 0
Height = 166
@ -22,9 +22,8 @@ object CompOptsConditionalsFrame: TCompOptsConditionalsFrame
PopupMenu = COCPopupMenu
ReadOnly = True
RowSelect = True
ShowRoot = False
TabOrder = 0
Options = [tvoAutoExpand, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoRowSelect, tvoShowButtons, tvoShowLines, tvoShowSeparators, tvoToolTips]
Options = [tvoAutoExpand, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoRowSelect, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoShowSeparators, tvoToolTips]
end
object COCPopupMenu: TPopupMenu
OnPopup = COCPopupMenuPopup

View File

@ -4,12 +4,12 @@ LazarusResources.Add('TCompOptsConditionalsFrame','FORMDATA',[
'TPF0'#26'TCompOptsConditionalsFrame'#25'CompOptsConditionalsFrame'#4'Left'#2
+#0#6'Height'#3#170#0#3'Top'#2#0#5'Width'#3#129#1#12'ClientHeight'#3#166#0#11
+'ClientWidth'#3'}'#1#5'Ctl3D'#8#8'TabOrder'#2#0#7'Visible'#8#10'DesignLeft'#3
+#173#1#9'DesignTop'#3'1'#1#0#9'TTreeView'#11'COCTreeView'#4'Left'#2#0#6'Heig'
+#178#1#9'DesignTop'#3'I'#1#0#9'TTreeView'#11'COCTreeView'#4'Left'#2#0#6'Heig'
+'ht'#3#166#0#3'Top'#2#0#5'Width'#3'}'#1#5'Align'#7#8'alClient'#10'AutoExpand'
+#9#5'Ctl3D'#8#17'DefaultItemHeight'#2#19#9'PopupMenu'#7#12'COCPopupMenu'#8'R'
+'eadOnly'#9#9'RowSelect'#9#8'ShowRoot'#8#8'TabOrder'#2#0#7'Options'#11#13'tv'
+'oAutoExpand'#17'tvoAutoItemHeight'#16'tvoHideSelection'#21'tvoKeepCollapsed'
+'Nodes'#11'tvoReadOnly'#12'tvoRowSelect'#14'tvoShowButtons'#12'tvoShowLines'
+'eadOnly'#9#9'RowSelect'#9#8'TabOrder'#2#0#7'Options'#11#13'tvoAutoExpand'#17
+'tvoAutoItemHeight'#16'tvoHideSelection'#21'tvoKeepCollapsedNodes'#11'tvoRea'
+'dOnly'#12'tvoRowSelect'#14'tvoShowButtons'#12'tvoShowLines'#11'tvoShowRoot'
+#17'tvoShowSeparators'#11'tvoToolTips'#0#0#0#10'TPopupMenu'#12'COCPopupMenu'
+#7'OnPopup'#7#17'COCPopupMenuPopup'#4'left'#2'0'#3'top'#2'0'#0#9'TMenuItem'
+#19'InsertAboveMenuItem'#7'Caption'#6#19'InsertAboveMenuItem'#12'RightJustif'

View File

@ -188,7 +188,10 @@ var
TVNode: TTreeNode;
begin
if not GetSelectedNode(COCNode,TVNode,false) then exit;
EditCompOptCondProperties(COCNode);
TVNode.Text:=NodeToCaption(COCNode);
TVNode.ImageIndex:=FNodeTypeImageIDs[COCNode.NodeType];
TVNode.SelectedIndex:=TVNode.ImageIndex;
end;
procedure TCompOptsConditionalsFrame.SetConditionals(
@ -209,15 +212,20 @@ procedure TCompOptsConditionalsFrame.FillTreeView;
if COCNode=nil then exit;
TVNode:=COCTreeView.Items.AddChildObject(ParentTVNode,NodeToCaption(COCNode),COCNode);
TVNode.ImageIndex:=FNodeTypeImageIDs[COCNode.NodeType];
TVNode.SelectedIndex:=TVNode.ImageIndex;
for i:=0 to COCNode.Count-1 do
Add(COCNode.Childs[i],TVNode);
end;
var
i: Integer;
begin
COCTreeView.BeginUpdate;
COCTreeView.Items.Clear;
if Conditionals<>nil then begin
Add(Conditionals.Root,nil);
if (Conditionals<>nil) and (Conditionals.Root<>nil)
and (Conditionals.Root.Count>0) then begin
for i:=0 to Conditionals.Root.Count-1 do
Add(Conditionals.Root.Childs[i],nil);
end;
COCTreeView.EndUpdate;
ConsistencyCheck;
@ -225,20 +233,32 @@ end;
procedure TCompOptsConditionalsFrame.ConsistencyCheck;
procedure CheckChilds(COCNode: TCompOptCondNode; ChildTVNode: TTreeNode); forward;
procedure CheckNode(COCNode: TCompOptCondNode; TVNode: TTreeNode);
var
i: Integer;
ChildTVNode: TTreeNode;
begin
if COCNode=nil then
RaiseCatchableException('');
if TVNode=nil then
if (TVNode=nil) then
RaiseCatchableException('');
if TVNode.Data=nil then
RaiseCatchableException('');
if COCNode<>TCompOptCondNode(TVNode.Data) then
RaiseCatchableException(TCompOptCondNode(TObject(TVNode.Data)).Value+'<>'+COCNode.Value+' TVNode='+TVNode.Text);
ChildTVNode:=TVNode.GetFirstChild;
if NodeToCaption(COCNode)<>TVNode.Text then
RaiseCatchableException(NodeToCaption(COCNode)+'<>'+TVNode.Text);
if FNodeTypeImageIDs[COCNode.NodeType]<>TVNode.ImageIndex then
RaiseCatchableException(dbgs(FNodeTypeImageIDs[COCNode.NodeType])+'<>'+dbgs(TVNode.ImageIndex));
if FNodeTypeImageIDs[COCNode.NodeType]<>TVNode.SelectedIndex then
RaiseCatchableException(dbgs(FNodeTypeImageIDs[COCNode.NodeType])+'<>'+dbgs(TVNode.SelectedIndex));
CheckChilds(COCNode,TVNode.GetFirstChild);
end;
procedure CheckChilds(COCNode: TCompOptCondNode; ChildTVNode: TTreeNode);
var
i: Integer;
begin
if COCNode=nil then exit;
for i:=0 to COCNode.Count-1 do begin
CheckNode(COCNode.Childs[i],ChildTVNode);
ChildTVNode:=ChildTVNode.GetNextSibling;
@ -248,11 +268,14 @@ procedure TCompOptsConditionalsFrame.ConsistencyCheck;
end;
begin
if Conditionals=nil then begin
Conditionals.WriteDebugReport;
COCTreeView.WriteDebugReport(' ',true);
if (Conditionals=nil) or (Conditionals.Root=nil)
or (Conditionals.Root.Count=0) then begin
if COCTreeView.Items.Count>0 then
RaiseCatchableException('');
end else begin
CheckNode(Conditionals.Root,COCTreeView.Items.GetFirstNode);
CheckChilds(Conditionals.Root,COCTreeView.Items.GetFirstNode);
end;
end;
@ -296,8 +319,8 @@ begin
TVNode:=COCTreeView.Selected;
if TVNode=nil then begin
if RootAsDefault then begin
TVNode:=COCTreeView.Items.GetFirstNode;
COCNode:=TCompOptCondNode(TVNode.Data);
TVNode:=nil;
COCNode:=Conditionals.Root;
end;
end else begin
COCNode:=TCompOptCondNode(TVNode.Data);
@ -316,10 +339,12 @@ var
begin
if not GetSelectedNode(COCNode,TVNode,true) then exit;
NewCOCNode:=TCompOptCondNode.Create(COCNode.Owner);
s:=NodeToCaption(COCNode);
s:=NodeToCaption(NewCOCNode);
NewTVNode:=COCTreeView.Items.AddObject(TVNode,s,NewCOCNode);
NewTVNode.MoveTo(TVNode,AttachMode);
if TVNode<>nil then
NewTVNode.MoveTo(TVNode,AttachMode);
NewTVNode.ImageIndex:=FNodeTypeImageIDs[NewCOCNode.NodeType];
NewTVNode.SelectedIndex:=NewTVNode.ImageIndex;
case AttachMode of
naAdd: NewCOCNode.Move(COCNode.Parent,COCNode.Parent.Count);
naAddFirst: NewCOCNode.Move(COCNode.Parent,0);
@ -328,7 +353,8 @@ begin
naInsert: NewCOCNode.Move(COCNode.Parent,COCNode.Index);
naInsertBehind: NewCOCNode.Move(COCNode.Parent,COCNode.Index+1);
end;
TVNode.Expanded:=true;
if TVNode<>nil then
TVNode.Expanded:=true;
ConsistencyCheck;
end;

View File

@ -4008,6 +4008,10 @@ resourcestring
dlgCOCreateNodeBelow = 'Create node below';
dlgCOCreateChildNode = 'Create child node';
lisResult = 'Result :=';
lisPropertiesOfConditionalCompilerOption = 'Properties of conditional '
+'compiler option';
lisAction = 'Action:';
lisValue = 'Value:';
implementation