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
Height = 424
Top = 245
Width = 411
Width = 402
Caption = 'Dub project editor'
ClientHeight = 424
ClientWidth = 411
ClientWidth = 402
inherited Back: TPanel
Height = 424
Width = 411
Width = 402
ClientHeight = 424
ClientWidth = 411
ClientWidth = 402
inherited Content: TPanel
Height = 388
Width = 411
Width = 402
ClientHeight = 388
ClientWidth = 411
object PageControl1: TPageControl[0]
ClientWidth = 402
object propTree: TTreeView[0]
Left = 4
Height = 380
Height = 352
Top = 4
Width = 403
ActivePage = TabSheet1
Width = 394
Align = alClient
BorderSpacing.Around = 4
TabIndex = 0
DefaultItemHeight = 16
HideSelection = False
Images = imgList
ReadOnly = True
ScrollBars = ssAutoBoth
TabOrder = 0
object TabSheet1: TTabSheet
Caption = 'Inspector'
ClientHeight = 344
ClientWidth = 395
object pnlToolBar1: 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 = 0
object fltInspect: TTreeFilterEdit
Left = 30
Height = 22
Top = 2
Width = 355
ButtonWidth = 23
NumGlyphs = 1
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
ToolTips = False
OnSelectionChanged = propTreeSelectionChanged
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoThemedDraw]
TreeLinePenStyle = psClear
end
object Panel1: TPanel[1]
Left = 2
Height = 26
Top = 360
Width = 398
Align = alBottom
BorderSpacing.Around = 2
BevelOuter = bvNone
ClientHeight = 26
ClientWidth = 398
TabOrder = 1
object edProp: TEdit
Left = 2
Height = 22
Top = 2
Width = 366
Align = alClient
BorderSpacing.Around = 2
TabOrder = 0
end
object TabSheet2: TTabSheet
Caption = 'Editor'
ClientHeight = 344
ClientWidth = 395
object propTree: TTreeView
Left = 4
Height = 280
Top = 32
Width = 387
Align = alClient
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
object btnAcceptProp: TSpeedButton
Left = 370
Height = 26
Hint = 'accept property value'
Top = 0
Width = 28
Align = alRight
Layout = blGlyphBottom
OnClick = btnAcceptPropClick
ShowCaption = False
end
end
end
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
inherited contextMenu: TPopupMenu

View File

@ -7,7 +7,8 @@ interface
uses
Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Graphics,
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
@ -38,36 +39,25 @@ type
{ TCEDubProjectEditorWidget }
TCEDubProjectEditorWidget = class(TCEWidget, ICEProjectObserver)
btnAcceptProp: TSpeedButton;
btnAddProp: TSpeedButton;
btnDelProp: TSpeedButton;
btnRefresh: TBitBtn;
btnAddProp: TCEToolButton;
btnDelProp: TCEToolButton;
btnUpdate: TCEToolButton;
edProp: TEdit;
fltEdit: TTreeFilterEdit;
imgList: TImageList;
MenuItem1: TMenuItem;
PageControl1: TPageControl;
Panel1: TPanel;
pnlToolBar: TPanel;
pnlToolBar1: TPanel;
propTree: TTreeView;
fltInspect: TTreeFilterEdit;
treeInspect: TTreeView;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
procedure btnAcceptPropClick(Sender: TObject);
procedure btnAddPropClick(Sender: TObject);
procedure btnDelPropClick(Sender: TObject);
procedure btnRefreshClick(Sender: TObject);
procedure MenuItem1Click(Sender: TObject);
procedure propTreeSelectionChanged(Sender: TObject);
procedure treeInspectDblClick(Sender: TObject);
private
fSelectedNode: TTreeNode;
fProj: TCEDubProject;
fNodeSources: TTreeNode;
fNodeConfig: TTreeNode;
procedure updateEditor;
procedure updateInspector;
procedure updateValueEditor;
procedure setJsonValueFromEditor;
procedure addProp(const propName: string; tpe: TJSONtype);
@ -81,6 +71,7 @@ type
//
protected
procedure SetVisible(value: boolean); override;
procedure setToolBarFlat(value: boolean); override;
public
constructor create(aOwner: TComponent); override;
end;
@ -236,23 +227,23 @@ end;
constructor TCEDubProjectEditorWidget.create(aOwner: TComponent);
begin
inherited;
toolbarVisible:=false;
fNodeSources := treeInspect.Items[0];
fNodeConfig := treeInspect.Items[1];
//
AssignPng(btnAddProp, 'TEXTFIELD_ADD');
AssignPng(btnDelProp, 'TEXTFIELD_DELETE');
setToolBarVisible(true);
AssignPng(btnAcceptProp, 'ACCEPT');
AssignPng(btnRefresh, 'ARROW_UPDATE');
end;
procedure TCEDubProjectEditorWidget.SetVisible(value: boolean);
begin
inherited;
if not value then exit;
//
if not value then
exit;
updateEditor;
end;
procedure TCEDubProjectEditorWidget.setToolBarFlat(value: boolean);
begin
inherited;
btnAcceptProp.Flat:=value;
end;
{$ENDREGION}
{$REGION ICEProjectObserver ----------------------------------------------------}
@ -264,7 +255,6 @@ begin
exit;
enabled := true;
fProj := TCEDubProject(project.getProject);
//
end;
procedure TCEDubProjectEditorWidget.projChanged(project: ICECommonProject);
@ -277,7 +267,6 @@ begin
exit;
updateEditor;
updateInspector;
end;
procedure TCEDubProjectEditorWidget.projClosing(project: ICECommonProject);
@ -289,7 +278,6 @@ begin
fProj := nil;
updateEditor;
updateInspector;
enabled := false;
end;
@ -300,7 +288,6 @@ begin
if project.getFormat <> pfDub then
begin
updateEditor;
updateInspector;
exit;
end;
fProj := TCEDubProject(project.getProject);
@ -315,7 +302,6 @@ begin
end;
updateEditor;
updateInspector;
end;
procedure TCEDubProjectEditorWidget.projCompiling(project: ICECommonProject);
@ -333,8 +319,9 @@ begin
fSelectedNode := nil;
btnDelProp.Enabled := false;
btnAddProp.Enabled := false;
if propTree.Selected.isNil then exit;
//
if propTree.Selected.isNil then
exit;
fSelectedNode := propTree.Selected;
btnDelProp.Enabled := (fSelectedNode.Level > 0) and (fSelectedNode.Text <> 'name')
and fSelectedNode.data.isNotNil;
@ -344,8 +331,8 @@ end;
procedure TCEDubProjectEditorWidget.btnAcceptPropClick(Sender: TObject);
begin
if fSelectedNode.isNil then exit;
//
if fSelectedNode.isNil then
exit;
setJsonValueFromEditor;
propTree.FullExpand;
end;
@ -354,8 +341,8 @@ procedure TCEDubProjectEditorWidget.btnAddPropClick(Sender: TObject);
var
pnl: TCEDubProjectPropAddPanel;
begin
if fSelectedNode.isNil then exit;
//
if fSelectedNode.isNil then
exit;
pnl := TCEDubProjectPropAddPanel.construct(@addProp, TJSONData(fSelectedNode.Data));
pnl.ShowModal;
pnl.Free;
@ -368,8 +355,8 @@ var
obj: TJSONObject;
nod: TTreeNode;
begin
if fSelectedNode.isNil then exit;
//
if fSelectedNode.isNil then
exit;
fProj.beginModification;
if TJSONData(fSelectedNode.Data).JSONType = jtArray then
begin
@ -410,7 +397,7 @@ begin
if fSelectedNode.Text = 'name' then exit;
if fSelectedNode.Data.isNil then exit;
if fSelectedNode.Parent.Data.isNil then exit;
//
fProj.beginModification;
prt := TJSONData(fSelectedNode.Parent.Data);
if prt.JSONType = jtObject then
@ -418,7 +405,7 @@ begin
else if prt.JSONType = jtArray then
TJSONArray(prt).Delete(fSelectedNode.Index);
fProj.endModification;
//
updateValueEditor;
end;
@ -444,10 +431,9 @@ var
vInt64: int64;
vBool: boolean;
begin
if fSelectedNode.isNil then exit;
if fSelectedNode.Data.isNil then exit;
if fProj.isNil then exit;
//
if fSelectedNode.isNil or fSelectedNode.Data.isNil or fProj.isNil then
exit;
fProj.beginModification;
dat := TJSONData(fSelectedNode.Data);
case dat.JSONType of
@ -479,7 +465,7 @@ begin
edProp.Clear;
if fSelectedNode.isNil then exit;
if fSelectedNode.Data.isNil then exit;
//
dat := TJSONData(fSelectedNode.Data);
case dat.JSONType of
jtNumber:
@ -546,84 +532,12 @@ begin
edProp.Clear;
if fProj.isNil or fProj.json.isNil then
exit;
//
propTree.BeginUpdate;
addPropsFrom(propTree.Items.Add(nil, 'project'), fProj.json);
propTree.EndUpdate;
end;
{$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.

View File

@ -1430,12 +1430,13 @@ begin
topsplt := nil;
end;
fSymlWidg.showWidget;
// TODO-cdocking: Put the new unified project editors and inspectors to the right once done
// right
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(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
for i := 0 to fWidgList.Count-1 do
begin

View File

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

View File

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