mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-23 04:59:55 +02:00
263 lines
7.2 KiB
ObjectPascal
263 lines
7.2 KiB
ObjectPascal
{ $Id$}
|
|
{
|
|
*****************************************************************************
|
|
* WSMenus.pp *
|
|
* ---------- *
|
|
* *
|
|
* *
|
|
*****************************************************************************
|
|
|
|
*****************************************************************************
|
|
This file is part of the Lazarus Component Library (LCL)
|
|
|
|
See the file COPYING.modifiedLGPL.txt, included in this distribution,
|
|
for details about the license.
|
|
*****************************************************************************
|
|
}
|
|
unit WSMenus;
|
|
|
|
{$mode objfpc}{$H+}
|
|
{$I lcl_defines.inc}
|
|
|
|
interface
|
|
////////////////////////////////////////////////////
|
|
// I M P O R T A N T
|
|
////////////////////////////////////////////////////
|
|
// 1) Only class methods allowed
|
|
// 2) Class methods have to be published and virtual
|
|
// 3) To get as little as posible circles, the uses
|
|
// clause should contain only those LCL units
|
|
// needed for registration. WSxxx units are OK
|
|
// 4) To improve speed, register only classes in the
|
|
// initialization section which actually
|
|
// implement something
|
|
// 5) To enable your XXX widgetset units, look at
|
|
// the uses clause of the XXXintf.pp
|
|
////////////////////////////////////////////////////
|
|
uses
|
|
Classes,
|
|
////////////////////////////////////////////////////
|
|
// To get as little as posible circles,
|
|
// uncomment only when needed for registration
|
|
////////////////////////////////////////////////////
|
|
Menus, Graphics,
|
|
////////////////////////////////////////////////////
|
|
WSLCLClasses, LCLType, LCLProc, WSFactory;
|
|
|
|
type
|
|
{ TWSMenuItem }
|
|
|
|
TWSMenuItem = class(TWSLCLComponent)
|
|
published
|
|
class function OpenCommand: LongInt; virtual;
|
|
class procedure CloseCommand(ACommand: LongInt); virtual;
|
|
class procedure AttachMenu(const AMenuItem: TMenuItem); virtual;
|
|
class function CreateHandle(const AMenuItem: TMenuItem): HMENU; virtual;
|
|
class procedure DestroyHandle(const AMenuItem: TMenuItem); virtual;
|
|
class procedure SetCaption(const AMenuItem: TMenuItem; const ACaption: string); virtual;
|
|
class procedure SetShortCut(const AMenuItem: TMenuItem; const ShortCutK1, ShortCutK2: TShortCut); virtual;
|
|
class procedure SetVisible(const AMenuItem: TMenuItem; const Visible: boolean); virtual;
|
|
class function SetCheck(const AMenuItem: TMenuItem; const Checked: boolean): boolean; virtual;
|
|
class function SetEnable(const AMenuItem: TMenuItem; const Enabled: boolean): boolean; virtual;
|
|
class function SetRadioItem(const AMenuItem: TMenuItem; const RadioItem: boolean): boolean; virtual;
|
|
class function SetRightJustify(const AMenuItem: TMenuItem; const Justified: boolean): boolean; virtual;
|
|
class procedure UpdateMenuIcon(const AMenuItem: TMenuItem; const HasIcon: Boolean; const AIcon: TBitmap); virtual;
|
|
end;
|
|
TWSMenuItemClass = class of TWSMenuItem;
|
|
|
|
{ TWSMenu }
|
|
|
|
TWSMenuClass = class of TWSMenu;
|
|
TWSMenu = class(TWSLCLComponent)
|
|
published
|
|
class function CreateHandle(const AMenu: TMenu): HMENU; virtual;
|
|
|
|
class procedure SetBiDiMode(const AMenu: TMenu; UseRightToLeftAlign, UseRightToLeftReading : Boolean); virtual;
|
|
end;
|
|
|
|
{ TWSMainMenu }
|
|
|
|
TWSMainMenu = class(TWSMenu)
|
|
published
|
|
end;
|
|
|
|
{ TWSPopupMenu }
|
|
|
|
TWSPopupMenu = class(TWSMenu)
|
|
published
|
|
class procedure Popup(const APopupMenu: TPopupMenu; const X, Y: integer); virtual;
|
|
end;
|
|
TWSPopupMenuClass = class of TWSPopupMenu;
|
|
|
|
function WSCheckMenuItem(const AMenuItem: TMenuItem;
|
|
const AProcName: String): Boolean;
|
|
|
|
{ WidgetSetRegistration }
|
|
|
|
procedure RegisterMenuItem;
|
|
procedure RegisterMenu;
|
|
procedure RegisterMainMenu;
|
|
procedure RegisterPopupMenu;
|
|
|
|
implementation
|
|
|
|
{ Menu command management }
|
|
|
|
var
|
|
CommandPool: TBits = nil;
|
|
|
|
function UniqueCommand: LongInt;
|
|
begin
|
|
if CommandPool = nil then
|
|
CommandPool := TBits.Create(16);
|
|
Result := CommandPool.OpenBit;
|
|
CommandPool[Result] := True;
|
|
end;
|
|
|
|
{ TWSMenuItem }
|
|
|
|
class function TWSMenuItem.OpenCommand: LongInt;
|
|
begin
|
|
Result := UniqueCommand;
|
|
end;
|
|
|
|
class procedure TWSMenuItem.CloseCommand(ACommand: LongInt);
|
|
begin
|
|
CommandPool[ACommand] := False;
|
|
end;
|
|
|
|
class procedure TWSMenuItem.AttachMenu(const AMenuItem: TMenuItem);
|
|
begin
|
|
end;
|
|
|
|
class function TWSMenuItem.CreateHandle(const AMenuItem: TMenuItem): HMENU;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
class procedure TWSMenuItem.DestroyHandle(const AMenuItem: TMenuItem);
|
|
begin
|
|
end;
|
|
|
|
class procedure TWSMenuItem.SetCaption(const AMenuItem: TMenuItem; const ACaption: string);
|
|
begin
|
|
end;
|
|
|
|
class procedure TWSMenuItem.SetShortCut(const AMenuItem: TMenuItem; const ShortCutK1, ShortCutK2: TShortCut);
|
|
begin
|
|
end;
|
|
|
|
class procedure TWSMenuItem.SetVisible(const AMenuItem: TMenuItem; const Visible: boolean);
|
|
begin
|
|
end;
|
|
|
|
class function TWSMenuItem.SetCheck(const AMenuItem: TMenuItem; const Checked: boolean): boolean;
|
|
begin
|
|
Result := false;
|
|
end;
|
|
|
|
class function TWSMenuItem.SetEnable(const AMenuItem: TMenuItem; const Enabled: boolean): boolean;
|
|
begin
|
|
Result := false;
|
|
end;
|
|
|
|
class function TWSMenuItem.SetRadioItem(const AMenuItem: TMenuItem; const RadioItem: boolean): boolean;
|
|
begin
|
|
Result := false;
|
|
end;
|
|
|
|
class function TWSMenuItem.SetRightJustify(const AMenuItem: TMenuItem; const Justified: boolean): boolean;
|
|
begin
|
|
Result := false;
|
|
end;
|
|
|
|
class procedure TWSMenuItem.UpdateMenuIcon(const AMenuItem: TMenuItem; const HasIcon: Boolean; const AIcon: TBitmap);
|
|
begin
|
|
// emulate old behaviour
|
|
AMenuItem.RecreateHandle;
|
|
end;
|
|
|
|
|
|
|
|
{ TWSMenu }
|
|
|
|
class function TWSMenu.CreateHandle(const AMenu: TMenu): HMENU;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
class procedure TWSMenu.SetBiDiMode(const AMenu : TMenu; UseRightToLeftAlign,
|
|
UseRightToLeftReading : Boolean);
|
|
begin
|
|
end;
|
|
|
|
|
|
{ TWSPopupMenu }
|
|
|
|
class procedure TWSPopupMenu.Popup(const APopupMenu: TPopupMenu; const X, Y: integer);
|
|
begin
|
|
end;
|
|
|
|
function WSCheckMenuItem(const AMenuItem: TMenuItem;
|
|
const AProcName: String): Boolean;
|
|
|
|
procedure Warn;
|
|
begin
|
|
DebugLn('[WARNING] %s called without handle for %s(%s)', [AProcName, AMenuItem.Name, AMenuItem.ClassName]);
|
|
end;
|
|
begin
|
|
Result := AMenuItem.HandleAllocated;
|
|
if Result then Exit;
|
|
Warn;
|
|
end;
|
|
|
|
{ WidgetSetRegistration }
|
|
|
|
procedure RegisterMenuItem;
|
|
const
|
|
Done: Boolean = False;
|
|
begin
|
|
if Done then exit;
|
|
WSRegisterMenuItem;
|
|
// if not WSRegisterMenuItem then
|
|
// RegisterWSComponent(TMenuItem, TWSMenuItem);
|
|
Done := True;
|
|
end;
|
|
|
|
procedure RegisterMenu;
|
|
const
|
|
Done: Boolean = False;
|
|
begin
|
|
if Done then exit;
|
|
WSRegisterMenu;
|
|
// if not WSRegisterMenu then
|
|
// RegisterWSComponent(TMenu, TWSMenu);
|
|
Done := True;
|
|
end;
|
|
|
|
procedure RegisterMainMenu;
|
|
const
|
|
Done: Boolean = False;
|
|
begin
|
|
if Done then exit;
|
|
WSRegisterMainMenu;
|
|
// if not WSRegisterMainMenu then
|
|
// RegisterWSComponent(TMainMenu, TWSMainMenu);
|
|
Done := True;
|
|
end;
|
|
|
|
procedure RegisterPopupMenu;
|
|
const
|
|
Done: Boolean = False;
|
|
begin
|
|
if Done then exit;
|
|
WSRegisterPopupMenu;
|
|
// if not WSRegisterPopupMenu then
|
|
// RegisterWSComponent(TPopupMenu, TWSPopupMenu);
|
|
Done := True;
|
|
end;
|
|
|
|
finalization
|
|
FreeThenNil(CommandPool);
|
|
end.
|