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 #include "vcl/svapp.hxx"
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include "unx/gtk/gtkframe.hxx"
30*b1cdbd2cSJim Jagielski #include "unx/gtk/gtkdata.hxx"
31*b1cdbd2cSJim Jagielski #include "unx/gtk/gtkinst.hxx"
32*b1cdbd2cSJim Jagielski #include "unx/gtk/gtkgdi.hxx"
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include "unx/pspgraphics.h"
35*b1cdbd2cSJim Jagielski #include "unx/saldata.hxx"
36*b1cdbd2cSJim Jagielski #include "unx/saldisp.hxx"
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #include <cstdio>
39*b1cdbd2cSJim Jagielski #include <cmath>
40*b1cdbd2cSJim Jagielski #include <vector>
41*b1cdbd2cSJim Jagielski #include <algorithm>
42*b1cdbd2cSJim Jagielski #include <hash_map>
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski typedef struct _cairo_font_options cairo_font_options_t;
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski // initialize statics
47*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::bThemeChanged = sal_True;
48*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::bNeedPixmapPaint = sal_False;
49*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::bGlobalNeedPixmapPaint = sal_False;
50*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::bToolbarGripWorkaround = sal_False;
51*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::bNeedButtonStyleAsEditBackgroundWorkaround = sal_False;
52*b1cdbd2cSJim Jagielski 
~GtkSalGraphics()53*b1cdbd2cSJim Jagielski GtkSalGraphics::~GtkSalGraphics()
54*b1cdbd2cSJim Jagielski {
55*b1cdbd2cSJim Jagielski }
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski using namespace rtl;
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski /*************************************
61*b1cdbd2cSJim Jagielski  * Cached native widget objects
62*b1cdbd2cSJim Jagielski  *************************************/
63*b1cdbd2cSJim Jagielski class NWPixmapCacheList;
64*b1cdbd2cSJim Jagielski class NWPixmapCache;
65*b1cdbd2cSJim Jagielski struct NWFWidgetData
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski     GtkWidget *	gCacheWindow;
68*b1cdbd2cSJim Jagielski     GtkWidget *	gDumbContainer;
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski     GtkWidget *	gBtnWidget;
71*b1cdbd2cSJim Jagielski     GtkWidget *	gRadioWidget;
72*b1cdbd2cSJim Jagielski     GtkWidget *	gRadioWidgetSibling;
73*b1cdbd2cSJim Jagielski     GtkWidget *	gCheckWidget;
74*b1cdbd2cSJim Jagielski     GtkWidget *	gScrollHorizWidget;
75*b1cdbd2cSJim Jagielski     GtkWidget *	gScrollVertWidget;
76*b1cdbd2cSJim Jagielski     GtkWidget *	gArrowWidget;
77*b1cdbd2cSJim Jagielski     GtkWidget *	gDropdownWidget;
78*b1cdbd2cSJim Jagielski     GtkWidget *	gEditBoxWidget;
79*b1cdbd2cSJim Jagielski     GtkWidget *	gSpinButtonWidget;
80*b1cdbd2cSJim Jagielski     GtkWidget *	gNotebookWidget;
81*b1cdbd2cSJim Jagielski     GtkWidget *	gOptionMenuWidget;
82*b1cdbd2cSJim Jagielski     GtkWidget *	gComboWidget;
83*b1cdbd2cSJim Jagielski     GtkWidget *	gScrolledWindowWidget;
84*b1cdbd2cSJim Jagielski     GtkWidget *  gToolbarWidget;
85*b1cdbd2cSJim Jagielski     GtkWidget *  gToolbarButtonWidget;
86*b1cdbd2cSJim Jagielski     GtkWidget *  gToolbarToggleWidget;
87*b1cdbd2cSJim Jagielski     GtkWidget *  gHandleBoxWidget;
88*b1cdbd2cSJim Jagielski     GtkWidget *  gMenubarWidget;
89*b1cdbd2cSJim Jagielski     GtkWidget *  gMenuItemMenubarWidget;
90*b1cdbd2cSJim Jagielski     GtkWidget *  gMenuWidget;
91*b1cdbd2cSJim Jagielski     GtkWidget *  gMenuItemMenuWidget;
92*b1cdbd2cSJim Jagielski     GtkWidget *  gMenuItemCheckMenuWidget;
93*b1cdbd2cSJim Jagielski     GtkWidget *  gMenuItemRadioMenuWidget;
94*b1cdbd2cSJim Jagielski     GtkWidget *  gImageMenuItem;
95*b1cdbd2cSJim Jagielski     GtkWidget *  gTooltipPopup;
96*b1cdbd2cSJim Jagielski     GtkWidget *  gProgressBar;
97*b1cdbd2cSJim Jagielski     GtkWidget *  gTreeView;
98*b1cdbd2cSJim Jagielski     GtkWidget *  gHScale;
99*b1cdbd2cSJim Jagielski     GtkWidget *  gVScale;
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski     NWPixmapCacheList* gNWPixmapCacheList;
102*b1cdbd2cSJim Jagielski     NWPixmapCache* gCacheTabItems;
103*b1cdbd2cSJim Jagielski     NWPixmapCache* gCacheTabPages;
104*b1cdbd2cSJim Jagielski 
NWFWidgetDataNWFWidgetData105*b1cdbd2cSJim Jagielski     NWFWidgetData() :
106*b1cdbd2cSJim Jagielski         gCacheWindow( NULL ),
107*b1cdbd2cSJim Jagielski         gDumbContainer( NULL ),
108*b1cdbd2cSJim Jagielski         gBtnWidget( NULL ),
109*b1cdbd2cSJim Jagielski         gRadioWidget( NULL ),
110*b1cdbd2cSJim Jagielski         gRadioWidgetSibling( NULL ),
111*b1cdbd2cSJim Jagielski         gCheckWidget( NULL ),
112*b1cdbd2cSJim Jagielski         gScrollHorizWidget( NULL ),
113*b1cdbd2cSJim Jagielski         gScrollVertWidget( NULL ),
114*b1cdbd2cSJim Jagielski         gArrowWidget( NULL ),
115*b1cdbd2cSJim Jagielski         gDropdownWidget( NULL ),
116*b1cdbd2cSJim Jagielski         gEditBoxWidget( NULL ),
117*b1cdbd2cSJim Jagielski         gSpinButtonWidget( NULL ),
118*b1cdbd2cSJim Jagielski         gNotebookWidget( NULL ),
119*b1cdbd2cSJim Jagielski         gOptionMenuWidget( NULL ),
120*b1cdbd2cSJim Jagielski         gComboWidget( NULL ),
121*b1cdbd2cSJim Jagielski         gScrolledWindowWidget( NULL ),
122*b1cdbd2cSJim Jagielski         gToolbarWidget( NULL ),
123*b1cdbd2cSJim Jagielski         gToolbarButtonWidget( NULL ),
124*b1cdbd2cSJim Jagielski         gToolbarToggleWidget( NULL ),
125*b1cdbd2cSJim Jagielski         gHandleBoxWidget( NULL ),
126*b1cdbd2cSJim Jagielski         gMenubarWidget( NULL ),
127*b1cdbd2cSJim Jagielski         gMenuItemMenubarWidget( NULL ),
128*b1cdbd2cSJim Jagielski         gMenuWidget( NULL ),
129*b1cdbd2cSJim Jagielski         gMenuItemMenuWidget( NULL ),
130*b1cdbd2cSJim Jagielski         gMenuItemCheckMenuWidget( NULL ),
131*b1cdbd2cSJim Jagielski         gMenuItemRadioMenuWidget( NULL ),
132*b1cdbd2cSJim Jagielski         gImageMenuItem( NULL ),
133*b1cdbd2cSJim Jagielski         gTooltipPopup( NULL ),
134*b1cdbd2cSJim Jagielski         gProgressBar( NULL ),
135*b1cdbd2cSJim Jagielski         gTreeView( NULL ),
136*b1cdbd2cSJim Jagielski         gHScale( NULL ),
137*b1cdbd2cSJim Jagielski         gVScale( NULL ),
138*b1cdbd2cSJim Jagielski         gNWPixmapCacheList( NULL ),
139*b1cdbd2cSJim Jagielski         gCacheTabItems( NULL ),
140*b1cdbd2cSJim Jagielski         gCacheTabPages( NULL )
141*b1cdbd2cSJim Jagielski     {}
142*b1cdbd2cSJim Jagielski };
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski // Keep a hash table of Widgets->default flags so that we can
145*b1cdbd2cSJim Jagielski // easily and quickly reset each to a default state before using
146*b1cdbd2cSJim Jagielski // them
147*b1cdbd2cSJim Jagielski static std::hash_map<long, guint>	gWidgetDefaultFlags;
148*b1cdbd2cSJim Jagielski static std::vector<NWFWidgetData>   gWidgetData;
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski static const GtkBorder aDefDefBorder		= { 1, 1, 1, 1 };
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski // Some GTK defaults
153*b1cdbd2cSJim Jagielski #define MIN_ARROW_SIZE					11
154*b1cdbd2cSJim Jagielski #define BTN_CHILD_SPACING				1
155*b1cdbd2cSJim Jagielski #define MIN_SPIN_ARROW_WIDTH				6
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski static void NWEnsureGTKRadio			( int nScreen );
159*b1cdbd2cSJim Jagielski static void NWEnsureGTKButton			( int nScreen );
160*b1cdbd2cSJim Jagielski static void NWEnsureGTKCheck			( int nScreen );
161*b1cdbd2cSJim Jagielski static void NWEnsureGTKScrollbars		( int nScreen );
162*b1cdbd2cSJim Jagielski static void NWEnsureGTKArrow			( int nScreen );
163*b1cdbd2cSJim Jagielski static void NWEnsureGTKEditBox			( int nScreen );
164*b1cdbd2cSJim Jagielski static void NWEnsureGTKSpinButton		( int nScreen );
165*b1cdbd2cSJim Jagielski static void NWEnsureGTKNotebook			( int nScreen );
166*b1cdbd2cSJim Jagielski static void NWEnsureGTKOptionMenu		( int nScreen );
167*b1cdbd2cSJim Jagielski static void NWEnsureGTKCombo			( int nScreen );
168*b1cdbd2cSJim Jagielski static void NWEnsureGTKScrolledWindow	( int nScreen );
169*b1cdbd2cSJim Jagielski static void NWEnsureGTKToolbar			( int nScreen );
170*b1cdbd2cSJim Jagielski static void NWEnsureGTKMenubar          ( int nScreen );
171*b1cdbd2cSJim Jagielski static void NWEnsureGTKMenu             ( int nScreen );
172*b1cdbd2cSJim Jagielski static void NWEnsureGTKTooltip          ( int nScreen );
173*b1cdbd2cSJim Jagielski static void NWEnsureGTKProgressBar      ( int nScreen );
174*b1cdbd2cSJim Jagielski static void NWEnsureGTKTreeView         ( int nScreen );
175*b1cdbd2cSJim Jagielski static void NWEnsureGTKSlider           ( int nScreen );
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski static void NWConvertVCLStateToGTKState( ControlState nVCLState, GtkStateType* nGTKState, GtkShadowType* nGTKShadow );
178*b1cdbd2cSJim Jagielski static void NWAddWidgetToCacheWindow( GtkWidget* widget, int nScreen );
179*b1cdbd2cSJim Jagielski static void NWSetWidgetState( GtkWidget* widget, ControlState nState, GtkStateType nGtkState );
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski static void NWCalcArrowRect( const Rectangle& rButton, Rectangle& rArrow );
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski /*
184*b1cdbd2cSJim Jagielski  * Individual helper functions
185*b1cdbd2cSJim Jagielski  *
186*b1cdbd2cSJim Jagielski  */
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski //---
189*b1cdbd2cSJim Jagielski static Rectangle NWGetButtonArea( int nScreen, ControlType nType, ControlPart nPart, Rectangle aAreaRect, ControlState nState,
190*b1cdbd2cSJim Jagielski 								const ImplControlValue& aValue, const OUString& rCaption );
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski //---
193*b1cdbd2cSJim Jagielski static Rectangle NWGetEditBoxPixmapRect( int nScreen, ControlType nType, ControlPart nPart, Rectangle aAreaRect, ControlState nState,
194*b1cdbd2cSJim Jagielski 							const ImplControlValue& aValue, const OUString& rCaption );
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski static void NWPaintOneEditBox( int nScreen, GdkDrawable * gdkDrawable, GdkRectangle *gdkRect,
197*b1cdbd2cSJim Jagielski                                ControlType nType, ControlPart nPart, Rectangle aEditBoxRect,
198*b1cdbd2cSJim Jagielski                                ControlState nState, const ImplControlValue& aValue,
199*b1cdbd2cSJim Jagielski                                const OUString& rCaption );
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski //---
202*b1cdbd2cSJim Jagielski static Rectangle NWGetSpinButtonRect( int nScreen, ControlType nType, ControlPart nPart, Rectangle aAreaRect, ControlState nState,
203*b1cdbd2cSJim Jagielski 							const ImplControlValue& aValue, const OUString& rCaption );
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski static void NWPaintOneSpinButton( int nScreen, GdkPixmap * pixmap, ControlType nType, ControlPart nPart, Rectangle aAreaRect,
206*b1cdbd2cSJim Jagielski 							ControlState nState, const ImplControlValue& aValue,
207*b1cdbd2cSJim Jagielski 							const OUString& rCaption );
208*b1cdbd2cSJim Jagielski //---
209*b1cdbd2cSJim Jagielski static Rectangle NWGetComboBoxButtonRect( int nScreen, ControlType nType, ControlPart nPart, Rectangle aAreaRect, ControlState nState,
210*b1cdbd2cSJim Jagielski 							const ImplControlValue& aValue, const OUString& rCaption );
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski //---
213*b1cdbd2cSJim Jagielski static Rectangle NWGetListBoxButtonRect( int nScreen, ControlType nType, ControlPart nPart, Rectangle aAreaRect, ControlState nState,
214*b1cdbd2cSJim Jagielski 							const ImplControlValue& aValue, const OUString& rCaption );
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski static Rectangle NWGetListBoxIndicatorRect( int nScreen, ControlType nType, ControlPart nPart, Rectangle aAreaRect, ControlState nState,
217*b1cdbd2cSJim Jagielski 							const ImplControlValue& aValue, const OUString& rCaption );
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski static Rectangle NWGetToolbarRect( int nScreen,
220*b1cdbd2cSJim Jagielski                                    ControlType nType,
221*b1cdbd2cSJim Jagielski                                    ControlPart nPart,
222*b1cdbd2cSJim Jagielski                                    Rectangle aAreaRect,
223*b1cdbd2cSJim Jagielski                                    ControlState nState,
224*b1cdbd2cSJim Jagielski                                    const ImplControlValue& aValue,
225*b1cdbd2cSJim Jagielski                                    const OUString& rCaption );
226*b1cdbd2cSJim Jagielski //---
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski static Rectangle NWGetScrollButtonRect(	int nScreen, ControlPart nPart, Rectangle aAreaRect );
229*b1cdbd2cSJim Jagielski //---
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski /*********************************************************
232*b1cdbd2cSJim Jagielski  * PixmapCache
233*b1cdbd2cSJim Jagielski  *********************************************************/
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski // as some native widget drawing operations are pretty slow
236*b1cdbd2cSJim Jagielski // with certain themes (eg tabpages)
237*b1cdbd2cSJim Jagielski // this cache can be used to cache the corresponding pixmap
238*b1cdbd2cSJim Jagielski // see NWPaintGTKTabItem
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski class NWPixmapCacheData
241*b1cdbd2cSJim Jagielski {
242*b1cdbd2cSJim Jagielski public:
243*b1cdbd2cSJim Jagielski     ControlType m_nType;
244*b1cdbd2cSJim Jagielski     ControlState m_nState;
245*b1cdbd2cSJim Jagielski     Rectangle   m_pixmapRect;
246*b1cdbd2cSJim Jagielski     GdkPixmap*  m_pixmap;
247*b1cdbd2cSJim Jagielski 
NWPixmapCacheData()248*b1cdbd2cSJim Jagielski     NWPixmapCacheData() : m_nType(0), m_nState(0), m_pixmap(0) {}
~NWPixmapCacheData()249*b1cdbd2cSJim Jagielski     ~NWPixmapCacheData()
250*b1cdbd2cSJim Jagielski         { SetPixmap( NULL ); };
251*b1cdbd2cSJim Jagielski     void SetPixmap( GdkPixmap* pPixmap );
252*b1cdbd2cSJim Jagielski };
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski class NWPixmapCache
255*b1cdbd2cSJim Jagielski {
256*b1cdbd2cSJim Jagielski     int m_size;
257*b1cdbd2cSJim Jagielski     int m_idx;
258*b1cdbd2cSJim Jagielski     int m_screen;
259*b1cdbd2cSJim Jagielski     NWPixmapCacheData* pData;
260*b1cdbd2cSJim Jagielski public:
261*b1cdbd2cSJim Jagielski     NWPixmapCache( int nScreen );
262*b1cdbd2cSJim Jagielski     ~NWPixmapCache();
263*b1cdbd2cSJim Jagielski 
SetSize(int n)264*b1cdbd2cSJim Jagielski     void SetSize( int n)
265*b1cdbd2cSJim Jagielski         { delete [] pData; m_idx = 0; m_size = n; pData = new NWPixmapCacheData[m_size]; }
GetSize()266*b1cdbd2cSJim Jagielski     int GetSize() { return m_size; }
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski     sal_Bool Find( ControlType aType, ControlState aState, const Rectangle& r_pixmapRect, GdkPixmap** pPixmap );
269*b1cdbd2cSJim Jagielski     void Fill( ControlType aType, ControlState aState, const Rectangle& r_pixmapRect, GdkPixmap* pPixmap );
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski     void ThemeChanged();
272*b1cdbd2cSJim Jagielski };
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski class NWPixmapCacheList
275*b1cdbd2cSJim Jagielski {
276*b1cdbd2cSJim Jagielski public:
277*b1cdbd2cSJim Jagielski     ::std::vector< NWPixmapCache* > mCaches;
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski     void AddCache( NWPixmapCache *pCache );
280*b1cdbd2cSJim Jagielski     void RemoveCache( NWPixmapCache *pCache );
281*b1cdbd2cSJim Jagielski     void ThemeChanged();
282*b1cdbd2cSJim Jagielski };
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski // --- implementation ---
285*b1cdbd2cSJim Jagielski 
SetPixmap(GdkPixmap * pPixmap)286*b1cdbd2cSJim Jagielski void NWPixmapCacheData::SetPixmap( GdkPixmap* pPixmap )
287*b1cdbd2cSJim Jagielski {
288*b1cdbd2cSJim Jagielski     if( m_pixmap )
289*b1cdbd2cSJim Jagielski         g_object_unref( m_pixmap );
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski     m_pixmap = pPixmap;
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski     if( m_pixmap )
294*b1cdbd2cSJim Jagielski         g_object_ref( m_pixmap );
295*b1cdbd2cSJim Jagielski }
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski 
NWPixmapCache(int nScreen)298*b1cdbd2cSJim Jagielski NWPixmapCache::NWPixmapCache( int nScreen )
299*b1cdbd2cSJim Jagielski {
300*b1cdbd2cSJim Jagielski     m_idx = 0;
301*b1cdbd2cSJim Jagielski     m_size = 0;
302*b1cdbd2cSJim Jagielski     m_screen = nScreen;
303*b1cdbd2cSJim Jagielski     pData = NULL;
304*b1cdbd2cSJim Jagielski     if( gWidgetData[m_screen].gNWPixmapCacheList )
305*b1cdbd2cSJim Jagielski         gWidgetData[m_screen].gNWPixmapCacheList->AddCache(this);
306*b1cdbd2cSJim Jagielski }
~NWPixmapCache()307*b1cdbd2cSJim Jagielski NWPixmapCache::~NWPixmapCache()
308*b1cdbd2cSJim Jagielski {
309*b1cdbd2cSJim Jagielski     if( gWidgetData[m_screen].gNWPixmapCacheList )
310*b1cdbd2cSJim Jagielski         gWidgetData[m_screen].gNWPixmapCacheList->RemoveCache(this);
311*b1cdbd2cSJim Jagielski     delete[] pData;
312*b1cdbd2cSJim Jagielski }
ThemeChanged()313*b1cdbd2cSJim Jagielski void NWPixmapCache::ThemeChanged()
314*b1cdbd2cSJim Jagielski {
315*b1cdbd2cSJim Jagielski     // throw away cached pixmaps
316*b1cdbd2cSJim Jagielski     int i;
317*b1cdbd2cSJim Jagielski     for(i=0; i<m_size; i++)
318*b1cdbd2cSJim Jagielski         pData[i].SetPixmap( NULL );
319*b1cdbd2cSJim Jagielski }
320*b1cdbd2cSJim Jagielski 
Find(ControlType aType,ControlState aState,const Rectangle & r_pixmapRect,GdkPixmap ** pPixmap)321*b1cdbd2cSJim Jagielski sal_Bool  NWPixmapCache::Find( ControlType aType, ControlState aState, const Rectangle& r_pixmapRect, GdkPixmap** pPixmap )
322*b1cdbd2cSJim Jagielski {
323*b1cdbd2cSJim Jagielski     aState &= ~CTRL_CACHING_ALLOWED; // mask clipping flag
324*b1cdbd2cSJim Jagielski     int i;
325*b1cdbd2cSJim Jagielski     for(i=0; i<m_size; i++)
326*b1cdbd2cSJim Jagielski     {
327*b1cdbd2cSJim Jagielski         if( pData[i].m_nType == aType &&
328*b1cdbd2cSJim Jagielski             pData[i].m_nState == aState &&
329*b1cdbd2cSJim Jagielski             pData[i].m_pixmapRect.GetWidth() == r_pixmapRect.GetWidth() &&
330*b1cdbd2cSJim Jagielski             pData[i].m_pixmapRect.GetHeight() == r_pixmapRect.GetHeight() &&
331*b1cdbd2cSJim Jagielski             pData[i].m_pixmap != NULL )
332*b1cdbd2cSJim Jagielski         {
333*b1cdbd2cSJim Jagielski             *pPixmap = pData[i].m_pixmap;
334*b1cdbd2cSJim Jagielski             return sal_True;
335*b1cdbd2cSJim Jagielski         }
336*b1cdbd2cSJim Jagielski     }
337*b1cdbd2cSJim Jagielski     return sal_False;
338*b1cdbd2cSJim Jagielski }
339*b1cdbd2cSJim Jagielski 
Fill(ControlType aType,ControlState aState,const Rectangle & r_pixmapRect,GdkPixmap * pPixmap)340*b1cdbd2cSJim Jagielski void NWPixmapCache::Fill( ControlType aType, ControlState aState, const Rectangle& r_pixmapRect, GdkPixmap* pPixmap )
341*b1cdbd2cSJim Jagielski {
342*b1cdbd2cSJim Jagielski     if( !(aState & CTRL_CACHING_ALLOWED) )
343*b1cdbd2cSJim Jagielski         return;
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski     aState &= ~CTRL_CACHING_ALLOWED; // mask clipping flag
346*b1cdbd2cSJim Jagielski     m_idx = (m_idx+1) % m_size; // just wrap
347*b1cdbd2cSJim Jagielski     pData[m_idx].m_nType = aType;
348*b1cdbd2cSJim Jagielski     pData[m_idx].m_nState = aState;
349*b1cdbd2cSJim Jagielski     pData[m_idx].m_pixmapRect = r_pixmapRect;
350*b1cdbd2cSJim Jagielski     pData[m_idx].SetPixmap( pPixmap );
351*b1cdbd2cSJim Jagielski }
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski 
AddCache(NWPixmapCache * pCache)354*b1cdbd2cSJim Jagielski void NWPixmapCacheList::AddCache( NWPixmapCache* pCache )
355*b1cdbd2cSJim Jagielski {
356*b1cdbd2cSJim Jagielski     mCaches.push_back( pCache );
357*b1cdbd2cSJim Jagielski }
RemoveCache(NWPixmapCache * pCache)358*b1cdbd2cSJim Jagielski void NWPixmapCacheList::RemoveCache( NWPixmapCache* pCache )
359*b1cdbd2cSJim Jagielski {
360*b1cdbd2cSJim Jagielski     ::std::vector< NWPixmapCache* >::iterator p;
361*b1cdbd2cSJim Jagielski     p = ::std::find( mCaches.begin(), mCaches.end(), pCache );
362*b1cdbd2cSJim Jagielski     if( p != mCaches.end() )
363*b1cdbd2cSJim Jagielski         mCaches.erase( p );
364*b1cdbd2cSJim Jagielski }
ThemeChanged()365*b1cdbd2cSJim Jagielski void NWPixmapCacheList::ThemeChanged( )
366*b1cdbd2cSJim Jagielski {
367*b1cdbd2cSJim Jagielski     ::std::vector< NWPixmapCache* >::iterator p = mCaches.begin();
368*b1cdbd2cSJim Jagielski     while( p != mCaches.end() )
369*b1cdbd2cSJim Jagielski     {
370*b1cdbd2cSJim Jagielski         (*p)->ThemeChanged();
371*b1cdbd2cSJim Jagielski         p++;
372*b1cdbd2cSJim Jagielski     }
373*b1cdbd2cSJim Jagielski }
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski /*********************************************************
377*b1cdbd2cSJim Jagielski  * Make border manipulation easier
378*b1cdbd2cSJim Jagielski  *********************************************************/
NW_gtk_border_set_from_border(GtkBorder & aDst,const GtkBorder * pSrc)379*b1cdbd2cSJim Jagielski inline void NW_gtk_border_set_from_border( GtkBorder& aDst, const GtkBorder * pSrc )
380*b1cdbd2cSJim Jagielski {
381*b1cdbd2cSJim Jagielski 	aDst.left		= pSrc->left;
382*b1cdbd2cSJim Jagielski 	aDst.top		= pSrc->top;
383*b1cdbd2cSJim Jagielski 	aDst.right	= pSrc->right;
384*b1cdbd2cSJim Jagielski 	aDst.bottom	= pSrc->bottom;
385*b1cdbd2cSJim Jagielski }
386*b1cdbd2cSJim Jagielski 
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski /*********************************************************
389*b1cdbd2cSJim Jagielski  * Initialize GTK and local stuff
390*b1cdbd2cSJim Jagielski  *********************************************************/
initNWF(void)391*b1cdbd2cSJim Jagielski void GtkData::initNWF( void )
392*b1cdbd2cSJim Jagielski {
393*b1cdbd2cSJim Jagielski     ImplSVData* pSVData = ImplGetSVData();
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski     // draw no border for popup menus (NWF draws its own)
396*b1cdbd2cSJim Jagielski     pSVData->maNWFData.mbFlatMenu = true;
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski     // draw separate buttons for toolbox dropdown items
399*b1cdbd2cSJim Jagielski     pSVData->maNWFData.mbToolboxDropDownSeparate = true;
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski     // small extra border around menu items
402*b1cdbd2cSJim Jagielski     pSVData->maNWFData.mnMenuFormatExtraBorder = 1;
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski     // draw toolbars in separate lines
405*b1cdbd2cSJim Jagielski     pSVData->maNWFData.mbDockingAreaSeparateTB = true;
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski     // open first menu on F10
408*b1cdbd2cSJim Jagielski     pSVData->maNWFData.mbOpenMenuOnF10 = true;
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski     // omit GetNativeControl while painting (see brdwin.cxx)
411*b1cdbd2cSJim Jagielski     pSVData->maNWFData.mbCanDrawWidgetAnySize = true;
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski     int nScreens = GetX11SalData()->GetDisplay()->GetScreenCount();
414*b1cdbd2cSJim Jagielski     gWidgetData = std::vector<NWFWidgetData>( nScreens );
415*b1cdbd2cSJim Jagielski     for( int i = 0; i < nScreens; i++ )
416*b1cdbd2cSJim Jagielski         gWidgetData[i].gNWPixmapCacheList = new NWPixmapCacheList;
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski     if( SalGetDesktopEnvironment().equalsAscii( "KDE" ) )
420*b1cdbd2cSJim Jagielski     {
421*b1cdbd2cSJim Jagielski         // #i97196# ensure a widget exists and the style engine was loaded
422*b1cdbd2cSJim Jagielski         NWEnsureGTKButton( 0 );
423*b1cdbd2cSJim Jagielski         if( g_type_from_name( "QtEngineStyle" ) )
424*b1cdbd2cSJim Jagielski         {
425*b1cdbd2cSJim Jagielski             // KDE 3.3 invented a bug in the qt<->gtk theme engine
426*b1cdbd2cSJim Jagielski             // that makes direct rendering impossible: they totally
427*b1cdbd2cSJim Jagielski             // ignore the clip rectangle passed to the paint methods
428*b1cdbd2cSJim Jagielski             GtkSalGraphics::bNeedPixmapPaint = GtkSalGraphics::bGlobalNeedPixmapPaint = true;
429*b1cdbd2cSJim Jagielski         }
430*b1cdbd2cSJim Jagielski     }
431*b1cdbd2cSJim Jagielski     static const char* pEnv = getenv( "SAL_GTK_USE_PIXMAPPAINT" );
432*b1cdbd2cSJim Jagielski     if( pEnv && *pEnv )
433*b1cdbd2cSJim Jagielski         GtkSalGraphics::bNeedPixmapPaint = GtkSalGraphics::bGlobalNeedPixmapPaint = true;
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski     #if OSL_DEBUG_LEVEL > 1
436*b1cdbd2cSJim Jagielski     std::fprintf( stderr, "GtkPlugin: using %s NWF\n",
437*b1cdbd2cSJim Jagielski              GtkSalGraphics::bNeedPixmapPaint ? "offscreen" : "direct" );
438*b1cdbd2cSJim Jagielski     #endif
439*b1cdbd2cSJim Jagielski }
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski /*********************************************************
443*b1cdbd2cSJim Jagielski  * Release GTK and local stuff
444*b1cdbd2cSJim Jagielski  *********************************************************/
deInitNWF(void)445*b1cdbd2cSJim Jagielski void GtkData::deInitNWF( void )
446*b1cdbd2cSJim Jagielski {
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski     for( unsigned int i = 0; i < gWidgetData.size(); i++ )
449*b1cdbd2cSJim Jagielski     {
450*b1cdbd2cSJim Jagielski         // free up global widgets
451*b1cdbd2cSJim Jagielski         // gtk_widget_destroy will in turn destroy the child hierarchy
452*b1cdbd2cSJim Jagielski         // so only destroy disjunct hierachies
453*b1cdbd2cSJim Jagielski         if( gWidgetData[i].gCacheWindow )
454*b1cdbd2cSJim Jagielski             gtk_widget_destroy( gWidgetData[i].gCacheWindow );
455*b1cdbd2cSJim Jagielski         if( gWidgetData[i].gMenuWidget )
456*b1cdbd2cSJim Jagielski             gtk_widget_destroy( gWidgetData[i].gMenuWidget );
457*b1cdbd2cSJim Jagielski         if( gWidgetData[i].gTooltipPopup )
458*b1cdbd2cSJim Jagielski             gtk_widget_destroy( gWidgetData[i].gTooltipPopup );
459*b1cdbd2cSJim Jagielski         delete gWidgetData[i].gCacheTabPages;
460*b1cdbd2cSJim Jagielski         gWidgetData[i].gCacheTabPages = NULL;
461*b1cdbd2cSJim Jagielski         delete gWidgetData[i].gCacheTabItems;
462*b1cdbd2cSJim Jagielski         gWidgetData[i].gCacheTabItems = NULL;
463*b1cdbd2cSJim Jagielski         delete gWidgetData[i].gNWPixmapCacheList;
464*b1cdbd2cSJim Jagielski         gWidgetData[i].gNWPixmapCacheList = NULL;
465*b1cdbd2cSJim Jagielski     }
466*b1cdbd2cSJim Jagielski }
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski /**********************************************************
470*b1cdbd2cSJim Jagielski  * track clip region
471*b1cdbd2cSJim Jagielski  **********************************************************/
ResetClipRegion()472*b1cdbd2cSJim Jagielski void GtkSalGraphics::ResetClipRegion()
473*b1cdbd2cSJim Jagielski {
474*b1cdbd2cSJim Jagielski     m_aClipRegion.SetNull();
475*b1cdbd2cSJim Jagielski     X11SalGraphics::ResetClipRegion();
476*b1cdbd2cSJim Jagielski }
477*b1cdbd2cSJim Jagielski 
setClipRegion(const Region & i_rClip)478*b1cdbd2cSJim Jagielski bool GtkSalGraphics::setClipRegion( const Region& i_rClip )
479*b1cdbd2cSJim Jagielski {
480*b1cdbd2cSJim Jagielski     m_aClipRegion = i_rClip;
481*b1cdbd2cSJim Jagielski     bool bRet = X11SalGraphics::setClipRegion( m_aClipRegion );
482*b1cdbd2cSJim Jagielski     if( m_aClipRegion.IsEmpty() )
483*b1cdbd2cSJim Jagielski         m_aClipRegion.SetNull();
484*b1cdbd2cSJim Jagielski     return bRet;
485*b1cdbd2cSJim Jagielski }
486*b1cdbd2cSJim Jagielski 
copyBits(const SalTwoRect & rPosAry,SalGraphics * pSrcGraphics)487*b1cdbd2cSJim Jagielski void GtkSalGraphics::copyBits( const SalTwoRect& rPosAry,
488*b1cdbd2cSJim Jagielski                                SalGraphics* pSrcGraphics )
489*b1cdbd2cSJim Jagielski {
490*b1cdbd2cSJim Jagielski     GtkSalFrame* pFrame = GetGtkFrame();
491*b1cdbd2cSJim Jagielski     XLIB_Window aWin = None;
492*b1cdbd2cSJim Jagielski     if( pFrame && m_pWindow )
493*b1cdbd2cSJim Jagielski     {
494*b1cdbd2cSJim Jagielski         /* #i64117# some themes set the background pixmap VERY frequently */
495*b1cdbd2cSJim Jagielski         GdkWindow* pWin = GTK_WIDGET(m_pWindow)->window;
496*b1cdbd2cSJim Jagielski         if( pWin )
497*b1cdbd2cSJim Jagielski         {
498*b1cdbd2cSJim Jagielski             aWin = GDK_WINDOW_XWINDOW(pWin);
499*b1cdbd2cSJim Jagielski             if( aWin != None )
500*b1cdbd2cSJim Jagielski                 XSetWindowBackgroundPixmap( pFrame->getDisplay()->GetDisplay(),
501*b1cdbd2cSJim Jagielski                                             aWin,
502*b1cdbd2cSJim Jagielski                                             None );
503*b1cdbd2cSJim Jagielski         }
504*b1cdbd2cSJim Jagielski     }
505*b1cdbd2cSJim Jagielski     X11SalGraphics::copyBits( rPosAry, pSrcGraphics );
506*b1cdbd2cSJim Jagielski     if( pFrame && pFrame->getBackgroundPixmap() != None )
507*b1cdbd2cSJim Jagielski         XSetWindowBackgroundPixmap( pFrame->getDisplay()->GetDisplay(),
508*b1cdbd2cSJim Jagielski                                     aWin,
509*b1cdbd2cSJim Jagielski                                     pFrame->getBackgroundPixmap() );
510*b1cdbd2cSJim Jagielski }
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski /*
513*b1cdbd2cSJim Jagielski  * IsNativeControlSupported()
514*b1cdbd2cSJim Jagielski  *
515*b1cdbd2cSJim Jagielski  *  Returns sal_True if the platform supports native
516*b1cdbd2cSJim Jagielski  *  drawing of the control defined by nPart
517*b1cdbd2cSJim Jagielski  */
IsNativeControlSupported(ControlType nType,ControlPart nPart)518*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::IsNativeControlSupported( ControlType nType, ControlPart nPart )
519*b1cdbd2cSJim Jagielski {
520*b1cdbd2cSJim Jagielski 	if (
521*b1cdbd2cSJim Jagielski 		((nType==CTRL_PUSHBUTTON)  && (nPart==PART_ENTIRE_CONTROL)) 	||
522*b1cdbd2cSJim Jagielski  		((nType==CTRL_RADIOBUTTON) && (nPart==PART_ENTIRE_CONTROL))		||
523*b1cdbd2cSJim Jagielski 		((nType==CTRL_CHECKBOX)    && (nPart==PART_ENTIRE_CONTROL))		||
524*b1cdbd2cSJim Jagielski 		((nType==CTRL_SCROLLBAR) &&
525*b1cdbd2cSJim Jagielski 				(  (nPart==PART_DRAW_BACKGROUND_HORZ)
526*b1cdbd2cSJim Jagielski 				|| (nPart==PART_DRAW_BACKGROUND_VERT)
527*b1cdbd2cSJim Jagielski 				|| (nPart==PART_ENTIRE_CONTROL)
528*b1cdbd2cSJim Jagielski                 || (nPart==HAS_THREE_BUTTONS) )  				)	||
529*b1cdbd2cSJim Jagielski 		((nType==CTRL_EDITBOX) &&
530*b1cdbd2cSJim Jagielski 				(  (nPart==PART_ENTIRE_CONTROL)
531*b1cdbd2cSJim Jagielski 				|| (nPart==HAS_BACKGROUND_TEXTURE) ) 			)	||
532*b1cdbd2cSJim Jagielski 		((nType==CTRL_MULTILINE_EDITBOX) &&
533*b1cdbd2cSJim Jagielski 				(  (nPart==PART_ENTIRE_CONTROL)
534*b1cdbd2cSJim Jagielski 				|| (nPart==HAS_BACKGROUND_TEXTURE) ) 			)	||
535*b1cdbd2cSJim Jagielski 		((nType==CTRL_SPINBOX) &&
536*b1cdbd2cSJim Jagielski 				(  (nPart==PART_ENTIRE_CONTROL)
537*b1cdbd2cSJim Jagielski 				|| (nPart==PART_ALL_BUTTONS)
538*b1cdbd2cSJim Jagielski 				|| (nPart==HAS_BACKGROUND_TEXTURE) )			)	||
539*b1cdbd2cSJim Jagielski 		((nType==CTRL_SPINBUTTONS) &&
540*b1cdbd2cSJim Jagielski 				(  (nPart==PART_ENTIRE_CONTROL)
541*b1cdbd2cSJim Jagielski 				|| (nPart==PART_ALL_BUTTONS)	)				)	||
542*b1cdbd2cSJim Jagielski 		((nType==CTRL_COMBOBOX) &&
543*b1cdbd2cSJim Jagielski 				(  (nPart==PART_ENTIRE_CONTROL)
544*b1cdbd2cSJim Jagielski 				|| (nPart==HAS_BACKGROUND_TEXTURE)	)			)	||
545*b1cdbd2cSJim Jagielski 		(((nType==CTRL_TAB_ITEM) || (nType==CTRL_TAB_PANE) ||
546*b1cdbd2cSJim Jagielski 		  (nType==CTRL_TAB_BODY) || (nType==CTRL_FIXEDBORDER)) &&
547*b1cdbd2cSJim Jagielski 				(  (nPart==PART_ENTIRE_CONTROL)
548*b1cdbd2cSJim Jagielski 				|| (nPart==PART_TABS_DRAW_RTL) )				)	||
549*b1cdbd2cSJim Jagielski 		((nType==CTRL_LISTBOX) &&
550*b1cdbd2cSJim Jagielski 				(  (nPart==PART_ENTIRE_CONTROL)
551*b1cdbd2cSJim Jagielski 				|| (nPart==PART_WINDOW)
552*b1cdbd2cSJim Jagielski 				|| (nPart==HAS_BACKGROUND_TEXTURE) )			)   ||
553*b1cdbd2cSJim Jagielski         ((nType == CTRL_TOOLBAR) &&
554*b1cdbd2cSJim Jagielski          		(	(nPart==PART_ENTIRE_CONTROL)
555*b1cdbd2cSJim Jagielski                 ||  (nPart==PART_DRAW_BACKGROUND_HORZ)
556*b1cdbd2cSJim Jagielski                 ||  (nPart==PART_DRAW_BACKGROUND_VERT)
557*b1cdbd2cSJim Jagielski                 ||  (nPart==PART_THUMB_HORZ)
558*b1cdbd2cSJim Jagielski                 ||  (nPart==PART_THUMB_VERT)
559*b1cdbd2cSJim Jagielski                 ||  (nPart==PART_BUTTON)
560*b1cdbd2cSJim Jagielski                 )
561*b1cdbd2cSJim Jagielski                                                                 )   ||
562*b1cdbd2cSJim Jagielski         ((nType == CTRL_MENUBAR) &&
563*b1cdbd2cSJim Jagielski                 (   (nPart==PART_ENTIRE_CONTROL) )              )   ||
564*b1cdbd2cSJim Jagielski         ((nType == CTRL_TOOLTIP) &&
565*b1cdbd2cSJim Jagielski                 (   (nPart==PART_ENTIRE_CONTROL) )              )   ||
566*b1cdbd2cSJim Jagielski         ((nType == CTRL_MENU_POPUP) &&
567*b1cdbd2cSJim Jagielski                 (   (nPart==PART_ENTIRE_CONTROL)
568*b1cdbd2cSJim Jagielski                 ||  (nPart==PART_MENU_ITEM)
569*b1cdbd2cSJim Jagielski                 ||  (nPart==PART_MENU_ITEM_CHECK_MARK)
570*b1cdbd2cSJim Jagielski                 ||  (nPart==PART_MENU_ITEM_RADIO_MARK)
571*b1cdbd2cSJim Jagielski                 )
572*b1cdbd2cSJim Jagielski                                                                 )   ||
573*b1cdbd2cSJim Jagielski         ((nType == CTRL_PROGRESS) &&
574*b1cdbd2cSJim Jagielski                 (   (nPart == PART_ENTIRE_CONTROL) )
575*b1cdbd2cSJim Jagielski                 )                                                   ||
576*b1cdbd2cSJim Jagielski         ((nType == CTRL_LISTNODE || nType == CTRL_LISTNET) &&
577*b1cdbd2cSJim Jagielski                 (   (nPart == PART_ENTIRE_CONTROL) )
578*b1cdbd2cSJim Jagielski                 )                                                   ||
579*b1cdbd2cSJim Jagielski         ((nType == CTRL_SLIDER) &&
580*b1cdbd2cSJim Jagielski                 (   (nPart == PART_TRACK_HORZ_AREA)
581*b1cdbd2cSJim Jagielski                 ||  (nPart == PART_TRACK_VERT_AREA)
582*b1cdbd2cSJim Jagielski                 )
583*b1cdbd2cSJim Jagielski         )
584*b1cdbd2cSJim Jagielski         )
585*b1cdbd2cSJim Jagielski 		return( sal_True );
586*b1cdbd2cSJim Jagielski 
587*b1cdbd2cSJim Jagielski 	return( sal_False );
588*b1cdbd2cSJim Jagielski }
589*b1cdbd2cSJim Jagielski 
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski /*
592*b1cdbd2cSJim Jagielski  * HitTestNativeControl()
593*b1cdbd2cSJim Jagielski  *
594*b1cdbd2cSJim Jagielski  *  bIsInside is set to sal_True if aPos is contained within the
595*b1cdbd2cSJim Jagielski  *  given part of the control, whose bounding region is
596*b1cdbd2cSJim Jagielski  *  given by rControlRegion (in VCL frame coordinates).
597*b1cdbd2cSJim Jagielski  *
598*b1cdbd2cSJim Jagielski  *  returns whether bIsInside was really set.
599*b1cdbd2cSJim Jagielski  */
hitTestNativeControl(ControlType nType,ControlPart nPart,const Rectangle & rControlRegion,const Point & aPos,sal_Bool & rIsInside)600*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::hitTestNativeControl( ControlType		nType,
601*b1cdbd2cSJim Jagielski 								ControlPart		nPart,
602*b1cdbd2cSJim Jagielski 								const Rectangle&		rControlRegion,
603*b1cdbd2cSJim Jagielski 								const Point&		aPos,
604*b1cdbd2cSJim Jagielski 								sal_Bool&			rIsInside )
605*b1cdbd2cSJim Jagielski {
606*b1cdbd2cSJim Jagielski     if ( ( nType == CTRL_SCROLLBAR ) &&
607*b1cdbd2cSJim Jagielski          ( ( nPart == PART_BUTTON_UP ) ||
608*b1cdbd2cSJim Jagielski            ( nPart == PART_BUTTON_DOWN ) ||
609*b1cdbd2cSJim Jagielski            ( nPart == PART_BUTTON_LEFT ) ||
610*b1cdbd2cSJim Jagielski            ( nPart == PART_BUTTON_RIGHT ) ) )
611*b1cdbd2cSJim Jagielski     {
612*b1cdbd2cSJim Jagielski         NWEnsureGTKScrollbars( m_nScreen );
613*b1cdbd2cSJim Jagielski 
614*b1cdbd2cSJim Jagielski         // Grab some button style attributes
615*b1cdbd2cSJim Jagielski         gboolean has_forward;
616*b1cdbd2cSJim Jagielski         gboolean has_forward2;
617*b1cdbd2cSJim Jagielski         gboolean has_backward;
618*b1cdbd2cSJim Jagielski         gboolean has_backward2;
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski 	    gtk_widget_style_get( gWidgetData[m_nScreen].gScrollHorizWidget, "has-forward-stepper", &has_forward,
621*b1cdbd2cSJim Jagielski 									    "has-secondary-forward-stepper", &has_forward2,
622*b1cdbd2cSJim Jagielski 									    "has-backward-stepper", &has_backward,
623*b1cdbd2cSJim Jagielski 	   								    "has-secondary-backward-stepper", &has_backward2, (char *)NULL );
624*b1cdbd2cSJim Jagielski         Rectangle aForward;
625*b1cdbd2cSJim Jagielski         Rectangle aBackward;
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski         rIsInside = sal_False;
628*b1cdbd2cSJim Jagielski 
629*b1cdbd2cSJim Jagielski         ControlPart nCounterPart = 0;
630*b1cdbd2cSJim Jagielski         if ( nPart == PART_BUTTON_UP )
631*b1cdbd2cSJim Jagielski             nCounterPart = PART_BUTTON_DOWN;
632*b1cdbd2cSJim Jagielski         else if ( nPart == PART_BUTTON_DOWN )
633*b1cdbd2cSJim Jagielski             nCounterPart = PART_BUTTON_UP;
634*b1cdbd2cSJim Jagielski         else if ( nPart == PART_BUTTON_LEFT )
635*b1cdbd2cSJim Jagielski             nCounterPart = PART_BUTTON_RIGHT;
636*b1cdbd2cSJim Jagielski         else if ( nPart == PART_BUTTON_RIGHT )
637*b1cdbd2cSJim Jagielski             nCounterPart = PART_BUTTON_LEFT;
638*b1cdbd2cSJim Jagielski 
639*b1cdbd2cSJim Jagielski         aBackward = NWGetScrollButtonRect( m_nScreen, nPart, rControlRegion );
640*b1cdbd2cSJim Jagielski         aForward = NWGetScrollButtonRect( m_nScreen, nCounterPart, rControlRegion );
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski         if ( has_backward && has_forward2 )
643*b1cdbd2cSJim Jagielski         {
644*b1cdbd2cSJim Jagielski             Size aSize( aBackward.GetSize() );
645*b1cdbd2cSJim Jagielski             if ( ( nPart == PART_BUTTON_UP ) || ( nPart == PART_BUTTON_DOWN ) )
646*b1cdbd2cSJim Jagielski                 aSize.setHeight( aBackward.GetHeight() / 2 );
647*b1cdbd2cSJim Jagielski             else
648*b1cdbd2cSJim Jagielski                 aSize.setWidth( aBackward.GetWidth() / 2 );
649*b1cdbd2cSJim Jagielski             aBackward.SetSize( aSize );
650*b1cdbd2cSJim Jagielski 
651*b1cdbd2cSJim Jagielski             if ( nPart == PART_BUTTON_DOWN )
652*b1cdbd2cSJim Jagielski                 aBackward.Move( 0, aBackward.GetHeight() / 2 );
653*b1cdbd2cSJim Jagielski             else if ( nPart == PART_BUTTON_RIGHT )
654*b1cdbd2cSJim Jagielski                 aBackward.Move( aBackward.GetWidth() / 2, 0 );
655*b1cdbd2cSJim Jagielski         }
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski         if ( has_backward2 && has_forward )
658*b1cdbd2cSJim Jagielski         {
659*b1cdbd2cSJim Jagielski             Size aSize( aForward.GetSize() );
660*b1cdbd2cSJim Jagielski             if ( ( nPart == PART_BUTTON_UP ) || ( nPart == PART_BUTTON_DOWN ) )
661*b1cdbd2cSJim Jagielski                 aSize.setHeight( aForward.GetHeight() / 2 );
662*b1cdbd2cSJim Jagielski             else
663*b1cdbd2cSJim Jagielski                 aSize.setWidth( aForward.GetWidth() / 2 );
664*b1cdbd2cSJim Jagielski             aForward.SetSize( aSize );
665*b1cdbd2cSJim Jagielski 
666*b1cdbd2cSJim Jagielski             if ( nPart == PART_BUTTON_DOWN )
667*b1cdbd2cSJim Jagielski                 aForward.Move( 0, aForward.GetHeight() / 2 );
668*b1cdbd2cSJim Jagielski             else if ( nPart == PART_BUTTON_RIGHT )
669*b1cdbd2cSJim Jagielski                 aForward.Move( aForward.GetWidth() / 2, 0 );
670*b1cdbd2cSJim Jagielski         }
671*b1cdbd2cSJim Jagielski 
672*b1cdbd2cSJim Jagielski         if ( ( nPart == PART_BUTTON_UP ) || ( nPart == PART_BUTTON_LEFT ) )
673*b1cdbd2cSJim Jagielski         {
674*b1cdbd2cSJim Jagielski             if ( has_backward )
675*b1cdbd2cSJim Jagielski                 rIsInside |= aBackward.IsInside( aPos );
676*b1cdbd2cSJim Jagielski             if ( has_backward2 )
677*b1cdbd2cSJim Jagielski                 rIsInside |= aForward.IsInside( aPos );
678*b1cdbd2cSJim Jagielski         }
679*b1cdbd2cSJim Jagielski         else
680*b1cdbd2cSJim Jagielski         {
681*b1cdbd2cSJim Jagielski             if ( has_forward )
682*b1cdbd2cSJim Jagielski                 rIsInside |= aBackward.IsInside( aPos );
683*b1cdbd2cSJim Jagielski             if ( has_forward2 )
684*b1cdbd2cSJim Jagielski                 rIsInside |= aForward.IsInside( aPos );
685*b1cdbd2cSJim Jagielski         }
686*b1cdbd2cSJim Jagielski         return ( sal_True );
687*b1cdbd2cSJim Jagielski     }
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski     if( IsNativeControlSupported(nType, nPart) )
690*b1cdbd2cSJim Jagielski 	{
691*b1cdbd2cSJim Jagielski 		rIsInside = rControlRegion.IsInside( aPos );
692*b1cdbd2cSJim Jagielski 		return( sal_True );
693*b1cdbd2cSJim Jagielski 	}
694*b1cdbd2cSJim Jagielski 	else
695*b1cdbd2cSJim Jagielski 	{
696*b1cdbd2cSJim Jagielski 		return( sal_False );
697*b1cdbd2cSJim Jagielski 	}
698*b1cdbd2cSJim Jagielski }
699*b1cdbd2cSJim Jagielski 
700*b1cdbd2cSJim Jagielski 
701*b1cdbd2cSJim Jagielski /*
702*b1cdbd2cSJim Jagielski  * DrawNativeControl()
703*b1cdbd2cSJim Jagielski  *
704*b1cdbd2cSJim Jagielski  *  Draws the requested control described by nPart/nState.
705*b1cdbd2cSJim Jagielski  *
706*b1cdbd2cSJim Jagielski  *  rControlRegion:	The bounding region of the complete control in VCL frame coordinates.
707*b1cdbd2cSJim Jagielski  *  aValue:  		An optional value (tristate/numerical/string)
708*b1cdbd2cSJim Jagielski  *  rCaption:  	A caption or title string (like button text etc)
709*b1cdbd2cSJim Jagielski  */
drawNativeControl(ControlType nType,ControlPart nPart,const Rectangle & rControlRegion,ControlState nState,const ImplControlValue & aValue,const OUString & rCaption)710*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::drawNativeControl(	ControlType nType,
711*b1cdbd2cSJim Jagielski 							ControlPart nPart,
712*b1cdbd2cSJim Jagielski 							const Rectangle& rControlRegion,
713*b1cdbd2cSJim Jagielski 							ControlState nState,
714*b1cdbd2cSJim Jagielski 							const ImplControlValue& aValue,
715*b1cdbd2cSJim Jagielski 							const OUString& rCaption )
716*b1cdbd2cSJim Jagielski {
717*b1cdbd2cSJim Jagielski 	sal_Bool			returnVal = sal_False;
718*b1cdbd2cSJim Jagielski 	// get a GC with current clipping region set
719*b1cdbd2cSJim Jagielski     GetFontGC();
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski 
722*b1cdbd2cSJim Jagielski     // theme changed ?
723*b1cdbd2cSJim Jagielski     if( GtkSalGraphics::bThemeChanged )
724*b1cdbd2cSJim Jagielski     {
725*b1cdbd2cSJim Jagielski         // invalidate caches
726*b1cdbd2cSJim Jagielski         for( unsigned int i = 0; i < gWidgetData.size(); i++ )
727*b1cdbd2cSJim Jagielski             if( gWidgetData[i].gNWPixmapCacheList )
728*b1cdbd2cSJim Jagielski                 gWidgetData[i].gNWPixmapCacheList->ThemeChanged();
729*b1cdbd2cSJim Jagielski         GtkSalGraphics::bThemeChanged = sal_False;
730*b1cdbd2cSJim Jagielski     }
731*b1cdbd2cSJim Jagielski 
732*b1cdbd2cSJim Jagielski     Rectangle aCtrlRect( rControlRegion );
733*b1cdbd2cSJim Jagielski     Region aClipRegion( m_aClipRegion );
734*b1cdbd2cSJim Jagielski     if( aClipRegion.IsNull() )
735*b1cdbd2cSJim Jagielski         aClipRegion = aCtrlRect;
736*b1cdbd2cSJim Jagielski 
737*b1cdbd2cSJim Jagielski     clipList aClip;
738*b1cdbd2cSJim Jagielski     GdkDrawable* gdkDrawable = GDK_DRAWABLE( GetGdkWindow() );
739*b1cdbd2cSJim Jagielski     GdkPixmap* pixmap = NULL;
740*b1cdbd2cSJim Jagielski     Rectangle aPixmapRect;
741*b1cdbd2cSJim Jagielski     if( ( bNeedPixmapPaint )
742*b1cdbd2cSJim Jagielski         && nType != CTRL_SCROLLBAR
743*b1cdbd2cSJim Jagielski         && nType != CTRL_SPINBOX
744*b1cdbd2cSJim Jagielski         && nType != CTRL_TAB_ITEM
745*b1cdbd2cSJim Jagielski         && nType != CTRL_TAB_PANE
746*b1cdbd2cSJim Jagielski         && nType != CTRL_PROGRESS
747*b1cdbd2cSJim Jagielski         && ! (bToolbarGripWorkaround && nType == CTRL_TOOLBAR && (nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT) )
748*b1cdbd2cSJim Jagielski         )
749*b1cdbd2cSJim Jagielski     {
750*b1cdbd2cSJim Jagielski         // make pixmap a little larger since some themes draw decoration
751*b1cdbd2cSJim Jagielski         // outside the rectangle, see e.g. checkbox
752*b1cdbd2cSJim Jagielski         aPixmapRect = Rectangle( Point( aCtrlRect.Left()-1, aCtrlRect.Top()-1 ),
753*b1cdbd2cSJim Jagielski                                  Size( aCtrlRect.GetWidth()+2, aCtrlRect.GetHeight()+2) );
754*b1cdbd2cSJim Jagielski         pixmap = NWGetPixmapFromScreen( aPixmapRect );
755*b1cdbd2cSJim Jagielski         if( ! pixmap )
756*b1cdbd2cSJim Jagielski             return sal_False;
757*b1cdbd2cSJim Jagielski         gdkDrawable = GDK_DRAWABLE( pixmap );
758*b1cdbd2cSJim Jagielski         aCtrlRect = Rectangle( Point(1,1), aCtrlRect.GetSize() );
759*b1cdbd2cSJim Jagielski         aClip.push_back( aCtrlRect );
760*b1cdbd2cSJim Jagielski     }
761*b1cdbd2cSJim Jagielski     else
762*b1cdbd2cSJim Jagielski     {
763*b1cdbd2cSJim Jagielski         RectangleVector aRectangles;
764*b1cdbd2cSJim Jagielski         aClipRegion.GetRegionRectangles(aRectangles);
765*b1cdbd2cSJim Jagielski 
766*b1cdbd2cSJim Jagielski         for(RectangleVector::const_iterator aRectIter(aRectangles.begin()); aRectIter != aRectangles.end(); aRectIter++)
767*b1cdbd2cSJim Jagielski         {
768*b1cdbd2cSJim Jagielski             if(aRectIter->IsEmpty())
769*b1cdbd2cSJim Jagielski             {
770*b1cdbd2cSJim Jagielski                 continue;
771*b1cdbd2cSJim Jagielski             }
772*b1cdbd2cSJim Jagielski 
773*b1cdbd2cSJim Jagielski             aClip.push_back(*aRectIter);
774*b1cdbd2cSJim Jagielski         }
775*b1cdbd2cSJim Jagielski 
776*b1cdbd2cSJim Jagielski         //RegionHandle aHdl = aClipRegion.BeginEnumRects();
777*b1cdbd2cSJim Jagielski         //Rectangle aPaintRect;
778*b1cdbd2cSJim Jagielski         //while( aClipRegion.GetEnumRects( aHdl, aPaintRect ) )
779*b1cdbd2cSJim Jagielski         //{
780*b1cdbd2cSJim Jagielski         //    aPaintRect = aCtrlRect.GetIntersection( aPaintRect );
781*b1cdbd2cSJim Jagielski         //    if( aPaintRect.IsEmpty() )
782*b1cdbd2cSJim Jagielski         //        continue;
783*b1cdbd2cSJim Jagielski         //    aClip.push_back( aPaintRect );
784*b1cdbd2cSJim Jagielski         //}
785*b1cdbd2cSJim Jagielski         //aClipRegion.EndEnumRects( aHdl );
786*b1cdbd2cSJim Jagielski     }
787*b1cdbd2cSJim Jagielski 
788*b1cdbd2cSJim Jagielski     if ( (nType==CTRL_PUSHBUTTON) && (nPart==PART_ENTIRE_CONTROL) )
789*b1cdbd2cSJim Jagielski     {
790*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKButton( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
791*b1cdbd2cSJim Jagielski     }
792*b1cdbd2cSJim Jagielski     else if ( (nType==CTRL_RADIOBUTTON) && (nPart==PART_ENTIRE_CONTROL) )
793*b1cdbd2cSJim Jagielski     {
794*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKRadio( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
795*b1cdbd2cSJim Jagielski     }
796*b1cdbd2cSJim Jagielski     else if ( (nType==CTRL_CHECKBOX) && (nPart==PART_ENTIRE_CONTROL) )
797*b1cdbd2cSJim Jagielski     {
798*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKCheck( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
799*b1cdbd2cSJim Jagielski     }
800*b1cdbd2cSJim Jagielski     else if ( (nType==CTRL_SCROLLBAR) && ((nPart==PART_DRAW_BACKGROUND_HORZ) || (nPart==PART_DRAW_BACKGROUND_VERT)) )
801*b1cdbd2cSJim Jagielski     {
802*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKScrollbar( nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
803*b1cdbd2cSJim Jagielski     }
804*b1cdbd2cSJim Jagielski     else if ( ((nType==CTRL_EDITBOX) && ((nPart==PART_ENTIRE_CONTROL) || (nPart==HAS_BACKGROUND_TEXTURE)) )
805*b1cdbd2cSJim Jagielski         || ((nType==CTRL_SPINBOX) && (nPart==HAS_BACKGROUND_TEXTURE))
806*b1cdbd2cSJim Jagielski     || ((nType==CTRL_COMBOBOX) && (nPart==HAS_BACKGROUND_TEXTURE))
807*b1cdbd2cSJim Jagielski     || ((nType==CTRL_LISTBOX) && (nPart==HAS_BACKGROUND_TEXTURE)) )
808*b1cdbd2cSJim Jagielski     {
809*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKEditBox( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
810*b1cdbd2cSJim Jagielski     }
811*b1cdbd2cSJim Jagielski     else if ( ((nType==CTRL_MULTILINE_EDITBOX) && ((nPart==PART_ENTIRE_CONTROL) || (nPart==HAS_BACKGROUND_TEXTURE)) ) )
812*b1cdbd2cSJim Jagielski     {
813*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKEditBox( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
814*b1cdbd2cSJim Jagielski     }
815*b1cdbd2cSJim Jagielski     else if ( ((nType==CTRL_SPINBOX) || (nType==CTRL_SPINBUTTONS))
816*b1cdbd2cSJim Jagielski         && ((nPart==PART_ENTIRE_CONTROL) || (nPart==PART_ALL_BUTTONS)) )
817*b1cdbd2cSJim Jagielski     {
818*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKSpinBox( nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
819*b1cdbd2cSJim Jagielski     }
820*b1cdbd2cSJim Jagielski     else if ( (nType == CTRL_COMBOBOX) &&
821*b1cdbd2cSJim Jagielski         ( (nPart==PART_ENTIRE_CONTROL)
822*b1cdbd2cSJim Jagielski         ||(nPart==PART_BUTTON_DOWN)
823*b1cdbd2cSJim Jagielski         ) )
824*b1cdbd2cSJim Jagielski     {
825*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKComboBox( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
826*b1cdbd2cSJim Jagielski     }
827*b1cdbd2cSJim Jagielski     else if ( (nType==CTRL_TAB_ITEM) || (nType==CTRL_TAB_PANE) || (nType==CTRL_TAB_BODY) || (nType==CTRL_FIXEDBORDER) )
828*b1cdbd2cSJim Jagielski     {
829*b1cdbd2cSJim Jagielski         if ( nType == CTRL_TAB_BODY )
830*b1cdbd2cSJim Jagielski             returnVal = sal_True;
831*b1cdbd2cSJim Jagielski         else
832*b1cdbd2cSJim Jagielski             returnVal = NWPaintGTKTabItem( nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption);
833*b1cdbd2cSJim Jagielski     }
834*b1cdbd2cSJim Jagielski     else if ( (nType==CTRL_LISTBOX) && ((nPart==PART_ENTIRE_CONTROL) || (nPart==PART_WINDOW)) )
835*b1cdbd2cSJim Jagielski     {
836*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKListBox( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
837*b1cdbd2cSJim Jagielski     }
838*b1cdbd2cSJim Jagielski     else if ( (nType== CTRL_TOOLBAR) )
839*b1cdbd2cSJim Jagielski     {
840*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKToolbar( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
841*b1cdbd2cSJim Jagielski     }
842*b1cdbd2cSJim Jagielski     else if ( (nType== CTRL_MENUBAR) )
843*b1cdbd2cSJim Jagielski     {
844*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKMenubar( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
845*b1cdbd2cSJim Jagielski     }
846*b1cdbd2cSJim Jagielski     else if(    (nType == CTRL_MENU_POPUP)
847*b1cdbd2cSJim Jagielski         && (  (nPart == PART_ENTIRE_CONTROL)
848*b1cdbd2cSJim Jagielski     || (nPart == PART_MENU_ITEM)
849*b1cdbd2cSJim Jagielski     || (nPart == PART_MENU_ITEM_CHECK_MARK)
850*b1cdbd2cSJim Jagielski     || (nPart == PART_MENU_ITEM_RADIO_MARK)
851*b1cdbd2cSJim Jagielski     )
852*b1cdbd2cSJim Jagielski     )
853*b1cdbd2cSJim Jagielski     {
854*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKPopupMenu( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
855*b1cdbd2cSJim Jagielski     }
856*b1cdbd2cSJim Jagielski     else if( (nType == CTRL_TOOLTIP) && (nPart == PART_ENTIRE_CONTROL) )
857*b1cdbd2cSJim Jagielski     {
858*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKTooltip( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
859*b1cdbd2cSJim Jagielski     }
860*b1cdbd2cSJim Jagielski     else if( (nType == CTRL_PROGRESS) && (nPart == PART_ENTIRE_CONTROL) )
861*b1cdbd2cSJim Jagielski     {
862*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKProgress( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
863*b1cdbd2cSJim Jagielski     }
864*b1cdbd2cSJim Jagielski     else if( (nType == CTRL_LISTNODE) && (nPart == PART_ENTIRE_CONTROL) )
865*b1cdbd2cSJim Jagielski     {
866*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKListNode( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
867*b1cdbd2cSJim Jagielski     }
868*b1cdbd2cSJim Jagielski     else if( (nType == CTRL_LISTNET) && (nPart == PART_ENTIRE_CONTROL) )
869*b1cdbd2cSJim Jagielski     {
870*b1cdbd2cSJim Jagielski         // don't actually draw anything; gtk treeviews do not draw lines
871*b1cdbd2cSJim Jagielski         returnVal = true;
872*b1cdbd2cSJim Jagielski     }
873*b1cdbd2cSJim Jagielski     else if( (nType == CTRL_SLIDER) )
874*b1cdbd2cSJim Jagielski     {
875*b1cdbd2cSJim Jagielski         returnVal = NWPaintGTKSlider( gdkDrawable, nType, nPart, aCtrlRect, aClip, nState, aValue, rCaption );
876*b1cdbd2cSJim Jagielski     }
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski     if( pixmap )
879*b1cdbd2cSJim Jagielski     {
880*b1cdbd2cSJim Jagielski         returnVal = NWRenderPixmapToScreen( pixmap, aPixmapRect ) && returnVal;
881*b1cdbd2cSJim Jagielski         g_object_unref( pixmap );
882*b1cdbd2cSJim Jagielski     }
883*b1cdbd2cSJim Jagielski 
884*b1cdbd2cSJim Jagielski 	return( returnVal );
885*b1cdbd2cSJim Jagielski }
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski /*
888*b1cdbd2cSJim Jagielski  * DrawNativeControlText()
889*b1cdbd2cSJim Jagielski  *
890*b1cdbd2cSJim Jagielski  *  OPTIONAL.  Draws the requested text for the control described by nPart/nState.
891*b1cdbd2cSJim Jagielski  *     Used if text not drawn by DrawNativeControl().
892*b1cdbd2cSJim Jagielski  *
893*b1cdbd2cSJim Jagielski  *  rControlRegion:	The bounding region of the complete control in VCL frame coordinates.
894*b1cdbd2cSJim Jagielski  *  aValue:  		An optional value (tristate/numerical/string)
895*b1cdbd2cSJim Jagielski  *  rCaption:  	A caption or title string (like button text etc)
896*b1cdbd2cSJim Jagielski  */
drawNativeControlText(ControlType,ControlPart,const Rectangle &,ControlState,const ImplControlValue &,const OUString &)897*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::drawNativeControlText(	ControlType,
898*b1cdbd2cSJim Jagielski 								ControlPart,
899*b1cdbd2cSJim Jagielski 								const Rectangle&,
900*b1cdbd2cSJim Jagielski 								ControlState,
901*b1cdbd2cSJim Jagielski 								const ImplControlValue&,
902*b1cdbd2cSJim Jagielski 								const OUString& )
903*b1cdbd2cSJim Jagielski {
904*b1cdbd2cSJim Jagielski 	return( sal_False );
905*b1cdbd2cSJim Jagielski }
906*b1cdbd2cSJim Jagielski 
907*b1cdbd2cSJim Jagielski 
908*b1cdbd2cSJim Jagielski /*
909*b1cdbd2cSJim Jagielski  * GetNativeControlRegion()
910*b1cdbd2cSJim Jagielski  *
911*b1cdbd2cSJim Jagielski  *  If the return value is sal_True, rNativeBoundingRegion
912*b1cdbd2cSJim Jagielski  *  contains the true bounding region covered by the control
913*b1cdbd2cSJim Jagielski  *  including any adornment, while rNativeContentRegion contains the area
914*b1cdbd2cSJim Jagielski  *  within the control that can be safely drawn into without drawing over
915*b1cdbd2cSJim Jagielski  *  the borders of the control.
916*b1cdbd2cSJim Jagielski  *
917*b1cdbd2cSJim Jagielski  *  rControlRegion:	The bounding region of the control in VCL frame coordinates.
918*b1cdbd2cSJim Jagielski  *  aValue:		An optional value (tristate/numerical/string)
919*b1cdbd2cSJim Jagielski  *  rCaption:		A caption or title string (like button text etc)
920*b1cdbd2cSJim Jagielski  */
getNativeControlRegion(ControlType nType,ControlPart nPart,const Rectangle & rControlRegion,ControlState nState,const ImplControlValue & aValue,const OUString & rCaption,Rectangle & rNativeBoundingRegion,Rectangle & rNativeContentRegion)921*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::getNativeControlRegion(  ControlType nType,
922*b1cdbd2cSJim Jagielski 								ControlPart nPart,
923*b1cdbd2cSJim Jagielski 								const Rectangle& rControlRegion,
924*b1cdbd2cSJim Jagielski 								ControlState nState,
925*b1cdbd2cSJim Jagielski 								const ImplControlValue& aValue,
926*b1cdbd2cSJim Jagielski 								const OUString& rCaption,
927*b1cdbd2cSJim Jagielski 								Rectangle &rNativeBoundingRegion,
928*b1cdbd2cSJim Jagielski 								Rectangle &rNativeContentRegion )
929*b1cdbd2cSJim Jagielski {
930*b1cdbd2cSJim Jagielski 	sal_Bool returnVal = sal_False;
931*b1cdbd2cSJim Jagielski 
932*b1cdbd2cSJim Jagielski     if ( (nType==CTRL_PUSHBUTTON) && (nPart==PART_ENTIRE_CONTROL)
933*b1cdbd2cSJim Jagielski         && (rControlRegion.GetWidth() > 16)
934*b1cdbd2cSJim Jagielski     && (rControlRegion.GetHeight() > 16) )
935*b1cdbd2cSJim Jagielski     {
936*b1cdbd2cSJim Jagielski         rNativeBoundingRegion = NWGetButtonArea( m_nScreen, nType, nPart, rControlRegion,
937*b1cdbd2cSJim Jagielski         nState, aValue, rCaption );
938*b1cdbd2cSJim Jagielski         rNativeContentRegion = rControlRegion;
939*b1cdbd2cSJim Jagielski 
940*b1cdbd2cSJim Jagielski         returnVal = sal_True;
941*b1cdbd2cSJim Jagielski     }
942*b1cdbd2cSJim Jagielski     if ( (nType==CTRL_COMBOBOX) && ((nPart==PART_BUTTON_DOWN) || (nPart==PART_SUB_EDIT)) )
943*b1cdbd2cSJim Jagielski     {
944*b1cdbd2cSJim Jagielski         rNativeBoundingRegion = NWGetComboBoxButtonRect( m_nScreen, nType, nPart, rControlRegion, nState,
945*b1cdbd2cSJim Jagielski         aValue, rCaption );
946*b1cdbd2cSJim Jagielski         rNativeContentRegion = rNativeBoundingRegion;
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski         returnVal = sal_True;
949*b1cdbd2cSJim Jagielski     }
950*b1cdbd2cSJim Jagielski     if ( (nType==CTRL_SPINBOX) && ((nPart==PART_BUTTON_UP) || (nPart==PART_BUTTON_DOWN) || (nPart==PART_SUB_EDIT)) )
951*b1cdbd2cSJim Jagielski     {
952*b1cdbd2cSJim Jagielski 
953*b1cdbd2cSJim Jagielski         rNativeBoundingRegion = NWGetSpinButtonRect( m_nScreen, nType, nPart, rControlRegion, nState,
954*b1cdbd2cSJim Jagielski         aValue, rCaption );
955*b1cdbd2cSJim Jagielski         rNativeContentRegion = rNativeBoundingRegion;
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski         returnVal = sal_True;
958*b1cdbd2cSJim Jagielski     }
959*b1cdbd2cSJim Jagielski     if ( (nType==CTRL_LISTBOX) && ((nPart==PART_BUTTON_DOWN) || (nPart==PART_SUB_EDIT)) )
960*b1cdbd2cSJim Jagielski     {
961*b1cdbd2cSJim Jagielski         rNativeBoundingRegion = NWGetListBoxButtonRect( m_nScreen, nType, nPart, rControlRegion, nState,
962*b1cdbd2cSJim Jagielski         aValue, rCaption );
963*b1cdbd2cSJim Jagielski         rNativeContentRegion = rNativeBoundingRegion;
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski         returnVal = sal_True;
966*b1cdbd2cSJim Jagielski     }
967*b1cdbd2cSJim Jagielski     if ( (nType==CTRL_TOOLBAR) &&
968*b1cdbd2cSJim Jagielski         ((nPart==PART_DRAW_BACKGROUND_HORZ)	||
969*b1cdbd2cSJim Jagielski         (nPart==PART_DRAW_BACKGROUND_VERT)	||
970*b1cdbd2cSJim Jagielski         (nPart==PART_THUMB_HORZ)			||
971*b1cdbd2cSJim Jagielski         (nPart==PART_THUMB_VERT)            ||
972*b1cdbd2cSJim Jagielski         (nPart==PART_BUTTON)
973*b1cdbd2cSJim Jagielski         ))
974*b1cdbd2cSJim Jagielski     {
975*b1cdbd2cSJim Jagielski         rNativeBoundingRegion = NWGetToolbarRect( m_nScreen, nType, nPart, rControlRegion, nState, aValue, rCaption );
976*b1cdbd2cSJim Jagielski         rNativeContentRegion = rNativeBoundingRegion;
977*b1cdbd2cSJim Jagielski         returnVal = sal_True;
978*b1cdbd2cSJim Jagielski     }
979*b1cdbd2cSJim Jagielski     if ( (nType==CTRL_SCROLLBAR) && ((nPart==PART_BUTTON_LEFT) || (nPart==PART_BUTTON_RIGHT) ||
980*b1cdbd2cSJim Jagielski         (nPart==PART_BUTTON_UP) || (nPart==PART_BUTTON_DOWN)  ) )
981*b1cdbd2cSJim Jagielski     {
982*b1cdbd2cSJim Jagielski         rNativeBoundingRegion = NWGetScrollButtonRect( m_nScreen, nPart, rControlRegion );
983*b1cdbd2cSJim Jagielski         rNativeContentRegion = rNativeBoundingRegion;
984*b1cdbd2cSJim Jagielski 
985*b1cdbd2cSJim Jagielski         if (rNativeBoundingRegion.GetWidth()>0 && rNativeBoundingRegion.GetHeight()>0)
986*b1cdbd2cSJim Jagielski             returnVal = sal_True;
987*b1cdbd2cSJim Jagielski         else
988*b1cdbd2cSJim Jagielski             returnVal = sal_False;
989*b1cdbd2cSJim Jagielski     }
990*b1cdbd2cSJim Jagielski     if( (nType == CTRL_MENUBAR) && (nPart == PART_ENTIRE_CONTROL) )
991*b1cdbd2cSJim Jagielski     {
992*b1cdbd2cSJim Jagielski         NWEnsureGTKMenubar( m_nScreen );
993*b1cdbd2cSJim Jagielski         GtkRequisition aReq;
994*b1cdbd2cSJim Jagielski         gtk_widget_size_request( gWidgetData[m_nScreen].gMenubarWidget, &aReq );
995*b1cdbd2cSJim Jagielski         Rectangle aMenuBarRect = rControlRegion;
996*b1cdbd2cSJim Jagielski         aMenuBarRect = Rectangle( aMenuBarRect.TopLeft(),
997*b1cdbd2cSJim Jagielski                                   Size( aMenuBarRect.GetWidth(), aReq.height+1 ) );
998*b1cdbd2cSJim Jagielski         rNativeBoundingRegion = aMenuBarRect;
999*b1cdbd2cSJim Jagielski         rNativeContentRegion = rNativeBoundingRegion;
1000*b1cdbd2cSJim Jagielski         returnVal = sal_True;
1001*b1cdbd2cSJim Jagielski     }
1002*b1cdbd2cSJim Jagielski     if( (nType == CTRL_MENU_POPUP) )
1003*b1cdbd2cSJim Jagielski     {
1004*b1cdbd2cSJim Jagielski         if( (nPart == PART_MENU_ITEM_CHECK_MARK) ||
1005*b1cdbd2cSJim Jagielski             (nPart == PART_MENU_ITEM_RADIO_MARK) )
1006*b1cdbd2cSJim Jagielski         {
1007*b1cdbd2cSJim Jagielski             NWEnsureGTKMenu( m_nScreen );
1008*b1cdbd2cSJim Jagielski 
1009*b1cdbd2cSJim Jagielski             gint indicator_size = 0;
1010*b1cdbd2cSJim Jagielski             GtkWidget* pWidget = (nPart == PART_MENU_ITEM_CHECK_MARK) ?
1011*b1cdbd2cSJim Jagielski                                  gWidgetData[m_nScreen].gMenuItemCheckMenuWidget : gWidgetData[m_nScreen].gMenuItemRadioMenuWidget;
1012*b1cdbd2cSJim Jagielski             gtk_widget_style_get( pWidget,
1013*b1cdbd2cSJim Jagielski                                   "indicator_size", &indicator_size,
1014*b1cdbd2cSJim Jagielski                                   (char *)NULL );
1015*b1cdbd2cSJim Jagielski             rNativeBoundingRegion = rControlRegion;
1016*b1cdbd2cSJim Jagielski             Rectangle aIndicatorRect( Point( 0,
1017*b1cdbd2cSJim Jagielski                                              (rControlRegion.GetHeight()-indicator_size)/2),
1018*b1cdbd2cSJim Jagielski                                       Size( indicator_size, indicator_size ) );
1019*b1cdbd2cSJim Jagielski             rNativeContentRegion = aIndicatorRect;
1020*b1cdbd2cSJim Jagielski             returnVal = sal_True;
1021*b1cdbd2cSJim Jagielski         }
1022*b1cdbd2cSJim Jagielski     }
1023*b1cdbd2cSJim Jagielski     if( (nType == CTRL_RADIOBUTTON || nType == CTRL_CHECKBOX) )
1024*b1cdbd2cSJim Jagielski     {
1025*b1cdbd2cSJim Jagielski         NWEnsureGTKRadio( m_nScreen );
1026*b1cdbd2cSJim Jagielski         NWEnsureGTKCheck( m_nScreen );
1027*b1cdbd2cSJim Jagielski         GtkWidget* widget = (nType == CTRL_RADIOBUTTON) ? gWidgetData[m_nScreen].gRadioWidget : gWidgetData[m_nScreen].gCheckWidget;
1028*b1cdbd2cSJim Jagielski         gint indicator_size, indicator_spacing;
1029*b1cdbd2cSJim Jagielski         gtk_widget_style_get( widget,
1030*b1cdbd2cSJim Jagielski                               "indicator_size", &indicator_size,
1031*b1cdbd2cSJim Jagielski                               "indicator_spacing", &indicator_spacing,
1032*b1cdbd2cSJim Jagielski                               (char *)NULL);
1033*b1cdbd2cSJim Jagielski         indicator_size += 2*indicator_spacing; // guess overpaint of theme
1034*b1cdbd2cSJim Jagielski         rNativeBoundingRegion = rControlRegion;
1035*b1cdbd2cSJim Jagielski         Rectangle aIndicatorRect( Point( 0,
1036*b1cdbd2cSJim Jagielski                                          (rControlRegion.GetHeight()-indicator_size)/2),
1037*b1cdbd2cSJim Jagielski                                   Size( indicator_size, indicator_size ) );
1038*b1cdbd2cSJim Jagielski         rNativeContentRegion = aIndicatorRect;
1039*b1cdbd2cSJim Jagielski         returnVal = sal_True;
1040*b1cdbd2cSJim Jagielski     }
1041*b1cdbd2cSJim Jagielski     if( (nType == CTRL_EDITBOX || nType == CTRL_SPINBOX) && nPart == PART_ENTIRE_CONTROL )
1042*b1cdbd2cSJim Jagielski     {
1043*b1cdbd2cSJim Jagielski         NWEnsureGTKEditBox( m_nScreen );
1044*b1cdbd2cSJim Jagielski         GtkWidget* widget = gWidgetData[m_nScreen].gEditBoxWidget;
1045*b1cdbd2cSJim Jagielski         GtkRequisition aReq;
1046*b1cdbd2cSJim Jagielski         gtk_widget_size_request( widget, &aReq );
1047*b1cdbd2cSJim Jagielski         Rectangle aEditRect = rControlRegion;
1048*b1cdbd2cSJim Jagielski         long nHeight = (aEditRect.GetHeight() > aReq.height+1) ? aEditRect.GetHeight() : aReq.height+1;
1049*b1cdbd2cSJim Jagielski         aEditRect = Rectangle( aEditRect.TopLeft(),
1050*b1cdbd2cSJim Jagielski                                Size( aEditRect.GetWidth(), nHeight ) );
1051*b1cdbd2cSJim Jagielski         rNativeBoundingRegion = aEditRect;
1052*b1cdbd2cSJim Jagielski         rNativeContentRegion = rNativeBoundingRegion;
1053*b1cdbd2cSJim Jagielski         returnVal = sal_True;
1054*b1cdbd2cSJim Jagielski     }
1055*b1cdbd2cSJim Jagielski     if( (nType == CTRL_SLIDER) && (nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT) )
1056*b1cdbd2cSJim Jagielski     {
1057*b1cdbd2cSJim Jagielski         NWEnsureGTKSlider( m_nScreen );
1058*b1cdbd2cSJim Jagielski         GtkWidget* widget = (nPart == PART_THUMB_HORZ) ? gWidgetData[m_nScreen].gHScale : gWidgetData[m_nScreen].gVScale;
1059*b1cdbd2cSJim Jagielski         gint slider_length = 10;
1060*b1cdbd2cSJim Jagielski         gint slider_width = 10;
1061*b1cdbd2cSJim Jagielski         gtk_widget_style_get( widget,
1062*b1cdbd2cSJim Jagielski                               "slider-width", &slider_width,
1063*b1cdbd2cSJim Jagielski                               "slider-length", &slider_length,
1064*b1cdbd2cSJim Jagielski                               (char *)NULL);
1065*b1cdbd2cSJim Jagielski         Rectangle aRect( rControlRegion );
1066*b1cdbd2cSJim Jagielski         if( nPart == PART_THUMB_HORZ )
1067*b1cdbd2cSJim Jagielski         {
1068*b1cdbd2cSJim Jagielski             aRect.Right() = aRect.Left() + slider_length - 1;
1069*b1cdbd2cSJim Jagielski             aRect.Bottom() = aRect.Top() + slider_width - 1;
1070*b1cdbd2cSJim Jagielski         }
1071*b1cdbd2cSJim Jagielski         else
1072*b1cdbd2cSJim Jagielski         {
1073*b1cdbd2cSJim Jagielski             aRect.Bottom() = aRect.Top() + slider_length - 1;
1074*b1cdbd2cSJim Jagielski             aRect.Right() = aRect.Left() + slider_width - 1;
1075*b1cdbd2cSJim Jagielski         }
1076*b1cdbd2cSJim Jagielski         rNativeBoundingRegion = rNativeContentRegion = aRect;
1077*b1cdbd2cSJim Jagielski         returnVal = sal_True;
1078*b1cdbd2cSJim Jagielski     }
1079*b1cdbd2cSJim Jagielski 
1080*b1cdbd2cSJim Jagielski 	return( returnVal );
1081*b1cdbd2cSJim Jagielski }
1082*b1cdbd2cSJim Jagielski 
1083*b1cdbd2cSJim Jagielski 
1084*b1cdbd2cSJim Jagielski /************************************************************************
1085*b1cdbd2cSJim Jagielski  * Individual control drawing functions
1086*b1cdbd2cSJim Jagielski  ************************************************************************/
NWPaintGTKButton(GdkDrawable * gdkDrawable,ControlType,ControlPart,const Rectangle & rControlRectangle,const clipList & rClipList,ControlState nState,const ImplControlValue &,const OUString &)1087*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKButton(
1088*b1cdbd2cSJim Jagielski             GdkDrawable* gdkDrawable,
1089*b1cdbd2cSJim Jagielski             ControlType, ControlPart,
1090*b1cdbd2cSJim Jagielski 			const Rectangle& rControlRectangle,
1091*b1cdbd2cSJim Jagielski             const clipList& rClipList,
1092*b1cdbd2cSJim Jagielski             ControlState nState, const ImplControlValue&,
1093*b1cdbd2cSJim Jagielski 			const OUString& )
1094*b1cdbd2cSJim Jagielski {
1095*b1cdbd2cSJim Jagielski 	GtkStateType	stateType;
1096*b1cdbd2cSJim Jagielski 	GtkShadowType	shadowType;
1097*b1cdbd2cSJim Jagielski 	gboolean		interiorFocus;
1098*b1cdbd2cSJim Jagielski 	gint			focusWidth;
1099*b1cdbd2cSJim Jagielski 	gint			focusPad;
1100*b1cdbd2cSJim Jagielski 	sal_Bool			bDrawFocus = sal_True;
1101*b1cdbd2cSJim Jagielski 	gint			x, y, w, h;
1102*b1cdbd2cSJim Jagielski 	GtkBorder		aDefBorder;
1103*b1cdbd2cSJim Jagielski 	GtkBorder*		pBorder;
1104*b1cdbd2cSJim Jagielski     GdkRectangle	clipRect;
1105*b1cdbd2cSJim Jagielski 
1106*b1cdbd2cSJim Jagielski 	NWEnsureGTKButton( m_nScreen );
1107*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
1108*b1cdbd2cSJim Jagielski 
1109*b1cdbd2cSJim Jagielski 	x = rControlRectangle.Left();
1110*b1cdbd2cSJim Jagielski     y = rControlRectangle.Top();
1111*b1cdbd2cSJim Jagielski 	w = rControlRectangle.GetWidth();
1112*b1cdbd2cSJim Jagielski 	h = rControlRectangle.GetHeight();
1113*b1cdbd2cSJim Jagielski 
1114*b1cdbd2cSJim Jagielski 	// Grab some button style attributes
1115*b1cdbd2cSJim Jagielski 	gtk_widget_style_get( gWidgetData[m_nScreen].gBtnWidget,	"focus-line-width",	&focusWidth,
1116*b1cdbd2cSJim Jagielski 								"focus-padding", 	&focusPad,
1117*b1cdbd2cSJim Jagielski 					 			"interior_focus",	&interiorFocus,
1118*b1cdbd2cSJim Jagielski 								"default_border",	&pBorder,
1119*b1cdbd2cSJim Jagielski 								(char *)NULL );
1120*b1cdbd2cSJim Jagielski 
1121*b1cdbd2cSJim Jagielski 	// Make sure the border values exist, otherwise use some defaults
1122*b1cdbd2cSJim Jagielski 	if ( pBorder )
1123*b1cdbd2cSJim Jagielski 	{
1124*b1cdbd2cSJim Jagielski 		NW_gtk_border_set_from_border( aDefBorder, pBorder );
1125*b1cdbd2cSJim Jagielski 		gtk_border_free( pBorder );
1126*b1cdbd2cSJim Jagielski 	}
1127*b1cdbd2cSJim Jagielski 	else NW_gtk_border_set_from_border( aDefBorder, &aDefDefBorder );
1128*b1cdbd2cSJim Jagielski 
1129*b1cdbd2cSJim Jagielski 	// If the button is too small, don't ever draw focus or grab more space
1130*b1cdbd2cSJim Jagielski 	if ( (w < 16) || (h < 16) )
1131*b1cdbd2cSJim Jagielski 		bDrawFocus = sal_False;
1132*b1cdbd2cSJim Jagielski 
1133*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[m_nScreen].gBtnWidget, nState, stateType );
1134*b1cdbd2cSJim Jagielski 
1135*b1cdbd2cSJim Jagielski     gint xi = x, yi = y, wi = w, hi = h;
1136*b1cdbd2cSJim Jagielski 	if ( (nState & CTRL_STATE_DEFAULT) && bDrawFocus )
1137*b1cdbd2cSJim Jagielski 	{
1138*b1cdbd2cSJim Jagielski 		xi += aDefBorder.left;
1139*b1cdbd2cSJim Jagielski 		yi += aDefBorder.top;
1140*b1cdbd2cSJim Jagielski 		wi -= aDefBorder.left + aDefBorder.right;
1141*b1cdbd2cSJim Jagielski 		hi -= aDefBorder.top + aDefBorder.bottom;
1142*b1cdbd2cSJim Jagielski 	}
1143*b1cdbd2cSJim Jagielski 
1144*b1cdbd2cSJim Jagielski 	if ( !interiorFocus && bDrawFocus )
1145*b1cdbd2cSJim Jagielski 	{
1146*b1cdbd2cSJim Jagielski 		xi += focusWidth + focusPad;
1147*b1cdbd2cSJim Jagielski 		yi += focusWidth + focusPad;
1148*b1cdbd2cSJim Jagielski 		wi -= 2 * (focusWidth + focusPad);
1149*b1cdbd2cSJim Jagielski 		hi -= 2 * (focusWidth + focusPad);
1150*b1cdbd2cSJim Jagielski 	}
1151*b1cdbd2cSJim Jagielski 
1152*b1cdbd2cSJim Jagielski     for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it)
1153*b1cdbd2cSJim Jagielski     {
1154*b1cdbd2cSJim Jagielski         clipRect.x = it->Left();
1155*b1cdbd2cSJim Jagielski         clipRect.y = it->Top();
1156*b1cdbd2cSJim Jagielski         clipRect.width = it->GetWidth();
1157*b1cdbd2cSJim Jagielski         clipRect.height = it->GetHeight();
1158*b1cdbd2cSJim Jagielski 
1159*b1cdbd2cSJim Jagielski         // Buttons must paint opaque since some themes have alpha-channel enabled buttons
1160*b1cdbd2cSJim Jagielski         gtk_paint_flat_box( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable, GTK_STATE_NORMAL, GTK_SHADOW_NONE,
1161*b1cdbd2cSJim Jagielski                             &clipRect, m_pWindow, "base", x, y, w, h );
1162*b1cdbd2cSJim Jagielski 
1163*b1cdbd2cSJim Jagielski         if ( (nState & CTRL_STATE_DEFAULT) && (GTK_BUTTON(gWidgetData[m_nScreen].gBtnWidget)->relief == GTK_RELIEF_NORMAL) )
1164*b1cdbd2cSJim Jagielski         {
1165*b1cdbd2cSJim Jagielski             gtk_paint_box( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable, GTK_STATE_NORMAL, GTK_SHADOW_IN,
1166*b1cdbd2cSJim Jagielski                            &clipRect, gWidgetData[m_nScreen].gBtnWidget, "buttondefault", x, y, w, h );
1167*b1cdbd2cSJim Jagielski         }
1168*b1cdbd2cSJim Jagielski 
1169*b1cdbd2cSJim Jagielski         if ( (GTK_BUTTON(gWidgetData[m_nScreen].gBtnWidget)->relief != GTK_RELIEF_NONE)
1170*b1cdbd2cSJim Jagielski             || (nState & CTRL_STATE_PRESSED)
1171*b1cdbd2cSJim Jagielski 		    || (nState & CTRL_STATE_ROLLOVER) )
1172*b1cdbd2cSJim Jagielski         {
1173*b1cdbd2cSJim Jagielski             gtk_paint_box( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable, stateType, shadowType,
1174*b1cdbd2cSJim Jagielski                            &clipRect, gWidgetData[m_nScreen].gBtnWidget, "button", xi, yi, wi, hi );
1175*b1cdbd2cSJim Jagielski         }
1176*b1cdbd2cSJim Jagielski     }
1177*b1cdbd2cSJim Jagielski #if 0 // VCL draws focus rects
1178*b1cdbd2cSJim Jagielski 	// Draw focus rect
1179*b1cdbd2cSJim Jagielski 	if ( (nState & CTRL_STATE_FOCUSED) && (nState & CTRL_STATE_ENABLED) && bDrawFocus )
1180*b1cdbd2cSJim Jagielski 	{
1181*b1cdbd2cSJim Jagielski 		if (interiorFocus)
1182*b1cdbd2cSJim Jagielski 		{
1183*b1cdbd2cSJim Jagielski 			x += gWidgetData[m_nScreen].gBtnWidget->style->xthickness + focusPad;
1184*b1cdbd2cSJim Jagielski 			y += gWidgetData[m_nScreen].gBtnWidget->style->ythickness + focusPad;
1185*b1cdbd2cSJim Jagielski 			w -= 2 * (gWidgetData[m_nScreen].gBtnWidget->style->xthickness + focusPad);
1186*b1cdbd2cSJim Jagielski 			h -=  2 * (gWidgetData[m_nScreen].gBtnWidget->style->xthickness + focusPad);
1187*b1cdbd2cSJim Jagielski 		}
1188*b1cdbd2cSJim Jagielski 		else
1189*b1cdbd2cSJim Jagielski 		{
1190*b1cdbd2cSJim Jagielski 			x -= focusWidth + focusPad;
1191*b1cdbd2cSJim Jagielski 			y -= focusWidth + focusPad;
1192*b1cdbd2cSJim Jagielski 			w += 2 * (focusWidth + focusPad);
1193*b1cdbd2cSJim Jagielski 			h += 2 * (focusWidth + focusPad);
1194*b1cdbd2cSJim Jagielski 		}
1195*b1cdbd2cSJim Jagielski 		if ( !interiorFocus )
1196*b1cdbd2cSJim Jagielski 			gtk_paint_focus( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable, stateType, &clipRect,
1197*b1cdbd2cSJim Jagielski                              gWidgetData[m_nScreen].gBtnWidget, "button", x, y, w, h );
1198*b1cdbd2cSJim Jagielski 	}
1199*b1cdbd2cSJim Jagielski #endif
1200*b1cdbd2cSJim Jagielski 
1201*b1cdbd2cSJim Jagielski 	return( sal_True );
1202*b1cdbd2cSJim Jagielski }
1203*b1cdbd2cSJim Jagielski 
NWGetButtonArea(int nScreen,ControlType,ControlPart,Rectangle aAreaRect,ControlState nState,const ImplControlValue &,const OUString &)1204*b1cdbd2cSJim Jagielski static Rectangle NWGetButtonArea( int nScreen,
1205*b1cdbd2cSJim Jagielski                                   ControlType, ControlPart, Rectangle aAreaRect, ControlState nState,
1206*b1cdbd2cSJim Jagielski 							      const ImplControlValue&, const OUString& )
1207*b1cdbd2cSJim Jagielski {
1208*b1cdbd2cSJim Jagielski 	gboolean		interiorFocus;
1209*b1cdbd2cSJim Jagielski 	gint			focusWidth;
1210*b1cdbd2cSJim Jagielski 	gint			focusPad;
1211*b1cdbd2cSJim Jagielski 	GtkBorder		aDefBorder;
1212*b1cdbd2cSJim Jagielski 	GtkBorder *	pBorder;
1213*b1cdbd2cSJim Jagielski 	sal_Bool			bDrawFocus = sal_True;
1214*b1cdbd2cSJim Jagielski 	Rectangle		aRect;
1215*b1cdbd2cSJim Jagielski 	gint			x, y, w, h;
1216*b1cdbd2cSJim Jagielski 
1217*b1cdbd2cSJim Jagielski 	NWEnsureGTKButton( nScreen );
1218*b1cdbd2cSJim Jagielski 	gtk_widget_style_get( gWidgetData[nScreen].gBtnWidget,
1219*b1cdbd2cSJim Jagielski                             	"focus-line-width",	&focusWidth,
1220*b1cdbd2cSJim Jagielski 								"focus-padding", 	&focusPad,
1221*b1cdbd2cSJim Jagielski 					 			"interior_focus",	&interiorFocus,
1222*b1cdbd2cSJim Jagielski 								"default_border",	&pBorder,
1223*b1cdbd2cSJim Jagielski 								(char *)NULL );
1224*b1cdbd2cSJim Jagielski 
1225*b1cdbd2cSJim Jagielski 	// Make sure the border values exist, otherwise use some defaults
1226*b1cdbd2cSJim Jagielski 	if ( pBorder )
1227*b1cdbd2cSJim Jagielski 	{
1228*b1cdbd2cSJim Jagielski 		NW_gtk_border_set_from_border( aDefBorder, pBorder );
1229*b1cdbd2cSJim Jagielski 		gtk_border_free( pBorder );
1230*b1cdbd2cSJim Jagielski 	}
1231*b1cdbd2cSJim Jagielski 	else NW_gtk_border_set_from_border( aDefBorder, &aDefDefBorder );
1232*b1cdbd2cSJim Jagielski 
1233*b1cdbd2cSJim Jagielski 	x = aAreaRect.Left();
1234*b1cdbd2cSJim Jagielski 	y = aAreaRect.Top();
1235*b1cdbd2cSJim Jagielski 	w = aAreaRect.GetWidth();
1236*b1cdbd2cSJim Jagielski 	h = aAreaRect.GetHeight();
1237*b1cdbd2cSJim Jagielski 
1238*b1cdbd2cSJim Jagielski 	// If the button is too small, don't ever draw focus or grab more space
1239*b1cdbd2cSJim Jagielski 	if ( (w < 16) || (h < 16) )
1240*b1cdbd2cSJim Jagielski 		bDrawFocus = sal_False;
1241*b1cdbd2cSJim Jagielski 
1242*b1cdbd2cSJim Jagielski 	if ( (nState & CTRL_STATE_DEFAULT) && bDrawFocus )
1243*b1cdbd2cSJim Jagielski 	{
1244*b1cdbd2cSJim Jagielski 		x -= aDefBorder.left;
1245*b1cdbd2cSJim Jagielski 		y -= aDefBorder.top;
1246*b1cdbd2cSJim Jagielski 		w += aDefBorder.left + aDefBorder.right;
1247*b1cdbd2cSJim Jagielski 		h += aDefBorder.top + aDefBorder.bottom;
1248*b1cdbd2cSJim Jagielski 	}
1249*b1cdbd2cSJim Jagielski 
1250*b1cdbd2cSJim Jagielski     aRect = Rectangle( Point( x, y ), Size( w, h ) );
1251*b1cdbd2cSJim Jagielski 
1252*b1cdbd2cSJim Jagielski 	return( aRect );
1253*b1cdbd2cSJim Jagielski }
1254*b1cdbd2cSJim Jagielski 
1255*b1cdbd2cSJim Jagielski //-------------------------------------
1256*b1cdbd2cSJim Jagielski 
NWPaintGTKRadio(GdkDrawable * gdkDrawable,ControlType,ControlPart,const Rectangle & rControlRectangle,const clipList & rClipList,ControlState nState,const ImplControlValue & aValue,const OUString &)1257*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKRadio( GdkDrawable* gdkDrawable,
1258*b1cdbd2cSJim Jagielski                                       ControlType, ControlPart,
1259*b1cdbd2cSJim Jagielski                                       const Rectangle& rControlRectangle,
1260*b1cdbd2cSJim Jagielski                                       const clipList& rClipList,
1261*b1cdbd2cSJim Jagielski                                       ControlState nState,
1262*b1cdbd2cSJim Jagielski                                       const ImplControlValue& aValue,
1263*b1cdbd2cSJim Jagielski                                       const OUString& )
1264*b1cdbd2cSJim Jagielski {
1265*b1cdbd2cSJim Jagielski 	GtkStateType	stateType;
1266*b1cdbd2cSJim Jagielski 	GtkShadowType	shadowType;
1267*b1cdbd2cSJim Jagielski 	sal_Bool			isChecked = (aValue.getTristateVal()==BUTTONVALUE_ON);
1268*b1cdbd2cSJim Jagielski     gint            x, y;
1269*b1cdbd2cSJim Jagielski     GdkRectangle	clipRect;
1270*b1cdbd2cSJim Jagielski 
1271*b1cdbd2cSJim Jagielski 	NWEnsureGTKButton( m_nScreen );
1272*b1cdbd2cSJim Jagielski 	NWEnsureGTKRadio( m_nScreen );
1273*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
1274*b1cdbd2cSJim Jagielski 
1275*b1cdbd2cSJim Jagielski     gint indicator_size;
1276*b1cdbd2cSJim Jagielski     gtk_widget_style_get( gWidgetData[m_nScreen].gRadioWidget, "indicator_size", &indicator_size, (char *)NULL);
1277*b1cdbd2cSJim Jagielski 
1278*b1cdbd2cSJim Jagielski     x = rControlRectangle.Left() + (rControlRectangle.GetWidth()-indicator_size)/2;
1279*b1cdbd2cSJim Jagielski     y = rControlRectangle.Top() + (rControlRectangle.GetHeight()-indicator_size)/2;
1280*b1cdbd2cSJim Jagielski 
1281*b1cdbd2cSJim Jagielski 	// Set the shadow based on if checked or not so we get a freakin checkmark.
1282*b1cdbd2cSJim Jagielski 	shadowType = isChecked ? GTK_SHADOW_IN : GTK_SHADOW_OUT;
1283*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[m_nScreen].gRadioWidget, nState, stateType );
1284*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[m_nScreen].gRadioWidgetSibling, nState, stateType );
1285*b1cdbd2cSJim Jagielski 
1286*b1cdbd2cSJim Jagielski 	// GTK enforces radio groups, so that if we don't have 2 buttons in the group,
1287*b1cdbd2cSJim Jagielski 	// the single button will always be active.  So we have to have 2 buttons.
1288*b1cdbd2cSJim Jagielski 
1289*b1cdbd2cSJim Jagielski     // #i59666# set the members directly where we should use
1290*b1cdbd2cSJim Jagielski     // gtk_toggle_button_set_active. reason: there are animated themes
1291*b1cdbd2cSJim Jagielski     // which are in active state only after a while leading to painting
1292*b1cdbd2cSJim Jagielski     // intermediate states between active/inactive. Let's hope that
1293*b1cdbd2cSJim Jagielski     // GtkToggleButtone stays binary compatible.
1294*b1cdbd2cSJim Jagielski 	if (!isChecked)
1295*b1cdbd2cSJim Jagielski 		GTK_TOGGLE_BUTTON(gWidgetData[m_nScreen].gRadioWidgetSibling)->active = sal_True;
1296*b1cdbd2cSJim Jagielski 	GTK_TOGGLE_BUTTON(gWidgetData[m_nScreen].gRadioWidget)->active = isChecked;
1297*b1cdbd2cSJim Jagielski 
1298*b1cdbd2cSJim Jagielski     for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it )
1299*b1cdbd2cSJim Jagielski     {
1300*b1cdbd2cSJim Jagielski         clipRect.x = it->Left();
1301*b1cdbd2cSJim Jagielski         clipRect.y = it->Top();
1302*b1cdbd2cSJim Jagielski         clipRect.width = it->GetWidth();
1303*b1cdbd2cSJim Jagielski         clipRect.height = it->GetHeight();
1304*b1cdbd2cSJim Jagielski 
1305*b1cdbd2cSJim Jagielski         gtk_paint_option( gWidgetData[m_nScreen].gRadioWidget->style, gdkDrawable, stateType, shadowType,
1306*b1cdbd2cSJim Jagielski                           &clipRect, gWidgetData[m_nScreen].gRadioWidget, "radiobutton",
1307*b1cdbd2cSJim Jagielski                           x, y, indicator_size, indicator_size );
1308*b1cdbd2cSJim Jagielski     }
1309*b1cdbd2cSJim Jagielski 
1310*b1cdbd2cSJim Jagielski 	return( sal_True );
1311*b1cdbd2cSJim Jagielski }
1312*b1cdbd2cSJim Jagielski 
1313*b1cdbd2cSJim Jagielski //-------------------------------------
1314*b1cdbd2cSJim Jagielski 
NWPaintGTKCheck(GdkDrawable * gdkDrawable,ControlType,ControlPart,const Rectangle & rControlRectangle,const clipList & rClipList,ControlState nState,const ImplControlValue & aValue,const OUString &)1315*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKCheck( GdkDrawable* gdkDrawable,
1316*b1cdbd2cSJim Jagielski                                       ControlType, ControlPart,
1317*b1cdbd2cSJim Jagielski                                       const Rectangle& rControlRectangle,
1318*b1cdbd2cSJim Jagielski                                       const clipList& rClipList,
1319*b1cdbd2cSJim Jagielski                                       ControlState nState,
1320*b1cdbd2cSJim Jagielski                                       const ImplControlValue& aValue,
1321*b1cdbd2cSJim Jagielski                                       const OUString& )
1322*b1cdbd2cSJim Jagielski {
1323*b1cdbd2cSJim Jagielski 	GtkStateType	stateType;
1324*b1cdbd2cSJim Jagielski 	GtkShadowType	shadowType;
1325*b1cdbd2cSJim Jagielski 	bool			isChecked = (aValue.getTristateVal() == BUTTONVALUE_ON);
1326*b1cdbd2cSJim Jagielski 	bool            isInconsistent = (aValue.getTristateVal() == BUTTONVALUE_MIXED);
1327*b1cdbd2cSJim Jagielski     GdkRectangle	clipRect;
1328*b1cdbd2cSJim Jagielski     gint			x,y;
1329*b1cdbd2cSJim Jagielski 
1330*b1cdbd2cSJim Jagielski 	NWEnsureGTKButton( m_nScreen );
1331*b1cdbd2cSJim Jagielski 	NWEnsureGTKCheck( m_nScreen );
1332*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
1333*b1cdbd2cSJim Jagielski 
1334*b1cdbd2cSJim Jagielski     gint indicator_size;
1335*b1cdbd2cSJim Jagielski     gtk_widget_style_get( gWidgetData[m_nScreen].gCheckWidget, "indicator_size", &indicator_size, (char *)NULL);
1336*b1cdbd2cSJim Jagielski 
1337*b1cdbd2cSJim Jagielski     x = rControlRectangle.Left() + (rControlRectangle.GetWidth()-indicator_size)/2;
1338*b1cdbd2cSJim Jagielski     y = rControlRectangle.Top() + (rControlRectangle.GetHeight()-indicator_size)/2;
1339*b1cdbd2cSJim Jagielski 
1340*b1cdbd2cSJim Jagielski 	// Set the shadow based on if checked or not so we get a checkmark.
1341*b1cdbd2cSJim Jagielski 	shadowType = isChecked ? GTK_SHADOW_IN : isInconsistent ? GTK_SHADOW_ETCHED_IN : GTK_SHADOW_OUT;
1342*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[m_nScreen].gCheckWidget, nState, stateType );
1343*b1cdbd2cSJim Jagielski 	GTK_TOGGLE_BUTTON(gWidgetData[m_nScreen].gCheckWidget)->active = isChecked;
1344*b1cdbd2cSJim Jagielski 
1345*b1cdbd2cSJim Jagielski     for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it )
1346*b1cdbd2cSJim Jagielski     {
1347*b1cdbd2cSJim Jagielski         clipRect.x = it->Left();
1348*b1cdbd2cSJim Jagielski         clipRect.y = it->Top();
1349*b1cdbd2cSJim Jagielski         clipRect.width = it->GetWidth();
1350*b1cdbd2cSJim Jagielski         clipRect.height = it->GetHeight();
1351*b1cdbd2cSJim Jagielski 
1352*b1cdbd2cSJim Jagielski         gtk_paint_check( gWidgetData[m_nScreen].gCheckWidget->style, gdkDrawable, stateType, shadowType,
1353*b1cdbd2cSJim Jagielski                          &clipRect, gWidgetData[m_nScreen].gCheckWidget, "checkbutton",
1354*b1cdbd2cSJim Jagielski                          x, y, indicator_size, indicator_size );
1355*b1cdbd2cSJim Jagielski     }
1356*b1cdbd2cSJim Jagielski 
1357*b1cdbd2cSJim Jagielski 	return( sal_True );
1358*b1cdbd2cSJim Jagielski }
1359*b1cdbd2cSJim Jagielski 
1360*b1cdbd2cSJim Jagielski //-------------------------------------
NWCalcArrowRect(const Rectangle & rButton,Rectangle & rArrow)1361*b1cdbd2cSJim Jagielski static void NWCalcArrowRect( const Rectangle& rButton, Rectangle& rArrow )
1362*b1cdbd2cSJim Jagielski {
1363*b1cdbd2cSJim Jagielski 	// Size the arrow appropriately
1364*b1cdbd2cSJim Jagielski     Size aSize( rButton.GetWidth()/2, rButton.GetHeight()/2 );
1365*b1cdbd2cSJim Jagielski     rArrow.SetSize( aSize );
1366*b1cdbd2cSJim Jagielski 
1367*b1cdbd2cSJim Jagielski 	rArrow.SetPos( Point(
1368*b1cdbd2cSJim Jagielski         rButton.Left() + ( rButton.GetWidth()  - rArrow.GetWidth()  ) / 2,
1369*b1cdbd2cSJim Jagielski         rButton.Top() + ( rButton.GetHeight() - rArrow.GetHeight() ) / 2
1370*b1cdbd2cSJim Jagielski         ) );
1371*b1cdbd2cSJim Jagielski }
1372*b1cdbd2cSJim Jagielski 
NWPaintGTKScrollbar(ControlType,ControlPart nPart,const Rectangle & rControlRectangle,const clipList &,ControlState nState,const ImplControlValue & aValue,const OUString &)1373*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKScrollbar( ControlType, ControlPart nPart,
1374*b1cdbd2cSJim Jagielski                                           const Rectangle& rControlRectangle,
1375*b1cdbd2cSJim Jagielski                                           const clipList&,
1376*b1cdbd2cSJim Jagielski                                           ControlState nState,
1377*b1cdbd2cSJim Jagielski                                           const ImplControlValue& aValue,
1378*b1cdbd2cSJim Jagielski                                           const OUString& )
1379*b1cdbd2cSJim Jagielski {
1380*b1cdbd2cSJim Jagielski     OSL_ASSERT( aValue.getType() == CTRL_SCROLLBAR );
1381*b1cdbd2cSJim Jagielski     const ScrollbarValue* pScrollbarVal = (aValue.getType() == CTRL_SCROLLBAR) ? static_cast<const ScrollbarValue*>(&aValue) : NULL;
1382*b1cdbd2cSJim Jagielski     GdkPixmap*      pixmap = NULL;
1383*b1cdbd2cSJim Jagielski 	Rectangle		pixmapRect, scrollbarRect;
1384*b1cdbd2cSJim Jagielski 	GtkStateType	stateType;
1385*b1cdbd2cSJim Jagielski 	GtkShadowType	shadowType;
1386*b1cdbd2cSJim Jagielski 	GtkScrollbar *	scrollbarWidget;
1387*b1cdbd2cSJim Jagielski 	GtkStyle *	style;
1388*b1cdbd2cSJim Jagielski 	GtkAdjustment* scrollbarValues = NULL;
1389*b1cdbd2cSJim Jagielski 	GtkOrientation	scrollbarOrientation;
1390*b1cdbd2cSJim Jagielski 	Rectangle		thumbRect = pScrollbarVal->maThumbRect;
1391*b1cdbd2cSJim Jagielski 	Rectangle		button11BoundRect = pScrollbarVal->maButton1Rect;   // backward
1392*b1cdbd2cSJim Jagielski 	Rectangle		button22BoundRect = pScrollbarVal->maButton2Rect;   // forward
1393*b1cdbd2cSJim Jagielski 	Rectangle		button12BoundRect = pScrollbarVal->maButton1Rect;   // secondary forward
1394*b1cdbd2cSJim Jagielski 	Rectangle		button21BoundRect = pScrollbarVal->maButton2Rect;   // secondary backward
1395*b1cdbd2cSJim Jagielski 	GtkArrowType	button1Type;                                        // backward
1396*b1cdbd2cSJim Jagielski 	GtkArrowType	button2Type;                                        // forward
1397*b1cdbd2cSJim Jagielski 	gchar *		scrollbarTagH = (gchar *) "hscrollbar";
1398*b1cdbd2cSJim Jagielski 	gchar *		scrollbarTagV = (gchar *) "vscrollbar";
1399*b1cdbd2cSJim Jagielski 	gchar *		scrollbarTag = NULL;
1400*b1cdbd2cSJim Jagielski 	Rectangle		arrowRect;
1401*b1cdbd2cSJim Jagielski 	gint			slider_width = 0;
1402*b1cdbd2cSJim Jagielski 	gint			stepper_size = 0;
1403*b1cdbd2cSJim Jagielski 	gint			stepper_spacing = 0;
1404*b1cdbd2cSJim Jagielski 	gint			trough_border = 0;
1405*b1cdbd2cSJim Jagielski 	gint			min_slider_length = 0;
1406*b1cdbd2cSJim Jagielski 	gint			vShim = 0;
1407*b1cdbd2cSJim Jagielski 	gint			hShim = 0;
1408*b1cdbd2cSJim Jagielski 	gint			x,y,w,h;
1409*b1cdbd2cSJim Jagielski 
1410*b1cdbd2cSJim Jagielski     // make controlvalue rectangles relative to area
1411*b1cdbd2cSJim Jagielski     thumbRect.Move( -rControlRectangle.Left(), -rControlRectangle.Top() );
1412*b1cdbd2cSJim Jagielski     button11BoundRect.Move( -rControlRectangle.Left(), -rControlRectangle.Top() );
1413*b1cdbd2cSJim Jagielski     button22BoundRect.Move( -rControlRectangle.Left(), -rControlRectangle.Top() );
1414*b1cdbd2cSJim Jagielski     button12BoundRect.Move( -rControlRectangle.Left(), -rControlRectangle.Top() );
1415*b1cdbd2cSJim Jagielski     button21BoundRect.Move( -rControlRectangle.Left(), -rControlRectangle.Top() );
1416*b1cdbd2cSJim Jagielski 
1417*b1cdbd2cSJim Jagielski 	NWEnsureGTKButton( m_nScreen );
1418*b1cdbd2cSJim Jagielski 	NWEnsureGTKScrollbars( m_nScreen );
1419*b1cdbd2cSJim Jagielski 	NWEnsureGTKArrow( m_nScreen );
1420*b1cdbd2cSJim Jagielski 
1421*b1cdbd2cSJim Jagielski 	// Find the overall bounding rect of the control
1422*b1cdbd2cSJim Jagielski 	pixmapRect = rControlRectangle;
1423*b1cdbd2cSJim Jagielski     pixmapRect.SetSize( Size( pixmapRect.GetWidth() + 1,
1424*b1cdbd2cSJim Jagielski                               pixmapRect.GetHeight() + 1 ) );
1425*b1cdbd2cSJim Jagielski 	scrollbarRect = pixmapRect;
1426*b1cdbd2cSJim Jagielski 
1427*b1cdbd2cSJim Jagielski 	if ( (scrollbarRect.GetWidth() <= 1) || (scrollbarRect.GetHeight() <= 1) )
1428*b1cdbd2cSJim Jagielski 		return( sal_True );
1429*b1cdbd2cSJim Jagielski 
1430*b1cdbd2cSJim Jagielski 	// Grab some button style attributes
1431*b1cdbd2cSJim Jagielski 	gtk_widget_style_get( gWidgetData[m_nScreen].gScrollHorizWidget,
1432*b1cdbd2cSJim Jagielski                                       "slider_width", &slider_width,
1433*b1cdbd2cSJim Jagielski 									  "stepper_size", &stepper_size,
1434*b1cdbd2cSJim Jagielski 									  "trough_border", &trough_border,
1435*b1cdbd2cSJim Jagielski 									  "stepper_spacing", &stepper_spacing,
1436*b1cdbd2cSJim Jagielski 									  "min_slider_length", &min_slider_length, (char *)NULL );
1437*b1cdbd2cSJim Jagielski     gboolean has_forward;
1438*b1cdbd2cSJim Jagielski     gboolean has_forward2;
1439*b1cdbd2cSJim Jagielski     gboolean has_backward;
1440*b1cdbd2cSJim Jagielski     gboolean has_backward2;
1441*b1cdbd2cSJim Jagielski 
1442*b1cdbd2cSJim Jagielski 	gtk_widget_style_get( gWidgetData[m_nScreen].gScrollHorizWidget, "has-forward-stepper", &has_forward,
1443*b1cdbd2cSJim Jagielski 									  "has-secondary-forward-stepper", &has_forward2,
1444*b1cdbd2cSJim Jagielski 									  "has-backward-stepper", &has_backward,
1445*b1cdbd2cSJim Jagielski 	   								  "has-secondary-backward-stepper", &has_backward2, (char *)NULL );
1446*b1cdbd2cSJim Jagielski 	gint magic = trough_border ? 1 : 0;
1447*b1cdbd2cSJim Jagielski     gint nFirst = 0;
1448*b1cdbd2cSJim Jagielski 
1449*b1cdbd2cSJim Jagielski     if ( has_backward )  nFirst  += 1;
1450*b1cdbd2cSJim Jagielski     if ( has_forward2 )  nFirst  += 1;
1451*b1cdbd2cSJim Jagielski 
1452*b1cdbd2cSJim Jagielski 	if ( nPart == PART_DRAW_BACKGROUND_HORZ )
1453*b1cdbd2cSJim Jagielski 	{
1454*b1cdbd2cSJim Jagielski 		unsigned int sliderHeight = slider_width + (trough_border * 2);
1455*b1cdbd2cSJim Jagielski 		vShim = (pixmapRect.GetHeight() - sliderHeight) / 2;
1456*b1cdbd2cSJim Jagielski 
1457*b1cdbd2cSJim Jagielski 		scrollbarRect.Move( 0, vShim );
1458*b1cdbd2cSJim Jagielski 		scrollbarRect.SetSize( Size( scrollbarRect.GetWidth(), sliderHeight ) );
1459*b1cdbd2cSJim Jagielski 
1460*b1cdbd2cSJim Jagielski 		scrollbarWidget = GTK_SCROLLBAR( gWidgetData[m_nScreen].gScrollHorizWidget );
1461*b1cdbd2cSJim Jagielski 		scrollbarOrientation = GTK_ORIENTATION_HORIZONTAL;
1462*b1cdbd2cSJim Jagielski 		scrollbarTag = scrollbarTagH;
1463*b1cdbd2cSJim Jagielski 		button1Type = GTK_ARROW_LEFT;
1464*b1cdbd2cSJim Jagielski 		button2Type = GTK_ARROW_RIGHT;
1465*b1cdbd2cSJim Jagielski 
1466*b1cdbd2cSJim Jagielski         if ( has_backward )
1467*b1cdbd2cSJim Jagielski         {
1468*b1cdbd2cSJim Jagielski             button12BoundRect.Move( stepper_size - trough_border,
1469*b1cdbd2cSJim Jagielski                                     (scrollbarRect.GetHeight() - slider_width) / 2 );
1470*b1cdbd2cSJim Jagielski         }
1471*b1cdbd2cSJim Jagielski 
1472*b1cdbd2cSJim Jagielski         button11BoundRect.Move( trough_border, (scrollbarRect.GetHeight() - slider_width) / 2 );
1473*b1cdbd2cSJim Jagielski         button11BoundRect.SetSize( Size( stepper_size, slider_width ) );
1474*b1cdbd2cSJim Jagielski         button12BoundRect.SetSize( Size( stepper_size, slider_width ) );
1475*b1cdbd2cSJim Jagielski 
1476*b1cdbd2cSJim Jagielski         if ( has_backward2 )
1477*b1cdbd2cSJim Jagielski         {
1478*b1cdbd2cSJim Jagielski             button22BoundRect.Move( stepper_size+(trough_border+1)/2, (scrollbarRect.GetHeight() - slider_width) / 2 );
1479*b1cdbd2cSJim Jagielski             button21BoundRect.Move( (trough_border+1)/2, (scrollbarRect.GetHeight() - slider_width) / 2 );
1480*b1cdbd2cSJim Jagielski         }
1481*b1cdbd2cSJim Jagielski         else
1482*b1cdbd2cSJim Jagielski         {
1483*b1cdbd2cSJim Jagielski             button22BoundRect.Move( (trough_border+1)/2, (scrollbarRect.GetHeight() - slider_width) / 2 );
1484*b1cdbd2cSJim Jagielski         }
1485*b1cdbd2cSJim Jagielski 
1486*b1cdbd2cSJim Jagielski         button21BoundRect.SetSize( Size( stepper_size, slider_width ) );
1487*b1cdbd2cSJim Jagielski         button22BoundRect.SetSize( Size( stepper_size, slider_width ) );
1488*b1cdbd2cSJim Jagielski 
1489*b1cdbd2cSJim Jagielski 		thumbRect.Bottom() = thumbRect.Top() + slider_width - 1;
1490*b1cdbd2cSJim Jagielski 		// Make sure the thumb is at least the default width (so we don't get tiny thumbs),
1491*b1cdbd2cSJim Jagielski 		// but if the VCL gives us a size smaller than the theme's default thumb size,
1492*b1cdbd2cSJim Jagielski 		// honor the VCL size
1493*b1cdbd2cSJim Jagielski #if 0
1494*b1cdbd2cSJim Jagielski 		if ( (thumbRect.GetWidth() < min_slider_length)
1495*b1cdbd2cSJim Jagielski 			&& ((scrollbarRect.GetWidth()-button1BoundRect.GetWidth()-button2BoundRect.GetWidth()) > min_slider_length) )
1496*b1cdbd2cSJim Jagielski 			thumbRect.SetSize( Size( min_slider_length, thumbRect.GetHeight() ) );
1497*b1cdbd2cSJim Jagielski #endif
1498*b1cdbd2cSJim Jagielski 
1499*b1cdbd2cSJim Jagielski         thumbRect.Right() += magic;
1500*b1cdbd2cSJim Jagielski 		// Center vertically in the track
1501*b1cdbd2cSJim Jagielski 		thumbRect.Move( 0, (scrollbarRect.GetHeight() - slider_width) / 2 );
1502*b1cdbd2cSJim Jagielski 	}
1503*b1cdbd2cSJim Jagielski 	else
1504*b1cdbd2cSJim Jagielski 	{
1505*b1cdbd2cSJim Jagielski 		unsigned int sliderWidth = slider_width + (trough_border * 2);
1506*b1cdbd2cSJim Jagielski 		hShim = (pixmapRect.GetWidth() - sliderWidth) / 2;
1507*b1cdbd2cSJim Jagielski 
1508*b1cdbd2cSJim Jagielski 		scrollbarRect.Move( hShim, 0 );
1509*b1cdbd2cSJim Jagielski 		scrollbarRect.SetSize( Size( sliderWidth, scrollbarRect.GetHeight() ) );
1510*b1cdbd2cSJim Jagielski 
1511*b1cdbd2cSJim Jagielski 		scrollbarWidget = GTK_SCROLLBAR( gWidgetData[m_nScreen].gScrollVertWidget );
1512*b1cdbd2cSJim Jagielski 		scrollbarOrientation = GTK_ORIENTATION_VERTICAL;
1513*b1cdbd2cSJim Jagielski 		scrollbarTag = scrollbarTagV;
1514*b1cdbd2cSJim Jagielski 		button1Type = GTK_ARROW_UP;
1515*b1cdbd2cSJim Jagielski 		button2Type = GTK_ARROW_DOWN;
1516*b1cdbd2cSJim Jagielski 
1517*b1cdbd2cSJim Jagielski         if ( has_backward )
1518*b1cdbd2cSJim Jagielski         {
1519*b1cdbd2cSJim Jagielski             button12BoundRect.Move( (scrollbarRect.GetWidth() - slider_width) / 2,
1520*b1cdbd2cSJim Jagielski                                     stepper_size + trough_border );
1521*b1cdbd2cSJim Jagielski         }
1522*b1cdbd2cSJim Jagielski         button11BoundRect.Move( (scrollbarRect.GetWidth() - slider_width) / 2, trough_border );
1523*b1cdbd2cSJim Jagielski         button11BoundRect.SetSize( Size( slider_width, stepper_size ) );
1524*b1cdbd2cSJim Jagielski 		button12BoundRect.SetSize( Size( slider_width, stepper_size ) );
1525*b1cdbd2cSJim Jagielski 
1526*b1cdbd2cSJim Jagielski         if ( has_backward2 )
1527*b1cdbd2cSJim Jagielski         {
1528*b1cdbd2cSJim Jagielski             button22BoundRect.Move( (scrollbarRect.GetWidth() - slider_width) / 2, stepper_size+(trough_border+1)/2 );
1529*b1cdbd2cSJim Jagielski             button21BoundRect.Move( (scrollbarRect.GetWidth() - slider_width) / 2, (trough_border+1)/2 );
1530*b1cdbd2cSJim Jagielski         }
1531*b1cdbd2cSJim Jagielski         else
1532*b1cdbd2cSJim Jagielski         {
1533*b1cdbd2cSJim Jagielski             button22BoundRect.Move( (scrollbarRect.GetWidth() - slider_width) / 2, (trough_border+1)/2 );
1534*b1cdbd2cSJim Jagielski         }
1535*b1cdbd2cSJim Jagielski 
1536*b1cdbd2cSJim Jagielski         button21BoundRect.SetSize( Size( slider_width, stepper_size ) );
1537*b1cdbd2cSJim Jagielski         button22BoundRect.SetSize( Size( slider_width, stepper_size ) );
1538*b1cdbd2cSJim Jagielski 
1539*b1cdbd2cSJim Jagielski 		thumbRect.Right() = thumbRect.Left() + slider_width - 1;
1540*b1cdbd2cSJim Jagielski #if 0
1541*b1cdbd2cSJim Jagielski 		// Make sure the thumb is at least the default width (so we don't get tiny thumbs),
1542*b1cdbd2cSJim Jagielski 		// but if the VCL gives us a size smaller than the theme's default thumb size,
1543*b1cdbd2cSJim Jagielski 		// honor the VCL size
1544*b1cdbd2cSJim Jagielski 		if ( (thumbRect.GetHeight() < min_slider_length)
1545*b1cdbd2cSJim Jagielski 			&& ((scrollbarRect.GetHeight()-button1BoundRect.GetHeight()-button2BoundRect.GetHeight()) > min_slider_length) )
1546*b1cdbd2cSJim Jagielski 			thumbRect.SetSize( Size( thumbRect.GetWidth(), min_slider_length ) );
1547*b1cdbd2cSJim Jagielski #endif
1548*b1cdbd2cSJim Jagielski 
1549*b1cdbd2cSJim Jagielski         thumbRect.Bottom() += magic;
1550*b1cdbd2cSJim Jagielski 		// Center horizontally in the track
1551*b1cdbd2cSJim Jagielski 		thumbRect.Move( (scrollbarRect.GetWidth() - slider_width) / 2, 0 );
1552*b1cdbd2cSJim Jagielski 	}
1553*b1cdbd2cSJim Jagielski 
1554*b1cdbd2cSJim Jagielski     sal_Bool has_slider = ( thumbRect.GetWidth() > 0 && thumbRect.GetHeight() > 0 );
1555*b1cdbd2cSJim Jagielski 
1556*b1cdbd2cSJim Jagielski 	scrollbarValues = gtk_range_get_adjustment( GTK_RANGE(scrollbarWidget) );
1557*b1cdbd2cSJim Jagielski 	if ( scrollbarValues == NULL )
1558*b1cdbd2cSJim Jagielski 		scrollbarValues = GTK_ADJUSTMENT( gtk_adjustment_new(0, 0, 0, 0, 0, 0) );
1559*b1cdbd2cSJim Jagielski 	if ( nPart == PART_DRAW_BACKGROUND_HORZ )
1560*b1cdbd2cSJim Jagielski 	{
1561*b1cdbd2cSJim Jagielski 		scrollbarValues->lower = pScrollbarVal->mnMin;
1562*b1cdbd2cSJim Jagielski 		scrollbarValues->upper = pScrollbarVal->mnMax;
1563*b1cdbd2cSJim Jagielski 		scrollbarValues->value = pScrollbarVal->mnCur;
1564*b1cdbd2cSJim Jagielski 		scrollbarValues->page_size = scrollbarRect.GetWidth() / 2;
1565*b1cdbd2cSJim Jagielski 	}
1566*b1cdbd2cSJim Jagielski 	else
1567*b1cdbd2cSJim Jagielski 	{
1568*b1cdbd2cSJim Jagielski 		scrollbarValues->lower = pScrollbarVal->mnMin;
1569*b1cdbd2cSJim Jagielski 		scrollbarValues->upper = pScrollbarVal->mnMax;
1570*b1cdbd2cSJim Jagielski 		scrollbarValues->value = pScrollbarVal->mnCur;
1571*b1cdbd2cSJim Jagielski 		scrollbarValues->page_size = scrollbarRect.GetHeight() / 2;
1572*b1cdbd2cSJim Jagielski 	}
1573*b1cdbd2cSJim Jagielski 	gtk_adjustment_changed( scrollbarValues );
1574*b1cdbd2cSJim Jagielski 
1575*b1cdbd2cSJim Jagielski     // as multiple paints are required for the scrollbar
1576*b1cdbd2cSJim Jagielski     // painting them directly to the window flickers
1577*b1cdbd2cSJim Jagielski     pixmap = NWGetPixmapFromScreen( pixmapRect );
1578*b1cdbd2cSJim Jagielski     if( ! pixmap )
1579*b1cdbd2cSJim Jagielski         return sal_False;
1580*b1cdbd2cSJim Jagielski     x = y = 0;
1581*b1cdbd2cSJim Jagielski 
1582*b1cdbd2cSJim Jagielski     w = pixmapRect.GetWidth();
1583*b1cdbd2cSJim Jagielski     h = pixmapRect.GetHeight();
1584*b1cdbd2cSJim Jagielski 
1585*b1cdbd2cSJim Jagielski     GdkDrawable* const &gdkDrawable = GDK_DRAWABLE( pixmap );
1586*b1cdbd2cSJim Jagielski     GdkRectangle* gdkRect = NULL;
1587*b1cdbd2cSJim Jagielski 
1588*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
1589*b1cdbd2cSJim Jagielski 	NWSetWidgetState( GTK_WIDGET(scrollbarWidget), nState, stateType );
1590*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[m_nScreen].gBtnWidget, nState, stateType );
1591*b1cdbd2cSJim Jagielski 	style = GTK_WIDGET( scrollbarWidget )->style;
1592*b1cdbd2cSJim Jagielski 
1593*b1cdbd2cSJim Jagielski 	// ----------------- TROUGH
1594*b1cdbd2cSJim Jagielski 	gtk_paint_flat_box( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable,
1595*b1cdbd2cSJim Jagielski                         GTK_STATE_NORMAL, GTK_SHADOW_NONE, gdkRect,
1596*b1cdbd2cSJim Jagielski                         m_pWindow, "base", x, y,
1597*b1cdbd2cSJim Jagielski                         w, h );
1598*b1cdbd2cSJim Jagielski 	gtk_paint_box( style, gdkDrawable, GTK_STATE_ACTIVE, GTK_SHADOW_IN,
1599*b1cdbd2cSJim Jagielski                    gdkRect, GTK_WIDGET(scrollbarWidget), "trough",
1600*b1cdbd2cSJim Jagielski                    x, y,
1601*b1cdbd2cSJim Jagielski                    scrollbarRect.GetWidth(), scrollbarRect.GetHeight() );
1602*b1cdbd2cSJim Jagielski 
1603*b1cdbd2cSJim Jagielski 	if ( nState & CTRL_STATE_FOCUSED )
1604*b1cdbd2cSJim Jagielski 	{
1605*b1cdbd2cSJim Jagielski 		gtk_paint_focus( style, gdkDrawable, GTK_STATE_ACTIVE,
1606*b1cdbd2cSJim Jagielski                          gdkRect, GTK_WIDGET(scrollbarWidget), "trough",
1607*b1cdbd2cSJim Jagielski                          x, y,
1608*b1cdbd2cSJim Jagielski                          scrollbarRect.GetWidth(), scrollbarRect.GetHeight() );
1609*b1cdbd2cSJim Jagielski 	}
1610*b1cdbd2cSJim Jagielski 
1611*b1cdbd2cSJim Jagielski 	// ----------------- THUMB
1612*b1cdbd2cSJim Jagielski     if ( has_slider )
1613*b1cdbd2cSJim Jagielski     {
1614*b1cdbd2cSJim Jagielski 	    NWConvertVCLStateToGTKState( pScrollbarVal->mnThumbState, &stateType, &shadowType );
1615*b1cdbd2cSJim Jagielski 	    if ( pScrollbarVal->mnThumbState & CTRL_STATE_PRESSED )  stateType = GTK_STATE_PRELIGHT;
1616*b1cdbd2cSJim Jagielski 	    gtk_paint_slider( style, gdkDrawable, stateType, GTK_SHADOW_OUT,
1617*b1cdbd2cSJim Jagielski                         gdkRect, GTK_WIDGET(scrollbarWidget), "slider",
1618*b1cdbd2cSJim Jagielski                         x+hShim+thumbRect.Left(), y+vShim+thumbRect.Top(),
1619*b1cdbd2cSJim Jagielski                         thumbRect.GetWidth(), thumbRect.GetHeight(), scrollbarOrientation );
1620*b1cdbd2cSJim Jagielski     }
1621*b1cdbd2cSJim Jagielski 	// ----------------- BUTTON 1 //
1622*b1cdbd2cSJim Jagielski 	if ( has_backward )
1623*b1cdbd2cSJim Jagielski 	{
1624*b1cdbd2cSJim Jagielski         NWConvertVCLStateToGTKState( pScrollbarVal->mnButton1State, &stateType, &shadowType );
1625*b1cdbd2cSJim Jagielski         if ( stateType == GTK_STATE_INSENSITIVE )	stateType = GTK_STATE_NORMAL;
1626*b1cdbd2cSJim Jagielski         gtk_paint_box( style, gdkDrawable, stateType, shadowType,
1627*b1cdbd2cSJim Jagielski                        gdkRect, GTK_WIDGET(scrollbarWidget), "stepper",
1628*b1cdbd2cSJim Jagielski                        x+hShim+button11BoundRect.Left(), y+vShim+button11BoundRect.Top(),
1629*b1cdbd2cSJim Jagielski                        button11BoundRect.GetWidth(), button11BoundRect.GetHeight() );
1630*b1cdbd2cSJim Jagielski         // ----------------- ARROW 1
1631*b1cdbd2cSJim Jagielski     	NWCalcArrowRect( button11BoundRect, arrowRect );
1632*b1cdbd2cSJim Jagielski     	gtk_paint_arrow( style, gdkDrawable, stateType, shadowType,
1633*b1cdbd2cSJim Jagielski                          gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button1Type, sal_True,
1634*b1cdbd2cSJim Jagielski                          x+hShim+arrowRect.Left(), y+vShim+arrowRect.Top(),
1635*b1cdbd2cSJim Jagielski                          arrowRect.GetWidth(), arrowRect.GetHeight() );
1636*b1cdbd2cSJim Jagielski     }
1637*b1cdbd2cSJim Jagielski 	if ( has_forward2 )
1638*b1cdbd2cSJim Jagielski 	{
1639*b1cdbd2cSJim Jagielski         NWConvertVCLStateToGTKState( pScrollbarVal->mnButton2State, &stateType, &shadowType );
1640*b1cdbd2cSJim Jagielski         if ( stateType == GTK_STATE_INSENSITIVE )	stateType = GTK_STATE_NORMAL;
1641*b1cdbd2cSJim Jagielski         gtk_paint_box( style, gdkDrawable, stateType, shadowType,
1642*b1cdbd2cSJim Jagielski                        gdkRect, GTK_WIDGET(scrollbarWidget), "stepper",
1643*b1cdbd2cSJim Jagielski                        x+hShim+button12BoundRect.Left(), y+vShim+button12BoundRect.Top(),
1644*b1cdbd2cSJim Jagielski                        button12BoundRect.GetWidth(), button12BoundRect.GetHeight() );
1645*b1cdbd2cSJim Jagielski         // ----------------- ARROW 1
1646*b1cdbd2cSJim Jagielski     	NWCalcArrowRect( button12BoundRect, arrowRect );
1647*b1cdbd2cSJim Jagielski     	gtk_paint_arrow( style, gdkDrawable, stateType, shadowType,
1648*b1cdbd2cSJim Jagielski                          gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button2Type, sal_True,
1649*b1cdbd2cSJim Jagielski                          x+hShim+arrowRect.Left(), y+vShim+arrowRect.Top(),
1650*b1cdbd2cSJim Jagielski                          arrowRect.GetWidth(), arrowRect.GetHeight() );
1651*b1cdbd2cSJim Jagielski     }
1652*b1cdbd2cSJim Jagielski 	// ----------------- BUTTON 2
1653*b1cdbd2cSJim Jagielski     if ( has_backward2 )
1654*b1cdbd2cSJim Jagielski     {
1655*b1cdbd2cSJim Jagielski         NWConvertVCLStateToGTKState( pScrollbarVal->mnButton1State, &stateType, &shadowType );
1656*b1cdbd2cSJim Jagielski         if ( stateType == GTK_STATE_INSENSITIVE )	stateType = GTK_STATE_NORMAL;
1657*b1cdbd2cSJim Jagielski         gtk_paint_box( style, gdkDrawable, stateType, shadowType, gdkRect,
1658*b1cdbd2cSJim Jagielski                        GTK_WIDGET(scrollbarWidget), "stepper",
1659*b1cdbd2cSJim Jagielski                        x+hShim+button21BoundRect.Left(), y+vShim+button21BoundRect.Top(),
1660*b1cdbd2cSJim Jagielski                        button21BoundRect.GetWidth(), button21BoundRect.GetHeight() );
1661*b1cdbd2cSJim Jagielski     	// ----------------- ARROW 2
1662*b1cdbd2cSJim Jagielski     	NWCalcArrowRect( button21BoundRect, arrowRect );
1663*b1cdbd2cSJim Jagielski         gtk_paint_arrow( style, gdkDrawable, stateType, shadowType,
1664*b1cdbd2cSJim Jagielski                          gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button1Type, sal_True,
1665*b1cdbd2cSJim Jagielski                          x+hShim+arrowRect.Left(), y+vShim+arrowRect.Top(),
1666*b1cdbd2cSJim Jagielski                          arrowRect.GetWidth(), arrowRect.GetHeight() );
1667*b1cdbd2cSJim Jagielski     }
1668*b1cdbd2cSJim Jagielski     if ( has_forward )
1669*b1cdbd2cSJim Jagielski     {
1670*b1cdbd2cSJim Jagielski         NWConvertVCLStateToGTKState( pScrollbarVal->mnButton2State, &stateType, &shadowType );
1671*b1cdbd2cSJim Jagielski         if ( stateType == GTK_STATE_INSENSITIVE )	stateType = GTK_STATE_NORMAL;
1672*b1cdbd2cSJim Jagielski         gtk_paint_box( style, gdkDrawable, stateType, shadowType, gdkRect,
1673*b1cdbd2cSJim Jagielski                        GTK_WIDGET(scrollbarWidget), "stepper",
1674*b1cdbd2cSJim Jagielski                        x+hShim+button22BoundRect.Left(), y+vShim+button22BoundRect.Top(),
1675*b1cdbd2cSJim Jagielski                        button22BoundRect.GetWidth(), button22BoundRect.GetHeight() );
1676*b1cdbd2cSJim Jagielski     	// ----------------- ARROW 2
1677*b1cdbd2cSJim Jagielski     	NWCalcArrowRect( button22BoundRect, arrowRect );
1678*b1cdbd2cSJim Jagielski         gtk_paint_arrow( style, gdkDrawable, stateType, shadowType,
1679*b1cdbd2cSJim Jagielski                          gdkRect, GTK_WIDGET(scrollbarWidget), scrollbarTag, button2Type, sal_True,
1680*b1cdbd2cSJim Jagielski                          x+hShim+arrowRect.Left(), y+vShim+arrowRect.Top(),
1681*b1cdbd2cSJim Jagielski                          arrowRect.GetWidth(), arrowRect.GetHeight() );
1682*b1cdbd2cSJim Jagielski     }
1683*b1cdbd2cSJim Jagielski 
1684*b1cdbd2cSJim Jagielski     if( !NWRenderPixmapToScreen(pixmap, pixmapRect) )
1685*b1cdbd2cSJim Jagielski     {
1686*b1cdbd2cSJim Jagielski         g_object_unref( pixmap );
1687*b1cdbd2cSJim Jagielski         return( sal_False );
1688*b1cdbd2cSJim Jagielski     }
1689*b1cdbd2cSJim Jagielski     g_object_unref( pixmap );
1690*b1cdbd2cSJim Jagielski 
1691*b1cdbd2cSJim Jagielski 	return( sal_True );
1692*b1cdbd2cSJim Jagielski }
1693*b1cdbd2cSJim Jagielski 
1694*b1cdbd2cSJim Jagielski //---
1695*b1cdbd2cSJim Jagielski 
NWGetScrollButtonRect(int nScreen,ControlPart nPart,Rectangle aAreaRect)1696*b1cdbd2cSJim Jagielski static Rectangle NWGetScrollButtonRect(	int nScreen, ControlPart nPart, Rectangle aAreaRect )
1697*b1cdbd2cSJim Jagielski {
1698*b1cdbd2cSJim Jagielski     gint slider_width;
1699*b1cdbd2cSJim Jagielski     gint stepper_size;
1700*b1cdbd2cSJim Jagielski     gint stepper_spacing;
1701*b1cdbd2cSJim Jagielski     gint trough_border;
1702*b1cdbd2cSJim Jagielski 
1703*b1cdbd2cSJim Jagielski     NWEnsureGTKScrollbars( nScreen );
1704*b1cdbd2cSJim Jagielski 
1705*b1cdbd2cSJim Jagielski 	// Grab some button style attributes
1706*b1cdbd2cSJim Jagielski 	gtk_widget_style_get( gWidgetData[nScreen].gScrollHorizWidget,
1707*b1cdbd2cSJim Jagielski                                       "slider-width", &slider_width,
1708*b1cdbd2cSJim Jagielski 									  "stepper-size", &stepper_size,
1709*b1cdbd2cSJim Jagielski 									  "trough-border", &trough_border,
1710*b1cdbd2cSJim Jagielski 	   								  "stepper-spacing", &stepper_spacing, (char *)NULL );
1711*b1cdbd2cSJim Jagielski 
1712*b1cdbd2cSJim Jagielski     gboolean has_forward;
1713*b1cdbd2cSJim Jagielski     gboolean has_forward2;
1714*b1cdbd2cSJim Jagielski     gboolean has_backward;
1715*b1cdbd2cSJim Jagielski     gboolean has_backward2;
1716*b1cdbd2cSJim Jagielski 
1717*b1cdbd2cSJim Jagielski 	gtk_widget_style_get( gWidgetData[nScreen].gScrollHorizWidget,
1718*b1cdbd2cSJim Jagielski                                       "has-forward-stepper", &has_forward,
1719*b1cdbd2cSJim Jagielski 									  "has-secondary-forward-stepper", &has_forward2,
1720*b1cdbd2cSJim Jagielski 									  "has-backward-stepper", &has_backward,
1721*b1cdbd2cSJim Jagielski 	   								  "has-secondary-backward-stepper", &has_backward2, (char *)NULL );
1722*b1cdbd2cSJim Jagielski 	gint       buttonWidth;
1723*b1cdbd2cSJim Jagielski 	gint       buttonHeight;
1724*b1cdbd2cSJim Jagielski 	Rectangle  buttonRect;
1725*b1cdbd2cSJim Jagielski 
1726*b1cdbd2cSJim Jagielski     gint nFirst = 0;
1727*b1cdbd2cSJim Jagielski     gint nSecond = 0;
1728*b1cdbd2cSJim Jagielski 
1729*b1cdbd2cSJim Jagielski     if ( has_forward )   nSecond += 1;
1730*b1cdbd2cSJim Jagielski     if ( has_forward2 )  nFirst  += 1;
1731*b1cdbd2cSJim Jagielski     if ( has_backward )  nFirst  += 1;
1732*b1cdbd2cSJim Jagielski     if ( has_backward2 ) nSecond += 1;
1733*b1cdbd2cSJim Jagielski 
1734*b1cdbd2cSJim Jagielski     if ( ( nPart == PART_BUTTON_UP ) || ( nPart == PART_BUTTON_DOWN ) )
1735*b1cdbd2cSJim Jagielski     {
1736*b1cdbd2cSJim Jagielski         buttonWidth = slider_width + 2 * trough_border;
1737*b1cdbd2cSJim Jagielski         buttonHeight = stepper_size + trough_border + stepper_spacing;
1738*b1cdbd2cSJim Jagielski     }
1739*b1cdbd2cSJim Jagielski     else
1740*b1cdbd2cSJim Jagielski     {
1741*b1cdbd2cSJim Jagielski         buttonWidth = stepper_size + trough_border + stepper_spacing;
1742*b1cdbd2cSJim Jagielski         buttonHeight = slider_width + 2 * trough_border;
1743*b1cdbd2cSJim Jagielski     }
1744*b1cdbd2cSJim Jagielski 
1745*b1cdbd2cSJim Jagielski     if ( nPart == PART_BUTTON_UP )
1746*b1cdbd2cSJim Jagielski     {
1747*b1cdbd2cSJim Jagielski         buttonHeight *= nFirst;
1748*b1cdbd2cSJim Jagielski         buttonHeight -= 1;
1749*b1cdbd2cSJim Jagielski         buttonRect.setX( aAreaRect.Left() );
1750*b1cdbd2cSJim Jagielski         buttonRect.setY( aAreaRect.Top() );
1751*b1cdbd2cSJim Jagielski     }
1752*b1cdbd2cSJim Jagielski     else if ( nPart == PART_BUTTON_LEFT )
1753*b1cdbd2cSJim Jagielski     {
1754*b1cdbd2cSJim Jagielski         buttonWidth *= nFirst;
1755*b1cdbd2cSJim Jagielski         buttonWidth -= 1;
1756*b1cdbd2cSJim Jagielski         buttonRect.setX( aAreaRect.Left() );
1757*b1cdbd2cSJim Jagielski         buttonRect.setY( aAreaRect.Top() );
1758*b1cdbd2cSJim Jagielski     }
1759*b1cdbd2cSJim Jagielski     else if ( nPart == PART_BUTTON_DOWN )
1760*b1cdbd2cSJim Jagielski     {
1761*b1cdbd2cSJim Jagielski         buttonHeight *= nSecond;
1762*b1cdbd2cSJim Jagielski         buttonRect.setX( aAreaRect.Left() );
1763*b1cdbd2cSJim Jagielski         buttonRect.setY( aAreaRect.Top() + aAreaRect.GetHeight() - buttonHeight );
1764*b1cdbd2cSJim Jagielski     }
1765*b1cdbd2cSJim Jagielski     else if ( nPart == PART_BUTTON_RIGHT )
1766*b1cdbd2cSJim Jagielski     {
1767*b1cdbd2cSJim Jagielski         buttonWidth *= nSecond;
1768*b1cdbd2cSJim Jagielski         buttonRect.setX( aAreaRect.Left() + aAreaRect.GetWidth() - buttonWidth );
1769*b1cdbd2cSJim Jagielski         buttonRect.setY( aAreaRect.Top() );
1770*b1cdbd2cSJim Jagielski     }
1771*b1cdbd2cSJim Jagielski 
1772*b1cdbd2cSJim Jagielski     buttonRect.SetSize( Size( buttonWidth, buttonHeight ) );
1773*b1cdbd2cSJim Jagielski 
1774*b1cdbd2cSJim Jagielski 	return( buttonRect );
1775*b1cdbd2cSJim Jagielski }
1776*b1cdbd2cSJim Jagielski 
1777*b1cdbd2cSJim Jagielski //-------------------------------------
1778*b1cdbd2cSJim Jagielski 
NWPaintGTKEditBox(GdkDrawable * gdkDrawable,ControlType nType,ControlPart nPart,const Rectangle & rControlRectangle,const clipList & rClipList,ControlState nState,const ImplControlValue & aValue,const OUString & rCaption)1779*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKEditBox( GdkDrawable* gdkDrawable,
1780*b1cdbd2cSJim Jagielski                                         ControlType nType, ControlPart nPart,
1781*b1cdbd2cSJim Jagielski                                         const Rectangle& rControlRectangle,
1782*b1cdbd2cSJim Jagielski                                         const clipList& rClipList,
1783*b1cdbd2cSJim Jagielski                                         ControlState nState,
1784*b1cdbd2cSJim Jagielski                                         const ImplControlValue& aValue,
1785*b1cdbd2cSJim Jagielski                                         const OUString& rCaption )
1786*b1cdbd2cSJim Jagielski {
1787*b1cdbd2cSJim Jagielski 	Rectangle		pixmapRect;
1788*b1cdbd2cSJim Jagielski     GdkRectangle    clipRect;
1789*b1cdbd2cSJim Jagielski 
1790*b1cdbd2cSJim Jagielski 	// Find the overall bounding rect of the buttons's drawing area,
1791*b1cdbd2cSJim Jagielski 	// plus its actual draw rect excluding adornment
1792*b1cdbd2cSJim Jagielski 	pixmapRect = NWGetEditBoxPixmapRect( m_nScreen, nType, nPart, rControlRectangle,
1793*b1cdbd2cSJim Jagielski 					                     nState, aValue, rCaption );
1794*b1cdbd2cSJim Jagielski     for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it )
1795*b1cdbd2cSJim Jagielski     {
1796*b1cdbd2cSJim Jagielski         clipRect.x = it->Left();
1797*b1cdbd2cSJim Jagielski         clipRect.y = it->Top();
1798*b1cdbd2cSJim Jagielski         clipRect.width = it->GetWidth();
1799*b1cdbd2cSJim Jagielski         clipRect.height = it->GetHeight();
1800*b1cdbd2cSJim Jagielski 
1801*b1cdbd2cSJim Jagielski         NWPaintOneEditBox( m_nScreen, gdkDrawable, &clipRect, nType, nPart, pixmapRect, nState, aValue, rCaption );
1802*b1cdbd2cSJim Jagielski     }
1803*b1cdbd2cSJim Jagielski 
1804*b1cdbd2cSJim Jagielski 	return( sal_True );
1805*b1cdbd2cSJim Jagielski }
1806*b1cdbd2cSJim Jagielski 
1807*b1cdbd2cSJim Jagielski 
1808*b1cdbd2cSJim Jagielski /* Take interior/exterior focus into account and return
1809*b1cdbd2cSJim Jagielski  * the bounding rectangle of the edit box including
1810*b1cdbd2cSJim Jagielski  * any focus requirements.
1811*b1cdbd2cSJim Jagielski  */
NWGetEditBoxPixmapRect(int nScreen,ControlType,ControlPart,Rectangle aAreaRect,ControlState,const ImplControlValue &,const OUString &)1812*b1cdbd2cSJim Jagielski static Rectangle NWGetEditBoxPixmapRect(int nScreen,
1813*b1cdbd2cSJim Jagielski                                         ControlType,
1814*b1cdbd2cSJim Jagielski 								        ControlPart,
1815*b1cdbd2cSJim Jagielski                                         Rectangle aAreaRect,
1816*b1cdbd2cSJim Jagielski                                         ControlState,
1817*b1cdbd2cSJim Jagielski                                         const ImplControlValue&,
1818*b1cdbd2cSJim Jagielski                                         const OUString& )
1819*b1cdbd2cSJim Jagielski {
1820*b1cdbd2cSJim Jagielski 	Rectangle		pixmapRect = aAreaRect;
1821*b1cdbd2cSJim Jagielski 	gboolean		interiorFocus;
1822*b1cdbd2cSJim Jagielski 	gint			focusWidth;
1823*b1cdbd2cSJim Jagielski 
1824*b1cdbd2cSJim Jagielski 	NWEnsureGTKEditBox( nScreen );
1825*b1cdbd2cSJim Jagielski 
1826*b1cdbd2cSJim Jagielski 	// Grab some entry style attributes
1827*b1cdbd2cSJim Jagielski 	gtk_widget_style_get( gWidgetData[nScreen].gEditBoxWidget,
1828*b1cdbd2cSJim Jagielski                                 	"focus-line-width",	&focusWidth,
1829*b1cdbd2cSJim Jagielski 					 				"interior-focus",	&interiorFocus, (char *)NULL );
1830*b1cdbd2cSJim Jagielski 
1831*b1cdbd2cSJim Jagielski 	if ( !interiorFocus )
1832*b1cdbd2cSJim Jagielski 	{
1833*b1cdbd2cSJim Jagielski 		pixmapRect.Move( -(focusWidth), -(focusWidth) );
1834*b1cdbd2cSJim Jagielski         pixmapRect.SetSize( Size( pixmapRect.GetWidth() + (2*(focusWidth)),
1835*b1cdbd2cSJim Jagielski                                   pixmapRect.GetHeight() + (2*(focusWidth)) ) );
1836*b1cdbd2cSJim Jagielski 	}
1837*b1cdbd2cSJim Jagielski 
1838*b1cdbd2cSJim Jagielski 	return( pixmapRect );
1839*b1cdbd2cSJim Jagielski }
1840*b1cdbd2cSJim Jagielski 
1841*b1cdbd2cSJim Jagielski 
1842*b1cdbd2cSJim Jagielski /* Paint a GTK Entry widget into the specified GdkPixmap.
1843*b1cdbd2cSJim Jagielski  * All coordinates should be local to the Pixmap, NOT
1844*b1cdbd2cSJim Jagielski  * screen/window coordinates.
1845*b1cdbd2cSJim Jagielski  */
NWPaintOneEditBox(int nScreen,GdkDrawable * gdkDrawable,GdkRectangle * gdkRect,ControlType nType,ControlPart,Rectangle aEditBoxRect,ControlState nState,const ImplControlValue &,const OUString &)1846*b1cdbd2cSJim Jagielski static void NWPaintOneEditBox(	int nScreen,
1847*b1cdbd2cSJim Jagielski                                 GdkDrawable * gdkDrawable,
1848*b1cdbd2cSJim Jagielski                                 GdkRectangle *	gdkRect,
1849*b1cdbd2cSJim Jagielski                                 ControlType			nType,
1850*b1cdbd2cSJim Jagielski                                 ControlPart,
1851*b1cdbd2cSJim Jagielski                                 Rectangle				aEditBoxRect,
1852*b1cdbd2cSJim Jagielski                                 ControlState			nState,
1853*b1cdbd2cSJim Jagielski                                 const ImplControlValue&,
1854*b1cdbd2cSJim Jagielski                                 const OUString& )
1855*b1cdbd2cSJim Jagielski {
1856*b1cdbd2cSJim Jagielski 	GtkStateType	stateType;
1857*b1cdbd2cSJim Jagielski 	GtkShadowType	shadowType;
1858*b1cdbd2cSJim Jagielski 	GtkWidget      *widget;
1859*b1cdbd2cSJim Jagielski 
1860*b1cdbd2cSJim Jagielski 	NWEnsureGTKButton( nScreen );
1861*b1cdbd2cSJim Jagielski 	NWEnsureGTKEditBox( nScreen );
1862*b1cdbd2cSJim Jagielski 	NWEnsureGTKSpinButton( nScreen );
1863*b1cdbd2cSJim Jagielski 	NWEnsureGTKCombo( nScreen );
1864*b1cdbd2cSJim Jagielski 	NWEnsureGTKScrolledWindow( nScreen );
1865*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
1866*b1cdbd2cSJim Jagielski 
1867*b1cdbd2cSJim Jagielski     /* border's shadowType for gtk entries is always GTK_SHADOW_IN (see gtkentry.c)
1868*b1cdbd2cSJim Jagielski     shadowType = GTK_SHADOW_IN;
1869*b1cdbd2cSJim Jagielski     */
1870*b1cdbd2cSJim Jagielski 
1871*b1cdbd2cSJim Jagielski 	switch ( nType )
1872*b1cdbd2cSJim Jagielski 	{
1873*b1cdbd2cSJim Jagielski 		case CTRL_SPINBOX:
1874*b1cdbd2cSJim Jagielski 			widget = gWidgetData[nScreen].gSpinButtonWidget;
1875*b1cdbd2cSJim Jagielski 			break;
1876*b1cdbd2cSJim Jagielski 
1877*b1cdbd2cSJim Jagielski         case CTRL_MULTILINE_EDITBOX:
1878*b1cdbd2cSJim Jagielski             widget = gWidgetData[nScreen].gScrolledWindowWidget;
1879*b1cdbd2cSJim Jagielski             break;
1880*b1cdbd2cSJim Jagielski 		case CTRL_COMBOBOX:
1881*b1cdbd2cSJim Jagielski 			widget = GTK_COMBO(gWidgetData[nScreen].gComboWidget)->entry;
1882*b1cdbd2cSJim Jagielski 			break;
1883*b1cdbd2cSJim Jagielski 
1884*b1cdbd2cSJim Jagielski 		default:
1885*b1cdbd2cSJim Jagielski 			widget = gWidgetData[nScreen].gEditBoxWidget;
1886*b1cdbd2cSJim Jagielski 			break;
1887*b1cdbd2cSJim Jagielski 	}
1888*b1cdbd2cSJim Jagielski 
1889*b1cdbd2cSJim Jagielski 	if ( stateType == GTK_STATE_PRELIGHT )
1890*b1cdbd2cSJim Jagielski 		stateType = GTK_STATE_NORMAL;
1891*b1cdbd2cSJim Jagielski 
1892*b1cdbd2cSJim Jagielski 	// Blueprint needs to paint entry_bg with a Button widget, not an Entry widget to get
1893*b1cdbd2cSJim Jagielski 	// a nice white (or whatever default color) background
1894*b1cdbd2cSJim Jagielski     GtkWidget* pBGWidget = widget;
1895*b1cdbd2cSJim Jagielski     if( GtkSalGraphics::bNeedButtonStyleAsEditBackgroundWorkaround )
1896*b1cdbd2cSJim Jagielski     {
1897*b1cdbd2cSJim Jagielski         NWSetWidgetState( gWidgetData[nScreen].gBtnWidget, nState, stateType );
1898*b1cdbd2cSJim Jagielski         pBGWidget = gWidgetData[nScreen].gBtnWidget;
1899*b1cdbd2cSJim Jagielski     }
1900*b1cdbd2cSJim Jagielski 	NWSetWidgetState( widget, nState, stateType );
1901*b1cdbd2cSJim Jagielski 
1902*b1cdbd2cSJim Jagielski 	gtk_paint_flat_box( pBGWidget->style, gdkDrawable, stateType, GTK_SHADOW_NONE,
1903*b1cdbd2cSJim Jagielski                         gdkRect, pBGWidget, "entry_bg",
1904*b1cdbd2cSJim Jagielski                         aEditBoxRect.Left(), aEditBoxRect.Top(),
1905*b1cdbd2cSJim Jagielski                         aEditBoxRect.GetWidth(), aEditBoxRect.GetHeight() );
1906*b1cdbd2cSJim Jagielski 	gtk_paint_shadow( widget->style, gdkDrawable, GTK_STATE_NORMAL, GTK_SHADOW_IN,
1907*b1cdbd2cSJim Jagielski                       gdkRect, widget, "entry",
1908*b1cdbd2cSJim Jagielski                       aEditBoxRect.Left(), aEditBoxRect.Top(),
1909*b1cdbd2cSJim Jagielski                       aEditBoxRect.GetWidth(), aEditBoxRect.GetHeight() );
1910*b1cdbd2cSJim Jagielski 
1911*b1cdbd2cSJim Jagielski }
1912*b1cdbd2cSJim Jagielski 
1913*b1cdbd2cSJim Jagielski 
1914*b1cdbd2cSJim Jagielski 
1915*b1cdbd2cSJim Jagielski //-------------------------------------
1916*b1cdbd2cSJim Jagielski 
NWPaintGTKSpinBox(ControlType nType,ControlPart nPart,const Rectangle & rControlRectangle,const clipList &,ControlState nState,const ImplControlValue & aValue,const OUString & rCaption)1917*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKSpinBox( ControlType nType, ControlPart nPart,
1918*b1cdbd2cSJim Jagielski                                         const Rectangle& rControlRectangle,
1919*b1cdbd2cSJim Jagielski                                         const clipList&,
1920*b1cdbd2cSJim Jagielski                                         ControlState nState,
1921*b1cdbd2cSJim Jagielski                                         const ImplControlValue& aValue,
1922*b1cdbd2cSJim Jagielski                                         const OUString& rCaption )
1923*b1cdbd2cSJim Jagielski {
1924*b1cdbd2cSJim Jagielski 	GdkPixmap	*		pixmap;
1925*b1cdbd2cSJim Jagielski 	Rectangle			pixmapRect;
1926*b1cdbd2cSJim Jagielski 	GtkStateType		stateType;
1927*b1cdbd2cSJim Jagielski 	GtkShadowType		shadowType;
1928*b1cdbd2cSJim Jagielski 	const SpinbuttonValue *	pSpinVal = (aValue.getType() == CTRL_SPINBUTTONS) ? static_cast<const SpinbuttonValue *>(&aValue) : NULL;
1929*b1cdbd2cSJim Jagielski 	Rectangle			upBtnRect;
1930*b1cdbd2cSJim Jagielski 	ControlPart		upBtnPart = PART_BUTTON_UP;
1931*b1cdbd2cSJim Jagielski 	ControlState		upBtnState = CTRL_STATE_ENABLED;
1932*b1cdbd2cSJim Jagielski 	Rectangle			downBtnRect;
1933*b1cdbd2cSJim Jagielski 	ControlPart		downBtnPart = PART_BUTTON_DOWN;
1934*b1cdbd2cSJim Jagielski 	ControlState		downBtnState = CTRL_STATE_ENABLED;
1935*b1cdbd2cSJim Jagielski 
1936*b1cdbd2cSJim Jagielski 	NWEnsureGTKButton( m_nScreen );
1937*b1cdbd2cSJim Jagielski 	NWEnsureGTKSpinButton( m_nScreen );
1938*b1cdbd2cSJim Jagielski 	NWEnsureGTKArrow( m_nScreen );
1939*b1cdbd2cSJim Jagielski 
1940*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
1941*b1cdbd2cSJim Jagielski 
1942*b1cdbd2cSJim Jagielski 	if ( pSpinVal )
1943*b1cdbd2cSJim Jagielski 	{
1944*b1cdbd2cSJim Jagielski 		upBtnPart = pSpinVal->mnUpperPart;
1945*b1cdbd2cSJim Jagielski 		upBtnState = pSpinVal->mnUpperState;
1946*b1cdbd2cSJim Jagielski 
1947*b1cdbd2cSJim Jagielski 		downBtnPart = pSpinVal->mnLowerPart;
1948*b1cdbd2cSJim Jagielski 		downBtnState = pSpinVal->mnLowerState;
1949*b1cdbd2cSJim Jagielski 	}
1950*b1cdbd2cSJim Jagielski 
1951*b1cdbd2cSJim Jagielski 	// CTRL_SPINBUTTONS pass their area in pSpinVal, not in rControlRectangle
1952*b1cdbd2cSJim Jagielski 	if ( nType == CTRL_SPINBUTTONS )
1953*b1cdbd2cSJim Jagielski 	{
1954*b1cdbd2cSJim Jagielski 		if ( !pSpinVal )
1955*b1cdbd2cSJim Jagielski 		{
1956*b1cdbd2cSJim Jagielski             std::fprintf( stderr, "Tried to draw CTRL_SPINBUTTONS, but the SpinButtons data structure didn't exist!\n" );
1957*b1cdbd2cSJim Jagielski 			return( false );
1958*b1cdbd2cSJim Jagielski 		}
1959*b1cdbd2cSJim Jagielski 		pixmapRect = pSpinVal->maUpperRect;
1960*b1cdbd2cSJim Jagielski 		pixmapRect.Union( pSpinVal->maLowerRect );
1961*b1cdbd2cSJim Jagielski 	}
1962*b1cdbd2cSJim Jagielski 	else
1963*b1cdbd2cSJim Jagielski 		pixmapRect = rControlRectangle;
1964*b1cdbd2cSJim Jagielski 
1965*b1cdbd2cSJim Jagielski 
1966*b1cdbd2cSJim Jagielski 	pixmap = NWGetPixmapFromScreen( pixmapRect );
1967*b1cdbd2cSJim Jagielski 	if ( !pixmap )
1968*b1cdbd2cSJim Jagielski 		return( sal_False );
1969*b1cdbd2cSJim Jagielski 
1970*b1cdbd2cSJim Jagielski 	upBtnRect = NWGetSpinButtonRect( m_nScreen, nType, upBtnPart, pixmapRect, upBtnState, aValue, rCaption );
1971*b1cdbd2cSJim Jagielski 	downBtnRect = NWGetSpinButtonRect( m_nScreen, nType, downBtnPart, pixmapRect, downBtnState, aValue, rCaption );
1972*b1cdbd2cSJim Jagielski 
1973*b1cdbd2cSJim Jagielski 	if ( (nType==CTRL_SPINBOX) && (nPart!=PART_ALL_BUTTONS) )
1974*b1cdbd2cSJim Jagielski 	{
1975*b1cdbd2cSJim Jagielski 		// Draw an edit field for SpinBoxes and ComboBoxes
1976*b1cdbd2cSJim Jagielski 		Rectangle aEditBoxRect( pixmapRect );
1977*b1cdbd2cSJim Jagielski 		aEditBoxRect.SetSize( Size( upBtnRect.Left() - pixmapRect.Left(), aEditBoxRect.GetHeight() ) );
1978*b1cdbd2cSJim Jagielski 		aEditBoxRect.setX( 0 );
1979*b1cdbd2cSJim Jagielski 		aEditBoxRect.setY( 0 );
1980*b1cdbd2cSJim Jagielski 
1981*b1cdbd2cSJim Jagielski 		NWPaintOneEditBox( m_nScreen, pixmap, NULL, nType, nPart, aEditBoxRect, nState, aValue, rCaption );
1982*b1cdbd2cSJim Jagielski 	}
1983*b1cdbd2cSJim Jagielski 
1984*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[m_nScreen].gSpinButtonWidget, nState, stateType );
1985*b1cdbd2cSJim Jagielski 	gtk_widget_style_get( gWidgetData[m_nScreen].gSpinButtonWidget, "shadow_type", &shadowType, (char *)NULL );
1986*b1cdbd2cSJim Jagielski 
1987*b1cdbd2cSJim Jagielski 	if ( shadowType != GTK_SHADOW_NONE )
1988*b1cdbd2cSJim Jagielski 	{
1989*b1cdbd2cSJim Jagielski 		Rectangle		shadowRect( upBtnRect );
1990*b1cdbd2cSJim Jagielski 
1991*b1cdbd2cSJim Jagielski 		shadowRect.Union( downBtnRect );
1992*b1cdbd2cSJim Jagielski 		gtk_paint_box( gWidgetData[m_nScreen].gSpinButtonWidget->style, pixmap, GTK_STATE_NORMAL, shadowType, NULL,
1993*b1cdbd2cSJim Jagielski 			gWidgetData[m_nScreen].gSpinButtonWidget, "spinbutton",
1994*b1cdbd2cSJim Jagielski 			(shadowRect.Left() - pixmapRect.Left()), (shadowRect.Top() - pixmapRect.Top()),
1995*b1cdbd2cSJim Jagielski 			shadowRect.GetWidth(), shadowRect.GetHeight() );
1996*b1cdbd2cSJim Jagielski 	}
1997*b1cdbd2cSJim Jagielski 
1998*b1cdbd2cSJim Jagielski 	NWPaintOneSpinButton( m_nScreen, pixmap, nType, upBtnPart, pixmapRect, upBtnState, aValue, rCaption );
1999*b1cdbd2cSJim Jagielski 	NWPaintOneSpinButton( m_nScreen, pixmap, nType, downBtnPart, pixmapRect, downBtnState, aValue, rCaption );
2000*b1cdbd2cSJim Jagielski 
2001*b1cdbd2cSJim Jagielski 	if( !NWRenderPixmapToScreen(pixmap, pixmapRect) )
2002*b1cdbd2cSJim Jagielski 	{
2003*b1cdbd2cSJim Jagielski 		g_object_unref( pixmap );
2004*b1cdbd2cSJim Jagielski 		return( sal_False );
2005*b1cdbd2cSJim Jagielski 	}
2006*b1cdbd2cSJim Jagielski 
2007*b1cdbd2cSJim Jagielski 	g_object_unref( pixmap );
2008*b1cdbd2cSJim Jagielski 	return( sal_True );
2009*b1cdbd2cSJim Jagielski }
2010*b1cdbd2cSJim Jagielski 
2011*b1cdbd2cSJim Jagielski //---
2012*b1cdbd2cSJim Jagielski 
NWGetSpinButtonRect(int nScreen,ControlType,ControlPart nPart,Rectangle aAreaRect,ControlState,const ImplControlValue &,const OUString &)2013*b1cdbd2cSJim Jagielski static Rectangle NWGetSpinButtonRect( int nScreen,
2014*b1cdbd2cSJim Jagielski                                       ControlType,
2015*b1cdbd2cSJim Jagielski 								      ControlPart			nPart,
2016*b1cdbd2cSJim Jagielski                                       Rectangle 			aAreaRect,
2017*b1cdbd2cSJim Jagielski                                       ControlState,
2018*b1cdbd2cSJim Jagielski                                       const ImplControlValue&,
2019*b1cdbd2cSJim Jagielski                                       const OUString& )
2020*b1cdbd2cSJim Jagielski {
2021*b1cdbd2cSJim Jagielski 	gint			buttonSize;
2022*b1cdbd2cSJim Jagielski 	Rectangle		buttonRect;
2023*b1cdbd2cSJim Jagielski 
2024*b1cdbd2cSJim Jagielski 	NWEnsureGTKSpinButton( nScreen );
2025*b1cdbd2cSJim Jagielski 
2026*b1cdbd2cSJim Jagielski 	buttonSize = MAX( PANGO_PIXELS( pango_font_description_get_size(GTK_WIDGET(gWidgetData[nScreen].gSpinButtonWidget)->style->font_desc) ),
2027*b1cdbd2cSJim Jagielski 				   MIN_SPIN_ARROW_WIDTH );
2028*b1cdbd2cSJim Jagielski 	buttonSize -= buttonSize % 2 - 1; /* force odd */
2029*b1cdbd2cSJim Jagielski 	buttonRect.SetSize( Size( buttonSize + 2 * gWidgetData[nScreen].gSpinButtonWidget->style->xthickness,
2030*b1cdbd2cSJim Jagielski                               buttonRect.GetHeight() ) );
2031*b1cdbd2cSJim Jagielski 	buttonRect.setX( aAreaRect.Left() + (aAreaRect.GetWidth() - buttonRect.GetWidth()) );
2032*b1cdbd2cSJim Jagielski 	if ( nPart == PART_BUTTON_UP )
2033*b1cdbd2cSJim Jagielski 	{
2034*b1cdbd2cSJim Jagielski 		buttonRect.setY( aAreaRect.Top() );
2035*b1cdbd2cSJim Jagielski 		buttonRect.Bottom() = buttonRect.Top() + (aAreaRect.GetHeight() / 2);
2036*b1cdbd2cSJim Jagielski 	}
2037*b1cdbd2cSJim Jagielski 	else if( nPart == PART_BUTTON_DOWN )
2038*b1cdbd2cSJim Jagielski 	{
2039*b1cdbd2cSJim Jagielski 		buttonRect.setY( aAreaRect.Top() + (aAreaRect.GetHeight() / 2) );
2040*b1cdbd2cSJim Jagielski 		buttonRect.Bottom() = aAreaRect.Bottom(); // cover area completely
2041*b1cdbd2cSJim Jagielski 	}
2042*b1cdbd2cSJim Jagielski     else
2043*b1cdbd2cSJim Jagielski     {
2044*b1cdbd2cSJim Jagielski         buttonRect.Right()  = buttonRect.Left()-1;
2045*b1cdbd2cSJim Jagielski         buttonRect.Left()   = aAreaRect.Left();
2046*b1cdbd2cSJim Jagielski         buttonRect.Top()    = aAreaRect.Top();
2047*b1cdbd2cSJim Jagielski         buttonRect.Bottom() = aAreaRect.Bottom();
2048*b1cdbd2cSJim Jagielski     }
2049*b1cdbd2cSJim Jagielski 
2050*b1cdbd2cSJim Jagielski 	return( buttonRect );
2051*b1cdbd2cSJim Jagielski }
2052*b1cdbd2cSJim Jagielski 
2053*b1cdbd2cSJim Jagielski //---
2054*b1cdbd2cSJim Jagielski 
NWPaintOneSpinButton(int nScreen,GdkPixmap * pixmap,ControlType nType,ControlPart nPart,Rectangle aAreaRect,ControlState nState,const ImplControlValue & aValue,const OUString & rCaption)2055*b1cdbd2cSJim Jagielski static void NWPaintOneSpinButton( int nScreen,
2056*b1cdbd2cSJim Jagielski                                   GdkPixmap*			pixmap,
2057*b1cdbd2cSJim Jagielski                                   ControlType			nType,
2058*b1cdbd2cSJim Jagielski                                   ControlPart			nPart,
2059*b1cdbd2cSJim Jagielski                                   Rectangle				aAreaRect,
2060*b1cdbd2cSJim Jagielski                                   ControlState			nState,
2061*b1cdbd2cSJim Jagielski                                   const ImplControlValue&	aValue,
2062*b1cdbd2cSJim Jagielski                                   const OUString&				rCaption )
2063*b1cdbd2cSJim Jagielski {
2064*b1cdbd2cSJim Jagielski 	Rectangle			buttonRect;
2065*b1cdbd2cSJim Jagielski 	GtkStateType		stateType;
2066*b1cdbd2cSJim Jagielski 	GtkShadowType		shadowType;
2067*b1cdbd2cSJim Jagielski 	Rectangle			arrowRect;
2068*b1cdbd2cSJim Jagielski 	gint				arrowSize;
2069*b1cdbd2cSJim Jagielski 
2070*b1cdbd2cSJim Jagielski 	NWEnsureGTKSpinButton( nScreen );
2071*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
2072*b1cdbd2cSJim Jagielski 
2073*b1cdbd2cSJim Jagielski 	buttonRect = NWGetSpinButtonRect( nScreen, nType, nPart, aAreaRect, nState, aValue, rCaption );
2074*b1cdbd2cSJim Jagielski 
2075*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[nScreen].gSpinButtonWidget, nState, stateType );
2076*b1cdbd2cSJim Jagielski 	gtk_paint_box( gWidgetData[nScreen].gSpinButtonWidget->style, pixmap, stateType, shadowType, NULL, gWidgetData[nScreen].gSpinButtonWidget,
2077*b1cdbd2cSJim Jagielski 			(nPart == PART_BUTTON_UP) ? "spinbutton_up" : "spinbutton_down",
2078*b1cdbd2cSJim Jagielski 			(buttonRect.Left() - aAreaRect.Left()), (buttonRect.Top() - aAreaRect.Top()),
2079*b1cdbd2cSJim Jagielski 			buttonRect.GetWidth(), buttonRect.GetHeight() );
2080*b1cdbd2cSJim Jagielski 
2081*b1cdbd2cSJim Jagielski 	arrowSize = (buttonRect.GetWidth() - (2 * gWidgetData[nScreen].gSpinButtonWidget->style->xthickness)) - 4;
2082*b1cdbd2cSJim Jagielski 	arrowSize -= arrowSize % 2 - 1; /* force odd */
2083*b1cdbd2cSJim Jagielski     arrowRect.SetSize( Size( arrowSize, arrowSize ) );
2084*b1cdbd2cSJim Jagielski 	arrowRect.setX( buttonRect.Left() + (buttonRect.GetWidth() - arrowRect.GetWidth()) / 2 );
2085*b1cdbd2cSJim Jagielski 	if ( nPart == PART_BUTTON_UP )
2086*b1cdbd2cSJim Jagielski 		arrowRect.setY( buttonRect.Top() + (buttonRect.GetHeight() - arrowRect.GetHeight()) / 2 + 1);
2087*b1cdbd2cSJim Jagielski 	else
2088*b1cdbd2cSJim Jagielski 		arrowRect.setY( buttonRect.Top() + (buttonRect.GetHeight() - arrowRect.GetHeight()) / 2 - 1);
2089*b1cdbd2cSJim Jagielski 
2090*b1cdbd2cSJim Jagielski 	gtk_paint_arrow( gWidgetData[nScreen].gSpinButtonWidget->style, pixmap, stateType, GTK_SHADOW_OUT, NULL, gWidgetData[nScreen].gSpinButtonWidget,
2091*b1cdbd2cSJim Jagielski 			"spinbutton", (nPart == PART_BUTTON_UP) ? GTK_ARROW_UP : GTK_ARROW_DOWN, sal_True,
2092*b1cdbd2cSJim Jagielski 			(arrowRect.Left() - aAreaRect.Left()), (arrowRect.Top() - aAreaRect.Top()),
2093*b1cdbd2cSJim Jagielski 			arrowRect.GetWidth(), arrowRect.GetHeight() );
2094*b1cdbd2cSJim Jagielski }
2095*b1cdbd2cSJim Jagielski 
2096*b1cdbd2cSJim Jagielski 
2097*b1cdbd2cSJim Jagielski //-------------------------------------
2098*b1cdbd2cSJim Jagielski 
NWPaintGTKComboBox(GdkDrawable * gdkDrawable,ControlType nType,ControlPart nPart,const Rectangle & rControlRectangle,const clipList & rClipList,ControlState nState,const ImplControlValue & aValue,const OUString & rCaption)2099*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKComboBox( GdkDrawable* gdkDrawable,
2100*b1cdbd2cSJim Jagielski                                          ControlType nType, ControlPart nPart,
2101*b1cdbd2cSJim Jagielski                                          const Rectangle& rControlRectangle,
2102*b1cdbd2cSJim Jagielski                                          const clipList& rClipList,
2103*b1cdbd2cSJim Jagielski                                          ControlState nState,
2104*b1cdbd2cSJim Jagielski                                          const ImplControlValue& aValue,
2105*b1cdbd2cSJim Jagielski                                          const OUString& rCaption )
2106*b1cdbd2cSJim Jagielski {
2107*b1cdbd2cSJim Jagielski 	Rectangle		pixmapRect;
2108*b1cdbd2cSJim Jagielski 	Rectangle		buttonRect;
2109*b1cdbd2cSJim Jagielski 	GtkStateType	stateType;
2110*b1cdbd2cSJim Jagielski 	GtkShadowType	shadowType;
2111*b1cdbd2cSJim Jagielski 	Rectangle		arrowRect;
2112*b1cdbd2cSJim Jagielski     gint			x,y;
2113*b1cdbd2cSJim Jagielski     GdkRectangle	clipRect;
2114*b1cdbd2cSJim Jagielski 
2115*b1cdbd2cSJim Jagielski 	NWEnsureGTKButton( m_nScreen );
2116*b1cdbd2cSJim Jagielski 	NWEnsureGTKArrow( m_nScreen );
2117*b1cdbd2cSJim Jagielski 	NWEnsureGTKCombo( m_nScreen );
2118*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
2119*b1cdbd2cSJim Jagielski 
2120*b1cdbd2cSJim Jagielski 	// Find the overall bounding rect of the buttons's drawing area,
2121*b1cdbd2cSJim Jagielski 	// plus its actual draw rect excluding adornment
2122*b1cdbd2cSJim Jagielski 	pixmapRect = rControlRectangle;
2123*b1cdbd2cSJim Jagielski     x = rControlRectangle.Left();
2124*b1cdbd2cSJim Jagielski     y = rControlRectangle.Top();
2125*b1cdbd2cSJim Jagielski 
2126*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[m_nScreen].gBtnWidget, nState, stateType );
2127*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[m_nScreen].gComboWidget, nState, stateType );
2128*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[m_nScreen].gArrowWidget, nState, stateType );
2129*b1cdbd2cSJim Jagielski 
2130*b1cdbd2cSJim Jagielski     buttonRect = NWGetComboBoxButtonRect( m_nScreen, nType, PART_BUTTON_DOWN, pixmapRect, nState, aValue, rCaption );
2131*b1cdbd2cSJim Jagielski     if( nPart == PART_BUTTON_DOWN )
2132*b1cdbd2cSJim Jagielski         buttonRect.Left() += 1;
2133*b1cdbd2cSJim Jagielski 
2134*b1cdbd2cSJim Jagielski 	Rectangle		aEditBoxRect( pixmapRect );
2135*b1cdbd2cSJim Jagielski 	aEditBoxRect.SetSize( Size( pixmapRect.GetWidth() - buttonRect.GetWidth(), aEditBoxRect.GetHeight() ) );
2136*b1cdbd2cSJim Jagielski 
2137*b1cdbd2cSJim Jagielski     #define ARROW_EXTENT		0.7
2138*b1cdbd2cSJim Jagielski 	arrowRect.SetSize( Size( (gint)(MIN_ARROW_SIZE * ARROW_EXTENT),
2139*b1cdbd2cSJim Jagielski 	                         (gint)(MIN_ARROW_SIZE * ARROW_EXTENT) ) );
2140*b1cdbd2cSJim Jagielski 	arrowRect.SetPos( Point( buttonRect.Left() + (gint)((buttonRect.GetWidth() - arrowRect.GetWidth()) / 2),
2141*b1cdbd2cSJim Jagielski                              buttonRect.Top() + (gint)((buttonRect.GetHeight() - arrowRect.GetHeight()) / 2) ) );
2142*b1cdbd2cSJim Jagielski 
2143*b1cdbd2cSJim Jagielski     for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it )
2144*b1cdbd2cSJim Jagielski     {
2145*b1cdbd2cSJim Jagielski         clipRect.x = it->Left();
2146*b1cdbd2cSJim Jagielski         clipRect.y = it->Top();
2147*b1cdbd2cSJim Jagielski         clipRect.width = it->GetWidth();
2148*b1cdbd2cSJim Jagielski         clipRect.height = it->GetHeight();
2149*b1cdbd2cSJim Jagielski 
2150*b1cdbd2cSJim Jagielski         if( nPart == PART_ENTIRE_CONTROL )
2151*b1cdbd2cSJim Jagielski             NWPaintOneEditBox( m_nScreen, gdkDrawable, &clipRect, nType, nPart, aEditBoxRect,
2152*b1cdbd2cSJim Jagielski                                nState, aValue, rCaption );
2153*b1cdbd2cSJim Jagielski 
2154*b1cdbd2cSJim Jagielski         // Buttons must paint opaque since some themes have alpha-channel enabled buttons
2155*b1cdbd2cSJim Jagielski         gtk_paint_flat_box( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable, GTK_STATE_NORMAL, GTK_SHADOW_NONE,
2156*b1cdbd2cSJim Jagielski                             &clipRect, m_pWindow, "base",
2157*b1cdbd2cSJim Jagielski                             x+(buttonRect.Left() - pixmapRect.Left()),
2158*b1cdbd2cSJim Jagielski                             y+(buttonRect.Top() - pixmapRect.Top()),
2159*b1cdbd2cSJim Jagielski                             buttonRect.GetWidth(), buttonRect.GetHeight() );
2160*b1cdbd2cSJim Jagielski         gtk_paint_box( GTK_COMBO(gWidgetData[m_nScreen].gComboWidget)->button->style, gdkDrawable, stateType, shadowType,
2161*b1cdbd2cSJim Jagielski                        &clipRect, GTK_COMBO(gWidgetData[m_nScreen].gComboWidget)->button, "button",
2162*b1cdbd2cSJim Jagielski                        x+(buttonRect.Left() - pixmapRect.Left()),
2163*b1cdbd2cSJim Jagielski                        y+(buttonRect.Top() - pixmapRect.Top()),
2164*b1cdbd2cSJim Jagielski                        buttonRect.GetWidth(), buttonRect.GetHeight() );
2165*b1cdbd2cSJim Jagielski 
2166*b1cdbd2cSJim Jagielski         gtk_paint_arrow( gWidgetData[m_nScreen].gArrowWidget->style, gdkDrawable, stateType, shadowType,
2167*b1cdbd2cSJim Jagielski                          &clipRect, gWidgetData[m_nScreen].gArrowWidget, "arrow", GTK_ARROW_DOWN, sal_True,
2168*b1cdbd2cSJim Jagielski                          x+(arrowRect.Left() - pixmapRect.Left()), y+(arrowRect.Top() - pixmapRect.Top()),
2169*b1cdbd2cSJim Jagielski                          arrowRect.GetWidth(), arrowRect.GetHeight() );
2170*b1cdbd2cSJim Jagielski     }
2171*b1cdbd2cSJim Jagielski 
2172*b1cdbd2cSJim Jagielski 	return( sal_True );
2173*b1cdbd2cSJim Jagielski }
2174*b1cdbd2cSJim Jagielski 
2175*b1cdbd2cSJim Jagielski //----
2176*b1cdbd2cSJim Jagielski 
NWGetComboBoxButtonRect(int nScreen,ControlType,ControlPart nPart,Rectangle aAreaRect,ControlState,const ImplControlValue &,const OUString &)2177*b1cdbd2cSJim Jagielski static Rectangle NWGetComboBoxButtonRect( int nScreen,
2178*b1cdbd2cSJim Jagielski                                           ControlType,
2179*b1cdbd2cSJim Jagielski 									      ControlPart nPart,
2180*b1cdbd2cSJim Jagielski                                           Rectangle				aAreaRect,
2181*b1cdbd2cSJim Jagielski                                           ControlState,
2182*b1cdbd2cSJim Jagielski                                           const ImplControlValue&,
2183*b1cdbd2cSJim Jagielski                                           const OUString& )
2184*b1cdbd2cSJim Jagielski {
2185*b1cdbd2cSJim Jagielski 	Rectangle	aButtonRect;
2186*b1cdbd2cSJim Jagielski 	gint		nArrowWidth;
2187*b1cdbd2cSJim Jagielski     gint        nButtonWidth;
2188*b1cdbd2cSJim Jagielski 	gint		nFocusWidth;
2189*b1cdbd2cSJim Jagielski 	gint		nFocusPad;
2190*b1cdbd2cSJim Jagielski 
2191*b1cdbd2cSJim Jagielski 	NWEnsureGTKArrow( nScreen );
2192*b1cdbd2cSJim Jagielski 
2193*b1cdbd2cSJim Jagielski 	// Grab some button style attributes
2194*b1cdbd2cSJim Jagielski 	gtk_widget_style_get( gWidgetData[nScreen].gDropdownWidget,
2195*b1cdbd2cSJim Jagielski                                   	"focus-line-width",	&nFocusWidth,
2196*b1cdbd2cSJim Jagielski 									"focus-padding", 	&nFocusPad, (char *)NULL );
2197*b1cdbd2cSJim Jagielski 
2198*b1cdbd2cSJim Jagielski 	nArrowWidth = MIN_ARROW_SIZE + (GTK_MISC(gWidgetData[nScreen].gArrowWidget)->xpad * 2);
2199*b1cdbd2cSJim Jagielski     nButtonWidth = nArrowWidth +
2200*b1cdbd2cSJim Jagielski                    ((BTN_CHILD_SPACING + gWidgetData[nScreen].gDropdownWidget->style->xthickness) * 2)
2201*b1cdbd2cSJim Jagielski 				   + (2 * (nFocusWidth+nFocusPad));
2202*b1cdbd2cSJim Jagielski     if( nPart == PART_BUTTON_DOWN )
2203*b1cdbd2cSJim Jagielski     {
2204*b1cdbd2cSJim Jagielski         aButtonRect.SetSize( Size( nButtonWidth, aAreaRect.GetHeight() ) );
2205*b1cdbd2cSJim Jagielski         aButtonRect.SetPos( Point( aAreaRect.Left() + aAreaRect.GetWidth() - nButtonWidth,
2206*b1cdbd2cSJim Jagielski                                    aAreaRect.Top() ) );
2207*b1cdbd2cSJim Jagielski     }
2208*b1cdbd2cSJim Jagielski     else if( nPart == PART_SUB_EDIT )
2209*b1cdbd2cSJim Jagielski     {
2210*b1cdbd2cSJim Jagielski         NWEnsureGTKCombo( nScreen );
2211*b1cdbd2cSJim Jagielski 
2212*b1cdbd2cSJim Jagielski         gint adjust_x = GTK_CONTAINER(gWidgetData[nScreen].gComboWidget)->border_width +
2213*b1cdbd2cSJim Jagielski                         nFocusWidth +
2214*b1cdbd2cSJim Jagielski                         nFocusPad;
2215*b1cdbd2cSJim Jagielski         gint adjust_y = adjust_x + gWidgetData[nScreen].gComboWidget->style->ythickness;
2216*b1cdbd2cSJim Jagielski         adjust_x     += gWidgetData[nScreen].gComboWidget->style->xthickness;
2217*b1cdbd2cSJim Jagielski         aButtonRect.SetSize( Size( aAreaRect.GetWidth() - nButtonWidth - 2 * adjust_x,
2218*b1cdbd2cSJim Jagielski                                    aAreaRect.GetHeight() - 2 * adjust_y ) );
2219*b1cdbd2cSJim Jagielski         Point aEditPos = aAreaRect.TopLeft();
2220*b1cdbd2cSJim Jagielski         aEditPos.X() += adjust_x;
2221*b1cdbd2cSJim Jagielski         aEditPos.Y() += adjust_y;
2222*b1cdbd2cSJim Jagielski         aButtonRect.SetPos( aEditPos );
2223*b1cdbd2cSJim Jagielski     }
2224*b1cdbd2cSJim Jagielski 
2225*b1cdbd2cSJim Jagielski 	return( aButtonRect );
2226*b1cdbd2cSJim Jagielski }
2227*b1cdbd2cSJim Jagielski 
2228*b1cdbd2cSJim Jagielski //-------------------------------------
2229*b1cdbd2cSJim Jagielski 
2230*b1cdbd2cSJim Jagielski 
2231*b1cdbd2cSJim Jagielski 
NWPaintGTKTabItem(ControlType nType,ControlPart,const Rectangle & rControlRectangle,const clipList &,ControlState nState,const ImplControlValue & aValue,const OUString &)2232*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKTabItem( ControlType nType, ControlPart,
2233*b1cdbd2cSJim Jagielski                                         const Rectangle& rControlRectangle,
2234*b1cdbd2cSJim Jagielski                                         const clipList&,
2235*b1cdbd2cSJim Jagielski                                         ControlState nState,
2236*b1cdbd2cSJim Jagielski                                         const ImplControlValue& aValue,
2237*b1cdbd2cSJim Jagielski                                         const OUString& )
2238*b1cdbd2cSJim Jagielski {
2239*b1cdbd2cSJim Jagielski     OSL_ASSERT( nType != CTRL_TAB_ITEM || aValue.getType() == CTRL_TAB_ITEM );
2240*b1cdbd2cSJim Jagielski 	GdkPixmap *	pixmap;
2241*b1cdbd2cSJim Jagielski 	Rectangle		pixmapRect;
2242*b1cdbd2cSJim Jagielski 	Rectangle		tabRect;
2243*b1cdbd2cSJim Jagielski 	GtkStateType	stateType;
2244*b1cdbd2cSJim Jagielski 	GtkShadowType	shadowType;
2245*b1cdbd2cSJim Jagielski     if( ! gWidgetData[ m_nScreen ].gCacheTabItems )
2246*b1cdbd2cSJim Jagielski     {
2247*b1cdbd2cSJim Jagielski         gWidgetData[ m_nScreen ].gCacheTabItems = new NWPixmapCache( m_nScreen );
2248*b1cdbd2cSJim Jagielski         gWidgetData[ m_nScreen ].gCacheTabPages = new NWPixmapCache( m_nScreen );
2249*b1cdbd2cSJim Jagielski     }
2250*b1cdbd2cSJim Jagielski     NWPixmapCache& aCacheItems = *gWidgetData[ m_nScreen ].gCacheTabItems;
2251*b1cdbd2cSJim Jagielski     NWPixmapCache& aCachePage = *gWidgetData[ m_nScreen ].gCacheTabPages;
2252*b1cdbd2cSJim Jagielski 
2253*b1cdbd2cSJim Jagielski     if( !aCacheItems.GetSize() )
2254*b1cdbd2cSJim Jagielski         aCacheItems.SetSize( 20 );
2255*b1cdbd2cSJim Jagielski     if( !aCachePage.GetSize() )
2256*b1cdbd2cSJim Jagielski         aCachePage.SetSize( 1 );
2257*b1cdbd2cSJim Jagielski 
2258*b1cdbd2cSJim Jagielski 	if ( (nType == CTRL_TAB_ITEM) && (aValue.getType() != CTRL_TAB_ITEM) )
2259*b1cdbd2cSJim Jagielski 	{
2260*b1cdbd2cSJim Jagielski 		return( false );
2261*b1cdbd2cSJim Jagielski 	}
2262*b1cdbd2cSJim Jagielski 
2263*b1cdbd2cSJim Jagielski 	NWEnsureGTKButton( m_nScreen );
2264*b1cdbd2cSJim Jagielski 	NWEnsureGTKNotebook( m_nScreen );
2265*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
2266*b1cdbd2cSJim Jagielski 
2267*b1cdbd2cSJim Jagielski 	// Find the overall bounding rect of the buttons's drawing area,
2268*b1cdbd2cSJim Jagielski 	// plus its actual draw rect excluding adornment
2269*b1cdbd2cSJim Jagielski 	pixmapRect = rControlRectangle;
2270*b1cdbd2cSJim Jagielski 	if ( nType == CTRL_TAB_ITEM )
2271*b1cdbd2cSJim Jagielski 	{
2272*b1cdbd2cSJim Jagielski         const TabitemValue *	pTabitemValue = static_cast<const TabitemValue *>(&aValue);
2273*b1cdbd2cSJim Jagielski 		if ( !pTabitemValue->isFirst() )
2274*b1cdbd2cSJim Jagielski 		{
2275*b1cdbd2cSJim Jagielski 			// GTK+ tabs overlap on the right edge (the top tab obscures the
2276*b1cdbd2cSJim Jagielski 			// left edge of the tab right "below" it, so adjust the rectangle
2277*b1cdbd2cSJim Jagielski 			// to draw tabs slightly large so the overlap happens
2278*b1cdbd2cSJim Jagielski 			pixmapRect.Move( -2, 0 );
2279*b1cdbd2cSJim Jagielski 			pixmapRect.SetSize( Size( pixmapRect.GetWidth() + 2, pixmapRect.GetHeight() ) );
2280*b1cdbd2cSJim Jagielski 		}
2281*b1cdbd2cSJim Jagielski 		if ( nState & CTRL_STATE_SELECTED )
2282*b1cdbd2cSJim Jagielski 		{
2283*b1cdbd2cSJim Jagielski 			// In GTK+, the selected tab is 2px taller than all other tabs
2284*b1cdbd2cSJim Jagielski 			pixmapRect.Move( 0, -2 );
2285*b1cdbd2cSJim Jagielski 			pixmapRect.Bottom() += 2;
2286*b1cdbd2cSJim Jagielski 			tabRect = pixmapRect;
2287*b1cdbd2cSJim Jagielski 			// Only draw over 1 pixel of the tab pane that this tab is drawn on top of.
2288*b1cdbd2cSJim Jagielski 			tabRect.Bottom() -= 1;
2289*b1cdbd2cSJim Jagielski 		}
2290*b1cdbd2cSJim Jagielski 		else
2291*b1cdbd2cSJim Jagielski 			tabRect = pixmapRect;
2292*b1cdbd2cSJim Jagielski 
2293*b1cdbd2cSJim Jagielski 		// Allow the tab to draw a right border if needed
2294*b1cdbd2cSJim Jagielski 		tabRect.Right() -= 1;
2295*b1cdbd2cSJim Jagielski 
2296*b1cdbd2cSJim Jagielski         // #129732# avoid degenerate cases which might lead to crashes
2297*b1cdbd2cSJim Jagielski         if( tabRect.GetWidth() <= 1 || tabRect.GetHeight() <= 1 )
2298*b1cdbd2cSJim Jagielski             return false;
2299*b1cdbd2cSJim Jagielski 	}
2300*b1cdbd2cSJim Jagielski 
2301*b1cdbd2cSJim Jagielski     if( nType == CTRL_TAB_ITEM )
2302*b1cdbd2cSJim Jagielski     {
2303*b1cdbd2cSJim Jagielski         if( aCacheItems.Find( nType, nState, pixmapRect, &pixmap ) )
2304*b1cdbd2cSJim Jagielski             return NWRenderPixmapToScreen( pixmap, pixmapRect );
2305*b1cdbd2cSJim Jagielski     }
2306*b1cdbd2cSJim Jagielski     else
2307*b1cdbd2cSJim Jagielski     {
2308*b1cdbd2cSJim Jagielski         if( aCachePage.Find( nType, nState, pixmapRect, &pixmap ) )
2309*b1cdbd2cSJim Jagielski             return NWRenderPixmapToScreen( pixmap, pixmapRect );
2310*b1cdbd2cSJim Jagielski     }
2311*b1cdbd2cSJim Jagielski 
2312*b1cdbd2cSJim Jagielski 
2313*b1cdbd2cSJim Jagielski //	gtk_widget_set_state( gWidgetData[m_nScreen].gNotebookWidget, stateType );
2314*b1cdbd2cSJim Jagielski 
2315*b1cdbd2cSJim Jagielski     pixmap = gdk_pixmap_new( NULL, pixmapRect.GetWidth(), pixmapRect.GetHeight(),
2316*b1cdbd2cSJim Jagielski                              GetX11SalData()->GetDisplay()->GetVisual( m_nScreen ).GetDepth() );
2317*b1cdbd2cSJim Jagielski     GdkRectangle paintRect;
2318*b1cdbd2cSJim Jagielski     paintRect.x = paintRect.y = 0;
2319*b1cdbd2cSJim Jagielski     paintRect.width = pixmapRect.GetWidth();
2320*b1cdbd2cSJim Jagielski     paintRect.height = pixmapRect.GetHeight();
2321*b1cdbd2cSJim Jagielski 
2322*b1cdbd2cSJim Jagielski     gtk_paint_flat_box( m_pWindow->style, pixmap, GTK_STATE_NORMAL,
2323*b1cdbd2cSJim Jagielski 		                GTK_SHADOW_NONE, &paintRect, m_pWindow, "base", 0, 0, -1, -1);
2324*b1cdbd2cSJim Jagielski 
2325*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[m_nScreen].gNotebookWidget, nState, stateType );
2326*b1cdbd2cSJim Jagielski 
2327*b1cdbd2cSJim Jagielski 	switch( nType )
2328*b1cdbd2cSJim Jagielski 	{
2329*b1cdbd2cSJim Jagielski 		case CTRL_TAB_BODY:
2330*b1cdbd2cSJim Jagielski 			break;
2331*b1cdbd2cSJim Jagielski 
2332*b1cdbd2cSJim Jagielski 		case CTRL_FIXEDBORDER:
2333*b1cdbd2cSJim Jagielski 		case CTRL_TAB_PANE:
2334*b1cdbd2cSJim Jagielski 			gtk_paint_box_gap( gWidgetData[m_nScreen].gNotebookWidget->style, pixmap, GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, gWidgetData[m_nScreen].gNotebookWidget,
2335*b1cdbd2cSJim Jagielski 				(char *)"notebook", 0, 0, pixmapRect.GetWidth(), pixmapRect.GetHeight(), GTK_POS_TOP, 0, 0 );
2336*b1cdbd2cSJim Jagielski 			break;
2337*b1cdbd2cSJim Jagielski 
2338*b1cdbd2cSJim Jagielski 		case CTRL_TAB_ITEM:
2339*b1cdbd2cSJim Jagielski 			stateType = ( nState & CTRL_STATE_SELECTED ) ? GTK_STATE_NORMAL : GTK_STATE_ACTIVE;
2340*b1cdbd2cSJim Jagielski 
2341*b1cdbd2cSJim Jagielski 			gtk_paint_extension( gWidgetData[m_nScreen].gNotebookWidget->style, pixmap, stateType, GTK_SHADOW_OUT, NULL, gWidgetData[m_nScreen].gNotebookWidget,
2342*b1cdbd2cSJim Jagielski 				(char *)"tab", (tabRect.Left() - pixmapRect.Left()), (tabRect.Top() - pixmapRect.Top()),
2343*b1cdbd2cSJim Jagielski 				tabRect.GetWidth(), tabRect.GetHeight(), GTK_POS_BOTTOM );
2344*b1cdbd2cSJim Jagielski 
2345*b1cdbd2cSJim Jagielski 			if ( nState & CTRL_STATE_SELECTED )
2346*b1cdbd2cSJim Jagielski 			{
2347*b1cdbd2cSJim Jagielski 				gtk_paint_flat_box( gWidgetData[m_nScreen].gNotebookWidget->style, pixmap, stateType, GTK_SHADOW_NONE, NULL, m_pWindow,
2348*b1cdbd2cSJim Jagielski 					(char *)"base", 0, (pixmapRect.GetHeight() - 1), pixmapRect.GetWidth(), 1 );
2349*b1cdbd2cSJim Jagielski 			}
2350*b1cdbd2cSJim Jagielski 			break;
2351*b1cdbd2cSJim Jagielski 
2352*b1cdbd2cSJim Jagielski 		default:
2353*b1cdbd2cSJim Jagielski 			break;
2354*b1cdbd2cSJim Jagielski 	}
2355*b1cdbd2cSJim Jagielski 
2356*b1cdbd2cSJim Jagielski 	// Crux seems to think it can make the pane without a left edge
2357*b1cdbd2cSJim Jagielski 	if ( nType == CTRL_FIXEDBORDER )
2358*b1cdbd2cSJim Jagielski 		pixmapRect.Move( 1, 0 );
2359*b1cdbd2cSJim Jagielski 
2360*b1cdbd2cSJim Jagielski     // cache data
2361*b1cdbd2cSJim Jagielski     if( nType == CTRL_TAB_ITEM )
2362*b1cdbd2cSJim Jagielski         aCacheItems.Fill( nType, nState, pixmapRect, pixmap );
2363*b1cdbd2cSJim Jagielski     else
2364*b1cdbd2cSJim Jagielski         aCachePage.Fill( nType, nState, pixmapRect, pixmap );
2365*b1cdbd2cSJim Jagielski 
2366*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = NWRenderPixmapToScreen(pixmap, pixmapRect);
2367*b1cdbd2cSJim Jagielski 	g_object_unref( pixmap );
2368*b1cdbd2cSJim Jagielski 	return bSuccess;
2369*b1cdbd2cSJim Jagielski }
2370*b1cdbd2cSJim Jagielski 
2371*b1cdbd2cSJim Jagielski //-------------------------------------
2372*b1cdbd2cSJim Jagielski 
NWPaintGTKListBox(GdkDrawable * gdkDrawable,ControlType nType,ControlPart nPart,const Rectangle & rControlRectangle,const clipList & rClipList,ControlState nState,const ImplControlValue & aValue,const OUString & rCaption)2373*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKListBox( GdkDrawable* gdkDrawable,
2374*b1cdbd2cSJim Jagielski                                         ControlType nType, ControlPart nPart,
2375*b1cdbd2cSJim Jagielski                                         const Rectangle& rControlRectangle,
2376*b1cdbd2cSJim Jagielski                                         const clipList& rClipList,
2377*b1cdbd2cSJim Jagielski                                         ControlState nState,
2378*b1cdbd2cSJim Jagielski                                         const ImplControlValue& aValue,
2379*b1cdbd2cSJim Jagielski                                         const OUString& rCaption )
2380*b1cdbd2cSJim Jagielski {
2381*b1cdbd2cSJim Jagielski 	Rectangle		pixmapRect;
2382*b1cdbd2cSJim Jagielski 	Rectangle		widgetRect;
2383*b1cdbd2cSJim Jagielski 	Rectangle		aIndicatorRect;
2384*b1cdbd2cSJim Jagielski 	GtkStateType	stateType;
2385*b1cdbd2cSJim Jagielski 	GtkShadowType	shadowType;
2386*b1cdbd2cSJim Jagielski 	gint			bInteriorFocus;
2387*b1cdbd2cSJim Jagielski 	gint			nFocusLineWidth;
2388*b1cdbd2cSJim Jagielski 	gint			nFocusPadding;
2389*b1cdbd2cSJim Jagielski     gint			x,y;
2390*b1cdbd2cSJim Jagielski     GdkRectangle    clipRect;
2391*b1cdbd2cSJim Jagielski 
2392*b1cdbd2cSJim Jagielski 	NWEnsureGTKButton( m_nScreen );
2393*b1cdbd2cSJim Jagielski 	NWEnsureGTKOptionMenu( m_nScreen );
2394*b1cdbd2cSJim Jagielski 	NWEnsureGTKScrolledWindow( m_nScreen );
2395*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
2396*b1cdbd2cSJim Jagielski 
2397*b1cdbd2cSJim Jagielski 	// Find the overall bounding rect of the buttons's drawing area,
2398*b1cdbd2cSJim Jagielski 	// plus its actual draw rect excluding adornment
2399*b1cdbd2cSJim Jagielski 	pixmapRect = rControlRectangle;
2400*b1cdbd2cSJim Jagielski 	if ( nPart == PART_WINDOW )
2401*b1cdbd2cSJim Jagielski 	{
2402*b1cdbd2cSJim Jagielski 		// Make the widget a _bit_ bigger
2403*b1cdbd2cSJim Jagielski 		pixmapRect.SetPos( Point( pixmapRect.Left() - 1,
2404*b1cdbd2cSJim Jagielski                                   pixmapRect.Top() - 1 ) );
2405*b1cdbd2cSJim Jagielski 		pixmapRect.SetSize( Size( pixmapRect.GetWidth() + 2,
2406*b1cdbd2cSJim Jagielski 		                          pixmapRect.GetHeight() + 2 ) );
2407*b1cdbd2cSJim Jagielski 	}
2408*b1cdbd2cSJim Jagielski 
2409*b1cdbd2cSJim Jagielski 	widgetRect = pixmapRect;
2410*b1cdbd2cSJim Jagielski     x = pixmapRect.Left();
2411*b1cdbd2cSJim Jagielski     y = pixmapRect.Top();
2412*b1cdbd2cSJim Jagielski 
2413*b1cdbd2cSJim Jagielski     // set up references to correct drawable and cliprect
2414*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[m_nScreen].gBtnWidget, nState, stateType );
2415*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[m_nScreen].gOptionMenuWidget, nState, stateType );
2416*b1cdbd2cSJim Jagielski 	NWSetWidgetState( gWidgetData[m_nScreen].gScrolledWindowWidget, nState, stateType );
2417*b1cdbd2cSJim Jagielski 
2418*b1cdbd2cSJim Jagielski 	if ( nPart != PART_WINDOW )
2419*b1cdbd2cSJim Jagielski 	{
2420*b1cdbd2cSJim Jagielski 		gtk_widget_style_get( gWidgetData[m_nScreen].gOptionMenuWidget,
2421*b1cdbd2cSJim Jagielski 			"interior_focus",	&bInteriorFocus,
2422*b1cdbd2cSJim Jagielski 			"focus_line_width",	&nFocusLineWidth,
2423*b1cdbd2cSJim Jagielski 			"focus_padding",	&nFocusPadding,
2424*b1cdbd2cSJim Jagielski 			(char *)NULL);
2425*b1cdbd2cSJim Jagielski     }
2426*b1cdbd2cSJim Jagielski 
2427*b1cdbd2cSJim Jagielski     for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it )
2428*b1cdbd2cSJim Jagielski     {
2429*b1cdbd2cSJim Jagielski         clipRect.x = it->Left();
2430*b1cdbd2cSJim Jagielski         clipRect.y = it->Top();
2431*b1cdbd2cSJim Jagielski         clipRect.width = it->GetWidth();
2432*b1cdbd2cSJim Jagielski         clipRect.height = it->GetHeight();
2433*b1cdbd2cSJim Jagielski 
2434*b1cdbd2cSJim Jagielski         if ( nPart != PART_WINDOW )
2435*b1cdbd2cSJim Jagielski         {
2436*b1cdbd2cSJim Jagielski             // Listboxes must paint opaque since some themes have alpha-channel enabled bodies
2437*b1cdbd2cSJim Jagielski             gtk_paint_flat_box( gWidgetData[m_nScreen].gBtnWidget->style, gdkDrawable, GTK_STATE_NORMAL, GTK_SHADOW_NONE,
2438*b1cdbd2cSJim Jagielski                                 &clipRect, m_pWindow, "base", x, y,
2439*b1cdbd2cSJim Jagielski                                 pixmapRect.GetWidth(), pixmapRect.GetHeight() );
2440*b1cdbd2cSJim Jagielski             gtk_paint_box( gWidgetData[m_nScreen].gOptionMenuWidget->style, gdkDrawable, stateType, shadowType, &clipRect,
2441*b1cdbd2cSJim Jagielski                            gWidgetData[m_nScreen].gOptionMenuWidget, "optionmenu",
2442*b1cdbd2cSJim Jagielski                            x+(widgetRect.Left() - pixmapRect.Left()),
2443*b1cdbd2cSJim Jagielski                            y+(widgetRect.Top() - pixmapRect.Top()),
2444*b1cdbd2cSJim Jagielski                            widgetRect.GetWidth(), widgetRect.GetHeight() );
2445*b1cdbd2cSJim Jagielski             aIndicatorRect = NWGetListBoxIndicatorRect( m_nScreen, nType, nPart, widgetRect, nState,
2446*b1cdbd2cSJim Jagielski                                                         aValue, rCaption );
2447*b1cdbd2cSJim Jagielski             gtk_paint_tab( gWidgetData[m_nScreen].gOptionMenuWidget->style, gdkDrawable, stateType, shadowType, &clipRect,
2448*b1cdbd2cSJim Jagielski                            gWidgetData[m_nScreen].gOptionMenuWidget, "optionmenutab",
2449*b1cdbd2cSJim Jagielski                            x+(aIndicatorRect.Left() - pixmapRect.Left()),
2450*b1cdbd2cSJim Jagielski                            y+(aIndicatorRect.Top() - pixmapRect.Top()),
2451*b1cdbd2cSJim Jagielski                            aIndicatorRect.GetWidth(), aIndicatorRect.GetHeight() );
2452*b1cdbd2cSJim Jagielski         }
2453*b1cdbd2cSJim Jagielski         else
2454*b1cdbd2cSJim Jagielski         {
2455*b1cdbd2cSJim Jagielski             shadowType = GTK_SHADOW_IN;
2456*b1cdbd2cSJim Jagielski 
2457*b1cdbd2cSJim Jagielski             gtk_paint_shadow( gWidgetData[m_nScreen].gScrolledWindowWidget->style, gdkDrawable, GTK_STATE_NORMAL, shadowType,
2458*b1cdbd2cSJim Jagielski                 &clipRect, gWidgetData[m_nScreen].gScrolledWindowWidget, "scrolled_window",
2459*b1cdbd2cSJim Jagielski                 x+(widgetRect.Left() - pixmapRect.Left()), y+(widgetRect.Top() - pixmapRect.Top()),
2460*b1cdbd2cSJim Jagielski                 widgetRect.GetWidth(), widgetRect.GetHeight() );
2461*b1cdbd2cSJim Jagielski         }
2462*b1cdbd2cSJim Jagielski     }
2463*b1cdbd2cSJim Jagielski 
2464*b1cdbd2cSJim Jagielski 	return( sal_True );
2465*b1cdbd2cSJim Jagielski }
2466*b1cdbd2cSJim Jagielski 
NWPaintGTKToolbar(GdkDrawable * gdkDrawable,ControlType,ControlPart nPart,const Rectangle & rControlRectangle,const clipList & rClipList,ControlState nState,const ImplControlValue & aValue,const OUString &)2467*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKToolbar(
2468*b1cdbd2cSJim Jagielski             GdkDrawable* gdkDrawable,
2469*b1cdbd2cSJim Jagielski             ControlType, ControlPart nPart,
2470*b1cdbd2cSJim Jagielski 			const Rectangle& rControlRectangle,
2471*b1cdbd2cSJim Jagielski             const clipList& rClipList,
2472*b1cdbd2cSJim Jagielski             ControlState nState, const ImplControlValue& aValue,
2473*b1cdbd2cSJim Jagielski 			const OUString& )
2474*b1cdbd2cSJim Jagielski {
2475*b1cdbd2cSJim Jagielski 	GtkStateType	stateType;
2476*b1cdbd2cSJim Jagielski 	GtkShadowType	shadowType;
2477*b1cdbd2cSJim Jagielski 	gint			x, y, w, h;
2478*b1cdbd2cSJim Jagielski     gint            g_x=0, g_y=0, g_w=10, g_h=10;
2479*b1cdbd2cSJim Jagielski     bool            bPaintButton = true;
2480*b1cdbd2cSJim Jagielski     GtkWidget*      pButtonWidget = gWidgetData[m_nScreen].gToolbarButtonWidget;
2481*b1cdbd2cSJim Jagielski     GdkRectangle	clipRect;
2482*b1cdbd2cSJim Jagielski 
2483*b1cdbd2cSJim Jagielski 	NWEnsureGTKToolbar( m_nScreen );
2484*b1cdbd2cSJim Jagielski     if( nPart == PART_BUTTON ) // toolbar buttons cannot focus in gtk
2485*b1cdbd2cSJim Jagielski         nState &= ~CTRL_STATE_FOCUSED;
2486*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
2487*b1cdbd2cSJim Jagielski 
2488*b1cdbd2cSJim Jagielski 	x = rControlRectangle.Left();
2489*b1cdbd2cSJim Jagielski     y = rControlRectangle.Top();
2490*b1cdbd2cSJim Jagielski 	w = rControlRectangle.GetWidth();
2491*b1cdbd2cSJim Jagielski 	h = rControlRectangle.GetHeight();
2492*b1cdbd2cSJim Jagielski 
2493*b1cdbd2cSJim Jagielski     // handle toolbar
2494*b1cdbd2cSJim Jagielski     if( nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT )
2495*b1cdbd2cSJim Jagielski     {
2496*b1cdbd2cSJim Jagielski 	    NWSetWidgetState( gWidgetData[m_nScreen].gToolbarWidget, nState, stateType );
2497*b1cdbd2cSJim Jagielski 
2498*b1cdbd2cSJim Jagielski         GTK_WIDGET_UNSET_FLAGS( gWidgetData[m_nScreen].gToolbarWidget, GTK_SENSITIVE );
2499*b1cdbd2cSJim Jagielski         if ( nState & CTRL_STATE_ENABLED )
2500*b1cdbd2cSJim Jagielski             GTK_WIDGET_SET_FLAGS( gWidgetData[m_nScreen].gToolbarWidget, GTK_SENSITIVE );
2501*b1cdbd2cSJim Jagielski 
2502*b1cdbd2cSJim Jagielski         if( nPart == PART_DRAW_BACKGROUND_HORZ )
2503*b1cdbd2cSJim Jagielski             gtk_toolbar_set_orientation( GTK_TOOLBAR(gWidgetData[m_nScreen].gToolbarWidget), GTK_ORIENTATION_HORIZONTAL );
2504*b1cdbd2cSJim Jagielski         else
2505*b1cdbd2cSJim Jagielski             gtk_toolbar_set_orientation( GTK_TOOLBAR(gWidgetData[m_nScreen].gToolbarWidget), GTK_ORIENTATION_VERTICAL );
2506*b1cdbd2cSJim Jagielski     }
2507*b1cdbd2cSJim Jagielski     // handle grip
2508*b1cdbd2cSJim Jagielski     else if( nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT )
2509*b1cdbd2cSJim Jagielski     {
2510*b1cdbd2cSJim Jagielski 	    NWSetWidgetState( gWidgetData[m_nScreen].gHandleBoxWidget, nState, stateType );
2511*b1cdbd2cSJim Jagielski 
2512*b1cdbd2cSJim Jagielski         GTK_WIDGET_UNSET_FLAGS( gWidgetData[m_nScreen].gHandleBoxWidget, GTK_SENSITIVE );
2513*b1cdbd2cSJim Jagielski         if ( nState & CTRL_STATE_ENABLED )
2514*b1cdbd2cSJim Jagielski             GTK_WIDGET_SET_FLAGS( gWidgetData[m_nScreen].gHandleBoxWidget, GTK_SENSITIVE );
2515*b1cdbd2cSJim Jagielski 
2516*b1cdbd2cSJim Jagielski         gtk_handle_box_set_shadow_type( GTK_HANDLE_BOX(gWidgetData[m_nScreen].gHandleBoxWidget), shadowType );
2517*b1cdbd2cSJim Jagielski 
2518*b1cdbd2cSJim Jagielski         // evaluate grip rect
2519*b1cdbd2cSJim Jagielski         if( aValue.getType() == CTRL_TOOLBAR )
2520*b1cdbd2cSJim Jagielski         {
2521*b1cdbd2cSJim Jagielski             const ToolbarValue* pVal = static_cast<const ToolbarValue*>(&aValue);
2522*b1cdbd2cSJim Jagielski             g_x = pVal->maGripRect.Left();
2523*b1cdbd2cSJim Jagielski             g_y = pVal->maGripRect.Top();
2524*b1cdbd2cSJim Jagielski             g_w = pVal->maGripRect.GetWidth();
2525*b1cdbd2cSJim Jagielski             g_h = pVal->maGripRect.GetHeight();
2526*b1cdbd2cSJim Jagielski         }
2527*b1cdbd2cSJim Jagielski     }
2528*b1cdbd2cSJim Jagielski     // handle button
2529*b1cdbd2cSJim Jagielski     else if( nPart == PART_BUTTON )
2530*b1cdbd2cSJim Jagielski     {
2531*b1cdbd2cSJim Jagielski         bPaintButton =
2532*b1cdbd2cSJim Jagielski             (GTK_BUTTON(pButtonWidget)->relief != GTK_RELIEF_NONE)
2533*b1cdbd2cSJim Jagielski             || (nState & CTRL_STATE_PRESSED)
2534*b1cdbd2cSJim Jagielski 		    || (nState & CTRL_STATE_ROLLOVER);
2535*b1cdbd2cSJim Jagielski         if( aValue.getTristateVal() == BUTTONVALUE_ON )
2536*b1cdbd2cSJim Jagielski         {
2537*b1cdbd2cSJim Jagielski             pButtonWidget = gWidgetData[m_nScreen].gToolbarToggleWidget;
2538*b1cdbd2cSJim Jagielski             shadowType = GTK_SHADOW_IN;
2539*b1cdbd2cSJim Jagielski             stateType = GTK_STATE_ACTIVE;
2540*b1cdbd2cSJim Jagielski             // special case stateType value for depressed toggle buttons
2541*b1cdbd2cSJim Jagielski             // cf. gtk+/gtk/gtktogglebutton.c (gtk_toggle_button_update_state)
2542*b1cdbd2cSJim Jagielski             if( (nState & (CTRL_STATE_ROLLOVER|CTRL_STATE_PRESSED)) )
2543*b1cdbd2cSJim Jagielski             {
2544*b1cdbd2cSJim Jagielski                 stateType = GTK_STATE_PRELIGHT;
2545*b1cdbd2cSJim Jagielski                 shadowType = GTK_SHADOW_OUT;
2546*b1cdbd2cSJim Jagielski             }
2547*b1cdbd2cSJim Jagielski             bPaintButton = true;
2548*b1cdbd2cSJim Jagielski         }
2549*b1cdbd2cSJim Jagielski         else
2550*b1cdbd2cSJim Jagielski             stateType = GTK_STATE_PRELIGHT; // only for bPaintButton = true, in which case always rollver is meant
2551*b1cdbd2cSJim Jagielski 
2552*b1cdbd2cSJim Jagielski         NWSetWidgetState( pButtonWidget, nState, stateType );
2553*b1cdbd2cSJim Jagielski         gtk_widget_ensure_style( pButtonWidget );
2554*b1cdbd2cSJim Jagielski     }
2555*b1cdbd2cSJim Jagielski 
2556*b1cdbd2cSJim Jagielski     for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it )
2557*b1cdbd2cSJim Jagielski     {
2558*b1cdbd2cSJim Jagielski         clipRect.x = it->Left();
2559*b1cdbd2cSJim Jagielski         clipRect.y = it->Top();
2560*b1cdbd2cSJim Jagielski         clipRect.width = it->GetWidth();
2561*b1cdbd2cSJim Jagielski         clipRect.height = it->GetHeight();
2562*b1cdbd2cSJim Jagielski 
2563*b1cdbd2cSJim Jagielski         // draw toolbar
2564*b1cdbd2cSJim Jagielski         if( nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT )
2565*b1cdbd2cSJim Jagielski         {
2566*b1cdbd2cSJim Jagielski             gtk_paint_flat_box( gWidgetData[m_nScreen].gToolbarWidget->style,
2567*b1cdbd2cSJim Jagielski                                 gdkDrawable,
2568*b1cdbd2cSJim Jagielski                                 (GtkStateType)GTK_STATE_NORMAL,
2569*b1cdbd2cSJim Jagielski                                 GTK_SHADOW_NONE,
2570*b1cdbd2cSJim Jagielski                                 &clipRect,
2571*b1cdbd2cSJim Jagielski                                 gWidgetData[m_nScreen].gToolbarWidget,
2572*b1cdbd2cSJim Jagielski                                 "base",
2573*b1cdbd2cSJim Jagielski                                 x, y, w, h );
2574*b1cdbd2cSJim Jagielski             gtk_paint_box( gWidgetData[m_nScreen].gToolbarWidget->style,
2575*b1cdbd2cSJim Jagielski                            gdkDrawable,
2576*b1cdbd2cSJim Jagielski                            stateType,
2577*b1cdbd2cSJim Jagielski                            shadowType,
2578*b1cdbd2cSJim Jagielski                            &clipRect,
2579*b1cdbd2cSJim Jagielski                            gWidgetData[m_nScreen].gToolbarWidget,
2580*b1cdbd2cSJim Jagielski                            "toolbar",
2581*b1cdbd2cSJim Jagielski                            x, y, w, h );
2582*b1cdbd2cSJim Jagielski         }
2583*b1cdbd2cSJim Jagielski         // draw grip
2584*b1cdbd2cSJim Jagielski         else if( nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT )
2585*b1cdbd2cSJim Jagielski         {
2586*b1cdbd2cSJim Jagielski             gtk_paint_handle( gWidgetData[m_nScreen].gHandleBoxWidget->style,
2587*b1cdbd2cSJim Jagielski                               gdkDrawable,
2588*b1cdbd2cSJim Jagielski                               GTK_STATE_NORMAL,
2589*b1cdbd2cSJim Jagielski                               GTK_SHADOW_OUT,
2590*b1cdbd2cSJim Jagielski                               &clipRect,
2591*b1cdbd2cSJim Jagielski                               gWidgetData[m_nScreen].gHandleBoxWidget,
2592*b1cdbd2cSJim Jagielski                               "handlebox",
2593*b1cdbd2cSJim Jagielski                               g_x, g_y, g_w, g_h,
2594*b1cdbd2cSJim Jagielski                               nPart == PART_THUMB_HORZ ?
2595*b1cdbd2cSJim Jagielski                               GTK_ORIENTATION_HORIZONTAL :
2596*b1cdbd2cSJim Jagielski                               GTK_ORIENTATION_VERTICAL
2597*b1cdbd2cSJim Jagielski                               );
2598*b1cdbd2cSJim Jagielski         }
2599*b1cdbd2cSJim Jagielski         // draw button
2600*b1cdbd2cSJim Jagielski         else if( nPart == PART_BUTTON )
2601*b1cdbd2cSJim Jagielski         {
2602*b1cdbd2cSJim Jagielski             if( bPaintButton )
2603*b1cdbd2cSJim Jagielski             {
2604*b1cdbd2cSJim Jagielski                 gtk_paint_box( pButtonWidget->style, gdkDrawable,
2605*b1cdbd2cSJim Jagielski                                stateType,
2606*b1cdbd2cSJim Jagielski                                shadowType,
2607*b1cdbd2cSJim Jagielski                                &clipRect,
2608*b1cdbd2cSJim Jagielski                                pButtonWidget, "button", x, y, w, h );
2609*b1cdbd2cSJim Jagielski             }
2610*b1cdbd2cSJim Jagielski         }
2611*b1cdbd2cSJim Jagielski     }
2612*b1cdbd2cSJim Jagielski 
2613*b1cdbd2cSJim Jagielski 	return( sal_True );
2614*b1cdbd2cSJim Jagielski }
2615*b1cdbd2cSJim Jagielski 
2616*b1cdbd2cSJim Jagielski //----
2617*b1cdbd2cSJim Jagielski 
NWPaintGTKMenubar(GdkDrawable * gdkDrawable,ControlType,ControlPart nPart,const Rectangle & rControlRectangle,const clipList & rClipList,ControlState nState,const ImplControlValue &,const OUString &)2618*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKMenubar(
2619*b1cdbd2cSJim Jagielski             GdkDrawable* gdkDrawable,
2620*b1cdbd2cSJim Jagielski             ControlType, ControlPart nPart,
2621*b1cdbd2cSJim Jagielski 			const Rectangle& rControlRectangle,
2622*b1cdbd2cSJim Jagielski             const clipList& rClipList,
2623*b1cdbd2cSJim Jagielski             ControlState nState, const ImplControlValue&,
2624*b1cdbd2cSJim Jagielski 			const OUString& )
2625*b1cdbd2cSJim Jagielski {
2626*b1cdbd2cSJim Jagielski 	GtkStateType	stateType;
2627*b1cdbd2cSJim Jagielski 	GtkShadowType	shadowType;
2628*b1cdbd2cSJim Jagielski     GtkShadowType   selected_shadow_type = GTK_SHADOW_OUT;
2629*b1cdbd2cSJim Jagielski 	gint			x, y, w, h;
2630*b1cdbd2cSJim Jagielski     GdkRectangle	clipRect;
2631*b1cdbd2cSJim Jagielski 
2632*b1cdbd2cSJim Jagielski 	NWEnsureGTKMenubar( m_nScreen );
2633*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
2634*b1cdbd2cSJim Jagielski 
2635*b1cdbd2cSJim Jagielski 	x = rControlRectangle.Left();
2636*b1cdbd2cSJim Jagielski     y = rControlRectangle.Top();
2637*b1cdbd2cSJim Jagielski 	w = rControlRectangle.GetWidth();
2638*b1cdbd2cSJim Jagielski 	h = rControlRectangle.GetHeight();
2639*b1cdbd2cSJim Jagielski 
2640*b1cdbd2cSJim Jagielski     if( nPart == PART_MENU_ITEM )
2641*b1cdbd2cSJim Jagielski     {
2642*b1cdbd2cSJim Jagielski         if( nState & (CTRL_STATE_SELECTED|CTRL_STATE_ROLLOVER) )
2643*b1cdbd2cSJim Jagielski         {
2644*b1cdbd2cSJim Jagielski             gtk_widget_style_get( gWidgetData[m_nScreen].gMenuItemMenubarWidget,
2645*b1cdbd2cSJim Jagielski                                   "selected_shadow_type", &selected_shadow_type,
2646*b1cdbd2cSJim Jagielski                                   (char *)NULL);
2647*b1cdbd2cSJim Jagielski         }
2648*b1cdbd2cSJim Jagielski     }
2649*b1cdbd2cSJim Jagielski 
2650*b1cdbd2cSJim Jagielski     for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it )
2651*b1cdbd2cSJim Jagielski     {
2652*b1cdbd2cSJim Jagielski         clipRect.x = it->Left();
2653*b1cdbd2cSJim Jagielski         clipRect.y = it->Top();
2654*b1cdbd2cSJim Jagielski         clipRect.width = it->GetWidth();
2655*b1cdbd2cSJim Jagielski         clipRect.height = it->GetHeight();
2656*b1cdbd2cSJim Jagielski 
2657*b1cdbd2cSJim Jagielski         // handle Menubar
2658*b1cdbd2cSJim Jagielski         if( nPart == PART_ENTIRE_CONTROL )
2659*b1cdbd2cSJim Jagielski         {
2660*b1cdbd2cSJim Jagielski             NWSetWidgetState( gWidgetData[m_nScreen].gMenubarWidget, nState, stateType );
2661*b1cdbd2cSJim Jagielski 
2662*b1cdbd2cSJim Jagielski             GTK_WIDGET_UNSET_FLAGS( gWidgetData[m_nScreen].gMenubarWidget, GTK_SENSITIVE );
2663*b1cdbd2cSJim Jagielski             if ( nState & CTRL_STATE_ENABLED )
2664*b1cdbd2cSJim Jagielski                 GTK_WIDGET_SET_FLAGS( gWidgetData[m_nScreen].gMenubarWidget, GTK_SENSITIVE );
2665*b1cdbd2cSJim Jagielski 
2666*b1cdbd2cSJim Jagielski             // #118704# for translucent menubar styles paint background first
2667*b1cdbd2cSJim Jagielski             gtk_paint_flat_box( gWidgetData[m_nScreen].gMenubarWidget->style,
2668*b1cdbd2cSJim Jagielski                                 gdkDrawable,
2669*b1cdbd2cSJim Jagielski                                 GTK_STATE_NORMAL,
2670*b1cdbd2cSJim Jagielski                                 GTK_SHADOW_NONE,
2671*b1cdbd2cSJim Jagielski                                 &clipRect,
2672*b1cdbd2cSJim Jagielski                                 GTK_WIDGET(m_pWindow),
2673*b1cdbd2cSJim Jagielski                                 "base",
2674*b1cdbd2cSJim Jagielski                                 x, y, w, h );
2675*b1cdbd2cSJim Jagielski             gtk_paint_box( gWidgetData[m_nScreen].gMenubarWidget->style,
2676*b1cdbd2cSJim Jagielski                            gdkDrawable,
2677*b1cdbd2cSJim Jagielski                            stateType,
2678*b1cdbd2cSJim Jagielski                            shadowType,
2679*b1cdbd2cSJim Jagielski                            &clipRect,
2680*b1cdbd2cSJim Jagielski                            gWidgetData[m_nScreen].gMenubarWidget,
2681*b1cdbd2cSJim Jagielski                            "menubar",
2682*b1cdbd2cSJim Jagielski                            x, y, w, h );
2683*b1cdbd2cSJim Jagielski         }
2684*b1cdbd2cSJim Jagielski         else if( nPart == PART_MENU_ITEM )
2685*b1cdbd2cSJim Jagielski         {
2686*b1cdbd2cSJim Jagielski             if( nState & (CTRL_STATE_SELECTED|CTRL_STATE_ROLLOVER) )
2687*b1cdbd2cSJim Jagielski             {
2688*b1cdbd2cSJim Jagielski                 gtk_paint_box( gWidgetData[m_nScreen].gMenuItemMenubarWidget->style,
2689*b1cdbd2cSJim Jagielski                                gdkDrawable,
2690*b1cdbd2cSJim Jagielski                                GTK_STATE_PRELIGHT,
2691*b1cdbd2cSJim Jagielski                                selected_shadow_type,
2692*b1cdbd2cSJim Jagielski                                &clipRect,
2693*b1cdbd2cSJim Jagielski                                gWidgetData[m_nScreen].gMenuItemMenubarWidget,
2694*b1cdbd2cSJim Jagielski                                "menuitem",
2695*b1cdbd2cSJim Jagielski                                x, y, w, h);
2696*b1cdbd2cSJim Jagielski             }
2697*b1cdbd2cSJim Jagielski         }
2698*b1cdbd2cSJim Jagielski     }
2699*b1cdbd2cSJim Jagielski 
2700*b1cdbd2cSJim Jagielski 	return( sal_True );
2701*b1cdbd2cSJim Jagielski }
2702*b1cdbd2cSJim Jagielski 
NWPaintGTKPopupMenu(GdkDrawable * gdkDrawable,ControlType,ControlPart nPart,const Rectangle & rControlRectangle,const clipList & rClipList,ControlState nState,const ImplControlValue &,const OUString &)2703*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKPopupMenu(
2704*b1cdbd2cSJim Jagielski             GdkDrawable* gdkDrawable,
2705*b1cdbd2cSJim Jagielski             ControlType, ControlPart nPart,
2706*b1cdbd2cSJim Jagielski 			const Rectangle& rControlRectangle,
2707*b1cdbd2cSJim Jagielski             const clipList& rClipList,
2708*b1cdbd2cSJim Jagielski             ControlState nState, const ImplControlValue&,
2709*b1cdbd2cSJim Jagielski 			const OUString& )
2710*b1cdbd2cSJim Jagielski {
2711*b1cdbd2cSJim Jagielski     // #i50745# gtk does not draw disabled menu entries (and crux theme
2712*b1cdbd2cSJim Jagielski     // even crashes), draw them using vcl functionality.
2713*b1cdbd2cSJim Jagielski     if( nPart == PART_MENU_ITEM && ! (nState & CTRL_STATE_ENABLED) )
2714*b1cdbd2cSJim Jagielski         return sal_False;
2715*b1cdbd2cSJim Jagielski 
2716*b1cdbd2cSJim Jagielski 	GtkStateType	stateType;
2717*b1cdbd2cSJim Jagielski 	GtkShadowType	shadowType;
2718*b1cdbd2cSJim Jagielski     GtkShadowType   selected_shadow_type = GTK_SHADOW_OUT;
2719*b1cdbd2cSJim Jagielski 	gint			x, y, w, h;
2720*b1cdbd2cSJim Jagielski     GdkRectangle	clipRect;
2721*b1cdbd2cSJim Jagielski 
2722*b1cdbd2cSJim Jagielski 	NWEnsureGTKMenu( m_nScreen );
2723*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
2724*b1cdbd2cSJim Jagielski 
2725*b1cdbd2cSJim Jagielski 	x = rControlRectangle.Left();
2726*b1cdbd2cSJim Jagielski     y = rControlRectangle.Top();
2727*b1cdbd2cSJim Jagielski 	w = rControlRectangle.GetWidth();
2728*b1cdbd2cSJim Jagielski 	h = rControlRectangle.GetHeight();
2729*b1cdbd2cSJim Jagielski 
2730*b1cdbd2cSJim Jagielski     if( nPart == PART_MENU_ITEM &&
2731*b1cdbd2cSJim Jagielski         ( nState & (CTRL_STATE_SELECTED|CTRL_STATE_ROLLOVER) ) )
2732*b1cdbd2cSJim Jagielski     {
2733*b1cdbd2cSJim Jagielski         gtk_widget_style_get( gWidgetData[m_nScreen].gMenuItemMenuWidget,
2734*b1cdbd2cSJim Jagielski                               "selected_shadow_type", &selected_shadow_type,
2735*b1cdbd2cSJim Jagielski                               (char *)NULL);
2736*b1cdbd2cSJim Jagielski     }
2737*b1cdbd2cSJim Jagielski 
2738*b1cdbd2cSJim Jagielski     NWSetWidgetState( gWidgetData[m_nScreen].gMenuWidget, nState, stateType );
2739*b1cdbd2cSJim Jagielski 
2740*b1cdbd2cSJim Jagielski     GTK_WIDGET_UNSET_FLAGS( gWidgetData[m_nScreen].gMenuWidget, GTK_SENSITIVE );
2741*b1cdbd2cSJim Jagielski     if ( nState & CTRL_STATE_ENABLED )
2742*b1cdbd2cSJim Jagielski         GTK_WIDGET_SET_FLAGS( gWidgetData[m_nScreen].gMenuWidget, GTK_SENSITIVE );
2743*b1cdbd2cSJim Jagielski 
2744*b1cdbd2cSJim Jagielski     for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it )
2745*b1cdbd2cSJim Jagielski     {
2746*b1cdbd2cSJim Jagielski         clipRect.x = it->Left();
2747*b1cdbd2cSJim Jagielski         clipRect.y = it->Top();
2748*b1cdbd2cSJim Jagielski         clipRect.width = it->GetWidth();
2749*b1cdbd2cSJim Jagielski         clipRect.height = it->GetHeight();
2750*b1cdbd2cSJim Jagielski 
2751*b1cdbd2cSJim Jagielski         if( nPart == PART_ENTIRE_CONTROL )
2752*b1cdbd2cSJim Jagielski         {
2753*b1cdbd2cSJim Jagielski             // #118704# for translucent menubar styles paint background first
2754*b1cdbd2cSJim Jagielski             gtk_paint_flat_box( gWidgetData[m_nScreen].gMenuWidget->style,
2755*b1cdbd2cSJim Jagielski                                 gdkDrawable,
2756*b1cdbd2cSJim Jagielski                                 GTK_STATE_NORMAL,
2757*b1cdbd2cSJim Jagielski                                 GTK_SHADOW_NONE,
2758*b1cdbd2cSJim Jagielski                                 &clipRect,
2759*b1cdbd2cSJim Jagielski                                 GTK_WIDGET(m_pWindow),
2760*b1cdbd2cSJim Jagielski                                 "base",
2761*b1cdbd2cSJim Jagielski                                 x, y, w, h );
2762*b1cdbd2cSJim Jagielski             gtk_paint_box( gWidgetData[m_nScreen].gMenuWidget->style,
2763*b1cdbd2cSJim Jagielski                            gdkDrawable,
2764*b1cdbd2cSJim Jagielski                            GTK_STATE_NORMAL,
2765*b1cdbd2cSJim Jagielski                            GTK_SHADOW_OUT,
2766*b1cdbd2cSJim Jagielski                            &clipRect,
2767*b1cdbd2cSJim Jagielski                            gWidgetData[m_nScreen].gMenuWidget,
2768*b1cdbd2cSJim Jagielski                            "menu",
2769*b1cdbd2cSJim Jagielski                            x, y, w, h );
2770*b1cdbd2cSJim Jagielski         }
2771*b1cdbd2cSJim Jagielski         else if( nPart == PART_MENU_ITEM )
2772*b1cdbd2cSJim Jagielski         {
2773*b1cdbd2cSJim Jagielski             if( nState & (CTRL_STATE_SELECTED|CTRL_STATE_ROLLOVER) )
2774*b1cdbd2cSJim Jagielski             {
2775*b1cdbd2cSJim Jagielski                 if( nState & CTRL_STATE_ENABLED )
2776*b1cdbd2cSJim Jagielski                 gtk_paint_box( gWidgetData[m_nScreen].gMenuItemMenuWidget->style,
2777*b1cdbd2cSJim Jagielski                                gdkDrawable,
2778*b1cdbd2cSJim Jagielski                                GTK_STATE_PRELIGHT,
2779*b1cdbd2cSJim Jagielski                                selected_shadow_type,
2780*b1cdbd2cSJim Jagielski                                &clipRect,
2781*b1cdbd2cSJim Jagielski                                gWidgetData[m_nScreen].gMenuItemMenuWidget,
2782*b1cdbd2cSJim Jagielski                                "menuitem",
2783*b1cdbd2cSJim Jagielski                                x, y, w, h);
2784*b1cdbd2cSJim Jagielski             }
2785*b1cdbd2cSJim Jagielski         }
2786*b1cdbd2cSJim Jagielski         else if( nPart == PART_MENU_ITEM_CHECK_MARK || nPart == PART_MENU_ITEM_RADIO_MARK )
2787*b1cdbd2cSJim Jagielski         {
2788*b1cdbd2cSJim Jagielski             GtkWidget* pWidget = (nPart == PART_MENU_ITEM_CHECK_MARK) ?
2789*b1cdbd2cSJim Jagielski                                  gWidgetData[m_nScreen].gMenuItemCheckMenuWidget :
2790*b1cdbd2cSJim Jagielski                                  gWidgetData[m_nScreen].gMenuItemRadioMenuWidget;
2791*b1cdbd2cSJim Jagielski 
2792*b1cdbd2cSJim Jagielski             GtkStateType nStateType = GTK_STATE_NORMAL;
2793*b1cdbd2cSJim Jagielski             GtkShadowType nShadowType;
2794*b1cdbd2cSJim Jagielski 
2795*b1cdbd2cSJim Jagielski             if ( nState & CTRL_STATE_SELECTED )
2796*b1cdbd2cSJim Jagielski                 nStateType = GTK_STATE_PRELIGHT;
2797*b1cdbd2cSJim Jagielski 
2798*b1cdbd2cSJim Jagielski             NWSetWidgetState( pWidget, nState, nStateType );
2799*b1cdbd2cSJim Jagielski 
2800*b1cdbd2cSJim Jagielski             if ( nState & CTRL_STATE_PRESSED )
2801*b1cdbd2cSJim Jagielski                 nShadowType = GTK_SHADOW_IN;
2802*b1cdbd2cSJim Jagielski             else
2803*b1cdbd2cSJim Jagielski                 nShadowType = GTK_SHADOW_OUT;
2804*b1cdbd2cSJim Jagielski 
2805*b1cdbd2cSJim Jagielski             if ( nPart == PART_MENU_ITEM_CHECK_MARK )
2806*b1cdbd2cSJim Jagielski             {
2807*b1cdbd2cSJim Jagielski                 gtk_paint_check( pWidget->style,
2808*b1cdbd2cSJim Jagielski                                  gdkDrawable,
2809*b1cdbd2cSJim Jagielski                                  nStateType,
2810*b1cdbd2cSJim Jagielski                                  nShadowType,
2811*b1cdbd2cSJim Jagielski                                  &clipRect,
2812*b1cdbd2cSJim Jagielski                                  gWidgetData[m_nScreen].gMenuItemMenuWidget,
2813*b1cdbd2cSJim Jagielski                                  "check",
2814*b1cdbd2cSJim Jagielski                                  x, y, w, h );
2815*b1cdbd2cSJim Jagielski             }
2816*b1cdbd2cSJim Jagielski             else
2817*b1cdbd2cSJim Jagielski             {
2818*b1cdbd2cSJim Jagielski                 gtk_paint_option( pWidget->style,
2819*b1cdbd2cSJim Jagielski                                   gdkDrawable,
2820*b1cdbd2cSJim Jagielski                                   nStateType,
2821*b1cdbd2cSJim Jagielski                                   nShadowType,
2822*b1cdbd2cSJim Jagielski                                   &clipRect,
2823*b1cdbd2cSJim Jagielski                                   gWidgetData[m_nScreen].gMenuItemMenuWidget,
2824*b1cdbd2cSJim Jagielski                                   "option",
2825*b1cdbd2cSJim Jagielski                                   x, y, w, h );
2826*b1cdbd2cSJim Jagielski             }
2827*b1cdbd2cSJim Jagielski         }
2828*b1cdbd2cSJim Jagielski     }
2829*b1cdbd2cSJim Jagielski 
2830*b1cdbd2cSJim Jagielski 	return( sal_True );
2831*b1cdbd2cSJim Jagielski }
2832*b1cdbd2cSJim Jagielski 
NWPaintGTKTooltip(GdkDrawable * gdkDrawable,ControlType,ControlPart,const Rectangle & rControlRectangle,const clipList & rClipList,ControlState,const ImplControlValue &,const OUString &)2833*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKTooltip(
2834*b1cdbd2cSJim Jagielski             GdkDrawable* gdkDrawable,
2835*b1cdbd2cSJim Jagielski             ControlType, ControlPart,
2836*b1cdbd2cSJim Jagielski 			const Rectangle& rControlRectangle,
2837*b1cdbd2cSJim Jagielski             const clipList& rClipList,
2838*b1cdbd2cSJim Jagielski             ControlState, const ImplControlValue&,
2839*b1cdbd2cSJim Jagielski 			const OUString& )
2840*b1cdbd2cSJim Jagielski {
2841*b1cdbd2cSJim Jagielski     NWEnsureGTKTooltip( m_nScreen );
2842*b1cdbd2cSJim Jagielski 
2843*b1cdbd2cSJim Jagielski 	gint			x, y, w, h;
2844*b1cdbd2cSJim Jagielski     GdkRectangle	clipRect;
2845*b1cdbd2cSJim Jagielski 
2846*b1cdbd2cSJim Jagielski 	x = rControlRectangle.Left();
2847*b1cdbd2cSJim Jagielski     y = rControlRectangle.Top();
2848*b1cdbd2cSJim Jagielski 	w = rControlRectangle.GetWidth();
2849*b1cdbd2cSJim Jagielski 	h = rControlRectangle.GetHeight();
2850*b1cdbd2cSJim Jagielski 
2851*b1cdbd2cSJim Jagielski     for( clipList::const_iterator it = rClipList.begin(); it != rClipList.end(); ++it )
2852*b1cdbd2cSJim Jagielski     {
2853*b1cdbd2cSJim Jagielski         clipRect.x = it->Left();
2854*b1cdbd2cSJim Jagielski         clipRect.y = it->Top();
2855*b1cdbd2cSJim Jagielski         clipRect.width = it->GetWidth();
2856*b1cdbd2cSJim Jagielski         clipRect.height = it->GetHeight();
2857*b1cdbd2cSJim Jagielski 
2858*b1cdbd2cSJim Jagielski         gtk_paint_flat_box( gWidgetData[m_nScreen].gTooltipPopup->style,
2859*b1cdbd2cSJim Jagielski                             gdkDrawable,
2860*b1cdbd2cSJim Jagielski                             GTK_STATE_NORMAL,
2861*b1cdbd2cSJim Jagielski                             GTK_SHADOW_OUT,
2862*b1cdbd2cSJim Jagielski                             &clipRect,
2863*b1cdbd2cSJim Jagielski                             gWidgetData[m_nScreen].gTooltipPopup,
2864*b1cdbd2cSJim Jagielski                             "tooltip",
2865*b1cdbd2cSJim Jagielski                             x, y, w, h );
2866*b1cdbd2cSJim Jagielski     }
2867*b1cdbd2cSJim Jagielski 
2868*b1cdbd2cSJim Jagielski 	return( sal_True );
2869*b1cdbd2cSJim Jagielski }
2870*b1cdbd2cSJim Jagielski 
NWPaintGTKListNode(GdkDrawable *,ControlType,ControlPart,const Rectangle & rControlRectangle,const clipList &,ControlState nState,const ImplControlValue & rValue,const OUString &)2871*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKListNode(
2872*b1cdbd2cSJim Jagielski             GdkDrawable*,
2873*b1cdbd2cSJim Jagielski             ControlType, ControlPart,
2874*b1cdbd2cSJim Jagielski 			const Rectangle& rControlRectangle,
2875*b1cdbd2cSJim Jagielski             const clipList&,
2876*b1cdbd2cSJim Jagielski             ControlState nState, const ImplControlValue& rValue,
2877*b1cdbd2cSJim Jagielski 			const OUString& )
2878*b1cdbd2cSJim Jagielski {
2879*b1cdbd2cSJim Jagielski     NWEnsureGTKTreeView( m_nScreen );
2880*b1cdbd2cSJim Jagielski 
2881*b1cdbd2cSJim Jagielski     Rectangle aRect( rControlRectangle );
2882*b1cdbd2cSJim Jagielski     aRect.Left() -= 2;
2883*b1cdbd2cSJim Jagielski     aRect.Right() += 2;
2884*b1cdbd2cSJim Jagielski     aRect.Top() -= 2;
2885*b1cdbd2cSJim Jagielski     aRect.Bottom() += 2;
2886*b1cdbd2cSJim Jagielski 	gint			w, h;
2887*b1cdbd2cSJim Jagielski 	w = aRect.GetWidth();
2888*b1cdbd2cSJim Jagielski 	h = aRect.GetHeight();
2889*b1cdbd2cSJim Jagielski 
2890*b1cdbd2cSJim Jagielski 	GtkStateType	stateType;
2891*b1cdbd2cSJim Jagielski 	GtkShadowType	shadowType;
2892*b1cdbd2cSJim Jagielski 	NWConvertVCLStateToGTKState( nState, &stateType, &shadowType );
2893*b1cdbd2cSJim Jagielski 
2894*b1cdbd2cSJim Jagielski     ButtonValue aButtonValue = rValue.getTristateVal();
2895*b1cdbd2cSJim Jagielski     GtkExpanderStyle eStyle = GTK_EXPANDER_EXPANDED;
2896*b1cdbd2cSJim Jagielski 
2897*b1cdbd2cSJim Jagielski     switch( aButtonValue )
2898*b1cdbd2cSJim Jagielski     {
2899*b1cdbd2cSJim Jagielski         case BUTTONVALUE_ON: eStyle = GTK_EXPANDER_EXPANDED;break;
2900*b1cdbd2cSJim Jagielski         case BUTTONVALUE_OFF: eStyle = GTK_EXPANDER_COLLAPSED; break;
2901*b1cdbd2cSJim Jagielski         default:
2902*b1cdbd2cSJim Jagielski             break;
2903*b1cdbd2cSJim Jagielski     }
2904*b1cdbd2cSJim Jagielski 
2905*b1cdbd2cSJim Jagielski     GdkPixmap* pixmap = NWGetPixmapFromScreen( aRect );
2906*b1cdbd2cSJim Jagielski     if( ! pixmap )
2907*b1cdbd2cSJim Jagielski         return sal_False;
2908*b1cdbd2cSJim Jagielski 
2909*b1cdbd2cSJim Jagielski     GdkDrawable* const &pixDrawable = GDK_DRAWABLE( pixmap );
2910*b1cdbd2cSJim Jagielski     gtk_paint_expander( gWidgetData[m_nScreen].gTreeView->style,
2911*b1cdbd2cSJim Jagielski                         pixDrawable,
2912*b1cdbd2cSJim Jagielski                         stateType,
2913*b1cdbd2cSJim Jagielski                         NULL,
2914*b1cdbd2cSJim Jagielski                         gWidgetData[m_nScreen].gTreeView,
2915*b1cdbd2cSJim Jagielski                         "treeview",
2916*b1cdbd2cSJim Jagielski                         w/2, h/2,
2917*b1cdbd2cSJim Jagielski                         eStyle );
2918*b1cdbd2cSJim Jagielski 
2919*b1cdbd2cSJim Jagielski 	sal_Bool bRet = NWRenderPixmapToScreen( pixmap, aRect );
2920*b1cdbd2cSJim Jagielski     g_object_unref( pixmap );
2921*b1cdbd2cSJim Jagielski 
2922*b1cdbd2cSJim Jagielski 	return bRet;
2923*b1cdbd2cSJim Jagielski }
2924*b1cdbd2cSJim Jagielski 
NWPaintGTKProgress(GdkDrawable *,ControlType,ControlPart,const Rectangle & rControlRectangle,const clipList &,ControlState,const ImplControlValue & rValue,const OUString &)2925*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKProgress(
2926*b1cdbd2cSJim Jagielski             GdkDrawable*,
2927*b1cdbd2cSJim Jagielski             ControlType, ControlPart,
2928*b1cdbd2cSJim Jagielski 			const Rectangle& rControlRectangle,
2929*b1cdbd2cSJim Jagielski             const clipList&,
2930*b1cdbd2cSJim Jagielski             ControlState, const ImplControlValue& rValue,
2931*b1cdbd2cSJim Jagielski 			const OUString& )
2932*b1cdbd2cSJim Jagielski {
2933*b1cdbd2cSJim Jagielski     NWEnsureGTKProgressBar( m_nScreen );
2934*b1cdbd2cSJim Jagielski 
2935*b1cdbd2cSJim Jagielski 	gint			w, h;
2936*b1cdbd2cSJim Jagielski 	w = rControlRectangle.GetWidth();
2937*b1cdbd2cSJim Jagielski 	h = rControlRectangle.GetHeight();
2938*b1cdbd2cSJim Jagielski 
2939*b1cdbd2cSJim Jagielski     long nProgressWidth = rValue.getNumericVal();
2940*b1cdbd2cSJim Jagielski 
2941*b1cdbd2cSJim Jagielski     GdkPixmap* pixmap = NWGetPixmapFromScreen( Rectangle( Point( 0, 0 ), Size( w, h ) ) );
2942*b1cdbd2cSJim Jagielski     if( ! pixmap )
2943*b1cdbd2cSJim Jagielski         return sal_False;
2944*b1cdbd2cSJim Jagielski 
2945*b1cdbd2cSJim Jagielski     GdkDrawable* const &pixDrawable = GDK_DRAWABLE( pixmap );
2946*b1cdbd2cSJim Jagielski 
2947*b1cdbd2cSJim Jagielski     // paint background
2948*b1cdbd2cSJim Jagielski     gtk_paint_flat_box( gWidgetData[m_nScreen].gProgressBar->style,
2949*b1cdbd2cSJim Jagielski                         pixDrawable,
2950*b1cdbd2cSJim Jagielski                         GTK_STATE_NORMAL,
2951*b1cdbd2cSJim Jagielski                         GTK_SHADOW_NONE,
2952*b1cdbd2cSJim Jagielski                         NULL,
2953*b1cdbd2cSJim Jagielski                         gWidgetData[m_nScreen].gProgressBar,
2954*b1cdbd2cSJim Jagielski                         "trough",
2955*b1cdbd2cSJim Jagielski                         0, 0, w, h );
2956*b1cdbd2cSJim Jagielski     if( nProgressWidth > 0 )
2957*b1cdbd2cSJim Jagielski     {
2958*b1cdbd2cSJim Jagielski         // paint progress
2959*b1cdbd2cSJim Jagielski         if( Application::GetSettings().GetLayoutRTL() )
2960*b1cdbd2cSJim Jagielski         {
2961*b1cdbd2cSJim Jagielski             gtk_paint_box( gWidgetData[m_nScreen].gProgressBar->style,
2962*b1cdbd2cSJim Jagielski                            pixDrawable,
2963*b1cdbd2cSJim Jagielski                            GTK_STATE_PRELIGHT, GTK_SHADOW_OUT,
2964*b1cdbd2cSJim Jagielski                            NULL,
2965*b1cdbd2cSJim Jagielski                            gWidgetData[m_nScreen].gProgressBar,
2966*b1cdbd2cSJim Jagielski                            "bar",
2967*b1cdbd2cSJim Jagielski                            w-nProgressWidth, 0, nProgressWidth, h
2968*b1cdbd2cSJim Jagielski                            );
2969*b1cdbd2cSJim Jagielski         }
2970*b1cdbd2cSJim Jagielski         else
2971*b1cdbd2cSJim Jagielski         {
2972*b1cdbd2cSJim Jagielski             gtk_paint_box( gWidgetData[m_nScreen].gProgressBar->style,
2973*b1cdbd2cSJim Jagielski                            pixDrawable,
2974*b1cdbd2cSJim Jagielski                            GTK_STATE_PRELIGHT, GTK_SHADOW_OUT,
2975*b1cdbd2cSJim Jagielski                            NULL,
2976*b1cdbd2cSJim Jagielski                            gWidgetData[m_nScreen].gProgressBar,
2977*b1cdbd2cSJim Jagielski                            "bar",
2978*b1cdbd2cSJim Jagielski                            0, 0, nProgressWidth, h
2979*b1cdbd2cSJim Jagielski                            );
2980*b1cdbd2cSJim Jagielski         }
2981*b1cdbd2cSJim Jagielski     }
2982*b1cdbd2cSJim Jagielski 
2983*b1cdbd2cSJim Jagielski 	sal_Bool bRet = NWRenderPixmapToScreen( pixmap, rControlRectangle );
2984*b1cdbd2cSJim Jagielski     g_object_unref( pixmap );
2985*b1cdbd2cSJim Jagielski 
2986*b1cdbd2cSJim Jagielski 	return bRet;
2987*b1cdbd2cSJim Jagielski }
2988*b1cdbd2cSJim Jagielski 
NWPaintGTKSlider(GdkDrawable *,ControlType,ControlPart nPart,const Rectangle & rControlRectangle,const clipList &,ControlState nState,const ImplControlValue & rValue,const OUString &)2989*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWPaintGTKSlider(
2990*b1cdbd2cSJim Jagielski             GdkDrawable*,
2991*b1cdbd2cSJim Jagielski             ControlType, ControlPart nPart,
2992*b1cdbd2cSJim Jagielski 			const Rectangle& rControlRectangle,
2993*b1cdbd2cSJim Jagielski             const clipList&,
2994*b1cdbd2cSJim Jagielski             ControlState nState, const ImplControlValue& rValue,
2995*b1cdbd2cSJim Jagielski 			const OUString& )
2996*b1cdbd2cSJim Jagielski {
2997*b1cdbd2cSJim Jagielski     OSL_ASSERT( rValue.getType() == CTRL_SLIDER );
2998*b1cdbd2cSJim Jagielski     NWEnsureGTKSlider( m_nScreen );
2999*b1cdbd2cSJim Jagielski 
3000*b1cdbd2cSJim Jagielski 	gint			w, h;
3001*b1cdbd2cSJim Jagielski 	w = rControlRectangle.GetWidth();
3002*b1cdbd2cSJim Jagielski 	h = rControlRectangle.GetHeight();
3003*b1cdbd2cSJim Jagielski 
3004*b1cdbd2cSJim Jagielski     const SliderValue* pVal = static_cast<const SliderValue*>(&rValue);
3005*b1cdbd2cSJim Jagielski 
3006*b1cdbd2cSJim Jagielski     GdkPixmap* pixmap = NWGetPixmapFromScreen( rControlRectangle );
3007*b1cdbd2cSJim Jagielski     if( ! pixmap )
3008*b1cdbd2cSJim Jagielski         return sal_False;
3009*b1cdbd2cSJim Jagielski 
3010*b1cdbd2cSJim Jagielski     GdkDrawable* const &pixDrawable = GDK_DRAWABLE( pixmap );
3011*b1cdbd2cSJim Jagielski     GtkWidget* pWidget = (nPart == PART_TRACK_HORZ_AREA)
3012*b1cdbd2cSJim Jagielski                          ? GTK_WIDGET(gWidgetData[m_nScreen].gHScale)
3013*b1cdbd2cSJim Jagielski                          : GTK_WIDGET(gWidgetData[m_nScreen].gVScale);
3014*b1cdbd2cSJim Jagielski     const gchar* pDetail = (nPart == PART_TRACK_HORZ_AREA) ? "hscale" : "vscale";
3015*b1cdbd2cSJim Jagielski     GtkOrientation eOri = (nPart == PART_TRACK_HORZ_AREA) ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL;
3016*b1cdbd2cSJim Jagielski     GtkStateType eState = (nState & CTRL_STATE_ENABLED) ? GTK_STATE_ACTIVE : GTK_STATE_INSENSITIVE;
3017*b1cdbd2cSJim Jagielski     gint slider_width = 10;
3018*b1cdbd2cSJim Jagielski     gint slider_length = 10;
3019*b1cdbd2cSJim Jagielski     gint trough_border = 0;
3020*b1cdbd2cSJim Jagielski     gtk_widget_style_get( pWidget,
3021*b1cdbd2cSJim Jagielski                           "slider-width", &slider_width,
3022*b1cdbd2cSJim Jagielski                           "slider-length", &slider_length,
3023*b1cdbd2cSJim Jagielski                           "trough-border", &trough_border,
3024*b1cdbd2cSJim Jagielski                           NULL);
3025*b1cdbd2cSJim Jagielski 
3026*b1cdbd2cSJim Jagielski     eState = (nState & CTRL_STATE_ENABLED) ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE;
3027*b1cdbd2cSJim Jagielski     if( nPart == PART_TRACK_HORZ_AREA )
3028*b1cdbd2cSJim Jagielski     {
3029*b1cdbd2cSJim Jagielski         gtk_paint_box( pWidget->style,
3030*b1cdbd2cSJim Jagielski                        pixDrawable,
3031*b1cdbd2cSJim Jagielski                        eState,
3032*b1cdbd2cSJim Jagielski                        GTK_SHADOW_IN,
3033*b1cdbd2cSJim Jagielski                        NULL,
3034*b1cdbd2cSJim Jagielski                        pWidget,
3035*b1cdbd2cSJim Jagielski                        "trough",
3036*b1cdbd2cSJim Jagielski                        0, (h-slider_width-2*trough_border)/2, w, slider_width + 2*trough_border);
3037*b1cdbd2cSJim Jagielski         gint x = (w - slider_length + 1) * (pVal->mnCur - pVal->mnMin) / (pVal->mnMax - pVal->mnMin);
3038*b1cdbd2cSJim Jagielski         gtk_paint_slider( pWidget->style,
3039*b1cdbd2cSJim Jagielski                           pixDrawable,
3040*b1cdbd2cSJim Jagielski                           eState,
3041*b1cdbd2cSJim Jagielski                           GTK_SHADOW_OUT,
3042*b1cdbd2cSJim Jagielski                           NULL,
3043*b1cdbd2cSJim Jagielski                           pWidget,
3044*b1cdbd2cSJim Jagielski                           pDetail,
3045*b1cdbd2cSJim Jagielski                           x, (h-slider_width)/2,
3046*b1cdbd2cSJim Jagielski                           slider_length, slider_width,
3047*b1cdbd2cSJim Jagielski                           eOri );
3048*b1cdbd2cSJim Jagielski     }
3049*b1cdbd2cSJim Jagielski     else
3050*b1cdbd2cSJim Jagielski     {
3051*b1cdbd2cSJim Jagielski         gtk_paint_box( pWidget->style,
3052*b1cdbd2cSJim Jagielski                        pixDrawable,
3053*b1cdbd2cSJim Jagielski                        eState,
3054*b1cdbd2cSJim Jagielski                        GTK_SHADOW_IN,
3055*b1cdbd2cSJim Jagielski                        NULL,
3056*b1cdbd2cSJim Jagielski                        pWidget,
3057*b1cdbd2cSJim Jagielski                        "trough",
3058*b1cdbd2cSJim Jagielski                        (w-slider_width-2*trough_border)/2, 0, slider_width + 2*trough_border, h);
3059*b1cdbd2cSJim Jagielski         gint y = (h - slider_length + 1) * (pVal->mnCur - pVal->mnMin) / (pVal->mnMax - pVal->mnMin);
3060*b1cdbd2cSJim Jagielski         gtk_paint_slider( pWidget->style,
3061*b1cdbd2cSJim Jagielski                           pixDrawable,
3062*b1cdbd2cSJim Jagielski                           eState,
3063*b1cdbd2cSJim Jagielski                           GTK_SHADOW_OUT,
3064*b1cdbd2cSJim Jagielski                           NULL,
3065*b1cdbd2cSJim Jagielski                           pWidget,
3066*b1cdbd2cSJim Jagielski                           pDetail,
3067*b1cdbd2cSJim Jagielski                           (w-slider_width)/2, y,
3068*b1cdbd2cSJim Jagielski                           slider_width, slider_length,
3069*b1cdbd2cSJim Jagielski                           eOri );
3070*b1cdbd2cSJim Jagielski     }
3071*b1cdbd2cSJim Jagielski     #if 0
3072*b1cdbd2cSJim Jagielski     // paint background
3073*b1cdbd2cSJim Jagielski     gtk_paint_flat_box( gWidgetData[m_nScreen].gProgressBar->style,
3074*b1cdbd2cSJim Jagielski                         pixDrawable,
3075*b1cdbd2cSJim Jagielski                         GTK_STATE_NORMAL,
3076*b1cdbd2cSJim Jagielski                         GTK_SHADOW_NONE,
3077*b1cdbd2cSJim Jagielski                         NULL,
3078*b1cdbd2cSJim Jagielski                         gWidgetData[m_nScreen].gProgressBar,
3079*b1cdbd2cSJim Jagielski                         "trough",
3080*b1cdbd2cSJim Jagielski                         0, 0, w, h );
3081*b1cdbd2cSJim Jagielski     if( nProgressWidth > 0 )
3082*b1cdbd2cSJim Jagielski     {
3083*b1cdbd2cSJim Jagielski         // paint progress
3084*b1cdbd2cSJim Jagielski         if( Application::GetSettings().GetLayoutRTL() )
3085*b1cdbd2cSJim Jagielski         {
3086*b1cdbd2cSJim Jagielski             gtk_paint_box( gWidgetData[m_nScreen].gProgressBar->style,
3087*b1cdbd2cSJim Jagielski                            pixDrawable,
3088*b1cdbd2cSJim Jagielski                            GTK_STATE_PRELIGHT, GTK_SHADOW_OUT,
3089*b1cdbd2cSJim Jagielski                            NULL,
3090*b1cdbd2cSJim Jagielski                            gWidgetData[m_nScreen].gProgressBar,
3091*b1cdbd2cSJim Jagielski                            "bar",
3092*b1cdbd2cSJim Jagielski                            w-nProgressWidth, 0, nProgressWidth, h
3093*b1cdbd2cSJim Jagielski                            );
3094*b1cdbd2cSJim Jagielski         }
3095*b1cdbd2cSJim Jagielski         else
3096*b1cdbd2cSJim Jagielski         {
3097*b1cdbd2cSJim Jagielski             gtk_paint_box( gWidgetData[m_nScreen].gProgressBar->style,
3098*b1cdbd2cSJim Jagielski                            pixDrawable,
3099*b1cdbd2cSJim Jagielski                            GTK_STATE_PRELIGHT, GTK_SHADOW_OUT,
3100*b1cdbd2cSJim Jagielski                            NULL,
3101*b1cdbd2cSJim Jagielski                            gWidgetData[m_nScreen].gProgressBar,
3102*b1cdbd2cSJim Jagielski                            "bar",
3103*b1cdbd2cSJim Jagielski                            0, 0, nProgressWidth, h
3104*b1cdbd2cSJim Jagielski                            );
3105*b1cdbd2cSJim Jagielski         }
3106*b1cdbd2cSJim Jagielski     }
3107*b1cdbd2cSJim Jagielski     #endif
3108*b1cdbd2cSJim Jagielski 
3109*b1cdbd2cSJim Jagielski 	sal_Bool bRet = NWRenderPixmapToScreen( pixmap, rControlRectangle );
3110*b1cdbd2cSJim Jagielski     g_object_unref( pixmap );
3111*b1cdbd2cSJim Jagielski 
3112*b1cdbd2cSJim Jagielski 	return bRet;
3113*b1cdbd2cSJim Jagielski }
3114*b1cdbd2cSJim Jagielski 
3115*b1cdbd2cSJim Jagielski //----
3116*b1cdbd2cSJim Jagielski 
NWGetListBoxButtonRect(int nScreen,ControlType,ControlPart nPart,Rectangle aAreaRect,ControlState,const ImplControlValue &,const OUString &)3117*b1cdbd2cSJim Jagielski static Rectangle NWGetListBoxButtonRect( int nScreen,
3118*b1cdbd2cSJim Jagielski                                          ControlType,
3119*b1cdbd2cSJim Jagielski                                          ControlPart    nPart,
3120*b1cdbd2cSJim Jagielski                                          Rectangle      aAreaRect,
3121*b1cdbd2cSJim Jagielski                                          ControlState,
3122*b1cdbd2cSJim Jagielski                                          const ImplControlValue&,
3123*b1cdbd2cSJim Jagielski                                          const OUString& )
3124*b1cdbd2cSJim Jagielski {
3125*b1cdbd2cSJim Jagielski 	Rectangle       aPartRect;
3126*b1cdbd2cSJim Jagielski 	GtkRequisition *pIndicatorSize = NULL;
3127*b1cdbd2cSJim Jagielski 	GtkBorder      *pIndicatorSpacing = NULL;
3128*b1cdbd2cSJim Jagielski 	gint            width = 13;	// GTK+ default
3129*b1cdbd2cSJim Jagielski 	gint            right = 5;	// GTK+ default
3130*b1cdbd2cSJim Jagielski 	gint            nButtonAreaWidth = 0;
3131*b1cdbd2cSJim Jagielski     gint            xthickness = 0;
3132*b1cdbd2cSJim Jagielski 
3133*b1cdbd2cSJim Jagielski 	NWEnsureGTKOptionMenu( nScreen );
3134*b1cdbd2cSJim Jagielski 
3135*b1cdbd2cSJim Jagielski 	gtk_widget_style_get( gWidgetData[nScreen].gOptionMenuWidget,
3136*b1cdbd2cSJim Jagielski 			"indicator_size",	&pIndicatorSize,
3137*b1cdbd2cSJim Jagielski 			"indicator_spacing",&pIndicatorSpacing, (char *)NULL);
3138*b1cdbd2cSJim Jagielski 
3139*b1cdbd2cSJim Jagielski 	if ( pIndicatorSize )
3140*b1cdbd2cSJim Jagielski 		width = pIndicatorSize->width;
3141*b1cdbd2cSJim Jagielski 
3142*b1cdbd2cSJim Jagielski 	if ( pIndicatorSpacing )
3143*b1cdbd2cSJim Jagielski 		right = pIndicatorSpacing->right;
3144*b1cdbd2cSJim Jagielski 
3145*b1cdbd2cSJim Jagielski     Size aPartSize( 0, aAreaRect.GetHeight() );
3146*b1cdbd2cSJim Jagielski     Point aPartPos ( 0, aAreaRect.Top() );
3147*b1cdbd2cSJim Jagielski 
3148*b1cdbd2cSJim Jagielski     xthickness = gWidgetData[nScreen].gOptionMenuWidget->style->xthickness;
3149*b1cdbd2cSJim Jagielski 	nButtonAreaWidth = width + right + (xthickness * 2);
3150*b1cdbd2cSJim Jagielski 	switch( nPart )
3151*b1cdbd2cSJim Jagielski 	{
3152*b1cdbd2cSJim Jagielski 		case PART_BUTTON_DOWN:
3153*b1cdbd2cSJim Jagielski 			aPartSize.Width() = nButtonAreaWidth;
3154*b1cdbd2cSJim Jagielski 			aPartPos.X() = aAreaRect.Left() + aAreaRect.GetWidth() - aPartSize.Width();
3155*b1cdbd2cSJim Jagielski 			break;
3156*b1cdbd2cSJim Jagielski 
3157*b1cdbd2cSJim Jagielski 		case PART_SUB_EDIT:
3158*b1cdbd2cSJim Jagielski 			aPartSize.Width() = aAreaRect.GetWidth() - nButtonAreaWidth - xthickness;
3159*b1cdbd2cSJim Jagielski 			aPartPos.X() = aAreaRect.Left() + xthickness;
3160*b1cdbd2cSJim Jagielski 			break;
3161*b1cdbd2cSJim Jagielski 
3162*b1cdbd2cSJim Jagielski 		default:
3163*b1cdbd2cSJim Jagielski 			aPartSize.Width() = aAreaRect.GetWidth();
3164*b1cdbd2cSJim Jagielski 			aPartPos.X() = aAreaRect.Left();
3165*b1cdbd2cSJim Jagielski 			break;
3166*b1cdbd2cSJim Jagielski 	}
3167*b1cdbd2cSJim Jagielski     aPartRect = Rectangle( aPartPos, aPartSize );
3168*b1cdbd2cSJim Jagielski 
3169*b1cdbd2cSJim Jagielski 	if ( pIndicatorSize )
3170*b1cdbd2cSJim Jagielski 		gtk_requisition_free( pIndicatorSize );
3171*b1cdbd2cSJim Jagielski 	if ( pIndicatorSpacing )
3172*b1cdbd2cSJim Jagielski 		gtk_border_free( pIndicatorSpacing );
3173*b1cdbd2cSJim Jagielski 
3174*b1cdbd2cSJim Jagielski 	return( aPartRect );
3175*b1cdbd2cSJim Jagielski }
3176*b1cdbd2cSJim Jagielski 
3177*b1cdbd2cSJim Jagielski //----
3178*b1cdbd2cSJim Jagielski 
NWGetListBoxIndicatorRect(int nScreen,ControlType,ControlPart,Rectangle aAreaRect,ControlState,const ImplControlValue &,const OUString &)3179*b1cdbd2cSJim Jagielski static Rectangle NWGetListBoxIndicatorRect( int nScreen,
3180*b1cdbd2cSJim Jagielski                                             ControlType,
3181*b1cdbd2cSJim Jagielski                                             ControlPart,
3182*b1cdbd2cSJim Jagielski                                             Rectangle				aAreaRect,
3183*b1cdbd2cSJim Jagielski                                             ControlState,
3184*b1cdbd2cSJim Jagielski                                             const ImplControlValue&,
3185*b1cdbd2cSJim Jagielski                                             const OUString& )
3186*b1cdbd2cSJim Jagielski {
3187*b1cdbd2cSJim Jagielski 	Rectangle       aIndicatorRect;
3188*b1cdbd2cSJim Jagielski 	GtkRequisition *pIndicatorSize = NULL;
3189*b1cdbd2cSJim Jagielski 	GtkBorder      *pIndicatorSpacing = NULL;
3190*b1cdbd2cSJim Jagielski 	gint            width = 13;	// GTK+ default
3191*b1cdbd2cSJim Jagielski 	gint            height = 13;	// GTK+ default
3192*b1cdbd2cSJim Jagielski 	gint            right = 5;	// GTK+ default
3193*b1cdbd2cSJim Jagielski 
3194*b1cdbd2cSJim Jagielski 	NWEnsureGTKOptionMenu( nScreen );
3195*b1cdbd2cSJim Jagielski 
3196*b1cdbd2cSJim Jagielski 	gtk_widget_style_get( gWidgetData[nScreen].gOptionMenuWidget,
3197*b1cdbd2cSJim Jagielski 			"indicator_size",	&pIndicatorSize,
3198*b1cdbd2cSJim Jagielski 			"indicator_spacing",&pIndicatorSpacing, (char *)NULL);
3199*b1cdbd2cSJim Jagielski 
3200*b1cdbd2cSJim Jagielski 	if ( pIndicatorSize )
3201*b1cdbd2cSJim Jagielski     {
3202*b1cdbd2cSJim Jagielski 		width = pIndicatorSize->width;
3203*b1cdbd2cSJim Jagielski 		height = pIndicatorSize->height;
3204*b1cdbd2cSJim Jagielski     }
3205*b1cdbd2cSJim Jagielski 
3206*b1cdbd2cSJim Jagielski 	if ( pIndicatorSpacing )
3207*b1cdbd2cSJim Jagielski 		right = pIndicatorSpacing->right;
3208*b1cdbd2cSJim Jagielski 
3209*b1cdbd2cSJim Jagielski     aIndicatorRect.SetSize( Size( width, height ) );
3210*b1cdbd2cSJim Jagielski 	aIndicatorRect.SetPos( Point( aAreaRect.Left() + aAreaRect.GetWidth() - width - right - gWidgetData[nScreen].gOptionMenuWidget->style->xthickness,
3211*b1cdbd2cSJim Jagielski                                   aAreaRect.Top() + ((aAreaRect.GetHeight() - height) / 2) ) );
3212*b1cdbd2cSJim Jagielski 
3213*b1cdbd2cSJim Jagielski 	// If height is odd, move the indicator down 1 pixel
3214*b1cdbd2cSJim Jagielski 	if ( aIndicatorRect.GetHeight() % 2 )
3215*b1cdbd2cSJim Jagielski 		aIndicatorRect.Move( 0, 1 );
3216*b1cdbd2cSJim Jagielski 
3217*b1cdbd2cSJim Jagielski 	if ( pIndicatorSize )
3218*b1cdbd2cSJim Jagielski 		gtk_requisition_free( pIndicatorSize );
3219*b1cdbd2cSJim Jagielski 	if ( pIndicatorSpacing )
3220*b1cdbd2cSJim Jagielski 		gtk_border_free( pIndicatorSpacing );
3221*b1cdbd2cSJim Jagielski 
3222*b1cdbd2cSJim Jagielski 	return( aIndicatorRect );
3223*b1cdbd2cSJim Jagielski }
3224*b1cdbd2cSJim Jagielski 
NWGetToolbarRect(int nScreen,ControlType,ControlPart nPart,Rectangle aAreaRect,ControlState,const ImplControlValue &,const OUString &)3225*b1cdbd2cSJim Jagielski static Rectangle NWGetToolbarRect(  int nScreen,
3226*b1cdbd2cSJim Jagielski                                     ControlType,
3227*b1cdbd2cSJim Jagielski 									ControlPart				nPart,
3228*b1cdbd2cSJim Jagielski 									Rectangle				aAreaRect,
3229*b1cdbd2cSJim Jagielski 									ControlState,
3230*b1cdbd2cSJim Jagielski 									const ImplControlValue&,
3231*b1cdbd2cSJim Jagielski 									const OUString& )
3232*b1cdbd2cSJim Jagielski {
3233*b1cdbd2cSJim Jagielski     Rectangle aRet;
3234*b1cdbd2cSJim Jagielski 
3235*b1cdbd2cSJim Jagielski     if( nPart == PART_DRAW_BACKGROUND_HORZ ||
3236*b1cdbd2cSJim Jagielski         nPart == PART_DRAW_BACKGROUND_VERT )
3237*b1cdbd2cSJim Jagielski         aRet = aAreaRect;
3238*b1cdbd2cSJim Jagielski     else if( nPart == PART_THUMB_HORZ )
3239*b1cdbd2cSJim Jagielski         aRet = Rectangle( Point( 0, 0 ), Size( aAreaRect.GetWidth(), 10 ) );
3240*b1cdbd2cSJim Jagielski     else if( nPart == PART_THUMB_VERT )
3241*b1cdbd2cSJim Jagielski         aRet = Rectangle( Point( 0, 0 ), Size( 10, aAreaRect.GetHeight() ) );
3242*b1cdbd2cSJim Jagielski     else if( nPart == PART_BUTTON )
3243*b1cdbd2cSJim Jagielski     {
3244*b1cdbd2cSJim Jagielski         aRet = aAreaRect;
3245*b1cdbd2cSJim Jagielski 
3246*b1cdbd2cSJim Jagielski         NWEnsureGTKToolbar( nScreen );
3247*b1cdbd2cSJim Jagielski 
3248*b1cdbd2cSJim Jagielski         gint nMinWidth =
3249*b1cdbd2cSJim Jagielski             2*gWidgetData[nScreen].gToolbarButtonWidget->style->xthickness
3250*b1cdbd2cSJim Jagielski             + 1 // CHILD_SPACING constant, found in gtk_button.c
3251*b1cdbd2cSJim Jagielski             + 3*gWidgetData[nScreen].gToolbarButtonWidget->style->xthickness; // Murphy factor
3252*b1cdbd2cSJim Jagielski         gint nMinHeight =
3253*b1cdbd2cSJim Jagielski             2*gWidgetData[nScreen].gToolbarButtonWidget->style->ythickness
3254*b1cdbd2cSJim Jagielski             + 1 // CHILD_SPACING constant, found in gtk_button.c
3255*b1cdbd2cSJim Jagielski             + 3*gWidgetData[nScreen].gToolbarButtonWidget->style->ythickness; // Murphy factor
3256*b1cdbd2cSJim Jagielski 
3257*b1cdbd2cSJim Jagielski         gtk_widget_ensure_style( gWidgetData[nScreen].gToolbarButtonWidget );
3258*b1cdbd2cSJim Jagielski         if( aAreaRect.GetWidth() < nMinWidth )
3259*b1cdbd2cSJim Jagielski             aRet.Right() = aRet.Left() + nMinWidth;
3260*b1cdbd2cSJim Jagielski         if( aAreaRect.GetHeight() < nMinHeight  )
3261*b1cdbd2cSJim Jagielski             aRet.Bottom() = aRet.Top() + nMinHeight;
3262*b1cdbd2cSJim Jagielski     }
3263*b1cdbd2cSJim Jagielski 
3264*b1cdbd2cSJim Jagielski     return aRet;
3265*b1cdbd2cSJim Jagielski }
3266*b1cdbd2cSJim Jagielski 
3267*b1cdbd2cSJim Jagielski /************************************************************************
3268*b1cdbd2cSJim Jagielski  * helper for GtkSalFrame
3269*b1cdbd2cSJim Jagielski  ************************************************************************/
getColor(const GdkColor & rCol)3270*b1cdbd2cSJim Jagielski static inline Color getColor( const GdkColor& rCol )
3271*b1cdbd2cSJim Jagielski {
3272*b1cdbd2cSJim Jagielski     return Color( rCol.red >> 8, rCol.green >> 8, rCol.blue >> 8 );
3273*b1cdbd2cSJim Jagielski }
3274*b1cdbd2cSJim Jagielski 
3275*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
3276*b1cdbd2cSJim Jagielski 
printColor(const char * name,const GdkColor & rCol)3277*b1cdbd2cSJim Jagielski void printColor( const char* name, const GdkColor& rCol )
3278*b1cdbd2cSJim Jagielski {
3279*b1cdbd2cSJim Jagielski     std::fprintf( stderr, "   %s = 0x%2x 0x%2x 0x%2x\n",
3280*b1cdbd2cSJim Jagielski              name,
3281*b1cdbd2cSJim Jagielski              rCol.red >> 8, rCol.green >> 8, rCol.blue >> 8 );
3282*b1cdbd2cSJim Jagielski }
3283*b1cdbd2cSJim Jagielski 
printStyleColors(GtkStyle * pStyle)3284*b1cdbd2cSJim Jagielski void printStyleColors( GtkStyle* pStyle )
3285*b1cdbd2cSJim Jagielski {
3286*b1cdbd2cSJim Jagielski     static const char* pStates[] = { "NORMAL", "ACTIVE", "PRELIGHT", "SELECTED", "INSENSITIVE" };
3287*b1cdbd2cSJim Jagielski 
3288*b1cdbd2cSJim Jagielski     for( int i = 0; i < 5; i++ )
3289*b1cdbd2cSJim Jagielski     {
3290*b1cdbd2cSJim Jagielski         std::fprintf( stderr, "state %s colors:\n", pStates[i] );
3291*b1cdbd2cSJim Jagielski         printColor( "bg     ", pStyle->bg[i] );
3292*b1cdbd2cSJim Jagielski         printColor( "fg     ", pStyle->fg[i] );
3293*b1cdbd2cSJim Jagielski         printColor( "light  ", pStyle->light[i] );
3294*b1cdbd2cSJim Jagielski         printColor( "dark   ", pStyle->dark[i] );
3295*b1cdbd2cSJim Jagielski         printColor( "mid    ", pStyle->mid[i] );
3296*b1cdbd2cSJim Jagielski         printColor( "text   ", pStyle->text[i] );
3297*b1cdbd2cSJim Jagielski         printColor( "base   ", pStyle->base[i] );
3298*b1cdbd2cSJim Jagielski         printColor( "text_aa", pStyle->text_aa[i] );
3299*b1cdbd2cSJim Jagielski     }
3300*b1cdbd2cSJim Jagielski }
3301*b1cdbd2cSJim Jagielski #endif
3302*b1cdbd2cSJim Jagielski 
updateSettings(AllSettings & rSettings)3303*b1cdbd2cSJim Jagielski void GtkSalGraphics::updateSettings( AllSettings& rSettings )
3304*b1cdbd2cSJim Jagielski {
3305*b1cdbd2cSJim Jagielski     // get the widgets in place
3306*b1cdbd2cSJim Jagielski     NWEnsureGTKMenu( m_nScreen );
3307*b1cdbd2cSJim Jagielski     NWEnsureGTKMenubar( m_nScreen );
3308*b1cdbd2cSJim Jagielski     NWEnsureGTKScrollbars( m_nScreen );
3309*b1cdbd2cSJim Jagielski     NWEnsureGTKEditBox( m_nScreen );
3310*b1cdbd2cSJim Jagielski     NWEnsureGTKTooltip( m_nScreen );
3311*b1cdbd2cSJim Jagielski 
3312*b1cdbd2cSJim Jagielski     gtk_widget_ensure_style( m_pWindow );
3313*b1cdbd2cSJim Jagielski     GtkStyle* pStyle = gtk_widget_get_style( m_pWindow );
3314*b1cdbd2cSJim Jagielski 
3315*b1cdbd2cSJim Jagielski     StyleSettings aStyleSet = rSettings.GetStyleSettings();
3316*b1cdbd2cSJim Jagielski 
3317*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 2
3318*b1cdbd2cSJim Jagielski     printStyleColors( pStyle );
3319*b1cdbd2cSJim Jagielski #endif
3320*b1cdbd2cSJim Jagielski 
3321*b1cdbd2cSJim Jagielski     // text colors
3322*b1cdbd2cSJim Jagielski     Color aTextColor = getColor( pStyle->text[GTK_STATE_NORMAL] );
3323*b1cdbd2cSJim Jagielski     aStyleSet.SetDialogTextColor( aTextColor );
3324*b1cdbd2cSJim Jagielski     aStyleSet.SetButtonTextColor( aTextColor );
3325*b1cdbd2cSJim Jagielski     aStyleSet.SetRadioCheckTextColor( aTextColor );
3326*b1cdbd2cSJim Jagielski     aStyleSet.SetGroupTextColor( aTextColor );
3327*b1cdbd2cSJim Jagielski     aStyleSet.SetLabelTextColor( aTextColor );
3328*b1cdbd2cSJim Jagielski     aStyleSet.SetInfoTextColor( aTextColor );
3329*b1cdbd2cSJim Jagielski     aStyleSet.SetWindowTextColor( aTextColor );
3330*b1cdbd2cSJim Jagielski     aStyleSet.SetFieldTextColor( aTextColor );
3331*b1cdbd2cSJim Jagielski 
3332*b1cdbd2cSJim Jagielski     // Tooltip colors
3333*b1cdbd2cSJim Jagielski     GtkStyle* pTooltipStyle = gtk_widget_get_style( gWidgetData[m_nScreen].gTooltipPopup );
3334*b1cdbd2cSJim Jagielski     aTextColor = getColor( pTooltipStyle->fg[ GTK_STATE_NORMAL ] );
3335*b1cdbd2cSJim Jagielski     aStyleSet.SetHelpTextColor( aTextColor );
3336*b1cdbd2cSJim Jagielski 
3337*b1cdbd2cSJim Jagielski     // mouse over text colors
3338*b1cdbd2cSJim Jagielski     aTextColor = getColor( pStyle->fg[ GTK_STATE_PRELIGHT ] );
3339*b1cdbd2cSJim Jagielski     aStyleSet.SetButtonRolloverTextColor( aTextColor );
3340*b1cdbd2cSJim Jagielski     aStyleSet.SetFieldRolloverTextColor( aTextColor );
3341*b1cdbd2cSJim Jagielski 
3342*b1cdbd2cSJim Jagielski     // background colors
3343*b1cdbd2cSJim Jagielski     Color aBackColor = getColor( pStyle->bg[GTK_STATE_NORMAL] );
3344*b1cdbd2cSJim Jagielski     Color aBackFieldColor = getColor( pStyle->base[ GTK_STATE_NORMAL ] );
3345*b1cdbd2cSJim Jagielski     aStyleSet.Set3DColors( aBackColor );
3346*b1cdbd2cSJim Jagielski     aStyleSet.SetFaceColor( aBackColor );
3347*b1cdbd2cSJim Jagielski     aStyleSet.SetDialogColor( aBackColor );
3348*b1cdbd2cSJim Jagielski     aStyleSet.SetWorkspaceColor( aBackColor );
3349*b1cdbd2cSJim Jagielski     aStyleSet.SetFieldColor( aBackFieldColor );
3350*b1cdbd2cSJim Jagielski     aStyleSet.SetWindowColor( aBackFieldColor );
3351*b1cdbd2cSJim Jagielski //    aStyleSet.SetHelpColor( aBackColor );
3352*b1cdbd2cSJim Jagielski     // ancient wisdom tells us a mystic algorithm how to set checked color
3353*b1cdbd2cSJim Jagielski     if( aBackColor == COL_LIGHTGRAY )
3354*b1cdbd2cSJim Jagielski         aStyleSet.SetCheckedColor( Color( 0xCC, 0xCC, 0xCC ) );
3355*b1cdbd2cSJim Jagielski     else
3356*b1cdbd2cSJim Jagielski     {
3357*b1cdbd2cSJim Jagielski         Color aColor2 = aStyleSet.GetLightColor();
3358*b1cdbd2cSJim Jagielski         Color aCheck( (sal_uInt8)(((sal_uInt16)aBackColor.GetRed()+(sal_uInt16)aColor2.GetRed())/2),
3359*b1cdbd2cSJim Jagielski                       (sal_uInt8)(((sal_uInt16)aBackColor.GetGreen()+(sal_uInt16)aColor2.GetGreen())/2),
3360*b1cdbd2cSJim Jagielski                       (sal_uInt8)(((sal_uInt16)aBackColor.GetBlue()+(sal_uInt16)aColor2.GetBlue())/2)
3361*b1cdbd2cSJim Jagielski                       );
3362*b1cdbd2cSJim Jagielski         aStyleSet.SetCheckedColor( aCheck );
3363*b1cdbd2cSJim Jagielski     }
3364*b1cdbd2cSJim Jagielski 
3365*b1cdbd2cSJim Jagielski     // highlighting colors
3366*b1cdbd2cSJim Jagielski     Color aHighlightColor = getColor( pStyle->base[GTK_STATE_SELECTED] );
3367*b1cdbd2cSJim Jagielski     Color aHighlightTextColor = getColor( pStyle->text[GTK_STATE_SELECTED] );
3368*b1cdbd2cSJim Jagielski     aStyleSet.SetHighlightColor( aHighlightColor );
3369*b1cdbd2cSJim Jagielski     aStyleSet.SetHighlightTextColor( aHighlightTextColor );
3370*b1cdbd2cSJim Jagielski 
3371*b1cdbd2cSJim Jagielski     if( ! gtk_check_version( 2, 10, 0 ) ) // link colors came in with 2.10, avoid an assertion
3372*b1cdbd2cSJim Jagielski     {
3373*b1cdbd2cSJim Jagielski         // hyperlink colors
3374*b1cdbd2cSJim Jagielski         GdkColor *link_color = NULL;
3375*b1cdbd2cSJim Jagielski         gtk_widget_style_get (m_pWindow, "link-color", &link_color, NULL);
3376*b1cdbd2cSJim Jagielski         if (link_color)
3377*b1cdbd2cSJim Jagielski         {
3378*b1cdbd2cSJim Jagielski             aStyleSet.SetLinkColor(getColor(*link_color));
3379*b1cdbd2cSJim Jagielski             gdk_color_free (link_color);
3380*b1cdbd2cSJim Jagielski             link_color = NULL;
3381*b1cdbd2cSJim Jagielski         }
3382*b1cdbd2cSJim Jagielski         gtk_widget_style_get (m_pWindow, "visited-link-color", &link_color, NULL);
3383*b1cdbd2cSJim Jagielski         if (link_color)
3384*b1cdbd2cSJim Jagielski         {
3385*b1cdbd2cSJim Jagielski             aStyleSet.SetVisitedLinkColor(getColor(*link_color));
3386*b1cdbd2cSJim Jagielski             gdk_color_free (link_color);
3387*b1cdbd2cSJim Jagielski         }
3388*b1cdbd2cSJim Jagielski     }
3389*b1cdbd2cSJim Jagielski 
3390*b1cdbd2cSJim Jagielski     // Tab colors
3391*b1cdbd2cSJim Jagielski     aStyleSet.SetActiveTabColor( aBackFieldColor ); // same as the window color.
3392*b1cdbd2cSJim Jagielski     Color aSelectedBackColor = getColor( pStyle->bg[GTK_STATE_ACTIVE] );
3393*b1cdbd2cSJim Jagielski     aStyleSet.SetInactiveTabColor( aSelectedBackColor );
3394*b1cdbd2cSJim Jagielski 
3395*b1cdbd2cSJim Jagielski     // menu disabled entries handling
3396*b1cdbd2cSJim Jagielski     aStyleSet.SetSkipDisabledInMenus( sal_True );
3397*b1cdbd2cSJim Jagielski     // menu colors
3398*b1cdbd2cSJim Jagielski     GtkStyle* pMenuStyle = gtk_widget_get_style( gWidgetData[m_nScreen].gMenuWidget );
3399*b1cdbd2cSJim Jagielski     GtkStyle* pMenuItemStyle = gtk_rc_get_style( gWidgetData[m_nScreen].gMenuItemMenuWidget );
3400*b1cdbd2cSJim Jagielski     GtkStyle* pMenubarStyle = gtk_rc_get_style( gWidgetData[m_nScreen].gMenubarWidget );
3401*b1cdbd2cSJim Jagielski     GtkStyle* pMenuTextStyle = gtk_rc_get_style( gtk_bin_get_child( GTK_BIN(gWidgetData[m_nScreen].gMenuItemMenuWidget) ) );
3402*b1cdbd2cSJim Jagielski 
3403*b1cdbd2cSJim Jagielski     aBackColor = getColor( pMenubarStyle->bg[GTK_STATE_NORMAL] );
3404*b1cdbd2cSJim Jagielski     aStyleSet.SetMenuBarColor( aBackColor );
3405*b1cdbd2cSJim Jagielski     aBackColor = getColor( pMenuStyle->bg[GTK_STATE_NORMAL] );
3406*b1cdbd2cSJim Jagielski     aTextColor = getColor( pMenuTextStyle->fg[GTK_STATE_NORMAL] );
3407*b1cdbd2cSJim Jagielski     aStyleSet.SetMenuColor( aBackColor );
3408*b1cdbd2cSJim Jagielski     aStyleSet.SetMenuTextColor( aTextColor );
3409*b1cdbd2cSJim Jagielski 
3410*b1cdbd2cSJim Jagielski     aTextColor = getColor( pMenubarStyle->fg[GTK_STATE_NORMAL] );
3411*b1cdbd2cSJim Jagielski     aStyleSet.SetMenuBarTextColor( aTextColor );
3412*b1cdbd2cSJim Jagielski 
3413*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
3414*b1cdbd2cSJim Jagielski     std::fprintf( stderr, "==\n" );
3415*b1cdbd2cSJim Jagielski     std::fprintf( stderr, "MenuColor = %x (%d)\n", (int)aStyleSet.GetMenuColor().GetColor(), aStyleSet.GetMenuColor().GetLuminance() );
3416*b1cdbd2cSJim Jagielski     std::fprintf( stderr, "MenuTextColor = %x (%d)\n", (int)aStyleSet.GetMenuTextColor().GetColor(), aStyleSet.GetMenuTextColor().GetLuminance() );
3417*b1cdbd2cSJim Jagielski     std::fprintf( stderr, "MenuBarColor = %x (%d)\n", (int)aStyleSet.GetMenuBarColor().GetColor(), aStyleSet.GetMenuBarColor().GetLuminance() );
3418*b1cdbd2cSJim Jagielski     std::fprintf( stderr, "MenuBarTextColor = %x (%d)\n", (int)aStyleSet.GetMenuBarTextColor().GetColor(), aStyleSet.GetMenuBarTextColor().GetLuminance() );
3419*b1cdbd2cSJim Jagielski     std::fprintf( stderr, "LightColor = %x (%d)\n", (int)aStyleSet.GetLightColor().GetColor(), aStyleSet.GetLightColor().GetLuminance() );
3420*b1cdbd2cSJim Jagielski     std::fprintf( stderr, "ShadowColor = %x (%d)\n", (int)aStyleSet.GetShadowColor().GetColor(), aStyleSet.GetShadowColor().GetLuminance() );
3421*b1cdbd2cSJim Jagielski #endif
3422*b1cdbd2cSJim Jagielski 
3423*b1cdbd2cSJim Jagielski     // Awful hack for menu separators in the Sonar and similar themes.
3424*b1cdbd2cSJim Jagielski     // If the menu color is not too dark, and the menu text color is lighter,
3425*b1cdbd2cSJim Jagielski     // make the "light" color lighter than the menu color and the "shadow"
3426*b1cdbd2cSJim Jagielski     // color darker than it.
3427*b1cdbd2cSJim Jagielski     if ( aStyleSet.GetMenuColor().GetLuminance() >= 32 &&
3428*b1cdbd2cSJim Jagielski 	 aStyleSet.GetMenuColor().GetLuminance() <= aStyleSet.GetMenuTextColor().GetLuminance() )
3429*b1cdbd2cSJim Jagielski     {
3430*b1cdbd2cSJim Jagielski       Color temp = aStyleSet.GetMenuColor();
3431*b1cdbd2cSJim Jagielski       temp.IncreaseLuminance( 8 );
3432*b1cdbd2cSJim Jagielski       aStyleSet.SetLightColor( temp );
3433*b1cdbd2cSJim Jagielski       temp = aStyleSet.GetMenuColor();
3434*b1cdbd2cSJim Jagielski       temp.DecreaseLuminance( 16 );
3435*b1cdbd2cSJim Jagielski       aStyleSet.SetShadowColor( temp );
3436*b1cdbd2cSJim Jagielski     }
3437*b1cdbd2cSJim Jagielski 
3438*b1cdbd2cSJim Jagielski     aHighlightColor = getColor( pMenuItemStyle->bg[ GTK_STATE_SELECTED ] );
3439*b1cdbd2cSJim Jagielski     aHighlightTextColor = getColor( pMenuTextStyle->fg[ GTK_STATE_PRELIGHT ] );
3440*b1cdbd2cSJim Jagielski     if( aHighlightColor == aHighlightTextColor )
3441*b1cdbd2cSJim Jagielski         aHighlightTextColor = (aHighlightColor.GetLuminance() < 128) ? Color( COL_WHITE ) : Color( COL_BLACK );
3442*b1cdbd2cSJim Jagielski     aStyleSet.SetMenuHighlightColor( aHighlightColor );
3443*b1cdbd2cSJim Jagielski     aStyleSet.SetMenuHighlightTextColor( aHighlightTextColor );
3444*b1cdbd2cSJim Jagielski 
3445*b1cdbd2cSJim Jagielski     // UI font
3446*b1cdbd2cSJim Jagielski     OString	aFamily		= pango_font_description_get_family( pStyle->font_desc );
3447*b1cdbd2cSJim Jagielski     int nPangoHeight	= pango_font_description_get_size( pStyle->font_desc );
3448*b1cdbd2cSJim Jagielski     PangoStyle	eStyle	= pango_font_description_get_style( pStyle->font_desc );
3449*b1cdbd2cSJim Jagielski     PangoWeight	eWeight	= pango_font_description_get_weight( pStyle->font_desc );
3450*b1cdbd2cSJim Jagielski     PangoStretch eStretch = pango_font_description_get_stretch( pStyle->font_desc );
3451*b1cdbd2cSJim Jagielski 
3452*b1cdbd2cSJim Jagielski     psp::FastPrintFontInfo aInfo;
3453*b1cdbd2cSJim Jagielski     // set family name
3454*b1cdbd2cSJim Jagielski     aInfo.m_aFamilyName = OStringToOUString( aFamily, RTL_TEXTENCODING_UTF8 );
3455*b1cdbd2cSJim Jagielski     // set italic
3456*b1cdbd2cSJim Jagielski     switch( eStyle )
3457*b1cdbd2cSJim Jagielski     {
3458*b1cdbd2cSJim Jagielski         case PANGO_STYLE_NORMAL:	aInfo.m_eItalic = psp::italic::Upright;break;
3459*b1cdbd2cSJim Jagielski         case PANGO_STYLE_ITALIC:	aInfo.m_eItalic = psp::italic::Italic;break;
3460*b1cdbd2cSJim Jagielski         case PANGO_STYLE_OBLIQUE:	aInfo.m_eItalic = psp::italic::Oblique;break;
3461*b1cdbd2cSJim Jagielski     }
3462*b1cdbd2cSJim Jagielski     // set weight
3463*b1cdbd2cSJim Jagielski     if( eWeight <= PANGO_WEIGHT_ULTRALIGHT )
3464*b1cdbd2cSJim Jagielski         aInfo.m_eWeight = psp::weight::UltraLight;
3465*b1cdbd2cSJim Jagielski     else if( eWeight <= PANGO_WEIGHT_LIGHT )
3466*b1cdbd2cSJim Jagielski         aInfo.m_eWeight = psp::weight::Light;
3467*b1cdbd2cSJim Jagielski     else if( eWeight <= PANGO_WEIGHT_NORMAL )
3468*b1cdbd2cSJim Jagielski         aInfo.m_eWeight = psp::weight::Normal;
3469*b1cdbd2cSJim Jagielski     else if( eWeight <= PANGO_WEIGHT_BOLD )
3470*b1cdbd2cSJim Jagielski         aInfo.m_eWeight = psp::weight::Bold;
3471*b1cdbd2cSJim Jagielski     else
3472*b1cdbd2cSJim Jagielski         aInfo.m_eWeight = psp::weight::UltraBold;
3473*b1cdbd2cSJim Jagielski     // set width
3474*b1cdbd2cSJim Jagielski     switch( eStretch )
3475*b1cdbd2cSJim Jagielski     {
3476*b1cdbd2cSJim Jagielski         case PANGO_STRETCH_ULTRA_CONDENSED:	aInfo.m_eWidth = psp::width::UltraCondensed;break;
3477*b1cdbd2cSJim Jagielski         case PANGO_STRETCH_EXTRA_CONDENSED:	aInfo.m_eWidth = psp::width::ExtraCondensed;break;
3478*b1cdbd2cSJim Jagielski         case PANGO_STRETCH_CONDENSED:		aInfo.m_eWidth = psp::width::Condensed;break;
3479*b1cdbd2cSJim Jagielski         case PANGO_STRETCH_SEMI_CONDENSED:	aInfo.m_eWidth = psp::width::SemiCondensed;break;
3480*b1cdbd2cSJim Jagielski         case PANGO_STRETCH_NORMAL:			aInfo.m_eWidth = psp::width::Normal;break;
3481*b1cdbd2cSJim Jagielski         case PANGO_STRETCH_SEMI_EXPANDED:	aInfo.m_eWidth = psp::width::SemiExpanded;break;
3482*b1cdbd2cSJim Jagielski         case PANGO_STRETCH_EXPANDED:		aInfo.m_eWidth = psp::width::Expanded;break;
3483*b1cdbd2cSJim Jagielski         case PANGO_STRETCH_EXTRA_EXPANDED:	aInfo.m_eWidth = psp::width::ExtraExpanded;break;
3484*b1cdbd2cSJim Jagielski         case PANGO_STRETCH_ULTRA_EXPANDED:	aInfo.m_eWidth = psp::width::UltraExpanded;break;
3485*b1cdbd2cSJim Jagielski     }
3486*b1cdbd2cSJim Jagielski 
3487*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
3488*b1cdbd2cSJim Jagielski     std::fprintf( stderr, "font name BEFORE system match: \"%s\"\n", aFamily.getStr() );
3489*b1cdbd2cSJim Jagielski #endif
3490*b1cdbd2cSJim Jagielski 
3491*b1cdbd2cSJim Jagielski     // match font to e.g. resolve "Sans"
3492*b1cdbd2cSJim Jagielski     psp::PrintFontManager::get().matchFont( aInfo, rSettings.GetUILocale() );
3493*b1cdbd2cSJim Jagielski 
3494*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
3495*b1cdbd2cSJim Jagielski     std::fprintf( stderr, "font match %s, name AFTER: \"%s\"\n",
3496*b1cdbd2cSJim Jagielski              aInfo.m_nID != 0 ? "succeeded" : "failed",
3497*b1cdbd2cSJim Jagielski              OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() );
3498*b1cdbd2cSJim Jagielski #endif
3499*b1cdbd2cSJim Jagielski 
3500*b1cdbd2cSJim Jagielski     sal_Int32 nDispDPIY = GetDisplay()->GetResolution().B();
3501*b1cdbd2cSJim Jagielski     int nPointHeight = 0;
3502*b1cdbd2cSJim Jagielski     static gboolean(*pAbso)(const PangoFontDescription*) =
3503*b1cdbd2cSJim Jagielski         (gboolean(*)(const PangoFontDescription*))osl_getAsciiFunctionSymbol( GetSalData()->m_pPlugin, "pango_font_description_get_size_is_absolute" );
3504*b1cdbd2cSJim Jagielski 
3505*b1cdbd2cSJim Jagielski     if( pAbso && pAbso( pStyle->font_desc ) )
3506*b1cdbd2cSJim Jagielski         nPointHeight = (nPangoHeight * 72 + nDispDPIY*PANGO_SCALE/2) / (nDispDPIY * PANGO_SCALE);
3507*b1cdbd2cSJim Jagielski     else
3508*b1cdbd2cSJim Jagielski         nPointHeight = nPangoHeight/PANGO_SCALE;
3509*b1cdbd2cSJim Jagielski 
3510*b1cdbd2cSJim Jagielski     Font aFont( aInfo.m_aFamilyName, Size( 0, nPointHeight ) );
3511*b1cdbd2cSJim Jagielski     if( aInfo.m_eWeight != psp::weight::Unknown )
3512*b1cdbd2cSJim Jagielski         aFont.SetWeight( PspGraphics::ToFontWeight( aInfo.m_eWeight ) );
3513*b1cdbd2cSJim Jagielski     if( aInfo.m_eWidth != psp::width::Unknown )
3514*b1cdbd2cSJim Jagielski         aFont.SetWidthType( PspGraphics::ToFontWidth( aInfo.m_eWidth ) );
3515*b1cdbd2cSJim Jagielski     if( aInfo.m_eItalic != psp::italic::Unknown )
3516*b1cdbd2cSJim Jagielski         aFont.SetItalic( PspGraphics::ToFontItalic( aInfo.m_eItalic ) );
3517*b1cdbd2cSJim Jagielski     if( aInfo.m_ePitch != psp::pitch::Unknown )
3518*b1cdbd2cSJim Jagielski         aFont.SetPitch( PspGraphics::ToFontPitch( aInfo.m_ePitch ) );
3519*b1cdbd2cSJim Jagielski 
3520*b1cdbd2cSJim Jagielski     aStyleSet.SetAppFont( aFont );
3521*b1cdbd2cSJim Jagielski     aStyleSet.SetHelpFont( aFont );
3522*b1cdbd2cSJim Jagielski     aStyleSet.SetTitleFont( aFont );
3523*b1cdbd2cSJim Jagielski     aStyleSet.SetFloatTitleFont( aFont );
3524*b1cdbd2cSJim Jagielski     aStyleSet.SetMenuFont( aFont );
3525*b1cdbd2cSJim Jagielski     aStyleSet.SetToolFont( aFont );
3526*b1cdbd2cSJim Jagielski     aStyleSet.SetLabelFont( aFont );
3527*b1cdbd2cSJim Jagielski     aStyleSet.SetInfoFont( aFont );
3528*b1cdbd2cSJim Jagielski     aStyleSet.SetRadioCheckFont( aFont );
3529*b1cdbd2cSJim Jagielski     aStyleSet.SetPushButtonFont( aFont );
3530*b1cdbd2cSJim Jagielski     aStyleSet.SetFieldFont( aFont );
3531*b1cdbd2cSJim Jagielski     aStyleSet.SetIconFont( aFont );
3532*b1cdbd2cSJim Jagielski     aStyleSet.SetGroupFont( aFont );
3533*b1cdbd2cSJim Jagielski 
3534*b1cdbd2cSJim Jagielski     // get cursor blink time
3535*b1cdbd2cSJim Jagielski     GtkSettings *pSettings = gtk_widget_get_settings( gWidgetData[m_nScreen].gEditBoxWidget );
3536*b1cdbd2cSJim Jagielski     gboolean blink = false;
3537*b1cdbd2cSJim Jagielski 
3538*b1cdbd2cSJim Jagielski     g_object_get( pSettings, "gtk-cursor-blink", &blink, (char *)NULL );
3539*b1cdbd2cSJim Jagielski     if( blink )
3540*b1cdbd2cSJim Jagielski     {
3541*b1cdbd2cSJim Jagielski         gint blink_time = STYLE_CURSOR_NOBLINKTIME;
3542*b1cdbd2cSJim Jagielski         g_object_get( pSettings, "gtk-cursor-blink-time", &blink_time, (char *)NULL );
3543*b1cdbd2cSJim Jagielski         // set the blink_time if there is a setting and it is reasonable
3544*b1cdbd2cSJim Jagielski         // else leave the default value
3545*b1cdbd2cSJim Jagielski         if( blink_time > 100 && blink_time != gint(STYLE_CURSOR_NOBLINKTIME) )
3546*b1cdbd2cSJim Jagielski             aStyleSet.SetCursorBlinkTime( blink_time/2 );
3547*b1cdbd2cSJim Jagielski     }
3548*b1cdbd2cSJim Jagielski     else
3549*b1cdbd2cSJim Jagielski         aStyleSet.SetCursorBlinkTime( STYLE_CURSOR_NOBLINKTIME );
3550*b1cdbd2cSJim Jagielski 
3551*b1cdbd2cSJim Jagielski     gboolean showmenuicons = true;
3552*b1cdbd2cSJim Jagielski     pSettings = gtk_widget_get_settings( gWidgetData[m_nScreen].gImageMenuItem );
3553*b1cdbd2cSJim Jagielski     g_object_get( pSettings, "gtk-menu-images", &showmenuicons, (char *)NULL );
3554*b1cdbd2cSJim Jagielski     aStyleSet.SetUseImagesInMenus( showmenuicons );
3555*b1cdbd2cSJim Jagielski 
3556*b1cdbd2cSJim Jagielski     // set scrollbar settings
3557*b1cdbd2cSJim Jagielski     gint slider_width = 14;
3558*b1cdbd2cSJim Jagielski     gint trough_border = 1;
3559*b1cdbd2cSJim Jagielski     gint min_slider_length = 21;
3560*b1cdbd2cSJim Jagielski 
3561*b1cdbd2cSJim Jagielski     // Grab some button style attributes
3562*b1cdbd2cSJim Jagielski     gtk_widget_style_get( gWidgetData[m_nScreen].gScrollHorizWidget,
3563*b1cdbd2cSJim Jagielski                           "slider-width", &slider_width,
3564*b1cdbd2cSJim Jagielski                           "trough-border", &trough_border,
3565*b1cdbd2cSJim Jagielski                           "min-slider-length", &min_slider_length,
3566*b1cdbd2cSJim Jagielski                           (char *)NULL );
3567*b1cdbd2cSJim Jagielski     gint magic = trough_border ? 1 : 0;
3568*b1cdbd2cSJim Jagielski     aStyleSet.SetScrollBarSize( slider_width + 2*trough_border );
3569*b1cdbd2cSJim Jagielski     aStyleSet.SetMinThumbSize( min_slider_length - magic );
3570*b1cdbd2cSJim Jagielski 
3571*b1cdbd2cSJim Jagielski     // preferred icon style
3572*b1cdbd2cSJim Jagielski     gchar* pIconThemeName = NULL;
3573*b1cdbd2cSJim Jagielski     g_object_get( gtk_settings_get_default(), "gtk-icon-theme-name", &pIconThemeName, (char *)NULL );
3574*b1cdbd2cSJim Jagielski     aStyleSet.SetPreferredSymbolsStyleName( OUString::createFromAscii( pIconThemeName ) );
3575*b1cdbd2cSJim Jagielski     g_free( pIconThemeName );
3576*b1cdbd2cSJim Jagielski 
3577*b1cdbd2cSJim Jagielski     //  FIXME: need some way of fetching toolbar icon size.
3578*b1cdbd2cSJim Jagielski //	aStyleSet.SetToolbarIconSize( STYLE_TOOLBAR_ICONSIZE_SMALL );
3579*b1cdbd2cSJim Jagielski 
3580*b1cdbd2cSJim Jagielski     const cairo_font_options_t* pNewOptions = NULL;
3581*b1cdbd2cSJim Jagielski     if( GdkScreen* pScreen = gdk_display_get_screen( gdk_display_get_default(), m_nScreen ) )
3582*b1cdbd2cSJim Jagielski     {
3583*b1cdbd2cSJim Jagielski //#if !GTK_CHECK_VERSION(2,8,1)
3584*b1cdbd2cSJim Jagielski #if !GTK_CHECK_VERSION(2,9,0)
3585*b1cdbd2cSJim Jagielski 	static cairo_font_options_t* (*gdk_screen_get_font_options)(GdkScreen*) =
3586*b1cdbd2cSJim Jagielski 		(cairo_font_options_t*(*)(GdkScreen*))osl_getAsciiFunctionSymbol( GetSalData()->m_pPlugin, "gdk_screen_get_font_options" );
3587*b1cdbd2cSJim Jagielski     if( gdk_screen_get_font_options != NULL )
3588*b1cdbd2cSJim Jagielski #endif
3589*b1cdbd2cSJim Jagielski 		pNewOptions = gdk_screen_get_font_options( pScreen );
3590*b1cdbd2cSJim Jagielski     }
3591*b1cdbd2cSJim Jagielski     aStyleSet.SetCairoFontOptions( pNewOptions );
3592*b1cdbd2cSJim Jagielski 
3593*b1cdbd2cSJim Jagielski     // finally update the collected settings
3594*b1cdbd2cSJim Jagielski     rSettings.SetStyleSettings( aStyleSet );
3595*b1cdbd2cSJim Jagielski 
3596*b1cdbd2cSJim Jagielski     #if OSL_DEBUG_LEVEL > 1
3597*b1cdbd2cSJim Jagielski     {
3598*b1cdbd2cSJim Jagielski         GtkSettings* pGtkSettings = gtk_settings_get_default();
3599*b1cdbd2cSJim Jagielski         GValue aValue;
3600*b1cdbd2cSJim Jagielski         memset( &aValue, 0, sizeof(GValue) );
3601*b1cdbd2cSJim Jagielski         g_value_init( &aValue, G_TYPE_STRING );
3602*b1cdbd2cSJim Jagielski         g_object_get_property( G_OBJECT(pGtkSettings), "gtk-theme-name", &aValue );
3603*b1cdbd2cSJim Jagielski         const gchar* pThemeName = g_value_get_string( &aValue );
3604*b1cdbd2cSJim Jagielski         std::fprintf( stderr, "Theme name is \"%s\"\n", pThemeName );
3605*b1cdbd2cSJim Jagielski         g_value_unset( &aValue );
3606*b1cdbd2cSJim Jagielski     }
3607*b1cdbd2cSJim Jagielski     #endif
3608*b1cdbd2cSJim Jagielski     GtkSettings* pGtkSettings = gtk_settings_get_default();
3609*b1cdbd2cSJim Jagielski     GValue aValue;
3610*b1cdbd2cSJim Jagielski     memset( &aValue, 0, sizeof(GValue) );
3611*b1cdbd2cSJim Jagielski     g_value_init( &aValue, G_TYPE_STRING );
3612*b1cdbd2cSJim Jagielski     g_object_get_property( G_OBJECT(pGtkSettings), "gtk-theme-name", &aValue );
3613*b1cdbd2cSJim Jagielski     const gchar* pThemeName = g_value_get_string( &aValue );
3614*b1cdbd2cSJim Jagielski 
3615*b1cdbd2cSJim Jagielski     // default behaviour
3616*b1cdbd2cSJim Jagielski     bNeedPixmapPaint = bGlobalNeedPixmapPaint;
3617*b1cdbd2cSJim Jagielski     bToolbarGripWorkaround = false;
3618*b1cdbd2cSJim Jagielski     bNeedButtonStyleAsEditBackgroundWorkaround = false;
3619*b1cdbd2cSJim Jagielski 
3620*b1cdbd2cSJim Jagielski     // setup some workarounds for "blueprint" theme
3621*b1cdbd2cSJim Jagielski     if( pThemeName
3622*b1cdbd2cSJim Jagielski         && (   strncasecmp( pThemeName, "blueprint", 9 ) == 0
3623*b1cdbd2cSJim Jagielski             || strncasecmp( pThemeName, "Adwaita", 7 ) == 0 ))
3624*b1cdbd2cSJim Jagielski     {
3625*b1cdbd2cSJim Jagielski         bNeedButtonStyleAsEditBackgroundWorkaround = true;
3626*b1cdbd2cSJim Jagielski         if( GetX11SalData()->GetDisplay()->GetServerVendor() == vendor_sun )
3627*b1cdbd2cSJim Jagielski         {
3628*b1cdbd2cSJim Jagielski             // #i52570#, #i61532# workaround a weird paint issue;
3629*b1cdbd2cSJim Jagielski             // on a Sunray Xserver sometimes painting buttons and edits
3630*b1cdbd2cSJim Jagielski             // won't work when using the blueprint theme
3631*b1cdbd2cSJim Jagielski             // not reproducible with simpler programs or other themes
3632*b1cdbd2cSJim Jagielski             if( pThemeName && strncasecmp( pThemeName, "blueprint", 9 ) == 0 )
3633*b1cdbd2cSJim Jagielski             {
3634*b1cdbd2cSJim Jagielski                 bNeedPixmapPaint = true;
3635*b1cdbd2cSJim Jagielski                 bToolbarGripWorkaround = true;
3636*b1cdbd2cSJim Jagielski             }
3637*b1cdbd2cSJim Jagielski         }
3638*b1cdbd2cSJim Jagielski     }
3639*b1cdbd2cSJim Jagielski     // clean up
3640*b1cdbd2cSJim Jagielski     g_value_unset( &aValue );
3641*b1cdbd2cSJim Jagielski }
3642*b1cdbd2cSJim Jagielski 
3643*b1cdbd2cSJim Jagielski 
3644*b1cdbd2cSJim Jagielski /************************************************************************
3645*b1cdbd2cSJim Jagielski  * Create a GdkPixmap filled with the contents of an area of an Xlib window
3646*b1cdbd2cSJim Jagielski  ************************************************************************/
3647*b1cdbd2cSJim Jagielski 
NWGetPixmapFromScreen(Rectangle srcRect)3648*b1cdbd2cSJim Jagielski GdkPixmap* GtkSalGraphics::NWGetPixmapFromScreen( Rectangle srcRect )
3649*b1cdbd2cSJim Jagielski {
3650*b1cdbd2cSJim Jagielski     // Create a new pixmap to hold the composite of the window background and the control
3651*b1cdbd2cSJim Jagielski     GdkPixmap * pPixmap		= gdk_pixmap_new( GDK_DRAWABLE(GetGdkWindow()), srcRect.GetWidth(), srcRect.GetHeight(), -1 );
3652*b1cdbd2cSJim Jagielski 	GdkGC *	 pPixmapGC	= gdk_gc_new( pPixmap );
3653*b1cdbd2cSJim Jagielski 
3654*b1cdbd2cSJim Jagielski     if( !pPixmap || !pPixmapGC )
3655*b1cdbd2cSJim Jagielski     {
3656*b1cdbd2cSJim Jagielski         if ( pPixmap )
3657*b1cdbd2cSJim Jagielski             g_object_unref( pPixmap );
3658*b1cdbd2cSJim Jagielski         if ( pPixmapGC )
3659*b1cdbd2cSJim Jagielski             g_object_unref( pPixmapGC );
3660*b1cdbd2cSJim Jagielski         std::fprintf( stderr, "salnativewidgets-gtk.cxx: could not get valid pixmap from screen\n" );
3661*b1cdbd2cSJim Jagielski         return( NULL );
3662*b1cdbd2cSJim Jagielski     }
3663*b1cdbd2cSJim Jagielski 
3664*b1cdbd2cSJim Jagielski     // Copy the background of the screen into a composite pixmap
3665*b1cdbd2cSJim Jagielski     CopyScreenArea( GetXDisplay(),
3666*b1cdbd2cSJim Jagielski               GetDrawable(), GetScreenNumber(), GetVisual().GetDepth(),
3667*b1cdbd2cSJim Jagielski               gdk_x11_drawable_get_xid(pPixmap),
3668*b1cdbd2cSJim Jagielski               gdk_screen_get_number( gdk_drawable_get_screen( GDK_DRAWABLE(pPixmap) ) ),
3669*b1cdbd2cSJim Jagielski               gdk_drawable_get_depth( GDK_DRAWABLE( pPixmap ) ),
3670*b1cdbd2cSJim Jagielski               gdk_x11_gc_get_xgc(pPixmapGC),
3671*b1cdbd2cSJim Jagielski               srcRect.Left(), srcRect.Top(), srcRect.GetWidth(), srcRect.GetHeight(), 0, 0 );
3672*b1cdbd2cSJim Jagielski 
3673*b1cdbd2cSJim Jagielski     g_object_unref( pPixmapGC );
3674*b1cdbd2cSJim Jagielski     return( pPixmap );
3675*b1cdbd2cSJim Jagielski }
3676*b1cdbd2cSJim Jagielski 
3677*b1cdbd2cSJim Jagielski 
3678*b1cdbd2cSJim Jagielski 
3679*b1cdbd2cSJim Jagielski 
3680*b1cdbd2cSJim Jagielski /************************************************************************
3681*b1cdbd2cSJim Jagielski  * Copy an alpha pixmap to screen using a gc with clipping
3682*b1cdbd2cSJim Jagielski  ************************************************************************/
3683*b1cdbd2cSJim Jagielski 
NWRenderPixmapToScreen(GdkPixmap * pPixmap,Rectangle dstRect)3684*b1cdbd2cSJim Jagielski sal_Bool GtkSalGraphics::NWRenderPixmapToScreen( GdkPixmap* pPixmap, Rectangle dstRect )
3685*b1cdbd2cSJim Jagielski {
3686*b1cdbd2cSJim Jagielski     // The GC can't be null, otherwise we'd have no clip region
3687*b1cdbd2cSJim Jagielski     GC aFontGC = GetFontGC();
3688*b1cdbd2cSJim Jagielski     if( aFontGC == NULL )
3689*b1cdbd2cSJim Jagielski     {
3690*b1cdbd2cSJim Jagielski         std::fprintf(stderr, "salnativewidgets.cxx: no valid GC\n" );
3691*b1cdbd2cSJim Jagielski         return( sal_False );
3692*b1cdbd2cSJim Jagielski     }
3693*b1cdbd2cSJim Jagielski 
3694*b1cdbd2cSJim Jagielski     if ( !pPixmap )
3695*b1cdbd2cSJim Jagielski         return( sal_False );
3696*b1cdbd2cSJim Jagielski 
3697*b1cdbd2cSJim Jagielski     // Copy the background of the screen into a composite pixmap
3698*b1cdbd2cSJim Jagielski     CopyScreenArea( GetXDisplay(),
3699*b1cdbd2cSJim Jagielski               GDK_DRAWABLE_XID(pPixmap),
3700*b1cdbd2cSJim Jagielski               gdk_screen_get_number( gdk_drawable_get_screen( GDK_DRAWABLE(pPixmap) ) ),
3701*b1cdbd2cSJim Jagielski               gdk_drawable_get_depth( GDK_DRAWABLE(pPixmap) ),
3702*b1cdbd2cSJim Jagielski               GetDrawable(), m_nScreen, GetVisual().GetDepth(),
3703*b1cdbd2cSJim Jagielski               aFontGC,
3704*b1cdbd2cSJim Jagielski               0, 0, dstRect.GetWidth(), dstRect.GetHeight(), dstRect.Left(), dstRect.Top() );
3705*b1cdbd2cSJim Jagielski 
3706*b1cdbd2cSJim Jagielski     return( sal_True );
3707*b1cdbd2cSJim Jagielski }
3708*b1cdbd2cSJim Jagielski 
3709*b1cdbd2cSJim Jagielski 
3710*b1cdbd2cSJim Jagielski /************************************************************************
3711*b1cdbd2cSJim Jagielski  * State conversion
3712*b1cdbd2cSJim Jagielski  ************************************************************************/
NWConvertVCLStateToGTKState(ControlState nVCLState,GtkStateType * nGTKState,GtkShadowType * nGTKShadow)3713*b1cdbd2cSJim Jagielski static void NWConvertVCLStateToGTKState( ControlState nVCLState,
3714*b1cdbd2cSJim Jagielski 			GtkStateType* nGTKState, GtkShadowType* nGTKShadow )
3715*b1cdbd2cSJim Jagielski {
3716*b1cdbd2cSJim Jagielski 	*nGTKShadow = GTK_SHADOW_OUT;
3717*b1cdbd2cSJim Jagielski 	*nGTKState = GTK_STATE_INSENSITIVE;
3718*b1cdbd2cSJim Jagielski 
3719*b1cdbd2cSJim Jagielski 	if ( nVCLState & CTRL_STATE_ENABLED )
3720*b1cdbd2cSJim Jagielski 	{
3721*b1cdbd2cSJim Jagielski 		if ( nVCLState & CTRL_STATE_PRESSED )
3722*b1cdbd2cSJim Jagielski 		{
3723*b1cdbd2cSJim Jagielski 			*nGTKState = GTK_STATE_ACTIVE;
3724*b1cdbd2cSJim Jagielski 			*nGTKShadow = GTK_SHADOW_IN;
3725*b1cdbd2cSJim Jagielski 		}
3726*b1cdbd2cSJim Jagielski 		else if ( nVCLState & CTRL_STATE_ROLLOVER )
3727*b1cdbd2cSJim Jagielski 		{
3728*b1cdbd2cSJim Jagielski 			*nGTKState = GTK_STATE_PRELIGHT;
3729*b1cdbd2cSJim Jagielski 			*nGTKShadow = GTK_SHADOW_OUT;
3730*b1cdbd2cSJim Jagielski 		}
3731*b1cdbd2cSJim Jagielski 		else
3732*b1cdbd2cSJim Jagielski 		{
3733*b1cdbd2cSJim Jagielski 			*nGTKState = GTK_STATE_NORMAL;
3734*b1cdbd2cSJim Jagielski 			*nGTKShadow = GTK_SHADOW_OUT;
3735*b1cdbd2cSJim Jagielski 		}
3736*b1cdbd2cSJim Jagielski 	}
3737*b1cdbd2cSJim Jagielski }
3738*b1cdbd2cSJim Jagielski 
3739*b1cdbd2cSJim Jagielski /************************************************************************
3740*b1cdbd2cSJim Jagielski  * Set widget flags
3741*b1cdbd2cSJim Jagielski  ************************************************************************/
NWSetWidgetState(GtkWidget * widget,ControlState nState,GtkStateType nGtkState)3742*b1cdbd2cSJim Jagielski static void NWSetWidgetState( GtkWidget* widget, ControlState nState, GtkStateType nGtkState )
3743*b1cdbd2cSJim Jagielski {
3744*b1cdbd2cSJim Jagielski 	// Set to default state, then build up from there
3745*b1cdbd2cSJim Jagielski 	GTK_WIDGET_UNSET_FLAGS( widget, GTK_HAS_DEFAULT );
3746*b1cdbd2cSJim Jagielski 	GTK_WIDGET_UNSET_FLAGS( widget, GTK_HAS_FOCUS );
3747*b1cdbd2cSJim Jagielski 	GTK_WIDGET_UNSET_FLAGS( widget, GTK_SENSITIVE );
3748*b1cdbd2cSJim Jagielski 	GTK_WIDGET_SET_FLAGS( widget, gWidgetDefaultFlags[(long)widget] );
3749*b1cdbd2cSJim Jagielski 
3750*b1cdbd2cSJim Jagielski 	if ( nState & CTRL_STATE_DEFAULT )
3751*b1cdbd2cSJim Jagielski 		GTK_WIDGET_SET_FLAGS( widget, GTK_HAS_DEFAULT );
3752*b1cdbd2cSJim Jagielski 	if ( !GTK_IS_TOGGLE_BUTTON(widget) && (nState & CTRL_STATE_FOCUSED) )
3753*b1cdbd2cSJim Jagielski 		GTK_WIDGET_SET_FLAGS( widget, GTK_HAS_FOCUS );
3754*b1cdbd2cSJim Jagielski 	if ( nState & CTRL_STATE_ENABLED )
3755*b1cdbd2cSJim Jagielski 		GTK_WIDGET_SET_FLAGS( widget, GTK_SENSITIVE );
3756*b1cdbd2cSJim Jagielski 	gtk_widget_set_state( widget, nGtkState );
3757*b1cdbd2cSJim Jagielski }
3758*b1cdbd2cSJim Jagielski 
3759*b1cdbd2cSJim Jagielski /************************************************************************
3760*b1cdbd2cSJim Jagielski  * Widget ensure functions - make sure cached objects are valid
3761*b1cdbd2cSJim Jagielski  ************************************************************************/
3762*b1cdbd2cSJim Jagielski 
3763*b1cdbd2cSJim Jagielski //-------------------------------------
3764*b1cdbd2cSJim Jagielski 
NWAddWidgetToCacheWindow(GtkWidget * widget,int nScreen)3765*b1cdbd2cSJim Jagielski static void NWAddWidgetToCacheWindow( GtkWidget* widget, int nScreen )
3766*b1cdbd2cSJim Jagielski {
3767*b1cdbd2cSJim Jagielski     NWFWidgetData& rData = gWidgetData[nScreen];
3768*b1cdbd2cSJim Jagielski 	if ( !rData.gCacheWindow || !rData.gDumbContainer )
3769*b1cdbd2cSJim Jagielski 	{
3770*b1cdbd2cSJim Jagielski 		if ( !rData.gCacheWindow )
3771*b1cdbd2cSJim Jagielski         {
3772*b1cdbd2cSJim Jagielski 			rData.gCacheWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL );
3773*b1cdbd2cSJim Jagielski             GdkScreen* pScreen = gdk_display_get_screen( gdk_display_get_default(), nScreen );
3774*b1cdbd2cSJim Jagielski             if( pScreen )
3775*b1cdbd2cSJim Jagielski                 gtk_window_set_screen( GTK_WINDOW(rData.gCacheWindow), pScreen );
3776*b1cdbd2cSJim Jagielski         }
3777*b1cdbd2cSJim Jagielski 		if ( !rData.gDumbContainer )
3778*b1cdbd2cSJim Jagielski 			rData.gDumbContainer = gtk_fixed_new();
3779*b1cdbd2cSJim Jagielski 		gtk_container_add( GTK_CONTAINER(rData.gCacheWindow), rData.gDumbContainer );
3780*b1cdbd2cSJim Jagielski 		gtk_widget_realize( rData.gDumbContainer );
3781*b1cdbd2cSJim Jagielski 		gtk_widget_realize( rData.gCacheWindow );
3782*b1cdbd2cSJim Jagielski 	}
3783*b1cdbd2cSJim Jagielski 
3784*b1cdbd2cSJim Jagielski 	gtk_container_add( GTK_CONTAINER(rData.gDumbContainer), widget );
3785*b1cdbd2cSJim Jagielski 	gtk_widget_realize( widget );
3786*b1cdbd2cSJim Jagielski 	gtk_widget_ensure_style( widget );
3787*b1cdbd2cSJim Jagielski 
3788*b1cdbd2cSJim Jagielski 	// Store widget's default flags
3789*b1cdbd2cSJim Jagielski 	gWidgetDefaultFlags[ (long)widget ] = GTK_WIDGET_FLAGS( widget );
3790*b1cdbd2cSJim Jagielski }
3791*b1cdbd2cSJim Jagielski 
3792*b1cdbd2cSJim Jagielski //-------------------------------------
3793*b1cdbd2cSJim Jagielski 
NWEnsureGTKButton(int nScreen)3794*b1cdbd2cSJim Jagielski static void NWEnsureGTKButton( int nScreen )
3795*b1cdbd2cSJim Jagielski {
3796*b1cdbd2cSJim Jagielski 	if ( !gWidgetData[nScreen].gBtnWidget )
3797*b1cdbd2cSJim Jagielski 	{
3798*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gBtnWidget = gtk_button_new_with_label( "" );
3799*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gBtnWidget, nScreen );
3800*b1cdbd2cSJim Jagielski 	}
3801*b1cdbd2cSJim Jagielski }
3802*b1cdbd2cSJim Jagielski 
3803*b1cdbd2cSJim Jagielski //-------------------------------------
3804*b1cdbd2cSJim Jagielski 
NWEnsureGTKRadio(int nScreen)3805*b1cdbd2cSJim Jagielski static void NWEnsureGTKRadio( int nScreen )
3806*b1cdbd2cSJim Jagielski {
3807*b1cdbd2cSJim Jagielski 	if ( !gWidgetData[nScreen].gRadioWidget || !gWidgetData[nScreen].gRadioWidgetSibling )
3808*b1cdbd2cSJim Jagielski 	{
3809*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gRadioWidget = gtk_radio_button_new( NULL );
3810*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gRadioWidgetSibling = gtk_radio_button_new_from_widget( GTK_RADIO_BUTTON(gWidgetData[nScreen].gRadioWidget) );
3811*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gRadioWidget, nScreen );
3812*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gRadioWidgetSibling, nScreen );
3813*b1cdbd2cSJim Jagielski 	}
3814*b1cdbd2cSJim Jagielski }
3815*b1cdbd2cSJim Jagielski 
3816*b1cdbd2cSJim Jagielski //-------------------------------------
3817*b1cdbd2cSJim Jagielski 
NWEnsureGTKCheck(int nScreen)3818*b1cdbd2cSJim Jagielski static void NWEnsureGTKCheck( int nScreen )
3819*b1cdbd2cSJim Jagielski {
3820*b1cdbd2cSJim Jagielski 	if ( !gWidgetData[nScreen].gCheckWidget )
3821*b1cdbd2cSJim Jagielski 	{
3822*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gCheckWidget = gtk_check_button_new();
3823*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gCheckWidget, nScreen );
3824*b1cdbd2cSJim Jagielski 	}
3825*b1cdbd2cSJim Jagielski }
3826*b1cdbd2cSJim Jagielski 
3827*b1cdbd2cSJim Jagielski //-------------------------------------
3828*b1cdbd2cSJim Jagielski 
NWEnsureGTKScrollbars(int nScreen)3829*b1cdbd2cSJim Jagielski static void NWEnsureGTKScrollbars( int nScreen )
3830*b1cdbd2cSJim Jagielski {
3831*b1cdbd2cSJim Jagielski 	if ( !gWidgetData[nScreen].gScrollHorizWidget )
3832*b1cdbd2cSJim Jagielski 	{
3833*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gScrollHorizWidget = gtk_hscrollbar_new( NULL );
3834*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gScrollHorizWidget, nScreen );
3835*b1cdbd2cSJim Jagielski 	}
3836*b1cdbd2cSJim Jagielski 
3837*b1cdbd2cSJim Jagielski 	if ( !gWidgetData[nScreen].gScrollVertWidget )
3838*b1cdbd2cSJim Jagielski 	{
3839*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gScrollVertWidget = gtk_vscrollbar_new( NULL );
3840*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gScrollVertWidget, nScreen );
3841*b1cdbd2cSJim Jagielski 	}
3842*b1cdbd2cSJim Jagielski }
3843*b1cdbd2cSJim Jagielski 
3844*b1cdbd2cSJim Jagielski //-------------------------------------
3845*b1cdbd2cSJim Jagielski 
NWEnsureGTKArrow(int nScreen)3846*b1cdbd2cSJim Jagielski static void NWEnsureGTKArrow( int nScreen )
3847*b1cdbd2cSJim Jagielski {
3848*b1cdbd2cSJim Jagielski 	if ( !gWidgetData[nScreen].gArrowWidget || !gWidgetData[nScreen].gDropdownWidget )
3849*b1cdbd2cSJim Jagielski 	{
3850*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gDropdownWidget = gtk_toggle_button_new();
3851*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gDropdownWidget, nScreen );
3852*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gArrowWidget = gtk_arrow_new( GTK_ARROW_DOWN, GTK_SHADOW_OUT );
3853*b1cdbd2cSJim Jagielski 		gtk_container_add( GTK_CONTAINER(gWidgetData[nScreen].gDropdownWidget), gWidgetData[nScreen].gArrowWidget );
3854*b1cdbd2cSJim Jagielski 		gtk_widget_set_rc_style( gWidgetData[nScreen].gArrowWidget );
3855*b1cdbd2cSJim Jagielski 		gtk_widget_realize( gWidgetData[nScreen].gArrowWidget );
3856*b1cdbd2cSJim Jagielski 	}
3857*b1cdbd2cSJim Jagielski }
3858*b1cdbd2cSJim Jagielski 
3859*b1cdbd2cSJim Jagielski //-------------------------------------
3860*b1cdbd2cSJim Jagielski 
NWEnsureGTKEditBox(int nScreen)3861*b1cdbd2cSJim Jagielski static void NWEnsureGTKEditBox( int nScreen )
3862*b1cdbd2cSJim Jagielski {
3863*b1cdbd2cSJim Jagielski 	if ( !gWidgetData[nScreen].gEditBoxWidget )
3864*b1cdbd2cSJim Jagielski 	{
3865*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gEditBoxWidget = gtk_entry_new();
3866*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gEditBoxWidget, nScreen );
3867*b1cdbd2cSJim Jagielski 	}
3868*b1cdbd2cSJim Jagielski }
3869*b1cdbd2cSJim Jagielski 
3870*b1cdbd2cSJim Jagielski //-------------------------------------
3871*b1cdbd2cSJim Jagielski 
NWEnsureGTKSpinButton(int nScreen)3872*b1cdbd2cSJim Jagielski static void NWEnsureGTKSpinButton( int nScreen )
3873*b1cdbd2cSJim Jagielski {
3874*b1cdbd2cSJim Jagielski 	if ( !gWidgetData[nScreen].gSpinButtonWidget )
3875*b1cdbd2cSJim Jagielski 	{
3876*b1cdbd2cSJim Jagielski 		GtkAdjustment *adj = GTK_ADJUSTMENT( gtk_adjustment_new(0, 0, 1, 1, 1, 0) );
3877*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gSpinButtonWidget = gtk_spin_button_new( adj, 1, 2 );
3878*b1cdbd2cSJim Jagielski 
3879*b1cdbd2cSJim Jagielski 		//Setting non-editable means it doesn't blink, so there's no timeouts
3880*b1cdbd2cSJim Jagielski 		//running around to nobble us
3881*b1cdbd2cSJim Jagielski 		gtk_editable_set_editable(GTK_EDITABLE(gWidgetData[nScreen].gSpinButtonWidget), false);
3882*b1cdbd2cSJim Jagielski 
3883*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gSpinButtonWidget, nScreen );
3884*b1cdbd2cSJim Jagielski 	}
3885*b1cdbd2cSJim Jagielski }
3886*b1cdbd2cSJim Jagielski 
3887*b1cdbd2cSJim Jagielski //-------------------------------------
3888*b1cdbd2cSJim Jagielski 
NWEnsureGTKNotebook(int nScreen)3889*b1cdbd2cSJim Jagielski static void NWEnsureGTKNotebook( int nScreen )
3890*b1cdbd2cSJim Jagielski {
3891*b1cdbd2cSJim Jagielski 	if ( !gWidgetData[nScreen].gNotebookWidget )
3892*b1cdbd2cSJim Jagielski 	{
3893*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gNotebookWidget = gtk_notebook_new();
3894*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gNotebookWidget, nScreen );
3895*b1cdbd2cSJim Jagielski 	}
3896*b1cdbd2cSJim Jagielski }
3897*b1cdbd2cSJim Jagielski 
3898*b1cdbd2cSJim Jagielski //-------------------------------------
3899*b1cdbd2cSJim Jagielski 
NWEnsureGTKOptionMenu(int nScreen)3900*b1cdbd2cSJim Jagielski static void NWEnsureGTKOptionMenu( int nScreen )
3901*b1cdbd2cSJim Jagielski {
3902*b1cdbd2cSJim Jagielski 	if ( !gWidgetData[nScreen].gOptionMenuWidget )
3903*b1cdbd2cSJim Jagielski 	{
3904*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gOptionMenuWidget = gtk_option_menu_new();
3905*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gOptionMenuWidget, nScreen );
3906*b1cdbd2cSJim Jagielski 	}
3907*b1cdbd2cSJim Jagielski }
3908*b1cdbd2cSJim Jagielski 
3909*b1cdbd2cSJim Jagielski //-------------------------------------
3910*b1cdbd2cSJim Jagielski 
NWEnsureGTKCombo(int nScreen)3911*b1cdbd2cSJim Jagielski static void NWEnsureGTKCombo( int nScreen )
3912*b1cdbd2cSJim Jagielski {
3913*b1cdbd2cSJim Jagielski 	if ( !gWidgetData[nScreen].gComboWidget )
3914*b1cdbd2cSJim Jagielski 	{
3915*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gComboWidget = gtk_combo_new();
3916*b1cdbd2cSJim Jagielski 
3917*b1cdbd2cSJim Jagielski 		// #i59129# Setting non-editable means it doesn't blink, so
3918*b1cdbd2cSJim Jagielski         // there are no timeouts running around to nobble us
3919*b1cdbd2cSJim Jagielski 		gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(gWidgetData[nScreen].gComboWidget)->entry), false);
3920*b1cdbd2cSJim Jagielski 
3921*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gComboWidget, nScreen );
3922*b1cdbd2cSJim Jagielski 		// Must realize the ComboBox's children, since GTK
3923*b1cdbd2cSJim Jagielski 		// does not do this for us in GtkCombo::gtk_widget_realize()
3924*b1cdbd2cSJim Jagielski 		gtk_widget_realize( GTK_COMBO(gWidgetData[nScreen].gComboWidget)->button );
3925*b1cdbd2cSJim Jagielski 		gtk_widget_realize( GTK_COMBO(gWidgetData[nScreen].gComboWidget)->entry );
3926*b1cdbd2cSJim Jagielski 	}
3927*b1cdbd2cSJim Jagielski }
3928*b1cdbd2cSJim Jagielski 
3929*b1cdbd2cSJim Jagielski //-------------------------------------
3930*b1cdbd2cSJim Jagielski 
NWEnsureGTKScrolledWindow(int nScreen)3931*b1cdbd2cSJim Jagielski static void NWEnsureGTKScrolledWindow( int nScreen )
3932*b1cdbd2cSJim Jagielski {
3933*b1cdbd2cSJim Jagielski 	if ( !gWidgetData[nScreen].gScrolledWindowWidget )
3934*b1cdbd2cSJim Jagielski 	{
3935*b1cdbd2cSJim Jagielski 		GtkAdjustment *hadj = GTK_ADJUSTMENT( gtk_adjustment_new(0, 0, 0, 0, 0, 0) );
3936*b1cdbd2cSJim Jagielski 		GtkAdjustment *vadj = GTK_ADJUSTMENT( gtk_adjustment_new(0, 0, 0, 0, 0, 0) );
3937*b1cdbd2cSJim Jagielski 
3938*b1cdbd2cSJim Jagielski 		gWidgetData[nScreen].gScrolledWindowWidget = gtk_scrolled_window_new( hadj, vadj );
3939*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gScrolledWindowWidget, nScreen );
3940*b1cdbd2cSJim Jagielski 	}
3941*b1cdbd2cSJim Jagielski }
3942*b1cdbd2cSJim Jagielski 
3943*b1cdbd2cSJim Jagielski //-------------------------------------
3944*b1cdbd2cSJim Jagielski 
NWEnsureGTKToolbar(int nScreen)3945*b1cdbd2cSJim Jagielski static void NWEnsureGTKToolbar( int nScreen )
3946*b1cdbd2cSJim Jagielski {
3947*b1cdbd2cSJim Jagielski     if( !gWidgetData[nScreen].gToolbarWidget )
3948*b1cdbd2cSJim Jagielski     {
3949*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gToolbarWidget = gtk_toolbar_new();
3950*b1cdbd2cSJim Jagielski         NWAddWidgetToCacheWindow( gWidgetData[nScreen].gToolbarWidget, nScreen );
3951*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gToolbarButtonWidget = gtk_button_new();
3952*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gToolbarToggleWidget = gtk_toggle_button_new();
3953*b1cdbd2cSJim Jagielski 
3954*b1cdbd2cSJim Jagielski         GtkReliefStyle aRelief = GTK_RELIEF_NORMAL;
3955*b1cdbd2cSJim Jagielski         gtk_widget_ensure_style( gWidgetData[nScreen].gToolbarWidget );
3956*b1cdbd2cSJim Jagielski         gtk_widget_style_get( gWidgetData[nScreen].gToolbarWidget,
3957*b1cdbd2cSJim Jagielski 			                  "button_relief", &aRelief,
3958*b1cdbd2cSJim Jagielski                               (char *)NULL);
3959*b1cdbd2cSJim Jagielski 
3960*b1cdbd2cSJim Jagielski         gtk_button_set_relief( GTK_BUTTON(gWidgetData[nScreen].gToolbarButtonWidget), aRelief );
3961*b1cdbd2cSJim Jagielski         GTK_WIDGET_UNSET_FLAGS( gWidgetData[nScreen].gToolbarButtonWidget, GTK_CAN_FOCUS );
3962*b1cdbd2cSJim Jagielski         GTK_WIDGET_UNSET_FLAGS( gWidgetData[nScreen].gToolbarButtonWidget, GTK_CAN_DEFAULT );
3963*b1cdbd2cSJim Jagielski         NWAddWidgetToCacheWindow( gWidgetData[nScreen].gToolbarButtonWidget, nScreen );
3964*b1cdbd2cSJim Jagielski 
3965*b1cdbd2cSJim Jagielski         gtk_button_set_relief( GTK_BUTTON(gWidgetData[nScreen].gToolbarToggleWidget), aRelief );
3966*b1cdbd2cSJim Jagielski         GTK_WIDGET_UNSET_FLAGS( gWidgetData[nScreen].gToolbarToggleWidget, GTK_CAN_FOCUS );
3967*b1cdbd2cSJim Jagielski         GTK_WIDGET_UNSET_FLAGS( gWidgetData[nScreen].gToolbarToggleWidget, GTK_CAN_DEFAULT );
3968*b1cdbd2cSJim Jagielski         NWAddWidgetToCacheWindow( gWidgetData[nScreen].gToolbarToggleWidget, nScreen );
3969*b1cdbd2cSJim Jagielski     }
3970*b1cdbd2cSJim Jagielski     if( ! gWidgetData[nScreen].gHandleBoxWidget )
3971*b1cdbd2cSJim Jagielski     {
3972*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gHandleBoxWidget = gtk_handle_box_new();
3973*b1cdbd2cSJim Jagielski         NWAddWidgetToCacheWindow( gWidgetData[nScreen].gHandleBoxWidget, nScreen );
3974*b1cdbd2cSJim Jagielski     }
3975*b1cdbd2cSJim Jagielski }
3976*b1cdbd2cSJim Jagielski 
3977*b1cdbd2cSJim Jagielski //-------------------------------------
3978*b1cdbd2cSJim Jagielski 
NWEnsureGTKMenubar(int nScreen)3979*b1cdbd2cSJim Jagielski static void NWEnsureGTKMenubar( int nScreen )
3980*b1cdbd2cSJim Jagielski {
3981*b1cdbd2cSJim Jagielski     if( !gWidgetData[nScreen].gMenubarWidget )
3982*b1cdbd2cSJim Jagielski     {
3983*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gMenubarWidget = gtk_menu_bar_new();
3984*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gMenuItemMenubarWidget = gtk_menu_item_new_with_label( "b" );
3985*b1cdbd2cSJim Jagielski         gtk_menu_shell_append( GTK_MENU_SHELL( gWidgetData[nScreen].gMenubarWidget ), gWidgetData[nScreen].gMenuItemMenubarWidget );
3986*b1cdbd2cSJim Jagielski         gtk_widget_show( gWidgetData[nScreen].gMenuItemMenubarWidget );
3987*b1cdbd2cSJim Jagielski         NWAddWidgetToCacheWindow( gWidgetData[nScreen].gMenubarWidget, nScreen );
3988*b1cdbd2cSJim Jagielski         gtk_widget_show( gWidgetData[nScreen].gMenubarWidget );
3989*b1cdbd2cSJim Jagielski 
3990*b1cdbd2cSJim Jagielski         // do what NWAddWidgetToCacheWindow does except adding to def container
3991*b1cdbd2cSJim Jagielski         gtk_widget_realize( gWidgetData[nScreen].gMenuItemMenubarWidget );
3992*b1cdbd2cSJim Jagielski         gtk_widget_ensure_style( gWidgetData[nScreen].gMenuItemMenubarWidget );
3993*b1cdbd2cSJim Jagielski 
3994*b1cdbd2cSJim Jagielski         gWidgetDefaultFlags[ (long)gWidgetData[nScreen].gMenuItemMenubarWidget ] = GTK_WIDGET_FLAGS( gWidgetData[nScreen].gMenuItemMenubarWidget );
3995*b1cdbd2cSJim Jagielski     }
3996*b1cdbd2cSJim Jagielski }
3997*b1cdbd2cSJim Jagielski 
NWEnsureGTKMenu(int nScreen)3998*b1cdbd2cSJim Jagielski static void NWEnsureGTKMenu( int nScreen )
3999*b1cdbd2cSJim Jagielski {
4000*b1cdbd2cSJim Jagielski     if( !gWidgetData[nScreen].gMenuWidget )
4001*b1cdbd2cSJim Jagielski     {
4002*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gMenuWidget              = gtk_menu_new();
4003*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gMenuItemMenuWidget      = gtk_menu_item_new_with_label( "b" );
4004*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gMenuItemCheckMenuWidget = gtk_check_menu_item_new_with_label( "b" );
4005*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gMenuItemRadioMenuWidget = gtk_radio_menu_item_new_with_label( NULL, "b" );
4006*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gImageMenuItem           = gtk_image_menu_item_new();
4007*b1cdbd2cSJim Jagielski 
4008*b1cdbd2cSJim Jagielski         gtk_menu_shell_append( GTK_MENU_SHELL( gWidgetData[nScreen].gMenuWidget ), gWidgetData[nScreen].gMenuItemMenuWidget );
4009*b1cdbd2cSJim Jagielski         gtk_menu_shell_append( GTK_MENU_SHELL( gWidgetData[nScreen].gMenuWidget ), gWidgetData[nScreen].gMenuItemCheckMenuWidget );
4010*b1cdbd2cSJim Jagielski         gtk_menu_shell_append( GTK_MENU_SHELL( gWidgetData[nScreen].gMenuWidget ), gWidgetData[nScreen].gMenuItemRadioMenuWidget );
4011*b1cdbd2cSJim Jagielski         gtk_menu_shell_append( GTK_MENU_SHELL( gWidgetData[nScreen].gMenuWidget ), gWidgetData[nScreen].gImageMenuItem );
4012*b1cdbd2cSJim Jagielski 
4013*b1cdbd2cSJim Jagielski         // do what NWAddWidgetToCacheWindow does except adding to def container
4014*b1cdbd2cSJim Jagielski         gtk_widget_realize( gWidgetData[nScreen].gMenuWidget );
4015*b1cdbd2cSJim Jagielski         gtk_widget_ensure_style( gWidgetData[nScreen].gMenuWidget );
4016*b1cdbd2cSJim Jagielski 
4017*b1cdbd2cSJim Jagielski         gtk_widget_realize( gWidgetData[nScreen].gMenuItemMenuWidget );
4018*b1cdbd2cSJim Jagielski         gtk_widget_ensure_style( gWidgetData[nScreen].gMenuItemMenuWidget );
4019*b1cdbd2cSJim Jagielski 
4020*b1cdbd2cSJim Jagielski         gtk_widget_realize( gWidgetData[nScreen].gMenuItemCheckMenuWidget );
4021*b1cdbd2cSJim Jagielski         gtk_widget_ensure_style( gWidgetData[nScreen].gMenuItemCheckMenuWidget );
4022*b1cdbd2cSJim Jagielski 
4023*b1cdbd2cSJim Jagielski         gtk_widget_realize( gWidgetData[nScreen].gMenuItemRadioMenuWidget );
4024*b1cdbd2cSJim Jagielski         gtk_widget_ensure_style( gWidgetData[nScreen].gMenuItemRadioMenuWidget );
4025*b1cdbd2cSJim Jagielski 
4026*b1cdbd2cSJim Jagielski         gtk_widget_realize( gWidgetData[nScreen].gImageMenuItem );
4027*b1cdbd2cSJim Jagielski         gtk_widget_ensure_style( gWidgetData[nScreen].gImageMenuItem );
4028*b1cdbd2cSJim Jagielski 
4029*b1cdbd2cSJim Jagielski         gWidgetDefaultFlags[ (long)gWidgetData[nScreen].gMenuWidget ] = GTK_WIDGET_FLAGS( gWidgetData[nScreen].gMenuWidget );
4030*b1cdbd2cSJim Jagielski         gWidgetDefaultFlags[ (long)gWidgetData[nScreen].gMenuItemMenuWidget ] = GTK_WIDGET_FLAGS( gWidgetData[nScreen].gMenuItemMenuWidget );
4031*b1cdbd2cSJim Jagielski         gWidgetDefaultFlags[ (long)gWidgetData[nScreen].gMenuItemCheckMenuWidget ] = GTK_WIDGET_FLAGS( gWidgetData[nScreen].gMenuItemCheckMenuWidget );
4032*b1cdbd2cSJim Jagielski         gWidgetDefaultFlags[ (long)gWidgetData[nScreen].gMenuItemRadioMenuWidget ] = GTK_WIDGET_FLAGS( gWidgetData[nScreen].gMenuItemRadioMenuWidget );
4033*b1cdbd2cSJim Jagielski         gWidgetDefaultFlags[ (long)gWidgetData[nScreen].gImageMenuItem ] = GTK_WIDGET_FLAGS( gWidgetData[nScreen].gImageMenuItem );
4034*b1cdbd2cSJim Jagielski     }
4035*b1cdbd2cSJim Jagielski }
4036*b1cdbd2cSJim Jagielski 
NWEnsureGTKTooltip(int nScreen)4037*b1cdbd2cSJim Jagielski static void NWEnsureGTKTooltip( int nScreen )
4038*b1cdbd2cSJim Jagielski {
4039*b1cdbd2cSJim Jagielski     if( !gWidgetData[nScreen].gTooltipPopup )
4040*b1cdbd2cSJim Jagielski     {
4041*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gTooltipPopup = gtk_window_new (GTK_WINDOW_POPUP);
4042*b1cdbd2cSJim Jagielski         GdkScreen* pScreen = gdk_display_get_screen( gdk_display_get_default(), nScreen );
4043*b1cdbd2cSJim Jagielski         if( pScreen )
4044*b1cdbd2cSJim Jagielski             gtk_window_set_screen( GTK_WINDOW(gWidgetData[nScreen].gTooltipPopup), pScreen );
4045*b1cdbd2cSJim Jagielski         gtk_widget_set_name( gWidgetData[nScreen].gTooltipPopup, "gtk-tooltips");
4046*b1cdbd2cSJim Jagielski         gtk_widget_realize( gWidgetData[nScreen].gTooltipPopup );
4047*b1cdbd2cSJim Jagielski         gtk_widget_ensure_style( gWidgetData[nScreen].gTooltipPopup );
4048*b1cdbd2cSJim Jagielski     }
4049*b1cdbd2cSJim Jagielski }
4050*b1cdbd2cSJim Jagielski 
NWEnsureGTKProgressBar(int nScreen)4051*b1cdbd2cSJim Jagielski static void NWEnsureGTKProgressBar( int nScreen )
4052*b1cdbd2cSJim Jagielski {
4053*b1cdbd2cSJim Jagielski     if( !gWidgetData[nScreen].gProgressBar )
4054*b1cdbd2cSJim Jagielski     {
4055*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gProgressBar = gtk_progress_bar_new ();
4056*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gProgressBar, nScreen );
4057*b1cdbd2cSJim Jagielski     }
4058*b1cdbd2cSJim Jagielski }
4059*b1cdbd2cSJim Jagielski 
NWEnsureGTKTreeView(int nScreen)4060*b1cdbd2cSJim Jagielski static void NWEnsureGTKTreeView( int nScreen )
4061*b1cdbd2cSJim Jagielski {
4062*b1cdbd2cSJim Jagielski     if( !gWidgetData[nScreen].gTreeView )
4063*b1cdbd2cSJim Jagielski     {
4064*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gTreeView = gtk_tree_view_new ();
4065*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gTreeView, nScreen );
4066*b1cdbd2cSJim Jagielski     }
4067*b1cdbd2cSJim Jagielski }
4068*b1cdbd2cSJim Jagielski 
NWEnsureGTKSlider(int nScreen)4069*b1cdbd2cSJim Jagielski static void NWEnsureGTKSlider( int nScreen )
4070*b1cdbd2cSJim Jagielski {
4071*b1cdbd2cSJim Jagielski     if( !gWidgetData[nScreen].gHScale )
4072*b1cdbd2cSJim Jagielski     {
4073*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gHScale = gtk_hscale_new_with_range(0, 10, 1);
4074*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gHScale, nScreen );
4075*b1cdbd2cSJim Jagielski     }
4076*b1cdbd2cSJim Jagielski     if( !gWidgetData[nScreen].gVScale )
4077*b1cdbd2cSJim Jagielski     {
4078*b1cdbd2cSJim Jagielski         gWidgetData[nScreen].gVScale = gtk_vscale_new_with_range(0, 10, 1);
4079*b1cdbd2cSJim Jagielski 		NWAddWidgetToCacheWindow( gWidgetData[nScreen].gVScale, nScreen );
4080*b1cdbd2cSJim Jagielski     }
4081*b1cdbd2cSJim Jagielski }
4082