mirror of https://gitlab.com/basile.b/dexed.git
250 lines
6.6 KiB
Plaintext
250 lines
6.6 KiB
Plaintext
unit ce_optionseditor;
|
|
|
|
{$I ce_defines.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, FileUtil, RTTIGrids, Forms, Controls, Graphics, ExtCtrls,
|
|
Menus, ComCtrls, Buttons, ce_common, ce_widget, ce_interfaces,
|
|
ce_observer, PropEdits, ObjectInspector;
|
|
|
|
type
|
|
|
|
// store the information about the obsever
|
|
// exposing some editable options.
|
|
PCategoryData = ^TCategoryData;
|
|
TCategoryData = record
|
|
kind: TOptionEditorKind;
|
|
container: TPersistent;
|
|
observer: ICEEditableOptions;
|
|
end;
|
|
|
|
{ TCEOptionEditorWidget }
|
|
|
|
TCEOptionEditorWidget = class(TCEWidget)
|
|
btnCancel: TSpeedButton;
|
|
btnAccept: TSpeedButton;
|
|
pnlEd: TPanel;
|
|
pnlBody: TPanel;
|
|
pnlFooter: TPanel;
|
|
Splitter1: TSplitter;
|
|
inspector: TTIPropertyGrid;
|
|
selCat: TTreeView;
|
|
procedure btnAcceptClick(Sender: TObject);
|
|
procedure btnCancelClick(Sender: TObject);
|
|
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
|
|
procedure inspectorEditorFilter(Sender: TObject; aEditor: TPropertyEditor;
|
|
var aShow: boolean);
|
|
procedure inspectorModified(Sender: TObject);
|
|
procedure selCatChanging(Sender: TObject; Node: TTreeNode;
|
|
var AllowChange: Boolean);
|
|
procedure selCatDeletion(Sender: TObject; Node: TTreeNode);
|
|
procedure selCatSelectionChanged(Sender: TObject);
|
|
protected
|
|
procedure UpdateShowing; override;
|
|
private
|
|
fCatChanged: boolean;
|
|
fEdOptsSubj: TCEEditableOptionsSubject;
|
|
procedure updateCategories;
|
|
function sortCategories(Cat1, Cat2: TTreeNode): integer;
|
|
public
|
|
constructor create(aOwner: TComponent); override;
|
|
destructor destroy; override;
|
|
end;
|
|
|
|
implementation
|
|
{$R *.lfm}
|
|
|
|
{$REGION Standard Comp/Obj------------------------------------------------------}
|
|
constructor TCEOptionEditorWidget.create(aOwner: TComponent);
|
|
var
|
|
png: TPortableNetworkGraphic;
|
|
begin
|
|
inherited;
|
|
fDockable := false;
|
|
fModal:= true;
|
|
fEdOptsSubj := TCEEditableOptionsSubject.create;
|
|
inspector.CheckboxForBoolean := true;
|
|
//
|
|
png := TPortableNetworkGraphic.Create;
|
|
try
|
|
png.LoadFromLazarusResource('cancel');
|
|
btnCancel.Glyph.Assign(png);
|
|
png.LoadFromLazarusResource('accept');
|
|
btnAccept.Glyph.Assign(png);
|
|
finally
|
|
png.Free;
|
|
end;
|
|
end;
|
|
|
|
destructor TCEOptionEditorWidget.destroy;
|
|
begin
|
|
fCatChanged := false;
|
|
fEdOptsSubj.Free;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TCEOptionEditorWidget.UpdateShowing;
|
|
begin
|
|
inherited;
|
|
if Visible then updateCategories;
|
|
end;
|
|
{$ENDREGION}
|
|
|
|
{$REGION Option editor things --------------------------------------------------}
|
|
procedure TCEOptionEditorWidget.updateCategories;
|
|
var
|
|
i: Integer;
|
|
dt: PCategoryData;
|
|
ed: ICEEditableOptions;
|
|
begin
|
|
inspector.TIObject := nil;
|
|
selCat.Items.Clear;
|
|
for i:= 0 to fEdOptsSubj.observersCount-1 do
|
|
begin
|
|
dt := new(PCategoryData);
|
|
ed := fEdOptsSubj.observers[i] as ICEEditableOptions;
|
|
selCat.Items.AddObject(nil, ed.optionedWantCategory, dt);
|
|
dt^.container := ed.optionedWantContainer;
|
|
dt^.kind := ed.optionedWantEditorKind;
|
|
dt^.observer := ed;
|
|
end;
|
|
selCat.Items.SortTopLevelNodes(@sortCategories);
|
|
end;
|
|
|
|
function TCEOptionEditorWidget.sortCategories(Cat1, Cat2: TTreeNode): integer;
|
|
begin
|
|
result := CompareText(Cat1.Text, Cat2.Text);
|
|
end;
|
|
|
|
procedure TCEOptionEditorWidget.selCatDeletion(Sender: TObject; Node: TTreeNode);
|
|
begin
|
|
if node.Data <> nil then
|
|
Dispose(PCategoryData(node.Data));
|
|
end;
|
|
|
|
procedure TCEOptionEditorWidget.selCatChanging(Sender: TObject;
|
|
Node: TTreeNode; var AllowChange: Boolean);
|
|
begin
|
|
if selCat.Selected = nil then exit;
|
|
if selCat.Selected.Data = nil then exit;
|
|
// accept/cancel is relative to a single category
|
|
if fCatChanged then begin
|
|
AllowChange := dlgOkCancel(
|
|
'The modifications of the current category are not validated, ' +
|
|
'discard them and continue ?'
|
|
) = mrOk;
|
|
fCatChanged := not AllowChange;
|
|
if AllowChange then
|
|
btnCancelClick(nil);
|
|
end;
|
|
end;
|
|
|
|
procedure TCEOptionEditorWidget.selCatSelectionChanged(Sender: TObject);
|
|
var
|
|
dt: PCategoryData;
|
|
begin
|
|
// remove either the control, the form or the inspector used as editor.
|
|
inspector.TIObject := nil;
|
|
if pnlEd.ControlCount > 0 then
|
|
pnlEd.Controls[0].Parent := nil;
|
|
//
|
|
if selCat.Selected = nil then exit;
|
|
if selCat.Selected.Data = nil then exit;
|
|
//
|
|
dt := PCategoryData(selCat.Selected.Data);
|
|
if dt^.container = nil then exit;
|
|
case dt^.kind of
|
|
oekControl:
|
|
begin
|
|
TWinControl(dt^.container).Parent := pnlEd;
|
|
TWinControl(dt^.container).Align := alClient;
|
|
end;
|
|
oekForm:
|
|
begin
|
|
TCustomForm(dt^.container).Parent := pnlEd;
|
|
TCustomForm(dt^.container).Align := alClient;
|
|
TCustomForm(dt^.container).BorderIcons:= [];
|
|
TCustomForm(dt^.container).BorderStyle:= bsNone;
|
|
end;
|
|
oekGeneric:
|
|
begin
|
|
inspector.Parent := pnlEd;
|
|
inspector.Align := alClient;
|
|
inspector.TIObject := dt^.container;
|
|
end;
|
|
end;
|
|
//
|
|
PCategoryData(selCat.Selected.Data)^
|
|
.observer
|
|
.optionedEvent(oeeSelectCat);
|
|
end;
|
|
|
|
procedure TCEOptionEditorWidget.inspectorModified(Sender: TObject);
|
|
begin
|
|
if selCat.Selected = nil then exit;
|
|
if selcat.Selected.Data = nil then exit;
|
|
//
|
|
fCatChanged := true;
|
|
PCategoryData(selCat.Selected.Data)^
|
|
.observer
|
|
.optionedEvent(oeeChange);
|
|
end;
|
|
|
|
procedure TCEOptionEditorWidget.btnCancelClick(Sender: TObject);
|
|
begin
|
|
if selCat.Selected = nil then exit;
|
|
if selcat.Selected.Data = nil then exit;
|
|
//
|
|
fCatChanged := false;
|
|
if inspector.Parent <> nil then
|
|
inspector.ItemIndex := -1;
|
|
PCategoryData(selCat.Selected.Data)^
|
|
.observer
|
|
.optionedEvent(oeeCancel);
|
|
end;
|
|
|
|
procedure TCEOptionEditorWidget.FormCloseQuery(Sender: TObject;
|
|
var CanClose: boolean);
|
|
begin
|
|
if fCatChanged then
|
|
begin
|
|
CanClose := dlgOkCancel(
|
|
'The modifications of the current category are not validated, ' +
|
|
'discard them and continue ?' ) = mrOk;
|
|
if CanClose then
|
|
btnCancelClick(nil);
|
|
end
|
|
else CanClose := true;
|
|
end;
|
|
|
|
procedure TCEOptionEditorWidget.inspectorEditorFilter(Sender: TObject;aEditor:
|
|
TPropertyEditor; var aShow: boolean);
|
|
begin
|
|
if aEditor.GetComponent(0) is TComponent then
|
|
begin
|
|
if aEditor.GetPropInfo^.Name = 'Tag' then
|
|
aSHow := false;
|
|
if aEditor.GetPropInfo^.Name = 'Name' then
|
|
aSHow := false;
|
|
end;
|
|
end;
|
|
|
|
procedure TCEOptionEditorWidget.btnAcceptClick(Sender: TObject);
|
|
begin
|
|
if selCat.Selected = nil then exit;
|
|
if selcat.Selected.Data = nil then exit;
|
|
//
|
|
fCatChanged := false;
|
|
if inspector.Parent <> nil then
|
|
inspector.ItemIndex := -1;
|
|
PCategoryData(selCat.Selected.Data)^
|
|
.observer
|
|
.optionedEvent(oeeAccept);
|
|
end;
|
|
{$ENDREGION}
|
|
|
|
end.
|
|
|