From 3b71bd7f8ad7c1bbd0720121e465f3ba287616b9 Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Thu, 23 Jun 2016 22:26:25 +0200 Subject: [PATCH] add design time package for custom ce controls --- lazproj/cecontrols.pas | 21 ++++ lazproj/cedsgncontrols.lpk | 48 +++++++++ lazproj/cedsgncontrols.pas | 21 ++++ lazproj/coedit.lpi | 17 ++-- src/ce_dsgncontrols.pas | 202 +++++++++++++++++++++++++++++++++++++ 5 files changed, 302 insertions(+), 7 deletions(-) create mode 100644 lazproj/cecontrols.pas create mode 100644 lazproj/cedsgncontrols.lpk create mode 100644 lazproj/cedsgncontrols.pas create mode 100644 src/ce_dsgncontrols.pas diff --git a/lazproj/cecontrols.pas b/lazproj/cecontrols.pas new file mode 100644 index 00000000..48622954 --- /dev/null +++ b/lazproj/cecontrols.pas @@ -0,0 +1,21 @@ +{ This file was automatically created by Lazarus. Do not edit! + This source is only used to compile and install the package. + } + +unit cecontrols; + +interface + +uses + ce_dsgncontrols, LazarusPackageIntf; + +implementation + +procedure Register; +begin + RegisterUnit('ce_dsgncontrols', @ce_dsgncontrols.Register); +end; + +initialization + RegisterPackage('cecontrols', @Register); +end. diff --git a/lazproj/cedsgncontrols.lpk b/lazproj/cedsgncontrols.lpk new file mode 100644 index 00000000..19b0325f --- /dev/null +++ b/lazproj/cedsgncontrols.lpk @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ExternHelp Items="Count"/> + + + diff --git a/lazproj/cedsgncontrols.pas b/lazproj/cedsgncontrols.pas new file mode 100644 index 00000000..e5b8be65 --- /dev/null +++ b/lazproj/cedsgncontrols.pas @@ -0,0 +1,21 @@ +{ This file was automatically created by Lazarus. Do not edit! + This source is only used to compile and install the package. + } + +unit cedsgncontrols; + +interface + +uses + ce_dsgncontrols, LazarusPackageIntf; + +implementation + +procedure Register; +begin + RegisterUnit('ce_dsgncontrols', @ce_dsgncontrols.Register); +end; + +initialization + RegisterPackage('cedsgncontrols', @Register); +end. diff --git a/lazproj/coedit.lpi b/lazproj/coedit.lpi index 3a694e73..ae1a21a0 100644 --- a/lazproj/coedit.lpi +++ b/lazproj/coedit.lpi @@ -202,25 +202,28 @@ - + - + - + - + - + - + - + + + + diff --git a/src/ce_dsgncontrols.pas b/src/ce_dsgncontrols.pas new file mode 100644 index 00000000..fa336532 --- /dev/null +++ b/src/ce_dsgncontrols.pas @@ -0,0 +1,202 @@ +unit ce_dsgncontrols; +{$I ce_defines.inc} + +interface + +uses + Classes, SysUtils, Forms, Controls, ComCtrls, ExtCtrls, buttons, graphics, + Menus, LMessages, LCLType; + +type + + (** + * Toolbutton with methods to load the glyph from the shared resources + *) + TCEToolButton = class(TToolButton) + private + fResourceName: string; + fScaledSeparator: boolean; + fPng: TPortableNetworkGraphic; + procedure setResourceName(const value: string); + procedure setScaledSeparator(value: boolean); + procedure setToolBar(value: TToolbar); + protected + procedure Paint; override; + published + property resourceName: string read fResourceName write setResourceName; + property scaledSeparator: boolean read fScaledSeparator write setScaledSeparator; + public + constructor Create(TheOwner: TComponent); override; + destructor Destroy; override; + end; + + (** + * Toolbar with design-time support for TCEToolbutton + *) + TCEToolBar = class(TToolBar) + protected + fDesignMenu: TPopupMenu; + procedure dsgnAdd(style: TToolButtonStyle); + procedure dsgnAddButton(sender: TObject); + procedure dsgnAddDivider(sender: TObject); + procedure dsgnAddSeparator(sender: TObject); + procedure dsgnAddDropdown(sender: TObject); + procedure dsgnAddCheckbutton(sender: TObject); + public + constructor Create(TheOwner: TComponent); override; + destructor Destroy; override; + procedure CMDesignHitTest(var Message: TCMDesignHitTest); message CM_DESIGNHITTEST; + end; + + procedure register; + +implementation + +procedure register; +begin + RegisterComponents('Coedit', [TCEToolBar, TCEToolButton]); +end; + +constructor TCEToolButton.Create(TheOwner: TComponent); +begin + inherited; + fPng := TPortableNetworkGraphic.Create; +end; + +destructor TCEToolButton.Destroy; +begin + fPng.FreeImage; + fPng.Free; + inherited; +end; + +procedure TCEToolButton.setToolBar(value: TToolbar); +begin + FToolBar := value; +end; + +procedure TCEToolButton.setResourceName(const value: string); +begin + if fResourceName = value then + exit; + fResourceName:=value; + if csDesigning in ComponentState then + exit; + if Style = tbsButton then + begin + fPng.FreeImage; + fPng.LoadFromResourceName(HINSTANCE, fResourceName); + end; +end; + +procedure TCEToolButton.setScaledSeparator(value: boolean); +begin + if fScaledSeparator = value then + exit; + fScaledSeparator:=value; + // store ratio if true +end; + +procedure TCEToolButton.Paint; +var + rc: TRect; +begin + if (fResourceName <> '') and (style = tbsButton) then + begin + rc := ClientRect; + Canvas.Draw(rc.Left, rc.Top, fPng); + end + else inherited; +end; + +constructor TCEToolBar.Create(TheOwner: TComponent); +var + item: TMenuItem; +begin + inherited; + if csDesigning in ComponentState then + begin + fDesignMenu := TPopupMenu.Create(nil); + fDesignMenu.Name:= 'CEToolbarDsgnMenu'; + item := TMenuItem.Create(fDesignMenu); + item.Caption:= 'add button'; + item.OnClick:= @dsgnAddButton; + fDesignMenu.Items.Add(item); + item := TMenuItem.Create(fDesignMenu); + item.Caption:= 'add separator'; + item.OnClick:= @dsgnAddSeparator; + fDesignMenu.Items.Add(item); + item := TMenuItem.Create(fDesignMenu); + item.Caption:= 'add divider'; + item.OnClick:= @dsgnAddDivider; + fDesignMenu.Items.Add(item); + item := TMenuItem.Create(fDesignMenu); + item.Caption:= 'add check'; + item.OnClick:= @dsgnAddCheckbutton; + fDesignMenu.Items.Add(item); + item := TMenuItem.Create(fDesignMenu); + item.Caption:= 'add dropdown'; + item.OnClick:= @dsgnAddDropdown; + fDesignMenu.Items.Add(item); + end; +end; + +destructor TCEToolBar.Destroy; +begin + if csDesigning in ComponentState then + fDesignMenu.Free; + inherited; +end; + +procedure TCEToolBar.CMDesignHitTest(var Message: TCMDesignHitTest); +begin + inherited; + if not (csDesigning in ComponentState) then + exit; + if Message.Keys <> MK_RBUTTON then + exit; + Message.Result := 0; + fDesignMenu.PopUp(Mouse.CursorPos.x,Mouse.CursorPos.y); +end; + +procedure TCEToolBar.dsgnAdd(style: TToolButtonStyle); +var + button: TCEToolButton; +begin + button := TCEToolButton.Create(owner); + button.Name:= format('button%d',[ButtonList.Count]); + button.Style := style; + InsertControl(button); + ButtonList.add(button); + button.setToolBar(self); +end; + +procedure TCEToolBar.dsgnAddButton(sender: TObject); +begin + dsgnAdd(tbsButton); +end; + +procedure TCEToolBar.dsgnAddDivider(sender: TObject); +begin + dsgnAdd(tbsDivider); +end; + +procedure TCEToolBar.dsgnAddSeparator(sender: TObject); +begin + dsgnAdd(tbsSeparator); +end; + +procedure TCEToolBar.dsgnAddCheckbutton(sender: TObject); +begin + dsgnAdd(tbsCheck); +end; + +procedure TCEToolBar.dsgnAddDropdown(sender: TObject); +begin + dsgnAdd(tbsDropDown); +end; + +initialization + RegisterClasses([TCEToolBar, TCEToolButton]); +end. +