1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_vcl.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #define _SV_SALNATIVEWIDGETS_KDE_CXX
28*b1cdbd2cSJim Jagielski #include <shell/kde_headers.h>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <unx/salunx.h>
31*b1cdbd2cSJim Jagielski #include <unx/saldata.hxx>
32*b1cdbd2cSJim Jagielski #include <unx/saldisp.hxx>
33*b1cdbd2cSJim Jagielski #include <unx/salgdi.h>
34*b1cdbd2cSJim Jagielski #include <unx/pspgraphics.h>
35*b1cdbd2cSJim Jagielski #include <unx/kde/kdedata.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <vcl/settings.hxx>
38*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski using namespace ::rtl;
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski /** Cached native widgets.
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski     A class which caches and paints the native widgets.
46*b1cdbd2cSJim Jagielski */
47*b1cdbd2cSJim Jagielski class WidgetPainter
48*b1cdbd2cSJim Jagielski {
49*b1cdbd2cSJim Jagielski     protected:
50*b1cdbd2cSJim Jagielski 	/** Cached push button.
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski 	    It is necessary for the QStyle::drawControl(). The buttons are created
53*b1cdbd2cSJim Jagielski 	    on demand and they are still hidden (no QWidget::show() is called).
54*b1cdbd2cSJim Jagielski 	*/
55*b1cdbd2cSJim Jagielski 	QPushButton  *m_pPushButton;
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski 	/** Cached radio button.
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski 	    @see m_pPushButton
60*b1cdbd2cSJim Jagielski 	*/
61*b1cdbd2cSJim Jagielski 	QRadioButton *m_pRadioButton;
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski 	/** Cached check box.
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski 	    @see m_pPushButton
66*b1cdbd2cSJim Jagielski 	*/
67*b1cdbd2cSJim Jagielski 	QCheckBox    *m_pCheckBox;
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski 	/** Cached combo box.
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski 	    @see m_pPushButton
72*b1cdbd2cSJim Jagielski 	*/
73*b1cdbd2cSJim Jagielski 	QComboBox    *m_pComboBox;
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski 	/** Cached editable combo box.
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski 	    Needed, because some styles do not like dynamic changes
78*b1cdbd2cSJim Jagielski 	    (QComboBox::setEditable()).
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski 	    @see m_pPushButton
81*b1cdbd2cSJim Jagielski 	*/
82*b1cdbd2cSJim Jagielski 	QComboBox    *m_pEditableComboBox;
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski 	/** Cached line edit box.
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski 	    @see m_pPushButton
87*b1cdbd2cSJim Jagielski 	*/
88*b1cdbd2cSJim Jagielski 	QLineEdit    *m_pLineEdit;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski 	/** Cached spin box.
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski 	    @see m_pPushButton
93*b1cdbd2cSJim Jagielski 	*/
94*b1cdbd2cSJim Jagielski 	QSpinWidget  *m_pSpinWidget;
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski 	/** Cached spin box'es line edit.
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski 	    @see m_pPushButton
99*b1cdbd2cSJim Jagielski 	*/
100*b1cdbd2cSJim Jagielski 	QLineEdit    *m_pSpinEdit;
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski 	/** Cached tab.
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski 	    Left, middle, right tab and a tab which is alone.
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 	    @see m_pPushButton
107*b1cdbd2cSJim Jagielski 	*/
108*b1cdbd2cSJim Jagielski 	QTab         *m_pTabLeft, *m_pTabMiddle, *m_pTabRight, *m_pTabAlone;
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski 	/** Cached tab bar's parent widget.
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 	    Needed, because the Qt windows style checks for the availability
113*b1cdbd2cSJim Jagielski 	    of tab bar's parent. We cannot use m_pTabWidget, because
114*b1cdbd2cSJim Jagielski 	    TabWidget::setTabBar() and TabWidget::tabBar() methods are
115*b1cdbd2cSJim Jagielski 	    protected.
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 	    @see m_pPushButton, m_pTabWidget
118*b1cdbd2cSJim Jagielski 	*/
119*b1cdbd2cSJim Jagielski 	QWidget      *m_pTabBarParent;
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski 	/** Cached tab bar widget.
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski 	    @see m_pPushButton
124*b1cdbd2cSJim Jagielski 	*/
125*b1cdbd2cSJim Jagielski 	QTabBar      *m_pTabBar;
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski 	/** Cached tab widget.
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski 	    We need it to draw the tab page. It cannot be used to draw the
130*b1cdbd2cSJim Jagielski 	    tabs themselves, because the drawing has to be tweaked a little
131*b1cdbd2cSJim Jagielski 	    due to not enough information from VCL.
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 	    @see m_pPushButton, m_pTabBarParent
134*b1cdbd2cSJim Jagielski 	*/
135*b1cdbd2cSJim Jagielski 	QTabWidget   *m_pTabWidget;
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski 	/** Cached list view.
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 	    @see m_pPushButton
140*b1cdbd2cSJim Jagielski 	*/
141*b1cdbd2cSJim Jagielski 	QListView    *m_pListView;
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 	/** Cached scroll bar.
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 	    @see m_pPushButton
146*b1cdbd2cSJim Jagielski 	*/
147*b1cdbd2cSJim Jagielski 	QScrollBar   *m_pScrollBar;
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski     /** Cached dock area. Needed for proper functionality of tool bars.
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski       @see m_pPushButton
152*b1cdbd2cSJim Jagielski       */
153*b1cdbd2cSJim Jagielski     QMainWindow  *m_pMainWindow;
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski     /** Cached tool bar.
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski       @see m_pPushButton
158*b1cdbd2cSJim Jagielski     */
159*b1cdbd2cSJim Jagielski     QToolBar     *m_pToolBarHoriz, *m_pToolBarVert;
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski     /** Cached tool button.
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski       @see m_pPushButton
164*b1cdbd2cSJim Jagielski     */
165*b1cdbd2cSJim Jagielski     QToolButton  *m_pToolButton;
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski     /** Cached menu bar.
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski       @see m_pPushButton
170*b1cdbd2cSJim Jagielski     */
171*b1cdbd2cSJim Jagielski     QMenuBar     *m_pMenuBar;
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski     /** Identifiers of menu bar items.
174*b1cdbd2cSJim Jagielski      */
175*b1cdbd2cSJim Jagielski     int           m_nMenuBarEnabledItem, m_nMenuBarDisabledItem;
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski     /** Cached popup menu.
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski       @see m_pPushButton
180*b1cdbd2cSJim Jagielski     */
181*b1cdbd2cSJim Jagielski     QPopupMenu   *m_pPopupMenu;
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski     /** Identifiers of popup menu items.
184*b1cdbd2cSJim Jagielski      */
185*b1cdbd2cSJim Jagielski     int           m_nPopupMenuEnabledItem, m_nPopupMenuDisabledItem;
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski     /** cached progress bar
188*b1cdbd2cSJim Jagielski       */
189*b1cdbd2cSJim Jagielski     QProgressBar *m_pProgressBar;
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski 	// TODO other widgets
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski     public:
194*b1cdbd2cSJim Jagielski 	/** Implicit constructor.
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 	    It creates an empty WidgetPainter with all the cached widgets initialized
197*b1cdbd2cSJim Jagielski 	    to NULL. The widgets are created on demand and they are still hidden
198*b1cdbd2cSJim Jagielski 	    (no QWidget::show()), because they are needed just as a parameter for
199*b1cdbd2cSJim Jagielski 	    QStyle::drawControl().
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 	    @see m_pPushButton
202*b1cdbd2cSJim Jagielski 	*/
203*b1cdbd2cSJim Jagielski 	WidgetPainter( void );
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski 	/** Destructor.
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski 	    Destruct all the cached widgets.
208*b1cdbd2cSJim Jagielski 	*/
209*b1cdbd2cSJim Jagielski 	virtual ~WidgetPainter( void );
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 	/** Paints the specified widget to the X window.
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski 	    Use X calls to bitblt (bit block transfer) the widget qWidget to
214*b1cdbd2cSJim Jagielski 	    the window specified by drawable with the style defined by nStyle.
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski 	    @param qWidget
217*b1cdbd2cSJim Jagielski 	    A pointer to the cached widget.
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski 	    @param nState
220*b1cdbd2cSJim Jagielski 	    The state of the control (focused, on/off, ...)
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski 	    @param aValue
223*b1cdbd2cSJim Jagielski 	    The value (true/false, ...)
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 	    @param dpy
226*b1cdbd2cSJim Jagielski 	    The display to be used by the X calls.
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 	    @param drawable
229*b1cdbd2cSJim Jagielski 	    The destination X window.
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski 	    @param gc
232*b1cdbd2cSJim Jagielski 	    The graphics context.
233*b1cdbd2cSJim Jagielski 	*/
234*b1cdbd2cSJim Jagielski         sal_Bool drawStyledWidget( QWidget *pWidget,
235*b1cdbd2cSJim Jagielski                 ControlState nState, const ImplControlValue& aValue,
236*b1cdbd2cSJim Jagielski                 Display *dpy, XLIB_Window drawable, int nScreen, int nDepth, GC gc,
237*b1cdbd2cSJim Jagielski                 ControlPart nPart = PART_ENTIRE_CONTROL );
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 	/** 'Get' method for push button.
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 	    The method returns the cached push button. It is constructed if it
242*b1cdbd2cSJim Jagielski 	    does not exist. It has NULL as a parent and it stays hidden, but it
243*b1cdbd2cSJim Jagielski 	    is necessary for the drawStyledWidget() method.
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski 	    @return valid push button.
246*b1cdbd2cSJim Jagielski 	*/
247*b1cdbd2cSJim Jagielski 	QPushButton  *pushButton( const Rectangle& rControlRegion, sal_Bool bDefault );
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 	/** 'Get' method for radio button.
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski 	    @see pushButton()
252*b1cdbd2cSJim Jagielski 	*/
253*b1cdbd2cSJim Jagielski 	QRadioButton *radioButton( const Rectangle& rControlRegion );
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 	/** 'Get' method for check box.
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski 	    @see pushButton()
258*b1cdbd2cSJim Jagielski 	*/
259*b1cdbd2cSJim Jagielski 	QCheckBox    *checkBox( const Rectangle& rControlRegion );
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski 	/** 'Get' method for combo box.
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski 	    It returns m_pComboBox or m_pEditableComboBox according to
264*b1cdbd2cSJim Jagielski 	    bEditable.
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 	    @see pushButton(), m_pEditableComboBox
267*b1cdbd2cSJim Jagielski 	*/
268*b1cdbd2cSJim Jagielski 	QComboBox    *comboBox( const Rectangle& rControlRegion, sal_Bool bEditable );
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski 	/** 'Get' method for line edit box.
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski 	    @see pushButton()
273*b1cdbd2cSJim Jagielski 	*/
274*b1cdbd2cSJim Jagielski 	QLineEdit    *lineEdit( const Rectangle& rControlRegion );
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski 	/** 'Get' method for spin box.
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski 	    @see pushButton()
279*b1cdbd2cSJim Jagielski 	*/
280*b1cdbd2cSJim Jagielski 	QSpinWidget  *spinWidget( const Rectangle& rControlRegion );
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 	/** 'Get' method for tab bar.
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski 	    @see pushButton()
285*b1cdbd2cSJim Jagielski 	*/
286*b1cdbd2cSJim Jagielski 	QTabBar      *tabBar( const Rectangle& rControlRegion );
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski 	/** 'Get' method for tab widget.
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski 	    @see pushButton()
291*b1cdbd2cSJim Jagielski 	*/
292*b1cdbd2cSJim Jagielski 	QTabWidget   *tabWidget( const Rectangle& rControlRegion );
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski 	/** 'Get' method for list view.
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski 	    @see pushButton()
297*b1cdbd2cSJim Jagielski 	*/
298*b1cdbd2cSJim Jagielski 	QListView    *listView( const Rectangle& rControlRegion );
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski 	/** 'Get' method for scroll bar.
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski 	    @see pushButton()
303*b1cdbd2cSJim Jagielski 	*/
304*b1cdbd2cSJim Jagielski 	QScrollBar   *scrollBar( const Rectangle& rControlRegion,
305*b1cdbd2cSJim Jagielski 		sal_Bool bHorizontal, const ImplControlValue& aValue );
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski     /** 'Get' method for tool bar.
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski       @see pushButton()
310*b1cdbd2cSJim Jagielski     */
311*b1cdbd2cSJim Jagielski     QToolBar     *toolBar( const Rectangle& rControlRegion, sal_Bool bHorizontal );
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski     /** 'Get' method for tool button.
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski       @see pushButton()
316*b1cdbd2cSJim Jagielski     */
317*b1cdbd2cSJim Jagielski     QToolButton  *toolButton( const Rectangle& rControlRegion );
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski     /** 'Get' method for menu bar.
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski       @see pushButton()
322*b1cdbd2cSJim Jagielski     */
323*b1cdbd2cSJim Jagielski     QMenuBar     *menuBar( const Rectangle& rControlRegion );
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski     /** 'Get' method for popup menu.
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski       @see pushButton()
328*b1cdbd2cSJim Jagielski     */
329*b1cdbd2cSJim Jagielski     QPopupMenu   *popupMenu( const Rectangle& rControlRegion );
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski     /** 'Get' method for progress bar
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski       @see pushButton()
334*b1cdbd2cSJim Jagielski     */
335*b1cdbd2cSJim Jagielski     QProgressBar *progressBar( const Rectangle& rControlRegion );
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski 	// TODO other widgets
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski     protected:
340*b1cdbd2cSJim Jagielski 	/** Style conversion function.
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski 	    Conversion function between VCL ControlState together with
343*b1cdbd2cSJim Jagielski 	    ImplControlValue and Qt state flags.
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski 	    @param nState
346*b1cdbd2cSJim Jagielski 	    State of the widget (default, focused, ...) as defined in Native
347*b1cdbd2cSJim Jagielski 	    Widget Framework.
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski 	    @param aValue
350*b1cdbd2cSJim Jagielski 	    Value held by the widget (on, off, ...)
351*b1cdbd2cSJim Jagielski 	*/
352*b1cdbd2cSJim Jagielski 	QStyle::SFlags vclStateValue2SFlags( ControlState nState, const ImplControlValue& aValue );
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski     public:
355*b1cdbd2cSJim Jagielski 	/** Convert VCL Rectangle to QRect.
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski 	    @param rControlRegion
358*b1cdbd2cSJim Jagielski 	    The region to convert.
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski 	    @return
361*b1cdbd2cSJim Jagielski 	    The bounding box of the region.
362*b1cdbd2cSJim Jagielski 	*/
363*b1cdbd2cSJim Jagielski 	static QRect region2QRect( const Rectangle& rControlRegion );
364*b1cdbd2cSJim Jagielski };
365*b1cdbd2cSJim Jagielski 
WidgetPainter(void)366*b1cdbd2cSJim Jagielski WidgetPainter::WidgetPainter( void )
367*b1cdbd2cSJim Jagielski     : m_pPushButton( NULL ),
368*b1cdbd2cSJim Jagielski       m_pRadioButton( NULL ),
369*b1cdbd2cSJim Jagielski       m_pCheckBox( NULL ),
370*b1cdbd2cSJim Jagielski       m_pComboBox( NULL ),
371*b1cdbd2cSJim Jagielski       m_pEditableComboBox( NULL ),
372*b1cdbd2cSJim Jagielski       m_pLineEdit( NULL ),
373*b1cdbd2cSJim Jagielski       m_pSpinWidget( NULL ),
374*b1cdbd2cSJim Jagielski       m_pSpinEdit( NULL ),
375*b1cdbd2cSJim Jagielski       m_pTabLeft( NULL ),
376*b1cdbd2cSJim Jagielski       m_pTabMiddle( NULL ),
377*b1cdbd2cSJim Jagielski       m_pTabRight( NULL ),
378*b1cdbd2cSJim Jagielski       m_pTabAlone( NULL ),
379*b1cdbd2cSJim Jagielski       m_pTabBarParent( NULL ),
380*b1cdbd2cSJim Jagielski       m_pTabBar( NULL ),
381*b1cdbd2cSJim Jagielski       m_pTabWidget( NULL ),
382*b1cdbd2cSJim Jagielski       m_pListView( NULL ),
383*b1cdbd2cSJim Jagielski       m_pScrollBar( NULL ),
384*b1cdbd2cSJim Jagielski       m_pMainWindow( NULL ),
385*b1cdbd2cSJim Jagielski       m_pToolBarHoriz( NULL ),
386*b1cdbd2cSJim Jagielski       m_pToolBarVert( NULL ),
387*b1cdbd2cSJim Jagielski       m_pToolButton( NULL ),
388*b1cdbd2cSJim Jagielski       m_pMenuBar( NULL ),
389*b1cdbd2cSJim Jagielski       m_pPopupMenu( NULL ),
390*b1cdbd2cSJim Jagielski       m_pProgressBar( NULL )
391*b1cdbd2cSJim Jagielski {
392*b1cdbd2cSJim Jagielski }
393*b1cdbd2cSJim Jagielski 
~WidgetPainter(void)394*b1cdbd2cSJim Jagielski WidgetPainter::~WidgetPainter( void )
395*b1cdbd2cSJim Jagielski {
396*b1cdbd2cSJim Jagielski     delete m_pPushButton, m_pPushButton = NULL;
397*b1cdbd2cSJim Jagielski     delete m_pRadioButton, m_pRadioButton = NULL;
398*b1cdbd2cSJim Jagielski     delete m_pCheckBox, m_pCheckBox = NULL;
399*b1cdbd2cSJim Jagielski     delete m_pComboBox, m_pComboBox = NULL;
400*b1cdbd2cSJim Jagielski     delete m_pEditableComboBox, m_pEditableComboBox = NULL;
401*b1cdbd2cSJim Jagielski     delete m_pLineEdit, m_pLineEdit = NULL;
402*b1cdbd2cSJim Jagielski     delete m_pSpinWidget, m_pSpinWidget = NULL;
403*b1cdbd2cSJim Jagielski     m_pSpinEdit = NULL; // Deleted in m_pSpinWidget's destructor
404*b1cdbd2cSJim Jagielski     delete m_pTabAlone, m_pTabAlone = NULL;
405*b1cdbd2cSJim Jagielski     delete m_pTabBarParent, m_pTabBarParent = NULL;
406*b1cdbd2cSJim Jagielski     m_pTabBar = NULL;    // Deleted in m_pTabBarParent's destructor
407*b1cdbd2cSJim Jagielski     m_pTabLeft = NULL;
408*b1cdbd2cSJim Jagielski     m_pTabMiddle = NULL;
409*b1cdbd2cSJim Jagielski     m_pTabRight = NULL;
410*b1cdbd2cSJim Jagielski     delete m_pTabWidget, m_pTabWidget = NULL;
411*b1cdbd2cSJim Jagielski     delete m_pListView, m_pListView = NULL;
412*b1cdbd2cSJim Jagielski     delete m_pScrollBar, m_pScrollBar = NULL;
413*b1cdbd2cSJim Jagielski     delete m_pToolBarHoriz, m_pToolBarHoriz = NULL;
414*b1cdbd2cSJim Jagielski     delete m_pToolBarVert, m_pToolBarVert = NULL;
415*b1cdbd2cSJim Jagielski     delete m_pMainWindow, m_pMainWindow = NULL;
416*b1cdbd2cSJim Jagielski     delete m_pToolButton, m_pToolButton = NULL;
417*b1cdbd2cSJim Jagielski     delete m_pMenuBar, m_pMenuBar = NULL;
418*b1cdbd2cSJim Jagielski     delete m_pPopupMenu, m_pPopupMenu = NULL;
419*b1cdbd2cSJim Jagielski     delete m_pProgressBar, m_pProgressBar = NULL;
420*b1cdbd2cSJim Jagielski }
421*b1cdbd2cSJim Jagielski 
drawStyledWidget(QWidget * pWidget,ControlState nState,const ImplControlValue & aValue,Display * dpy,XLIB_Window drawable,int nScreen,int nDepth,GC gc,ControlPart nPart)422*b1cdbd2cSJim Jagielski sal_Bool WidgetPainter::drawStyledWidget( QWidget *pWidget,
423*b1cdbd2cSJim Jagielski 	ControlState nState, const ImplControlValue& aValue,
424*b1cdbd2cSJim Jagielski         Display *dpy, XLIB_Window drawable, int nScreen, int nDepth, GC gc,
425*b1cdbd2cSJim Jagielski         ControlPart nPart )
426*b1cdbd2cSJim Jagielski {
427*b1cdbd2cSJim Jagielski     if ( !pWidget )
428*b1cdbd2cSJim Jagielski 	return sal_False;
429*b1cdbd2cSJim Jagielski 
430*b1cdbd2cSJim Jagielski     // Normalize the widget
431*b1cdbd2cSJim Jagielski     QPoint   qWidgetPos( pWidget->pos() );
432*b1cdbd2cSJim Jagielski     pWidget->move( 0, 0 );
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski     // Enable/disable the widget
435*b1cdbd2cSJim Jagielski     pWidget->setEnabled( nState & CTRL_STATE_ENABLED );
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski     // Create pixmap to paint to
438*b1cdbd2cSJim Jagielski     QPixmap  qPixmap( pWidget->width(), pWidget->height() );
439*b1cdbd2cSJim Jagielski     QPainter qPainter( &qPixmap );
440*b1cdbd2cSJim Jagielski     QRect    qRect( 0, 0, pWidget->width(), pWidget->height() );
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski     // Use the background of the widget
443*b1cdbd2cSJim Jagielski     qPixmap.fill( pWidget, QPoint(0, 0) );
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski     // Convert the flags
446*b1cdbd2cSJim Jagielski     QStyle::SFlags nStyle = vclStateValue2SFlags( nState, aValue );
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski     // Store the widget class
449*b1cdbd2cSJim Jagielski     const char *pClassName = pWidget->className();
450*b1cdbd2cSJim Jagielski 
451*b1cdbd2cSJim Jagielski     // Draw the widget to the pixmap
452*b1cdbd2cSJim Jagielski     if ( strcmp( "QPushButton", pClassName ) == 0 )
453*b1cdbd2cSJim Jagielski     {
454*b1cdbd2cSJim Jagielski 	// Workaround for the Platinum style.
455*b1cdbd2cSJim Jagielski 	// Platinum takes the state directly from the widget, not from SFlags.
456*b1cdbd2cSJim Jagielski 	QPushButton *pPushButton = static_cast<QPushButton *>( pWidget->qt_cast( "QPushButton" ) );
457*b1cdbd2cSJim Jagielski 	if ( pPushButton )
458*b1cdbd2cSJim Jagielski 	{
459*b1cdbd2cSJim Jagielski 	    pPushButton->setDown   ( nStyle & QStyle::Style_Down );
460*b1cdbd2cSJim Jagielski 	    pPushButton->setOn     ( nStyle & QStyle::Style_On );
461*b1cdbd2cSJim Jagielski 	    pPushButton->setEnabled( nStyle & QStyle::Style_Enabled );
462*b1cdbd2cSJim Jagielski 	}
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski 	kapp->style().drawControl( QStyle::CE_PushButton,
465*b1cdbd2cSJim Jagielski 		&qPainter, pWidget, qRect,
466*b1cdbd2cSJim Jagielski 		pWidget->colorGroup(), nStyle );
467*b1cdbd2cSJim Jagielski     }
468*b1cdbd2cSJim Jagielski     else if ( strcmp( "QRadioButton", pClassName ) == 0 )
469*b1cdbd2cSJim Jagielski     {
470*b1cdbd2cSJim Jagielski 	// Bitblt from the screen, because the radio buttons are usually not
471*b1cdbd2cSJim Jagielski 	// rectangular, and there could be a bitmap under them
472*b1cdbd2cSJim Jagielski 	GC aTmpGC = XCreateGC( dpy, qPixmap.handle(), 0, NULL );
473*b1cdbd2cSJim Jagielski     X11SalGraphics::CopyScreenArea( dpy,
474*b1cdbd2cSJim Jagielski                               drawable, nScreen, nDepth,
475*b1cdbd2cSJim Jagielski                               qPixmap.handle(), qPixmap.x11Screen(), qPixmap.x11Depth(),
476*b1cdbd2cSJim Jagielski                               aTmpGC,
477*b1cdbd2cSJim Jagielski                               qWidgetPos.x(), qWidgetPos.y(), qRect.width(), qRect.height(),
478*b1cdbd2cSJim Jagielski                               0, 0 );
479*b1cdbd2cSJim Jagielski 	XFreeGC( dpy, aTmpGC );
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski 	kapp->style().drawControl( QStyle::CE_RadioButton,
482*b1cdbd2cSJim Jagielski 		&qPainter, pWidget, qRect,
483*b1cdbd2cSJim Jagielski 		pWidget->colorGroup(), nStyle );
484*b1cdbd2cSJim Jagielski     }
485*b1cdbd2cSJim Jagielski     else if ( strcmp( "QCheckBox", pClassName ) == 0 )
486*b1cdbd2cSJim Jagielski     {
487*b1cdbd2cSJim Jagielski 	kapp->style().drawControl( QStyle::CE_CheckBox,
488*b1cdbd2cSJim Jagielski 		&qPainter, pWidget, qRect,
489*b1cdbd2cSJim Jagielski 		pWidget->colorGroup(), nStyle );
490*b1cdbd2cSJim Jagielski     }
491*b1cdbd2cSJim Jagielski     else if ( strcmp( "QComboBox", pClassName ) == 0 )
492*b1cdbd2cSJim Jagielski     {
493*b1cdbd2cSJim Jagielski 	kapp->style().drawComplexControl( QStyle::CC_ComboBox,
494*b1cdbd2cSJim Jagielski 		&qPainter, pWidget, qRect,
495*b1cdbd2cSJim Jagielski 		pWidget->colorGroup(), nStyle );
496*b1cdbd2cSJim Jagielski 
497*b1cdbd2cSJim Jagielski 	// Editable combo box uses the background of the associated edit box
498*b1cdbd2cSJim Jagielski 	QComboBox *pComboBox = static_cast<QComboBox *>( pWidget->qt_cast( "QComboBox" ) );
499*b1cdbd2cSJim Jagielski 	if ( pComboBox && pComboBox->editable() && pComboBox->lineEdit() )
500*b1cdbd2cSJim Jagielski 	{
501*b1cdbd2cSJim Jagielski 	    QColorGroup::ColorRole eColorRole = ( pComboBox->isEnabled() )?
502*b1cdbd2cSJim Jagielski 		QColorGroup::Base: QColorGroup::Background;
503*b1cdbd2cSJim Jagielski 	    qPainter.fillRect(
504*b1cdbd2cSJim Jagielski 		    kapp->style().querySubControlMetrics( QStyle::CC_ComboBox,
505*b1cdbd2cSJim Jagielski 			pComboBox, QStyle::SC_ComboBoxEditField ),
506*b1cdbd2cSJim Jagielski 		    pComboBox->lineEdit()->colorGroup().brush( eColorRole ) );
507*b1cdbd2cSJim Jagielski 	}
508*b1cdbd2cSJim Jagielski     }
509*b1cdbd2cSJim Jagielski     else if ( strcmp( "QLineEdit", pClassName ) == 0 )
510*b1cdbd2cSJim Jagielski     {
511*b1cdbd2cSJim Jagielski 	kapp->style().drawPrimitive( QStyle::PE_PanelLineEdit,
512*b1cdbd2cSJim Jagielski 		&qPainter, qRect,
513*b1cdbd2cSJim Jagielski 		pWidget->colorGroup(), nStyle | QStyle::Style_Sunken );
514*b1cdbd2cSJim Jagielski     }
515*b1cdbd2cSJim Jagielski     else if ( strcmp( "QSpinWidget", pClassName ) == 0 )
516*b1cdbd2cSJim Jagielski     {
517*b1cdbd2cSJim Jagielski 	const SpinbuttonValue* pValue = (aValue.getType() == CTRL_SPINBUTTONS) ? static_cast<const SpinbuttonValue*>(&aValue) : NULL;
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski 	// Is any of the buttons pressed?
520*b1cdbd2cSJim Jagielski 	QStyle::SCFlags eActive = QStyle::SC_None;
521*b1cdbd2cSJim Jagielski 	if ( pValue )
522*b1cdbd2cSJim Jagielski 	{
523*b1cdbd2cSJim Jagielski 	    if ( pValue->mnUpperState & CTRL_STATE_PRESSED )
524*b1cdbd2cSJim Jagielski 		eActive = QStyle::SC_SpinWidgetUp;
525*b1cdbd2cSJim Jagielski 	    else if ( pValue->mnLowerState & CTRL_STATE_PRESSED )
526*b1cdbd2cSJim Jagielski 		eActive = QStyle::SC_SpinWidgetDown;
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski 	    // Update the enable/disable state of the widget
529*b1cdbd2cSJim Jagielski 	    if ( ( nState & CTRL_STATE_ENABLED ) ||
530*b1cdbd2cSJim Jagielski 		    ( pValue->mnUpperState & CTRL_STATE_ENABLED ) ||
531*b1cdbd2cSJim Jagielski 		    ( pValue->mnLowerState & CTRL_STATE_ENABLED ) )
532*b1cdbd2cSJim Jagielski 	    {
533*b1cdbd2cSJim Jagielski 		pWidget->setEnabled( true );
534*b1cdbd2cSJim Jagielski 		nStyle |= QStyle::Style_Enabled;
535*b1cdbd2cSJim Jagielski 	    }
536*b1cdbd2cSJim Jagielski 	    else
537*b1cdbd2cSJim Jagielski 		pWidget->setEnabled( false );
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski 	    // Mouse-over effect
540*b1cdbd2cSJim Jagielski 	    if ( (pValue->mnUpperState & CTRL_STATE_ROLLOVER) ||
541*b1cdbd2cSJim Jagielski 		    (pValue->mnLowerState & CTRL_STATE_ROLLOVER) )
542*b1cdbd2cSJim Jagielski 		nStyle |= QStyle::Style_MouseOver;
543*b1cdbd2cSJim Jagielski 	}
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski 	// Spin widget uses the background of the associated edit box
546*b1cdbd2cSJim Jagielski 	QSpinWidget *pSpinWidget = static_cast<QSpinWidget *>( pWidget->qt_cast( "QSpinWidget" ) );
547*b1cdbd2cSJim Jagielski 	if ( pSpinWidget && pSpinWidget->editWidget() )
548*b1cdbd2cSJim Jagielski 	{
549*b1cdbd2cSJim Jagielski 	    QColorGroup::ColorRole eColorRole = ( pSpinWidget->isEnabled() )?
550*b1cdbd2cSJim Jagielski 		QColorGroup::Base: QColorGroup::Background;
551*b1cdbd2cSJim Jagielski 	    qPainter.fillRect(
552*b1cdbd2cSJim Jagielski 		    kapp->style().querySubControlMetrics( QStyle::CC_SpinWidget,
553*b1cdbd2cSJim Jagielski 			pSpinWidget, QStyle::SC_SpinWidgetEditField ),
554*b1cdbd2cSJim Jagielski 		    pSpinWidget->editWidget()->colorGroup().brush( eColorRole ) );
555*b1cdbd2cSJim Jagielski 	}
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski 	// Adjust the frame (needed for Motif Plus style)
558*b1cdbd2cSJim Jagielski 	QRect qFrameRect = kapp->style().querySubControlMetrics( QStyle::CC_SpinWidget,
559*b1cdbd2cSJim Jagielski 		pWidget, QStyle::SC_SpinWidgetFrame );
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski 	kapp->style().drawComplexControl( QStyle::CC_SpinWidget,
562*b1cdbd2cSJim Jagielski 		&qPainter, pWidget, qFrameRect,
563*b1cdbd2cSJim Jagielski 		pWidget->colorGroup(), nStyle,
564*b1cdbd2cSJim Jagielski 		QStyle::SC_All, eActive );
565*b1cdbd2cSJim Jagielski     }
566*b1cdbd2cSJim Jagielski     else if ( strcmp( "QTabBar", pClassName ) == 0 )
567*b1cdbd2cSJim Jagielski     {
568*b1cdbd2cSJim Jagielski 	const TabitemValue *pValue = static_cast<const TabitemValue *> ( &aValue );
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski 	QTab *pTab = NULL;
571*b1cdbd2cSJim Jagielski 	if ( pValue )
572*b1cdbd2cSJim Jagielski 	{
573*b1cdbd2cSJim Jagielski 	    if ( ( pValue->isFirst() || pValue->isLeftAligned() ) && ( pValue->isLast() || pValue->isRightAligned() ) )
574*b1cdbd2cSJim Jagielski 		pTab = m_pTabAlone;
575*b1cdbd2cSJim Jagielski 	    else if ( pValue->isFirst() || pValue->isLeftAligned() )
576*b1cdbd2cSJim Jagielski 		pTab = m_pTabLeft;
577*b1cdbd2cSJim Jagielski 	    else if ( pValue->isLast() || pValue->isRightAligned() )
578*b1cdbd2cSJim Jagielski 		pTab = m_pTabRight;
579*b1cdbd2cSJim Jagielski 	    else
580*b1cdbd2cSJim Jagielski 		pTab = m_pTabMiddle;
581*b1cdbd2cSJim Jagielski 	}
582*b1cdbd2cSJim Jagielski 	if ( !pTab )
583*b1cdbd2cSJim Jagielski 	    return sal_False;
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski 	pTab->setRect( qRect );
586*b1cdbd2cSJim Jagielski 
587*b1cdbd2cSJim Jagielski 	kapp->style().drawControl( QStyle::CE_TabBarTab,
588*b1cdbd2cSJim Jagielski 		&qPainter, pWidget, qRect,
589*b1cdbd2cSJim Jagielski 		pWidget->colorGroup(), nStyle,
590*b1cdbd2cSJim Jagielski 		QStyleOption( pTab ) );
591*b1cdbd2cSJim Jagielski     }
592*b1cdbd2cSJim Jagielski     else if ( strcmp( "QTabWidget", pClassName ) == 0 )
593*b1cdbd2cSJim Jagielski     {
594*b1cdbd2cSJim Jagielski 	kapp->style().drawPrimitive( QStyle::PE_PanelTabWidget,
595*b1cdbd2cSJim Jagielski 		&qPainter, qRect,
596*b1cdbd2cSJim Jagielski 		pWidget->colorGroup(), nStyle );
597*b1cdbd2cSJim Jagielski     }
598*b1cdbd2cSJim Jagielski     else if ( strcmp( "QListView", pClassName ) == 0 )
599*b1cdbd2cSJim Jagielski     {
600*b1cdbd2cSJim Jagielski 	kapp->style().drawPrimitive( QStyle::PE_Panel,
601*b1cdbd2cSJim Jagielski 		&qPainter, qRect,
602*b1cdbd2cSJim Jagielski 		pWidget->colorGroup(), nStyle | QStyle::Style_Sunken );
603*b1cdbd2cSJim Jagielski     }
604*b1cdbd2cSJim Jagielski     else if ( strcmp( "QScrollBar", pClassName ) == 0 )
605*b1cdbd2cSJim Jagielski     {
606*b1cdbd2cSJim Jagielski 	const ScrollbarValue* pScrollbarVal = (aValue.getType() == CTRL_SCROLLBAR) ? static_cast<const ScrollbarValue*>(&aValue) : NULL;
607*b1cdbd2cSJim Jagielski 
608*b1cdbd2cSJim Jagielski 	QStyle::SCFlags eActive = QStyle::SC_None;
609*b1cdbd2cSJim Jagielski 	if ( pValue )
610*b1cdbd2cSJim Jagielski 	{
611*b1cdbd2cSJim Jagielski 	    // Workaround for Style_MouseOver-aware themes.
612*b1cdbd2cSJim Jagielski 	    // Quite ugly, but I do not know about a better solution.
613*b1cdbd2cSJim Jagielski 	    const char *pStyleName = kapp->style().className();
614*b1cdbd2cSJim Jagielski 	    if ( strcmp( "QMotifPlusStyle", pStyleName ) == 0 )
615*b1cdbd2cSJim Jagielski 	    {
616*b1cdbd2cSJim Jagielski 		nStyle |= QStyle::Style_MouseOver;
617*b1cdbd2cSJim Jagielski 		if ( pValue->mnThumbState & CTRL_STATE_ROLLOVER )
618*b1cdbd2cSJim Jagielski 		    eActive = QStyle::SC_ScrollBarSlider;
619*b1cdbd2cSJim Jagielski 	    }
620*b1cdbd2cSJim Jagielski 	    else if ( strcmp( "QSGIStyle", pStyleName ) == 0 )
621*b1cdbd2cSJim Jagielski 	    {
622*b1cdbd2cSJim Jagielski 		nStyle |= QStyle::Style_MouseOver;
623*b1cdbd2cSJim Jagielski 		if ( pValue->mnButton1State & CTRL_STATE_ROLLOVER )
624*b1cdbd2cSJim Jagielski 		    eActive = QStyle::SC_ScrollBarSubLine;
625*b1cdbd2cSJim Jagielski 		else if ( pValue->mnButton2State & CTRL_STATE_ROLLOVER )
626*b1cdbd2cSJim Jagielski 		    eActive = QStyle::SC_ScrollBarAddLine;
627*b1cdbd2cSJim Jagielski 		else if ( pValue->mnThumbState & CTRL_STATE_ROLLOVER )
628*b1cdbd2cSJim Jagielski 		    eActive = QStyle::SC_ScrollBarSlider;
629*b1cdbd2cSJim Jagielski 	    }
630*b1cdbd2cSJim Jagielski 
631*b1cdbd2cSJim Jagielski 	    if ( pValue->mnButton1State & CTRL_STATE_PRESSED )
632*b1cdbd2cSJim Jagielski 		eActive = QStyle::SC_ScrollBarSubLine;
633*b1cdbd2cSJim Jagielski 	    else if ( pValue->mnButton2State & CTRL_STATE_PRESSED )
634*b1cdbd2cSJim Jagielski 		eActive = QStyle::SC_ScrollBarAddLine;
635*b1cdbd2cSJim Jagielski 	    else if ( pValue->mnThumbState & CTRL_STATE_PRESSED )
636*b1cdbd2cSJim Jagielski 		eActive = QStyle::SC_ScrollBarSlider;
637*b1cdbd2cSJim Jagielski 	    else if ( pValue->mnPage1State & CTRL_STATE_PRESSED )
638*b1cdbd2cSJim Jagielski 		eActive = QStyle::SC_ScrollBarSubPage;
639*b1cdbd2cSJim Jagielski 	    else if ( pValue->mnPage2State & CTRL_STATE_PRESSED )
640*b1cdbd2cSJim Jagielski 		eActive = QStyle::SC_ScrollBarAddPage;
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski 	    // Update the enable/disable state of the widget
643*b1cdbd2cSJim Jagielski 	    if ( ( nState & CTRL_STATE_ENABLED ) ||
644*b1cdbd2cSJim Jagielski 		    ( pValue->mnButton1State & CTRL_STATE_ENABLED ) ||
645*b1cdbd2cSJim Jagielski 		    ( pValue->mnButton2State & CTRL_STATE_ENABLED ) ||
646*b1cdbd2cSJim Jagielski 		    ( pValue->mnThumbState & CTRL_STATE_ENABLED ) ||
647*b1cdbd2cSJim Jagielski 		    ( pValue->mnPage1State & CTRL_STATE_ENABLED ) ||
648*b1cdbd2cSJim Jagielski 		    ( pValue->mnPage2State & CTRL_STATE_ENABLED ) )
649*b1cdbd2cSJim Jagielski 	    {
650*b1cdbd2cSJim Jagielski 		pWidget->setEnabled( true );
651*b1cdbd2cSJim Jagielski 		nStyle |= QStyle::Style_Enabled;
652*b1cdbd2cSJim Jagielski 	    }
653*b1cdbd2cSJim Jagielski 	    else
654*b1cdbd2cSJim Jagielski 		pWidget->setEnabled( false );
655*b1cdbd2cSJim Jagielski 	}
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski 	// Is it a horizontal scroll bar?
658*b1cdbd2cSJim Jagielski 	QScrollBar *pScrollBar = static_cast<QScrollBar *> ( pWidget->qt_cast( "QScrollBar" ) );
659*b1cdbd2cSJim Jagielski 	QStyle::StyleFlags eHoriz = QStyle::Style_Default;
660*b1cdbd2cSJim Jagielski 	if ( pScrollBar && pScrollBar->orientation() == Qt::Horizontal )
661*b1cdbd2cSJim Jagielski 	    eHoriz = QStyle::Style_Horizontal;
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski 	kapp->style().drawComplexControl( QStyle::CC_ScrollBar,
664*b1cdbd2cSJim Jagielski 		&qPainter, pWidget, qRect,
665*b1cdbd2cSJim Jagielski 		pWidget->colorGroup(), nStyle | eHoriz,
666*b1cdbd2cSJim Jagielski 		QStyle::SC_All, eActive );
667*b1cdbd2cSJim Jagielski     }
668*b1cdbd2cSJim Jagielski     else if ( strcmp( "QToolBar", pClassName ) == 0 )
669*b1cdbd2cSJim Jagielski     {
670*b1cdbd2cSJim Jagielski         QToolBar *pToolBar = static_cast< QToolBar * >( pWidget->qt_cast( "QToolBar" ) );
671*b1cdbd2cSJim Jagielski         bool bIsHorizontal = false;
672*b1cdbd2cSJim Jagielski         if ( pToolBar && pToolBar->orientation() == Qt::Horizontal )
673*b1cdbd2cSJim Jagielski         {
674*b1cdbd2cSJim Jagielski             nStyle |= QStyle::Style_Horizontal;
675*b1cdbd2cSJim Jagielski             bIsHorizontal = true;
676*b1cdbd2cSJim Jagielski         }
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski         kapp->style().drawControl( QStyle::CE_DockWindowEmptyArea,
679*b1cdbd2cSJim Jagielski                 &qPainter, pWidget, qRect,
680*b1cdbd2cSJim Jagielski                 pWidget->colorGroup(), nStyle );
681*b1cdbd2cSJim Jagielski 
682*b1cdbd2cSJim Jagielski         kapp->style().drawPrimitive( QStyle::PE_PanelDockWindow,
683*b1cdbd2cSJim Jagielski                 &qPainter, qRect, pWidget->colorGroup(), nStyle );
684*b1cdbd2cSJim Jagielski 
685*b1cdbd2cSJim Jagielski         if ( nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT )
686*b1cdbd2cSJim Jagielski         {
687*b1cdbd2cSJim Jagielski             const ToolbarValue *pValue = static_cast< const ToolbarValue * >( &aValue );
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski             QRect qThumbRect = region2QRect( pValue->maGripRect );
690*b1cdbd2cSJim Jagielski             qThumbRect.moveBy( -qWidgetPos.x(), -qWidgetPos.y() );
691*b1cdbd2cSJim Jagielski             if ( bIsHorizontal )
692*b1cdbd2cSJim Jagielski                 qThumbRect.addCoords( 0, 2, 0, -3 );    // make the thumb a bit nicer
693*b1cdbd2cSJim Jagielski             else
694*b1cdbd2cSJim Jagielski                 qThumbRect.addCoords( 2, 0, -3, 0 );    // make the thumb a bit nicer
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski             if ( kapp->style().inherits( "HighColorStyle" ) ||
697*b1cdbd2cSJim Jagielski                  kapp->style().inherits( "HighContrastStyle" ) ||
698*b1cdbd2cSJim Jagielski                  kapp->style().inherits( "KeramikStyle" ) ||
699*b1cdbd2cSJim Jagielski                  kapp->style().inherits( "KThemeStyle" ) ||
700*b1cdbd2cSJim Jagielski                  kapp->style().inherits( "ThinKeramikStyle" ) )
701*b1cdbd2cSJim Jagielski             {
702*b1cdbd2cSJim Jagielski                 // Workaround for the workaround in KStyle::drawPrimitive()
703*b1cdbd2cSJim Jagielski                 KStyle *pStyle = static_cast< KStyle * >( &kapp->style() );
704*b1cdbd2cSJim Jagielski                 pStyle->drawKStylePrimitive( KStyle::KPE_ToolBarHandle,
705*b1cdbd2cSJim Jagielski                         &qPainter, pToolBar, qThumbRect,
706*b1cdbd2cSJim Jagielski                         pWidget->colorGroup(), nStyle );
707*b1cdbd2cSJim Jagielski             }
708*b1cdbd2cSJim Jagielski             else
709*b1cdbd2cSJim Jagielski                 kapp->style().drawPrimitive( QStyle::PE_DockWindowHandle,
710*b1cdbd2cSJim Jagielski                         &qPainter, qThumbRect, pWidget->colorGroup(), nStyle );
711*b1cdbd2cSJim Jagielski         }
712*b1cdbd2cSJim Jagielski     }
713*b1cdbd2cSJim Jagielski     else if ( strcmp( "QToolButton", pClassName ) == 0 )
714*b1cdbd2cSJim Jagielski     {
715*b1cdbd2cSJim Jagielski         if( (nStyle & QStyle::Style_MouseOver) )
716*b1cdbd2cSJim Jagielski             nStyle &= ~QStyle::Style_Off;
717*b1cdbd2cSJim Jagielski         kapp->style().drawComplexControl( QStyle::CC_ToolButton,
718*b1cdbd2cSJim Jagielski                 &qPainter, pWidget, qRect,
719*b1cdbd2cSJim Jagielski                 pWidget->colorGroup(), nStyle,
720*b1cdbd2cSJim Jagielski                 QStyle::SC_ToolButton );
721*b1cdbd2cSJim Jagielski     }
722*b1cdbd2cSJim Jagielski     else if ( strcmp( "QMenuBar", pClassName ) == 0 )
723*b1cdbd2cSJim Jagielski     {
724*b1cdbd2cSJim Jagielski         if ( nPart == PART_ENTIRE_CONTROL )
725*b1cdbd2cSJim Jagielski         {
726*b1cdbd2cSJim Jagielski             kapp->style().drawControl( QStyle::CE_MenuBarEmptyArea,
727*b1cdbd2cSJim Jagielski                     &qPainter, pWidget, qRect,
728*b1cdbd2cSJim Jagielski                     pWidget->colorGroup(), nStyle );
729*b1cdbd2cSJim Jagielski         }
730*b1cdbd2cSJim Jagielski         else if ( nPart == PART_MENU_ITEM )
731*b1cdbd2cSJim Jagielski         {
732*b1cdbd2cSJim Jagielski             int nMenuItem = ( nStyle & QStyle::Style_Enabled )? m_nMenuBarEnabledItem: m_nMenuBarDisabledItem;
733*b1cdbd2cSJim Jagielski             QMenuItem *pMenuItem = static_cast<QMenuBar*>( pWidget )->findItem( nMenuItem );
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski             if ( nStyle & QStyle::Style_Selected )
736*b1cdbd2cSJim Jagielski                 nStyle |= QStyle::Style_Active | QStyle::Style_Down | QStyle::Style_HasFocus;
737*b1cdbd2cSJim Jagielski 
738*b1cdbd2cSJim Jagielski             kapp->style().drawControl( QStyle::CE_MenuBarItem,
739*b1cdbd2cSJim Jagielski                     &qPainter, pWidget, qRect,
740*b1cdbd2cSJim Jagielski                     pWidget->colorGroup(), nStyle,
741*b1cdbd2cSJim Jagielski                     QStyleOption( pMenuItem ) );
742*b1cdbd2cSJim Jagielski         }
743*b1cdbd2cSJim Jagielski     }
744*b1cdbd2cSJim Jagielski     else if ( strcmp( "QPopupMenu", pClassName ) == 0 )
745*b1cdbd2cSJim Jagielski     {
746*b1cdbd2cSJim Jagielski         int nMenuItem = ( nStyle & QStyle::Style_Enabled )? m_nPopupMenuEnabledItem: m_nPopupMenuDisabledItem;
747*b1cdbd2cSJim Jagielski         QMenuItem *pMenuItem = static_cast<QPopupMenu*>( pWidget )->findItem( nMenuItem );
748*b1cdbd2cSJim Jagielski 
749*b1cdbd2cSJim Jagielski         if ( nStyle & QStyle::Style_Selected )
750*b1cdbd2cSJim Jagielski             nStyle |= QStyle::Style_Active;
751*b1cdbd2cSJim Jagielski 
752*b1cdbd2cSJim Jagielski         kapp->style().drawControl( QStyle::CE_PopupMenuItem,
753*b1cdbd2cSJim Jagielski                 &qPainter, pWidget, qRect,
754*b1cdbd2cSJim Jagielski                 pWidget->colorGroup(), nStyle,
755*b1cdbd2cSJim Jagielski                 QStyleOption( pMenuItem, 0, 0 ) );
756*b1cdbd2cSJim Jagielski     }
757*b1cdbd2cSJim Jagielski     else if ( strcmp( "QProgressBar", pClassName ) == 0 )
758*b1cdbd2cSJim Jagielski     {
759*b1cdbd2cSJim Jagielski         long nProgressWidth = aValue.getNumericVal();
760*b1cdbd2cSJim Jagielski         QProgressBar* pProgress = static_cast<QProgressBar*>(pWidget);
761*b1cdbd2cSJim Jagielski         pProgress->setProgress( nProgressWidth, qRect.width() );
762*b1cdbd2cSJim Jagielski 
763*b1cdbd2cSJim Jagielski         kapp->style().drawControl( QStyle::CE_ProgressBarGroove,
764*b1cdbd2cSJim Jagielski             &qPainter, pWidget, qRect,
765*b1cdbd2cSJim Jagielski             pWidget->colorGroup(), nStyle );
766*b1cdbd2cSJim Jagielski         kapp->style().drawControl( QStyle::CE_ProgressBarContents,
767*b1cdbd2cSJim Jagielski             &qPainter, pWidget, qRect,
768*b1cdbd2cSJim Jagielski             pWidget->colorGroup(), nStyle );
769*b1cdbd2cSJim Jagielski     }
770*b1cdbd2cSJim Jagielski     else
771*b1cdbd2cSJim Jagielski 	return sal_False;
772*b1cdbd2cSJim Jagielski 
773*b1cdbd2cSJim Jagielski     // Bitblt it to the screen
774*b1cdbd2cSJim Jagielski     X11SalGraphics::CopyScreenArea( dpy,
775*b1cdbd2cSJim Jagielski 	                          qPixmap.handle(), qPixmap.x11Screen(), qPixmap.x11Depth(),
776*b1cdbd2cSJim Jagielski                               drawable, nScreen, nDepth,
777*b1cdbd2cSJim Jagielski                               gc,
778*b1cdbd2cSJim Jagielski                               0, 0, qRect.width(), qRect.height(),
779*b1cdbd2cSJim Jagielski                               qWidgetPos.x(), qWidgetPos.y() );
780*b1cdbd2cSJim Jagielski 
781*b1cdbd2cSJim Jagielski     // Restore widget's position
782*b1cdbd2cSJim Jagielski     pWidget->move( qWidgetPos );
783*b1cdbd2cSJim Jagielski 
784*b1cdbd2cSJim Jagielski     return sal_True;
785*b1cdbd2cSJim Jagielski }
786*b1cdbd2cSJim Jagielski 
pushButton(const Rectangle & rControlRegion,sal_Bool bDefault)787*b1cdbd2cSJim Jagielski QPushButton *WidgetPainter::pushButton( const Rectangle& rControlRegion,
788*b1cdbd2cSJim Jagielski 	sal_Bool bDefault )
789*b1cdbd2cSJim Jagielski {
790*b1cdbd2cSJim Jagielski     if ( !m_pPushButton )
791*b1cdbd2cSJim Jagielski 	m_pPushButton = new QPushButton( NULL, "push_button" );
792*b1cdbd2cSJim Jagielski 
793*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
794*b1cdbd2cSJim Jagielski 
795*b1cdbd2cSJim Jagielski     // Workaround for broken styles which do not add
796*b1cdbd2cSJim Jagielski     // QStyle::PM_ButtonDefaultIndicator to the size of the default button
797*b1cdbd2cSJim Jagielski     // (for example Keramik)
798*b1cdbd2cSJim Jagielski     // FIXME Fix Keramik style to be consistant with Qt built-in styles. Aargh!
799*b1cdbd2cSJim Jagielski     if ( bDefault )
800*b1cdbd2cSJim Jagielski     {
801*b1cdbd2cSJim Jagielski 	QSize qContentsSize( 50, 50 );
802*b1cdbd2cSJim Jagielski 	m_pPushButton->setDefault( false );
803*b1cdbd2cSJim Jagielski 	QSize qNormalSize = kapp->style().sizeFromContents( QStyle::CT_PushButton,
804*b1cdbd2cSJim Jagielski 		m_pPushButton, qContentsSize );
805*b1cdbd2cSJim Jagielski 	m_pPushButton->setDefault( true );
806*b1cdbd2cSJim Jagielski 	QSize qDefSize = kapp->style().sizeFromContents( QStyle::CT_PushButton,
807*b1cdbd2cSJim Jagielski 		m_pPushButton, qContentsSize );
808*b1cdbd2cSJim Jagielski 
809*b1cdbd2cSJim Jagielski 	int nIndicatorSize = kapp->style().pixelMetric(
810*b1cdbd2cSJim Jagielski 		QStyle::PM_ButtonDefaultIndicator, m_pPushButton );
811*b1cdbd2cSJim Jagielski 	if ( qNormalSize.width() == qDefSize.width() )
812*b1cdbd2cSJim Jagielski 	    qRect.addCoords( nIndicatorSize, 0, -nIndicatorSize, 0 );
813*b1cdbd2cSJim Jagielski 	if ( qNormalSize.height() == qDefSize.height() )
814*b1cdbd2cSJim Jagielski 	    qRect.addCoords( 0, nIndicatorSize, 0, -nIndicatorSize );
815*b1cdbd2cSJim Jagielski     }
816*b1cdbd2cSJim Jagielski 
817*b1cdbd2cSJim Jagielski     m_pPushButton->move( qRect.topLeft() );
818*b1cdbd2cSJim Jagielski     m_pPushButton->resize( qRect.size() );
819*b1cdbd2cSJim Jagielski     m_pPushButton->setDefault( bDefault );
820*b1cdbd2cSJim Jagielski 
821*b1cdbd2cSJim Jagielski     return m_pPushButton;
822*b1cdbd2cSJim Jagielski }
823*b1cdbd2cSJim Jagielski 
radioButton(const Rectangle & rControlRegion)824*b1cdbd2cSJim Jagielski QRadioButton *WidgetPainter::radioButton( const Rectangle& rControlRegion )
825*b1cdbd2cSJim Jagielski {
826*b1cdbd2cSJim Jagielski     if ( !m_pRadioButton )
827*b1cdbd2cSJim Jagielski 	m_pRadioButton = new QRadioButton( NULL, "radio_button" );
828*b1cdbd2cSJim Jagielski 
829*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
830*b1cdbd2cSJim Jagielski 
831*b1cdbd2cSJim Jagielski     // Workaround for broken themes which do not honor the given size.
832*b1cdbd2cSJim Jagielski     // Quite ugly, but I do not know about a better solution.
833*b1cdbd2cSJim Jagielski     const char *pStyleName = kapp->style().className();
834*b1cdbd2cSJim Jagielski     if ( strcmp( "KThemeStyle", pStyleName ) == 0 )
835*b1cdbd2cSJim Jagielski     {
836*b1cdbd2cSJim Jagielski 	QRect qOldRect( qRect );
837*b1cdbd2cSJim Jagielski 
838*b1cdbd2cSJim Jagielski 	qRect.setWidth( kapp->style().pixelMetric(
839*b1cdbd2cSJim Jagielski 		QStyle::PM_ExclusiveIndicatorWidth, m_pRadioButton ) );
840*b1cdbd2cSJim Jagielski 	qRect.setHeight( kapp->style().pixelMetric(
841*b1cdbd2cSJim Jagielski 		QStyle::PM_ExclusiveIndicatorHeight, m_pRadioButton ) );
842*b1cdbd2cSJim Jagielski 
843*b1cdbd2cSJim Jagielski 	qRect.moveBy( ( qOldRect.width() - qRect.width() ) / 2,
844*b1cdbd2cSJim Jagielski 		( qOldRect.height() - qRect.height() ) / 2 );
845*b1cdbd2cSJim Jagielski     }
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski     m_pRadioButton->move( qRect.topLeft() );
848*b1cdbd2cSJim Jagielski     m_pRadioButton->resize( qRect.size() );
849*b1cdbd2cSJim Jagielski 
850*b1cdbd2cSJim Jagielski     return m_pRadioButton;
851*b1cdbd2cSJim Jagielski }
852*b1cdbd2cSJim Jagielski 
checkBox(const Rectangle & rControlRegion)853*b1cdbd2cSJim Jagielski QCheckBox *WidgetPainter::checkBox( const Rectangle& rControlRegion )
854*b1cdbd2cSJim Jagielski {
855*b1cdbd2cSJim Jagielski     if ( !m_pCheckBox )
856*b1cdbd2cSJim Jagielski 	m_pCheckBox = new QCheckBox( NULL, "check_box" );
857*b1cdbd2cSJim Jagielski 
858*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
859*b1cdbd2cSJim Jagielski 
860*b1cdbd2cSJim Jagielski     // Workaround for broken themes which do not honor the given size.
861*b1cdbd2cSJim Jagielski     // Quite ugly, but I do not know about a better solution.
862*b1cdbd2cSJim Jagielski     const char *pStyleName = kapp->style().className();
863*b1cdbd2cSJim Jagielski     if ( strcmp( "KThemeStyle", pStyleName ) == 0 )
864*b1cdbd2cSJim Jagielski     {
865*b1cdbd2cSJim Jagielski 	QRect qOldRect( qRect );
866*b1cdbd2cSJim Jagielski 
867*b1cdbd2cSJim Jagielski 	qRect.setWidth( kapp->style().pixelMetric(
868*b1cdbd2cSJim Jagielski 		QStyle::PM_IndicatorWidth, m_pCheckBox ) );
869*b1cdbd2cSJim Jagielski 	qRect.setHeight( kapp->style().pixelMetric(
870*b1cdbd2cSJim Jagielski 		QStyle::PM_IndicatorHeight, m_pCheckBox ) );
871*b1cdbd2cSJim Jagielski 
872*b1cdbd2cSJim Jagielski 	qRect.moveBy( ( qOldRect.width() - qRect.width() ) / 2,
873*b1cdbd2cSJim Jagielski 		( qOldRect.height() - qRect.height() ) / 2 );
874*b1cdbd2cSJim Jagielski     }
875*b1cdbd2cSJim Jagielski 
876*b1cdbd2cSJim Jagielski     m_pCheckBox->move( qRect.topLeft() );
877*b1cdbd2cSJim Jagielski     m_pCheckBox->resize( qRect.size() );
878*b1cdbd2cSJim Jagielski 
879*b1cdbd2cSJim Jagielski     return m_pCheckBox;
880*b1cdbd2cSJim Jagielski }
881*b1cdbd2cSJim Jagielski 
comboBox(const Rectangle & rControlRegion,sal_Bool bEditable)882*b1cdbd2cSJim Jagielski QComboBox *WidgetPainter::comboBox( const Rectangle& rControlRegion,
883*b1cdbd2cSJim Jagielski 	sal_Bool bEditable )
884*b1cdbd2cSJim Jagielski {
885*b1cdbd2cSJim Jagielski     QComboBox *pComboBox = NULL;
886*b1cdbd2cSJim Jagielski     if ( bEditable )
887*b1cdbd2cSJim Jagielski     {
888*b1cdbd2cSJim Jagielski 	if ( !m_pEditableComboBox )
889*b1cdbd2cSJim Jagielski 	    m_pEditableComboBox = new QComboBox( true, NULL, "combo_box_edit" );
890*b1cdbd2cSJim Jagielski 	pComboBox = m_pEditableComboBox;
891*b1cdbd2cSJim Jagielski     }
892*b1cdbd2cSJim Jagielski     else
893*b1cdbd2cSJim Jagielski     {
894*b1cdbd2cSJim Jagielski 	if ( !m_pComboBox )
895*b1cdbd2cSJim Jagielski 	    m_pComboBox = new QComboBox( false, NULL, "combo_box" );
896*b1cdbd2cSJim Jagielski 	pComboBox = m_pComboBox;
897*b1cdbd2cSJim Jagielski     }
898*b1cdbd2cSJim Jagielski 
899*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
900*b1cdbd2cSJim Jagielski 
901*b1cdbd2cSJim Jagielski     pComboBox->move( qRect.topLeft() );
902*b1cdbd2cSJim Jagielski     pComboBox->resize( qRect.size() );
903*b1cdbd2cSJim Jagielski 
904*b1cdbd2cSJim Jagielski     return pComboBox;
905*b1cdbd2cSJim Jagielski }
906*b1cdbd2cSJim Jagielski 
lineEdit(const Rectangle & rControlRegion)907*b1cdbd2cSJim Jagielski QLineEdit *WidgetPainter::lineEdit( const Rectangle& rControlRegion )
908*b1cdbd2cSJim Jagielski {
909*b1cdbd2cSJim Jagielski     if ( !m_pLineEdit )
910*b1cdbd2cSJim Jagielski 	m_pLineEdit = new QLineEdit( NULL, "line_edit" );
911*b1cdbd2cSJim Jagielski 
912*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
913*b1cdbd2cSJim Jagielski 
914*b1cdbd2cSJim Jagielski     m_pLineEdit->move( qRect.topLeft() );
915*b1cdbd2cSJim Jagielski     m_pLineEdit->resize( qRect.size() );
916*b1cdbd2cSJim Jagielski 
917*b1cdbd2cSJim Jagielski     return m_pLineEdit;
918*b1cdbd2cSJim Jagielski }
919*b1cdbd2cSJim Jagielski 
spinWidget(const Rectangle & rControlRegion)920*b1cdbd2cSJim Jagielski QSpinWidget *WidgetPainter::spinWidget( const Rectangle& rControlRegion )
921*b1cdbd2cSJim Jagielski {
922*b1cdbd2cSJim Jagielski     if ( !m_pSpinWidget )
923*b1cdbd2cSJim Jagielski     {
924*b1cdbd2cSJim Jagielski 	m_pSpinWidget = new QSpinWidget( NULL, "spin_widget" );
925*b1cdbd2cSJim Jagielski 
926*b1cdbd2cSJim Jagielski 	m_pSpinEdit = new QLineEdit( NULL, "line_edit_spin" );
927*b1cdbd2cSJim Jagielski 	m_pSpinWidget->setEditWidget( m_pSpinEdit );
928*b1cdbd2cSJim Jagielski     }
929*b1cdbd2cSJim Jagielski 
930*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
931*b1cdbd2cSJim Jagielski 
932*b1cdbd2cSJim Jagielski     m_pSpinWidget->move( qRect.topLeft() );
933*b1cdbd2cSJim Jagielski     m_pSpinWidget->resize( qRect.size() );
934*b1cdbd2cSJim Jagielski     m_pSpinWidget->arrange();
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski     return m_pSpinWidget;
937*b1cdbd2cSJim Jagielski }
938*b1cdbd2cSJim Jagielski 
tabBar(const Rectangle & rControlRegion)939*b1cdbd2cSJim Jagielski QTabBar *WidgetPainter::tabBar( const Rectangle& rControlRegion )
940*b1cdbd2cSJim Jagielski {
941*b1cdbd2cSJim Jagielski     if ( !m_pTabBar )
942*b1cdbd2cSJim Jagielski     {
943*b1cdbd2cSJim Jagielski 	if ( !m_pTabBarParent )
944*b1cdbd2cSJim Jagielski 	    m_pTabBarParent = new QWidget( NULL, "tab_bar_parent" );
945*b1cdbd2cSJim Jagielski 
946*b1cdbd2cSJim Jagielski 	m_pTabBar = new QTabBar( m_pTabBarParent, "tab_bar" );
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski 	m_pTabLeft = new QTab();
949*b1cdbd2cSJim Jagielski 	m_pTabMiddle = new QTab();
950*b1cdbd2cSJim Jagielski 	m_pTabRight = new QTab();
951*b1cdbd2cSJim Jagielski 	m_pTabAlone = new QTab();
952*b1cdbd2cSJim Jagielski 
953*b1cdbd2cSJim Jagielski 	m_pTabBar->addTab( m_pTabLeft );
954*b1cdbd2cSJim Jagielski 	m_pTabBar->addTab( m_pTabMiddle );
955*b1cdbd2cSJim Jagielski 	m_pTabBar->addTab( m_pTabRight );
956*b1cdbd2cSJim Jagielski     }
957*b1cdbd2cSJim Jagielski 
958*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
959*b1cdbd2cSJim Jagielski 
960*b1cdbd2cSJim Jagielski     m_pTabBar->move( qRect.topLeft() );
961*b1cdbd2cSJim Jagielski     m_pTabBar->resize( qRect.size() );
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski     m_pTabBar->setShape( QTabBar::RoundedAbove );
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski     return m_pTabBar;
966*b1cdbd2cSJim Jagielski }
967*b1cdbd2cSJim Jagielski 
tabWidget(const Rectangle & rControlRegion)968*b1cdbd2cSJim Jagielski QTabWidget *WidgetPainter::tabWidget( const Rectangle& rControlRegion )
969*b1cdbd2cSJim Jagielski {
970*b1cdbd2cSJim Jagielski     if ( !m_pTabWidget )
971*b1cdbd2cSJim Jagielski 	m_pTabWidget = new QTabWidget( NULL, "tab_widget" );
972*b1cdbd2cSJim Jagielski 
973*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
974*b1cdbd2cSJim Jagielski     --qRect.rTop();
975*b1cdbd2cSJim Jagielski 
976*b1cdbd2cSJim Jagielski     m_pTabWidget->move( qRect.topLeft() );
977*b1cdbd2cSJim Jagielski     m_pTabWidget->resize( qRect.size() );
978*b1cdbd2cSJim Jagielski 
979*b1cdbd2cSJim Jagielski     return m_pTabWidget;
980*b1cdbd2cSJim Jagielski }
981*b1cdbd2cSJim Jagielski 
listView(const Rectangle & rControlRegion)982*b1cdbd2cSJim Jagielski QListView *WidgetPainter::listView( const Rectangle& rControlRegion )
983*b1cdbd2cSJim Jagielski {
984*b1cdbd2cSJim Jagielski     if ( !m_pListView )
985*b1cdbd2cSJim Jagielski 	m_pListView = new QListView( NULL, "list_view" );
986*b1cdbd2cSJim Jagielski 
987*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
988*b1cdbd2cSJim Jagielski 
989*b1cdbd2cSJim Jagielski     m_pListView->move( qRect.topLeft() );
990*b1cdbd2cSJim Jagielski     m_pListView->resize( qRect.size() );
991*b1cdbd2cSJim Jagielski 
992*b1cdbd2cSJim Jagielski     return m_pListView;
993*b1cdbd2cSJim Jagielski }
994*b1cdbd2cSJim Jagielski 
scrollBar(const Rectangle & rControlRegion,sal_Bool bHorizontal,const ImplControlValue & aValue)995*b1cdbd2cSJim Jagielski QScrollBar *WidgetPainter::scrollBar( const Rectangle& rControlRegion,
996*b1cdbd2cSJim Jagielski 	sal_Bool bHorizontal, const ImplControlValue& aValue )
997*b1cdbd2cSJim Jagielski {
998*b1cdbd2cSJim Jagielski     if ( !m_pScrollBar )
999*b1cdbd2cSJim Jagielski     {
1000*b1cdbd2cSJim Jagielski 	m_pScrollBar = new QScrollBar( NULL, "scroll_bar" );
1001*b1cdbd2cSJim Jagielski 	m_pScrollBar->setTracking( false );
1002*b1cdbd2cSJim Jagielski 	m_pScrollBar->setLineStep( 1 );
1003*b1cdbd2cSJim Jagielski     }
1004*b1cdbd2cSJim Jagielski 
1005*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
1006*b1cdbd2cSJim Jagielski 
1007*b1cdbd2cSJim Jagielski     m_pScrollBar->move( qRect.topLeft() );
1008*b1cdbd2cSJim Jagielski     m_pScrollBar->resize( qRect.size() );
1009*b1cdbd2cSJim Jagielski     m_pScrollBar->setOrientation( bHorizontal? Qt::Horizontal: Qt::Vertical );
1010*b1cdbd2cSJim Jagielski 
1011*b1cdbd2cSJim Jagielski     const ScrollbarValue* pScrollbarVal = (aValue.getType() == CTRL_SCROLLBAR) ? static_cast<const ScrollbarValue*>(&aValue) : NULL;
1012*b1cdbd2cSJim Jagielski     if ( pValue )
1013*b1cdbd2cSJim Jagielski     {
1014*b1cdbd2cSJim Jagielski 	m_pScrollBar->setMinValue( pValue->mnMin );
1015*b1cdbd2cSJim Jagielski 	m_pScrollBar->setMaxValue( pValue->mnMax - pValue->mnVisibleSize );
1016*b1cdbd2cSJim Jagielski 	m_pScrollBar->setValue( pValue->mnCur );
1017*b1cdbd2cSJim Jagielski 	m_pScrollBar->setPageStep( pValue->mnVisibleSize );
1018*b1cdbd2cSJim Jagielski     }
1019*b1cdbd2cSJim Jagielski 
1020*b1cdbd2cSJim Jagielski     return m_pScrollBar;
1021*b1cdbd2cSJim Jagielski }
1022*b1cdbd2cSJim Jagielski 
toolBar(const Rectangle & rControlRegion,sal_Bool bHorizontal)1023*b1cdbd2cSJim Jagielski QToolBar *WidgetPainter::toolBar( const Rectangle& rControlRegion, sal_Bool bHorizontal )
1024*b1cdbd2cSJim Jagielski {
1025*b1cdbd2cSJim Jagielski     if ( !m_pMainWindow )
1026*b1cdbd2cSJim Jagielski         m_pMainWindow = new QMainWindow( NULL, "main_window" );
1027*b1cdbd2cSJim Jagielski 
1028*b1cdbd2cSJim Jagielski     QToolBar *pToolBar;
1029*b1cdbd2cSJim Jagielski     if ( bHorizontal )
1030*b1cdbd2cSJim Jagielski     {
1031*b1cdbd2cSJim Jagielski         if ( !m_pToolBarHoriz )
1032*b1cdbd2cSJim Jagielski         {
1033*b1cdbd2cSJim Jagielski             m_pToolBarHoriz = new QToolBar( m_pMainWindow, "tool_bar_horiz" );
1034*b1cdbd2cSJim Jagielski             m_pMainWindow->moveDockWindow( m_pToolBarHoriz, Qt::DockTop );
1035*b1cdbd2cSJim Jagielski         }
1036*b1cdbd2cSJim Jagielski         pToolBar = m_pToolBarHoriz;
1037*b1cdbd2cSJim Jagielski     }
1038*b1cdbd2cSJim Jagielski     else
1039*b1cdbd2cSJim Jagielski     {
1040*b1cdbd2cSJim Jagielski         if ( !m_pToolBarVert )
1041*b1cdbd2cSJim Jagielski         {
1042*b1cdbd2cSJim Jagielski             m_pToolBarVert = new QToolBar( m_pMainWindow, "tool_bar_horiz" );
1043*b1cdbd2cSJim Jagielski             m_pMainWindow->moveDockWindow( m_pToolBarVert, Qt::DockLeft );
1044*b1cdbd2cSJim Jagielski         }
1045*b1cdbd2cSJim Jagielski         pToolBar = m_pToolBarVert;
1046*b1cdbd2cSJim Jagielski     }
1047*b1cdbd2cSJim Jagielski 
1048*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
1049*b1cdbd2cSJim Jagielski 
1050*b1cdbd2cSJim Jagielski     pToolBar->move( qRect.topLeft() );
1051*b1cdbd2cSJim Jagielski     pToolBar->resize( qRect.size() );
1052*b1cdbd2cSJim Jagielski 
1053*b1cdbd2cSJim Jagielski     return pToolBar;
1054*b1cdbd2cSJim Jagielski }
1055*b1cdbd2cSJim Jagielski 
toolButton(const Rectangle & rControlRegion)1056*b1cdbd2cSJim Jagielski QToolButton *WidgetPainter::toolButton( const Rectangle& rControlRegion)
1057*b1cdbd2cSJim Jagielski {
1058*b1cdbd2cSJim Jagielski     if ( !m_pToolButton )
1059*b1cdbd2cSJim Jagielski 	m_pToolButton = new QToolButton( NULL, "tool_button" );
1060*b1cdbd2cSJim Jagielski 
1061*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
1062*b1cdbd2cSJim Jagielski 
1063*b1cdbd2cSJim Jagielski     m_pToolButton->move( qRect.topLeft() );
1064*b1cdbd2cSJim Jagielski     m_pToolButton->resize( qRect.size() );
1065*b1cdbd2cSJim Jagielski 
1066*b1cdbd2cSJim Jagielski     return m_pToolButton;
1067*b1cdbd2cSJim Jagielski }
1068*b1cdbd2cSJim Jagielski 
menuBar(const Rectangle & rControlRegion)1069*b1cdbd2cSJim Jagielski QMenuBar *WidgetPainter::menuBar( const Rectangle& rControlRegion)
1070*b1cdbd2cSJim Jagielski {
1071*b1cdbd2cSJim Jagielski     if ( !m_pMenuBar )
1072*b1cdbd2cSJim Jagielski     {
1073*b1cdbd2cSJim Jagielski         m_pMenuBar = new QMenuBar( NULL, "menu_bar" );
1074*b1cdbd2cSJim Jagielski 
1075*b1cdbd2cSJim Jagielski         m_nMenuBarEnabledItem = m_pMenuBar->insertItem( "" );
1076*b1cdbd2cSJim Jagielski         m_nMenuBarDisabledItem = m_pMenuBar->insertItem( "" );
1077*b1cdbd2cSJim Jagielski 
1078*b1cdbd2cSJim Jagielski         m_pMenuBar->setItemEnabled( m_nMenuBarEnabledItem, true );
1079*b1cdbd2cSJim Jagielski         m_pMenuBar->setItemEnabled( m_nMenuBarDisabledItem, false );
1080*b1cdbd2cSJim Jagielski     }
1081*b1cdbd2cSJim Jagielski 
1082*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
1083*b1cdbd2cSJim Jagielski 
1084*b1cdbd2cSJim Jagielski     m_pMenuBar->move( qRect.topLeft() );
1085*b1cdbd2cSJim Jagielski     m_pMenuBar->resize( qRect.size() );
1086*b1cdbd2cSJim Jagielski 
1087*b1cdbd2cSJim Jagielski     return m_pMenuBar;
1088*b1cdbd2cSJim Jagielski }
1089*b1cdbd2cSJim Jagielski 
popupMenu(const Rectangle & rControlRegion)1090*b1cdbd2cSJim Jagielski QPopupMenu *WidgetPainter::popupMenu( const Rectangle& rControlRegion)
1091*b1cdbd2cSJim Jagielski {
1092*b1cdbd2cSJim Jagielski     if ( !m_pPopupMenu )
1093*b1cdbd2cSJim Jagielski     {
1094*b1cdbd2cSJim Jagielski         m_pPopupMenu = new QPopupMenu( NULL, "popup_menu" );
1095*b1cdbd2cSJim Jagielski 
1096*b1cdbd2cSJim Jagielski         m_nPopupMenuEnabledItem = m_pPopupMenu->insertItem( "" );
1097*b1cdbd2cSJim Jagielski         m_nPopupMenuDisabledItem = m_pPopupMenu->insertItem( "" );
1098*b1cdbd2cSJim Jagielski 
1099*b1cdbd2cSJim Jagielski         m_pPopupMenu->setItemEnabled( m_nPopupMenuEnabledItem, true );
1100*b1cdbd2cSJim Jagielski         m_pPopupMenu->setItemEnabled( m_nPopupMenuDisabledItem, false );
1101*b1cdbd2cSJim Jagielski     }
1102*b1cdbd2cSJim Jagielski 
1103*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
1104*b1cdbd2cSJim Jagielski 
1105*b1cdbd2cSJim Jagielski     m_pPopupMenu->move( qRect.topLeft() );
1106*b1cdbd2cSJim Jagielski     m_pPopupMenu->resize( qRect.size() );
1107*b1cdbd2cSJim Jagielski 
1108*b1cdbd2cSJim Jagielski     return m_pPopupMenu;
1109*b1cdbd2cSJim Jagielski }
1110*b1cdbd2cSJim Jagielski 
progressBar(const Rectangle & rControlRegion)1111*b1cdbd2cSJim Jagielski QProgressBar *WidgetPainter::progressBar( const Rectangle& rControlRegion )
1112*b1cdbd2cSJim Jagielski {
1113*b1cdbd2cSJim Jagielski     if ( !m_pProgressBar )
1114*b1cdbd2cSJim Jagielski 	m_pProgressBar = new QProgressBar( NULL, "progress_bar" );
1115*b1cdbd2cSJim Jagielski 
1116*b1cdbd2cSJim Jagielski     QRect qRect = region2QRect( rControlRegion );
1117*b1cdbd2cSJim Jagielski 
1118*b1cdbd2cSJim Jagielski     m_pProgressBar->move( qRect.topLeft() );
1119*b1cdbd2cSJim Jagielski     m_pProgressBar->resize( qRect.size() );
1120*b1cdbd2cSJim Jagielski 
1121*b1cdbd2cSJim Jagielski     return m_pProgressBar;
1122*b1cdbd2cSJim Jagielski }
1123*b1cdbd2cSJim Jagielski 
vclStateValue2SFlags(ControlState nState,const ImplControlValue & aValue)1124*b1cdbd2cSJim Jagielski QStyle::SFlags WidgetPainter::vclStateValue2SFlags( ControlState nState,
1125*b1cdbd2cSJim Jagielski 	const ImplControlValue& aValue )
1126*b1cdbd2cSJim Jagielski {
1127*b1cdbd2cSJim Jagielski     QStyle::SFlags nStyle =
1128*b1cdbd2cSJim Jagielski 	( (nState & CTRL_STATE_DEFAULT)?  QStyle::Style_ButtonDefault: QStyle::Style_Default ) |
1129*b1cdbd2cSJim Jagielski 	( (nState & CTRL_STATE_ENABLED)?  QStyle::Style_Enabled:       QStyle::Style_Default ) |
1130*b1cdbd2cSJim Jagielski 	( (nState & CTRL_STATE_FOCUSED)?  QStyle::Style_HasFocus:      QStyle::Style_Default ) |
1131*b1cdbd2cSJim Jagielski 	( (nState & CTRL_STATE_PRESSED)?  QStyle::Style_Down:          QStyle::Style_Raised )  |
1132*b1cdbd2cSJim Jagielski 	( (nState & CTRL_STATE_SELECTED)? QStyle::Style_Selected :     QStyle::Style_Default ) |
1133*b1cdbd2cSJim Jagielski 	( (nState & CTRL_STATE_ROLLOVER)? QStyle::Style_MouseOver:     QStyle::Style_Default );
1134*b1cdbd2cSJim Jagielski 	//TODO ( (nState & CTRL_STATE_HIDDEN)?   QStyle::Style_: QStyle::Style_Default ) |
1135*b1cdbd2cSJim Jagielski 
1136*b1cdbd2cSJim Jagielski     switch ( aValue.getTristateVal() )
1137*b1cdbd2cSJim Jagielski     {
1138*b1cdbd2cSJim Jagielski 	case BUTTONVALUE_ON:    nStyle |= QStyle::Style_On;       break;
1139*b1cdbd2cSJim Jagielski 	case BUTTONVALUE_OFF:   nStyle |= QStyle::Style_Off;      break;
1140*b1cdbd2cSJim Jagielski 	case BUTTONVALUE_MIXED: nStyle |= QStyle::Style_NoChange; break;
1141*b1cdbd2cSJim Jagielski     default: break;
1142*b1cdbd2cSJim Jagielski     }
1143*b1cdbd2cSJim Jagielski 
1144*b1cdbd2cSJim Jagielski     return nStyle;
1145*b1cdbd2cSJim Jagielski }
1146*b1cdbd2cSJim Jagielski 
region2QRect(const Rectangle & rControlRegion)1147*b1cdbd2cSJim Jagielski QRect WidgetPainter::region2QRect( const Rectangle& rControlRegion )
1148*b1cdbd2cSJim Jagielski {
1149*b1cdbd2cSJim Jagielski     return QRect( QPoint( rControlRegion.Left(), rControlRegion.Top() ),
1150*b1cdbd2cSJim Jagielski                   QPoint( rControlRegion.Right(), rControlRegion.Bottom() ) );
1151*b1cdbd2cSJim Jagielski }
1152*b1cdbd2cSJim Jagielski 
1153*b1cdbd2cSJim Jagielski /** Instance of WidgetPainter.
1154*b1cdbd2cSJim Jagielski 
1155*b1cdbd2cSJim Jagielski     It is used to paint the widgets requested by NWF.
1156*b1cdbd2cSJim Jagielski */
1157*b1cdbd2cSJim Jagielski static WidgetPainter *pWidgetPainter;
1158*b1cdbd2cSJim Jagielski 
1159*b1cdbd2cSJim Jagielski class KDESalGraphics : public X11SalGraphics
1160*b1cdbd2cSJim Jagielski {
1161*b1cdbd2cSJim Jagielski   public:
KDESalGraphics()1162*b1cdbd2cSJim Jagielski 	KDESalGraphics() {}
~KDESalGraphics()1163*b1cdbd2cSJim Jagielski 	virtual ~KDESalGraphics() {}
1164*b1cdbd2cSJim Jagielski 	virtual sal_Bool IsNativeControlSupported( ControlType nType, ControlPart nPart );
1165*b1cdbd2cSJim Jagielski 	virtual sal_Bool hitTestNativeControl( ControlType nType, ControlPart nPart,
1166*b1cdbd2cSJim Jagielski 									   const Rectangle& rControlRegion, const Point& aPos,
1167*b1cdbd2cSJim Jagielski 									   sal_Bool& rIsInside );
1168*b1cdbd2cSJim Jagielski 	virtual sal_Bool drawNativeControl( ControlType nType, ControlPart nPart,
1169*b1cdbd2cSJim Jagielski 									const Rectangle& rControlRegion, ControlState nState,
1170*b1cdbd2cSJim Jagielski 									const ImplControlValue& aValue,
1171*b1cdbd2cSJim Jagielski 									const OUString& aCaption );
1172*b1cdbd2cSJim Jagielski 	virtual sal_Bool drawNativeControlText( ControlType nType, ControlPart nPart,
1173*b1cdbd2cSJim Jagielski 										const Rectangle& rControlRegion, ControlState nState,
1174*b1cdbd2cSJim Jagielski 										const ImplControlValue& aValue,
1175*b1cdbd2cSJim Jagielski 										const OUString& aCaption );
1176*b1cdbd2cSJim Jagielski 	virtual sal_Bool getNativeControlRegion( ControlType nType, ControlPart nPart,
1177*b1cdbd2cSJim Jagielski 										 const Rectangle& rControlRegion, ControlState nState,
1178*b1cdbd2cSJim Jagielski 										 const ImplControlValue& aValue,
1179*b1cdbd2cSJim Jagielski 										 const OUString& aCaption,
1180*b1cdbd2cSJim Jagielski 										 Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion );
1181*b1cdbd2cSJim Jagielski };
1182*b1cdbd2cSJim Jagielski 
1183*b1cdbd2cSJim Jagielski /** What widgets can be drawn the native way.
1184*b1cdbd2cSJim Jagielski 
1185*b1cdbd2cSJim Jagielski     @param nType
1186*b1cdbd2cSJim Jagielski     Type of the widget.
1187*b1cdbd2cSJim Jagielski 
1188*b1cdbd2cSJim Jagielski     @param nPart
1189*b1cdbd2cSJim Jagielski     Specification of the widget's part if it consists of more than one.
1190*b1cdbd2cSJim Jagielski 
1191*b1cdbd2cSJim Jagielski     @return sal_True if the platform supports native drawing of the widget nType
1192*b1cdbd2cSJim Jagielski     defined by nPart.
1193*b1cdbd2cSJim Jagielski */
IsNativeControlSupported(ControlType nType,ControlPart nPart)1194*b1cdbd2cSJim Jagielski sal_Bool KDESalGraphics::IsNativeControlSupported( ControlType nType, ControlPart nPart )
1195*b1cdbd2cSJim Jagielski {
1196*b1cdbd2cSJim Jagielski     return
1197*b1cdbd2cSJim Jagielski 	( (nType == CTRL_PUSHBUTTON)  && (nPart == PART_ENTIRE_CONTROL) ) ||
1198*b1cdbd2cSJim Jagielski 	( (nType == CTRL_RADIOBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) ||
1199*b1cdbd2cSJim Jagielski 	( (nType == CTRL_CHECKBOX)    && (nPart == PART_ENTIRE_CONTROL) ) ||
1200*b1cdbd2cSJim Jagielski 	( (nType == CTRL_COMBOBOX)    && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) ||
1201*b1cdbd2cSJim Jagielski 	( (nType == CTRL_EDITBOX)     && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) ||
1202*b1cdbd2cSJim Jagielski 	( (nType == CTRL_LISTBOX)     && (nPart == PART_ENTIRE_CONTROL || nPart == PART_WINDOW || nPart == HAS_BACKGROUND_TEXTURE ) ) ||
1203*b1cdbd2cSJim Jagielski 	( (nType == CTRL_SPINBOX)     && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) ||
1204*b1cdbd2cSJim Jagielski 	// no CTRL_SPINBUTTONS for KDE
1205*b1cdbd2cSJim Jagielski 	( (nType == CTRL_TAB_ITEM)    && (nPart == PART_ENTIRE_CONTROL) ) ||
1206*b1cdbd2cSJim Jagielski 	( (nType == CTRL_TAB_PANE)    && (nPart == PART_ENTIRE_CONTROL) ) ||
1207*b1cdbd2cSJim Jagielski 	// no CTRL_TAB_BODY for KDE
1208*b1cdbd2cSJim Jagielski 	( (nType == CTRL_SCROLLBAR)   && (nPart == PART_ENTIRE_CONTROL || nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT) ) ||
1209*b1cdbd2cSJim Jagielski 	( (nType == CTRL_SCROLLBAR)   && (nPart == HAS_THREE_BUTTONS) ) || // TODO small optimization is possible here: return this only if the style really has 3 buttons
1210*b1cdbd2cSJim Jagielski 	// CTRL_GROUPBOX not supported
1211*b1cdbd2cSJim Jagielski 	// CTRL_FIXEDLINE not supported
1212*b1cdbd2cSJim Jagielski 	// CTRL_FIXEDBORDER not supported
1213*b1cdbd2cSJim Jagielski     ( (nType == CTRL_TOOLBAR)     && (nPart == PART_ENTIRE_CONTROL ||
1214*b1cdbd2cSJim Jagielski                                       nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT ||
1215*b1cdbd2cSJim Jagielski                                       nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT ||
1216*b1cdbd2cSJim Jagielski                                       nPart == PART_BUTTON) ) ||
1217*b1cdbd2cSJim Jagielski     ( (nType == CTRL_MENUBAR)     && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) ||
1218*b1cdbd2cSJim Jagielski     ( (nType == CTRL_MENU_POPUP)  && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) ||
1219*b1cdbd2cSJim Jagielski 	( (nType == CTRL_PROGRESS)    && (nPart == PART_ENTIRE_CONTROL) )
1220*b1cdbd2cSJim Jagielski         ;
1221*b1cdbd2cSJim Jagielski }
1222*b1cdbd2cSJim Jagielski 
1223*b1cdbd2cSJim Jagielski 
1224*b1cdbd2cSJim Jagielski /** Test whether the position is in the native widget.
1225*b1cdbd2cSJim Jagielski 
1226*b1cdbd2cSJim Jagielski     If the return value is sal_True, bIsInside contains information whether
1227*b1cdbd2cSJim Jagielski     aPos was or was not inside the native widget specified by the
1228*b1cdbd2cSJim Jagielski     nType/nPart combination.
1229*b1cdbd2cSJim Jagielski */
hitTestNativeControl(ControlType nType,ControlPart nPart,const Rectangle & rControlRegion,const Point & rPos,sal_Bool & rIsInside)1230*b1cdbd2cSJim Jagielski sal_Bool KDESalGraphics::hitTestNativeControl( ControlType nType, ControlPart nPart,
1231*b1cdbd2cSJim Jagielski 										   const Rectangle& rControlRegion, const Point& rPos,
1232*b1cdbd2cSJim Jagielski 										   sal_Bool& rIsInside )
1233*b1cdbd2cSJim Jagielski {
1234*b1cdbd2cSJim Jagielski     if ( nType == CTRL_SCROLLBAR )
1235*b1cdbd2cSJim Jagielski     {
1236*b1cdbd2cSJim Jagielski     // make position relative to rControlRegion
1237*b1cdbd2cSJim Jagielski     Point aPos = rPos - rControlRegion.TopLeft();
1238*b1cdbd2cSJim Jagielski 	rIsInside = sal_False;
1239*b1cdbd2cSJim Jagielski 
1240*b1cdbd2cSJim Jagielski 	sal_Bool bHorizontal = ( nPart == PART_BUTTON_LEFT || nPart == PART_BUTTON_RIGHT );
1241*b1cdbd2cSJim Jagielski 
1242*b1cdbd2cSJim Jagielski 	QScrollBar *pScrollBar = pWidgetPainter->scrollBar( rControlRegion,
1243*b1cdbd2cSJim Jagielski 		bHorizontal, ImplControlValue() );
1244*b1cdbd2cSJim Jagielski 	QRect qRectSubLine = kapp->style().querySubControlMetrics(
1245*b1cdbd2cSJim Jagielski 		QStyle::CC_ScrollBar, pScrollBar, QStyle::SC_ScrollBarSubLine );
1246*b1cdbd2cSJim Jagielski 	QRect qRectAddLine = kapp->style().querySubControlMetrics(
1247*b1cdbd2cSJim Jagielski 		QStyle::CC_ScrollBar, pScrollBar, QStyle::SC_ScrollBarAddLine );
1248*b1cdbd2cSJim Jagielski 
1249*b1cdbd2cSJim Jagielski 	// There are 2 buttons on the right/bottom side of the scrollbar
1250*b1cdbd2cSJim Jagielski 	sal_Bool bTwoSubButtons = sal_False;
1251*b1cdbd2cSJim Jagielski 
1252*b1cdbd2cSJim Jagielski 	// It is a Platinum style scroll bar
1253*b1cdbd2cSJim Jagielski 	sal_Bool bPlatinumStyle = sal_False;
1254*b1cdbd2cSJim Jagielski 
1255*b1cdbd2cSJim Jagielski 	// Workaround for Platinum and 3 button style scroll bars.
1256*b1cdbd2cSJim Jagielski 	// It makes the right/down button bigger.
1257*b1cdbd2cSJim Jagielski 	if ( bHorizontal )
1258*b1cdbd2cSJim Jagielski 	{
1259*b1cdbd2cSJim Jagielski 	    qRectAddLine.setLeft( kapp->style().querySubControlMetrics(
1260*b1cdbd2cSJim Jagielski 			QStyle::CC_ScrollBar, pScrollBar,
1261*b1cdbd2cSJim Jagielski 			QStyle::SC_ScrollBarAddPage ).right() + 1 );
1262*b1cdbd2cSJim Jagielski 	    if ( qRectAddLine.width() > qRectSubLine.width() )
1263*b1cdbd2cSJim Jagielski 		bTwoSubButtons = sal_True;
1264*b1cdbd2cSJim Jagielski 	    if ( qRectSubLine.left() > kapp->style().querySubControlMetrics( QStyle::CC_ScrollBar, pScrollBar, QStyle::SC_ScrollBarSubPage ).left() )
1265*b1cdbd2cSJim Jagielski 		bPlatinumStyle = sal_True;
1266*b1cdbd2cSJim Jagielski 	}
1267*b1cdbd2cSJim Jagielski 	else
1268*b1cdbd2cSJim Jagielski 	{
1269*b1cdbd2cSJim Jagielski 	    qRectAddLine.setTop( kapp->style().querySubControlMetrics(
1270*b1cdbd2cSJim Jagielski 			QStyle::CC_ScrollBar, pScrollBar,
1271*b1cdbd2cSJim Jagielski 			QStyle::SC_ScrollBarAddPage ).bottom() + 1 );
1272*b1cdbd2cSJim Jagielski 	    if ( qRectAddLine.height() > qRectSubLine.height() )
1273*b1cdbd2cSJim Jagielski 		bTwoSubButtons = sal_True;
1274*b1cdbd2cSJim Jagielski 	    if ( qRectSubLine.top() > kapp->style().querySubControlMetrics( QStyle::CC_ScrollBar, pScrollBar, QStyle::SC_ScrollBarSubPage ).top() )
1275*b1cdbd2cSJim Jagielski 		bPlatinumStyle = sal_True;
1276*b1cdbd2cSJim Jagielski 	}
1277*b1cdbd2cSJim Jagielski 
1278*b1cdbd2cSJim Jagielski 	switch ( nPart )
1279*b1cdbd2cSJim Jagielski 	{
1280*b1cdbd2cSJim Jagielski 	    case PART_BUTTON_LEFT:
1281*b1cdbd2cSJim Jagielski 		if ( !bPlatinumStyle && qRectSubLine.contains( aPos.getX(), aPos.getY() ) )
1282*b1cdbd2cSJim Jagielski 		    rIsInside = sal_True;
1283*b1cdbd2cSJim Jagielski 		else if ( bTwoSubButtons )
1284*b1cdbd2cSJim Jagielski 		{
1285*b1cdbd2cSJim Jagielski 		    qRectAddLine.setWidth( qRectAddLine.width() / 2 );
1286*b1cdbd2cSJim Jagielski 		    rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() );
1287*b1cdbd2cSJim Jagielski 		}
1288*b1cdbd2cSJim Jagielski 		break;
1289*b1cdbd2cSJim Jagielski 
1290*b1cdbd2cSJim Jagielski 	    case PART_BUTTON_UP:
1291*b1cdbd2cSJim Jagielski 		if ( !bPlatinumStyle && qRectSubLine.contains( aPos.getX(), aPos.getY() ) )
1292*b1cdbd2cSJim Jagielski 		    rIsInside = sal_True;
1293*b1cdbd2cSJim Jagielski 		else if ( bTwoSubButtons )
1294*b1cdbd2cSJim Jagielski 		{
1295*b1cdbd2cSJim Jagielski 		    qRectAddLine.setHeight( qRectAddLine.height() / 2 );
1296*b1cdbd2cSJim Jagielski 		    rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() );
1297*b1cdbd2cSJim Jagielski 		}
1298*b1cdbd2cSJim Jagielski 		break;
1299*b1cdbd2cSJim Jagielski 
1300*b1cdbd2cSJim Jagielski 	    case PART_BUTTON_RIGHT:
1301*b1cdbd2cSJim Jagielski 		if ( bTwoSubButtons )
1302*b1cdbd2cSJim Jagielski 		    qRectAddLine.setLeft( qRectAddLine.left() + qRectAddLine.width() / 2 );
1303*b1cdbd2cSJim Jagielski 
1304*b1cdbd2cSJim Jagielski 		rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() );
1305*b1cdbd2cSJim Jagielski 		break;
1306*b1cdbd2cSJim Jagielski 
1307*b1cdbd2cSJim Jagielski 	    case PART_BUTTON_DOWN:
1308*b1cdbd2cSJim Jagielski 		if ( bTwoSubButtons )
1309*b1cdbd2cSJim Jagielski 		    qRectAddLine.setTop( qRectAddLine.top() + qRectAddLine.height() / 2 );
1310*b1cdbd2cSJim Jagielski 
1311*b1cdbd2cSJim Jagielski 		rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() );
1312*b1cdbd2cSJim Jagielski 		break;
1313*b1cdbd2cSJim Jagielski 
1314*b1cdbd2cSJim Jagielski         // cases PART_TRACK_HORZ_AREA and PART_TRACK_VERT_AREA
1315*b1cdbd2cSJim Jagielski         default:
1316*b1cdbd2cSJim Jagielski         return sal_False;
1317*b1cdbd2cSJim Jagielski 	}
1318*b1cdbd2cSJim Jagielski 
1319*b1cdbd2cSJim Jagielski 	return sal_True;
1320*b1cdbd2cSJim Jagielski     }
1321*b1cdbd2cSJim Jagielski 
1322*b1cdbd2cSJim Jagielski     return sal_False;
1323*b1cdbd2cSJim Jagielski }
1324*b1cdbd2cSJim Jagielski 
1325*b1cdbd2cSJim Jagielski 
1326*b1cdbd2cSJim Jagielski /** Draw the requested control described by nPart/nState.
1327*b1cdbd2cSJim Jagielski 
1328*b1cdbd2cSJim Jagielski     @param rControlRegion
1329*b1cdbd2cSJim Jagielski     The bounding region of the complete control in VCL frame coordinates.
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski     @param aValue
1332*b1cdbd2cSJim Jagielski     An optional value (tristate/numerical/string).
1333*b1cdbd2cSJim Jagielski 
1334*b1cdbd2cSJim Jagielski     @param aCaption
1335*b1cdbd2cSJim Jagielski     A caption or title string (like button text etc.)
1336*b1cdbd2cSJim Jagielski */
drawNativeControl(ControlType nType,ControlPart nPart,const Rectangle & rControlRegion,ControlState nState,const ImplControlValue & aValue,const OUString &)1337*b1cdbd2cSJim Jagielski sal_Bool KDESalGraphics::drawNativeControl( ControlType nType, ControlPart nPart,
1338*b1cdbd2cSJim Jagielski 										const Rectangle& rControlRegion, ControlState nState,
1339*b1cdbd2cSJim Jagielski 										const ImplControlValue& aValue,
1340*b1cdbd2cSJim Jagielski 										const OUString& )
1341*b1cdbd2cSJim Jagielski {
1342*b1cdbd2cSJim Jagielski     sal_Bool bReturn = sal_False;
1343*b1cdbd2cSJim Jagielski 
1344*b1cdbd2cSJim Jagielski     Display *dpy = GetXDisplay();
1345*b1cdbd2cSJim Jagielski     XLIB_Window drawable = GetDrawable();
1346*b1cdbd2cSJim Jagielski     GC gc = SelectPen(); //SelectFont(); // GC with current clipping region set
1347*b1cdbd2cSJim Jagielski 
1348*b1cdbd2cSJim Jagielski     if ( (nType == CTRL_PUSHBUTTON) && (nPart == PART_ENTIRE_CONTROL) )
1349*b1cdbd2cSJim Jagielski     {
1350*b1cdbd2cSJim Jagielski 	bReturn = pWidgetPainter->drawStyledWidget(
1351*b1cdbd2cSJim Jagielski 		pWidgetPainter->pushButton( rControlRegion, (nState & CTRL_STATE_DEFAULT) ),
1352*b1cdbd2cSJim Jagielski 		nState, aValue,
1353*b1cdbd2cSJim Jagielski 		dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
1354*b1cdbd2cSJim Jagielski     }
1355*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_RADIOBUTTON) && (nPart == PART_ENTIRE_CONTROL) )
1356*b1cdbd2cSJim Jagielski     {
1357*b1cdbd2cSJim Jagielski 	bReturn = pWidgetPainter->drawStyledWidget(
1358*b1cdbd2cSJim Jagielski 		pWidgetPainter->radioButton( rControlRegion ),
1359*b1cdbd2cSJim Jagielski 		nState, aValue,
1360*b1cdbd2cSJim Jagielski 		dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
1361*b1cdbd2cSJim Jagielski     }
1362*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_CHECKBOX) && (nPart == PART_ENTIRE_CONTROL) )
1363*b1cdbd2cSJim Jagielski     {
1364*b1cdbd2cSJim Jagielski 	bReturn = pWidgetPainter->drawStyledWidget(
1365*b1cdbd2cSJim Jagielski 		pWidgetPainter->checkBox( rControlRegion ),
1366*b1cdbd2cSJim Jagielski 		nState, aValue,
1367*b1cdbd2cSJim Jagielski 		dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
1368*b1cdbd2cSJim Jagielski     }
1369*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_COMBOBOX) && (nPart == PART_ENTIRE_CONTROL) )
1370*b1cdbd2cSJim Jagielski     {
1371*b1cdbd2cSJim Jagielski 	bReturn = pWidgetPainter->drawStyledWidget(
1372*b1cdbd2cSJim Jagielski 		pWidgetPainter->comboBox( rControlRegion, sal_True ),
1373*b1cdbd2cSJim Jagielski 		nState, aValue,
1374*b1cdbd2cSJim Jagielski 		dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
1375*b1cdbd2cSJim Jagielski     }
1376*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_EDITBOX) && (nPart == PART_ENTIRE_CONTROL) )
1377*b1cdbd2cSJim Jagielski     {
1378*b1cdbd2cSJim Jagielski 	bReturn = pWidgetPainter->drawStyledWidget(
1379*b1cdbd2cSJim Jagielski 		pWidgetPainter->lineEdit( rControlRegion ),
1380*b1cdbd2cSJim Jagielski 		nState, aValue,
1381*b1cdbd2cSJim Jagielski 		dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
1382*b1cdbd2cSJim Jagielski     }
1383*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_LISTBOX) && (nPart == PART_ENTIRE_CONTROL) )
1384*b1cdbd2cSJim Jagielski     {
1385*b1cdbd2cSJim Jagielski 	bReturn = pWidgetPainter->drawStyledWidget(
1386*b1cdbd2cSJim Jagielski 		pWidgetPainter->comboBox( rControlRegion, sal_False ),
1387*b1cdbd2cSJim Jagielski 		nState, aValue,
1388*b1cdbd2cSJim Jagielski 		dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
1389*b1cdbd2cSJim Jagielski     }
1390*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_LISTBOX) && (nPart == PART_WINDOW) )
1391*b1cdbd2cSJim Jagielski     {
1392*b1cdbd2cSJim Jagielski 	bReturn = pWidgetPainter->drawStyledWidget(
1393*b1cdbd2cSJim Jagielski 		pWidgetPainter->listView( rControlRegion ),
1394*b1cdbd2cSJim Jagielski 		nState, aValue,
1395*b1cdbd2cSJim Jagielski 		dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
1396*b1cdbd2cSJim Jagielski     }
1397*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_SPINBOX) && (nPart == PART_ENTIRE_CONTROL) )
1398*b1cdbd2cSJim Jagielski     {
1399*b1cdbd2cSJim Jagielski 	bReturn = pWidgetPainter->drawStyledWidget(
1400*b1cdbd2cSJim Jagielski 		pWidgetPainter->spinWidget( rControlRegion ),
1401*b1cdbd2cSJim Jagielski 		nState, aValue,
1402*b1cdbd2cSJim Jagielski 		dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
1403*b1cdbd2cSJim Jagielski     }
1404*b1cdbd2cSJim Jagielski     else if ( (nType==CTRL_TAB_ITEM) && (nPart == PART_ENTIRE_CONTROL) )
1405*b1cdbd2cSJim Jagielski     {
1406*b1cdbd2cSJim Jagielski 	bReturn = pWidgetPainter->drawStyledWidget(
1407*b1cdbd2cSJim Jagielski 		pWidgetPainter->tabBar( rControlRegion ),
1408*b1cdbd2cSJim Jagielski 		nState, aValue,
1409*b1cdbd2cSJim Jagielski 		dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
1410*b1cdbd2cSJim Jagielski     }
1411*b1cdbd2cSJim Jagielski     else if ( (nType==CTRL_TAB_PANE) && (nPart == PART_ENTIRE_CONTROL) )
1412*b1cdbd2cSJim Jagielski     {
1413*b1cdbd2cSJim Jagielski 	bReturn = pWidgetPainter->drawStyledWidget(
1414*b1cdbd2cSJim Jagielski 		pWidgetPainter->tabWidget( rControlRegion ),
1415*b1cdbd2cSJim Jagielski 		nState, aValue,
1416*b1cdbd2cSJim Jagielski 		dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
1417*b1cdbd2cSJim Jagielski     }
1418*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_SCROLLBAR) && (nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT) )
1419*b1cdbd2cSJim Jagielski     {
1420*b1cdbd2cSJim Jagielski 	bReturn = pWidgetPainter->drawStyledWidget(
1421*b1cdbd2cSJim Jagielski 		pWidgetPainter->scrollBar( rControlRegion, nPart == PART_DRAW_BACKGROUND_HORZ, aValue ),
1422*b1cdbd2cSJim Jagielski 		nState, aValue,
1423*b1cdbd2cSJim Jagielski 		dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
1424*b1cdbd2cSJim Jagielski     }
1425*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_TOOLBAR) && (nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT || nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT) )
1426*b1cdbd2cSJim Jagielski     {
1427*b1cdbd2cSJim Jagielski         bReturn = pWidgetPainter->drawStyledWidget(
1428*b1cdbd2cSJim Jagielski                 pWidgetPainter->toolBar( rControlRegion, nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_THUMB_VERT ),
1429*b1cdbd2cSJim Jagielski                 nState, aValue,
1430*b1cdbd2cSJim Jagielski                 dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart );
1431*b1cdbd2cSJim Jagielski     }
1432*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_TOOLBAR) && (nPart == PART_BUTTON) )
1433*b1cdbd2cSJim Jagielski     {
1434*b1cdbd2cSJim Jagielski         bReturn = pWidgetPainter->drawStyledWidget(
1435*b1cdbd2cSJim Jagielski                 pWidgetPainter->toolButton( rControlRegion ),
1436*b1cdbd2cSJim Jagielski                 nState, aValue,
1437*b1cdbd2cSJim Jagielski                 dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart );
1438*b1cdbd2cSJim Jagielski     }
1439*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_MENUBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) )
1440*b1cdbd2cSJim Jagielski     {
1441*b1cdbd2cSJim Jagielski         bReturn = pWidgetPainter->drawStyledWidget(
1442*b1cdbd2cSJim Jagielski                 pWidgetPainter->menuBar( rControlRegion ),
1443*b1cdbd2cSJim Jagielski                 nState, aValue,
1444*b1cdbd2cSJim Jagielski                 dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart );
1445*b1cdbd2cSJim Jagielski     }
1446*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_MENU_POPUP) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) )
1447*b1cdbd2cSJim Jagielski     {
1448*b1cdbd2cSJim Jagielski         bReturn = pWidgetPainter->drawStyledWidget(
1449*b1cdbd2cSJim Jagielski                 pWidgetPainter->popupMenu( rControlRegion ),
1450*b1cdbd2cSJim Jagielski                 nState, aValue,
1451*b1cdbd2cSJim Jagielski                 dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
1452*b1cdbd2cSJim Jagielski     }
1453*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_PROGRESS) && (nPart == PART_ENTIRE_CONTROL) )
1454*b1cdbd2cSJim Jagielski     {
1455*b1cdbd2cSJim Jagielski         bReturn = pWidgetPainter->drawStyledWidget(
1456*b1cdbd2cSJim Jagielski                 pWidgetPainter->progressBar( rControlRegion ),
1457*b1cdbd2cSJim Jagielski                 nState, aValue,
1458*b1cdbd2cSJim Jagielski                 dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
1459*b1cdbd2cSJim Jagielski     }
1460*b1cdbd2cSJim Jagielski 
1461*b1cdbd2cSJim Jagielski     return bReturn;
1462*b1cdbd2cSJim Jagielski }
1463*b1cdbd2cSJim Jagielski 
1464*b1cdbd2cSJim Jagielski 
1465*b1cdbd2cSJim Jagielski /** Draw text on the widget.
1466*b1cdbd2cSJim Jagielski 
1467*b1cdbd2cSJim Jagielski     OPTIONAL. Draws the requested text for the control described by nPart/nState.
1468*b1cdbd2cSJim Jagielski     Used if text is not drawn by DrawNativeControl().
1469*b1cdbd2cSJim Jagielski 
1470*b1cdbd2cSJim Jagielski     @param rControlRegion
1471*b1cdbd2cSJim Jagielski     The bounding region of the complete control in VCL frame coordinates.
1472*b1cdbd2cSJim Jagielski 
1473*b1cdbd2cSJim Jagielski     @param aValue
1474*b1cdbd2cSJim Jagielski     An optional value (tristate/numerical/string)
1475*b1cdbd2cSJim Jagielski 
1476*b1cdbd2cSJim Jagielski     @param aCaption
1477*b1cdbd2cSJim Jagielski     A caption or title string (like button text etc.)
1478*b1cdbd2cSJim Jagielski */
drawNativeControlText(ControlType,ControlPart,const Rectangle &,ControlState,const ImplControlValue &,const OUString &)1479*b1cdbd2cSJim Jagielski sal_Bool KDESalGraphics::drawNativeControlText( ControlType, ControlPart,
1480*b1cdbd2cSJim Jagielski 											const Rectangle&, ControlState,
1481*b1cdbd2cSJim Jagielski 											const ImplControlValue&,
1482*b1cdbd2cSJim Jagielski 											const OUString& )
1483*b1cdbd2cSJim Jagielski {
1484*b1cdbd2cSJim Jagielski     return sal_False;
1485*b1cdbd2cSJim Jagielski }
1486*b1cdbd2cSJim Jagielski 
1487*b1cdbd2cSJim Jagielski /** Check if the bounding regions match.
1488*b1cdbd2cSJim Jagielski 
1489*b1cdbd2cSJim Jagielski     If the return value is sal_True, rNativeBoundingRegion
1490*b1cdbd2cSJim Jagielski     contains the true bounding region covered by the control
1491*b1cdbd2cSJim Jagielski     including any adornment, while rNativeContentRegion contains the area
1492*b1cdbd2cSJim Jagielski     within the control that can be safely drawn into without drawing over
1493*b1cdbd2cSJim Jagielski     the borders of the control.
1494*b1cdbd2cSJim Jagielski 
1495*b1cdbd2cSJim Jagielski     @param rControlRegion
1496*b1cdbd2cSJim Jagielski     The bounding region of the control in VCL frame coordinates.
1497*b1cdbd2cSJim Jagielski 
1498*b1cdbd2cSJim Jagielski     @param aValue
1499*b1cdbd2cSJim Jagielski     An optional value (tristate/numerical/string)
1500*b1cdbd2cSJim Jagielski 
1501*b1cdbd2cSJim Jagielski     @param aCaption
1502*b1cdbd2cSJim Jagielski     A caption or title string (like button text etc.)
1503*b1cdbd2cSJim Jagielski */
getNativeControlRegion(ControlType nType,ControlPart nPart,const Rectangle & rControlRegion,ControlState nState,const ImplControlValue &,const OUString &,Rectangle & rNativeBoundingRegion,Rectangle & rNativeContentRegion)1504*b1cdbd2cSJim Jagielski sal_Bool KDESalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPart,
1505*b1cdbd2cSJim Jagielski 											 const Rectangle& rControlRegion, ControlState nState,
1506*b1cdbd2cSJim Jagielski 											 const ImplControlValue&,
1507*b1cdbd2cSJim Jagielski 											 const OUString&,
1508*b1cdbd2cSJim Jagielski 											 Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion )
1509*b1cdbd2cSJim Jagielski {
1510*b1cdbd2cSJim Jagielski     sal_Bool bReturn = sal_False;
1511*b1cdbd2cSJim Jagielski     QRect qBoundingRect = WidgetPainter::region2QRect( rControlRegion );
1512*b1cdbd2cSJim Jagielski     QRect qRect;
1513*b1cdbd2cSJim Jagielski 
1514*b1cdbd2cSJim Jagielski     QWidget *pWidget = NULL;
1515*b1cdbd2cSJim Jagielski     switch ( nType )
1516*b1cdbd2cSJim Jagielski     {
1517*b1cdbd2cSJim Jagielski 	// Metrics of the push button
1518*b1cdbd2cSJim Jagielski 	case CTRL_PUSHBUTTON:
1519*b1cdbd2cSJim Jagielski 	    pWidget = pWidgetPainter->pushButton( rControlRegion, ( nState & CTRL_STATE_DEFAULT ) );
1520*b1cdbd2cSJim Jagielski 
1521*b1cdbd2cSJim Jagielski 	    switch ( nPart )
1522*b1cdbd2cSJim Jagielski 	    {
1523*b1cdbd2cSJim Jagielski 		case PART_ENTIRE_CONTROL:
1524*b1cdbd2cSJim Jagielski 		    qRect = qBoundingRect;
1525*b1cdbd2cSJim Jagielski 
1526*b1cdbd2cSJim Jagielski 		    if ( nState & CTRL_STATE_DEFAULT )
1527*b1cdbd2cSJim Jagielski 		    {
1528*b1cdbd2cSJim Jagielski 			int nIndicatorSize = kapp->style().pixelMetric(
1529*b1cdbd2cSJim Jagielski 				QStyle::PM_ButtonDefaultIndicator, pWidget );
1530*b1cdbd2cSJim Jagielski 			qBoundingRect.addCoords( -nIndicatorSize, -nIndicatorSize,
1531*b1cdbd2cSJim Jagielski 				nIndicatorSize, nIndicatorSize );
1532*b1cdbd2cSJim Jagielski 			bReturn = sal_True;
1533*b1cdbd2cSJim Jagielski 		    }
1534*b1cdbd2cSJim Jagielski 		    break;
1535*b1cdbd2cSJim Jagielski 	    }
1536*b1cdbd2cSJim Jagielski 	    break;
1537*b1cdbd2cSJim Jagielski 
1538*b1cdbd2cSJim Jagielski         // Metrics of the radio button
1539*b1cdbd2cSJim Jagielski         case CTRL_RADIOBUTTON:
1540*b1cdbd2cSJim Jagielski             pWidget = pWidgetPainter->radioButton( rControlRegion );
1541*b1cdbd2cSJim Jagielski 
1542*b1cdbd2cSJim Jagielski             if ( nPart == PART_ENTIRE_CONTROL )
1543*b1cdbd2cSJim Jagielski             {
1544*b1cdbd2cSJim Jagielski                 qRect.setWidth( kapp->style().pixelMetric( QStyle::PM_ExclusiveIndicatorWidth, pWidget ) );
1545*b1cdbd2cSJim Jagielski                 qRect.setHeight( kapp->style().pixelMetric( QStyle::PM_ExclusiveIndicatorHeight, pWidget ) );
1546*b1cdbd2cSJim Jagielski 
1547*b1cdbd2cSJim Jagielski                 bReturn = sal_True;
1548*b1cdbd2cSJim Jagielski             }
1549*b1cdbd2cSJim Jagielski             break;
1550*b1cdbd2cSJim Jagielski 
1551*b1cdbd2cSJim Jagielski         // Metrics of the check box
1552*b1cdbd2cSJim Jagielski         case CTRL_CHECKBOX:
1553*b1cdbd2cSJim Jagielski             pWidget = pWidgetPainter->checkBox( rControlRegion );
1554*b1cdbd2cSJim Jagielski 
1555*b1cdbd2cSJim Jagielski             if ( nPart == PART_ENTIRE_CONTROL )
1556*b1cdbd2cSJim Jagielski             {
1557*b1cdbd2cSJim Jagielski                 qRect.setWidth( kapp->style().pixelMetric( QStyle::PM_IndicatorWidth, pWidget ) );
1558*b1cdbd2cSJim Jagielski                 qRect.setHeight( kapp->style().pixelMetric( QStyle::PM_IndicatorHeight, pWidget ) );
1559*b1cdbd2cSJim Jagielski 
1560*b1cdbd2cSJim Jagielski                 bReturn = sal_True;
1561*b1cdbd2cSJim Jagielski             }
1562*b1cdbd2cSJim Jagielski             break;
1563*b1cdbd2cSJim Jagielski 
1564*b1cdbd2cSJim Jagielski 	// Metrics of the combo box
1565*b1cdbd2cSJim Jagielski 	case CTRL_COMBOBOX:
1566*b1cdbd2cSJim Jagielski 	case CTRL_LISTBOX:
1567*b1cdbd2cSJim Jagielski 	    pWidget = pWidgetPainter->comboBox( rControlRegion, ( nType == CTRL_COMBOBOX ) );
1568*b1cdbd2cSJim Jagielski 	    switch ( nPart )
1569*b1cdbd2cSJim Jagielski 	    {
1570*b1cdbd2cSJim Jagielski 		case PART_BUTTON_DOWN:
1571*b1cdbd2cSJim Jagielski 		    qRect = kapp->style().querySubControlMetrics(
1572*b1cdbd2cSJim Jagielski 			    QStyle::CC_ComboBox, pWidget, QStyle::SC_ComboBoxArrow );
1573*b1cdbd2cSJim Jagielski 		    qRect.setLeft( kapp->style().querySubControlMetrics(
1574*b1cdbd2cSJim Jagielski 			    QStyle::CC_ComboBox, pWidget,
1575*b1cdbd2cSJim Jagielski 			    QStyle::SC_ComboBoxEditField ).right() + 1 );
1576*b1cdbd2cSJim Jagielski             qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
1577*b1cdbd2cSJim Jagielski 		    bReturn = sal_True;
1578*b1cdbd2cSJim Jagielski 		    break;
1579*b1cdbd2cSJim Jagielski 
1580*b1cdbd2cSJim Jagielski 		case PART_SUB_EDIT:
1581*b1cdbd2cSJim Jagielski 		    qRect = kapp->style().querySubControlMetrics(
1582*b1cdbd2cSJim Jagielski 			    QStyle::CC_ComboBox, pWidget, QStyle::SC_ComboBoxEditField );
1583*b1cdbd2cSJim Jagielski             qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
1584*b1cdbd2cSJim Jagielski 		    bReturn = sal_True;
1585*b1cdbd2cSJim Jagielski 		    break;
1586*b1cdbd2cSJim Jagielski 	    }
1587*b1cdbd2cSJim Jagielski 	    break;
1588*b1cdbd2cSJim Jagielski 
1589*b1cdbd2cSJim Jagielski 	// Metrics of the spin box
1590*b1cdbd2cSJim Jagielski 	case CTRL_SPINBOX:
1591*b1cdbd2cSJim Jagielski 	    pWidget = pWidgetPainter->spinWidget( rControlRegion );
1592*b1cdbd2cSJim Jagielski 	    switch ( nPart )
1593*b1cdbd2cSJim Jagielski 	    {
1594*b1cdbd2cSJim Jagielski 		case PART_BUTTON_UP:
1595*b1cdbd2cSJim Jagielski 		    qRect = kapp->style().querySubControlMetrics(
1596*b1cdbd2cSJim Jagielski 			    QStyle::CC_SpinWidget, pWidget, QStyle::SC_SpinWidgetUp );
1597*b1cdbd2cSJim Jagielski 		    bReturn = sal_True;
1598*b1cdbd2cSJim Jagielski             qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
1599*b1cdbd2cSJim Jagielski 		    break;
1600*b1cdbd2cSJim Jagielski 
1601*b1cdbd2cSJim Jagielski 		case PART_BUTTON_DOWN:
1602*b1cdbd2cSJim Jagielski 		    qRect = kapp->style().querySubControlMetrics(
1603*b1cdbd2cSJim Jagielski 			    QStyle::CC_SpinWidget, pWidget, QStyle::SC_SpinWidgetDown );
1604*b1cdbd2cSJim Jagielski 		    bReturn = sal_True;
1605*b1cdbd2cSJim Jagielski             qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
1606*b1cdbd2cSJim Jagielski 		    break;
1607*b1cdbd2cSJim Jagielski 
1608*b1cdbd2cSJim Jagielski         case PART_SUB_EDIT:
1609*b1cdbd2cSJim Jagielski 		    qRect = kapp->style().querySubControlMetrics(
1610*b1cdbd2cSJim Jagielski 			    QStyle::CC_SpinWidget, pWidget, QStyle::SC_SpinWidgetEditField );
1611*b1cdbd2cSJim Jagielski             qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
1612*b1cdbd2cSJim Jagielski 		    bReturn = sal_True;
1613*b1cdbd2cSJim Jagielski 		    break;
1614*b1cdbd2cSJim Jagielski 	    }
1615*b1cdbd2cSJim Jagielski 	    break;
1616*b1cdbd2cSJim Jagielski 
1617*b1cdbd2cSJim Jagielski 	// Metrics of the scroll bar
1618*b1cdbd2cSJim Jagielski 	case CTRL_SCROLLBAR:
1619*b1cdbd2cSJim Jagielski 	    pWidget = pWidgetPainter->scrollBar( rControlRegion,
1620*b1cdbd2cSJim Jagielski 		    ( nPart == PART_BUTTON_LEFT || nPart == PART_BUTTON_RIGHT ),
1621*b1cdbd2cSJim Jagielski 		    ImplControlValue() );
1622*b1cdbd2cSJim Jagielski 	    switch ( nPart )
1623*b1cdbd2cSJim Jagielski 	    {
1624*b1cdbd2cSJim Jagielski 		case PART_BUTTON_LEFT:
1625*b1cdbd2cSJim Jagielski 		case PART_BUTTON_UP:
1626*b1cdbd2cSJim Jagielski 		    qRect = kapp->style().querySubControlMetrics(
1627*b1cdbd2cSJim Jagielski 			    QStyle::CC_ScrollBar, pWidget, QStyle::SC_ScrollBarSubLine );
1628*b1cdbd2cSJim Jagielski 
1629*b1cdbd2cSJim Jagielski 		    // Workaround for Platinum style scroll bars. It makes the
1630*b1cdbd2cSJim Jagielski 		    // left/up button invisible.
1631*b1cdbd2cSJim Jagielski 		    if ( nPart == PART_BUTTON_LEFT )
1632*b1cdbd2cSJim Jagielski 		    {
1633*b1cdbd2cSJim Jagielski 			if ( qRect.left() > kapp->style().querySubControlMetrics(
1634*b1cdbd2cSJim Jagielski 				    QStyle::CC_ScrollBar, pWidget,
1635*b1cdbd2cSJim Jagielski 				    QStyle::SC_ScrollBarSubPage ).left() )
1636*b1cdbd2cSJim Jagielski 			{
1637*b1cdbd2cSJim Jagielski 			    qRect.setLeft( 0 );
1638*b1cdbd2cSJim Jagielski 			    qRect.setRight( 0 );
1639*b1cdbd2cSJim Jagielski 			}
1640*b1cdbd2cSJim Jagielski 		    }
1641*b1cdbd2cSJim Jagielski 		    else
1642*b1cdbd2cSJim Jagielski 		    {
1643*b1cdbd2cSJim Jagielski 			if ( qRect.top() > kapp->style().querySubControlMetrics(
1644*b1cdbd2cSJim Jagielski 				    QStyle::CC_ScrollBar, pWidget,
1645*b1cdbd2cSJim Jagielski 				    QStyle::SC_ScrollBarSubPage ).top() )
1646*b1cdbd2cSJim Jagielski 			{
1647*b1cdbd2cSJim Jagielski 			    qRect.setTop( 0 );
1648*b1cdbd2cSJim Jagielski 			    qRect.setBottom( 0 );
1649*b1cdbd2cSJim Jagielski 			}
1650*b1cdbd2cSJim Jagielski 		    }
1651*b1cdbd2cSJim Jagielski 
1652*b1cdbd2cSJim Jagielski             qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
1653*b1cdbd2cSJim Jagielski 
1654*b1cdbd2cSJim Jagielski 		    bReturn = sal_True;
1655*b1cdbd2cSJim Jagielski 		    break;
1656*b1cdbd2cSJim Jagielski 
1657*b1cdbd2cSJim Jagielski 		case PART_BUTTON_RIGHT:
1658*b1cdbd2cSJim Jagielski 		case PART_BUTTON_DOWN:
1659*b1cdbd2cSJim Jagielski 		    qRect = kapp->style().querySubControlMetrics(
1660*b1cdbd2cSJim Jagielski 			    QStyle::CC_ScrollBar, pWidget, QStyle::SC_ScrollBarAddLine );
1661*b1cdbd2cSJim Jagielski 
1662*b1cdbd2cSJim Jagielski 		    // Workaround for Platinum and 3 button style scroll bars.
1663*b1cdbd2cSJim Jagielski 		    // It makes the right/down button bigger.
1664*b1cdbd2cSJim Jagielski 		    if ( nPart == PART_BUTTON_RIGHT )
1665*b1cdbd2cSJim Jagielski 			qRect.setLeft( kapp->style().querySubControlMetrics(
1666*b1cdbd2cSJim Jagielski 				    QStyle::CC_ScrollBar, pWidget,
1667*b1cdbd2cSJim Jagielski 				    QStyle::SC_ScrollBarAddPage ).right() + 1 );
1668*b1cdbd2cSJim Jagielski 		    else
1669*b1cdbd2cSJim Jagielski 			qRect.setTop( kapp->style().querySubControlMetrics(
1670*b1cdbd2cSJim Jagielski 				    QStyle::CC_ScrollBar, pWidget,
1671*b1cdbd2cSJim Jagielski 				    QStyle::SC_ScrollBarAddPage ).bottom() + 1 );
1672*b1cdbd2cSJim Jagielski 
1673*b1cdbd2cSJim Jagielski             qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
1674*b1cdbd2cSJim Jagielski 
1675*b1cdbd2cSJim Jagielski 		    bReturn = sal_True;
1676*b1cdbd2cSJim Jagielski 		    break;
1677*b1cdbd2cSJim Jagielski 	    }
1678*b1cdbd2cSJim Jagielski             break;
1679*b1cdbd2cSJim Jagielski     }
1680*b1cdbd2cSJim Jagielski 
1681*b1cdbd2cSJim Jagielski     // Fill rNativeBoundingRegion and rNativeContentRegion
1682*b1cdbd2cSJim Jagielski     if ( bReturn )
1683*b1cdbd2cSJim Jagielski     {
1684*b1cdbd2cSJim Jagielski 	// Bounding region
1685*b1cdbd2cSJim Jagielski 	Point aBPoint( qBoundingRect.x(), qBoundingRect.y() );
1686*b1cdbd2cSJim Jagielski 	Size aBSize( qBoundingRect.width(), qBoundingRect.height() );
1687*b1cdbd2cSJim Jagielski 	rNativeBoundingRegion = Rectangle( aBPoint, aBSize );
1688*b1cdbd2cSJim Jagielski 
1689*b1cdbd2cSJim Jagielski 	// Region of the content
1690*b1cdbd2cSJim Jagielski 	Point aPoint( qRect.x(), qRect.y() );
1691*b1cdbd2cSJim Jagielski 	Size  aSize( qRect.width(), qRect.height() );
1692*b1cdbd2cSJim Jagielski 	rNativeContentRegion = Rectangle( aPoint, aSize );
1693*b1cdbd2cSJim Jagielski     }
1694*b1cdbd2cSJim Jagielski 
1695*b1cdbd2cSJim Jagielski     return bReturn;
1696*b1cdbd2cSJim Jagielski }
1697*b1cdbd2cSJim Jagielski 
1698*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1699*b1cdbd2cSJim Jagielski // KDESalFrame implementation
1700*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1701*b1cdbd2cSJim Jagielski 
KDESalFrame(SalFrame * pParent,sal_uLong nStyle)1702*b1cdbd2cSJim Jagielski KDESalFrame::KDESalFrame( SalFrame* pParent, sal_uLong nStyle ) :
1703*b1cdbd2cSJim Jagielski     X11SalFrame( pParent, nStyle )
1704*b1cdbd2cSJim Jagielski {
1705*b1cdbd2cSJim Jagielski }
1706*b1cdbd2cSJim Jagielski 
Show(sal_Bool bVisible,sal_Bool bNoActivate)1707*b1cdbd2cSJim Jagielski void KDESalFrame::Show( sal_Bool bVisible, sal_Bool bNoActivate )
1708*b1cdbd2cSJim Jagielski {
1709*b1cdbd2cSJim Jagielski     if ( !GetParent() && ! (GetStyle() & SAL_FRAME_STYLE_INTRO) )
1710*b1cdbd2cSJim Jagielski     {
1711*b1cdbd2cSJim Jagielski         KDEXLib* pXLib = static_cast<KDEXLib*>(GetDisplay()->GetXLib());
1712*b1cdbd2cSJim Jagielski         pXLib->doStartup();
1713*b1cdbd2cSJim Jagielski     }
1714*b1cdbd2cSJim Jagielski     X11SalFrame::Show( bVisible, bNoActivate );
1715*b1cdbd2cSJim Jagielski }
1716*b1cdbd2cSJim Jagielski 
1717*b1cdbd2cSJim Jagielski /** Helper function to convert colors.
1718*b1cdbd2cSJim Jagielski */
toColor(const QColor & rColor)1719*b1cdbd2cSJim Jagielski static Color toColor( const QColor &rColor )
1720*b1cdbd2cSJim Jagielski {
1721*b1cdbd2cSJim Jagielski     return Color( rColor.red(), rColor.green(), rColor.blue() );
1722*b1cdbd2cSJim Jagielski }
1723*b1cdbd2cSJim Jagielski 
1724*b1cdbd2cSJim Jagielski /** Helper function to read untranslated text entry from KConfig configuration repository.
1725*b1cdbd2cSJim Jagielski */
readEntryUntranslated(KConfig * pConfig,const char * pKey)1726*b1cdbd2cSJim Jagielski static OUString readEntryUntranslated( KConfig *pConfig, const char *pKey )
1727*b1cdbd2cSJim Jagielski {
1728*b1cdbd2cSJim Jagielski     return OUString::createFromAscii( pConfig->readEntryUntranslated( pKey ).ascii() );
1729*b1cdbd2cSJim Jagielski }
1730*b1cdbd2cSJim Jagielski 
1731*b1cdbd2cSJim Jagielski /** Helper function to read color from KConfig configuration repository.
1732*b1cdbd2cSJim Jagielski */
readColor(KConfig * pConfig,const char * pKey)1733*b1cdbd2cSJim Jagielski static Color readColor( KConfig *pConfig, const char *pKey )
1734*b1cdbd2cSJim Jagielski {
1735*b1cdbd2cSJim Jagielski     return toColor( pConfig->readColorEntry( pKey ) );
1736*b1cdbd2cSJim Jagielski }
1737*b1cdbd2cSJim Jagielski 
1738*b1cdbd2cSJim Jagielski /** Helper function to add information to Font from QFont.
1739*b1cdbd2cSJim Jagielski 
1740*b1cdbd2cSJim Jagielski     Mostly grabbed from the Gtk+ vclplug (salnativewidgets-gtk.cxx).
1741*b1cdbd2cSJim Jagielski */
toFont(const QFont & rQFont,const::com::sun::star::lang::Locale & rLocale)1742*b1cdbd2cSJim Jagielski static Font toFont( const QFont &rQFont, const ::com::sun::star::lang::Locale& rLocale )
1743*b1cdbd2cSJim Jagielski {
1744*b1cdbd2cSJim Jagielski     psp::FastPrintFontInfo aInfo;
1745*b1cdbd2cSJim Jagielski     QFontInfo qFontInfo( rQFont );
1746*b1cdbd2cSJim Jagielski 
1747*b1cdbd2cSJim Jagielski     // set family name
1748*b1cdbd2cSJim Jagielski     aInfo.m_aFamilyName = String( rQFont.family().utf8(), RTL_TEXTENCODING_UTF8 );
1749*b1cdbd2cSJim Jagielski 
1750*b1cdbd2cSJim Jagielski     // set italic
1751*b1cdbd2cSJim Jagielski     aInfo.m_eItalic = ( qFontInfo.italic()? psp::italic::Italic: psp::italic::Upright );
1752*b1cdbd2cSJim Jagielski 
1753*b1cdbd2cSJim Jagielski     // set weight
1754*b1cdbd2cSJim Jagielski     int nWeight = qFontInfo.weight();
1755*b1cdbd2cSJim Jagielski     if ( nWeight <= QFont::Light )
1756*b1cdbd2cSJim Jagielski         aInfo.m_eWeight = psp::weight::Light;
1757*b1cdbd2cSJim Jagielski     else if ( nWeight <= QFont::Normal )
1758*b1cdbd2cSJim Jagielski         aInfo.m_eWeight = psp::weight::Normal;
1759*b1cdbd2cSJim Jagielski     else if ( nWeight <= QFont::DemiBold )
1760*b1cdbd2cSJim Jagielski         aInfo.m_eWeight = psp::weight::SemiBold;
1761*b1cdbd2cSJim Jagielski     else if ( nWeight <= QFont::Bold )
1762*b1cdbd2cSJim Jagielski         aInfo.m_eWeight = psp::weight::Bold;
1763*b1cdbd2cSJim Jagielski     else
1764*b1cdbd2cSJim Jagielski         aInfo.m_eWeight = psp::weight::UltraBold;
1765*b1cdbd2cSJim Jagielski 
1766*b1cdbd2cSJim Jagielski     // set width
1767*b1cdbd2cSJim Jagielski     int nStretch = rQFont.stretch();
1768*b1cdbd2cSJim Jagielski     if ( nStretch <= QFont::UltraCondensed )
1769*b1cdbd2cSJim Jagielski         aInfo.m_eWidth = psp::width::UltraCondensed;
1770*b1cdbd2cSJim Jagielski     else if ( nStretch <= QFont::ExtraCondensed )
1771*b1cdbd2cSJim Jagielski         aInfo.m_eWidth = psp::width::ExtraCondensed;
1772*b1cdbd2cSJim Jagielski     else if ( nStretch <= QFont::Condensed )
1773*b1cdbd2cSJim Jagielski         aInfo.m_eWidth = psp::width::Condensed;
1774*b1cdbd2cSJim Jagielski     else if ( nStretch <= QFont::SemiCondensed )
1775*b1cdbd2cSJim Jagielski         aInfo.m_eWidth = psp::width::SemiCondensed;
1776*b1cdbd2cSJim Jagielski     else if ( nStretch <= QFont::Unstretched )
1777*b1cdbd2cSJim Jagielski         aInfo.m_eWidth = psp::width::Normal;
1778*b1cdbd2cSJim Jagielski     else if ( nStretch <= QFont::SemiExpanded )
1779*b1cdbd2cSJim Jagielski         aInfo.m_eWidth = psp::width::SemiExpanded;
1780*b1cdbd2cSJim Jagielski     else if ( nStretch <= QFont::Expanded )
1781*b1cdbd2cSJim Jagielski         aInfo.m_eWidth = psp::width::Expanded;
1782*b1cdbd2cSJim Jagielski     else if ( nStretch <= QFont::ExtraExpanded )
1783*b1cdbd2cSJim Jagielski         aInfo.m_eWidth = psp::width::ExtraExpanded;
1784*b1cdbd2cSJim Jagielski     else
1785*b1cdbd2cSJim Jagielski         aInfo.m_eWidth = psp::width::UltraExpanded;
1786*b1cdbd2cSJim Jagielski 
1787*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
1788*b1cdbd2cSJim Jagielski     fprintf( stderr, "font name BEFORE system match: \"%s\"\n", OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() );
1789*b1cdbd2cSJim Jagielski #endif
1790*b1cdbd2cSJim Jagielski 
1791*b1cdbd2cSJim Jagielski     // match font to e.g. resolve "Sans"
1792*b1cdbd2cSJim Jagielski     psp::PrintFontManager::get().matchFont( aInfo, rLocale );
1793*b1cdbd2cSJim Jagielski 
1794*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
1795*b1cdbd2cSJim Jagielski     fprintf( stderr, "font match %s, name AFTER: \"%s\"\n",
1796*b1cdbd2cSJim Jagielski              aInfo.m_nID != 0 ? "succeeded" : "failed",
1797*b1cdbd2cSJim Jagielski              OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() );
1798*b1cdbd2cSJim Jagielski #endif
1799*b1cdbd2cSJim Jagielski 
1800*b1cdbd2cSJim Jagielski     // font height
1801*b1cdbd2cSJim Jagielski     int nPointHeight = qFontInfo.pointSize();
1802*b1cdbd2cSJim Jagielski     if ( nPointHeight <= 0 )
1803*b1cdbd2cSJim Jagielski         nPointHeight = rQFont.pointSize();
1804*b1cdbd2cSJim Jagielski 
1805*b1cdbd2cSJim Jagielski     // Create the font
1806*b1cdbd2cSJim Jagielski     Font aFont( aInfo.m_aFamilyName, Size( 0, nPointHeight ) );
1807*b1cdbd2cSJim Jagielski     if( aInfo.m_eWeight != psp::weight::Unknown )
1808*b1cdbd2cSJim Jagielski         aFont.SetWeight( PspGraphics::ToFontWeight( aInfo.m_eWeight ) );
1809*b1cdbd2cSJim Jagielski     if( aInfo.m_eWidth != psp::width::Unknown )
1810*b1cdbd2cSJim Jagielski         aFont.SetWidthType( PspGraphics::ToFontWidth( aInfo.m_eWidth ) );
1811*b1cdbd2cSJim Jagielski     if( aInfo.m_eItalic != psp::italic::Unknown )
1812*b1cdbd2cSJim Jagielski         aFont.SetItalic( PspGraphics::ToFontItalic( aInfo.m_eItalic ) );
1813*b1cdbd2cSJim Jagielski     if( aInfo.m_ePitch != psp::pitch::Unknown )
1814*b1cdbd2cSJim Jagielski         aFont.SetPitch( PspGraphics::ToFontPitch( aInfo.m_ePitch ) );
1815*b1cdbd2cSJim Jagielski 
1816*b1cdbd2cSJim Jagielski     return aFont;
1817*b1cdbd2cSJim Jagielski }
1818*b1cdbd2cSJim Jagielski 
1819*b1cdbd2cSJim Jagielski /** Implementation of KDE integration's main method.
1820*b1cdbd2cSJim Jagielski */
UpdateSettings(AllSettings & rSettings)1821*b1cdbd2cSJim Jagielski void KDESalFrame::UpdateSettings( AllSettings& rSettings )
1822*b1cdbd2cSJim Jagielski {
1823*b1cdbd2cSJim Jagielski     StyleSettings aStyleSettings( rSettings.GetStyleSettings() );
1824*b1cdbd2cSJim Jagielski 	bool bSetTitleFont = false;
1825*b1cdbd2cSJim Jagielski 
1826*b1cdbd2cSJim Jagielski     // WM settings
1827*b1cdbd2cSJim Jagielski     KConfig *pConfig = KGlobal::config();
1828*b1cdbd2cSJim Jagielski     if ( pConfig )
1829*b1cdbd2cSJim Jagielski     {
1830*b1cdbd2cSJim Jagielski         pConfig->setGroup( "WM" );
1831*b1cdbd2cSJim Jagielski         const char *pKey;
1832*b1cdbd2cSJim Jagielski 
1833*b1cdbd2cSJim Jagielski         pKey = "activeBackground";
1834*b1cdbd2cSJim Jagielski         if ( pConfig->hasKey( pKey ) )
1835*b1cdbd2cSJim Jagielski             aStyleSettings.SetActiveColor( readColor( pConfig, pKey ) );
1836*b1cdbd2cSJim Jagielski 
1837*b1cdbd2cSJim Jagielski         pKey = "activeBlend";
1838*b1cdbd2cSJim Jagielski         if ( pConfig->hasKey( pKey ) )
1839*b1cdbd2cSJim Jagielski             aStyleSettings.SetActiveColor2( readColor( pConfig, pKey ) );
1840*b1cdbd2cSJim Jagielski 
1841*b1cdbd2cSJim Jagielski         pKey = "inactiveBackground";
1842*b1cdbd2cSJim Jagielski         if ( pConfig->hasKey( pKey ) )
1843*b1cdbd2cSJim Jagielski             aStyleSettings.SetDeactiveColor( readColor( pConfig, pKey ) );
1844*b1cdbd2cSJim Jagielski 
1845*b1cdbd2cSJim Jagielski         pKey = "inactiveBlend";
1846*b1cdbd2cSJim Jagielski         if ( pConfig->hasKey( pKey ) )
1847*b1cdbd2cSJim Jagielski             aStyleSettings.SetDeactiveColor2( readColor( pConfig, pKey ) );
1848*b1cdbd2cSJim Jagielski 
1849*b1cdbd2cSJim Jagielski         pKey = "inactiveForeground";
1850*b1cdbd2cSJim Jagielski         if ( pConfig->hasKey( pKey ) )
1851*b1cdbd2cSJim Jagielski             aStyleSettings.SetDeactiveTextColor( readColor( pConfig, pKey ) );
1852*b1cdbd2cSJim Jagielski 
1853*b1cdbd2cSJim Jagielski         pKey = "activeForeground";
1854*b1cdbd2cSJim Jagielski         if ( pConfig->hasKey( pKey ) )
1855*b1cdbd2cSJim Jagielski             aStyleSettings.SetActiveTextColor( readColor( pConfig, pKey ) );
1856*b1cdbd2cSJim Jagielski 
1857*b1cdbd2cSJim Jagielski         pKey = "titleFont";
1858*b1cdbd2cSJim Jagielski         if ( pConfig->hasKey( pKey ) )
1859*b1cdbd2cSJim Jagielski         {
1860*b1cdbd2cSJim Jagielski             Font aFont = toFont( pConfig->readFontEntry( pKey ), rSettings.GetUILocale() );
1861*b1cdbd2cSJim Jagielski             aStyleSettings.SetTitleFont( aFont );
1862*b1cdbd2cSJim Jagielski 			bSetTitleFont = true;
1863*b1cdbd2cSJim Jagielski         }
1864*b1cdbd2cSJim Jagielski 
1865*b1cdbd2cSJim Jagielski         pConfig->setGroup( "Icons" );
1866*b1cdbd2cSJim Jagielski 
1867*b1cdbd2cSJim Jagielski         pKey = "Theme";
1868*b1cdbd2cSJim Jagielski         if ( pConfig->hasKey( pKey ) )
1869*b1cdbd2cSJim Jagielski             aStyleSettings.SetPreferredSymbolsStyleName( readEntryUntranslated( pConfig, pKey ) );
1870*b1cdbd2cSJim Jagielski     }
1871*b1cdbd2cSJim Jagielski 
1872*b1cdbd2cSJim Jagielski     // General settings
1873*b1cdbd2cSJim Jagielski     QColorGroup qColorGroup = kapp->palette().active();
1874*b1cdbd2cSJim Jagielski 
1875*b1cdbd2cSJim Jagielski     Color aFore = toColor( qColorGroup.foreground() );
1876*b1cdbd2cSJim Jagielski     Color aBack = toColor( qColorGroup.background() );
1877*b1cdbd2cSJim Jagielski     Color aText = toColor( qColorGroup.text() );
1878*b1cdbd2cSJim Jagielski     Color aBase = toColor( qColorGroup.base() );
1879*b1cdbd2cSJim Jagielski 
1880*b1cdbd2cSJim Jagielski     // Foreground
1881*b1cdbd2cSJim Jagielski     aStyleSettings.SetRadioCheckTextColor( aFore );
1882*b1cdbd2cSJim Jagielski     aStyleSettings.SetLabelTextColor( aFore );
1883*b1cdbd2cSJim Jagielski     aStyleSettings.SetInfoTextColor( aFore );
1884*b1cdbd2cSJim Jagielski     aStyleSettings.SetDialogTextColor( aFore );
1885*b1cdbd2cSJim Jagielski     aStyleSettings.SetGroupTextColor( aFore );
1886*b1cdbd2cSJim Jagielski 
1887*b1cdbd2cSJim Jagielski     // Text
1888*b1cdbd2cSJim Jagielski     aStyleSettings.SetFieldTextColor( aText );
1889*b1cdbd2cSJim Jagielski     aStyleSettings.SetFieldRolloverTextColor( aText );
1890*b1cdbd2cSJim Jagielski     aStyleSettings.SetWindowTextColor( aText );
1891*b1cdbd2cSJim Jagielski     aStyleSettings.SetHelpTextColor( aText );
1892*b1cdbd2cSJim Jagielski 
1893*b1cdbd2cSJim Jagielski     // Base
1894*b1cdbd2cSJim Jagielski     aStyleSettings.SetFieldColor( aBase );
1895*b1cdbd2cSJim Jagielski     aStyleSettings.SetHelpColor( aBase );
1896*b1cdbd2cSJim Jagielski     aStyleSettings.SetWindowColor( aBase );
1897*b1cdbd2cSJim Jagielski     aStyleSettings.SetActiveTabColor( aBase );
1898*b1cdbd2cSJim Jagielski 
1899*b1cdbd2cSJim Jagielski     // Buttons
1900*b1cdbd2cSJim Jagielski     aStyleSettings.SetButtonTextColor( toColor( qColorGroup.buttonText() ) );
1901*b1cdbd2cSJim Jagielski     aStyleSettings.SetButtonRolloverTextColor( toColor( qColorGroup.buttonText() ) );
1902*b1cdbd2cSJim Jagielski 
1903*b1cdbd2cSJim Jagielski     // Disable color
1904*b1cdbd2cSJim Jagielski     aStyleSettings.SetDisableColor( toColor( qColorGroup.mid() ) );
1905*b1cdbd2cSJim Jagielski 
1906*b1cdbd2cSJim Jagielski     // Workspace
1907*b1cdbd2cSJim Jagielski     aStyleSettings.SetWorkspaceColor( toColor( qColorGroup.mid() ) );
1908*b1cdbd2cSJim Jagielski 
1909*b1cdbd2cSJim Jagielski     // Background
1910*b1cdbd2cSJim Jagielski     aStyleSettings.Set3DColors( aBack );
1911*b1cdbd2cSJim Jagielski     aStyleSettings.SetFaceColor( aBack );
1912*b1cdbd2cSJim Jagielski     aStyleSettings.SetInactiveTabColor( aBack );
1913*b1cdbd2cSJim Jagielski     aStyleSettings.SetDialogColor( aBack );
1914*b1cdbd2cSJim Jagielski     if( aBack == COL_LIGHTGRAY )
1915*b1cdbd2cSJim Jagielski         aStyleSettings.SetCheckedColor( Color( 0xCC, 0xCC, 0xCC ) );
1916*b1cdbd2cSJim Jagielski     else
1917*b1cdbd2cSJim Jagielski     {
1918*b1cdbd2cSJim Jagielski         Color aColor2 = aStyleSettings.GetLightColor();
1919*b1cdbd2cSJim Jagielski         aStyleSettings.
1920*b1cdbd2cSJim Jagielski             SetCheckedColor( Color( (sal_uInt8)(((sal_uInt16)aBack.GetRed()+(sal_uInt16)aColor2.GetRed())/2),
1921*b1cdbd2cSJim Jagielski                         (sal_uInt8)(((sal_uInt16)aBack.GetGreen()+(sal_uInt16)aColor2.GetGreen())/2),
1922*b1cdbd2cSJim Jagielski                         (sal_uInt8)(((sal_uInt16)aBack.GetBlue()+(sal_uInt16)aColor2.GetBlue())/2)
1923*b1cdbd2cSJim Jagielski                         ) );
1924*b1cdbd2cSJim Jagielski     }
1925*b1cdbd2cSJim Jagielski 
1926*b1cdbd2cSJim Jagielski     // Selection
1927*b1cdbd2cSJim Jagielski     aStyleSettings.SetHighlightColor( toColor( qColorGroup.highlight() ) );
1928*b1cdbd2cSJim Jagielski     aStyleSettings.SetHighlightTextColor( toColor( qColorGroup.highlightedText() ) );
1929*b1cdbd2cSJim Jagielski 
1930*b1cdbd2cSJim Jagielski     // Font
1931*b1cdbd2cSJim Jagielski     Font aFont = toFont( kapp->font(), rSettings.GetUILocale() );
1932*b1cdbd2cSJim Jagielski 
1933*b1cdbd2cSJim Jagielski     aStyleSettings.SetAppFont( aFont );
1934*b1cdbd2cSJim Jagielski     aStyleSettings.SetHelpFont( aFont );
1935*b1cdbd2cSJim Jagielski 	if( !bSetTitleFont )
1936*b1cdbd2cSJim Jagielski 		aStyleSettings.SetTitleFont( aFont );
1937*b1cdbd2cSJim Jagielski 	aStyleSettings.SetFloatTitleFont( aFont );
1938*b1cdbd2cSJim Jagielski     aStyleSettings.SetMenuFont( aFont ); // will be changed according to pMenuBar
1939*b1cdbd2cSJim Jagielski     aStyleSettings.SetToolFont( aFont ); // will be changed according to pToolBar
1940*b1cdbd2cSJim Jagielski     aStyleSettings.SetLabelFont( aFont );
1941*b1cdbd2cSJim Jagielski     aStyleSettings.SetInfoFont( aFont );
1942*b1cdbd2cSJim Jagielski     aStyleSettings.SetRadioCheckFont( aFont );
1943*b1cdbd2cSJim Jagielski     aStyleSettings.SetPushButtonFont( aFont );
1944*b1cdbd2cSJim Jagielski     aStyleSettings.SetFieldFont( aFont );
1945*b1cdbd2cSJim Jagielski     aStyleSettings.SetIconFont( aFont );
1946*b1cdbd2cSJim Jagielski     aStyleSettings.SetGroupFont( aFont );
1947*b1cdbd2cSJim Jagielski     int flash_time = QApplication::cursorFlashTime();
1948*b1cdbd2cSJim Jagielski     aStyleSettings.SetCursorBlinkTime( flash_time != 0 ? flash_time/2 : STYLE_CURSOR_NOBLINKTIME );
1949*b1cdbd2cSJim Jagielski 
1950*b1cdbd2cSJim Jagielski     KMainWindow qMainWindow;
1951*b1cdbd2cSJim Jagielski     qMainWindow.createGUI( "/dev/null" ); // hack
1952*b1cdbd2cSJim Jagielski 
1953*b1cdbd2cSJim Jagielski     // Menu
1954*b1cdbd2cSJim Jagielski     aStyleSettings.SetSkipDisabledInMenus( sal_True );
1955*b1cdbd2cSJim Jagielski     KMenuBar *pMenuBar = qMainWindow.menuBar();
1956*b1cdbd2cSJim Jagielski     if ( pMenuBar )
1957*b1cdbd2cSJim Jagielski     {
1958*b1cdbd2cSJim Jagielski         // Color
1959*b1cdbd2cSJim Jagielski         QColorGroup qMenuCG = pMenuBar->colorGroup();
1960*b1cdbd2cSJim Jagielski 
1961*b1cdbd2cSJim Jagielski         // Menu text and background color, theme specific
1962*b1cdbd2cSJim Jagielski         Color aMenuFore = toColor( qMenuCG.foreground() );
1963*b1cdbd2cSJim Jagielski         Color aMenuBack = toColor( qMenuCG.background() );
1964*b1cdbd2cSJim Jagielski         if ( kapp->style().inherits( "LightStyleV2" ) ||
1965*b1cdbd2cSJim Jagielski              kapp->style().inherits( "LightStyleV3" ) ||
1966*b1cdbd2cSJim Jagielski              ( kapp->style().inherits( "QMotifStyle" ) && !kapp->style().inherits( "QSGIStyle" ) ) ||
1967*b1cdbd2cSJim Jagielski              kapp->style().inherits( "QWindowsStyle" ) )
1968*b1cdbd2cSJim Jagielski         {
1969*b1cdbd2cSJim Jagielski             aMenuFore = toColor( qMenuCG.buttonText() );
1970*b1cdbd2cSJim Jagielski             aMenuBack = toColor( qMenuCG.button() );
1971*b1cdbd2cSJim Jagielski         }
1972*b1cdbd2cSJim Jagielski 
1973*b1cdbd2cSJim Jagielski         aStyleSettings.SetMenuTextColor( aMenuFore );
1974*b1cdbd2cSJim Jagielski         aStyleSettings.SetMenuBarTextColor( aMenuFore );
1975*b1cdbd2cSJim Jagielski         aStyleSettings.SetMenuColor( aMenuBack );
1976*b1cdbd2cSJim Jagielski         aStyleSettings.SetMenuBarColor( aMenuBack );
1977*b1cdbd2cSJim Jagielski 
1978*b1cdbd2cSJim Jagielski         aStyleSettings.SetMenuHighlightColor( toColor ( qMenuCG.highlight() ) );
1979*b1cdbd2cSJim Jagielski 
1980*b1cdbd2cSJim Jagielski         // Menu items higlight text color, theme specific
1981*b1cdbd2cSJim Jagielski         if ( kapp->style().inherits( "HighContrastStyle" ) ||
1982*b1cdbd2cSJim Jagielski              kapp->style().inherits( "KeramikStyle" ) ||
1983*b1cdbd2cSJim Jagielski              kapp->style().inherits( "QWindowsStyle" ) ||
1984*b1cdbd2cSJim Jagielski              kapp->style().inherits( "ThinKeramikStyle" ) ||
1985*b1cdbd2cSJim Jagielski              kapp->style().inherits( "PlastikStyle" ) )
1986*b1cdbd2cSJim Jagielski         {
1987*b1cdbd2cSJim Jagielski             aStyleSettings.SetMenuHighlightTextColor( toColor ( qMenuCG.highlightedText() ) );
1988*b1cdbd2cSJim Jagielski         }
1989*b1cdbd2cSJim Jagielski         else
1990*b1cdbd2cSJim Jagielski             aStyleSettings.SetMenuHighlightTextColor( aMenuFore );
1991*b1cdbd2cSJim Jagielski 
1992*b1cdbd2cSJim Jagielski         // set special menubar higlight text color
1993*b1cdbd2cSJim Jagielski         if ( kapp->style().inherits( "HighContrastStyle" ) )
1994*b1cdbd2cSJim Jagielski             ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = toColor( qMenuCG.highlightedText() );
1995*b1cdbd2cSJim Jagielski         else
1996*b1cdbd2cSJim Jagielski             ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = aMenuFore;
1997*b1cdbd2cSJim Jagielski 
1998*b1cdbd2cSJim Jagielski         // Font
1999*b1cdbd2cSJim Jagielski         aFont = toFont( pMenuBar->font(), rSettings.GetUILocale() );
2000*b1cdbd2cSJim Jagielski         aStyleSettings.SetMenuFont( aFont );
2001*b1cdbd2cSJim Jagielski     }
2002*b1cdbd2cSJim Jagielski 
2003*b1cdbd2cSJim Jagielski     // Tool bar
2004*b1cdbd2cSJim Jagielski     KToolBar *pToolBar = qMainWindow.toolBar();
2005*b1cdbd2cSJim Jagielski     if ( pToolBar )
2006*b1cdbd2cSJim Jagielski     {
2007*b1cdbd2cSJim Jagielski         aFont = toFont( pToolBar->font(), rSettings.GetUILocale() );
2008*b1cdbd2cSJim Jagielski         aStyleSettings.SetToolFont( aFont );
2009*b1cdbd2cSJim Jagielski     }
2010*b1cdbd2cSJim Jagielski 
2011*b1cdbd2cSJim Jagielski     // Scroll bar size
2012*b1cdbd2cSJim Jagielski     aStyleSettings.SetScrollBarSize( kapp->style().pixelMetric( QStyle::PM_ScrollBarExtent ) );
2013*b1cdbd2cSJim Jagielski 
2014*b1cdbd2cSJim Jagielski     rSettings.SetStyleSettings( aStyleSettings );
2015*b1cdbd2cSJim Jagielski }
2016*b1cdbd2cSJim Jagielski 
GetGraphics()2017*b1cdbd2cSJim Jagielski SalGraphics* KDESalFrame::GetGraphics()
2018*b1cdbd2cSJim Jagielski {
2019*b1cdbd2cSJim Jagielski     if( GetWindow() )
2020*b1cdbd2cSJim Jagielski     {
2021*b1cdbd2cSJim Jagielski         for( int i = 0; i < nMaxGraphics; i++ )
2022*b1cdbd2cSJim Jagielski         {
2023*b1cdbd2cSJim Jagielski             if( ! m_aGraphics[i].bInUse )
2024*b1cdbd2cSJim Jagielski             {
2025*b1cdbd2cSJim Jagielski                 m_aGraphics[i].bInUse = true;
2026*b1cdbd2cSJim Jagielski                 if( ! m_aGraphics[i].pGraphics )
2027*b1cdbd2cSJim Jagielski                 {
2028*b1cdbd2cSJim Jagielski                     m_aGraphics[i].pGraphics = new KDESalGraphics();
2029*b1cdbd2cSJim Jagielski                     m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() );
2030*b1cdbd2cSJim Jagielski                 }
2031*b1cdbd2cSJim Jagielski                 return m_aGraphics[i].pGraphics;
2032*b1cdbd2cSJim Jagielski             }
2033*b1cdbd2cSJim Jagielski         }
2034*b1cdbd2cSJim Jagielski     }
2035*b1cdbd2cSJim Jagielski 
2036*b1cdbd2cSJim Jagielski     return NULL;
2037*b1cdbd2cSJim Jagielski }
2038*b1cdbd2cSJim Jagielski 
ReleaseGraphics(SalGraphics * pGraphics)2039*b1cdbd2cSJim Jagielski void KDESalFrame::ReleaseGraphics( SalGraphics *pGraphics )
2040*b1cdbd2cSJim Jagielski {
2041*b1cdbd2cSJim Jagielski     for( int i = 0; i < nMaxGraphics; i++ )
2042*b1cdbd2cSJim Jagielski     {
2043*b1cdbd2cSJim Jagielski         if( m_aGraphics[i].pGraphics == pGraphics )
2044*b1cdbd2cSJim Jagielski         {
2045*b1cdbd2cSJim Jagielski             m_aGraphics[i].bInUse = false;
2046*b1cdbd2cSJim Jagielski             break;
2047*b1cdbd2cSJim Jagielski         }
2048*b1cdbd2cSJim Jagielski     }
2049*b1cdbd2cSJim Jagielski }
2050*b1cdbd2cSJim Jagielski 
updateGraphics(bool bClear)2051*b1cdbd2cSJim Jagielski void KDESalFrame::updateGraphics( bool bClear )
2052*b1cdbd2cSJim Jagielski {
2053*b1cdbd2cSJim Jagielski     Drawable aDrawable = bClear ? None : GetWindow();
2054*b1cdbd2cSJim Jagielski     for( int i = 0; i < nMaxGraphics; i++ )
2055*b1cdbd2cSJim Jagielski     {
2056*b1cdbd2cSJim Jagielski         if( m_aGraphics[i].bInUse )
2057*b1cdbd2cSJim Jagielski             m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() );
2058*b1cdbd2cSJim Jagielski     }
2059*b1cdbd2cSJim Jagielski }
2060*b1cdbd2cSJim Jagielski 
~KDESalFrame()2061*b1cdbd2cSJim Jagielski KDESalFrame::~KDESalFrame()
2062*b1cdbd2cSJim Jagielski {
2063*b1cdbd2cSJim Jagielski }
2064*b1cdbd2cSJim Jagielski 
~GraphicsHolder()2065*b1cdbd2cSJim Jagielski KDESalFrame::GraphicsHolder::~GraphicsHolder()
2066*b1cdbd2cSJim Jagielski {
2067*b1cdbd2cSJim Jagielski 	delete pGraphics;
2068*b1cdbd2cSJim Jagielski }
2069*b1cdbd2cSJim Jagielski 
2070*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2071*b1cdbd2cSJim Jagielski // KDESalInstance implementation
2072*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2073*b1cdbd2cSJim Jagielski 
2074*b1cdbd2cSJim Jagielski SalFrame *
CreateFrame(SalFrame * pParent,sal_uLong nStyle)2075*b1cdbd2cSJim Jagielski KDESalInstance::CreateFrame( SalFrame *pParent, sal_uLong nStyle )
2076*b1cdbd2cSJim Jagielski {
2077*b1cdbd2cSJim Jagielski 	return new KDESalFrame( pParent, nStyle );
2078*b1cdbd2cSJim Jagielski }
2079*b1cdbd2cSJim Jagielski 
2080*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2081*b1cdbd2cSJim Jagielski // KDESalData pieces
2082*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2083*b1cdbd2cSJim Jagielski 
2084*b1cdbd2cSJim Jagielski // Create the widget painter so we have some control over
2085*b1cdbd2cSJim Jagielski // the destruction sequence, so Qt doesn't die in action.
2086*b1cdbd2cSJim Jagielski 
initNWF()2087*b1cdbd2cSJim Jagielski void KDEData::initNWF()
2088*b1cdbd2cSJim Jagielski {
2089*b1cdbd2cSJim Jagielski     ImplSVData *pSVData = ImplGetSVData();
2090*b1cdbd2cSJim Jagielski     // draw toolbars on separate lines
2091*b1cdbd2cSJim Jagielski     pSVData->maNWFData.mbDockingAreaSeparateTB = true;
2092*b1cdbd2cSJim Jagielski 
2093*b1cdbd2cSJim Jagielski     pWidgetPainter = new WidgetPainter();
2094*b1cdbd2cSJim Jagielski }
2095*b1cdbd2cSJim Jagielski 
deInitNWF()2096*b1cdbd2cSJim Jagielski void KDEData::deInitNWF()
2097*b1cdbd2cSJim Jagielski {
2098*b1cdbd2cSJim Jagielski     delete pWidgetPainter;
2099*b1cdbd2cSJim Jagielski     pWidgetPainter = NULL;
2100*b1cdbd2cSJim Jagielski 
2101*b1cdbd2cSJim Jagielski     // We have to destroy the style early
2102*b1cdbd2cSJim Jagielski     kapp->setStyle( NULL );
2103*b1cdbd2cSJim Jagielski }
2104