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