1{ $Id: wsmenus.pp 58244 2018-06-13 13:59:07Z juha $} 2{ 3 ***************************************************************************** 4 * WSMenus.pp * 5 * ---------- * 6 * * 7 * * 8 ***************************************************************************** 9 10 ***************************************************************************** 11 This file is part of the Lazarus Component Library (LCL) 12 13 See the file COPYING.modifiedLGPL.txt, included in this distribution, 14 for details about the license. 15 ***************************************************************************** 16} 17unit WSMenus; 18 19{$mode objfpc}{$H+} 20{$I lcl_defines.inc} 21 22interface 23//////////////////////////////////////////////////// 24// I M P O R T A N T 25//////////////////////////////////////////////////// 26// 1) Only class methods allowed 27// 2) Class methods have to be published and virtual 28// 3) To get as little as posible circles, the uses 29// clause should contain only those LCL units 30// needed for registration. WSxxx units are OK 31// 4) To improve speed, register only classes in the 32// initialization section which actually 33// implement something 34// 5) To enable your XXX widgetset units, look at 35// the uses clause of the XXXintf.pp 36//////////////////////////////////////////////////// 37uses 38 Classes, 39//////////////////////////////////////////////////// 40// To get as little as posible circles, 41// uncomment only when needed for registration 42//////////////////////////////////////////////////// 43 Menus, Graphics, 44//////////////////////////////////////////////////// 45 WSLCLClasses, LCLType, WSFactory, 46 LazUtilities, LazLogger; 47 48type 49 { TWSMenuItem } 50 51 TWSMenuItem = class(TWSLCLComponent) 52 published 53 class function OpenCommand: LongInt; virtual; 54 class procedure CloseCommand(ACommand: LongInt); virtual; 55 class procedure AttachMenu(const AMenuItem: TMenuItem); virtual; 56 class function CreateHandle(const AMenuItem: TMenuItem): HMENU; virtual; 57 class procedure DestroyHandle(const AMenuItem: TMenuItem); virtual; 58 class procedure SetCaption(const AMenuItem: TMenuItem; const ACaption: string); virtual; 59 class procedure SetShortCut(const AMenuItem: TMenuItem; const ShortCutK1, ShortCutK2: TShortCut); virtual; 60 class procedure SetVisible(const AMenuItem: TMenuItem; const Visible: boolean); virtual; 61 class function SetCheck(const AMenuItem: TMenuItem; const Checked: boolean): boolean; virtual; 62 class function SetEnable(const AMenuItem: TMenuItem; const Enabled: boolean): boolean; virtual; 63 class function SetRadioItem(const AMenuItem: TMenuItem; const RadioItem: boolean): boolean; virtual; 64 class function SetRightJustify(const AMenuItem: TMenuItem; const Justified: boolean): boolean; virtual; 65 class procedure UpdateMenuIcon(const AMenuItem: TMenuItem; const HasIcon: Boolean; const AIcon: TBitmap); virtual; 66 end; 67 TWSMenuItemClass = class of TWSMenuItem; 68 69 { TWSMenu } 70 71 TWSMenuClass = class of TWSMenu; 72 TWSMenu = class(TWSLCLComponent) 73 published 74 class function CreateHandle(const AMenu: TMenu): HMENU; virtual; 75 76 class procedure SetBiDiMode(const AMenu: TMenu; UseRightToLeftAlign, UseRightToLeftReading : Boolean); virtual; 77 end; 78 79 { TWSMainMenu } 80 81 TWSMainMenu = class(TWSMenu) 82 published 83 end; 84 85 { TWSPopupMenu } 86 87 TWSPopupMenu = class(TWSMenu) 88 published 89 class procedure Popup(const APopupMenu: TPopupMenu; const X, Y: integer); virtual; 90 end; 91 TWSPopupMenuClass = class of TWSPopupMenu; 92 93function WSCheckMenuItem(const AMenuItem: TMenuItem; 94 const AProcName: String): Boolean; 95 96 { WidgetSetRegistration } 97 98 procedure RegisterMenuItem; 99 procedure RegisterMenu; 100 procedure RegisterMainMenu; 101 procedure RegisterPopupMenu; 102 103implementation 104 105{ Menu command management } 106 107var 108 CommandPool: TBits = nil; 109 110function UniqueCommand: LongInt; 111begin 112 if CommandPool = nil then 113 CommandPool := TBits.Create(16); 114 Result := CommandPool.OpenBit; 115 CommandPool[Result] := True; 116end; 117 118{ TWSMenuItem } 119 120class function TWSMenuItem.OpenCommand: LongInt; 121begin 122 Result := UniqueCommand; 123end; 124 125class procedure TWSMenuItem.CloseCommand(ACommand: LongInt); 126begin 127 CommandPool[ACommand] := False; 128end; 129 130class procedure TWSMenuItem.AttachMenu(const AMenuItem: TMenuItem); 131begin 132end; 133 134class function TWSMenuItem.CreateHandle(const AMenuItem: TMenuItem): HMENU; 135begin 136 Result := 0; 137end; 138 139class procedure TWSMenuItem.DestroyHandle(const AMenuItem: TMenuItem); 140begin 141end; 142 143class procedure TWSMenuItem.SetCaption(const AMenuItem: TMenuItem; const ACaption: string); 144begin 145end; 146 147class procedure TWSMenuItem.SetShortCut(const AMenuItem: TMenuItem; const ShortCutK1, ShortCutK2: TShortCut); 148begin 149end; 150 151class procedure TWSMenuItem.SetVisible(const AMenuItem: TMenuItem; const Visible: boolean); 152begin 153end; 154 155class function TWSMenuItem.SetCheck(const AMenuItem: TMenuItem; const Checked: boolean): boolean; 156begin 157 Result := false; 158end; 159 160class function TWSMenuItem.SetEnable(const AMenuItem: TMenuItem; const Enabled: boolean): boolean; 161begin 162 Result := false; 163end; 164 165class function TWSMenuItem.SetRadioItem(const AMenuItem: TMenuItem; const RadioItem: boolean): boolean; 166begin 167 Result := false; 168end; 169 170class function TWSMenuItem.SetRightJustify(const AMenuItem: TMenuItem; const Justified: boolean): boolean; 171begin 172 Result := false; 173end; 174 175class procedure TWSMenuItem.UpdateMenuIcon(const AMenuItem: TMenuItem; const HasIcon: Boolean; const AIcon: TBitmap); 176begin 177 // emulate old behaviour 178 AMenuItem.RecreateHandle; 179end; 180 181 182 183{ TWSMenu } 184 185class function TWSMenu.CreateHandle(const AMenu: TMenu): HMENU; 186begin 187 Result := 0; 188end; 189 190class procedure TWSMenu.SetBiDiMode(const AMenu : TMenu; UseRightToLeftAlign, 191 UseRightToLeftReading : Boolean); 192begin 193end; 194 195 196{ TWSPopupMenu } 197 198class procedure TWSPopupMenu.Popup(const APopupMenu: TPopupMenu; const X, Y: integer); 199begin 200end; 201 202function WSCheckMenuItem(const AMenuItem: TMenuItem; 203 const AProcName: String): Boolean; 204 205 procedure Warn; 206 begin 207 DebugLn('[WARNING] %s called without handle for %s(%s)', [AProcName, AMenuItem.Name, AMenuItem.ClassName]); 208 end; 209begin 210 Result := AMenuItem.HandleAllocated; 211 if Result then Exit; 212 Warn; 213end; 214 215{ WidgetSetRegistration } 216 217procedure RegisterMenuItem; 218const 219 Done: Boolean = False; 220begin 221 if Done then exit; 222 WSRegisterMenuItem; 223// if not WSRegisterMenuItem then 224// RegisterWSComponent(TMenuItem, TWSMenuItem); 225 Done := True; 226end; 227 228procedure RegisterMenu; 229const 230 Done: Boolean = False; 231begin 232 if Done then exit; 233 WSRegisterMenu; 234// if not WSRegisterMenu then 235// RegisterWSComponent(TMenu, TWSMenu); 236 Done := True; 237end; 238 239procedure RegisterMainMenu; 240const 241 Done: Boolean = False; 242begin 243 if Done then exit; 244 WSRegisterMainMenu; 245// if not WSRegisterMainMenu then 246// RegisterWSComponent(TMainMenu, TWSMainMenu); 247 Done := True; 248end; 249 250procedure RegisterPopupMenu; 251const 252 Done: Boolean = False; 253begin 254 if Done then exit; 255 WSRegisterPopupMenu; 256// if not WSRegisterPopupMenu then 257// RegisterWSComponent(TPopupMenu, TWSPopupMenu); 258 Done := True; 259end; 260 261finalization 262 FreeThenNil(CommandPool); 263end. 264