Componentes.Terceros.DevExp.../official/x.48/ExpressPrinting System 4/Sources/dxPSHFToolBarBld.pas
2010-01-18 18:33:24 +00:00

235 lines
8.8 KiB
ObjectPascal

{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressPrinting System COMPONENT SUITE }
{ }
{ Copyright (C) 1998-2009 Developer Express Inc. }
{ ALL RIGHTS RESERVED }
{ }
{ The entire contents of this file is protected by U.S. and }
{ International Copyright Laws. Unauthorized reproduction, }
{ reverse-engineering, and distribution of all or any portion of }
{ the code contained in this file is strictly prohibited and may }
{ result in severe civil and criminal penalties and will be }
{ prosecuted to the maximum extent possible under the law. }
{ }
{ RESTRICTIONS }
{ }
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
{ LICENSED TO DISTRIBUTE THE EXPRESSPRINTINGSYSTEM AND }
{ ALL ACCOMPANYING VCL CONTROLS AS PART OF AN }
{ EXECUTABLE PROGRAM ONLY. }
{ }
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
{ }
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
{ ADDITIONAL RESTRICTIONS. }
{ }
{*******************************************************************}
unit dxPSHFToolBarBld;
interface
{$I cxVer.inc}
uses
Classes, ComCtrls, Controls, ImgList, cxButtons, ExtCtrls;
type
{ TdxPSHFToolBarBuilder }
TdxPSHFToolBarBuilder = class(TObject)
protected
class function CalcButtonOffset(AToolBarPanel: TWinControl): Integer;
class function CalcMenuButtonWidth(AIncludeAutoTextEntries: Boolean): Integer;
class procedure CalcViewInfo(AToolBarPanel: TWinControl;
AMenuButtonWidth: Integer; var ASummaryWidth, AMaxButtonCount: Integer);
class procedure CreateAutoTextMenuButton(AToolBarPanel: TWinControl;
AMenuButtonWidth: Integer; AAutoHFTextEntries: TStrings;
AAutoTextEntriesClickEvent: TNotifyEvent);
class function CreateButton(AToolBarPanel: TWinControl;
AWidth, ATag: Integer; AClickEvent: TNotifyEvent): TcxButton;
class function GetAutoTextButtonCaption: string;
class procedure RemoveAllButtons(AToolBarPanel: TWinControl);
public
class procedure Build(AToolBarPanel: TWinControl; AImageList: TCustomImageList;
AIncludeAutoTextEntries: Boolean; AFunctionList, AAutoHFTextEntries: TStrings;
AButtonClickEvent, AAutoTextEntriesClickEvent: TNotifyEvent; ACenteringToolbar: Boolean);
class procedure ShowAutoHFTextEntriesPopup(Sender: TObject);
end;
implementation
uses
Windows, Buttons, Menus, Graphics, SysUtils, cxClasses, dxPSGlBl, dxPSUtl,
dxPgSDlg, dxPSRes, dxPSPopupMan, Types, cxControls, dxPSHFLibrary;
const
ToolBarButtonOffset = 3;
ToolBarButtonWidth = 26;
var
FDropDownGlyph: TBitmap;
class procedure TdxPSHFToolBarBuilder.Build(AToolBarPanel: TWinControl;
AImageList: TCustomImageList; AIncludeAutoTextEntries: Boolean;
AFunctionList, AAutoHFTextEntries: TStrings; AButtonClickEvent: TNotifyEvent;
AAutoTextEntriesClickEvent: TNotifyEvent; ACenteringToolbar: Boolean);
var
AButton: TcxButton;
AFunction: TdxHFCustomFunction;
I, ASummaryWidth, AMaxButtonCount, AMenuButtonWidth: Integer;
begin
RemoveAllButtons(AToolBarPanel);
AMenuButtonWidth := CalcMenuButtonWidth(AIncludeAutoTextEntries);
if AIncludeAutoTextEntries then
begin
CreateAutoTextMenuButton(AToolBarPanel, AMenuButtonWidth,
AAutoHFTextEntries, AAutoTextEntriesClickEvent);
end;
if AFunctionList.Count > 0 then
begin
AMaxButtonCount := AFunctionList.Count;
CalcViewInfo(AToolBarPanel, AMenuButtonWidth, ASummaryWidth, AMaxButtonCount);
AToolBarPanel.Width := ASummaryWidth;
if ACenteringToolbar then
AToolBarPanel.Left := (AToolBarPanel.Parent.Width - ASummaryWidth) div 2;
for I := 0 to AMaxButtonCount - 1 do
begin
AFunction := TdxHFCustomFunction(AFunctionList.Objects[I]);
AButton := CreateButton(AToolBarPanel, ToolBarButtonWidth, MakeTTag(I), AButtonClickEvent);
AButton.Glyph := AFunction.Glyph;
AButton.Hint := AFunction.Hint;
end;
end;
AToolBarPanel.Visible := AToolBarPanel.ControlCount > 0;
end;
class function TdxPSHFToolBarBuilder.CalcButtonOffset(AToolBarPanel: TWinControl): Integer;
begin
if AToolBarPanel.ControlCount > 0 then
Result := AToolBarPanel.Controls[AToolBarPanel.ControlCount - 1].BoundsRect.Right + ToolBarButtonOffset
else
Result := 0;
end;
class function TdxPSHFToolBarBuilder.CalcMenuButtonWidth(
AIncludeAutoTextEntries: Boolean): Integer;
var
ACaption: string;
ATextSize: TSize;
DC: HDC;
begin
Result := 0;
if AIncludeAutoTextEntries then
begin
DC := GetDC(0);
try
ACaption := GetAutoTextButtonCaption;
GetTextExtentPoint32(DC, PChar(ACaption), Length(ACaption), ATextSize);
Result := ATextSize.cx{ + 16};
finally
ReleaseDC(0, DC);
end;
end;
end;
class procedure TdxPSHFToolBarBuilder.CalcViewInfo(AToolBarPanel: TWinControl;
AMenuButtonWidth: Integer; var ASummaryWidth, AMaxButtonCount: Integer);
var
AButtonWidth: Integer;
begin
AButtonWidth := ToolBarButtonWidth + ToolBarButtonOffset;
AMaxButtonCount := Min(AMaxButtonCount,
(AToolBarPanel.Parent.Width - AMenuButtonWidth) div AButtonWidth);
ASummaryWidth := AMenuButtonWidth + AButtonWidth * AMaxButtonCount;
end;
class procedure TdxPSHFToolBarBuilder.CreateAutoTextMenuButton(
AToolBarPanel: TWinControl; AMenuButtonWidth: Integer; AAutoHFTextEntries: TStrings;
AAutoTextEntriesClickEvent: TNotifyEvent);
var
AAutoHFTextEntriesPopup: TPopupMenu;
AButton: TcxButton;
AMenuItem: TMenuItem;
I: Integer;
begin
AAutoHFTextEntriesPopup := TPopupMenu.Create(AToolBarPanel);
AAutoHFTextEntriesPopup.AutoHotkeys := maManual;
AButton := CreateButton(AToolBarPanel, AMenuButtonWidth,
MakeTTag(AAutoHFTextEntriesPopup), ShowAutoHFTextEntriesPopup);
AButton.Caption := GetAutoTextButtonCaption;
AButton.Glyph := FDropDownGlyph;
if Assigned(AAutoHFTextEntries) then
begin
for I := 0 to AAutoHFTextEntries.Count - 1 do
begin
AMenuItem := TMenuItem.Create(AToolBarPanel);
AMenuItem.Caption := AAutoHFTextEntries[I];
AMenuItem.Tag := MakeTTag(I);
AMenuItem.OnClick := AAutoTextEntriesClickEvent;
AAutoHFTextEntriesPopup.Items.Add(AMenuItem);
end;
end;
end;
class function TdxPSHFToolBarBuilder.CreateButton(AToolBarPanel: TWinControl;
AWidth, ATag: Integer; AClickEvent: TNotifyEvent): TcxButton;
var
AOffset: Integer;
begin
AOffset := CalcButtonOffset(AToolBarPanel);
Result := TcxButton.Create(AToolBarPanel);
Result.Tag := ATag;
Result.Parent := AToolBarPanel;
Result.Layout := blGlyphRight;
Result.OnClick := AClickEvent;
Result.CanBeFocused := False;
Result.SetBounds(AOffset, 0, AWidth, AToolBarPanel.Height);
end;
class function TdxPSHFToolBarBuilder.GetAutoTextButtonCaption: string;
begin
Result := cxGetResourceString(@sdxMenuInsertAutoTextEntriesSubItem);
end;
class procedure TdxPSHFToolBarBuilder.ShowAutoHFTextEntriesPopup(Sender: TObject);
var
AButton: TControl;
begin
AButton := TControl(Sender);
if TTagToObj(AButton.Tag) is TPopupMenu then
begin
with GetMouseCursorPos do
dxPSPopupMenuController.ShowPopup(X, Y, AButton, TTagToObj(AButton.Tag) as TPopupMenu);
end;
end;
class procedure TdxPSHFToolBarBuilder.RemoveAllButtons(AToolBarPanel: TWinControl);
begin
while AToolBarPanel.ControlCount > 0 do
AToolBarPanel.Controls[0].Free;
end;
initialization
FDropDownGlyph := CreateArrowBitmap(udgDown, 12);
finalization
FreeAndNil(FDropDownGlyph);
end.