Stroika Library 3.0d18
 
Loading...
Searching...
No Matches
Toolbar.h
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#ifndef __Toolbar_h__
5#define __Toolbar_h__ 1
6
7#include "Stroika/Foundation/StroikaPreComp.h"
8
9#include <afxctl.h>
10#include <atlwin.h>
11
12#include "Stroika/Frameworks/Led/IdleManager.h"
13#include "Stroika/Frameworks/Led/Platform/ATL.h"
14#include "Stroika/Frameworks/Led/TextInteractor.h"
15
16#include "ActiveLedItConfig.h"
17#include "Resource.h"
18#include "UserConfigCommands.h"
19
20#include "ActiveLedIt_h.h"
21
22class ATL_NO_VTABLE ActiveLedIt_IconButtonToolbarElement
23 : public CComObjectRootEx<CComSingleThreadModel>,
24 public CComCoClass<ActiveLedIt_IconButtonToolbarElement>,
25 public IDispatchImpl<IALToolbarElement, &IID_IALToolbarElement, &LIBID_ACTIVELEDITLib, qActiveLedIt_MajorVersion, qActiveLedIt_MinorVersion>,
26 public IDispatchImpl<IALIconButtonToolbarElement, &IID_IALIconButtonToolbarElement, &LIBID_ACTIVELEDITLib, qActiveLedIt_MajorVersion, qActiveLedIt_MinorVersion>,
27 public CWindowImpl<ActiveLedIt_IconButtonToolbarElement> {
28public:
29 ActiveLedIt_IconButtonToolbarElement ();
30 virtual ~ActiveLedIt_IconButtonToolbarElement ();
31
32public:
33 DECLARE_NO_REGISTRY ()
34
35public:
36 DECLARE_WND_SUPERCLASS (NULL, _T("Button"))
37 BEGIN_MSG_MAP (ActiveLedIt_IconButtonToolbarElement)
38 MESSAGE_HANDLER (WM_LBUTTONDOWN, OnLButtonDown)
39 MESSAGE_HANDLER (WM_LBUTTONUP, OnLButtonUp)
40 MESSAGE_HANDLER (WM_MOUSEMOVE, OnMouseMove)
41 END_MSG_MAP ()
42 nonvirtual LRESULT OnCreate (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
43 nonvirtual LRESULT OnSetFocus (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
44 nonvirtual LRESULT OnLButtonDown (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
45 nonvirtual LRESULT OnLButtonUp (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
46 nonvirtual LRESULT OnMouseMove (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
47
48public:
49 BEGIN_COM_MAP (ActiveLedIt_IconButtonToolbarElement)
50 COM_INTERFACE_ENTRY (IALIconButtonToolbarElement)
51 COM_INTERFACE_ENTRY2 (IDispatch, IALIconButtonToolbarElement)
52 COM_INTERFACE_ENTRY2 (IALToolbarElement, IALIconButtonToolbarElement)
53 END_COM_MAP ()
54
55public:
56 DECLARE_PROTECT_FINAL_CONSTRUCT ()
57
58 // IALToolbarElement
59public:
60 STDMETHOD (get_PreferredHeight)
61 (UINT* pVal);
62 STDMETHOD (get_PreferredWidth)
63 (UINT* pVal);
64 STDMETHOD (get_X)
65 (INT* pVal);
66 STDMETHOD (get_Y)
67 (INT* pVal);
68 STDMETHOD (get_Width)
69 (UINT* pVal);
70 STDMETHOD (get_Height)
71 (UINT* pVal);
72 STDMETHOD (SetRectangle)
73 (int X, int Y, UINT width, UINT height);
74 STDMETHOD (NotifyOfOwningToolbar)
75 (IDispatch* owningToolbar, IDispatch* owningActiveLedIt);
76 STDMETHOD (UpdateEnableState)
77 ();
78
79 // IALIconButtonToolbarElement
80public:
81 STDMETHOD (get_ButtonImage)
82 (IDispatch** pVal);
83 STDMETHOD (put_ButtonImage)
84 (IDispatch* val);
85 STDMETHOD (get_Command)
86 (VARIANT* pVal);
87 STDMETHOD (put_Command)
88 (VARIANT val);
89 STDMETHOD (get_ButtonStyle)
90 (IconButtonStyle* pVal);
91 STDMETHOD (put_ButtonStyle)
92 (IconButtonStyle val);
93
94public:
95 HRESULT FinalConstruct ();
96 void FinalRelease ();
97
98private:
99 nonvirtual void UpdateButtonObj ();
100 nonvirtual void CheckFixButtonStyle ();
101
102private:
103 HWND fHWnd;
104 bool fPressedOnClick;
105 CComQIPtr<IPicture> fButtonImage;
106 CComVariant fCommand;
107 IconButtonStyle fIconButtonStyle;
108 IDispatch* fOwningToolbar;
109 IDispatch* fOwningActiveLedIt;
110 Led_Rect fBounds;
111};
112
113class ATL_NO_VTABLE ActiveLedIt_ComboBoxToolbarElement
114 : public CComObjectRootEx<CComSingleThreadModel>,
115 public CComCoClass<ActiveLedIt_ComboBoxToolbarElement>,
116 public IDispatchImpl<IALToolbarElement, &IID_IALToolbarElement, &LIBID_ACTIVELEDITLib, qActiveLedIt_MajorVersion, qActiveLedIt_MinorVersion>,
117 public IDispatchImpl<IALComboBoxToolbarElement, &IID_IALComboBoxToolbarElement, &LIBID_ACTIVELEDITLib, qActiveLedIt_MajorVersion, qActiveLedIt_MinorVersion>,
118 public CWindowImpl<ActiveLedIt_ComboBoxToolbarElement> {
119public:
120 ActiveLedIt_ComboBoxToolbarElement ();
121 virtual ~ActiveLedIt_ComboBoxToolbarElement ();
122
123public:
124 DECLARE_NO_REGISTRY ()
125
126public:
127 DECLARE_WND_CLASS (NULL)
128 BEGIN_MSG_MAP (ActiveLedIt_ComboBoxToolbarElement)
129 COMMAND_HANDLER (0, CBN_DROPDOWN, OnCBDropDown)
130 COMMAND_HANDLER (0, CBN_CLOSEUP, OnCBCloseUp)
131 COMMAND_HANDLER (0, CBN_SELCHANGE, OnCBSelChange)
132 END_MSG_MAP ()
133 nonvirtual LRESULT OnCBSelChange (USHORT uMsg, USHORT wParam, HWND ctlHandle, BOOL& bHandled);
134 nonvirtual LRESULT OnCBDropDown (USHORT uMsg, USHORT wParam, HWND ctlHandle, BOOL& bHandled);
135 nonvirtual LRESULT OnCBCloseUp (USHORT uMsg, USHORT wParam, HWND ctlHandle, BOOL& bHandled);
136
137public:
138 BEGIN_COM_MAP (ActiveLedIt_ComboBoxToolbarElement)
139 COM_INTERFACE_ENTRY2 (IDispatch, IALComboBoxToolbarElement)
140 COM_INTERFACE_ENTRY2 (IALToolbarElement, IALComboBoxToolbarElement)
141 COM_INTERFACE_ENTRY (IALComboBoxToolbarElement)
142 END_COM_MAP ()
143
144public:
145 DECLARE_PROTECT_FINAL_CONSTRUCT ()
146
147 // IALToolbarElement
148public:
149 STDMETHOD (get_PreferredHeight)
150 (UINT* pVal);
151 STDMETHOD (get_PreferredWidth)
152 (UINT* pVal);
153 STDMETHOD (get_X)
154 (INT* pVal);
155 STDMETHOD (get_Y)
156 (INT* pVal);
157 STDMETHOD (get_Width)
158 (UINT* pVal);
159 STDMETHOD (get_Height)
160 (UINT* pVal);
161 STDMETHOD (SetRectangle)
162 (int X, int Y, UINT width, UINT height);
163 STDMETHOD (NotifyOfOwningToolbar)
164 (IDispatch* owningToolbar, IDispatch* owningActiveLedIt);
165 STDMETHOD (UpdateEnableState)
166 ();
167
168 // IALComboBoxToolbarElement
169public:
170 STDMETHOD (get_CommandList)
171 (IDispatch** pVal);
172 STDMETHOD (put_CommandList)
173 (IDispatch* val);
174
175 // Specify elements
176private:
177 DistanceType fPreferredWidth;
178
179public:
180 HRESULT FinalConstruct ();
181 void FinalRelease ();
182
183private:
184 nonvirtual void UpdatePopupObj ();
185 nonvirtual void CallInvalidateLayout ();
186
187private:
188 bool fDropDownActive;
189 CComPtr<IDispatch> fCommandList;
190 vector<CComPtr<IALCommand>> fCommandListCache;
191 HWND fHWnd;
192 CWindow fComboBox; // in sub-window because of how combobox sends notifications (to parent - not self)
193 bool fPressedOnClick;
194 IDispatch* fOwningToolbar;
195 IDispatch* fOwningActiveLedIt;
196 Led_Rect fBounds;
197};
198
199class ATL_NO_VTABLE ActiveLedIt_SeparatorToolbarElement
200 : public CComObjectRootEx<CComSingleThreadModel>,
201 public CComCoClass<ActiveLedIt_SeparatorToolbarElement>,
202 public IDispatchImpl<IALToolbarElement, &IID_IALToolbarElement, &LIBID_ACTIVELEDITLib, qActiveLedIt_MajorVersion, qActiveLedIt_MinorVersion> {
203public:
204 ActiveLedIt_SeparatorToolbarElement ();
205 virtual ~ActiveLedIt_SeparatorToolbarElement ();
206
207public:
208 DECLARE_NO_REGISTRY ()
209
210public:
211 BEGIN_COM_MAP (ActiveLedIt_SeparatorToolbarElement)
212 COM_INTERFACE_ENTRY (IALToolbarElement)
213 COM_INTERFACE_ENTRY (IDispatch)
214 END_COM_MAP ()
215
216public:
217 DECLARE_PROTECT_FINAL_CONSTRUCT ()
218
219 // IALToolbarElement
220public:
221 STDMETHOD (get_PreferredHeight)
222 (UINT* pVal);
223 STDMETHOD (get_PreferredWidth)
224 (UINT* pVal);
225 STDMETHOD (get_X)
226 (INT* pVal);
227 STDMETHOD (get_Y)
228 (INT* pVal);
229 STDMETHOD (get_Width)
230 (UINT* pVal);
231 STDMETHOD (get_Height)
232 (UINT* pVal);
233 STDMETHOD (SetRectangle)
234 (int X, int Y, UINT width, UINT height);
235 STDMETHOD (NotifyOfOwningToolbar)
236 (IDispatch* owningToolbar, IDispatch* owningActiveLedIt);
237 STDMETHOD (UpdateEnableState)
238 ();
239
240public:
241 HRESULT FinalConstruct ();
242 void FinalRelease ();
243
244private:
245 Led_Rect fBounds;
246};
247
248class ATL_NO_VTABLE ActiveLedIt_Toolbar
249 : public CComObjectRootEx<CComSingleThreadModel>,
250 public CComCoClass<ActiveLedIt_Toolbar>,
251 public IDispatchImpl<IALToolbar, &IID_IALToolbar, &LIBID_ACTIVELEDITLib, qActiveLedIt_MajorVersion, qActiveLedIt_MinorVersion>,
252 public CWindowImpl<ActiveLedIt_Toolbar>,
253 public EnterIdler {
254public:
255 ActiveLedIt_Toolbar ();
256 virtual ~ActiveLedIt_Toolbar ();
257
258public:
259 DECLARE_NO_REGISTRY ()
260
261public:
262 DECLARE_WND_CLASS_EX (NULL, CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, COLOR_BTNFACE);
263 BEGIN_MSG_MAP (ActiveLedIt_Toolbar)
264 MESSAGE_HANDLER (WM_COMMAND, OnCommand)
265 END_MSG_MAP ()
266protected:
267 nonvirtual LRESULT OnCommand (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
268
269public:
270 enum {
271 kHSluff = 1
272 };
273 enum {
274 kVInset = 3
275 };
276 enum {
277 kHTBEdge = 3
278 };
279
280public:
281 BEGIN_COM_MAP (ActiveLedIt_Toolbar)
282 COM_INTERFACE_ENTRY (IALToolbar)
283 COM_INTERFACE_ENTRY (IDispatch)
284 END_COM_MAP ()
285
286public:
287 DECLARE_PROTECT_FINAL_CONSTRUCT ()
288
289protected:
290 virtual void OnEnterIdle () override;
291
292public:
293 STDMETHOD (get__NewEnum)
294 (IUnknown** ppUnk);
295 STDMETHOD (get_Item)
296 (long Index, IDispatch** pVal);
297 STDMETHOD (get_Count)
298 (long* pVal);
299 STDMETHOD (Add)
300 (IDispatch* newElt, UINT atIndex = 0xffffffff);
301 STDMETHOD (MergeAdd)
302 (IDispatch* newElts, UINT afterElt = static_cast<UINT> (-1));
303 STDMETHOD (Remove)
304 (VARIANT eltIntNameOrIndex);
305 STDMETHOD (Clear)
306 ();
307 STDMETHOD (get_hWnd)
308 (HWND* pVal);
309 STDMETHOD (get_PreferredHeight)
310 (UINT* pVal);
311 STDMETHOD (get_PreferredWidth)
312 (UINT* pVal);
313 STDMETHOD (NotifyOfOwningActiveLedIt)
314 (IDispatch* owningActiveLedIt, IDispatch* owningALToolbar);
315 STDMETHOD (SetRectangle)
316 (int X, int Y, UINT width, UINT height);
317
318private:
319 nonvirtual void CallInvalidateLayout ();
320 nonvirtual void DoLayout ();
321
322public:
323 HRESULT FinalConstruct ();
324 void FinalRelease ();
325
326private:
327 vector<CComPtr<IDispatch>> fToolbarItems;
328 IDispatch* fOwningActiveLedIt; // don't use CComPtr<> cuz don't want to addref and create circular reference
329 IDispatch* fOwningALToolbar; // ''
330 Led_Rect fBounds;
331};
332
333class ATL_NO_VTABLE ActiveLedIt_ToolbarList
334 : public CComObjectRootEx<CComSingleThreadModel>,
335 public CComCoClass<ActiveLedIt_ToolbarList>,
336 public IDispatchImpl<IALToolbarList, &IID_IALToolbarList, &LIBID_ACTIVELEDITLib, qActiveLedIt_MajorVersion, qActiveLedIt_MinorVersion>,
337 public CWindowImpl<ActiveLedIt_ToolbarList> {
338public:
339 ActiveLedIt_ToolbarList ();
340 virtual ~ActiveLedIt_ToolbarList ();
341
342public:
343 DECLARE_NO_REGISTRY ()
344
345public:
346 enum {
347 kRoomForBotLine = 1
348 };
349
350public:
351 DECLARE_WND_CLASS_EX (NULL, CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, COLOR_BTNFACE);
352 BEGIN_MSG_MAP (ActiveLedIt_ToolbarList)
353 MESSAGE_HANDLER (WM_PAINT, OnPaint)
354 END_MSG_MAP ()
355protected:
356 nonvirtual LRESULT OnPaint (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
357
358public:
359 BEGIN_COM_MAP (ActiveLedIt_ToolbarList)
360 COM_INTERFACE_ENTRY (IALToolbarList)
361 COM_INTERFACE_ENTRY (IDispatch)
362 END_COM_MAP ()
363
364public:
365 DECLARE_PROTECT_FINAL_CONSTRUCT ()
366
367public:
368 STDMETHOD (get__NewEnum)
369 (IUnknown** ppUnk);
370 STDMETHOD (get_Item)
371 (long Index, IDispatch** pVal);
372 STDMETHOD (get_Count)
373 (UINT* pVal);
374 STDMETHOD (Add)
375 (IDispatch* newElt, UINT atIndex = 0xffffffff);
376 STDMETHOD (Remove)
377 (VARIANT eltIntNameOrIndex);
378 STDMETHOD (Clear)
379 ();
380 STDMETHOD (get_hWnd)
381 (HWND* pVal);
382 STDMETHOD (get_PreferredHeight)
383 (UINT* pVal);
384 STDMETHOD (get_PreferredWidth)
385 (UINT* pVal);
386 STDMETHOD (NotifyOfOwningActiveLedIt)
387 (IDispatch* owningActiveLedIt, HWND owningHWND);
388 STDMETHOD (SetRectangle)
389 (int X, int Y, UINT width, UINT height);
390
391private:
392 nonvirtual void CallInvalidateLayout ();
393 nonvirtual void DoLayout ();
394
395public:
396 HRESULT FinalConstruct ();
397 void FinalRelease ();
398
399private:
400 vector<CComPtr<IDispatch>> fToolbars;
401 IDispatch* fOwningActiveLedIt; // don't use CComPtr<> cuz don't want to addref and create circular reference
402 Led_Rect fBounds;
403};
404
405/*
406 ********************************************************************************
407 ***************************** Implementation Details ***************************
408 ********************************************************************************
409 */
410
411#endif /*__Toolbar_h__*/