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