{*******************************************************************} { } { 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.