00001
00002
00003
00004
00005
00006
00007
00008 #ifdef HAVE_CONFIG_H
00009 # include <config.h>
00010 #endif
00011
00012
00013 #include "theme.h"
00014
00015 #define ICON_SPACING 4
00016
00017
00018
00019 static void drawRectangle(FXDC& dc,FXColor lower,FXColor upper,FXint x,FXint y,FXint w,FXint h){
00020 register FXint rr,gg,bb,dr,dg,db,r1,g1,b1,r2,g2,b2,yl,yh,yy,dy,n,t;
00021 const FXint MAXSTEPS=128;
00022
00023 if(0<w && 0<h){
00024 dc.setStipple(STIPPLE_NONE);
00025 dc.setFillStyle(FILL_SOLID);
00026
00027 r1=FXREDVAL(lower); r2=FXREDVAL(upper); dr=r2-r1;
00028 g1=FXGREENVAL(lower); g2=FXGREENVAL(upper); dg=g2-g1;
00029 b1=FXBLUEVAL(lower); b2=FXBLUEVAL(upper); db=b2-b1;
00030
00031 n=FXABS(dr);
00032 if((t=FXABS(dg))>n) n=t;
00033 if((t=FXABS(db))>n) n=t;
00034 n++;
00035 if(n>h) n=h;
00036 if(n>MAXSTEPS) n=MAXSTEPS;
00037 rr=(r1<<16)+32767;
00038 gg=(g1<<16)+32767;
00039 bb=(b1<<16)+32767;
00040 yy=32767;
00041
00042 dr=(dr<<16)/n;
00043 dg=(dg<<16)/n;
00044 db=(db<<16)/n;
00045 dy=(h<<16)/n;
00046
00047 do {
00048 yl=yy>>16;
00049 yy+=dy;
00050 yh=yy>>16;
00051 dc.setForeground(FXRGB(rr>>16,gg>>16,bb>>16));
00052 dc.fillRectangle(x,y+yl,w,yh-yl);
00053 rr+=dr;
00054 gg+=dg;
00055 bb+=db;
00056 } while(yh<h);
00057 }
00058 }
00059
00060
00061
00062
00063 FXDEFMAP(ThemeButton) ThemeButtonMap[]={
00064 FXMAPFUNC( SEL_PAINT, 0, ThemeButton::onPaint)
00065 };
00066
00067 FXIMPLEMENT( ThemeButton, FXButton, ThemeButtonMap, ARRAYNUMBER(ThemeButtonMap) );
00068
00069
00070 ThemeButton::ThemeButton(FXComposite* p, const FXString& text, FXIcon* ic,
00071 FXObject* tgt, FXSelector sel, FXuint opts,
00072 FXint x, FXint y, FXint w, FXint h,
00073 FXint pl, FXint pr, FXint pt, FXint pb)
00074 : FXButton( p, text, ic, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb )
00075 {}
00076
00077
00078 long ThemeButton::onPaint(FXObject*,FXSelector,void* ptr){
00079 FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy;
00080 FXEvent*ev=(FXEvent*)ptr;
00081 FXDCWindow dc(this,ev);
00082
00083
00084 FXColor top = FXRGB(0xfe,0xfd,0xfd);
00085 FXColor bottom = FXRGB(0xdd,0xd7,0xce);
00086 FXColor shade = FXRGB(0xdc,0xd9,0xd4);
00087
00088
00089
00090 FXColor bordercolor = FXRGB(123,158,189);
00091
00092
00093
00094
00095
00096
00097
00098 FXPoint basebackground[4]={FXPoint(0,0),FXPoint(width-1,0),FXPoint(0,height-1),FXPoint(width-1,height-1)};
00099
00100 FXPoint bordershade[16]={
00101 FXPoint(0,1),FXPoint(1,0),FXPoint(1,2),FXPoint(2,1),
00102 FXPoint(width-2,0),FXPoint(width-1,1),FXPoint(width-3,1),FXPoint(width-2,2),
00103 FXPoint(0,height-2),FXPoint(1,height-1),FXPoint(1,height-3),FXPoint(2,height-2),
00104 FXPoint(width-1,height-2),FXPoint(width-2,height-1),FXPoint(width-2,height-3),FXPoint(width-3,height-2)
00105 };
00106 FXPoint bordercorners[4]={
00107 FXPoint(1,1),FXPoint(1,height-2),FXPoint(width-2,1),FXPoint(width-2,height-2)
00108 };
00109
00110
00111 if (options&BUTTON_TOOLBAR && !underCursor()) {
00112 dc.setForeground(baseColor);
00113 dc.fillRectangle(0,0,width,height);
00114 }
00115 else if (state==STATE_UP && ((options&BUTTON_TOOLBAR)==0 || (options&BUTTON_TOOLBAR && underCursor()))) {
00117 dc.setForeground(baseColor);
00118 dc.drawPoints(basebackground,4);
00120 dc.setForeground(bordercolor);
00121 dc.drawRectangle(2,0,width-5,0);
00122 dc.drawRectangle(2,height-1,width-5,height-1);
00123 dc.drawRectangle(0,2,0,height-5);
00124 dc.drawRectangle(width-1,2,width-1,height-5);
00125 dc.drawPoints(bordercorners,4);
00126 dc.setForeground(shade);
00127 dc.drawPoints(bordershade,16);
00129 drawRectangle(dc,top,bottom,2,1,width-4,height-2);
00130 dc.setForeground(top);
00131 dc.drawRectangle(1,3,0,height-7);
00132 dc.setForeground(bottom);
00133 dc.drawRectangle(width-2,3,0,height-7);
00134 }
00135 else {
00137 dc.setForeground(baseColor);
00138 dc.drawPoints(basebackground,4);
00140 dc.setForeground(bordercolor);
00141 dc.drawRectangle(2,0,width-5,0);
00142 dc.drawRectangle(2,height-1,width-5,height-1);
00143 dc.drawRectangle(0,2,0,height-5);
00144 dc.drawRectangle(width-1,2,width-1,height-5);
00145 dc.drawPoints(bordercorners,4);
00146 dc.setForeground(shade);
00147 dc.drawPoints(bordershade,16);
00148
00149 dc.setForeground(FXRGB(0xdc,0xd4,0xc9));
00150 dc.fillRectangle(2,1,width-4,height-2);
00151 }
00152
00153
00154 if(!label.empty()){
00155 tw=labelWidth(label);
00156 th=labelHeight(label);
00157 }
00158 if(icon){
00159 iw=icon->getWidth();
00160 ih=icon->getHeight();
00161 }
00162
00163 just_x(tx,ix,tw,iw);
00164 just_y(ty,iy,th,ih);
00165
00166
00167 if (state && (options&(FRAME_RAISED|FRAME_SUNKEN))){
00168 ++tx; ++ty; ++ix; ++iy;
00169 }
00170
00171
00172 if(isEnabled()){
00173 if(icon){
00174 dc.drawIcon(icon,ix,iy);
00175 }
00176 if(!label.empty()){
00177 dc.setFont(font);
00178 dc.setForeground(textColor);
00179 drawLabel(dc,label,hotoff,tx,ty,tw,th);
00180 }
00181 if(hasFocus()){
00182 dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2);
00183 }
00184 }
00185
00186
00187 else {
00188 if (icon) {
00189 dc.drawIconSunken(icon,ix,iy);
00190 }
00191 if(!label.empty()) {
00192 dc.setFont(font);
00193 dc.setForeground(hiliteColor);
00194 drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
00195 dc.setForeground(shadowColor);
00196 drawLabel(dc,label,hotoff,tx,ty,tw,th);
00197 }
00198 }
00199 return 1;
00200 }
00201
00202
00203
00204
00205 FXDEFMAP(ThemeTextField) ThemeTextFieldMap[]={
00206 FXMAPFUNC( SEL_PAINT, 0, ThemeTextField::onPaint)
00207 };
00208
00209 FXIMPLEMENT( ThemeTextField, FXTextField, ThemeTextFieldMap, ARRAYNUMBER(ThemeTextFieldMap) );
00210
00211 ThemeTextField::ThemeTextField(FXComposite* p,FXint ncols,FXObject* tgt,FXSelector sel,
00212 FXuint opts,FXint x,FXint y,FXint w,FXint h,
00213 FXint pl,FXint pr,FXint pt,FXint pb)
00214 : FXTextField( p, ncols, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb )
00215 {
00216
00217 }
00218
00219 static void drawFrame(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h) {
00220 if(0<w && 0<h){
00221 dc.setForeground(FXRGB(123,158,189));
00222 dc.fillRectangle(x,y,w,1);
00223 dc.fillRectangle(x,y,1,h);
00224
00225 dc.fillRectangle(x,y+h-1,w,1);
00226 dc.fillRectangle(x+w-1,y,1,h);
00227 }
00228 }
00229
00230
00231
00232
00233 static void drawSunkenFrame(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){
00234 if(0<w && 0<h){
00235 dc.setForeground(FXRGB(255,158,100));
00236 dc.fillRectangle(x,y,w,1);
00237 dc.fillRectangle(x,y,1,h);
00238
00239 dc.fillRectangle(x,y+h-1,w,1);
00240 dc.fillRectangle(x+w-1,y,1,h);
00241
00242 if(1<w && 1<h){
00243 dc.fillRectangle(x+1,y+1,w-3,1);
00244 dc.fillRectangle(x+1,y+1,1,h-3);
00245 dc.fillRectangle(x+1,y+h-2,w-2,1);
00246 dc.fillRectangle(x+w-2,y+1,1,h-2);
00247 }
00248 }
00249 }
00250
00251
00252
00253 static void drawHighlightFrame(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h) {
00254 if (0<w && 0<h){
00255 dc.setForeground(FXRGB(123,158,255));
00256 dc.fillRectangle(x,y,w,1);
00257 dc.fillRectangle(x,y,1,h);
00258
00259 dc.fillRectangle(x,y+h-1,w,1);
00260 dc.fillRectangle(x+w-1,y,1,h);
00261
00262 if (1<w && 1<h){
00263 dc.fillRectangle(x+1,y+1,w-3,1);
00264 dc.fillRectangle(x+1,y+1,1,h-3);
00265 dc.fillRectangle(x+1,y+h-2,w-2,1);
00266 dc.fillRectangle(x+w-2,y+1,1,h-2);
00267 }
00268 }
00269 }
00270
00271
00272
00273 long ThemeTextField::onPaint(FXObject*,FXSelector,void* ptr) {
00274 FXEvent *ev=(FXEvent*)ptr;
00275 FXDCWindow dc(this,ev);
00276
00277
00278 dc.setFont(font);
00279
00280
00281 ::drawFrame(dc,0,0,width,height);
00282
00283
00284 dc.setForeground(isEnabled() ? backColor : baseColor);
00285
00286
00287 dc.fillRectangle(border,border,width-(border<<1),height-(border<<1));
00288
00289
00290 dc.setClipRectangle(border,border,width-(border<<1),height-(border<<1));
00291 drawTextRange(dc,0,contents.length());
00292
00293
00294 if (flags&FLAG_CARET){
00295 int xx=coord(cursor)-1;
00296 dc.setForeground(cursorColor);
00297 dc.fillRectangle(xx,padtop+border,1,height-padbottom-padtop-(border<<1));
00298 dc.fillRectangle(xx-2,padtop+border,5,1);
00299 dc.fillRectangle(xx-2,height-border-padbottom-1,5,1);
00300 }
00301 return 1;
00302 }
00303
00304
00305
00306 struct ColorTheme {
00307 const FXchar* name;
00308 FXColor base;
00309 FXColor border;
00310 FXColor back;
00311 FXColor fore;
00312 FXColor selback;
00313 FXColor selfore;
00314 FXColor tipback;
00315 FXColor tipfore;
00316 FXColor menuback;
00317 FXColor menufore;
00318 };
00319
00320
00321 const ColorTheme ColorThemes[]={
00322 {"Redmond XP",FXRGB(238,238,230),FXRGB( 0, 0, 0),FXRGB(255,255,255),FXRGB( 0, 0, 0),FXRGB( 74,121,205),FXRGB(255,255,255),FXRGB(255,255,225),FXRGB( 0, 0, 0),FXRGB( 74,121,205),FXRGB(255,255,255)}
00323 };
00324
00325
00326
00327 void init_theme(FXApp *app) {
00328 app->setBaseColor( ColorThemes[0].base );
00329 app->setBorderColor( ColorThemes[0].border );
00330 app->setBackColor( ColorThemes[0].back );
00331 app->setForeColor( ColorThemes[0].fore );
00332 app->setSelforeColor( ColorThemes[0].selfore );
00333 app->setSelbackColor( ColorThemes[0].selback );
00334 app->setTipforeColor( ColorThemes[0].tipfore );
00335 app->setTipbackColor( ColorThemes[0].tipback );
00336 app->setSelMenuTextColor( ColorThemes[0].menufore );
00337 app->setSelMenuBackColor( ColorThemes[0].menuback );
00338
00339 }
00340
00341
00342
00343
00344 FXDEFMAP(ThemeComboBox) ThemeComboBoxMap[]={
00345 FXMAPFUNC( SEL_PAINT, 0, ThemeComboBox::onPaint)
00346 };
00347
00348 FXIMPLEMENT( ThemeComboBox, FXComboBox, ThemeComboBoxMap, ARRAYNUMBER(ThemeComboBoxMap) );
00349
00350 ThemeComboBox::ThemeComboBox(FXComposite *p,FXint cols,FXObject* tgt,FXSelector sel,FXuint opts,
00351 FXint x,FXint y,FXint w,FXint h,
00352 FXint pl,FXint pr,FXint pt,FXint pb)
00353 : FXComboBox(p,cols, tgt, sel, opts,x,y,w,h, pl,pr,pt,pb)
00354 {
00355 delete button;
00356
00357 button=new ThemeMenuButton(this,FXString::null, NULL, pane,
00358 FRAME_RAISED|MENUBUTTON_DOWN|MENUBUTTON_ATTACH_RIGHT,
00359 0,0,0,0, 0,0,0,0);
00360 button->setXOffset(border);
00361 button->setYOffset(border);
00362 }
00363
00364
00365
00366 long ThemeComboBox::onPaint(FXObject*,FXSelector,void* ptr){
00367 FXEvent *ev=(FXEvent*)ptr;
00368 FXDCWindow dc(this,ev);
00369
00370 dc.setForeground(backColor);
00371 dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h);
00372 drawFrame(dc,0,0,width,height);
00373 return 1;
00374 }
00375
00376
00377
00378
00379
00380 FXDEFMAP(ThemeLabel) ThemeLabelMap[]={
00381 FXMAPFUNC( SEL_PAINT, 0, ThemeLabel::onPaint )
00382 };
00383
00384 FXIMPLEMENT( ThemeLabel, FXLabel, ThemeLabelMap, ARRAYNUMBER( ThemeLabelMap ));
00385
00386 ThemeLabel::ThemeLabel(FXComposite* p,const FXString& text,FXIcon* ic,FXuint opts,
00387 FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)
00388 : FXLabel( p, text, ic, opts, x, y, w, h, pl, pr, pt, pb )
00389 {
00390
00391 }
00392
00393
00394
00395
00396 long ThemeLabel::onPaint(FXObject*,FXSelector,void* ptr) {
00397 FXEvent *ev=(FXEvent*)ptr;
00398 FXDCWindow dc(this,ev);
00399 FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy;
00400 dc.setForeground(backColor);
00401 dc.fillRectangle(0,0,width,height);
00402 if (!label.empty()){
00403 tw=labelWidth(label);
00404 th=labelHeight(label);
00405 }
00406 if (icon){
00407 iw=icon->getWidth();
00408 ih=icon->getHeight();
00409 }
00410 just_x(tx,ix,tw,iw);
00411 just_y(ty,iy,th,ih);
00412 if(icon) {
00413 if(isEnabled())
00414 dc.drawIcon(icon,ix,iy);
00415 else
00416 dc.drawIconSunken(icon,ix,iy);
00417 }
00418 if (!label.empty()){
00419 dc.setFont(font);
00420 if(isEnabled()){
00421 dc.setForeground(textColor);
00422 drawLabel(dc,label,hotoff,tx,ty,tw,th);
00423 }
00424 else {
00425 dc.setForeground(hiliteColor);
00426 drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
00427 dc.setForeground(shadowColor);
00428 drawLabel(dc,label,hotoff,tx,ty,tw,th);
00429 }
00430 }
00431 if (options & (FRAME_THICK|FRAME_RAISED|FRAME_SUNKEN)) {
00432 if( options & (FRAME_SUNKEN) )
00433 drawSunkenFrame(dc,0,0,width,height);
00434 else if( options & (FRAME_RAISED) )
00435 drawHighlightFrame(dc,0,0,width,height);
00436 else
00437 drawFrame(dc,0,0,width,height);
00438 }
00439
00440 return 1;
00441 }
00442
00443
00444
00445
00446 FXDEFMAP(ThemeTabItem) ThemeTabItemMap[]={
00447
00448 };
00449
00450 FXIMPLEMENT( ThemeTabItem, FXTabItem, ThemeTabItemMap, ARRAYNUMBER( ThemeTabItemMap ));
00451
00452 ThemeTabItem::ThemeTabItem(FXTabBar* p,const FXString& text,FXIcon* ic,FXuint opts,
00453 FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb)
00454 : FXTabItem(p,text,ic,opts,x,y,w,h,pl,pr,pt,pb)
00455 {
00456 shadowColor = FXRGB(123,158,189);
00457 borderColor = FXRGB(123,158,189);
00458 hiliteColor = FXRGB(123,158,189);
00459 }
00460
00461
00462
00463
00464 ThemeVerticalFrame::ThemeVerticalFrame(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,
00465 FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs)
00466 : FXVerticalFrame( p, opts, x, y, w, h, pl, pr, pt, pb, hs, vs )
00467 {
00468 setHiliteColor( FXRGB(123,158,189) );
00469 }
00470
00471
00472 ThemeHorizontalFrame::ThemeHorizontalFrame(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,
00473 FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs)
00474 : FXHorizontalFrame( p, opts, x, y, w, h, pl, pr, pt, pb, hs, vs )
00475 {
00476 setHiliteColor( FXRGB(123,158,189) );
00477 }
00478
00479
00480
00481
00482 #define MENUBUTTONARROW_WIDTH 13
00483 #define MENUBUTTONARROW_HEIGHT 5
00484
00485 FXDEFMAP(ThemeMenuButton) ThemeMenuButtonMap[]={
00486 FXMAPFUNC( SEL_PAINT, 0, ThemeMenuButton::onPaint)
00487 };
00488
00489 FXIMPLEMENT( ThemeMenuButton, FXMenuButton, ThemeMenuButtonMap, ARRAYNUMBER(ThemeMenuButtonMap) );
00490
00491
00492 ThemeMenuButton::ThemeMenuButton(FXComposite* p,const FXString& text,
00493 FXIcon* ic,FXPopup* pup,FXuint opts,
00494 FXint x,FXint y,FXint w,FXint h,
00495 FXint pl,FXint pr,FXint pt,FXint pb )
00496 : FXMenuButton( p, text, ic, pup, opts, x, y, w, h,
00497 pl, pr, pt, pb)
00498 {
00499 }
00500
00501
00502
00503
00504 long ThemeMenuButton::onPaint(FXObject*,FXSelector,void* ptr) {
00505 FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy;
00506 FXEvent *ev=(FXEvent*)ptr;
00507 FXPoint points[6];
00508 FXDCWindow dc(this,ev);
00509
00510
00511
00512
00513
00514 FXColor top = FXRGB(0xde,0xe7,0xff);
00515 FXColor bottom = FXRGB(0xbd,0xcf,0xff);
00516 FXColor shade = FXRGB(0xbd,0xcb,0xf7);
00517
00518 FXColor buttoncolor = FXRGB(0x4a,0x61,0x84);
00519
00520
00521 FXColor bordercolor = shade;
00522
00523 FXPoint basebackground[4]={
00524 FXPoint(0,0),FXPoint(width-1,0),FXPoint(0,height-1),FXPoint(width-1,height-1)
00525 };
00526 FXPoint bordershade[16]={
00527 FXPoint(0,1),FXPoint(1,0),FXPoint(1,2),FXPoint(2,1),
00528 FXPoint(width-2,0),FXPoint(width-1,1),FXPoint(width-3,1),FXPoint(width-2,2),
00529 FXPoint(0,height-2),FXPoint(1,height-1),FXPoint(1,height-3),FXPoint(2,height-2),
00530 FXPoint(width-1,height-2),FXPoint(width-2,height-1),FXPoint(width-2,height-3),FXPoint(width-3,height-2)
00531 };
00532 FXPoint bordercorners[4]={
00533 FXPoint(1,1),FXPoint(1,height-2),FXPoint(width-2,1),FXPoint(width-2,height-2)
00534 };
00535
00536
00537
00538 if (options&(FRAME_RAISED|FRAME_SUNKEN)){
00539
00540
00541 if (options&MENUBUTTON_TOOLBAR){
00542
00543
00544 if (isEnabled() && underCursor() && !state){
00545 dc.setForeground(backColor);
00546 dc.fillRectangle(border,border,width-border*2,height-border*2);
00547 if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height);
00548 else drawRaisedRectangle(dc,0,0,width,height);
00549 }
00550
00551
00552 else if (isEnabled() && state){
00553 dc.setForeground(hiliteColor);
00554 dc.fillRectangle(border,border,width-border*2,height-border*2);
00555 if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height);
00556 else drawSunkenRectangle(dc,0,0,width,height);
00557 }
00558
00559
00560 else {
00561 dc.setForeground(backColor);
00562 dc.fillRectangle(0,0,width,height);
00563 }
00564 }
00565
00566
00567 else {
00568
00569 if (!isEnabled() || !state){
00570
00571
00572
00573
00574
00575
00577 dc.setForeground(baseColor);
00578 dc.drawPoints(basebackground,4);
00580 dc.setForeground(bordercolor);
00581 dc.drawRectangle(2,0,width-5,0);
00582 dc.drawRectangle(2,height-1,width-5,height-1);
00583 dc.drawRectangle(0,2,0,height-5);
00584 dc.drawRectangle(width-1,2,0,height-5);
00585 dc.drawPoints(bordercorners,4);
00586 dc.setForeground(shade);
00587 dc.drawPoints(bordershade,16);
00589 drawRectangle(dc,top,bottom,2,1,width-4,height-2);
00590 dc.setForeground(top);
00591 dc.drawRectangle(1,3,0,height-7);
00592 dc.setForeground(bottom);
00593 dc.drawRectangle(width-2,3,0,height-7);
00594 }
00595
00596
00597 else {
00598 dc.setForeground(baseColor);
00599 dc.drawPoints(basebackground,4);
00601 dc.setForeground(bordercolor);
00602 dc.drawRectangle(2,0,width-5,0);
00603 dc.drawRectangle(2,height-1,width-5,height-1);
00604 dc.drawRectangle(0,2,0,height-5);
00605 dc.drawRectangle(width-1,2,0,height-5);
00606 dc.drawPoints(bordercorners,4);
00607 dc.setForeground(shade);
00608 dc.drawPoints(bordershade,16);
00609
00610 dc.setForeground(FXRGB(0xdc,0xd4,0xc9));
00611 dc.fillRectangle(2,1,width-4,height-2);
00612 }
00613 }
00614 }
00615
00616
00617 else {
00618 if(isEnabled() && state){
00619 dc.setForeground(hiliteColor);
00620 dc.fillRectangle(0,0,width,height);
00621 }
00622 else{
00623 dc.setForeground(backColor);
00624 dc.fillRectangle(0,0,width,height);
00625 }
00626 }
00627
00628
00629 if (!label.empty()){
00630 tw=labelWidth(label);
00631 th=labelHeight(label);
00632 }
00633
00634
00635 if (icon){
00636 iw=icon->getWidth();
00637 ih=icon->getHeight();
00638 }
00639
00640
00641 else if(!(options&MENUBUTTON_NOARROWS)){
00642 if(options&MENUBUTTON_LEFT){
00643 ih=MENUBUTTONARROW_WIDTH;
00644 iw=MENUBUTTONARROW_HEIGHT;
00645 }
00646 else{
00647 iw=MENUBUTTONARROW_WIDTH;
00648 ih=MENUBUTTONARROW_HEIGHT;
00649 }
00650 }
00651
00652
00653 just_x(tx,ix,tw,iw);
00654 just_y(ty,iy,th,ih);
00655
00656
00657 if (state){
00658 ++tx; ++ty; ++ix; ++iy;
00659 }
00660
00661
00662 if (icon){
00663 if (isEnabled())
00664 dc.drawIcon(icon,ix,iy);
00665 else
00666 dc.drawIconSunken(icon,ix,iy);
00667 }
00668
00669
00670 else if (!(options&MENUBUTTON_NOARROWS)){
00671
00672
00673 if ((options&MENUBUTTON_RIGHT)==MENUBUTTON_RIGHT){
00674 if (isEnabled())
00675 dc.setForeground(buttoncolor);
00676 else
00677 dc.setForeground(shadowColor);
00678 points[0].x=ix;
00679 points[0].y=iy;
00680 points[1].x=ix;
00681 points[1].y=iy+MENUBUTTONARROW_WIDTH-1;
00682 points[2].x=ix+MENUBUTTONARROW_HEIGHT;
00683 points[2].y=(FXshort)(iy+(MENUBUTTONARROW_WIDTH>>1));
00684 dc.fillPolygon(points,3);
00685 }
00686
00687
00688 else if (options&MENUBUTTON_LEFT){
00689 if (isEnabled())
00690 dc.setForeground(buttoncolor);
00691 else
00692 dc.setForeground(shadowColor);
00693 points[0].x=ix+MENUBUTTONARROW_HEIGHT;
00694 points[0].y=iy;
00695 points[1].x=ix+MENUBUTTONARROW_HEIGHT;
00696 points[1].y=iy+MENUBUTTONARROW_WIDTH-1;
00697 points[2].x=ix;
00698 points[2].y=(FXshort)(iy+(MENUBUTTONARROW_WIDTH>>1));
00699 dc.fillPolygon(points,3);
00700 }
00701
00702
00703 else if (options&MENUBUTTON_UP){
00704 if(isEnabled())
00705 dc.setForeground(buttoncolor);
00706 else
00707 dc.setForeground(shadowColor);
00708 points[0].x=(FXshort)(ix+(MENUBUTTONARROW_WIDTH>>1));
00709 points[0].y=iy-1;
00710 points[1].x=ix;
00711 points[1].y=iy+MENUBUTTONARROW_HEIGHT;
00712 points[2].x=ix+MENUBUTTONARROW_WIDTH;
00713 points[2].y=iy+MENUBUTTONARROW_HEIGHT;
00714 dc.fillPolygon(points,3);
00715 }
00716
00717
00718 else {
00719 if(isEnabled())
00720 dc.setForeground(buttoncolor);
00721 else
00722 dc.setForeground(shadowColor);
00723 points[0].x=ix+1;
00724 points[0].y=iy;
00725 points[2].x=ix+MENUBUTTONARROW_WIDTH-1;
00726 points[2].y=iy;
00727 points[1].x=(FXshort)(ix+(MENUBUTTONARROW_WIDTH>>1));
00728 points[1].y=iy+MENUBUTTONARROW_HEIGHT;
00729 points[3].x=ix+MENUBUTTONARROW_WIDTH-3;
00730 points[3].y=iy;
00731 points[4].x=(FXshort)(ix+(MENUBUTTONARROW_WIDTH>>1));
00732 points[4].y=iy+MENUBUTTONARROW_HEIGHT-3;
00733 points[5].x=ix+3;
00734 points[5].y=iy;
00735 dc.fillConcavePolygon(points,6);
00736 }
00737 }
00738
00739
00740 if (!label.empty()){
00741 dc.setFont(font);
00742 if(isEnabled()){
00743 dc.setForeground(textColor);
00744 drawLabel(dc,label,hotoff,tx,ty,tw,th);
00745 }
00746 else {
00747 dc.setForeground(hiliteColor);
00748 drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th);
00749 dc.setForeground(shadowColor);
00750 drawLabel(dc,label,hotoff,tx,ty,tw,th);
00751 }
00752 }
00753
00754
00755 if (hasFocus()){
00756 if (isEnabled()){
00757 dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2);
00758 }
00759 }
00760 return 1;
00761 }
00762
00763
00764
00765
00766 FXint ThemeMenuButton::getDefaultWidth(){
00767 FXint tw=0,iw=0,s=0,w,pw;
00768
00769 if (!label.empty()){
00770 tw=labelWidth(label); s=4;
00771 }
00772 if (!(options&MENUBUTTON_NOARROWS)){
00773 if (options&MENUBUTTON_LEFT)
00774 iw=MENUBUTTONARROW_HEIGHT;
00775 else
00776 iw=MENUBUTTONARROW_WIDTH;
00777 }
00778 if(icon)
00779 iw=icon->getWidth();
00780 if (!(options&(ICON_AFTER_TEXT|ICON_BEFORE_TEXT)))
00781 w=FXMAX(tw,iw);
00782 else
00783 w=tw+iw+s;
00784 w=padleft+padright+(border<<1)+w;
00785 if (!(options&MENUBUTTON_LEFT) &&
00786 (options&MENUBUTTON_ATTACH_RIGHT) &&
00787 (options&MENUBUTTON_ATTACH_CENTER)) {
00788 if (pane){
00789 pw=pane->getDefaultWidth();
00790 if(pw>w)
00791 w=pw;
00792 }
00793 }
00794 return w;
00795 }
00796
00797
00798
00799
00800 #if 0
00801 FXDEFMAP(ThemeHeaderItem) ThemeHeaderItemMap[]={
00802 FXMAPFUNC(SEL_PAINT, 0, ThemeHeaderItem::onPaint)
00803 };
00804
00805 FXIMPLEMENT(ThemeHeaderItem, FXHeaderItem, ThemeHeaderItemMap, ARRAYNUMBER(ThemeHeaderItemMap));
00806 #endif
00807
00808
00809 ThemeHeaderItem::ThemeHeaderItem(const FXString& text, FXIcon* ic, FXint s, void* ptr)
00810 :FXHeaderItem(text, ic, s, ptr)
00811 {
00812 }
00813
00814
00815
00816 void ThemeHeaderItem::draw(const FXHeader* header,FXDC& dc,FXint x,FXint y,FXint w,FXint h) {
00817 register FXint tx,ty,tw,th,ix,iy,iw,ih,s,ml,mr,mt,mb,beg,end,t,xx,yy,bb,aa,ax,ay;
00818 register FXFont *font=header->getFont();
00819 FXColor top = FXRGB(0xfe,0xfd,0xfd);
00820 FXColor bottom = FXRGB(0xdd,0xd7,0xce);
00821 FXColor shade = FXRGB(0xdc,0xd9,0xd4);
00822
00823
00824 bb=header->getBorderWidth();
00825 ml=header->getPadLeft()+bb;
00826 mr=header->getPadRight()+bb;
00827 mt=header->getPadTop()+bb;
00828 mb=header->getPadBottom()+bb;
00829
00830 dc.setForeground(shade);
00832 drawRectangle(dc,top, bottom, x+2, y+1, w-4, h-2);
00833
00834
00835 x+=ml; w-=ml+mr;
00836 y+=mt; h-=mt+mb;
00837
00838
00839 dc.setClipRectangle(x,y,w,h);
00840
00841 dc.setForeground(header->getTextColor());
00842
00843 tw=th=iw=ih=beg=s=0;
00844 do {
00845 end=beg;
00846 while(end<label.length() && label[end]!='\n') end++;
00847 if((t=font->getTextWidth(&label[beg],end-beg))>tw) tw=t;
00848 th+=font->getFontHeight();
00849 beg=end+1;
00850 }
00851 while(end<label.length());
00852
00853
00854 if(icon){
00855 iw=icon->getWidth();
00856 ih=icon->getHeight();
00857 }
00858
00859
00860 if(iw && tw)
00861 s=ICON_SPACING;
00862
00863
00864 if (state&(ARROW_UP|ARROW_DOWN)){
00865 aa=(font->getFontHeight()-5)|1;
00866 ay=y+(h-aa)/2;
00867 ax=x+w-aa-2;
00868 if(state&ARROW_UP) {
00869 dc.setForeground(header->getHiliteColor());
00870 dc.drawLine(ax+aa/2,ay,ax+aa-1,ay+aa);
00871 dc.drawLine(ax,ay+aa,ax+aa,ay+aa);
00872 dc.setForeground(header->getShadowColor());
00873 dc.drawLine(ax+aa/2,ay,ax,ay+aa);
00874 }
00875 else {
00876 dc.setForeground(header->getHiliteColor());
00877 dc.drawLine(ax+aa/2,ay+aa,ax+aa-1,ay);
00878 dc.setForeground(header->getShadowColor());
00879 dc.drawLine(ax+aa/2,ay+aa,ax,ay);
00880 dc.drawLine(ax,ay,ax+aa,ay);
00881 }
00882 w-=aa+4;
00883 dc.setClipRectangle(x,y,w,h);
00884 }
00885
00886
00887 if (state&LEFT){
00888 if(state&BEFORE){
00889 ix=x; tx=ix+iw+s;
00890 }
00891 else if (state&AFTER){
00892 tx=x; ix=tx+tw+s;
00893 }
00894 else {
00895 ix=x; tx=x;
00896 }
00897 }
00898 else if(state&RIGHT){
00899 if(state&BEFORE){
00900 tx=x+w-tw;
00901 ix=tx-iw-s;
00902 }
00903 else if (state&AFTER){
00904 ix=x+w-iw;
00905 tx=ix-tw-s;
00906 }
00907 else {
00908 ix=x+w-iw; tx=x+w-tw;
00909 }
00910 }
00911 else{
00912 if (state&BEFORE){
00913 ix=x+(w-tw-iw-s)/2;
00914 tx=ix+iw+s;
00915 }
00916 else if (state&AFTER){
00917 tx=x+(w-tw-iw-s)/2;
00918 ix=tx+tw+s;
00919 }
00920 else{
00921 ix=x+(w-iw)/2;
00922 tx=x+(w-tw)/2;
00923 }
00924 }
00925
00926
00927 if(state&TOP){
00928 if (state&ABOVE){
00929 iy=y;
00930 ty=iy+ih;
00931 }
00932 else if (state&BELOW){
00933 ty=y;
00934 iy=ty+th;
00935 }
00936 else {
00937 iy=y;
00938 ty=y;
00939 }
00940 }
00941 else if(state&BOTTOM){
00942 if (state&ABOVE){
00943 ty=y+h-th;
00944 iy=ty-ih;
00945 }
00946 else if (state&BELOW){
00947 iy=y+h-ih;
00948 ty=iy-th;
00949 }
00950 else{
00951 iy=y+h-ih;
00952 ty=y+h-th;
00953 }
00954 }
00955 else {
00956 if (state&ABOVE){
00957 iy=y+(h-th-ih)/2;
00958 ty=iy+ih;
00959 }
00960 else if (state&BELOW){
00961 ty=y+(h-th-ih)/2;
00962 iy=ty+th;
00963 }
00964 else {
00965 iy=y+(h-ih)/2;
00966 ty=y+(h-th)/2;
00967 }
00968 }
00969
00970
00971 if (state&PRESSED){
00972 tx++;
00973 ty++;
00974 ix++;
00975 iy++;
00976 }
00977
00978
00979 if (icon){
00980 dc.drawIcon(icon,ix,iy);
00981 }
00982
00983
00984 dc.setForeground(header->getTextColor());
00985
00986
00987 yy=ty+font->getFontAscent();
00988 beg=0;
00989 do {
00990 end=beg;
00991 while(end<label.length() && label[end]!='\n')
00992 end++;
00993 if (state&LEFT)
00994 xx=tx;
00995 else if(state&RIGHT)
00996 xx=tx+tw-font->getTextWidth(&label[beg],end-beg);
00997 else
00998 xx=tx+(tw-font->getTextWidth(&label[beg],end-beg))/2;
00999 dc.drawText(xx,yy,&label[beg],end-beg);
01000 yy+=font->getFontHeight();
01001 beg=end+1;
01002 }
01003 while(end<label.length());
01004
01005
01006 dc.clearClipRectangle();
01007 }
01008
01009
01010
01011
01012
01013