1 /********************************************************************************
2 *                                                                               *
3 *                        T o o l B a r   W i d g e t                            *
4 *                                                                               *
5 *********************************************************************************
6 * Copyright (C) 2004,2006 by Jeroen van der Zijp.   All Rights Reserved.        *
7 *********************************************************************************
8 * This library is free software; you can redistribute it and/or                 *
9 * modify it under the terms of the GNU Lesser General Public                    *
10 * License as published by the Free Software Foundation; either                  *
11 * version 2.1 of the License, or (at your option) any later version.            *
12 *                                                                               *
13 * This library is distributed in the hope that it will be useful,               *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of                *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU             *
16 * Lesser General Public License for more details.                               *
17 *                                                                               *
18 * You should have received a copy of the GNU Lesser General Public              *
19 * License along with this library; if not, write to the Free Software           *
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.    *
21 *********************************************************************************
22 * $Id: FXToolBar.cpp 4937 2019-03-10 19:59:30Z arthurcnorman $                       *
23 ********************************************************************************/
24 #include "xincs.h"
25 #include "fxver.h"
26 #include "fxdefs.h"
27 #include "FXHash.h"
28 #include "FXThread.h"
29 #include "FXStream.h"
30 #include "FXString.h"
31 #include "FXSize.h"
32 #include "FXPoint.h"
33 #include "FXRectangle.h"
34 #include "FXRegistry.h"
35 #include "FXAccelTable.h"
36 #include "FXApp.h"
37 #include "FXGIFIcon.h"
38 #include "FXDCWindow.h"
39 #include "FXDrawable.h"
40 #include "FXWindow.h"
41 #include "FXFrame.h"
42 #include "FXComposite.h"
43 #include "FXPacker.h"
44 #include "FXPopup.h"
45 #include "FXMenuPane.h"
46 #include "FXMenuCaption.h"
47 #include "FXMenuCommand.h"
48 #include "FXMenuCascade.h"
49 #include "FXMenuSeparator.h"
50 #include "FXMenuRadio.h"
51 #include "FXMenuCheck.h"
52 #include "FXShell.h"
53 #include "FXSeparator.h"
54 #include "FXTopWindow.h"
55 #include "FXDockBar.h"
56 #include "FXToolBar.h"
57 #include "FXDockSite.h"
58 #include "FXToolBarGrip.h"
59 #include "FXToolBarShell.h"
60 #include "icons.h"
61 
62 
63 /*
64   Notes:
65   - May want to add support for centered layout mode.
66 */
67 
68 
69 // Docking side
70 #define LAYOUT_SIDE_MASK (LAYOUT_SIDE_LEFT|LAYOUT_SIDE_RIGHT|LAYOUT_SIDE_TOP|LAYOUT_SIDE_BOTTOM)
71 
72 using namespace FX;
73 
74 /*******************************************************************************/
75 
76 namespace FX {
77 
78 // Map
79 FXDEFMAP(FXToolBar) FXToolBarMap[]={
80   FXMAPFUNC(SEL_UPDATE,FXToolBar::ID_DOCK_FLIP,FXToolBar::onUpdDockFlip),
81   FXMAPFUNC(SEL_COMMAND,FXToolBar::ID_DOCK_FLIP,FXToolBar::onCmdDockFlip),
82   };
83 
84 
85 // Object implementation
FXIMPLEMENT(FXToolBar,FXDockBar,FXToolBarMap,ARRAYNUMBER (FXToolBarMap))86 FXIMPLEMENT(FXToolBar,FXDockBar,FXToolBarMap,ARRAYNUMBER(FXToolBarMap))
87 
88 
89 // Make a dockable and, possibly, floatable toolbar
90 FXToolBar::FXToolBar(FXComposite* p,FXComposite* q,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs):
91   FXDockBar(p,q,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){
92   }
93 
94 
95 // Make a non-floatable toolbar
FXToolBar(FXComposite * p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs)96 FXToolBar::FXToolBar(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs):
97   FXDockBar(p,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){
98   }
99 
100 
101 // Compute minimum width based on child layout hints
getDefaultWidth()102 FXint FXToolBar::getDefaultWidth(){
103   FXint total=0,mw=0,w;
104   FXWindow* child;
105   FXuint hints;
106   if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth();
107   for(child=getFirst(); child; child=child->getNext()){
108     if(child->shown()){
109       hints=child->getLayoutHints();
110       if(dynamic_cast<FXSeparator*>(child) || dynamic_cast<FXToolBarGrip*>(child)) w=child->getDefaultWidth();
111       else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth();
112       else if(options&PACK_UNIFORM_WIDTH) w=mw;
113       else w=child->getDefaultWidth();
114       if(!(options&LAYOUT_SIDE_LEFT)){  // Horizontal
115         if(total) total+=hspacing;
116         total+=w;
117         }
118       else{                             // Vertical
119         if(total<w) total=w;
120         }
121       }
122     }
123   return padleft+padright+total+(border<<1);
124   }
125 
126 
127 // Compute minimum height based on child layout hints
getDefaultHeight()128 FXint FXToolBar::getDefaultHeight(){
129   FXint total=0,mh=0,h;
130   FXWindow* child;
131   FXuint hints;
132   if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight();
133   for(child=getFirst(); child; child=child->getNext()){
134     if(child->shown()){
135       hints=child->getLayoutHints();
136       if(dynamic_cast<FXSeparator*>(child) || dynamic_cast<FXToolBarGrip*>(child)) h=child->getDefaultHeight();
137       else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight();
138       else if(options&PACK_UNIFORM_HEIGHT) h=mh;
139       else h=child->getDefaultHeight();
140       if(options&LAYOUT_SIDE_LEFT){     // Vertical
141         if(total) total+=vspacing;
142         total+=h;
143         }
144       else{                             // Horizontal
145         if(total<h) total=h;
146         }
147       }
148     }
149   return padtop+padbottom+total+(border<<1);
150   }
151 
152 
153 /*
154 // Return width for given height
155 FXint FXToolBar::getWidthForHeight(FXint givenheight){
156   FXint wtot,wmax,hcum,w,h,space,ngalleys,mw=0,mh=0;
157   FXWindow* child;
158   FXuint hints;
159   wtot=wmax=hcum=ngalleys=0;
160   space=givenheight-padtop-padbottom-(border<<1);
161   if(space<1) space=1;
162   if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth();
163   if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight();
164   for(child=getFirst(); child; child=child->getNext()){
165     if(child->shown()){
166       hints=child->getLayoutHints();
167       if(dynamic_cast<FXToolBarGrip*>(child)) w=child->getDefaultWidth();
168       else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth();
169       else if(options&PACK_UNIFORM_WIDTH) w=mw;
170       else w=child->getDefaultWidth();
171       if(dynamic_cast<FXToolBarGrip*>(child)) h=child->getDefaultHeight();
172       else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight();
173       else if(options&PACK_UNIFORM_HEIGHT) h=mh;
174       else h=child->getDefaultHeight();
175       if(hcum+h>space) hcum=0;
176       if(hcum==0) ngalleys++;
177       hcum+=h+vspacing;
178       if(wmax<w) wmax=w;
179       }
180     }
181   wtot=wmax*ngalleys;
182   return padleft+padright+wtot+(border<<1);
183   }
184 
185 
186 // Return height for given width
187 FXint FXToolBar::getHeightForWidth(FXint givenwidth){
188   FXint htot,hmax,wcum,w,h,space,ngalleys,mw=0,mh=0;
189   FXWindow* child;
190   FXuint hints;
191   htot=hmax=wcum=ngalleys=0;
192   space=givenwidth-padleft-padright-(border<<1);
193   if(space<1) space=1;
194   if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth();
195   if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight();
196   for(child=getFirst(); child; child=child->getNext()){
197     if(child->shown()){
198       hints=child->getLayoutHints();
199       if(dynamic_cast<FXToolBarGrip*>(child)) w=child->getDefaultWidth();
200       else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth();
201       else if(options&PACK_UNIFORM_WIDTH) w=mw;
202       else w=child->getDefaultWidth();
203       if(dynamic_cast<FXToolBarGrip*>(child)) h=child->getDefaultHeight();
204       else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight();
205       else if(options&PACK_UNIFORM_HEIGHT) h=mh;
206       else h=child->getDefaultHeight();
207       if(wcum+w>space) wcum=0;
208       if(wcum==0) ngalleys++;
209       wcum+=w+hspacing;
210       if(hmax<h) hmax=h;
211       }
212     }
213   htot=hmax*ngalleys;
214   return padtop+padbottom+htot+(border<<1);
215   }
216 
217 
218 // Recalculate layout
219 void FXToolBar::layout(){
220   FXint galleyleft,galleyright,galleytop,galleybottom,galleywidth,galleyheight;
221   FXint tleft,tright,ttop,bleft,bbottom;
222   FXint ltop,lbottom,lleft,rtop,rright;
223   FXWindow *child;
224   FXint x,y,w,h,mw=0,mh=0;
225   FXuint hints;
226 
227   // Get maximum child size
228   if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth();
229   if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight();
230 
231   // Vertical toolbar
232   if(options&LAYOUT_SIDE_LEFT){
233     galleywidth=0;
234     for(child=getFirst(); child; child=child->getNext()){
235       if(child->shown()){
236         hints=child->getLayoutHints();
237         if(child->isMemberOf(FXMETACLASS(FXToolBarGrip))) w=child->getDefaultWidth();
238         else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth();
239         else if(options&PACK_UNIFORM_WIDTH) w=mw;
240         else w=child->getDefaultWidth();
241         if(galleywidth<w) galleywidth=w;
242         }
243       }
244     galleyleft=border+padleft;
245     galleyright=width-border-padright;
246     galleytop=border+padtop;
247     galleybottom=height-border-padbottom;
248     tleft=galleyleft;
249     tright=galleyleft+galleywidth;
250     ttop=galleytop;
251     bleft=galleyright-galleywidth;
252     bbottom=galleybottom;
253     for(child=getFirst(); child; child=child->getNext()){
254       if(child->shown()){
255         hints=child->getLayoutHints();
256         if(child->isMemberOf(FXMETACLASS(FXToolBarGrip))){
257           w=galleywidth;
258           h=child->getDefaultHeight();
259           }
260         else{
261           if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth();
262           else if(options&PACK_UNIFORM_WIDTH) w=mw;
263           else w=child->getDefaultWidth();
264           if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight();
265           else if(options&PACK_UNIFORM_HEIGHT) h=mh;
266           else h=child->getDefaultHeight();
267           }
268         if(hints&LAYOUT_BOTTOM){
269           if(bbottom-h<galleytop && bbottom!=galleybottom){
270             bleft-=galleywidth;
271             bbottom=galleybottom;
272             }
273           y=bbottom-h;
274           bbottom-=(h+vspacing);
275           x=bleft+(galleywidth-w)/2;
276           }
277         else{
278           if(ttop+h>galleybottom && ttop!=galleytop){
279             tleft=tright;
280             tright+=galleywidth;
281             ttop=galleytop;
282             }
283           y=ttop;
284           ttop+=(h+vspacing);
285           x=tleft+(galleywidth-w)/2;
286           }
287         child->position(x,y,w,h);
288         }
289       }
290     }
291 
292   // Horizontal toolbar
293   else{
294     galleyheight=0;
295     for(child=getFirst(); child; child=child->getNext()){
296       if(child->shown()){
297         hints=child->getLayoutHints();
298         if(child->isMemberOf(FXMETACLASS(FXToolBarGrip))) h=child->getDefaultHeight();
299         else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight();
300         else if(options&PACK_UNIFORM_HEIGHT) h=mh;
301         else h=child->getDefaultHeight();
302         if(galleyheight<h) galleyheight=h;
303         }
304       }
305     galleyleft=border+padleft;
306     galleyright=width-border-padright;
307     galleytop=border+padtop;
308     galleybottom=height-border-padbottom;
309     ltop=galleytop;
310     lbottom=galleytop+galleyheight;
311     lleft=galleyleft;
312     rtop=galleybottom-galleyheight;
313     rright=galleyright;
314     for(child=getFirst(); child; child=child->getNext()){
315       if(child->shown()){
316         hints=child->getLayoutHints();
317         if(child->isMemberOf(FXMETACLASS(FXToolBarGrip))){
318           w=child->getDefaultWidth();
319           h=galleyheight;
320           }
321         else{
322           if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth();
323           else if(options&PACK_UNIFORM_WIDTH) w=mw;
324           else w=child->getDefaultWidth();
325           if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight();
326           else if(options&PACK_UNIFORM_HEIGHT) h=mh;
327           else h=child->getDefaultHeight();
328           }
329         if(hints&LAYOUT_RIGHT){
330           if(rright-w<galleyleft && rright!=galleyright){
331             rtop-=galleyheight;
332             rright=galleyright;
333             }
334           x=rright-w;
335           rright-=(w+hspacing);
336           y=rtop+(galleyheight-h)/2;
337           }
338         else{
339           if(lleft+w>galleyright && lleft!=galleyleft){
340             ltop=lbottom;
341             lbottom+=galleyheight;
342             lleft=galleyleft;
343             }
344           x=lleft;
345           lleft+=(w+hspacing);
346           y=ltop+(galleyheight-h)/2;
347           }
348         child->position(x,y,w,h);
349         }
350       }
351     }
352   flags&=~FLAG_DIRTY;
353   }
354 
355 */
356 
357 
358 // Recalculate layout
layout()359 void FXToolBar::layout(){
360   FXint left,right,top,bottom,remain,expand,mw=0,mh=0,x,y,w,h,e,t;
361   FXWindow *child;
362   FXuint hints;
363 
364   // Placement rectangle; right/bottom non-inclusive
365   left=border+padleft;
366   right=width-border-padright;
367   top=border+padtop;
368   bottom=height-border-padbottom;
369 
370   // Get maximum child size
371   if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth();
372   if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight();
373 
374   // Vertical toolbar
375   if(options&LAYOUT_SIDE_LEFT){
376 
377     // Find stretch
378     for(child=getFirst(),remain=bottom-top,expand=0; child; child=child->getNext()){
379       if(child->shown()){
380         hints=child->getLayoutHints();
381         if(dynamic_cast<FXSeparator*>(child) || dynamic_cast<FXToolBarGrip*>(child)) h=child->getDefaultHeight();
382         else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight();
383         else if(options&PACK_UNIFORM_HEIGHT) h=mh;
384         else h=child->getDefaultHeight();
385 	if(hints&LAYOUT_FILL_Y)
386 	  expand+=h;
387 	else
388 	  remain-=h;
389 	remain-=vspacing;
390         }
391       }
392 
393     // Adjust
394     remain+=vspacing;
395 
396     // Placement
397     for(child=getFirst(),e=0; child; child=child->getNext()){
398       if(child->shown()){
399 
400         hints=child->getLayoutHints();
401 
402         // Determine child width
403         if(dynamic_cast<FXSeparator*>(child) || dynamic_cast<FXToolBarGrip*>(child)) w=right-left;
404         else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth();
405         else if(options&PACK_UNIFORM_WIDTH) w=mw;
406         else if(hints&LAYOUT_FILL_X) w=right-left;
407         else w=child->getDefaultWidth();
408 
409         // Determine child x-position
410         if(hints&LAYOUT_CENTER_X) x=left+(right-left-w)/2;
411         else if(hints&LAYOUT_RIGHT) x=right-w;
412         else x=left;
413 
414         // Determine child height
415         if(dynamic_cast<FXSeparator*>(child) || dynamic_cast<FXToolBarGrip*>(child)) h=child->getDefaultHeight();
416         else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight();
417         else if(options&PACK_UNIFORM_HEIGHT) h=mh;
418         else h=child->getDefaultHeight();
419 
420         // Account for fill or center
421 	if(hints&LAYOUT_FILL_Y){
422           t=h*remain;
423           e+=t%expand;
424           h=t/expand+e/expand;
425           e%=expand;
426           }
427 
428         // Determine child x-position
429         if(hints&LAYOUT_BOTTOM){
430           y=bottom-h;
431           bottom-=h+vspacing;
432           }
433         else{
434           y=top;
435           top+=h+vspacing;
436           }
437 
438         // Place it
439         child->position(x,y,w,h);
440         }
441       }
442     }
443 
444   // Horizontal toolbar
445   else{
446 
447     // Find stretch
448     for(child=getFirst(),remain=right-left,expand=0; child; child=child->getNext()){
449       if(child->shown()){
450         hints=child->getLayoutHints();
451         if(dynamic_cast<FXSeparator*>(child) || dynamic_cast<FXToolBarGrip*>(child)) w=child->getDefaultWidth();
452         else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth();
453         else if(options&PACK_UNIFORM_WIDTH) w=mw;
454         else w=child->getDefaultWidth();
455 	if(hints&LAYOUT_FILL_X)
456 	  expand+=w;
457 	else
458 	  remain-=w;
459 	remain-=hspacing;
460         }
461       }
462 
463     // Adjust
464     remain+=hspacing;
465 
466     // Placement
467     for(child=getFirst(),e=0; child; child=child->getNext()){
468       if(child->shown()){
469 
470         hints=child->getLayoutHints();
471 
472         // Determine child height
473         if(dynamic_cast<FXSeparator*>(child) || dynamic_cast<FXToolBarGrip*>(child)) h=bottom-top;
474         else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight();
475         else if(options&PACK_UNIFORM_HEIGHT) h=mh;
476         else if(hints&LAYOUT_FILL_Y) h=bottom-top;
477         else h=child->getDefaultHeight();
478 
479         // Determine child y-position
480         if(hints&LAYOUT_CENTER_Y) y=top+(bottom-top-h)/2;
481         else if(hints&LAYOUT_BOTTOM) y=bottom-h;
482         else y=top;
483 
484         // Determine child width
485         if(dynamic_cast<FXSeparator*>(child) || dynamic_cast<FXToolBarGrip*>(child)) w=child->getDefaultWidth();
486         else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth();
487         else if(options&PACK_UNIFORM_WIDTH) w=mw;
488         else w=child->getDefaultWidth();
489 
490         // Account for fill or center
491 	if(hints&LAYOUT_FILL_X){
492           t=w*remain;
493           e+=t%expand;
494           w=t/expand+e/expand;
495           e%=expand;
496           }
497 
498         // Determine child x-position
499         if(hints&LAYOUT_RIGHT){
500           x=right-w;
501           right-=w+hspacing;
502           }
503         else{
504           x=left;
505           left+=w+hspacing;
506           }
507 
508         // Place it
509         child->position(x,y,w,h);
510         }
511       }
512     }
513   flags&=~FLAG_DIRTY;
514   }
515 
516 
517 // Dock the bar before other window
dock(FXDockSite * docksite,FXWindow * before,FXbool notify)518 void FXToolBar::dock(FXDockSite* docksite,FXWindow* before,FXbool notify){
519   FXDockBar::dock(docksite,before,notify);
520   setDockingSide(getParent()->getLayoutHints());
521   }
522 
523 
524 // Dock the bar near position in dock site
dock(FXDockSite * docksite,FXint localx,FXint localy,FXbool notify)525 void FXToolBar::dock(FXDockSite* docksite,FXint localx,FXint localy,FXbool notify){
526   FXDockBar::dock(docksite,localx,localy,notify);
527   setDockingSide(getParent()->getLayoutHints());
528   }
529 
530 
531 // Flip orientation
onCmdDockFlip(FXObject *,FXSelector,void *)532 long FXToolBar::onCmdDockFlip(FXObject*,FXSelector,void*){
533   if(wetdock && !isDocked()){
534 
535     // Flip orientation
536     if(getDockingSide()&LAYOUT_SIDE_LEFT)
537       setDockingSide(LAYOUT_SIDE_TOP);
538     else
539       setDockingSide(LAYOUT_SIDE_LEFT);
540 
541     // Note, this takes wetdock's interpretation of layout hints into account
542     wetdock->resize(wetdock->getDefaultWidth(),wetdock->getDefaultHeight());
543     }
544   return 1;
545   }
546 
547 
548 // Check for flip
onUpdDockFlip(FXObject * sender,FXSelector,void *)549 long FXToolBar::onUpdDockFlip(FXObject* sender,FXSelector,void*){
550   sender->handle(this,isDocked()?FXSEL(SEL_COMMAND,ID_DISABLE):FXSEL(SEL_COMMAND,ID_ENABLE),NULL);
551   return 1;
552   }
553 
554 
555 // Change toolbar orientation
setDockingSide(FXuint side)556 void FXToolBar::setDockingSide(FXuint side){
557   side&=LAYOUT_SIDE_MASK;
558   if((options&LAYOUT_SIDE_MASK)!=side){
559 
560     // New orientation is vertical
561     if(side&LAYOUT_SIDE_LEFT){
562       if(!(options&LAYOUT_SIDE_LEFT)){    // Was horizontal
563         if((options&LAYOUT_RIGHT) && (options&LAYOUT_CENTER_X)) side|=LAYOUT_FIX_Y;
564         else if(options&LAYOUT_RIGHT) side|=LAYOUT_BOTTOM;
565         else if(options&LAYOUT_CENTER_X) side|=LAYOUT_CENTER_Y;
566         if(options&LAYOUT_FILL_X){
567           if(options&LAYOUT_FILL_Y) side|=LAYOUT_FILL_X;
568           side|=LAYOUT_FILL_Y;
569           }
570         }
571       else{                               // Was vertical already
572         side|=(options&(LAYOUT_BOTTOM|LAYOUT_CENTER_Y|LAYOUT_FILL_Y));
573         }
574       }
575 
576     // New orientation is horizontal
577     else{
578       if(options&LAYOUT_SIDE_LEFT){       // Was vertical
579         if((options&LAYOUT_BOTTOM) && (options&LAYOUT_CENTER_Y)) side|=LAYOUT_FIX_X;
580         else if(options&LAYOUT_BOTTOM) side|=LAYOUT_RIGHT;
581         else if(options&LAYOUT_CENTER_Y) side|=LAYOUT_CENTER_X;
582         if(options&LAYOUT_FILL_Y){
583           if(options&LAYOUT_FILL_X) side|=LAYOUT_FILL_Y;
584           side|=LAYOUT_FILL_X;
585           }
586         }
587       else{
588         side|=(options&(LAYOUT_RIGHT|LAYOUT_CENTER_X|LAYOUT_FILL_X));
589         }
590       }
591 
592     // Simply preserve these options
593     side|=(options&(LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT));
594 
595     // Update the layout
596     setLayoutHints(side);
597     }
598   }
599 
600 
601 // Get toolbar orientation
getDockingSide() const602 FXuint FXToolBar::getDockingSide() const {
603   return (options&LAYOUT_SIDE_MASK);
604   }
605 
606 
607 }
608