common project inspector + update init layout, close #69

This commit is contained in:
Basile Burg 2016-10-12 15:23:23 +02:00
parent f2de2bacff
commit 900d98e847
No known key found for this signature in database
GPG Key ID: 1868039F415CB8CF
5 changed files with 258 additions and 463 deletions

View File

@ -2,206 +2,124 @@ inherited CEDubProjectEditorWidget: TCEDubProjectEditorWidget
Left = 771 Left = 771
Height = 424 Height = 424
Top = 245 Top = 245
Width = 411 Width = 402
Caption = 'Dub project editor' Caption = 'Dub project editor'
ClientHeight = 424 ClientHeight = 424
ClientWidth = 411 ClientWidth = 402
inherited Back: TPanel inherited Back: TPanel
Height = 424 Height = 424
Width = 411 Width = 402
ClientHeight = 424 ClientHeight = 424
ClientWidth = 411 ClientWidth = 402
inherited Content: TPanel inherited Content: TPanel
Height = 388 Height = 388
Width = 411 Width = 402
ClientHeight = 388 ClientHeight = 388
ClientWidth = 411 ClientWidth = 402
object PageControl1: TPageControl[0] object propTree: TTreeView[0]
Left = 4 Left = 4
Height = 380 Height = 352
Top = 4 Top = 4
Width = 403 Width = 394
ActivePage = TabSheet1
Align = alClient Align = alClient
BorderSpacing.Around = 4 BorderSpacing.Around = 4
TabIndex = 0 DefaultItemHeight = 16
HideSelection = False
Images = imgList
ReadOnly = True
ScrollBars = ssAutoBoth
TabOrder = 0 TabOrder = 0
object TabSheet1: TTabSheet ToolTips = False
Caption = 'Inspector' OnSelectionChanged = propTreeSelectionChanged
ClientHeight = 344 Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoThemedDraw]
ClientWidth = 395 TreeLinePenStyle = psClear
object pnlToolBar1: TPanel end
Left = 4 object Panel1: TPanel[1]
Height = 26 Left = 2
Top = 2 Height = 26
Width = 387 Top = 360
Align = alTop Width = 398
BorderSpacing.Left = 2 Align = alBottom
BorderSpacing.Right = 2 BorderSpacing.Around = 2
BorderSpacing.Around = 2 BevelOuter = bvNone
BevelOuter = bvNone ClientHeight = 26
ClientHeight = 26 ClientWidth = 398
ClientWidth = 387 TabOrder = 1
TabOrder = 0 object edProp: TEdit
object fltInspect: TTreeFilterEdit Left = 2
Left = 30 Height = 22
Height = 22 Top = 2
Top = 2 Width = 366
Width = 355 Align = alClient
ButtonWidth = 23 BorderSpacing.Around = 2
NumGlyphs = 1 TabOrder = 0
Align = alClient
BorderSpacing.Around = 2
MaxLength = 0
TabOrder = 0
FilteredTreeview = treeInspect
end
object btnRefresh: TBitBtn
Left = 0
Height = 26
Hint = 'refresh the files and configurations'
Top = 0
Width = 28
Align = alLeft
Layout = blGlyphBottom
OnClick = btnRefreshClick
Spacing = 0
TabOrder = 1
end
end
object treeInspect: TTreeView
Left = 4
Height = 308
Top = 32
Width = 387
Align = alClient
BorderSpacing.Around = 4
DefaultItemHeight = 16
DragMode = dmAutomatic
HideSelection = False
Images = imgList
PopupMenu = contextMenu
ReadOnly = True
ScrollBars = ssAutoBoth
TabOrder = 1
ToolTips = False
OnDblClick = treeInspectDblClick
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoThemedDraw]
Items.Data = {
F9FFFFFF020002000000000000000000000000000000FFFFFFFF000000000000
0000000C000000536F757263652066696C6573010000000100000001000000FF
FFFFFF0000000000000000000E000000436F6E66696775726174696F6E73
}
end
end end
object TabSheet2: TTabSheet object btnAcceptProp: TSpeedButton
Caption = 'Editor' Left = 370
ClientHeight = 344 Height = 26
ClientWidth = 395 Hint = 'accept property value'
object propTree: TTreeView Top = 0
Left = 4 Width = 28
Height = 280 Align = alRight
Top = 32 Layout = blGlyphBottom
Width = 387 OnClick = btnAcceptPropClick
Align = alClient ShowCaption = False
BorderSpacing.Around = 4
DefaultItemHeight = 16
HideSelection = False
Images = imgList
ReadOnly = True
ScrollBars = ssAutoBoth
TabOrder = 0
ToolTips = False
OnSelectionChanged = propTreeSelectionChanged
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoThemedDraw]
TreeLinePenStyle = psClear
end
object pnlToolBar: TPanel
Left = 4
Height = 26
Top = 2
Width = 387
Align = alTop
BorderSpacing.Left = 2
BorderSpacing.Right = 2
BorderSpacing.Around = 2
BevelOuter = bvNone
ClientHeight = 26
ClientWidth = 387
TabOrder = 1
object btnAddProp: TSpeedButton
Left = 0
Height = 26
Hint = 'add property'
Top = 0
Width = 28
Align = alLeft
Layout = blGlyphBottom
OnClick = btnAddPropClick
ShowCaption = False
end
object fltEdit: TTreeFilterEdit
Left = 58
Height = 22
Top = 2
Width = 327
ButtonWidth = 23
NumGlyphs = 1
Align = alClient
BorderSpacing.Around = 2
MaxLength = 0
TabOrder = 0
FilteredTreeview = propTree
end
object btnDelProp: TSpeedButton
Left = 28
Height = 26
Hint = 'delete selected property'
Top = 0
Width = 28
Align = alLeft
Layout = blGlyphBottom
OnClick = btnDelPropClick
ShowCaption = False
end
end
object Panel1: TPanel
Left = 2
Height = 26
Top = 316
Width = 391
Align = alBottom
BorderSpacing.Around = 2
BevelOuter = bvNone
ClientHeight = 26
ClientWidth = 391
TabOrder = 2
object edProp: TEdit
Left = 2
Height = 22
Top = 2
Width = 359
Align = alClient
BorderSpacing.Around = 2
TabOrder = 0
end
object btnAcceptProp: TSpeedButton
Left = 363
Height = 26
Hint = 'accept property value'
Top = 0
Width = 28
Align = alRight
Layout = blGlyphBottom
OnClick = btnAcceptPropClick
ShowCaption = False
end
end
end end
end end
end end
inherited toolbar: TCEToolBar inherited toolbar: TCEToolBar
Width = 403 Width = 394
object btnUpdate: TCEToolButton[0]
Left = 57
Hint = 'reload project'
Top = 0
Caption = 'btnUpdate'
OnClick = btnRefreshClick
resourceName = 'ARROW_UPDATE'
scaledSeparator = False
end
object btnDelProp: TCEToolButton[1]
Left = 29
Hint = 'delete property'
Top = 0
Caption = 'btnDelProp'
OnClick = btnDelPropClick
resourceName = 'TEXTFIELD_DELETE'
scaledSeparator = False
end
object btnAddProp: TCEToolButton[2]
Left = 1
Hint = 'add a property'
Top = 0
Caption = 'btnAddProp'
OnClick = btnAddPropClick
resourceName = 'TEXTFIELD_ADD'
scaledSeparator = False
end
object button3: TCEToolButton[3]
Left = 85
Height = 28
Top = 0
Width = 11
Caption = 'button3'
Style = tbsDivider
scaledSeparator = False
end
object fltEdit: TTreeFilterEdit[4]
Left = 96
Height = 26
Hint = 'filter properties'
Top = 2
Width = 296
ButtonWidth = 23
NumGlyphs = 1
Align = alRight
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Around = 2
MaxLength = 0
TabOrder = 0
FilteredTreeview = propTree
end
end end
end end
inherited contextMenu: TPopupMenu inherited contextMenu: TPopupMenu

View File

@ -7,7 +7,8 @@ interface
uses uses
Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Graphics, Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Graphics,
Dialogs, ExtCtrls, Menus, StdCtrls, Buttons, ComCtrls, xjsonparser, xfpjson, Dialogs, ExtCtrls, Menus, StdCtrls, Buttons, ComCtrls, xjsonparser, xfpjson,
ce_widget, ce_common, ce_interfaces, ce_observer, ce_dubproject, ce_sharedres; ce_widget, ce_common, ce_interfaces, ce_observer, ce_dubproject, ce_sharedres,
ce_dsgncontrols;
type type
@ -38,36 +39,25 @@ type
{ TCEDubProjectEditorWidget } { TCEDubProjectEditorWidget }
TCEDubProjectEditorWidget = class(TCEWidget, ICEProjectObserver) TCEDubProjectEditorWidget = class(TCEWidget, ICEProjectObserver)
btnAcceptProp: TSpeedButton; btnAcceptProp: TSpeedButton;
btnAddProp: TSpeedButton; btnAddProp: TCEToolButton;
btnDelProp: TSpeedButton; btnDelProp: TCEToolButton;
btnRefresh: TBitBtn; btnUpdate: TCEToolButton;
edProp: TEdit; edProp: TEdit;
fltEdit: TTreeFilterEdit; fltEdit: TTreeFilterEdit;
imgList: TImageList; imgList: TImageList;
MenuItem1: TMenuItem; MenuItem1: TMenuItem;
PageControl1: TPageControl;
Panel1: TPanel; Panel1: TPanel;
pnlToolBar: TPanel;
pnlToolBar1: TPanel;
propTree: TTreeView; propTree: TTreeView;
fltInspect: TTreeFilterEdit;
treeInspect: TTreeView;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
procedure btnAcceptPropClick(Sender: TObject); procedure btnAcceptPropClick(Sender: TObject);
procedure btnAddPropClick(Sender: TObject); procedure btnAddPropClick(Sender: TObject);
procedure btnDelPropClick(Sender: TObject); procedure btnDelPropClick(Sender: TObject);
procedure btnRefreshClick(Sender: TObject); procedure btnRefreshClick(Sender: TObject);
procedure MenuItem1Click(Sender: TObject); procedure MenuItem1Click(Sender: TObject);
procedure propTreeSelectionChanged(Sender: TObject); procedure propTreeSelectionChanged(Sender: TObject);
procedure treeInspectDblClick(Sender: TObject);
private private
fSelectedNode: TTreeNode; fSelectedNode: TTreeNode;
fProj: TCEDubProject; fProj: TCEDubProject;
fNodeSources: TTreeNode;
fNodeConfig: TTreeNode;
procedure updateEditor; procedure updateEditor;
procedure updateInspector;
procedure updateValueEditor; procedure updateValueEditor;
procedure setJsonValueFromEditor; procedure setJsonValueFromEditor;
procedure addProp(const propName: string; tpe: TJSONtype); procedure addProp(const propName: string; tpe: TJSONtype);
@ -81,6 +71,7 @@ type
// //
protected protected
procedure SetVisible(value: boolean); override; procedure SetVisible(value: boolean); override;
procedure setToolBarFlat(value: boolean); override;
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
end; end;
@ -236,23 +227,23 @@ end;
constructor TCEDubProjectEditorWidget.create(aOwner: TComponent); constructor TCEDubProjectEditorWidget.create(aOwner: TComponent);
begin begin
inherited; inherited;
toolbarVisible:=false; setToolBarVisible(true);
fNodeSources := treeInspect.Items[0];
fNodeConfig := treeInspect.Items[1];
//
AssignPng(btnAddProp, 'TEXTFIELD_ADD');
AssignPng(btnDelProp, 'TEXTFIELD_DELETE');
AssignPng(btnAcceptProp, 'ACCEPT'); AssignPng(btnAcceptProp, 'ACCEPT');
AssignPng(btnRefresh, 'ARROW_UPDATE');
end; end;
procedure TCEDubProjectEditorWidget.SetVisible(value: boolean); procedure TCEDubProjectEditorWidget.SetVisible(value: boolean);
begin begin
inherited; inherited;
if not value then exit; if not value then
// exit;
updateEditor; updateEditor;
end; end;
procedure TCEDubProjectEditorWidget.setToolBarFlat(value: boolean);
begin
inherited;
btnAcceptProp.Flat:=value;
end;
{$ENDREGION} {$ENDREGION}
{$REGION ICEProjectObserver ----------------------------------------------------} {$REGION ICEProjectObserver ----------------------------------------------------}
@ -264,7 +255,6 @@ begin
exit; exit;
enabled := true; enabled := true;
fProj := TCEDubProject(project.getProject); fProj := TCEDubProject(project.getProject);
//
end; end;
procedure TCEDubProjectEditorWidget.projChanged(project: ICECommonProject); procedure TCEDubProjectEditorWidget.projChanged(project: ICECommonProject);
@ -277,7 +267,6 @@ begin
exit; exit;
updateEditor; updateEditor;
updateInspector;
end; end;
procedure TCEDubProjectEditorWidget.projClosing(project: ICECommonProject); procedure TCEDubProjectEditorWidget.projClosing(project: ICECommonProject);
@ -289,7 +278,6 @@ begin
fProj := nil; fProj := nil;
updateEditor; updateEditor;
updateInspector;
enabled := false; enabled := false;
end; end;
@ -300,7 +288,6 @@ begin
if project.getFormat <> pfDub then if project.getFormat <> pfDub then
begin begin
updateEditor; updateEditor;
updateInspector;
exit; exit;
end; end;
fProj := TCEDubProject(project.getProject); fProj := TCEDubProject(project.getProject);
@ -315,7 +302,6 @@ begin
end; end;
updateEditor; updateEditor;
updateInspector;
end; end;
procedure TCEDubProjectEditorWidget.projCompiling(project: ICECommonProject); procedure TCEDubProjectEditorWidget.projCompiling(project: ICECommonProject);
@ -333,8 +319,9 @@ begin
fSelectedNode := nil; fSelectedNode := nil;
btnDelProp.Enabled := false; btnDelProp.Enabled := false;
btnAddProp.Enabled := false; btnAddProp.Enabled := false;
if propTree.Selected.isNil then exit; if propTree.Selected.isNil then
// exit;
fSelectedNode := propTree.Selected; fSelectedNode := propTree.Selected;
btnDelProp.Enabled := (fSelectedNode.Level > 0) and (fSelectedNode.Text <> 'name') btnDelProp.Enabled := (fSelectedNode.Level > 0) and (fSelectedNode.Text <> 'name')
and fSelectedNode.data.isNotNil; and fSelectedNode.data.isNotNil;
@ -344,8 +331,8 @@ end;
procedure TCEDubProjectEditorWidget.btnAcceptPropClick(Sender: TObject); procedure TCEDubProjectEditorWidget.btnAcceptPropClick(Sender: TObject);
begin begin
if fSelectedNode.isNil then exit; if fSelectedNode.isNil then
// exit;
setJsonValueFromEditor; setJsonValueFromEditor;
propTree.FullExpand; propTree.FullExpand;
end; end;
@ -354,8 +341,8 @@ procedure TCEDubProjectEditorWidget.btnAddPropClick(Sender: TObject);
var var
pnl: TCEDubProjectPropAddPanel; pnl: TCEDubProjectPropAddPanel;
begin begin
if fSelectedNode.isNil then exit; if fSelectedNode.isNil then
// exit;
pnl := TCEDubProjectPropAddPanel.construct(@addProp, TJSONData(fSelectedNode.Data)); pnl := TCEDubProjectPropAddPanel.construct(@addProp, TJSONData(fSelectedNode.Data));
pnl.ShowModal; pnl.ShowModal;
pnl.Free; pnl.Free;
@ -368,8 +355,8 @@ var
obj: TJSONObject; obj: TJSONObject;
nod: TTreeNode; nod: TTreeNode;
begin begin
if fSelectedNode.isNil then exit; if fSelectedNode.isNil then
// exit;
fProj.beginModification; fProj.beginModification;
if TJSONData(fSelectedNode.Data).JSONType = jtArray then if TJSONData(fSelectedNode.Data).JSONType = jtArray then
begin begin
@ -410,7 +397,7 @@ begin
if fSelectedNode.Text = 'name' then exit; if fSelectedNode.Text = 'name' then exit;
if fSelectedNode.Data.isNil then exit; if fSelectedNode.Data.isNil then exit;
if fSelectedNode.Parent.Data.isNil then exit; if fSelectedNode.Parent.Data.isNil then exit;
//
fProj.beginModification; fProj.beginModification;
prt := TJSONData(fSelectedNode.Parent.Data); prt := TJSONData(fSelectedNode.Parent.Data);
if prt.JSONType = jtObject then if prt.JSONType = jtObject then
@ -418,7 +405,7 @@ begin
else if prt.JSONType = jtArray then else if prt.JSONType = jtArray then
TJSONArray(prt).Delete(fSelectedNode.Index); TJSONArray(prt).Delete(fSelectedNode.Index);
fProj.endModification; fProj.endModification;
//
updateValueEditor; updateValueEditor;
end; end;
@ -444,10 +431,9 @@ var
vInt64: int64; vInt64: int64;
vBool: boolean; vBool: boolean;
begin begin
if fSelectedNode.isNil then exit; if fSelectedNode.isNil or fSelectedNode.Data.isNil or fProj.isNil then
if fSelectedNode.Data.isNil then exit; exit;
if fProj.isNil then exit;
//
fProj.beginModification; fProj.beginModification;
dat := TJSONData(fSelectedNode.Data); dat := TJSONData(fSelectedNode.Data);
case dat.JSONType of case dat.JSONType of
@ -479,7 +465,7 @@ begin
edProp.Clear; edProp.Clear;
if fSelectedNode.isNil then exit; if fSelectedNode.isNil then exit;
if fSelectedNode.Data.isNil then exit; if fSelectedNode.Data.isNil then exit;
//
dat := TJSONData(fSelectedNode.Data); dat := TJSONData(fSelectedNode.Data);
case dat.JSONType of case dat.JSONType of
jtNumber: jtNumber:
@ -546,84 +532,12 @@ begin
edProp.Clear; edProp.Clear;
if fProj.isNil or fProj.json.isNil then if fProj.isNil or fProj.json.isNil then
exit; exit;
//
propTree.BeginUpdate; propTree.BeginUpdate;
addPropsFrom(propTree.Items.Add(nil, 'project'), fProj.json); addPropsFrom(propTree.Items.Add(nil, 'project'), fProj.json);
propTree.EndUpdate; propTree.EndUpdate;
end; end;
{$ENDREGION} {$ENDREGION}
{$REGION Inspector -------------------------------------------------------------}
procedure TCEDubProjectEditorWidget.updateInspector;
var
i: integer;
j: integer;
node : TTreeNode;
begin
if fNodeConfig.isNil or fNodeSources.isNil then
exit;
//
fNodeConfig.DeleteChildren;
fNodeSources.DeleteChildren;
//
if fProj.isNil then
exit;
//
j := fProj.getActiveConfigurationIndex;
treeInspect.BeginUpdate;
for i:= 0 to fProj.configurationCount-1 do
begin
if i <> j then
begin
node := treeInspect.Items.AddChild(fNodeConfig, fProj.configurationName(i));
node.ImageIndex := 3;
node.SelectedIndex := 3;
node.StateIndex := 3;
end
else
begin
node := treeInspect.Items.AddChild(fNodeConfig, fProj.configurationName(i) +' (active)');
node.ImageIndex := 10;
node.SelectedIndex := 10;
node.StateIndex := 10;
end;
end;
for i := 0 to fProj.sourcesCount-1 do
begin
node := treeInspect.Items.AddChild(fNodeSources, fProj.sourceRelative(i));
node.ImageIndex := 2;
node.SelectedIndex := 2;
node.StateIndex := 2;
end;
// first update or update cause by editor
if (not fNodeConfig.Expanded) and (not fNodeSources.Expanded) then
treeInspect.FullExpand;
treeInspect.EndUpdate;
end;
procedure TCEDubProjectEditorWidget.treeInspectDblClick(Sender: TObject);
var
node: TTreeNode;
fname: string;
begin
if treeInspect.Selected.isNil then exit;
if fProj.isNil then exit;
node := treeInspect.Selected;
// open file
if node.Parent = fNodeSources then
begin
fname := fProj.sourceAbsolute(node.Index);
if isEditable(fname.extractFileExt) then
getMultiDocHandler.openDocument(fname);
end
// select active config
else if node.Parent = fNodeConfig then
begin
fProj.setActiveConfigurationIndex(node.Index);
fNodeConfig.Expand(true);
end;
end;
{$ENDREGION}
end. end.

View File

@ -1430,12 +1430,13 @@ begin
topsplt := nil; topsplt := nil;
end; end;
fSymlWidg.showWidget; fSymlWidg.showWidget;
// TODO-cdocking: Put the new unified project editors and inspectors to the right once done
// right // right
DockMaster.GetAnchorSite(fProjWidg).Width := 190; DockMaster.GetAnchorSite(fProjWidg).Width := 190;
DockMaster.GetAnchorSite(fPrjCfWidg).Width := 190; DockMaster.GetAnchorSite(fDubProjWidg).Width := 190;
DockMaster.ManualDock(DockMaster.GetAnchorSite(fProjWidg), DockMaster.GetSite(fEditWidg), alRight); DockMaster.ManualDock(DockMaster.GetAnchorSite(fProjWidg), DockMaster.GetSite(fEditWidg), alRight);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fPrjCfWidg), DockMaster.GetAnchorSite(fProjWidg), alBottom, fProjWidg); DockMaster.ManualDock(DockMaster.GetAnchorSite(fPrjGrpWidg), DockMaster.GetSite(fProjWidg), alBottom, fProjWidg);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fDubProjWidg), DockMaster.GetAnchorSite(fProjWidg), alClient, fProjWidg);
fProjWidg.showWidget;
// close remaining and header to top // close remaining and header to top
for i := 0 to fWidgList.Count-1 do for i := 0 to fWidgList.Count-1 do
begin begin

View File

@ -5,7 +5,7 @@ inherited CEProjectInspectWidget: TCEProjectInspectWidget
Width = 341 Width = 341
ActiveControl = Tree ActiveControl = Tree
AllowDropFiles = True AllowDropFiles = True
Caption = 'Native project inspector' Caption = 'Project inspector'
ClientHeight = 258 ClientHeight = 258
ClientWidth = 341 ClientWidth = 341
OnDropFiles = FormDropFiles OnDropFiles = FormDropFiles
@ -38,18 +38,14 @@ inherited CEProjectInspectWidget: TCEProjectInspectWidget
TabOrder = 0 TabOrder = 0
ToolTips = False ToolTips = False
OnClick = TreeClick OnClick = TreeClick
OnDeletion = TreeDeletion
OnKeyDown = TreeKeyDown OnKeyDown = TreeKeyDown
OnSelectionChanged = TreeSelectionChanged OnSelectionChanged = TreeSelectionChanged
Options = [tvoAutoExpand, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoRightClickSelect, tvoShowButtons, tvoShowLines, tvoThemedDraw] Options = [tvoAutoExpand, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoRightClickSelect, tvoShowButtons, tvoShowLines, tvoThemedDraw]
Items.Data = { Items.Data = {
F9FFFFFF020005000000000000000000000000000000FFFFFFFF000000000000 F9FFFFFF020002000000000000000000000000000000FFFFFFFF000000000000
0000000C000000536F757263652066696C6573010000000100000001000000FF 0000000C000000536F757263652066696C6573010000000100000001000000FF
FFFFFF0000000000000000000E000000436F6E66696775726174696F6E730400 FFFFFF0000000000000000000E000000436F6E66696775726174696F6E73
00000400000004000000FFFFFFFF00000000000000000013000000496D706F72
7420737472696E67207061746873060000000600000006000000FFFFFFFF0000
0000000000000013000000496D706F7274206D6F64756C652070617468730000
00000000000000000000FFFFFFFF0000000000000000000D0000004578747261
20736F7572636573
} }
end end
end end

View File

@ -27,6 +27,7 @@ type
procedure btnRemFoldClick(Sender: TObject); procedure btnRemFoldClick(Sender: TObject);
procedure FormDropFiles(Sender: TObject; const fnames: array of String); procedure FormDropFiles(Sender: TObject; const fnames: array of String);
procedure TreeClick(Sender: TObject); procedure TreeClick(Sender: TObject);
procedure TreeDeletion(Sender: TObject; Node: TTreeNode);
procedure TreeKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure TreeKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure TreeSelectionChanged(Sender: TObject); procedure TreeSelectionChanged(Sender: TObject);
protected protected
@ -38,10 +39,8 @@ type
fActOpenFile: TAction; fActOpenFile: TAction;
fActSelConf: TAction; fActSelConf: TAction;
fActBuildConf: TAction; fActBuildConf: TAction;
fProject: TCENativeProject; fProject: ICECommonProject;
fFileNode, fConfNode: TTreeNode; fFileNode, fConfNode: TTreeNode;
fImpsNode, fInclNode: TTreeNode;
fXtraNode: TTreeNode;
fLastFileOrFolder: string; fLastFileOrFolder: string;
fSymStringExpander: ICESymStringExpander; fSymStringExpander: ICESymStringExpander;
procedure actUpdate(sender: TObject); procedure actUpdate(sender: TObject);
@ -55,6 +54,7 @@ type
procedure projChanged(project: ICECommonProject); procedure projChanged(project: ICECommonProject);
procedure projCompiling(project: ICECommonProject); procedure projCompiling(project: ICECommonProject);
procedure projCompiled(project: ICECommonProject; success: boolean); procedure projCompiled(project: ICECommonProject; success: boolean);
procedure updateButtons;
protected protected
function contextName: string; override; function contextName: string; override;
function contextActionCount: integer; override; function contextActionCount: integer; override;
@ -89,9 +89,6 @@ begin
Tree.OnDblClick := @TreeDblClick; Tree.OnDblClick := @TreeDblClick;
fFileNode := Tree.Items[0]; fFileNode := Tree.Items[0];
fConfNode := Tree.Items[1]; fConfNode := Tree.Items[1];
fImpsNode := Tree.Items[2];
fInclNode := Tree.Items[3];
fXtraNode := Tree.Items[4];
// //
Tree.PopupMenu := contextMenu; Tree.PopupMenu := contextMenu;
// //
@ -133,7 +130,6 @@ begin
case index of case index of
0: exit(fActOpenFile); 0: exit(fActOpenFile);
1: exit(fActSelConf); 1: exit(fActSelConf);
2: exit(fActBuildConf);
else exit(nil); else exit(nil);
end; end;
end; end;
@ -145,7 +141,7 @@ end;
procedure TCEProjectInspectWidget.actBuildExecute(sender: TObject); procedure TCEProjectInspectWidget.actBuildExecute(sender: TObject);
begin begin
if fProject.isNotNil then if fProject <> nil then
begin begin
actOpenFileExecute(sender); actOpenFileExecute(sender);
fProject.compile; fProject.compile;
@ -156,50 +152,41 @@ end;
{$REGION ICEProjectMonitor -----------------------------------------------------} {$REGION ICEProjectMonitor -----------------------------------------------------}
procedure TCEProjectInspectWidget.projNew(project: ICECommonProject); procedure TCEProjectInspectWidget.projNew(project: ICECommonProject);
begin begin
fProject := nil;
enabled := false;
fLastFileOrFolder := ''; fLastFileOrFolder := '';
if project.getFormat <> pfNative then fProject := project;
exit; if Visible then
enabled := true; updateImperative;
// updateButtons;
fProject := TCENativeProject(project.getProject);
if Visible then updateImperative;
end; end;
procedure TCEProjectInspectWidget.projClosing(project: ICECommonProject); procedure TCEProjectInspectWidget.projClosing(project: ICECommonProject);
begin begin
if fProject.isNil then exit; if not assigned(fProject) then
if fProject <> project.getProject then exit;
if project <> fProject then
exit; exit;
fProject := nil; fProject := nil;
fLastFileOrFolder := ''; fLastFileOrFolder := '';
enabled := false;
updateImperative; updateImperative;
end; end;
procedure TCEProjectInspectWidget.projFocused(project: ICECommonProject); procedure TCEProjectInspectWidget.projFocused(project: ICECommonProject);
begin begin
fProject := nil;
enabled := false;
fLastFileOrFolder := ''; fLastFileOrFolder := '';
if project.getFormat <> pfNative then fProject := project;
begin updateButtons;
updateImperative; if Visible then
exit; beginDelayedUpdate;
end;
enabled := true;
//
fProject := TCENativeProject(project.getProject);
if Visible then beginDelayedUpdate;
end; end;
procedure TCEProjectInspectWidget.projChanged(project: ICECommonProject); procedure TCEProjectInspectWidget.projChanged(project: ICECommonProject);
begin begin
if fProject.isNil then exit; if not assigned(fProject) then
if fProject <> project.getProject then
exit; exit;
if Visible then beginDelayedUpdate; if fProject <> project then
exit;
if Visible then
beginDelayedUpdate;
end; end;
procedure TCEProjectInspectWidget.projCompiling(project: ICECommonProject); procedure TCEProjectInspectWidget.projCompiling(project: ICECommonProject);
@ -209,6 +196,18 @@ end;
procedure TCEProjectInspectWidget.projCompiled(project: ICECommonProject; success: boolean); procedure TCEProjectInspectWidget.projCompiled(project: ICECommonProject; success: boolean);
begin begin
end; end;
procedure TCEProjectInspectWidget.updateButtons;
var
ce: boolean;
begin
ce := fProject.getFormat = pfNative;
btnRemFile.Enabled:= ce;
btnRemFold.Enabled:= ce;
btnAddFile.Enabled:= ce;
btnAddFold.Enabled:= ce;
end;
{$ENDREGION} {$ENDREGION}
{$REGION Inspector things -------------------------------------------------------} {$REGION Inspector things -------------------------------------------------------}
@ -237,10 +236,17 @@ begin
end; end;
end; end;
procedure TCEProjectInspectWidget.TreeDeletion(Sender: TObject; Node: TTreeNode
);
begin
if Node.isNotNil and Node.Data.isNotNil then
dispose(PString(Node.Data));
end;
procedure TCEProjectInspectWidget.TreeSelectionChanged(Sender: TObject); procedure TCEProjectInspectWidget.TreeSelectionChanged(Sender: TObject);
begin begin
actUpdate(sender); actUpdate(sender);
if fProject.isNil or Tree.Selected.isNil then if not assigned(fProject) or Tree.Selected.isNil then
exit; exit;
if (Tree.Selected.Parent = fFileNode) then if (Tree.Selected.Parent = fFileNode) then
fLastFileOrFolder := expandFilenameEx(fProject.basePath,tree.Selected.Text) fLastFileOrFolder := expandFilenameEx(fProject.basePath,tree.Selected.Text)
@ -251,19 +257,16 @@ end;
procedure TCEProjectInspectWidget.TreeDblClick(sender: TObject); procedure TCEProjectInspectWidget.TreeDblClick(sender: TObject);
var var
fname: string; fname: string;
i, j: integer; i: integer;
begin begin
if fProject.isNil or Tree.Selected.isNil then if not assigned(fProject) or Tree.Selected.isNil then
exit; exit;
//
if (Tree.Selected.Parent = fFileNode) or (Tree.Selected.Parent = fXtraNode) then if Tree.Selected.Parent = fFileNode then
begin begin
for j:= 0 to Tree.SelectionCount-1 do if Tree.Selected.Data.isNotNil then
begin begin
fname := Tree.Selections[j].Text; fname := PString(Tree.Selected.Data)^;
i := fProject.Sources.IndexOf(fname);
if i > -1 then
fname := fProject.sourceAbsolute(i);
if isEditable(fname.extractFileExt) and fname.fileExists then if isEditable(fname.extractFileExt) and fname.fileExists then
getMultiDocHandler.openDocument(fname); getMultiDocHandler.openDocument(fname);
end; end;
@ -271,7 +274,7 @@ begin
else if Tree.Selected.Parent = fConfNode then else if Tree.Selected.Parent = fConfNode then
begin begin
i := Tree.Selected.Index; i := Tree.Selected.Index;
fProject.ConfigurationIndex := i; fProject.setActiveConfigurationIndex(i);
beginDelayedUpdate; beginDelayedUpdate;
end; end;
end; end;
@ -281,7 +284,8 @@ begin
fActSelConf.Enabled := false; fActSelConf.Enabled := false;
fActOpenFile.Enabled := false; fActOpenFile.Enabled := false;
fActBuildConf.Enabled:= false; fActBuildConf.Enabled:= false;
if Tree.Selected.isNil then exit; if Tree.Selected.isNil then
exit;
fActSelConf.Enabled := Tree.Selected.Parent = fConfNode; fActSelConf.Enabled := Tree.Selected.Parent = fConfNode;
fActBuildConf.Enabled := Tree.Selected.Parent = fConfNode; fActBuildConf.Enabled := Tree.Selected.Parent = fConfNode;
fActOpenFile.Enabled := Tree.Selected.Parent = fFileNode; fActOpenFile.Enabled := Tree.Selected.Parent = fFileNode;
@ -290,9 +294,12 @@ end;
procedure TCEProjectInspectWidget.btnAddFileClick(Sender: TObject); procedure TCEProjectInspectWidget.btnAddFileClick(Sender: TObject);
var var
fname: string; fname: string;
proj: TCENativeProject;
begin begin
if fProject.isNil then exit; if not assigned(fProject) or (fProject.getFormat = pfDub) then
// exit;
proj := TCENativeProject(fProject.getProject);
with TOpenDialog.Create(nil) do with TOpenDialog.Create(nil) do
try try
options := options + [ofAllowMultiSelect]; options := options + [ofAllowMultiSelect];
@ -303,10 +310,10 @@ begin
filter := DdiagFilter; filter := DdiagFilter;
if execute then if execute then
begin begin
fProject.beginUpdate; proj.beginUpdate;
for fname in Files do for fname in Files do
fProject.addSource(fname); proj.addSource(fname);
fProject.endUpdate; proj.endUpdate;
end; end;
finally finally
free; free;
@ -317,11 +324,14 @@ procedure TCEProjectInspectWidget.btnAddFoldClick(Sender: TObject);
var var
dir, fname: string; dir, fname: string;
lst: TStringList; lst: TStringList;
i: NativeInt; proj: TCENativeProject;
i: integer;
begin begin
if fProject.isNil then exit; if not assigned(fProject) or (fProject.getFormat = pfDub) then
// exit;
dir := ''; dir := '';
proj := TCENativeProject(fProject.getProject);
if fLastFileOrFolder.fileExists then if fLastFileOrFolder.fileExists then
dir := fLastFileOrFolder.extractFilePath dir := fLastFileOrFolder.extractFilePath
else if fLastFileOrFolder.dirExists then else if fLastFileOrFolder.dirExists then
@ -330,7 +340,7 @@ begin
dir := fProject.fileName.extractFilePath; dir := fProject.fileName.extractFilePath;
if selectDirectory('sources', dir, dir, true, 0) then if selectDirectory('sources', dir, dir, true, 0) then
begin begin
fProject.beginUpdate; proj.beginUpdate;
lst := TStringList.Create; lst := TStringList.Create;
try try
listFiles(lst, dir, true); listFiles(lst, dir, true);
@ -338,11 +348,11 @@ begin
begin begin
fname := lst[i]; fname := lst[i];
if isDlangCompilable(fname.extractFileExt) then if isDlangCompilable(fname.extractFileExt) then
fProject.addSource(fname); proj.addSource(fname);
end; end;
finally finally
lst.Free; lst.Free;
fProject.endUpdate; proj.endUpdate;
end; end;
end; end;
end; end;
@ -350,49 +360,57 @@ end;
procedure TCEProjectInspectWidget.btnRemFoldClick(Sender: TObject); procedure TCEProjectInspectWidget.btnRemFoldClick(Sender: TObject);
var var
dir, fname: string; dir, fname: string;
proj: TCENativeProject;
i: Integer; i: Integer;
begin begin
if fProject.isNil or Tree.Selected.isNil then if not assigned(fProject) or (fProject.getFormat = pfDub)
or Tree.Selected.isNil or (Tree.Selected.Parent <> fFileNode) then
exit; exit;
if Tree.Selected.Parent <> fFileNode then exit;
// proj := TCENativeProject(fProject.getProject);
fname := Tree.Selected.Text; fname := Tree.Selected.Text;
i := fProject.Sources.IndexOf(fname); i := proj.Sources.IndexOf(fname);
if i = -1 then exit; if i = -1 then
exit;
fname := fProject.sourceAbsolute(i); fname := fProject.sourceAbsolute(i);
dir := fname.extractFilePath; dir := fname.extractFilePath;
if not dir.dirExists then exit; if not dir.dirExists then
// exit;
fProject.beginUpdate;
for i:= fProject.Sources.Count-1 downto 0 do proj.beginUpdate;
if fProject.sourceAbsolute(i).extractFilePath = dir then for i:= proj.Sources.Count-1 downto 0 do
fProject.Sources.Delete(i); if proj.sourceAbsolute(i).extractFilePath = dir then
fProject.endUpdate; proj.Sources.Delete(i);
proj.endUpdate;
end; end;
procedure TCEProjectInspectWidget.btnRemFileClick(Sender: TObject); procedure TCEProjectInspectWidget.btnRemFileClick(Sender: TObject);
var var
fname: string; fname: string;
proj: TCENativeProject;
i, j: integer; i, j: integer;
begin begin
if fProject.isNil or Tree.Selected.isNil then if not assigned(fProject) or (fProject.getFormat = pfDub)
or Tree.Selected.isNil or (Tree.Selected.Parent = fFileNode) then
exit; exit;
//
if Tree.Selected.Parent = fFileNode then proj := TCENativeProject(fProject.getProject);
proj.beginUpdate;
for j:= 0 to Tree.SelectionCount-1 do
begin begin
fProject.beginUpdate; fname := Tree.Selections[j].Text;
for j:= 0 to Tree.SelectionCount-1 do i := proj.Sources.IndexOf(fname);
begin if i <> -1 then
fname := Tree.Selections[j].Text; proj.Sources.Delete(i);
i := fProject.Sources.IndexOf(fname);
if i <> -1 then
fProject.Sources.Delete(i);
end;
fProject.endUpdate;
end; end;
proj.endUpdate;
end; end;
procedure TCEProjectInspectWidget.FormDropFiles(Sender: TObject; const fnames: array of String); procedure TCEProjectInspectWidget.FormDropFiles(Sender: TObject; const fnames: array of String);
var
fname, direntry: string;
lst: TStringList;
proj: TCENativeProject;
procedure addFile(const value: string); procedure addFile(const value: string);
var var
ext: string; ext: string;
@ -400,17 +418,17 @@ begin
ext := value.extractFileExt; ext := value.extractFileExt;
if not isDlangCompilable(ext) then if not isDlangCompilable(ext) then
exit; exit;
fProject.addSource(value); proj.addSource(value);
if isEditable(ext) then if isEditable(ext) then
getMultiDocHandler.openDocument(value); getMultiDocHandler.openDocument(value);
end; end;
var
fname, direntry: string;
lst: TStringList;
begin begin
if fProject.isNil then exit; if not assigned(fProject) or (fProject.getFormat = pfDub) then
exit;
proj := TCENativeProject(fProject.getProject);
lst := TStringList.Create; lst := TStringList.Create;
fProject.beginUpdate; proj.beginUpdate;
try for fname in fnames do try for fname in fnames do
if fname.fileExists then if fname.fileExists then
addFile(fname) addFile(fname)
@ -422,7 +440,7 @@ begin
addFile(dirEntry); addFile(dirEntry);
end; end;
finally finally
fProject.endUpdate; proj.endUpdate;
lst.Free; lst.Free;
end; end;
end; end;
@ -434,35 +452,32 @@ end;
procedure TCEProjectInspectWidget.updateImperative; procedure TCEProjectInspectWidget.updateImperative;
var var
src, fold, conf, str: string; src, conf: string;
lst: TStringList;
itm: TTreeNode; itm: TTreeNode;
i: NativeInt; i,j: integer;
begin begin
fConfNode.DeleteChildren; fConfNode.DeleteChildren;
fFileNode.DeleteChildren; fFileNode.DeleteChildren;
fImpsNode.DeleteChildren;
fInclNode.DeleteChildren; if not assigned(fProject) then
fXtraNode.DeleteChildren;
//
if fProject.isNil then
exit; exit;
//
Tree.BeginUpdate; Tree.BeginUpdate;
// display main sources for i := 0 to fProject.sourcesCount-1 do
for src in fProject.Sources do
begin begin
itm := Tree.Items.AddChild(fFileNode, src); itm := Tree.Items.AddChild(fFileNode, fProject.sourceRelative(i));
itm.Data:= NewStr(fProject.sourceAbsolute(i));
itm.ImageIndex := 2; itm.ImageIndex := 2;
itm.SelectedIndex := 2; itm.SelectedIndex := 2;
end; end;
// display configurations j := fProject.getActiveConfigurationIndex;
for i := 0 to fProject.OptionsCollection.Count-1 do for i := 0 to fProject.configurationCount-1 do
begin begin
conf := fProject.configuration[i].name; conf := fProject.configurationName(i);
if i = fProject.ConfigurationIndex then conf += ' (active)'; if i = j then
conf += ' (active)';
itm := Tree.Items.AddChild(fConfNode, conf); itm := Tree.Items.AddChild(fConfNode, conf);
if i = fProject.ConfigurationIndex then if i = j then
begin begin
itm.ImageIndex := 7; itm.ImageIndex := 7;
itm.SelectedIndex:= 7; itm.SelectedIndex:= 7;
@ -473,55 +488,6 @@ begin
itm.SelectedIndex:= 3; itm.SelectedIndex:= 3;
end; end;
end; end;
// display Imports (-J)
for str in FProject.currentConfiguration.pathsOptions.importStringPaths do
begin
if str.isEmpty then
continue;
fold := expandFilenameEx(fProject.basePath, str);
fold := fSymStringExpander.expand(fold);
itm := Tree.Items.AddChild(fImpsNode, fold);
itm.ImageIndex := 5;
itm.SelectedIndex := 5;
end;
fImpsNode.Collapse(false);
// display Includes (-I)
for str in FProject.currentConfiguration.pathsOptions.importModulePaths do
begin
if str.isEmpty then
continue;
fold := expandFilenameEx(fProject.basePath, str);
fold := fSymStringExpander.expand(fold);
itm := Tree.Items.AddChild(fInclNode, fold);
itm.ImageIndex := 5;
itm.SelectedIndex := 5;
end;
fInclNode.Collapse(false);
// display extra sources (external .lib, *.a, *.d)
for str in FProject.currentConfiguration.pathsOptions.extraSources do
begin
if str.isEmpty then
continue;
src := expandFilenameEx(fProject.basePath, str);
src := fSymStringExpander.expand(src);
lst := TStringList.Create;
try
if listAsteriskPath(src, lst) then for src in lst do
begin
itm := Tree.Items.AddChild(fXtraNode, src);
itm.ImageIndex := 2;
itm.SelectedIndex := 2;
end else
begin
itm := Tree.Items.AddChild(fXtraNode, src);
itm.ImageIndex := 2;
itm.SelectedIndex := 2;
end;
finally
lst.Free;
end;
end;
fXtraNode.Collapse(false);
Tree.EndUpdate; Tree.EndUpdate;
end; end;
{$ENDREGION --------------------------------------------------------------------} {$ENDREGION --------------------------------------------------------------------}