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