summaryrefslogtreecommitdiff
path: root/uidesigner/newformdesigner.pas
diff options
context:
space:
mode:
authorgraemeg <graemeg@ae50a9b5-8222-0410-bf8d-8a13f76226bf>2008-08-26 16:47:53 +0000
committergraemeg <graemeg@ae50a9b5-8222-0410-bf8d-8a13f76226bf>2008-08-26 16:47:53 +0000
commit483eda5909cf21a06f3011857a12f47ae676ffef (patch)
treeeb8bf9cc2e6a6a02e7ea79db1540a7c48d7dc827 /uidesigner/newformdesigner.pas
parenta88f8e00c7094d32411871d3993654f326563e3b (diff)
downloadfpGUI-483eda5909cf21a06f3011857a12f47ae676ffef.tar.xz
* Moved the UI Designer from the examples/apps directory to the root directory.
* Updated some build scripts
Diffstat (limited to 'uidesigner/newformdesigner.pas')
-rw-r--r--uidesigner/newformdesigner.pas922
1 files changed, 922 insertions, 0 deletions
diff --git a/uidesigner/newformdesigner.pas b/uidesigner/newformdesigner.pas
new file mode 100644
index 00000000..0f6af0f8
--- /dev/null
+++ b/uidesigner/newformdesigner.pas
@@ -0,0 +1,922 @@
+{
+ fpGUI - Free Pascal GUI Toolkit
+
+ Copyright (C) 2006 - 2008 See the file AUTHORS.txt, included in this
+ distribution, for details of the copyright.
+
+ See the file COPYING.modifiedLGPL, included in this distribution,
+ for details about redistributing fpGUI.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ Description:
+ Essential classes used by the fpGUI Designer
+}
+
+unit newformdesigner;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ SysUtils,
+ Classes,
+ gfxbase,
+ gfx_widget,
+ gui_form,
+ gui_label,
+ gui_button,
+ gui_edit,
+ gui_listbox,
+ gui_memo,
+ gui_combobox,
+ gui_menu,
+ gui_mru,
+ gui_hyperlink,
+ vfdwidgetclass,
+ vfdwidgets;
+
+type
+
+ TwgPaletteButton = class(TfpgButton)
+ public
+ VFDWidget: TVFDWidgetClass;
+ end;
+
+
+ TwgPalette = class(TfpgWidget)
+ protected
+ procedure HandlePaint; override;
+ end;
+
+
+ TfrmMain = class(TfpgForm)
+ private
+ FFileOpenRecent: TfpgMenuItem;
+ procedure miHelpAboutClick(Sender: TObject);
+ procedure miHelpAboutGUI(Sender: TObject);
+ procedure miMRUClick(Sender: TObject; const FileName: string);
+ public
+ {@VFD_HEAD_BEGIN: frmMain}
+ MainMenu: TfpgMenuBar;
+ btnNewForm: TfpgButton;
+ btnOpen: TfpgButton;
+ btnSave: TfpgButton;
+ wgpalette: TwgPalette;
+ chlPalette: TfpgComboBox;
+ filemenu: TfpgPopupMenu;
+ formmenu: TfpgPopupMenu;
+ setmenu: TfpgPopupMenu;
+ miOpenRecentMenu: TfpgPopupMenu;
+ helpmenu: TfpgPopupMenu;
+ previewmenu: TfpgPopupMenu;
+ {@VFD_HEAD_END: frmMain}
+ mru: TfpgMRU;
+ function GetSelectedWidget: TVFDWidgetClass;
+ procedure SetSelectedWidget(wgc: TVFDWidgetClass);
+ procedure AfterCreate; override;
+ procedure BeforeDestruction; override;
+ procedure OnPaletteClick(Sender: TObject);
+ property SelectedWidget: TVFDWidgetClass read GetSelectedWidget write SetSelectedWidget;
+ end;
+
+
+ TPropertyList = class(TObject)
+ private
+ FList: TList;
+ function GetCount: integer;
+ public
+ Widget: TfpgWidget;
+ constructor Create;
+ destructor Destroy; override;
+ procedure Clear;
+ property Count: integer read GetCount;
+ procedure AddItem(aProp: TVFDWidgetProperty);
+ function GetItem(index: integer): TVFDWidgetProperty;
+ end;
+
+
+ TwgPropertyList = class(TfpgListBox)
+ protected
+ procedure DrawItem(num: integer; rect: TfpgRect; flags: integer); override;
+ procedure HandleMouseMove(x, y: integer; btnstate: word; shiftstate: TShiftState); override;
+ procedure HandleLMouseDown(x, y: integer; shiftstate: TShiftState); override;
+ procedure HandleLMouseUp(x, y: integer; shiftstate: TShiftState); override;
+ procedure HandleMouseScroll(x, y: integer; shiftstate: TShiftState; delta: smallint); override;
+ procedure HandleSetFocus; override;
+ procedure HandleKillFocus; override;
+ procedure OnRowChange(Sender: TObject);
+ procedure OnScrolling(Sender: TObject);
+ procedure OnUpdateProperty(Sender: TObject);
+ public
+ Props: TPropertyList;
+ NameWidth: integer;
+ editor: TVFDPropertyEditor;
+ NameDrag: boolean;
+ NameDragPos: integer;
+ constructor Create(AOwner: TComponent); override;
+ procedure ReleaseEditor;
+ procedure AllocateEditor;
+ function ItemCount: integer; override;
+ function RowHeight: integer; override;
+ procedure RealignEditor;
+ end;
+
+
+ TfrmProperties = class(TfpgForm)
+ protected
+ procedure HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: boolean); override;
+ public
+ l1, l2, l3, l4, l5, l6, l7, l8: TfpgLabel;
+ lbClass: TfpgLabel;
+ edName: TfpgEdit;
+ edOther: TfpgMemo;
+ btnTop, btnLeft, btnWidth, btnHeight: TfpgButton;
+ btnAnLeft, btnAnTop, btnAnRight, btnAnBottom: TfpgButton;
+ lstProps: TwgPropertyList;
+ procedure AfterCreate; override;
+ procedure BeforeDestruction; override;
+ end;
+
+
+ TfrmAbout = class(TfpgForm)
+ public
+ {@VFD_HEAD_BEGIN: frmAbout}
+ lblName1: TfpgLabel;
+ lblVersion: TfpgLabel;
+ btnName1: TfpgButton;
+ lblName3: TfpgLabel;
+ lblName4: TfpgHyperlink;
+ lblCompiled: TfpgLabel;
+ {@VFD_HEAD_END: frmAbout}
+ procedure AfterCreate; override;
+ class procedure Execute;
+ end;
+
+{@VFD_NEWFORM_DECL}
+
+var
+ frmProperties: TfrmProperties;
+ frmMain: TfrmMain;
+
+ PropList: TPropertyList;
+
+implementation
+
+uses
+ fpgfx,
+ vfdmain,
+ gui_iniutils,
+ gui_dialogs;
+
+
+// Anchor images
+{$I anchors.inc}
+
+
+{@VFD_NEWFORM_IMPL}
+
+procedure TfrmAbout.AfterCreate;
+begin
+ {@VFD_BODY_BEGIN: frmAbout}
+ Name := 'frmAbout';
+ SetPosition(378, 267, 276, 180);
+ WindowTitle := 'Product Information...';
+ Sizeable := False;
+ WindowPosition := wpScreenCenter;
+
+ lblName1 := TfpgLabel.Create(self);
+ with lblName1 do
+ begin
+ Name := 'lblName1';
+ SetPosition(12, 16, 255, 31);
+ Text := 'fpGUI UI Designer';
+ FontDesc := 'Arial-20';
+ end;
+
+ lblVersion := TfpgLabel.Create(self);
+ with lblVersion do
+ begin
+ Name := 'lblVersion';
+ SetPosition(150, 56, 175, 16);
+ Text := 'Version: %s';
+ FontDesc := '#Label2';
+ end;
+
+ btnName1 := TfpgButton.Create(self);
+ with btnName1 do
+ begin
+ Name := 'btnName1';
+ SetPosition(194, 148, 75, 24);
+ Anchors := [anRight,anBottom];
+ Text := 'Close';
+ FontDesc := '#Label1';
+ ImageName := 'stdimg.close';
+ ModalResult := 1;
+ end;
+
+ lblName3 := TfpgLabel.Create(self);
+ with lblName3 do
+ begin
+ Name := 'lblName3';
+ SetPosition(12, 100, 241, 14);
+ Text := 'Written by Graeme Geldenhuys';
+ FontDesc := 'Arial-9';
+ end;
+
+ lblName4 := TfpgHyperlink.Create(self);
+ with lblName4 do
+ begin
+ Name := 'lblName4';
+ SetPosition(12, 116, 246, 14);
+ Text := 'http://opensoft.homeip.net/fpgui/';
+ URL := 'http://opensoft.homeip.net/fpgui/';
+ FontDesc := 'Arial-9:underline';
+ TextColor := clRoyalBlue;
+ HotTrackColor := clBlue;
+ HotTrackFont := 'Arial-9:underline';
+ end;
+
+ lblCompiled := TfpgLabel.Create(self);
+ with lblCompiled do
+ begin
+ Name := 'lblCompiled';
+ SetPosition(12, 132, 191, 13);
+ Text := 'Compiled on: %s';
+ FontDesc := 'Arial-8';
+ end;
+
+ {@VFD_BODY_END: frmAbout}
+end;
+
+class procedure TfrmAbout.Execute;
+var
+ frm: TfrmAbout;
+begin
+ frm := TfrmAbout.Create(nil);
+ try
+ frm.lblVersion.Text := Format(frm.lblVersion.Text, [program_version]);
+ frm.lblCompiled.Text := Format(frm.lblCompiled.Text, [ {$I %date%} + ' ' + {$I %time%}]);
+ frm.ShowModal;
+ finally
+ frm.Free;
+ end;
+end;
+
+
+procedure TfrmMain.AfterCreate;
+var
+ n: integer;
+ x: integer;
+ wgc: TVFDWidgetClass;
+ btn: TwgPaletteButton;
+begin
+ {@VFD_BODY_BEGIN: frmMain}
+ Name := 'frmMain';
+ SetPosition(84, 123, 728, 87);
+ WindowTitle := 'frmMain';
+ WindowPosition := wpUser;
+ gINI.ReadFormState(self);
+
+ MainMenu := TfpgMenuBar.Create(self);
+ with MainMenu do
+ begin
+ Name := 'MainMenu';
+ SetPosition(0, 0, 729, 24);
+ Anchors := [anLeft,anRight,anTop];
+ end;
+
+ btnNewForm := TfpgButton.Create(self);
+ with btnNewForm do
+ begin
+ Name := 'btnNewForm';
+ SetPosition(4, 28, 25, 24);
+ Text := '';
+ FontDesc := '#Label1';
+ ImageMargin := -1;
+ ImageName := 'vfd.newform';
+ Focusable := False;
+ OnClick := @(maindsgn.OnNewForm);
+ end;
+
+ btnOpen := TfpgButton.Create(self);
+ with btnOpen do
+ begin
+ Name := 'btnOpen';
+ SetPosition(30, 28, 25, 24);
+ Text := '';
+ FontDesc := '#Label1';
+ ImageMargin := -1;
+ ImageName := 'stdimg.open';
+ Focusable := False;
+ OnClick := @(maindsgn.OnLoadFile);
+ end;
+
+ btnSave := TfpgButton.Create(self);
+ with btnSave do
+ begin
+ Name := 'btnSave';
+ SetPosition(56, 28, 25, 24);
+ Text := '';
+ FontDesc := '#Label1';
+ ImageMargin := -1;
+ ImageName := 'stdimg.save';
+ Focusable := False;
+ OnClick := @(maindsgn.OnSaveFile);
+ end;
+
+ wgpalette := TwgPalette.Create(self);
+ with wgpalette do
+ begin
+ Name := 'wgpalette';
+ SetPosition(116, 28, 613, 28);
+ Anchors := [anLeft,anRight,anTop];
+ Focusable := False;
+ end;
+
+ chlPalette := TfpgComboBox.Create(self);
+ with chlPalette do
+ begin
+ Name := 'chlPalette';
+ SetPosition(116, 60, 200, 22);
+ Items.Add('-');
+ FontDesc := '#List';
+ FocusItem := 0;
+ end;
+
+ filemenu := TfpgPopupMenu.Create(self);
+ with filemenu do
+ begin
+ Name := 'filemenu';
+ SetPosition(464, 64, 120, 20);
+ AddMenuItem('New', '', @(maindsgn.OnNewFile));
+ AddMenuItem('Open', '', @(maindsgn.OnLoadFile));
+ FFileOpenRecent := AddMenuItem('Open Recent...', '', nil);
+ AddMenuItem('Save As...', '', @(maindsgn.OnSaveFile));
+ AddMenuItem('-', '', nil);
+ AddMenuItem('New Form...', '', @(maindsgn.OnNewForm));
+ AddMenuItem('-', '', nil);
+ AddMenuItem('Exit', '', @(maindsgn.OnExit));
+ end;
+
+ formmenu := TfpgPopupMenu.Create(self);
+ with formmenu do
+ begin
+ Name := 'formmenu';
+ SetPosition(464, 48, 120, 20);
+ AddMenuItem('Widget Order...', '', @(maindsgn.OnEditWidgetOrder));
+ AddMenuItem('Tab Order...', '', @(maindsgn.OnEditTabOrder));
+ AddMenuItem('-', '', nil);
+ AddMenuItem('Edit special...', '', nil).Enabled := False; // TODO
+ end;
+
+ setmenu := TfpgPopupMenu.Create(self);
+ with setmenu do
+ begin
+ Name := 'setmenu';
+ SetPosition(464, 29, 120, 20);
+ AddMenuItem('General options ...', '', @(maindsgn.OnOptionsClick));
+ end;
+
+ miOpenRecentMenu := TfpgPopupMenu.Create(self);
+ with miOpenRecentMenu do
+ begin
+ Name := 'miOpenRecentMenu';
+ SetPosition(336, 68, 128, 20);
+ end;
+
+ helpmenu := TfpgPopupMenu.Create(self);
+ with helpmenu do
+ begin
+ Name := 'helpmenu';
+ SetPosition(328, 52, 120, 20);
+ AddMenuItem('Product Information', '', @miHelpAboutClick);
+ AddMenuItem('About fpGUI', '', @miHelpAboutGUI);
+ end;
+
+ previewmenu := TfpgPopupMenu.Create(self);
+ with previewmenu do
+ begin
+ Name := 'previewmenu';
+ SetPosition(324, 36, 120, 20);
+ AddMenuItem('with Windows 9x', '', nil).Enabled := False;
+ AddMenuItem('with Windows XP', '', nil).Enabled := False;
+ AddMenuItem('with OpenSoft', '', nil).Enabled := False;
+ AddMenuItem('with Motif', '', nil).Enabled := False;
+ AddMenuItem('with OpenLook', '', nil).Enabled := False;
+ end;
+
+ {@VFD_BODY_END: frmMain}
+
+
+ x := 0;
+ for n := 0 to VFDWidgetCount-1 do
+ begin
+ wgc := VFDWidget(n);
+ btn := TwgPaletteButton.Create(wgpalette);
+ btn.VFDWidget := wgc;
+ btn.SetPosition(x, 0, 30, 28);
+ btn.ImageName := wgc.WidgetIconName;
+ btn.ImageMargin := -1;
+ btn.Text := '';
+ btn.Focusable := False;
+ btn.OnClick := @OnPaletteClick;
+ btn.AllowDown := True;
+ btn.AllowAllUp := True;
+ chlPalette.Items.AddObject(wgc.WidgetClass.ClassName, wgc);
+
+ Inc(x, 32);
+ end;
+ chlPalette.Items.Sort;
+ MainMenu.AddMenuItem('&File', nil).SubMenu := filemenu;
+ MainMenu.AddMenuItem('&Settings', nil).SubMenu := setmenu;
+ MainMenu.AddMenuItem('Fo&rm', nil).SubMenu := formmenu;
+ MainMenu.AddMenuItem('&Preview', nil).SubMenu := previewmenu;
+ MainMenu.AddMenuItem('&Help', nil).SubMenu := helpmenu;
+
+ FFileOpenRecent.SubMenu := miOpenRecentMenu;
+
+ mru := TfpgMRU.Create(self);
+ mru.ParentMenuItem := miOpenRecentMenu;
+ mru.OnClick := @miMRUClick;
+ mru.MaxItems := gINI.ReadInteger('Options', 'MRUFileCount', 4);
+ mru.ShowFullPath := gINI.ReadBool('Options', 'ShowFullPath', True);
+ mru.LoadMRU;
+end;
+
+procedure TfrmMain.BeforeDestruction;
+begin
+ gINI.WriteFormState(self);
+ inherited BeforeDestruction;
+end;
+
+procedure TfrmMain.OnPaletteClick(Sender: TObject);
+var
+ s: string;
+ i: integer;
+begin
+ i := -1;
+ if TwgPaletteButton(Sender).Down then
+ begin
+ s := TwgPaletteButton(Sender).VFDWidget.WidgetClass.ClassName;
+ i := chlPalette.Items.IndexOf(s);
+ end;
+ if i = -1 then
+ i := 0; // select the '-' item
+ chlPalette.FocusItem := i;
+end;
+
+{ TfrmProperties }
+
+procedure TfrmProperties.AfterCreate;
+var
+ x, x2, w, y, gap: integer;
+begin
+ inherited;
+ Name := 'frmProperties';
+ WindowPosition := wpUser;
+ WindowTitle := 'Properties';
+ SetPosition(43, 150, 250, 450);
+ gINI.ReadFormState(self);
+
+ fpgImages.AddMaskedBMP(
+ 'vfd.anchorleft', @vfd_anchorleft,
+ sizeof(vfd_anchorleft), 0, 0);
+
+ fpgImages.AddMaskedBMP(
+ 'vfd.anchorright', @vfd_anchorright,
+ sizeof(vfd_anchorright), 0, 0);
+
+ fpgImages.AddMaskedBMP(
+ 'vfd.anchortop', @vfd_anchortop,
+ sizeof(vfd_anchortop), 0, 0);
+
+ fpgImages.AddMaskedBMP(
+ 'vfd.anchorbottom', @vfd_anchorbottom,
+ sizeof(vfd_anchorbottom), 0, 0);
+
+ x := 3;
+ x2 := x + 50;
+ gap := 20;
+ w := Width - x2;
+ y := 3;
+
+ l1 := CreateLabel(self, 0, y, 'Class:');
+ lbClass := CreateLabel(self, x2, y, 'CLASS');
+ lbClass.Width := w;
+ lbClass.FontDesc := '#Label2';
+ lbClass.Anchors := [anLeft, anRight, anTop];
+ Inc(y, gap);
+
+ l2 := CreateLabel(self, 0, y + 1, 'Name:');
+ edName := CreateEdit(self, x2, y, w, 0);
+ edName.Text := 'NAME';
+ edName.Anchors := [anLeft, anRight, anTop];
+ edName.OnChange := @(maindsgn.OnPropNameChange);
+
+ Inc(y, gap + 5);
+
+ lstProps := TwgPropertyList.Create(self);
+ lstProps.SetPosition(0, y, Width, self.Height - y - 220);
+ lstProps.Anchors := AllAnchors;
+ lstProps.Props := PropList;
+ lstProps.Props.Widget := edName;
+
+ y := lstProps.Bottom + 5;
+
+ //inc(y, gap+5);
+
+ l3 := CreateLabel(self, 3, y + 1, 'Left:');
+ l3.Anchors := [anLeft, anBottom];
+ btnLeft := CreateButton(self, 50, y - 2, 48, '1234', @(maindsgn.OnPropPosEdit));
+ with btnLeft do
+ begin
+ Height := 22;
+ Anchors := [anLeft, anBottom];
+ Focusable := False;
+ end;
+ l4 := CreateLabel(self, 110, y, 'Top:');
+ l4.Anchors := [anLeft, anBottom];
+ btnTop := CreateButton(self, 160, y - 2, 48, '45', @(maindsgn.OnPropPosEdit));
+ with btnTop do
+ begin
+ Height := 22;
+ Anchors := [anLeft, anBottom];
+ Focusable := False;
+ end;
+ Inc(y, gap + 5);
+ l5 := CreateLabel(self, 3, y + 1, 'Width:');
+ l5.Anchors := [anLeft, anBottom];
+ btnWidth := CreateButton(self, 50, y - 2, 48, '1234', @(maindsgn.OnPropPosEdit));
+ with btnWidth do
+ begin
+ Height := 22;
+ Anchors := [anLeft, anBottom];
+ Focusable := False;
+ end;
+ l6 := CreateLabel(self, 110, y, 'Height:');
+ l6.Anchors := [anLeft, anBottom];
+ btnHeight := CreateButton(self, 160, y - 2, 48, '45', @(maindsgn.OnPropPosEdit));
+ with btnHeight do
+ begin
+ Height := 22;
+ Anchors := [anLeft, anBottom];
+ Focusable := False;
+ end;
+ Inc(y, gap + 5);
+
+ l8 := CreateLabel(self, 3, y + 1, 'Anchors:');
+ l8.Anchors := [anLeft, anBottom];
+
+ x := 64;
+
+ btnAnLeft := CreateButton(self, x, y - 2, 28, '', nil);
+ with btnAnLeft do
+ begin
+ ImageName := 'vfd.anchorleft';
+ ShowImage := True;
+ AllowAllUp := True;
+ GroupIndex := 1;
+ Focusable := False;
+ Anchors := [anLeft, anBottom];
+ OnClick := @(maindsgn.OnAnchorChange);
+ end;
+
+ Inc(x, 30);
+ btnAnTop := CreateButton(self, x, y - 2, 26, '', nil);
+ with btnAnTop do
+ begin
+ ImageName := 'vfd.anchortop';
+ ShowImage := True;
+ AllowAllUp := True;
+ GroupIndex := 2;
+ Focusable := False;
+ Anchors := [anLeft, anBottom];
+ OnClick := @(maindsgn.OnAnchorChange);
+ end;
+
+ Inc(x, 30);
+ btnAnBottom := CreateButton(self, x, y - 2, 26, '', nil);
+ with btnAnBottom do
+ begin
+ ImageName := 'vfd.anchorbottom';
+ ShowImage := True;
+ AllowAllUp := True;
+ GroupIndex := 3;
+ Focusable := False;
+ Anchors := [anLeft, anBottom];
+ OnClick := @(maindsgn.OnAnchorChange);
+ end;
+
+ Inc(x, 30);
+ btnAnRight := CreateButton(self, x, y - 2, 26, '', nil);
+ with btnAnRight do
+ begin
+ ImageName := 'vfd.anchorright';
+ ShowImage := True;
+ AllowAllUp := True;
+ GroupIndex := 4;
+ Focusable := False;
+ Anchors := [anLeft, anBottom];
+ OnClick := @(maindsgn.OnAnchorChange);
+ end;
+
+ y := btnAnRight.Bottom + 5;
+
+ l7 := CreateLabel(self, 0, y, 'Unknown lines:');
+ l7.Anchors := [anLeft, anBottom];
+ Inc(y, 16);
+
+ edOther := TfpgMemo.Create(self);
+ edOther.SetPosition(0, y, self.Width, self.Height - y);
+ edOther.Anchors := [anLeft, anRight, anBottom];
+ edOther.FontDesc := '#Edit2';
+ edOther.OnChange := @(maindsgn.OnOtherChange);
+end;
+
+procedure TfrmProperties.BeforeDestruction;
+begin
+ gINI.WriteFormState(self);
+ inherited BeforeDestruction;
+end;
+
+procedure TfrmProperties.HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: boolean);
+begin
+ if keycode = keyF11 then
+ begin
+ if maindsgn.selectedform <> nil then
+ begin
+ maindsgn.selectedform.Form.SetFocus;
+ maindsgn.selectedform.Form.ActivateWindow;
+ end;
+ consumed := True;
+ end;
+ inherited;
+end;
+
+{ TPropertyList }
+
+procedure TPropertyList.AddItem(aProp: TVFDWidgetProperty);
+begin
+ FList.Add(aProp);
+end;
+
+procedure TPropertyList.Clear;
+begin
+ FList.Clear;
+end;
+
+constructor TPropertyList.Create;
+begin
+ FList := TList.Create;
+ Widget := nil;
+end;
+
+destructor TPropertyList.Destroy;
+begin
+ Clear;
+ FList.Free;
+ inherited;
+end;
+
+function TPropertyList.GetCount: integer;
+begin
+ Result := FList.Count;
+end;
+
+function TPropertyList.GetItem(index: integer): TVFDWidgetProperty;
+begin
+ if (index < 0) or (index > Count-1) then
+ Result := nil
+ else
+ Result := TVFDWidgetProperty(FList[index]);
+end;
+
+{ TwgPropertyList }
+
+constructor TwgPropertyList.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ NameWidth := 80;
+ editor := nil;
+ OnChange := @OnRowChange;
+ OnScroll := @OnScrolling;
+ BackgroundColor := clWindowBackground;
+ NameDrag := False;
+ //FontName := 'arial-10:antialias=false';
+end;
+
+procedure TwgPropertyList.OnRowChange(Sender: TObject);
+begin
+ AllocateEditor;
+end;
+
+procedure TwgPropertyList.OnScrolling(Sender: TObject);
+begin
+ AllocateEditor;
+end;
+
+procedure TwgPropertyList.DrawItem(num: integer; rect: TfpgRect; flags: integer);
+var
+ x,
+ y,
+ fy: integer;
+ s: string;
+ prop: TVFDWidgetProperty;
+ r: TfpgRect;
+begin
+ prop := Props.GetItem(num);
+ if prop = nil then
+ Exit; //==>
+
+ x := rect.left;
+ y := rect.top;
+ fy := y + rect.Height div 2 - FFont.Height div 2;
+
+ s := prop.Name;
+ Canvas.DrawString(x + 1, fy, s);
+
+ Inc(x, NameWidth);
+ Canvas.SetColor(clShadow1);
+ Canvas.DrawLine(x, rect.top, x, rect.bottom);
+ Inc(x);
+ // Drawing the contents
+ r.SetRect(x, y, rect.right - x, rect.Height);
+ Canvas.SetColor(BackgroundColor);
+ Canvas.FillRectangle(r);
+ Canvas.SetTextColor(clText1);
+ Inc(r.left, 2);
+ Dec(r.Width, 2);
+ prop.DrawValue(props.Widget, Canvas, r, flags);
+
+ Canvas.SetColor(clShadow1);
+ Canvas.DrawLine(0, rect.bottom, rect.right, rect.bottom);
+end;
+
+function TwgPropertyList.ItemCount: integer;
+begin
+ Result := Props.Count;
+end;
+
+function TwgPropertyList.RowHeight: integer;
+begin
+ Result := 22;
+end;
+
+procedure TwgPropertyList.OnUpdateProperty(Sender: TObject);
+begin
+ editor.StoreValue(props.Widget);
+end;
+
+procedure TwgPropertyList.HandleMouseMove(x, y: integer; btnstate: word; shiftstate: TShiftState);
+begin
+ if not NameDrag then
+ begin
+ if (x >= FMargin + NameWidth - 2) and (x <= FMargin + NameWidth + 2) then
+ MouseCursor := mcSizeEW
+ else
+ MouseCursor := mcDefault;
+ end
+ else
+ begin
+ NameWidth := x - FMargin;
+ ReAlignEditor;
+ RePaint;
+ end;
+ inherited;
+end;
+
+procedure TwgPropertyList.HandleLMouseDown(x, y: integer; shiftstate: TShiftState);
+begin
+ if MouseCursor = mcSizeEW then
+ NameDrag := True
+ //NameDragPos := x;
+ else
+ inherited;
+end;
+
+procedure TwgPropertyList.HandleLMouseUp(x, y: integer; shiftstate: TShiftState);
+begin
+ if NameDrag then
+ NameDrag := False
+ else
+ inherited;
+end;
+
+procedure TwgPropertyList.HandleMouseScroll(x, y: integer;
+ shiftstate: TShiftState; delta: smallint);
+begin
+ inherited HandleMouseScroll(x, y, shiftstate, delta);
+ AllocateEditor;
+end;
+
+procedure TwgPropertyList.HandleSetFocus;
+begin
+ inherited HandleSetFocus;
+ if Editor <> nil then
+ Editor.Visible := True
+ else
+ AllocateEditor;
+end;
+
+procedure TwgPropertyList.HandleKillFocus;
+begin
+ inherited HandleKillFocus;
+ if Editor <> nil then
+ Editor.Visible := True;
+end;
+
+procedure TwgPropertyList.RealignEditor;
+var
+ x: integer;
+begin
+ if editor = nil then
+ Exit;
+ x := 3 + NameWidth;
+ editor.SetPosition(x, editor.Top, Width - ScrollBarWidth - x, editor.Height);
+end;
+
+procedure TfrmMain.miHelpAboutClick(Sender: TObject);
+begin
+ TfrmAbout.Execute;
+end;
+
+procedure TfrmMain.miHelpAboutGUI(Sender: TObject);
+begin
+ ShowMessage('This product was created using ' + fpGUIName + ' v' +
+ fpGUIVersion, 'About fpGUI');
+end;
+
+procedure TfrmMain.miMRUClick(Sender: TObject; const FileName: string);
+begin
+ maindsgn.EditedFileName := FileName;
+ maindsgn.OnLoadFile(maindsgn);
+end;
+
+function TfrmMain.GetSelectedWidget: TVFDWidgetClass;
+begin
+ if chlPalette.FocusItem > 0 then
+ Result := TVFDWidgetClass(chlPalette.Items.Objects[chlPalette.FocusItem])
+ else
+ Result := nil;
+end;
+
+procedure TfrmMain.SetSelectedWidget(wgc: TVFDWidgetClass);
+var
+ n: integer;
+begin
+ if wgc = nil then
+ begin
+ chlPalette.FocusItem := 0;
+ for n := 0 to wgpalette.ComponentCount - 1 do
+ if wgpalette.Components[n] is TwgPaletteButton then
+ TwgPaletteButton(wgpalette.Components[n]).Down := False;
+ end;
+end;
+
+procedure TwgPropertyList.ReleaseEditor;
+begin
+ self.ActiveWidget := nil;
+ if editor <> nil then
+ editor.Free;
+ editor := nil;
+end;
+
+procedure TwgPropertyList.AllocateEditor;
+var
+ x, y: integer;
+ prop: TVFDWidgetProperty;
+begin
+ prop := Props.GetItem(FFocusItem);
+ if prop = nil then
+ Exit;
+
+ self.ActiveWidget := nil;
+ if editor <> nil then
+ editor.Free;
+
+ editor := prop.CreateEditor(Self);
+ x := 3 + NameWidth;
+ y := FMargin + (FFocusItem - FFirstItem) * RowHeight;
+ editor.SetPosition(x, y - 1, Width - ScrollBarWidth - x, RowHeight);
+ editor.CreateLayout;
+ editor.OnUpdate := @OnUpdateProperty;
+ editor.LoadValue(Props.Widget);
+ editor.Visible := True;
+
+ self.ActiveWidget := editor;
+end;
+
+{ TwgPalette }
+
+procedure TwgPalette.HandlePaint;
+begin
+ Canvas.Clear(clWindowBackground);
+end;
+
+
+end.
+