tvplanit: Fix and activate component editor of TVpNavBar (still some issues!). Fix TvNavBar background painting issue (#33675).

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6370 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2018-05-02 15:52:08 +00:00
parent 0dd145f49a
commit 3627e39793
6 changed files with 877 additions and 485 deletions

View File

@@ -1,50 +1,269 @@
object frmNavBarEd: TfrmNavBarEd
Left = 374
Height = 344
Height = 364
Top = 236
Width = 426
Width = 543
HorzScrollBar.Page = 425
VertScrollBar.Page = 322
Caption = 'Nav Bar Layout Tool'
ClientHeight = 344
ClientWidth = 426
ClientHeight = 364
ClientWidth = 543
FormStyle = fsStayOnTop
OnClose = FormClose
OnCreate = FormCreate
OnResize = FormResize
OnShow = FormShow
Position = poScreenCenter
LCLVersion = '1.7'
object pnlItems: TPanel
Left = 217
Height = 226
LCLVersion = '1.9.0.0'
object pnlImages: TPanel
Left = 0
Height = 85
Top = 279
Width = 543
Align = alBottom
AutoSize = True
BevelOuter = bvNone
ClientHeight = 85
ClientWidth = 543
TabOrder = 0
object Panel8: TPanel
Left = 0
Height = 27
Top = 0
Width = 209
Width = 543
Align = alTop
BevelOuter = bvNone
ClientHeight = 27
ClientWidth = 543
TabOrder = 0
object Label3: TLabel
AnchorSideLeft.Control = Panel8
AnchorSideTop.Control = Panel8
Left = 4
Height = 15
Top = 8
Width = 89
BorderSpacing.Left = 4
BorderSpacing.Top = 8
Caption = 'Available Images'
ParentColor = False
end
end
object sbImages: TScrollBox
Left = 4
Height = 54
Top = 27
Width = 535
HorzScrollBar.Page = 56
HorzScrollBar.Tracking = True
VertScrollBar.Page = 50
Align = alClient
AutoSize = True
BorderSpacing.Left = 4
BorderSpacing.Right = 4
BorderSpacing.Bottom = 4
ClientHeight = 50
ClientWidth = 531
Color = clWindow
ParentColor = False
TabOrder = 1
OnResize = sbImagesResize
object pnlImageView: TPanel
Left = 0
Height = 50
Top = 0
Width = 56
Constraints.MinHeight = 40
TabOrder = 0
OnClick = pnlImageViewClick
OnPaint = pnlImageViewPaint
end
end
end
object pnlFoldersAndItems: TPanel
Left = 0
Height = 279
Top = 0
Width = 543
Align = alClient
BevelOuter = bvNone
ClientHeight = 226
ClientWidth = 209
ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
ChildSizing.EnlargeVertical = crsHomogenousChildResize
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 2
ClientHeight = 279
ClientWidth = 543
TabOrder = 1
object pnlFolders: TPanel
Left = 0
Height = 279
Top = 0
Width = 272
BevelOuter = bvNone
ClientHeight = 279
ClientWidth = 272
TabOrder = 0
object lbFolders: TListBox
Left = 4
Height = 256
Top = 23
Width = 236
Align = alClient
BorderSpacing.Left = 4
ItemHeight = 0
OnClick = lbFoldersClick
TabOrder = 1
end
object Panel6: TPanel
Left = 0
Height = 23
Top = 0
Width = 272
Align = alTop
BevelOuter = bvNone
ClientHeight = 23
ClientWidth = 272
TabOrder = 0
object Label1: TLabel
Left = 4
Height = 15
Top = 4
Width = 38
Caption = '&Folders'
FocusControl = lbFolders
ParentColor = False
end
end
object Panel5: TPanel
Left = 240
Height = 256
Top = 23
Width = 32
Align = alRight
BevelOuter = bvNone
ClientHeight = 256
ClientWidth = 32
TabOrder = 2
object btnFolderAdd: TSpeedButton
Left = 4
Height = 25
Hint = 'Add folder'
Top = 7
Width = 25
Glyph.Data = {
DE000000424DDE0000000000000076000000280000000D0000000D0000000100
0400000000006800000000000000000000001000000010000000000000000000
80000080000000808000800000008000800080800000C0C0C000808080000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
3000333300000333300033330AAA0333300033330AAA0333300030000AAA0000
300030AAAAAAAAA0300030AAAAAAAAA0300030AAAAAAAAA0300030000AAA0000
300033330AAA0333300033330AAA033330003333000003333000333333333333
3000
}
Layout = blGlyphTop
Spacing = 1
OnClick = btnFolderAddClick
ShowHint = True
ParentShowHint = False
end
object btnFolderDelete: TSpeedButton
Left = 4
Height = 25
Hint = 'Remove folder'
Top = 40
Width = 25
Glyph.Data = {
DE000000424DDE0000000000000076000000280000000D0000000D0000000100
0400000000006800000000000000000000001000000010000000000000000000
80000080000000808000800000008000800080800000C0C0C000808080000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
3000333333333333300033333333333330003333333333333000300000000000
3000309999999990300030999999999030003099999999903000300000000000
3000333333333333300033333333333330003333333333333000333333333333
3000
}
Layout = blGlyphTop
Spacing = 1
OnClick = btnFolderDeleteClick
ShowHint = True
ParentShowHint = False
end
object btnFolderUp: TSpeedButton
Left = 4
Height = 25
Hint = 'Move folder up'
Top = 72
Width = 25
Glyph.Data = {
DE000000424DDE0000000000000076000000280000000D0000000D0000000100
0400000000006800000000000000000000001000000010000000000000000000
80000080000000808000800000008000800080800000C0C0C000808080000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
3000333333333333300033330000033330003333066603333000333306660333
3000333306660333300030000666000030003306666666033000333066666033
3000333306660333300033333060333330003333330333333000333333333333
3000
}
Layout = blGlyphTop
Spacing = 1
OnClick = btnFolderUpClick
ShowHint = True
ParentShowHint = False
end
object btnFolderDown: TSpeedButton
Left = 4
Height = 25
Hint = 'Move folder down'
Top = 104
Width = 25
Glyph.Data = {
DE000000424DDE0000000000000076000000280000000D0000000D0000000100
0400000000006800000000000000000000001000000010000000000000000000
80000080000000808000800000008000800080800000C0C0C000808080000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
3000333333333333300033333303333330003333306033333000333306660333
3000333066666033300033066666660330003000066600003000333306660333
3000333306660333300033330666033330003333000003333000333333333333
3000
}
Layout = blGlyphTop
Spacing = 1
OnClick = btnFolderDownClick
ShowHint = True
ParentShowHint = False
end
end
end
object pnlItems: TPanel
Left = 272
Height = 279
Top = 0
Width = 271
BevelOuter = bvNone
ClientHeight = 279
ClientWidth = 271
TabOrder = 1
object lbItems: TListBox
Left = 0
Height = 203
Height = 256
Top = 23
Width = 173
Width = 235
Align = alClient
ItemHeight = 13
OnClick = lbItemsClick
OnDrawItem = lbItemsDrawItem
OnMeasureItem = lbItemsMeasureItem
Style = lbOwnerDrawVariable
TabOrder = 1
end
object Panel1: TPanel
Left = 173
Height = 203
Left = 235
Height = 256
Top = 23
Width = 32
Align = alRight
BorderSpacing.Right = 4
BevelOuter = bvNone
ClientHeight = 203
ClientHeight = 256
ClientWidth = 32
TabOrder = 2
object btnItemAdd: TSpeedButton
@@ -140,11 +359,11 @@ object frmNavBarEd: TfrmNavBarEd
Left = 0
Height = 23
Top = 0
Width = 209
Width = 271
Align = alTop
BevelOuter = bvNone
ClientHeight = 23
ClientWidth = 209
ClientWidth = 271
TabOrder = 0
object Label2: TLabel
Left = 0
@@ -157,191 +376,5 @@ object frmNavBarEd: TfrmNavBarEd
end
end
end
object pnlFolders: TPanel
Left = 0
Height = 226
Top = 0
Width = 217
Align = alLeft
BevelOuter = bvNone
ClientHeight = 226
ClientWidth = 217
TabOrder = 0
object lbFolders: TListBox
Left = 4
Height = 203
Top = 23
Width = 181
Align = alClient
BorderSpacing.Left = 4
ItemHeight = 0
OnClick = lbFoldersClick
TabOrder = 1
end
object Panel6: TPanel
Left = 0
Height = 23
Top = 0
Width = 217
Align = alTop
BevelOuter = bvNone
ClientHeight = 23
ClientWidth = 217
TabOrder = 0
object Label1: TLabel
Left = 4
Height = 15
Top = 4
Width = 38
Caption = '&Folders'
FocusControl = lbFolders
ParentColor = False
end
end
object Panel5: TPanel
Left = 185
Height = 203
Top = 23
Width = 32
Align = alRight
BevelOuter = bvNone
ClientHeight = 203
ClientWidth = 32
TabOrder = 2
object btnFolderAdd: TSpeedButton
Left = 4
Height = 25
Hint = 'Add Item'
Top = 7
Width = 25
Glyph.Data = {
DE000000424DDE0000000000000076000000280000000D0000000D0000000100
0400000000006800000000000000000000001000000010000000000000000000
80000080000000808000800000008000800080800000C0C0C000808080000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
3000333300000333300033330AAA0333300033330AAA0333300030000AAA0000
300030AAAAAAAAA0300030AAAAAAAAA0300030AAAAAAAAA0300030000AAA0000
300033330AAA0333300033330AAA033330003333000003333000333333333333
3000
}
Layout = blGlyphTop
Spacing = 1
OnClick = btnFolderAddClick
ShowHint = True
ParentShowHint = False
end
object btnFolderDelete: TSpeedButton
Left = 4
Height = 25
Hint = 'Remove item'
Top = 39
Width = 25
Glyph.Data = {
DE000000424DDE0000000000000076000000280000000D0000000D0000000100
0400000000006800000000000000000000001000000010000000000000000000
80000080000000808000800000008000800080800000C0C0C000808080000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
3000333333333333300033333333333330003333333333333000300000000000
3000309999999990300030999999999030003099999999903000300000000000
3000333333333333300033333333333330003333333333333000333333333333
3000
}
Layout = blGlyphTop
Spacing = 1
OnClick = btnFolderDeleteClick
ShowHint = True
ParentShowHint = False
end
object btnFolderUp: TSpeedButton
Left = 4
Height = 25
Hint = 'Move item up'
Top = 72
Width = 25
Glyph.Data = {
DE000000424DDE0000000000000076000000280000000D0000000D0000000100
0400000000006800000000000000000000001000000010000000000000000000
80000080000000808000800000008000800080800000C0C0C000808080000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
3000333333333333300033330000033330003333066603333000333306660333
3000333306660333300030000666000030003306666666033000333066666033
3000333306660333300033333060333330003333330333333000333333333333
3000
}
Layout = blGlyphTop
Spacing = 1
OnClick = btnFolderUpClick
ShowHint = True
ParentShowHint = False
end
object btnFolderDown: TSpeedButton
Left = 4
Height = 25
Hint = 'Move item down'
Top = 104
Width = 25
Glyph.Data = {
DE000000424DDE0000000000000076000000280000000D0000000D0000000100
0400000000006800000000000000000000001000000010000000000000000000
80000080000000808000800000008000800080800000C0C0C000808080000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
3000333333333333300033333303333330003333306033333000333306660333
3000333066666033300033066666660330003000066600003000333306660333
3000333306660333300033330666033330003333000003333000333333333333
3000
}
Layout = blGlyphTop
Spacing = 1
OnClick = btnFolderDownClick
ShowHint = True
ParentShowHint = False
end
end
end
object pnlImages: TPanel
Left = 0
Height = 118
Top = 226
Width = 426
Align = alBottom
BevelOuter = bvNone
ClientHeight = 118
ClientWidth = 426
TabOrder = 2
object Panel8: TPanel
Left = 0
Height = 27
Top = 0
Width = 426
Align = alTop
BevelOuter = bvNone
ClientHeight = 27
ClientWidth = 426
TabOrder = 0
object Label3: TLabel
Left = 4
Height = 15
Top = 8
Width = 89
Caption = 'Available I&mages'
ParentColor = False
end
end
object lbImages: TListBox
Left = 4
Height = 87
Top = 27
Width = 418
Align = alClient
BorderSpacing.Left = 4
BorderSpacing.Right = 4
BorderSpacing.Bottom = 4
Columns = 10
ItemHeight = 16
OnClick = lbImagesClick
OnDrawItem = lbImagesDrawItem
Style = lbOwnerDrawFixed
TabOrder = 1
end
end
end

View File

@@ -35,25 +35,20 @@ interface
uses
{$IFDEF LCL}
lazlogger,
LCLProc, LCLType, LCLIntf,
PropEdits, LazarusPackageIntf, FieldsEditor, ComponentEditors,
{$ELSE}
Windows, Messages,
{$ENDIF}
SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
{$IFDEF VERSION6}
{$IFNDEF LCL}
DesignIntf, DesignEditors,
{$ELSE}
PropEdits,
LazarusPackageIntf,
FieldsEditor,
ComponentEditors,
{$ENDIF}
{$ELSE}
DsgnIntf,
{$ENDIF}
{$ENDIF}
SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Buttons,
VpBase, VpNavBar;
@@ -70,7 +65,11 @@ type
function GetVerbCount : Integer; override;
end;
{ TfrmNavBarEd }
TfrmNavBarEd = class(TForm)
pnlImageView: TPanel;
pnlFoldersAndItems: TPanel;
pnlItems: TPanel;
pnlFolders: TPanel;
lbItems: TListBox;
@@ -92,47 +91,66 @@ type
pnlImages: TPanel;
Panel8: TPanel;
Label3: TLabel;
lbImages: TListBox;
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure lbFoldersClick(Sender: TObject);
procedure lbItemsMeasureItem(Control: TWinControl; Index: Integer;
var Height: Integer);
procedure lbItemsDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure lbImagesDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure lbImagesClick(Sender: TObject);
procedure btnItemUpClick(Sender: TObject);
procedure btnItemDownClick(Sender: TObject);
procedure btnFolderUpClick(Sender: TObject);
procedure btnFolderDownClick(Sender: TObject);
procedure btnItemDeleteClick(Sender: TObject);
procedure btnFolderDeleteClick(Sender: TObject);
sbImages: TScrollBox;
procedure btnFolderAddClick(Sender: TObject);
procedure btnFolderDeleteClick(Sender: TObject);
procedure btnFolderDownClick(Sender: TObject);
procedure btnFolderUpClick(Sender: TObject);
procedure btnItemAddClick(Sender: TObject);
procedure lbItemsClick(Sender: TObject);
procedure btnItemDeleteClick(Sender: TObject);
procedure btnItemDownClick(Sender: TObject);
procedure btnItemUpClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
// procedure FormResize(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure lbFoldersClick(Sender: TObject);
procedure lbItemsMeasureItem(Control: TWinControl; Index: Integer; var Height: Integer);
procedure lbItemsClick(Sender: TObject);
procedure lbItemsDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
procedure pnlImageViewClick(Sender: TObject);
procedure pnlImageViewPaint(Sender: TObject);
procedure sbImagesResize(Sender: TObject);
private
FBar: TVpNavBar;
FDesigner: TIDesigner;
RefreshTimer: TTimer;
FSelImgIndex: Integer;
{$IFDEF LCL}
function FindBtnIndex(APersistent: TPersistent): Integer;
function FindFolderIndex(APersistent: TPersistent): Integer;
procedure OnGetSelection(const ASelection: TPersistentSelectionList);
procedure OnPersistentAdded(APersistent: TPersistent; Select: boolean);
procedure OnPersistentDeleting(APersistent: TPersistent);
procedure OnSetSelection(const ASelection: TPersistentSelectionList);
procedure SelectList(SelList: TPersistentSelectionList);
{$ELSE}
{$IFDEF VERSION5}
{$IFDEF VERSION6}
{$IFNDEF LCL}
procedure SelectList(SelList: TDesignerSelections);
{$ENDIF}
{$ELSE}
procedure SelectList(SelList: TDesignerSelectionList);
{$ENDIF}
{$ELSE}
procedure SelectList(SelList: TComponentList);
{$ENDIF}
{$ENDIF}
procedure OnTimer(Sender: TObject);
public
{ Public declarations }
Bar : TVpNavBar;
Designer : TIDesigner;
procedure PopulateFolderList;
procedure PopulateItemList;
procedure SetData(ADesigner: TIDesigner; ABar: TVpNavBar);
property Bar: TVpNavBar read FBar;
property Designer: TIDesigner read FDesigner;
end;
var
@@ -147,25 +165,26 @@ implementation
{$ENDIF}
uses
PropEditUtils,
VpMisc;
const
ITEMS_MARGIN = 2;
IMG_MARGIN = 4;
{$IFDEF LCL}
procedure EditNavBar(Designer: TIDesigner; Bar: TVpNavBar);
{$ELSE}
{$IFDEF VERSION6}
procedure EditNavBar(Designer: TIDesigner; Bar: TVpNavBar);
{$ELSE}
procedure EditNavBar(Designer: TIFormDesigner; Bar: TVpNavBar);
{$ENDIF}
var
i : Integer;
{$ENDIF}
begin
if frmNavEd = nil then
frmNavEd := TfrmNavBarEd.Create(Application);
frmNavEd.Bar := Bar;
frmNavEd.PopulateFolderList;
frmNavEd.Designer := Designer;
if Bar.Images <> nil then begin
frmNavEd.lbImages.ItemHeight := Bar.Images.Height + 4;
for i := 0 to pred(Bar.Images.Count) do
frmNavEd.lbImages.Items.Add(IntToStr(i));
end;
frmNavEd.SetData(Designer, Bar);
frmNavEd.Show;
end;
@@ -200,14 +219,17 @@ begin
RefreshTimer.OnTimer := OnTimer;
RefreshTimer.Enabled := true;
end;
{=====}
procedure TfrmNavBarEd.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
(*
Unused(Action);
RefreshTimer.Free;
Release;
*)
end;
{=====}
@@ -236,20 +258,149 @@ begin
end;
end;
{=====}
(*
procedure TfrmNavBarEd.FormResize(Sender: TObject);
begin
pnlFolders.Width := (pnlItems.Width + pnlFolders.Width) div 2;
if Bar.Images <> nil then begin
pnlImages.Height := 25 + (5 * (Bar.Images.Height div 3));
lbImages.Columns := lbImages.Width div Bar.Images.Width;
lbImages.Columns := lbImages.ClientWidth div Bar.Images.Width;
{Allow for scrollbar if excessive number of images}
if (lbImages.Width >= Bar.Images.Width) then
pnlImages.Height := pnlImages.Height + 20;
end;
end; *)
procedure TfrmNavBarEd.FormShow(Sender: TObject);
begin
if Bar.Images <> nil then begin
// sbImages.Constraints.MinHeight := Bar.Images.Height + GetScrollbarHeight + 2*IMG_MARGIN;
pnlImages.Height := Bar.Images.Height + GetScrollbarHeight + 2*IMG_MARGIN +
Panel8.Height + pnlImages.BorderSpacing.Top + pnlImages.BorderSpacing.Bottom;
//lbImages.Columns := lbImages.ClientWidth div Bar.Images.Width;
end;
end;
{=====}
{$IFDEF LCL}
function TfrmNavBarEd.FindFolderIndex(APersistent: TPersistent): Integer;
begin
for Result := 0 to lbFolders.Items.Count-1 do
if TPersistent(lbFolders.Items.Objects[Result]) = APersistent then
exit;
Result := -1;
end;
function TfrmNavBarEd.FindBtnIndex(APersistent: TPersistent): Integer;
begin
for Result := 0 to lbItems.Items.Count-1 do
if TPersistent(lbItems.Items.Objects[Result]) = APersistent then
exit;
Result := -1;
end;
{$ENDIF}
{$IFDEF LCL}
procedure TfrmNavBarEd.OnGetSelection(const ASelection: TPersistentSelectionList);
var
i: Integer;
begin
if not Assigned(ASelection) then
exit;
if ASelection.Count > 0 then
ASelection.Clear;
if lbFolders.Focused then begin
for i:=0 to lbFolders.Items.Count-1 do
if lbFolders.Selected[i] then
ASelection.Add(TPersistent(lbFolders.Items.Objects[i]));
end else
if lbItems.Focused then begin
for i:=0 to lbItems.Items.Count-1 do
if lbItems.Selected[i] then
ASelection.Add(TPersistent(lbItems.Items.Objects[i]));
end;
end;
{$ENDIF}
{$IFDEF LCL}
procedure TfrmNavBarEd.OnPersistentAdded(APersistent: TPersistent; Select: boolean);
var
i: Integer;
begin
if not Assigned(APersistent) then
exit;
if (APersistent is TVpNavFolder) then
begin
PopulateFolderList;
if Select then begin
i := FindFolderIndex(APersistent);
lbFolders.ItemIndex := i;
end;
end else
if (APersistent is TVpNavBtnItem) then
begin
PopulateItemList;
if Select then begin
i := FindBtnIndex(APersistent);
lbItems.ItemIndex := i;
end;
end;
end;
{$ENDIF}
{$IFDEF LCL}
procedure TfrmNavBarEd.OnPersistentDeleting(APersistent: TPersistent);
var
i: Integer;
begin
if APersistent is TVpNavFolder then
begin
i := FindFolderIndex(APersistent);
if i <> -1 then lbFolders.Items.Delete(i);
end else
if APersistent is TVpNavBtnItem then
begin
i := FindBtnIndex(APersistent);
if i <> -1 then lbItems.Items.Delete(i);
end;
end;
{$ENDIF}
{$IFDEF LCL}
procedure TfrmNavBarEd.OnSetSelection(const ASelection: TPersistentSelectionList);
var
i, j: Integer;
begin
if Assigned(ASelection) and (ASelection.Count > 0) then
begin
if TPersistent(ASelection[0]) is TVpNavFolder then begin
//Unselect all
for i := 0 to lbFolders.Items.Count-1 do
lbFolders.Selected[i] := false;
//select from list
for i := 0 to ASelection.Count - 1 do begin
j := FindFolderIndex(ASelection[i]);
if j <> -1 then lbFolders.Selected[j] := true;
end;
end else
if TPersistent(ASelection[0]) is TVpNavBtnItem then
begin
// Unselect all
for i := 0 to lbItems.Items.Count - 1 do
lbItems.Selected[i] := false;
// Select from list
for i := 0 to ASelection.Count - 1 do begin
j := FindBtnIndex(ASelection[i]);
if j <> -1 then lbItems.Selected[j] := true;
end;
end;
end;
end;
{$ENDIF}
procedure TfrmNavBarEd.PopulateFolderList;
var
I : Integer;
@@ -282,13 +433,84 @@ begin
end;
{=====}
procedure TfrmNavBarEd.SetData(ADesigner: TIDesigner; ABar: TVpNavBar);
var
i: Integer;
w: Integer;
begin
if FBar <> nil then
FBar.RemoveFreeNotification(self);
FBar := ABar;
FDesigner := ADesigner;
if FBar <> nil then
FBar.FreeNotification(self);
PopulateFolderList;
if FBar.Images <> nil then begin
w := (Bar.Images.Width + 2*IMG_MARGIN) * Bar.Images.Count;
pnlImageView.ClientWidth := w;
pnlImageView.Constraints.MinHeight := Bar.Images.Height + 2 * IMG_MARGIN + GetScrollbarHeight;
if w > sbImages.ClientWidth then begin
sbImages.HorzScrollbar.Range := w - sbImages.ClientWidth;
sbImages.HorzScrollbar.Visible := true;
end else
sbImages.HorzScrollbar.Visible := false;
(*
lbImages.ItemHeight := Bar.Images.Height + 4;
for i := 0 to pred(FBar.Images.Count) do
lbImages.Items.Add(IntToStr(i));
*)
end;
FSelImgIndex := -1;
if GlobalDesignHook <> nil then
begin
GlobalDesignHook.RemoveAllHandlersForObject(Self);
if FBar <> nil then
begin
GlobalDesignHook.AddHandlerPersistentAdded(OnPersistentAdded);
GlobalDesignHook.AddHandlerPersistentDeleting(OnPersistentDeleting);
GlobalDesignHook.AddHandlerGetSelection(OnGetSelection);
GlobalDesignHook.AddHandlerSetSelection(OnSetSelection);
end;
end;
end;
procedure TfrmNavBarEd.lbFoldersClick(Sender: TObject);
{$IFDEF LCL}
var
SelList: TPersistentSelectionList;
i: Integer;
begin
PopulateItemList;
Bar.ActiveFolder := lbFolders.ItemIndex;
FSelImgIndex := -1;
pnlImageView.Invalidate;
SelList := TPersistentSelectionList.Create;
SelList.ForceUpdate := true;
for i := 0 to pred(lbFolders.Items.Count) do
if lbFolders.Selected[i] then begin
SelList.Add(TPersistent(lbFolders.Items.Objects[i]));
Bar.FolderCollection.DoOnItemSelected(i);
end;
if not Bar.FolderCollection.ReadOnly then
begin
btnFolderUp.Enabled := SelList.Count = 1;
btnFolderDown.Enabled := btnFolderUp.Enabled;
btnFolderDelete.Enabled := btnFolderUp.Enabled;
end;
if SelList.Count > 0 then
SelectList(SelList);
end;
{$ELSE}
var
{$IFDEF VERSION5}
{$IFDEF VERSION6}
{$IFNDEF LCL}
SelList : TDesignerSelections;
{$ENDIF}
{$ELSE}
SelList : TDesignerSelectionList;
{$ENDIF}
@@ -297,7 +519,6 @@ var
{$ENDIF}
{%H-}i : Integer;
begin
{$IFNDEF LCL}
PopulateItemList;
Bar.ActiveFolder := lbFolders.ItemIndex;
@@ -335,8 +556,8 @@ begin
if SelList.Count > 0 then
{$ENDIF}
SelectList(SelList);
{$ENDIF}
end;
{$ENDIF}
{=====}
procedure TfrmNavBarEd.lbItemsMeasureItem(Control: TWinControl;
@@ -344,60 +565,96 @@ procedure TfrmNavBarEd.lbItemsMeasureItem(Control: TWinControl;
begin
Unused(Control, Index);
if (Bar.Images <> nil) then
Height := Bar.Images.Height + 4;
Height := Bar.Images.Height + 2 * ITEMS_MARGIN;
end;
{=====}
procedure TfrmNavBarEd.lbItemsDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
btn: TVpNavBtnItem;
lb: TListbox;
ts: TTextStyle;
x, y: Integer;
delta: Integer;
begin
Unused(State);
with TListBox(Control).Canvas do
FillRect(Rect);
if (Bar.Images <> nil)
and (TVpNavBtnItem(lbItems.Items.Objects[Index]).IconIndex > -1)
and (TVpNavBtnItem(lbItems.Items.Objects[Index]).IconIndex <
Bar.Images.Count)
then begin
Bar.Images.Draw(TListBox(Control).Canvas, Rect.Right - Bar.Images.Width,
Rect.Top, TVpNavBtnItem(lbItems.Items.Objects[Index]).IconIndex);
with TListBox(Control).Canvas do
TextOut(Rect.Left + 2, Rect.Top + (Rect.Bottom - Rect.Top) div 3,
TListBox(Control).Items[Index]);
end else
with TListBox(Control).Canvas do
TextOut(Rect.Left + 2, Rect.Top, TListBox(Control).Items[Index]);
end;
{=====}
lb := TListBox(Control);
lb.Canvas.FillRect(Rect);
procedure TfrmNavBarEd.lbImagesDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
if Index = -1 then
exit;
// Draw button image
delta := ITEMS_MARGIN;
btn := TVpNavBtnItem(lbItems.Items.Objects[Index]);
if (Bar.Images <> nil) and (btn <> nil) and
(btn.IconIndex > -1) and (btn.IconIndex < Bar.Images.Count) then
begin
Unused(State);
with TListBox(Control).Canvas do
FillRect(Rect);
if (Bar.Images <> nil) then
Bar.Images.Draw(TListBox(Control).Canvas, Rect.Left + 1, Rect.Top + 1,
Index);
Bar.Images.Draw(
lb.Canvas,
Rect.Right - Bar.Images.Width - delta,
(Rect.Top + Rect.Bottom - Bar.Images.Height) div 2,
btn.IconIndex
);
end;
// Draw text
ts := lb.Canvas.TextStyle;
ts.Alignment := taLeftJustify;
ts.Layout := tlCenter;
ts.EndEllipsis := true;
ts.Singleline := true;
ts.Wordbreak := false;
x := Rect.Left + 2;
y := (Rect.Top + Rect.Bottom - lb.Canvas.TextHeight('Tg')) div 2;
lb.Canvas.TextRect(Rect, x, y, lb.Items[Index]);
end;
{=====}
procedure TfrmNavBarEd.lbItemsClick(Sender: TObject);
{$IFDEF LCL}
var
SelList: TPersistentSelectionList;
i: Integer;
btn: TVpNavBtnItem;
begin
if (lbItems.ItemIndex <> -1) and (Bar.ActiveFolder <> 1) then
begin
btn := TVpNavBtnItem(lbItems.Items.Objects[lbItems.ItemIndex]);
FSelImgIndex := btn.IconIndex;
pnlImageView.Invalidate;
SelList := TPersistentSelectionList.Create;
SelList.ForceUpdate := true;
for i:=0 to lbItems.Items.Count-1 do
if lbItems.Selected[i] then
begin
SelList.Add(TPersistent(lbItems.Items.Objects[i]));
Bar.Folders[Bar.ActiveFolder].ItemCollection.DoOnItemSelected(I);
end;
if not Bar.Folders[Bar.ActiveFolder].ItemCollection.ReadOnly
then begin
btnItemUp.Enabled := SelList.Count = 1;
btnItemDown.Enabled := btnItemUp.Enabled;
btnItemDelete.Enabled := btnItemUp.Enabled;
end;
if SelList.Count > 0 then
SelectList(SelList);
end;
end;
{$ELSE}
var
{$IFDEF VERSION5}
{$IFDEF VERSION6}
{$IFNDEF LCL}
SelList : TDesignerSelections;
{$ENDIF}
{$ELSE}
SelList : TDesignerSelectionList;
{$ENDIF}
{$ELSE}
SelList : TComponentList;
{$ENDIF}
{%H-}i : Integer;
i : Integer;
begin
{$IFNDEF LCL}
if (lbItems.ItemIndex <> -1) then begin
lbImages.ItemIndex :=
TVpNavBtnItem(lbItems.Items.Objects[lbItems.ItemIndex]).IconIndex;
@@ -411,6 +668,7 @@ begin
{$ELSE}
SelList := TComponentList.Create;
{$ENDIF}
for i := 0 to pred(lbItems.Items.Count) do
if lbItems.Selected[i] then begin
{$IFDEF VERSION6}
@@ -432,15 +690,16 @@ begin
end;
{$IFDEF VERSION6}
if TProtectedSelList(SelList).Count > 0 then
SelectList(SelList);
{$ELSE}
if SelList.Count > 0 then
{$ENDIF}
SelectList(SelList);
end;
{$ENDIF}
end;
end;
{$ENDIF}
{=====}
(*
procedure TfrmNavBarEd.lbImagesClick(Sender: TObject);
begin
if (lbImages.ItemIndex <> -1) and (lbItems.ItemIndex <> -1) then begin
@@ -450,7 +709,8 @@ begin
if assigned(Designer) then
Designer.Modified;
end;
end;
end; *)
{=====}
procedure TfrmNavBarEd.btnItemUpClick(Sender: TObject);
@@ -461,12 +721,14 @@ begin
if (lbItems.ItemIndex > 0) then begin
SaveItemIndex := lbItems.ItemIndex;
Item := TVpNavBtnItem(lbItems.Items.Objects[lbItems.ItemIndex]);
if Item.Index > 0 then
Item.Index := Item.Index - 1;
if Assigned(Designer) then
if Assigned(Designer) then begin
GlobalDesignHook.SelectOnlyThis(nil);
GlobalDesignHook.SelectOnlyThis(Item);
Designer.Modified;
end;
PopulateItemList;
@@ -485,8 +747,11 @@ begin
if Item.Index < Pred(lbItems.Items.Count) then
Item.Index := Item.Index + 1;
if Assigned(Designer) then
if Assigned(Designer) then begin
GlobalDesignHook.SelectOnlyThis(nil);
GlobalDesignHook.SelectOnlyThis(Item);
Designer.Modified;
end;
PopulateItemList;
@@ -507,8 +772,11 @@ begin
if Folder.Index > 0 then
Folder.Index := Folder.Index - 1;
if assigned(Designer) then
if Assigned(Designer) then begin
GlobalDesignHook.SelectOnlyThis(nil);
GlobalDesignHook.SelectOnlyThis(folder);
Designer.Modified;
end;
PopulateFolderList;
@@ -527,8 +795,11 @@ begin
if Folder.Index < pred(lbFolders.Items.Count) then
Folder.Index := Folder.Index + 1;
if assigned(Designer) then
if Assigned(Designer) then begin
GlobalDesignHook.SelectOnlyThis(nil);
GlobalDesignHook.SelectOnlyThis(folder);
Designer.Modified;
end;
PopulateFolderList;
@@ -542,6 +813,7 @@ begin
if (lbItems.ItemIndex <> -1) then begin
TVpNavBtnItem(lbItems.Items.Objects[lbItems.ItemIndex]).Free;
lbItems.ItemIndex := -1;
FSelImgIndex := -1;
PopulateItemList;
if assigned(Designer) then
Designer.Modified;
@@ -586,11 +858,90 @@ begin
end;
{=====}
procedure TfrmNavBarEd.pnlImageViewPaint(Sender: TObject);
var
R: TRect;
Rimg: TRect;
i: Integer;
x, y: Integer;
wimg, himg: Integer;
begin
R := Rect(0, 0, sbImages.Width, sbImages.Height);
pnlImageView.Canvas.Brush.Color := clWindow;
pnlImageView.Canvas.FillRect(R);
if (Bar.Images = nil) or (Bar.Images.Count = 0) then
exit;
wimg := Bar.Images.Width;
himg := Bar.Images.Height;
x := 0;
y := R.Top + IMG_MARGIN;
if pnlImageView.Width <= sbImages.Width then // no scrollbar
inc(y, GetScrollbarHeight div 2);
i := 0;
while i < Bar.Images.Count do begin
if i = FSelImgIndex then begin
R := Rect(x, R.Top, x+wimg+2*IMG_MARGIN, R.Bottom);
pnlImageView.Canvas.Brush.Color := clHighlight;
pnlImageView.Canvas.FillRect(R);
end;
Bar.Images.Draw(pnlImageView.Canvas, x + IMG_MARGIN, y, i, true);
inc(i);
inc(x, wimg + 2*IMG_MARGIN);
end;
end;
procedure TfrmNavBarEd.pnlImageViewClick(Sender: TObject);
var
P: TPoint;
btn: TVpNavBtnItem;
res: Integer;
begin
if (Bar.Images = nil) or (Bar.Images.Count = 0) then
exit;
P := pnlImageView.ScreenToClient(Mouse.CursorPos);
FSelImgIndex := P.X div (Bar.Images.Width + 2*IMG_MARGIN);
if FSelImgIndex >= Bar.Images.Count then FSelImgIndex := Bar.Images.Count - 1;
pnlImageView.Invalidate;
if (FSelImgIndex <> -1) and (lbItems.ItemIndex <> -1) then begin
btn := TVpNavBtnItem(lbItems.Items.Objects[lbItems.ItemIndex]);
if btn.IconIndex <> -1 then begin
res := MessageDlg('Do you want to replace the button icon by this one?',
mtConfirmation, [mbYes, mbNo, mbCancel], 0);
if res <> mrYes then
exit;
end;
btn.IconIndex := FSelImgIndex;
lbItems.Invalidate;
if Assigned(Designer) then
Designer.Modified;
end;
end;
procedure TfrmNavBarEd.sbImagesResize(Sender: TObject);
begin
sbImages.HorzScrollbar.Visible := sbImages.ClientWidth < pnlImageView.ClientWidth;
end;
{$IFDEF LCL}
procedure TfrmNavBarEd.Selectlist(SelList: TPersistentSelectionList);
begin
if GlobalDesignHook <> nil then
begin
GlobalDesignHook.SetSelection(SelList);
GlobalDesignHook.LookupRoot := GetLookupRootForComponent(Bar);
end;
SelList.Free;
end;
{$ELSE}
{$IFDEF VERSION5}
{$IFDEF VERSION6}
{$IFNDEF LCL}
procedure TfrmNavBarEd.SelectList(SelList : TDesignerSelections);
{$ENDIF}
{$ELSE}
procedure TfrmNavBarEd.SelectList(SelList : TDesignerSelectionList);
{$ENDIF}
@@ -598,7 +949,6 @@ end;
procedure TfrmNavBarEd.SelectList(SelList : TComponentList);
{$ENDIF}
begin
{$IFNDEF LCL}
{$IFNDEF Ver80}
{$IFDEF VERSION4}
if Designer <> nil then

View File

@@ -38,19 +38,15 @@ interface
uses
{$IFDEF LCL}
LCLProc, LCLType, LCLIntf, LazFileUtils,
PropEdits, LazarusPackageIntf, FieldsEditor, ComponentEditors,
{$ELSE}
Windows,
{$ENDIF}
{$IFDEF VERSION6}
{$IFNDEF LCL}
DesignIntf, DesignEditors, VCLEditors,
{$ELSE}
PropEdits, LazarusPackageIntf, FieldsEditor, ComponentEditors,
{$ENDIF}
{$ELSE}
DsgnIntf,
{$ENDIF}
{$ENDIF}
Dialogs, Classes, Controls, TypInfo, Forms, SysUtils,
VpDatePropEdit;
@@ -202,9 +198,7 @@ uses
VpContactButtons, { - New contact grid button bar component }
{ Designtime Interfaces (Property and Component Editors) }
VpAbout, { About form for the About property editor }
{$IFDEF DELPHI}
VpNabEd, { component editor for the VpNavBar } // crashes in Lazarus
{$ENDIF}
VpNabEd, { component editor for the VpNavBar }
VpFlxDSEd1; { Field mapper component editor for the FlexDS }
@@ -557,9 +551,7 @@ begin
{----------------------------------------------------------------------------}
{ register component editors }
{----------------------------------------------------------------------------}
{$IFDEF DELPHI}
RegisterComponentEditor(TVpNavBar, TVpNavBarEditor);
{$ENDIF}
RegisterComponentEditor(TVpControlLink, TVpPrtFmtPropertyEditor);
RegisterComponentEditor(TVpFlexDataStore, TVpFlexDSEditor);

View File

@@ -182,6 +182,9 @@ procedure LoadGlyphFromRCDATA(AGlyph: TBitmap; ABaseResName: String;
procedure LoadImageFromRCDATA(AImage: TImage; ABaseResName: String;
ALowRes, AMedRes, AHighRes: Integer; AdjustSize: Boolean = true);
function GetScrollbarHeight: Integer;
function GetScrollbarWidth: Integer;
procedure Unused(const A1); overload;
procedure Unused(const A1, A2); overload;
procedure Unused(const A1, A2, A3); overload;
@@ -1023,6 +1026,17 @@ begin
end;
end;
function GetScrollbarHeight: Integer;
begin
Result := GetSystemMetrics(SM_CYHSCROLL);
end;
function GetScrollbarWidth: Integer;
begin
Result := GetSystemMetrics(SM_CXVSCROLL);
end;
{$PUSH}{$HINTS OFF}
procedure Unused(const A1);
begin

View File

@@ -328,7 +328,7 @@ type
property ActiveFolder: Integer read FActiveFolder write SetActiveFolder;
property AllowInplaceEdit: Boolean read FAllowInplaceEdit write FAllowInplaceEdit default false;
property AllowRearrange: Boolean read FAllowRearrange write FAllowRearrange;
property BackgroundColor: TColor read FBackgroundColor write SetBackgroundColor;
property BackgroundColor: TColor read FBackgroundColor write SetBackgroundColor default clWindow;
property BackgroundImage: TBitmap read FBackgroundImage write SetBackgroundImage;
property BackgroundMethod: TVpBackgroundMethod read FBackgroundMethod write SetBackgroundMethod;
property ButtonHeight: Integer read FButtonHeight write SetButtonHeight;
@@ -1005,7 +1005,7 @@ begin
FItemFont := TFont.Create;
FItemFont.Name := Font.Name;
FItemFont.OnChange := nabFontChanged;
FItemFont.Color := clWhite;
FItemFont.Color := clWindowText;
FItemSpacing := abs(FItemFont.Height) + 3;
FSelectedItemFont := TFont.Create;
@@ -1061,7 +1061,7 @@ begin
ParentColor := False;
FAllowRearrange := True;
FBackgroundColor := clInactiveCaption;
FBackgroundColor := clWindow;
FBackgroundImage := TBitmap.Create;
FBackgroundMethod := bmNormal;
// FBorderStyle := bsSingle;

View File

@@ -214,7 +214,7 @@ var
rowStart: Integer;
lLeft, lHeight, lWidth: Integer;
begin
if FBackgroundImage.Empty or (FBackgroundMethod = bmNone) then
if FBackgroundImage.Empty or (FBackgroundMethod = bmNone) or (FNavBar.FolderCount = 0) then
begin
Canvas.Brush.Color := FBackgroundColor;
Canvas.FillRect(R.Left, R.Top, R.Right, R.Bottom);
@@ -861,6 +861,7 @@ begin
try
DrawBmp.Width := FClientWidth;
DrawBmp.Height := FClientHeight;
DrawBmp.Transparent := false;
DrawBmp.Canvas.Font := FNavBar.Font;
DrawBmp.Canvas.Pen.Color := FBackgroundColor;
@@ -878,6 +879,8 @@ begin
if FNavBar.FolderCount = 0 then begin
nabScrollUpBtn.Visible := False;
nabScrollDownBtn.Visible := False;
FNavBar.Canvas.CopyMode := cmSrcCopy;
FNavBar.Canvas.CopyRect(MyRect, DrawBmp.Canvas, Rect(0, 0, DrawBmp.Width,DrawBmp.Height));
Exit;
end;