1
0
mirror of synced 2024-11-22 01:53:50 +00:00

Repository too old to merge - renaming branch to trunk

This commit is contained in:
Mark van Renswoude 2009-03-13 15:26:41 +00:00
commit c4efc9ca49
20 changed files with 2398 additions and 709 deletions

View File

@ -31,9 +31,9 @@
-M -M
-$M16384,1048576 -$M16384,1048576
-K$00400000 -K$00400000
-N"..\..\Lib\D7" -N"P:\algemeen\lib"
-LE"..\..\Lib\D7" -LE"P:\algemeen\bin"
-LN"..\..\Lib\D7" -LN"P:\algemeen\lib"
-Z -Z
-w-UNSAFE_TYPE -w-UNSAFE_TYPE
-w-UNSAFE_CODE -w-UNSAFE_CODE

View File

@ -91,9 +91,9 @@ ImageBase=4194304
ExeDescription=X²CL MenuBar ExeDescription=X²CL MenuBar
[Directories] [Directories]
OutputDir= OutputDir=
UnitOutputDir=..\..\Lib\D7 UnitOutputDir=$(DELPHILIB)
PackageDLLOutputDir=..\..\Lib\D7 PackageDLLOutputDir=$(DELPHIBIN)
PackageDCPOutputDir=..\..\Lib\D7 PackageDCPOutputDir=$(DELPHILIB)
SearchPath= SearchPath=
Packages=vcl;rtl;vclx;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;CLXIB;ibxpress;VCLIB;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;dclOfficeXP;Indy70;cxLibraryVCLD7;dxBarD7;dxComnD7;dxBarDBNavD7;dxBarExtDBItemsD7;dxBarExtItemsD7;dxDockingD7;dxsbD7;cxEditorsVCLD7;dxThemeD7;cxDataD7;cxExtEditorsVCLD7;cxPageControlVCLD7;cxGridVCLD7;cxSchedulerVCLD7;dxMasterViewD7;dxmdsD7;dxPSCoreD7;dxPSTeeChartD7;dxPsPrVwAdvD7;dxPSLnksD7;dxPSdxMVLnkD7;dxPSDBTeeChartD7;dxPScxCommonD7;dxPScxPCProdD7;dxPScxGridLnkD7;dxPScxExtCommonD7;dxPScxScheduler2LnkD7;wpViewPDF_D7;Rave50CLX;Rave50VCL;xtx_d7;IBSQLProperty;SamPackage;rbTCUI107;rbTC107;rbRCL107;rbIDE107;rbBDE107;rbUSERDesign107;rbUSER107;madBasic_;madDisAsm_;madExcept_;unageneral_d7 Packages=vcl;rtl;vclx;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;CLXIB;ibxpress;VCLIB;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;dclOfficeXP;Indy70;cxLibraryVCLD7;dxBarD7;dxComnD7;dxBarDBNavD7;dxBarExtDBItemsD7;dxBarExtItemsD7;dxDockingD7;dxsbD7;cxEditorsVCLD7;dxThemeD7;cxDataD7;cxExtEditorsVCLD7;cxPageControlVCLD7;cxGridVCLD7;cxSchedulerVCLD7;dxMasterViewD7;dxmdsD7;dxPSCoreD7;dxPSTeeChartD7;dxPsPrVwAdvD7;dxPSLnksD7;dxPSdxMVLnkD7;dxPSDBTeeChartD7;dxPScxCommonD7;dxPScxPCProdD7;dxPScxGridLnkD7;dxPScxExtCommonD7;dxPScxScheduler2LnkD7;wpViewPDF_D7;Rave50CLX;Rave50VCL;xtx_d7;IBSQLProperty;SamPackage;rbTCUI107;rbTC107;rbRCL107;rbIDE107;rbBDE107;rbUSERDesign107;rbUSER107;madBasic_;madDisAsm_;madExcept_;unageneral_d7
Conditionals= Conditionals=
@ -143,14 +143,17 @@ Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
Count=1 Count=1
Item0=P:\Algemeen\Indy10;P:\Algemeen\Indy10\Core;P:\Algemeen\Indy10\Protocols;P:\Algemeen\Indy10\SuperCore;P:\Algemeen\Indy10\System Item0=P:\Algemeen\Indy10;P:\Algemeen\Indy10\Core;P:\Algemeen\Indy10\Protocols;P:\Algemeen\Indy10\SuperCore;P:\Algemeen\Indy10\System
[HistoryLists\hlUnitOutputDirectory] [HistoryLists\hlUnitOutputDirectory]
Count=3 Count=4
Item0=..\..\Lib\D7 Item0=$(DELPHILIB)
Item1=..\Lib\D7 Item1=..\..\Lib\D7
Item2=Lib\D7 Item2=..\Lib\D7
Item3=Lib\D7
[HistoryLists\hlBPLOutput] [HistoryLists\hlBPLOutput]
Count=2 Count=3
Item0=..\..\Lib\D7 Item0=$(DELPHIBIN)
Item1=Lib\D7 Item1=..\..\Lib\D7
Item2=Lib\D7
[HistoryLists\hlDCPOutput] [HistoryLists\hlDCPOutput]
Count=1 Count=2
Item0=..\..\Lib\D7 Item0=$(DELPHILIB)
Item1=..\..\Lib\D7

View File

@ -38,7 +38,8 @@ contains
X2CLGraphics in '..\..\Source\X2CLGraphics.pas', X2CLGraphics in '..\..\Source\X2CLGraphics.pas',
X2CLMenuBarAnimators in '..\..\Source\X2CLMenuBarAnimators.pas', X2CLMenuBarAnimators in '..\..\Source\X2CLMenuBarAnimators.pas',
X2CLMenuBar in '..\..\Source\X2CLMenuBar.pas', X2CLMenuBar in '..\..\Source\X2CLMenuBar.pas',
X2CLmusikCubeMenuBarPainter in '..\..\Source\X2CLmusikCubeMenuBarPainter.pas'; X2CLmusikCubeMenuBarPainter in '..\..\Source\X2CLmusikCubeMenuBarPainter.pas',
X2CLMenuBarActions in '..\..\Source\X2CLMenuBarActions.pas';
end. end.

View File

@ -119,10 +119,14 @@ object GraphicsEditorForm: TGraphicsEditorForm
Top = 26 Top = 26
Width = 189 Width = 189
Height = 398 Height = 398
Style = lbVirtual
Align = alClient Align = alClient
ItemHeight = 13 ItemHeight = 13
TabOrder = 1 TabOrder = 1
OnClick = lstGraphicsClick OnClick = lstGraphicsClick
OnData = lstGraphicsData
OnDataFind = lstGraphicsDataFind
OnKeyPress = lstGraphicsKeyPress
end end
object tbGraphics: TToolBar object tbGraphics: TToolBar
Left = 0 Left = 0

View File

@ -67,6 +67,11 @@ type
procedure actOpenExecute(Sender: TObject); procedure actOpenExecute(Sender: TObject);
procedure actSaveExecute(Sender: TObject); procedure actSaveExecute(Sender: TObject);
procedure actClearExecute(Sender: TObject); procedure actClearExecute(Sender: TObject);
procedure lstGraphicsData(Control: TWinControl; Index: Integer;
var Data: String);
function lstGraphicsDataFind(Control: TWinControl;
FindString: String): Integer;
procedure lstGraphicsKeyPress(Sender: TObject; var Key: Char);
private private
FComponent: TX2GraphicContainer; FComponent: TX2GraphicContainer;
FComponentDesigner: IDesigner; FComponentDesigner: IDesigner;
@ -74,7 +79,7 @@ type
procedure InternalExecute(const AComponent: TComponent; const ADesigner: IDesigner); procedure InternalExecute(const AComponent: TComponent; const ADesigner: IDesigner);
procedure LoadGraphic(AIndex: Integer; AGraphic: TX2GraphicContainerItem; const AFileName: string); procedure LoadGraphic(AGraphic: TX2GraphicContainerItem; const AFileName: string);
procedure ItemChanged(AUpdatePreview: Boolean = True); procedure ItemChanged(AUpdatePreview: Boolean = True);
procedure UpdateUI(); procedure UpdateUI();
@ -90,7 +95,8 @@ type
implementation implementation
uses uses
Graphics, Graphics,
SysUtils; SysUtils,
Windows;
var var
@ -110,9 +116,6 @@ begin
end; end;
procedure TGraphicsEditorForm.InternalExecute(const AComponent: TComponent; const ADesigner: IDesigner); procedure TGraphicsEditorForm.InternalExecute(const AComponent: TComponent; const ADesigner: IDesigner);
var
graphicIndex: Integer;
begin begin
FComponent := TX2GraphicContainer(AComponent); FComponent := TX2GraphicContainer(AComponent);
FComponent.FreeNotification(Self); FComponent.FreeNotification(Self);
@ -120,22 +123,8 @@ begin
FComponentDesigner := ADesigner; FComponentDesigner := ADesigner;
Caption := Format('%s Graphics', [FComponent.Name]); Caption := Format('%s Graphics', [FComponent.Name]);
// Fill graphics list lstGraphics.Count := FComponent.GraphicCount;
with lstGraphics.Items do lstGraphics.ItemIndex := 0;
begin
BeginUpdate();
try
Clear();
for graphicIndex := 0 to FComponent.GraphicCount - 1 do
AddObject(FComponent.Graphics[graphicIndex].PictureName,
FComponent.Graphics[graphicIndex]);
finally
EndUpdate();
end;
lstGraphics.ItemIndex := 0;
end;
UpdateUI(); UpdateUI();
UpdatePreview(); UpdatePreview();
@ -155,13 +144,13 @@ begin
end; end;
procedure TGraphicsEditorForm.LoadGraphic(AIndex: Integer; AGraphic: TX2GraphicContainerItem; const AFileName: string); procedure TGraphicsEditorForm.LoadGraphic(AGraphic: TX2GraphicContainerItem; const AFileName: string);
begin begin
AGraphic.Picture.LoadFromFile(AFileName); AGraphic.Picture.LoadFromFile(AFileName);
if Length(AGraphic.PictureName) = 0 then if Length(AGraphic.PictureName) = 0 then
begin begin
AGraphic.PictureName := ChangeFileExt(ExtractFileName(AFileName), ''); AGraphic.PictureName := ChangeFileExt(ExtractFileName(AFileName), '');
lstGraphics.Items[AIndex] := AGraphic.PictureName; lstGraphics.Invalidate;
end; end;
end; end;
@ -169,12 +158,12 @@ end;
procedure TGraphicsEditorForm.ItemChanged(AUpdatePreview: Boolean); procedure TGraphicsEditorForm.ItemChanged(AUpdatePreview: Boolean);
begin begin
if Assigned(FComponentDesigner) then if Assigned(FComponentDesigner) then
FComponentDesigner.Modified(); FComponentDesigner.Modified;
UpdateUI(); UpdateUI();
if AUpdatePreview then if AUpdatePreview then
UpdatePreview(); UpdatePreview;
end; end;
@ -198,7 +187,7 @@ begin
actClear.Enabled := enabled; actClear.Enabled := enabled;
actUp.Enabled := enabled and (index > 0); actUp.Enabled := enabled and (index > 0);
actDown.Enabled := enabled and (index < Pred(lstGraphics.Items.Count)); actDown.Enabled := enabled and (index < Pred(FComponent.GraphicCount));
end; end;
@ -213,8 +202,8 @@ begin
if Active(index, graphic) then if Active(index, graphic) then
begin begin
imgPreview.Picture.Assign(graphic.Picture); imgPreview.Picture.Assign(graphic.Picture);
txtName.Text := graphic.PictureName; txtName.Text := graphic.PictureName;
lstGraphics.Items[index] := graphic.PictureName; lstGraphics.Invalidate;
end else end else
begin begin
imgPreview.Picture.Assign(nil); imgPreview.Picture.Assign(nil);
@ -234,7 +223,7 @@ begin
if AIndex = -1 then if AIndex = -1 then
exit; exit;
AGraphic := TX2GraphicContainerItem(lstGraphics.Items.Objects[AIndex]); AGraphic := FComponent.Graphics[AIndex];
Result := Assigned(AGraphic); Result := Assigned(AGraphic);
end; end;
@ -257,8 +246,8 @@ begin
if Active(index, graphic) then if Active(index, graphic) then
begin begin
graphic.PictureName := txtName.Text; graphic.PictureName := txtName.Text;
lstGraphics.Items[index] := graphic.PictureName; lstGraphics.Invalidate;
ItemChanged(False); ItemChanged(False);
end; end;
@ -267,7 +256,6 @@ end;
procedure TGraphicsEditorForm.actAddExecute(Sender: TObject); procedure TGraphicsEditorForm.actAddExecute(Sender: TObject);
var var
index: Integer;
graphic: TX2GraphicContainerItem; graphic: TX2GraphicContainerItem;
fileIndex: Integer; fileIndex: Integer;
@ -285,11 +273,10 @@ begin
if Assigned(graphic) then if Assigned(graphic) then
begin begin
graphic.Container := FComponent; graphic.Container := FComponent;
index := lstGraphics.Items.AddObject('', graphic); lstGraphics.Count := FComponent.GraphicCount;
lstGraphics.ItemIndex := index;
LoadGraphic(index, graphic, dlgOpen.Files[fileIndex]); LoadGraphic(graphic, dlgOpen.Files[fileIndex]);
end else end else
raise Exception.Create('Failed to create TX2GraphicContainerItem!'); raise Exception.Create('Failed to create TX2GraphicContainerItem!');
end; end;
@ -313,10 +300,10 @@ begin
if it's not allowed, for example due to it being introduced in if it's not allowed, for example due to it being introduced in
an ancestor. } an ancestor. }
graphic.Free(); graphic.Free();
lstGraphics.Items.Delete(index); lstGraphics.Count := FComponent.GraphicCount;
if index > Pred(lstGraphics.Items.Count) then if index > Pred(FComponent.GraphicCount) then
index := Pred(lstGraphics.Items.Count); index := Pred(FComponent.GraphicCount);
lstGraphics.ItemIndex := index; lstGraphics.ItemIndex := index;
@ -334,9 +321,9 @@ begin
if Active(index, graphic) then if Active(index, graphic) then
if index > 0 then if index > 0 then
begin begin
lstGraphics.Items.Move(index, Pred(index));
graphic.Index := Pred(index); graphic.Index := Pred(index);
lstGraphics.ItemIndex := Pred(index); lstGraphics.ItemIndex := Pred(index);
lstGraphics.Invalidate;
ItemChanged(False); ItemChanged(False);
end; end;
@ -350,11 +337,11 @@ var
begin begin
if Active(index, graphic) then if Active(index, graphic) then
if index < Pred(lstGraphics.Items.Count) then if index < Pred(FComponent.GraphicCount) then
begin begin
lstGraphics.Items.Move(index, index + 1);
graphic.Index := Succ(index); graphic.Index := Succ(index);
lstGraphics.ItemIndex := Succ(index); lstGraphics.ItemIndex := Succ(index);
lstGraphics.Invalidate;
ItemChanged(False); ItemChanged(False);
end; end;
@ -374,7 +361,7 @@ begin
if dlgOpen.Execute() then if dlgOpen.Execute() then
begin begin
LoadGraphic(index, graphic, dlgOpen.FileName); LoadGraphic(graphic, dlgOpen.FileName);
ItemChanged(); ItemChanged();
end; end;
end; end;
@ -423,4 +410,34 @@ begin
end; end;
end; end;
procedure TGraphicsEditorForm.lstGraphicsData(Control: TWinControl; Index: Integer; var Data: String);
begin
Data := Format('%d - %s', [Index, FComponent.Graphics[Index].PictureName]);
end;
function TGraphicsEditorForm.lstGraphicsDataFind(Control: TWinControl; FindString: String): Integer;
var
graphicIndex: Integer;
begin
Result := -1;
for graphicIndex := 0 to Pred(FComponent.GraphicCount) do
if SameText(Copy(FComponent.Graphics[graphicIndex].PictureName, 1, Length(FindString)), FindString) then
begin
Result := graphicIndex;
Break;
end;
end;
procedure TGraphicsEditorForm.lstGraphicsKeyPress(Sender: TObject; var Key: Char);
begin
{ Because the listbox is virtual, Return causes the ItemIndex to reset to 0 }
if Ord(Key) = VK_RETURN then
Key := #0;
end;
end. end.

View File

@ -10,6 +10,7 @@ unit X2CLMBEditors;
interface interface
uses uses
DesignEditors; DesignEditors;
type type
TX2MenuBarComponentEditor = class(TComponentEditor) TX2MenuBarComponentEditor = class(TComponentEditor)
@ -20,12 +21,14 @@ type
function GetVerbCount(): Integer; override; function GetVerbCount(): Integer; override;
end; end;
implementation implementation
uses uses
X2CLMenuBar, X2CLMenuBar,
X2CLMenuBarEditor; X2CLMenuBarEditor;
{ TX2MenuBarComponentEditor } { TX2MenuBarComponentEditor }
procedure TX2MenuBarComponentEditor.Edit(); procedure TX2MenuBarComponentEditor.Edit();
begin begin
@ -33,16 +36,19 @@ begin
TfrmMenuBarEditor.Execute(TX2CustomMenuBar(Component), Designer); TfrmMenuBarEditor.Execute(TX2CustomMenuBar(Component), Designer);
end; end;
procedure TX2MenuBarComponentEditor.ExecuteVerb(Index: Integer); procedure TX2MenuBarComponentEditor.ExecuteVerb(Index: Integer);
begin begin
Edit(); Edit();
end; end;
function TX2MenuBarComponentEditor.GetVerb(Index: Integer): string; function TX2MenuBarComponentEditor.GetVerb(Index: Integer): string;
begin begin
Result := 'Edit...'; Result := 'Edit...';
end; end;
function TX2MenuBarComponentEditor.GetVerbCount(): Integer; function TX2MenuBarComponentEditor.GetVerbCount(): Integer;
begin begin
Result := 1; Result := 1;

View File

@ -1,10 +1,10 @@
object frmMenuBarEditor: TfrmMenuBarEditor object frmMenuBarEditor: TfrmMenuBarEditor
Left = 0 Left = 271
Top = 0 Top = 101
Width = 394
Height = 469
BorderIcons = [biSystemMenu] BorderIcons = [biSystemMenu]
Caption = 'Editing' Caption = 'Editing'
ClientHeight = 376
ClientWidth = 276
Color = clBtnFace Color = clBtnFace
Font.Charset = DEFAULT_CHARSET Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText Font.Color = clWindowText
@ -22,20 +22,21 @@ object frmMenuBarEditor: TfrmMenuBarEditor
TextHeight = 13 TextHeight = 13
object tvMenu: TTreeView object tvMenu: TTreeView
Left = 0 Left = 0
Top = 26 Top = 28
Width = 276 Width = 386
Height = 331 Height = 395
Align = alClient Align = alClient
HideSelection = False HideSelection = False
Indent = 19 Indent = 19
ReadOnly = True ReadOnly = True
TabOrder = 0 TabOrder = 0
OnChange = tvMenuChange OnChange = tvMenuChange
OnKeyPress = tvMenuKeyPress
end end
object sbStatus: TStatusBar object sbStatus: TStatusBar
Left = 0 Left = 0
Top = 357 Top = 423
Width = 276 Width = 386
Height = 19 Height = 19
Panels = < Panels = <
item item
@ -45,40 +46,307 @@ object frmMenuBarEditor: TfrmMenuBarEditor
object tbMenu: TToolBar object tbMenu: TToolBar
Left = 0 Left = 0
Top = 0 Top = 0
Width = 276 Width = 386
Height = 26 Height = 28
AutoSize = True AutoSize = True
ButtonWidth = 84
EdgeBorders = [ebTop, ebBottom] EdgeBorders = [ebTop, ebBottom]
Images = ilsActions Images = ilsActions
List = True
ShowCaptions = True
TabOrder = 2 TabOrder = 2
object tbAddGroup: TToolButton object tbAddGroup: TToolButton
Left = 0 Left = 0
Top = 0 Top = 2
Action = actAddGroup Action = actAddGroup
AutoSize = True
end end
object tbAddItem: TToolButton object tbAddItem: TToolButton
Left = 81 Left = 23
Top = 0 Top = 2
Action = actAddItem Action = actAddItem
AutoSize = True
end end
object tbDelete: TToolButton object tbDelete: TToolButton
Left = 154 Left = 46
Top = 0 Top = 2
Action = actDelete Action = actDelete
AutoSize = True end
object tbSep1: TToolButton
Left = 69
Top = 2
Width = 8
ImageIndex = 3
Style = tbsSeparator
end
object tbMoveUp: TToolButton
Left = 77
Top = 2
Action = actMoveUp
end
object tbMoveDown: TToolButton
Left = 100
Top = 2
Action = actMoveDown
end end
end end
object ilsActions: TImageList object ilsActions: TImageList
Left = 8 Left = 24
Top = 32 Top = 44
Bitmap = { Bitmap = {
494C010103000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 494C010105000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000400000001000000001002000000000000010 0000000000003600000028000000400000003000000001002000000000000030
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000069AC69005EAB5E0000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000022AD350028B13E0071AF7100000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000020B7300069FFA30056D588001AA22700000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000001EAC240067FFA2005BF6900057F48D004CCB7E00169C1F000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00001DA1210063FF9C005AF5900055EF890052ED860051EC860045C576001795
1C00000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000028A0
2B0068FFA20079FFA9006AF39A0051EB850050EA83004CE781004EEA860043C4
7500219426000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000228D23001093
1A001C97260049CA63008BF8B1004BE87F004DE7800049DD7D0028A946000D87
18000B8714001C831D0000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000199B270086F8B00047E57C0049E47D004ADF7F00128A1F000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000001A9B290083F6AE0044E2790046E17A0047DE7C00138A21000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000001A9929007FF3A90041DF760043DD770044DC7B00138921000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000001996260076F0A3003CDC71003FDA730041D97600118720000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000001997280097FCC2006BEC9B005BE98F004BE28400128923000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000077B0B0010881D000D8318001081180014851F0009750D000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
@ -102,7 +370,7 @@ object frmMenuBarEditor: TfrmMenuBarEditor
770000750000BDA99D000000000000000000000000004E4EAB001844F600194D 770000750000BDA99D000000000000000000000000004E4EAB001844F600194D
F8001031D2002427AE000000000000000000000000004E4EAB000928D700092E F8001031D2002427AE000000000000000000000000004E4EAB000928D700092E
D7000313B3004E4EAB0000000000000000000000000000000000000000000000 D7000313B3004E4EAB0000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000A7B0E00128A1E000F8018000E791600117919000E7510000000
0000000000000000000000000000000000000000000000000000689BAF001989 0000000000000000000000000000000000000000000000000000689BAF001989
B700007EB10090EFFF0030E0FF007AEEFF0000860000008600000086000048E1 B700007EB10090EFFF0030E0FF007AEEFF0000860000008600000086000048E1
7B00007500000075000000750000000000000000000000000000A27F6F00FFFF 7B00007500000075000000750000000000000000000000000000A27F6F00FFFF
@ -110,7 +378,7 @@ object frmMenuBarEditor: TfrmMenuBarEditor
7B0000750000007500000075000000000000000000002022B1002451F9001F51 7B0000750000007500000075000000000000000000002022B1002451F9001F51
FF00194DF8001744E8001017AF00000000004545AD00092ED7001142F9000D3D FF00194DF8001744E8001017AF00000000004545AD00092ED7001142F9000D3D
F5000D3DF500041ABC006F6FAA00000000000000000000000000000000000000 F5000D3DF500041ABC006F6FAA00000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 00000000000025A93C0069F59E0044E47E0045E57F0045E17F00189230000000
00000000000000000000000000000000000000000000000000003B92B4003B9F 00000000000000000000000000000000000000000000000000003B92B4003B9F
C600007EB1009FF1FF0046E2FF0090EFFF00008D00005EF791005AF38D0053EC C600007EB1009FF1FF0046E2FF0090EFFF00008D00005EF791005AF38D0053EC
860048E17B0045DE780000750000000000000000000000000000A3807000FFFF 860048E17B0045DE780000750000000000000000000000000000A3807000FFFF
@ -118,7 +386,7 @@ object frmMenuBarEditor: TfrmMenuBarEditor
860048E17B0045DE7800007500000000000000000000000000001832DB00285A 860048E17B0045DE7800007500000000000000000000000000001832DB00285A
FF002451F9002451F9001A4AF100060EAF000F30DD00164AFE001142F9001041 FF002451F9002451F9001A4AF100060EAF000F30DD00164AFE001142F9001041
F6000D3DF5000D3DF5002C2CA200000000000000000000000000000000000000 F6000D3DF5000D3DF5002C2CA200000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 00000000000022A7370077EFA40040DC750041DB740042DB7900188D2B000000
0000000000000000000000000000000000000000000074A0B1000E84B700B6F5 0000000000000000000000000000000000000000000074A0B1000E84B700B6F5
FB000081B400B6F5FB005EECFF00A3F3FF0000910000008D0000008D00005AF3 FB000081B400B6F5FB005EECFF00A3F3FF0000910000008D0000008D00005AF3
8D0000860000007D0000007D0000000000000000000000000000A9877800FFFF 8D0000860000007D0000007D0000000000000000000000000000A9877800FFFF
@ -126,7 +394,7 @@ object frmMenuBarEditor: TfrmMenuBarEditor
8D0000860000007D0000007D000000000000000000007777B3001832DB004170 8D0000860000007D0000007D000000000000000000007777B3001832DB004170
FF002D5DFF00285AFF00285AFF001F51FF00194DF800194DF8001142F9001142 FF002D5DFF00285AFF00285AFF001F51FF00194DF800194DF8001142F9001142
F9000F3DF200161CAC0000000000000000000000000000000000000000000000 F9000F3DF200161CAC0000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 00000000000025AC3A007DF3A90042DF770043DE770045DE7C0018902B000000
000000000000000000000000000000000000000000004596B40044A5C900DDFF 000000000000000000000000000000000000000000004596B40044A5C900DDFF
FF000084B700C0FBFF0077F4FF00B6F5FB00ADF6FF00ADF6FF00008D00005EF7 FF000084B700C0FBFF0077F4FF00B6F5FB00ADF6FF00ADF6FF00008D00005EF7
910000860000C3F1F80061A8C700000000000000000000000000AB897A00FFFF 910000860000C3F1F80061A8C700000000000000000000000000AB897A00FFFF
@ -134,7 +402,7 @@ object frmMenuBarEditor: TfrmMenuBarEditor
910000860000C8B7AE00000000000000000000000000000000006969B8001A25 910000860000C8B7AE00000000000000000000000000000000006969B8001A25
C5003A6DFF003668FF00285AFF00285AFF002451F900194DF8001F51FF00123D C5003A6DFF003668FF00285AFF00285AFF002451F900194DF8001F51FF00123D
ED002427AE000000000000000000000000000000000000000000000000000000 ED002427AE000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 00000000000026AF3C0085F6AE0044E2790046E0790048E17E001B942E000000
000000000000000000000000000000000000000000002790B800ABDCEA00E6FE 000000000000000000000000000000000000000000002790B800ABDCEA00E6FE
FE000084B700D2FFFF008EFDFF0089FAFF0082F6FF00B0F7FF00009100000091 FE000084B700D2FFFF008EFDFF0089FAFF0082F6FF00B0F7FF00009100000091
0000008D0000C1FDFF000072A500000000000000000000000000AB897A00FFFF 0000008D0000C1FDFF000072A500000000000000000000000000AB897A00FFFF
@ -142,39 +410,39 @@ object frmMenuBarEditor: TfrmMenuBarEditor
0000008D0000BFABA10000000000000000000000000000000000000000000000 0000008D0000BFABA10000000000000000000000000000000000000000000000
00002F2FB3002E4EE7003668FF00285AFF00285AFF002451F900123DED002C2C 00002F2FB3002E4EE7003668FF00285AFF00285AFF002451F900123DED002C2C
A200000000000000000000000000000000000000000000000000000000000000 A200000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 00000000000028B03A008CF8B50048E57C0049E37D004AE2810019932B000000
000000000000000000000000000000000000000000000A8CBC00C9F6FA00F1FF 000000000000000000000000000000000000000000000A8CBC00C9F6FA00F1FF
FF000088BB00DDFFFF00A1FFFF00A1FFFF0094F8FF00C0FBFF00C0FBFF00B0F7 FF000088BB00DDFFFF00A1FFFF00A1FFFF0094F8FF00C0FBFF00C0FBFF00B0F7
FF00C3EDF500DDFFFF000072A500000000000000000000000000B1908000FFFF FF00C3EDF500DDFFFF000072A500000000000000000000000000B1908000FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FCF8F100FFFFFF00FCF8F100FFFFFF00FCF8 FF00FFFFFF00FFFFFF00FFFFFF00FCF8F100FFFFFF00FCF8F100FFFFFF00FCF8
F100FCF6ED009B7C6B0000000000000000000000000000000000000000000000 F100FCF6ED009B7C6B0000000000000000000000000000000000000000000000
000000000000253FDF003A6DFF003668FF002D5DFF00285AFF001B46EA002427 000000000000253FDF003A6DFF003668FF002D5DFF00285AFF001B46EA002427
AE00000000000000000000000000000000000000000000000000000000000000 AE000000000000000000000000000000000000000000000000003397330015A7
0000000000000000000000000000000000000000000000000000000000000000 23001BB02E0035C9550063F3960050EA83004DE780004BE27F00249A3D001293
00000000000000000000000000000000000000000000018DC0000F92C1007EC4 210011981E002B8C2B00000000000000000000000000018DC0000F92C1007EC4
DD000088BB00C3EDF5007ADBEA0085E3EF0092F0F800A1FFFF0094F8FF0065D2 DD000088BB00C3EDF5007ADBEA0085E3EF0092F0F800A1FFFF0094F8FF0065D2
E700ADF6FF00DDFFFF000079AC00000000000000000000000000AF8F8000FFFF E700ADF6FF00DDFFFF000079AC00000000000000000000000000AF8F8000FFFF
FF00DFCDCB00DFCDCB00DBC6C200DECAC600DDC1B400DDC1B400DEBEAD00DEBE FF00DFCDCB00DFCDCB00DBC6C200DECAC600DDC1B400DDC1B400DEBEAD00DEBE
AD00FCF6ED009B7C6B0000000000000000000000000000000000000000000000 AD00FCF6ED009B7C6B0000000000000000000000000000000000000000000000
00002B2CC0004B7CFF004170FF003A6DFF003A6DFF00285AFF00285AFF001031 00002B2CC0004B7CFF004170FF003A6DFF003A6DFF00285AFF00285AFF001031
D2004A4AB2000000000000000000000000000000000000000000000000000000 D2004A4AB200000000000000000000000000000000000000000000000000279E
0000000000000000000000000000000000000000000000000000000000000000 2A009EFFC7007DFFAD0053F1890052EB850050E983004CE580004DE583004FEC
0000000000000000000000000000000000000000000000000000000000000000 8A00229628000000000000000000000000000000000000000000000000000000
0000018DC000F1FFFF00C3F1F800ABE7F10081D4E60065C6DF0065C6DF005FC2 0000018DC000F1FFFF00C3F1F800ABE7F10081D4E60065C6DF0065C6DF005FC2
DB00D2FFFF00E6FEFE000079AC00000000000000000000000000B1908000FFFF DB00D2FFFF00E6FEFE000079AC00000000000000000000000000B1908000FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FCF8F100FCF8F100F9F4 FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FCF8F100FCF8F100F9F4
EE00F0E8E0009C7D6D0000000000000000000000000000000000000000000000 EE00F0E8E0009C7D6D0000000000000000000000000000000000000000000000
0000253FDF00527CFA004170FF003668FF000C13C1003A6DFF00285AFF002451 0000253FDF00527CFA004170FF003668FF000C13C1003A6DFF00285AFF002451
F9000B1DC2000000000000000000000000000000000000000000000000000000 F9000B1DC2000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 00001AA11F00A0FFC50062F7960053EF880051EB840050EA860051ED8A001A99
0000000000000000000000000000000000000000000000000000000000000000 2000000000000000000000000000000000000000000000000000000000000000
00001A96C50031A5CD004AB0D30083CDE200D0EFF600E6FEFE00F1FFFF00E6FE 00001A96C50031A5CD004AB0D30083CDE200D0EFF600E6FEFE00F1FFFF00E6FE
FE00DDFFFF00F1FFFF000079AC00000000000000000000000000B1908000FFFF FE00DDFFFF00F1FFFF000079AC00000000000000000000000000B1908000FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A3807000A782 FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A3807000A782
7000A7827000A380700000000000000000000000000000000000000000004F4F 7000A7827000A380700000000000000000000000000000000000000000004F4F
BD00527CFA005080FF004B7CFF00181FC500000000001B22C4003A6DFF00285A BD00527CFA005080FF004B7CFF00181FC500000000001B22C4003A6DFF00285A
FF001A4AF1001419B10000000000000000000000000000000000000000000000 FF001A4AF1001419B10000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000001AA82200A4FFC9005CF3900053EF890059F5930019A624000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000589FBA003298BE002390BC00158FBF00FFFF 0000000000000000000000000000589FBA003298BE002390BC00158FBF00FFFF
FF00FFFFFF00FFFFFF00007EB100000000000000000000000000B8988800FFFF FF00FFFFFF00FFFFFF00007EB100000000000000000000000000B8988800FFFF
@ -182,7 +450,7 @@ object frmMenuBarEditor: TfrmMenuBarEditor
D900B1908000AB9E98000000000000000000000000000000000000000000252D D900B1908000AB9E98000000000000000000000000000000000000000000252D
D6006A9CFF005788FF002E4EE7007070B90000000000000000001621C7002D5D D6006A9CFF005788FF002E4EE7007070B90000000000000000001621C7002D5D
FF002451F9001439DD004545AD00000000000000000000000000000000000000 FF002451F9001439DD004545AD00000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000021B42D00A4FFCC0072FEA9001DB32C00000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000088BB00EDF6 00000000000000000000000000000000000000000000000000000088BB00EDF6
FA00FFFFFF00FFFFFF00007EB100000000000000000000000000B8988800FFFF FA00FFFFFF00FFFFFF00007EB100000000000000000000000000B8988800FFFF
@ -190,7 +458,7 @@ object frmMenuBarEditor: TfrmMenuBarEditor
7D00AB9E98000000000000000000000000000000000000000000000000004B4B 7D00AB9E98000000000000000000000000000000000000000000000000004B4B
C8003951E2005080FF002929C600000000000000000000000000000000001628 C8003951E2005080FF002929C600000000000000000000000000000000001628
D300285AFF000F2EE3002123B500000000000000000000000000000000000000 D300285AFF000F2EE3002123B500000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000035C84A0037CD500074AC7400000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000002F99C3000084 00000000000000000000000000000000000000000000000000002F99C3000084
B7000084B7000081B4004388A900000000000000000000000000B8988800B898 B7000084B7000081B4004388A900000000000000000000000000B8988800B898
@ -198,7 +466,7 @@ object frmMenuBarEditor: TfrmMenuBarEditor
9800000000000000000000000000000000000000000000000000000000000000 9800000000000000000000000000000000000000000000000000000000000000
0000000000003E3EB90000000000000000000000000000000000000000006B6B 0000000000003E3EB90000000000000000000000000000000000000000006B6B
B6002E2EB5000000000000000000000000000000000000000000000000000000 B6002E2EB5000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000006EAC6E0063AB630000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
@ -208,18 +476,26 @@ object frmMenuBarEditor: TfrmMenuBarEditor
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000424D3E000000000000003E000000 000000000000000000000000000000000000424D3E000000000000003E000000
2800000040000000100000000100010000000000800000000000000000000000 2800000040000000300000000100010000000000800100000000000000000000
000000000000000000000000FFFFFF00FFFFFFFFFFFF0000E1C7C003C7CF0000 000000000000000000000000FFFFFF0000000000000000000000000000000000
E007C00383830000C001C00181010000C001C001C00100008001C00180030000 0000000000000000000000000000000000000000000000000000000000000000
8001C003C00700008001C003F00F00008001C003F80F00008001C003F0070000 0000000000000000000000000000000000000000000000000000000000000000
F001C003F0070000F001C003E0830000FE01C003E0C10000FFC1C007E1E10000 0000000000000000000000000000000000000000000000000000000000000000
FFC1C00FFBE70000FFFFFFFFFFFF000000000000000000000000000000000000 00000000000000000000000000000000FFFF000000000000FE7F000000000000
FE3F000000000000FC3F000000000000F81F000000000000F00F000000000000
E007000000000000C003000000000000F81F000000000000F81F000000000000
F81F000000000000F81F000000000000F81F000000000000F81F000000000000
FFFF000000000000FFFF000000000000FFFFFFFFFFFFFFFFE1C7C003C7CFFFFF
E007C0038383F81FC001C0018101F81FC001C001C001F81F8001C0018003F81F
8001C003C007F81F8001C003F00FF81F8001C003F80FC0038001C003F007E007
F001C003F007F00FF001C003E083F81FFE01C003E0C1FC3FFFC1C007E1E1FE3F
FFC1C00FFBE7FE7FFFFFFFFFFFFFFFFF00000000000000000000000000000000
000000000000} 000000000000}
end end
object alMenu: TActionList object alMenu: TActionList
Images = ilsActions Images = ilsActions
Left = 36 Left = 80
Top = 32 Top = 44
object actAddGroup: TAction object actAddGroup: TAction
Caption = '&Add group' Caption = '&Add group'
ImageIndex = 0 ImageIndex = 0
@ -244,5 +520,17 @@ object frmMenuBarEditor: TfrmMenuBarEditor
'Ctrl+Del') 'Ctrl+Del')
OnExecute = actDeleteExecute OnExecute = actDeleteExecute
end end
object actMoveUp: TAction
Caption = 'Move &Up'
ImageIndex = 3
ShortCut = 16422
OnExecute = actMoveUpExecute
end
object actMoveDown: TAction
Caption = 'Move &Down'
ImageIndex = 4
ShortCut = 16424
OnExecute = actMoveDownExecute
end
end end
end end

View File

@ -7,17 +7,21 @@ uses
ComCtrls, ComCtrls,
Controls, Controls,
DesignIntf, DesignIntf,
DesignWindows,
Forms, Forms,
ImgList, ImgList,
ToolWin, ToolWin,
X2CLMenuBar; X2CLMenuBar;
type type
TfrmMenuBarEditor = class(TForm, IX2MenuBarDesigner) TfrmMenuBarEditor = class(TDesignWindow, IX2MenuBarDesigner)
actAddGroup: TAction; actAddGroup: TAction;
actAddItem: TAction; actAddItem: TAction;
actDelete: TAction; actDelete: TAction;
actMoveDown: TAction;
actMoveUp: TAction;
alMenu: TActionList; alMenu: TActionList;
ilsActions: TImageList; ilsActions: TImageList;
sbStatus: TStatusBar; sbStatus: TStatusBar;
@ -25,6 +29,9 @@ type
tbAddItem: TToolButton; tbAddItem: TToolButton;
tbDelete: TToolButton; tbDelete: TToolButton;
tbMenu: TToolBar; tbMenu: TToolBar;
tbMoveDown: TToolButton;
tbMoveUp: TToolButton;
tbSep1: TToolButton;
tvMenu: TTreeView; tvMenu: TTreeView;
procedure actDeleteExecute(Sender: TObject); procedure actDeleteExecute(Sender: TObject);
@ -36,10 +43,13 @@ type
procedure FormDestroy(Sender: TObject); procedure FormDestroy(Sender: TObject);
procedure tvMenuChange(Sender: TObject; Node: TTreeNode); procedure tvMenuChange(Sender: TObject; Node: TTreeNode);
procedure FormActivate(Sender: TObject); procedure FormActivate(Sender: TObject);
procedure actMoveUpExecute(Sender: TObject);
procedure actMoveDownExecute(Sender: TObject);
procedure tvMenuKeyPress(Sender: TObject; var Key: Char);
private private
FDesigner: IDesigner;
FMenuBar: TX2CustomMenuBar; FMenuBar: TX2CustomMenuBar;
FDesignerAttached: Boolean; FDesignerAttached: Boolean;
FMoving: Boolean;
procedure SetMenuBar(const Value: TX2CustomMenuBar); procedure SetMenuBar(const Value: TX2CustomMenuBar);
@ -48,6 +58,7 @@ type
function GetSelectedItem(): TX2CustomMenuBarItem; function GetSelectedItem(): TX2CustomMenuBarItem;
function GetItemNode(AItem: TX2CustomMenuBarItem): TTreeNode; function GetItemNode(AItem: TX2CustomMenuBarItem): TTreeNode;
procedure MoveSelectedItem(ADown: Boolean);
protected protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure ItemAdded(AItem: TX2CustomMenuBarItem); procedure ItemAdded(AItem: TX2CustomMenuBarItem);
@ -62,26 +73,29 @@ type
procedure UpdateUI(); procedure UpdateUI();
procedure Modified(); procedure Modified();
property Designer: IDesigner read FDesigner write FDesigner;
property MenuBar: TX2CustomMenuBar read FMenuBar write SetMenuBar; property MenuBar: TX2CustomMenuBar read FMenuBar write SetMenuBar;
public public
class procedure Execute(AMenuBar: TX2CustomMenuBar; ADesigner: IDesigner); class procedure Execute(AMenuBar: TX2CustomMenuBar; ADesigner: IDesigner);
end; end;
implementation implementation
uses uses
Contnrs, Contnrs,
SysUtils; SysUtils, Dialogs;
var var
GEditors: TObjectBucketList; GEditors: TObjectBucketList;
type type
TProtectedX2CustomMenuBar = class(TX2CustomMenuBar); TProtectedX2CustomMenuBar = class(TX2CustomMenuBar);
{$R *.dfm} {$R *.dfm}
{ TfrmMenuBarEditor } { TfrmMenuBarEditor }
class procedure TfrmMenuBarEditor.Execute(AMenuBar: TX2CustomMenuBar; ADesigner: IDesigner); class procedure TfrmMenuBarEditor.Execute(AMenuBar: TX2CustomMenuBar; ADesigner: IDesigner);
var var
@ -106,6 +120,7 @@ begin
editorForm.Show(); editorForm.Show();
end; end;
procedure TfrmMenuBarEditor.FormCreate(Sender: TObject); procedure TfrmMenuBarEditor.FormCreate(Sender: TObject);
begin begin
{$IFDEF VER180} {$IFDEF VER180}
@ -117,6 +132,7 @@ begin
{$ENDIF} {$ENDIF}
end; end;
procedure TfrmMenuBarEditor.FormActivate(Sender: TObject); procedure TfrmMenuBarEditor.FormActivate(Sender: TObject);
var var
item: TX2CustomMenuBarItem; item: TX2CustomMenuBarItem;
@ -133,6 +149,7 @@ begin
UpdateUI(); UpdateUI();
end; end;
procedure TfrmMenuBarEditor.FormClose(Sender: TObject; var Action: TCloseAction); procedure TfrmMenuBarEditor.FormClose(Sender: TObject; var Action: TCloseAction);
begin begin
if Assigned(Designer) and Assigned(MenuBar) then if Assigned(Designer) and Assigned(MenuBar) then
@ -141,6 +158,7 @@ begin
Action := caFree; Action := caFree;
end; end;
procedure TfrmMenuBarEditor.FormDestroy(Sender: TObject); procedure TfrmMenuBarEditor.FormDestroy(Sender: TObject);
begin begin
if Assigned(MenuBar) then if Assigned(MenuBar) then
@ -170,6 +188,12 @@ begin
end; end;
procedure TfrmMenuBarEditor.tvMenuKeyPress(Sender: TObject; var Key: Char);
begin
ActivateInspector(Key);
end;
procedure TfrmMenuBarEditor.RefreshMenu(); procedure TfrmMenuBarEditor.RefreshMenu();
var var
groupIndex: Integer; groupIndex: Integer;
@ -195,11 +219,12 @@ begin
Modified(); Modified();
end; end;
procedure TfrmMenuBarEditor.actAddItemExecute(Sender: TObject); procedure TfrmMenuBarEditor.actAddItemExecute(Sender: TObject);
var var
menuItem: TX2CustomMenuBarItem; menuItem: TX2CustomMenuBarItem;
group: TX2MenuBarGroup; group: TX2MenuBarGroup;
begin begin
menuItem := GetSelectedItem(); menuItem := GetSelectedItem();
if Assigned(menuItem) then if Assigned(menuItem) then
@ -222,6 +247,7 @@ begin
end; end;
end; end;
procedure TfrmMenuBarEditor.actDeleteExecute(Sender: TObject); procedure TfrmMenuBarEditor.actDeleteExecute(Sender: TObject);
var var
menuItem: TX2CustomMenuBarItem; menuItem: TX2CustomMenuBarItem;
@ -236,6 +262,18 @@ begin
end; end;
procedure TfrmMenuBarEditor.actMoveUpExecute(Sender: TObject);
begin
MoveSelectedItem(False);
end;
procedure TfrmMenuBarEditor.actMoveDownExecute(Sender: TObject);
begin
MoveSelectedItem(True);
end;
function TfrmMenuBarEditor.AddGroup(AGroup: TX2MenuBarGroup): TTreeNode; function TfrmMenuBarEditor.AddGroup(AGroup: TX2MenuBarGroup): TTreeNode;
var var
itemIndex: Integer; itemIndex: Integer;
@ -252,8 +290,8 @@ begin
{ Make sure the group is inserted in the correct position by searching { Make sure the group is inserted in the correct position by searching
for it's sibling group. Note: do NOT use Items[x] in a loop; TTreeView for it's sibling group. Note: do NOT use Items[x] in a loop; TTreeView
emulates this by using GetFirst/GetNext. } emulates this by using GetFirst/GetNext. }
if AGroup.Index > 0 then if AGroup.Index < Pred(AGroup.Collection.Count) then
siblingGroup := TX2MenuBarGroup(AGroup.Collection.Items[Pred(AGroup.Index)]); siblingGroup := TX2MenuBarGroup(AGroup.Collection.Items[Succ(AGroup.Index)]);
if Assigned(siblingGroup) then if Assigned(siblingGroup) then
begin begin
@ -268,9 +306,9 @@ begin
end; end;
if Assigned(siblingNode) then if Assigned(siblingNode) then
groupNode := tvMenu.Items.Add(siblingNode, '') groupNode := tvMenu.Items.AddNode(nil, siblingNode, '', nil, naInsert)
else else
groupNode := tvMenu.Items.AddFirst(nil, ''); groupNode := tvMenu.Items.Add(nil, '');
groupNode.Data := AGroup; groupNode.Data := AGroup;
UpdateNode(groupNode); UpdateNode(groupNode);
@ -286,6 +324,7 @@ begin
end; end;
end; end;
function TfrmMenuBarEditor.AddItem(ANode: TTreeNode; AItem: TX2MenuBarItem): TTreeNode; function TfrmMenuBarEditor.AddItem(ANode: TTreeNode; AItem: TX2MenuBarItem): TTreeNode;
var var
siblingItem: TX2MenuBarItem; siblingItem: TX2MenuBarItem;
@ -299,8 +338,8 @@ begin
siblingNode := nil; siblingNode := nil;
{ See AddGroup } { See AddGroup }
if AItem.Index > 0 then if AItem.Index < Pred(AItem.Collection.Count) then
siblingItem := TX2MenuBarItem(AItem.Collection.Items[Pred(AItem.Index)]); siblingItem := TX2MenuBarItem(AItem.Collection.Items[Succ(AItem.Index)]);
if Assigned(siblingItem) then if Assigned(siblingItem) then
begin begin
@ -315,9 +354,9 @@ begin
end; end;
if Assigned(siblingNode) then if Assigned(siblingNode) then
itemNode := tvMenu.Items.Add(siblingNode, '') itemNode := tvMenu.Items.AddNode(nil, siblingNode, '', nil, naInsert)
else else
itemNode := tvMenu.Items.AddChildFirst(ANode, ''); itemNode := tvMenu.Items.AddChild(ANode, '');
itemNode.Data := AItem; itemNode.Data := AItem;
UpdateNode(itemNode); UpdateNode(itemNode);
@ -328,6 +367,7 @@ begin
end; end;
end; end;
procedure TfrmMenuBarEditor.UpdateNode(ANode: TTreeNode); procedure TfrmMenuBarEditor.UpdateNode(ANode: TTreeNode);
var var
menuItem: TX2CustomMenuBarItem; menuItem: TX2CustomMenuBarItem;
@ -339,22 +379,56 @@ begin
ANode.SelectedIndex := ANode.ImageIndex; ANode.SelectedIndex := ANode.ImageIndex;
end; end;
procedure TfrmMenuBarEditor.UpdateUI(); procedure TfrmMenuBarEditor.UpdateUI();
var var
canMoveDown: Boolean;
canMoveUp: Boolean;
itemSelected: Boolean; itemSelected: Boolean;
menuItem: TX2CustomMenuBarItem;
group: TX2MenuBarGroup;
begin begin
itemSelected := Assigned(tvMenu.Selected); itemSelected := Assigned(tvMenu.Selected);
actAddGroup.Enabled := Assigned(MenuBar); actAddGroup.Enabled := Assigned(MenuBar);
actAddItem.Enabled := itemSelected; actAddItem.Enabled := itemSelected;
actDelete.Enabled := itemSelected; actDelete.Enabled := itemSelected;
canMoveUp := False;
canMoveDown := False;
if itemSelected then
begin
menuItem := GetSelectedItem();
if Assigned(menuItem.Collection) then
begin
canMoveUp := (menuItem.Index > 0);
canMoveDown := (menuItem.Index < Pred(menuItem.Collection.Count));
if menuItem is TX2MenuBarItem then
begin
group := TX2MenuBarItem(menuItem).Group;
if Assigned(group) then
begin
canMoveUp := canMoveUp or (group.Index > 0);
canMoveDown := canMoveDown or (group.Index < Pred(MenuBar.Groups.Count));
end;
end;
end;
end;
actMoveUp.Enabled := canMoveUp;
actMoveDown.Enabled := canMoveDown;
end; end;
procedure TfrmMenuBarEditor.Modified(); procedure TfrmMenuBarEditor.Modified();
begin begin
if Assigned(Designer) then if Assigned(Designer) then
Designer.Modified(); Designer.Modified();
UpdateUI(); UpdateUI();
end; end;
@ -370,6 +444,7 @@ begin
inherited; inherited;
end; end;
procedure TfrmMenuBarEditor.ItemAdded(AItem: TX2CustomMenuBarItem); procedure TfrmMenuBarEditor.ItemAdded(AItem: TX2CustomMenuBarItem);
var var
group: TX2MenuBarGroup; group: TX2MenuBarGroup;
@ -377,6 +452,9 @@ var
treeNode: TTreeNode; treeNode: TTreeNode;
begin begin
if FMoving then
Exit;
treeNode := nil; treeNode := nil;
if AItem is TX2MenuBarGroup then if AItem is TX2MenuBarGroup then
@ -397,11 +475,15 @@ begin
tvMenu.Selected := treeNode; tvMenu.Selected := treeNode;
end; end;
procedure TfrmMenuBarEditor.ItemModified(AItem: TX2CustomMenuBarItem); procedure TfrmMenuBarEditor.ItemModified(AItem: TX2CustomMenuBarItem);
var var
treeNode: TTreeNode; treeNode: TTreeNode;
begin begin
if FMoving then
Exit;
tvMenu.Items.BeginUpdate(); tvMenu.Items.BeginUpdate();
try try
treeNode := tvMenu.Items.GetFirstNode(); treeNode := tvMenu.Items.GetFirstNode();
@ -415,11 +497,15 @@ begin
end; end;
end; end;
procedure TfrmMenuBarEditor.ItemDeleting(AItem: TX2CustomMenuBarItem); procedure TfrmMenuBarEditor.ItemDeleting(AItem: TX2CustomMenuBarItem);
var var
treeNode: TTreeNode; treeNode: TTreeNode;
begin begin
if FMoving then
Exit;
treeNode := GetItemNode(AItem); treeNode := GetItemNode(AItem);
if Assigned(treeNode) then if Assigned(treeNode) then
tvMenu.Items.Delete(treeNode); tvMenu.Items.Delete(treeNode);
@ -435,6 +521,7 @@ begin
FDesignerAttached := True; FDesignerAttached := True;
end; end;
procedure TfrmMenuBarEditor.DetachDesigner(); procedure TfrmMenuBarEditor.DetachDesigner();
begin begin
if not FDesignerAttached then if not FDesignerAttached then
@ -446,6 +533,75 @@ begin
end; end;
procedure TfrmMenuBarEditor.MoveSelectedItem(ADown: Boolean);
var
selectedItem: TX2CustomMenuBarItem;
group: TX2MenuBarGroup;
refresh: Boolean;
begin
if not Assigned(MenuBar) then
Exit;
selectedItem := GetSelectedItem();
if not Assigned(selectedItem) then
Exit;
refresh := False;
group := nil;
if selectedItem is TX2MenuBarItem then
group := TX2MenuBarItem(selectedItem).Group;
FMoving := True;
try
if ADown then
begin
if selectedItem.Index < Pred(selectedItem.Collection.Count) then
begin
selectedItem.Index := Succ(selectedItem.Index);
refresh := True;
end else if Assigned(group) then
begin
{ Move down to another group
The AddItem is triggered by moving between groups, no need
to add here. }
if group.Index < Pred(MenuBar.Groups.Count) then
begin
selectedItem.Collection := MenuBar.Groups[Succ(group.Index)].Items;
selectedItem.Index := 0;
refresh := True;
end;
end;
end else
begin
if selectedItem.Index > 0 then
begin
selectedItem.Index := Pred(selectedItem.Index);
refresh := True;
end else if Assigned(group) then
begin
{ Move up to another group }
if group.Index > 0 then
begin
selectedItem.Collection := MenuBar.Groups[Pred(group.Index)].Items;
refresh := True;
end;
end;
end;
finally
FMoving := False;
if refresh then
begin
ItemDeleting(selectedItem);
ItemAdded(selectedItem);
end;
end;
end;
function TfrmMenuBarEditor.GetSelectedItem(): TX2CustomMenuBarItem; function TfrmMenuBarEditor.GetSelectedItem(): TX2CustomMenuBarItem;
begin begin
Result := nil; Result := nil;
@ -453,6 +609,7 @@ begin
Result := TX2CustomMenuBarItem(tvMenu.Selected.Data); Result := TX2CustomMenuBarItem(tvMenu.Selected.Data);
end; end;
function TfrmMenuBarEditor.GetItemNode(AItem: TX2CustomMenuBarItem): TTreeNode; function TfrmMenuBarEditor.GetItemNode(AItem: TX2CustomMenuBarItem): TTreeNode;
var var
treeNode: TTreeNode; treeNode: TTreeNode;
@ -512,6 +669,7 @@ begin
end; end;
end; end;
initialization initialization
finalization finalization
if Assigned(GEditors) then if Assigned(GEditors) then

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -12,11 +12,22 @@ unit X2CLGraphics;
interface interface
uses uses
Graphics; Classes,
Graphics,
Windows;
type type
TX2Color32 = type TColor; TX2Color32 = type TColor;
TDrawTextClipStyle = (csNone, csEllipsis, csPathEllipsis);
{$IFNDEF VER180}
TVerticalAlignment = (taTop, taBottom, taVerticalCenter);
{$ENDIF}
PRGBAArray = ^TRGBAArray;
TRGBAArray = array[Word] of TRGBQuad;
function Color32(AColor: TColor; AAlpha: Byte = 255): TX2Color32; function Color32(AColor: TColor; AAlpha: Byte = 255): TX2Color32;
function DelphiColor(AColor: TX2Color32): TColor; function DelphiColor(AColor: TX2Color32): TColor;
@ -27,10 +38,72 @@ type
function Blend(ABackground: TColor; AForeground: TX2Color32): TColor; function Blend(ABackground: TColor; AForeground: TX2Color32): TColor;
implementation
uses
Windows;
{
:$ Provides a wrapper for the DrawText API.
}
procedure DrawText(ACanvas: TCanvas; const AText: String;
const ABounds: TRect;
AHorzAlignment: TAlignment = taLeftJustify;
AVertAlignment: TVerticalAlignment = taVerticalCenter;
AMultiLine: Boolean = False;
AClipStyle: TDrawTextClipStyle = csNone);
{
:$ Returns a pointer to the first physical scanline.
:: In bottom-up bitmaps, the most common kind, the Scanline property
:: compensates for this by returning the last physical row for Scanline[0];
:: the first visual row. For most effects, the order in which the rows are
:: processed is not important; speed is. This function returns the first
:: physical scanline, which can be used as a single big array for the whole
:: bitmap.
:! Note that every scanline is padded until it is a multiple of 4 bytes
:! (32 bits). For true lineair access, ensure the bitmap has a PixelFormat
:! of pf32bit.
}
function GetScanlinePointer(ABitmap: Graphics.TBitmap): Pointer;
{
:$ Wrapper for DrawFocusRect.
:: Ensures the canvas is set up correctly for a standard focus rectangle.
}
procedure DrawFocusRect(ACanvas: TCanvas; const ABounds: TRect);
{
:$ Draws one bitmap over another with the specified Alpha transparency.
:: Both bitmaps must be the same size.
}
procedure DrawBlended(ABackground, AForeground: Graphics.TBitmap; AAlpha: Byte);
{
:$ Draws a rectangle with a vertical gradient.
}
procedure GradientFillRect(ACanvas: TCanvas; ARect: TRect; AStartColor, AEndColor: TColor);
{
:$ Darkens a color with the specified value
}
function DarkenColor(const AColor: TColor; const AValue: Byte): TColor;
{
:$ Lightens a color with the specified value
}
function LightenColor(const AColor: TColor; const AValue: Byte): TColor;
implementation
function Color32(AColor: TColor; AAlpha: Byte): TX2Color32; function Color32(AColor: TColor; AAlpha: Byte): TX2Color32;
begin begin
Result := (ColorToRGB(AColor) and $00FFFFFF) or (AAlpha shl 24); Result := (ColorToRGB(AColor) and $00FFFFFF) or (AAlpha shl 24);
@ -90,4 +163,204 @@ begin
end; end;
end; end;
procedure DrawText(ACanvas: TCanvas; const AText: String;
const ABounds: TRect; AHorzAlignment: TAlignment;
AVertAlignment: TVerticalAlignment;
AMultiLine: Boolean; AClipStyle: TDrawTextClipStyle);
const
HorzAlignmentFlags: array[TAlignment] of Cardinal =
(DT_LEFT, DT_RIGHT, DT_CENTER);
VertAlignmentFlags: array[TVerticalAlignment] of Cardinal =
(DT_TOP, DT_BOTTOM, DT_VCENTER);
MultiLineFlags: array[Boolean] of Cardinal =
(DT_SINGLELINE, 0);
ClipStyleFlags: array[TDrawTextClipStyle] of Cardinal =
(0, DT_END_ELLIPSIS, DT_PATH_ELLIPSIS);
var
flags: Cardinal;
bounds: TRect;
begin
flags := HorzAlignmentFlags[AHorzAlignment] or
VertAlignmentFlags[AVertAlignment] or
MultiLineFlags[AMultiLine] or
ClipStyleFlags[AClipStyle];
if AMultiLine and (AClipStyle <> csNone) then
flags := flags or DT_EDITCONTROL;
bounds := ABounds;
Windows.DrawText(ACanvas.Handle, PChar(AText), Length(AText), bounds, flags);
end;
function GetScanlinePointer(ABitmap: Graphics.TBitmap): Pointer;
var
firstScanline: Pointer;
lastScanline: Pointer;
begin
firstScanline := ABitmap.ScanLine[0];
lastScanline := ABitmap.ScanLine[Pred(ABitmap.Height)];
if Cardinal(firstScanline) > Cardinal(lastScanline) then
Result := lastScanline
else
Result := firstScanline;
end;
procedure DrawFocusRect(ACanvas: TCanvas; const ABounds: TRect);
begin
SetTextColor(ACanvas.Handle, ColorToRGB(clBlack));
Windows.DrawFocusRect(ACanvas.Handle, ABounds);
end;
procedure DrawBlended(ABackground, AForeground: Graphics.TBitmap; AAlpha: Byte);
var
sourcePixels: PRGBAArray;
destPixels: PRGBAArray;
sourcePixel: PRGBQuad;
pixelCount: Integer;
pixelIndex: Integer;
backAlpha: Integer;
foreAlpha: Integer;
begin
backAlpha := AAlpha;
foreAlpha := 256 - AAlpha;
pixelCount := AForeground.Width * AForeground.Height;
sourcePixels := GetScanlinePointer(AForeground);
destPixels := GetScanlinePointer(ABackground);
for pixelIndex := Pred(pixelCount) downto 0 do
with destPixels^[pixelIndex] do
begin
sourcePixel := @sourcePixels^[pixelIndex];
rgbRed := ((rgbRed * backAlpha) +
(sourcePixel^.rgbRed * foreAlpha)) shr 8;
rgbGreen := ((rgbGreen * backAlpha) +
(sourcePixel^.rgbGreen * foreAlpha)) shr 8;
rgbBlue := ((rgbBlue * backAlpha) +
(sourcePixel^.rgbBlue * foreAlpha)) shr 8;
end;
end;
procedure GradientFillRect(ACanvas: TCanvas; ARect: TRect; AStartColor, AEndColor: TColor);
function FixValue(AValue: Single): Single;
begin
Result := AValue;
if Result < 0 then
Result := 0;
if Result > 255 then
Result := 255;
end;
var
startColor: Cardinal;
endColor: Cardinal;
stepCount: Integer;
redValue: Single;
greenValue: Single;
blueValue: Single;
redStep: Single;
greenStep: Single;
blueStep: Single;
line: Integer;
begin
startColor := ColorToRGB(AStartColor);
endColor := ColorToRGB(AEndColor);
if startColor = endColor then
begin
ACanvas.Brush.Style := bsSolid;
ACanvas.Brush.Color := startColor;
ACanvas.FillRect(ARect);
end else
begin
redValue := GetRValue(startColor);
greenValue := GetGValue(startColor);
blueValue := GetBValue(startColor);
stepCount := ARect.Bottom - ARect.Top;
redStep := (GetRValue(endColor) - redValue) / stepCount;
greenStep := (GetGValue(endColor) - greenValue) / stepCount;
blueStep := (GetBValue(endColor) - blueValue) / stepCount;
ACanvas.Pen.Style := psSolid;
for line := ARect.Top to ARect.Bottom do
begin
ACanvas.Pen.Color := RGB(Trunc(redValue), Trunc(greenValue), Trunc(blueValue));
ACanvas.MoveTo(ARect.Left, line);
ACanvas.LineTo(ARect.Right, line);
redValue := FixValue(redValue + redStep);
greenValue := FixValue(greenValue + greenStep);
blueValue := FixValue(blueValue + blueStep);
end;
end;
end;
function DarkenColor(const AColor: TColor; const AValue: Byte): TColor;
var
cColor: Cardinal;
iRed: Integer;
iGreen: Integer;
iBlue: Integer;
begin
cColor := ColorToRGB(AColor);
iRed := (cColor and $FF0000) shr 16;;
iGreen := (cColor and $00FF00) shr 8;
iBlue := cColor and $0000FF;
Dec(iRed, AValue);
Dec(iGreen, AValue);
Dec(iBlue, AValue);
if iRed < 0 then iRed := 0;
if iGreen < 0 then iGreen := 0;
if iBlue < 0 then iBlue := 0;
Result := (iRed shl 16) + (iGreen shl 8) + iBlue;
end;
function LightenColor(const AColor: TColor; const AValue: Byte): TColor;
var
cColor: Cardinal;
iRed: Integer;
iGreen: Integer;
iBlue: Integer;
begin
cColor := ColorToRGB(AColor);
iRed := (cColor and $FF0000) shr 16;;
iGreen := (cColor and $00FF00) shr 8;
iBlue := cColor and $0000FF;
Inc(iRed, AValue);
Inc(iGreen, AValue);
Inc(iBlue, AValue);
if iRed > 255 then iRed := 255;
if iGreen > 255 then iGreen := 255;
if iBlue > 255 then iBlue := 255;
Result := (iRed shl 16) + (iGreen shl 8) + iBlue;
end;
end. end.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,375 @@
unit X2CLMenuBarActions;
interface
uses
Contnrs,
Graphics,
Windows,
X2CLMenuBar;
type
{
:$ Animate group expand/collapse.
:: Handles the animating of a single group.
}
TX2MenuBarAnimateAction = class(TX2CustomMenuBarAction)
private
FAnimator: TX2CustomMenuBarAnimator;
FGroup: TX2MenuBarGroup;
protected
property Animator: TX2CustomMenuBarAnimator read FAnimator;
property Group: TX2MenuBarGroup read FGroup;
public
constructor Create(AMenuBar: TX2CustomMenuBar; AGroup: TX2MenuBarGroup;
AAnimator: TX2CustomMenuBarAnimator);
destructor Destroy(); override;
procedure Start(); override;
procedure BeforePaint(); override;
procedure GetItemHeight(AItem: TX2CustomMenuBarItem; var AHeight: Integer;
var AHandled: Boolean); override;
procedure DrawMenuItem(ACanvas: TCanvas; APainter: TX2CustomMenuBarPainter;
AItem: TX2CustomMenuBarItem; const AMenuBounds: TRect;
const AItemBounds: TRect; AState: TX2MenuBarDrawStates;
var AHandled: Boolean); override;
procedure AfterPaint(); override;
end;
{
:$ Animate multiple groups expanding/collapsing.
:: Manages multiple TX2MenuBarAnimateAction instances in one action.
}
TX2MenuBarAnimateMultipleAction = class(TX2CustomMenuBarAction)
private
FAnimateActions: TObjectList;
function GetCount(): Integer;
protected
function GetAnimateAction(AIndex: Integer): TX2MenuBarAnimateAction;
function GetTerminated(): Boolean; override;
property AnimateActions: TObjectList read FAnimateActions;
public
constructor Create(AMenuBar: TX2CustomMenuBar);
destructor Destroy(); override;
procedure Add(AAction: TX2MenuBarAnimateAction);
procedure BeforePaint(); override;
procedure GetItemHeight(AItem: TX2CustomMenuBarItem; var AHeight: Integer;
var AHandled: Boolean); override;
procedure DrawMenuItem(ACanvas: TCanvas; APainter: TX2CustomMenuBarPainter;
AItem: TX2CustomMenuBarItem; const AMenuBounds: TRect;
const AItemBounds: TRect; AState: TX2MenuBarDrawStates;
var AHandled: Boolean); override;
procedure AfterPaint(); override;
property Count: Integer read GetCount;
end;
{
:$ Sets the Expanded property of a group.
:: Provides a way to set the Expanded property of a group after it has
:: been animated.
}
TX2MenuBarExpandAction = class(TX2CustomMenuBarAction)
private
FExpanding: Boolean;
FGroup: TX2MenuBarGroup;
public
constructor Create(AMenuBar: TX2CustomMenuBar; AGroup: TX2MenuBarGroup;
AExpanding: Boolean);
procedure Start(); override;
end;
{
:$ Sets the Selected property.
:: Provides a way to set the Selected property of an item after
:: animating.
}
TX2MenuBarSelectAction = class(TX2CustomMenuBarAction)
private
FItem: TX2CustomMenuBarItem;
public
constructor Create(AMenuBar: TX2CustomMenuBar; AItem: TX2CustomMenuBarItem);
procedure Start(); override;
end;
implementation
uses
SysUtils;
type
TProtectedX2CustomMenuBarPainter = class(TX2CustomMenuBarPainter);
TProtectedX2CustomMenuBar = class(TX2CustomMenuBar);
TProtectedX2MenuBarGroup = class(TX2MenuBarGroup);
{ TX2MenuBarAnimateAction }
constructor TX2MenuBarAnimateAction.Create(AMenuBar: TX2CustomMenuBar; AGroup: TX2MenuBarGroup;
AAnimator: TX2CustomMenuBarAnimator);
begin
inherited Create(AMenuBar);
FAnimator := AAnimator;
FGroup := AGroup;
end;
destructor TX2MenuBarAnimateAction.Destroy();
begin
FreeAndNil(FAnimator);
inherited;
end;
procedure TX2MenuBarAnimateAction.Start();
begin
inherited;
Animator.ResetStartTime();
end;
procedure TX2MenuBarAnimateAction.BeforePaint();
begin
inherited;
Animator.Update();
if Animator.Terminated then
Terminate();
end;
procedure TX2MenuBarAnimateAction.GetItemHeight(AItem: TX2CustomMenuBarItem;
var AHeight: Integer;
var AHandled: Boolean);
begin
inherited;
if AItem = Group then
begin
AHeight := Animator.Height;
AHandled := True;
end;
end;
procedure TX2MenuBarAnimateAction.DrawMenuItem(ACanvas: TCanvas; APainter: TX2CustomMenuBarPainter;
AItem: TX2CustomMenuBarItem; const AMenuBounds,
AItemBounds: TRect; AState: TX2MenuBarDrawStates;
var AHandled: Boolean);
var
groupBounds: TRect;
painter: TProtectedX2CustomMenuBarPainter;
begin
inherited;
if Group = AItem then
begin
painter := TProtectedX2CustomMenuBarPainter(APainter);
groupBounds := AMenuBounds;
groupBounds.Top := AItemBounds.Bottom +
painter.GetSpacing(seAfterGroupHeader) +
painter.GetSpacing(seBeforeFirstItem);
groupBounds.Bottom := groupBounds.Top + Animator.Height;
Animator.Draw(ACanvas, groupBounds);
// AHandled := True;
end;
end;
procedure TX2MenuBarAnimateAction.AfterPaint();
begin
inherited;
if not Terminated then
begin
{ Prevent 100% CPU usage }
Sleep(5);
TProtectedX2CustomMenuBar(MenuBar).TestMousePos();
MenuBar.Invalidate();
end;
end;
{ TX2MenuBarAnimateMultipleAction }
constructor TX2MenuBarAnimateMultipleAction.Create(AMenuBar: TX2CustomMenuBar);
begin
inherited;
FAnimateActions := TObjectList.Create(True);
end;
destructor TX2MenuBarAnimateMultipleAction.Destroy();
begin
FreeAndNil(FAnimateActions);
inherited;
end;
procedure TX2MenuBarAnimateMultipleAction.Add(AAction: TX2MenuBarAnimateAction);
begin
AnimateActions.Add(AAction);
end;
procedure TX2MenuBarAnimateMultipleAction.BeforePaint();
var
actionIndex: Integer;
begin
inherited;
for actionIndex := 0 to Pred(AnimateActions.Count) do
GetAnimateAction(actionIndex).BeforePaint();
end;
procedure TX2MenuBarAnimateMultipleAction.GetItemHeight(AItem: TX2CustomMenuBarItem;
var AHeight: Integer;
var AHandled: Boolean);
var
actionIndex: Integer;
begin
inherited;
for actionIndex := 0 to Pred(AnimateActions.Count) do
begin
GetAnimateAction(actionIndex).GetItemHeight(AItem, AHeight, AHandled);
if AHandled then
Break;
end;
end;
procedure TX2MenuBarAnimateMultipleAction.DrawMenuItem(ACanvas: TCanvas;
APainter: TX2CustomMenuBarPainter;
AItem: TX2CustomMenuBarItem;
const AMenuBounds, AItemBounds: TRect;
AState: TX2MenuBarDrawStates;
var AHandled: Boolean);
var
actionIndex: Integer;
begin
inherited;
for actionIndex := 0 to Pred(AnimateActions.Count) do
begin
GetAnimateAction(actionIndex).DrawMenuItem(ACanvas, APainter, AItem,
AMenuBounds, AItemBounds, AState,
AHandled);
if AHandled then
Break;
end;
end;
procedure TX2MenuBarAnimateMultipleAction.AfterPaint();
var
actionIndex: Integer;
begin
inherited;
for actionIndex := 0 to Pred(AnimateActions.Count) do
GetAnimateAction(actionIndex).AfterPaint();
end;
function TX2MenuBarAnimateMultipleAction.GetAnimateAction(AIndex: Integer): TX2MenuBarAnimateAction;
begin
Result := TX2MenuBarAnimateAction(AnimateActions[AIndex]);
end;
function TX2MenuBarAnimateMultipleAction.GetCount(): Integer;
begin
Result := FAnimateActions.Count;
end;
function TX2MenuBarAnimateMultipleAction.GetTerminated(): Boolean;
var
actionIndex: Integer;
begin
Result := inherited GetTerminated();
if not Result then
begin
for actionIndex := 0 to Pred(AnimateActions.Count) do
if GetAnimateAction(actionIndex).Terminated then
begin
Result := True;
Break;
end;
end;
end;
{ TX2MenuBarExpandAction }
constructor TX2MenuBarExpandAction.Create(AMenuBar: TX2CustomMenuBar;
AGroup: TX2MenuBarGroup;
AExpanding: Boolean);
begin
inherited Create(AMenuBar);
FExpanding := AExpanding;
FGroup := AGroup;
end;
procedure TX2MenuBarExpandAction.Start();
begin
inherited;
TProtectedX2CustomMenuBar(MenuBar).InternalSetExpanded(FGroup, FExpanding);
Terminate();
end;
{ TX2MenuBarSelectAction }
constructor TX2MenuBarSelectAction.Create(AMenuBar: TX2CustomMenuBar;
AItem: TX2CustomMenuBarItem);
begin
inherited Create(AMenuBar);
FItem := AItem;
end;
procedure TX2MenuBarSelectAction.Start();
begin
inherited;
TProtectedX2CustomMenuBar(MenuBar).InternalSetSelected(FItem);
Terminate();
end;
end.

View File

@ -81,7 +81,9 @@ type
implementation implementation
uses uses
SysUtils; SysUtils,
X2CLGraphics;
{ TX2MenuBarSlideAnimator } { TX2MenuBarSlideAnimator }
@ -346,7 +348,7 @@ begin
destRect := Rect(0, 0, backBuffer.Width, backBuffer.Height); destRect := Rect(0, 0, backBuffer.Width, backBuffer.Height);
backBuffer.Canvas.CopyRect(destRect, ACanvas, ABounds); backBuffer.Canvas.CopyRect(destRect, ACanvas, ABounds);
X2CLMenuBar.DrawBlended(backBuffer, ItemsBuffer, FAlpha); X2CLGraphics.DrawBlended(backBuffer, ItemsBuffer, FAlpha);
sourceRect := Rect(0, 0, ItemsBuffer.Width, Self.Height); sourceRect := Rect(0, 0, ItemsBuffer.Width, Self.Height);
destRect := ABounds; destRect := ABounds;

View File

@ -216,7 +216,7 @@ begin
iconBuffer.Assign(backBuffer); iconBuffer.Assign(backBuffer);
AImageList.Draw(iconBuffer.Canvas, 0, 0, AImageIndex); AImageList.Draw(iconBuffer.Canvas, 0, 0, AImageIndex);
X2CLMenuBar.DrawBlended(backBuffer, iconBuffer, AAlpha); X2CLGraphics.DrawBlended(backBuffer, iconBuffer, AAlpha);
finally finally
FreeAndNil(iconBuffer); FreeAndNil(iconBuffer);
end; end;

View File

@ -14,6 +14,7 @@ interface
uses uses
Classes, Classes,
Graphics, Graphics,
ImgList,
Windows, Windows,
X2CLMenuBar; X2CLMenuBar;
@ -28,6 +29,7 @@ type
property OnChange: TNotifyEvent read FOnChange write FOnChange; property OnChange: TNotifyEvent read FOnChange write FOnChange;
end; end;
TX2MenuBarunaColor = class(TX2MenuBarunaProperty) TX2MenuBarunaColor = class(TX2MenuBarunaProperty)
private private
FDefaultDisabled: TColor; FDefaultDisabled: TColor;
@ -63,6 +65,7 @@ type
property Selected: TColor read FSelected write SetSelected stored IsSelectedStored; property Selected: TColor read FSelected write SetSelected stored IsSelectedStored;
end; end;
TX2MenuBarunaGroupColors = class(TX2MenuBarunaProperty) TX2MenuBarunaGroupColors = class(TX2MenuBarunaProperty)
private private
FFill: TX2MenuBarunaColor; FFill: TX2MenuBarunaColor;
@ -85,6 +88,7 @@ type
property Text: TX2MenuBarunaColor read FText write SetText; property Text: TX2MenuBarunaColor read FText write SetText;
end; end;
TX2MenuBarunaMetrics = class(TX2MenuBarunaProperty) TX2MenuBarunaMetrics = class(TX2MenuBarunaProperty)
private private
FAfterGroupHeader: Integer; FAfterGroupHeader: Integer;
@ -96,6 +100,8 @@ type
FGroupHeight: Integer; FGroupHeight: Integer;
FItemHeight: Integer; FItemHeight: Integer;
FMargin: Integer; FMargin: Integer;
FImageOffsetY: Integer;
FImageOffsetX: Integer;
procedure SetAfterGroupHeader(const Value: Integer); procedure SetAfterGroupHeader(const Value: Integer);
procedure SetAfterItem(const Value: Integer); procedure SetAfterItem(const Value: Integer);
@ -106,6 +112,8 @@ type
procedure SetGroupHeight(const Value: Integer); procedure SetGroupHeight(const Value: Integer);
procedure SetItemHeight(const Value: Integer); procedure SetItemHeight(const Value: Integer);
procedure SetMargin(const Value: Integer); procedure SetMargin(const Value: Integer);
procedure SetImageOffsetX(const Value: Integer);
procedure SetImageOffsetY(const Value: Integer);
public public
constructor Create(); constructor Create();
@ -120,8 +128,11 @@ type
property GroupHeight: Integer read FGroupHeight write SetGroupHeight default 22; property GroupHeight: Integer read FGroupHeight write SetGroupHeight default 22;
property ItemHeight: Integer read FItemHeight write SetItemHeight default 21; property ItemHeight: Integer read FItemHeight write SetItemHeight default 21;
property Margin: Integer read FMargin write SetMargin default 10; property Margin: Integer read FMargin write SetMargin default 10;
property ImageOffsetX: Integer read FImageOffsetX write SetImageOffsetX default 0;
property ImageOffsetY: Integer read FImageOffsetY write SetImageOffsetY default 0;
end; end;
TX2MenuBarunaPainter = class(TX2CustomMenuBarPainter) TX2MenuBarunaPainter = class(TX2CustomMenuBarPainter)
private private
FArrowColor: TColor; FArrowColor: TColor;
@ -132,6 +143,9 @@ type
FMetrics: TX2MenuBarunaMetrics; FMetrics: TX2MenuBarunaMetrics;
FShadowColor: TColor; FShadowColor: TColor;
FShadowOffset: Integer; FShadowOffset: Integer;
FGroupGradient: Integer;
FArrowImages: TCustomImageList;
FArrowImageIndex: TImageIndex;
procedure SetBlurShadow(const Value: Boolean); procedure SetBlurShadow(const Value: Boolean);
procedure SetGroupColors(const Value: TX2MenuBarunaGroupColors); procedure SetGroupColors(const Value: TX2MenuBarunaGroupColors);
@ -139,7 +153,14 @@ type
procedure SetMetrics(const Value: TX2MenuBarunaMetrics); procedure SetMetrics(const Value: TX2MenuBarunaMetrics);
procedure SetShadowColor(const Value: TColor); procedure SetShadowColor(const Value: TColor);
procedure SetShadowOffset(const Value: Integer); procedure SetShadowOffset(const Value: Integer);
procedure SetGroupGradient(const Value: Integer);
procedure SetArrowImageIndex(const Value: TImageIndex);
procedure SetArrowImages(const Value: TCustomImageList);
protected protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
function HasArrowImage(): Boolean;
function ApplyMargins(const ABounds: TRect): TRect; override; function ApplyMargins(const ABounds: TRect): TRect; override;
function GetSpacing(AElement: TX2MenuBarSpacingElement): Integer; override; function GetSpacing(AElement: TX2MenuBarSpacingElement): Integer; override;
function GetGroupHeaderHeight(AGroup: TX2MenuBarGroup): Integer; override; function GetGroupHeaderHeight(AGroup: TX2MenuBarGroup): Integer; override;
@ -148,6 +169,7 @@ type
procedure DrawBackground(ACanvas: TCanvas; const ABounds: TRect); override; procedure DrawBackground(ACanvas: TCanvas; const ABounds: TRect); override;
procedure DrawGroupHeader(ACanvas: TCanvas; AGroup: TX2MenuBarGroup; const ABounds: TRect; AState: TX2MenuBarDrawStates); override; procedure DrawGroupHeader(ACanvas: TCanvas; AGroup: TX2MenuBarGroup; const ABounds: TRect; AState: TX2MenuBarDrawStates); override;
procedure DrawItem(ACanvas: TCanvas; AItem: TX2MenuBarItem; const ABounds: TRect; AState: TX2MenuBarDrawStates); override; procedure DrawItem(ACanvas: TCanvas; AItem: TX2MenuBarItem; const ABounds: TRect; AState: TX2MenuBarDrawStates); override;
procedure DrawArrow(ACanvas: TCanvas; ABounds: TRect);
procedure ColorChange(Sender: TObject); procedure ColorChange(Sender: TObject);
public public
@ -156,24 +178,30 @@ type
procedure ResetColors(); procedure ResetColors();
published published
property ArrowColor: TColor read FArrowColor write FArrowColor default clBlue; property ArrowImageIndex: TImageIndex read FArrowImageIndex write SetArrowImageIndex default -1;
property BlurShadow: Boolean read FBlurShadow write SetBlurShadow default True; property ArrowImages: TCustomImageList read FArrowImages write SetArrowImages;
property Color: TColor read FColor write FColor default clWindow; property ArrowColor: TColor read FArrowColor write FArrowColor default clBlue;
property GroupColors: TX2MenuBarunaGroupColors read FGroupColors write SetGroupColors; property BlurShadow: Boolean read FBlurShadow write SetBlurShadow default True;
property ItemColors: TX2MenuBarunaColor read FItemColors write SetItemColors; property Color: TColor read FColor write FColor default clWindow;
property Metrics: TX2MenuBarunaMetrics read FMetrics write SetMetrics; property GroupColors: TX2MenuBarunaGroupColors read FGroupColors write SetGroupColors;
property ShadowColor: TColor read FShadowColor write SetShadowColor default clBtnShadow; property ItemColors: TX2MenuBarunaColor read FItemColors write SetItemColors;
property ShadowOffset: Integer read FShadowOffset write SetShadowOffset default 2; property Metrics: TX2MenuBarunaMetrics read FMetrics write SetMetrics;
property ShadowColor: TColor read FShadowColor write SetShadowColor default clBtnShadow;
property ShadowOffset: Integer read FShadowOffset write SetShadowOffset default 2;
property GroupGradient: Integer read FGroupGradient write SetGroupGradient default 0;
end; end;
implementation implementation
uses uses
ImgList,
SysUtils, SysUtils,
X2CLGraphics; X2CLGraphics;
const
ArrowMargin = 2;
ArrowWidth = 8;
procedure Blur(ASource: Graphics.TBitmap); procedure Blur(ASource: Graphics.TBitmap);
var var
@ -387,16 +415,37 @@ begin
end; end;
procedure TX2MenuBarunaMetrics.SetImageOffsetX(const Value: Integer);
begin
if Value <> FImageOffsetX then
begin
FImageOffsetX := Value;
Changed();
end;
end;
procedure TX2MenuBarunaMetrics.SetImageOffsetY(const Value: Integer);
begin
if Value <> FImageOffsetY then
begin
FImageOffsetY := Value;
Changed();
end;
end;
{ TX2MenuBarunaPainter } { TX2MenuBarunaPainter }
constructor TX2MenuBarunaPainter.Create(AOwner: TComponent); constructor TX2MenuBarunaPainter.Create(AOwner: TComponent);
begin begin
inherited; inherited;
FBlurShadow := True; FArrowImageIndex := -1;
FGroupColors := TX2MenuBarunaGroupColors.Create(); FBlurShadow := True;
FItemColors := TX2MenuBarunaColor.Create(); FGroupColors := TX2MenuBarunaGroupColors.Create();
FMetrics := TX2MenuBarunaMetrics.Create(); FItemColors := TX2MenuBarunaColor.Create();
FShadowOffset := 2; FMetrics := TX2MenuBarunaMetrics.Create();
FShadowOffset := 2;
FGroupColors.OnChange := ColorChange; FGroupColors.OnChange := ColorChange;
FItemColors.OnChange := ColorChange; FItemColors.OnChange := ColorChange;
@ -407,6 +456,7 @@ end;
destructor TX2MenuBarunaPainter.Destroy(); destructor TX2MenuBarunaPainter.Destroy();
begin begin
SetArrowImages(nil);
FreeAndNil(FMetrics); FreeAndNil(FMetrics);
FreeAndNil(FItemColors); FreeAndNil(FItemColors);
FreeAndNil(FGroupColors); FreeAndNil(FGroupColors);
@ -526,6 +576,9 @@ var
shadowBitmap: Graphics.TBitmap; shadowBitmap: Graphics.TBitmap;
shadowBounds: TRect; shadowBounds: TRect;
textRect: TRect; textRect: TRect;
clipRegion: HRGN;
startColor: TColor;
endColor: TColor;
begin begin
if not ((mdsSelected in AState) or (mdsGroupSelected in AState)) then if not ((mdsSelected in AState) or (mdsGroupSelected in AState)) then
@ -558,12 +611,32 @@ begin
end; end;
{ Rounded rectangle } { Rounded rectangle }
ACanvas.Brush.Color := GetColor(GroupColors.Fill); startColor := GetColor(GroupColors.Fill);
endColor := startColor;
if GroupGradient > 0 then
endColor := LightenColor(startColor, GroupGradient)
else if GroupGradient < 0 then
endColor := DarkenColor(startColor, -GroupGradient);
clipRegion := CreateRoundRectRgn(ABounds.Left, ABounds.Top, ABounds.Right, ABounds.Bottom, 5, 5);
SelectClipRgn(ACanvas.Handle, clipRegion);
GradientFillRect(ACanvas, ABounds, startColor, endColor);
SelectClipRgn(ACanvas.Handle, 0);
DeleteObject(clipRegion);
ACanvas.Brush.Style := bsClear;
ACanvas.Pen.Color := GetColor(GroupColors.Border); ACanvas.Pen.Color := GetColor(GroupColors.Border);
ACanvas.Pen.Style := psSolid;
ACanvas.RoundRect(ABounds.Left, ABounds.Top, ABounds.Right, ABounds.Bottom, 5, 5);
ACanvas.Brush.Style := bsSolid;
ACanvas.Font.Color := GetColor(GroupColors.Text); ACanvas.Font.Color := GetColor(GroupColors.Text);
ACanvas.RoundRect(ABounds.Left, ABounds.Top, ABounds.Right, ABounds.Bottom, 5, 5);
textRect := ABounds; textRect := ABounds;
Inc(textRect.Left, 4); Inc(textRect.Left, 4);
Dec(textRect.Right, 4); Dec(textRect.Right, 4);
@ -576,6 +649,10 @@ begin
begin begin
imagePos.X := textRect.Left; imagePos.X := textRect.Left;
imagePos.Y := ABounds.Top + ((ABounds.Bottom - ABounds.Top - imageList.Height) div 2); imagePos.Y := ABounds.Top + ((ABounds.Bottom - ABounds.Top - imageList.Height) div 2);
Inc(imagePos.X, Metrics.ImageOffsetX);
Inc(imagePos.Y, Metrics.ImageOffsetY);
imageList.Draw(ACanvas, imagePos.X, imagePos.Y, AGroup.ImageIndex); imageList.Draw(ACanvas, imagePos.X, imagePos.Y, AGroup.ImageIndex);
end; end;
@ -584,6 +661,7 @@ begin
{ Text } { Text }
ACanvas.Font.Style := [fsBold]; ACanvas.Font.Style := [fsBold];
SetBkMode(ACanvas.Handle, TRANSPARENT);
DrawText(ACanvas, AGroup.Caption, textRect, taLeftJustify, taVerticalCenter, DrawText(ACanvas, AGroup.Caption, textRect, taLeftJustify, taVerticalCenter,
False, csEllipsis); False, csEllipsis);
end; end;
@ -604,21 +682,58 @@ procedure TX2MenuBarunaPainter.DrawItem(ACanvas: TCanvas; AItem: TX2MenuBarItem;
Result := AColor.Disabled; Result := AColor.Disabled;
end; end;
var var
focusBounds: TRect; focusBounds: TRect;
textBounds: TRect; textBounds: TRect;
arrowPoints: array[0..2] of TPoint;
begin begin
focusBounds := ABounds; focusBounds := ABounds;
Dec(focusBounds.Right, Metrics.Margin);
if HasArrowImage() then
Dec(focusBounds.Right, ArrowImages.Width + ArrowMargin)
else
Dec(focusBounds.Right, ArrowWidth + ArrowMargin);
if (mdsSelected in AState) then if (mdsSelected in AState) then
begin begin
{ Focus rectangle } { Focus rectangle and arrow }
DrawFocusRect(ACanvas, focusBounds); DrawFocusRect(ACanvas, focusBounds);
DrawArrow(ACanvas, ABounds);
end;
{ Arrow } { Text }
ACanvas.Font.Color := GetColor(ItemColors);
textBounds := focusBounds;
Inc(textBounds.Left, 4);
Dec(textBounds.Right, 4);
if not AItem.Visible then
{ Design-time }
ACanvas.Font.Style := [fsItalic]
else
ACanvas.Font.Style := [];
SetBkMode(ACanvas.Handle, TRANSPARENT);
DrawText(ACanvas, AItem.Caption, textBounds, taRightJustify, taVerticalCenter,
False, csEllipsis);
end;
procedure TX2MenuBarunaPainter.DrawArrow(ACanvas: TCanvas; ABounds: TRect);
var
arrowX: Integer;
arrowY: Integer;
arrowPoints: array[0..2] of TPoint;
begin
if HasArrowImage() then
begin
arrowX := ABounds.Right - ArrowImages.Width;
arrowY := ABounds.Top + ((ABounds.Bottom - ABounds.Top - ArrowImages.Height) div 2);
ArrowImages.Draw(ACanvas, arrowX, arrowY, ArrowImageIndex);
end else
begin
ACanvas.Brush.Color := ArrowColor; ACanvas.Brush.Color := ArrowColor;
ACanvas.Pen.Color := ArrowColor; ACanvas.Pen.Color := ArrowColor;
@ -630,23 +745,6 @@ begin
arrowPoints[2].Y := arrowPoints[0].Y + 7; arrowPoints[2].Y := arrowPoints[0].Y + 7;
ACanvas.Polygon(arrowPoints); ACanvas.Polygon(arrowPoints);
end; end;
{ Text }
ACanvas.Font.Color := GetColor(ItemColors);
textBounds := focusBounds;
Inc(textBounds.Left, 4);
Dec(textBounds.Right, 4);
SetBkMode(ACanvas.Handle, TRANSPARENT);
if not AItem.Visible then
{ Design-time }
ACanvas.Font.Style := [fsItalic]
else
ACanvas.Font.Style := [];
DrawText(ACanvas, AItem.Caption, textBounds, taRightJustify, taVerticalCenter,
False, csEllipsis);
end; end;
@ -656,6 +754,21 @@ begin
end; end;
function TX2MenuBarunaPainter.HasArrowImage(): Boolean;
begin
Result := Assigned(ArrowImages) and (ArrowImageIndex > -1);
end;
procedure TX2MenuBarunaPainter.Notification(AComponent: TComponent; Operation: TOperation);
begin
if (Operation = opRemove) and (AComponent = FArrowImages) then
SetArrowImages(nil);
inherited;
end;
procedure TX2MenuBarunaPainter.SetGroupColors(const Value: TX2MenuBarunaGroupColors); procedure TX2MenuBarunaPainter.SetGroupColors(const Value: TX2MenuBarunaGroupColors);
begin begin
if Value <> FGroupColors then if Value <> FGroupColors then
@ -702,6 +815,43 @@ begin
end; end;
procedure TX2MenuBarunaPainter.SetGroupGradient(const Value: Integer);
begin
if Value <> FGroupGradient then
begin
FGroupGradient := Value;
NotifyObservers();
end;
end;
procedure TX2MenuBarunaPainter.SetArrowImageIndex(const Value: TImageIndex);
begin
if Value <> FArrowImageIndex then
begin
FArrowImageIndex := Value;
NotifyObservers();
end;
end;
procedure TX2MenuBarunaPainter.SetArrowImages(const Value: TCustomImageList);
begin
if Value <> FArrowImages then
begin
if Assigned(FArrowImages) then
FArrowImages.RemoveFreeNotification(Self);
FArrowImages := Value;
if Assigned(FArrowImages) then
FArrowImages.FreeNotification(Self);
NotifyObservers();
end;
end;
{ TX2MenuBarunaProperty } { TX2MenuBarunaProperty }
procedure TX2MenuBarunaProperty.Changed(); procedure TX2MenuBarunaProperty.Changed();
begin begin

View File

@ -1,9 +1,9 @@
object frmMain: TfrmMain object frmMain: TfrmMain
Left = 300 Left = 300
Top = 219 Top = 219
Width = 613
Height = 406
Caption = 'X2MenuBar Test' Caption = 'X2MenuBar Test'
ClientHeight = 379
ClientWidth = 589
Color = clBtnFace Color = clBtnFace
Font.Charset = DEFAULT_CHARSET Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText Font.Color = clWindowText
@ -23,8 +23,6 @@ object frmMain: TfrmMain
Height = 379 Height = 379
Align = alLeft Align = alLeft
Shape = bsLeftLine Shape = bsLeftLine
ExplicitLeft = 148
ExplicitTop = -4
end end
object lblAnimationTime: TLabel object lblAnimationTime: TLabel
Left = 424 Left = 424
@ -33,24 +31,13 @@ object frmMain: TfrmMain
Height = 13 Height = 13
Caption = 'Animation time (ms):' Caption = 'Animation time (ms):'
end end
object seAnimationTime: TJvSpinEdit
Left = 424
Top = 36
Width = 81
Height = 21
CheckMinValue = True
ButtonKind = bkStandard
Value = 250.000000000000000000
TabOrder = 0
OnChange = seAnimationTimeChange
end
object Panel1: TPanel object Panel1: TPanel
Left = 280 Left = 280
Top = 68 Top = 68
Width = 133 Width = 133
Height = 77 Height = 77
BevelOuter = bvNone BevelOuter = bvNone
TabOrder = 1 TabOrder = 0
object rbmusikCube: TRadioButton object rbmusikCube: TRadioButton
Left = 0 Left = 0
Top = 0 Top = 0
@ -87,7 +74,7 @@ object frmMain: TfrmMain
Width = 153 Width = 153
Height = 101 Height = 101
BevelOuter = bvNone BevelOuter = bvNone
TabOrder = 2 TabOrder = 1
object rbSliding: TRadioButton object rbSliding: TRadioButton
Left = 0 Left = 0
Top = 20 Top = 20
@ -142,7 +129,7 @@ object frmMain: TfrmMain
Width = 89 Width = 89
Height = 17 Height = 17
Caption = 'Auto collapse' Caption = 'Auto collapse'
TabOrder = 3 TabOrder = 2
OnClick = chkAutoCollapseClick OnClick = chkAutoCollapseClick
end end
object chkAllowCollapseAll: TCheckBox object chkAllowCollapseAll: TCheckBox
@ -151,7 +138,7 @@ object frmMain: TfrmMain
Width = 101 Width = 101
Height = 17 Height = 17
Caption = 'Allow collapse all' Caption = 'Allow collapse all'
TabOrder = 5 TabOrder = 4
OnClick = chkAllowCollapseAllClick OnClick = chkAllowCollapseAllClick
end end
object chkAutoSelectItem: TCheckBox object chkAutoSelectItem: TCheckBox
@ -160,7 +147,7 @@ object frmMain: TfrmMain
Width = 101 Width = 101
Height = 17 Height = 17
Caption = 'Auto select item' Caption = 'Auto select item'
TabOrder = 4 TabOrder = 3
OnClick = chkAutoSelectItemClick OnClick = chkAutoSelectItemClick
end end
object chkScrollbar: TCheckBox object chkScrollbar: TCheckBox
@ -171,7 +158,7 @@ object frmMain: TfrmMain
Caption = 'Scrollbar' Caption = 'Scrollbar'
Checked = True Checked = True
State = cbChecked State = cbChecked
TabOrder = 6 TabOrder = 5
OnClick = chkScrollbarClick OnClick = chkScrollbarClick
end end
object chkHideScrollbar: TCheckBox object chkHideScrollbar: TCheckBox
@ -182,7 +169,7 @@ object frmMain: TfrmMain
Caption = 'Hide Scrollbar' Caption = 'Hide Scrollbar'
Checked = True Checked = True
State = cbChecked State = cbChecked
TabOrder = 7 TabOrder = 6
OnClick = chkHideScrollbarClick OnClick = chkHideScrollbarClick
end end
object lbEvents: TListBox object lbEvents: TListBox
@ -191,7 +178,7 @@ object frmMain: TfrmMain
Width = 421 Width = 421
Height = 93 Height = 93
ItemHeight = 13 ItemHeight = 13
TabOrder = 8 TabOrder = 7
end end
object Button1: TButton object Button1: TButton
Left = 152 Left = 152
@ -200,7 +187,7 @@ object frmMain: TfrmMain
Height = 25 Height = 25
Caption = 'SelectFirst' Caption = 'SelectFirst'
Enabled = False Enabled = False
TabOrder = 9 TabOrder = 8
end end
object Button2: TButton object Button2: TButton
Left = 152 Left = 152
@ -209,7 +196,7 @@ object frmMain: TfrmMain
Height = 25 Height = 25
Caption = 'SelectPrior' Caption = 'SelectPrior'
Enabled = False Enabled = False
TabOrder = 10 TabOrder = 9
end end
object Button3: TButton object Button3: TButton
Left = 152 Left = 152
@ -218,7 +205,7 @@ object frmMain: TfrmMain
Height = 25 Height = 25
Caption = 'SelectNext' Caption = 'SelectNext'
Enabled = False Enabled = False
TabOrder = 11 TabOrder = 10
end end
object Button4: TButton object Button4: TButton
Left = 152 Left = 152
@ -227,7 +214,7 @@ object frmMain: TfrmMain
Height = 25 Height = 25
Caption = 'SelectLast' Caption = 'SelectLast'
Enabled = False Enabled = False
TabOrder = 12 TabOrder = 11
end end
object Button5: TButton object Button5: TButton
Left = 152 Left = 152
@ -236,7 +223,7 @@ object frmMain: TfrmMain
Height = 25 Height = 25
Caption = 'SelectGroupByIndex' Caption = 'SelectGroupByIndex'
Enabled = False Enabled = False
TabOrder = 13 TabOrder = 12
end end
object Button6: TButton object Button6: TButton
Left = 152 Left = 152
@ -245,7 +232,7 @@ object frmMain: TfrmMain
Height = 25 Height = 25
Caption = 'SelectItemByIndex' Caption = 'SelectItemByIndex'
Enabled = False Enabled = False
TabOrder = 14 TabOrder = 13
end end
object chkHotHand: TCheckBox object chkHotHand: TCheckBox
Left = 424 Left = 424
@ -305,8 +292,9 @@ object frmMain: TfrmMain
end> end>
end end
item item
Action = actTest2
Caption = 'Group without items' Caption = 'Group without items'
ImageIndex = 2 ImageIndex = 3
Expanded = False Expanded = False
Items = <> Items = <>
end end
@ -378,115 +366,113 @@ object frmMain: TfrmMain
OnSelectedChanged = mbTestSelectedChanged OnSelectedChanged = mbTestSelectedChanged
OnSelectedChanging = mbTestSelectedChanging OnSelectedChanging = mbTestSelectedChanging
Painter = mcPainter Painter = mcPainter
ExplicitLeft = -6
end end
object gcMenu: TX2GraphicContainer object gcMenu: TX2GraphicContainer
Graphics = <
item
Name = 'ShareFile'
Picture.Data = {
0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000001000
00001008060000001FF3FF61000001844944415478DAA5D2CD4B02411400F0B7
DB2DA27FAB4EE22102A1A0C0FCA0837A4989683734C7A072A12C45502902FB00
E95487FEA20E1D24337777E635B33BBB389B5E6A60F6ED1EDE6FDE9BB71AFC73
69C14BADF98A223A8EEB7DDB41B4FD38B11D1112D661A23F1728A657E69E5428
F761796911869F5F0A32174044102551E6BF17C90364B76270F7F4A6202140AE
5FB09459554E1589942B8CF9C0F4E280A600A6F58C462E3613A01C70F9B61DCA
4F1F83D51CA0656EEB2A501FA0918FAB2D88646FA3D74A108D6A0F2E2A496D26
20127D80972E93998208A00B97951D1530CE076816E2E052FFF238E125B228C4
1F06E941230AEC9F3CE2F1DE1A7CBB2CAC00652B4CB6C2E49D1C912E07522A50
22F7484AEB30B2250018224C2607509974A0719C5681BC798B75630386131AA9
80274B2C68A5C22BB8AA46809C71C347B3091F631ACC414564152E8FD55A079A
24A302A9621B5BB524BC8F9CA951AA80F72FF07D76DA8516C9AAC0EE411B755D
0790339045841719DC8BA86241D37F4FE1AFEB07F8392D2050E7313500000000
49454E44AE426082}
end
item
Name = 'ShareFolder'
Picture.Data = {
0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000001000
00001008060000001FF3FF610000025B4944415478DAAD936D48535118C7FF77
775BEAD8ACA123CB2834EC9B2DB2B0328CCC284B461192146A48040505D36A05
154826A64D53A490303F6510C528421B6B2CC4C0E5170317ABA859099ACEBBF7
B6BBFBD2F172433F680875E0CF797BFE3FCE79CE7928FC63A3961B38D201BB3F
82524100E6140AA0A7D28ADA65039C2D88159DF3A7AA52F5D2FCF90D0AA60650
4B02BCBDD8C504512288284CB23088EA0C63F18569FACFFE92007727BCB47E4B
9E5A9385F4753B9091530EB5D6009AD690DD28519C2813B66B5A1CB9B908C075
0762B139042EEE412CF01D51BF0789F04F4064C1712C36EEAE275119787A350B
C79A64C0609B2209958E5E633C4FF9DE36A0B07610D1D97EA8523448D56AB122
2D8D642E8EC98FA3D0E79442AD31E289250F15CD32C0D942058ACE0EA7ABD236
C1D19C8E7D973F93D521804B4A4649624292CFF3151B0AEAF1F8E26654B6CA00
C76DA53BFF68DFB6CCDC9DB037ADC5FE2BA3C4F41AE009804BCC03F8047E787D
C8DE5E8547751538619501F62674AF5A5F525350D9AD1A68CCC5018B8BE4AA5F
324060E57EEE041CC4A40026A6C3CBAE07A8BA2B03061A5141F1F4BDBD752FF4
AF5ACB70E8928D24FC1931B20B00736312ACA010F42760EB79839ACE05AF3070
2BC5A6CBDA6A9AF10DA1DCFC1008F649999704228508669605331E86776C06D3
939189EA0E6453F31F0367D49AD55DF1F0246D32B713402F3125C04C45C8BD43
98188F89D15032405E72F8781B0E2E5A0BCEAE7C8E99784F97551FC627B70BDF
BEFCE2E3117E4AE031625809CB9EEBF8F0D7627A77BFE0D4D8D88855A9440022
1C27DB71FABF55E352ED373075032024CD24170000000049454E44AE426082}
end
item
Name = 'ShareWebcam'
Picture.Data = {
0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000001000
00001008060000001FF3FF61000002C14944415478DABD935D48935118C7FF9B
DB9CD38913155CB586D008C30F9A95A8217927A14157DE441FE88521A4828108
0A8992621745A80C477AB3A048D44A08A18589BA959AE0D4A09CBAE936F7E55E
759B7BDFB91EDF20E82E283A70381CCE797EFFE739E7FF08F09743F04F00D5D5
BA94C4C4E47A954AA171BB0F6452292B92CB25C24824088E63A32C1BE658F630
B2BFBF175E5B5B5B0F0643AF8DC6E79F7F011A1B87DE3435555C0D8582181F37
637BFB3BEAEA6ED28918BBBB3EC4C589F8AB1C071C1C846136CFC52626DE0D8D
8E0EDEE6011D1D2F772A2B0BD2392E0A936915878711C46231088502582C6FB1
B4B44CC0079899998048C48132A1A8D42D9DAEEB240F686919F017179F4D6118
8ED4BD9048E22016FF9C16CB14525353A056E7C26AB5109C4166A692A0566F6F
EFC3341ED0DDFDC25759A9552C2CAC8061F6715C7B2C968868D405AD36076EB7
874A0990BA020A453A8145181B1BF1F7F575A7F280F6F621574D4D4586DDEE81
D7CBC066B3D2EA446E6E16BABA9E906A0C39392AE4E79F874A758E32946078F8
95BBBFBF278307B4B50D6CD6D65E3FB5B9E982CFC7606BCB4EEA3EACAE2E2110
5042A3C9C6E4A40EA5A525042A444282140683C1A6D33D56F180E6E6A75F1B1A
6E683636B649790F3B3B0E04832EACAF7F83D13887B4B44CC8E52C0A0B8B9097
7701F1F1F1D0EBF52B7A7D6F360FA8AFEFFAD4DA7AB7C06ADD86C7B34BC10C1C
0E3BA4D2E35F311F7B014AE50994945C21F544242727D1BB3D9A32189E5DE601
55558D239D9DF7AE310C4BEA7EAA5100A7D3857098A1E010EDC5C8CA3A43CA32
BACD61717131363030747F76F6430F0F282FBF73A9ACACE47D51915666B3B9C8
386421B11432593C418294CD163DAC2DE2743AE697972DC66834326A327D34FD
D60BE5E5B72EAAD5A7079392E41AB2AE9BCC6275B91CCB3E5FE08B40C0CE1F1D
F917A6A767427FD24C429A47FFAD1B7F00ED1B51200D4AE2740000000049454E
44AE426082}
end
item
Name = 'ShareWebcamVideo'
Picture.Data = {
0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000001000
00001008060000001FF3FF61000002EA4944415478DAA5935D48935118C7FFF3
DDAB6BCEF9FDED44DC4CA15E8761412A1296A121285ED595DD7521298C125341
E9622B584CE6BCF122454891AE9424432B3FC8A4FC203F32D1E9FCAA95D36DCD
B5BDAF7BB78E2B040BA2E8DC9CAFE7FC9EE7FCCFF90BF09F4DF0EB82CFE713E8
F5FA149AA6198FC7C3884422262C2C8C118BC5A91CC7EDBBDDAE75ABD5BAC4B2
9C4EA5524D1E03747777574B2492A688888830D2432A952238580C9AA6C82E8F
830316DBDB7632077A7B7B5FD7D737E41C017A7A7A8A939393FB188611DA6C36
2426268265DDB05A2D9899716373D30BA39187CD7608FA86ADCD06D7E0D0A0D8
0F50ABD585342D7CEA703828A55289E8E818242424203C5C82AE2E0789909183
FB70BB59389D2E02F66274F4BA6361615CEA075455DD1C11894EE43FEC7C8C2B
C59791794A8EA2A26212ECC4F47436380EE430878D8D31D8ED6FC93A199BDEAC
4FCD0CA4F801776A6B9D731F56C553CB1C3EED72A82C4FC2A5C2622814C99898
9061656519F3F3F7B1B7B785A8A818040444212DEDCCAC56AB52FA013535B7ED
E65D56FA688405EF0DC5D59CAF60329290937B0E7373720C0CA840511C76763E
FB01F1F1371014343B6B3034FE005456560E9D4C935FACD6AF03541CCAB35791
9A1082D34C3A9697F33035A5267A444128CC464848162C163BD1A97FB2B5557D
F667053525F0F17D2C1527E81B36212B6E1D79F917E0724988FAB9100804F078
78A2C5A1802EA2831B1919CFFB753A6DC9D133D6D5D5DD22719AF434B9D0E9E2
488981E4B942313C1C47EECCC3EBF591B9070E871B4AA58FC09E7536371B2A8E
7DA4F6F6F677A5A5A59966B39964B1C164B2A0A34388C04090CC3C2223BD2828
A0C978D16B327D2CD56A1F3C3906D0E974E3656565E7799EF7976DB57E415BDB
26C46211C94A932A8CBEA5A5B5171415D8A8D1685EFDE605F2A1AE51146590C9
64110A8582F8C2EBBFF7E2E27B9FD1B8F6322040D8A4D1DC1BFBA39988418288
894A481515B1B1B185168BE51531D8DD969696D1BF72E3BFB6EF2C065120000A
A5C30000000049454E44AE426082}
end>
Left = 180 Left = 180
Top = 8 Top = 8
object gcMenuShareFile: TX2GraphicContainerItem
Picture.Data = {
0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000001000
00001008060000001FF3FF61000001844944415478DAA5D2CD4B02411400F0B7
DB2DA27FAB4EE22102A1A0C0FCA0837A4989683734C7A072A12C45502902FB00
E95487FEA20E1D24337777E635B33BBB389B5E6A60F6ED1EDE6FDE9BB71AFC73
69C14BADF98A223A8EEB7DDB41B4FD38B11D1112D661A23F1728A657E69E5428
F761796911869F5F0A32174044102551E6BF17C90364B76270F7F4A6202140AE
5FB09459554E1589942B8CF9C0F4E280A600A6F58C462E3613A01C70F9B61DCA
4F1F83D51CA0656EEB2A501FA0918FAB2D88646FA3D74A108D6A0F2E2A496D26
20127D80972E93998208A00B97951D1530CE076816E2E052FFF238E125B228C4
1F06E941230AEC9F3CE2F1DE1A7CBB2CAC00652B4CB6C2E49D1C912E07522A50
22F7484AEB30B2250018224C2607509974A0719C5681BC798B75630386131AA9
80274B2C68A5C22BB8AA46809C71C347B3091F631ACC414564152E8FD55A079A
24A302A9621B5BB524BC8F9CA951AA80F72FF07D76DA8516C9AAC0EE411B755D
0790339045841719DC8BA86241D37F4FE1AFEB07F8392D2050E7313500000000
49454E44AE426082}
PictureName = 'ShareFile'
end
object gcMenuShareFolder: TX2GraphicContainerItem
Picture.Data = {
0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000001000
00001008060000001FF3FF610000025B4944415478DAAD936D48535118C7FF77
775BEAD8ACA123CB2834EC9B2DB2B0328CCC284B461192146A48040505D36A05
154826A64D53A490303F6510C528421B6B2CC4C0E5170317ABA859099ACEBBF7
B6BBFBD2F172433F680875E0CF797BFE3FCE79CE7928FC63A3961B38D201BB3F
82524100E6140AA0A7D28ADA65039C2D88159DF3A7AA52F5D2FCF90D0AA60650
4B02BCBDD8C504512288284CB23088EA0C63F18569FACFFE92007727BCB47E4B
9E5A9385F4753B9091530EB5D6009AD690DD28519C2813B66B5A1CB9B908C075
0762B139042EEE412CF01D51BF0789F04F4064C1712C36EEAE275119787A350B
C79A64C0609B2209958E5E633C4FF9DE36A0B07610D1D97EA8523448D56AB122
2D8D642E8EC98FA3D0E79442AD31E289250F15CD32C0D942058ACE0EA7ABD236
C1D19C8E7D973F93D521804B4A4649624292CFF3151B0AEAF1F8E26654B6CA00
C76DA53BFF68DFB6CCDC9DB037ADC5FE2BA3C4F41AE009804BCC03F8047E787D
C8DE5E8547751538619501F62674AF5A5F525350D9AD1A68CCC5018B8BE4AA5F
324060E57EEE041CC4A40026A6C3CBAE07A8BA2B03061A5141F1F4BDBD752FF4
AF5ACB70E8928D24FC1931B20B00736312ACA010F42760EB79839ACE05AF3070
2BC5A6CBDA6A9AF10DA1DCFC1008F649999704228508669605331E86776C06D3
939189EA0E6453F31F0367D49AD55DF1F0246D32B713402F3125C04C45C8BD43
98188F89D15032405E72F8781B0E2E5A0BCEAE7C8E99784F97551FC627B70BDF
BEFCE2E3117E4AE031625809CB9EEBF8F0D7627A77BFE0D4D8D88855A9440022
1C27DB71FABF55E352ED373075032024CD24170000000049454E44AE426082}
PictureName = 'ShareFolder'
end
object gcMenuShareWebcam: TX2GraphicContainerItem
Picture.Data = {
0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000001000
00001008060000001FF3FF61000002C14944415478DABD935D48935118C7FF9B
DB9CD38913155CB586D008C30F9A95A8217927A14157DE441FE88521A4828108
0A8992621745A80C477AB3A048D44A08A18589BA959AE0D4A09CBAE936F7E55E
759B7BDFB91EDF20E82E283A70381CCE797EFFE739E7FF08F09743F04F00D5D5
BA94C4C4E47A954AA171BB0F6452292B92CB25C24824088E63A32C1BE658F630
B2BFBF175E5B5B5B0F0643AF8DC6E79F7F011A1B87DE3435555C0D8582181F37
637BFB3BEAEA6ED28918BBBB3EC4C589F8AB1C071C1C846136CFC52626DE0D8D
8E0EDEE6011D1D2F772A2B0BD2392E0A936915878711C46231088502582C6FB1
B4B44CC0079899998048C48132A1A8D42D9DAEEB240F686919F017179F4D6118
8ED4BD9048E22016FF9C16CB14525353A056E7C26AB5109C4166A692A0566F6F
EFC3341ED0DDFDC25759A9552C2CAC8061F6715C7B2C968868D405AD36076EB7
874A0990BA020A453A8145181B1BF1F7F575A7F280F6F621574D4D4586DDEE81
D7CBC066B3D2EA446E6E16BABA9E906A0C39392AE4E79F874A758E32946078F8
95BBBFBF278307B4B50D6CD6D65E3FB5B9E982CFC7606BCB4EEA3EACAE2E2110
5042A3C9C6E4A40EA5A525042A444282140683C1A6D33D56F180E6E6A75F1B1A
6E683636B649790F3B3B0E04832EACAF7F83D13887B4B44CC8E52C0A0B8B9097
7701F1F1F1D0EBF52B7A7D6F360FA8AFEFFAD4DA7AB7C06ADD86C7B34BC10C1C
0E3BA4D2E35F311F7B014AE50994945C21F544242727D1BB3D9A32189E5DE601
55558D239D9DF7AE310C4BEA7EAA5100A7D3857098A1E010EDC5C8CA3A43CA32
BACD61717131363030747F76F6430F0F282FBF73A9ACACE47D51915666B3B9C8
386421B11432593C418294CD163DAC2DE2743AE697972DC66834326A327D34FD
D60BE5E5B72EAAD5A7079392E41AB2AE9BCC6275B91CCB3E5FE08B40C0CE1F1D
F917A6A767427FD24C429A47FFAD1B7F00ED1B51200D4AE2740000000049454E
44AE426082}
PictureName = 'ShareWebcam'
end
object gcMenuShareWebcamVideo: TX2GraphicContainerItem
Picture.Data = {
0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000001000
00001008060000001FF3FF61000002EA4944415478DAA5935D48935118C7FFF3
DDAB6BCEF9FDED44DC4CA15E8761412A1296A121285ED595DD7521298C125341
E9622B584CE6BCF122454891AE9424432B3FC8A4FC203F32D1E9FCAA95D36DCD
B5BDAF7BB78E2B040BA2E8DC9CAFE7FC9EE7FCCFF90BF09F4DF0EB82CFE713E8
F5FA149AA6198FC7C3884422262C2C8C118BC5A91CC7EDBBDDAE75ABD5BAC4B2
9C4EA5524D1E03747777574B2492A688888830D2432A952238580C9AA6C82E8F
830316DBDB7632077A7B7B5FD7D737E41C017A7A7A8A939393FB188611DA6C36
2426268265DDB05A2D9899716373D30BA39187CD7608FA86ADCD06D7E0D0A0D8
0F50ABD585342D7CEA703828A55289E8E818242424203C5C82AE2E0789909183
FB70BB59389D2E02F66274F4BA6361615CEA075455DD1C11894EE43FEC7C8C2B
C59791794A8EA2A26212ECC4F47436380EE430878D8D31D8ED6FC93A199BDEAC
4FCD0CA4F801776A6B9D731F56C553CB1C3EED72A82C4FC2A5C2622814C99898
9061656519F3F3F7B1B7B785A8A818040444212DEDCCAC56AB52FA013535B7ED
E65D56FA688405EF0DC5D59CAF60329290937B0E7373720C0CA840511C76763E
FB01F1F1371014343B6B3034FE005456560E9D4C935FACD6AF03541CCAB35791
9A1082D34C3A9697F33035A5267A444128CC464848162C163BD1A97FB2B5557D
F667053525F0F17D2C1527E81B36212B6E1D79F917E0724988FAB9100804F078
78A2C5A1802EA2831B1919CFFB753A6DC9D133D6D5D5DD22719AF434B9D0E9E2
488981E4B942313C1C47EECCC3EBF591B9070E871B4AA58FC09E7536371B2A8E
7DA4F6F6F677A5A5A59966B39964B1C164B2A0A34388C04090CC3C2223BD2828
A0C978D16B327D2CD56A1F3C3906D0E974E3656565E7799EF7976DB57E415BDB
26C46211C94A932A8CBEA5A5B5171415D8A8D1685EFDE605F2A1AE51146590C9
64110A8582F8C2EBBFF7E2E27B9FD1B8F6322040D8A4D1DC1BFBA39988418288
894A481515B1B1B185168BE51531D8DD969696D1BF72E3BFB6EF2C065120000A
A5C30000000049454E44AE426082}
PictureName = 'ShareWebcamVideo'
end
end end
object glMenu: TX2GraphicList object glMenu: TX2GraphicList
Container = gcMenu Container = gcMenu
@ -511,5 +497,10 @@ object frmMain: TfrmMain
ImageIndex = 1 ImageIndex = 1
OnExecute = actTestExecute OnExecute = actTestExecute
end end
object actTest2: TAction
Caption = 'Group without items'
ImageIndex = 3
OnExecute = actTest2Execute
end
end end
end end

View File

@ -11,8 +11,8 @@ uses
StdCtrls, StdCtrls,
XPMan, XPMan,
JvExMask, // JvExMask,
JvSpin, // JvSpin,
PNGImage, PNGImage,
X2CLGraphicList, X2CLGraphicList,
X2CLMenuBar, X2CLMenuBar,
@ -28,7 +28,6 @@ type
rbmusikCube: TRadioButton; rbmusikCube: TRadioButton;
rbSliding: TRadioButton; rbSliding: TRadioButton;
lblAnimationTime: TLabel; lblAnimationTime: TLabel;
seAnimationTime: TJvSpinEdit;
Panel1: TPanel; Panel1: TPanel;
Panel2: TPanel; Panel2: TPanel;
rbNoAnimation: TRadioButton; rbNoAnimation: TRadioButton;
@ -53,6 +52,7 @@ type
mbTest: TX2MenuBar; mbTest: TX2MenuBar;
alMenu: TActionList; alMenu: TActionList;
actTest: TAction; actTest: TAction;
actTest2: TAction;
procedure mbTestSelectedChanging(Sender: TObject; Item, procedure mbTestSelectedChanging(Sender: TObject; Item,
NewItem: TX2CustomMenuBarItem; var Allowed: Boolean); NewItem: TX2CustomMenuBarItem; var Allowed: Boolean);
procedure mbTestSelectedChanged(Sender: TObject; procedure mbTestSelectedChanged(Sender: TObject;
@ -73,6 +73,7 @@ type
procedure AnimationClick(Sender: TObject); procedure AnimationClick(Sender: TObject);
procedure seAnimationTimeChange(Sender: TObject); procedure seAnimationTimeChange(Sender: TObject);
procedure actTestExecute(Sender: TObject); procedure actTestExecute(Sender: TObject);
procedure actTest2Execute(Sender: TObject);
procedure FormClick(Sender: TObject); procedure FormClick(Sender: TObject);
private private
procedure Event(const AMsg: String); procedure Event(const AMsg: String);
@ -82,7 +83,7 @@ implementation
uses uses
Dialogs, Dialogs,
X2UtHandCursor; Windows;
{$R *.dfm} {$R *.dfm}
@ -165,6 +166,8 @@ begin
chkAllowCollapseAll.Checked := mbTest.AllowCollapseAll; chkAllowCollapseAll.Checked := mbTest.AllowCollapseAll;
chkScrollbar.Checked := mbTest.Scrollbar; chkScrollbar.Checked := mbTest.Scrollbar;
chkHideScrollbar.Checked := mbTest.HideScrollbar; chkHideScrollbar.Checked := mbTest.HideScrollbar;
rbUnameIT.Checked := True;
end; end;
procedure TfrmMain.mbTestCollapsed(Sender: TObject; Group: TX2MenuBarGroup); procedure TfrmMain.mbTestCollapsed(Sender: TObject; Group: TX2MenuBarGroup);
@ -229,7 +232,12 @@ end;
procedure TfrmMain.seAnimationTimeChange(Sender: TObject); procedure TfrmMain.seAnimationTimeChange(Sender: TObject);
begin begin
mbTest.AnimationTime := seAnimationTime.AsInteger; // mbTest.AnimationTime := seAnimationTime.AsInteger;
end;
procedure TfrmMain.actTest2Execute(Sender: TObject);
begin
Sleep(200);
end; end;
procedure TfrmMain.FormClick(Sender: TObject); procedure TfrmMain.FormClick(Sender: TObject);

View File

@ -31,12 +31,12 @@
-M -M
-$M16384,1048576 -$M16384,1048576
-K$00400000 -K$00400000
-LE"C:\Documents and Settings\PsychoMark\My Documents\Borland Studio Projects\Bpl" -LE"c:\program files\borland\delphi7\Projects\Bpl"
-LN"C:\Documents and Settings\PsychoMark\My Documents\Borland Studio Projects\Bpl" -LN"c:\program files\borland\delphi7\Projects\Bpl"
-U"..\..\Source" -U"P:\Algemeen\Indy10;P:\Algemeen\Indy10\Core;P:\Algemeen\Indy10\Protocols;P:\Algemeen\Indy10\SuperCore;P:\Algemeen\Indy10\System"
-O"..\..\Source" -O"P:\Algemeen\Indy10;P:\Algemeen\Indy10\Core;P:\Algemeen\Indy10\Protocols;P:\Algemeen\Indy10\SuperCore;P:\Algemeen\Indy10\System"
-I"..\..\Source" -I"P:\Algemeen\Indy10;P:\Algemeen\Indy10\Core;P:\Algemeen\Indy10\Protocols;P:\Algemeen\Indy10\SuperCore;P:\Algemeen\Indy10\System"
-R"..\..\Source" -R"P:\Algemeen\Indy10;P:\Algemeen\Indy10\Core;P:\Algemeen\Indy10\Protocols;P:\Algemeen\Indy10\SuperCore;P:\Algemeen\Indy10\System"
-w-UNSAFE_TYPE -w-UNSAFE_TYPE
-w-UNSAFE_CODE -w-UNSAFE_CODE
-w-UNSAFE_CAST -w-UNSAFE_CAST

View File

@ -4,7 +4,11 @@ uses
Forms, Forms,
MainForm in 'MainForm.pas' {frmMain}, MainForm in 'MainForm.pas' {frmMain},
X2CLMenuBarAnimators in '..\..\Source\X2CLMenuBarAnimators.pas', X2CLMenuBarAnimators in '..\..\Source\X2CLMenuBarAnimators.pas',
X2CLGraphics in '..\..\Source\X2CLGraphics.pas'; X2CLGraphics in '..\..\Source\X2CLGraphics.pas',
X2CLunaMenuBarPainter in '..\..\Source\X2CLunaMenuBarPainter.pas',
X2CLMenuBar in '..\..\Source\X2CLMenuBar.pas',
X2CLmusikCubeMenuBarPainter in '..\..\Source\X2CLmusikCubeMenuBarPainter.pas',
X2CLMenuBarActions in '..\..\Source\X2CLMenuBarActions.pas';
{$R *.res} {$R *.res}