doc/src/snippets/javastyle.cpp
changeset 0 1918ee327afb
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the documentation of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include <QtGui>
       
    43 
       
    44 #include "javastyle.h"
       
    45 #include <math.h>
       
    46 
       
    47 static const int windowsItemFrame        =  2;
       
    48 static const int windowsSepHeight        =  2;
       
    49 static const int windowsItemHMargin      =  3;
       
    50 static const int windowsItemVMargin      =  2;
       
    51 static const int windowsArrowHMargin     =  6;
       
    52 static const int windowsTabSpacing       = 12;
       
    53 static const int windowsCheckMarkHMargin =  2;
       
    54 static const int windowsRightBorder      = 15;
       
    55 static const int windowsCheckMarkWidth   = 12;
       
    56 
       
    57 JavaStyle::JavaStyle()
       
    58 {
       
    59     qApp->setPalette(standardPalette());
       
    60 }
       
    61 
       
    62 
       
    63 inline QPoint JavaStyle::adjustScrollPoint(const QPoint &point,
       
    64                     Qt::Orientation orientation,
       
    65                     bool add) const
       
    66 {
       
    67     int adder = add ? -1 : 1;
       
    68     QPoint retPoint;
       
    69 
       
    70     if (orientation == Qt::Horizontal) {
       
    71         retPoint = QPoint(point.y() * adder, point.x());
       
    72     } else {
       
    73         retPoint = QPoint(point.x(), point.y() * adder);
       
    74     }
       
    75 
       
    76     return retPoint;
       
    77 }
       
    78 
       
    79 QPalette JavaStyle::standardPalette() const
       
    80 {
       
    81     QPalette palette = QWindowsStyle::standardPalette();
       
    82 
       
    83     palette.setBrush(QPalette::Active, QPalette::Button,
       
    84                      QColor(184, 207, 229));
       
    85     palette.setBrush(QPalette::Active, QPalette::WindowText,
       
    86                      Qt::black);
       
    87     palette.setBrush(QPalette::Active, QPalette::Background,
       
    88                      QColor(238, 238, 238));
       
    89     palette.setBrush(QPalette::Active, QPalette::Window,
       
    90                      QColor(238 ,238, 238));
       
    91     palette.setBrush(QPalette::Active, QPalette::Base, Qt::white);
       
    92     palette.setBrush(QPalette::Active, QPalette::AlternateBase, QColor(238, 238, 238));
       
    93     palette.setBrush(QPalette::Active, QPalette::Text, Qt::black);
       
    94     palette.setBrush(QPalette::Active, QPalette::BrightText, Qt::white);
       
    95 
       
    96     palette.setBrush(QPalette::Active, QPalette::Light, QColor(163, 184, 204)); // focusFrameColor
       
    97     palette.setBrush(QPalette::Active, QPalette::Midlight, QColor(99, 130, 191)); // tabBarBorderColor
       
    98     palette.setBrush(QPalette::Active, QPalette::Dark, QColor(106, 104, 100));
       
    99     palette.setBrush(QPalette::Active, QPalette::Mid, QColor(122, 138, 153)); //defaultFrameColor
       
   100     palette.setBrush(QPalette::Active, QPalette::Shadow, QColor(122, 138, 153)); // defaultFrame
       
   101 
       
   102     palette.setBrush(QPalette::Active, QPalette::Highlight, QColor(184, 207, 229));
       
   103     palette.setBrush(QPalette::Active, QPalette::HighlightedText, Qt::black);
       
   104 
       
   105     palette.setBrush(QPalette::Inactive, QPalette::Highlight, QColor(184, 207, 229));
       
   106     palette.setBrush(QPalette::Inactive, QPalette::HighlightedText, Qt::black);
       
   107     
       
   108     palette.setBrush(QPalette::Disabled, QPalette::Button,
       
   109                      QColor(238, 238, 238));
       
   110     palette.setBrush(QPalette::Disabled, QPalette::WindowText,
       
   111                      QColor(153, 153, 153));
       
   112     palette.setBrush(QPalette::Disabled, QPalette::Background, QColor(238, 238, 238));
       
   113 
       
   114     palette.setBrush(QPalette::Inactive, QPalette::Button,
       
   115                      QColor(184, 207, 229));
       
   116     palette.setBrush(QPalette::Inactive, QPalette::Background,
       
   117                      QColor(238, 238, 238));
       
   118     palette.setBrush(QPalette::Inactive, QPalette::Window,
       
   119                      QColor(238 ,238, 238));
       
   120     palette.setBrush(QPalette::Inactive, QPalette::Light, QColor(163, 184, 204)); // focusFrameColor
       
   121     palette.setBrush(QPalette::Inactive, QPalette::Midlight, QColor(99, 130, 191)); // tabBarBorderColor
       
   122     palette.setBrush(QPalette::Inactive, QPalette::Dark,QColor(106, 104, 100));
       
   123     palette.setBrush(QPalette::Inactive, QPalette::Mid, QColor(122, 138, 153)); //defaultFrame
       
   124     palette.setBrush(QPalette::Inactive, QPalette::Shadow, QColor(122, 138, 153)); // defaultFrame
       
   125 
       
   126     return palette;
       
   127 }
       
   128 
       
   129 inline void JavaStyle::drawScrollBarArrow(const QRect &rect, QPainter *painter,
       
   130                       const QStyleOptionSlider *option,
       
   131                       bool add) const
       
   132 {
       
   133 
       
   134     painter->save();
       
   135 
       
   136     Qt::Orientation orient = option->orientation;
       
   137     QPoint offset;
       
   138 
       
   139     if (add) {
       
   140         if (orient == Qt::Vertical) {
       
   141             offset = rect.bottomLeft();
       
   142         } else {
       
   143             offset = rect.topRight();
       
   144         }
       
   145     } else {
       
   146         offset = rect.topLeft();
       
   147     }
       
   148 
       
   149     QPainterPath arrow;
       
   150     arrow.moveTo(offset + adjustScrollPoint(QPoint(4, 8), orient, add));
       
   151     arrow.lineTo(offset + adjustScrollPoint(QPoint(7, 5), orient, add));
       
   152     arrow.lineTo(offset + adjustScrollPoint(QPoint(8, 5), orient, add));
       
   153     arrow.lineTo(offset + adjustScrollPoint(QPoint(11, 8), orient, add));
       
   154     arrow.lineTo(offset + adjustScrollPoint(QPoint(4, 8), orient, add));
       
   155 
       
   156     QColor fillColor;
       
   157     if (option->state & State_Sunken)
       
   158         fillColor = QColor(option->palette.color(QPalette::Button));
       
   159     else
       
   160         fillColor = option->palette.color(QPalette::Background);
       
   161 
       
   162     painter->fillRect(rect, fillColor);
       
   163 
       
   164     painter->setPen(option->palette.color(QPalette::Base));
       
   165     int adjust = option->state & State_Sunken ? 0 : 1;
       
   166     painter->drawRect(rect.adjusted(adjust, adjust, -1, -1));
       
   167     painter->setPen(option->palette.color(QPalette::Mid));
       
   168     painter->drawRect(rect.adjusted(0, 0, -1, -1));
       
   169 
       
   170     painter->setPen(option->palette.color(QPalette::WindowText));
       
   171     painter->setBrush(option->palette.color(QPalette::WindowText));
       
   172     painter->drawPath(arrow);
       
   173 
       
   174     painter->restore();
       
   175 }
       
   176 
       
   177 inline QPoint JavaStyle::adjustScrollHandlePoint(Qt::Orientation orig,
       
   178                          const QPoint &point) const
       
   179 {
       
   180     QPoint retPoint;
       
   181 
       
   182     if (orig == Qt::Vertical)
       
   183         retPoint = point;
       
   184     else
       
   185         retPoint = QPoint(point.y(), point.x());
       
   186 
       
   187     return retPoint;
       
   188 }
       
   189 
       
   190 void JavaStyle::drawControl(ControlElement control, const QStyleOption *option,
       
   191                             QPainter *painter, const QWidget *widget) const
       
   192 {
       
   193 
       
   194     painter->save();
       
   195 
       
   196     switch (control) {
       
   197         case CE_ToolBoxTabShape: {
       
   198             const QStyleOptionToolBox *box =
       
   199             qstyleoption_cast<const QStyleOptionToolBox *>(option);
       
   200 
       
   201             painter->save();
       
   202 
       
   203             if (box->direction == Qt::RightToLeft) {
       
   204                 painter->rotate(1);
       
   205                 painter->translate(box->rect.width(), -box->rect.height());
       
   206             }
       
   207 
       
   208             int textWidth = box->fontMetrics.width(box->text) + 20;
       
   209 
       
   210             QPolygon innerLine;
       
   211             innerLine << (box->rect.topLeft() + QPoint(0, 1)) <<
       
   212                 (box->rect.topLeft() + QPoint(textWidth, 1)) <<
       
   213                 (box->rect.bottomLeft() + QPoint(textWidth + 15, -3)) <<
       
   214                 (box->rect.bottomRight() + QPoint(0, -3)) <<
       
   215                 box->rect.bottomRight() <<
       
   216                 box->rect.bottomLeft() <<
       
   217                 box->rect.topLeft();
       
   218 
       
   219             painter->setPen(box->palette.color(QPalette::Base));
       
   220             painter->setBrush(QColor(200, 221, 242));
       
   221             painter->drawPolygon(innerLine);
       
   222 
       
   223             QPolygon outerLine;
       
   224             outerLine << (box->rect.bottomRight() + QPoint(0, -3)) <<
       
   225                box->rect.bottomRight() <<
       
   226                box->rect.bottomLeft() <<
       
   227                box->rect.topLeft() <<
       
   228                (box->rect.topLeft() + QPoint(textWidth, 0)) <<
       
   229                (box->rect.bottomLeft() + QPoint(textWidth + 15, -4)) <<
       
   230                (box->rect.bottomRight() + QPoint(0, -4));
       
   231 
       
   232             painter->setPen(box->palette.color(QPalette::Midlight));
       
   233             painter->setBrush(Qt::NoBrush);
       
   234             painter->drawPolyline(outerLine);
       
   235 
       
   236             painter->restore();
       
   237             break;
       
   238         }
       
   239         case CE_DockWidgetTitle: {
       
   240             const QStyleOptionDockWidgetV2 *docker =
       
   241                 new QStyleOptionDockWidgetV2(
       
   242                 *qstyleoption_cast<const QStyleOptionDockWidget *>(option));
       
   243 
       
   244             QRect rect = docker->rect;
       
   245             QRect titleRect = rect;
       
   246             if (docker->verticalTitleBar) {
       
   247                 QRect r = rect;
       
   248                 QSize s = r.size();
       
   249                 s.transpose();
       
   250                 r.setSize(s);
       
   251 
       
   252                 titleRect = QRect(r.left() + rect.bottom()
       
   253                                 - titleRect.bottom(),
       
   254                                 r.top() + titleRect.left() - rect.left(),
       
   255                                 titleRect.height(), titleRect.width());
       
   256 
       
   257                 painter->translate(r.left(), r.top() + r.width());
       
   258                 painter->rotate(-90);
       
   259                 painter->translate(-r.left(), -r.top());
       
   260 
       
   261                 rect = r;
       
   262             }
       
   263 
       
   264             QLinearGradient gradient(rect.topLeft(),
       
   265                                      rect.bottomLeft());
       
   266             gradient.setColorAt(1.0, QColor(191, 212, 231));
       
   267             gradient.setColorAt(0.3, Qt::white);
       
   268             gradient.setColorAt(0.0, QColor(221, 232, 243));
       
   269 
       
   270             painter->setPen(Qt::NoPen);
       
   271             painter->setBrush(gradient);
       
   272             painter->drawRect(rect.adjusted(0, 0, -1, -1));
       
   273 
       
   274             if (!docker->title.isEmpty()) {
       
   275                 QRect textRect = docker->fontMetrics.boundingRect(docker->title);
       
   276                 textRect.moveCenter(rect.center());
       
   277 
       
   278                 QFont font = painter->font();
       
   279                 font.setPointSize(font.pointSize() - 1);
       
   280                 painter->setFont(font);
       
   281                 painter->setPen(docker->palette.text().color());
       
   282                 painter->drawText(textRect, docker->title,
       
   283                                   QTextOption(Qt::AlignHCenter |
       
   284                                   Qt::AlignVCenter));
       
   285             }
       
   286             break;
       
   287         }
       
   288         case CE_RubberBand: {
       
   289             painter->setPen(option->palette.color(QPalette::Active,
       
   290                             QPalette::WindowText));
       
   291             painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
       
   292             break;
       
   293         }
       
   294         case CE_SizeGrip: {
       
   295             break;
       
   296         }
       
   297         case CE_HeaderSection: {
       
   298             const QStyleOptionHeader *header =
       
   299                 qstyleoption_cast<const QStyleOptionHeader *>(option);
       
   300 
       
   301             painter->setPen(Qt::NoPen);
       
   302             painter->setBrush(option->palette.color(QPalette::Active,
       
   303                               QPalette::Background));
       
   304             painter->drawRect(option->rect);
       
   305 
       
   306             painter->setPen(header->palette.color(QPalette::Mid));
       
   307             if (header->orientation == Qt::Horizontal) {
       
   308                 if (header->position == QStyleOptionHeader::Beginning ||
       
   309                     header->position == QStyleOptionHeader::OnlyOneSection) {
       
   310                     painter->drawRect(header->rect.adjusted(0, 0, -1, -1));
       
   311                     painter->setPen(header->palette.color(QPalette::Base));
       
   312                     painter->drawLine(header->rect.bottomLeft() + QPoint(1, -1),
       
   313                                       header->rect.topLeft() + QPoint(1, 1));
       
   314                     painter->drawLine(header->rect.topLeft() + QPoint(1, 1),
       
   315                                       header->rect.topRight() + QPoint(-1, 1));
       
   316                 } else {
       
   317                     painter->drawLine(header->rect.bottomRight(),
       
   318                                       header->rect.topRight());
       
   319                     painter->drawLine(header->rect.topLeft(),
       
   320                                       header->rect.topRight());
       
   321                     painter->drawLine(header->rect.bottomLeft(),
       
   322                                       header->rect.bottomRight());
       
   323                     painter->setPen(option->palette.color(QPalette::Base));
       
   324                     painter->drawLine(header->rect.bottomLeft() + QPoint(0, -1),
       
   325                                       header->rect.topLeft() + QPoint(0, 1));
       
   326                     painter->drawLine(header->rect.topLeft() + QPoint(1, 1),
       
   327                                       header->rect.topRight() + QPoint(-1, 1));
       
   328                 }
       
   329             } else { // Vertical
       
   330                 if (header->position == QStyleOptionHeader::Beginning ||
       
   331                     header->position == QStyleOptionHeader::OnlyOneSection) {
       
   332                     painter->drawRect(header->rect.adjusted(0, 0, -1, -1));
       
   333                     painter->setPen(header->palette.color(QPalette::Base));
       
   334                     painter->drawLine(header->rect.bottomLeft() + QPoint(1, -1),
       
   335                                   header->rect.topLeft() + QPoint(1, 1));
       
   336                     painter->drawLine(header->rect.topLeft() + QPoint(1, 1),
       
   337                                   header->rect.topRight() + QPoint(-1, 1));
       
   338                 } else {
       
   339                     painter->drawLine(header->rect.bottomLeft(),
       
   340                                       header->rect.bottomRight());
       
   341                     painter->drawLine(header->rect.topLeft(),
       
   342                                       header->rect.bottomLeft());
       
   343                     painter->drawLine(header->rect.topRight(),
       
   344                                       header->rect.bottomRight());
       
   345                     painter->setPen(header->palette.color(QPalette::Base));
       
   346                     painter->drawLine(header->rect.topLeft(),
       
   347                                       header->rect.topRight() + QPoint(-1, 0));
       
   348                     painter->drawLine(header->rect.bottomLeft() + QPoint(1, -1),
       
   349                                       header->rect.topLeft() + QPoint(1, 0));
       
   350                 }
       
   351             }
       
   352             break;
       
   353         }
       
   354         case CE_ToolBar: {
       
   355             QRect rect = option->rect;
       
   356 
       
   357             QLinearGradient gradient(rect.topLeft(), rect.bottomLeft());
       
   358             gradient.setColorAt(1.0, QColor(221, 221, 221));
       
   359             gradient.setColorAt(0.0, QColor(241, 241, 241));
       
   360 
       
   361             if (option->state & State_Horizontal) {
       
   362                 painter->setPen(QColor(204, 204, 204));
       
   363                 painter->setBrush(gradient);
       
   364             } else {
       
   365                 painter->setPen(Qt::NoPen);
       
   366                 painter->setBrush(option->palette.color(QPalette::Background));
       
   367             }
       
   368             painter->drawRect(rect.adjusted(0, 0, -1, -1));
       
   369             break;
       
   370         }
       
   371         case CE_ProgressBar: {
       
   372             const QStyleOptionProgressBar *bar1 =
       
   373                 qstyleoption_cast<const QStyleOptionProgressBar *>(option);
       
   374 
       
   375             QStyleOptionProgressBarV2 *bar = new QStyleOptionProgressBarV2(*bar1);
       
   376 
       
   377             QRect rect = bar->rect;
       
   378             if (bar->orientation == Qt::Vertical) {
       
   379                 rect = QRect(rect.left(), rect.top(), rect.height(), rect.width());
       
   380                 QMatrix m;
       
   381                 m.translate(rect.height()-1, 0);
       
   382                 m.rotate(90.0);
       
   383                 painter->setMatrix(m);
       
   384             }
       
   385 
       
   386             painter->setPen(bar->palette.color(QPalette::Mid));
       
   387             painter->drawRect(rect.adjusted(0, 0, -1, -1));
       
   388 
       
   389             QRect grooveRect = subElementRect(SE_ProgressBarGroove, bar,
       
   390                                               widget);
       
   391             if (bar->orientation == Qt::Vertical) {
       
   392                 grooveRect = QRect(grooveRect.left(), grooveRect.top(),
       
   393                                    grooveRect.height(), grooveRect.width());
       
   394             }
       
   395 
       
   396             QStyleOptionProgressBar grooveBar = *bar;
       
   397             grooveBar.rect = grooveRect;
       
   398 
       
   399             drawControl(CE_ProgressBarGroove, &grooveBar, painter, widget);
       
   400 
       
   401             QRect progressRect = subElementRect(SE_ProgressBarContents, bar,
       
   402                                                 widget);
       
   403             if (bar->orientation == Qt::Vertical) {
       
   404                 progressRect = QRect(progressRect.left(), progressRect.top(),
       
   405                 progressRect.height(), progressRect.width());
       
   406                 progressRect.adjust(0, 0, 0, -1);
       
   407             }
       
   408             QStyleOptionProgressBar progressOpt = *bar;
       
   409             progressOpt.rect = progressRect;
       
   410             drawControl(CE_ProgressBarContents, &progressOpt, painter, widget);
       
   411 
       
   412             QRect labelRect = subElementRect(SE_ProgressBarLabel, bar, widget);
       
   413             if (bar->orientation == Qt::Vertical) {
       
   414                 labelRect = QRect(labelRect.left(), labelRect.top(),
       
   415                 labelRect.height(), labelRect.width());
       
   416             }
       
   417             QStyleOptionProgressBar subBar = *bar;
       
   418             subBar.rect = labelRect;
       
   419             if (bar->textVisible)
       
   420                 drawControl(CE_ProgressBarLabel, &subBar, painter, widget);
       
   421 
       
   422             delete bar;
       
   423             break;
       
   424         }
       
   425         case CE_ProgressBarGroove: {
       
   426             painter->setBrush(option->palette.color(QPalette::Background));
       
   427             painter->setPen(Qt::NoPen);
       
   428             painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
       
   429 
       
   430             painter->setPen(option->palette.color(QPalette::Button));
       
   431             painter->drawLine(option->rect.topLeft() + QPoint(0, 0),
       
   432                               option->rect.topRight() + QPoint(0, 0));
       
   433             break;
       
   434         }
       
   435         case CE_ProgressBarContents: {
       
   436             const QStyleOptionProgressBar *bar =
       
   437                 qstyleoption_cast<const QStyleOptionProgressBar *>(option);
       
   438             int progress = int((double(bar->progress) /
       
   439                                 double(bar->maximum - bar->minimum)) *
       
   440                                 bar->rect.width());
       
   441 
       
   442             painter->setBrush(bar->palette.color(QPalette::Light));
       
   443             painter->setPen(Qt::NoPen);
       
   444             QRect progressRect = QRect(bar->rect.topLeft(), QPoint(progress,
       
   445             bar->rect.bottom()));
       
   446             painter->drawRect(progressRect);
       
   447 
       
   448             painter->setPen(bar->palette.color(QPalette::Midlight));
       
   449             painter->setBrush(Qt::NoBrush);
       
   450 
       
   451             painter->drawLine(bar->rect.bottomLeft(), bar->rect.topLeft());
       
   452             painter->drawLine(bar->rect.topLeft(), QPoint(progress,
       
   453                               bar->rect.top()));
       
   454             break;
       
   455         }
       
   456         case CE_ProgressBarLabel: {
       
   457             painter->save();
       
   458             const QStyleOptionProgressBar *bar =
       
   459                 qstyleoption_cast<const QStyleOptionProgressBar *>(option);
       
   460 
       
   461             QRect rect = bar->rect;
       
   462                 QRect leftRect;
       
   463 
       
   464             int progressIndicatorPos = int((double(bar->progress) /
       
   465                     double(bar->maximum - bar->minimum)) *
       
   466                     bar->rect.width());
       
   467 
       
   468             QFont font;
       
   469             font.setBold(true);
       
   470             painter->setFont(font);
       
   471             painter->setPen(bar->palette.color(QPalette::Midlight));
       
   472 
       
   473             if (progressIndicatorPos >= 0 &&
       
   474                 progressIndicatorPos <= rect.width()) {
       
   475                 leftRect = QRect(bar->rect.topLeft(),
       
   476                                  QPoint(progressIndicatorPos,
       
   477                 bar->rect.bottom()));
       
   478             } else if (progressIndicatorPos > rect.width()) {
       
   479                 painter->setPen(bar->palette.color(QPalette::Base));
       
   480             } else {
       
   481                 painter->setPen(bar->palette.color(QPalette::Midlight));
       
   482             }
       
   483 
       
   484             QRect textRect = QFontMetrics(font).boundingRect(bar->text);
       
   485             textRect.moveCenter(option->rect.center());
       
   486             painter->drawText(textRect, bar->text,
       
   487                               QTextOption(Qt::AlignCenter));
       
   488             if (!leftRect.isNull()) {
       
   489                 painter->setPen(bar->palette.color(QPalette::Base));
       
   490                 painter->setClipRect(leftRect, Qt::IntersectClip);
       
   491                 painter->drawText(textRect, bar->text,
       
   492                                   QTextOption(Qt::AlignCenter));
       
   493             }
       
   494 
       
   495             painter->restore();
       
   496             break;
       
   497         }
       
   498         case CE_MenuBarEmptyArea: {
       
   499             QRect emptyArea = option->rect.adjusted(0, 0, -1, -1);
       
   500             QLinearGradient gradient(emptyArea.topLeft(), emptyArea.bottomLeft()
       
   501                                      - QPoint(0, 1));
       
   502             gradient.setColorAt(0.0, option->palette.color(QPalette::Base));
       
   503             gradient.setColorAt(1.0, QColor(223, 223, 223));
       
   504 
       
   505             painter->setPen(QColor(238, 238, 238));
       
   506             painter->setBrush(gradient);
       
   507             painter->drawRect(emptyArea.adjusted(0, 0, 0, -1));
       
   508             break;
       
   509         }
       
   510         case CE_MenuBarItem: {
       
   511             if (!(option->state & State_Sunken)) {
       
   512                 QLinearGradient gradient(option->rect.topLeft(),
       
   513                                          option->rect.bottomLeft());
       
   514                 gradient.setColorAt(0.0, Qt::white);
       
   515                 gradient.setColorAt(1.0, QColor(223, 223, 223));
       
   516 
       
   517                 painter->setPen(Qt::NoPen);
       
   518                 painter->setBrush(gradient);
       
   519             } else {
       
   520                 painter->setBrush(option->palette.color(QPalette::Light));
       
   521             }
       
   522 
       
   523             painter->drawRect(option->rect);
       
   524             if (option->state & State_Sunken) {
       
   525                 painter->setPen(option->palette.color(QPalette::Mid));
       
   526                 painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
       
   527                 painter->setPen(option->palette.color(QPalette::Base));
       
   528                 painter->setBrush(Qt::NoBrush);
       
   529                 painter->drawLine(option->rect.bottomRight() + QPoint(0, -1),
       
   530                                   option->rect.topRight() + QPoint(0, -1));
       
   531             }
       
   532             QCommonStyle::drawControl(control, option, painter, widget);
       
   533             break;
       
   534         }
       
   535         case CE_MenuItem: {
       
   536             const QStyleOptionMenuItem *menuItem =
       
   537                 qstyleoption_cast<const QStyleOptionMenuItem *>(option);
       
   538 
       
   539             bool selected = menuItem->state & State_Selected;
       
   540             bool checkable = menuItem->checkType !=
       
   541                              QStyleOptionMenuItem::NotCheckable;
       
   542             bool checked = menuItem->checked;
       
   543 
       
   544             if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) {
       
   545                 QPoint center = menuItem->rect.center();
       
   546 
       
   547                 painter->setPen(menuItem->palette.color(QPalette::Midlight));
       
   548                 painter->drawLine(QPoint(menuItem->rect.left() - 2, center.y()),
       
   549                                   QPoint(menuItem->rect.right(), center.y()));
       
   550                 painter->setPen(menuItem->palette.color(QPalette::Base));
       
   551                 painter->drawLine(QPoint(menuItem->rect.left() - 2,
       
   552                                   center.y() + 1),
       
   553                 QPoint(menuItem->rect.right(),
       
   554                       center.y() + 1));
       
   555 
       
   556                 break;
       
   557             }
       
   558 
       
   559             if (selected) {
       
   560                 painter->setBrush(menuItem->palette.color(QPalette::Light));
       
   561                 painter->setPen(Qt::NoPen);
       
   562                 painter->drawRect(menuItem->rect);
       
   563                 painter->setPen(menuItem->palette.color(QPalette::Midlight));
       
   564                 painter->drawLine(menuItem->rect.topLeft(),
       
   565                                   menuItem->rect.topRight());
       
   566                 painter->setPen(menuItem->palette.color(QPalette::Base));
       
   567                 painter->drawLine(menuItem->rect.bottomLeft(),
       
   568                                   menuItem->rect.bottomRight());
       
   569             }
       
   570 
       
   571             if (checkable) {
       
   572                 QRect checkRect(option->rect.left() + 5,
       
   573                                 option->rect.center().y() - 5, 10, 10);
       
   574                 if (menuItem->checkType & QStyleOptionMenuItem::Exclusive) {
       
   575                     QStyleOptionButton button;
       
   576                     button.rect = checkRect;
       
   577                     button.state = menuItem->state;
       
   578                     if (button.state & State_Sunken)
       
   579                         button.state ^= State_Sunken;
       
   580                     if (checked)
       
   581                         button.state |= State_On;
       
   582                     button.palette = menuItem->palette;
       
   583                     drawPrimitive(PE_IndicatorRadioButton, &button, painter,
       
   584                               widget);
       
   585                 } else {
       
   586                     QBrush buttonBrush = gradientBrush(option->rect);
       
   587                     painter->setBrush(buttonBrush);
       
   588                     painter->setPen(option->palette.color(QPalette::Mid));
       
   589 
       
   590                     painter->drawRect(checkRect);
       
   591 
       
   592                     if (checked) {
       
   593                         QImage image(":/images/checkboxchecked.png");
       
   594                         painter->drawImage(QPoint(option->rect.left() + 5,
       
   595                                            option->rect.center().y() - 8), image);
       
   596                     }
       
   597                 }
       
   598             }
       
   599 
       
   600             bool dis = !(menuItem->state & State_Enabled);
       
   601             bool act = menuItem->state & State_Selected;
       
   602             const QStyleOption *opt = option;
       
   603             const QStyleOptionMenuItem *menuitem = menuItem;
       
   604             int checkcol = qMax(menuitem->maxIconWidth, 20);
       
   605             if (menuItem->icon.isNull())
       
   606                 checkcol = 0;
       
   607 
       
   608             QPainter *p = painter;
       
   609             QRect vCheckRect = visualRect(opt->direction, menuitem->rect,
       
   610                                           QRect(menuitem->rect.x(),
       
   611                                           menuitem->rect.y(),
       
   612                                           checkcol, menuitem->rect.height()));
       
   613             if (!menuItem->icon.isNull()) {
       
   614                 QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal;
       
   615                 if (act && !dis)
       
   616                     mode = QIcon::Active;
       
   617                 QPixmap pixmap;
       
   618                 if (checked)
       
   619                     pixmap = menuItem->icon.pixmap(
       
   620                     pixelMetric(PM_SmallIconSize), mode, QIcon::On);
       
   621                 else
       
   622                     pixmap = menuItem->icon.pixmap(
       
   623                         pixelMetric(PM_SmallIconSize), mode);
       
   624                 int pixw = pixmap.width();
       
   625                 int pixh = pixmap.height();
       
   626 
       
   627                 int adjustedIcon = checkable ? 15 : 0;
       
   628                 QRect pmr(0, 0, pixw, pixh);
       
   629                 pmr.moveCenter(vCheckRect.center());
       
   630                 painter->setPen(menuItem->palette.text().color());
       
   631                 if (checkable && checked)
       
   632                     painter->drawPixmap(QPoint(pmr.left() +
       
   633                     adjustedIcon, pmr.top() + 1), pixmap);
       
   634                 else
       
   635                     painter->drawPixmap(pmr.topLeft() +
       
   636                     QPoint(adjustedIcon, 0), pixmap);
       
   637             }
       
   638 
       
   639             if (selected) {
       
   640                 painter->setPen(menuItem->palette.highlightedText().color());
       
   641             } else {
       
   642                 painter->setPen(menuItem->palette.text().color());
       
   643             }
       
   644             int x, y, w, h;
       
   645             menuitem->rect.getRect(&x, &y, &w, &h);
       
   646             int tab =  menuitem->tabWidth;
       
   647             QColor discol;
       
   648             if (dis) {
       
   649                 discol = menuitem->palette.text().color();
       
   650                 p->setPen(discol);
       
   651             }
       
   652             int xm = windowsItemFrame + checkcol + windowsItemHMargin;
       
   653             int xpos = menuitem->rect.x() + xm;
       
   654         QRect textRect;
       
   655         if (!menuItem->icon.isNull())
       
   656         textRect.setRect(xpos, y + windowsItemVMargin, w - xm -
       
   657             windowsRightBorder - tab + 1, h - 2 * windowsItemVMargin);
       
   658         else
       
   659         textRect.setRect(menuItem->rect.left() + 9,
       
   660                  y + windowsItemVMargin,
       
   661                  w - xm - windowsRightBorder - tab,
       
   662                  h - 2 * windowsItemVMargin);
       
   663 
       
   664         if (checkable)
       
   665         textRect.adjust(10, 0, 10, 0);
       
   666 
       
   667             QRect vTextRect = visualRect(opt->direction, menuitem->rect,
       
   668                      textRect);
       
   669             QString s = menuitem->text;
       
   670             if (!s.isEmpty()) {
       
   671                 int t = s.indexOf(QLatin1Char('\t'));
       
   672                 int text_flags = Qt::AlignVCenter | Qt::TextShowMnemonic |
       
   673                  Qt::TextDontClip | Qt::TextSingleLine;
       
   674                 if (!styleHint(SH_UnderlineShortcut, menuitem, widget))
       
   675                     text_flags |= Qt::TextHideMnemonic;
       
   676                 text_flags |= Qt::AlignLeft;
       
   677                 if (t >= 0) {
       
   678                     QRect vShortcutRect = visualRect(opt->direction,
       
   679                              menuitem->rect,
       
   680                         QRect(textRect.topRight(),
       
   681             QPoint(menuitem->rect.right(), textRect.bottom())));
       
   682                     if (dis && !act) {
       
   683                         p->setPen(menuitem->palette.light().color());
       
   684                         p->drawText(vShortcutRect.adjusted(1, 1, 1, 1),
       
   685                     text_flags,
       
   686                     s.mid(t + 1));
       
   687                         p->setPen(discol);
       
   688                     }
       
   689                     p->drawText(vShortcutRect, text_flags, s.mid(t + 1));
       
   690                     s = s.left(t);
       
   691                 }
       
   692                 QFont font = menuitem->font;
       
   693                 if (menuitem->menuItemType == QStyleOptionMenuItem::DefaultItem)
       
   694                     font.setBold(true);
       
   695                 p->setFont(font);
       
   696                 if (dis && !act) {
       
   697                     p->setPen(menuitem->palette.light().color());
       
   698                     p->drawText(vTextRect.adjusted(1,1,1,1), text_flags,
       
   699                 s.left(t));
       
   700                     p->setPen(discol);
       
   701                 }
       
   702                 p->drawText(vTextRect, text_flags, s.left(t));
       
   703             }
       
   704 
       
   705             if (menuItem->menuItemType & QStyleOptionMenuItem::SubMenu) {
       
   706                 QPoint center = menuItem->rect.center();
       
   707                 QPoint drawStart(menuItem->rect.right() - 6, center.y() + 4);
       
   708 
       
   709                 QPainterPath arrow;
       
   710                 arrow.moveTo(drawStart);
       
   711                 arrow.lineTo(drawStart + QPoint(0, -8));
       
   712                 arrow.lineTo(drawStart + QPoint(4, -5));
       
   713                 arrow.lineTo(drawStart + QPoint(4, -4));
       
   714                 arrow.lineTo(drawStart + QPoint(0, 0));
       
   715 
       
   716                 painter->save();
       
   717                 painter->setBrush(menuItem->palette.color(QPalette::Text));
       
   718                 painter->setPen(Qt::NoPen);
       
   719                 painter->drawPath(arrow);
       
   720                 painter->restore();
       
   721             }
       
   722 
       
   723             break;
       
   724         }
       
   725         case CE_MenuVMargin: {
       
   726             break;
       
   727         }
       
   728         case CE_MenuHMargin: {
       
   729             break;
       
   730         }
       
   731         case CE_Splitter: {
       
   732             drawSplitter(option, painter, option->state & State_Horizontal);
       
   733             break;
       
   734         }
       
   735         case CE_ScrollBarAddPage: {
       
   736         case CE_ScrollBarSubPage:
       
   737             const QStyleOptionSlider *scrollBar =
       
   738                 qstyleoption_cast<const QStyleOptionSlider *>(option);
       
   739             QRect myRect;
       
   740             if (scrollBar->orientation == Qt::Horizontal) {
       
   741                 myRect = QRect(option->rect.topLeft(),
       
   742                 option->rect.bottomRight()).adjusted(0, 0, 1, -1);
       
   743             } else {
       
   744                 myRect = option->rect;
       
   745             }
       
   746 
       
   747             painter->setPen(Qt::NoPen);
       
   748             painter->setBrush(option->palette.color(QPalette::Background));
       
   749             painter->drawRect(myRect);
       
   750 
       
   751             painter->setBrush(Qt::NoBrush);
       
   752             painter->setPen(scrollBar->palette.color(QPalette::Mid));
       
   753             painter->drawRect(myRect.adjusted(0, 0, -1, 0));
       
   754             painter->setPen(scrollBar->palette.color(QPalette::Button));
       
   755             painter->drawLine(myRect.bottomLeft() + QPoint(1, 0),
       
   756                               myRect.topLeft() + QPoint(1, 1));
       
   757             painter->drawLine(myRect.topLeft() + QPoint(1, 1),
       
   758                               myRect.topRight() + QPoint(-1, 1));
       
   759             break;
       
   760         }
       
   761         case CE_ScrollBarSubLine: {
       
   762             const QStyleOptionSlider *scrollBar =
       
   763                 qstyleoption_cast<const QStyleOptionSlider *>(option);
       
   764             int scrollBarExtent = pixelMetric(PM_ScrollBarExtent);
       
   765             QRect scrollBarSubLine = option->rect;
       
   766 
       
   767             QRect button1;
       
   768             QRect button2;
       
   769 
       
   770             if (scrollBar->orientation == Qt::Horizontal) {
       
   771                 button1.setRect(scrollBarSubLine.left(), scrollBarSubLine.top(),
       
   772                 16, scrollBarExtent);
       
   773                 button2.setRect(scrollBarSubLine.right() - 15,
       
   774                 scrollBarSubLine.top(), 16, scrollBarExtent);
       
   775             } else {
       
   776                 button1.setRect(scrollBarSubLine.left(), scrollBarSubLine.top(),
       
   777                 scrollBarExtent, 16);
       
   778                 button2.setRect(scrollBarSubLine.left(),
       
   779                 scrollBarSubLine.bottom() - 15, scrollBarExtent, 16);
       
   780             }
       
   781 
       
   782             painter->fillRect(button2, Qt::blue);
       
   783 
       
   784             drawScrollBarArrow(button1, painter, scrollBar);
       
   785             drawScrollBarArrow(button2, painter, scrollBar);
       
   786             break;
       
   787         }
       
   788         case CE_ScrollBarAddLine: {
       
   789             const QStyleOptionSlider *scrollBar =
       
   790                 qstyleoption_cast<const QStyleOptionSlider *>(option);
       
   791             QRect button(option->rect.left(), option->rect.top(), 16, 16);
       
   792             drawScrollBarArrow(button, painter, scrollBar, true);
       
   793             break;
       
   794         }
       
   795         case CE_ScrollBarSlider: {
       
   796             const QStyleOptionSlider *scrollBar =
       
   797                 qstyleoption_cast<const QStyleOptionSlider *>(option);
       
   798 
       
   799             painter->setPen(scrollBar->palette.color(QPalette::Midlight));
       
   800             painter->drawRect(scrollBar->rect.adjusted(-1, 0, -3, -1));
       
   801 
       
   802             QPoint g1, g2;
       
   803             if (scrollBar->orientation == Qt::Horizontal) {
       
   804                 g1 = option->rect.topLeft();
       
   805                 g2 = option->rect.bottomLeft();
       
   806             } else {
       
   807                 g1 = option->rect.topLeft();
       
   808                 g2 = option->rect.topRight();
       
   809             }
       
   810 
       
   811             if (scrollBar->state & State_Enabled) {
       
   812                 QLinearGradient gradient(g1, g2);
       
   813                 gradient.setColorAt(1.0, QColor(188, 210, 230));
       
   814                 gradient.setColorAt(0.3, Qt::white);
       
   815                 gradient.setColorAt(0.0, QColor(223, 233, 243));
       
   816                 painter->setBrush(gradient);
       
   817             } else {
       
   818                 painter->setPen(scrollBar->palette.buttonText().color());
       
   819                 painter->setBrush(scrollBar->palette.button());
       
   820             }
       
   821             painter->drawRect(scrollBar->rect.adjusted(0, 0, -1, -1));
       
   822 
       
   823             int sliderLength = option->rect.height();
       
   824             int drawPos = scrollBar->orientation == Qt::Vertical ?
       
   825                 (sliderLength / 2) + 1 : 1 - ((option->rect.width() / 2));
       
   826 
       
   827             QPoint origin;
       
   828             if (scrollBar->orientation == Qt::Vertical)
       
   829                 origin = option->rect.bottomLeft();
       
   830             else
       
   831                 origin = option->rect.topLeft();
       
   832 
       
   833             painter->setPen(scrollBar->palette.color(QPalette::Base));
       
   834             painter->drawLine(origin + adjustScrollHandlePoint(
       
   835                              scrollBar->orientation,
       
   836                     QPoint(4, -drawPos)),
       
   837                     origin + adjustScrollHandlePoint(
       
   838                     scrollBar->orientation,
       
   839                     QPoint(13, -drawPos)));
       
   840             painter->drawLine(origin + adjustScrollHandlePoint(
       
   841                         scrollBar->orientation,
       
   842                       QPoint(4,  2 - drawPos)),
       
   843                       origin + adjustScrollHandlePoint(
       
   844                       scrollBar->orientation,
       
   845                       QPoint(13, 2 - drawPos)));
       
   846             painter->drawLine(origin + adjustScrollHandlePoint(
       
   847                     scrollBar->orientation,
       
   848                     QPoint(4,  4 - drawPos)),
       
   849                     origin + adjustScrollHandlePoint(
       
   850                     scrollBar->orientation,
       
   851                     QPoint(13, 4 - drawPos)));
       
   852 
       
   853             painter->setPen(option->palette.color(QPalette::Midlight));
       
   854             painter->drawLine(origin + adjustScrollHandlePoint(
       
   855                     scrollBar->orientation,
       
   856                     QPoint(3, -(drawPos + 1))),
       
   857                     origin + adjustScrollHandlePoint(
       
   858                     scrollBar->orientation,
       
   859                     QPoint(12, -(drawPos + 1))));
       
   860             painter->drawLine(origin + adjustScrollHandlePoint(
       
   861                     scrollBar->orientation,
       
   862                     QPoint(3, 1 - drawPos)),
       
   863                     origin + adjustScrollHandlePoint(
       
   864                     scrollBar->orientation,
       
   865                     QPoint(12, 1 - drawPos)));
       
   866             painter->drawLine(origin + adjustScrollHandlePoint(
       
   867                     scrollBar->orientation,
       
   868                     QPoint(3, 3 - drawPos)),
       
   869                     origin + adjustScrollHandlePoint(
       
   870                     scrollBar->orientation,
       
   871                     QPoint(12, 3 - drawPos)));
       
   872 
       
   873             break;
       
   874         }
       
   875         case CE_TabBarTabLabel: {
       
   876             QStyleOptionTab copy =
       
   877                 *qstyleoption_cast<const QStyleOptionTab *>(option);
       
   878             if (copy.state & State_HasFocus)
       
   879                 copy.state ^= State_HasFocus;
       
   880                 painter->setBrush(Qt::NoBrush);
       
   881                 QWindowsStyle::drawControl(CE_TabBarTabLabel, &copy, painter,
       
   882                                            widget);
       
   883             break;
       
   884         }
       
   885         case CE_TabBarTabShape: {
       
   886             const QStyleOptionTab *tab =
       
   887                 qstyleoption_cast<const QStyleOptionTab *>(option);
       
   888             QRect myRect = option->rect;
       
   889             QPoint bottomLeft, bottomRight, topLeft, topRight;
       
   890 
       
   891             if ((tab->position == QStyleOptionTab::Beginning) ||
       
   892                 (tab->position == QStyleOptionTab::OnlyOneTab)) {
       
   893                 if (tab->shape == QTabBar::RoundedSouth ||
       
   894                     tab->shape == QTabBar::RoundedNorth) {
       
   895                     myRect = myRect.adjusted(2, 0, 0, 0);
       
   896                 } else {
       
   897                     myRect = myRect.adjusted(0, 2, 0, 0);
       
   898                 }
       
   899             }
       
   900 
       
   901             switch (tab->shape) {
       
   902                 case QTabBar::RoundedNorth:
       
   903                     topLeft = myRect.topLeft();
       
   904                     topRight = myRect.topRight();
       
   905                     bottomLeft = myRect.bottomLeft();
       
   906                     bottomRight = myRect.bottomRight();
       
   907                     break;
       
   908                 case QTabBar::RoundedSouth:
       
   909                     topLeft = myRect.bottomLeft();
       
   910                     topRight = myRect.bottomRight();
       
   911                     bottomLeft = myRect.topLeft();
       
   912                     bottomRight = myRect.topRight();
       
   913                     break;
       
   914                 case QTabBar::RoundedWest:
       
   915                     topLeft = myRect.topLeft();
       
   916                     topRight = myRect.bottomLeft();
       
   917                     bottomLeft = myRect.topRight();
       
   918                     bottomRight = myRect.bottomRight();
       
   919                     break;
       
   920                 case QTabBar::RoundedEast:
       
   921                     topLeft = myRect.topRight();
       
   922                     topRight = myRect.bottomRight();
       
   923                     bottomLeft = myRect.topLeft();
       
   924                     bottomRight = myRect.bottomLeft();
       
   925                     break;
       
   926                 default:
       
   927                     ;
       
   928             }
       
   929 
       
   930             QPainterPath outerPath;
       
   931             outerPath.moveTo(bottomLeft + adjustTabPoint(QPoint(0, -2),
       
   932                              tab->shape));
       
   933             outerPath.lineTo(bottomLeft + adjustTabPoint(QPoint(0, -14),
       
   934                              tab->shape));
       
   935             outerPath.lineTo(topLeft + adjustTabPoint(QPoint(6 , 0),
       
   936                              tab->shape));
       
   937             outerPath.lineTo(topRight + adjustTabPoint(QPoint(0, 0),
       
   938                              tab->shape));
       
   939             outerPath.lineTo(bottomRight + adjustTabPoint(QPoint(0, -2),
       
   940                              tab->shape));
       
   941 
       
   942             if (tab->state & State_Selected ||
       
   943                 tab->position == QStyleOptionTab::OnlyOneTab) {
       
   944                 QPainterPath innerPath;
       
   945                 innerPath.moveTo(topLeft + adjustTabPoint(QPoint(6, 2),
       
   946                                  tab->shape));
       
   947                 innerPath.lineTo(topRight + adjustTabPoint(QPoint(-1, 2),
       
   948                                  tab->shape));
       
   949                 innerPath.lineTo(bottomRight + adjustTabPoint(QPoint(-1 , -2),
       
   950                                  tab->shape));
       
   951                 innerPath.lineTo(bottomLeft + adjustTabPoint(QPoint(2 , -2),
       
   952                                  tab->shape));
       
   953                 innerPath.lineTo(bottomLeft + adjustTabPoint(QPoint(2 , -14),
       
   954                                  tab->shape));
       
   955                 innerPath.lineTo(topLeft + adjustTabPoint(QPoint(6, 2),
       
   956                                  tab->shape));
       
   957 
       
   958                 QPainterPath whitePath;
       
   959                 whitePath.moveTo(bottomLeft + adjustTabPoint(QPoint(1, -2),
       
   960                                  tab->shape));
       
   961                 whitePath.lineTo(bottomLeft + adjustTabPoint(QPoint(1, -14),
       
   962                                  tab->shape));
       
   963                 whitePath.lineTo(topLeft + adjustTabPoint(QPoint(6, 1),
       
   964                                  tab->shape));
       
   965                 whitePath.lineTo(topRight + adjustTabPoint(QPoint(-1, 1),
       
   966                                  tab->shape));
       
   967 
       
   968                 painter->setPen(tab->palette.color(QPalette::Midlight));
       
   969                 painter->setBrush(QColor(200, 221, 242));
       
   970                 painter->drawPath(outerPath);
       
   971                 painter->setPen(QColor(200, 221, 242));
       
   972                 painter->drawRect(QRect(bottomLeft + adjustTabPoint( 
       
   973                                         QPoint(2, -3), tab->shape),
       
   974                                         bottomRight + adjustTabPoint(
       
   975                                         QPoint(-2, 0), tab->shape)));
       
   976                 painter->setPen(tab->palette.color(QPalette::Base));
       
   977                 painter->setBrush(Qt::NoBrush);
       
   978                 painter->drawPath(whitePath);
       
   979 
       
   980                 if (option->state & State_HasFocus) { 
       
   981                     painter->setPen(option->palette.color(QPalette::Mid));
       
   982                     painter->drawPath(innerPath);
       
   983                 }
       
   984             } else {
       
   985                 painter->setPen(tab->palette.color(QPalette::Mid));
       
   986                 painter->drawPath(outerPath);
       
   987             }
       
   988             break;
       
   989         }
       
   990         case CE_PushButtonLabel:
       
   991             painter->save();
       
   992 
       
   993             if (const QStyleOptionButton *button =
       
   994                 qstyleoption_cast<const QStyleOptionButton *>(option)) {
       
   995                 QRect ir = button->rect;
       
   996                 uint tf = Qt::AlignVCenter | Qt::TextShowMnemonic;
       
   997                 if (!styleHint(SH_UnderlineShortcut, button, widget))
       
   998                     tf |= Qt::TextHideMnemonic;
       
   999 
       
  1000                 if (!button->icon.isNull()) {
       
  1001                     QPoint point;
       
  1002 
       
  1003                     QIcon::Mode mode = button->state & State_Enabled ? QIcon::Normal
       
  1004                                                                   : QIcon::Disabled;
       
  1005                     if (mode == QIcon::Normal && button->state & State_HasFocus)
       
  1006                         mode = QIcon::Active;
       
  1007                     QIcon::State state = QIcon::Off;
       
  1008                     if (button->state & State_On)
       
  1009                         state = QIcon::On;
       
  1010 
       
  1011                     QPixmap pixmap = button->icon.pixmap(button->iconSize, mode,
       
  1012                              state);
       
  1013                     int w = pixmap.width();
       
  1014                     int h = pixmap.height();
       
  1015 
       
  1016                     if (!button->text.isEmpty())
       
  1017                         w += button->fontMetrics.width(button->text) + 2;
       
  1018 
       
  1019                     point = QPoint(ir.x() + ir.width() / 2 - w / 2,
       
  1020                                    ir.y() + ir.height() / 2 - h / 2);
       
  1021 
       
  1022                     if (button->direction == Qt::RightToLeft)
       
  1023                         point.rx() += pixmap.width();
       
  1024 
       
  1025                     painter->drawPixmap(visualPos(button->direction, button->rect,
       
  1026                               point), pixmap);
       
  1027 
       
  1028                     if (button->direction == Qt::RightToLeft)
       
  1029                         ir.translate(-point.x() - 2, 0);
       
  1030                     else
       
  1031                         ir.translate(point.x() + pixmap.width(), 0);
       
  1032 
       
  1033                     if (!button->text.isEmpty())
       
  1034                         tf |= Qt::AlignLeft;
       
  1035 
       
  1036                 } else {
       
  1037                     tf |= Qt::AlignHCenter;
       
  1038                 }
       
  1039 
       
  1040                 if (button->fontMetrics.height() > 14)
       
  1041                     ir.translate(0, 1);
       
  1042 
       
  1043                 drawItemText(painter, ir, tf, button->palette, (button->state &
       
  1044                                  State_Enabled),
       
  1045                              button->text, QPalette::ButtonText);
       
  1046             }
       
  1047 
       
  1048             painter->restore();
       
  1049             break;
       
  1050 
       
  1051         default:
       
  1052             QWindowsStyle::drawControl(control, option, painter, widget);
       
  1053     }
       
  1054     painter->restore();
       
  1055 }
       
  1056 
       
  1057 inline QPoint JavaStyle::adjustTabPoint(const QPoint &point,
       
  1058                                         QTabBar::Shape shape) const
       
  1059 {
       
  1060     QPoint rPoint;
       
  1061 
       
  1062     switch (shape) {
       
  1063         case QTabBar::RoundedWest:
       
  1064             rPoint = QPoint(point.y(), point.x());
       
  1065             break;
       
  1066         case QTabBar::RoundedSouth:
       
  1067             rPoint = QPoint(point.x(), point.y() * -1);
       
  1068             break;
       
  1069         case QTabBar::RoundedEast:
       
  1070             rPoint = QPoint(point.y() * -1, point.x());
       
  1071             break;
       
  1072         default:
       
  1073             rPoint = point;
       
  1074     }
       
  1075     return rPoint;
       
  1076 }
       
  1077 
       
  1078 QRect JavaStyle::subControlRect(ComplexControl control,
       
  1079                                 const QStyleOptionComplex *option,
       
  1080                                 SubControl subControl,
       
  1081                                 const QWidget *widget) const
       
  1082 {
       
  1083     QRect rect = QWindowsStyle::subControlRect(control, option, subControl,
       
  1084                                                widget);
       
  1085 
       
  1086     switch (control) {
       
  1087         case CC_TitleBar: {
       
  1088             const QStyleOptionTitleBar *bar =
       
  1089             qstyleoption_cast<const QStyleOptionTitleBar *>(option);
       
  1090 
       
  1091             switch (subControl) {
       
  1092                 case SC_TitleBarMinButton: {
       
  1093                     rect = QRect(bar->rect.topRight() + QPoint(-68, 2),
       
  1094                     QSize(15, 15));
       
  1095                     break;
       
  1096                 }
       
  1097                 case SC_TitleBarMaxButton: {
       
  1098                     rect = QRect(bar->rect.topRight() + QPoint(-43, 3),
       
  1099                                  QSize(15, 15));
       
  1100                     break;
       
  1101                 }
       
  1102                 case SC_TitleBarCloseButton: {
       
  1103                     rect = QRect(bar->rect.topRight() + QPoint(-18, 3),
       
  1104                                  QSize(15, 15));
       
  1105                     break;
       
  1106                 }
       
  1107                 case SC_TitleBarLabel: {
       
  1108                     QRect labelRect = bar->fontMetrics.boundingRect(bar->text);
       
  1109                     rect = labelRect;
       
  1110                     rect.translate(bar->rect.left() + 30, 0);
       
  1111                     rect.moveTop(bar->rect.top());
       
  1112                     rect.adjust(0, 2, 2, 2);
       
  1113                     break;
       
  1114                 }
       
  1115                 case SC_TitleBarSysMenu: {
       
  1116                     rect = QRect(bar->rect.topLeft() + QPoint(6, 3),
       
  1117                                  QSize(16, 16));
       
  1118                     break;
       
  1119                 }
       
  1120                 default:
       
  1121                     ;
       
  1122             }
       
  1123             break;
       
  1124         }
       
  1125         case CC_GroupBox: {
       
  1126             const QStyleOptionGroupBox *box =
       
  1127                 qstyleoption_cast<const QStyleOptionGroupBox *>(option);
       
  1128             bool hasCheckbox = box->subControls & SC_GroupBoxCheckBox;
       
  1129             int checkAdjust = 13;
       
  1130 
       
  1131             QRect textRect = box->fontMetrics.boundingRect(box->text);
       
  1132 
       
  1133             switch (subControl) {
       
  1134                 case SC_GroupBoxFrame: {
       
  1135                     rect = box->rect;
       
  1136                     break;
       
  1137                 }
       
  1138                 case SC_GroupBoxCheckBox: {
       
  1139                     if (hasCheckbox) {
       
  1140                         rect = QRect(box->rect.topLeft() + QPoint(7, 4 +
       
  1141                                      (textRect.height() / 2 - checkAdjust / 2)),
       
  1142                         QSize(checkAdjust, checkAdjust));
       
  1143                     }
       
  1144                     else {
       
  1145                         rect = QRect();
       
  1146                     }
       
  1147                     break;
       
  1148                 }
       
  1149                 case SC_GroupBoxLabel: {
       
  1150                     rect = QRect(box->rect.topLeft() + QPoint(7 + (hasCheckbox ?
       
  1151                     checkAdjust + 2 : 0), 4), textRect.size());
       
  1152                     break;
       
  1153                 }
       
  1154                 case SC_GroupBoxContents: {
       
  1155                     rect = box->rect.adjusted(10, 10 + textRect.height(), -10,
       
  1156                                               -10);
       
  1157                     break;
       
  1158                 }
       
  1159                 default:
       
  1160                     ;
       
  1161             }
       
  1162             break;
       
  1163         }
       
  1164         case CC_SpinBox: {
       
  1165             const QStyleOptionSpinBox *spinBox =
       
  1166             qstyleoption_cast<const QStyleOptionSpinBox *>(option);
       
  1167             int spinnerWidth = 16;
       
  1168             QRect myRect = spinBox->rect;
       
  1169             QPoint center = myRect.center();
       
  1170             int frameWidth = pixelMetric(PM_SpinBoxFrameWidth, spinBox, widget);
       
  1171 
       
  1172             switch (subControl) {
       
  1173                 case SC_SpinBoxUp: {
       
  1174                     rect = QRect(myRect.topRight() + QPoint(-16, 0),
       
  1175                     QSize(16, center.y() - myRect.topRight().y()));
       
  1176                     break;
       
  1177                 }
       
  1178                 case SC_SpinBoxDown: {
       
  1179                     rect = QRect(QPoint(myRect.bottomRight().x() - 16,
       
  1180                                  center.y() + 1),
       
  1181                                  QSize(16, myRect.bottomRight().y() -
       
  1182                                        center.y() - 1));
       
  1183                     break;
       
  1184                 }
       
  1185                 case SC_SpinBoxFrame: {
       
  1186                     rect = QRect(myRect.topLeft(), myRect.bottomRight() +
       
  1187                                  QPoint(-16, 0));
       
  1188                     break;
       
  1189                 }
       
  1190                 case SC_SpinBoxEditField: {
       
  1191                     rect = QRect(myRect.topLeft() + QPoint(2, 2),
       
  1192                     myRect.bottomRight() + QPoint(-15 - frameWidth, -2));
       
  1193                     break;
       
  1194                 }
       
  1195                 default:
       
  1196                     ;
       
  1197             }
       
  1198             break;
       
  1199         }
       
  1200         case CC_ToolButton: {
       
  1201             const QStyleOptionToolButton *button =
       
  1202                 qstyleoption_cast<const QStyleOptionToolButton *>(option);
       
  1203 
       
  1204             switch (subControl) {
       
  1205                 case SC_ToolButton: {
       
  1206                     rect = option->rect.adjusted(1, 1, -1, -1);
       
  1207                     break;
       
  1208                 }
       
  1209                 case SC_ToolButtonMenu: {
       
  1210                     rect = QRect(option->rect.bottomRight() +
       
  1211                                  QPoint(-11, -11), QSize(10, 10));
       
  1212                     break;
       
  1213                 }
       
  1214             }
       
  1215             break;
       
  1216         }
       
  1217         case CC_ComboBox: {
       
  1218             const QStyleOptionComboBox *combo =
       
  1219                 qstyleoption_cast<const QStyleOptionComboBox *>(option);
       
  1220 
       
  1221             bool reverse = combo->direction == Qt::RightToLeft;
       
  1222 
       
  1223             switch (subControl) {
       
  1224                 case SC_ComboBoxFrame:
       
  1225                     rect = combo->rect;
       
  1226                     break;
       
  1227                 case SC_ComboBoxArrow:
       
  1228                     if (reverse) {
       
  1229                         rect = QRect(combo->rect.topLeft(),
       
  1230                         combo->rect.bottomLeft() + QPoint(17, 0));
       
  1231                     } else {
       
  1232                         rect = QRect(combo->rect.topRight() + QPoint(-17, 0),
       
  1233                         combo->rect.bottomRight());
       
  1234                     }
       
  1235                     break;
       
  1236                 case SC_ComboBoxEditField:
       
  1237                     if (reverse) {
       
  1238                         rect = QRect(combo->rect.topLeft() + QPoint(19, 2),
       
  1239                         combo->rect.bottomRight() + QPoint(-2, 2));
       
  1240                     } else {
       
  1241                         rect = QRect(combo->rect.topLeft() + QPoint(2, 2),
       
  1242                         combo->rect.bottomRight() + QPoint(-19, -2));
       
  1243                     }
       
  1244                     break;
       
  1245                 case SC_ComboBoxListBoxPopup:
       
  1246                     rect = combo->rect;
       
  1247                     break;
       
  1248             }
       
  1249             break;
       
  1250         }
       
  1251         case CC_ScrollBar: {
       
  1252             const QStyleOptionSlider *scrollBar =
       
  1253                 qstyleoption_cast<const QStyleOptionSlider *>(option);
       
  1254             int scrollBarExtent = pixelMetric(PM_ScrollBarExtent, scrollBar,
       
  1255                           widget);
       
  1256             int sliderMaxLength = ((scrollBar->orientation == Qt::Horizontal) ?
       
  1257                                    scrollBar->rect.width() :
       
  1258                                     scrollBar->rect.height()) - (16 * 3);
       
  1259             int sliderMinLength = pixelMetric(PM_ScrollBarSliderMin, scrollBar,
       
  1260                                               widget);
       
  1261             int sliderLength;
       
  1262 
       
  1263             if (scrollBar->maximum != scrollBar->minimum) {
       
  1264                 uint valueRange = scrollBar->maximum - scrollBar->minimum;
       
  1265                 sliderLength = (scrollBar->pageStep * sliderMaxLength) /
       
  1266                 (valueRange + scrollBar->pageStep);
       
  1267 
       
  1268                 if (sliderLength < sliderMinLength || valueRange > INT_MAX / 2)
       
  1269                     sliderLength = sliderMinLength;
       
  1270                 if (sliderLength > sliderMaxLength)
       
  1271                     sliderLength = sliderMaxLength;
       
  1272             } else {
       
  1273                 sliderLength = sliderMaxLength;
       
  1274             }
       
  1275             int sliderStart = 16 + sliderPositionFromValue(scrollBar->minimum,
       
  1276                                                            scrollBar->maximum,
       
  1277                                                     scrollBar->sliderPosition,
       
  1278                                                 sliderMaxLength - sliderLength,
       
  1279                                                         scrollBar->upsideDown);
       
  1280             QRect scrollBarRect = scrollBar->rect;
       
  1281 
       
  1282             switch (subControl) {
       
  1283                 case SC_ScrollBarSubLine:
       
  1284                     if (scrollBar->orientation == Qt::Horizontal) {
       
  1285                         rect.setRect(scrollBarRect.left(), scrollBarRect.top(),
       
  1286                         scrollBarRect.width() - 16, scrollBarExtent);
       
  1287                     } else {
       
  1288                         rect.setRect(scrollBarRect.left(), scrollBarRect.top(),
       
  1289                         scrollBarExtent, scrollBarRect.height() - 16);
       
  1290                     }
       
  1291                     break;
       
  1292                 case SC_ScrollBarAddLine:
       
  1293                     if (scrollBar->orientation == Qt::Horizontal) {
       
  1294                         rect.setRect(scrollBarRect.right() - 15,
       
  1295                         scrollBarRect.top(), 16, scrollBarExtent);
       
  1296                     } else {
       
  1297                         rect.setRect(scrollBarRect.left(), scrollBarRect.bottom()
       
  1298                                      - 15, scrollBarExtent, 16);
       
  1299                     }
       
  1300                     break;
       
  1301                 case SC_ScrollBarSubPage:
       
  1302                     if (scrollBar->orientation == Qt::Horizontal) {
       
  1303                         rect.setRect(scrollBarRect.left() + 16, scrollBarRect.top(),
       
  1304                                      sliderStart - (scrollBarRect.left() + 16),
       
  1305                                      scrollBarExtent);
       
  1306                     } else {
       
  1307                         rect.setRect(scrollBarRect.left(), scrollBarRect.top() + 16,
       
  1308                                      scrollBarExtent,
       
  1309                         sliderStart - (scrollBarRect.left() + 16));
       
  1310                     }
       
  1311                     break;
       
  1312                 case SC_ScrollBarAddPage:
       
  1313                     if (scrollBar->orientation == Qt::Horizontal)
       
  1314                         rect.setRect(sliderStart + sliderLength, 0,
       
  1315                                      sliderMaxLength - sliderStart -
       
  1316                         sliderLength + 16, scrollBarExtent);
       
  1317                     else
       
  1318                         rect.setRect(0, sliderStart + sliderLength,
       
  1319                                      scrollBarExtent, sliderMaxLength -
       
  1320                     sliderStart - sliderLength + 16);
       
  1321                     break;
       
  1322                 case SC_ScrollBarGroove:
       
  1323                     if (scrollBar->orientation == Qt::Horizontal) {
       
  1324                         rect = scrollBarRect.adjusted(16, 0, -32, 0);
       
  1325                     } else {
       
  1326                         rect = scrollBarRect.adjusted(0, 16, 0, -32);
       
  1327                     }
       
  1328                     break;
       
  1329                 case SC_ScrollBarSlider:
       
  1330                     if (scrollBar->orientation == Qt::Horizontal) {
       
  1331                         rect.setRect(sliderStart, 0, sliderLength,
       
  1332                                      scrollBarExtent);
       
  1333                     } else {
       
  1334                         rect.setRect(0, sliderStart, scrollBarExtent,
       
  1335                                      sliderLength);
       
  1336                     }
       
  1337                     break;
       
  1338                 default:
       
  1339                     return QWindowsStyle::subControlRect(control, option,
       
  1340                                                          subControl, widget);
       
  1341             }
       
  1342             break;
       
  1343         }
       
  1344         case CC_Slider: {
       
  1345             const QStyleOptionSlider *slider =
       
  1346                 qstyleoption_cast<const QStyleOptionSlider *>(option);
       
  1347             rect = slider->rect;
       
  1348             int tickSize = pixelMetric(PM_SliderTickmarkOffset, option, widget);
       
  1349             int handleSize = pixelMetric(PM_SliderControlThickness, option,
       
  1350                                          widget);
       
  1351 
       
  1352             int dist = slider->orientation == Qt::Vertical ? slider->rect.height() :
       
  1353                                               slider->rect.width();
       
  1354             int pos = QStyle::sliderPositionFromValue(slider->minimum,
       
  1355                 slider->maximum, slider->sliderValue, dist - handleSize);
       
  1356 
       
  1357             switch (subControl) {
       
  1358                 case SC_SliderGroove: {
       
  1359                     QPoint center = rect.center();
       
  1360 
       
  1361                     if (slider->orientation == Qt::Horizontal) {
       
  1362                         rect.setHeight(handleSize);
       
  1363                         if (slider->tickPosition == QSlider::TicksBelow) {
       
  1364                             center.ry() -= tickSize;
       
  1365                         }
       
  1366                     } else {
       
  1367                         rect.adjust(0, 0, 0, 0);
       
  1368                         rect.setWidth(handleSize);
       
  1369                         if (slider->tickPosition == QSlider::TicksBelow) {
       
  1370                             center.rx() -= tickSize;
       
  1371                         }
       
  1372                     }
       
  1373                     rect.moveCenter(center);
       
  1374                     break;
       
  1375                 }
       
  1376                 case SC_SliderHandle: {
       
  1377                     QPoint center = rect.center();
       
  1378 
       
  1379                     if (slider->orientation == Qt::Horizontal) {
       
  1380                         rect.setHeight(handleSize);
       
  1381                         if (slider->tickPosition == QSlider::TicksBelow) {
       
  1382                             center.ry() -= tickSize;
       
  1383                         }
       
  1384 
       
  1385                         rect.moveCenter(center);
       
  1386 
       
  1387                         if (slider->upsideDown)
       
  1388                             rect.setLeft(slider->rect.right() -
       
  1389                                          pos - (handleSize - 1));
       
  1390                         else
       
  1391                             rect.setLeft(pos);
       
  1392 
       
  1393                         rect.setWidth(handleSize - 1);
       
  1394                     } else {
       
  1395                         rect.setWidth(handleSize);
       
  1396                         if (slider->tickPosition == QSlider::TicksBelow) {
       
  1397                             center.rx() -= tickSize;
       
  1398                         }
       
  1399 
       
  1400                         rect.moveCenter(center);
       
  1401 
       
  1402                         if (slider->upsideDown)
       
  1403                             rect.setTop(slider->rect.bottom() -
       
  1404                                         ((pos + handleSize) - 2));
       
  1405                         else
       
  1406                             rect.setTop(slider->rect.top() + pos);
       
  1407 
       
  1408                         rect.setHeight(handleSize);
       
  1409                     }
       
  1410                     break;
       
  1411                 }
       
  1412                 case SC_SliderTickmarks: {
       
  1413                     QPoint center = slider->rect.center();
       
  1414 
       
  1415                     if (slider->tickPosition & QSlider::TicksBelow) {
       
  1416                         if (slider->orientation == Qt::Horizontal) {
       
  1417                             rect.setHeight(tickSize);
       
  1418                             center.ry() += tickSize / 2;
       
  1419                             rect.adjust(6, 0, -10, 0);
       
  1420                         } else {
       
  1421                             rect.setWidth(tickSize);
       
  1422                             center.rx() += tickSize / 2;
       
  1423                             rect.adjust(0, 6, 0, -10);
       
  1424                         }
       
  1425                     } else {
       
  1426                         rect = QRect();
       
  1427                     }
       
  1428                     rect.moveCenter(center);
       
  1429                     break;
       
  1430                 }
       
  1431                 default:
       
  1432                     ;
       
  1433             }
       
  1434             break;
       
  1435         }
       
  1436         default:
       
  1437             return QWindowsStyle::subControlRect(control, option, subControl,
       
  1438                                                  widget);
       
  1439     }
       
  1440     return rect;
       
  1441 }
       
  1442 
       
  1443 static const char * const sliderHandleImage[] = {
       
  1444     "15 16 7 1",
       
  1445     "   c None",
       
  1446     "+  c #FFFFFF",
       
  1447     "@  c #FFFFFF",
       
  1448     "$  c #FFFFFF",
       
  1449     "(  c #E5EDF5",
       
  1450     ")  c #F2F6FA",
       
  1451     "[  c #FFFFFF",
       
  1452     " +++++++++++++ ",
       
  1453     "+@@@@@@@@@@@@@+",
       
  1454     "+@(((((((((((@+",
       
  1455     "+@(((((((((((@+",
       
  1456     "+@)))))))))))@+",
       
  1457     "+@[[[[[[[[[[[@+",
       
  1458     "+@[[[[[[[[[[[@+",
       
  1459     "+@)))))))))))@+",
       
  1460     "+@)))))))))))@+",
       
  1461     " +@)))))))))@+ ",
       
  1462     "  +@(((((((@+  ",
       
  1463     "   +@(((((@+   ",
       
  1464     "    +@(((@+    ",
       
  1465     "     +@(@+     ",
       
  1466     "      +@+      ",
       
  1467     "       +       "};
       
  1468 
       
  1469 
       
  1470 void JavaStyle::drawComplexControl(ComplexControl control,
       
  1471                                    const QStyleOptionComplex *option,
       
  1472                                    QPainter *painter,
       
  1473                                    const QWidget *widget) const
       
  1474 {
       
  1475     painter->save();
       
  1476 
       
  1477     switch (control) {
       
  1478         case CC_TitleBar: {
       
  1479             const QStyleOptionTitleBar *bar =
       
  1480                 qstyleoption_cast<const QStyleOptionTitleBar *>(option);
       
  1481 
       
  1482             bool sunken = bar->state & State_Sunken;
       
  1483 
       
  1484             QLinearGradient gradient(bar->rect.bottomLeft(),
       
  1485                                      bar->rect.topLeft());
       
  1486             gradient.setColorAt(0.0, QColor(191, 212, 231));
       
  1487             gradient.setColorAt(0.7, Qt::white);
       
  1488             gradient.setColorAt(1.0, QColor(221, 232, 243));
       
  1489 
       
  1490             painter->setPen(Qt::NoPen);
       
  1491             if (bar->titleBarState & State_Active) {
       
  1492                 painter->setBrush(gradient);
       
  1493             }
       
  1494             else
       
  1495                 painter->setBrush(bar->palette.color(QPalette::Active,
       
  1496                                   QPalette::Background));
       
  1497 
       
  1498             painter->drawRect(bar->rect.adjusted(0, 0, -1, -1));
       
  1499 
       
  1500             painter->setBrush(QColor(233, 233, 233));
       
  1501             painter->drawRect(QRect(bar->rect.bottomLeft() + QPoint(0, 1),
       
  1502                                     bar->rect.bottomRight() + QPoint(0, 2)));
       
  1503 
       
  1504             QRect minButtonRect = subControlRect(control, bar,
       
  1505                                                  SC_TitleBarMinButton);
       
  1506             QRect maxButtonRect = subControlRect(control, bar,
       
  1507                                                  SC_TitleBarMaxButton);
       
  1508             QRect closeButtonRect = subControlRect(control, bar,
       
  1509                                                    SC_TitleBarCloseButton);
       
  1510             QRect systemButtonRect = subControlRect(control, bar,
       
  1511                                                     SC_TitleBarSysMenu);
       
  1512             QRect labelRect = subControlRect(control, bar, SC_TitleBarLabel);
       
  1513             QRect gripRect = QRect(QPoint(labelRect.right() + 5, bar->rect.top() + 5),
       
  1514                                    QPoint(minButtonRect.left() - 5,
       
  1515                                           bar->rect.bottom() - 4));
       
  1516 
       
  1517             QColor textColor = option->palette.color(QPalette::Text);
       
  1518             painter->setPen(textColor);
       
  1519             painter->setBrush(Qt::NoBrush);
       
  1520 
       
  1521             drawItemText(painter, labelRect, Qt::TextShowMnemonic |
       
  1522                          Qt::AlignHCenter | Qt::AlignCenter,
       
  1523                          bar->palette, bar->state & State_Enabled, bar->text,
       
  1524                          textColor.isValid() ? QPalette::NoRole :
       
  1525                          QPalette::WindowText);
       
  1526 
       
  1527             for (int i = 0; i < gripRect.width(); ++i) {
       
  1528                 painter->setPen(i % 2 ? bar->palette.color(QPalette::Midlight)
       
  1529                                       : Qt::white);
       
  1530 
       
  1531                 for (int j = 0; j < 4; ++j) {
       
  1532                     painter->drawPoint(i + gripRect.left(),
       
  1533                                gripRect.top() - 2 + i % 4 + 4 * j);
       
  1534                 }
       
  1535             }
       
  1536 
       
  1537             QPixmap maximizePixmap(":/images/internalmaximize.png");
       
  1538             QPixmap minimizePixmap(":/images/internalminimize.png");
       
  1539             QPixmap closePixmap(":/images/internalclose.png");
       
  1540             QPixmap internalPixmap(":/images/internalsystem.png");
       
  1541             QPixmap internalCloseDownPixmap(":/images/internalclosedown.png");
       
  1542             QPixmap minimizeDownPixmap(":/images/internalminimizedown.png");
       
  1543             QPixmap maximizeDownPixmap(":/images/internalmaximizedown.png");
       
  1544 
       
  1545             if (bar->activeSubControls & SC_TitleBarCloseButton &&
       
  1546                 bar->state & State_Sunken)
       
  1547                 painter->drawPixmap(closeButtonRect.topLeft(),
       
  1548                                     internalCloseDownPixmap);
       
  1549             else
       
  1550                 painter->drawPixmap(closeButtonRect.topLeft(), closePixmap);
       
  1551 
       
  1552             if (bar->activeSubControls & SC_TitleBarMinButton &&
       
  1553                 bar->state & State_Sunken)
       
  1554                 painter->drawPixmap(minButtonRect.topLeft(),
       
  1555                                     minimizeDownPixmap);
       
  1556             else
       
  1557                 painter->drawPixmap(minButtonRect.topLeft(), minimizePixmap);
       
  1558 
       
  1559             if (bar->activeSubControls & SC_TitleBarMaxButton &&
       
  1560                 bar->state & State_Sunken)
       
  1561                 painter->drawPixmap(maxButtonRect.topLeft(),
       
  1562                                     maximizeDownPixmap);
       
  1563             else
       
  1564                 painter->drawPixmap(maxButtonRect.topLeft(), maximizePixmap);
       
  1565 
       
  1566             painter->drawPixmap(systemButtonRect.topLeft(), internalPixmap);
       
  1567 
       
  1568             break;
       
  1569         }
       
  1570         case CC_GroupBox: {
       
  1571             const QStyleOptionGroupBox *box =
       
  1572                 qstyleoption_cast<const QStyleOptionGroupBox *>(option);
       
  1573 
       
  1574             QRect frameRect = subControlRect(control, box, SC_GroupBoxFrame);
       
  1575             QRect labelRect = subControlRect(control, box, SC_GroupBoxLabel);
       
  1576             QRect contentsRect = subControlRect(control, box,
       
  1577                                                 SC_GroupBoxContents);
       
  1578             QRect checkerRect = subControlRect(control, box,
       
  1579                                                SC_GroupBoxCheckBox);
       
  1580 
       
  1581             int y = labelRect.center().y();
       
  1582 
       
  1583             painter->setPen(box->palette.color(QPalette::Button));
       
  1584             painter->drawRect(frameRect.adjusted(2, y - frameRect.top(), -2,
       
  1585                                                  -2));
       
  1586 
       
  1587             painter->setPen(box->palette.color(QPalette::Background));
       
  1588 
       
  1589             if (box->subControls & SC_GroupBoxCheckBox) {
       
  1590                 painter->drawLine(checkerRect.left() - 1, y,
       
  1591                                   checkerRect.right() + 2, y);
       
  1592                 QStyleOptionButton checker;
       
  1593                 checker.QStyleOption::operator=(*box);
       
  1594                 checker.rect = checkerRect;
       
  1595                 drawPrimitive(PE_IndicatorCheckBox, &checker, painter, widget);
       
  1596             }
       
  1597 
       
  1598             if (box->subControls & SC_GroupBoxLabel && !box->text.isEmpty()) {
       
  1599                 painter->drawLine(labelRect.left() - 1, y,
       
  1600                               labelRect.right() +1, y);
       
  1601 
       
  1602                 QColor textColor = box->textColor;
       
  1603                 if (textColor.isValid())
       
  1604                     painter->setPen(textColor);
       
  1605 
       
  1606                 drawItemText(painter, labelRect,  Qt::TextShowMnemonic |
       
  1607                 Qt::AlignHCenter | int(box->textAlignment),
       
  1608                 box->palette, box->state & State_Enabled,
       
  1609                 box->text, textColor.isValid() ? QPalette::NoRole :
       
  1610                 QPalette::WindowText);
       
  1611             }
       
  1612             break;
       
  1613         }
       
  1614         case CC_SpinBox: {
       
  1615             const QStyleOptionSpinBox *spinner =
       
  1616             qstyleoption_cast<const QStyleOptionSpinBox *>(option);
       
  1617 
       
  1618             QRect frameRect = subControlRect(control, spinner, SC_SpinBoxFrame);
       
  1619             QRect upRect = subControlRect(control, spinner, SC_SpinBoxUp);
       
  1620             QRect downRect = subControlRect(control, spinner, SC_SpinBoxDown);
       
  1621 
       
  1622             painter->setPen(Qt::white);
       
  1623             painter->drawRect(frameRect.adjusted(1, 1, -1, -1));
       
  1624             painter->drawPoint(frameRect.bottomLeft());
       
  1625 
       
  1626             painter->setPen(spinner->palette.color(QPalette::Mid));
       
  1627             painter->drawRect(frameRect.adjusted(0, 0, -1, -2));
       
  1628 
       
  1629             bool isEnabled = (spinner->state & State_Enabled);
       
  1630             bool hover = isEnabled && (spinner->state & State_MouseOver);
       
  1631             bool sunken = (spinner->state & State_Sunken);
       
  1632             bool upIsActive = (spinner->activeSubControls == SC_SpinBoxUp);
       
  1633             bool downIsActive = (spinner->activeSubControls == SC_SpinBoxDown);
       
  1634             bool stepUpEnabled = spinner->stepEnabled &
       
  1635                              QAbstractSpinBox::StepUpEnabled;
       
  1636             bool stepDownEnabled = spinner->stepEnabled &
       
  1637                                QAbstractSpinBox::StepDownEnabled;
       
  1638 
       
  1639             painter->setBrush(spinner->palette.color(QPalette::Background));
       
  1640 
       
  1641             painter->drawRect(upRect);
       
  1642             if (upIsActive && stepUpEnabled) {
       
  1643                 if (sunken) {
       
  1644                     drawSunkenButtonShadow(painter, upRect,
       
  1645                                        spinner->palette.color(QPalette::Mid));
       
  1646                 } else if (hover) {
       
  1647                     drawButtonHoverFrame(painter, upRect,
       
  1648                     spinner->palette.color(QPalette::Mid),
       
  1649                     spinner->palette.color(QPalette::Button));
       
  1650                 }
       
  1651             }
       
  1652 
       
  1653             QStyleOptionSpinBox upSpin = *spinner;
       
  1654             upSpin.rect = upRect;
       
  1655             drawPrimitive(PE_IndicatorSpinUp, &upSpin, painter, widget);
       
  1656 
       
  1657             painter->drawRect(downRect);
       
  1658             if (downIsActive && stepDownEnabled) {
       
  1659                 if (sunken) {
       
  1660                     drawSunkenButtonShadow(painter, downRect,
       
  1661                     spinner->palette.color(QPalette::Mid));
       
  1662                 } else if (hover) {
       
  1663                     drawButtonHoverFrame(painter, downRect,
       
  1664                     spinner->palette.color(QPalette::Mid),
       
  1665                     spinner->palette.color(QPalette::Button));
       
  1666                 }
       
  1667             }
       
  1668 
       
  1669             QStyleOptionSpinBox downSpin = *spinner;
       
  1670             downSpin.rect = downRect;
       
  1671             drawPrimitive(PE_IndicatorSpinDown, &downSpin, painter, widget);
       
  1672 
       
  1673             break;
       
  1674         }
       
  1675         case CC_ToolButton: {
       
  1676             const QStyleOptionToolButton *button =
       
  1677                 qstyleoption_cast<const QStyleOptionToolButton *>(option);
       
  1678 
       
  1679             painter->setPen(Qt::white);
       
  1680             painter->drawRect(button->rect.adjusted(1, 1, -1, -1));
       
  1681 
       
  1682             QStyleOptionToolButton panelOption = *button;
       
  1683             QRect panelRect;
       
  1684             if (!(button->state & State_MouseOver) &&
       
  1685                 !(button->state & State_On)) {
       
  1686                 painter->setPen(QColor(153, 153, 153));
       
  1687                 painter->drawRect(button->rect.adjusted(0, 0, -2, -2));
       
  1688 
       
  1689                 panelRect = subControlRect(control, option, SC_ToolButton);
       
  1690                 panelOption.rect = panelRect;
       
  1691             } else {
       
  1692                 panelOption.rect.adjust(0, 0, -1, -1);
       
  1693             }
       
  1694 
       
  1695             QRect menuRect = subControlRect(control, option, SC_ToolButtonMenu);
       
  1696 
       
  1697             drawPrimitive(PE_PanelButtonTool, &panelOption, painter, widget);
       
  1698 
       
  1699             QStyleOptionToolButton menuOption = *button;
       
  1700             menuOption.rect = menuRect;
       
  1701 
       
  1702             QStyleOptionToolButton label = *button;
       
  1703             int fw = 5; 
       
  1704 
       
  1705             drawControl(CE_ToolButtonLabel, &label, painter, widget);
       
  1706             if (button->subControls & SC_ToolButtonMenu) {
       
  1707                 painter->setPen(button->palette.color(QPalette::WindowText));
       
  1708                 drawPrimitive(PE_IndicatorArrowDown, &menuOption, painter, widget);
       
  1709             }
       
  1710 
       
  1711             if (button->state & State_HasFocus) {
       
  1712                 QStyleOptionToolButton focusOption = *button;
       
  1713                 focusOption.rect = label.rect.adjusted(-1, -1, 1, 1);
       
  1714 
       
  1715                 drawPrimitive(PE_FrameFocusRect, &focusOption, painter, widget);
       
  1716             }
       
  1717             
       
  1718             break;
       
  1719         }
       
  1720         case CC_ComboBox: {
       
  1721             const QStyleOptionComboBox *combo =
       
  1722                 qstyleoption_cast<const QStyleOptionComboBox *>(option);
       
  1723 
       
  1724             QRect frameRect = subControlRect(control, option, SC_ComboBoxFrame,
       
  1725                                          widget);
       
  1726             painter->setPen(combo->palette.color(QPalette::Mid));
       
  1727 
       
  1728             if (option->state & State_HasFocus)
       
  1729                 painter->setBrush(option->palette.color(QPalette::Light));
       
  1730             else
       
  1731                 painter->setBrush(combo->palette.color(QPalette::Background));
       
  1732 
       
  1733             painter->drawRect(frameRect.adjusted(0, 0, -1, -1));
       
  1734 
       
  1735             QRect arrowRect = subControlRect(control, option, SC_ComboBoxArrow,
       
  1736                                              widget);
       
  1737             painter->setPen(combo->palette.color(QPalette::Button));
       
  1738             painter->setBrush(Qt::NoBrush);
       
  1739 
       
  1740             if (combo->direction == Qt::LeftToRight) {
       
  1741                 painter->drawRect(QRect(frameRect.topLeft() + QPoint(1, 1),
       
  1742                                   arrowRect.bottomLeft() + QPoint(-2, -2)));
       
  1743             } else {
       
  1744                 painter->drawRect(QRect(arrowRect.topLeft() + QPoint(1, 1),
       
  1745                                     frameRect.bottomRight() + QPoint(-2, -2)));
       
  1746             }
       
  1747 
       
  1748             QStyleOptionButton button;
       
  1749             button.rect = arrowRect;
       
  1750             button.state = combo->state;
       
  1751             button.palette = combo->palette;
       
  1752 
       
  1753             if (button.state & State_On)
       
  1754                 button.state ^= State_On;
       
  1755 
       
  1756             painter->save();
       
  1757             drawButtonBackground(&button, painter, false);
       
  1758             painter->restore();
       
  1759 
       
  1760             QPoint center = arrowRect.center();
       
  1761             QPoint offset = QPoint(arrowRect.bottomLeft().x() + 1,
       
  1762                                center.y() + 7);
       
  1763             QPainterPath arrow;
       
  1764             arrow.moveTo(offset + QPoint(4, -8));
       
  1765             arrow.lineTo(offset + QPoint(7, -5));
       
  1766             arrow.lineTo(offset + QPoint(8, -5));
       
  1767             arrow.lineTo(offset + QPoint(11, -8));
       
  1768             arrow.lineTo(offset + QPoint(4, -8));
       
  1769 
       
  1770             painter->setBrush(combo->palette.color(QPalette::WindowText));
       
  1771             painter->setPen(combo->palette.color(QPalette::WindowText));
       
  1772 
       
  1773             painter->drawPath(arrow);
       
  1774 
       
  1775             QRect fieldRect = subControlRect(control, option,
       
  1776                                              SC_ComboBoxEditField, widget);
       
  1777 
       
  1778             break;
       
  1779         }
       
  1780         case CC_Slider: {
       
  1781             const QStyleOptionSlider *slider =
       
  1782                 qstyleoption_cast<const QStyleOptionSlider *>(option);
       
  1783 
       
  1784             bool horizontal = slider->orientation == Qt::Horizontal;
       
  1785 
       
  1786             QRect groove = subControlRect(control, option, SC_SliderGroove,
       
  1787                                           widget);
       
  1788             QRect ticks = subControlRect(control, option, SC_SliderTickmarks,
       
  1789                                          widget);
       
  1790             QRect handle = subControlRect(control, option, SC_SliderHandle,
       
  1791                                           widget);
       
  1792 
       
  1793             QRect afterHandle = QRect(handle.topLeft() + xySwitch(QPoint(4, 6), horizontal),
       
  1794                                       groove.bottomRight() + xySwitch(QPoint(-4, -6), horizontal));
       
  1795             QRect beforeHandle = QRect(groove.topLeft() + xySwitch(QPoint(4, 6), horizontal),
       
  1796                                        handle.bottomRight() + xySwitch(QPoint(-4, -6), horizontal));
       
  1797 
       
  1798             if (slider->upsideDown || !horizontal) {
       
  1799                 QRect remember;
       
  1800                 remember = afterHandle;
       
  1801                 afterHandle = beforeHandle;
       
  1802                 beforeHandle = remember;
       
  1803             }
       
  1804 
       
  1805             painter->setPen(slider->palette.color(QPalette::Mid));
       
  1806             painter->setBrush(option->palette.color(QPalette::Background));
       
  1807             painter->drawRect(afterHandle);
       
  1808             painter->setPen(slider->palette.color(QPalette::Light));
       
  1809             painter->drawLine(afterHandle.topLeft() + xySwitch(QPoint(0, 1), horizontal),
       
  1810                           afterHandle.topRight() + xySwitch(QPoint(0, 1), horizontal));
       
  1811             painter->setPen(option->palette.color(QPalette::Midlight));
       
  1812 
       
  1813             if (horizontal) {
       
  1814                 painter->setBrush(gradientBrush(QRect(QPoint(groove.x(),
       
  1815                                                 handle.y() + 1),
       
  1816                                                 QSize(groove.width(),
       
  1817                                                 handle.height() + 1))));
       
  1818             } else {
       
  1819                 QRect rect = QRect(QPoint(groove.x(),
       
  1820                                    handle.x() - 1),
       
  1821                                    QSize(groove.height(),
       
  1822                                    handle.width() + 1));
       
  1823                 QLinearGradient gradient(groove.bottomLeft(),
       
  1824                                          groove.bottomRight());
       
  1825                 gradient.setColorAt(1.0, QColor(188, 210, 230));
       
  1826                 gradient.setColorAt(0.3, Qt::white);
       
  1827                 gradient.setColorAt(0.0, QColor(223, 233, 243));
       
  1828 
       
  1829                 painter->setBrush(gradient);
       
  1830             }
       
  1831 
       
  1832             painter->drawRect(beforeHandle);
       
  1833 
       
  1834             QPainterPath handlePath;
       
  1835             QPainterPath innerPath;
       
  1836             QPoint topLeft, topRight, bottomLeft;
       
  1837             if (horizontal) {
       
  1838                 topLeft = handle.topLeft();
       
  1839                 topRight = handle.topRight();
       
  1840                 bottomLeft = handle.bottomLeft();
       
  1841             } else {
       
  1842                 topLeft = handle.bottomLeft();
       
  1843                 topRight = handle.topLeft();
       
  1844                 bottomLeft = handle.topRight();
       
  1845             }
       
  1846 
       
  1847             if (horizontal) {
       
  1848                 QImage image(sliderHandleImage);
       
  1849 
       
  1850                 image.setColor(1,
       
  1851                     option->palette.color(QPalette::Midlight).rgb());
       
  1852                 image.setColor(2,
       
  1853                     option->palette.color(QPalette::Button).rgb());
       
  1854 
       
  1855                 if (!(slider->state & State_Enabled)) {
       
  1856                     image.setColor(4, slider->palette.color(QPalette::Background).rgb());
       
  1857                     image.setColor(5, slider->palette.color(QPalette::Background).rgb());
       
  1858                     image.setColor(6, slider->palette.color(QPalette::Background).rgb());
       
  1859                 }
       
  1860 
       
  1861                 painter->drawImage(handle.topLeft(), image);
       
  1862             } else {
       
  1863                 QImage image(":/images/verticalsliderhandle.png");
       
  1864                 painter->drawImage(handle.topLeft(), image);
       
  1865             }
       
  1866 
       
  1867             if (slider->tickPosition & QSlider::TicksBelow) {
       
  1868                 painter->setPen(slider->palette.color(QPalette::Light));
       
  1869                 int tickInterval = slider->tickInterval ? slider->tickInterval :
       
  1870                                                           slider->pageStep;
       
  1871 
       
  1872                 for (int i = 0; i <= slider->maximum; i += tickInterval) {
       
  1873                     if (horizontal) {
       
  1874                         int pos = int(((i / double(slider->maximum)) *
       
  1875                             ticks.width()) - 1);
       
  1876                         painter->drawLine(QPoint(ticks.left() + pos,
       
  1877                         ticks.top() + 2), QPoint(ticks.left() + pos, ticks.top() + 8));
       
  1878                     } else {
       
  1879                         int pos = int(((i / double(slider->maximum)) *
       
  1880                             ticks.height()) - 1);
       
  1881                         painter->drawLine(QPoint(ticks.left() + 2, ticks.bottom() - pos),
       
  1882                                           QPoint(ticks.right() - 2, ticks.bottom() - pos));
       
  1883                     }
       
  1884                 }
       
  1885                 if (horizontal) {
       
  1886                     painter->drawLine(QPoint(ticks.right(), ticks.top() + 2),
       
  1887                                       QPoint(ticks.right(), ticks.top() + 8));
       
  1888                 } else {
       
  1889                     painter->drawLine(QPoint(ticks.left() + 2, ticks.top()),
       
  1890                               QPoint(ticks.right() - 2, ticks.top()));
       
  1891                 }
       
  1892             }
       
  1893             break;
       
  1894         }
       
  1895         default:
       
  1896             QWindowsStyle::drawComplexControl(control, option, painter, widget);
       
  1897     }
       
  1898     painter->restore();
       
  1899 }
       
  1900 
       
  1901 inline void JavaStyle::drawSunkenButtonShadow(QPainter *painter,
       
  1902                                               QRect rect,
       
  1903                                               const QColor &frameColor,
       
  1904                                               bool reverse) const
       
  1905 {
       
  1906     painter->save();
       
  1907 
       
  1908     painter->setPen(frameColor);
       
  1909 
       
  1910     if (!reverse) {
       
  1911         painter->drawLine(QLine(QPoint(rect.x() + 1, rect.y() + 1),
       
  1912                                 QPoint(rect.x() + rect.width() - 1, rect.y() + 1)));
       
  1913         painter->drawLine(QLine(QPoint(rect.x() + 1, rect.y()),
       
  1914                                 QPoint(rect.x() + 1, rect.y() + rect.height())));
       
  1915     } else {
       
  1916         painter->drawLine(QLine(QPoint(rect.right(), rect.bottom()),
       
  1917                                 QPoint(rect.right(), rect.top())));
       
  1918         painter->drawLine(QLine(QPoint(rect.left(), rect.top() + 1),
       
  1919                                 QPoint(rect.right(), rect.top() + 1)));
       
  1920     }
       
  1921     painter->restore();
       
  1922 }
       
  1923 
       
  1924 inline void JavaStyle::drawButtonHoverFrame(QPainter *painter, QRect rect,
       
  1925                                             const QColor &frameColor,
       
  1926                                             const QColor &activeFrame) const
       
  1927 {
       
  1928     painter->save();
       
  1929 
       
  1930     painter->setPen(activeFrame);
       
  1931     painter->drawRect(rect);
       
  1932     rect.adjust(1, 1, -1, -1);
       
  1933     painter->setPen(frameColor);
       
  1934     painter->drawRect(rect);
       
  1935     rect.adjust(1, 1, -1, -1);
       
  1936     painter->setPen(activeFrame);
       
  1937     painter->drawRect(rect);
       
  1938 
       
  1939     painter->restore();
       
  1940 }
       
  1941 
       
  1942 QStyle::SubControl JavaStyle::hitTestComplexControl(ComplexControl control,
       
  1943                                                     const QStyleOptionComplex *option,
       
  1944                                                     const QPoint &pos,
       
  1945                                                     const QWidget *widget) const
       
  1946 {
       
  1947     SubControl ret = SC_None;
       
  1948 
       
  1949     switch (control) {
       
  1950         case CC_TitleBar: {
       
  1951             const QStyleOptionTitleBar *bar =
       
  1952                 qstyleoption_cast<const QStyleOptionTitleBar *>(option);
       
  1953 
       
  1954             QRect maximize = subControlRect(control, bar, SC_TitleBarMaxButton);
       
  1955             if (maximize.contains(pos)) {
       
  1956                 ret = SC_TitleBarMaxButton;
       
  1957                 break;
       
  1958             }
       
  1959             QRect minimize = subControlRect(control, bar, SC_TitleBarMinButton);
       
  1960             if (minimize.contains(pos)) {
       
  1961                 ret = SC_TitleBarMinButton;
       
  1962                 break;
       
  1963             }
       
  1964             QRect close = subControlRect(control, bar, SC_TitleBarCloseButton);
       
  1965             if (close.contains(pos)) {
       
  1966                 ret = SC_TitleBarCloseButton;
       
  1967                 break;
       
  1968             }
       
  1969             QRect system = subControlRect(control, bar, SC_TitleBarSysMenu);
       
  1970             if (system.contains(pos)) {
       
  1971                 ret = SC_TitleBarSysMenu;
       
  1972                 break;
       
  1973             }
       
  1974             ret = SC_TitleBarLabel;
       
  1975             break;
       
  1976         }
       
  1977         case CC_ScrollBar:
       
  1978             if (const QStyleOptionSlider *scrollBar =
       
  1979                 qstyleoption_cast<const QStyleOptionSlider *>(option)) {
       
  1980                     QRect slider = subControlRect(control, scrollBar,
       
  1981                                                   SC_ScrollBarSlider, widget);
       
  1982                 if (slider.contains(pos)) {
       
  1983                     ret = SC_ScrollBarSlider;
       
  1984                     break;
       
  1985                 }
       
  1986 
       
  1987                 QRect scrollBarAddLine = subControlRect(control, scrollBar,
       
  1988                     SC_ScrollBarAddLine, widget);
       
  1989                 if (scrollBarAddLine.contains(pos)) {
       
  1990                     ret = SC_ScrollBarAddLine;
       
  1991                     break;
       
  1992                 }
       
  1993 
       
  1994                 QRect scrollBarSubPage = subControlRect(control, scrollBar,
       
  1995                             SC_ScrollBarSubPage, widget);
       
  1996                 if (scrollBarSubPage.contains(pos)) {
       
  1997                     ret = SC_ScrollBarSubPage;
       
  1998                     break;
       
  1999                 }
       
  2000 
       
  2001                 QRect scrollBarAddPage = subControlRect(control, scrollBar,
       
  2002                             SC_ScrollBarAddPage, widget);
       
  2003                 if (scrollBarAddPage.contains(pos)) {
       
  2004                     ret = SC_ScrollBarAddPage;
       
  2005                     break;
       
  2006                 }
       
  2007 
       
  2008                 QRect scrollBarSubLine = subControlRect(control, scrollBar,
       
  2009                             SC_ScrollBarSubLine, widget);
       
  2010                 if (scrollBarSubLine.contains(pos)) {
       
  2011                     ret = SC_ScrollBarSubLine;
       
  2012                     break;
       
  2013                 }
       
  2014             }
       
  2015             break;
       
  2016 
       
  2017         default:
       
  2018             ret = QWindowsStyle::hitTestComplexControl(control, option, pos,
       
  2019                                                        widget);
       
  2020     }
       
  2021     return ret;
       
  2022 }
       
  2023 
       
  2024 void JavaStyle::polish(QWidget *widget)
       
  2025 {
       
  2026     if (qobject_cast<QCheckBox *>(widget) ||
       
  2027         qobject_cast<QRadioButton *>(widget) ||
       
  2028         qobject_cast<QPushButton *>(widget) ||
       
  2029         qobject_cast<QToolButton *>(widget) ||
       
  2030         qobject_cast<QSpinBox *>(widget) ||
       
  2031         qobject_cast<QGroupBox *>(widget))
       
  2032             widget->setAttribute(Qt::WA_Hover, true);
       
  2033 }
       
  2034 
       
  2035 void JavaStyle::unpolish(QWidget *widget)
       
  2036 {
       
  2037     if (qobject_cast<QPushButton *>(widget) ||
       
  2038         qobject_cast<QCheckBox *>(widget) ||
       
  2039         qobject_cast<QRadioButton *>(widget) ||
       
  2040         qobject_cast<QToolButton *>(widget) ||
       
  2041         qobject_cast<QSpinBox *>(widget) ||
       
  2042         qobject_cast<QGroupBox *>(widget))
       
  2043             widget->setAttribute(Qt::WA_Hover, false);
       
  2044 }
       
  2045 
       
  2046 void JavaStyle::drawSplitter(const QStyleOption *option, QPainter *painter,
       
  2047                  bool horizontal) const
       
  2048 {
       
  2049     QRect rect = option->rect;
       
  2050 
       
  2051     painter->setPen(Qt::NoPen);
       
  2052     painter->setBrush(option->palette.color(QPalette::Background));
       
  2053 
       
  2054     painter->drawRect(rect);
       
  2055 
       
  2056     QColor colors[] = { Qt::white, option->palette.color(QPalette::Mid) };
       
  2057     int iterations = horizontal ? rect.height() - 1 : rect.width() - 1;
       
  2058     for (int i = 0; i < iterations; ++i) {
       
  2059         painter->setPen(colors[i % 2]);
       
  2060         painter->drawPoint(xySwitch(QPoint(rect.x() + 0 + (i % 4),
       
  2061                                            rect.y() + i), horizontal));
       
  2062     }
       
  2063 }
       
  2064 
       
  2065 inline QPoint JavaStyle::xySwitch(const QPoint &point, bool horizontal) const
       
  2066 {
       
  2067     QPoint retPoint = point;
       
  2068 
       
  2069     if (!horizontal) {
       
  2070         retPoint = QPoint(point.y(), point.x());
       
  2071     }
       
  2072 
       
  2073     return retPoint;
       
  2074 }
       
  2075 
       
  2076 void JavaStyle::drawPrimitive(PrimitiveElement element,
       
  2077                               const QStyleOption *option,
       
  2078                               QPainter *painter,
       
  2079                               const QWidget *widget) const
       
  2080 {
       
  2081     painter->save();
       
  2082 
       
  2083     switch (element) {
       
  2084         case PE_PanelButtonBevel:
       
  2085         case PE_FrameButtonBevel: {
       
  2086             painter->save();
       
  2087             painter->setBrush(option->palette.background());
       
  2088             painter->setPen(Qt::NoPen);
       
  2089             painter->drawRect(option->rect);
       
  2090             painter->restore();
       
  2091             break;
       
  2092         }
       
  2093         case PE_IndicatorBranch: {
       
  2094             painter->save();
       
  2095             QColor lineColor(204, 204, 255);
       
  2096             QPixmap openPixmap(":/images/jtreeopen.png");
       
  2097             QPixmap closedPixmap(":/images/jtreeclosed.png");
       
  2098             QRect pixmapRect(QPoint(0, 0), QSize(12, 12));
       
  2099             pixmapRect.moveCenter(option->rect.center());
       
  2100             pixmapRect.translate(2, 0);
       
  2101             QPoint center = option->rect.center();
       
  2102 
       
  2103             painter->setPen(lineColor);
       
  2104             painter->setBrush(Qt::NoBrush);
       
  2105 
       
  2106             if (option->state & State_Item) {
       
  2107                 painter->drawLine(center,
       
  2108                                   QPoint(option->rect.right(), center.y()));
       
  2109 
       
  2110                 painter->drawLine(center, QPoint(center.x(),
       
  2111                                   option->rect.top()));
       
  2112 
       
  2113                 if (option->state & State_Sibling) {
       
  2114                     painter->drawLine(center, QPoint(center.x(),
       
  2115                                       option->rect.bottom()));
       
  2116                 }
       
  2117                 
       
  2118                 if (option->state & State_Children)
       
  2119                     if (option->state & State_Open)
       
  2120                         painter->drawPixmap(pixmapRect.topLeft(), closedPixmap);
       
  2121                     else
       
  2122                         painter->drawPixmap(pixmapRect.topLeft(), openPixmap);
       
  2123             } else if (option->state & State_Sibling) {
       
  2124                 painter->drawLine(center.x(), option->rect.top(), center.x(),
       
  2125                                   option->rect.bottom());
       
  2126             }
       
  2127 
       
  2128             painter->restore();
       
  2129             break;
       
  2130         }
       
  2131         case PE_IndicatorViewItemCheck: {
       
  2132             break;
       
  2133         }
       
  2134         case PE_FrameWindow: {
       
  2135             painter->save();
       
  2136             bool active = option->state & State_Active;
       
  2137 
       
  2138             painter->setPen(Qt::NoPen);
       
  2139             painter->setBrush(active ? option->palette.color(QPalette::Midlight)
       
  2140                                      : option->palette.color(QPalette::Mid));
       
  2141 
       
  2142             painter->drawRect(QRect(option->rect.topLeft(), option->rect.bottomLeft() + QPoint(5, 0)));
       
  2143             painter->drawRect(QRect(option->rect.bottomLeft(), option->rect.bottomRight() + QPoint(0, -5)));
       
  2144             painter->drawRect(QRect(option->rect.bottomRight() + QPoint(-5, 0), option->rect.topRight()));
       
  2145             painter->drawRect(QRect(option->rect.topLeft(), option->rect.topRight() + QPoint(0, 4)));
       
  2146 
       
  2147             painter->setBrush(Qt::NoBrush);
       
  2148             painter->setPen(option->palette.color(QPalette::Active, QPalette::WindowText));
       
  2149             painter->drawLine(option->rect.topLeft() + QPoint(2, 14),
       
  2150                               option->rect.bottomLeft() + QPoint(2, -14));
       
  2151 
       
  2152             painter->drawLine(option->rect.topRight() + QPoint(-2, 14),
       
  2153                               option->rect.bottomRight() + QPoint(-2, -14));
       
  2154 
       
  2155             painter->drawLine(option->rect.topLeft() + QPoint(14, 2),
       
  2156                               option->rect.topRight() + QPoint(-14, 2));
       
  2157 
       
  2158             painter->drawLine(option->rect.bottomLeft() + QPoint(14, -2),
       
  2159                               option->rect.bottomRight() + QPoint(-14, -2));
       
  2160 
       
  2161             painter->setPen(active ? option->palette.color(QPalette::Light) :
       
  2162                             option->palette.color(QPalette::Button));
       
  2163             painter->drawLine(option->rect.topLeft() + QPoint(3, 15),
       
  2164                               option->rect.bottomLeft() + QPoint(3, -13));
       
  2165 
       
  2166             painter->drawLine(option->rect.topRight() + QPoint(-1, 15),
       
  2167                               option->rect.bottomRight() + QPoint(-1, -13));
       
  2168 
       
  2169             painter->drawLine(option->rect.topLeft() + QPoint(15, 3),
       
  2170                               option->rect.topRight() + QPoint(-13, 3));
       
  2171 
       
  2172             painter->drawLine(option->rect.bottomLeft() + QPoint(15, -1),
       
  2173                               option->rect.bottomRight() + QPoint(-13, -1));
       
  2174 
       
  2175             painter->restore();
       
  2176             break;
       
  2177         }
       
  2178         case PE_IndicatorSpinUp: {
       
  2179             const QStyleOptionSpinBox *spinner =
       
  2180                 qstyleoption_cast<const QStyleOptionSpinBox *>(option);
       
  2181             int add = spinner->state & State_Sunken &&
       
  2182                     spinner->activeSubControls & SC_SpinBoxUp ? 1 : 0;
       
  2183 
       
  2184             QPoint center = option->rect.center();
       
  2185             painter->drawLine(center.x() + add, center.y() + 1 + add,
       
  2186                               center.x() + 2 + add, center.y() + 1 + add);
       
  2187             painter->drawPoint(center.x() + 1 + add, center.y() + add);
       
  2188             break;
       
  2189         }
       
  2190         case PE_IndicatorSpinDown: {
       
  2191             const QStyleOptionSpinBox *spinner =
       
  2192                 qstyleoption_cast<const QStyleOptionSpinBox *>(option);
       
  2193 
       
  2194             int add = spinner->state & State_Sunken &&
       
  2195                       spinner->activeSubControls & SC_SpinBoxDown ? 1 : 0;
       
  2196             QPoint center = option->rect.center();
       
  2197             painter->drawLine(center.x() + add, center.y() + add,
       
  2198                               center.x() + 2 + add, center.y() + add);
       
  2199             painter->drawPoint(center.x() + 1 + add, center.y() + 1 + add);
       
  2200             break;
       
  2201         }
       
  2202         case PE_FrameDockWidget: { 
       
  2203             drawPrimitive(PE_FrameWindow, option, painter, widget);
       
  2204             break;
       
  2205         }
       
  2206         case PE_IndicatorToolBarHandle: {
       
  2207             QPoint offset;
       
  2208             bool horizontal = option->state & State_Horizontal;
       
  2209 
       
  2210             if (horizontal)
       
  2211                 offset = option->rect.topLeft();
       
  2212             else
       
  2213                 offset = option->rect.topLeft();
       
  2214 
       
  2215             int iterations = horizontal ? option->rect.height() :
       
  2216                                           option->rect.width();
       
  2217 
       
  2218             for (int i = 0; i < iterations; ++i) {
       
  2219                 painter->setPen(i % 2 ? Qt::white :
       
  2220                     option->palette.color(QPalette::Mid));
       
  2221                 int add = i % 4;
       
  2222                 painter->drawPoint(offset + xySwitch(QPoint(add, i),
       
  2223                                                      horizontal));
       
  2224                 painter->drawPoint(offset + xySwitch(QPoint(add + 4, i),
       
  2225                                                      horizontal));
       
  2226                 if (add + 8 < 10)
       
  2227                     painter->drawPoint(offset + xySwitch(QPoint(add + 8, i),
       
  2228                                        horizontal));
       
  2229             }
       
  2230             
       
  2231             break;
       
  2232         }
       
  2233         case PE_IndicatorToolBarSeparator: {
       
  2234             break;
       
  2235         }
       
  2236         case PE_PanelButtonTool: {
       
  2237             const QStyleOptionToolButton *button =
       
  2238             qstyleoption_cast<const QStyleOptionToolButton *>(option);
       
  2239 
       
  2240             if (!button)  {
       
  2241                 painter->setPen(Qt::red);
       
  2242                 if (!(option->state & State_Enabled))
       
  2243                     painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
       
  2244                 drawButtonBackground(option, painter, false);
       
  2245                 break;
       
  2246             }
       
  2247 
       
  2248             if (button->state & State_MouseOver || button->state & State_On) {
       
  2249                 QStyleOptionButton bevel;
       
  2250                 bevel.state = button->state;
       
  2251                 bevel.rect = button->rect;
       
  2252                 bevel.palette = button->palette;
       
  2253 
       
  2254                 drawButtonBackground(&bevel, painter, false);
       
  2255             } else {
       
  2256                 painter->setPen(Qt::NoPen);
       
  2257                 painter->setBrush(button->palette.color(QPalette::Background));
       
  2258 
       
  2259                 painter->drawRect(button->rect.adjusted(0, 0, -1, -1));
       
  2260             }
       
  2261             break;
       
  2262         }
       
  2263         case PE_FrameMenu: {
       
  2264             painter->setPen(option->palette.color(QPalette::Midlight));
       
  2265             painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
       
  2266             break;
       
  2267         }
       
  2268         case PE_PanelButtonCommand: {
       
  2269             const QStyleOptionButton *btn =
       
  2270                 qstyleoption_cast<const QStyleOptionButton *>(option);
       
  2271             bool hover = (btn->state & State_Enabled) &&
       
  2272                          (btn->state & State_MouseOver);
       
  2273             bool sunken = btn->state & State_Sunken;
       
  2274             bool isDefault = btn->features & QStyleOptionButton::DefaultButton;
       
  2275             bool on = option->state & State_On;
       
  2276 
       
  2277             drawButtonBackground(option, painter, false);
       
  2278 
       
  2279             QRect rect = option->rect.adjusted(0, 0, -1, -1);
       
  2280             if (hover && !sunken && !isDefault && !on) {
       
  2281                 drawButtonHoverFrame(painter, rect,
       
  2282                     btn->palette.color(QPalette::Mid),
       
  2283                     btn->palette.color(QPalette::Button));
       
  2284             } else if (isDefault) {
       
  2285                 drawPrimitive(PE_FrameDefaultButton, option, painter, widget);
       
  2286             }
       
  2287             break;
       
  2288         }
       
  2289         case PE_FrameDefaultButton: {
       
  2290             painter->setPen(option->palette.color(QPalette::Mid));
       
  2291             QRect rect = option->rect.adjusted(0, 0, -1, -1);
       
  2292             painter->drawRect(rect);
       
  2293             painter->drawRect(rect.adjusted(1, 1, -1, -1));
       
  2294             break;
       
  2295         }
       
  2296 //! [0]
       
  2297         case PE_IndicatorCheckBox: {
       
  2298             painter->save();
       
  2299             drawButtonBackground(option, painter, true);
       
  2300 
       
  2301             if (option->state & State_Enabled &&
       
  2302                 option->state & State_MouseOver &&
       
  2303                 !(option->state & State_Sunken)) {
       
  2304                 painter->setPen(option->palette.color(QPalette::Button));
       
  2305                 QRect rect = option->rect.adjusted(1, 1, -2, -2);
       
  2306                 painter->drawRect(rect);
       
  2307                 rect = rect.adjusted(1, 1, -1, -1);
       
  2308                 painter->drawRect(rect);
       
  2309             }
       
  2310 
       
  2311             if (option->state & State_On) {
       
  2312                 QImage image(":/images/checkboxchecked.png");
       
  2313                 painter->drawImage(option->rect.topLeft(), image);
       
  2314             }
       
  2315             painter->restore();
       
  2316             break;
       
  2317 //! [0]
       
  2318         }
       
  2319         case PE_IndicatorRadioButton: {
       
  2320             painter->save();
       
  2321             QBrush radioBrush = option->palette.button();
       
  2322 
       
  2323             if (!(option->state & State_Sunken) &&
       
  2324                 option->state & State_Enabled)
       
  2325                 radioBrush = gradientBrush(option->rect);
       
  2326 
       
  2327             painter->setBrush(radioBrush);
       
  2328             if (option->state & State_Enabled)
       
  2329                 painter->setPen(option->palette.color(QPalette::Mid));
       
  2330             else
       
  2331                 painter->setPen(option->palette.color(QPalette::Disabled,
       
  2332                                                       QPalette::WindowText));
       
  2333             painter->drawEllipse(option->rect.adjusted(0, 0, -1, -1));
       
  2334 
       
  2335             if (option->state & State_MouseOver &&
       
  2336                 option->state & State_Enabled &&
       
  2337                 !(option->state & State_Sunken)) {
       
  2338                 gradientBrush(option->rect);
       
  2339                 painter->setPen(option->palette.color(QPalette::Button));
       
  2340                 painter->setBrush(Qt::NoBrush);
       
  2341                 QRect rect = option->rect.adjusted(1, 1, -2, -2);
       
  2342                 painter->drawEllipse(rect);
       
  2343                 rect = rect.adjusted(1, 1, -1, -1);
       
  2344                 painter->drawEllipse(rect);
       
  2345             }
       
  2346 
       
  2347             if (option->state & State_On) {
       
  2348                 painter->setBrush(option->palette.color(QPalette::Text));
       
  2349                 painter->setPen(Qt::NoPen);
       
  2350                 painter->drawEllipse(option->rect.adjusted(3, 3, -3, -3));
       
  2351             }
       
  2352             if (option->state & State_Sunken &&
       
  2353                 option->state & State_Enabled) {
       
  2354                 painter->setPen(option->palette.color(QPalette::Mid));
       
  2355                 painter->drawArc(option->rect.adjusted(1, 1, -2, -2), 80 * 16,
       
  2356                                  100 * 16);
       
  2357             }
       
  2358             painter->restore();
       
  2359             break;
       
  2360         }
       
  2361         case PE_FrameTabWidget: {
       
  2362             painter->setPen(option->palette.color(QPalette::Midlight));
       
  2363             painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
       
  2364             painter->setPen(Qt::white);
       
  2365             painter->drawRect(option->rect.adjusted(1, 1, -2, -2));
       
  2366             break;
       
  2367         }
       
  2368         case PE_Frame:
       
  2369         case PE_FrameLineEdit: {
       
  2370             const QStyleOptionFrame *frame =
       
  2371                 qstyleoption_cast<const QStyleOptionFrame *>(option);
       
  2372             const QStyleOptionFrameV2 frameV2(*frame);
       
  2373 
       
  2374             painter->setPen(frame->palette.color(QPalette::Mid));
       
  2375             painter->drawRect(frameV2.rect.adjusted(0, 0, -2, -2));
       
  2376             painter->setPen(Qt::white);
       
  2377             painter->drawRect(frameV2.rect.adjusted(1, 1, -1, -1));
       
  2378             painter->setPen(frameV2.palette.color(QPalette::Active,
       
  2379                                                   QPalette::Background));
       
  2380             painter->drawLine(frameV2.rect.bottomLeft(),
       
  2381             frameV2.rect.bottomLeft() + QPoint(1, -1));
       
  2382             painter->drawLine(frameV2.rect.topRight(),
       
  2383             frameV2.rect.topRight() + QPoint(-1, 1));
       
  2384             break;
       
  2385         }
       
  2386         case PE_FrameFocusRect: {
       
  2387             painter->setPen(option->palette.color(QPalette::Light));
       
  2388             painter->setBrush(Qt::NoBrush);
       
  2389             QRect rect = option->rect;
       
  2390             rect = rect.adjusted(0,0, -1, -1);
       
  2391             painter->drawRect(rect);
       
  2392             break;
       
  2393         }
       
  2394         default:
       
  2395             QWindowsStyle::drawPrimitive(element, option, painter, widget);
       
  2396     }
       
  2397     painter->restore();
       
  2398 }
       
  2399 
       
  2400 //! [1]
       
  2401 void JavaStyle::drawButtonBackground(const QStyleOption *option,
       
  2402                                      QPainter *painter, bool isCheckbox) const
       
  2403 {
       
  2404     QBrush buttonBrush = option->palette.button();
       
  2405     bool sunken = option->state & State_Sunken;
       
  2406     bool disabled = !(option->state & State_Enabled);
       
  2407     bool on = option->state & State_On;
       
  2408 
       
  2409     if (!sunken && !disabled && (!on || isCheckbox))
       
  2410         buttonBrush = gradientBrush(option->rect);
       
  2411 
       
  2412         painter->fillRect(option->rect, buttonBrush);
       
  2413 
       
  2414         QRect rect = option->rect.adjusted(0, 0, -1, -1);
       
  2415 
       
  2416         if (disabled)
       
  2417             painter->setPen(option->palette.color(QPalette::Disabled,
       
  2418                                                   QPalette::WindowText));
       
  2419         else
       
  2420             painter->setPen(option->palette.color(QPalette::Mid));
       
  2421 
       
  2422         painter->drawRect(rect);
       
  2423 
       
  2424         if (sunken && !disabled) {
       
  2425             drawSunkenButtonShadow(painter, rect,
       
  2426                    option->palette.color(QPalette::Mid),
       
  2427                    option->direction == Qt::RightToLeft);
       
  2428     }
       
  2429 }
       
  2430 //! [1]
       
  2431 
       
  2432 QBrush JavaStyle::gradientBrush(const QRect &rect) const
       
  2433 {
       
  2434     QLinearGradient gradient(rect.topLeft(), rect.bottomLeft());
       
  2435     gradient.setColorAt(1.0, QColor(188, 210, 230));
       
  2436     gradient.setColorAt(0.3, Qt::white);
       
  2437     gradient.setColorAt(0.0, QColor(223, 233, 243));
       
  2438 
       
  2439     return QBrush(gradient);
       
  2440 }
       
  2441 
       
  2442 QRect JavaStyle::subElementRect(SubElement element,
       
  2443                                 const QStyleOption *option,
       
  2444                                 const QWidget *widget) const
       
  2445 {
       
  2446     QRect rect;
       
  2447 
       
  2448     switch (element) {
       
  2449         case SE_ToolBoxTabContents: {
       
  2450             const QStyleOptionToolBox *box =
       
  2451                 qstyleoption_cast<const QStyleOptionToolBox *>(option);
       
  2452 
       
  2453             rect.moveTopLeft(box->rect.topLeft() + QPoint(0, 2));
       
  2454             rect.setHeight(box->rect.height() - 4);
       
  2455             rect.setWidth(box->fontMetrics.width(box->text) + 15);
       
  2456             break;
       
  2457         }
       
  2458         case SE_ProgressBarLabel:
       
  2459         case SE_ProgressBarGroove:
       
  2460         case SE_ProgressBarContents: {
       
  2461             rect = option->rect.adjusted(1, 1, -1, -1);
       
  2462             break;
       
  2463         }
       
  2464         case SE_PushButtonFocusRect: {
       
  2465             const QStyleOptionButton *btn =
       
  2466                 qstyleoption_cast<const QStyleOptionButton *>(option);
       
  2467 
       
  2468             rect = btn->fontMetrics.boundingRect(btn->text);
       
  2469             rect = QRect(0, 0, btn->fontMetrics.width(btn->text),
       
  2470                          rect.height());
       
  2471 
       
  2472             if (!btn->icon.isNull()) {
       
  2473                 rect.adjust(0, 0, btn->iconSize.width(), btn->iconSize.height()
       
  2474                     > rect.height() ? btn->iconSize.height() - rect.height() : 0);
       
  2475                 rect.translate(-btn->iconSize.width(), 0);
       
  2476                 rect.adjust(-1, -1, 1, 1);
       
  2477             }
       
  2478             rect = QRect(int(ceil((btn->rect.width() - rect.width()) / 2.0)),
       
  2479                          int(ceil((btn->rect.height() - rect.height()) / 2.0)),
       
  2480                          rect.width() - 1, rect.height());
       
  2481             rect.adjust(-1, 0, 1, 0);
       
  2482 
       
  2483             break;
       
  2484         }
       
  2485         default:
       
  2486             rect = QWindowsStyle::subElementRect(element, option, widget);
       
  2487     }
       
  2488     return rect;
       
  2489 }
       
  2490 
       
  2491 int JavaStyle::pixelMetric(PixelMetric metric,
       
  2492                            const QStyleOption* /* option */,
       
  2493                            const QWidget* /*widget*/) const
       
  2494 {
       
  2495     int value = 0;
       
  2496 
       
  2497     switch (metric) {
       
  2498         case PM_ButtonShiftHorizontal:
       
  2499         case PM_ButtonShiftVertical:
       
  2500         case PM_TabBarTabShiftHorizontal:
       
  2501         case PM_ButtonDefaultIndicator:
       
  2502         case PM_TabBarTabShiftVertical:
       
  2503             value = 0;
       
  2504             break;
       
  2505         case PM_TabBarBaseOverlap:
       
  2506         case PM_DefaultFrameWidth:
       
  2507             value = 2;
       
  2508             break;
       
  2509         case PM_TabBarTabVSpace:
       
  2510             value = 4;
       
  2511             break;
       
  2512         case PM_ScrollBarExtent:
       
  2513             value = 16;
       
  2514             break;
       
  2515         case PM_ScrollBarSliderMin:
       
  2516             value = 26;
       
  2517             break;
       
  2518         case PM_SplitterWidth:
       
  2519             value = 8;
       
  2520             break;
       
  2521         case PM_SliderThickness:
       
  2522             value = 16;
       
  2523             break;
       
  2524         case PM_SliderControlThickness:
       
  2525             value = 16;
       
  2526             break;
       
  2527         case PM_SliderTickmarkOffset:
       
  2528             value = 10;
       
  2529             break;
       
  2530         case PM_SliderSpaceAvailable:
       
  2531             break;
       
  2532         case PM_MenuPanelWidth:
       
  2533             value = 1;
       
  2534             break;
       
  2535         case PM_MenuVMargin:
       
  2536             value = 2;
       
  2537             break;
       
  2538         case PM_MenuBarPanelWidth:
       
  2539             value = 1;
       
  2540             break;
       
  2541         case PM_MenuBarItemSpacing:
       
  2542             value = 0;
       
  2543             break;
       
  2544         case PM_MenuBarHMargin:
       
  2545             value = 3;
       
  2546             break;
       
  2547         case PM_MenuBarVMargin:
       
  2548             value = 0;
       
  2549             break;
       
  2550         case PM_ComboBoxFrameWidth:
       
  2551             value = 1;
       
  2552             break;
       
  2553         case PM_MenuButtonIndicator:
       
  2554             value = 15;
       
  2555             break;
       
  2556         case PM_ToolBarItemMargin:
       
  2557             value = 3;
       
  2558             break;
       
  2559         case PM_ToolBarHandleExtent:
       
  2560             value = 13;
       
  2561             break;
       
  2562         case PM_SpinBoxFrameWidth:
       
  2563             value = 2;
       
  2564             break;
       
  2565         case PM_TitleBarHeight: {
       
  2566             value = 21;
       
  2567             break;
       
  2568         case PM_MDIFrameWidth:
       
  2569             value = 6;
       
  2570             break;
       
  2571         }
       
  2572         case PM_DockWidgetFrameWidth: {
       
  2573             value = 5;
       
  2574             break;
       
  2575         }
       
  2576         default:
       
  2577             value = QWindowsStyle::pixelMetric(metric);
       
  2578     }
       
  2579     return value;
       
  2580 }
       
  2581 
       
  2582 
       
  2583 int JavaStyle::styleHint(StyleHint hint, const QStyleOption *option,
       
  2584                          const QWidget *widget,
       
  2585                          QStyleHintReturn *returnData) const
       
  2586 {
       
  2587     int ret;
       
  2588 
       
  2589     switch (hint) {
       
  2590         case SH_Table_GridLineColor: {
       
  2591             ret = static_cast<int>(option->palette.color(QPalette::Mid).rgb());
       
  2592             break;
       
  2593         }
       
  2594         case QStyle::SH_Menu_Scrollable:
       
  2595             ret = 1; 
       
  2596             break;
       
  2597         default:
       
  2598             ret = QWindowsStyle::styleHint(hint, option, widget, returnData);
       
  2599     }
       
  2600     return ret;
       
  2601 }
       
  2602 
       
  2603 QPixmap JavaStyle::standardPixmap(StandardPixmap standardPixmap,
       
  2604                   const QStyleOption *option,
       
  2605                   const QWidget *widget) const
       
  2606 {
       
  2607     QPixmap pixmap = QWindowsStyle::standardPixmap(standardPixmap, option,
       
  2608                                                    widget);
       
  2609 
       
  2610     QPixmap maximizePixmap(":/images/internalmaximize.png");
       
  2611     QPixmap minimizePixmap(":/images/internalminimize.png");
       
  2612     QPixmap closePixmap(":/images/internalclose.png");
       
  2613     QPixmap internalPixmap(":/images/internalsystem.png");
       
  2614     QPixmap internalCloseDownPixmap(":/images/internalclosedown.png");
       
  2615     QPixmap minimizeDownPixmap(":/images/internalminimizedown.png");
       
  2616     QPixmap maximizeDownPixmap(":/images/internalmaximizedown.png");
       
  2617     QPixmap dirOpenPixmap(":/images/open24.png");
       
  2618     QPixmap filePixmap(":/images/file.png");
       
  2619 
       
  2620     switch (standardPixmap) {
       
  2621         case SP_DirLinkIcon:
       
  2622         case SP_DirClosedIcon:
       
  2623         case SP_DirIcon:
       
  2624         case SP_DirOpenIcon: {
       
  2625             pixmap = closePixmap;
       
  2626             break;
       
  2627         }
       
  2628         case SP_FileIcon: {
       
  2629             pixmap = filePixmap;
       
  2630             break;
       
  2631         }
       
  2632         case SP_FileDialogBack: {
       
  2633             pixmap = QPixmap(":/images/fileback.png");
       
  2634             break;
       
  2635         }
       
  2636         case SP_FileDialogToParent: {
       
  2637             pixmap = QPixmap(":/images/fileparent.png");
       
  2638             break;
       
  2639         }
       
  2640         case SP_FileDialogNewFolder: {
       
  2641             pixmap = QPixmap(":/images/open24.png");
       
  2642             break;
       
  2643         }
       
  2644         case SP_FileDialogListView: {
       
  2645             pixmap = QPixmap(":/images/filelist.png");
       
  2646             break;
       
  2647         }
       
  2648         case SP_FileDialogDetailedView: {
       
  2649             pixmap = QPixmap(":/images/filedetail.png");
       
  2650             break;
       
  2651         }
       
  2652         case SP_MessageBoxInformation: {
       
  2653             pixmap = QPixmap(":/images/information.png");
       
  2654             break;
       
  2655         }
       
  2656         case SP_MessageBoxWarning: {
       
  2657             pixmap = QPixmap(":/images/warning.png");
       
  2658         }
       
  2659         case SP_MessageBoxCritical: {
       
  2660             pixmap = QPixmap(":/images/critical.png");
       
  2661             break;
       
  2662         }
       
  2663         case SP_MessageBoxQuestion: {
       
  2664             pixmap = QPixmap(":/images/question.png");
       
  2665             break;
       
  2666         }
       
  2667         case SP_TitleBarNormalButton:
       
  2668             pixmap = maximizePixmap;
       
  2669             break;
       
  2670         case SP_TitleBarCloseButton:
       
  2671             pixmap = closePixmap;
       
  2672             break;
       
  2673         default:
       
  2674             ;
       
  2675     }
       
  2676 
       
  2677     return pixmap;
       
  2678 }
       
  2679 
       
  2680 QSize JavaStyle::sizeFromContents(ContentsType type,
       
  2681                                   const QStyleOption *option,
       
  2682                                   const QSize &contentsSize,
       
  2683                                   const QWidget *widget) const
       
  2684 {
       
  2685     switch (type) {
       
  2686         case CT_ComboBox: {
       
  2687             return QSize(contentsSize.width() + 27, contentsSize.height());
       
  2688         }
       
  2689         case CT_Slider: {
       
  2690             const QStyleOptionSlider *slider =
       
  2691                 qstyleoption_cast<const QStyleOptionSlider *>(option);
       
  2692             if (slider->tickPosition == QSlider::TicksBelow) {
       
  2693                 return QSize(contentsSize.width(), contentsSize.height() + 15);
       
  2694             } else {
       
  2695                 return contentsSize;
       
  2696             }
       
  2697         }
       
  2698         case CT_MenuBarItem: {
       
  2699             const QStyleOptionMenuItem *menuItem =
       
  2700                 qstyleoption_cast<const QStyleOptionMenuItem *>(option);
       
  2701             QFontMetrics metrics(menuItem->font);
       
  2702             QRect boundingRect = metrics.boundingRect(menuItem->text);
       
  2703             int width = boundingRect.width() + 14;
       
  2704             int height = boundingRect.height() + 3;
       
  2705             if (height < 20)
       
  2706                 height = 20;
       
  2707 
       
  2708             return QSize(width, height);
       
  2709         }
       
  2710         case CT_MenuItem: {
       
  2711             const QStyleOptionMenuItem *menuItem =
       
  2712                 qstyleoption_cast<const QStyleOptionMenuItem *>(option);
       
  2713             QSize defaultSize =  QWindowsStyle::sizeFromContents(type, option,
       
  2714                 contentsSize, widget);
       
  2715 
       
  2716             if (menuItem->menuItemType == QStyleOptionMenuItem::Separator)
       
  2717                 return defaultSize;
       
  2718 
       
  2719             int width = 30;
       
  2720             int height = 0;
       
  2721 
       
  2722             if (!menuItem->icon.isNull()) {
       
  2723                 width += 20; 
       
  2724                 height += 20;
       
  2725             }
       
  2726             if (!menuItem->text.isEmpty()) {
       
  2727                 QFontMetrics metrics(menuItem->font);
       
  2728                 QString text = menuItem->text;
       
  2729                 text.remove(QLatin1Char('\t'));
       
  2730                 QRect textRect = metrics.boundingRect(text);
       
  2731                 width += textRect.width();
       
  2732                 if (height < textRect.height())
       
  2733                     height += textRect.height();
       
  2734             }
       
  2735             if (menuItem->checkType != QStyleOptionMenuItem::NotCheckable) {
       
  2736                 width += 10;
       
  2737                 if (height < 10)
       
  2738                     height = 10;
       
  2739             }
       
  2740             return QSize(width, height);
       
  2741         }
       
  2742         default:
       
  2743             return QWindowsStyle::sizeFromContents(type, option, contentsSize,
       
  2744                                                    widget);
       
  2745     }
       
  2746 }