Componentes.Terceros.DevExp.../internal/x.46/2/ExpressBars 6/Sources/dxBarPopupMenuEd.pas

247 lines
7.8 KiB
ObjectPascal

{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressBars popupmenu editor }
{ }
{ 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 EXPRESSBARS 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 dxBarPopupMenuEd;
{$I cxVer.inc}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, dxBar;
type
TdxBarSubMenuEditor = class(TForm)
procedure FormDestroy(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
FItemLinks: TdxBarItemLinks;
FItemLinksOwner: TComponent;
FSubMenuWidth: Integer;
procedure CorrectBounds;
function GetSubMenuControl: TdxBarSubMenuControl;
procedure SetItemLinks(Value: TdxBarItemLinks);
procedure WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
procedure WMMove(var Message: TWMMove); message WM_MOVE;
procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure DoShow; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
property SubMenuControl: TdxBarSubMenuControl read GetSubMenuControl;
public
constructor Create(AOwner: TComponent); override;
procedure Release;
property ItemLinks: TdxBarItemLinks read FItemLinks write SetItemLinks;
end;
procedure ShowdxBarSubMenuEditor(AItemLinks: TdxBarItemLinks);
function dxBarSubMenuEditor: TdxBarSubMenuEditor;
implementation
{$R *.DFM}
uses
dxBarCustomCustomizationForm, dxBarStrs, cxClasses, Math;
var
FdxBarSubMenuEditor: TdxBarSubMenuEditor;
procedure ShowdxBarSubMenuEditor(AItemLinks: TdxBarItemLinks);
begin
AItemLinks.BarManager.Customizing(True);
if AItemLinks.BarManager.IsCustomizing then
dxBarCustomizingForm.SwitchToItemsPage;
if FdxBarSubMenuEditor = nil then
FdxBarSubMenuEditor := TdxBarSubMenuEditor.Create(nil);
with FdxBarSubMenuEditor do
begin
ClientHeight := 0;
ItemLinks := AItemLinks;
ProcessMouseMessages;
Show;
end;
end;
function dxBarSubMenuEditor: TdxBarSubMenuEditor;
begin
Result := FdxBarSubMenuEditor;
end;
{ TdxBarSubMenuEditor }
constructor TdxBarSubMenuEditor.Create(AOwner: TComponent);
begin
inherited;
Caption := cxGetResourceString(@dxSBAR_SUBMENUEDITORCAPTION);
end;
procedure TdxBarSubMenuEditor.Release;
begin
if not (csDestroying in ComponentState) then
if HandleAllocated then
inherited Release
else
Free;
end;
procedure TdxBarSubMenuEditor.CorrectBounds;
var
ARect: TRect;
begin
ARect := Screen.MonitorFromPoint(Point(Left, Top)).WorkareaRect;
Left := Max(Left, ARect.Left);
Top := Max(Top, ARect.Top);
end;
function TdxBarSubMenuEditor.GetSubMenuControl: TdxBarSubMenuControl;
begin
if ItemLinks <> nil then
Result := TdxBarSubMenuControl(ItemLinks.BarControl)
else
Result := nil;
end;
procedure TdxBarSubMenuEditor.SetItemLinks(Value: TdxBarItemLinks);
begin
if FItemLinks <> Value then
begin
FItemLinks := Value;
if FItemLinks = nil then
Release
else
begin
FItemLinksOwner := FItemLinks.Owner;
FItemLinksOwner.FreeNotification(Self);
end;
end;
end;
procedure TdxBarSubMenuEditor.WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo);
begin
with Message.MinMaxInfo^ do
begin
ptMaxSize.Y := Height;
ptMinTrackSize.Y := Height;
ptMaxTrackSize.Y := Height;
if SubMenuControl <> nil then
FSubMenuWidth := SubMenuControl.Width;
ptMaxSize.X := FSubMenuWidth;
ptMinTrackSize.X := FSubMenuWidth;
ptMaxTrackSize.X := FSubMenuWidth;
end;
end;
procedure TdxBarSubMenuEditor.WMMove(var Message: TWMMove);
begin
inherited;
if SubMenuControl <> nil then
SetWindowPos(SubMenuControl.Handle, 0, Left, Top + Height, 0, 0,
SWP_NOZORDER or SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
end;
procedure TdxBarSubMenuEditor.WMNCLButtonDown(var Message: TWMNCLButtonDown);
begin
inherited;
if Message.Hittest <> HTCLOSE then Activate
else
if SubMenuControl <> nil then
SubMenuControl.Hide;
end;
procedure TdxBarSubMenuEditor.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params do
begin
Style := WS_POPUP or WS_CLIPSIBLINGS or WS_SYSMENU or WS_CAPTION;
ExStyle := WS_EX_DLGMODALFRAME or WS_EX_WINDOWEDGE;
WindowClass.Style := CS_OWNDC or CS_SAVEBITS;
WndParent := GetParent(dxBarCustomizingForm.Handle);
end;
end;
procedure TdxBarSubMenuEditor.DoShow;
begin
inherited;
CorrectBounds;
end;
procedure TdxBarSubMenuEditor.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if (Operation = opRemove) and (AComponent = FItemLinksOwner) then
ItemLinks := nil;
end;
procedure TdxBarSubMenuEditor.FormDestroy(Sender: TObject);
begin
if SubMenuControl <> nil then
SubMenuControl.Hide;
FdxBarSubMenuEditor := nil;
end;
type
TdxBarManagerAccess = class(TdxBarManager);
procedure TdxBarSubMenuEditor.FormActivate(Sender: TObject);
var
AErrorText: string;
begin
with TdxBarManagerAccess(ItemLinks.BarManager) do
if Dragging and not ItemLinks.CanContainItem(DraggingItem, AErrorText) then Exit;
if SubMenuControl = nil then
begin
ItemLinks.CreateBarControl;
SubMenuControl.Left := Left;
SubMenuControl.Top := Top + Height;
SubMenuControl.OwnerHeight := Height;
SubMenuControl.Show;
end;
Width := SubMenuControl.Width;
end;
procedure TdxBarSubMenuEditor.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;
end.