diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | ce4a32fe52ef09d8f5ff1dd22c001110902b60a2 (patch) | |
tree | 5ac38a06f3dde268dc7927dc155896926aaf7012 /kstyles/klegacy/klegacystyle.cpp | |
download | tdelibs-ce4a32fe52ef09d8f5ff1dd22c001110902b60a2.tar.gz tdelibs-ce4a32fe52ef09d8f5ff1dd22c001110902b60a2.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kstyles/klegacy/klegacystyle.cpp')
-rw-r--r-- | kstyles/klegacy/klegacystyle.cpp | 3366 |
1 files changed, 3366 insertions, 0 deletions
diff --git a/kstyles/klegacy/klegacystyle.cpp b/kstyles/klegacy/klegacystyle.cpp new file mode 100644 index 000000000..e3796a079 --- /dev/null +++ b/kstyles/klegacy/klegacystyle.cpp @@ -0,0 +1,3366 @@ +/* + + Copyright (c) 2000 KDE Project + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + */ + +#include "klegacystyle.h" +#include "klegacystyle.moc" +#include <klocale.h> +#include <kiconloader.h> + +#define INCLUDE_MENUITEM_DEF +#include <qapplication.h> +#include <qbitmap.h> +#include <qbuttongroup.h> +#include <qcanvas.h> +#include <qcheckbox.h> +#include <qcolor.h> +#include <qcolordialog.h> +#include <qcombobox.h> +#include <qdial.h> +#include <qdialog.h> +#include <qdict.h> +#include <qfile.h> +#include <qfiledialog.h> +#include <qfileinfo.h> +#include <qfont.h> +#include <qfontdialog.h> +#include <qframe.h> +#include <qguardedptr.h> +#include <qgrid.h> +#include <qgroupbox.h> +#include <qhbox.h> +#include <qhbuttongroup.h> +#include <qheader.h> +#include <qhgroupbox.h> +#include <qiconview.h> +#include <qimage.h> +#include <qinputdialog.h> +#include <qintdict.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qlcdnumber.h> +#include <qlineedit.h> +#include <qptrlist.h> +#include <qlistbox.h> +#include <qlistview.h> +#include <qmainwindow.h> +#include <qmenubar.h> +#include <qmenudata.h> +#include <qmessagebox.h> +#include <qmultilineedit.h> +#include <qobjectlist.h> +#include <qpainter.h> +#include <qpixmap.h> +#include <qpixmapcache.h> +#include <qpopupmenu.h> +#include <qprintdialog.h> +#include <qprogressbar.h> +#include <qprogressdialog.h> +#include <qpushbutton.h> +#include <qradiobutton.h> +#include <qregexp.h> +#include <qscrollbar.h> +#include <qscrollview.h> +#include <qsemimodal.h> +#include <qsizegrip.h> +#include <qslider.h> +#include <qspinbox.h> +#include <qsplitter.h> +#include <qstatusbar.h> +#include <qstring.h> +#include <qtabbar.h> +#include <qtabdialog.h> +#include <qtableview.h> +#include <qtabwidget.h> +#include <qtextbrowser.h> +#include <qtextstream.h> +#include <qtextview.h> +#include <qtoolbar.h> +#include <qtoolbutton.h> +#include <qtooltip.h> +#include <qvbox.h> +#include <qvbuttongroup.h> +#include <qvgroupbox.h> +#include <qwidget.h> +#include <qwidgetstack.h> +#include <qwizard.h> +#include <qworkspace.h> + +#include <stdlib.h> +#include <unistd.h> +#include <limits.h> +#include <sys/types.h> + +// forward declaration of classes +class KLegacyBorder; +class KLegacyStyleData; +class KLegacyImageData; +class GtkObject; + +// declaration of hidden functions +typedef void (QStyle::*QDrawMenuBarItemImpl) (QPainter *, int, int, int, int, + QMenuItem *, QColorGroup &, bool, bool); +extern QDrawMenuBarItemImpl qt_set_draw_menu_bar_impl(QDrawMenuBarItemImpl impl); + +// the addresses of the integers are used to place things in the +// style data dict +static int listviewitem_ptr = 0; +static int listboxitem_ptr = 1; +static int menuitem_ptr = 2; +static int separator_ptr = 3; +static int arrow_ptr = 4; +static int whatsthis_ptr = 5; +static int checkmenuitem_ptr = 6; +static int radiomenuitem_ptr = 7; +static int eventbox_ptr = 8; + +// a QImage cache, since we need to resize some images to different sizes, we +// will cache them, to save the overhead of loading the image from disk each +// time it's needed +static const int imageCacheSize = 61; +static QDict<QImage> *imageCache = 0; + + +class KLegacy { +public: + enum Function { Box = 1, FlatBox, Extension, Check, Option, + HLine, VLine, BoxGap, Slider, Tab, Arrow, Handle, FShadow, Focus }; + enum State { Normal = 1, Prelight, Active, Insensitive, Selected }; + enum Shadow { NoShadow = 0, In, Out, EtchedIn, EtchedOut }; + enum GapSide { Left = 1, Right, Top, Bottom }; +}; + + +class KLegacyBorder : public KLegacy { +private: + int l, r, t, b; + + +public: + KLegacyBorder(int ll = 0, int rr = 0, int tt = 0, int bb = 0) + : l(ll), r(rr), t(tt), b(bb) + { } + + KLegacyBorder(const KLegacyBorder &br) + : l(br.l), r(br.r), t(br.t), b(br.b) + { } + + inline int left(void) const + { return l; } + inline int right(void) const + { return r; } + inline int top(void) const + { return t; } + inline int bottom(void) const + { return b; } + + inline void setLeft(int ll) + { l = ll; } + inline void setRight(int rr) + { r = rr; } + inline void setTop(int tt) + { t = tt; } + inline void setBottom(int bb) + { b = bb; } +}; + + +struct KLegacyImageDataKeyField { + Q_INT8 function : 8; + Q_INT8 state : 8; + Q_INT8 shadow : 4; + Q_INT8 orientation : 4; + Q_INT8 arrowDirection : 4; + Q_INT8 gapSide : 4; +}; + + +union KLegacyImageDataKey { + KLegacyImageDataKeyField data; + long cachekey; +}; + + +class KLegacyImageData : public KLegacy { +public: + KLegacyImageDataKey key; + + QString file; + QString detail; + QString overlayFile; + QString gapFile; + QString gapStartFile; + QString gapEndFile; + + KLegacyBorder border; + KLegacyBorder overlayBorder; + KLegacyBorder gapBorder; + KLegacyBorder gapStartBorder; + KLegacyBorder gapEndBorder; + + bool recolorable; + bool stretch; + bool overlayStretch; + + KLegacyImageData() + : recolorable(false), + stretch(false), + overlayStretch(false) + { key.cachekey = 0; } +}; + + +class KLegacyStyleData : public KLegacy { +public: + // name of this style + QString name; + + // font to use + QFont *fn; + + // list of image datas (which tell us how to draw things) + QList<KLegacyImageData> imageList; + + // background, foreground and base colors for the 5 widget + //states that Gtk defines + QColor back[5], fore[5], base[5]; + + // reference count + int ref; + + KLegacyStyleData() + : fn(0), ref(0) + { + // have the imageList delete the items it holds when it's deleted + imageList.setAutoDelete(true); + } +}; + + +class GtkObject : public QObject { +private: + KLegacyStyleData *d; + + friend class KLegacyStylePrivate; + + +public: + GtkObject(GtkObject *parent, const char *name) + : QObject(parent, name) + { d = 0; } + + GtkObject *find(QRegExp &) const; + + QColor backColor(KLegacy::State); + QColor baseColor(KLegacy::State); + QColor foreColor(KLegacy::State); + + QFont *font(); + + inline QString styleName() + { return styleData()->name; } + + KLegacyStyleData *styleData(); + KLegacyImageData *getImageData(KLegacyImageDataKey, + const QString & = QString::null); + + QPixmap *draw(KLegacyImageDataKey, int, int, const QString & = QString::null); + QPixmap *draw(KLegacyImageData *, int, int); +}; + + +static QPixmap *drawImage(QImage *image, int width, int height, + KLegacyBorder border, bool scale) +{ + if ((! image) || (image->isNull()) || (width < 1) || (height < 1)) { + return (QPixmap *) 0; + } + + QPixmap *pixmap = new QPixmap(width, height); + + if (scale) { + if (width < 2) width = 2; + if (height < 2) height = 2; + + int x[3], y[3], w[3], h[3], x2[3], y2[3], w2[3], h2[3]; + + // left + x[0] = x2[0] = 0; + w[0] = (border.left() < 1) ? 1 : border.left(); + + // middle + x[1] = border.left(); + w[1] = image->width() - border.left() - border.right(); + if (w[1] < 1) w[1] = 1; + + // right + x[2] = image->width() - border.right(); + w[2] = (border.right() < 1) ? 1 : border.right(); + if (x[2] < 0) x[2] = 0; + + if ((border.left() + border.right()) > width) { + // left + x2[0] = 0; + w2[0] = (width / 2) + 1; + + // middle + x2[1] = w2[0] - 1; + w2[1] = 1; + + // right + x2[2] = x2[1]; + w2[2] = w2[0]; + } else { + // left + x2[0] = 0; + w2[0] = border.left(); + + // middle + x2[1] = w2[0]; + w2[1] = width - border.left() - border.right() + 1; + + // right + x2[2] = width - border.right(); + w2[2] = border.right(); + } + + // top + y[0] = 0; + h[0] = (border.top() < 1) ? 1 : border.top(); + + // middle + y[1] = border.top(); + h[1] = image->height() - border.top() - border.bottom(); + if (h[1] < 1) h[1] = 1; + + // bottom + y[2] = image->height() - border.bottom(); + h[2] = (border.bottom() < 1) ? 1 : border.bottom(); + if (y[2] < 0) y[2] = 0; + + if ((border.top() + border.bottom()) > height) { + // left + y2[0] = 0; + h2[0] = height / 2; + + // middle + y2[1] = h2[0]; + h2[1] = 1; + + // right + y2[2] = y2[1]; + h2[2] = h2[0]; + } else { + // left + y2[0] = 0; + h2[0] = border.top(); + + // middle + y2[1] = h2[0]; + h2[1] = height - border.top() - border.bottom() + 1; + + // bottom + y2[2] = height - border.bottom(); + h2[2] = border.bottom(); + } + + // draw the image + bool mask = image->hasAlphaBuffer(); + QBitmap bm(width, height); + bm.fill(Qt::color1); + + QImage nimage[3][3]; + int xx = -1, yy = -1; + while (++yy < 3) { + xx = -1; + while (++xx < 3) { + nimage[yy][xx] = image->copy(x[xx], y[yy], w[xx], h[yy]); + + if (nimage[yy][xx].isNull()) continue; + + if ((w[xx] != w2[xx]) || (h[yy] != h2[yy])) + nimage[yy][xx] = nimage[yy][xx].smoothScale(w2[xx], h2[yy]); + + if (nimage[yy][xx].isNull()) continue; + + bitBlt(pixmap, x2[xx], y2[yy], &nimage[yy][xx], + 0, 0, w2[xx], h2[yy], Qt::CopyROP); + + if (mask) { + QImage am = nimage[yy][xx].createAlphaMask(); + bitBlt(&bm, x2[xx], y2[yy], &am, + 0, 0, w2[xx], h2[yy], Qt::CopyROP); + } + } + } + + if (mask) + pixmap->setMask(bm); + } else { + for (int y = 0; y < height; y += image->height()) + for (int x = 0; x < width; x += image->width()) + bitBlt(pixmap, x, y, image, 0, 0, -1, -1, Qt::CopyROP); + + if (image->hasAlphaBuffer()) { + QImage mask = image->createAlphaMask(); + + if (! mask.isNull() && mask.depth() == 1) { + QBitmap bm(width, height); + bm.fill(Qt::color1); + bm = mask; + pixmap->setMask(bm); + } + } + } + + return pixmap; +} + + +// Generate an object tree for all the known Gtk widgets... +// returns a pointer to the bottom of the tree +static GtkObject *initialize(QPtrDict<GtkObject> &dict) { + // + // auto generated stuff from : + // -- + // #!/usr/bin/perl -w + // + // foreach $line ( <STDIN> ) { + // chomp $line; + // $line =~ s/[^\sa-zA-Z0-9]/ /g; + // $line =~ /^(\s*)(\S*)/; + // $prefixlength = length $1; + // $classname = $2; + // $class{$prefixlength} = $classname; + // $prefixlength--; + // while( $prefixlength >= 0 && !defined($class{$prefixlength}) ) { + // $prefixlength--; + // } + // $parent = $class{$prefixlength}; + // $parent = "0" if ( $parent eq $classname ); + // + // # for GtkBin: + // # myGtkBin = new GtkObject( myGtkWidget, "GtkBin" ); + // + // print "GtkObject * my$classname = + // new GtkObject( my$parent, \"$classname\" );\n"; + // } + // -- + + GtkObject * myGtkObject = + new GtkObject( 0, "GtkObject" ); + GtkObject * myGtkWidget = + new GtkObject( myGtkObject, "GtkWidget" ); + GtkObject * myGtkMisc = + new GtkObject( myGtkWidget, "GtkMisc" ); + GtkObject * myGtkLabel = + new GtkObject( myGtkMisc, "GtkLabel" ); + // GtkObject * myGtkAccelLabel = + // new GtkObject( myGtkLabel, "GtkAccelLabel" ); + GtkObject * myGtkTipsQuery = + new GtkObject( myGtkLabel, "GtkTipsQuery" ); + GtkObject * myGtkArrow = + new GtkObject( myGtkMisc, "GtkArrow" ); + // GtkObject * myGtkImage = + // new GtkObject( myGtkMisc, "GtkImage" ); + // GtkObject * myGtkPixmap = + // new GtkObject( myGtkMisc, "GtkPixmap" ); + GtkObject * myGtkContainer = + new GtkObject( myGtkWidget, "GtkContainer" ); + GtkObject * myGtkBin = + new GtkObject( myGtkContainer, "GtkBin" ); + // GtkObject * myGtkAlignment = + // new GtkObject( myGtkBin, "GtkAlignment" ); + GtkObject * myGtkFrame = + new GtkObject( myGtkBin, "GtkFrame" ); + // GtkObject * myGtkAspectFrame = + // new GtkObject( myGtkFrame, "GtkAspectFrame" ); + GtkObject * myGtkButton = + new GtkObject( myGtkBin, "GtkButton" ); + GtkObject * myGtkToggleButton = + new GtkObject( myGtkButton, "GtkToggleButton" ); + GtkObject * myGtkCheckButton = + new GtkObject( myGtkToggleButton, "GtkCheckButton" ); + GtkObject * myGtkRadioButton = + new GtkObject( myGtkCheckButton, "GtkRadioButton" ); + GtkObject * myGtkOptionMenu = + new GtkObject( myGtkButton, "GtkOptionMenu" ); + GtkObject * myGtkItem = + new GtkObject( myGtkBin, "GtkItem" ); + GtkObject * myGtkMenuItem = + new GtkObject( myGtkItem, "GtkMenuItem" ); + GtkObject * myGtkCheckMenuItem = + new GtkObject( myGtkMenuItem, "GtkCheckMenuItem" ); + GtkObject * myGtkRadioMenuItem = + new GtkObject( myGtkCheckMenuItem, "GtkRadioMenuItem" ); + // GtkObject * myGtkTearoffMenuItem = + // new GtkObject( myGtkMenuItem, "GtkTearoffMenuItem" ); + GtkObject * myGtkListItem = + new GtkObject( myGtkItem, "GtkListItem" ); + GtkObject * myGtkTreeItem = + new GtkObject( myGtkItem, "GtkTreeItem" ); + GtkObject * myGtkWindow = + new GtkObject( myGtkBin, "GtkWindow" ); + GtkObject * myGtkColorSelectionDialog = + new GtkObject( myGtkWindow, "GtkColorSelectionDialog" ); + GtkObject * myGtkDialog = + new GtkObject( myGtkWindow, "GtkDialog" ); + GtkObject * myGtkInputDialog = + new GtkObject( myGtkDialog, "GtkInputDialog" ); + // GtkObject * myGtkDrawWindow = + // new GtkObject( myGtkWindow, "GtkDrawWindow" ); + GtkObject * myGtkFileSelection = + new GtkObject( myGtkWindow, "GtkFileSelection" ); + GtkObject * myGtkFontSelectionDialog = + new GtkObject( myGtkWindow, "GtkFontSelectionDialog" ); + // GtkObject * myGtkPlug = + // new GtkObject( myGtkWindow, "GtkPlug" ); + GtkObject * myGtkEventBox = + new GtkObject( myGtkBin, "GtkEventBox" ); + // GtkObject * myGtkHandleBox = + // new GtkObject( myGtkBin, "GtkHandleBox" ); + // GtkObject * myGtkScrolledWindow = + // new GtkObject( myGtkBin, "GtkScrolledWindow" ); + GtkObject * myGtkViewport = + new GtkObject( myGtkBin, "GtkViewport" ); + GtkObject * myGtkBox = + new GtkObject( myGtkContainer, "GtkBox" ); + GtkObject * myGtkButtonBox = + new GtkObject( myGtkBox, "GtkButtonBox" ); + GtkObject * myGtkHButtonBox = + new GtkObject( myGtkButtonBox, "GtkHButtonBox" ); + GtkObject * myGtkVButtonBox = + new GtkObject( myGtkButtonBox, "GtkVButtonBox" ); + GtkObject * myGtkVBox = + new GtkObject( myGtkBox, "GtkVBox" ); + // GtkObject * myGtkColorSelection = + // new GtkObject( myGtkVBox, "GtkColorSelection" ); + // GtkObject * myGtkGammaCurve = + // new GtkObject( myGtkVBox, "GtkGammaCurve" ); + GtkObject * myGtkHBox = + new GtkObject( myGtkBox, "GtkHBox" ); + + + // CHANGED! It seems that the gtk optionmenu and gtk combobox aren't related, + // but in Qt they are the same class... so we have changed gth GtkCombo to inherit + // from GtkOptionMenu (so that Qt comboboxes look like the optionmenus by default) + GtkObject * myGtkCombo = + new GtkObject( myGtkOptionMenu, "GtkCombo" ); + + + GtkObject * myGtkStatusbar = + new GtkObject( myGtkHBox, "GtkStatusbar" ); + GtkObject * myGtkCList = + new GtkObject( myGtkContainer, "GtkCList" ); + GtkObject * myGtkCTree = + new GtkObject( myGtkCList, "GtkCTree" ); + // GtkObject * myGtkFixed = + // new GtkObject( myGtkContainer, "GtkFixed" ); + GtkObject * myGtkNotebook = + new GtkObject( myGtkContainer, "GtkNotebook" ); + // GtkObject * myGtkFontSelection = + // new GtkObject( myGtkNotebook, "GtkFontSelection" ); + GtkObject * myGtkPaned = + new GtkObject( myGtkContainer, "GtkPaned" ); + // GtkObject * myGtkHPaned = + // new GtkObject( myGtkPaned, "GtkHPaned" ); + // GtkObject * myGtkVPaned = + // new GtkObject( myGtkPaned, "GtkVPaned" ); + // GtkObject * myGtkLayout = + // new GtkObject( myGtkContainer, "GtkLayout" ); + // GtkObject * myGtkList = + // new GtkObject( myGtkContainer, "GtkList" ); + GtkObject * myGtkMenuShell = + new GtkObject( myGtkContainer, "GtkMenuShell" ); + GtkObject * myGtkMenuBar = + new GtkObject( myGtkMenuShell, "GtkMenuBar" ); + GtkObject * myGtkMenu = + new GtkObject( myGtkMenuShell, "GtkMenu" ); + // GtkObject * myGtkPacker = + // new GtkObject( myGtkContainer, "GtkPacker" ); + // GtkObject * myGtkSocket = + // new GtkObject( myGtkContainer, "GtkSocket" ); + GtkObject * myGtkTable = + new GtkObject( myGtkContainer, "GtkTable" ); + GtkObject * myGtkToolbar = + new GtkObject( myGtkContainer, "GtkToolbar" ); + // GtkObject * myGtkTree = + // new GtkObject( myGtkContainer, "GtkTree" ); + // GtkObject * myGtkCalendar = + // new GtkObject( myGtkWidget, "GtkCalendar" ); + GtkObject * myGtkDrawingArea = + new GtkObject( myGtkWidget, "GtkDrawingArea"); + // GtkObject * myGtkCurve = + // new GtkObject( myGtkDrawingArea, "GtkCurve" ); + GtkObject * myGtkEditable = + new GtkObject( myGtkWidget, "GtkEditable" ); + GtkObject * myGtkEntry = + new GtkObject( myGtkEditable, "GtkEntry" ); + GtkObject * myGtkSpinButton = + new GtkObject( myGtkEntry, "GtkSpinButton" ); + GtkObject * myGtkText = + new GtkObject( myGtkEditable, "GtkText" ); + GtkObject * myGtkRuler = + new GtkObject( myGtkWidget, "GtkRuler" ); + // GtkObject * myGtkHRuler = + // new GtkObject( myGtkRuler, "GtkHRuler" ); + // GtkObject * myGtkVRuler = + // new GtkObject( myGtkRuler, "GtkVRuler" ); + GtkObject * myGtkRange = + new GtkObject( myGtkWidget, "GtkRange" ); + GtkObject * myGtkScale = + new GtkObject( myGtkRange, "GtkScale" ); + // GtkObject * myGtkHScale = + // new GtkObject( myGtkScale, "GtkHScale" ); + // GtkObject * myGtkVScale = + // new GtkObject( myGtkScale, "GtkVScale" ); + GtkObject * myGtkScrollbar = + new GtkObject( myGtkRange, "GtkScrollbar" ); + // GtkObject * myGtkHScrollbar = + // new GtkObject( myGtkScrollbar, "GtkHScrollbar" ); + // GtkObject * myGtkVScrollbar = + // new GtkObject( myGtkScrollbar, "GtkVScrollbar" ); + GtkObject * myGtkSeparator = + new GtkObject( myGtkWidget, "GtkSeparator" ); + // GtkObject * myGtkHSeparator = + // new GtkObject( myGtkSeparator, "GtkHSeparator" ); + // GtkObject * myGtkVSeparator = + // new GtkObject( myGtkSeparator, "GtkVSeparator" ); + // GtkObject * myGtkPreview = + // new GtkObject( myGtkWidget, "GtkPreview" ); + GtkObject * myGtkProgress = + new GtkObject( myGtkWidget, "GtkProgress" ); + GtkObject * myGtkProgressBar = + new GtkObject( myGtkProgress, "GtkProgressBar" ); + //GtkObject * myGtkData = + // new GtkObject( myGtkObject, "GtkData" ); + // GtkObject * myGtkAdjustment = + // new GtkObject( myGtkData, "GtkAdjustment" ); + // GtkObject * myGtkTooltips = + // new GtkObject( myGtkData, "GtkTooltips" ); + // GtkObject * myGtkItemFactory = + // new GtkObject( myGtkObject, "GtkItemFactory" ); + + // Insert the above Gtk widgets into a dict, using meta data pointers for + // the different widgets in Qt + // + // verify with: + // -- + // egrep "::staticMetaObject\(\)$" **/*.cpp | fmt -1 | grep :: | + // sort | uniq > meta + //-- + + dict.insert(QButton::staticMetaObject(), myGtkButton); + dict.insert(QButtonGroup::staticMetaObject(), myGtkButtonBox); + dict.insert(QCanvas::staticMetaObject(), myGtkDrawingArea); + dict.insert(QCanvasView::staticMetaObject(), myGtkDrawingArea); + dict.insert(QCheckBox::staticMetaObject(), myGtkCheckButton); + dict.insert(QColorDialog::staticMetaObject(), myGtkColorSelectionDialog); + dict.insert(QComboBox::staticMetaObject(), myGtkCombo); + dict.insert(QDial::staticMetaObject(), myGtkWidget); + dict.insert(QDialog::staticMetaObject(), myGtkDialog); + dict.insert(QFileDialog::staticMetaObject(), myGtkFileSelection); + dict.insert(QFontDialog::staticMetaObject(), myGtkFontSelectionDialog); + dict.insert(QFrame::staticMetaObject(), myGtkFrame); + dict.insert(QGrid::staticMetaObject(), myGtkFrame); + dict.insert(QGroupBox::staticMetaObject(), myGtkBox); + dict.insert(QHBox::staticMetaObject(), myGtkHBox); + dict.insert(QHButtonGroup::staticMetaObject(), myGtkHButtonBox); + dict.insert(QHGroupBox::staticMetaObject(), myGtkHBox); + dict.insert(QHeader::staticMetaObject(), myGtkRuler); + dict.insert(QIconView::staticMetaObject(), myGtkCTree); + dict.insert(QInputDialog::staticMetaObject(), myGtkInputDialog); + dict.insert(QLCDNumber::staticMetaObject(), myGtkFrame); + dict.insert(QLabel::staticMetaObject(), myGtkLabel); + dict.insert(QLineEdit::staticMetaObject(), myGtkEntry); + dict.insert(QListBox::staticMetaObject(), myGtkCList); + dict.insert(QListView::staticMetaObject(), myGtkCTree); + dict.insert(QMainWindow::staticMetaObject(), myGtkWindow); + dict.insert(QMenuBar::staticMetaObject(), myGtkMenuBar); + dict.insert(QMessageBox::staticMetaObject(), myGtkDialog); + dict.insert(QMultiLineEdit::staticMetaObject(), myGtkText); + dict.insert(QPopupMenu::staticMetaObject(), myGtkMenu); + dict.insert(QPrintDialog::staticMetaObject(), myGtkDialog); + dict.insert(QProgressBar::staticMetaObject(), myGtkProgressBar); + dict.insert(QProgressDialog::staticMetaObject(), myGtkDialog); + dict.insert(QPushButton::staticMetaObject(), myGtkButton); + dict.insert(QRadioButton::staticMetaObject(), myGtkRadioButton); + dict.insert(QScrollBar::staticMetaObject(), myGtkScrollbar); + dict.insert(QScrollView::staticMetaObject(), myGtkViewport); + dict.insert(QSemiModal::staticMetaObject(), myGtkDialog); + dict.insert(QSizeGrip::staticMetaObject(), myGtkWidget); + dict.insert(QSlider::staticMetaObject(), myGtkScale); + dict.insert(QSpinBox::staticMetaObject(), myGtkSpinButton); + dict.insert(QSplitter::staticMetaObject(), myGtkPaned); + dict.insert(QStatusBar::staticMetaObject(), myGtkStatusbar); + dict.insert(QTabBar::staticMetaObject(), myGtkNotebook); + dict.insert(QTabDialog::staticMetaObject(), myGtkNotebook); + dict.insert(QTabWidget::staticMetaObject(), myGtkNotebook); + dict.insert(QTableView::staticMetaObject(), myGtkTable); + dict.insert(QTextBrowser::staticMetaObject(), myGtkText); + dict.insert(QTextView::staticMetaObject(), myGtkText); + dict.insert(QToolBar::staticMetaObject(), myGtkToolbar); + dict.insert(QToolButton::staticMetaObject(), myGtkButton); + dict.insert(QVBox::staticMetaObject(), myGtkVBox); + dict.insert(QVButtonGroup::staticMetaObject(), myGtkVButtonBox); + dict.insert(QVGroupBox::staticMetaObject(), myGtkVBox); + dict.insert(QWidget::staticMetaObject(), myGtkWidget); + dict.insert(QWidgetStack::staticMetaObject(), myGtkWidget); + dict.insert(QWizard::staticMetaObject(), myGtkWindow); + dict.insert(QWorkspace::staticMetaObject(), myGtkWindow); + + // stuff that we don't have meta data for, but want to know about + dict.insert(&listboxitem_ptr, myGtkListItem); + dict.insert(&listviewitem_ptr, myGtkTreeItem); + dict.insert(&menuitem_ptr, myGtkMenuItem); + dict.insert(&separator_ptr, myGtkSeparator); + dict.insert(&arrow_ptr, myGtkArrow); + dict.insert(&whatsthis_ptr, myGtkTipsQuery); + dict.insert(&checkmenuitem_ptr, myGtkCheckMenuItem); + dict.insert(&radiomenuitem_ptr, myGtkRadioMenuItem); + dict.insert(&eventbox_ptr, myGtkEventBox); + + return myGtkObject; +} + + +KLegacyImageData *GtkObject::getImageData(KLegacyImageDataKey key, const QString &detail) { + KLegacyImageData *imagedata = 0; + + if (styleData()) { + QListIterator<KLegacyImageData> it(styleData()->imageList); + + while ((imagedata = it.current()) != 0) { + ++it; + + if ((((imagedata->key.data.function != 0) && + (imagedata->key.data.function == key.data.function)) || + (imagedata->key.data.function == 0)) && + + (((imagedata->key.data.state != 0) && + (imagedata->key.data.state == key.data.state)) || + (imagedata->key.data.state == 0)) && + + (((imagedata->key.data.shadow != 0) && + (imagedata->key.data.shadow == key.data.shadow)) || + (imagedata->key.data.shadow == 0)) && + + (((imagedata->key.data.orientation != 0) && + (imagedata->key.data.orientation == key.data.orientation)) || + (imagedata->key.data.orientation == 0)) && + + (((imagedata->key.data.arrowDirection != 0) && + (imagedata->key.data.arrowDirection == key.data.arrowDirection)) || + (imagedata->key.data.arrowDirection == 0)) && + + (((imagedata->key.data.gapSide != 0) && + (imagedata->key.data.gapSide == key.data.gapSide)) || + (imagedata->key.data.gapSide == 0)) && + + (((!imagedata->detail.isNull()) && + (detail == imagedata->detail)) || + (imagedata->detail.isNull()))) { + // we have a winner + break; + } + } + } + + if ((! imagedata) && (parent())) { + imagedata = ((GtkObject *) parent())->getImageData(key, detail); + } + + return imagedata; +} + + +KLegacyStyleData *GtkObject::styleData() { + if ((! d) && parent()) { + d = ((GtkObject *) parent())->styleData(); + } + + return d; +} + + +QColor GtkObject::backColor(KLegacy::State s) { + if ((! styleData()->back[s].isValid()) && parent()) { + return ((GtkObject *) parent())->backColor(s); + } + + if (styleData()->back[s].isValid()) + return styleData()->back[s]; + + return white; +} + + +QColor GtkObject::baseColor(KLegacy::State s) { + if ((! styleData()->base[s].isValid()) && parent()) { + return ((GtkObject *) parent())->baseColor(s); + } + + if (styleData()->base[s].isValid()) + return styleData()->base[s]; + + return white; +} + + +QColor GtkObject::foreColor(KLegacy::State s) { + if ((! styleData()->fore[s].isValid()) && parent()) { + return ((GtkObject *) parent())->foreColor(s); + } + + if (styleData()->fore[s].isValid()) + return styleData()->fore[s]; + + return black; +} + + +QFont *GtkObject::font() { + if ((! styleData()->fn) && parent()) { + return ((GtkObject *) parent())->font(); + } + + return styleData()->fn; +} + + +GtkObject *GtkObject::find(QRegExp &r) const { + // if the regular expression matches the name of this widget, return + if (r.match(name()) != -1) { + return (GtkObject *) this; + } + + // regex doesn't match us, and we have no children, return 0 + if (! children()) return 0; + + QObject *o; + GtkObject *obj, *gobj; + + QObjectListIt ot(*children()); + + // search our children to see if any match the regex + while ((o = ot.current()) != 0) { + ++ot; + + // this would be nice if moc could parse this file :/ + // + // if (o->className() != "GtkObject") { + // qDebug("object is not a GtkObject (className = '%s')", + // o->className()); + // continue; + // } + + obj = (GtkObject *) o; + + // use obj->find(r) instead of r.match(obj->name()) so that this child's + // children will be searched as well... this allows us to search the entire + // object tree + if ((gobj = obj->find(r)) != 0) { + // found something! + return (GtkObject *) gobj; + } + } + + // found nothing + return 0; +} + + +QPixmap *GtkObject::draw(KLegacyImageDataKey key, int width, int height, + const QString &detail) +{ + KLegacyImageData *imagedata = getImageData(key, detail); + if (! imagedata) { + return 0; + } + + return draw(imagedata, width, height); +} + + +QPixmap *GtkObject::draw(KLegacyImageData *imagedata, int width, int height) { + QString pixmapKey; + QTextOStream(&pixmapKey) << "$KLegacy_Image_" << styleData()->name << "_" << + className() << "_" << width << "x" << height << "_" << + imagedata->key.cachekey << "_" << (uint) imagedata->recolorable << + (uint) imagedata->stretch << (uint) imagedata->overlayStretch; + + QPixmap *pixmap = QPixmapCache::find(pixmapKey); + if (pixmap) { + return pixmap; + } + + QPixmap *main = 0, *overlay = 0; + + if (! imagedata->file.isNull()) { + QImage *image = imageCache->find(imagedata->file); + bool found = true; + + if (! image) { + image = new QImage(imagedata->file); + + if (! image || image->isNull()) { + found = false; + } else { + imageCache->insert(imagedata->file, image); + } + } + + if (found) { + int w = ((imagedata->stretch) ? width : image->width()), + h = ((imagedata->stretch) ? height : image->height()); + main = drawImage(image, w, h, imagedata->border, imagedata->stretch); + } + } + + if (! imagedata->overlayFile.isNull()) { + QImage *image = imageCache->find(imagedata->overlayFile); + bool found = true; + + if (! image) { + image = new QImage(imagedata->overlayFile); + + if (! image || image->isNull()) { + found = false; + } else { + imageCache->insert(imagedata->overlayFile, image); + } + } + + if (found) { + int w = ((imagedata->overlayStretch) ? width : image->width()), + h = ((imagedata->overlayStretch) ? height : image->height()); + overlay = drawImage(image, w, h, imagedata->overlayBorder, + imagedata->overlayStretch); + } + } + + QSize sz; + if (main) { + sz = sz.expandedTo(main->size()); + } + + if (overlay) { + sz = sz.expandedTo(overlay->size()); + } + + if (sz.isEmpty()) { + return (QPixmap *) 0; + } + + pixmap = new QPixmap(sz); + pixmap->fill(QColor(192,192,176)); + QPainter p(pixmap); + + if (main && (! main->isNull())) { + p.drawTiledPixmap(0, 0, sz.width(), sz.height(), *main); + } + + if (overlay && (! overlay->isNull())) { + QPoint pt((sz.width() - overlay->width()) / 2, + (sz.height() - overlay->height()) / 2); + p.drawPixmap(pt, *overlay); + } + + p.end(); + + if (main) { + if (main->mask() && (! main->mask()->isNull())) { + QBitmap bm(sz); + QPainter m(&bm); + QRect r(0, 0, width, height); + + m.drawTiledPixmap(r, *(main->mask())); + m.end(); + + pixmap->setMask(bm); + } + } else if (overlay) { + if (overlay->mask() && (! overlay->mask()->isNull())) { + QBitmap bm(sz); + QPainter m(&bm); + QRect r((sz.width() - overlay->width()) / 2, + (sz.height() - overlay->height()) / 2, + sz.width(), sz.height()); + m.drawTiledPixmap(r, *(overlay->mask())); + m.end(); + + pixmap->setMask(bm); + } + } + + if (! QPixmapCache::insert(pixmapKey, pixmap)) { + delete pixmap; + pixmap = (QPixmap *) 0; + } + + return pixmap; +} + + +class KLegacyStylePrivate : public KLegacy { +private: + QDict<KLegacyStyleData> styleDict; + QStringList pixmapPath; + QTextStream filestream; + + QFont oldfont; + QPalette oldpalette; + + // pointer to the widget under the pointer + QGuardedPtr<QWidget> lastWidget; + + // current position of the mouse + QPoint mousePos; + bool hovering; + + QPtrDict<GtkObject> gtkDict; + GtkObject *gtktree; + + friend class KLegacyStyle; + + +public: + KLegacyStylePrivate(); + ~KLegacyStylePrivate(); + + // parse the filename passed + bool parse(const QString &filename); + + bool parseClass(); + bool parseEngine(KLegacyStyleData *); + bool parseImage(KLegacyStyleData *); + bool parsePixmapPath(); + bool parseStyle(); +}; + + +KLegacyStylePrivate::KLegacyStylePrivate() + : lastWidget(0), mousePos(-1, -1), hovering(false), gtktree(0) +{ + QPixmapCache::setCacheLimit(8192); + + if (! imageCache) { + imageCache = new QDict<QImage>(imageCacheSize); + CHECK_PTR(imageCache); + + imageCache->setAutoDelete(true); + } + + styleDict.setAutoDelete(true); + + gtktree = initialize(gtkDict); + CHECK_PTR(gtktree); + + if (! gtktree->d) { + gtktree->d = new KLegacyStyleData; + gtktree->d->name = "Default"; + } + + // get the path to this users .gtkrc + QString gtkrcFilename = getenv("HOME"); + gtkrcFilename += "/.gtkrc"; + + QFile gtkrc(gtkrcFilename); + + if (gtkrc.open(IO_ReadOnly)) { + filestream.setDevice(>krc); + + while (! filestream.atEnd()) { + QString next; + filestream >> next; + + if (next.isNull()) continue; + + // skip comments + if (next[0] == '#') { filestream.readLine(); continue; } + + if (next == "class" || next == "widget" || next == "widget_class") { + if (! parseClass()) + qWarning("\"class\" parse error"); + } else if (next == "pixmap_path") { + if (! parsePixmapPath()) + qWarning("\"pixmap_path\" parse error"); + } else if (next == "style") { + if (! parseStyle()) + qWarning("\"style\" parse error"); + } + } + + gtkrc.close(); + } else + qWarning("%s: failed to open", gtkrcFilename.latin1()); +} + + +KLegacyStylePrivate::~KLegacyStylePrivate() { + if (imageCache) { + delete imageCache; + imageCache = 0; + } + + if (gtktree) { + delete gtktree; + gtktree = 0; + } +} + + +bool KLegacyStylePrivate::parseClass() { + if (filestream.atEnd()) return false; + + QString classname, keyword, stylename; + filestream >> classname; + filestream >> keyword; + filestream >> stylename; + + if (classname.isNull() || keyword.isNull() || stylename.isNull() || + keyword != "style" || + classname[0] != '\"' || classname[classname.length() - 1] != '\"' || + stylename[0] != '\"' || stylename[stylename.length() - 1] != '\"') + return false; + + classname = classname.mid(1, classname.length() - 2); + stylename = stylename.mid(1, stylename.length() - 2); + + QRegExp r(classname); + r.setWildcard(true); + GtkObject *obj = gtktree->find(r); + + if (! obj) { + qWarning("unknown object '%s'", classname.latin1()); + return false; + } + + KLegacyStyleData *styledata = styleDict.find(stylename); + + if (! styledata) { + qWarning("no such style '%s' for class '%s' (%p)", stylename.latin1(), + classname.latin1(), styledata); + return false; + } + + obj->d = styledata; + styledata->ref++; + + return true; +} + + +bool KLegacyStylePrivate::parseImage(KLegacyStyleData *styledata) { + if (filestream.atEnd()) { + qWarning("parseImage: premature end of stream"); + return false; + } + + QString next, equals, parameter; + filestream >> next; + + // skip comments + while (next[0] == '#') { + filestream.readLine(); + filestream >> next; + } + + if (next.isNull() || next != "{") { + qWarning("parseImage: expected '{' after 'image'\n" + " in style '%s', after processing %d previous images\n", + styledata->name.latin1(), styledata->imageList.count()); + return false; + } + + KLegacyImageData *imagedata = new KLegacyImageData; + + int paren_count = 1; + while (paren_count) { + filestream >> next; + if (next.isNull()) continue; + + // skip comments + if (next[0] == '#') {filestream.readLine(); continue; } + + if (next == "arrow_direction") { + filestream >> equals; + filestream >> parameter; + + if (equals.isNull() || parameter.isNull() || equals != "=") continue; + + if (parameter == "UP") + imagedata->key.data.arrowDirection = Qt::UpArrow + 1; + else if (parameter == "DOWN") + imagedata->key.data.arrowDirection = Qt::DownArrow + 1; + else if (parameter == "LEFT") + imagedata->key.data.arrowDirection = Qt::LeftArrow + 1; + else if (parameter == "RIGHT") + imagedata->key.data.arrowDirection = Qt::RightArrow + 1; + } else if (next == "border") { + filestream >> equals; + filestream >> parameter; + + if (equals.isNull() || parameter.isNull() || equals != "=" || + parameter != "{") + continue; + QString border =filestream.readLine(); + + int lp, rp, tp, bp, l, r, t, b; + lp = border.find(','); + rp = border.find(',', lp + 1); + tp = border.find(',', rp + 1); + bp = border.find('}', tp + 1); + + l = border.left(lp).toUInt(); + r = border.mid(lp + 1, rp - lp - 1).toUInt(); + t = border.mid(rp + 1, tp - rp - 1).toUInt(); + b = border.mid(tp + 1, bp - tp - 1).toUInt(); + + imagedata->border.setLeft(l); + imagedata->border.setRight(r); + imagedata->border.setTop(t); + imagedata->border.setBottom(b); + } else if (next == "detail") { + filestream >> equals; + filestream >> parameter; + + if (equals.isNull() || parameter.isNull() || equals != "=" || + parameter[0] != '\"' || parameter[parameter.length() - 1] != '\"') + continue; + + parameter = parameter.mid(1, parameter.length() - 2); + imagedata->detail = parameter; + } else if (next == "file") { + filestream >> equals; + filestream >> parameter; + + if (equals.isNull() || parameter.isNull() || equals != "=" || + parameter[0] != '\"' || parameter[parameter.length() - 1] != '\"') { + qWarning("image: file parameter malformed"); + continue; + } + + parameter = parameter.mid(1, parameter.length() - 2); + + QStringList::Iterator it; + for (it = pixmapPath.begin(); it != pixmapPath.end(); ++it) { + QFileInfo fileinfo((*it) + parameter); + + if (fileinfo.exists()) { + imagedata->file = fileinfo.filePath(); + break; + } + } + } else if (next == "function") { + filestream >> equals; + filestream >> parameter; + + if (equals.isNull() || parameter.isNull() || equals != "=") continue; + + if (parameter == "BOX") + imagedata->key.data.function = Box; + else if (parameter == "FLAT_BOX") + imagedata->key.data.function = FlatBox; + else if (parameter == "EXTENSION") + imagedata->key.data.function = Extension; + else if (parameter == "CHECK") + imagedata->key.data.function = Check; + else if (parameter == "OPTION") + imagedata->key.data.function = Option; + else if (parameter == "HLINE") + imagedata->key.data.function = HLine; + else if (parameter == "VLINE") + imagedata->key.data.function = VLine; + else if (parameter == "BOX_GAP") + imagedata->key.data.function = BoxGap; + else if (parameter == "SLIDER") + imagedata->key.data.function = Slider; + else if (parameter == "TAB") + imagedata->key.data.function = Tab; + else if (parameter == "ARROW") + imagedata->key.data.function = Arrow; + else if (parameter == "HANDLE") + imagedata->key.data.function = Handle; + else if (parameter == "SHADOW") + imagedata->key.data.function = FShadow; + else if (parameter == "FOCUS") + imagedata->key.data.function = Focus; + } else if (next == "gap_side" ) { + filestream >> equals; + filestream >> parameter; + + if (equals.isNull() || parameter.isNull() || equals != "=") continue; + + if (parameter == "TOP") + imagedata->key.data.gapSide = KLegacy::Top; + else if (parameter == "BOTTOM") + imagedata->key.data.gapSide = KLegacy::Bottom; + } else if (next == "orientation") { + filestream >> equals; + filestream >> parameter; + + if (equals.isNull() || parameter.isNull() || equals != "=") continue; + + if (parameter == "VERTICAL") + imagedata->key.data.orientation = Qt::Vertical + 1; + else if (parameter == "HORIZONTAL") + imagedata->key.data.orientation = Qt::Horizontal + 1; + } else if (next == "overlay_border") { + filestream >> equals; + filestream >> parameter; + + if (equals.isNull() || parameter.isNull() || equals != "=" || + parameter != "{") + continue; + QString border = filestream.readLine(); + + int lp, rp, tp, bp, l, r, t, b; + lp = border.find(','); + rp = border.find(',', lp + 1); + tp = border.find(',', rp + 1); + bp = border.find('}', tp + 1); + + l = border.left(lp).toUInt(); + r = border.mid(lp + 1, rp - lp - 1).toUInt(); + t = border.mid(rp + 1, tp - rp - 1).toUInt(); + b = border.mid(tp + 1, bp - tp - 1).toUInt(); + + imagedata->overlayBorder.setLeft(l); + imagedata->overlayBorder.setRight(r); + imagedata->overlayBorder.setTop(t); + imagedata->overlayBorder.setBottom(b); + } else if (next == "overlay_file") { + filestream >> equals; + filestream >> parameter; + + if (equals.isNull() || parameter.isNull() || equals != "=" || + parameter[0] != '\"' || parameter[parameter.length() - 1] != '\"') { + qWarning("image: overlay_file parameter malformed"); + continue; + } + + parameter = parameter.mid(1, parameter.length() - 2); + + QStringList::Iterator it; + for (it = pixmapPath.begin(); it != pixmapPath.end(); ++it) { + QFileInfo fileinfo((*it) + parameter); + + if (fileinfo.exists()) { + imagedata->overlayFile = fileinfo.filePath(); + break; + } + } + } else if (next == "overlay_stretch") { + filestream >> equals; + filestream >> parameter; + + if (equals.isNull() || parameter.isNull() || equals != "=") continue; + + if (parameter == "TRUE") + imagedata->overlayStretch = true; + else + imagedata->overlayStretch = false; + } else if (next == "stretch") { + filestream >> equals; + filestream >> parameter; + + if (equals.isNull() || parameter.isNull() || equals != "=") continue; + + if (parameter == "TRUE") + imagedata->stretch = true; + else + imagedata->stretch = false; + } else if (next == "shadow") { + filestream >> equals; + filestream >> parameter; + + if (equals.isNull() || parameter.isNull() || equals != "=") continue; + + if (parameter == "NONE") + imagedata->key.data.shadow = NoShadow; + else if (parameter == "IN") + imagedata->key.data.shadow = In; + else if (parameter == "OUT") + imagedata->key.data.shadow = Out; + else if (parameter == "ETCHED_IN") + imagedata->key.data.shadow = EtchedIn; + else if (parameter == "ETCHED_OUT") + imagedata->key.data.shadow = EtchedOut; + } else if (next == "state") { + filestream >> equals; + filestream >> parameter; + + if (equals.isNull() || parameter.isNull() || equals != "=") continue; + + if (parameter == "NORMAL") + imagedata->key.data.state = Normal; + else if (parameter == "PRELIGHT") + imagedata->key.data.state = Prelight; + else if (parameter == "ACTIVE") + imagedata->key.data.state = Active; + else if (parameter == "INSENSITIVE") + imagedata->key.data.state = Insensitive; + else if (parameter == "SELECTED") + imagedata->key.data.state = Selected; + } else if (next == "{") paren_count++; + else if (next == "}") paren_count--; + } + + styledata->imageList.append(imagedata); + + return true; +} + + +bool KLegacyStylePrivate::parseEngine(KLegacyStyleData *styledata) { + if (filestream.atEnd()) return false; + + QString enginename, paren; + filestream >> enginename; + filestream >> paren; + + if (enginename.isNull() || paren.isNull() || + enginename[0] != '\"' || enginename[enginename.length() - 1] != '\"' || + paren != "{") { + return false; + } + + QString next; + int paren_count = 1; + while (paren_count) { + filestream >> next; + + // skip comments + if (next[0] == '#') { + filestream.readLine(); + continue; + } + + if (next == "image") { + if (! parseImage(styledata)) { + qWarning("image parse error"); + } + } else if (next == "{") { + paren_count++; + } else if (next == "}") { + paren_count--; + } + } + + return true; +} + + +bool KLegacyStylePrivate::parsePixmapPath() { + if (filestream.atEnd()) { + return false; + } + + QString next; + filestream >> next; + + if (next.isNull() || next[0] != '\"' || next[next.length() - 1] != '\"') { + return false; + } + + next = next.mid(1, next.length() - 2); + + int start = 0, end = next.find(":"); + while (end != -1) { + QString path(next.mid(start, end - start)); + + if (path[path.length() - 1] != '/') { + path += '/'; + } + + QFileInfo fileinfo(path); + if (fileinfo.exists() && fileinfo.isDir()) { + pixmapPath.append(path); + } + + start = end + 1; + end = next.find(":", start); + } + + // get the straggler + end = next.length(); + QString path(next.mid(start, end - start)); + + if (path[path.length() - 1] != '/') { + path += '/'; + } + + QFileInfo fileinfo(path); + if (fileinfo.exists() && fileinfo.isDir()) { + pixmapPath.append(path); + } + + return true; +} + + +bool KLegacyStylePrivate::parseStyle() { + if (filestream.atEnd()) return false; + + QString stylename, paren; + filestream >> stylename; + filestream >> paren; + + if (stylename.isNull() || paren.isNull() || + stylename[0] != '\"' || stylename[stylename.length() - 1] != '\"') + return false; + + stylename = stylename.mid(1, stylename.length() - 2); + + if (paren == "=") { + QString newstylename; + filestream >> newstylename; + + if (newstylename.isNull() || + newstylename[0] != '\"' || newstylename[newstylename.length() - 1] != '\"') + return false; + + newstylename = newstylename.mid(1, newstylename.length() - 2); + + KLegacyStyleData *styledata = styleDict.find(stylename); + + if (! styledata) return false; + + KLegacyStyleData *newstyledata = new KLegacyStyleData(*styledata); + newstyledata->name = newstylename; + styleDict.insert(newstylename, newstyledata); + + return true; + } else if (paren != "{") { + qWarning("parseStyle: expected '{' while parsing style %s", + stylename.latin1()); + return false; + } + + KLegacyStyleData *styledata = new KLegacyStyleData; + styledata->name = stylename; + + QString next, parameter; + int paren_count = 1; + while (paren_count) { + filestream >> next; + + // skip comments + if (next[0] == '#') { + filestream.readLine(); + continue; + } + + if (next.left(5) == "base[") { + int l = next.find('['), r = next.find(']'), state; + + if (l < 1 || r < 1 || r < l) continue; + + QString mode = next.mid(l + 1, r - l - 1); + if (mode == "ACTIVE") + state = Active; + else if (mode == "NORMAL") + state = Normal; + else if (mode == "INSENSITIVE") + state = Insensitive; + else if (mode == "PRELIGHT") + state = Prelight; + else if (mode == "SELECTED") + state = Selected; + + filestream >> next; + filestream >> parameter; + + if (next.isNull() || parameter.isNull() || next != "=") continue; + + if (parameter[0] == '\"') { // assume color of the form "#rrggbb" + QString colorname = parameter.mid(1, parameter.length() - 2); + if (colorname.isNull()) continue; + + styledata->base[state].setNamedColor(colorname); + } else if (parameter == "{") { // assume color of the form { ri, gi, bi } + QString color =filestream.readLine(); + + int rp, gp, bp; + float ri, gi, bi; + + rp = color.find(','); + gp = color.find(',', rp + 1); + bp = color.find('}', gp + 1); + + ri = color.left(rp).toFloat(); + gi = color.mid(rp + 1, gp - rp - 1).toFloat(); + bi = color.mid(gp + 1, bp - gp - 1).toFloat(); + + int red = (int) (255 * ri); + int green = (int) (255 * gi); + int blue = (int) (255 * bi); + styledata->base[state].setRgb(red, green, blue); + } + } else if (next.left(3) == "bg[") { + int l = next.find('['), r = next.find(']'), state; + + if (l < 1 || r < 1 || r < l) continue; + + QString mode = next.mid(l + 1, r - l - 1); + if (mode == "ACTIVE") + state = Active; + else if (mode == "NORMAL") + state = Normal; + else if (mode == "INSENSITIVE") + state = Insensitive; + else if (mode == "PRELIGHT") + state = Prelight; + else if (mode == "SELECTED") + state = Selected; + + filestream >> next; + filestream >> parameter; + + if (next.isNull() || parameter.isNull() || next != "=") continue; + + if (parameter[0] == '\"') { // assume color of the form "#rrggbb" + QString colorname = parameter.mid(1, parameter.length() - 2); + if (colorname.isNull()) continue; + + styledata->back[state].setNamedColor(colorname); + } else if (parameter == "{") { // assume color of the form { ri, gi, bi } + QString color =filestream.readLine(); + + int rp, gp, bp; + float ri, gi, bi; + + rp = color.find(','); + gp = color.find(',', rp + 1); + bp = color.find('}', gp + 1); + + ri = color.left(rp).toFloat(); + gi = color.mid(rp + 1, gp - rp - 1).toFloat(); + bi = color.mid(gp + 1, bp - gp - 1).toFloat(); + + int red = (int) (255 * ri); + int green = (int) (255 * gi); + int blue = (int) (255 * bi); + styledata->back[state].setRgb(red, green, blue); + } + } else if (next == "engine") { + if (! parseEngine(styledata)) + fprintf(stderr, "engine parse error\n"); + } else if (next.left(3) == "fg[") { + int l = next.find('['), r = next.find(']'), state; + + if (l < 1 || r < 1 || r < l) continue; + + QString mode = next.mid(l + 1, r - l - 1); + if (mode == "ACTIVE") + state = Active; + else if (mode == "NORMAL") + state = Normal; + else if (mode == "INSENSITIVE") + state = Insensitive; + else if (mode == "PRELIGHT") + state = Prelight; + else if (mode == "SELECTED") + state = Selected; + + filestream >> next; + filestream >> parameter; + + if (next.isNull() || parameter.isNull() || next != "=") continue; + + if (parameter[0] == '\"') { // assume color of the form "#rrggbb" + QString colorname = parameter.mid(1, parameter.length() - 2); + if (colorname.isNull()) continue; + + styledata->fore[state].setNamedColor(colorname); + } else if (parameter == "{") { // assume color of the form { ri, gi, bi } + QString color = filestream.readLine(); + + int rp, gp, bp; + float ri, gi, bi; + + rp = color.find(','); + gp = color.find(',', rp + 1); + bp = color.find('}', gp + 1); + + ri = color.left(rp).toFloat(); + gi = color.mid(rp + 1, gp - rp - 1).toFloat(); + bi = color.mid(gp + 1, bp - gp - 1).toFloat(); + + int red = (int) (255 * ri); + int green = (int) (255 * gi); + int blue = (int) (255 * bi); + styledata->fore[state].setRgb(red, green, blue); + } + } else if (next == "font") { + filestream >> next; + filestream >> parameter; + + if (next.isNull() || parameter.isNull() || next != "=" || + parameter[0] != '\"' || parameter[parameter.length() - 1] != '\"') { + qWarning("font parameter malformed '%s'", parameter.latin1()); + continue; + } + + parameter = parameter.mid(1, parameter.length() - 2); + + if (! styledata->fn) { + styledata->fn = new QFont; + } + + styledata->fn->setRawName(parameter); + } else if (next == "{") { + paren_count++; + } else if (next == "}") { + paren_count--; + } + } + + styleDict.insert(styledata->name, styledata); + + return true; +} + + +KLegacyStyle::KLegacyStyle(void) : KStyle() { + setButtonDefaultIndicatorWidth(6); + setScrollBarExtent(15, 15); + setButtonMargin(3); + setSliderThickness(15); + + priv = new KLegacyStylePrivate; +} + + +KLegacyStyle::~KLegacyStyle(void) { + delete priv; +} + + +int KLegacyStyle::defaultFrameWidth() const { + return 2; +} + + +void KLegacyStyle::polish(QApplication *app) { + priv->oldfont = app->font(); + priv->oldpalette = app->palette(); + + GtkObject *gobj = priv->gtkDict.find(QMainWindow::staticMetaObject()); + + if (gobj) { + if (gobj->font()) { + app->setFont(*gobj->font(), true); + } + + QPalette pal = app->palette(); + QBrush brush; + + // background + brush = pal.brush(QPalette::Active, QColorGroup::Background); + brush.setColor(gobj->backColor(KLegacy::Active)); + pal.setBrush(QPalette::Active, QColorGroup::Background, brush); + + brush = pal.brush(QPalette::Inactive, QColorGroup::Background); + brush.setColor(gobj->backColor(KLegacy::Normal)); + pal.setBrush(QPalette::Inactive, QColorGroup::Background, brush); + + brush = pal.brush(QPalette::Disabled, QColorGroup::Background); + brush.setColor(gobj->backColor(KLegacy::Insensitive)); + pal.setBrush(QPalette::Disabled, QColorGroup::Background, brush); + + // foreground + brush = pal.brush(QPalette::Active, QColorGroup::Foreground); + brush.setColor(gobj->foreColor(KLegacy::Active)); + pal.setBrush(QPalette::Active, QColorGroup::Foreground, brush); + + brush = pal.brush(QPalette::Inactive, QColorGroup::Foreground); + brush.setColor(gobj->foreColor(KLegacy::Normal)); + pal.setBrush(QPalette::Inactive, QColorGroup::Foreground, brush); + + brush = pal.brush(QPalette::Disabled, QColorGroup::Foreground); + brush.setColor(gobj->foreColor(KLegacy::Insensitive)); + pal.setBrush(QPalette::Disabled, QColorGroup::Foreground, brush); + + // base + brush = pal.brush(QPalette::Active, QColorGroup::Base); + brush.setColor(gobj->baseColor(KLegacy::Normal)); + pal.setBrush(QPalette::Active, QColorGroup::Base, brush); + + brush = pal.brush(QPalette::Inactive, QColorGroup::Base); + brush.setColor(gobj->baseColor(KLegacy::Normal)); + pal.setBrush(QPalette::Inactive, QColorGroup::Base, brush); + + brush = pal.brush(QPalette::Disabled, QColorGroup::Base); + brush.setColor(gobj->baseColor(KLegacy::Normal)); + pal.setBrush(QPalette::Disabled, QColorGroup::Base, brush); + + // button + brush = pal.brush(QPalette::Active, QColorGroup::Button); + brush.setColor(gobj->backColor(KLegacy::Active)); + pal.setBrush(QPalette::Active, QColorGroup::Button, brush); + + brush = pal.brush(QPalette::Normal, QColorGroup::Button); + brush.setColor(gobj->backColor(KLegacy::Normal)); + pal.setBrush(QPalette::Normal, QColorGroup::Button, brush); + + brush = pal.brush(QPalette::Disabled, QColorGroup::Button); + brush.setColor(gobj->backColor(KLegacy::Insensitive)); + pal.setBrush(QPalette::Disabled, QColorGroup::Button, brush); + + // text + brush = pal.brush(QPalette::Active, QColorGroup::Text); + brush.setColor(gobj->foreColor(KLegacy::Active)); + pal.setBrush(QPalette::Active, QColorGroup::Text, brush); + + brush = pal.brush(QPalette::Inactive, QColorGroup::Text); + brush.setColor(gobj->foreColor(KLegacy::Normal)); + pal.setBrush(QPalette::Inactive, QColorGroup::Text, brush); + + brush = pal.brush(QPalette::Disabled, QColorGroup::Text); + brush.setColor(gobj->foreColor(KLegacy::Insensitive)); + pal.setBrush(QPalette::Disabled, QColorGroup::Text, brush); + + // highlight + brush = pal.brush(QPalette::Active, QColorGroup::Highlight); + brush.setColor(gobj->backColor(KLegacy::Selected)); + pal.setBrush(QPalette::Active, QColorGroup::Highlight, brush); + + brush = pal.brush(QPalette::Active, QColorGroup::Highlight); + brush.setColor(gobj->backColor(KLegacy::Selected)); + pal.setBrush(QPalette::Active, QColorGroup::Highlight, brush); + + brush = pal.brush(QPalette::Active, QColorGroup::Highlight); + brush.setColor(gobj->backColor(KLegacy::Selected)); + pal.setBrush(QPalette::Active, QColorGroup::Highlight, brush); + + // highlight text + brush = pal.brush(QPalette::Active, QColorGroup::HighlightedText); + brush.setColor(gobj->foreColor(KLegacy::Selected)); + pal.setBrush(QPalette::Active, QColorGroup::HighlightedText, brush); + + brush = pal.brush(QPalette::Active, QColorGroup::HighlightedText); + brush.setColor(gobj->foreColor(KLegacy::Active)); + pal.setBrush(QPalette::Active, QColorGroup::HighlightedText, brush); + + brush = pal.brush(QPalette::Active, QColorGroup::HighlightedText); + brush.setColor(gobj->foreColor(KLegacy::Active)); + pal.setBrush(QPalette::Active, QColorGroup::HighlightedText, brush); + + app->setPalette(pal, true); + } + + qt_set_draw_menu_bar_impl((QDrawMenuBarItemImpl) &KLegacyStyle::drawMenuBarItem); + + KStyle::polish(app); +} + + +void KLegacyStyle::polish(QWidget *widget) { + if (qstrcmp(widget->name(), "qt_viewport") == 0 || + widget->testWFlags(WType_Popup) || + widget->inherits("KDesktop")) + return; + + if (widget->backgroundMode() == QWidget::PaletteBackground || + widget->backgroundMode() == QWidget::PaletteButton && + (! widget->ownPalette())) + widget->setBackgroundMode(QWidget::X11ParentRelative); + + QMetaObject *metaobject = 0; + QString detail; + KLegacyImageDataKey key; + key.cachekey = 0; + + bool eventFilter = false; + bool mouseTrack = false; + bool immediateRender = false; + bool bgPixmap = false; + + if (widget->inherits("QButton")) { + metaobject = QButton::staticMetaObject(); + eventFilter = true; + } + + if (widget->inherits("QComboBox")) { + metaobject = QComboBox::staticMetaObject(); + eventFilter = true; + } + + if (widget->inherits("QScrollBar")) { + metaobject = QScrollBar::staticMetaObject(); + eventFilter = true; + mouseTrack = true; + } + + if (widget->inherits("QMenuBar")) { + eventFilter = true; + immediateRender = true; + + metaobject = QMenuBar::staticMetaObject(); + + detail = "menubar"; + key.data.function = KLegacy::Box; + key.data.shadow = KLegacy::Out; + key.data.state = KLegacy::Normal; + + ((QMenuBar *) widget)->setFrameShape(QFrame::StyledPanel); + ((QMenuBar *) widget)->setLineWidth(0); + widget->setBackgroundMode(QWidget::PaletteBackground); + } + + if (widget->inherits("QToolBar")) { + metaobject = QToolBar::staticMetaObject(); + + eventFilter = true; + immediateRender = true; + + detail = "menubar"; + key.data.function = KLegacy::Box; + key.data.shadow = KLegacy::Out; + key.data.state = KLegacy::Normal; + + widget->setBackgroundMode(QWidget::PaletteBackground); + } + + if (widget->inherits("QLineEdit")) { + metaobject = QLineEdit::staticMetaObject(); + + eventFilter = true; + immediateRender = true; + + detail = "entry_bg"; + key.data.function = KLegacy::FlatBox; + key.data.shadow = KLegacy::NoShadow; + key.data.state = (widget->isEnabled()) ? KLegacy::Normal : KLegacy::Insensitive; + + widget->setBackgroundMode(QWidget::PaletteBase); + } + + if (widget->isTopLevel() || widget->inherits("QWorkspaceChild")) { + immediateRender = true; + + bgPixmap = true; + metaobject = QMainWindow::staticMetaObject(); + key.cachekey = 0; + key.data.function = KLegacy::FlatBox; + detail = "base"; + } + + if (widget->inherits("QPopupMenu")) { + qDebug("polishing popup '%s'", widget->className()); + metaobject = QPopupMenu::staticMetaObject(); + widget->setBackgroundMode(QWidget::PaletteBackground); + } + + GtkObject *gobj = gobj = priv->gtkDict.find(((metaobject) ? metaobject : + widget->metaObject())); + + if (gobj) { + if (gobj->font() && (*gobj->font() != QApplication::font())) + widget->setFont(*gobj->font()); + + if (immediateRender) { + QPixmap *pix = gobj->draw(key, widget->width(), widget->height(), detail); + + if (pix && ! pix->isNull()) { + if (! bgPixmap) { + QPalette pal = widget->palette(); + QBrush brush; + + // base + // active + brush = pal.brush(QPalette::Active, + QColorGroup::Base); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Active, + QColorGroup::Base, brush); + + // inactive + brush = pal.brush(QPalette::Inactive, + QColorGroup::Base); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Inactive, + QColorGroup::Base, brush); + + // disabled + brush = pal.brush(QPalette::Disabled, + QColorGroup::Base); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Disabled, + QColorGroup::Base, brush); + + // background - button + // active + brush = pal.brush(QPalette::Active, + QColorGroup::Background); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Active, + QColorGroup::Background, brush); + + brush = pal.brush(QPalette::Active, + QColorGroup::Button); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Active, + QColorGroup::Button, brush); + + // inactive + brush = pal.brush(QPalette::Inactive, + QColorGroup::Background); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Inactive, + QColorGroup::Background, brush); + + brush = pal.brush(QPalette::Inactive, + QColorGroup::Button); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Inactive, + QColorGroup::Button, brush); + + // disabled + brush = pal.brush(QPalette::Disabled, + QColorGroup::Background); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Disabled, + QColorGroup::Background, brush); + + brush = pal.brush(QPalette::Disabled, + QColorGroup::Button); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Disabled, + QColorGroup::Button, brush); + + widget->setPalette(pal); + } else + widget->setBackgroundPixmap(*pix); + } + } + } + + if (eventFilter) { + widget->installEventFilter(this); + } + + if (mouseTrack) { + widget->setMouseTracking(mouseTrack); + } + + KStyle::polish(widget); +} + + +void KLegacyStyle::polishPopupMenu(QPopupMenu *popup) { + KStyle::polishPopupMenu(popup); + + popup->setMouseTracking(true); + popup->setCheckable(true); + + popup->installEventFilter(this); +} + + +void KLegacyStyle::unPolish(QWidget *widget) { + if (widget->inherits("KDesktop")) + return; + + widget->setBackgroundOrigin(QWidget::WidgetOrigin); + widget->setBackgroundPixmap(QPixmap()); + widget->removeEventFilter(this); + widget->unsetPalette(); + widget->setAutoMask(false); + KStyle::unPolish(widget); +} + + +void KLegacyStyle::unPolish(QApplication *app) { + app->setFont(priv->oldfont, true); + app->setPalette(priv->oldpalette, true); + + qt_set_draw_menu_bar_impl(0); + + KStyle::unPolish(app); +} + + +void KLegacyStyle::drawKMenuItem(QPainter *p, int x, int y, int w, int h, const QColorGroup &g, + bool active, QMenuItem *mi, QBrush *) +{ + drawMenuBarItem(p, x, y, w, h, mi, (QColorGroup &) g, + (mi) ? mi->isEnabled() : false, active); +} + + +void KLegacyStyle::drawMenuBarItem(QPainter *p, int x, int y, int w, int h, QMenuItem *mi, + QColorGroup &g, bool enabled, bool active) +{ + if (enabled && active) { + GtkObject *gobj = priv->gtkDict.find(&menuitem_ptr); + + if (gobj) { + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Box; + key.data.state = KLegacy::Prelight; + key.data.shadow = KLegacy::Out; + + QPixmap *pix = gobj->draw(key, w, h, "menuitem"); + + if (pix && ! pix->isNull()) + p->drawPixmap(x, y, *pix); + } + } + + drawItem(p, x, y, w, h, AlignCenter|ShowPrefix|DontClip|SingleLine, + g, enabled, mi->pixmap(), mi->text(), -1, &g.buttonText()); +} + + +void KLegacyStyle::drawButton(QPainter *p, int x, int y , int w, int h, + const QColorGroup &g, bool sunken, const QBrush *fill) +{ + drawBevelButton(p, x, y, w, h, g, sunken, fill); +} + + +void KLegacyStyle::drawBevelButton(QPainter *p, int x, int y, int w, int h, + const QColorGroup & g, bool sunken, + const QBrush *fill) +{ + GtkObject *gobj = priv->gtkDict.find(QButton::staticMetaObject()); + + if (! gobj) { + KStyle::drawBevelButton(p, x, y, w, h, g, sunken, fill); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Box; + key.data.shadow = (sunken) ? KLegacy::In : KLegacy::Out; + key.data.state = (sunken) ? KLegacy::Active : KLegacy::Normal; + + QPixmap *pix = gobj->draw(key, w, h, "button"); + + if (pix && (! pix->isNull())) + p->drawPixmap(x, y, *pix); + else + KStyle::drawBevelButton(p, x, y, w, h, g, sunken, fill); +} + + +void KLegacyStyle::drawPushButton(QPushButton *btn, QPainter *p) { + GtkObject *gobj = priv->gtkDict.find(QPushButton::staticMetaObject()); + + if (! gobj) { + KStyle::drawPushButton(btn, p); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Box; + + QColorGroup g = btn->colorGroup(); + QBrush fill = g.brush(QColorGroup::Button); + int x1, y1, x2, y2; + btn->rect().coords(&x1, &y1, &x2, &y2); + + if (btn->isDefault()) { + // draw default button + key.data.state = (btn->isEnabled()) ? KLegacy::Normal : KLegacy::Insensitive; + key.data.shadow = KLegacy::In; + + QPixmap *pix = gobj->draw(key, x2 -x1 + 1, y2 - y1 + 1, "buttondefault"); + + if (! pix) + pix = gobj->draw(key, x2 - x1 + 1, y2 - y1 + 1, "button"); + + if (pix) + p->drawPixmap(x1, y1, *pix); + else + KStyle::drawBevelButton(p, x1, y1, x2 - x1 + 1, y2 - y1 + 1, + g, true, &fill); + } + + int diw = buttonDefaultIndicatorWidth(); + if (btn->isDefault() || btn->autoDefault()) { + x1 += diw; + y1 += diw; + x2 -= diw; + y2 -= diw; + } + + if (btn->isOn() || btn->isDown()) { + key.data.state = KLegacy::Active; + key.data.shadow = KLegacy::In; + } else { + key.data.state = ((btn->isEnabled()) ? + ((static_cast<QWidget *>( btn ) == priv->lastWidget) ? KLegacy::Prelight : KLegacy::Normal) : + KLegacy::Insensitive); + key.data.shadow = ((btn->isOn() || btn->isDown()) ? + KLegacy::In : KLegacy::Out); + } + + QPixmap *pix = gobj->draw(key, x2 - x1 + 1, y2 - y1 + 1, "button"); + + if (pix && ! pix->isNull()) + p->drawPixmap(x1, y1, *pix); + else { + KStyle::drawBevelButton(p, x1, y1, x2 - x1 + 1, y2 - y1 + 1, + g, btn->isOn() || btn->isDown(), &fill); + } +} + + +void KLegacyStyle::drawIndicator(QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, int state, + bool down, bool enabled) +{ + GtkObject *gobj = priv->gtkDict.find(QCheckBox::staticMetaObject()); + + if (! gobj) { + KStyle::drawIndicator(p, x, y, w, h, g, state, down, enabled); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Check; + key.data.state = KLegacy::Normal; + key.data.shadow = ((state != QButton::Off) || down) ? KLegacy::In : KLegacy::Out; + + QPixmap *pix = gobj->draw(key, w, h, "checkbutton"); + + if (pix && (! pix->isNull())) + p->drawPixmap(x, y, *pix); + else + KStyle::drawIndicator(p, x, y, w, h, g, state, down, enabled); +} + + +void KLegacyStyle::drawIndicatorMask(QPainter *p, int x, int y, int w, int h, int state) { + GtkObject *gobj = priv->gtkDict.find(QCheckBox::staticMetaObject()); + + if (! gobj) { + KStyle::drawIndicatorMask(p, x, y, w, h, state); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Check; + key.data.state = KLegacy::Normal; + key.data.shadow = (state != QButton::Off) ? KLegacy::In : KLegacy::Out; + + QPixmap *pix = gobj->draw(key, w, h, "checkbutton"); + + if (pix && pix->mask() && ! pix->mask()->isNull()) + p->drawPixmap(x, y, *(pix->mask())); + else + KStyle::drawIndicatorMask(p, x, y, w, h, state); +} + + +QSize KLegacyStyle::indicatorSize(void) const { + GtkObject *gobj = priv->gtkDict.find(QCheckBox::staticMetaObject()); + + if (! gobj) return KStyle::indicatorSize(); + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Check; + key.data.shadow = KLegacy::Out; + KLegacyImageData *id = gobj->getImageData(key, "checkbutton"); + + if (! id) return KStyle::indicatorSize(); + + QString filename; + if (! id->file.isNull()) + filename = id->file; + else if (! id->overlayFile.isNull()) + filename = id->overlayFile; + else + return KStyle::indicatorSize(); + + QImage *image = imageCache->find(filename); + if (! image) { + image = new QImage(filename); + + if (! image) return KStyle::indicatorSize(); + + imageCache->insert(filename, image); + } + + return QSize(image->width(), image->height()); +} + + +void KLegacyStyle::drawExclusiveIndicator(QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool on, + bool down, bool enabled) +{ + GtkObject *gobj = priv->gtkDict.find(QRadioButton::staticMetaObject()); + + if (! gobj) { + drawExclusiveIndicator(p, x, y, w, h, g, on, down, enabled); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Option; + key.data.state = KLegacy::Normal; + key.data.shadow = (on || down) ? KLegacy::In : KLegacy::Out; + + QPixmap *pix = gobj->draw(key, w, h, "radiobutton"); + + if (pix && (! pix->isNull())) + p->drawPixmap(x, y, *pix); + else + KStyle::drawExclusiveIndicator(p, x, y, w, h, g, down, enabled); +} + + +void KLegacyStyle::drawExclusiveIndicatorMask(QPainter *p, int x, int y, int w, int h, + bool on) +{ + GtkObject *gobj = priv->gtkDict.find(QRadioButton::staticMetaObject()); + + if (! gobj) { + KStyle::drawExclusiveIndicatorMask(p, x, y, w, h, on); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Option; + key.data.state = KLegacy::Normal; + key.data.shadow = (on) ? KLegacy::In : KLegacy::Out; + + QPixmap *pix = gobj->draw(key, w, h, "radiobutton"); + + if (pix && pix->mask() && ! pix->mask()->isNull()) + p->drawPixmap(x, y, *(pix->mask())); + else + KStyle::drawExclusiveIndicatorMask(p, x, y, w, h, on); +} + + +QSize KLegacyStyle::exclusiveIndicatorSize(void) const { + GtkObject *gobj = priv->gtkDict.find(QRadioButton::staticMetaObject()); + + if (! gobj) { + return KStyle::indicatorSize(); + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Option; + key.data.shadow = KLegacy::Out; + KLegacyImageData *id = gobj->getImageData(key, "radiobutton"); + + if (! id) return KStyle::indicatorSize(); + + QString filename; + if (! id->file.isNull()) { + filename = id->file; + } else if (! id->overlayFile.isNull()) { + filename = id->overlayFile; + } else { + return KStyle::indicatorSize(); + } + + QImage *image = imageCache->find(filename); + if (! image) { + image = new QImage(filename); + + if (! image) { + return KStyle::indicatorSize(); + } + + imageCache->insert(filename, image); + } + + return QSize(image->width(), image->height()); +} + + +void KLegacyStyle::drawPopupMenuItem(QPainter *p, bool checkable, int maxpmw, int tab, + QMenuItem *mi, const QPalette &pal, bool act, + bool enabled, int x, int y, int w, int h) +{ + const QColorGroup & g = pal.active(); + QColorGroup itemg = (! enabled) ? pal.disabled() : pal.active(); + + if (checkable) + maxpmw = QMAX(maxpmw, 15); + + int checkcol = maxpmw; + + if (mi && mi->isSeparator()) { + p->setPen( g.dark() ); + p->drawLine( x, y, x+w, y ); + p->setPen( g.light() ); + p->drawLine( x, y+1, x+w, y+1 ); + return; + } + + if ( act && enabled ) { + GtkObject *gobj = priv->gtkDict.find(&menuitem_ptr); + + if (gobj) { + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Box; + key.data.state = KLegacy::Prelight; + key.data.shadow = KLegacy::Out; + + QPixmap *pix = gobj->draw(key, w, h, "menuitem"); + + if (pix && ! pix->isNull()) + p->drawPixmap(x, y, *pix); + } + } else + p->fillRect(x, y, w, h, g.brush( QColorGroup::Button )); + + if ( !mi ) + return; + + if ( mi->isChecked() ) { + if ( mi->iconSet() ) { + qDrawShadePanel( p, x+2, y+2, checkcol, h-2*2, + g, true, 1, &g.brush( QColorGroup::Midlight ) ); + } + } else if ( !act ) { + p->fillRect(x+2, y+2, checkcol, h-2*2, + g.brush( QColorGroup::Button )); + } + + if ( mi->iconSet() ) { // draw iconset + QIconSet::Mode mode = (enabled) ? QIconSet::Normal : QIconSet::Disabled; + + if (act && enabled) + mode = QIconSet::Active; + + QPixmap pixmap = mi->iconSet()->pixmap(QIconSet::Small, mode); + + int pixw = pixmap.width(); + int pixh = pixmap.height(); + + QRect cr( x + 2, y+2, checkcol, h-2*2 ); + QRect pmr( 0, 0, pixw, pixh ); + + pmr.moveCenter(cr.center()); + + p->setPen( itemg.text() ); + p->drawPixmap( pmr.topLeft(), pixmap ); + + } else if (checkable) { + int mw = checkcol; + int mh = h - 4; + + if (mi->isChecked()) + drawCheckMark(p, x+2, y+2, mw, mh, itemg, act, ! enabled); + } + + p->setPen( g.buttonText() ); + + QColor discol; + if (! enabled) { + discol = itemg.text(); + p->setPen( discol ); + } + + if (mi->custom()) { + p->save(); + mi->custom()->paint(p, itemg, act, enabled, x + checkcol + 4, y + 2, + w - checkcol - tab - 3, h - 4); + p->restore(); + } + + QString s = mi->text(); + if ( !s.isNull() ) { // draw text + int t = s.find( '\t' ); + int m = 2; + const int text_flags = AlignVCenter|ShowPrefix | DontClip | SingleLine; + if ( t >= 0 ) { // draw tab text + p->drawText( x+w-tab-2-2, + y+m, tab, h-2*m, text_flags, s.mid( t+1 ) ); + } + p->drawText(x + checkcol + 4, y + 2, w - checkcol -tab - 3, h - 4, + text_flags, s, t); + } else if (mi->pixmap()) { + QPixmap *pixmap = mi->pixmap(); + + if (pixmap->depth() == 1) p->setBackgroundMode(OpaqueMode); + p->drawPixmap(x + checkcol + 2, y + 2, *pixmap); + if (pixmap->depth() == 1) p->setBackgroundMode(TransparentMode); + } + + if (mi->popup()) { + int hh = h / 2; + + drawMenuArrow(p, RightArrow, (act) ? mi->isEnabled() : false, + x + w - hh - 6, y + (hh / 2), hh, hh, g, mi->isEnabled()); + } +} + + +void KLegacyStyle::drawComboButton(QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool sunken, bool editable, + bool enabled, const QBrush *b) +{ + GtkObject *gobj = priv->gtkDict.find(QComboBox::staticMetaObject()); + + if (! gobj) { + KStyle::drawComboButton(p, x, y, w, h, g, sunken, editable, enabled, b); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Box; + key.data.state = KLegacy::Normal; + key.data.shadow = KLegacy::Out; + + if (priv->lastWidget && priv->lastWidget->inherits("QComboBox")) + key.data.state = KLegacy::Prelight; + + QPixmap *pix = gobj->draw(key, w, h, "optionmenu"); + + if (pix && ! pix->isNull()) { + p->drawPixmap(x, y, *pix); + } else { + KStyle::drawComboButton(p, x, y, w, h, g, sunken, editable, enabled, b); + return; + } + + QRect rect = comboButtonRect(x, y, w, h); + int tw = w - rect.width() - rect.right() - rect.left(); + int th = rect.height(); + + key.data.function = KLegacy::Tab; + key.data.state = KLegacy::Normal; + pix = gobj->draw(key, tw, th, "optionmenutab"); + + if (pix && ! pix->isNull()) + p->drawPixmap(x + rect.width() + rect.left() + ((18 - pix->width()) / 2), + y + rect.y() + ((rect.height() - pix->height()) / 2), *pix); +} + + +QRect KLegacyStyle::comboButtonRect(int x, int y, int w, int h) { + GtkObject *gobj = priv->gtkDict.find(QComboBox::staticMetaObject()); + + if (! gobj) { + return KStyle::comboButtonRect(x, y, w, h); + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Box; + KLegacyImageData *id = gobj->getImageData(key, "optionmenu"); + + if (! id) { + return KStyle::comboButtonRect(x, y, w, h); + } + + return QRect(x + id->border.left() + 1, y + id->border.top() + 1, + w - id->border.left() - id->border.right() - 18, + h - id->border.top() - id->border.bottom() - 2); +} + + +QRect KLegacyStyle::comboButtonFocusRect(int x, int y, int w, int h) { + return comboButtonRect(x, y, w, h); +} + + +QStyle::ScrollControl KLegacyStyle::scrollBarPointOver(const QScrollBar *scrollbar, + int sliderStart, const QPoint &p) +{ + return QCommonStyle::scrollBarPointOver(scrollbar, sliderStart, p); +} + + +void KLegacyStyle::scrollBarMetrics(const QScrollBar *scrollbar, int &sliderMin, + int &sliderMax, int &sliderLength, int &buttonDim) +{ + int maxLength; + int b = defaultFrameWidth(); + int length = ((scrollbar->orientation() == QScrollBar::Horizontal) ? + scrollbar->width() : scrollbar->height()); + int extent = ((scrollbar->orientation() == QScrollBar::Horizontal) ? + scrollbar->height() : scrollbar->width()); + + if (length > ((extent - (b * 2) - 1) * 2) + (b * 2)) + buttonDim = extent - (b * 2); + else + buttonDim = ((length - (b * 2)) / 2) - 1; + + sliderMin = b + buttonDim; + maxLength = length - (b * 2) - (buttonDim * 2); + + if (scrollbar->maxValue() == scrollbar->minValue()) { + sliderLength = maxLength - 2; + } else { + uint range = scrollbar->maxValue() - scrollbar->minValue(); + + sliderLength = (scrollbar->pageStep() * maxLength) / + (range + scrollbar->pageStep()); + + if (sliderLength < buttonDim || range > (INT_MAX / 2)) + sliderLength = buttonDim; + if (sliderLength >= maxLength) + sliderLength = maxLength - 2; + } + + sliderMax = sliderMin + maxLength - sliderLength; + + sliderMin += 1; + sliderMax -= 1; +} + + +void KLegacyStyle::drawScrollBarControls(QPainter *p, const QScrollBar *scrollbar, + int start, uint controls, uint active) +{ + if (! scrollbar->isVisible()) return; + + GtkObject *gobj = priv->gtkDict.find(QScrollBar::staticMetaObject()); + + if (! gobj) { + KStyle::drawScrollBarControls(p, scrollbar, start, controls, active); + return; + } + + KLegacyImageDataKey gkey; + gkey.cachekey = 0; + gkey.data.function = KLegacy::Box; + gkey.data.orientation = scrollbar->orientation() + 1; + + KLegacyImageData *groove_id = gobj->getImageData(gkey, "trough"); + + if (! groove_id) { + KStyle::drawScrollBarControls(p, scrollbar, start, controls, active); + return; + } + + int sliderMin; + int sliderMax; + int sliderLen; + int buttonDim; + scrollBarMetrics(scrollbar, sliderMin, sliderMax, sliderLen, buttonDim); + + // the rectangle for the slider + QRect slider( + // x + ((scrollbar->orientation() == Vertical) ? + defaultFrameWidth() : start), + + // y + ((scrollbar->orientation() == Vertical) ? + start : defaultFrameWidth()), + + // w + ((scrollbar->orientation() == Vertical) ? + buttonDim : sliderLen), + + // h + ((scrollbar->orientation() == Vertical) ? + sliderLen : buttonDim)); + + KLegacyImageDataKey skey; + skey.cachekey = 0; + skey.data.function = KLegacy::Box; + skey.data.orientation = scrollbar->orientation() + 1; + + if ((active & Slider) || (priv->hovering && slider.contains(priv->mousePos))) + skey.data.state = KLegacy::Prelight; + else + skey.data.state = KLegacy::Normal; + + KLegacyImageData *slider_id = gobj->getImageData(skey, "slider"); + + if (! slider_id) { + KStyle::drawScrollBarControls(p, scrollbar, start, controls, active); + return; + } + + QPixmap *groove_pm = gobj->draw(groove_id, scrollbar->width(), scrollbar->height()); + + if ((! groove_pm) || (groove_pm->isNull())) { + groove_pm = 0; + } + + QPixmap *slider_pm = gobj->draw(slider_id, slider.width(), slider.height()); + + if ((! slider_pm) || (slider_pm->isNull())) { + slider_pm = 0; + } + + QPixmap buf(scrollbar->size()); + { + QPainter p2(&buf); + + if (groove_pm) { + p2.drawTiledPixmap(scrollbar->rect(), *groove_pm); + } + + if (slider_pm) { + p2.drawTiledPixmap(slider, *slider_pm); + } + + // arrows + int x, y; + x = y = defaultFrameWidth(); + + drawArrow(&p2, ((scrollbar->orientation() == Vertical) ? + UpArrow : LeftArrow), + (active & SubLine), x, y, + buttonDim, + buttonDim, + scrollbar->colorGroup(), true); + + if (scrollbar->orientation() == Vertical) + y = scrollbar->height() - buttonDim - defaultFrameWidth(); + else + x = scrollbar->width() - buttonDim - defaultFrameWidth(); + + drawArrow(&p2, ((scrollbar->orientation() == Vertical) ? + DownArrow : RightArrow), + (active & AddLine), x, y, + buttonDim, + buttonDim, + scrollbar->colorGroup(), true); + } + p->drawPixmap(0, 0, buf); +} + + +void KLegacyStyle::drawSlider(QPainter *p, int x, int y, int w, int h, const QColorGroup &g, + Orientation orientation, bool tickAbove, bool tickBelow) +{ + GtkObject *gobj = priv->gtkDict.find(QSlider::staticMetaObject()); + + if (! gobj) { + KStyle::drawSlider(p, x, y, w, h, g, orientation, tickAbove, tickBelow); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Box; + key.data.shadow = KLegacy::Out; + key.data.state = KLegacy::Normal; + key.data.orientation = orientation + 1; + + QPixmap *pix = gobj->draw(key, w, h, "slider"); + + if (pix && ! pix->isNull()) + p->drawPixmap(x, y, *pix); + else + KStyle::drawSlider(p, x, y, w, h, g, orientation, tickAbove, tickBelow); +} + + + +void KLegacyStyle::drawSliderGroove(QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, QCOORD c, Orientation o) +{ + GtkObject *gobj = priv->gtkDict.find(QSlider::staticMetaObject()); + + if (! gobj) { + KStyle::drawSliderGroove(p, x, y, w, h, g, c, o); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Box; + key.data.shadow = KLegacy::In; + key.data.state = KLegacy::Active; + key.data.orientation = o + 1; + + QPixmap *pix = gobj->draw(key, w, h, "trough"); + + if (pix && ! pix->isNull()) + p->drawPixmap(x, y, *pix); + else + KStyle::drawSliderGroove(p, x, y, w, h, g, c, o); +} + + +void KLegacyStyle::drawArrow(QPainter *p, ArrowType type, bool down, + int x, int y, int w, int h, + const QColorGroup &g, bool enabled, const QBrush *b) +{ + GtkObject *gobj = priv->gtkDict.find(&arrow_ptr); + + if (! gobj) { + KStyle::drawArrow(p, type, down, x, y, w, h, g, enabled, b); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Arrow; + key.data.state = (down) ? KLegacy::Active : KLegacy::Normal; + key.data.shadow = (down) ? KLegacy::In : KLegacy::NoShadow; + key.data.arrowDirection = type + 1; + + if ((! down) && priv->hovering && + QRect(x, y, w, h).contains(priv->mousePos)) { + key.data.state = KLegacy::Prelight; + } + + QPixmap *pix = gobj->draw(key, w, h, "arrow"); + + if (pix && ! pix->isNull()) + p->drawPixmap(x, y, *pix); + else + KStyle::drawArrow(p, type, down, x, y, w, h, g, enabled, b); +} + + +void KLegacyStyle::drawMenuArrow(QPainter *p, ArrowType type, bool down, + int x, int y, int w, int h, + const QColorGroup &g, bool enabled, const QBrush *b) +{ + GtkObject *gobj = priv->gtkDict.find(&menuitem_ptr); + + if (! gobj) { + KStyle::drawArrow(p, type, down, x, y, w, h, g, enabled, b); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Arrow; + key.data.state = (down) ? KLegacy::Active : KLegacy::Normal; + key.data.shadow = (down) ? KLegacy::In : KLegacy::NoShadow; + key.data.arrowDirection = type + 1; + + QPixmap *pix = gobj->draw(key, w, h, "arrow"); + + if (pix && ! pix->isNull()) + p->drawPixmap(x + ((w - pix->width()) / 2), + y + ((h - pix->height()) / 2), *pix); + else + KStyle::drawArrow(p, type, down, x, y, w, h, g, enabled, b); +} + + +void KLegacyStyle::drawPanel(QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool sunken, int, const QBrush *brush) +{ + KStyle::drawPanel(p, x, y, w, h, g, sunken, 1, brush); +} + + +void KLegacyStyle::drawPopupPanel(QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, int, const QBrush *fill) +{ + QBrush brush = (fill) ? *fill : g.brush(QColorGroup::Background); + + p->fillRect(x, y, w, h, brush); +} + + +void KLegacyStyle::drawCheckMark(QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool activated, bool disabled) +{ + GtkObject *gobj = priv->gtkDict.find(&checkmenuitem_ptr); + + if (! gobj) { + KStyle::drawCheckMark(p, x, y, w, h, g, activated, disabled); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Check; + key.data.shadow = (disabled) ? KLegacy::Out : KLegacy::In; + + QPixmap *pix = gobj->draw(key, w, h); + + if (pix && (! pix->isNull())) { + x += (w - pix->width()) / 2; + y += (h - pix->height()) / 2; + p->drawPixmap(x, y, *pix); + } else { + KStyle::drawCheckMark(p, x, y, w, h, g, activated, disabled); + } +} + + +void KLegacyStyle::drawSplitter(QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, Orientation orientation) +{ + if (orientation == Horizontal) { + int xpos = x + (w / 2); + int kpos = 10; + int ksize = splitterWidth() - 2; + + qDrawShadeLine(p, xpos, kpos + ksize - 1, xpos, h, g); + drawBevelButton(p, xpos - (splitterWidth() / 2) + 1, kpos, ksize, ksize, + g, false, &g.brush(QColorGroup::Button)); + qDrawShadeLine(p, xpos, 0, xpos, kpos, g); + } else { + int ypos = y + (h / 2); + int kpos = w - 10 - splitterWidth(); + int ksize = splitterWidth() - 2; + + qDrawShadeLine(p, 0, ypos, kpos, ypos, g); + drawBevelButton(p, kpos, ypos - (splitterWidth() / 2) + 1, ksize, ksize, + g, false, &g.brush(QColorGroup::Button)); + qDrawShadeLine(p, kpos + ksize - 1, ypos, w, ypos, g); + } +} + + +void KLegacyStyle::drawTab(QPainter *p, const QTabBar *tabbar, QTab *tab, bool selected) +{ + GtkObject *gobj = priv->gtkDict.find(QTabBar::staticMetaObject()); + + if (! gobj) { + KStyle::drawTab(p, tabbar, tab, selected); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Extension; + key.data.state = (! selected) ? KLegacy::Active : KLegacy::Normal; + key.data.shadow = KLegacy::Out; + key.data.gapSide = (tabbar->shape() == QTabBar::RoundedAbove || + tabbar->shape() == QTabBar::TriangularAbove) ? + KLegacy::Bottom : KLegacy::Top; + + int ry = tab->r.top(), rh = tab->r.height(); + + if (! selected) { + rh -= 2; + + if (tabbar->shape() == QTabBar::RoundedAbove || + tabbar->shape() == QTabBar::TriangularAbove) + ry += 2; + } + + QPixmap *pix = gobj->draw(key, tab->r.width(), rh, "tab"); + + + if (pix && ! pix->isNull()) + p->drawPixmap(tab->r.left(), ry, *pix); + else + KStyle::drawTab(p, tabbar, tab, selected); +} + + +void KLegacyStyle::drawKBarHandle(QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, KToolBarPos type, QBrush *fill) +{ + GtkObject *gobj = priv->gtkDict.find(QToolBar::staticMetaObject()); + + if (! gobj) { + KStyle::drawKBarHandle(p, x, y, w, h, g, type, fill); + return; + } + + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Handle; + key.data.state = KLegacy::Normal; + key.data.shadow = KLegacy::Out; + key.data.orientation = (type == Left || type == Right) ? + Vertical + 1: Horizontal + 1; + + QPixmap *pix = gobj->draw(key, w, h, "handle"); + + if (pix && ! pix->isNull()) + p->drawPixmap(x, y, *pix); +} + + +void KLegacyStyle::drawKickerHandle(QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, QBrush *fill) +{ + drawKBarHandle(p, x, y, w, h, g, Left, fill); +} + + +void KLegacyStyle::drawKickerAppletHandle(QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, QBrush *fill) +{ + drawKBarHandle(p, x, y, w, h, g, Left, fill); +} + + +void KLegacyStyle::drawKickerTaskButton(QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, const QString &title, + bool active, QPixmap *icon, QBrush *fill) +{ + drawBevelButton(p, x, y, w, h, g, active, fill); + + const int pxWidth = 20; + int textPos = pxWidth; + + QRect br(buttonRect(x, y, w, h)); + + if (active) + p->translate(1,1); + + if (icon && ! icon->isNull()) { + int dx = (pxWidth - icon->width()) / 2; + int dy = (h - icon->height()) / 2; + + p->drawPixmap(br.x() + dx, dy, *icon); + } + + QString s(title); + + static const QString &modStr = KGlobal::staticQString( + QString::fromUtf8("[") + i18n("modified") + QString::fromUtf8("]")); + + int modStrPos = s.find(modStr); + + if (modStrPos != -1) { + s.remove(modStrPos, modStr.length()+1); + + QPixmap modPixmap = SmallIcon("modified"); + + int dx = (pxWidth - modPixmap.width()) / 2; + int dy = (h - modPixmap.height()) / 2; + + p->drawPixmap(br.x() + textPos + dx, dy, modPixmap); + + textPos += pxWidth; + } + + if (! s.isEmpty()) { + if (p->fontMetrics().width(s) > br.width() - textPos) { + int maxLen = br.width() - textPos - p->fontMetrics().width("..."); + + while ( (! s.isEmpty()) && (p->fontMetrics().width(s) > maxLen)) + s.truncate(s.length() - 1); + + s.append("..."); + } + + p->setPen((active) ? g.foreground() : g.buttonText()); + + p->drawText(br.x() + textPos, -1, w - textPos, h, AlignVCenter | AlignLeft, s); + } +} + + +bool KLegacyStyle::eventFilter(QObject *obj, QEvent *e) { + switch (e->type()) { + case QEvent::Resize: + { + QWidget *w = (QWidget *) obj; + + if (w->inherits("QPopupMenu") && w->width() < 700) { + GtkObject *gobj = priv->gtkDict.find(QPopupMenu::staticMetaObject()); + + if (gobj) { + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Box; + key.data.state = KLegacy::Normal; + key.data.shadow = KLegacy::Out; + + QPixmap *pix = gobj->draw(key, w->width(), w->height(), "menu"); + + if (pix && ! pix->isNull()) { + QPalette pal = w->palette(); + + // active + QBrush brush = pal.brush(QPalette::Active, + QColorGroup::Background); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Active, + QColorGroup::Background, brush); + + brush = pal.brush(QPalette::Active, + QColorGroup::Button); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Active, + QColorGroup::Button, brush); + + // inactive + brush = pal.brush(QPalette::Inactive, + QColorGroup::Background); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Inactive, + QColorGroup::Background, brush); + + brush = pal.brush(QPalette::Inactive, + QColorGroup::Button); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Inactive, + QColorGroup::Button, brush); + + // disabled + brush = pal.brush(QPalette::Disabled, + QColorGroup::Background); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Disabled, + QColorGroup::Background, brush); + + brush = pal.brush(QPalette::Disabled, + QColorGroup::Button); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Disabled, + QColorGroup::Button, brush); + + w->setPalette(pal); + } + } + } else if (w->isTopLevel() || w->inherits("QWorkspaceChild")) { + GtkObject *gobj = priv->gtkDict.find(QMainWindow::staticMetaObject()); + + if (gobj) { + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::FlatBox; + + QPixmap *p = gobj->draw(key, w->width(), w->height(), "base"); + + if (p && (! p->isNull())) + w->setBackgroundPixmap(*p); + } + } else if (w->inherits("QLineEdit")) { + GtkObject *gobj = priv->gtkDict.find(QLineEdit::staticMetaObject()); + + if (gobj) { + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::FlatBox; + key.data.shadow = KLegacy::NoShadow; + key.data.state = (w->isEnabled()) ? KLegacy::Normal : KLegacy::Insensitive; + + QPixmap *pix = gobj->draw(key, w->width(), w->height(), + "entry_bg"); + + if (pix && (! pix->isNull())) { + QPalette pal = w->palette(); + + // active + QBrush brush = pal.brush(QPalette::Active, + QColorGroup::Base); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Active, + QColorGroup::Base, brush); + + // inactive + brush = pal.brush(QPalette::Inactive, + QColorGroup::Base); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Inactive, + QColorGroup::Base, brush); + + // disabled + brush = pal.brush(QPalette::Disabled, + QColorGroup::Base); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Disabled, + QColorGroup::Base, brush); + + w->setPalette(pal); + } + } + } else if (w->inherits("QMenuBar") || + w->inherits("QToolBar")) { + GtkObject *gobj = priv->gtkDict.find(QMenuBar::staticMetaObject()); + + if (gobj) { + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::Box; + key.data.state = KLegacy::Normal; + key.data.shadow = KLegacy::Out; + + QPixmap *pix = gobj->draw(key, w->width(), w->height(), + "menubar"); + if (pix && (! pix->isNull())) { + QPalette pal = w->palette(); + + // active + QBrush brush = pal.brush(QPalette::Active, + QColorGroup::Background); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Active, + QColorGroup::Background, brush); + + brush = pal.brush(QPalette::Active, + QColorGroup::Button); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Active, + QColorGroup::Button, brush); + + // inactive + brush = pal.brush(QPalette::Inactive, + QColorGroup::Background); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Inactive, + QColorGroup::Background, brush); + + brush = pal.brush(QPalette::Inactive, + QColorGroup::Button); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Inactive, + QColorGroup::Button, brush); + + // disabled + brush = pal.brush(QPalette::Disabled, + QColorGroup::Background); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Disabled, + QColorGroup::Background, brush); + + brush = pal.brush(QPalette::Disabled, + QColorGroup::Button); + brush.setPixmap(*pix); + pal.setBrush(QPalette::Disabled, + QColorGroup::Button, brush); + + w->setPalette(pal); + } + } + } + + break; + } + + case QEvent::Enter: + { + if (obj->inherits("QPushButton") || + obj->inherits("QComboBox") || + obj->inherits("QSlider") || + obj->inherits("QScrollbar")) { + priv->lastWidget = (QWidget *) obj; + priv->lastWidget->repaint(false); + } else if (obj->inherits("QRadioButton")) { + QWidget *w = (QWidget *) obj; + + if (! w->isTopLevel() && w->isEnabled()) { + GtkObject *gobj = priv->gtkDict.find(QRadioButton::staticMetaObject()); + + if (gobj) { + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::FlatBox; + + QPixmap *pix = gobj->draw(key, w->width(), w->height()); + + if (pix && (! pix->isNull())) { + QPalette pal = w->palette(); + QBrush brush = pal.brush(QPalette::Normal, + QColorGroup::Background); + + brush.setPixmap(*pix); + pal.setBrush(QPalette::Normal, + QColorGroup::Background, brush); + + w->setPalette(pal); + w->setBackgroundMode(QWidget::PaletteBackground); + w->setBackgroundOrigin(QWidget::WidgetOrigin); + } + } + } + } else if (obj->inherits("QCheckBox")) { + QWidget *w = (QWidget *) obj; + + if (! w->isTopLevel() && w->isEnabled()) { + GtkObject *gobj = priv->gtkDict.find(QCheckBox::staticMetaObject()); + + if (gobj) { + KLegacyImageDataKey key; + key.cachekey = 0; + key.data.function = KLegacy::FlatBox; + + QPixmap *pix = gobj->draw(key, w->width(), w->height()); + + if (pix && (! pix->isNull())) { + QPalette pal = w->palette(); + QBrush brush = pal.brush(QPalette::Normal, + QColorGroup::Background); + + brush.setPixmap(*pix); + pal.setBrush(QPalette::Normal, + QColorGroup::Background, brush); + + w->setPalette(pal); + w->setBackgroundMode(QWidget::PaletteBackground); + w->setBackgroundOrigin(QWidget::WidgetOrigin); + } + } + } + } + + break; + } + + case QEvent::Leave: + { + if (obj == priv->lastWidget) { + priv->lastWidget = 0; + ((QWidget *) obj)->repaint(false); + } else if (obj->inherits("QRadioButton") || + obj->inherits("QCheckBox")) { + QWidget *w = (QWidget *) obj; + + if (! w->isTopLevel()) { + w->setBackgroundMode(QWidget::X11ParentRelative); + w->setBackgroundOrigin(QWidget::WidgetOrigin); + w->repaint(true); + } + } + + break; + } + + case QEvent::MouseMove: + { + QMouseEvent *me = (QMouseEvent *) e; + priv->mousePos = me->pos(); + if (obj->inherits("QScrollBar") && + (! (me->state() & (LeftButton | MidButton | RightButton)))) { + priv->hovering = true; + ((QWidget *) obj)->repaint(false); + priv->hovering = false; + } + + break; + } + + default: + { + break; + } + } + + return KStyle::eventFilter(obj, e); +} |