xref: /aoo4110/main/vcl/source/control/tabctrl.cxx (revision b1cdbd2c)
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 "tools/debug.hxx"
28*b1cdbd2cSJim Jagielski #include "tools/rc.h"
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include "vcl/svapp.hxx"
31*b1cdbd2cSJim Jagielski #include "vcl/help.hxx"
32*b1cdbd2cSJim Jagielski #include "vcl/event.hxx"
33*b1cdbd2cSJim Jagielski #include "vcl/menu.hxx"
34*b1cdbd2cSJim Jagielski #include "vcl/button.hxx"
35*b1cdbd2cSJim Jagielski #include "vcl/tabpage.hxx"
36*b1cdbd2cSJim Jagielski #include "vcl/tabctrl.hxx"
37*b1cdbd2cSJim Jagielski #include "vcl/controllayout.hxx"
38*b1cdbd2cSJim Jagielski #include "vcl/sound.hxx"
39*b1cdbd2cSJim Jagielski #include "vcl/lstbox.hxx"
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #include "controldata.hxx"
42*b1cdbd2cSJim Jagielski #include "svdata.hxx"
43*b1cdbd2cSJim Jagielski #include "window.h"
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #include <hash_map>
46*b1cdbd2cSJim Jagielski #include <vector>
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski // =======================================================================
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski struct ImplTabItem
51*b1cdbd2cSJim Jagielski {
52*b1cdbd2cSJim Jagielski     sal_uInt16              mnId;
53*b1cdbd2cSJim Jagielski     sal_uInt16              mnTabPageResId;
54*b1cdbd2cSJim Jagielski     TabPage*            mpTabPage;
55*b1cdbd2cSJim Jagielski     String              maText;
56*b1cdbd2cSJim Jagielski     String              maFormatText;
57*b1cdbd2cSJim Jagielski     String              maHelpText;
58*b1cdbd2cSJim Jagielski     rtl::OString        maHelpId;
59*b1cdbd2cSJim Jagielski     Rectangle           maRect;
60*b1cdbd2cSJim Jagielski     sal_uInt16              mnLine;
61*b1cdbd2cSJim Jagielski     bool                mbFullVisible;
62*b1cdbd2cSJim Jagielski     bool                mbEnabled;
63*b1cdbd2cSJim Jagielski     Image               maTabImage;
64*b1cdbd2cSJim Jagielski 
ImplTabItemImplTabItem65*b1cdbd2cSJim Jagielski     ImplTabItem()
66*b1cdbd2cSJim Jagielski     : mnId( 0 ), mnTabPageResId( 0 ), mpTabPage( NULL ),
67*b1cdbd2cSJim Jagielski       mnLine( 0 ), mbFullVisible( sal_False ), mbEnabled( true )
68*b1cdbd2cSJim Jagielski     {}
69*b1cdbd2cSJim Jagielski };
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski struct ImplTabCtrlData
74*b1cdbd2cSJim Jagielski {
75*b1cdbd2cSJim Jagielski     std::hash_map< int, int >		maLayoutPageIdToLine;
76*b1cdbd2cSJim Jagielski     std::hash_map< int, int >		maLayoutLineToPageId;
77*b1cdbd2cSJim Jagielski     std::vector< Rectangle >		maTabRectangles;
78*b1cdbd2cSJim Jagielski     Point                           maItemsOffset;       // offset of the tabitems
79*b1cdbd2cSJim Jagielski     std::vector< ImplTabItem >      maItemList;
80*b1cdbd2cSJim Jagielski     ListBox*                        mpListBox;
81*b1cdbd2cSJim Jagielski     Size                            maMinSize;
82*b1cdbd2cSJim Jagielski };
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski #define TAB_OFFSET          3
87*b1cdbd2cSJim Jagielski #define TAB_TABOFFSET_X     3
88*b1cdbd2cSJim Jagielski #define TAB_TABOFFSET_Y     3
89*b1cdbd2cSJim Jagielski #define TAB_EXTRASPACE_X    6
90*b1cdbd2cSJim Jagielski #define TAB_BORDER_LEFT     1
91*b1cdbd2cSJim Jagielski #define TAB_BORDER_TOP      1
92*b1cdbd2cSJim Jagielski #define TAB_BORDER_RIGHT    2
93*b1cdbd2cSJim Jagielski #define TAB_BORDER_BOTTOM   2
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski // Fuer die Ermittlung von den Tab-Positionen
96*b1cdbd2cSJim Jagielski #define TAB_PAGERECT        0xFFFF
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski // =======================================================================
99*b1cdbd2cSJim Jagielski 
ImplInit(Window * pParent,WinBits nStyle)100*b1cdbd2cSJim Jagielski void TabControl::ImplInit( Window* pParent, WinBits nStyle )
101*b1cdbd2cSJim Jagielski {
102*b1cdbd2cSJim Jagielski     if ( !(nStyle & WB_NOTABSTOP) )
103*b1cdbd2cSJim Jagielski         nStyle |= WB_TABSTOP;
104*b1cdbd2cSJim Jagielski     if ( !(nStyle & WB_NOGROUP) )
105*b1cdbd2cSJim Jagielski         nStyle |= WB_GROUP;
106*b1cdbd2cSJim Jagielski     if ( !(nStyle & WB_NODIALOGCONTROL) )
107*b1cdbd2cSJim Jagielski         nStyle |= WB_DIALOGCONTROL;
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski     Control::ImplInit( pParent, nStyle, NULL );
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski     mnLastWidth         		= 0;
112*b1cdbd2cSJim Jagielski     mnLastHeight        		= 0;
113*b1cdbd2cSJim Jagielski     mnBtnSize           		= 0;
114*b1cdbd2cSJim Jagielski     mnMaxPageWidth      		= 0;
115*b1cdbd2cSJim Jagielski     mnActPageId         		= 0;
116*b1cdbd2cSJim Jagielski     mnCurPageId         		= 0;
117*b1cdbd2cSJim Jagielski     mbFormat            		= sal_True;
118*b1cdbd2cSJim Jagielski     mbRestoreHelpId     		= sal_False;
119*b1cdbd2cSJim Jagielski     mbRestoreUnqId      		= sal_False;
120*b1cdbd2cSJim Jagielski     mbSmallInvalidate   		= sal_False;
121*b1cdbd2cSJim Jagielski     mbExtraSpace        		= sal_False;
122*b1cdbd2cSJim Jagielski     mpTabCtrlData               = new ImplTabCtrlData;
123*b1cdbd2cSJim Jagielski     mpTabCtrlData->mpListBox    = NULL;
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski     ImplInitSettings( sal_True, sal_True, sal_True );
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski     if( (nStyle & WB_DROPDOWN) )
129*b1cdbd2cSJim Jagielski     {
130*b1cdbd2cSJim Jagielski         mpTabCtrlData->mpListBox = new ListBox( this, WB_DROPDOWN );
131*b1cdbd2cSJim Jagielski         mpTabCtrlData->mpListBox->SetPosSizePixel( Point( 0, 0 ), Size( 200, 20 ) );
132*b1cdbd2cSJim Jagielski         mpTabCtrlData->mpListBox->SetSelectHdl( LINK( this, TabControl, ImplListBoxSelectHdl ) );
133*b1cdbd2cSJim Jagielski         mpTabCtrlData->mpListBox->Show();
134*b1cdbd2cSJim Jagielski     }
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski     // if the tabcontrol is drawn (ie filled) by a native widget, make sure all contols will have transparent background
137*b1cdbd2cSJim Jagielski     // otherwise they will paint with a wrong background
138*b1cdbd2cSJim Jagielski     if( IsNativeControlSupported(CTRL_TAB_PANE, PART_ENTIRE_CONTROL) )
139*b1cdbd2cSJim Jagielski         EnableChildTransparentMode( sal_True );
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski     if ( pParent->IsDialog() )
142*b1cdbd2cSJim Jagielski         pParent->AddChildEventListener( LINK( this, TabControl, ImplWindowEventListener ) );
143*b1cdbd2cSJim Jagielski }
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------
146*b1cdbd2cSJim Jagielski 
GetCanonicalFont(const StyleSettings & _rStyle) const147*b1cdbd2cSJim Jagielski const Font& TabControl::GetCanonicalFont( const StyleSettings& _rStyle ) const
148*b1cdbd2cSJim Jagielski {
149*b1cdbd2cSJim Jagielski     return _rStyle.GetAppFont();
150*b1cdbd2cSJim Jagielski }
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------
GetCanonicalTextColor(const StyleSettings & _rStyle) const153*b1cdbd2cSJim Jagielski const Color& TabControl::GetCanonicalTextColor( const StyleSettings& _rStyle ) const
154*b1cdbd2cSJim Jagielski {
155*b1cdbd2cSJim Jagielski     return _rStyle.GetButtonTextColor();
156*b1cdbd2cSJim Jagielski }
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
159*b1cdbd2cSJim Jagielski 
ImplInitSettings(sal_Bool bFont,sal_Bool bForeground,sal_Bool bBackground)160*b1cdbd2cSJim Jagielski void TabControl::ImplInitSettings( sal_Bool bFont,
161*b1cdbd2cSJim Jagielski                                    sal_Bool bForeground, sal_Bool bBackground )
162*b1cdbd2cSJim Jagielski {
163*b1cdbd2cSJim Jagielski     Control::ImplInitSettings( bFont, bForeground );
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski     if ( bBackground )
166*b1cdbd2cSJim Jagielski     {
167*b1cdbd2cSJim Jagielski         Window* pParent = GetParent();
168*b1cdbd2cSJim Jagielski         if ( !IsControlBackground() &&
169*b1cdbd2cSJim Jagielski             (pParent->IsChildTransparentModeEnabled()
170*b1cdbd2cSJim Jagielski             || IsNativeControlSupported(CTRL_TAB_PANE, PART_ENTIRE_CONTROL)
171*b1cdbd2cSJim Jagielski             || IsNativeControlSupported(CTRL_TAB_ITEM, PART_ENTIRE_CONTROL) ) )
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski         {
174*b1cdbd2cSJim Jagielski             // set transparent mode for NWF tabcontrols to have
175*b1cdbd2cSJim Jagielski             // the background always cleared properly
176*b1cdbd2cSJim Jagielski             EnableChildTransparentMode( sal_True );
177*b1cdbd2cSJim Jagielski             SetParentClipMode( PARENTCLIPMODE_NOCLIP );
178*b1cdbd2cSJim Jagielski             SetPaintTransparent( sal_True );
179*b1cdbd2cSJim Jagielski             SetBackground();
180*b1cdbd2cSJim Jagielski             ImplGetWindowImpl()->mbUseNativeFocus = ImplGetSVData()->maNWFData.mbNoFocusRects;
181*b1cdbd2cSJim Jagielski         }
182*b1cdbd2cSJim Jagielski         else
183*b1cdbd2cSJim Jagielski         {
184*b1cdbd2cSJim Jagielski             EnableChildTransparentMode( sal_False );
185*b1cdbd2cSJim Jagielski             SetParentClipMode( 0 );
186*b1cdbd2cSJim Jagielski             SetPaintTransparent( sal_False );
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski             if ( IsControlBackground() )
189*b1cdbd2cSJim Jagielski                 SetBackground( GetControlBackground() );
190*b1cdbd2cSJim Jagielski             else
191*b1cdbd2cSJim Jagielski                 SetBackground( pParent->GetBackground() );
192*b1cdbd2cSJim Jagielski         }
193*b1cdbd2cSJim Jagielski     }
194*b1cdbd2cSJim Jagielski }
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
197*b1cdbd2cSJim Jagielski 
ImplFreeLayoutData()198*b1cdbd2cSJim Jagielski void TabControl::ImplFreeLayoutData()
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski     if( HasLayoutData() )
201*b1cdbd2cSJim Jagielski     {
202*b1cdbd2cSJim Jagielski         ImplClearLayoutData();
203*b1cdbd2cSJim Jagielski         mpTabCtrlData->maLayoutPageIdToLine.clear();
204*b1cdbd2cSJim Jagielski         mpTabCtrlData->maLayoutLineToPageId.clear();
205*b1cdbd2cSJim Jagielski     }
206*b1cdbd2cSJim Jagielski }
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
209*b1cdbd2cSJim Jagielski 
TabControl(Window * pParent,WinBits nStyle)210*b1cdbd2cSJim Jagielski TabControl::TabControl( Window* pParent, WinBits nStyle ) :
211*b1cdbd2cSJim Jagielski     Control( WINDOW_TABCONTROL )
212*b1cdbd2cSJim Jagielski {
213*b1cdbd2cSJim Jagielski     ImplInit( pParent, nStyle );
214*b1cdbd2cSJim Jagielski }
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
217*b1cdbd2cSJim Jagielski 
TabControl(Window * pParent,const ResId & rResId)218*b1cdbd2cSJim Jagielski TabControl::TabControl( Window* pParent, const ResId& rResId ) :
219*b1cdbd2cSJim Jagielski     Control( WINDOW_TABCONTROL )
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski     rResId.SetRT( RSC_TABCONTROL );
222*b1cdbd2cSJim Jagielski     WinBits nStyle = ImplInitRes( rResId );
223*b1cdbd2cSJim Jagielski     ImplInit( pParent, nStyle );
224*b1cdbd2cSJim Jagielski     ImplLoadRes( rResId );
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski     if ( !(nStyle & WB_HIDE) )
227*b1cdbd2cSJim Jagielski         Show();
228*b1cdbd2cSJim Jagielski }
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
231*b1cdbd2cSJim Jagielski 
ImplLoadRes(const ResId & rResId)232*b1cdbd2cSJim Jagielski void TabControl::ImplLoadRes( const ResId& rResId )
233*b1cdbd2cSJim Jagielski {
234*b1cdbd2cSJim Jagielski     Control::ImplLoadRes( rResId );
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski     sal_uLong nObjMask = ReadLongRes();
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski     if ( nObjMask & RSC_TABCONTROL_ITEMLIST )
239*b1cdbd2cSJim Jagielski     {
240*b1cdbd2cSJim Jagielski         sal_uLong nEle = ReadLongRes();
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski         // Item hinzufuegen
243*b1cdbd2cSJim Jagielski         for( sal_uLong i = 0; i < nEle; i++ )
244*b1cdbd2cSJim Jagielski         {
245*b1cdbd2cSJim Jagielski             InsertPage( ResId( (RSHEADER_TYPE *)GetClassRes(), *rResId.GetResMgr() ) );
246*b1cdbd2cSJim Jagielski             IncrementRes( GetObjSizeRes( (RSHEADER_TYPE *)GetClassRes() ) );
247*b1cdbd2cSJim Jagielski         }
248*b1cdbd2cSJim Jagielski     }
249*b1cdbd2cSJim Jagielski }
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
252*b1cdbd2cSJim Jagielski 
~TabControl()253*b1cdbd2cSJim Jagielski TabControl::~TabControl()
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski     if ( GetParent()->IsDialog() )
256*b1cdbd2cSJim Jagielski         GetParent()->RemoveChildEventListener( LINK( this, TabControl, ImplWindowEventListener ) );
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski     ImplFreeLayoutData();
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski     // TabCtrl-Daten loeschen
261*b1cdbd2cSJim Jagielski     if ( mpTabCtrlData )
262*b1cdbd2cSJim Jagielski     {
263*b1cdbd2cSJim Jagielski         if( mpTabCtrlData->mpListBox )
264*b1cdbd2cSJim Jagielski             delete mpTabCtrlData->mpListBox;
265*b1cdbd2cSJim Jagielski         delete mpTabCtrlData;
266*b1cdbd2cSJim Jagielski     }
267*b1cdbd2cSJim Jagielski }
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
270*b1cdbd2cSJim Jagielski 
ImplGetItem(sal_uInt16 nId) const271*b1cdbd2cSJim Jagielski ImplTabItem* TabControl::ImplGetItem( sal_uInt16 nId ) const
272*b1cdbd2cSJim Jagielski {
273*b1cdbd2cSJim Jagielski     for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin();
274*b1cdbd2cSJim Jagielski          it != mpTabCtrlData->maItemList.end(); ++it )
275*b1cdbd2cSJim Jagielski     {
276*b1cdbd2cSJim Jagielski         if( it->mnId == nId )
277*b1cdbd2cSJim Jagielski             return &(*it);
278*b1cdbd2cSJim Jagielski     }
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski     return NULL;
281*b1cdbd2cSJim Jagielski }
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
284*b1cdbd2cSJim Jagielski 
ImplGetItemSize(ImplTabItem * pItem,long nMaxWidth)285*b1cdbd2cSJim Jagielski Size TabControl::ImplGetItemSize( ImplTabItem* pItem, long nMaxWidth )
286*b1cdbd2cSJim Jagielski {
287*b1cdbd2cSJim Jagielski     pItem->maFormatText = pItem->maText;
288*b1cdbd2cSJim Jagielski     Size aSize( GetCtrlTextWidth( pItem->maFormatText ), GetTextHeight() );
289*b1cdbd2cSJim Jagielski     Size aImageSize( 0, 0 );
290*b1cdbd2cSJim Jagielski     if( !!pItem->maTabImage )
291*b1cdbd2cSJim Jagielski     {
292*b1cdbd2cSJim Jagielski         aImageSize = pItem->maTabImage.GetSizePixel();
293*b1cdbd2cSJim Jagielski         if( pItem->maFormatText.Len() )
294*b1cdbd2cSJim Jagielski             aImageSize.Width() += GetTextHeight()/4;
295*b1cdbd2cSJim Jagielski     }
296*b1cdbd2cSJim Jagielski     aSize.Width() += aImageSize.Width();
297*b1cdbd2cSJim Jagielski     if( aImageSize.Height() > aSize.Height() )
298*b1cdbd2cSJim Jagielski         aSize.Height() = aImageSize.Height();
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski     aSize.Width()  += TAB_TABOFFSET_X*2;
301*b1cdbd2cSJim Jagielski     aSize.Height() += TAB_TABOFFSET_Y*2;
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski     Rectangle aCtrlRegion( Point( 0, 0 ), aSize );
304*b1cdbd2cSJim Jagielski     Rectangle aBoundingRgn, aContentRgn;
305*b1cdbd2cSJim Jagielski     const ImplControlValue aControlValue;
306*b1cdbd2cSJim Jagielski     if(GetNativeControlRegion( CTRL_TAB_ITEM, PART_ENTIRE_CONTROL, aCtrlRegion,
307*b1cdbd2cSJim Jagielski                                            CTRL_STATE_ENABLED, aControlValue, rtl::OUString(),
308*b1cdbd2cSJim Jagielski                                            aBoundingRgn, aContentRgn ) )
309*b1cdbd2cSJim Jagielski     {
310*b1cdbd2cSJim Jagielski         return aContentRgn.GetSize();
311*b1cdbd2cSJim Jagielski     }
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski     // For systems without synthetic bold support
314*b1cdbd2cSJim Jagielski     if ( mbExtraSpace )
315*b1cdbd2cSJim Jagielski         aSize.Width() += TAB_EXTRASPACE_X;
316*b1cdbd2cSJim Jagielski     // For languages with short names (e.g. Chinese), because the space is
317*b1cdbd2cSJim Jagielski     // normally only one pixel per char
318*b1cdbd2cSJim Jagielski     else if ( pItem->maFormatText.Len() < TAB_EXTRASPACE_X )
319*b1cdbd2cSJim Jagielski         aSize.Width() += TAB_EXTRASPACE_X-pItem->maFormatText.Len();
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski     // Evt. den Text kuerzen
322*b1cdbd2cSJim Jagielski     if ( aSize.Width()+4 >= nMaxWidth )
323*b1cdbd2cSJim Jagielski     {
324*b1cdbd2cSJim Jagielski         XubString aAppendStr( RTL_CONSTASCII_USTRINGPARAM( "..." ) );
325*b1cdbd2cSJim Jagielski         pItem->maFormatText += aAppendStr;
326*b1cdbd2cSJim Jagielski         do
327*b1cdbd2cSJim Jagielski         {
328*b1cdbd2cSJim Jagielski             pItem->maFormatText.Erase( pItem->maFormatText.Len()-aAppendStr.Len()-1, 1 );
329*b1cdbd2cSJim Jagielski             aSize.Width() = GetCtrlTextWidth( pItem->maFormatText );
330*b1cdbd2cSJim Jagielski             aSize.Width() += aImageSize.Width();
331*b1cdbd2cSJim Jagielski             aSize.Width() += TAB_TABOFFSET_X*2;
332*b1cdbd2cSJim Jagielski         }
333*b1cdbd2cSJim Jagielski         while ( (aSize.Width()+4 >= nMaxWidth) && (pItem->maFormatText.Len() > aAppendStr.Len()) );
334*b1cdbd2cSJim Jagielski         if ( aSize.Width()+4 >= nMaxWidth )
335*b1cdbd2cSJim Jagielski         {
336*b1cdbd2cSJim Jagielski             pItem->maFormatText.Assign( '.' );
337*b1cdbd2cSJim Jagielski             aSize.Width() = 1;
338*b1cdbd2cSJim Jagielski         }
339*b1cdbd2cSJim Jagielski     }
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski     if( pItem->maFormatText.Len() == 0 )
342*b1cdbd2cSJim Jagielski     {
343*b1cdbd2cSJim Jagielski         if( aSize.Height() < aImageSize.Height()+4 ) //leave space for focus rect
344*b1cdbd2cSJim Jagielski             aSize.Height() = aImageSize.Height()+4;
345*b1cdbd2cSJim Jagielski     }
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski     return aSize;
348*b1cdbd2cSJim Jagielski }
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
351*b1cdbd2cSJim Jagielski 
ImplGetTabRect(sal_uInt16 nItemPos,long nWidth,long nHeight)352*b1cdbd2cSJim Jagielski Rectangle TabControl::ImplGetTabRect( sal_uInt16 nItemPos, long nWidth, long nHeight )
353*b1cdbd2cSJim Jagielski {
354*b1cdbd2cSJim Jagielski     Size aWinSize = Control::GetOutputSizePixel();
355*b1cdbd2cSJim Jagielski     if ( nWidth < 0 )
356*b1cdbd2cSJim Jagielski         nWidth = aWinSize.Width();
357*b1cdbd2cSJim Jagielski     if ( nHeight < 0 )
358*b1cdbd2cSJim Jagielski         nHeight = aWinSize.Height();
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski     if ( mpTabCtrlData->maItemList.empty() )
361*b1cdbd2cSJim Jagielski     {
362*b1cdbd2cSJim Jagielski         long nW = nWidth-TAB_OFFSET*2;
363*b1cdbd2cSJim Jagielski         long nH = nHeight-TAB_OFFSET*2;
364*b1cdbd2cSJim Jagielski         return (nW > 0 && nH > 0)
365*b1cdbd2cSJim Jagielski         ? Rectangle( Point( TAB_OFFSET, TAB_OFFSET ), Size( nW, nH ) )
366*b1cdbd2cSJim Jagielski         : Rectangle();
367*b1cdbd2cSJim Jagielski     }
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski     if ( nItemPos == TAB_PAGERECT )
370*b1cdbd2cSJim Jagielski     {
371*b1cdbd2cSJim Jagielski         sal_uInt16 nLastPos;
372*b1cdbd2cSJim Jagielski         if ( mnCurPageId )
373*b1cdbd2cSJim Jagielski             nLastPos = GetPagePos( mnCurPageId );
374*b1cdbd2cSJim Jagielski         else
375*b1cdbd2cSJim Jagielski             nLastPos = 0;
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski         Rectangle aRect = ImplGetTabRect( nLastPos, nWidth, nHeight );
378*b1cdbd2cSJim Jagielski         long nW = nWidth-TAB_OFFSET*2;
379*b1cdbd2cSJim Jagielski         long nH = nHeight-aRect.Bottom()-TAB_OFFSET*2;
380*b1cdbd2cSJim Jagielski         aRect = (nW > 0 && nH > 0)
381*b1cdbd2cSJim Jagielski         ? Rectangle( Point( TAB_OFFSET, aRect.Bottom()+TAB_OFFSET ), Size( nW, nH ) )
382*b1cdbd2cSJim Jagielski         : Rectangle();
383*b1cdbd2cSJim Jagielski         return aRect;
384*b1cdbd2cSJim Jagielski     }
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski     nWidth -= 1;
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski     if ( (nWidth <= 0) || (nHeight <= 0) )
389*b1cdbd2cSJim Jagielski         return Rectangle();
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski     if ( mbFormat || (mnLastWidth != nWidth) || (mnLastHeight != nHeight) )
392*b1cdbd2cSJim Jagielski     {
393*b1cdbd2cSJim Jagielski         Font aFont( GetFont() );
394*b1cdbd2cSJim Jagielski         Font aLightFont = aFont;
395*b1cdbd2cSJim Jagielski         aFont.SetTransparent( sal_True );
396*b1cdbd2cSJim Jagielski         aFont.SetWeight( (!ImplGetSVData()->maNWFData.mbNoBoldTabFocus) ? WEIGHT_BOLD : WEIGHT_LIGHT );
397*b1cdbd2cSJim Jagielski         aLightFont.SetTransparent( sal_True );
398*b1cdbd2cSJim Jagielski         aLightFont.SetWeight( WEIGHT_LIGHT );
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski         // If Bold and none Bold strings have the same width, we
401*b1cdbd2cSJim Jagielski         // add in the calcultion extra space, so that the tabs
402*b1cdbd2cSJim Jagielski         // looks better. The could be the case on systems without
403*b1cdbd2cSJim Jagielski         // an bold UI font and without synthetic bold support
404*b1cdbd2cSJim Jagielski         XubString aTestStr( RTL_CONSTASCII_USTRINGPARAM( "Abc." ) );
405*b1cdbd2cSJim Jagielski         SetFont( aLightFont );
406*b1cdbd2cSJim Jagielski         long nTextWidth1 = GetTextWidth( aTestStr );
407*b1cdbd2cSJim Jagielski         SetFont( aFont );
408*b1cdbd2cSJim Jagielski         long nTextWidth2 = GetTextWidth( aTestStr );
409*b1cdbd2cSJim Jagielski         mbExtraSpace = (nTextWidth1 == nTextWidth2);
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski         Size            aSize;
412*b1cdbd2cSJim Jagielski         const long      nOffsetX = 2 + GetItemsOffset().X();
413*b1cdbd2cSJim Jagielski         const long      nOffsetY = 2 + GetItemsOffset().Y();
414*b1cdbd2cSJim Jagielski         long            nX = nOffsetX;
415*b1cdbd2cSJim Jagielski         long            nY = nOffsetY;
416*b1cdbd2cSJim Jagielski         long            nMaxWidth = nWidth;
417*b1cdbd2cSJim Jagielski         sal_uInt16          nPos = 0;
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski         if ( (mnMaxPageWidth > 0) && (mnMaxPageWidth < nMaxWidth) )
420*b1cdbd2cSJim Jagielski             nMaxWidth = mnMaxPageWidth;
421*b1cdbd2cSJim Jagielski         nMaxWidth -= GetItemsOffset().X();
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski         sal_uInt16          nLines = 0;
424*b1cdbd2cSJim Jagielski         sal_uInt16          nCurLine = 0;
425*b1cdbd2cSJim Jagielski         long            nLineWidthAry[100];
426*b1cdbd2cSJim Jagielski         sal_uInt16          nLinePosAry[101];
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski         nLineWidthAry[0] = 0;
429*b1cdbd2cSJim Jagielski         nLinePosAry[0] = 0;
430*b1cdbd2cSJim Jagielski         for( std::vector<ImplTabItem>::iterator it = mpTabCtrlData->maItemList.begin();
431*b1cdbd2cSJim Jagielski              it != mpTabCtrlData->maItemList.end(); ++it )
432*b1cdbd2cSJim Jagielski         {
433*b1cdbd2cSJim Jagielski             aSize = ImplGetItemSize( &(*it), nMaxWidth );
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski             if ( ((nX+aSize.Width()) > nWidth - 2) && (nWidth > 2+nOffsetX) )
436*b1cdbd2cSJim Jagielski             {
437*b1cdbd2cSJim Jagielski                 if ( nLines == 99 )
438*b1cdbd2cSJim Jagielski                     break;
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski                 nX  = nOffsetX;
441*b1cdbd2cSJim Jagielski                 nY += aSize.Height();
442*b1cdbd2cSJim Jagielski                 nLines++;
443*b1cdbd2cSJim Jagielski                 nLineWidthAry[nLines] = 0;
444*b1cdbd2cSJim Jagielski                 nLinePosAry[nLines] = nPos;
445*b1cdbd2cSJim Jagielski             }
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski             Rectangle aNewRect( Point( nX, nY ), aSize );
448*b1cdbd2cSJim Jagielski             if ( mbSmallInvalidate && (it->maRect != aNewRect) )
449*b1cdbd2cSJim Jagielski                 mbSmallInvalidate = sal_False;
450*b1cdbd2cSJim Jagielski             it->maRect = aNewRect;
451*b1cdbd2cSJim Jagielski             it->mnLine = nLines;
452*b1cdbd2cSJim Jagielski             it->mbFullVisible = sal_True;
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski             nLineWidthAry[nLines] += aSize.Width();
455*b1cdbd2cSJim Jagielski             nX += aSize.Width();
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski             if ( it->mnId == mnCurPageId )
458*b1cdbd2cSJim Jagielski                 nCurLine = nLines;
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski             nPos++;
461*b1cdbd2cSJim Jagielski         }
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski         if ( nLines && !mpTabCtrlData->maItemList.empty() )
464*b1cdbd2cSJim Jagielski         {
465*b1cdbd2cSJim Jagielski             long    nDX = 0;
466*b1cdbd2cSJim Jagielski             long    nModDX = 0;
467*b1cdbd2cSJim Jagielski             long    nIDX = 0;
468*b1cdbd2cSJim Jagielski             sal_uInt16  i;
469*b1cdbd2cSJim Jagielski             sal_uInt16  n;
470*b1cdbd2cSJim Jagielski             long    nLineHeightAry[100];
471*b1cdbd2cSJim Jagielski             long    nIH = mpTabCtrlData->maItemList[0].maRect.Bottom()-2;
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski             i = 0;
474*b1cdbd2cSJim Jagielski             while ( i < nLines+1 )
475*b1cdbd2cSJim Jagielski             {
476*b1cdbd2cSJim Jagielski                 if ( i <= nCurLine )
477*b1cdbd2cSJim Jagielski                     nLineHeightAry[i] = nIH*(nLines-(nCurLine-i)) + GetItemsOffset().Y();
478*b1cdbd2cSJim Jagielski                 else
479*b1cdbd2cSJim Jagielski                     nLineHeightAry[i] = nIH*(i-nCurLine-1) + GetItemsOffset().Y();
480*b1cdbd2cSJim Jagielski                 i++;
481*b1cdbd2cSJim Jagielski             }
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski             i = 0;
484*b1cdbd2cSJim Jagielski             n = 0;
485*b1cdbd2cSJim Jagielski             nLinePosAry[nLines+1] = (sal_uInt16)mpTabCtrlData->maItemList.size();
486*b1cdbd2cSJim Jagielski             for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin();
487*b1cdbd2cSJim Jagielski                  it != mpTabCtrlData->maItemList.end(); ++it )
488*b1cdbd2cSJim Jagielski             {
489*b1cdbd2cSJim Jagielski                 if ( i == nLinePosAry[n] )
490*b1cdbd2cSJim Jagielski                 {
491*b1cdbd2cSJim Jagielski                     if ( n == nLines+1 )
492*b1cdbd2cSJim Jagielski                         break;
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski                     nIDX = 0;
495*b1cdbd2cSJim Jagielski                     if( nLinePosAry[n+1]-i > 0 )
496*b1cdbd2cSJim Jagielski                     {
497*b1cdbd2cSJim Jagielski                         nDX = (nWidth-nOffsetX-nLineWidthAry[n]) / (nLinePosAry[n+1]-i);
498*b1cdbd2cSJim Jagielski                         nModDX = (nWidth-nOffsetX-nLineWidthAry[n]) % (nLinePosAry[n+1]-i);
499*b1cdbd2cSJim Jagielski                     }
500*b1cdbd2cSJim Jagielski                     else
501*b1cdbd2cSJim Jagielski                     {
502*b1cdbd2cSJim Jagielski                         // FIXME: this is a bad case of tabctrl way too small
503*b1cdbd2cSJim Jagielski                         nDX = 0;
504*b1cdbd2cSJim Jagielski                         nModDX = 0;
505*b1cdbd2cSJim Jagielski                     }
506*b1cdbd2cSJim Jagielski                     n++;
507*b1cdbd2cSJim Jagielski                 }
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski                 it->maRect.Left()   += nIDX;
510*b1cdbd2cSJim Jagielski                 it->maRect.Right()  += nIDX+nDX;
511*b1cdbd2cSJim Jagielski                 it->maRect.Top()     = nLineHeightAry[n-1];
512*b1cdbd2cSJim Jagielski                 it->maRect.Bottom()  = nLineHeightAry[n-1]+nIH;
513*b1cdbd2cSJim Jagielski                 nIDX += nDX;
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski                 if ( nModDX )
516*b1cdbd2cSJim Jagielski                 {
517*b1cdbd2cSJim Jagielski                     nIDX++;
518*b1cdbd2cSJim Jagielski                     it->maRect.Right()++;
519*b1cdbd2cSJim Jagielski                     nModDX--;
520*b1cdbd2cSJim Jagielski                 }
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski                 i++;
523*b1cdbd2cSJim Jagielski             }
524*b1cdbd2cSJim Jagielski         }
525*b1cdbd2cSJim Jagielski         else
526*b1cdbd2cSJim Jagielski         {//only one line
527*b1cdbd2cSJim Jagielski             if(ImplGetSVData()->maNWFData.mbCenteredTabs)
528*b1cdbd2cSJim Jagielski             {
529*b1cdbd2cSJim Jagielski                 int nRightSpace=nMaxWidth;//space left on the right by the tabs
530*b1cdbd2cSJim Jagielski                 for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin();
531*b1cdbd2cSJim Jagielski                      it != mpTabCtrlData->maItemList.end(); ++it )
532*b1cdbd2cSJim Jagielski                 {
533*b1cdbd2cSJim Jagielski                     nRightSpace-=it->maRect.Right()-it->maRect.Left();
534*b1cdbd2cSJim Jagielski                 }
535*b1cdbd2cSJim Jagielski                 for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin();
536*b1cdbd2cSJim Jagielski                      it != mpTabCtrlData->maItemList.end(); ++it )
537*b1cdbd2cSJim Jagielski                 {
538*b1cdbd2cSJim Jagielski                     it->maRect.Left()+=(int) (nRightSpace/2);
539*b1cdbd2cSJim Jagielski                     it->maRect.Right()+=(int) (nRightSpace/2);
540*b1cdbd2cSJim Jagielski                 }
541*b1cdbd2cSJim Jagielski             }
542*b1cdbd2cSJim Jagielski         }
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski         mnLastWidth     = nWidth;
545*b1cdbd2cSJim Jagielski         mnLastHeight    = nHeight;
546*b1cdbd2cSJim Jagielski         mbFormat        = sal_False;
547*b1cdbd2cSJim Jagielski     }
548*b1cdbd2cSJim Jagielski 
549*b1cdbd2cSJim Jagielski     return size_t(nItemPos) < mpTabCtrlData->maItemList.size() ? mpTabCtrlData->maItemList[nItemPos].maRect : Rectangle();
550*b1cdbd2cSJim Jagielski }
551*b1cdbd2cSJim Jagielski 
552*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
553*b1cdbd2cSJim Jagielski 
ImplChangeTabPage(sal_uInt16 nId,sal_uInt16 nOldId)554*b1cdbd2cSJim Jagielski void TabControl::ImplChangeTabPage( sal_uInt16 nId, sal_uInt16 nOldId )
555*b1cdbd2cSJim Jagielski {
556*b1cdbd2cSJim Jagielski     ImplFreeLayoutData();
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski     ImplTabItem*    pOldItem = ImplGetItem( nOldId );
559*b1cdbd2cSJim Jagielski     ImplTabItem*    pItem = ImplGetItem( nId );
560*b1cdbd2cSJim Jagielski     TabPage*        pOldPage = (pOldItem) ? pOldItem->mpTabPage : NULL;
561*b1cdbd2cSJim Jagielski     TabPage*        pPage = (pItem) ? pItem->mpTabPage : NULL;
562*b1cdbd2cSJim Jagielski     Window*         pCtrlParent = GetParent();
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski     if ( IsReallyVisible() && IsUpdateMode() )
565*b1cdbd2cSJim Jagielski     {
566*b1cdbd2cSJim Jagielski         sal_uInt16 nPos = GetPagePos( nId );
567*b1cdbd2cSJim Jagielski         Rectangle aRect = ImplGetTabRect( nPos );
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski         if ( !pOldItem || (pOldItem->mnLine != pItem->mnLine) )
570*b1cdbd2cSJim Jagielski         {
571*b1cdbd2cSJim Jagielski             aRect.Left() = 0;
572*b1cdbd2cSJim Jagielski             aRect.Top() = 0;
573*b1cdbd2cSJim Jagielski             aRect.Right() = Control::GetOutputSizePixel().Width();
574*b1cdbd2cSJim Jagielski         }
575*b1cdbd2cSJim Jagielski         else
576*b1cdbd2cSJim Jagielski         {
577*b1cdbd2cSJim Jagielski             aRect.Left()    -= 3;
578*b1cdbd2cSJim Jagielski             aRect.Top()     -= 2;
579*b1cdbd2cSJim Jagielski             aRect.Right()   += 3;
580*b1cdbd2cSJim Jagielski             Invalidate( aRect );
581*b1cdbd2cSJim Jagielski             nPos = GetPagePos( nOldId );
582*b1cdbd2cSJim Jagielski             aRect = ImplGetTabRect( nPos );
583*b1cdbd2cSJim Jagielski             aRect.Left()    -= 3;
584*b1cdbd2cSJim Jagielski             aRect.Top()     -= 2;
585*b1cdbd2cSJim Jagielski             aRect.Right()   += 3;
586*b1cdbd2cSJim Jagielski         }
587*b1cdbd2cSJim Jagielski         Invalidate( aRect );
588*b1cdbd2cSJim Jagielski     }
589*b1cdbd2cSJim Jagielski 
590*b1cdbd2cSJim Jagielski     if ( pOldPage == pPage )
591*b1cdbd2cSJim Jagielski         return;
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski     Rectangle aRect = ImplGetTabRect( TAB_PAGERECT );
594*b1cdbd2cSJim Jagielski 
595*b1cdbd2cSJim Jagielski     if ( pOldPage )
596*b1cdbd2cSJim Jagielski     {
597*b1cdbd2cSJim Jagielski         if ( mbRestoreHelpId )
598*b1cdbd2cSJim Jagielski             pCtrlParent->SetHelpId( rtl::OString() );
599*b1cdbd2cSJim Jagielski         if ( mbRestoreUnqId )
600*b1cdbd2cSJim Jagielski             pCtrlParent->SetUniqueId( rtl::OString() );
601*b1cdbd2cSJim Jagielski         pOldPage->DeactivatePage();
602*b1cdbd2cSJim Jagielski     }
603*b1cdbd2cSJim Jagielski 
604*b1cdbd2cSJim Jagielski     if ( pPage )
605*b1cdbd2cSJim Jagielski     {
606*b1cdbd2cSJim Jagielski         pPage->SetPosSizePixel( aRect.TopLeft(), aRect.GetSize() );
607*b1cdbd2cSJim Jagielski 
608*b1cdbd2cSJim Jagielski         // activate page here so the conbtrols can be switched
609*b1cdbd2cSJim Jagielski         // also set the help id of the parent window to that of the tab page
610*b1cdbd2cSJim Jagielski         if ( !GetHelpId().getLength() )
611*b1cdbd2cSJim Jagielski         {
612*b1cdbd2cSJim Jagielski             mbRestoreHelpId = sal_True;
613*b1cdbd2cSJim Jagielski             pCtrlParent->SetHelpId( pPage->GetHelpId() );
614*b1cdbd2cSJim Jagielski         }
615*b1cdbd2cSJim Jagielski         if ( !pCtrlParent->GetUniqueId().getLength() )
616*b1cdbd2cSJim Jagielski         {
617*b1cdbd2cSJim Jagielski             mbRestoreUnqId = sal_True;
618*b1cdbd2cSJim Jagielski             pCtrlParent->SetUniqueId( pPage->GetUniqueId() );
619*b1cdbd2cSJim Jagielski         }
620*b1cdbd2cSJim Jagielski 
621*b1cdbd2cSJim Jagielski         pPage->ActivatePage();
622*b1cdbd2cSJim Jagielski 		pPage->Show();
623*b1cdbd2cSJim Jagielski 
624*b1cdbd2cSJim Jagielski         if ( pOldPage && pOldPage->HasChildPathFocus() )
625*b1cdbd2cSJim Jagielski         {
626*b1cdbd2cSJim Jagielski             sal_uInt16  n = 0;
627*b1cdbd2cSJim Jagielski             Window* pFirstChild = pPage->ImplGetDlgWindow( n, DLGWINDOW_FIRST );
628*b1cdbd2cSJim Jagielski             if ( pFirstChild )
629*b1cdbd2cSJim Jagielski                 pFirstChild->ImplControlFocus( GETFOCUS_INIT );
630*b1cdbd2cSJim Jagielski             else
631*b1cdbd2cSJim Jagielski                 GrabFocus();
632*b1cdbd2cSJim Jagielski         }
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski         // pPage->Show();
635*b1cdbd2cSJim Jagielski     }
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski     if ( pOldPage )
638*b1cdbd2cSJim Jagielski         pOldPage->Hide();
639*b1cdbd2cSJim Jagielski 
640*b1cdbd2cSJim Jagielski     // Invalidate the same region that will be send to NWF
641*b1cdbd2cSJim Jagielski     // to always allow for bitmap caching
642*b1cdbd2cSJim Jagielski     // see Window::DrawNativeControl()
643*b1cdbd2cSJim Jagielski     if( IsNativeControlSupported( CTRL_TAB_PANE, PART_ENTIRE_CONTROL ) )
644*b1cdbd2cSJim Jagielski     {
645*b1cdbd2cSJim Jagielski         aRect.Left()   -= TAB_OFFSET;
646*b1cdbd2cSJim Jagielski         aRect.Top()    -= TAB_OFFSET;
647*b1cdbd2cSJim Jagielski         aRect.Right()  += TAB_OFFSET;
648*b1cdbd2cSJim Jagielski         aRect.Bottom() += TAB_OFFSET;
649*b1cdbd2cSJim Jagielski     }
650*b1cdbd2cSJim Jagielski 
651*b1cdbd2cSJim Jagielski     Invalidate( aRect );
652*b1cdbd2cSJim Jagielski }
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
655*b1cdbd2cSJim Jagielski 
ImplPosCurTabPage()656*b1cdbd2cSJim Jagielski sal_Bool TabControl::ImplPosCurTabPage()
657*b1cdbd2cSJim Jagielski {
658*b1cdbd2cSJim Jagielski     // Aktuelle TabPage resizen/positionieren
659*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = ImplGetItem( GetCurPageId() );
660*b1cdbd2cSJim Jagielski     if ( pItem && pItem->mpTabPage )
661*b1cdbd2cSJim Jagielski     {
662*b1cdbd2cSJim Jagielski         Rectangle aRect = ImplGetTabRect( TAB_PAGERECT );
663*b1cdbd2cSJim Jagielski         pItem->mpTabPage->SetPosSizePixel( aRect.TopLeft(), aRect.GetSize() );
664*b1cdbd2cSJim Jagielski         return sal_True;
665*b1cdbd2cSJim Jagielski     }
666*b1cdbd2cSJim Jagielski 
667*b1cdbd2cSJim Jagielski     return sal_False;
668*b1cdbd2cSJim Jagielski }
669*b1cdbd2cSJim Jagielski 
670*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
671*b1cdbd2cSJim Jagielski 
ImplActivateTabPage(sal_Bool bNext)672*b1cdbd2cSJim Jagielski void TabControl::ImplActivateTabPage( sal_Bool bNext )
673*b1cdbd2cSJim Jagielski {
674*b1cdbd2cSJim Jagielski     sal_uInt16 nCurPos = GetPagePos( GetCurPageId() );
675*b1cdbd2cSJim Jagielski 
676*b1cdbd2cSJim Jagielski     if ( bNext )
677*b1cdbd2cSJim Jagielski         nCurPos = (nCurPos + 1) % GetPageCount();
678*b1cdbd2cSJim Jagielski     else
679*b1cdbd2cSJim Jagielski     {
680*b1cdbd2cSJim Jagielski         if ( !nCurPos )
681*b1cdbd2cSJim Jagielski             nCurPos = GetPageCount()-1;
682*b1cdbd2cSJim Jagielski         else
683*b1cdbd2cSJim Jagielski             nCurPos--;
684*b1cdbd2cSJim Jagielski     }
685*b1cdbd2cSJim Jagielski 
686*b1cdbd2cSJim Jagielski     SelectTabPage( GetPageId( nCurPos ) );
687*b1cdbd2cSJim Jagielski }
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
690*b1cdbd2cSJim Jagielski 
ImplShowFocus()691*b1cdbd2cSJim Jagielski void TabControl::ImplShowFocus()
692*b1cdbd2cSJim Jagielski {
693*b1cdbd2cSJim Jagielski     if ( !GetPageCount() || mpTabCtrlData->mpListBox )
694*b1cdbd2cSJim Jagielski         return;
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski     // make sure the focussed item rect is computed using a bold font
697*b1cdbd2cSJim Jagielski     // the font may have changed meanwhile due to mouse over
698*b1cdbd2cSJim Jagielski 
699*b1cdbd2cSJim Jagielski     Font aOldFont( GetFont() );
700*b1cdbd2cSJim Jagielski     Font aFont( aOldFont );
701*b1cdbd2cSJim Jagielski     aFont.SetWeight( (!ImplGetSVData()->maNWFData.mbNoBoldTabFocus) ? WEIGHT_BOLD : WEIGHT_LIGHT );
702*b1cdbd2cSJim Jagielski     SetFont( aFont );
703*b1cdbd2cSJim Jagielski 
704*b1cdbd2cSJim Jagielski     sal_uInt16                   nCurPos     = GetPagePos( mnCurPageId );
705*b1cdbd2cSJim Jagielski     Rectangle                aRect       = ImplGetTabRect( nCurPos );
706*b1cdbd2cSJim Jagielski     const ImplTabItem&       rItem       = mpTabCtrlData->maItemList[ nCurPos ];
707*b1cdbd2cSJim Jagielski     Size                     aTabSize    = aRect.GetSize();
708*b1cdbd2cSJim Jagielski     Size aImageSize( 0, 0 );
709*b1cdbd2cSJim Jagielski     long                     nTextHeight = GetTextHeight();
710*b1cdbd2cSJim Jagielski     long                     nTextWidth  = GetCtrlTextWidth( rItem.maFormatText );
711*b1cdbd2cSJim Jagielski     sal_uInt16                   nOff;
712*b1cdbd2cSJim Jagielski 
713*b1cdbd2cSJim Jagielski     if ( !(GetSettings().GetStyleSettings().GetOptions() & STYLE_OPTION_MONO) )
714*b1cdbd2cSJim Jagielski         nOff = 1;
715*b1cdbd2cSJim Jagielski     else
716*b1cdbd2cSJim Jagielski         nOff = 0;
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski     if( !! rItem.maTabImage )
719*b1cdbd2cSJim Jagielski     {
720*b1cdbd2cSJim Jagielski         aImageSize = rItem.maTabImage.GetSizePixel();
721*b1cdbd2cSJim Jagielski         if( rItem.maFormatText.Len() )
722*b1cdbd2cSJim Jagielski             aImageSize.Width() += GetTextHeight()/4;
723*b1cdbd2cSJim Jagielski     }
724*b1cdbd2cSJim Jagielski 
725*b1cdbd2cSJim Jagielski     if( rItem.maFormatText.Len() )
726*b1cdbd2cSJim Jagielski     {
727*b1cdbd2cSJim Jagielski         // show focus around text
728*b1cdbd2cSJim Jagielski         aRect.Left()   = aRect.Left()+aImageSize.Width()+((aTabSize.Width()-nTextWidth-aImageSize.Width())/2)-nOff-1-1;
729*b1cdbd2cSJim Jagielski         aRect.Top()    = aRect.Top()+((aTabSize.Height()-nTextHeight)/2)-1-1;
730*b1cdbd2cSJim Jagielski         aRect.Right()  = aRect.Left()+nTextWidth+2;
731*b1cdbd2cSJim Jagielski         aRect.Bottom() = aRect.Top()+nTextHeight+2;
732*b1cdbd2cSJim Jagielski     }
733*b1cdbd2cSJim Jagielski     else
734*b1cdbd2cSJim Jagielski     {
735*b1cdbd2cSJim Jagielski         // show focus around image
736*b1cdbd2cSJim Jagielski         long nXPos = aRect.Left()+((aTabSize.Width()-nTextWidth-aImageSize.Width())/2)-nOff-1;
737*b1cdbd2cSJim Jagielski         long nYPos = aRect.Top();
738*b1cdbd2cSJim Jagielski         if( aImageSize.Height() < aRect.GetHeight() )
739*b1cdbd2cSJim Jagielski             nYPos += (aRect.GetHeight() - aImageSize.Height())/2;
740*b1cdbd2cSJim Jagielski 
741*b1cdbd2cSJim Jagielski         aRect.Left() = nXPos - 2;
742*b1cdbd2cSJim Jagielski         aRect.Top() = nYPos - 2;
743*b1cdbd2cSJim Jagielski         aRect.Right() = aRect.Left() + aImageSize.Width() + 4;
744*b1cdbd2cSJim Jagielski         aRect.Bottom() = aRect.Top() + aImageSize.Height() + 4;
745*b1cdbd2cSJim Jagielski     }
746*b1cdbd2cSJim Jagielski     ShowFocus( aRect );
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski     SetFont( aOldFont );
749*b1cdbd2cSJim Jagielski }
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
752*b1cdbd2cSJim Jagielski 
ImplDrawItem(ImplTabItem * pItem,const Rectangle & rCurRect,bool bLayout,bool bFirstInGroup,bool bLastInGroup,bool bIsCurrentItem)753*b1cdbd2cSJim Jagielski void TabControl::ImplDrawItem( ImplTabItem* pItem, const Rectangle& rCurRect, bool bLayout, bool bFirstInGroup, bool bLastInGroup, bool bIsCurrentItem )
754*b1cdbd2cSJim Jagielski {
755*b1cdbd2cSJim Jagielski     if ( pItem->maRect.IsEmpty() )
756*b1cdbd2cSJim Jagielski         return;
757*b1cdbd2cSJim Jagielski 
758*b1cdbd2cSJim Jagielski     if( bLayout )
759*b1cdbd2cSJim Jagielski     {
760*b1cdbd2cSJim Jagielski         if( !HasLayoutData() )
761*b1cdbd2cSJim Jagielski         {
762*b1cdbd2cSJim Jagielski             mpControlData->mpLayoutData = new vcl::ControlLayoutData();
763*b1cdbd2cSJim Jagielski             mpTabCtrlData->maLayoutLineToPageId.clear();
764*b1cdbd2cSJim Jagielski             mpTabCtrlData->maLayoutPageIdToLine.clear();
765*b1cdbd2cSJim Jagielski             mpTabCtrlData->maTabRectangles.clear();
766*b1cdbd2cSJim Jagielski         }
767*b1cdbd2cSJim Jagielski     }
768*b1cdbd2cSJim Jagielski 
769*b1cdbd2cSJim Jagielski     const StyleSettings&    rStyleSettings  = GetSettings().GetStyleSettings();
770*b1cdbd2cSJim Jagielski     Rectangle               aRect = pItem->maRect;
771*b1cdbd2cSJim Jagielski     long                    nLeftBottom = aRect.Bottom();
772*b1cdbd2cSJim Jagielski     long                    nRightBottom = aRect.Bottom();
773*b1cdbd2cSJim Jagielski     sal_Bool                    bLeftBorder = sal_True;
774*b1cdbd2cSJim Jagielski     sal_Bool                    bRightBorder = sal_True;
775*b1cdbd2cSJim Jagielski     sal_uInt16                  nOff;
776*b1cdbd2cSJim Jagielski     sal_Bool                    bNativeOK = sal_False;
777*b1cdbd2cSJim Jagielski 
778*b1cdbd2cSJim Jagielski     sal_uInt16 nOff2 = 0;
779*b1cdbd2cSJim Jagielski     sal_uInt16 nOff3 = 0;
780*b1cdbd2cSJim Jagielski 
781*b1cdbd2cSJim Jagielski     if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) )
782*b1cdbd2cSJim Jagielski         nOff = 1;
783*b1cdbd2cSJim Jagielski     else
784*b1cdbd2cSJim Jagielski         nOff = 0;
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski     // Wenn wir die aktuelle Page sind, muessen wir etwas mehr zeichnen
787*b1cdbd2cSJim Jagielski     if ( pItem->mnId == mnCurPageId )
788*b1cdbd2cSJim Jagielski     {
789*b1cdbd2cSJim Jagielski         nOff2 = 2;
790*b1cdbd2cSJim Jagielski         if( ! ImplGetSVData()->maNWFData.mbNoActiveTabTextRaise )
791*b1cdbd2cSJim Jagielski             nOff3 = 1;
792*b1cdbd2cSJim Jagielski     }
793*b1cdbd2cSJim Jagielski     else
794*b1cdbd2cSJim Jagielski     {
795*b1cdbd2cSJim Jagielski         Point aLeftTestPos = aRect.BottomLeft();
796*b1cdbd2cSJim Jagielski         Point aRightTestPos = aRect.BottomRight();
797*b1cdbd2cSJim Jagielski         if ( aLeftTestPos.Y() == rCurRect.Bottom() )
798*b1cdbd2cSJim Jagielski         {
799*b1cdbd2cSJim Jagielski             aLeftTestPos.X() -= 2;
800*b1cdbd2cSJim Jagielski             if ( rCurRect.IsInside( aLeftTestPos ) )
801*b1cdbd2cSJim Jagielski                 bLeftBorder = sal_False;
802*b1cdbd2cSJim Jagielski             aRightTestPos.X() += 2;
803*b1cdbd2cSJim Jagielski             if ( rCurRect.IsInside( aRightTestPos ) )
804*b1cdbd2cSJim Jagielski                 bRightBorder = sal_False;
805*b1cdbd2cSJim Jagielski         }
806*b1cdbd2cSJim Jagielski         else
807*b1cdbd2cSJim Jagielski         {
808*b1cdbd2cSJim Jagielski             if ( rCurRect.IsInside( aLeftTestPos ) )
809*b1cdbd2cSJim Jagielski                 nLeftBottom -= 2;
810*b1cdbd2cSJim Jagielski             if ( rCurRect.IsInside( aRightTestPos ) )
811*b1cdbd2cSJim Jagielski                 nRightBottom -= 2;
812*b1cdbd2cSJim Jagielski         }
813*b1cdbd2cSJim Jagielski     }
814*b1cdbd2cSJim Jagielski 
815*b1cdbd2cSJim Jagielski     if( !bLayout && (bNativeOK = IsNativeControlSupported(CTRL_TAB_ITEM, PART_ENTIRE_CONTROL)) == sal_True )
816*b1cdbd2cSJim Jagielski     {
817*b1cdbd2cSJim Jagielski         Rectangle           aCtrlRegion( pItem->maRect );
818*b1cdbd2cSJim Jagielski         ControlState		nState = 0;
819*b1cdbd2cSJim Jagielski 
820*b1cdbd2cSJim Jagielski         if( pItem->mnId == mnCurPageId )
821*b1cdbd2cSJim Jagielski         {
822*b1cdbd2cSJim Jagielski             nState |= CTRL_STATE_SELECTED;
823*b1cdbd2cSJim Jagielski             // only the selected item can be focussed
824*b1cdbd2cSJim Jagielski             if ( HasFocus() )
825*b1cdbd2cSJim Jagielski                 nState |= CTRL_STATE_FOCUSED;
826*b1cdbd2cSJim Jagielski         }
827*b1cdbd2cSJim Jagielski         if ( IsEnabled() )
828*b1cdbd2cSJim Jagielski             nState |= CTRL_STATE_ENABLED;
829*b1cdbd2cSJim Jagielski         if( IsMouseOver() && pItem->maRect.IsInside( GetPointerPosPixel() ) )
830*b1cdbd2cSJim Jagielski         {
831*b1cdbd2cSJim Jagielski             nState |= CTRL_STATE_ROLLOVER;
832*b1cdbd2cSJim Jagielski             for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin();
833*b1cdbd2cSJim Jagielski                  it != mpTabCtrlData->maItemList.end(); ++it )
834*b1cdbd2cSJim Jagielski             {
835*b1cdbd2cSJim Jagielski                 if( (&(*it) != pItem) && (it->maRect.IsInside( GetPointerPosPixel() ) ) )
836*b1cdbd2cSJim Jagielski                 {
837*b1cdbd2cSJim Jagielski                     nState &= ~CTRL_STATE_ROLLOVER; // avoid multiple highlighted tabs
838*b1cdbd2cSJim Jagielski                     break;
839*b1cdbd2cSJim Jagielski                 }
840*b1cdbd2cSJim Jagielski             }
841*b1cdbd2cSJim Jagielski         }
842*b1cdbd2cSJim Jagielski 
843*b1cdbd2cSJim Jagielski         TabitemValue tiValue;
844*b1cdbd2cSJim Jagielski         if(pItem->maRect.Left() < 5)
845*b1cdbd2cSJim Jagielski             tiValue.mnAlignment |= TABITEM_LEFTALIGNED;
846*b1cdbd2cSJim Jagielski         if(pItem->maRect.Right() > mnLastWidth - 5)
847*b1cdbd2cSJim Jagielski             tiValue.mnAlignment |= TABITEM_RIGHTALIGNED;
848*b1cdbd2cSJim Jagielski         if ( bFirstInGroup )
849*b1cdbd2cSJim Jagielski             tiValue.mnAlignment |= TABITEM_FIRST_IN_GROUP;
850*b1cdbd2cSJim Jagielski         if ( bLastInGroup )
851*b1cdbd2cSJim Jagielski             tiValue.mnAlignment |= TABITEM_LAST_IN_GROUP;
852*b1cdbd2cSJim Jagielski 
853*b1cdbd2cSJim Jagielski         bNativeOK = DrawNativeControl( CTRL_TAB_ITEM, PART_ENTIRE_CONTROL, aCtrlRegion, nState,
854*b1cdbd2cSJim Jagielski                     tiValue, rtl::OUString() );
855*b1cdbd2cSJim Jagielski     }
856*b1cdbd2cSJim Jagielski 
857*b1cdbd2cSJim Jagielski     if( ! bLayout && !bNativeOK )
858*b1cdbd2cSJim Jagielski     {
859*b1cdbd2cSJim Jagielski         if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) )
860*b1cdbd2cSJim Jagielski         {
861*b1cdbd2cSJim Jagielski             SetLineColor( rStyleSettings.GetLightColor() );
862*b1cdbd2cSJim Jagielski             DrawPixel( Point( aRect.Left()+1-nOff2, aRect.Top()+1-nOff2 ) );    // diagonally indented top-left pixel
863*b1cdbd2cSJim Jagielski             if ( bLeftBorder )
864*b1cdbd2cSJim Jagielski             {
865*b1cdbd2cSJim Jagielski                 DrawLine( Point( aRect.Left()-nOff2, aRect.Top()+2-nOff2 ),
866*b1cdbd2cSJim Jagielski                           Point( aRect.Left()-nOff2, nLeftBottom-1 ) );
867*b1cdbd2cSJim Jagielski             }
868*b1cdbd2cSJim Jagielski             DrawLine( Point( aRect.Left()+2-nOff2, aRect.Top()-nOff2 ),         // top line starting 2px from left border
869*b1cdbd2cSJim Jagielski                       Point( aRect.Right()+nOff2-3, aRect.Top()-nOff2 ) );      // ending 3px from right border
870*b1cdbd2cSJim Jagielski 
871*b1cdbd2cSJim Jagielski             if ( bRightBorder )
872*b1cdbd2cSJim Jagielski             {
873*b1cdbd2cSJim Jagielski                 SetLineColor( rStyleSettings.GetShadowColor() );
874*b1cdbd2cSJim Jagielski                 DrawLine( Point( aRect.Right()+nOff2-2, aRect.Top()+1-nOff2 ),
875*b1cdbd2cSJim Jagielski                           Point( aRect.Right()+nOff2-2, nRightBottom-1 ) );
876*b1cdbd2cSJim Jagielski 
877*b1cdbd2cSJim Jagielski                 SetLineColor( rStyleSettings.GetDarkShadowColor() );
878*b1cdbd2cSJim Jagielski                 DrawLine( Point( aRect.Right()+nOff2-1, aRect.Top()+3-nOff2 ),
879*b1cdbd2cSJim Jagielski                           Point( aRect.Right()+nOff2-1, nRightBottom-1 ) );
880*b1cdbd2cSJim Jagielski             }
881*b1cdbd2cSJim Jagielski         }
882*b1cdbd2cSJim Jagielski         else
883*b1cdbd2cSJim Jagielski         {
884*b1cdbd2cSJim Jagielski             SetLineColor( Color( COL_BLACK ) );
885*b1cdbd2cSJim Jagielski             DrawPixel( Point( aRect.Left()+1-nOff2, aRect.Top()+1-nOff2 ) );
886*b1cdbd2cSJim Jagielski             DrawPixel( Point( aRect.Right()+nOff2-2, aRect.Top()+1-nOff2 ) );
887*b1cdbd2cSJim Jagielski             if ( bLeftBorder )
888*b1cdbd2cSJim Jagielski             {
889*b1cdbd2cSJim Jagielski                 DrawLine( Point( aRect.Left()-nOff2, aRect.Top()+2-nOff2 ),
890*b1cdbd2cSJim Jagielski                           Point( aRect.Left()-nOff2, nLeftBottom-1 ) );
891*b1cdbd2cSJim Jagielski             }
892*b1cdbd2cSJim Jagielski             DrawLine( Point( aRect.Left()+2-nOff2, aRect.Top()-nOff2 ),
893*b1cdbd2cSJim Jagielski                       Point( aRect.Right()-3, aRect.Top()-nOff2 ) );
894*b1cdbd2cSJim Jagielski             if ( bRightBorder )
895*b1cdbd2cSJim Jagielski             {
896*b1cdbd2cSJim Jagielski             DrawLine( Point( aRect.Right()+nOff2-1, aRect.Top()+2-nOff2 ),
897*b1cdbd2cSJim Jagielski                       Point( aRect.Right()+nOff2-1, nRightBottom-1 ) );
898*b1cdbd2cSJim Jagielski             }
899*b1cdbd2cSJim Jagielski         }
900*b1cdbd2cSJim Jagielski     }
901*b1cdbd2cSJim Jagielski 
902*b1cdbd2cSJim Jagielski     if( bLayout )
903*b1cdbd2cSJim Jagielski     {
904*b1cdbd2cSJim Jagielski         int nLine = mpControlData->mpLayoutData->m_aLineIndices.size();
905*b1cdbd2cSJim Jagielski         mpControlData->mpLayoutData->m_aLineIndices.push_back( mpControlData->mpLayoutData->m_aDisplayText.Len() );
906*b1cdbd2cSJim Jagielski         mpTabCtrlData->maLayoutPageIdToLine[ (int)pItem->mnId ] = nLine;
907*b1cdbd2cSJim Jagielski         mpTabCtrlData->maLayoutLineToPageId[ nLine ] = (int)pItem->mnId;
908*b1cdbd2cSJim Jagielski         mpTabCtrlData->maTabRectangles.push_back( aRect );
909*b1cdbd2cSJim Jagielski     }
910*b1cdbd2cSJim Jagielski 
911*b1cdbd2cSJim Jagielski     // set font accordingly, current item is painted bold
912*b1cdbd2cSJim Jagielski     // we set the font attributes always before drawing to be re-entrant (DrawNativeControl may trigger additional paints)
913*b1cdbd2cSJim Jagielski     Font aFont( GetFont() );
914*b1cdbd2cSJim Jagielski     aFont.SetTransparent( sal_True );
915*b1cdbd2cSJim Jagielski     aFont.SetWeight( ((bIsCurrentItem) && (!ImplGetSVData()->maNWFData.mbNoBoldTabFocus)) ? WEIGHT_BOLD : WEIGHT_LIGHT );
916*b1cdbd2cSJim Jagielski     SetFont( aFont );
917*b1cdbd2cSJim Jagielski 
918*b1cdbd2cSJim Jagielski     Size aTabSize = aRect.GetSize();
919*b1cdbd2cSJim Jagielski     Size aImageSize( 0, 0 );
920*b1cdbd2cSJim Jagielski     long nTextHeight = GetTextHeight();
921*b1cdbd2cSJim Jagielski     long nTextWidth = GetCtrlTextWidth( pItem->maFormatText );
922*b1cdbd2cSJim Jagielski     if( !! pItem->maTabImage )
923*b1cdbd2cSJim Jagielski     {
924*b1cdbd2cSJim Jagielski         aImageSize = pItem->maTabImage.GetSizePixel();
925*b1cdbd2cSJim Jagielski         if( pItem->maFormatText.Len() )
926*b1cdbd2cSJim Jagielski             aImageSize.Width() += GetTextHeight()/4;
927*b1cdbd2cSJim Jagielski     }
928*b1cdbd2cSJim Jagielski     long nXPos = aRect.Left()+((aTabSize.Width()-nTextWidth-aImageSize.Width())/2)-nOff-nOff3;
929*b1cdbd2cSJim Jagielski     long nYPos = aRect.Top()+((aTabSize.Height()-nTextHeight)/2)-nOff3;
930*b1cdbd2cSJim Jagielski     if( pItem->maFormatText.Len() )
931*b1cdbd2cSJim Jagielski     {
932*b1cdbd2cSJim Jagielski         sal_uInt16 nStyle = TEXT_DRAW_MNEMONIC;
933*b1cdbd2cSJim Jagielski         if( ! pItem->mbEnabled )
934*b1cdbd2cSJim Jagielski             nStyle |= TEXT_DRAW_DISABLE;
935*b1cdbd2cSJim Jagielski         DrawCtrlText( Point( nXPos + aImageSize.Width(), nYPos ),
936*b1cdbd2cSJim Jagielski                       pItem->maFormatText,
937*b1cdbd2cSJim Jagielski                       0, STRING_LEN, nStyle,
938*b1cdbd2cSJim Jagielski                       bLayout ? &mpControlData->mpLayoutData->m_aUnicodeBoundRects : NULL,
939*b1cdbd2cSJim Jagielski                       bLayout ? &mpControlData->mpLayoutData->m_aDisplayText : NULL
940*b1cdbd2cSJim Jagielski                       );
941*b1cdbd2cSJim Jagielski     }
942*b1cdbd2cSJim Jagielski 
943*b1cdbd2cSJim Jagielski     if( !! pItem->maTabImage )
944*b1cdbd2cSJim Jagielski     {
945*b1cdbd2cSJim Jagielski         Point aImgTL( nXPos, aRect.Top() );
946*b1cdbd2cSJim Jagielski         if( aImageSize.Height() < aRect.GetHeight() )
947*b1cdbd2cSJim Jagielski             aImgTL.Y() += (aRect.GetHeight() - aImageSize.Height())/2;
948*b1cdbd2cSJim Jagielski         DrawImage( aImgTL, pItem->maTabImage, pItem->mbEnabled ? 0 : IMAGE_DRAW_DISABLE );
949*b1cdbd2cSJim Jagielski     }
950*b1cdbd2cSJim Jagielski }
951*b1cdbd2cSJim Jagielski 
952*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
953*b1cdbd2cSJim Jagielski 
ImplHandleKeyEvent(const KeyEvent & rKeyEvent)954*b1cdbd2cSJim Jagielski long TabControl::ImplHandleKeyEvent( const KeyEvent& rKeyEvent )
955*b1cdbd2cSJim Jagielski {
956*b1cdbd2cSJim Jagielski     long nRet = 0;
957*b1cdbd2cSJim Jagielski 
958*b1cdbd2cSJim Jagielski     if ( GetPageCount() > 1 )
959*b1cdbd2cSJim Jagielski     {
960*b1cdbd2cSJim Jagielski         KeyCode         aKeyCode = rKeyEvent.GetKeyCode();
961*b1cdbd2cSJim Jagielski         sal_uInt16          nKeyCode = aKeyCode.GetCode();
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski         if ( aKeyCode.IsMod1() )
964*b1cdbd2cSJim Jagielski         {
965*b1cdbd2cSJim Jagielski             if ( aKeyCode.IsShift() || (nKeyCode == KEY_PAGEUP) )
966*b1cdbd2cSJim Jagielski             {
967*b1cdbd2cSJim Jagielski                 if ( (nKeyCode == KEY_TAB) || (nKeyCode == KEY_PAGEUP) )
968*b1cdbd2cSJim Jagielski                 {
969*b1cdbd2cSJim Jagielski                     ImplActivateTabPage( sal_False );
970*b1cdbd2cSJim Jagielski                     nRet = 1;
971*b1cdbd2cSJim Jagielski                 }
972*b1cdbd2cSJim Jagielski             }
973*b1cdbd2cSJim Jagielski             else
974*b1cdbd2cSJim Jagielski             {
975*b1cdbd2cSJim Jagielski                 if ( (nKeyCode == KEY_TAB) || (nKeyCode == KEY_PAGEDOWN) )
976*b1cdbd2cSJim Jagielski                 {
977*b1cdbd2cSJim Jagielski                     ImplActivateTabPage( sal_True );
978*b1cdbd2cSJim Jagielski                     nRet = 1;
979*b1cdbd2cSJim Jagielski                 }
980*b1cdbd2cSJim Jagielski             }
981*b1cdbd2cSJim Jagielski         }
982*b1cdbd2cSJim Jagielski     }
983*b1cdbd2cSJim Jagielski 
984*b1cdbd2cSJim Jagielski     return nRet;
985*b1cdbd2cSJim Jagielski }
986*b1cdbd2cSJim Jagielski 
987*b1cdbd2cSJim Jagielski 
988*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
989*b1cdbd2cSJim Jagielski 
IMPL_LINK(TabControl,ImplListBoxSelectHdl,ListBox *,EMPTYARG)990*b1cdbd2cSJim Jagielski IMPL_LINK( TabControl, ImplListBoxSelectHdl, ListBox*, EMPTYARG )
991*b1cdbd2cSJim Jagielski {
992*b1cdbd2cSJim Jagielski     SelectTabPage( GetPageId( mpTabCtrlData->mpListBox->GetSelectEntryPos() ) );
993*b1cdbd2cSJim Jagielski     return 0;
994*b1cdbd2cSJim Jagielski }
995*b1cdbd2cSJim Jagielski 
996*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
997*b1cdbd2cSJim Jagielski 
IMPL_LINK(TabControl,ImplWindowEventListener,VclSimpleEvent *,pEvent)998*b1cdbd2cSJim Jagielski IMPL_LINK( TabControl, ImplWindowEventListener, VclSimpleEvent*, pEvent )
999*b1cdbd2cSJim Jagielski {
1000*b1cdbd2cSJim Jagielski 	if ( pEvent && pEvent->ISA( VclWindowEvent ) && (pEvent->GetId() == VCLEVENT_WINDOW_KEYINPUT) )
1001*b1cdbd2cSJim Jagielski 	{
1002*b1cdbd2cSJim Jagielski 	    VclWindowEvent* pWindowEvent = static_cast< VclWindowEvent* >(pEvent);
1003*b1cdbd2cSJim Jagielski 	    // Do not handle events from TabControl or it's children, which is done in Notify(), where the events can be consumed.
1004*b1cdbd2cSJim Jagielski 	    if ( !IsWindowOrChild( pWindowEvent->GetWindow() ) )
1005*b1cdbd2cSJim Jagielski 	    {
1006*b1cdbd2cSJim Jagielski             KeyEvent* pKeyEvent = static_cast< KeyEvent* >(pWindowEvent->GetData());
1007*b1cdbd2cSJim Jagielski 	        ImplHandleKeyEvent( *pKeyEvent );
1008*b1cdbd2cSJim Jagielski 	    }
1009*b1cdbd2cSJim Jagielski 	}
1010*b1cdbd2cSJim Jagielski 	return 0;
1011*b1cdbd2cSJim Jagielski }
1012*b1cdbd2cSJim Jagielski 
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1015*b1cdbd2cSJim Jagielski 
MouseButtonDown(const MouseEvent & rMEvt)1016*b1cdbd2cSJim Jagielski void TabControl::MouseButtonDown( const MouseEvent& rMEvt )
1017*b1cdbd2cSJim Jagielski {
1018*b1cdbd2cSJim Jagielski     if( mpTabCtrlData->mpListBox == NULL )
1019*b1cdbd2cSJim Jagielski     {
1020*b1cdbd2cSJim Jagielski         if( rMEvt.IsLeft() )
1021*b1cdbd2cSJim Jagielski         {
1022*b1cdbd2cSJim Jagielski             sal_uInt16 nPageId = GetPageId( rMEvt.GetPosPixel() );
1023*b1cdbd2cSJim Jagielski             ImplTabItem* pItem = ImplGetItem( nPageId );
1024*b1cdbd2cSJim Jagielski             if( pItem && pItem->mbEnabled )
1025*b1cdbd2cSJim Jagielski                 SelectTabPage( nPageId );
1026*b1cdbd2cSJim Jagielski         }
1027*b1cdbd2cSJim Jagielski     }
1028*b1cdbd2cSJim Jagielski }
1029*b1cdbd2cSJim Jagielski 
1030*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1031*b1cdbd2cSJim Jagielski 
KeyInput(const KeyEvent & rKEvt)1032*b1cdbd2cSJim Jagielski void TabControl::KeyInput( const KeyEvent& rKEvt )
1033*b1cdbd2cSJim Jagielski {
1034*b1cdbd2cSJim Jagielski     if( mpTabCtrlData->mpListBox )
1035*b1cdbd2cSJim Jagielski         mpTabCtrlData->mpListBox->KeyInput( rKEvt );
1036*b1cdbd2cSJim Jagielski     else if ( GetPageCount() > 1 )
1037*b1cdbd2cSJim Jagielski     {
1038*b1cdbd2cSJim Jagielski         KeyCode aKeyCode = rKEvt.GetKeyCode();
1039*b1cdbd2cSJim Jagielski         sal_uInt16  nKeyCode = aKeyCode.GetCode();
1040*b1cdbd2cSJim Jagielski 
1041*b1cdbd2cSJim Jagielski         if ( (nKeyCode == KEY_LEFT) || (nKeyCode == KEY_RIGHT) )
1042*b1cdbd2cSJim Jagielski         {
1043*b1cdbd2cSJim Jagielski             sal_Bool bNext = (nKeyCode == KEY_RIGHT);
1044*b1cdbd2cSJim Jagielski             ImplActivateTabPage( bNext );
1045*b1cdbd2cSJim Jagielski         }
1046*b1cdbd2cSJim Jagielski     }
1047*b1cdbd2cSJim Jagielski 
1048*b1cdbd2cSJim Jagielski     Control::KeyInput( rKEvt );
1049*b1cdbd2cSJim Jagielski }
1050*b1cdbd2cSJim Jagielski 
1051*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1052*b1cdbd2cSJim Jagielski 
Paint(const Rectangle & rRect)1053*b1cdbd2cSJim Jagielski void TabControl::Paint( const Rectangle& rRect )
1054*b1cdbd2cSJim Jagielski {
1055*b1cdbd2cSJim Jagielski     ImplPaint( rRect, false );
1056*b1cdbd2cSJim Jagielski }
1057*b1cdbd2cSJim Jagielski 
1058*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1059*b1cdbd2cSJim Jagielski 
ImplPaint(const Rectangle & rRect,bool bLayout)1060*b1cdbd2cSJim Jagielski void TabControl::ImplPaint( const Rectangle& rRect, bool bLayout )
1061*b1cdbd2cSJim Jagielski {
1062*b1cdbd2cSJim Jagielski     if( ! bLayout )
1063*b1cdbd2cSJim Jagielski         HideFocus();
1064*b1cdbd2cSJim Jagielski 
1065*b1cdbd2cSJim Jagielski     // Hier wird gegebenenfalls auch neu formatiert
1066*b1cdbd2cSJim Jagielski     Rectangle aRect = ImplGetTabRect( TAB_PAGERECT );
1067*b1cdbd2cSJim Jagielski 
1068*b1cdbd2cSJim Jagielski     // find current item
1069*b1cdbd2cSJim Jagielski     ImplTabItem* pCurItem = NULL;
1070*b1cdbd2cSJim Jagielski     for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin();
1071*b1cdbd2cSJim Jagielski          it != mpTabCtrlData->maItemList.end(); ++it )
1072*b1cdbd2cSJim Jagielski     {
1073*b1cdbd2cSJim Jagielski         if ( it->mnId == mnCurPageId )
1074*b1cdbd2cSJim Jagielski         {
1075*b1cdbd2cSJim Jagielski             pCurItem = &(*it);
1076*b1cdbd2cSJim Jagielski             break;
1077*b1cdbd2cSJim Jagielski         }
1078*b1cdbd2cSJim Jagielski     }
1079*b1cdbd2cSJim Jagielski 
1080*b1cdbd2cSJim Jagielski     // Draw the TabPage border
1081*b1cdbd2cSJim Jagielski     const StyleSettings&    rStyleSettings  = GetSettings().GetStyleSettings();
1082*b1cdbd2cSJim Jagielski     Rectangle               aCurRect;
1083*b1cdbd2cSJim Jagielski     long                    nTopOff = 1;
1084*b1cdbd2cSJim Jagielski     aRect.Left()   -= TAB_OFFSET;
1085*b1cdbd2cSJim Jagielski     aRect.Top()    -= TAB_OFFSET;
1086*b1cdbd2cSJim Jagielski     aRect.Right()  += TAB_OFFSET;
1087*b1cdbd2cSJim Jagielski     aRect.Bottom() += TAB_OFFSET;
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski     // if we have an invisible tabpage or no tabpage at all the tabpage rect should be
1090*b1cdbd2cSJim Jagielski     // increased to avoid round corners that might be drawn by a theme
1091*b1cdbd2cSJim Jagielski     // in this case we're only interested in the top border of the tabpage because the tabitems are used
1092*b1cdbd2cSJim Jagielski     // standalone (eg impress)
1093*b1cdbd2cSJim Jagielski     sal_Bool bNoTabPage = sal_False;
1094*b1cdbd2cSJim Jagielski     TabPage*        pCurPage = (pCurItem) ? pCurItem->mpTabPage : NULL;
1095*b1cdbd2cSJim Jagielski     if( !pCurPage || !pCurPage->IsVisible() )
1096*b1cdbd2cSJim Jagielski     {
1097*b1cdbd2cSJim Jagielski         bNoTabPage = sal_True;
1098*b1cdbd2cSJim Jagielski         aRect.Left()-=10;
1099*b1cdbd2cSJim Jagielski         aRect.Right()+=10;
1100*b1cdbd2cSJim Jagielski     }
1101*b1cdbd2cSJim Jagielski 
1102*b1cdbd2cSJim Jagielski     sal_Bool bNativeOK = sal_False;
1103*b1cdbd2cSJim Jagielski     if( ! bLayout && (bNativeOK = IsNativeControlSupported( CTRL_TAB_PANE, PART_ENTIRE_CONTROL) ) == sal_True )
1104*b1cdbd2cSJim Jagielski     {
1105*b1cdbd2cSJim Jagielski         const ImplControlValue aControlValue;
1106*b1cdbd2cSJim Jagielski 
1107*b1cdbd2cSJim Jagielski         ControlState nState = CTRL_STATE_ENABLED;
1108*b1cdbd2cSJim Jagielski         int part = PART_ENTIRE_CONTROL;
1109*b1cdbd2cSJim Jagielski         if ( !IsEnabled() )
1110*b1cdbd2cSJim Jagielski             nState &= ~CTRL_STATE_ENABLED;
1111*b1cdbd2cSJim Jagielski         if ( HasFocus() )
1112*b1cdbd2cSJim Jagielski             nState |= CTRL_STATE_FOCUSED;
1113*b1cdbd2cSJim Jagielski 
1114*b1cdbd2cSJim Jagielski         Region aClipRgn( GetActiveClipRegion() );
1115*b1cdbd2cSJim Jagielski         aClipRgn.Intersect( aRect );
1116*b1cdbd2cSJim Jagielski         if( !rRect.IsEmpty() )
1117*b1cdbd2cSJim Jagielski             aClipRgn.Intersect( rRect );
1118*b1cdbd2cSJim Jagielski 
1119*b1cdbd2cSJim Jagielski         if( !aClipRgn.IsEmpty() )
1120*b1cdbd2cSJim Jagielski             bNativeOK = DrawNativeControl( CTRL_TAB_PANE, part, aRect, nState,
1121*b1cdbd2cSJim Jagielski                 aControlValue, rtl::OUString() );
1122*b1cdbd2cSJim Jagielski     }
1123*b1cdbd2cSJim Jagielski     else
1124*b1cdbd2cSJim Jagielski     {
1125*b1cdbd2cSJim Jagielski         if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) )
1126*b1cdbd2cSJim Jagielski             SetLineColor( rStyleSettings.GetLightColor() );
1127*b1cdbd2cSJim Jagielski         else
1128*b1cdbd2cSJim Jagielski             SetLineColor( Color( COL_BLACK ) );
1129*b1cdbd2cSJim Jagielski         if ( pCurItem && !pCurItem->maRect.IsEmpty() )
1130*b1cdbd2cSJim Jagielski         {
1131*b1cdbd2cSJim Jagielski             aCurRect = pCurItem->maRect;
1132*b1cdbd2cSJim Jagielski             if( ! bLayout )
1133*b1cdbd2cSJim Jagielski                 DrawLine( aRect.TopLeft(), Point( aCurRect.Left()-2, aRect.Top() ) );
1134*b1cdbd2cSJim Jagielski             if ( aCurRect.Right()+1 < aRect.Right() )
1135*b1cdbd2cSJim Jagielski             {
1136*b1cdbd2cSJim Jagielski                 if( ! bLayout )
1137*b1cdbd2cSJim Jagielski                     DrawLine( Point( aCurRect.Right(), aRect.Top() ), aRect.TopRight() );
1138*b1cdbd2cSJim Jagielski             }
1139*b1cdbd2cSJim Jagielski             else
1140*b1cdbd2cSJim Jagielski                 nTopOff = 0;
1141*b1cdbd2cSJim Jagielski         }
1142*b1cdbd2cSJim Jagielski         else
1143*b1cdbd2cSJim Jagielski             if( ! bLayout )
1144*b1cdbd2cSJim Jagielski                 DrawLine( aRect.TopLeft(), aRect.TopRight() );
1145*b1cdbd2cSJim Jagielski 
1146*b1cdbd2cSJim Jagielski         if( ! bLayout )
1147*b1cdbd2cSJim Jagielski         {
1148*b1cdbd2cSJim Jagielski             DrawLine( aRect.TopLeft(), aRect.BottomLeft() );
1149*b1cdbd2cSJim Jagielski 
1150*b1cdbd2cSJim Jagielski             if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) )
1151*b1cdbd2cSJim Jagielski             {
1152*b1cdbd2cSJim Jagielski                 // if we have not tab page the bottom line of the tab page
1153*b1cdbd2cSJim Jagielski                 // directly touches the tab items, so choose a color that fits seamlessly
1154*b1cdbd2cSJim Jagielski                 if( bNoTabPage )
1155*b1cdbd2cSJim Jagielski                     SetLineColor( rStyleSettings.GetDialogColor() );
1156*b1cdbd2cSJim Jagielski                 else
1157*b1cdbd2cSJim Jagielski                     SetLineColor( rStyleSettings.GetShadowColor() );
1158*b1cdbd2cSJim Jagielski                 DrawLine( Point( 1, aRect.Bottom()-1 ),
1159*b1cdbd2cSJim Jagielski                         Point( aRect.Right()-1, aRect.Bottom()-1 ) );
1160*b1cdbd2cSJim Jagielski                 DrawLine( Point( aRect.Right()-1, aRect.Top()+nTopOff ),
1161*b1cdbd2cSJim Jagielski                         Point( aRect.Right()-1, aRect.Bottom()-1 ) );
1162*b1cdbd2cSJim Jagielski                 if( bNoTabPage )
1163*b1cdbd2cSJim Jagielski                     SetLineColor( rStyleSettings.GetDialogColor() );
1164*b1cdbd2cSJim Jagielski                 else
1165*b1cdbd2cSJim Jagielski                     SetLineColor( rStyleSettings.GetDarkShadowColor() );
1166*b1cdbd2cSJim Jagielski                 DrawLine( Point( 0, aRect.Bottom() ),
1167*b1cdbd2cSJim Jagielski                         Point( aRect.Right(), aRect.Bottom() ) );
1168*b1cdbd2cSJim Jagielski                 DrawLine( Point( aRect.Right(), aRect.Top()+nTopOff ),
1169*b1cdbd2cSJim Jagielski                         Point( aRect.Right(), aRect.Bottom() ) );
1170*b1cdbd2cSJim Jagielski             }
1171*b1cdbd2cSJim Jagielski             else
1172*b1cdbd2cSJim Jagielski             {
1173*b1cdbd2cSJim Jagielski                 DrawLine( aRect.TopRight(), aRect.BottomRight() );
1174*b1cdbd2cSJim Jagielski                 DrawLine( aRect.BottomLeft(), aRect.BottomRight() );
1175*b1cdbd2cSJim Jagielski             }
1176*b1cdbd2cSJim Jagielski         }
1177*b1cdbd2cSJim Jagielski     }
1178*b1cdbd2cSJim Jagielski 
1179*b1cdbd2cSJim Jagielski     if ( !mpTabCtrlData->maItemList.empty() && mpTabCtrlData->mpListBox == NULL )
1180*b1cdbd2cSJim Jagielski     {
1181*b1cdbd2cSJim Jagielski         // Some native toolkits (GTK+) draw tabs right-to-left, with an
1182*b1cdbd2cSJim Jagielski         // overlap between adjacent tabs
1183*b1cdbd2cSJim Jagielski         bool			bDrawTabsRTL = IsNativeControlSupported( CTRL_TAB_ITEM, PART_TABS_DRAW_RTL );
1184*b1cdbd2cSJim Jagielski         ImplTabItem *	pFirstTab = NULL;
1185*b1cdbd2cSJim Jagielski         ImplTabItem *	pLastTab = NULL;
1186*b1cdbd2cSJim Jagielski         size_t idx;
1187*b1cdbd2cSJim Jagielski 
1188*b1cdbd2cSJim Jagielski         // Event though there is a tab overlap with GTK+, the first tab is not
1189*b1cdbd2cSJim Jagielski         // overlapped on the left side.  Other tookits ignore this option.
1190*b1cdbd2cSJim Jagielski         if ( bDrawTabsRTL )
1191*b1cdbd2cSJim Jagielski         {
1192*b1cdbd2cSJim Jagielski             pFirstTab = &mpTabCtrlData->maItemList.front();
1193*b1cdbd2cSJim Jagielski             pLastTab = &mpTabCtrlData->maItemList.back();
1194*b1cdbd2cSJim Jagielski             idx = mpTabCtrlData->maItemList.size()-1;
1195*b1cdbd2cSJim Jagielski         }
1196*b1cdbd2cSJim Jagielski         else
1197*b1cdbd2cSJim Jagielski         {
1198*b1cdbd2cSJim Jagielski             pLastTab = &mpTabCtrlData->maItemList.back();
1199*b1cdbd2cSJim Jagielski             pFirstTab = &mpTabCtrlData->maItemList.front();
1200*b1cdbd2cSJim Jagielski             idx = 0;
1201*b1cdbd2cSJim Jagielski         }
1202*b1cdbd2cSJim Jagielski 
1203*b1cdbd2cSJim Jagielski         while ( idx < mpTabCtrlData->maItemList.size() )
1204*b1cdbd2cSJim Jagielski         {
1205*b1cdbd2cSJim Jagielski             ImplTabItem* pItem = &mpTabCtrlData->maItemList[idx];
1206*b1cdbd2cSJim Jagielski             if ( pItem != pCurItem )
1207*b1cdbd2cSJim Jagielski             {
1208*b1cdbd2cSJim Jagielski                 Region aClipRgn( GetActiveClipRegion() );
1209*b1cdbd2cSJim Jagielski                 aClipRgn.Intersect( pItem->maRect );
1210*b1cdbd2cSJim Jagielski                 if( !rRect.IsEmpty() )
1211*b1cdbd2cSJim Jagielski                     aClipRgn.Intersect( rRect );
1212*b1cdbd2cSJim Jagielski                 if( bLayout || !aClipRgn.IsEmpty() )
1213*b1cdbd2cSJim Jagielski                     ImplDrawItem( pItem, aCurRect, bLayout, (pItem==pFirstTab), (pItem==pLastTab), sal_False );
1214*b1cdbd2cSJim Jagielski             }
1215*b1cdbd2cSJim Jagielski 
1216*b1cdbd2cSJim Jagielski             if ( bDrawTabsRTL )
1217*b1cdbd2cSJim Jagielski                 idx--;
1218*b1cdbd2cSJim Jagielski             else
1219*b1cdbd2cSJim Jagielski                 idx++;
1220*b1cdbd2cSJim Jagielski         }
1221*b1cdbd2cSJim Jagielski 
1222*b1cdbd2cSJim Jagielski         if ( pCurItem )
1223*b1cdbd2cSJim Jagielski         {
1224*b1cdbd2cSJim Jagielski             Region aClipRgn( GetActiveClipRegion() );
1225*b1cdbd2cSJim Jagielski             aClipRgn.Intersect( pCurItem->maRect );
1226*b1cdbd2cSJim Jagielski             if( !rRect.IsEmpty() )
1227*b1cdbd2cSJim Jagielski                 aClipRgn.Intersect( rRect );
1228*b1cdbd2cSJim Jagielski             if( bLayout || !aClipRgn.IsEmpty() )
1229*b1cdbd2cSJim Jagielski                 ImplDrawItem( pCurItem, aCurRect, bLayout, (pCurItem==pFirstTab), (pCurItem==pLastTab), sal_True );
1230*b1cdbd2cSJim Jagielski         }
1231*b1cdbd2cSJim Jagielski     }
1232*b1cdbd2cSJim Jagielski 
1233*b1cdbd2cSJim Jagielski     if ( !bLayout && HasFocus() )
1234*b1cdbd2cSJim Jagielski         ImplShowFocus();
1235*b1cdbd2cSJim Jagielski 
1236*b1cdbd2cSJim Jagielski     if( ! bLayout )
1237*b1cdbd2cSJim Jagielski         mbSmallInvalidate = sal_True;
1238*b1cdbd2cSJim Jagielski }
1239*b1cdbd2cSJim Jagielski 
1240*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1241*b1cdbd2cSJim Jagielski 
Resize()1242*b1cdbd2cSJim Jagielski void TabControl::Resize()
1243*b1cdbd2cSJim Jagielski {
1244*b1cdbd2cSJim Jagielski     ImplFreeLayoutData();
1245*b1cdbd2cSJim Jagielski 
1246*b1cdbd2cSJim Jagielski     if ( !IsReallyShown() )
1247*b1cdbd2cSJim Jagielski         return;
1248*b1cdbd2cSJim Jagielski 
1249*b1cdbd2cSJim Jagielski     if( mpTabCtrlData->mpListBox )
1250*b1cdbd2cSJim Jagielski     {
1251*b1cdbd2cSJim Jagielski         // get the listbox' preferred size
1252*b1cdbd2cSJim Jagielski         Size aTabCtrlSize( GetSizePixel() );
1253*b1cdbd2cSJim Jagielski         long nPrefWidth = mpTabCtrlData->mpListBox->GetOptimalSize( WINDOWSIZE_PREFERRED ).Width();
1254*b1cdbd2cSJim Jagielski         if( nPrefWidth > aTabCtrlSize.Width() )
1255*b1cdbd2cSJim Jagielski             nPrefWidth = aTabCtrlSize.Width();
1256*b1cdbd2cSJim Jagielski         Size aNewSize( nPrefWidth, LogicToPixel( Size( 12, 12 ), MapMode( MAP_APPFONT ) ).Height() );
1257*b1cdbd2cSJim Jagielski         Point aNewPos( (aTabCtrlSize.Width() - nPrefWidth) / 2, 0 );
1258*b1cdbd2cSJim Jagielski         mpTabCtrlData->mpListBox->SetPosSizePixel( aNewPos, aNewSize );
1259*b1cdbd2cSJim Jagielski     }
1260*b1cdbd2cSJim Jagielski 
1261*b1cdbd2cSJim Jagielski     mbFormat = sal_True;
1262*b1cdbd2cSJim Jagielski 
1263*b1cdbd2cSJim Jagielski     // Aktuelle TabPage resizen/positionieren
1264*b1cdbd2cSJim Jagielski     sal_Bool bTabPage = ImplPosCurTabPage();
1265*b1cdbd2cSJim Jagielski     // Feststellen, was invalidiert werden muss
1266*b1cdbd2cSJim Jagielski     Size aNewSize = Control::GetOutputSizePixel();
1267*b1cdbd2cSJim Jagielski     long nNewWidth = aNewSize.Width();
1268*b1cdbd2cSJim Jagielski     for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin();
1269*b1cdbd2cSJim Jagielski          it != mpTabCtrlData->maItemList.end(); ++it )
1270*b1cdbd2cSJim Jagielski     {
1271*b1cdbd2cSJim Jagielski         if ( !it->mbFullVisible ||
1272*b1cdbd2cSJim Jagielski              (it->maRect.Right()-2 >= nNewWidth) )
1273*b1cdbd2cSJim Jagielski         {
1274*b1cdbd2cSJim Jagielski             mbSmallInvalidate = sal_False;
1275*b1cdbd2cSJim Jagielski             break;
1276*b1cdbd2cSJim Jagielski         }
1277*b1cdbd2cSJim Jagielski     }
1278*b1cdbd2cSJim Jagielski 
1279*b1cdbd2cSJim Jagielski     if ( mbSmallInvalidate )
1280*b1cdbd2cSJim Jagielski     {
1281*b1cdbd2cSJim Jagielski         Rectangle aRect = ImplGetTabRect( TAB_PAGERECT );
1282*b1cdbd2cSJim Jagielski         aRect.Left()   -= TAB_OFFSET+TAB_BORDER_LEFT;
1283*b1cdbd2cSJim Jagielski         aRect.Top()    -= TAB_OFFSET+TAB_BORDER_TOP;
1284*b1cdbd2cSJim Jagielski         aRect.Right()  += TAB_OFFSET+TAB_BORDER_RIGHT;
1285*b1cdbd2cSJim Jagielski         aRect.Bottom() += TAB_OFFSET+TAB_BORDER_BOTTOM;
1286*b1cdbd2cSJim Jagielski         if ( bTabPage )
1287*b1cdbd2cSJim Jagielski             Invalidate( aRect, INVALIDATE_NOCHILDREN );
1288*b1cdbd2cSJim Jagielski         else
1289*b1cdbd2cSJim Jagielski             Invalidate( aRect );
1290*b1cdbd2cSJim Jagielski 
1291*b1cdbd2cSJim Jagielski     }
1292*b1cdbd2cSJim Jagielski     else
1293*b1cdbd2cSJim Jagielski     {
1294*b1cdbd2cSJim Jagielski         if ( bTabPage )
1295*b1cdbd2cSJim Jagielski             Invalidate( INVALIDATE_NOCHILDREN );
1296*b1cdbd2cSJim Jagielski         else
1297*b1cdbd2cSJim Jagielski             Invalidate();
1298*b1cdbd2cSJim Jagielski     }
1299*b1cdbd2cSJim Jagielski }
1300*b1cdbd2cSJim Jagielski 
1301*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1302*b1cdbd2cSJim Jagielski 
GetFocus()1303*b1cdbd2cSJim Jagielski void TabControl::GetFocus()
1304*b1cdbd2cSJim Jagielski {
1305*b1cdbd2cSJim Jagielski     if( ! mpTabCtrlData->mpListBox )
1306*b1cdbd2cSJim Jagielski     {
1307*b1cdbd2cSJim Jagielski         ImplShowFocus();
1308*b1cdbd2cSJim Jagielski         SetInputContext( InputContext( GetFont() ) );
1309*b1cdbd2cSJim Jagielski     }
1310*b1cdbd2cSJim Jagielski     else
1311*b1cdbd2cSJim Jagielski     {
1312*b1cdbd2cSJim Jagielski         if( mpTabCtrlData->mpListBox->IsReallyVisible() )
1313*b1cdbd2cSJim Jagielski             mpTabCtrlData->mpListBox->GrabFocus();
1314*b1cdbd2cSJim Jagielski     }
1315*b1cdbd2cSJim Jagielski     Control::GetFocus();
1316*b1cdbd2cSJim Jagielski }
1317*b1cdbd2cSJim Jagielski 
1318*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1319*b1cdbd2cSJim Jagielski 
LoseFocus()1320*b1cdbd2cSJim Jagielski void TabControl::LoseFocus()
1321*b1cdbd2cSJim Jagielski {
1322*b1cdbd2cSJim Jagielski     if( ! mpTabCtrlData->mpListBox )
1323*b1cdbd2cSJim Jagielski         HideFocus();
1324*b1cdbd2cSJim Jagielski     Control::LoseFocus();
1325*b1cdbd2cSJim Jagielski }
1326*b1cdbd2cSJim Jagielski 
1327*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1328*b1cdbd2cSJim Jagielski 
RequestHelp(const HelpEvent & rHEvt)1329*b1cdbd2cSJim Jagielski void TabControl::RequestHelp( const HelpEvent& rHEvt )
1330*b1cdbd2cSJim Jagielski {
1331*b1cdbd2cSJim Jagielski     sal_uInt16 nItemId = rHEvt.KeyboardActivated() ? mnCurPageId : GetPageId( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ) );
1332*b1cdbd2cSJim Jagielski 
1333*b1cdbd2cSJim Jagielski     if ( nItemId )
1334*b1cdbd2cSJim Jagielski     {
1335*b1cdbd2cSJim Jagielski         if ( rHEvt.GetMode() & HELPMODE_BALLOON )
1336*b1cdbd2cSJim Jagielski         {
1337*b1cdbd2cSJim Jagielski             XubString aStr = GetHelpText( nItemId );
1338*b1cdbd2cSJim Jagielski             if ( aStr.Len() )
1339*b1cdbd2cSJim Jagielski             {
1340*b1cdbd2cSJim Jagielski                 Rectangle aItemRect = ImplGetTabRect( GetPagePos( nItemId ) );
1341*b1cdbd2cSJim Jagielski                 Point aPt = OutputToScreenPixel( aItemRect.TopLeft() );
1342*b1cdbd2cSJim Jagielski                 aItemRect.Left()   = aPt.X();
1343*b1cdbd2cSJim Jagielski                 aItemRect.Top()    = aPt.Y();
1344*b1cdbd2cSJim Jagielski                 aPt = OutputToScreenPixel( aItemRect.BottomRight() );
1345*b1cdbd2cSJim Jagielski                 aItemRect.Right()  = aPt.X();
1346*b1cdbd2cSJim Jagielski                 aItemRect.Bottom() = aPt.Y();
1347*b1cdbd2cSJim Jagielski                 Help::ShowBalloon( this, aItemRect.Center(), aItemRect, aStr );
1348*b1cdbd2cSJim Jagielski                 return;
1349*b1cdbd2cSJim Jagielski             }
1350*b1cdbd2cSJim Jagielski         }
1351*b1cdbd2cSJim Jagielski         else if ( rHEvt.GetMode() & HELPMODE_EXTENDED )
1352*b1cdbd2cSJim Jagielski         {
1353*b1cdbd2cSJim Jagielski             rtl::OUString aHelpId( rtl::OStringToOUString( GetHelpId( nItemId ), RTL_TEXTENCODING_UTF8 ) );
1354*b1cdbd2cSJim Jagielski             if ( aHelpId.getLength() )
1355*b1cdbd2cSJim Jagielski             {
1356*b1cdbd2cSJim Jagielski                 // Wenn eine Hilfe existiert, dann ausloesen
1357*b1cdbd2cSJim Jagielski                 Help* pHelp = Application::GetHelp();
1358*b1cdbd2cSJim Jagielski                 if ( pHelp )
1359*b1cdbd2cSJim Jagielski                     pHelp->Start( aHelpId, this );
1360*b1cdbd2cSJim Jagielski                 return;
1361*b1cdbd2cSJim Jagielski             }
1362*b1cdbd2cSJim Jagielski         }
1363*b1cdbd2cSJim Jagielski 
1364*b1cdbd2cSJim Jagielski         // Bei Quick- oder Balloon-Help zeigen wir den Text an,
1365*b1cdbd2cSJim Jagielski         // wenn dieser abgeschnitten ist
1366*b1cdbd2cSJim Jagielski         if ( rHEvt.GetMode() & (HELPMODE_QUICK | HELPMODE_BALLOON) )
1367*b1cdbd2cSJim Jagielski         {
1368*b1cdbd2cSJim Jagielski             ImplTabItem* pItem = ImplGetItem( nItemId );
1369*b1cdbd2cSJim Jagielski             const XubString& rStr = pItem->maText;
1370*b1cdbd2cSJim Jagielski             if ( rStr != pItem->maFormatText )
1371*b1cdbd2cSJim Jagielski             {
1372*b1cdbd2cSJim Jagielski                 Rectangle aItemRect = ImplGetTabRect( GetPagePos( nItemId ) );
1373*b1cdbd2cSJim Jagielski                 Point aPt = OutputToScreenPixel( aItemRect.TopLeft() );
1374*b1cdbd2cSJim Jagielski                 aItemRect.Left()   = aPt.X();
1375*b1cdbd2cSJim Jagielski                 aItemRect.Top()    = aPt.Y();
1376*b1cdbd2cSJim Jagielski                 aPt = OutputToScreenPixel( aItemRect.BottomRight() );
1377*b1cdbd2cSJim Jagielski                 aItemRect.Right()  = aPt.X();
1378*b1cdbd2cSJim Jagielski                 aItemRect.Bottom() = aPt.Y();
1379*b1cdbd2cSJim Jagielski                 if ( rStr.Len() )
1380*b1cdbd2cSJim Jagielski                 {
1381*b1cdbd2cSJim Jagielski                     if ( rHEvt.GetMode() & HELPMODE_BALLOON )
1382*b1cdbd2cSJim Jagielski                         Help::ShowBalloon( this, aItemRect.Center(), aItemRect, rStr );
1383*b1cdbd2cSJim Jagielski                     else
1384*b1cdbd2cSJim Jagielski                         Help::ShowQuickHelp( this, aItemRect, rStr );
1385*b1cdbd2cSJim Jagielski                     return;
1386*b1cdbd2cSJim Jagielski                 }
1387*b1cdbd2cSJim Jagielski             }
1388*b1cdbd2cSJim Jagielski         }
1389*b1cdbd2cSJim Jagielski 
1390*b1cdbd2cSJim Jagielski         if ( rHEvt.GetMode() & HELPMODE_QUICK )
1391*b1cdbd2cSJim Jagielski         {
1392*b1cdbd2cSJim Jagielski             ImplTabItem* pItem = ImplGetItem( nItemId );
1393*b1cdbd2cSJim Jagielski             const XubString& rHelpText = pItem->maHelpText;
1394*b1cdbd2cSJim Jagielski             // show tooltip if not text but image is set and helptext is available
1395*b1cdbd2cSJim Jagielski             if ( rHelpText.Len() > 0 && pItem->maText.Len() == 0 && !!pItem->maTabImage )
1396*b1cdbd2cSJim Jagielski             {
1397*b1cdbd2cSJim Jagielski                 Rectangle aItemRect = ImplGetTabRect( GetPagePos( nItemId ) );
1398*b1cdbd2cSJim Jagielski                 Point aPt = OutputToScreenPixel( aItemRect.TopLeft() );
1399*b1cdbd2cSJim Jagielski                 aItemRect.Left()   = aPt.X();
1400*b1cdbd2cSJim Jagielski                 aItemRect.Top()    = aPt.Y();
1401*b1cdbd2cSJim Jagielski                 aPt = OutputToScreenPixel( aItemRect.BottomRight() );
1402*b1cdbd2cSJim Jagielski                 aItemRect.Right()  = aPt.X();
1403*b1cdbd2cSJim Jagielski                 aItemRect.Bottom() = aPt.Y();
1404*b1cdbd2cSJim Jagielski                 Help::ShowQuickHelp( this, aItemRect, rHelpText );
1405*b1cdbd2cSJim Jagielski                 return;
1406*b1cdbd2cSJim Jagielski             }
1407*b1cdbd2cSJim Jagielski         }
1408*b1cdbd2cSJim Jagielski     }
1409*b1cdbd2cSJim Jagielski 
1410*b1cdbd2cSJim Jagielski     Control::RequestHelp( rHEvt );
1411*b1cdbd2cSJim Jagielski }
1412*b1cdbd2cSJim Jagielski 
1413*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1414*b1cdbd2cSJim Jagielski 
Command(const CommandEvent & rCEvt)1415*b1cdbd2cSJim Jagielski void TabControl::Command( const CommandEvent& rCEvt )
1416*b1cdbd2cSJim Jagielski {
1417*b1cdbd2cSJim Jagielski     if( (mpTabCtrlData->mpListBox == NULL) && (rCEvt.GetCommand() == COMMAND_CONTEXTMENU) && (GetPageCount() > 1) )
1418*b1cdbd2cSJim Jagielski     {
1419*b1cdbd2cSJim Jagielski         Point   aMenuPos;
1420*b1cdbd2cSJim Jagielski         sal_Bool    bMenu;
1421*b1cdbd2cSJim Jagielski         if ( rCEvt.IsMouseEvent() )
1422*b1cdbd2cSJim Jagielski         {
1423*b1cdbd2cSJim Jagielski             aMenuPos = rCEvt.GetMousePosPixel();
1424*b1cdbd2cSJim Jagielski             bMenu = GetPageId( aMenuPos ) != 0;
1425*b1cdbd2cSJim Jagielski         }
1426*b1cdbd2cSJim Jagielski         else
1427*b1cdbd2cSJim Jagielski         {
1428*b1cdbd2cSJim Jagielski             aMenuPos = ImplGetTabRect( GetPagePos( mnCurPageId ) ).Center();
1429*b1cdbd2cSJim Jagielski             bMenu = sal_True;
1430*b1cdbd2cSJim Jagielski         }
1431*b1cdbd2cSJim Jagielski 
1432*b1cdbd2cSJim Jagielski         if ( bMenu )
1433*b1cdbd2cSJim Jagielski         {
1434*b1cdbd2cSJim Jagielski             PopupMenu aMenu;
1435*b1cdbd2cSJim Jagielski             for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin();
1436*b1cdbd2cSJim Jagielski                  it != mpTabCtrlData->maItemList.end(); ++it )
1437*b1cdbd2cSJim Jagielski             {
1438*b1cdbd2cSJim Jagielski                 aMenu.InsertItem( it->mnId, it->maText, MIB_CHECKABLE | MIB_RADIOCHECK );
1439*b1cdbd2cSJim Jagielski                 if ( it->mnId == mnCurPageId )
1440*b1cdbd2cSJim Jagielski                     aMenu.CheckItem( it->mnId );
1441*b1cdbd2cSJim Jagielski                 aMenu.SetHelpId( it->mnId, it->maHelpId );
1442*b1cdbd2cSJim Jagielski             }
1443*b1cdbd2cSJim Jagielski 
1444*b1cdbd2cSJim Jagielski             sal_uInt16 nId = aMenu.Execute( this, aMenuPos );
1445*b1cdbd2cSJim Jagielski             if ( nId && (nId != mnCurPageId) )
1446*b1cdbd2cSJim Jagielski                 SelectTabPage( nId );
1447*b1cdbd2cSJim Jagielski             return;
1448*b1cdbd2cSJim Jagielski         }
1449*b1cdbd2cSJim Jagielski     }
1450*b1cdbd2cSJim Jagielski 
1451*b1cdbd2cSJim Jagielski     Control::Command( rCEvt );
1452*b1cdbd2cSJim Jagielski }
1453*b1cdbd2cSJim Jagielski 
1454*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1455*b1cdbd2cSJim Jagielski 
StateChanged(StateChangedType nType)1456*b1cdbd2cSJim Jagielski void TabControl::StateChanged( StateChangedType nType )
1457*b1cdbd2cSJim Jagielski {
1458*b1cdbd2cSJim Jagielski     Control::StateChanged( nType );
1459*b1cdbd2cSJim Jagielski 
1460*b1cdbd2cSJim Jagielski     if ( nType == STATE_CHANGE_INITSHOW )
1461*b1cdbd2cSJim Jagielski     {
1462*b1cdbd2cSJim Jagielski         ImplPosCurTabPage();
1463*b1cdbd2cSJim Jagielski         if( mpTabCtrlData->mpListBox )
1464*b1cdbd2cSJim Jagielski             Resize();
1465*b1cdbd2cSJim Jagielski     }
1466*b1cdbd2cSJim Jagielski     else if ( nType == STATE_CHANGE_UPDATEMODE )
1467*b1cdbd2cSJim Jagielski     {
1468*b1cdbd2cSJim Jagielski         if ( IsUpdateMode() )
1469*b1cdbd2cSJim Jagielski             Invalidate();
1470*b1cdbd2cSJim Jagielski     }
1471*b1cdbd2cSJim Jagielski     else if ( (nType == STATE_CHANGE_ZOOM)  ||
1472*b1cdbd2cSJim Jagielski               (nType == STATE_CHANGE_CONTROLFONT) )
1473*b1cdbd2cSJim Jagielski     {
1474*b1cdbd2cSJim Jagielski         ImplInitSettings( sal_True, sal_False, sal_False );
1475*b1cdbd2cSJim Jagielski         Invalidate();
1476*b1cdbd2cSJim Jagielski     }
1477*b1cdbd2cSJim Jagielski     else if ( nType == STATE_CHANGE_CONTROLFOREGROUND )
1478*b1cdbd2cSJim Jagielski     {
1479*b1cdbd2cSJim Jagielski         ImplInitSettings( sal_False, sal_True, sal_False );
1480*b1cdbd2cSJim Jagielski         Invalidate();
1481*b1cdbd2cSJim Jagielski     }
1482*b1cdbd2cSJim Jagielski     else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
1483*b1cdbd2cSJim Jagielski     {
1484*b1cdbd2cSJim Jagielski         ImplInitSettings( sal_False, sal_False, sal_True );
1485*b1cdbd2cSJim Jagielski         Invalidate();
1486*b1cdbd2cSJim Jagielski     }
1487*b1cdbd2cSJim Jagielski }
1488*b1cdbd2cSJim Jagielski 
1489*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1490*b1cdbd2cSJim Jagielski 
DataChanged(const DataChangedEvent & rDCEvt)1491*b1cdbd2cSJim Jagielski void TabControl::DataChanged( const DataChangedEvent& rDCEvt )
1492*b1cdbd2cSJim Jagielski {
1493*b1cdbd2cSJim Jagielski     Control::DataChanged( rDCEvt );
1494*b1cdbd2cSJim Jagielski 
1495*b1cdbd2cSJim Jagielski     if ( (rDCEvt.GetType() == DATACHANGED_FONTS) ||
1496*b1cdbd2cSJim Jagielski          (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
1497*b1cdbd2cSJim Jagielski          ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
1498*b1cdbd2cSJim Jagielski           (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
1499*b1cdbd2cSJim Jagielski     {
1500*b1cdbd2cSJim Jagielski         ImplInitSettings( sal_True, sal_True, sal_True );
1501*b1cdbd2cSJim Jagielski         Invalidate();
1502*b1cdbd2cSJim Jagielski     }
1503*b1cdbd2cSJim Jagielski }
1504*b1cdbd2cSJim Jagielski 
1505*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1506*b1cdbd2cSJim Jagielski 
ImplFindPartRect(const Point & rPt)1507*b1cdbd2cSJim Jagielski Rectangle* TabControl::ImplFindPartRect( const Point& rPt )
1508*b1cdbd2cSJim Jagielski {
1509*b1cdbd2cSJim Jagielski     ImplTabItem* pFoundItem = NULL;
1510*b1cdbd2cSJim Jagielski     int nFound = 0;
1511*b1cdbd2cSJim Jagielski     for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin();
1512*b1cdbd2cSJim Jagielski          it != mpTabCtrlData->maItemList.end(); ++it )
1513*b1cdbd2cSJim Jagielski     {
1514*b1cdbd2cSJim Jagielski         if ( it->maRect.IsInside( rPt ) )
1515*b1cdbd2cSJim Jagielski         {
1516*b1cdbd2cSJim Jagielski             // assure that only one tab is highlighted at a time
1517*b1cdbd2cSJim Jagielski             nFound++;
1518*b1cdbd2cSJim Jagielski             pFoundItem = &(*it);
1519*b1cdbd2cSJim Jagielski         }
1520*b1cdbd2cSJim Jagielski     }
1521*b1cdbd2cSJim Jagielski     // assure that only one tab is highlighted at a time
1522*b1cdbd2cSJim Jagielski     return nFound == 1 ? &pFoundItem->maRect : NULL;
1523*b1cdbd2cSJim Jagielski }
1524*b1cdbd2cSJim Jagielski 
PreNotify(NotifyEvent & rNEvt)1525*b1cdbd2cSJim Jagielski long TabControl::PreNotify( NotifyEvent& rNEvt )
1526*b1cdbd2cSJim Jagielski {
1527*b1cdbd2cSJim Jagielski     long nDone = 0;
1528*b1cdbd2cSJim Jagielski     const MouseEvent* pMouseEvt = NULL;
1529*b1cdbd2cSJim Jagielski 
1530*b1cdbd2cSJim Jagielski     if( (rNEvt.GetType() == EVENT_MOUSEMOVE) && (pMouseEvt = rNEvt.GetMouseEvent()) != NULL )
1531*b1cdbd2cSJim Jagielski     {
1532*b1cdbd2cSJim Jagielski         if( !pMouseEvt->GetButtons() && !pMouseEvt->IsSynthetic() && !pMouseEvt->IsModifierChanged() )
1533*b1cdbd2cSJim Jagielski         {
1534*b1cdbd2cSJim Jagielski             // trigger redraw if mouse over state has changed
1535*b1cdbd2cSJim Jagielski             if( IsNativeControlSupported(CTRL_TAB_ITEM, PART_ENTIRE_CONTROL) )
1536*b1cdbd2cSJim Jagielski             {
1537*b1cdbd2cSJim Jagielski                 Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() );
1538*b1cdbd2cSJim Jagielski                 Rectangle* pLastRect = ImplFindPartRect( GetLastPointerPosPixel() );
1539*b1cdbd2cSJim Jagielski                 if( pRect != pLastRect || (pMouseEvt->IsLeaveWindow() || pMouseEvt->IsEnterWindow()) )
1540*b1cdbd2cSJim Jagielski                 {
1541*b1cdbd2cSJim Jagielski                     Region aClipRgn;
1542*b1cdbd2cSJim Jagielski                     if( pLastRect )
1543*b1cdbd2cSJim Jagielski                     {
1544*b1cdbd2cSJim Jagielski                         // allow for slightly bigger tabitems
1545*b1cdbd2cSJim Jagielski                         // as used by gtk
1546*b1cdbd2cSJim Jagielski                         // TODO: query for the correct sizes
1547*b1cdbd2cSJim Jagielski                         Rectangle aRect(*pLastRect);
1548*b1cdbd2cSJim Jagielski                         aRect.nLeft-=2;
1549*b1cdbd2cSJim Jagielski                         aRect.nRight+=2;
1550*b1cdbd2cSJim Jagielski                         aRect.nTop-=3;
1551*b1cdbd2cSJim Jagielski                         aClipRgn.Union( aRect );
1552*b1cdbd2cSJim Jagielski                     }
1553*b1cdbd2cSJim Jagielski                     if( pRect )
1554*b1cdbd2cSJim Jagielski                     {
1555*b1cdbd2cSJim Jagielski                         // allow for slightly bigger tabitems
1556*b1cdbd2cSJim Jagielski                         // as used by gtk
1557*b1cdbd2cSJim Jagielski                         // TODO: query for the correct sizes
1558*b1cdbd2cSJim Jagielski                         Rectangle aRect(*pRect);
1559*b1cdbd2cSJim Jagielski                         aRect.nLeft-=2;
1560*b1cdbd2cSJim Jagielski                         aRect.nRight+=2;
1561*b1cdbd2cSJim Jagielski                         aRect.nTop-=3;
1562*b1cdbd2cSJim Jagielski                         aClipRgn.Union( aRect );
1563*b1cdbd2cSJim Jagielski                     }
1564*b1cdbd2cSJim Jagielski                     if( !aClipRgn.IsEmpty() )
1565*b1cdbd2cSJim Jagielski                         Invalidate( aClipRgn );
1566*b1cdbd2cSJim Jagielski                 }
1567*b1cdbd2cSJim Jagielski             }
1568*b1cdbd2cSJim Jagielski         }
1569*b1cdbd2cSJim Jagielski     }
1570*b1cdbd2cSJim Jagielski 
1571*b1cdbd2cSJim Jagielski     return nDone ? nDone : Control::PreNotify(rNEvt);
1572*b1cdbd2cSJim Jagielski }
1573*b1cdbd2cSJim Jagielski 
1574*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1575*b1cdbd2cSJim Jagielski 
Notify(NotifyEvent & rNEvt)1576*b1cdbd2cSJim Jagielski long TabControl::Notify( NotifyEvent& rNEvt )
1577*b1cdbd2cSJim Jagielski {
1578*b1cdbd2cSJim Jagielski     long nRet = 0;
1579*b1cdbd2cSJim Jagielski 
1580*b1cdbd2cSJim Jagielski     if ( rNEvt.GetType() == EVENT_KEYINPUT )
1581*b1cdbd2cSJim Jagielski         nRet = ImplHandleKeyEvent( *rNEvt.GetKeyEvent() );
1582*b1cdbd2cSJim Jagielski 
1583*b1cdbd2cSJim Jagielski     return nRet ? nRet : Control::Notify( rNEvt );
1584*b1cdbd2cSJim Jagielski }
1585*b1cdbd2cSJim Jagielski 
1586*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1587*b1cdbd2cSJim Jagielski 
ActivatePage()1588*b1cdbd2cSJim Jagielski void TabControl::ActivatePage()
1589*b1cdbd2cSJim Jagielski {
1590*b1cdbd2cSJim Jagielski     maActivateHdl.Call( this );
1591*b1cdbd2cSJim Jagielski }
1592*b1cdbd2cSJim Jagielski 
1593*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1594*b1cdbd2cSJim Jagielski 
DeactivatePage()1595*b1cdbd2cSJim Jagielski long TabControl::DeactivatePage()
1596*b1cdbd2cSJim Jagielski {
1597*b1cdbd2cSJim Jagielski     if ( maDeactivateHdl.IsSet() )
1598*b1cdbd2cSJim Jagielski         return maDeactivateHdl.Call( this );
1599*b1cdbd2cSJim Jagielski     else
1600*b1cdbd2cSJim Jagielski         return sal_True;
1601*b1cdbd2cSJim Jagielski }
1602*b1cdbd2cSJim Jagielski 
1603*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1604*b1cdbd2cSJim Jagielski 
SetTabPageSizePixel(const Size & rSize)1605*b1cdbd2cSJim Jagielski void TabControl::SetTabPageSizePixel( const Size& rSize )
1606*b1cdbd2cSJim Jagielski {
1607*b1cdbd2cSJim Jagielski     ImplFreeLayoutData();
1608*b1cdbd2cSJim Jagielski 
1609*b1cdbd2cSJim Jagielski     Size aNewSize( rSize );
1610*b1cdbd2cSJim Jagielski     aNewSize.Width() += TAB_OFFSET*2;
1611*b1cdbd2cSJim Jagielski     Rectangle aRect = ImplGetTabRect( TAB_PAGERECT,
1612*b1cdbd2cSJim Jagielski                                       aNewSize.Width(), aNewSize.Height() );
1613*b1cdbd2cSJim Jagielski     aNewSize.Height() += aRect.Top()+TAB_OFFSET;
1614*b1cdbd2cSJim Jagielski     Window::SetOutputSizePixel( aNewSize );
1615*b1cdbd2cSJim Jagielski }
1616*b1cdbd2cSJim Jagielski 
1617*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1618*b1cdbd2cSJim Jagielski 
GetTabPageSizePixel() const1619*b1cdbd2cSJim Jagielski Size TabControl::GetTabPageSizePixel() const
1620*b1cdbd2cSJim Jagielski {
1621*b1cdbd2cSJim Jagielski     Rectangle aRect = ((TabControl*)this)->ImplGetTabRect( TAB_PAGERECT );
1622*b1cdbd2cSJim Jagielski     return aRect.GetSize();
1623*b1cdbd2cSJim Jagielski }
1624*b1cdbd2cSJim Jagielski 
1625*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1626*b1cdbd2cSJim Jagielski 
InsertPage(const ResId & rResId,sal_uInt16 nPos)1627*b1cdbd2cSJim Jagielski void TabControl::InsertPage( const ResId& rResId, sal_uInt16 nPos )
1628*b1cdbd2cSJim Jagielski {
1629*b1cdbd2cSJim Jagielski     GetRes( rResId.SetRT( RSC_TABCONTROLITEM ) );
1630*b1cdbd2cSJim Jagielski 
1631*b1cdbd2cSJim Jagielski     sal_uLong nObjMask = ReadLongRes();
1632*b1cdbd2cSJim Jagielski     sal_uInt16 nItemId  = 1;
1633*b1cdbd2cSJim Jagielski 
1634*b1cdbd2cSJim Jagielski     // ID
1635*b1cdbd2cSJim Jagielski     if ( nObjMask & RSC_TABCONTROLITEM_ID )
1636*b1cdbd2cSJim Jagielski         nItemId = sal::static_int_cast<sal_uInt16>(ReadLongRes());
1637*b1cdbd2cSJim Jagielski 
1638*b1cdbd2cSJim Jagielski     // Text
1639*b1cdbd2cSJim Jagielski     XubString aTmpStr;
1640*b1cdbd2cSJim Jagielski     if( nObjMask & RSC_TABCONTROLITEM_TEXT )
1641*b1cdbd2cSJim Jagielski         aTmpStr = ReadStringRes();
1642*b1cdbd2cSJim Jagielski     InsertPage( nItemId, aTmpStr, nPos );
1643*b1cdbd2cSJim Jagielski 
1644*b1cdbd2cSJim Jagielski     // PageResID
1645*b1cdbd2cSJim Jagielski     if ( nObjMask & RSC_TABCONTROLITEM_PAGERESID )
1646*b1cdbd2cSJim Jagielski     {
1647*b1cdbd2cSJim Jagielski         ImplTabItem& rItem = mpTabCtrlData->maItemList[ GetPagePos( nItemId ) ];
1648*b1cdbd2cSJim Jagielski         rItem.mnTabPageResId = sal::static_int_cast<sal_uInt16>(ReadLongRes());
1649*b1cdbd2cSJim Jagielski     }
1650*b1cdbd2cSJim Jagielski }
1651*b1cdbd2cSJim Jagielski 
1652*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1653*b1cdbd2cSJim Jagielski 
InsertPage(sal_uInt16 nPageId,const XubString & rText,sal_uInt16 nPos)1654*b1cdbd2cSJim Jagielski void TabControl::InsertPage( sal_uInt16 nPageId, const XubString& rText,
1655*b1cdbd2cSJim Jagielski                              sal_uInt16 nPos )
1656*b1cdbd2cSJim Jagielski {
1657*b1cdbd2cSJim Jagielski     DBG_ASSERT( nPageId, "TabControl::InsertPage(): PageId == 0" );
1658*b1cdbd2cSJim Jagielski     DBG_ASSERT( GetPagePos( nPageId ) == TAB_PAGE_NOTFOUND,
1659*b1cdbd2cSJim Jagielski                 "TabControl::InsertPage(): PageId already exists" );
1660*b1cdbd2cSJim Jagielski 
1661*b1cdbd2cSJim Jagielski     // insert new page item
1662*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = NULL;
1663*b1cdbd2cSJim Jagielski     if( nPos == TAB_APPEND || size_t(nPos) >= mpTabCtrlData->maItemList.size() )
1664*b1cdbd2cSJim Jagielski     {
1665*b1cdbd2cSJim Jagielski         mpTabCtrlData->maItemList.push_back( ImplTabItem() );
1666*b1cdbd2cSJim Jagielski         pItem = &mpTabCtrlData->maItemList.back();
1667*b1cdbd2cSJim Jagielski         if( mpTabCtrlData->mpListBox )
1668*b1cdbd2cSJim Jagielski             mpTabCtrlData->mpListBox->InsertEntry( rText );
1669*b1cdbd2cSJim Jagielski     }
1670*b1cdbd2cSJim Jagielski     else
1671*b1cdbd2cSJim Jagielski     {
1672*b1cdbd2cSJim Jagielski         std::vector< ImplTabItem >::iterator new_it =
1673*b1cdbd2cSJim Jagielski             mpTabCtrlData->maItemList.insert( mpTabCtrlData->maItemList.begin() + nPos, ImplTabItem() );
1674*b1cdbd2cSJim Jagielski         pItem = &(*new_it);
1675*b1cdbd2cSJim Jagielski         if( mpTabCtrlData->mpListBox )
1676*b1cdbd2cSJim Jagielski             mpTabCtrlData->mpListBox->InsertEntry( rText, nPos);
1677*b1cdbd2cSJim Jagielski     }
1678*b1cdbd2cSJim Jagielski     if( mpTabCtrlData->mpListBox )
1679*b1cdbd2cSJim Jagielski     {
1680*b1cdbd2cSJim Jagielski         if( ! mnCurPageId )
1681*b1cdbd2cSJim Jagielski             mpTabCtrlData->mpListBox->SelectEntryPos( 0 );
1682*b1cdbd2cSJim Jagielski         mpTabCtrlData->mpListBox->SetDropDownLineCount( mpTabCtrlData->mpListBox->GetEntryCount() );
1683*b1cdbd2cSJim Jagielski     }
1684*b1cdbd2cSJim Jagielski 
1685*b1cdbd2cSJim Jagielski     // set current page id
1686*b1cdbd2cSJim Jagielski     if ( !mnCurPageId )
1687*b1cdbd2cSJim Jagielski         mnCurPageId = nPageId;
1688*b1cdbd2cSJim Jagielski 
1689*b1cdbd2cSJim Jagielski     // init new page item
1690*b1cdbd2cSJim Jagielski     pItem->mnId             = nPageId;
1691*b1cdbd2cSJim Jagielski     pItem->mpTabPage        = NULL;
1692*b1cdbd2cSJim Jagielski     pItem->mnTabPageResId   = 0;
1693*b1cdbd2cSJim Jagielski     pItem->maText           = rText;
1694*b1cdbd2cSJim Jagielski     pItem->mbFullVisible    = sal_False;
1695*b1cdbd2cSJim Jagielski 
1696*b1cdbd2cSJim Jagielski     mbFormat = sal_True;
1697*b1cdbd2cSJim Jagielski     if ( IsUpdateMode() )
1698*b1cdbd2cSJim Jagielski         Invalidate();
1699*b1cdbd2cSJim Jagielski 
1700*b1cdbd2cSJim Jagielski     ImplFreeLayoutData();
1701*b1cdbd2cSJim Jagielski     if( mpTabCtrlData->mpListBox ) // reposition/resize listbox
1702*b1cdbd2cSJim Jagielski         Resize();
1703*b1cdbd2cSJim Jagielski 
1704*b1cdbd2cSJim Jagielski 	ImplCallEventListeners( VCLEVENT_TABPAGE_INSERTED, (void*) (sal_uLong)nPageId );
1705*b1cdbd2cSJim Jagielski }
1706*b1cdbd2cSJim Jagielski 
1707*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1708*b1cdbd2cSJim Jagielski 
RemovePage(sal_uInt16 nPageId)1709*b1cdbd2cSJim Jagielski void TabControl::RemovePage( sal_uInt16 nPageId )
1710*b1cdbd2cSJim Jagielski {
1711*b1cdbd2cSJim Jagielski     sal_uInt16 nPos = GetPagePos( nPageId );
1712*b1cdbd2cSJim Jagielski 
1713*b1cdbd2cSJim Jagielski     // does the item exist ?
1714*b1cdbd2cSJim Jagielski     if ( nPos != TAB_PAGE_NOTFOUND )
1715*b1cdbd2cSJim Jagielski     {
1716*b1cdbd2cSJim Jagielski         //remove page item
1717*b1cdbd2cSJim Jagielski         std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin() + nPos;
1718*b1cdbd2cSJim Jagielski         bool bIsCurrentPage = (it->mnId == mnCurPageId);
1719*b1cdbd2cSJim Jagielski         mpTabCtrlData->maItemList.erase( it );
1720*b1cdbd2cSJim Jagielski         if( mpTabCtrlData->mpListBox )
1721*b1cdbd2cSJim Jagielski         {
1722*b1cdbd2cSJim Jagielski             mpTabCtrlData->mpListBox->RemoveEntry( nPos );
1723*b1cdbd2cSJim Jagielski             mpTabCtrlData->mpListBox->SetDropDownLineCount( mpTabCtrlData->mpListBox->GetEntryCount() );
1724*b1cdbd2cSJim Jagielski         }
1725*b1cdbd2cSJim Jagielski 
1726*b1cdbd2cSJim Jagielski         // If current page is removed, than first page gets the current page
1727*b1cdbd2cSJim Jagielski         if ( bIsCurrentPage  )
1728*b1cdbd2cSJim Jagielski         {
1729*b1cdbd2cSJim Jagielski             mnCurPageId = 0;
1730*b1cdbd2cSJim Jagielski 
1731*b1cdbd2cSJim Jagielski             if( ! mpTabCtrlData->maItemList.empty() )
1732*b1cdbd2cSJim Jagielski             {
1733*b1cdbd2cSJim Jagielski                 // don't do this by simply setting mnCurPageId to pFirstItem->mnId
1734*b1cdbd2cSJim Jagielski                 // this leaves a lot of stuff (such trivias as _showing_ the new current page) undone
1735*b1cdbd2cSJim Jagielski                 // instead, call SetCurPageId
1736*b1cdbd2cSJim Jagielski                 // without this, the next (outside) call to SetCurPageId with the id of the first page
1737*b1cdbd2cSJim Jagielski                 // will result in doing nothing (as we assume that nothing changed, then), and the page
1738*b1cdbd2cSJim Jagielski                 // will never be shown.
1739*b1cdbd2cSJim Jagielski                 // 86875 - 05/11/2001 - frank.schoenheit@germany.sun.com
1740*b1cdbd2cSJim Jagielski 
1741*b1cdbd2cSJim Jagielski                 SetCurPageId( mpTabCtrlData->maItemList[0].mnId );
1742*b1cdbd2cSJim Jagielski             }
1743*b1cdbd2cSJim Jagielski         }
1744*b1cdbd2cSJim Jagielski 
1745*b1cdbd2cSJim Jagielski         mbFormat = sal_True;
1746*b1cdbd2cSJim Jagielski         if ( IsUpdateMode() )
1747*b1cdbd2cSJim Jagielski             Invalidate();
1748*b1cdbd2cSJim Jagielski 
1749*b1cdbd2cSJim Jagielski         ImplFreeLayoutData();
1750*b1cdbd2cSJim Jagielski 
1751*b1cdbd2cSJim Jagielski 		ImplCallEventListeners( VCLEVENT_TABPAGE_REMOVED, (void*) (sal_uLong) nPageId );
1752*b1cdbd2cSJim Jagielski     }
1753*b1cdbd2cSJim Jagielski }
1754*b1cdbd2cSJim Jagielski 
1755*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1756*b1cdbd2cSJim Jagielski 
Clear()1757*b1cdbd2cSJim Jagielski void TabControl::Clear()
1758*b1cdbd2cSJim Jagielski {
1759*b1cdbd2cSJim Jagielski     // clear item list
1760*b1cdbd2cSJim Jagielski     mpTabCtrlData->maItemList.clear();
1761*b1cdbd2cSJim Jagielski     mnCurPageId = 0;
1762*b1cdbd2cSJim Jagielski     if( mpTabCtrlData->mpListBox )
1763*b1cdbd2cSJim Jagielski         mpTabCtrlData->mpListBox->Clear();
1764*b1cdbd2cSJim Jagielski 
1765*b1cdbd2cSJim Jagielski     ImplFreeLayoutData();
1766*b1cdbd2cSJim Jagielski 
1767*b1cdbd2cSJim Jagielski     mbFormat = sal_True;
1768*b1cdbd2cSJim Jagielski     if ( IsUpdateMode() )
1769*b1cdbd2cSJim Jagielski         Invalidate();
1770*b1cdbd2cSJim Jagielski 
1771*b1cdbd2cSJim Jagielski 	ImplCallEventListeners( VCLEVENT_TABPAGE_REMOVEDALL );
1772*b1cdbd2cSJim Jagielski }
1773*b1cdbd2cSJim Jagielski 
1774*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1775*b1cdbd2cSJim Jagielski 
EnablePage(sal_uInt16 i_nPageId,bool i_bEnable)1776*b1cdbd2cSJim Jagielski void TabControl::EnablePage( sal_uInt16 i_nPageId, bool i_bEnable )
1777*b1cdbd2cSJim Jagielski {
1778*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = ImplGetItem( i_nPageId );
1779*b1cdbd2cSJim Jagielski 
1780*b1cdbd2cSJim Jagielski     if ( pItem && pItem->mbEnabled != i_bEnable )
1781*b1cdbd2cSJim Jagielski     {
1782*b1cdbd2cSJim Jagielski         pItem->mbEnabled = i_bEnable;
1783*b1cdbd2cSJim Jagielski         mbFormat = sal_True;
1784*b1cdbd2cSJim Jagielski         if( mpTabCtrlData->mpListBox )
1785*b1cdbd2cSJim Jagielski             mpTabCtrlData->mpListBox->SetEntryFlags( GetPagePos( i_nPageId ),
1786*b1cdbd2cSJim Jagielski                                                      i_bEnable ? 0 : (LISTBOX_ENTRY_FLAG_DISABLE_SELECTION | LISTBOX_ENTRY_FLAG_DRAW_DISABLED) );
1787*b1cdbd2cSJim Jagielski         if( pItem->mnId == mnCurPageId )
1788*b1cdbd2cSJim Jagielski         {
1789*b1cdbd2cSJim Jagielski              // SetCurPageId will change to an enabled page
1790*b1cdbd2cSJim Jagielski             SetCurPageId( mnCurPageId );
1791*b1cdbd2cSJim Jagielski         }
1792*b1cdbd2cSJim Jagielski         else if ( IsUpdateMode() )
1793*b1cdbd2cSJim Jagielski             Invalidate();
1794*b1cdbd2cSJim Jagielski     }
1795*b1cdbd2cSJim Jagielski }
1796*b1cdbd2cSJim Jagielski 
1797*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1798*b1cdbd2cSJim Jagielski 
GetPageCount() const1799*b1cdbd2cSJim Jagielski sal_uInt16 TabControl::GetPageCount() const
1800*b1cdbd2cSJim Jagielski {
1801*b1cdbd2cSJim Jagielski     return (sal_uInt16)mpTabCtrlData->maItemList.size();
1802*b1cdbd2cSJim Jagielski }
1803*b1cdbd2cSJim Jagielski 
1804*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1805*b1cdbd2cSJim Jagielski 
GetPageId(sal_uInt16 nPos) const1806*b1cdbd2cSJim Jagielski sal_uInt16 TabControl::GetPageId( sal_uInt16 nPos ) const
1807*b1cdbd2cSJim Jagielski {
1808*b1cdbd2cSJim Jagielski     if( size_t(nPos) < mpTabCtrlData->maItemList.size() )
1809*b1cdbd2cSJim Jagielski         return mpTabCtrlData->maItemList[ nPos ].mnId;
1810*b1cdbd2cSJim Jagielski     return 0;
1811*b1cdbd2cSJim Jagielski }
1812*b1cdbd2cSJim Jagielski 
1813*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1814*b1cdbd2cSJim Jagielski 
GetPagePos(sal_uInt16 nPageId) const1815*b1cdbd2cSJim Jagielski sal_uInt16 TabControl::GetPagePos( sal_uInt16 nPageId ) const
1816*b1cdbd2cSJim Jagielski {
1817*b1cdbd2cSJim Jagielski     for( std::vector< ImplTabItem >::const_iterator it = mpTabCtrlData->maItemList.begin();
1818*b1cdbd2cSJim Jagielski          it != mpTabCtrlData->maItemList.end(); ++it )
1819*b1cdbd2cSJim Jagielski     {
1820*b1cdbd2cSJim Jagielski         if ( it->mnId == nPageId )
1821*b1cdbd2cSJim Jagielski             return (sal_uInt16)(it - mpTabCtrlData->maItemList.begin());
1822*b1cdbd2cSJim Jagielski     }
1823*b1cdbd2cSJim Jagielski 
1824*b1cdbd2cSJim Jagielski     return TAB_PAGE_NOTFOUND;
1825*b1cdbd2cSJim Jagielski }
1826*b1cdbd2cSJim Jagielski 
1827*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1828*b1cdbd2cSJim Jagielski 
GetPageId(const Point & rPos) const1829*b1cdbd2cSJim Jagielski sal_uInt16 TabControl::GetPageId( const Point& rPos ) const
1830*b1cdbd2cSJim Jagielski {
1831*b1cdbd2cSJim Jagielski     for( size_t i = 0; i < mpTabCtrlData->maItemList.size(); ++i )
1832*b1cdbd2cSJim Jagielski     {
1833*b1cdbd2cSJim Jagielski         if ( ((TabControl*)this)->ImplGetTabRect( static_cast<sal_uInt16>(i) ).IsInside( rPos ) )
1834*b1cdbd2cSJim Jagielski             return mpTabCtrlData->maItemList[ i ].mnId;
1835*b1cdbd2cSJim Jagielski     }
1836*b1cdbd2cSJim Jagielski 
1837*b1cdbd2cSJim Jagielski     return 0;
1838*b1cdbd2cSJim Jagielski }
1839*b1cdbd2cSJim Jagielski 
1840*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1841*b1cdbd2cSJim Jagielski 
SetCurPageId(sal_uInt16 nPageId)1842*b1cdbd2cSJim Jagielski void TabControl::SetCurPageId( sal_uInt16 nPageId )
1843*b1cdbd2cSJim Jagielski {
1844*b1cdbd2cSJim Jagielski     sal_uInt16 nPos = GetPagePos( nPageId );
1845*b1cdbd2cSJim Jagielski     while( nPos != TAB_PAGE_NOTFOUND &&
1846*b1cdbd2cSJim Jagielski            ! mpTabCtrlData->maItemList[nPos].mbEnabled )
1847*b1cdbd2cSJim Jagielski     {
1848*b1cdbd2cSJim Jagielski         nPos++;
1849*b1cdbd2cSJim Jagielski         if( size_t(nPos) >= mpTabCtrlData->maItemList.size() )
1850*b1cdbd2cSJim Jagielski             nPos = 0;
1851*b1cdbd2cSJim Jagielski         if( mpTabCtrlData->maItemList[nPos].mnId == nPageId )
1852*b1cdbd2cSJim Jagielski             break;
1853*b1cdbd2cSJim Jagielski     }
1854*b1cdbd2cSJim Jagielski 
1855*b1cdbd2cSJim Jagielski     if( nPos != TAB_PAGE_NOTFOUND )
1856*b1cdbd2cSJim Jagielski     {
1857*b1cdbd2cSJim Jagielski         nPageId = mpTabCtrlData->maItemList[nPos].mnId;
1858*b1cdbd2cSJim Jagielski         if ( nPageId == mnCurPageId )
1859*b1cdbd2cSJim Jagielski         {
1860*b1cdbd2cSJim Jagielski             if ( mnActPageId )
1861*b1cdbd2cSJim Jagielski                 mnActPageId = nPageId;
1862*b1cdbd2cSJim Jagielski             return;
1863*b1cdbd2cSJim Jagielski         }
1864*b1cdbd2cSJim Jagielski 
1865*b1cdbd2cSJim Jagielski         if ( mnActPageId )
1866*b1cdbd2cSJim Jagielski             mnActPageId = nPageId;
1867*b1cdbd2cSJim Jagielski         else
1868*b1cdbd2cSJim Jagielski         {
1869*b1cdbd2cSJim Jagielski             mbFormat = sal_True;
1870*b1cdbd2cSJim Jagielski             sal_uInt16 nOldId = mnCurPageId;
1871*b1cdbd2cSJim Jagielski             mnCurPageId = nPageId;
1872*b1cdbd2cSJim Jagielski             ImplChangeTabPage( nPageId, nOldId );
1873*b1cdbd2cSJim Jagielski         }
1874*b1cdbd2cSJim Jagielski     }
1875*b1cdbd2cSJim Jagielski }
1876*b1cdbd2cSJim Jagielski 
1877*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1878*b1cdbd2cSJim Jagielski 
GetCurPageId() const1879*b1cdbd2cSJim Jagielski sal_uInt16 TabControl::GetCurPageId() const
1880*b1cdbd2cSJim Jagielski {
1881*b1cdbd2cSJim Jagielski     if ( mnActPageId )
1882*b1cdbd2cSJim Jagielski         return mnActPageId;
1883*b1cdbd2cSJim Jagielski     else
1884*b1cdbd2cSJim Jagielski         return mnCurPageId;
1885*b1cdbd2cSJim Jagielski }
1886*b1cdbd2cSJim Jagielski 
1887*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1888*b1cdbd2cSJim Jagielski 
SelectTabPage(sal_uInt16 nPageId)1889*b1cdbd2cSJim Jagielski void TabControl::SelectTabPage( sal_uInt16 nPageId )
1890*b1cdbd2cSJim Jagielski {
1891*b1cdbd2cSJim Jagielski     if ( nPageId && (nPageId != mnCurPageId) )
1892*b1cdbd2cSJim Jagielski     {
1893*b1cdbd2cSJim Jagielski         ImplFreeLayoutData();
1894*b1cdbd2cSJim Jagielski 
1895*b1cdbd2cSJim Jagielski 		ImplCallEventListeners( VCLEVENT_TABPAGE_DEACTIVATE, (void*) (sal_uLong) mnCurPageId );
1896*b1cdbd2cSJim Jagielski         if ( DeactivatePage() )
1897*b1cdbd2cSJim Jagielski         {
1898*b1cdbd2cSJim Jagielski             mnActPageId = nPageId;
1899*b1cdbd2cSJim Jagielski             ActivatePage();
1900*b1cdbd2cSJim Jagielski             // Page koennte im Activate-Handler umgeschaltet wurden sein
1901*b1cdbd2cSJim Jagielski             nPageId = mnActPageId;
1902*b1cdbd2cSJim Jagielski             mnActPageId = 0;
1903*b1cdbd2cSJim Jagielski             SetCurPageId( nPageId );
1904*b1cdbd2cSJim Jagielski             if( mpTabCtrlData->mpListBox )
1905*b1cdbd2cSJim Jagielski                 mpTabCtrlData->mpListBox->SelectEntryPos( GetPagePos( nPageId ) );
1906*b1cdbd2cSJim Jagielski 			ImplCallEventListeners( VCLEVENT_TABPAGE_ACTIVATE, (void*) (sal_uLong) nPageId );
1907*b1cdbd2cSJim Jagielski         }
1908*b1cdbd2cSJim Jagielski     }
1909*b1cdbd2cSJim Jagielski }
1910*b1cdbd2cSJim Jagielski 
1911*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1912*b1cdbd2cSJim Jagielski 
SetTabPage(sal_uInt16 nPageId,TabPage * pTabPage)1913*b1cdbd2cSJim Jagielski void TabControl::SetTabPage( sal_uInt16 nPageId, TabPage* pTabPage )
1914*b1cdbd2cSJim Jagielski {
1915*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = ImplGetItem( nPageId );
1916*b1cdbd2cSJim Jagielski 
1917*b1cdbd2cSJim Jagielski     if ( pItem && (pItem->mpTabPage != pTabPage) )
1918*b1cdbd2cSJim Jagielski     {
1919*b1cdbd2cSJim Jagielski         if ( pTabPage )
1920*b1cdbd2cSJim Jagielski         {
1921*b1cdbd2cSJim Jagielski             DBG_ASSERT( !pTabPage->IsVisible(), "TabControl::SetTabPage() - Page is visible" );
1922*b1cdbd2cSJim Jagielski 
1923*b1cdbd2cSJim Jagielski             if ( IsDefaultSize() )
1924*b1cdbd2cSJim Jagielski                 SetTabPageSizePixel( pTabPage->GetSizePixel() );
1925*b1cdbd2cSJim Jagielski 
1926*b1cdbd2cSJim Jagielski             // Erst hier setzen, damit Resize nicht TabPage umpositioniert
1927*b1cdbd2cSJim Jagielski             pItem->mpTabPage = pTabPage;
1928*b1cdbd2cSJim Jagielski             if ( pItem->mnId == mnCurPageId )
1929*b1cdbd2cSJim Jagielski                 ImplChangeTabPage( pItem->mnId, 0 );
1930*b1cdbd2cSJim Jagielski         }
1931*b1cdbd2cSJim Jagielski         else
1932*b1cdbd2cSJim Jagielski             pItem->mpTabPage = NULL;
1933*b1cdbd2cSJim Jagielski     }
1934*b1cdbd2cSJim Jagielski }
1935*b1cdbd2cSJim Jagielski 
1936*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1937*b1cdbd2cSJim Jagielski 
GetTabPage(sal_uInt16 nPageId) const1938*b1cdbd2cSJim Jagielski TabPage* TabControl::GetTabPage( sal_uInt16 nPageId ) const
1939*b1cdbd2cSJim Jagielski {
1940*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = ImplGetItem( nPageId );
1941*b1cdbd2cSJim Jagielski 
1942*b1cdbd2cSJim Jagielski     if ( pItem )
1943*b1cdbd2cSJim Jagielski         return pItem->mpTabPage;
1944*b1cdbd2cSJim Jagielski     else
1945*b1cdbd2cSJim Jagielski         return NULL;
1946*b1cdbd2cSJim Jagielski }
1947*b1cdbd2cSJim Jagielski 
1948*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1949*b1cdbd2cSJim Jagielski 
GetTabPageResId(sal_uInt16 nPageId) const1950*b1cdbd2cSJim Jagielski sal_uInt16 TabControl::GetTabPageResId( sal_uInt16 nPageId ) const
1951*b1cdbd2cSJim Jagielski {
1952*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = ImplGetItem( nPageId );
1953*b1cdbd2cSJim Jagielski 
1954*b1cdbd2cSJim Jagielski     if ( pItem )
1955*b1cdbd2cSJim Jagielski         return pItem->mnTabPageResId;
1956*b1cdbd2cSJim Jagielski     else
1957*b1cdbd2cSJim Jagielski         return 0;
1958*b1cdbd2cSJim Jagielski }
1959*b1cdbd2cSJim Jagielski 
1960*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1961*b1cdbd2cSJim Jagielski 
SetPageText(sal_uInt16 nPageId,const XubString & rText)1962*b1cdbd2cSJim Jagielski void TabControl::SetPageText( sal_uInt16 nPageId, const XubString& rText )
1963*b1cdbd2cSJim Jagielski {
1964*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = ImplGetItem( nPageId );
1965*b1cdbd2cSJim Jagielski 
1966*b1cdbd2cSJim Jagielski     if ( pItem && pItem->maText != rText )
1967*b1cdbd2cSJim Jagielski     {
1968*b1cdbd2cSJim Jagielski         pItem->maText = rText;
1969*b1cdbd2cSJim Jagielski         mbFormat = sal_True;
1970*b1cdbd2cSJim Jagielski         if( mpTabCtrlData->mpListBox )
1971*b1cdbd2cSJim Jagielski         {
1972*b1cdbd2cSJim Jagielski             sal_uInt16 nPos = GetPagePos( nPageId );
1973*b1cdbd2cSJim Jagielski             mpTabCtrlData->mpListBox->RemoveEntry( nPos );
1974*b1cdbd2cSJim Jagielski             mpTabCtrlData->mpListBox->InsertEntry( rText, nPos );
1975*b1cdbd2cSJim Jagielski         }
1976*b1cdbd2cSJim Jagielski         if ( IsUpdateMode() )
1977*b1cdbd2cSJim Jagielski             Invalidate();
1978*b1cdbd2cSJim Jagielski         ImplFreeLayoutData();
1979*b1cdbd2cSJim Jagielski 		ImplCallEventListeners( VCLEVENT_TABPAGE_PAGETEXTCHANGED, (void*) (sal_uLong) nPageId );
1980*b1cdbd2cSJim Jagielski     }
1981*b1cdbd2cSJim Jagielski }
1982*b1cdbd2cSJim Jagielski 
1983*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1984*b1cdbd2cSJim Jagielski 
GetPageText(sal_uInt16 nPageId) const1985*b1cdbd2cSJim Jagielski XubString TabControl::GetPageText( sal_uInt16 nPageId ) const
1986*b1cdbd2cSJim Jagielski {
1987*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = ImplGetItem( nPageId );
1988*b1cdbd2cSJim Jagielski 
1989*b1cdbd2cSJim Jagielski     if ( pItem )
1990*b1cdbd2cSJim Jagielski         return pItem->maText;
1991*b1cdbd2cSJim Jagielski     else
1992*b1cdbd2cSJim Jagielski         return ImplGetSVEmptyStr();
1993*b1cdbd2cSJim Jagielski }
1994*b1cdbd2cSJim Jagielski 
1995*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1996*b1cdbd2cSJim Jagielski 
SetHelpText(sal_uInt16 nPageId,const XubString & rText)1997*b1cdbd2cSJim Jagielski void TabControl::SetHelpText( sal_uInt16 nPageId, const XubString& rText )
1998*b1cdbd2cSJim Jagielski {
1999*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = ImplGetItem( nPageId );
2000*b1cdbd2cSJim Jagielski 
2001*b1cdbd2cSJim Jagielski     if ( pItem )
2002*b1cdbd2cSJim Jagielski         pItem->maHelpText = rText;
2003*b1cdbd2cSJim Jagielski }
2004*b1cdbd2cSJim Jagielski 
2005*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2006*b1cdbd2cSJim Jagielski 
GetHelpText(sal_uInt16 nPageId) const2007*b1cdbd2cSJim Jagielski const XubString& TabControl::GetHelpText( sal_uInt16 nPageId ) const
2008*b1cdbd2cSJim Jagielski {
2009*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = ImplGetItem( nPageId );
2010*b1cdbd2cSJim Jagielski 
2011*b1cdbd2cSJim Jagielski     if ( pItem )
2012*b1cdbd2cSJim Jagielski     {
2013*b1cdbd2cSJim Jagielski         if ( !pItem->maHelpText.Len() && pItem->maHelpId.getLength() )
2014*b1cdbd2cSJim Jagielski         {
2015*b1cdbd2cSJim Jagielski             Help* pHelp = Application::GetHelp();
2016*b1cdbd2cSJim Jagielski             if ( pHelp )
2017*b1cdbd2cSJim Jagielski                 pItem->maHelpText = pHelp->GetHelpText( rtl::OStringToOUString( pItem->maHelpId, RTL_TEXTENCODING_UTF8 ), this );
2018*b1cdbd2cSJim Jagielski         }
2019*b1cdbd2cSJim Jagielski 
2020*b1cdbd2cSJim Jagielski         return pItem->maHelpText;
2021*b1cdbd2cSJim Jagielski     }
2022*b1cdbd2cSJim Jagielski     else
2023*b1cdbd2cSJim Jagielski         return ImplGetSVEmptyStr();
2024*b1cdbd2cSJim Jagielski }
2025*b1cdbd2cSJim Jagielski 
2026*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2027*b1cdbd2cSJim Jagielski 
SetHelpId(sal_uInt16 nPageId,const rtl::OString & rHelpId)2028*b1cdbd2cSJim Jagielski void TabControl::SetHelpId( sal_uInt16 nPageId, const rtl::OString& rHelpId )
2029*b1cdbd2cSJim Jagielski {
2030*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = ImplGetItem( nPageId );
2031*b1cdbd2cSJim Jagielski 
2032*b1cdbd2cSJim Jagielski     if ( pItem )
2033*b1cdbd2cSJim Jagielski         pItem->maHelpId = rHelpId;
2034*b1cdbd2cSJim Jagielski }
2035*b1cdbd2cSJim Jagielski 
2036*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2037*b1cdbd2cSJim Jagielski 
GetHelpId(sal_uInt16 nPageId) const2038*b1cdbd2cSJim Jagielski rtl::OString TabControl::GetHelpId( sal_uInt16 nPageId ) const
2039*b1cdbd2cSJim Jagielski {
2040*b1cdbd2cSJim Jagielski     rtl::OString aRet;
2041*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = ImplGetItem( nPageId );
2042*b1cdbd2cSJim Jagielski 
2043*b1cdbd2cSJim Jagielski     if ( pItem )
2044*b1cdbd2cSJim Jagielski         aRet = pItem->maHelpId;
2045*b1cdbd2cSJim Jagielski 
2046*b1cdbd2cSJim Jagielski     return aRet;
2047*b1cdbd2cSJim Jagielski }
2048*b1cdbd2cSJim Jagielski 
2049*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2050*b1cdbd2cSJim Jagielski 
SetPageImage(sal_uInt16 i_nPageId,const Image & i_rImage)2051*b1cdbd2cSJim Jagielski void TabControl::SetPageImage( sal_uInt16 i_nPageId, const Image& i_rImage )
2052*b1cdbd2cSJim Jagielski {
2053*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = ImplGetItem( i_nPageId );
2054*b1cdbd2cSJim Jagielski 
2055*b1cdbd2cSJim Jagielski     if ( pItem )
2056*b1cdbd2cSJim Jagielski     {
2057*b1cdbd2cSJim Jagielski         pItem->maTabImage = i_rImage;
2058*b1cdbd2cSJim Jagielski         mbFormat = sal_True;
2059*b1cdbd2cSJim Jagielski         if ( IsUpdateMode() )
2060*b1cdbd2cSJim Jagielski             Invalidate();
2061*b1cdbd2cSJim Jagielski     }
2062*b1cdbd2cSJim Jagielski }
2063*b1cdbd2cSJim Jagielski 
2064*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2065*b1cdbd2cSJim Jagielski 
GetPageImage(sal_uInt16 i_nPageId) const2066*b1cdbd2cSJim Jagielski const Image* TabControl::GetPageImage( sal_uInt16 i_nPageId ) const
2067*b1cdbd2cSJim Jagielski {
2068*b1cdbd2cSJim Jagielski     const ImplTabItem* pItem = ImplGetItem( i_nPageId );
2069*b1cdbd2cSJim Jagielski     return pItem ? &pItem->maTabImage : NULL;
2070*b1cdbd2cSJim Jagielski }
2071*b1cdbd2cSJim Jagielski 
2072*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2073*b1cdbd2cSJim Jagielski 
GetCharacterBounds(sal_uInt16 nPageId,long nIndex) const2074*b1cdbd2cSJim Jagielski Rectangle TabControl::GetCharacterBounds( sal_uInt16 nPageId, long nIndex ) const
2075*b1cdbd2cSJim Jagielski {
2076*b1cdbd2cSJim Jagielski     Rectangle aRet;
2077*b1cdbd2cSJim Jagielski 
2078*b1cdbd2cSJim Jagielski     if( !HasLayoutData() || ! mpTabCtrlData->maLayoutPageIdToLine.size() )
2079*b1cdbd2cSJim Jagielski         FillLayoutData();
2080*b1cdbd2cSJim Jagielski 
2081*b1cdbd2cSJim Jagielski     if( HasLayoutData() )
2082*b1cdbd2cSJim Jagielski     {
2083*b1cdbd2cSJim Jagielski         std::hash_map< int, int >::const_iterator it = mpTabCtrlData->maLayoutPageIdToLine.find( (int)nPageId );
2084*b1cdbd2cSJim Jagielski         if( it != mpTabCtrlData->maLayoutPageIdToLine.end() )
2085*b1cdbd2cSJim Jagielski         {
2086*b1cdbd2cSJim Jagielski             Pair aPair = mpControlData->mpLayoutData->GetLineStartEnd( it->second );
2087*b1cdbd2cSJim Jagielski             if( (aPair.B() - aPair.A()) >= nIndex )
2088*b1cdbd2cSJim Jagielski                 aRet = mpControlData->mpLayoutData->GetCharacterBounds( aPair.A() + nIndex );
2089*b1cdbd2cSJim Jagielski         }
2090*b1cdbd2cSJim Jagielski     }
2091*b1cdbd2cSJim Jagielski 
2092*b1cdbd2cSJim Jagielski     return aRet;
2093*b1cdbd2cSJim Jagielski }
2094*b1cdbd2cSJim Jagielski 
2095*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2096*b1cdbd2cSJim Jagielski 
GetIndexForPoint(const Point & rPoint,sal_uInt16 & rPageId) const2097*b1cdbd2cSJim Jagielski long TabControl::GetIndexForPoint( const Point& rPoint, sal_uInt16& rPageId ) const
2098*b1cdbd2cSJim Jagielski {
2099*b1cdbd2cSJim Jagielski     long nRet = -1;
2100*b1cdbd2cSJim Jagielski 
2101*b1cdbd2cSJim Jagielski     if( !HasLayoutData() || ! mpTabCtrlData->maLayoutPageIdToLine.size() )
2102*b1cdbd2cSJim Jagielski         FillLayoutData();
2103*b1cdbd2cSJim Jagielski 
2104*b1cdbd2cSJim Jagielski     if( HasLayoutData() )
2105*b1cdbd2cSJim Jagielski     {
2106*b1cdbd2cSJim Jagielski         int nIndex = mpControlData->mpLayoutData->GetIndexForPoint( rPoint );
2107*b1cdbd2cSJim Jagielski         if( nIndex != -1 )
2108*b1cdbd2cSJim Jagielski         {
2109*b1cdbd2cSJim Jagielski             // what line (->pageid) is this index in ?
2110*b1cdbd2cSJim Jagielski             int nLines = mpControlData->mpLayoutData->GetLineCount();
2111*b1cdbd2cSJim Jagielski             int nLine = -1;
2112*b1cdbd2cSJim Jagielski             while( ++nLine < nLines )
2113*b1cdbd2cSJim Jagielski             {
2114*b1cdbd2cSJim Jagielski                 Pair aPair = mpControlData->mpLayoutData->GetLineStartEnd( nLine );
2115*b1cdbd2cSJim Jagielski                 if( aPair.A() <= nIndex && aPair.B() >= nIndex )
2116*b1cdbd2cSJim Jagielski                 {
2117*b1cdbd2cSJim Jagielski                     nRet = nIndex - aPair.A();
2118*b1cdbd2cSJim Jagielski                     rPageId = (sal_uInt16)mpTabCtrlData->maLayoutLineToPageId[ nLine ];
2119*b1cdbd2cSJim Jagielski                     break;
2120*b1cdbd2cSJim Jagielski                 }
2121*b1cdbd2cSJim Jagielski             }
2122*b1cdbd2cSJim Jagielski         }
2123*b1cdbd2cSJim Jagielski     }
2124*b1cdbd2cSJim Jagielski 
2125*b1cdbd2cSJim Jagielski     return nRet;
2126*b1cdbd2cSJim Jagielski }
2127*b1cdbd2cSJim Jagielski 
2128*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2129*b1cdbd2cSJim Jagielski 
FillLayoutData() const2130*b1cdbd2cSJim Jagielski void TabControl::FillLayoutData() const
2131*b1cdbd2cSJim Jagielski {
2132*b1cdbd2cSJim Jagielski     mpTabCtrlData->maLayoutLineToPageId.clear();
2133*b1cdbd2cSJim Jagielski     mpTabCtrlData->maLayoutPageIdToLine.clear();
2134*b1cdbd2cSJim Jagielski     const_cast<TabControl*>(this)->ImplPaint( Rectangle(), true );
2135*b1cdbd2cSJim Jagielski }
2136*b1cdbd2cSJim Jagielski 
2137*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2138*b1cdbd2cSJim Jagielski 
GetTabPageBounds(sal_uInt16 nPage) const2139*b1cdbd2cSJim Jagielski Rectangle TabControl::GetTabPageBounds( sal_uInt16 nPage ) const
2140*b1cdbd2cSJim Jagielski {
2141*b1cdbd2cSJim Jagielski     Rectangle aRet;
2142*b1cdbd2cSJim Jagielski 
2143*b1cdbd2cSJim Jagielski     if( !HasLayoutData() || ! mpTabCtrlData->maLayoutPageIdToLine.size() )
2144*b1cdbd2cSJim Jagielski         FillLayoutData();
2145*b1cdbd2cSJim Jagielski 
2146*b1cdbd2cSJim Jagielski     if( HasLayoutData() )
2147*b1cdbd2cSJim Jagielski     {
2148*b1cdbd2cSJim Jagielski         std::hash_map< int, int >::const_iterator it = mpTabCtrlData->maLayoutPageIdToLine.find( (int)nPage );
2149*b1cdbd2cSJim Jagielski         if( it != mpTabCtrlData->maLayoutPageIdToLine.end() )
2150*b1cdbd2cSJim Jagielski         {
2151*b1cdbd2cSJim Jagielski             if( it->second >= 0 && it->second < static_cast<int>(mpTabCtrlData->maTabRectangles.size()) )
2152*b1cdbd2cSJim Jagielski             {
2153*b1cdbd2cSJim Jagielski                 aRet = mpTabCtrlData->maTabRectangles[ it->second ];
2154*b1cdbd2cSJim Jagielski                 aRet.Union( const_cast<TabControl*>(this)->ImplGetTabRect( TAB_PAGERECT ) );
2155*b1cdbd2cSJim Jagielski             }
2156*b1cdbd2cSJim Jagielski         }
2157*b1cdbd2cSJim Jagielski     }
2158*b1cdbd2cSJim Jagielski 
2159*b1cdbd2cSJim Jagielski     return aRet;
2160*b1cdbd2cSJim Jagielski }
2161*b1cdbd2cSJim Jagielski 
2162*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2163*b1cdbd2cSJim Jagielski 
GetTabBounds(sal_uInt16 nPageId) const2164*b1cdbd2cSJim Jagielski Rectangle TabControl::GetTabBounds( sal_uInt16 nPageId ) const
2165*b1cdbd2cSJim Jagielski {
2166*b1cdbd2cSJim Jagielski     Rectangle aRet;
2167*b1cdbd2cSJim Jagielski 
2168*b1cdbd2cSJim Jagielski     ImplTabItem* pItem = ImplGetItem( nPageId );
2169*b1cdbd2cSJim Jagielski     if(pItem)
2170*b1cdbd2cSJim Jagielski         aRet = pItem->maRect;
2171*b1cdbd2cSJim Jagielski 
2172*b1cdbd2cSJim Jagielski     return aRet;
2173*b1cdbd2cSJim Jagielski }
2174*b1cdbd2cSJim Jagielski 
2175*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2176*b1cdbd2cSJim Jagielski 
SetItemsOffset(const Point & rOffs)2177*b1cdbd2cSJim Jagielski void TabControl::SetItemsOffset( const Point& rOffs )
2178*b1cdbd2cSJim Jagielski {
2179*b1cdbd2cSJim Jagielski     if( mpTabCtrlData )
2180*b1cdbd2cSJim Jagielski         mpTabCtrlData->maItemsOffset = rOffs;
2181*b1cdbd2cSJim Jagielski }
2182*b1cdbd2cSJim Jagielski 
GetItemsOffset() const2183*b1cdbd2cSJim Jagielski Point TabControl::GetItemsOffset() const
2184*b1cdbd2cSJim Jagielski {
2185*b1cdbd2cSJim Jagielski     if( mpTabCtrlData )
2186*b1cdbd2cSJim Jagielski         return mpTabCtrlData->maItemsOffset;
2187*b1cdbd2cSJim Jagielski     else
2188*b1cdbd2cSJim Jagielski         return Point();
2189*b1cdbd2cSJim Jagielski }
2190*b1cdbd2cSJim Jagielski 
2191*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2192*b1cdbd2cSJim Jagielski 
GetOptimalSize(WindowSizeType eType) const2193*b1cdbd2cSJim Jagielski Size TabControl::GetOptimalSize(WindowSizeType eType) const
2194*b1cdbd2cSJim Jagielski {
2195*b1cdbd2cSJim Jagielski     switch (eType) {
2196*b1cdbd2cSJim Jagielski     case WINDOWSIZE_MINIMUM:
2197*b1cdbd2cSJim Jagielski         return mpTabCtrlData ? mpTabCtrlData->maMinSize : Size();
2198*b1cdbd2cSJim Jagielski     default:
2199*b1cdbd2cSJim Jagielski         return Control::GetOptimalSize( eType );
2200*b1cdbd2cSJim Jagielski     }
2201*b1cdbd2cSJim Jagielski }
2202*b1cdbd2cSJim Jagielski 
2203*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2204*b1cdbd2cSJim Jagielski 
SetMinimumSizePixel(const Size & i_rSize)2205*b1cdbd2cSJim Jagielski void TabControl::SetMinimumSizePixel( const Size& i_rSize )
2206*b1cdbd2cSJim Jagielski {
2207*b1cdbd2cSJim Jagielski     if( mpTabCtrlData )
2208*b1cdbd2cSJim Jagielski         mpTabCtrlData->maMinSize = i_rSize;
2209*b1cdbd2cSJim Jagielski }
2210*b1cdbd2cSJim Jagielski 
2211*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2212*b1cdbd2cSJim Jagielski 
2213*b1cdbd2cSJim Jagielski 
2214