Make reindent
[krb5.git] / src / windows / identity / ui / toolbar.c
1 /*
2  * Copyright (c) 2005 Massachusetts Institute of Technology
3  * Copyright (c) 2007 Secure Endpoints Inc.
4  *
5  * Permission is hereby granted, free of charge, to any person
6  * obtaining a copy of this software and associated documentation
7  * files (the "Software"), to deal in the Software without
8  * restriction, including without limitation the rights to use, copy,
9  * modify, merge, publish, distribute, sublicense, and/or sell copies
10  * of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23  * SOFTWARE.
24  */
25
26 /* $Id$ */
27
28 #include<khmapp.h>
29 #include<assert.h>
30
31 HWND khui_hwnd_standard_toolbar;
32 int khui_tb_blank;
33
34 khui_ilist * ilist_toolbar;
35
36 void khui_init_toolbar(void) {
37     ilist_toolbar = khui_create_ilist(KHUI_TOOLBAR_IMAGE_WIDTH, KHUI_TOOLBAR_IMAGE_HEIGHT, KHUI_TOOLBAR_MAX_BTNS, 5, 0);
38 }
39
40 void khui_exit_toolbar(void) {
41     khui_delete_ilist(ilist_toolbar);
42 }
43
44 LRESULT khm_toolbar_notify(LPNMHDR notice) {
45     switch(notice->code) {
46     case TBN_GETINFOTIP:
47         {
48             LPNMTBGETINFOTIP git = (LPNMTBGETINFOTIP) notice;
49             int cmd;
50             khui_action * a;
51
52             cmd = git->iItem;
53             a = khui_find_action(cmd);
54
55             if (a) {
56                 if (a->caption) {
57                     StringCchCopy(git->pszText, git->cchTextMax, a->caption);
58                 } else if (a->tooltip) {
59                     StringCchCopy(git->pszText, git->cchTextMax, a->tooltip);
60                 } else if (a->is_caption) {
61                     wchar_t buf[INFOTIPSIZE];
62
63                     buf[0] = L'\0';
64                     LoadString(khm_hInstance, a->is_caption,
65                                buf, ARRAYLENGTH(buf));
66
67                     StringCchCopy(git->pszText, git->cchTextMax, buf);
68                 } else {
69                     StringCchCopy(git->pszText, git->cchTextMax, L"");
70                 }
71             } else {
72                 StringCchCopy(git->pszText,
73                               git->cchTextMax,
74                               L"");
75             }
76         }
77         break;
78
79     case TBN_HOTITEMCHANGE:
80         {
81             LPNMTBHOTITEM hi = (LPNMTBHOTITEM) notice;
82
83             if (hi->dwFlags & HICF_LEAVING) {
84                 khm_statusbar_set_part(KHUI_SBPART_INFO, NULL, L"");
85             } else {
86                 khui_action * a;
87                 int cmd;
88                 wchar_t buf[256];
89
90                 cmd = hi->idNew;
91                 a = khui_find_action(cmd);
92
93                 buf[0] = L'\0';
94
95                 if (a) {
96                     if (a->tooltip)
97                         StringCbCopy(buf, sizeof(buf), a->tooltip);
98                     else if (a->is_tooltip) {
99                         LoadString(khm_hInstance, a->is_tooltip,
100                                    buf, ARRAYLENGTH(buf));
101                     }
102                 }
103
104                 khm_statusbar_set_part(KHUI_SBPART_INFO, NULL, buf);
105             }
106         }
107         break;
108
109     case TBN_DROPDOWN:
110         {
111             LPNMTOOLBAR nmtb = (LPNMTOOLBAR) notice;
112             RECT r;
113
114             GetWindowRect(khui_hwnd_standard_toolbar, &r);
115             if (nmtb->iItem == KHUI_ACTION_DESTROY_CRED) {
116                 khm_menu_show_panel(KHUI_MENU_DESTROY_CRED,
117                                     r.left + nmtb->rcButton.left,
118                                     r.top + nmtb->rcButton.bottom);
119             } else if (nmtb->iItem == KHUI_ACTION_RENEW_CRED) {
120                 khm_menu_show_panel(KHUI_MENU_RENEW_CRED,
121                                     r.left + nmtb->rcButton.left,
122                                     r.top + nmtb->rcButton.bottom);
123             } else {
124                 return TBDDRET_NODEFAULT;
125             }
126
127             return TBDDRET_DEFAULT;
128         }
129         break;
130
131     case NM_CUSTOMDRAW:
132         {
133             LPNMTBCUSTOMDRAW nmcd = (LPNMTBCUSTOMDRAW) notice;
134             if(nmcd->nmcd.dwDrawStage == CDDS_PREPAINT) {
135                 return CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYPOSTERASE;
136             } else if(nmcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {
137                 return CDRF_NOTIFYPOSTPAINT;
138             } else if(nmcd->nmcd.dwDrawStage == CDDS_ITEMPOSTPAINT) {
139                 /* draw the actual icon */
140                 int iidx;
141                 int ibmp;
142                 HBITMAP hbmp;
143                 RECT r;
144
145                 khui_action * act =
146                     khui_find_action((int) nmcd->nmcd.dwItemSpec);
147
148                 if(!act || !act->ib_normal)
149                     return CDRF_DODEFAULT;
150
151                 if((act->state & KHUI_ACTIONSTATE_DISABLED) &&
152                    act->ib_disabled) {
153                     ibmp = act->ib_disabled;
154                 } else if(act->ib_hot &&
155                           ((nmcd->nmcd.uItemState & CDIS_HOT) ||
156                            (nmcd->nmcd.uItemState & CDIS_SELECTED))){
157                     ibmp = act->ib_hot;
158                 } else {
159                     ibmp = act->ib_normal;
160                 }
161
162                 iidx = khui_ilist_lookup_id(ilist_toolbar, ibmp);
163                 if(iidx < 0) {
164                     hbmp = LoadImage(khm_hInstance,
165                                      MAKEINTRESOURCE(ibmp),
166                                      IMAGE_BITMAP,
167                                      KHUI_TOOLBAR_IMAGE_WIDTH,
168                                      KHUI_TOOLBAR_IMAGE_HEIGHT, 0);
169                     iidx =
170                         khui_ilist_add_masked_id(ilist_toolbar,
171                                                  hbmp,
172                                                  KHUI_TOOLBAR_BGCOLOR,
173                                                  ibmp);
174                     DeleteObject(hbmp);
175                 }
176
177                 if(iidx < 0)
178                     return CDRF_DODEFAULT;
179
180                 CopyRect(&r, &(nmcd->nmcd.rc));
181                 r.left += ((r.bottom - r.top) -
182                           KHUI_TOOLBAR_IMAGE_HEIGHT) / 2;
183                 r.top += ((r.bottom - r.top) -
184                           KHUI_TOOLBAR_IMAGE_HEIGHT) / 2;
185 #if 0
186                 r.left += ((r.right - r.left) -
187                            KHUI_TOOLBAR_IMAGE_WIDTH) / 2;
188 #endif
189                 khui_ilist_draw(ilist_toolbar,
190                                 iidx,
191                                 nmcd->nmcd.hdc,
192                                 r.left,
193                                 r.top,
194                                 0);
195
196                 return CDRF_DODEFAULT;
197             }
198         }
199         break;
200     }
201     return 0;
202 }
203
204 void khui_add_action_to_toolbar(HWND tb, khui_action *a, int opt, HIMAGELIST hiList) {
205     wchar_t buf[MAX_RES_STRING] = L"";
206     int idx_caption = 0;
207     TBBUTTON bn;
208     LRESULT lr;
209
210     ZeroMemory(&bn,sizeof(bn));
211
212     if(opt & KHUI_TOOLBAR_ADD_SEP) {
213         bn.fsStyle = BTNS_SEP;
214         bn.iBitmap = 3;
215
216         lr = SendMessage(tb,
217                          TB_ADDBUTTONS,
218                          1,
219                          (LPARAM) &bn);
220 #ifdef DEBUG
221         assert(lr);
222 #endif
223         return;
224     }
225
226     bn.fsStyle = BTNS_BUTTON;
227
228     if(opt & KHUI_TOOLBAR_VARSIZE) {
229         bn.fsStyle |= BTNS_AUTOSIZE;
230     }
231
232     if(opt & KHUI_TOOLBAR_ADD_TEXT) {
233         int sid = 0;
234         if((opt & KHUI_TOOLBAR_ADD_LONGTEXT) ==
235            KHUI_TOOLBAR_ADD_LONGTEXT) {
236             sid = a->is_tooltip;
237         }
238         if(!sid)
239             sid = a->is_caption;
240         if(sid) {
241             LoadString(khm_hInstance,
242                        sid,
243                        buf, ARRAYLENGTH(buf));
244             buf[wcslen(buf) + 1] = L'\0';
245             idx_caption = (int) SendMessage(tb,
246                                             TB_ADDSTRING,
247                                             (WPARAM) NULL,
248                                             (LPARAM) buf);
249 #if (_WIN32_IE >= 0x0501)
250             bn.fsStyle |= BTNS_SHOWTEXT;
251 #endif
252             bn.iString = idx_caption;
253         }
254     }
255
256     if(opt & KHUI_TOOLBAR_ADD_DROPDOWN) {
257         bn.fsStyle |= BTNS_DROPDOWN;
258     }
259
260     if((opt & KHUI_TOOLBAR_ADD_BITMAP) && a->ib_normal) {
261         bn.fsStyle |= TBSTYLE_CUSTOMERASE;
262         bn.iBitmap = khui_tb_blank;
263     } else {
264 #if (_WIN32_IE >= 0x0501)
265         bn.iBitmap = I_IMAGENONE;
266 #endif
267     }
268
269     bn.idCommand = a->cmd;
270
271     if(a->state & KHUI_ACTIONSTATE_DISABLED) {
272         bn.fsState = 0;
273     } else {
274         bn.fsState = TBSTATE_ENABLED;
275     }
276
277     if(a->state & KHUI_ACTIONSTATE_CHECKED) {
278         bn.fsState |= TBSTATE_CHECKED;
279     }
280
281     bn.dwData = 0;
282
283     lr = SendMessage(
284                      tb,
285                      TB_ADDBUTTONS,
286                      1,
287                      (LPARAM) &bn);
288
289 #ifdef DEBUG
290     assert(lr);
291 #endif
292 }
293
294 void khm_update_standard_toolbar(void)
295 {
296     khui_menu_def * def;
297     khui_action_ref * aref;
298     khui_action * act;
299
300     def = khui_find_menu(KHUI_TOOLBAR_STANDARD);
301
302     aref = def->items;
303
304     while(aref && aref->action != KHUI_MENU_END) {
305         if(aref->action == KHUI_MENU_SEP) {
306             aref++;
307             continue;
308         }
309
310         act = khui_find_action(aref->action);
311         if(act) {
312             BOOL enable;
313
314             enable = !(act->state & KHUI_ACTIONSTATE_DISABLED);
315             SendMessage(khui_hwnd_standard_toolbar,
316                         TB_ENABLEBUTTON,
317                         (WPARAM) act->cmd,
318                         MAKELPARAM(enable, 0));
319         }
320
321         aref++;
322     }
323 }
324
325 void khm_create_standard_toolbar(HWND rebar) {
326     HWND hwtb;
327     SIZE sz;
328     HBITMAP hbm_blank;
329     HIMAGELIST hiList;
330     REBARBANDINFO rbi;
331     khui_menu_def * def;
332     khui_action * act;
333     khui_action_ref * aref;
334     int idx_blank;
335
336     def = khui_find_menu(KHUI_TOOLBAR_STANDARD);
337
338     if (!def) {
339 #ifdef DEBUG
340         assert(FALSE);
341 #endif
342         return;
343     }
344
345     hwtb = CreateWindowEx(0 ,
346                           TOOLBARCLASSNAME,
347                           (LPWSTR) NULL,
348                           WS_CHILD |
349                           TBSTYLE_FLAT |
350                           TBSTYLE_AUTOSIZE |
351                           TBSTYLE_TOOLTIPS |
352                           CCS_NORESIZE |
353                           CCS_NOPARENTALIGN |
354                           CCS_ADJUSTABLE |
355                           CCS_NODIVIDER,
356                           0, 0, 0, 0, rebar,
357                           (HMENU) NULL, khm_hInstance,
358                           NULL);
359
360     if(!hwtb) {
361 #ifdef DEBUG
362         assert(FALSE);
363 #endif
364         return;
365     }
366
367 #if (_WIN32_IE >= 0x0501)
368     SendMessage(hwtb, TB_SETEXTENDEDSTYLE, 0,
369                 TBSTYLE_EX_MIXEDBUTTONS | TBSTYLE_EX_DRAWDDARROWS);
370 #endif
371
372     hiList = ImageList_Create(
373         KHUI_TOOLBAR_IMAGE_WIDTH,
374         KHUI_TOOLBAR_IMAGE_HEIGHT,
375         ILC_MASK,
376         (int) khui_action_list_length(def->items),
377         3);
378
379     hbm_blank = LoadImage(khm_hInstance,
380                           MAKEINTRESOURCE(IDB_TB_BLANK),
381                           IMAGE_BITMAP,
382                           KHUI_TOOLBAR_IMAGE_WIDTH,
383                           KHUI_TOOLBAR_IMAGE_HEIGHT, 0);
384     idx_blank = ImageList_AddMasked(hiList, hbm_blank, RGB(0,0,0));
385
386     khui_hwnd_standard_toolbar = hwtb;
387     khui_tb_blank = idx_blank;
388
389     def = khui_find_menu(KHUI_TOOLBAR_STANDARD);
390
391     aref = def->items;
392
393     SendMessage(hwtb,
394         TB_BUTTONSTRUCTSIZE,
395         sizeof(TBBUTTON),
396         0);
397
398     SendMessage(hwtb,
399         TB_SETBITMAPSIZE,
400         0,
401         MAKELONG(KHUI_TOOLBAR_IMAGE_WIDTH,KHUI_TOOLBAR_IMAGE_HEIGHT));
402
403     SendMessage(hwtb,
404         TB_SETIMAGELIST,
405         0,
406         (LPARAM) hiList);
407
408     SendMessage(hwtb,
409         TB_SETBUTTONSIZE,
410         0,
411         MAKELONG(KHUI_TOOLBAR_IMAGE_WIDTH,KHUI_TOOLBAR_IMAGE_HEIGHT));
412
413     while(aref && aref->action != KHUI_MENU_END) {
414         if(aref->action == KHUI_MENU_SEP) {
415             khui_add_action_to_toolbar(hwtb,
416                                        NULL,
417                                        KHUI_TOOLBAR_ADD_SEP,
418                                        hiList);
419         } else {
420             act = khui_find_action(aref->action);
421             khui_add_action_to_toolbar(hwtb,
422                                        act,
423                                        KHUI_TOOLBAR_ADD_BITMAP |
424                                        ((aref->flags & KHUI_ACTIONREF_SUBMENU)?
425                                         KHUI_TOOLBAR_ADD_DROPDOWN: 0),
426                                        hiList);
427         }
428         aref ++;
429     }
430
431     SendMessage(hwtb,
432                 TB_AUTOSIZE,
433                 0,0);
434
435     SendMessage(hwtb,
436                 TB_GETMAXSIZE,
437                 0,
438                 (LPARAM) &sz);
439
440     sz.cy += 5;
441
442     ZeroMemory(&rbi, sizeof(rbi));
443
444     rbi.cbSize = sizeof(rbi);
445     rbi.fMask =
446         RBBIM_ID |
447         RBBIM_CHILD |
448         RBBIM_CHILDSIZE |
449         RBBIM_IDEALSIZE |
450         RBBIM_SIZE |
451         RBBIM_STYLE;
452     rbi.fStyle =
453         RBBS_USECHEVRON |
454         RBBS_BREAK;
455     rbi.hwndChild = hwtb;
456
457     rbi.wID = KHUI_TOOLBAR_STANDARD;
458     rbi.cx = sz.cx;
459     rbi.cxMinChild = sz.cx;
460     rbi.cyMinChild = sz.cy;
461     rbi.cyChild = rbi.cyMinChild;
462     rbi.cyMaxChild = rbi.cyMinChild;
463     rbi.cyIntegral = rbi.cyMinChild;
464
465     rbi.cxIdeal = rbi.cx;
466
467     SendMessage(rebar,
468         RB_INSERTBAND,
469         0,
470         (LPARAM) &rbi);
471 }