1 /*******************************************************************************
2 *                         Goggles Music Manager                                *
3 ********************************************************************************
4 *           Copyright (C) 2009-2021 by Sander Jansen. All Rights Reserved      *
5 *                               ---                                            *
6 * This program is free software: you can redistribute it and/or modify         *
7 * it under the terms of the GNU General Public License as published by         *
8 * the Free Software Foundation, either version 3 of the License, or            *
9 * (at your option) any later version.                                          *
10 *                                                                              *
11 * This program is distributed in the hope that it will be useful,              *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of               *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                *
14 * GNU General Public License for more details.                                 *
15 *                                                                              *
16 * You should have received a copy of the GNU General Public License            *
17 * along with this program.  If not, see http://www.gnu.org/licenses.           *
18 ********************************************************************************/
19 #include "gmdefs.h"
20 #include "fxext.h"
21 
22 // Map
23 FXDEFMAP(GMThreadDialog) GMThreadDialogMap[]={
24   FXMAPFUNC(SEL_KEYPRESS,0,GMThreadDialog::onKeyPress),
25   FXMAPFUNC(SEL_KEYRELEASE,0,GMThreadDialog::onKeyRelease),
26   FXMAPFUNC(SEL_CLOSE,0,GMThreadDialog::onCmdCancel),
27   FXMAPFUNC(SEL_COMMAND,FXDialogBox::ID_ACCEPT,GMThreadDialog::onCmdAccept),
28   FXMAPFUNC(SEL_CHORE,FXDialogBox::ID_CANCEL,GMThreadDialog::onCmdCancel),
29   FXMAPFUNC(SEL_TIMEOUT,FXDialogBox::ID_CANCEL,GMThreadDialog::onCmdCancel),
30   FXMAPFUNC(SEL_COMMAND,FXDialogBox::ID_CANCEL,GMThreadDialog::onCmdCancel),
31   FXMAPFUNC(SEL_COMMAND,GMThreadDialog::ID_THREAD_EXEC,GMThreadDialog::onThreadExec),
32   };
33 
34 
35 // Object implementation
FXIMPLEMENT(GMThreadDialog,FXTopWindow,GMThreadDialogMap,ARRAYNUMBER (GMThreadDialogMap))36 FXIMPLEMENT(GMThreadDialog,FXTopWindow,GMThreadDialogMap,ARRAYNUMBER(GMThreadDialogMap))
37 
38 GMThreadDialog::GMThreadDialog(FXApp* a,const FXString& name,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs):FXTopWindow(a,name,NULL,NULL,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){
39   }
40 
GMThreadDialog(FXWindow * own,const FXString & name,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs)41 GMThreadDialog::GMThreadDialog(FXWindow* own,const FXString& name,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs):FXTopWindow(own,name,NULL,NULL,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){
42   }
43 
onThreadExec(FXObject *,FXSelector,void *)44 long GMThreadDialog::onThreadExec(FXObject*,FXSelector,void*){
45   create();
46   show();
47   return 1;
48   }
49 
execute(FXMessageChannel * channel)50 FXuint GMThreadDialog::execute(FXMessageChannel* channel) {
51   mutex.lock();
52   channel->message(this,FXSEL(SEL_COMMAND,ID_THREAD_EXEC),nullptr,0);
53   condition.wait(mutex);
54   mutex.unlock();
55   return code;
56   }
57 
58 // Close dialog with an accept
onCmdAccept(FXObject *,FXSelector,void *)59 long GMThreadDialog::onCmdAccept(FXObject*,FXSelector,void*){
60   mutex.lock();
61   hide();
62   destroy();
63   code=1;
64   condition.signal();
65   mutex.unlock();
66   return 1;
67   }
68 
69 // Close dialog with a cancel
onCmdCancel(FXObject *,FXSelector,void *)70 long GMThreadDialog::onCmdCancel(FXObject*,FXSelector,void*){
71   mutex.lock();
72   hide();
73   destroy();
74   code=0;
75   condition.signal();
76   mutex.unlock();
77   return 1;
78   }
79 
80 // Keyboard press; handle escape to close the dialog
onKeyPress(FXObject * sender,FXSelector sel,void * ptr)81 long GMThreadDialog::onKeyPress(FXObject* sender,FXSelector sel,void* ptr){
82   if(FXTopWindow::onKeyPress(sender,sel,ptr)) return 1;
83   if(((FXEvent*)ptr)->code==KEY_Escape){
84     handle(this,FXSEL(SEL_COMMAND,ID_CANCEL),nullptr);
85     return 1;
86     }
87   return 0;
88   }
89 
90 // Keyboard release; handle escape to close the dialog
onKeyRelease(FXObject * sender,FXSelector sel,void * ptr)91 long GMThreadDialog::onKeyRelease(FXObject* sender,FXSelector sel,void* ptr){
92   if(FXTopWindow::onKeyRelease(sender,sel,ptr)) return 1;
93   if(((FXEvent*)ptr)->code==KEY_Escape){
94     return 1;
95     }
96   return 0;
97   }
98 
99 
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 // Get highlight color
gm_make_hilite_color(FXColor clr)110 static FXColor gm_make_hilite_color(FXColor clr){
111   FXuint r,g,b;
112   r=FXREDVAL(clr);
113   g=FXGREENVAL(clr);
114   b=FXBLUEVAL(clr);
115   r=FXMAX(31,r);
116   g=FXMAX(31,g);
117   b=FXMAX(31,b);
118   r=(133*r)/100;
119   g=(133*g)/100;
120   b=(133*b)/100;
121   r=FXMIN(255,r);
122   g=FXMIN(255,g);
123   b=FXMIN(255,b);
124   return FXRGB(r,g,b);
125   }
126 
127 // Get shadow color
gm_make_shadow_color(FXColor clr)128 static FXColor gm_make_shadow_color(FXColor clr){
129   FXuint r,g,b;
130   r=FXREDVAL(clr);
131   g=FXGREENVAL(clr);
132   b=FXBLUEVAL(clr);
133   r=(66*r)/100;
134   g=(66*g)/100;
135   b=(66*b)/100;
136   return FXRGB(r,g,b);
137   }
138 
139 
140 
141 
142 
143 // Fill vertical gradient rectangle
fillVerticalGradient(FXDCWindow & dc,FXint x,FXint y,FXint w,FXint h,FXColor top,FXColor bottom)144 void fillVerticalGradient(FXDCWindow & dc,FXint x,FXint y,FXint w,FXint h,FXColor top,FXColor bottom){
145   FXint rr,gg,bb,dr,dg,db,r1,g1,b1,r2,g2,b2,yl,yh,yy,dy,n,t;
146   if(0<w && 0<h){
147     r1=FXREDVAL(top);
148     r2=FXREDVAL(bottom);
149     g1=FXGREENVAL(top);
150     g2=FXGREENVAL(bottom);
151     b1=FXBLUEVAL(top);
152     b2=FXBLUEVAL(bottom);
153     dr=r2-r1;
154     dg=g2-g1;
155     db=b2-b1;
156     n=FXABS(dr);
157     if((t=FXABS(dg))>n) n=t;
158     if((t=FXABS(db))>n) n=t;
159     n++;
160     if(n>h) n=h;
161     if(n>128) n=128;
162     rr=(r1<<16)+32767;
163     gg=(g1<<16)+32767;
164     bb=(b1<<16)+32767;
165     yy=32767;
166     dr=(dr<<16)/n;
167     dg=(dg<<16)/n;
168     db=(db<<16)/n;
169     dy=(h<<16)/n;
170     do{
171       yl=yy>>16;
172       yy+=dy;
173       yh=yy>>16;
174       dc.setForeground(FXRGB(rr>>16,gg>>16,bb>>16));
175       dc.fillRectangle(x,y+yl,w,yh-yl);
176       rr+=dr;
177       gg+=dg;
178       bb+=db;
179       }
180     while(yh<h);
181     }
182   }
183 
184 // Fill horizontal gradient rectangle
fillHorizontalGradient(FXDCWindow & dc,FXint x,FXint y,FXint w,FXint h,FXColor left,FXColor right)185 void fillHorizontalGradient(FXDCWindow & dc,FXint x,FXint y,FXint w,FXint h,FXColor left,FXColor right){
186   FXint rr,gg,bb,dr,dg,db,r1,g1,b1,r2,g2,b2,xl,xh,xx,dx,n,t;
187   if(0<w && 0<h){
188     r1=FXREDVAL(left);
189     r2=FXREDVAL(right);
190     g1=FXGREENVAL(left);
191     g2=FXGREENVAL(right);
192     b1=FXBLUEVAL(left);
193     b2=FXBLUEVAL(right);
194     dr=r2-r1;
195     dg=g2-g1;
196     db=b2-b1;
197     n=FXABS(dr);
198     if((t=FXABS(dg))>n) n=t;
199     if((t=FXABS(db))>n) n=t;
200     n++;
201     if(n>w) n=w;
202     if(n>128) n=128;
203     rr=(r1<<16)+32767;
204     gg=(g1<<16)+32767;
205     bb=(b1<<16)+32767;
206     xx=32767;
207     dr=(dr<<16)/n;
208     dg=(dg<<16)/n;
209     db=(db<<16)/n;
210     dx=(w<<16)/n;
211     do{
212       xl=xx>>16;
213       xx+=dx;
214       xh=xx>>16;
215       dc.setForeground(FXRGB(rr>>16,gg>>16,bb>>16));
216       dc.fillRectangle(x+xl,y,xh-xl,h);
217       rr+=dr;
218       gg+=dg;
219       bb+=db;
220       }
221     while(xh<w);
222     }
223   }
224 
225 FXIMPLEMENT(GMScrollFrame,FXVerticalFrame,nullptr,0)
226 
GMScrollFrame()227 GMScrollFrame::GMScrollFrame(){
228   }
229 
GMScrollFrame(FXComposite * p)230 GMScrollFrame::GMScrollFrame(FXComposite*p):FXVerticalFrame(p,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_LINE,0,0,0,0,0,0,0,0,0,0){
231   borderColor=getApp()->getShadowColor();
232   }
233 
234 
235 FXIMPLEMENT(GMScrollHFrame,FXHorizontalFrame,nullptr,0)
236 
GMScrollHFrame()237 GMScrollHFrame::GMScrollHFrame(){
238   }
239 
GMScrollHFrame(FXComposite * p)240 GMScrollHFrame::GMScrollHFrame(FXComposite*p):FXHorizontalFrame(p,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_LINE,0,0,0,0,0,0,0,0,0,0){
241   borderColor=getApp()->getShadowColor();
242   }
243 
244 
245 FXIMPLEMENT(GMTabFrame,FXVerticalFrame,nullptr,0)
246 
GMTabFrame()247 GMTabFrame::GMTabFrame(){
248   }
249 
GMTabFrame(FXComposite * p)250 GMTabFrame::GMTabFrame(FXComposite*p):FXVerticalFrame(p,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_LINE,0,0,0,0){
251   borderColor=getApp()->getShadowColor();
252   }
253 
254 
255 FXIMPLEMENT(GMHeaderItem,FXHeaderItem,nullptr,0)
256 
257 
258 // Map
259 FXDEFMAP(GMHeader) GMHeaderMap[]={
260   FXMAPFUNC(SEL_PAINT,0,GMHeader::onPaint),
261   };
262 
263 
264 // Object implementation
FXIMPLEMENT(GMHeader,FXHeader,GMHeaderMap,ARRAYNUMBER (GMHeaderMap))265 FXIMPLEMENT(GMHeader,FXHeader,GMHeaderMap,ARRAYNUMBER(GMHeaderMap))
266 
267 
268 // Make a Header
269 GMHeader::GMHeader(){
270   }
271 
272 // Make a Header
GMHeader(FXComposite * p,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)273 GMHeader::GMHeader(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb):
274   FXHeader(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){
275   }
276 
277 // Handle repaint
onPaint(FXObject *,FXSelector,void * ptr)278 long GMHeader::onPaint(FXObject*,FXSelector,void* ptr){
279   FXEvent *ev=(FXEvent*)ptr;
280   FXDCWindow dc(this,ev);
281   FXint x,y,w,h,i,ilo,ihi;
282 
283   // Set font
284   dc.setFont(font);
285 
286   // Paint background
287 
288   fillVerticalGradient(dc,ev->rect.x,0,ev->rect.w,height-1,gm_make_hilite_color(backColor),gm_make_hilite_color(gm_make_shadow_color(backColor)));
289   dc.setForeground(shadowColor);
290   dc.fillRectangle(ev->rect.x,height-1,ev->rect.w,1);
291 
292  // dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h);
293 
294   // Vertical
295   if(options&HEADER_VERTICAL){
296 
297     // Determine affected items
298     ilo=getItemAt(ev->rect.y);
299     ihi=getItemAt(ev->rect.y+ev->rect.h);
300 
301     // Fragment below first item
302     if(ilo<0){
303       y=pos;
304       if(0<items.no()){
305         y=pos+items[0]->getPos();
306         }
307       if(0<y){
308         if(options&FRAME_THICK)
309           drawDoubleRaisedRectangle(dc,0,0,width,y);
310         else if(options&FRAME_RAISED)
311           drawRaisedRectangle(dc,0,0,width,y);
312         }
313       ilo=0;
314       }
315 
316     // Fragment above last item
317     if(ihi>=items.no()){
318       y=pos;
319       if(0<items.no()){
320         y=pos+items[items.no()-1]->getPos()+items[items.no()-1]->getSize();
321         }
322       if(y<height){
323         if(options&FRAME_THICK)
324           drawDoubleRaisedRectangle(dc,0,y,width,height-y);
325         else if(options&FRAME_RAISED)
326           drawRaisedRectangle(dc,0,y,width,height-y);
327         }
328       ihi=items.no()-1;
329       }
330 
331     // Draw only affected items
332     for(i=ilo; i<=ihi; i++){
333       y=pos+items[i]->getPos();
334       h=items[i]->getSize();
335       if(items[i]->isPressed()){
336         if(options&FRAME_THICK)
337           drawDoubleSunkenRectangle(dc,0,y,width,h);
338         else if(options&FRAME_RAISED)
339           drawSunkenRectangle(dc,0,y,width,h);
340         }
341       else{
342         if(options&FRAME_THICK)
343           drawDoubleRaisedRectangle(dc,0,y,width,h);
344         else if(options&FRAME_RAISED)
345           drawRaisedRectangle(dc,0,y,width,h);
346         }
347       static_cast<GMHeaderItem*>(items[i])->draw(this,dc,0,y,width,h);
348       }
349     }
350 
351   // Horizontal
352   else{
353 
354     // Determine affected items
355     ilo=getItemAt(ev->rect.x);
356     ihi=getItemAt(ev->rect.x+ev->rect.w);
357 
358     // Fragment below first item
359     if(ilo<0){
360 /*
361       x=pos;
362       if(0<items.no()){
363         x=pos+items[0]->getPos();
364         }
365 */
366 /*
367       if(0<x){
368         if(options&FRAME_THICK)
369           drawDoubleRaisedRectangle(dc,0,0,x,height);
370         else if(options&FRAME_RAISED)
371           drawRaisedRectangle(dc,0,0,x,height);
372         }
373 */
374       ilo=0;
375       }
376 
377     // Fragment above last item
378     if(ihi>=items.no()){
379       x=pos;
380       if(0<items.no()){
381         x=pos+items[items.no()-1]->getPos()+items[items.no()-1]->getSize();
382         }
383       if(x<width){
384 
385         dc.setForeground(hiliteColor);
386         dc.fillRectangle(x,0,1,height);
387         }
388 
389  /*
390 
391         if(options&FRAME_THICK)
392           drawDoubleRaisedRectangle(dc,x,0,width-x,height);
393         else if(options&FRAME_RAISED)
394           drawRaisedRectangle(dc,x,0,width-x,height);
395         }
396 */
397       ihi=items.no()-1;
398       }
399 
400     // Draw only the affected items
401     for(i=ilo; i<=ihi; i++){
402       x=pos+items[i]->getPos();
403       w=items[i]->getSize();
404       if(items[i]->isPressed()){
405 
406         if (x>0) {
407         dc.setForeground(hiliteColor);
408         dc.fillRectangle(x,0,1,height);
409          }
410 
411         dc.setForeground(shadowColor);
412         dc.fillRectangle(x+w-1,0,1,height);
413 
414 
415       /*
416         if(options&FRAME_THICK)
417           drawDoubleSunkenRectangle(dc,x,0,w,height);
418         else if(options&FRAME_RAISED)
419           drawSunkenRectangle(dc,x,0,w,height);
420 
421           */
422         }
423       else{
424         if (x>0) {
425 
426         dc.setForeground(hiliteColor);
427         dc.fillRectangle(x,0,1,height);
428           }
429 
430         dc.setForeground(shadowColor);
431         dc.fillRectangle(x+w-1,0,1,height);
432       /*
433         if(options&FRAME_THICK)
434           drawDoubleRaisedRectangle(dc,x,0,w,height);
435         else if(options&FRAME_RAISED)
436           drawRaisedRectangle(dc,x,0,w,height);
437 
438          */
439         }
440       static_cast<GMHeaderItem*>(items[i])->draw(this,dc,x,0,w,height);
441       }
442     }
443   return 1;
444   }
445 
446 
447 
448 FXIMPLEMENT(GMMenuCommand,FXMenuCommand,nullptr,0)
449 
GMMenuCommand(FXComposite * p,const FXString & text,FXIcon * ic,FXObject * tgt,FXSelector sel,FXuint opts)450 GMMenuCommand::GMMenuCommand(FXComposite* p,const FXString& text,FXIcon* ic,FXObject* tgt,FXSelector sel,FXuint opts) : FXMenuCommand(p,text,ic,tgt,sel,opts){
451   backColor=getApp()->getBackColor();
452   }
453 
454 
455 FXIMPLEMENT(GMMenuCheck,FXMenuCheck,nullptr,0)
456 
GMMenuCheck(FXComposite * p,const FXString & text,FXObject * tgt,FXSelector sel,FXuint opts)457 GMMenuCheck::GMMenuCheck(FXComposite* p,const FXString& text,FXObject* tgt,FXSelector sel,FXuint opts) : FXMenuCheck(p,text,tgt,sel,opts){
458   backColor=getApp()->getBackColor();
459   }
460 
461 
462 FXIMPLEMENT(GMMenuRadio,FXMenuRadio,nullptr,0)
463 
GMMenuRadio(FXComposite * p,const FXString & text,FXObject * tgt,FXSelector sel,FXuint opts)464 GMMenuRadio::GMMenuRadio(FXComposite* p,const FXString& text,FXObject* tgt,FXSelector sel,FXuint opts) : FXMenuRadio(p,text,tgt,sel,opts){
465   backColor=getApp()->getBackColor();
466   }
467 
468 
469 FXIMPLEMENT(GMMenuCascade,FXMenuCascade,nullptr,0)
470 
GMMenuCascade(FXComposite * p,const FXString & text,FXIcon * ic,FXPopup * pup,FXuint opts)471 GMMenuCascade::GMMenuCascade(FXComposite* p,const FXString& text,FXIcon* ic,FXPopup* pup,FXuint opts) : FXMenuCascade(p,text,ic,pup,opts){
472   backColor=getApp()->getBackColor();
473   }
474 
475 FXIMPLEMENT(GMMenuPane,FXMenuPane,nullptr,0)
476 
GMMenuPane(FXWindow * o,FXuint opts)477 GMMenuPane::GMMenuPane(FXWindow* o,FXuint opts) : FXMenuPane(o,opts) {
478   borderColor=getApp()->getShadowColor();
479   setFrameStyle(FRAME_LINE);
480   }
481 
482 
483 FXDEFMAP(GMTextField) GMTextFieldMap[]={
484   FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,GMTextField::onLeftBtnPress)
485   };
486 
FXIMPLEMENT(GMTextField,FXTextField,GMTextFieldMap,ARRAYNUMBER (GMTextFieldMap))487 FXIMPLEMENT(GMTextField,FXTextField,GMTextFieldMap,ARRAYNUMBER(GMTextFieldMap))
488 
489 GMTextField::GMTextField(FXComposite* p,FXint ncols,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXTextField(p,ncols,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){
490   borderColor=getApp()->getShadowColor();
491   setFrameStyle(FRAME_LINE);
492   }
493 
extendWordSelection(FXint pos,FXbool)494 FXbool GMTextField::extendWordSelection(FXint pos,FXbool /*notify*/) {
495   FXint sp,ep;
496   pos=contents.validate(FXCLAMP(0,pos,contents.length()));
497   if(pos<=anchor){
498     sp=wordStart(pos);
499     ep=wordEnd(anchor);
500     }
501   else{
502     sp=wordStart(anchor);
503     ep=wordEnd(pos);
504     }
505   return setSelection(sp,ep-sp);
506   }
507 
508 
509 
510 
511 
512 
513 
514 // Pressed left button
onLeftBtnPress(FXObject *,FXSelector,void * ptr)515 long GMTextField::onLeftBtnPress(FXObject*,FXSelector,void* ptr){
516   FXEvent* ev=(FXEvent*)ptr;
517   flags&=~FLAG_TIP;
518   handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr);
519   if(isEnabled()){
520     grab();
521     if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1;
522     flags&=~FLAG_UPDATE;
523     if(ev->click_count==1){
524       setCursorPos(index(ev->win_x));
525       if(ev->state&SHIFTMASK){
526         extendSelection(cursor);
527         }
528       else{
529         killSelection();
530         setAnchorPos(cursor);
531         }
532       makePositionVisible(cursor);
533       flags|=FLAG_PRESSED;
534       }
535     else if (ev->click_count==2) {
536       setAnchorPos(cursor);
537       extendWordSelection(cursor,true);
538       }
539     else{
540       setAnchorPos(0);
541       setCursorPos(contents.length());
542       extendSelection(contents.length());
543       makePositionVisible(cursor);
544       }
545     return 1;
546     }
547   return 0;
548   }
549 
550 
551 FXIMPLEMENT(GMSpinner,FXSpinner,nullptr,0)
552 
GMSpinner(FXComposite * p,FXint ncols,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)553 GMSpinner::GMSpinner(FXComposite* p,FXint ncols,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXSpinner(p,ncols,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){
554   borderColor=getApp()->getShadowColor();
555   setFrameStyle(FRAME_LINE);
556   upButton->setFrameStyle(FRAME_NONE);
557   downButton->setFrameStyle(FRAME_NONE);
558 
559   upButton->setPadLeft(1);
560   upButton->setPadRight(1);
561   upButton->setPadTop(2);
562   upButton->setPadBottom(2);
563   downButton->setPadLeft(1);
564   downButton->setPadRight(1);
565   downButton->setPadTop(2);
566   downButton->setPadBottom(2);
567   }
568 
569 
570 FXDEFMAP(GMMenuTitle) GMMenuTitleMap[]={
571   FXMAPFUNC(SEL_PAINT,0,GMMenuTitle::onPaint),
572   FXMAPFUNC(SEL_COMMAND,FXWindow::ID_POST,GMMenuTitle::onCmdPost),
573   };
574 
FXIMPLEMENT(GMMenuTitle,FXMenuTitle,GMMenuTitleMap,ARRAYNUMBER (GMMenuTitleMap))575 FXIMPLEMENT(GMMenuTitle,FXMenuTitle,GMMenuTitleMap,ARRAYNUMBER(GMMenuTitleMap))
576 
577 GMMenuTitle::GMMenuTitle(FXComposite* p,const FXString& text,FXIcon* ic,FXPopup* pup,FXuint opts) : FXMenuTitle(p,text,ic,pup,opts){
578   selbackColor=getApp()->getSelbackColor();
579   seltextColor=getApp()->getSelforeColor();
580   }
581 
582 
583 // Handle repaint
onPaint(FXObject *,FXSelector,void * ptr)584 long GMMenuTitle::onPaint(FXObject*,FXSelector,void* ptr){
585   FXEvent *ev=(FXEvent*)ptr;
586   FXDCWindow dc(this,ev);
587   FXint xx,yy;
588   dc.setFont(font);
589   xx=6;
590   yy=0;
591   if(isEnabled()){
592     if(isActive()){
593       dc.setForeground(gm_make_shadow_color(selbackColor));
594 
595 //      dc.fillRectangle(0,height-1,width,1);
596       dc.fillRectangle(width-1,0,1,height);
597       dc.fillRectangle(0,0,width,1);
598       dc.fillRectangle(0,0,1,height);
599 
600       dc.setForeground(selbackColor);
601       dc.fillRectangle(1,1,width-2,height-1);
602       xx++;
603       yy++;
604       }
605     else if(underCursor()){
606       dc.setForeground(backColor);
607       dc.fillRectangle(0,0,width,height);
608      }
609     else{
610       dc.setForeground(backColor);
611       dc.fillRectangle(0,0,width,height);
612       }
613     if(icon){
614       dc.drawIcon(icon,xx,yy+(height-icon->getHeight())/2);
615       xx+=5+icon->getWidth();
616       }
617     if(!label.empty()){
618       yy+=font->getFontAscent()+(height-font->getFontHeight())/2;
619       dc.setForeground(isActive() ? seltextColor : textColor);
620       dc.drawText(xx,yy,label);
621       if(0<=hotoff){
622         dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1);
623         }
624       }
625     }
626   else{
627     dc.setForeground(backColor);
628     dc.fillRectangle(0,0,width,height);
629     if(icon){
630       dc.drawIconSunken(icon,xx,yy+(height-icon->getHeight())/2);
631       xx+=5+icon->getWidth();
632       }
633     if(!label.empty()){
634       yy+=font->getFontAscent()+(height-font->getFontHeight())/2;
635       dc.setForeground(hiliteColor);
636       dc.drawText(xx+1,yy+1,label);
637       if(0<=hotoff){
638         dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1);
639         }
640       dc.setForeground(shadowColor);
641       dc.drawText(xx,yy,label);
642       if(0<=hotoff){
643         dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1);
644         }
645       }
646     }
647   return 1;
648   }
649 
650 // Post the menu
onCmdPost(FXObject *,FXSelector,void *)651 long GMMenuTitle::onCmdPost(FXObject*,FXSelector,void*){
652   FXint x,y,side;
653   if(pane && !pane->shown()){
654     translateCoordinatesTo(x,y,getRoot(),0,0);
655     side=getParent()->getLayoutHints();
656     if(side&LAYOUT_SIDE_LEFT){  // Vertical
657       //y-=1;
658       if(side&LAYOUT_SIDE_BOTTOM){      // On right
659         x-=pane->getDefaultWidth();
660         }
661       else{                             // On left
662         x+=width;
663         }
664       }
665     else{                       // Horizontal
666       //x-=1;
667       if(side&LAYOUT_SIDE_BOTTOM){      // On bottom
668         y-=pane->getDefaultHeight();
669         }
670       else{                             // On top
671         y+=height;
672         }
673       }
674     pane->popup(getParent(),x,y);
675     if(!getParent()->grabbed()) getParent()->grab();
676     }
677   flags&=~FLAG_UPDATE;
678   flags|=FLAG_ACTIVE;
679   update();
680   return 1;
681   }
682 
683 
684 FXDEFMAP(GMButton) GMButtonMap[]={
685   FXMAPFUNC(SEL_PAINT,0,GMButton::onPaint)
686   };
687 
FXIMPLEMENT(GMButton,FXButton,GMButtonMap,ARRAYNUMBER (GMButtonMap))688 FXIMPLEMENT(GMButton,FXButton,GMButtonMap,ARRAYNUMBER(GMButtonMap))
689 
690 
691 GMButton::GMButton(){
692   }
693 
GMButton(FXComposite * p,const FXString & text,FXIcon * ic,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)694 GMButton::GMButton(FXComposite* p,const FXString& text,FXIcon* ic,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXButton(p,text,ic,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
695   }
696 
697 // Handle repaint
onPaint(FXObject *,FXSelector,void * ptr)698 long GMButton::onPaint(FXObject*,FXSelector,void* ptr){
699  FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy;
700   FXEvent*ev=(FXEvent*)ptr;
701   FXDCWindow dc(this,ev);
702 
703 //  shadowColor         = gm_make_shadow_color(baseColor);
704   FXColor top         = gm_make_hilite_color(backColor);
705   FXColor bottom      = gm_make_hilite_color(shadowColor);
706   FXColor shade       = gm_make_hilite_color(shadowColor);
707   FXColor bordercolor = shadowColor;
708 
709   FXPoint basebackground[4]={FXPoint(0,0),FXPoint(width-1,0),FXPoint(0,height-1),FXPoint(width-1,height-1)};
710 
711   FXPoint bordershade[16]={FXPoint(0,1),FXPoint(1,0),FXPoint(1,2),FXPoint(2,1),
712                           FXPoint(width-2,0),FXPoint(width-1,1),FXPoint(width-3,1),FXPoint(width-2,2),
713                           FXPoint(0,height-2),FXPoint(1,height-1),FXPoint(1,height-3),FXPoint(2,height-2),
714                           FXPoint(width-1,height-2),FXPoint(width-2,height-1),FXPoint(width-2,height-3),FXPoint(width-3,height-2)
715                           };
716   FXPoint bordercorners[4]={FXPoint(1,1),FXPoint(1,height-2),FXPoint(width-2,1),FXPoint(width-2,height-2)};
717 
718   if (options&BUTTON_TOOLBAR && (!underCursor() || !isEnabled())) {
719     dc.setForeground(baseColor);
720     dc.fillRectangle(0,0,width,height);
721     }
722   else if (state==STATE_UP && ((options&BUTTON_TOOLBAR)==0 || (options&BUTTON_TOOLBAR && underCursor()))) {
723 
724     /// Outside Background
725     dc.setForeground(baseColor);
726     dc.drawPoints(basebackground,4);
727 
728     /// Border
729     dc.setForeground(bordercolor);
730     dc.drawRectangle(2,0,width-5,0);
731     dc.drawRectangle(2,height-1,width-5,height-1);
732     dc.drawRectangle(0,2,0,height-5);
733     dc.drawRectangle(width-1,2,0,height-5);
734     dc.drawPoints(bordercorners,4);
735     dc.setForeground(shade);
736     dc.drawPoints(bordershade,16);
737 
738     fillVerticalGradient(dc,2,1,width-4,height-2,top,bottom);
739     dc.setForeground(top);
740     dc.drawRectangle(1,3,0,height-7);
741     dc.setForeground(bottom);
742     dc.drawRectangle(width-2,3,0,height-7);
743     }
744   else {
745     /// Outside Background
746     dc.setForeground(baseColor);
747     dc.drawPoints(basebackground,4);
748 
749     /// Border
750     dc.setForeground(bordercolor);
751     dc.drawRectangle(2,0,width-5,0);
752     dc.drawRectangle(2,height-1,width-5,height-1);
753     dc.drawRectangle(0,2,0,height-5);
754     dc.drawRectangle(width-1,2,0,height-5);
755     dc.drawPoints(bordercorners,4);
756     dc.setForeground(shade);
757     dc.drawPoints(bordershade,16);
758 
759     dc.setForeground(baseColor);
760     dc.fillRectangle(2,1,width-4,height-2);
761 
762 
763     //dc.setForeground(FXRGB(0xdc,0xd4,0xc9));
764     //dc.fillRectangle(2,1,width-4,height-2);
765     }
766 
767   // Place text & icon
768   if(!label.empty()){
769     tw=labelWidth(label);
770     th=labelHeight(label);
771     }
772   if(icon){
773     iw=icon->getWidth();
774     ih=icon->getHeight();
775     }
776 
777   just_x(tx,ix,tw,iw);
778   just_y(ty,iy,th,ih);
779 
780   // Shift a bit when pressed
781   if(state && (options&(FRAME_RAISED|FRAME_SUNKEN))){ ++tx; ++ty; ++ix; ++iy; }
782 
783   // Draw enabled state
784   if(isEnabled()){
785     if(icon){
786       dc.drawIcon(icon,ix,iy);
787       }
788     if(!label.empty()){
789       dc.setFont(font);
790       dc.setForeground(textColor);
791       drawLabel(dc,label,hotoff,tx,ty,tw,th);
792       }
793     if(hasFocus()){
794       dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2);
795       }
796     }
797 
798   // Draw grayed-out state
799   else{
800     if(icon){
801       dc.drawIconSunken(icon,ix,iy);
802       }
803     if(!label.empty()){
804       dc.setFont(font);
805       dc.setForeground(hiliteColor);
806       drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
807       dc.setForeground(shadowColor);
808       drawLabel(dc,label,hotoff,tx,ty,tw,th);
809       }
810     }
811   return 1;
812   }
813 
814 
815 
816 
817 
818 
819 
820 
821 
822 
823 
824 
825 
826 
827 
828 FXDEFMAP(GMToggleButton) GMToggleButtonMap[]={
829   FXMAPFUNC(SEL_PAINT,0,GMToggleButton::onPaint)
830   };
831 
FXIMPLEMENT(GMToggleButton,FXToggleButton,GMToggleButtonMap,ARRAYNUMBER (GMToggleButtonMap))832 FXIMPLEMENT(GMToggleButton,FXToggleButton,GMToggleButtonMap,ARRAYNUMBER(GMToggleButtonMap))
833 
834 
835 GMToggleButton::GMToggleButton(){
836   }
837 
GMToggleButton(FXComposite * p,const FXString & text1,const FXString & text2,FXIcon * ic1,FXIcon * ic2,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)838 GMToggleButton::GMToggleButton(FXComposite* p,const FXString& text1,const FXString& text2,FXIcon* ic1,FXIcon* ic2,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXToggleButton(p,text1,text2,ic1,ic2,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
839   }
840 
841 // Handle repaint
onPaint(FXObject *,FXSelector,void * ptr)842 long GMToggleButton::onPaint(FXObject*,FXSelector,void* ptr){
843   FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy;
844   FXEvent *ev=(FXEvent*)ptr;
845   FXDCWindow dc(this,ev);
846 
847 
848   FXColor top         = gm_make_hilite_color(backColor);
849   FXColor bottom      = gm_make_hilite_color(shadowColor);
850   FXColor shade       = gm_make_hilite_color(shadowColor);
851   FXColor bordercolor = shadowColor;
852 
853   FXPoint basebackground[4]={FXPoint(0,0),FXPoint(width-1,0),FXPoint(0,height-1),FXPoint(width-1,height-1)};
854 
855   FXPoint bordershade[16]={FXPoint(0,1),FXPoint(1,0),FXPoint(1,2),FXPoint(2,1),
856                           FXPoint(width-2,0),FXPoint(width-1,1),FXPoint(width-3,1),FXPoint(width-2,2),
857                           FXPoint(0,height-2),FXPoint(1,height-1),FXPoint(1,height-3),FXPoint(2,height-2),
858                           FXPoint(width-1,height-2),FXPoint(width-2,height-1),FXPoint(width-2,height-3),FXPoint(width-3,height-2)
859                           };
860   FXPoint bordercorners[4]={FXPoint(1,1),FXPoint(1,height-2),FXPoint(width-2,1),FXPoint(width-2,height-2)};
861 
862 
863   // Got a border at all?
864   if(options&(FRAME_RAISED|FRAME_SUNKEN)){
865 
866     // Toolbar style
867     if(options&TOGGLEBUTTON_TOOLBAR){
868 
869       // Enabled and cursor inside and down
870       if(down || ((options&TOGGLEBUTTON_KEEPSTATE) && state)){
871 
872 
873         /// Outside Background
874         dc.setForeground(baseColor);
875         dc.drawPoints(basebackground,4);
876 
877         /// Border
878         dc.setForeground(bordercolor);
879         dc.drawRectangle(2,0,width-5,0);
880         dc.drawRectangle(2,height-1,width-5,height-1);
881         dc.drawRectangle(0,2,0,height-5);
882         dc.drawRectangle(width-1,2,0,height-5);
883         dc.drawPoints(bordercorners,4);
884         dc.setForeground(shade);
885         dc.drawPoints(bordershade,16);
886 
887         dc.setForeground(baseColor);
888         dc.fillRectangle(2,1,width-4,height-2);
889         }
890 
891       // Enabled and cursor inside, and up
892       else if(isEnabled() && underCursor()){
893         /// Outside Background
894         dc.setForeground(baseColor);
895         dc.drawPoints(basebackground,4);
896 
897         /// Border
898         dc.setForeground(bordercolor);
899         dc.drawRectangle(2,0,width-5,0);
900         dc.drawRectangle(2,height-1,width-5,height-1);
901         dc.drawRectangle(0,2,0,height-5);
902         dc.drawRectangle(width-1,2,0,height-5);
903         dc.drawPoints(bordercorners,4);
904         dc.setForeground(shade);
905         dc.drawPoints(bordershade,16);
906 
907         fillVerticalGradient(dc,2,1,width-4,height-2,top,bottom);
908         dc.setForeground(top);
909         dc.drawRectangle(1,3,0,height-7);
910         dc.setForeground(bottom);
911         dc.drawRectangle(width-2,3,0,height-7);
912         }
913 
914       // Disabled or unchecked or not under cursor
915       else{
916         dc.setForeground(backColor);
917         dc.fillRectangle(0,0,width,height);
918         }
919       }
920 
921     // Normal style
922     else{
923 
924       // Draw sunken if pressed
925       if(down || ((options&TOGGLEBUTTON_KEEPSTATE) && state)){
926         dc.setForeground(hiliteColor);
927         dc.fillRectangle(border,border,width-border*2,height-border*2);
928         if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height);
929         else drawSunkenRectangle(dc,0,0,width,height);
930         }
931 
932       // Draw raised if not currently pressed down
933       else{
934         dc.setForeground(backColor);
935         dc.fillRectangle(border,border,width-border*2,height-border*2);
936         if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height);
937         else drawRaisedRectangle(dc,0,0,width,height);
938         }
939 
940       }
941     }
942 
943   // No borders
944   else{
945     dc.setForeground(backColor);
946     dc.fillRectangle(0,0,width,height);
947     }
948 
949   // Place text & icon
950   if(state && !altlabel.empty()){
951     tw=labelWidth(altlabel);
952     th=labelHeight(altlabel);
953     }
954   else if(!label.empty()){
955     tw=labelWidth(label);
956     th=labelHeight(label);
957     }
958   if(state && alticon){
959     iw=alticon->getWidth();
960     ih=alticon->getHeight();
961     }
962   else if(icon){
963     iw=icon->getWidth();
964     ih=icon->getHeight();
965     }
966 
967   just_x(tx,ix,tw,iw);
968   just_y(ty,iy,th,ih);
969 
970   // Shift a bit when pressed
971   if((down || ((options&TOGGLEBUTTON_KEEPSTATE) && state)) && (options&(FRAME_RAISED|FRAME_SUNKEN))){ ++tx; ++ty; ++ix; ++iy; }
972 
973   // Draw enabled state
974   if(isEnabled()){
975     if(state && alticon){
976       dc.drawIcon(alticon,ix,iy);
977       }
978     else if(icon){
979       dc.drawIcon(icon,ix,iy);
980       }
981     if(state && !altlabel.empty()){
982       dc.setFont(font);
983       dc.setForeground(textColor);
984       drawLabel(dc,altlabel,althotoff,tx,ty,tw,th);
985       }
986     else if(!label.empty()){
987       dc.setFont(font);
988       dc.setForeground(textColor);
989       drawLabel(dc,label,hotoff,tx,ty,tw,th);
990       }
991     if(hasFocus()){
992       dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2);
993       }
994     }
995 
996   // Draw grayed-out state
997   else{
998     if(state && alticon){
999       dc.drawIconSunken(alticon,ix,iy);
1000       }
1001     else if(icon){
1002       dc.drawIconSunken(icon,ix,iy);
1003       }
1004     if(state && !altlabel.empty()){
1005       dc.setFont(font);
1006       dc.setForeground(hiliteColor);
1007       drawLabel(dc,altlabel,althotoff,tx+1,ty+1,tw,th);
1008       dc.setForeground(shadowColor);
1009       drawLabel(dc,altlabel,althotoff,tx,ty,tw,th);
1010       }
1011     else if(!label.empty()){
1012       dc.setFont(font);
1013       dc.setForeground(hiliteColor);
1014       drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
1015       dc.setForeground(shadowColor);
1016       drawLabel(dc,label,hotoff,tx,ty,tw,th);
1017       }
1018     }
1019   return 1;
1020   }
1021 
1022 
1023 
1024 FXIMPLEMENT(GMRadioButton,FXRadioButton,nullptr,0)
1025 
1026 
GMRadioButton()1027 GMRadioButton::GMRadioButton(){
1028   }
1029 
GMRadioButton(FXComposite * p,const FXString & text,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)1030 GMRadioButton::GMRadioButton(FXComposite* p,const FXString& text,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXRadioButton(p,text,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
1031  // borderColor=getApp()->getShadowColor();
1032 
1033   borderColor=getApp()->getBackColor();
1034   hiliteColor=getApp()->getShadowColor();
1035   baseColor=getApp()->getBackColor();
1036 
1037 
1038   }
1039 
1040 FXDEFMAP(GMCheckButton) GMCheckButtonMap[]={
1041   FXMAPFUNC(SEL_PAINT,0,GMCheckButton::onPaint)
1042   };
1043 
FXIMPLEMENT(GMCheckButton,FXCheckButton,GMCheckButtonMap,ARRAYNUMBER (GMCheckButtonMap))1044 FXIMPLEMENT(GMCheckButton,FXCheckButton,GMCheckButtonMap,ARRAYNUMBER(GMCheckButtonMap))
1045 
1046 
1047 GMCheckButton::GMCheckButton(){
1048   }
1049 
GMCheckButton(FXComposite * p,const FXString & text,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)1050 GMCheckButton::GMCheckButton(FXComposite* p,const FXString& text,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXCheckButton(p,text,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
1051   }
1052 
onPaint(FXObject *,FXSelector,void * ptr)1053 long GMCheckButton::onPaint(FXObject*,FXSelector,void* ptr){
1054   FXEvent *ev=(FXEvent*)ptr;
1055   FXint tw=0,th=0,tx,ty,ix,iy;
1056   FXDCWindow dc(this,ev);
1057 
1058   // Figure text size
1059   if(!label.empty()){
1060     tw=labelWidth(label);
1061     th=labelHeight(label);
1062     }
1063 
1064   // Placement
1065   just_x(tx,ix,tw,13);
1066   just_y(ty,iy,th,13);
1067 
1068   // Widget background
1069   dc.setForeground(backColor);
1070   dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h);
1071 
1072   // Check background
1073   if(check==maybe || !isEnabled())
1074     dc.setForeground(baseColor);
1075   else
1076     dc.setForeground(boxColor);
1077   dc.fillRectangle(ix+2,iy+2,9,9);
1078 
1079   // Check border
1080   if(options&CHECKBUTTON_PLUS){
1081     dc.setForeground(textColor);
1082     dc.drawRectangle(ix+2,iy+2,8,8);
1083     }
1084   else{
1085     dc.setForeground(shadowColor);
1086     dc.drawRectangle(ix+1,iy+1,10,10);
1087     }
1088 
1089   // Check color
1090   if(check==maybe || !isEnabled())
1091     dc.setForeground(shadowColor);
1092   else
1093     dc.setForeground(checkColor);
1094 
1095   // Show as +
1096   if(options&CHECKBUTTON_PLUS){
1097     if(check!=true){
1098       dc.fillRectangle(ix+6,iy+4,1,5);
1099       }
1100     dc.fillRectangle(ix+4,iy+6,5,1);
1101     }
1102 
1103   // Show as v
1104   else{
1105     if(check!=false){
1106       FXSegment seg[6];
1107 #ifndef _WIN32
1108       seg[0].x1=3+ix; seg[0].y1=5+iy; seg[0].x2=5+ix; seg[0].y2=7+iy;
1109       seg[1].x1=3+ix; seg[1].y1=6+iy; seg[1].x2=5+ix; seg[1].y2=8+iy;
1110       seg[2].x1=3+ix; seg[2].y1=7+iy; seg[2].x2=5+ix; seg[2].y2=9+iy;
1111       seg[3].x1=5+ix; seg[3].y1=7+iy; seg[3].x2=9+ix; seg[3].y2=3+iy;
1112       seg[4].x1=5+ix; seg[4].y1=8+iy; seg[4].x2=9+ix; seg[4].y2=4+iy;
1113       seg[5].x1=5+ix; seg[5].y1=9+iy; seg[5].x2=9+ix; seg[5].y2=5+iy;
1114 #else
1115       seg[0].x1=3+ix; seg[0].y1=5+iy; seg[0].x2=5+ix; seg[0].y2=7+iy;
1116       seg[1].x1=3+ix; seg[1].y1=6+iy; seg[1].x2=5+ix; seg[1].y2=8+iy;
1117       seg[2].x1=3+ix; seg[2].y1=7+iy; seg[2].x2=5+ix; seg[2].y2=9+iy;
1118       seg[3].x1=5+ix; seg[3].y1=7+iy; seg[3].x2=10+ix; seg[3].y2=2+iy;
1119       seg[4].x1=5+ix; seg[4].y1=8+iy; seg[4].x2=10+ix; seg[4].y2=3+iy;
1120       seg[5].x1=5+ix; seg[5].y1=9+iy; seg[5].x2=10+ix; seg[5].y2=4+iy;
1121 #endif
1122       dc.drawLineSegments(seg,6);
1123       }
1124     }
1125 
1126   // Text
1127   if(!label.empty()){
1128     dc.setFont(font);
1129     if(isEnabled()){
1130       dc.setForeground(textColor);
1131       drawLabel(dc,label,hotoff,tx,ty,tw,th);
1132       if(hasFocus()){
1133         dc.drawFocusRectangle(tx-1,ty-1,tw+2,th+2);
1134         }
1135       }
1136     else{
1137       dc.setForeground(hiliteColor);
1138       drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
1139       dc.setForeground(shadowColor);
1140       drawLabel(dc,label,hotoff,tx,ty,tw,th);
1141       }
1142     }
1143 
1144   // Frame
1145   drawFrame(dc,0,0,width,height);
1146 
1147   return 1;
1148   }
1149 
1150 
1151 
1152 
1153 
1154 
1155 
1156 
1157 
1158 
1159 
1160 
1161 
1162 
1163 #define MENUBUTTONARROW_WIDTH   11
1164 #define MENUBUTTONARROW_HEIGHT  5
1165 
1166 #define MENUBUTTON_MASK         (MENUBUTTON_AUTOGRAY|MENUBUTTON_AUTOHIDE|MENUBUTTON_TOOLBAR|MENUBUTTON_NOARROWS)
1167 #define POPUP_MASK              (MENUBUTTON_UP|MENUBUTTON_LEFT)
1168 #define ATTACH_MASK             (MENUBUTTON_ATTACH_RIGHT|MENUBUTTON_ATTACH_CENTER)
1169 
1170 
1171 
1172 FXDEFMAP(GMMenuButton) GMMenuButtonMap[]={
1173   FXMAPFUNC(SEL_PAINT,0,GMMenuButton::onPaint)
1174   };
1175 
FXIMPLEMENT(GMMenuButton,FXMenuButton,GMMenuButtonMap,ARRAYNUMBER (GMMenuButtonMap))1176 FXIMPLEMENT(GMMenuButton,FXMenuButton,GMMenuButtonMap,ARRAYNUMBER(GMMenuButtonMap))
1177 
1178 GMMenuButton::GMMenuButton(){
1179   }
1180 
GMMenuButton(FXComposite * p,const FXString & text,FXIcon * ic,FXPopup * pup,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)1181 GMMenuButton::GMMenuButton(FXComposite* p,const FXString& text,FXIcon* ic,FXPopup* pup,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXMenuButton(p,text,ic,pup,opts,x,y,w,h,pl,pr,pt,pb) {
1182   }
1183 
1184 
1185 // Handle repaint
onPaint(FXObject *,FXSelector,void * ptr)1186 long GMMenuButton::onPaint(FXObject*,FXSelector,void* ptr){
1187   FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy;
1188   FXEvent *ev=(FXEvent*)ptr;
1189   FXPoint points[3];
1190   FXDCWindow dc(this,ev);
1191 
1192   // Got a border at all?
1193   if(options&(FRAME_RAISED|FRAME_SUNKEN)){
1194 
1195     // Toolbar style
1196     if(options&MENUBUTTON_TOOLBAR){
1197 
1198       // Enabled and cursor inside, and not popped up
1199       if(isEnabled() && underCursor() && !state){
1200         dc.setForeground(backColor);
1201         dc.fillRectangle(border,border,width-border*2,height-border*2);
1202         if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height);
1203         else drawRaisedRectangle(dc,0,0,width,height);
1204         }
1205 
1206       // Enabled and popped up
1207       else if(isEnabled() && state){
1208         dc.setForeground(hiliteColor);
1209         dc.fillRectangle(border,border,width-border*2,height-border*2);
1210         if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height);
1211         else drawSunkenRectangle(dc,0,0,width,height);
1212         }
1213 
1214       // Disabled or unchecked or not under cursor
1215       else{
1216         dc.setForeground(backColor);
1217         dc.fillRectangle(0,0,width,height);
1218         }
1219       }
1220 
1221     // Normal style
1222     else{
1223 
1224       // Draw in up state if disabled or up
1225       if(!isEnabled() || !state){
1226         dc.setForeground(backColor);
1227         dc.fillRectangle(border,border,width-border*2,height-border*2);
1228         if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height);
1229         else drawRaisedRectangle(dc,0,0,width,height);
1230         }
1231 
1232       // Draw sunken if enabled and either checked or pressed
1233       else{
1234         dc.setForeground(hiliteColor);
1235         dc.fillRectangle(border,border,width-border*2,height-border*2);
1236         if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height);
1237         else drawSunkenRectangle(dc,0,0,width,height);
1238         }
1239       }
1240     }
1241 
1242   // No borders
1243   else{
1244     if(isEnabled() && state){
1245       dc.setForeground(hiliteColor);
1246       dc.fillRectangle(0,0,width,height);
1247       }
1248     else{
1249       dc.setForeground(backColor);
1250       dc.fillRectangle(0,0,width,height);
1251       }
1252     }
1253 
1254   // Position text & icon
1255 //  if(!label.empty()){
1256 //    tw=labelWidth(label);
1257 //    th=labelHeight(label);
1258 //    }
1259 
1260   // Icon?
1261   if(icon){
1262     tw=icon->getWidth();
1263     th=icon->getHeight();
1264     }
1265 
1266   // Arrows?
1267   if(!(options&MENUBUTTON_NOARROWS)){
1268     iw=MENUBUTTONARROW_WIDTH;
1269     ih=MENUBUTTONARROW_HEIGHT;
1270     }
1271 
1272   // Keep some room for the arrow!
1273   just_x(tx,ix,tw,iw);
1274   just_y(ty,iy,th,ih);
1275 
1276   // Move a bit when pressed
1277   if(state){ ++tx; ++ty; ++ix; ++iy; }
1278 
1279   // Draw icon
1280   if(icon){
1281     if(isEnabled())
1282       dc.drawIcon(icon,tx,ty);
1283     else
1284       dc.drawIconSunken(icon,tx,ty);
1285     }
1286 
1287   // Draw arrows
1288   if(!(options&MENUBUTTON_NOARROWS)){
1289 
1290     // Right arrow
1291     if((options&MENUBUTTON_RIGHT)==MENUBUTTON_RIGHT){
1292       if(isEnabled())
1293         dc.setForeground(textColor);
1294       else
1295         dc.setForeground(shadowColor);
1296       points[0].x=ix;
1297       points[0].y=iy;
1298       points[1].x=ix;
1299       points[1].y=iy+MENUBUTTONARROW_WIDTH-1;
1300       points[2].x=ix+MENUBUTTONARROW_HEIGHT;
1301       points[2].y=(FXshort)(iy+(MENUBUTTONARROW_WIDTH>>1));
1302       dc.fillPolygon(points,3);
1303       }
1304 
1305     // Left arrow
1306     else if(options&MENUBUTTON_LEFT){
1307       if(isEnabled())
1308         dc.setForeground(textColor);
1309       else
1310         dc.setForeground(shadowColor);
1311       points[0].x=ix+MENUBUTTONARROW_HEIGHT;
1312       points[0].y=iy;
1313       points[1].x=ix+MENUBUTTONARROW_HEIGHT;
1314       points[1].y=iy+MENUBUTTONARROW_WIDTH-1;
1315       points[2].x=ix;
1316       points[2].y=(FXshort)(iy+(MENUBUTTONARROW_WIDTH>>1));
1317       dc.fillPolygon(points,3);
1318       }
1319 
1320     // Up arrow
1321     else if(options&MENUBUTTON_UP){
1322       if(isEnabled())
1323         dc.setForeground(textColor);
1324       else
1325         dc.setForeground(shadowColor);
1326       points[0].x=(FXshort)(ix+(MENUBUTTONARROW_WIDTH>>1));
1327       points[0].y=iy-1;
1328       points[1].x=ix;
1329       points[1].y=iy+MENUBUTTONARROW_HEIGHT;
1330       points[2].x=ix+MENUBUTTONARROW_WIDTH;
1331       points[2].y=iy+MENUBUTTONARROW_HEIGHT;
1332       dc.fillPolygon(points,3);
1333       }
1334 
1335     // Down arrow
1336     else{
1337       if(isEnabled())
1338         dc.setForeground(textColor);
1339       else
1340         dc.setForeground(shadowColor);
1341       points[0].x=ix+1;
1342       points[0].y=iy;
1343       points[2].x=ix+MENUBUTTONARROW_WIDTH-1;
1344       points[2].y=iy;
1345       points[1].x=(FXshort)(ix+(MENUBUTTONARROW_WIDTH>>1));
1346       points[1].y=iy+MENUBUTTONARROW_HEIGHT;
1347       dc.fillPolygon(points,3);
1348       }
1349     }
1350 
1351   // Draw text
1352   if(!label.empty()){
1353     dc.setFont(font);
1354     if(isEnabled()){
1355       dc.setForeground(textColor);
1356       drawLabel(dc,label,hotoff,tx,ty,tw,th);
1357       }
1358     else{
1359       dc.setForeground(hiliteColor);
1360       drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
1361       dc.setForeground(shadowColor);
1362       drawLabel(dc,label,hotoff,tx,ty,tw,th);
1363       }
1364     }
1365 
1366   // Draw focus
1367   if(hasFocus()){
1368     if(isEnabled()){
1369       dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2);
1370       }
1371     }
1372   return 1;
1373   }
1374 
1375 
1376 
1377 // Get default width
getDefaultWidth()1378 FXint GMMenuButton::getDefaultWidth(){
1379   FXint tw=0,iw=0,s=4,w,pw;
1380 //  if(!label.empty()){ tw=labelWidth(label); s=4; }
1381   if(!(options&MENUBUTTON_NOARROWS)){
1382     if(options&MENUBUTTON_LEFT) iw=MENUBUTTONARROW_HEIGHT; else iw=MENUBUTTONARROW_WIDTH;
1383     }
1384   if(icon) tw=icon->getWidth();
1385  if(!(options&(ICON_AFTER_TEXT|ICON_BEFORE_TEXT))) w=FXMAX(tw,iw); else w=tw+iw+s;
1386   w=padleft+padright+(border<<1)+w;
1387   if(!(options&MENUBUTTON_LEFT) && (options&MENUBUTTON_ATTACH_RIGHT) && (options&MENUBUTTON_ATTACH_CENTER)){
1388     if(pane){ pw=pane->getDefaultWidth(); if(pw>w) w=pw; }
1389     }
1390   return w;
1391   }
1392 
1393 
1394 // Get default height
getDefaultHeight()1395 FXint GMMenuButton::getDefaultHeight(){
1396   FXint th=0,ih=0,h,ph;
1397 //  if(!label.empty()){ th=labelHeight(label); }
1398   if(!(options&MENUBUTTON_NOARROWS)){
1399     if(options&MENUBUTTON_LEFT) ih=MENUBUTTONARROW_WIDTH; else ih=MENUBUTTONARROW_HEIGHT;
1400     }
1401   if(icon) th=icon->getHeight();
1402   if(!(options&(ICON_ABOVE_TEXT|ICON_BELOW_TEXT))) h=FXMAX(th,ih); else h=th+ih;
1403   h=padtop+padbottom+(border<<1)+h;
1404   if((options&MENUBUTTON_LEFT) && (options&MENUBUTTON_ATTACH_BOTTOM) && (options&MENUBUTTON_ATTACH_CENTER)){
1405     if(pane){ ph=pane->getDefaultHeight(); if(ph>h) h=ph; }
1406     }
1407   return h;
1408   }
1409 
1410 
1411 
1412 
1413 
1414 
1415 
1416 
1417 
1418 
1419 
1420 
1421 
1422 
1423 
1424 
1425 
1426 
1427 
1428 
1429 
1430 
1431 
1432 
1433 
1434 FXDEFMAP(GMHeaderButton) GMHeaderButtonMap[]={
1435   FXMAPFUNC(SEL_PAINT,0,GMHeaderButton::onPaint)
1436   };
1437 
FXIMPLEMENT(GMHeaderButton,FXButton,GMHeaderButtonMap,ARRAYNUMBER (GMHeaderButtonMap))1438 FXIMPLEMENT(GMHeaderButton,FXButton,GMHeaderButtonMap,ARRAYNUMBER(GMHeaderButtonMap))
1439 
1440 
1441 GMHeaderButton::GMHeaderButton(){
1442   arrowstate=ARROW_UP;
1443   }
1444 
GMHeaderButton(FXComposite * p,const FXString & text,FXIcon * ic,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)1445 GMHeaderButton::GMHeaderButton(FXComposite* p,const FXString& text,FXIcon* ic,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) : FXButton(p,text,ic,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
1446   arrowstate=ARROW_UP;
1447   }
1448 
setArrowState(FXuint s)1449 void GMHeaderButton::setArrowState(FXuint s) {
1450   arrowstate=s;
1451   }
1452 
getArrowState() const1453 FXuint GMHeaderButton::getArrowState() const {
1454   return arrowstate;
1455   }
1456 
1457 
1458 
onPaint(FXObject *,FXSelector,void * ptr)1459 long GMHeaderButton::onPaint(FXObject*,FXSelector,void*ptr){
1460   FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy;
1461   FXEvent *ev=(FXEvent*)ptr;
1462 
1463   // Start drawing
1464   FXDCWindow dc(this,ev);
1465 
1466   // Got a border at all?
1467   if(options&(FRAME_RAISED|FRAME_SUNKEN)){
1468 
1469     // Toolbar style
1470     if(options&BUTTON_TOOLBAR){
1471 
1472       // Enabled and cursor inside, and up
1473       if(isEnabled() && underCursor() && (state==STATE_UP)){
1474         dc.setForeground(backColor);
1475         dc.fillRectangle(border,border,width-border*2,height-border*2);
1476         if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height);
1477         else drawRaisedRectangle(dc,0,0,width,height);
1478         }
1479 
1480       // Enabled and cursor inside and down
1481       else if(isEnabled() && underCursor() && (state==STATE_DOWN)){
1482         dc.setForeground(backColor);
1483         dc.fillRectangle(border,border,width-border*2,height-border*2);
1484         if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height);
1485         else drawSunkenRectangle(dc,0,0,width,height);
1486         }
1487 
1488       // Enabled and checked
1489       else if(isEnabled() && (state==STATE_ENGAGED)){
1490         dc.setForeground(hiliteColor);
1491         dc.fillRectangle(border,border,width-border*2,height-border*2);
1492         if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height);
1493         else drawSunkenRectangle(dc,0,0,width,height);
1494         }
1495 
1496       // Disabled or unchecked or not under cursor
1497       else{
1498         dc.setForeground(backColor);
1499         dc.fillRectangle(0,0,width,height);
1500         }
1501       }
1502 
1503     // Normal style
1504     else{
1505 
1506       // Default
1507       if(isDefault()){
1508 
1509         // Draw in up state if disabled or up
1510         if(!isEnabled() || (state==STATE_UP)){
1511           dc.setForeground(backColor);
1512           dc.fillRectangle(border+1,border+1,width-border*2-1,height-border*2-1);
1513           dc.setForeground(FXRGB(255,255,255));
1514           dc.fillRectangle(width-2,1,1,height-1);
1515 
1516          // if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,1,1,width-1,height-1);
1517          // else drawRaisedRectangle(dc,1,1,width-3,height-1);
1518           }
1519 
1520         // Draw sunken if enabled and either checked or pressed
1521         else{
1522           if(state==STATE_ENGAGED) dc.setForeground(hiliteColor); else dc.setForeground(backColor);
1523           dc.fillRectangle(border,border,width-border*2-1,height-border*2-1);
1524           if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width-1,height-1);
1525           else drawSunkenRectangle(dc,0,0,width-1,height-1);
1526           }
1527 
1528         // Black default border
1529         drawBorderRectangle(dc,0,0,width,height);
1530         }
1531 
1532       // Non-Default
1533       else{
1534 
1535         // Draw in up state if disabled or up
1536         if(!isEnabled() || (state==STATE_UP)){
1537           dc.setForeground(backColor);
1538           //dc.fillRectangle(border,border,width-border*2,height-border*2);
1539 
1540           //fillVerticalGradient(dc,border,border,width-border*2,height-border*2,makeHiliteColor(makeHiliteColor(makeShadowColor(backColor))),makeHiliteColor(makeShadowColor(backColor)));
1541 //          fillVerticalGradient(dc,0,0,width,height-1,makeHiliteColor(makeHiliteColor(makeShadowColor(backColor))),makeHiliteColor(makeShadowColor(backColor)));
1542 
1543           fillVerticalGradient(dc,ev->rect.x,0,ev->rect.w,height-1,gm_make_hilite_color(backColor),gm_make_hilite_color(gm_make_shadow_color(backColor)));
1544 
1545 
1546           dc.setForeground(shadowColor);
1547           dc.fillRectangle(0,height-1,width,1);
1548 
1549 
1550 
1551 
1552 
1553 //          if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height);
1554 ///          else drawRaisedRectangle(dc,0,0,width-1,height);
1555 
1556 //      dc.setForeground(backColor);
1557 
1558 //          dc.fillRectangle(width-2,0,2,height-1);
1559 
1560           }
1561 
1562         // Draw sunken if enabled and either checked or pressed
1563         else{
1564           if(state==STATE_ENGAGED) dc.setForeground(hiliteColor); else dc.setForeground(backColor);
1565           dc.fillRectangle(border,border,width-border*2,height-border*2);
1566           if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height);
1567           else drawSunkenRectangle(dc,0,0,width,height);
1568           }
1569         }
1570       }
1571     }
1572 
1573   // No borders
1574   else{
1575     if(isEnabled() && (state==STATE_ENGAGED)){
1576       dc.setForeground(hiliteColor);
1577       dc.fillRectangle(0,0,width,height);
1578       }
1579     else{
1580       dc.setForeground(backColor);
1581       dc.fillRectangle(0,0,width,height);
1582       }
1583     }
1584 
1585   // Place text & icon
1586   if(!label.empty()){
1587     tw=labelWidth(label);
1588     th=labelHeight(label);
1589     }
1590   if(icon){
1591     iw=icon->getWidth();
1592     ih=icon->getHeight();
1593     }
1594 
1595   just_x(tx,ix,tw,iw);
1596   just_y(ty,iy,th,ih);
1597 
1598   // Shift a bit when pressed
1599   if(state && (options&(FRAME_RAISED|FRAME_SUNKEN))){ ++tx; ++ty; ++ix; ++iy; }
1600 
1601   // Draw enabled state
1602   if(isEnabled()){
1603     if(icon){
1604       dc.drawIcon(icon,ix,iy);
1605       }
1606     if(!label.empty()){
1607       dc.setFont(font);
1608       dc.setForeground(textColor);
1609       drawLabel(dc,label,hotoff,tx,ty,tw,th);
1610       }
1611 //    if(hasFocus()){
1612 //      dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2);
1613 //      }
1614     }
1615 
1616   // Draw grayed-out state
1617   else{
1618     if(icon){
1619       dc.drawIconSunken(icon,ix,iy);
1620       }
1621     if(!label.empty()){
1622       dc.setFont(font);
1623       dc.setForeground(hiliteColor);
1624       drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
1625       dc.setForeground(shadowColor);
1626       drawLabel(dc,label,hotoff,tx,ty,tw,th);
1627       }
1628     }
1629 
1630   // Draw arrows
1631   if(arrowstate&(ARROW_UP|ARROW_DOWN)){
1632     FXint aa=(font->getFontHeight()-5)|1;
1633     FXint ay=(height-aa)/2;
1634     FXint ax=width-aa-border-border-2;
1635     if(arrowstate&ARROW_UP){
1636       dc.setForeground(hiliteColor);
1637       dc.drawLine(ax+aa/2,ay,ax+aa-1,ay+aa);
1638       dc.drawLine(ax,ay+aa,ax+aa,ay+aa);
1639       dc.setForeground(shadowColor);
1640       dc.drawLine(ax+aa/2,ay,ax,ay+aa);
1641       }
1642     else{
1643       dc.setForeground(hiliteColor);
1644       dc.drawLine(ax+aa/2,ay+aa,ax+aa-1,ay);
1645       dc.setForeground(shadowColor);
1646       dc.drawLine(ax+aa/2,ay+aa,ax,ay);
1647       dc.drawLine(ax,ay,ax+aa,ay);
1648       }
1649     }
1650   return 1;
1651   }
1652 
1653 
1654 FXIMPLEMENT(GMScrollArea,FXScrollArea,nullptr,0)
1655 
replaceScrollbars(FXScrollArea * fs)1656 void GMScrollArea::replaceScrollbars(FXScrollArea *fs) {
1657   GMScrollArea * s = static_cast<GMScrollArea*>(fs);
1658   delete s->vertical;
1659   delete s->horizontal;
1660   delete s->corner;
1661   s->vertical=new GMScrollBar(fs,fs,GMScrollArea::ID_VSCROLLED,SCROLLBAR_VERTICAL);
1662   s->horizontal=new GMScrollBar(fs,fs,GMScrollArea::ID_HSCROLLED,SCROLLBAR_HORIZONTAL);
1663   s->corner=new GMScrollCorner(fs);
1664   }
1665 
1666 
1667 
1668 FXIMPLEMENT(GMTreeListBox,FXTreeListBox,nullptr,0)
1669 
replace(FXTreeListBox * fs)1670 void GMTreeListBox::replace(FXTreeListBox *fs) {
1671   GMTreeListBox * s = static_cast<GMTreeListBox*>(fs);
1672   GMScrollArea::replaceScrollbars(s->tree);
1673 
1674   s->borderColor=s->getApp()->getShadowColor();
1675   s->setFrameStyle(FRAME_LINE);
1676   s->pane->setBorderColor(s->borderColor);
1677 
1678   s->button->setFrameStyle(FRAME_NONE);
1679   s->button->setPadLeft(2);
1680   s->button->setPadRight(2);
1681   s->button->setYOffset(0);
1682   s->button->setXOffset(1);
1683   }
1684 
1685 
1686 
1687 // Map
1688 FXDEFMAP(GMScrollBar) GMScrollBarMap[]={
1689   FXMAPFUNC(SEL_PAINT,0,GMScrollBar::onPaint),
1690   };
1691 
1692 
1693 // Object implementation
FXIMPLEMENT(GMScrollBar,FXScrollBar,GMScrollBarMap,ARRAYNUMBER (GMScrollBarMap))1694 FXIMPLEMENT(GMScrollBar,FXScrollBar,GMScrollBarMap,ARRAYNUMBER(GMScrollBarMap))
1695 
1696 
1697 // For deserialization
1698 GMScrollBar::GMScrollBar(){
1699   }
1700 
1701 // Make a scrollbar
GMScrollBar(FXComposite * p,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h)1702 GMScrollBar::GMScrollBar(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXScrollBar(p,tgt,sel,opts,x,y,w,h) {
1703 //shadowColor=gm_make_shadow_color(getApp()->getBaseColor());
1704   }
1705 
drawThumb(FXDCWindow & dc,FXint x,FXint y,FXint w,FXint h)1706 void GMScrollBar::drawThumb(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){
1707   if(options&SCROLLBAR_HORIZONTAL){
1708     fillVerticalGradient(dc,x+2,y,w-4,h-1,gm_make_hilite_color(FXApp::instance()->getSelbackColor()),gm_make_hilite_color(gm_make_shadow_color(FXApp::instance()->getSelbackColor())));
1709     dc.setForeground(shadowColor);
1710     dc.fillRectangle(x+w-1,y,1,h);
1711     dc.fillRectangle(x,y,1,h);
1712     dc.setForeground(gm_make_hilite_color(getApp()->getSelbackColor()));
1713     dc.fillRectangle(x+1,y+h-1,w-2,1);
1714     dc.fillRectangle(x+w-2,y,1,h-1);
1715     dc.fillRectangle(x+1,y,1,h-1);
1716     if (w>20) {
1717       dc.setForeground(gm_make_shadow_color(getApp()->getSelbackColor()));
1718       dc.fillRectangle(thumbpos+thumbsize / 2,(height/2) - 2,1,6);
1719       dc.fillRectangle((thumbpos+thumbsize / 2) - 3,(height/2) - 2,1,6);
1720       dc.fillRectangle((thumbpos+thumbsize / 2) + 3,(height/2) - 2,1,6);
1721       }
1722     }
1723   else {
1724     fillHorizontalGradient(dc,x,y+2,w-1,h-4,gm_make_hilite_color(getApp()->getSelbackColor()),gm_make_hilite_color(gm_make_shadow_color(getApp()->getSelbackColor())));
1725     dc.setForeground(shadowColor);
1726     dc.fillRectangle(x,y+h-1,w,1);
1727     dc.fillRectangle(x,y,w,1);
1728 
1729     dc.setForeground(gm_make_hilite_color(getApp()->getSelbackColor()));
1730     dc.fillRectangle(x+w-1,y+1,1,h-2);
1731     dc.fillRectangle(x,y+1,w-1,1);
1732     dc.fillRectangle(x,y+h-2,w-1,1);
1733 
1734     if (h>20) {
1735       dc.setForeground(gm_make_shadow_color(getApp()->getSelbackColor()));
1736       dc.fillRectangle((width/2) - 2,thumbpos+thumbsize / 2,6,1);
1737       dc.fillRectangle((width/2) - 2,(thumbpos+thumbsize / 2) - 3,6,1);
1738       dc.fillRectangle((width/2) - 2,(thumbpos+thumbsize / 2) + 3,6,1);
1739       }
1740     }
1741   }
1742 
1743 // Handle repaint
onPaint(FXObject *,FXSelector,void * ptr)1744 long GMScrollBar::onPaint(FXObject*,FXSelector,void* ptr){
1745   FXEvent *ev=(FXEvent*)ptr;
1746   int total;
1747   FXDCWindow dc(this,ev);
1748   if(options&SCROLLBAR_HORIZONTAL){
1749     total=width-height-height;
1750     dc.setForeground(shadowColor);
1751     dc.fillRectangle(0,0,width,1);
1752     if(thumbsize<total){
1753       drawThumb(dc,thumbpos,1,thumbsize,height-1);
1754       if (thumbpos-height>0) {
1755         dc.setForeground(shadowColor);
1756         dc.fillRectangle(height,1,1,height-1);
1757         dc.setForeground(gm_make_hilite_color(shadowColor));
1758         dc.fillRectangle(height+1,1,thumbpos-height-1,height-1);
1759         }
1760 
1761       if (width-height-thumbpos-thumbsize>0) {
1762         dc.setForeground(shadowColor);
1763         dc.fillRectangle(width-height-1,1,1,height-1);
1764         dc.setForeground(gm_make_hilite_color(shadowColor));
1765         dc.fillRectangle(thumbpos+thumbsize,1,width-height-thumbpos-thumbsize-1,height);
1766         }
1767       }
1768     else{                                                   // Non-scrollable
1769       dc.fillRectangle(height,1,1,height-1);
1770       dc.fillRectangle(width-height-1,1,1,height-1);
1771       dc.setForeground(gm_make_hilite_color(shadowColor));
1772       dc.fillRectangle(height+1,1,total-2,height-1);
1773       }
1774     dc.setFillStyle(FILL_SOLID);
1775     dc.setForeground(backColor);
1776     dc.fillRectangle(width-height,1,height,height-1);
1777     drawRightArrow(dc,width-height,0,height,height,(mode==MODE_INC));
1778     dc.setForeground(backColor);
1779     dc.fillRectangle(0,1,height,height-1);
1780     drawLeftArrow(dc,0,0,height,height,(mode==MODE_DEC));
1781     }
1782   else{
1783     total=height-width-width;
1784     dc.setForeground(shadowColor);
1785     dc.fillRectangle(0,0,1,height);
1786     if(thumbsize<total){
1787       drawThumb(dc,1,thumbpos,width-1,thumbsize);
1788       if (thumbpos-width>0) {
1789         dc.setForeground(shadowColor);
1790         dc.fillRectangle(1,width,width-1,1);
1791         dc.setForeground(gm_make_hilite_color(shadowColor));
1792         dc.fillRectangle(1,width+1,width-1,thumbpos-width-1);
1793         }
1794       if (height-width-thumbpos-thumbsize>0){
1795         dc.setForeground(shadowColor);
1796         dc.fillRectangle(1,height-width-1,width-1,1);
1797         dc.setForeground(gm_make_hilite_color(shadowColor));
1798         dc.fillRectangle(1,thumbpos+thumbsize,width-1,height-width-thumbpos-thumbsize-1);
1799         }
1800       }
1801     else{                                                   // Non-scrollable
1802       dc.fillRectangle(1,width,width-1,1);
1803       dc.fillRectangle(1,height-width-1,width-1,1);
1804       dc.setForeground(gm_make_hilite_color(shadowColor));
1805       dc.fillRectangle(1,width+1,width-1,total-2);
1806       }
1807     dc.setFillStyle(FILL_SOLID);
1808     dc.setForeground(backColor);
1809     dc.fillRectangle(1,height-width,width-1,width);
1810     drawDownArrow(dc,0,height-width,width,width,(mode==MODE_INC));
1811     dc.setForeground(backColor);
1812     dc.fillRectangle(1,0,width-1,width);
1813     drawUpArrow(dc,0,0,width,width,(mode==MODE_DEC));
1814     }
1815   return 1;
1816   }
1817 
1818 // Map
1819 FXDEFMAP(GMScrollCorner) GMScrollCornerMap[]={
1820   FXMAPFUNC(SEL_PAINT,0,GMScrollCorner::onPaint),
1821   };
1822 
FXIMPLEMENT(GMScrollCorner,FXScrollCorner,GMScrollCornerMap,ARRAYNUMBER (GMScrollCornerMap))1823 FXIMPLEMENT(GMScrollCorner,FXScrollCorner,GMScrollCornerMap,ARRAYNUMBER(GMScrollCornerMap))
1824 
1825 GMScrollCorner::GMScrollCorner(FXComposite*p):FXScrollCorner(p){
1826   shadowColor=getApp()->getShadowColor();
1827   }
1828 
1829 // Slightly different from Frame border
onPaint(FXObject *,FXSelector,void * ptr)1830 long GMScrollCorner::onPaint(FXObject*,FXSelector,void* ptr){
1831   FXEvent *ev=(FXEvent*)ptr;
1832   FXDCWindow dc(this,ev);
1833   dc.setForeground(backColor);
1834   dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h);
1835   dc.setForeground(shadowColor);
1836   dc.fillRectangle(ev->rect.x,0,ev->rect.w,1);
1837   dc.fillRectangle(0,ev->rect.y,1,ev->rect.h);
1838   return 1;
1839   }
1840 
1841 
1842 
1843 FXIMPLEMENT(GMTabBook,FXTabBook,nullptr,0)
1844 
GMTabBook(FXComposite * p,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)1845 GMTabBook::GMTabBook(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb) :
1846 	FXTabBook(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
1847 	}
1848 
1849 
1850 /// Make sure old tab gets repainted
setCurrent(FXint panel,FXbool notify)1851 void GMTabBook::setCurrent(FXint panel,FXbool notify) {
1852 	if (panel!=current) {
1853 		FXint old = current;
1854 		FXTabBook::setCurrent(panel,notify);
1855 		FXWindow * window = childAtIndex(old<<1);
1856 		if (window) { window->update(); }
1857 		}
1858 	}
1859 
1860 
1861 
1862 // Map
1863 FXDEFMAP(GMTabItem) GMTabItemMap[]={
1864   FXMAPFUNC(SEL_PAINT,0,GMTabItem::onPaint),
1865   };
1866 
FXIMPLEMENT(GMTabItem,FXTabItem,GMTabItemMap,ARRAYNUMBER (GMTabItemMap))1867 FXIMPLEMENT(GMTabItem,FXTabItem,GMTabItemMap,ARRAYNUMBER(GMTabItemMap))
1868 
1869 GMTabItem::GMTabItem(FXTabBar* p,const FXString& text,FXIcon* ic,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint /*pt*/,FXint /*pb*/) : FXTabItem(p,text,ic,opts,x,y,w,h,pl,pr,5,5) {
1870   }
1871 
1872 //void GMTabItem::raise() {
1873 //  FXTabItem::raise();
1874 //  update();
1875 //  recalc();
1876 //  }
1877 
1878 
1879 /// FIXME determine last tab based visibility...
onPaint(FXObject *,FXSelector,void *)1880 long GMTabItem::onPaint(FXObject*,FXSelector,void*){
1881   FXTabBar * bar = (FXTabBar*)getParent();
1882   FXint tab = bar->indexOfChild(this)/2;
1883   FXint ntabs = (bar->numChildren()/2);
1884   FXint ctab = bar->getCurrent();
1885 
1886 
1887   FXbool is_last = (tab==(ntabs-1));
1888 
1889   if (!is_last) {
1890     is_last=true;
1891     for (FXint t=tab+1;t<ntabs;t++){
1892       if (bar->childAtIndex(t<<1)->shown()) {
1893         is_last=false;
1894         break;
1895         }
1896       }
1897     }
1898 
1899   FXDCWindow dc(this);
1900 
1901   FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy;
1902 
1903       dc.setForeground(shadowColor);
1904       dc.fillRectangle(0,0,width,1);
1905       if (tab==ctab && tab==0)
1906         dc.fillRectangle(0,0,1,height);
1907       else
1908         dc.fillRectangle(0,0,1,height-1);
1909 
1910     /// last one or active one
1911     if (is_last || tab==ctab) {
1912       dc.fillRectangle(width-1,0,1,height-1);
1913       if (tab!=ctab)
1914         fillVerticalGradient(dc,1,1,width-2,height-2,gm_make_hilite_color(shadowColor),gm_make_hilite_color(shadowColor));
1915       else {
1916 /*
1917         dc.setForeground(makeShadowColor(getApp()->getSelbackColor()));
1918         dc.fillRectangle(0,0,width,1);
1919         dc.fillRectangle(width-1,0,1,4);
1920         dc.fillRectangle(0,0,1,4);
1921         dc.fillRectangle(1,3,width-2,1);
1922 */
1923 /*
1924 
1925         dc.setForeground(getApp()->getSelbackColor());
1926         dc.fillRectangle(1,1,width-2,2);
1927 */
1928 //        dc.setForeground(backColor);
1929 //        dc.fillRectangle(1,4,width-2,height-4);
1930 
1931         dc.setForeground(getApp()->getSelbackColor());
1932 //        dc.fillRectangle(1,1,width-2,height-2);
1933         fillVerticalGradient(dc,1,1,width-2,height-2,gm_make_hilite_color(backColor),backColor);
1934 
1935         dc.setForeground(backColor);
1936         if (tab==0)
1937           dc.fillRectangle(1,height-1,width-1,height-1);
1938         else
1939           dc.fillRectangle(0,height-1,width,height-1);
1940         }
1941       }
1942     else {
1943       fillVerticalGradient(dc,1,1,width-1,height-2,gm_make_hilite_color(shadowColor),gm_make_hilite_color(shadowColor));
1944       }
1945 
1946   if(!label.empty()){
1947     tw=labelWidth(label);
1948     th=labelHeight(label);
1949     }
1950   if(icon){
1951     iw=icon->getWidth();
1952     ih=icon->getHeight();
1953     }
1954   just_x(tx,ix,tw,iw);
1955   just_y(ty,iy,th,ih);
1956   if(icon){
1957     if(isEnabled())
1958       dc.drawIcon(icon,ix,iy);
1959     else
1960       dc.drawIconSunken(icon,ix,iy);
1961     }
1962   if(!label.empty()){
1963     dc.setFont(font);
1964     if(isEnabled()){
1965       dc.setForeground(textColor);
1966       drawLabel(dc,label,hotoff,tx,ty,tw,th);
1967       if(hasFocus()){
1968         dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2);
1969         }
1970       }
1971     else{
1972       dc.setForeground(hiliteColor);
1973       drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
1974       dc.setForeground(shadowColor);
1975       drawLabel(dc,label,hotoff,tx,ty,tw,th);
1976       }
1977     }
1978   return 1;
1979   }
1980 
1981 
1982 
1983 FXIMPLEMENT(GMListBox,FXListBox,nullptr,0);
1984 
GMListBox()1985 GMListBox::GMListBox(){
1986   }
1987 
GMListBox(FXComposite * p,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)1988 GMListBox::GMListBox(FXComposite*p,FXObject*tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)
1989   : FXListBox(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb) {
1990   borderColor=getApp()->getShadowColor();
1991   setFrameStyle(FRAME_LINE);
1992 
1993   GMScrollArea::replaceScrollbars(list);
1994 
1995   pane->setBorderColor(borderColor);
1996   button->setFrameStyle(FRAME_NONE);
1997   button->setPadLeft(2);
1998   button->setPadRight(2);
1999   button->setYOffset(0);
2000   button->setXOffset(1);
2001   }
2002 
2003 
create()2004 void GMListBox::create(){
2005   FXListBox::create();
2006   ewmh_change_window_type(pane,WINDOWTYPE_COMBO);
2007   }
2008 
2009 
2010 
2011 FXIMPLEMENT(GMComboBox,FXComboBox,nullptr,0);
2012 
GMComboBox()2013 GMComboBox::GMComboBox(){
2014   }
2015 
GMComboBox(FXComposite * p,FXint cols,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)2016 GMComboBox::GMComboBox(FXComposite *p,FXint cols,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)
2017   :FXComboBox(p,cols,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){
2018   borderColor=getApp()->getShadowColor();
2019   setFrameStyle(FRAME_LINE);
2020   pane->setBorderColor(borderColor);
2021 
2022   GMScrollArea::replaceScrollbars(list);
2023   button->setFrameStyle(FRAME_NONE);
2024   button->setPadLeft(2);
2025   button->setPadRight(2);
2026   button->setYOffset(0);
2027   button->setXOffset(1);
2028   }
2029 
create()2030 void GMComboBox::create(){
2031   FXComboBox::create();
2032   ewmh_change_window_type(pane,WINDOWTYPE_COMBO);
2033   }
2034 
2035 
2036 FXIMPLEMENT(GMImageFrame,FXImageFrame,nullptr,0);
2037 
GMImageFrame()2038 GMImageFrame::GMImageFrame(){
2039   }
2040 
GMImageFrame(FXComposite * p,FXImage * img,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)2041 GMImageFrame::GMImageFrame(FXComposite *p,FXImage * img,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)
2042   :FXImageFrame(p,img,opts,x,y,w,h,pl,pr,pt,pb){
2043   borderColor=getApp()->getShadowColor();
2044   backColor=getApp()->getBackColor();
2045   }
2046 
2047 
2048 
2049 FXIMPLEMENT(GMCoverFrame,FXVerticalFrame,nullptr,0);
2050 
GMCoverFrame()2051 GMCoverFrame::GMCoverFrame(){
2052   }
2053 
GMCoverFrame(FXComposite * p)2054 GMCoverFrame::GMCoverFrame(FXComposite *p)
2055   :FXVerticalFrame(p,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_LINE,0,0,0,0,5,5,5,5){
2056   borderColor=getApp()->getShadowColor();
2057   backColor=getApp()->getBackColor();
2058   }
2059 
2060 
2061 FXIMPLEMENT(GMProgressBar,FXProgressBar,nullptr,0);
2062 
GMProgressBar()2063 GMProgressBar::GMProgressBar(){
2064   }
2065 
GMProgressBar(FXComposite * p,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)2066 GMProgressBar::GMProgressBar(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)
2067   :FXProgressBar(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){
2068   borderColor=getApp()->getShadowColor();
2069   barColor=getApp()->getSelbackColor();
2070   textAltColor=getApp()->getSelforeColor();//FXRGB(255,255,255);
2071   setFrameStyle(FRAME_LINE);
2072   }
2073 
2074 
2075 FXDEFMAP(GMTrackProgressBar) GMTrackProgressBarMap[]={
2076   FXMAPFUNC(SEL_MOTION,0,GMTrackProgressBar::onMotion),
2077   FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,GMTrackProgressBar::onLeftBtnPress),
2078   FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,GMTrackProgressBar::onLeftBtnRelease)
2079   };
2080 
2081 FXIMPLEMENT(GMTrackProgressBar,FXProgressBar,GMTrackProgressBarMap,ARRAYNUMBER(GMTrackProgressBarMap));
2082 
GMTrackProgressBar()2083 GMTrackProgressBar::GMTrackProgressBar(){
2084   flags|=FLAG_ENABLED;
2085   }
2086 
GMTrackProgressBar(FXComposite * p,FXObject * tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)2087 GMTrackProgressBar::GMTrackProgressBar(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)
2088   :FXProgressBar(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){
2089   flags|=FLAG_ENABLED;
2090   borderColor=getApp()->getShadowColor();
2091   barColor=getApp()->getSelbackColor();
2092   textAltColor=getApp()->getSelforeColor();
2093   setFrameStyle(FRAME_LINE);
2094   barsize=7;
2095   }
2096 
2097 
2098 
2099 // Moving
onMotion(FXObject *,FXSelector,void *)2100 long GMTrackProgressBar::onMotion(FXObject*,FXSelector,void*){
2101 //  register FXEvent *event=(FXEvent*)ptr;
2102   FXuint /*xx,yy,ww,hh,lo,hi,*/p=0/*,h,travel*/;
2103   if(!isEnabled()) return 0;
2104   if(flags&FLAG_PRESSED){
2105 /*
2106 
2107     yy=border+padtop;
2108     xx=border+padleft;
2109     hh=height-(border<<1)-padtop-padbottom;
2110     ww=width-(border<<1)-padleft-padright;
2111     if(options&PROGRESSBAR_VERTICAL){
2112       h=event->win_y-dragpoint;
2113       travel=hh-headsize;
2114       if(h<yy) h=yy;
2115       if(h>yy+travel) h=yy+travel;
2116       if(h!=headpos){
2117         FXMINMAX(lo,hi,headpos,h);
2118         headpos=h;
2119         update(border,lo-1,width-(border<<1),hi+headsize+2-lo);
2120         }
2121       if(travel>0)
2122         p=range[0]+((range[1]-range[0])*(yy+travel-h)+travel/2)/travel;    // Use rounding!!
2123       else
2124         p=range[0];
2125       }
2126     else{
2127       h=event->win_x-dragpoint;
2128       travel=ww-headsize;
2129       if(h<xx) h=xx;
2130       if(h>xx+travel) h=xx+travel;
2131       if(h!=headpos){
2132         FXMINMAX(lo,hi,headpos,h);
2133         headpos=h;
2134         update(lo-1,border,hi+headsize+2-lo,height-(border<<1));
2135         }
2136       if(travel>0)
2137         p=range[0]+((range[1]-range[0])*(h-xx)+travel/2)/travel;    // Use rounding!!
2138       else
2139         p=range[0];
2140       }
2141     if(p<range[0]) p=range[0];
2142     if(p>range[1]) p=range[1];
2143     if(pos!=p){
2144       pos=p;
2145       flags|=FLAG_CHANGED;
2146       if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos);
2147       }
2148 */
2149     if(progress!=p){
2150       progress=p;
2151       flags|=FLAG_CHANGED;
2152       if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)progress);
2153       }
2154     return 1;
2155     }
2156   return 0;
2157   }
2158 
2159 // Pressed LEFT button
onLeftBtnPress(FXObject *,FXSelector,void * ptr)2160 long GMTrackProgressBar::onLeftBtnPress(FXObject*,FXSelector,void* ptr){
2161 //  register FXEvent *event=(FXEvent*)ptr;
2162 //  register FXint p=progress;
2163   flags&=~FLAG_TIP;
2164   handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr);
2165   if(isEnabled()){
2166     grab();
2167     if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1;
2168     flags&=~FLAG_UPDATE;
2169 /*
2170     if(options&PROGRESSBAR_VERTICAL){
2171       if(event->win_y<headpos){
2172         p=progress+incr;
2173         }
2174       else if(event->win_y>(headpos+headsize)){
2175         p=progress-incr;
2176         }
2177       else{
2178         dragpoint=event->win_y-headpos;
2179         flags|=FLAG_PRESSED;
2180         }
2181       }
2182     else{
2183       if(event->win_x<headpos){
2184         p=progress-incr;
2185         }
2186       else if(event->win_x>(headpos+headsize)){
2187         p=progress+incr;
2188         }
2189       else{
2190         dragpoint=event->win_x-headpos;
2191         flags|=FLAG_PRESSED;
2192         }
2193 
2194       }
2195 */
2196 
2197 //    if(p<range[0]) p=range[0];
2198 //    if(p>range[1]) p=range[1];
2199 /*
2200     if(p!=progress){
2201       setProgress(p);
2202       flags|=FLAG_CHANGED;
2203       if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)progress);
2204       }
2205 */
2206     return 1;
2207     }
2208   return 0;
2209   }
2210 
2211 
2212 // Released Left button
onLeftBtnRelease(FXObject *,FXSelector,void * ptr)2213 long GMTrackProgressBar::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){
2214   FXEvent *event=(FXEvent*)ptr;
2215 //  register FXuint flgs=flags;
2216   if(isEnabled()){
2217     ungrab();
2218 
2219     FXint xx=border+padleft;
2220     FXint ww=width-(border<<1)-padleft-padright;
2221 
2222 
2223 //    setProgress(progress);                                         // Hop to exact position
2224     flags&=~FLAG_PRESSED;
2225     flags&=~FLAG_CHANGED;
2226     flags|=FLAG_UPDATE;
2227     if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1;
2228 
2229     if (event->click_x > xx && event->click_x < xx+ww) {
2230       FXdouble pos = (event->click_x - xx) / (FXdouble)ww;
2231       if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),&pos);
2232       }
2233     return 1;
2234     }
2235   return 0;
2236   }
2237 
2238