annotate foosdk/sdk/libPPUI/CEditWithButtons.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <list>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <string>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include <memory>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include "wtl-pp.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #include "CButtonLite.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 class CEditWithButtons : public CEditPPHooks {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 CEditWithButtons(::ATL::CMessageMap * hookMM = nullptr, int hookMMID = 0) : CEditPPHooks(hookMM, hookMMID) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 static constexpr UINT MSG_CHECKCONDITIONS = WM_USER + 13;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 static constexpr WPARAM MSG_CHECKCONDITIONS_MAGIC1 = 0xaec66f0c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 static constexpr LPARAM MSG_CHECKCONDITIONS_MAGIC2 = 0x180c2f35;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 BEGIN_MSG_MAP_EX(CEditWithButtons)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 MSG_WM_CREATE(OnCreate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 MSG_WM_SETFONT(OnSetFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 MSG_WM_WINDOWPOSCHANGED(OnPosChanged)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 MSG_WM_CTLCOLORBTN(OnColorBtn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 MESSAGE_HANDLER_EX(WM_GETDLGCODE, OnGetDlgCode)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 MSG_WM_KEYDOWN(OnKeyDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 MSG_WM_CHAR(OnChar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 // MSG_WM_SETFOCUS( OnSetFocus )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 // MSG_WM_KILLFOCUS( OnKillFocus )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 MSG_WM_ENABLE(OnEnable)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 MSG_WM_SETTEXT( OnSetText )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 MESSAGE_HANDLER_EX(WM_PAINT, CheckConditionsTrigger)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 MESSAGE_HANDLER_EX(WM_CUT, CheckConditionsTrigger)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 MESSAGE_HANDLER_EX(WM_PASTE, CheckConditionsTrigger)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 MESSAGE_HANDLER_EX(MSG_CHECKCONDITIONS, OnCheckConditions)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 CHAIN_MSG_MAP(CEditPPHooks)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 BOOL SubclassWindow( HWND wnd ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 if (!CEditPPHooks::SubclassWindow(wnd)) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 m_initialParent = GetParent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 this->ModifyStyle(0, WS_CLIPCHILDREN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 RefreshButtons();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 typedef std::function<void () > handler_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 typedef std::function<bool (const wchar_t*) > condition_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 void AddMoreButton( std::function<void ()> f );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 void AddClearButton( const wchar_t * clearVal = L"", bool bHandleEsc = false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 void AddButton( const wchar_t * str, handler_t handler, condition_t condition = nullptr, const wchar_t * drawAlternateText = nullptr );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 void SetFixedWidth(unsigned fw) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 m_fixedWidth = fw; m_fixedWidthAuto = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 RefreshButtons();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 void SetFixedWidth() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 m_fixedWidth = 0; m_fixedWidthAuto = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 RefreshButtons();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 CRect RectOfButton( const wchar_t * text );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 void Invalidate() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 __super::Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 for( auto & i : m_buttons ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 if (i.wnd != NULL) i.wnd.Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 void SetShellFolderAutoComplete() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 SetShellAutoComplete(SHACF_FILESYS_DIRS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 void SetShellFileAutoComplete() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 SetShellAutoComplete(SHACF_FILESYS_ONLY);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 void SetShellAutoComplete(DWORD flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 SHAutoComplete(*this, flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 SetHasAutoComplete();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 void SetHasAutoComplete(bool bValue = true) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 m_hasAutoComplete = bValue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 void RefreshConditions(const wchar_t * newText = nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 int OnCreate(LPCREATESTRUCT lpCreateStruct) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 m_initialParent = GetParent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 LRESULT OnCheckConditions( UINT msg, WPARAM wp, LPARAM lp ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 if ( msg == MSG_CHECKCONDITIONS && wp == MSG_CHECKCONDITIONS_MAGIC1 && lp == MSG_CHECKCONDITIONS_MAGIC2 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 this->RefreshConditions();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 bool HaveConditions() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 for( auto i = m_buttons.begin(); i != m_buttons.end(); ++i ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 if ( i->condition ) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 void PostCheckConditions() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 if ( HaveConditions() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 PostMessage( MSG_CHECKCONDITIONS, MSG_CHECKCONDITIONS_MAGIC1, MSG_CHECKCONDITIONS_MAGIC2 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 LRESULT CheckConditionsTrigger( UINT, WPARAM, LPARAM ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 PostCheckConditions();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 int OnSetText(LPCTSTR) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 PostCheckConditions();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 void OnEnable(BOOL bEnable) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 for( auto & i : m_buttons ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 if ( i.wnd != NULL ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 i.wnd.EnableWindow( bEnable );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 (void)nRepCnt; (void)nFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 if (nChar == VK_TAB ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 PostCheckConditions();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 (void)nRepCnt; (void)nFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 if ( nChar == VK_TAB ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 bool canStealTab() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 if (m_hasAutoComplete) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 if (IsShiftPressed()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 if (m_buttons.size() == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 UINT OnGetDlgCode(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 if ( wp == VK_TAB && canStealTab() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 for (auto i = m_buttons.begin(); i != m_buttons.end(); ++ i ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 if ( i->visible ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 TabFocusThis(i->wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 return DLGC_WANTTAB;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 SetMsgHandled(FALSE); return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 void OnSetFocus(HWND) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 this->ModifyStyleEx(0, WS_EX_CONTROLPARENT ); SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 void OnKillFocus(HWND) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 this->ModifyStyleEx(WS_EX_CONTROLPARENT, 0 ); SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 HBRUSH OnColorBtn(CDCHandle dc, CButton) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 if ( (this->GetStyle() & ES_READONLY) != 0 || !this->IsWindowEnabled() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 return (HBRUSH) GetParent().SendMessage( WM_CTLCOLORSTATIC, (WPARAM) dc.m_hDC, (LPARAM) m_hWnd );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 return (HBRUSH) GetParent().SendMessage( WM_CTLCOLOREDIT, (WPARAM) dc.m_hDC, (LPARAM) m_hWnd );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 void OnPosChanged(LPWINDOWPOS) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 Layout(); SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 struct Button_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 std::wstring title, titleDraw;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 handler_t handler;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 CButtonLite wnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 bool visible;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 condition_t condition;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 void OnSetFont(CFontHandle font, BOOL bRedraw);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 void RefreshButtons() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 if ( m_hWnd != NULL && m_buttons.size() > 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 Layout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 void Layout( ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 CRect rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 if (GetClientRect(&rc)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 Layout(rc.Size(), NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 static bool IsShiftPressed() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 return (GetKeyState(VK_SHIFT) & 0x8000) ? true : false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 CWindow FindDialog() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 // Return a window that we can send WM_NEXTDLGCTL to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 // PROBLEM: There is no clear way of obtaining one - something in our GetParent() hierarchy is usually a dialog, but we don't know which one
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 // Assume our initial parent window to be the right thing to talk to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 PFC_ASSERT(m_initialParent != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 return m_initialParent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 void TabFocusThis(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 FindDialog().PostMessage(WM_NEXTDLGCTL, (WPARAM) wnd, TRUE );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 void TabFocusPrevNext(bool bPrev) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 FindDialog().PostMessage(WM_NEXTDLGCTL, bPrev ? TRUE : FALSE, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 void TabCycleButtons(HWND wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 bool ButtonWantTab( HWND wnd );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 bool EvalCondition( Button_t & btn, const wchar_t * newText );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 void Layout(CSize size, CFontHandle fontSetMe);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 unsigned MeasureButton(Button_t const & button );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 unsigned m_fixedWidth = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 bool m_fixedWidthAuto = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 std::list< Button_t > m_buttons;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 bool m_hasAutoComplete = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 CWindow m_initialParent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 };