dexed/src/ce_dubprojeditor.pas

257 lines
6.3 KiB
Plaintext

unit ce_dubprojeditor;
{$I ce_defines.inc}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Menus, StdCtrls, Buttons, ComCtrls, jsonparser, fpjson,
ce_widget, ce_common, ce_interfaces, ce_observer, ce_dubproject;
type
{ TCEDubProjectEditorWidget }
TCEDubProjectEditorWidget = class(TCEWidget, ICEProjectObserver)
btnAddProp: TSpeedButton;
btnAddProp1: TSpeedButton;
btnDelProp: TSpeedButton;
btnDelProp1: TSpeedButton;
edValue: TMemo;
PageControl1: TPageControl;
pnlToolBar: TPanel;
pnlToolBar1: TPanel;
propTree: TTreeView;
treeInspect: TTreeView;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
procedure propTreeSelectionChanged(Sender: TObject);
private
fSelectedNode: TTreeNode;
fProj: TCEDubProject;
fNodeSources: TTreeNode;
fNodeConfig: TTreeNode;
procedure updateEditor;
procedure updateInspector;
procedure updateValueEditor;
procedure setJsonValueFromEditor;
//
procedure projNew(aProject: ICECommonProject);
procedure projChanged(aProject: ICECommonProject);
procedure projClosing(aProject: ICECommonProject);
procedure projFocused(aProject: ICECommonProject);
procedure projCompiling(aProject: ICECommonProject);
//
protected
procedure SetVisible(Value: boolean); override;
public
constructor create(aOwner: TComponent); override;
end;
implementation
{$R *.lfm}
{$REGION Standard Comp/Obj ----------------------------------------------------}
constructor TCEDubProjectEditorWidget.create(aOwner: TComponent);
begin
inherited;
fNodeSources := treeInspect.Items[0];
fNodeConfig := treeInspect.Items[1];
end;
procedure TCEDubProjectEditorWidget.SetVisible(Value: boolean);
begin
inherited;
if not Value then exit;
//
updateEditor;
end;
{$ENDREGION}
{$REGION ICEProjectObserver ----------------------------------------------------}
procedure TCEDubProjectEditorWidget.projNew(aProject: ICECommonProject);
begin
fProj := nil;
enabled := false;
if aProject.getFormat <> pfDub then
exit;
enabled := true;
fProj := TCEDubProject(aProject.getProject);
//
end;
procedure TCEDubProjectEditorWidget.projChanged(aProject: ICECommonProject);
begin
if fProj = nil then
exit;
if aProject.getProject <> fProj then
exit;
if not Visible then
exit;
updateEditor;
updateInspector;
end;
procedure TCEDubProjectEditorWidget.projClosing(aProject: ICECommonProject);
begin
if fProj = nil then
exit;
if aProject.getProject <> fProj then
exit;
fProj := nil;
//
updateEditor;
updateInspector;
enabled := false;
end;
procedure TCEDubProjectEditorWidget.projFocused(aProject: ICECommonProject);
begin
fProj := nil;
enabled := false;
if aProject.getFormat <> pfDub then
exit;
fProj := TCEDubProject(aProject.getProject);
enabled := true;
if not Visible then
exit;
updateEditor;
updateInspector;
end;
procedure TCEDubProjectEditorWidget.projCompiling(aProject: ICECommonProject);
begin
end;
{$ENDREGION}
{$REGION Editor ----------------------------------------------------------------}
procedure TCEDubProjectEditorWidget.propTreeSelectionChanged(Sender: TObject);
begin
fSelectedNode := nil;
if propTree.Selected = nil then exit;
//
fSelectedNode := propTree.Selected;
updateValueEditor;
end;
procedure TCEDubProjectEditorWidget.setJsonValueFromEditor;
var
dat: TJSONData;
vFloat: TJSONFloat;
vInt: integer;
vInt64: int64;
vBool: boolean;
begin
if fSelectedNode = nil then exit;
if fSelectedNode.Data = nil then exit;
//
dat := TJSONData(fSelectedNode.Data);
case dat.JSONType of
jtNumber:
case TJSONNumber(dat).NumberType of
ntFloat:
if TryStrToFloat(edValue.Text, vFloat) then
dat.AsFloat := vFloat;
ntInt64:
if TryStrToInt64(edValue.Text, vInt64) then
dat.AsInt64 := vInt64;
ntInteger:
if TryStrToInt(edValue.Text, vInt) then
dat.AsInteger := vInt;
end;
jtBoolean:
if TryStrToBool(edValue.Text, vBool) then
dat.AsBoolean := vBool;
jtString:
dat.AsString := edValue.Text;
end;
end;
procedure TCEDubProjectEditorWidget.updateValueEditor;
var
dat: TJSONData;
begin
edValue.Clear;
if fSelectedNode = nil then exit;
if fSelectedNode.Data = nil then exit;
//
dat := TJSONData(fSelectedNode.Data);
case dat.JSONType of
jtNumber:
case TJSONNumber(dat).NumberType of
ntFloat:
edValue.Text := FloatToStr(dat.AsFloat);
ntInt64:
edValue.Text := IntToStr(dat.AsInt64);
ntInteger:
edValue.Text := IntToStr(dat.AsInteger);
end;
jtBoolean:
edValue.Text := BoolToStr(dat.AsBoolean);
jtString:
edValue.Text := dat.AsString;
end;
end;
procedure TCEDubProjectEditorWidget.updateEditor;
procedure addPropsFrom(node: TTreeNode; data: TJSONData);
var
i: integer;
c: TTreeNode;
begin
if data.JSONType = jtObject then for i := 0 to data.Count-1 do
begin
c := node.TreeNodes.AddChildObject(node, TJSONObject(data).Names[i],
TJSONObject(data).Items[i]);
case TJSONObject(data).Items[i].JSONType of
jtObject, jtArray:
addPropsFrom(c, TJSONObject(data).Items[i]);
end;
end else if data.JSONType = jtArray then for i := 0 to data.Count-1 do
begin
c := node.TreeNodes.AddChildObject(node, format('item %d',[i]),
TJSONArray(data).Items[i]);
case TJSONArray(data).Items[i].JSONType of
jtObject, jtArray:
addPropsFrom(c, TJSONArray(data).Items[i]);
end;
end;
end;
begin
propTree.Items.Clear;
if (fProj = nil) or (fProj.json = nil) then
exit;
//
propTree.BeginUpdate;
addPropsFrom(propTree.Items.Add(nil, 'project'), fProj.json);
propTree.EndUpdate;
end;
{$ENDREGION}
{$REGION Inspector -------------------------------------------------------------}
procedure TCEDubProjectEditorWidget.updateInspector;
var
i: integer;
begin
if (fNodeConfig = nil) or (fNodeSources = nil) then
exit;
//
fNodeConfig.DeleteChildren;
fNodeSources.DeleteChildren;
//
if (fProj = nil) then
exit;
//
for i:= 0 to fProj.getConfigurationCount -1 do
treeInspect.Items.AddChild(fNodeConfig, fProj.getConfigurationName(i));
end;
{$ENDREGION}
end.