xref: /aoo42x/main/svtools/source/control/tabbar.cxx (revision 79aad27f)
1*5900e8ecSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5900e8ecSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5900e8ecSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5900e8ecSAndrew Rist  * distributed with this work for additional information
6*5900e8ecSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5900e8ecSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5900e8ecSAndrew Rist  * "License"); you may not use this file except in compliance
9*5900e8ecSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*5900e8ecSAndrew Rist  *
11*5900e8ecSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*5900e8ecSAndrew Rist  *
13*5900e8ecSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5900e8ecSAndrew Rist  * software distributed under the License is distributed on an
15*5900e8ecSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5900e8ecSAndrew Rist  * KIND, either express or implied.  See the License for the
17*5900e8ecSAndrew Rist  * specific language governing permissions and limitations
18*5900e8ecSAndrew Rist  * under the License.
19*5900e8ecSAndrew Rist  *
20*5900e8ecSAndrew Rist  *************************************************************/
21*5900e8ecSAndrew Rist 
22*5900e8ecSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svtools.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <svtools/tabbar.hxx>
28cdf0e10cSrcweir #include <tools/time.hxx>
29cdf0e10cSrcweir #include <tools/debug.hxx>
30cdf0e10cSrcweir #include <tools/poly.hxx>
31cdf0e10cSrcweir #include <vcl/svapp.hxx>
32cdf0e10cSrcweir #include <vcl/help.hxx>
33cdf0e10cSrcweir #include <vcl/decoview.hxx>
34cdf0e10cSrcweir #include <vcl/button.hxx>
35cdf0e10cSrcweir #include <vcl/edit.hxx>
36cdf0e10cSrcweir #include "svtaccessiblefactory.hxx"
37cdf0e10cSrcweir #include <filectrl.hrc>
38cdf0e10cSrcweir #include <svtools/svtdata.hxx>
39cdf0e10cSrcweir #include <limits>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir // =======================================================================
42cdf0e10cSrcweir 
43cdf0e10cSrcweir #define TABBAR_OFFSET_X         7
44cdf0e10cSrcweir #define TABBAR_OFFSET_X2        2
45cdf0e10cSrcweir #define TABBAR_DRAG_SCROLLOFF   5
46cdf0e10cSrcweir #define TABBAR_MINSIZE          5
47cdf0e10cSrcweir 
48cdf0e10cSrcweir const sal_uInt16 ADDNEWPAGE_AREAWIDTH = 10;
49cdf0e10cSrcweir 
50cdf0e10cSrcweir // =======================================================================
51cdf0e10cSrcweir 
52cdf0e10cSrcweir struct ImplTabBarItem
53cdf0e10cSrcweir {
54cdf0e10cSrcweir     sal_uInt16          mnId;
55cdf0e10cSrcweir     TabBarPageBits  mnBits;
56cdf0e10cSrcweir     XubString       maText;
57cdf0e10cSrcweir     XubString       maHelpText;
58cdf0e10cSrcweir     Rectangle       maRect;
59cdf0e10cSrcweir     long            mnWidth;
60cdf0e10cSrcweir     rtl::OString    maHelpId;
61cdf0e10cSrcweir     sal_Bool            mbShort;
62cdf0e10cSrcweir     sal_Bool            mbSelect;
63cdf0e10cSrcweir     sal_Bool            mbEnable;
64cdf0e10cSrcweir     Color           maTabBgColor;
IsDefaultTabBgColorImplTabBarItem65cdf0e10cSrcweir     bool            IsDefaultTabBgColor() const { return maTabBgColor == Color(COL_AUTO) ? sal_True : sal_False; };
66cdf0e10cSrcweir     Color           maTabTextColor;
IsDefaultTabTextColorImplTabBarItem67cdf0e10cSrcweir     bool            IsDefaultTabTextColor() const { return maTabTextColor == Color(COL_AUTO) ? sal_True : sal_False; };
68cdf0e10cSrcweir 
ImplTabBarItemImplTabBarItem69cdf0e10cSrcweir                     ImplTabBarItem( sal_uInt16 nItemId, const XubString& rText,
70cdf0e10cSrcweir                                     TabBarPageBits nPageBits ) :
71cdf0e10cSrcweir                         maText( rText )
72cdf0e10cSrcweir                     {
73cdf0e10cSrcweir                         mnId     = nItemId;
74cdf0e10cSrcweir                         mnBits   = nPageBits;
75cdf0e10cSrcweir                         mnWidth  = 0;
76cdf0e10cSrcweir                         mbShort  = sal_False;
77cdf0e10cSrcweir                         mbSelect = sal_False;
78cdf0e10cSrcweir                         mbEnable = sal_True;
79cdf0e10cSrcweir                         maTabBgColor = Color( COL_AUTO );
80cdf0e10cSrcweir                         maTabTextColor = Color( COL_AUTO );
81cdf0e10cSrcweir                     }
82cdf0e10cSrcweir };
83cdf0e10cSrcweir 
84cdf0e10cSrcweir DECLARE_LIST( ImplTabBarList, ImplTabBarItem* )
85cdf0e10cSrcweir 
86cdf0e10cSrcweir // =======================================================================
87cdf0e10cSrcweir 
88cdf0e10cSrcweir // -----------------
89cdf0e10cSrcweir // - ImplTabButton -
90cdf0e10cSrcweir // -----------------
91cdf0e10cSrcweir 
92cdf0e10cSrcweir class ImplTabButton : public PushButton
93cdf0e10cSrcweir {
94cdf0e10cSrcweir public:
ImplTabButton(TabBar * pParent,WinBits nWinStyle=0)95cdf0e10cSrcweir                     ImplTabButton( TabBar* pParent, WinBits nWinStyle = 0 ) :
96cdf0e10cSrcweir                         PushButton( pParent, nWinStyle | WB_RECTSTYLE | WB_SMALLSTYLE | WB_NOLIGHTBORDER | WB_NOPOINTERFOCUS  ) {}
97cdf0e10cSrcweir 
GetParent() const98cdf0e10cSrcweir     TabBar*         GetParent() const { return (TabBar*)Window::GetParent(); }
99cdf0e10cSrcweir 
100cdf0e10cSrcweir     virtual long    PreNotify( NotifyEvent& rNEvt );
101cdf0e10cSrcweir };
102cdf0e10cSrcweir 
103cdf0e10cSrcweir // =======================================================================
104cdf0e10cSrcweir 
PreNotify(NotifyEvent & rNEvt)105cdf0e10cSrcweir long ImplTabButton::PreNotify( NotifyEvent& rNEvt )
106cdf0e10cSrcweir {
107cdf0e10cSrcweir     if ( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN )
108cdf0e10cSrcweir     {
109cdf0e10cSrcweir         if ( GetParent()->IsInEditMode() )
110cdf0e10cSrcweir         {
111cdf0e10cSrcweir             GetParent()->EndEditMode();
112cdf0e10cSrcweir             return sal_True;
113cdf0e10cSrcweir         }
114cdf0e10cSrcweir     }
115cdf0e10cSrcweir 
116cdf0e10cSrcweir     return PushButton::PreNotify( rNEvt );
117cdf0e10cSrcweir }
118cdf0e10cSrcweir 
119cdf0e10cSrcweir // =======================================================================
120cdf0e10cSrcweir 
121cdf0e10cSrcweir // ----------------
122cdf0e10cSrcweir // - ImplTabSizer -
123cdf0e10cSrcweir // ----------------
124cdf0e10cSrcweir 
125cdf0e10cSrcweir class ImplTabSizer : public Window
126cdf0e10cSrcweir {
127cdf0e10cSrcweir public:
128cdf0e10cSrcweir                     ImplTabSizer( TabBar* pParent, WinBits nWinStyle = 0 );
129cdf0e10cSrcweir 
GetParent() const130cdf0e10cSrcweir     TabBar*         GetParent() const { return (TabBar*)Window::GetParent(); }
131cdf0e10cSrcweir 
132cdf0e10cSrcweir private:
133cdf0e10cSrcweir     void            ImplTrack( const Point& rScreenPos );
134cdf0e10cSrcweir 
135cdf0e10cSrcweir     virtual void    MouseButtonDown( const MouseEvent& rMEvt );
136cdf0e10cSrcweir     virtual void    Tracking( const TrackingEvent& rTEvt );
137cdf0e10cSrcweir     virtual void    Paint( const Rectangle& rRect );
138cdf0e10cSrcweir 
139cdf0e10cSrcweir     Point           maStartPos;
140cdf0e10cSrcweir     long            mnStartWidth;
141cdf0e10cSrcweir };
142cdf0e10cSrcweir 
143cdf0e10cSrcweir // -----------------------------------------------------------------------
144cdf0e10cSrcweir 
ImplTabSizer(TabBar * pParent,WinBits nWinStyle)145cdf0e10cSrcweir ImplTabSizer::ImplTabSizer( TabBar* pParent, WinBits nWinStyle ) :
146cdf0e10cSrcweir     Window( pParent, nWinStyle & WB_3DLOOK )
147cdf0e10cSrcweir {
148cdf0e10cSrcweir     SetPointer( Pointer( POINTER_HSIZEBAR ) );
149cdf0e10cSrcweir     SetSizePixel( Size( 7, 0 ) );
150cdf0e10cSrcweir }
151cdf0e10cSrcweir 
152cdf0e10cSrcweir // -----------------------------------------------------------------------
153cdf0e10cSrcweir 
ImplTrack(const Point & rScreenPos)154cdf0e10cSrcweir void ImplTabSizer::ImplTrack( const Point& rScreenPos )
155cdf0e10cSrcweir {
156cdf0e10cSrcweir     TabBar* pParent = GetParent();
157cdf0e10cSrcweir     long nDiff = rScreenPos.X() - maStartPos.X();
158cdf0e10cSrcweir     pParent->mnSplitSize = mnStartWidth + (pParent->IsMirrored() ? -nDiff : nDiff);
159cdf0e10cSrcweir     if ( pParent->mnSplitSize < TABBAR_MINSIZE )
160cdf0e10cSrcweir         pParent->mnSplitSize = TABBAR_MINSIZE;
161cdf0e10cSrcweir     pParent->Split();
162cdf0e10cSrcweir     pParent->Update();
163cdf0e10cSrcweir }
164cdf0e10cSrcweir 
165cdf0e10cSrcweir // -----------------------------------------------------------------------
166cdf0e10cSrcweir 
MouseButtonDown(const MouseEvent & rMEvt)167cdf0e10cSrcweir void ImplTabSizer::MouseButtonDown( const MouseEvent& rMEvt )
168cdf0e10cSrcweir {
169cdf0e10cSrcweir     if ( GetParent()->IsInEditMode() )
170cdf0e10cSrcweir     {
171cdf0e10cSrcweir         GetParent()->EndEditMode();
172cdf0e10cSrcweir         return;
173cdf0e10cSrcweir     }
174cdf0e10cSrcweir 
175cdf0e10cSrcweir     if ( rMEvt.IsLeft() )
176cdf0e10cSrcweir     {
177cdf0e10cSrcweir         maStartPos = OutputToScreenPixel( rMEvt.GetPosPixel() );
178cdf0e10cSrcweir         mnStartWidth = GetParent()->GetSizePixel().Width();
179cdf0e10cSrcweir         StartTracking();
180cdf0e10cSrcweir     }
181cdf0e10cSrcweir }
182cdf0e10cSrcweir 
183cdf0e10cSrcweir // -----------------------------------------------------------------------
184cdf0e10cSrcweir 
Tracking(const TrackingEvent & rTEvt)185cdf0e10cSrcweir void ImplTabSizer::Tracking( const TrackingEvent& rTEvt )
186cdf0e10cSrcweir {
187cdf0e10cSrcweir     if ( rTEvt.IsTrackingEnded() )
188cdf0e10cSrcweir     {
189cdf0e10cSrcweir         if ( rTEvt.IsTrackingCanceled() )
190cdf0e10cSrcweir             ImplTrack( maStartPos );
191cdf0e10cSrcweir         GetParent()->mnSplitSize = 0;
192cdf0e10cSrcweir     }
193cdf0e10cSrcweir     else
194cdf0e10cSrcweir         ImplTrack( OutputToScreenPixel( rTEvt.GetMouseEvent().GetPosPixel() ) );
195cdf0e10cSrcweir }
196cdf0e10cSrcweir 
197cdf0e10cSrcweir // -----------------------------------------------------------------------
198cdf0e10cSrcweir 
Paint(const Rectangle &)199cdf0e10cSrcweir void ImplTabSizer::Paint( const Rectangle& )
200cdf0e10cSrcweir {
201cdf0e10cSrcweir     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
202cdf0e10cSrcweir     DecorationView  aDecoView( this );
203cdf0e10cSrcweir     long            nOffX = 0;
204cdf0e10cSrcweir     Size            aOutputSize = GetOutputSizePixel();
205cdf0e10cSrcweir 
206cdf0e10cSrcweir     if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) )
207cdf0e10cSrcweir     {
208cdf0e10cSrcweir         SetLineColor( rStyleSettings.GetDarkShadowColor() );
209cdf0e10cSrcweir         DrawLine( Point( 0, 0 ), Point( 0, aOutputSize.Height()-1 ) );
210cdf0e10cSrcweir         nOffX++;
211cdf0e10cSrcweir         aOutputSize.Width()--;
212cdf0e10cSrcweir     }
213cdf0e10cSrcweir     aDecoView.DrawButton( Rectangle( Point( nOffX, 0 ), aOutputSize ), BUTTON_DRAW_NOLIGHTBORDER );
214cdf0e10cSrcweir }
215cdf0e10cSrcweir 
216cdf0e10cSrcweir // =======================================================================
217cdf0e10cSrcweir 
218cdf0e10cSrcweir // Heisst nicht Impl, da evtl. mal von aussen benutz- und ueberladbar
219cdf0e10cSrcweir 
220cdf0e10cSrcweir // --------------
221cdf0e10cSrcweir // - TabBarEdit -
222cdf0e10cSrcweir // --------------
223cdf0e10cSrcweir 
224cdf0e10cSrcweir class TabBarEdit : public Edit
225cdf0e10cSrcweir {
226cdf0e10cSrcweir private:
227cdf0e10cSrcweir     Timer           maLoseFocusTimer;
228cdf0e10cSrcweir     sal_Bool            mbPostEvt;
229cdf0e10cSrcweir 
230cdf0e10cSrcweir                     DECL_LINK( ImplEndEditHdl, void* );
231cdf0e10cSrcweir                     DECL_LINK( ImplEndTimerHdl, void* );
232cdf0e10cSrcweir 
233cdf0e10cSrcweir public:
234cdf0e10cSrcweir                     TabBarEdit( TabBar* pParent, WinBits nWinStyle = 0 );
235cdf0e10cSrcweir 
GetParent() const236cdf0e10cSrcweir     TabBar*         GetParent() const { return (TabBar*)Window::GetParent(); }
237cdf0e10cSrcweir 
SetPostEvent()238cdf0e10cSrcweir     void            SetPostEvent() { mbPostEvt = sal_True; }
ResetPostEvent()239cdf0e10cSrcweir     void            ResetPostEvent() { mbPostEvt = sal_False; }
240cdf0e10cSrcweir 
241cdf0e10cSrcweir     virtual long    PreNotify( NotifyEvent& rNEvt );
242cdf0e10cSrcweir     virtual void    LoseFocus();
243cdf0e10cSrcweir };
244cdf0e10cSrcweir 
245cdf0e10cSrcweir // -----------------------------------------------------------------------
246cdf0e10cSrcweir 
TabBarEdit(TabBar * pParent,WinBits nWinStyle)247cdf0e10cSrcweir TabBarEdit::TabBarEdit( TabBar* pParent, WinBits nWinStyle ) :
248cdf0e10cSrcweir     Edit( pParent, nWinStyle )
249cdf0e10cSrcweir {
250cdf0e10cSrcweir     mbPostEvt = sal_False;
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir // -----------------------------------------------------------------------
254cdf0e10cSrcweir 
PreNotify(NotifyEvent & rNEvt)255cdf0e10cSrcweir long TabBarEdit::PreNotify( NotifyEvent& rNEvt )
256cdf0e10cSrcweir {
257cdf0e10cSrcweir     if ( rNEvt.GetType() == EVENT_KEYINPUT )
258cdf0e10cSrcweir     {
259cdf0e10cSrcweir         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
260cdf0e10cSrcweir         if ( !pKEvt->GetKeyCode().GetModifier() )
261cdf0e10cSrcweir         {
262cdf0e10cSrcweir             if ( pKEvt->GetKeyCode().GetCode() == KEY_RETURN )
263cdf0e10cSrcweir             {
264cdf0e10cSrcweir                 if ( !mbPostEvt )
265cdf0e10cSrcweir                 {
266cdf0e10cSrcweir                     if ( PostUserEvent( LINK( this, TabBarEdit, ImplEndEditHdl ), (void*)sal_False ) )
267cdf0e10cSrcweir                         mbPostEvt = sal_True;
268cdf0e10cSrcweir                 }
269cdf0e10cSrcweir                 return sal_True;
270cdf0e10cSrcweir             }
271cdf0e10cSrcweir             else if ( pKEvt->GetKeyCode().GetCode() == KEY_ESCAPE )
272cdf0e10cSrcweir             {
273cdf0e10cSrcweir                 if ( !mbPostEvt )
274cdf0e10cSrcweir                 {
275cdf0e10cSrcweir                     if ( PostUserEvent( LINK( this, TabBarEdit, ImplEndEditHdl ), (void*)sal_True ) )
276cdf0e10cSrcweir                         mbPostEvt = sal_True;
277cdf0e10cSrcweir                 }
278cdf0e10cSrcweir                 return sal_True;
279cdf0e10cSrcweir             }
280cdf0e10cSrcweir         }
281cdf0e10cSrcweir     }
282cdf0e10cSrcweir 
283cdf0e10cSrcweir     return Edit::PreNotify( rNEvt );
284cdf0e10cSrcweir }
285cdf0e10cSrcweir 
286cdf0e10cSrcweir // -----------------------------------------------------------------------
287cdf0e10cSrcweir 
LoseFocus()288cdf0e10cSrcweir void TabBarEdit::LoseFocus()
289cdf0e10cSrcweir {
290cdf0e10cSrcweir     if ( !mbPostEvt )
291cdf0e10cSrcweir     {
292cdf0e10cSrcweir         if ( PostUserEvent( LINK( this, TabBarEdit, ImplEndEditHdl ), (void*)sal_False ) )
293cdf0e10cSrcweir             mbPostEvt = sal_True;
294cdf0e10cSrcweir     }
295cdf0e10cSrcweir 
296cdf0e10cSrcweir     Edit::LoseFocus();
297cdf0e10cSrcweir }
298cdf0e10cSrcweir 
299cdf0e10cSrcweir // -----------------------------------------------------------------------
300cdf0e10cSrcweir 
IMPL_LINK(TabBarEdit,ImplEndEditHdl,void *,pCancel)301cdf0e10cSrcweir IMPL_LINK( TabBarEdit, ImplEndEditHdl, void*, pCancel )
302cdf0e10cSrcweir {
303cdf0e10cSrcweir     ResetPostEvent();
304cdf0e10cSrcweir     maLoseFocusTimer.Stop();
305cdf0e10cSrcweir 
306cdf0e10cSrcweir     // We need this query, because the edit get a losefous event,
307cdf0e10cSrcweir     // when it shows the context menu or the insert symbol dialog
308cdf0e10cSrcweir     if ( !HasFocus() && HasChildPathFocus( sal_True ) )
309cdf0e10cSrcweir     {
310cdf0e10cSrcweir         maLoseFocusTimer.SetTimeout( 30 );
311cdf0e10cSrcweir         maLoseFocusTimer.SetTimeoutHdl( LINK( this, TabBarEdit, ImplEndTimerHdl ) );
312cdf0e10cSrcweir         maLoseFocusTimer.Start();
313cdf0e10cSrcweir     }
314cdf0e10cSrcweir     else
315cdf0e10cSrcweir         GetParent()->EndEditMode( pCancel != 0 );
316cdf0e10cSrcweir 
317cdf0e10cSrcweir     return 0;
318cdf0e10cSrcweir }
319cdf0e10cSrcweir 
320cdf0e10cSrcweir // -----------------------------------------------------------------------
321cdf0e10cSrcweir 
IMPL_LINK(TabBarEdit,ImplEndTimerHdl,void *,EMPTYARG)322cdf0e10cSrcweir IMPL_LINK( TabBarEdit, ImplEndTimerHdl, void*, EMPTYARG )
323cdf0e10cSrcweir {
324cdf0e10cSrcweir     if ( HasFocus() )
325cdf0e10cSrcweir         return 0;
326cdf0e10cSrcweir 
327cdf0e10cSrcweir     // We need this query, because the edit get a losefous event,
328cdf0e10cSrcweir     // when it shows the context menu or the insert symbol dialog
329cdf0e10cSrcweir     if ( HasChildPathFocus( sal_True ) )
330cdf0e10cSrcweir         maLoseFocusTimer.Start();
331cdf0e10cSrcweir     else
332cdf0e10cSrcweir         GetParent()->EndEditMode( sal_True );
333cdf0e10cSrcweir 
334cdf0e10cSrcweir     return 0;
335cdf0e10cSrcweir }
336cdf0e10cSrcweir 
337cdf0e10cSrcweir // =======================================================================
338cdf0e10cSrcweir struct TabBar_Impl
339cdf0e10cSrcweir {
340cdf0e10cSrcweir     ImplTabSizer*                   mpSizer;
341cdf0e10cSrcweir     ::svt::AccessibleFactoryAccess  maAccessibleFactory;
342cdf0e10cSrcweir 
TabBar_ImplTabBar_Impl343cdf0e10cSrcweir     TabBar_Impl()
344cdf0e10cSrcweir         :mpSizer( NULL )
345cdf0e10cSrcweir     {
346cdf0e10cSrcweir     }
~TabBar_ImplTabBar_Impl347cdf0e10cSrcweir     ~TabBar_Impl()
348cdf0e10cSrcweir     {
349cdf0e10cSrcweir         delete mpSizer;
350cdf0e10cSrcweir     }
351cdf0e10cSrcweir };
352cdf0e10cSrcweir 
353cdf0e10cSrcweir // =======================================================================
354cdf0e10cSrcweir 
355cdf0e10cSrcweir const sal_uInt16 TabBar::APPEND         = ::std::numeric_limits<sal_uInt16>::max();
356cdf0e10cSrcweir const sal_uInt16 TabBar::PAGE_NOT_FOUND = ::std::numeric_limits<sal_uInt16>::max();
357cdf0e10cSrcweir 
ImplInit(WinBits nWinStyle)358cdf0e10cSrcweir void TabBar::ImplInit( WinBits nWinStyle )
359cdf0e10cSrcweir {
360cdf0e10cSrcweir     mpItemList      = new ImplTabBarList;
361cdf0e10cSrcweir     mpFirstBtn      = NULL;
362cdf0e10cSrcweir     mpPrevBtn       = NULL;
363cdf0e10cSrcweir     mpNextBtn       = NULL;
364cdf0e10cSrcweir     mpLastBtn       = NULL;
365cdf0e10cSrcweir     mpImpl          = new TabBar_Impl;
366cdf0e10cSrcweir     mpEdit          = NULL;
367cdf0e10cSrcweir     mnMaxPageWidth  = 0;
368cdf0e10cSrcweir     mnCurMaxWidth   = 0;
369cdf0e10cSrcweir     mnOffX          = 0;
370cdf0e10cSrcweir     mnOffY          = 0;
371cdf0e10cSrcweir     mnLastOffX      = 0;
372cdf0e10cSrcweir     mnSplitSize     = 0;
373cdf0e10cSrcweir     mnSwitchTime    = 0;
374cdf0e10cSrcweir     mnWinStyle      = nWinStyle;
375cdf0e10cSrcweir     mnCurPageId     = 0;
376cdf0e10cSrcweir     mnFirstPos      = 0;
377cdf0e10cSrcweir     mnDropPos       = 0;
378cdf0e10cSrcweir     mnSwitchId      = 0;
379cdf0e10cSrcweir     mnEditId        = 0;
380cdf0e10cSrcweir     mbFormat        = sal_True;
381cdf0e10cSrcweir     mbFirstFormat   = sal_True;
382cdf0e10cSrcweir     mbSizeFormat    = sal_True;
383cdf0e10cSrcweir     mbAutoMaxWidth  = sal_True;
384cdf0e10cSrcweir     mbInSwitching   = sal_False;
385cdf0e10cSrcweir     mbAutoEditMode  = sal_False;
386cdf0e10cSrcweir     mbEditCanceled  = sal_False;
387cdf0e10cSrcweir     mbDropPos       = sal_False;
388cdf0e10cSrcweir     mbInSelect      = sal_False;
389cdf0e10cSrcweir     mbSelColor      = sal_False;
390cdf0e10cSrcweir     mbSelTextColor  = sal_False;
391cdf0e10cSrcweir     mbMirrored      = sal_False;
392cdf0e10cSrcweir 
393cdf0e10cSrcweir     if ( nWinStyle & WB_3DTAB )
394cdf0e10cSrcweir         mnOffY++;
395cdf0e10cSrcweir 
396cdf0e10cSrcweir     ImplInitControls();
397cdf0e10cSrcweir 
398cdf0e10cSrcweir 	if(mpFirstBtn)
399cdf0e10cSrcweir 		mpFirstBtn->SetAccessibleName(String(SvtResId(STR_TABBAR_PUSHBUTTON_MOVET0HOME)));
400cdf0e10cSrcweir 	if(mpPrevBtn)
401cdf0e10cSrcweir 		mpPrevBtn->SetAccessibleName( String(SvtResId(STR_TABBAR_PUSHBUTTON_MOVELEFT)));
402cdf0e10cSrcweir     if(mpNextBtn)
403cdf0e10cSrcweir 		mpNextBtn->SetAccessibleName(String(SvtResId(STR_TABBAR_PUSHBUTTON_MOVERIGHT)));
404cdf0e10cSrcweir     if(mpLastBtn)
405cdf0e10cSrcweir 		mpLastBtn->SetAccessibleName( String(SvtResId(STR_TABBAR_PUSHBUTTON_MOVETOEND)));
406cdf0e10cSrcweir 
407cdf0e10cSrcweir     SetSizePixel( Size( 100, CalcWindowSizePixel().Height() ) );
408cdf0e10cSrcweir     ImplInitSettings( sal_True, sal_True );
409cdf0e10cSrcweir }
410cdf0e10cSrcweir 
411cdf0e10cSrcweir // -----------------------------------------------------------------------
412cdf0e10cSrcweir 
TabBar(Window * pParent,WinBits nWinStyle)413cdf0e10cSrcweir TabBar::TabBar( Window* pParent, WinBits nWinStyle ) :
414cdf0e10cSrcweir     Window( pParent, (nWinStyle & WB_3DLOOK) | WB_CLIPCHILDREN )
415cdf0e10cSrcweir {
416cdf0e10cSrcweir     ImplInit( nWinStyle );
417cdf0e10cSrcweir }
418cdf0e10cSrcweir 
419cdf0e10cSrcweir // -----------------------------------------------------------------------
420cdf0e10cSrcweir 
~TabBar()421cdf0e10cSrcweir TabBar::~TabBar()
422cdf0e10cSrcweir {
423cdf0e10cSrcweir     EndEditMode( sal_True );
424cdf0e10cSrcweir 
425cdf0e10cSrcweir     // Controls loeschen
426cdf0e10cSrcweir     if ( mpPrevBtn )
427cdf0e10cSrcweir         delete mpPrevBtn;
428cdf0e10cSrcweir     if ( mpNextBtn )
429cdf0e10cSrcweir         delete mpNextBtn;
430cdf0e10cSrcweir     if ( mpFirstBtn )
431cdf0e10cSrcweir         delete mpFirstBtn;
432cdf0e10cSrcweir     if ( mpLastBtn )
433cdf0e10cSrcweir         delete mpLastBtn;
434cdf0e10cSrcweir     delete mpImpl;
435cdf0e10cSrcweir 
436cdf0e10cSrcweir     // Alle Items loeschen
437cdf0e10cSrcweir     ImplTabBarItem* pItem = mpItemList->First();
438cdf0e10cSrcweir     while ( pItem )
439cdf0e10cSrcweir     {
440cdf0e10cSrcweir         delete pItem;
441cdf0e10cSrcweir         pItem = mpItemList->Next();
442cdf0e10cSrcweir     }
443cdf0e10cSrcweir 
444cdf0e10cSrcweir     // Itemlist loeschen
445cdf0e10cSrcweir     delete mpItemList;
446cdf0e10cSrcweir }
447cdf0e10cSrcweir 
448cdf0e10cSrcweir // -----------------------------------------------------------------------
449cdf0e10cSrcweir 
ImplInitSettings(sal_Bool bFont,sal_Bool bBackground)450cdf0e10cSrcweir void TabBar::ImplInitSettings( sal_Bool bFont, sal_Bool bBackground )
451cdf0e10cSrcweir {
452cdf0e10cSrcweir     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
453cdf0e10cSrcweir 
454cdf0e10cSrcweir     if ( bFont )
455cdf0e10cSrcweir     {
456cdf0e10cSrcweir         Font aToolFont;
457cdf0e10cSrcweir         aToolFont = rStyleSettings.GetToolFont();
458cdf0e10cSrcweir         if ( IsControlFont() )
459cdf0e10cSrcweir             aToolFont.Merge( GetControlFont() );
460cdf0e10cSrcweir         aToolFont.SetWeight( WEIGHT_BOLD );
461cdf0e10cSrcweir         SetZoomedPointFont( aToolFont );
462cdf0e10cSrcweir 
463cdf0e10cSrcweir         // Font in der groesse Anpassen, wenn Fenster zu klein?
464cdf0e10cSrcweir         while ( GetTextHeight() > (GetOutputSizePixel().Height()-1) )
465cdf0e10cSrcweir         {
466cdf0e10cSrcweir             Font aFont = GetFont();
467cdf0e10cSrcweir             if ( aFont.GetHeight() <= 6 )
468cdf0e10cSrcweir                 break;
469cdf0e10cSrcweir             aFont.SetHeight( aFont.GetHeight()-1 );
470cdf0e10cSrcweir             SetFont( aFont );
471cdf0e10cSrcweir         }
472cdf0e10cSrcweir     }
473cdf0e10cSrcweir 
474cdf0e10cSrcweir     if ( bBackground )
475cdf0e10cSrcweir     {
476cdf0e10cSrcweir         Color aColor;
477cdf0e10cSrcweir         if ( IsControlBackground() )
478cdf0e10cSrcweir             aColor = GetControlBackground();
479cdf0e10cSrcweir         else
480cdf0e10cSrcweir             aColor = rStyleSettings.GetFaceColor();
481cdf0e10cSrcweir         SetBackground( aColor );
482cdf0e10cSrcweir     }
483cdf0e10cSrcweir }
484cdf0e10cSrcweir 
485cdf0e10cSrcweir // -----------------------------------------------------------------------
486cdf0e10cSrcweir 
ImplGetColors(Color & rFaceColor,Color & rFaceTextColor,Color & rSelectColor,Color & rSelectTextColor)487cdf0e10cSrcweir void TabBar::ImplGetColors( Color& rFaceColor, Color& rFaceTextColor,
488cdf0e10cSrcweir                             Color& rSelectColor, Color& rSelectTextColor )
489cdf0e10cSrcweir {
490cdf0e10cSrcweir     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
491cdf0e10cSrcweir 
492cdf0e10cSrcweir     if ( IsControlBackground() )
493cdf0e10cSrcweir         rFaceColor = GetControlBackground();
494cdf0e10cSrcweir     else
495cdf0e10cSrcweir         rFaceColor = rStyleSettings.GetInactiveTabColor();
496cdf0e10cSrcweir     if ( IsControlForeground() )
497cdf0e10cSrcweir         rFaceTextColor = GetControlForeground();
498cdf0e10cSrcweir     else
499cdf0e10cSrcweir         rFaceTextColor = rStyleSettings.GetButtonTextColor();
500cdf0e10cSrcweir     if ( mbSelColor )
501cdf0e10cSrcweir         rSelectColor = maSelColor;
502cdf0e10cSrcweir     else
503cdf0e10cSrcweir         rSelectColor = rStyleSettings.GetActiveTabColor();
504cdf0e10cSrcweir     if ( mbSelTextColor )
505cdf0e10cSrcweir         rSelectTextColor = maSelTextColor;
506cdf0e10cSrcweir     else
507cdf0e10cSrcweir         rSelectTextColor = rStyleSettings.GetWindowTextColor();
508cdf0e10cSrcweir 
509cdf0e10cSrcweir     // Bei 3D-Tabs wird Selektions- und Face-Farbe umgedreht, da die
510cdf0e10cSrcweir     // selektierten Tabs in 3D erscheinen sollen
511cdf0e10cSrcweir     if ( mnWinStyle & WB_3DTAB )
512cdf0e10cSrcweir     {
513cdf0e10cSrcweir         Color aTempColor = rFaceColor;
514cdf0e10cSrcweir         rFaceColor = rSelectColor;
515cdf0e10cSrcweir         rSelectColor = aTempColor;
516cdf0e10cSrcweir         aTempColor = rFaceTextColor;
517cdf0e10cSrcweir         rFaceTextColor = rSelectTextColor;
518cdf0e10cSrcweir         rSelectTextColor = rFaceTextColor;
519cdf0e10cSrcweir     }
520cdf0e10cSrcweir }
521cdf0e10cSrcweir 
522cdf0e10cSrcweir // -----------------------------------------------------------------------
523cdf0e10cSrcweir 
ImplCalcWidth()524cdf0e10cSrcweir sal_Bool TabBar::ImplCalcWidth()
525cdf0e10cSrcweir {
526cdf0e10cSrcweir     // Groessen muessen nur ermittelt werden, wenn sich Text aendert oder
527cdf0e10cSrcweir     // wenn der Font geaendert wurde
528cdf0e10cSrcweir     if ( !mbSizeFormat )
529cdf0e10cSrcweir         return sal_False;
530cdf0e10cSrcweir 
531cdf0e10cSrcweir     // Breiten der Tabs mit dem fetten Font ermitteln
532cdf0e10cSrcweir     Font aFont = GetFont();
533cdf0e10cSrcweir     if ( aFont.GetWeight() != WEIGHT_BOLD )
534cdf0e10cSrcweir     {
535cdf0e10cSrcweir         aFont.SetWeight( WEIGHT_BOLD );
536cdf0e10cSrcweir         SetFont( aFont );
537cdf0e10cSrcweir     }
538cdf0e10cSrcweir 
539cdf0e10cSrcweir     if ( mnMaxPageWidth )
540cdf0e10cSrcweir         mnCurMaxWidth = mnMaxPageWidth;
541cdf0e10cSrcweir     else if ( mbAutoMaxWidth )
542cdf0e10cSrcweir     {
543cdf0e10cSrcweir         mnCurMaxWidth = mnLastOffX-mnOffX-
544cdf0e10cSrcweir                         TABBAR_OFFSET_X-TABBAR_OFFSET_X-
545cdf0e10cSrcweir                         TABBAR_OFFSET_X2-TABBAR_OFFSET_X2-TABBAR_OFFSET_X2;
546cdf0e10cSrcweir         if ( mnCurMaxWidth < 1 )
547cdf0e10cSrcweir             mnCurMaxWidth = 1;
548cdf0e10cSrcweir     }
549cdf0e10cSrcweir     else
550cdf0e10cSrcweir         mnCurMaxWidth = 0;
551cdf0e10cSrcweir 
552cdf0e10cSrcweir     sal_Bool            bChanged = sal_False;
553cdf0e10cSrcweir     ImplTabBarItem* pItem = mpItemList->First();
554cdf0e10cSrcweir     while ( pItem )
555cdf0e10cSrcweir     {
556cdf0e10cSrcweir         long nNewWidth = GetTextWidth( pItem->maText );
557cdf0e10cSrcweir         if ( mnCurMaxWidth && (nNewWidth > mnCurMaxWidth) )
558cdf0e10cSrcweir         {
559cdf0e10cSrcweir             pItem->mbShort = sal_True;
560cdf0e10cSrcweir             nNewWidth = mnCurMaxWidth;
561cdf0e10cSrcweir         }
562cdf0e10cSrcweir         else
563cdf0e10cSrcweir             pItem->mbShort = sal_False;
564cdf0e10cSrcweir         nNewWidth += TABBAR_OFFSET_X+TABBAR_OFFSET_X2;
565cdf0e10cSrcweir         if ( pItem->mnWidth != nNewWidth )
566cdf0e10cSrcweir         {
567cdf0e10cSrcweir             pItem->mnWidth = nNewWidth;
568cdf0e10cSrcweir             if ( !pItem->maRect.IsEmpty() )
569cdf0e10cSrcweir                 bChanged = sal_True;
570cdf0e10cSrcweir         }
571cdf0e10cSrcweir         pItem = mpItemList->Next();
572cdf0e10cSrcweir     }
573cdf0e10cSrcweir     mbSizeFormat = sal_False;
574cdf0e10cSrcweir     mbFormat = sal_True;
575cdf0e10cSrcweir     return bChanged;
576cdf0e10cSrcweir }
577cdf0e10cSrcweir 
578cdf0e10cSrcweir // -----------------------------------------------------------------------
579cdf0e10cSrcweir 
ImplFormat()580cdf0e10cSrcweir void TabBar::ImplFormat()
581cdf0e10cSrcweir {
582cdf0e10cSrcweir     ImplCalcWidth();
583cdf0e10cSrcweir 
584cdf0e10cSrcweir     if ( !mbFormat )
585cdf0e10cSrcweir         return;
586cdf0e10cSrcweir 
587cdf0e10cSrcweir     sal_uInt16 n = 0;
588cdf0e10cSrcweir     long x = mnOffX;
589cdf0e10cSrcweir     ImplTabBarItem* pItem = mpItemList->First();
590cdf0e10cSrcweir     while ( pItem )
591cdf0e10cSrcweir     {
592cdf0e10cSrcweir         // Bei allen nicht sichtbaren Tabs, wird ein leeres Rechteck
593cdf0e10cSrcweir         // gesetzt
594cdf0e10cSrcweir         if ( (n+1 < mnFirstPos) || (x > mnLastOffX) )
595cdf0e10cSrcweir             pItem->maRect.SetEmpty();
596cdf0e10cSrcweir         else
597cdf0e10cSrcweir         {
598cdf0e10cSrcweir             // Etwas von der Tab vor der ersten sichtbaren Page
599cdf0e10cSrcweir             // muss auch zu sehen sein
600cdf0e10cSrcweir             if ( n+1 == mnFirstPos )
601cdf0e10cSrcweir                 pItem->maRect.Left() = x-pItem->mnWidth;
602cdf0e10cSrcweir             else
603cdf0e10cSrcweir             {
604cdf0e10cSrcweir                 pItem->maRect.Left() = x;
605cdf0e10cSrcweir                 x += pItem->mnWidth;
606cdf0e10cSrcweir             }
607cdf0e10cSrcweir             pItem->maRect.Right() = x+TABBAR_OFFSET_X+TABBAR_OFFSET_X2;
608cdf0e10cSrcweir             pItem->maRect.Bottom() = maWinSize.Height()-1;
609cdf0e10cSrcweir 
610cdf0e10cSrcweir             if( mbMirrored )
611cdf0e10cSrcweir             {
612cdf0e10cSrcweir                 long nTmp = mnOffX + mnLastOffX - pItem->maRect.Right();
613cdf0e10cSrcweir                 pItem->maRect.Right() = mnOffX + mnLastOffX - pItem->maRect.Left();
614cdf0e10cSrcweir                 pItem->maRect.Left() = nTmp;
615cdf0e10cSrcweir             }
616cdf0e10cSrcweir         }
617cdf0e10cSrcweir 
618cdf0e10cSrcweir         n++;
619cdf0e10cSrcweir         pItem = mpItemList->Next();
620cdf0e10cSrcweir     }
621cdf0e10cSrcweir 
622cdf0e10cSrcweir     mbFormat = sal_False;
623cdf0e10cSrcweir 
624cdf0e10cSrcweir     // Button enablen/disablen
625cdf0e10cSrcweir     ImplEnableControls();
626cdf0e10cSrcweir }
627cdf0e10cSrcweir 
628cdf0e10cSrcweir // -----------------------------------------------------------------------
629cdf0e10cSrcweir 
ImplGetLastFirstPos()630cdf0e10cSrcweir sal_uInt16 TabBar::ImplGetLastFirstPos()
631cdf0e10cSrcweir {
632cdf0e10cSrcweir     sal_uInt16  nCount = (sal_uInt16)(mpItemList->Count());
633cdf0e10cSrcweir     if ( !nCount || mbSizeFormat || mbFormat )
634cdf0e10cSrcweir         return 0;
635cdf0e10cSrcweir 
636cdf0e10cSrcweir     sal_uInt16  nLastFirstPos = nCount-1;
637cdf0e10cSrcweir     long    nWinWidth = mnLastOffX-mnOffX-TABBAR_OFFSET_X-ADDNEWPAGE_AREAWIDTH;
638cdf0e10cSrcweir     long    nWidth = mpItemList->GetObject( nLastFirstPos )->mnWidth;
639cdf0e10cSrcweir     while ( nLastFirstPos && (nWidth < nWinWidth) )
640cdf0e10cSrcweir     {
641cdf0e10cSrcweir         nLastFirstPos--;
642cdf0e10cSrcweir         nWidth += mpItemList->GetObject( nLastFirstPos )->mnWidth;
643cdf0e10cSrcweir     }
644cdf0e10cSrcweir     if ( (nLastFirstPos != (sal_uInt16)(mpItemList->Count()-1)) &&
645cdf0e10cSrcweir          (nWidth > nWinWidth) )
646cdf0e10cSrcweir         nLastFirstPos++;
647cdf0e10cSrcweir     return nLastFirstPos;
648cdf0e10cSrcweir }
649cdf0e10cSrcweir 
650cdf0e10cSrcweir // -----------------------------------------------------------------------
651cdf0e10cSrcweir 
ImplInitControls()652cdf0e10cSrcweir void TabBar::ImplInitControls()
653cdf0e10cSrcweir {
654cdf0e10cSrcweir     if ( mnWinStyle & WB_SIZEABLE )
655cdf0e10cSrcweir     {
656cdf0e10cSrcweir         if ( !mpImpl->mpSizer )
657cdf0e10cSrcweir             mpImpl->mpSizer = new ImplTabSizer( this, mnWinStyle & (WB_DRAG | WB_3DLOOK) );
658cdf0e10cSrcweir         mpImpl->mpSizer->Show();
659cdf0e10cSrcweir     }
660cdf0e10cSrcweir     else
661cdf0e10cSrcweir     {
662cdf0e10cSrcweir         DELETEZ( mpImpl->mpSizer );
663cdf0e10cSrcweir     }
664cdf0e10cSrcweir 
665cdf0e10cSrcweir     Link aLink = LINK( this, TabBar, ImplClickHdl );
666cdf0e10cSrcweir 
667cdf0e10cSrcweir     if ( mnWinStyle & (WB_MINSCROLL | WB_SCROLL) )
668cdf0e10cSrcweir     {
669cdf0e10cSrcweir         if ( !mpPrevBtn )
670cdf0e10cSrcweir         {
671cdf0e10cSrcweir             mpPrevBtn = new ImplTabButton( this, WB_REPEAT );
672cdf0e10cSrcweir             mpPrevBtn->SetClickHdl( aLink );
673cdf0e10cSrcweir         }
674cdf0e10cSrcweir         mpPrevBtn->SetSymbol( mbMirrored ? SYMBOL_NEXT : SYMBOL_PREV );
675cdf0e10cSrcweir         mpPrevBtn->Show();
676cdf0e10cSrcweir 
677cdf0e10cSrcweir         if ( !mpNextBtn )
678cdf0e10cSrcweir         {
679cdf0e10cSrcweir             mpNextBtn = new ImplTabButton( this, WB_REPEAT );
680cdf0e10cSrcweir             mpNextBtn->SetClickHdl( aLink );
681cdf0e10cSrcweir         }
682cdf0e10cSrcweir         mpNextBtn->SetSymbol( mbMirrored ? SYMBOL_PREV : SYMBOL_NEXT );
683cdf0e10cSrcweir         mpNextBtn->Show();
684cdf0e10cSrcweir     }
685cdf0e10cSrcweir     else
686cdf0e10cSrcweir     {
687cdf0e10cSrcweir         DELETEZ( mpPrevBtn );
688cdf0e10cSrcweir         DELETEZ( mpNextBtn );
689cdf0e10cSrcweir     }
690cdf0e10cSrcweir 
691cdf0e10cSrcweir     if ( mnWinStyle & WB_SCROLL )
692cdf0e10cSrcweir     {
693cdf0e10cSrcweir         if ( !mpFirstBtn )
694cdf0e10cSrcweir         {
695cdf0e10cSrcweir             mpFirstBtn = new ImplTabButton( this );
696cdf0e10cSrcweir             mpFirstBtn->SetClickHdl( aLink );
697cdf0e10cSrcweir         }
698cdf0e10cSrcweir         mpFirstBtn->SetSymbol( mbMirrored ? SYMBOL_LAST : SYMBOL_FIRST );
699cdf0e10cSrcweir         mpFirstBtn->Show();
700cdf0e10cSrcweir 
701cdf0e10cSrcweir         if ( !mpLastBtn )
702cdf0e10cSrcweir         {
703cdf0e10cSrcweir             mpLastBtn = new ImplTabButton( this );
704cdf0e10cSrcweir             mpLastBtn->SetClickHdl( aLink );
705cdf0e10cSrcweir         }
706cdf0e10cSrcweir         mpLastBtn->SetSymbol( mbMirrored ? SYMBOL_FIRST : SYMBOL_LAST );
707cdf0e10cSrcweir         mpLastBtn->Show();
708cdf0e10cSrcweir     }
709cdf0e10cSrcweir     else
710cdf0e10cSrcweir     {
711cdf0e10cSrcweir         DELETEZ( mpFirstBtn );
712cdf0e10cSrcweir         DELETEZ( mpLastBtn );
713cdf0e10cSrcweir     }
714cdf0e10cSrcweir }
715cdf0e10cSrcweir 
716cdf0e10cSrcweir // -----------------------------------------------------------------------
717cdf0e10cSrcweir 
ImplEnableControls()718cdf0e10cSrcweir void TabBar::ImplEnableControls()
719cdf0e10cSrcweir {
720cdf0e10cSrcweir     if ( mbSizeFormat || mbFormat )
721cdf0e10cSrcweir         return;
722cdf0e10cSrcweir 
723cdf0e10cSrcweir     // Buttons enablen/disblen
724cdf0e10cSrcweir     sal_Bool bEnableBtn = mnFirstPos > 0;
725cdf0e10cSrcweir     if ( mpFirstBtn )
726cdf0e10cSrcweir         mpFirstBtn->Enable( bEnableBtn );
727cdf0e10cSrcweir     if ( mpPrevBtn )
728cdf0e10cSrcweir         mpPrevBtn->Enable( bEnableBtn );
729cdf0e10cSrcweir 
730cdf0e10cSrcweir     bEnableBtn = mnFirstPos < ImplGetLastFirstPos();
731cdf0e10cSrcweir     if ( mpNextBtn )
732cdf0e10cSrcweir         mpNextBtn->Enable( bEnableBtn );
733cdf0e10cSrcweir     if ( mpLastBtn )
734cdf0e10cSrcweir         mpLastBtn->Enable( bEnableBtn );
735cdf0e10cSrcweir }
736cdf0e10cSrcweir 
737cdf0e10cSrcweir // -----------------------------------------------------------------------
738cdf0e10cSrcweir 
ImplShowPage(sal_uInt16 nPos)739cdf0e10cSrcweir void TabBar::ImplShowPage( sal_uInt16 nPos )
740cdf0e10cSrcweir {
741cdf0e10cSrcweir     // Breite berechnen
742cdf0e10cSrcweir     long nWidth = GetOutputSizePixel().Width();
743cdf0e10cSrcweir     if ( nWidth >= TABBAR_OFFSET_X )
744cdf0e10cSrcweir         nWidth -= TABBAR_OFFSET_X;
745cdf0e10cSrcweir     ImplTabBarItem* pItem = mpItemList->GetObject( nPos );
746cdf0e10cSrcweir     if ( nPos < mnFirstPos )
747cdf0e10cSrcweir         SetFirstPageId( pItem->mnId );
748cdf0e10cSrcweir     else if ( pItem->maRect.Right() > nWidth )
749cdf0e10cSrcweir     {
750cdf0e10cSrcweir         while ( pItem->maRect.Right() > nWidth )
751cdf0e10cSrcweir         {
752cdf0e10cSrcweir             sal_uInt16 nNewPos = mnFirstPos+1;
753cdf0e10cSrcweir             SetFirstPageId( GetPageId( nNewPos ) );
754cdf0e10cSrcweir             ImplFormat();
755cdf0e10cSrcweir             if ( nNewPos != mnFirstPos )
756cdf0e10cSrcweir                 break;
757cdf0e10cSrcweir         }
758cdf0e10cSrcweir     }
759cdf0e10cSrcweir }
760cdf0e10cSrcweir 
761cdf0e10cSrcweir // -----------------------------------------------------------------------
762cdf0e10cSrcweir 
IMPL_LINK(TabBar,ImplClickHdl,ImplTabButton *,pBtn)763cdf0e10cSrcweir IMPL_LINK( TabBar, ImplClickHdl, ImplTabButton*, pBtn )
764cdf0e10cSrcweir {
765cdf0e10cSrcweir     EndEditMode();
766cdf0e10cSrcweir 
767cdf0e10cSrcweir     sal_uInt16 nNewPos = mnFirstPos;
768cdf0e10cSrcweir 
769cdf0e10cSrcweir     if ( pBtn == mpFirstBtn )
770cdf0e10cSrcweir         nNewPos = 0;
771cdf0e10cSrcweir     else if ( pBtn == mpPrevBtn )
772cdf0e10cSrcweir     {
773cdf0e10cSrcweir         if ( mnFirstPos )
774cdf0e10cSrcweir             nNewPos = mnFirstPos-1;
775cdf0e10cSrcweir     }
776cdf0e10cSrcweir     else if ( pBtn == mpNextBtn )
777cdf0e10cSrcweir     {
778cdf0e10cSrcweir         sal_uInt16 nCount = GetPageCount();
779cdf0e10cSrcweir         if ( mnFirstPos <  nCount )
780cdf0e10cSrcweir             nNewPos = mnFirstPos+1;
781cdf0e10cSrcweir     }
782cdf0e10cSrcweir     else
783cdf0e10cSrcweir     {
784cdf0e10cSrcweir         sal_uInt16 nCount = GetPageCount();
785cdf0e10cSrcweir         if ( nCount )
786cdf0e10cSrcweir             nNewPos = nCount-1;
787cdf0e10cSrcweir     }
788cdf0e10cSrcweir 
789cdf0e10cSrcweir     if ( nNewPos != mnFirstPos )
790cdf0e10cSrcweir         SetFirstPageId( GetPageId( nNewPos ) );
791cdf0e10cSrcweir     return 0;
792cdf0e10cSrcweir }
793cdf0e10cSrcweir 
794cdf0e10cSrcweir // -----------------------------------------------------------------------
795cdf0e10cSrcweir 
MouseMove(const MouseEvent & rMEvt)796cdf0e10cSrcweir void TabBar::MouseMove( const MouseEvent& rMEvt )
797cdf0e10cSrcweir {
798cdf0e10cSrcweir     if ( rMEvt.IsLeaveWindow() )
799cdf0e10cSrcweir         mbInSelect = sal_False;
800cdf0e10cSrcweir 
801cdf0e10cSrcweir     Window::MouseMove( rMEvt );
802cdf0e10cSrcweir }
803cdf0e10cSrcweir 
804cdf0e10cSrcweir // -----------------------------------------------------------------------
805cdf0e10cSrcweir 
MouseButtonDown(const MouseEvent & rMEvt)806cdf0e10cSrcweir void TabBar::MouseButtonDown( const MouseEvent& rMEvt )
807cdf0e10cSrcweir {
808cdf0e10cSrcweir     // Bei Klick in unser Fenster EditModus nur beenden und Klick nicht
809cdf0e10cSrcweir     // ausfuehren
810cdf0e10cSrcweir     if ( IsInEditMode() )
811cdf0e10cSrcweir     {
812cdf0e10cSrcweir         EndEditMode();
813cdf0e10cSrcweir         return;
814cdf0e10cSrcweir     }
815cdf0e10cSrcweir 
816cdf0e10cSrcweir 	ImplTabBarItem* pItem;
817cdf0e10cSrcweir 	sal_uInt16          nSelId = GetPageId( rMEvt.GetPosPixel() );
818cdf0e10cSrcweir 
819cdf0e10cSrcweir     if ( !rMEvt.IsLeft() )
820cdf0e10cSrcweir     {
821cdf0e10cSrcweir         Window::MouseButtonDown( rMEvt );
822cdf0e10cSrcweir         if ( (nSelId > 0) && (nSelId != mnCurPageId) )
823cdf0e10cSrcweir         {
824cdf0e10cSrcweir             sal_uInt16 nPos = GetPagePos( nSelId );
825cdf0e10cSrcweir             pItem = mpItemList->GetObject( nPos );
826cdf0e10cSrcweir 
827cdf0e10cSrcweir             if ( pItem->mbEnable )
828cdf0e10cSrcweir             {
829cdf0e10cSrcweir                 if ( ImplDeactivatePage() )
830cdf0e10cSrcweir                 {
831cdf0e10cSrcweir                     SetCurPageId( nSelId );
832cdf0e10cSrcweir                     Update();
833cdf0e10cSrcweir                     ImplActivatePage();
834cdf0e10cSrcweir                     ImplSelect();
835cdf0e10cSrcweir                 }
836cdf0e10cSrcweir                 mbInSelect = sal_True;
837cdf0e10cSrcweir             }
838cdf0e10cSrcweir         }
839cdf0e10cSrcweir         return;
840cdf0e10cSrcweir     }
841cdf0e10cSrcweir 
842cdf0e10cSrcweir     if ( rMEvt.IsMod2() && mbAutoEditMode && nSelId )
843cdf0e10cSrcweir     {
844cdf0e10cSrcweir         if ( StartEditMode( nSelId ) )
845cdf0e10cSrcweir             return;
846cdf0e10cSrcweir     }
847cdf0e10cSrcweir 
848cdf0e10cSrcweir     if ( (rMEvt.GetMode() & (MOUSE_MULTISELECT | MOUSE_RANGESELECT)) && (rMEvt.GetClicks() == 1) )
849cdf0e10cSrcweir     {
850cdf0e10cSrcweir         if ( nSelId )
851cdf0e10cSrcweir         {
852cdf0e10cSrcweir             sal_uInt16      nPos = GetPagePos( nSelId );
853cdf0e10cSrcweir             sal_Bool        bSelectTab = sal_False;
854cdf0e10cSrcweir             pItem = mpItemList->GetObject( nPos );
855cdf0e10cSrcweir 
856cdf0e10cSrcweir             if ( pItem->mbEnable )
857cdf0e10cSrcweir             {
858cdf0e10cSrcweir                 if ( (rMEvt.GetMode() & MOUSE_MULTISELECT) && (mnWinStyle & WB_MULTISELECT) )
859cdf0e10cSrcweir                 {
860cdf0e10cSrcweir                     if ( nSelId != mnCurPageId )
861cdf0e10cSrcweir                     {
862cdf0e10cSrcweir                         SelectPage( nSelId, !IsPageSelected( nSelId ) );
863cdf0e10cSrcweir                         bSelectTab = sal_True;
864cdf0e10cSrcweir                     }
865cdf0e10cSrcweir                 }
866cdf0e10cSrcweir                 else if ( mnWinStyle & (WB_MULTISELECT | WB_RANGESELECT) )
867cdf0e10cSrcweir                 {
868cdf0e10cSrcweir                     bSelectTab = sal_True;
869cdf0e10cSrcweir                     sal_uInt16 n;
870cdf0e10cSrcweir                     sal_Bool   bSelect;
871cdf0e10cSrcweir                     sal_uInt16 nCurPos = GetPagePos( mnCurPageId );
872cdf0e10cSrcweir                     if ( nPos <= nCurPos )
873cdf0e10cSrcweir                     {
874cdf0e10cSrcweir                         // Alle Tabs bis zur angeklickten Tab deselektieren
875cdf0e10cSrcweir                         // und alle Tabs von der angeklickten Tab bis
876cdf0e10cSrcweir                         // zur aktuellen Position selektieren
877cdf0e10cSrcweir                         n = 0;
878cdf0e10cSrcweir                         while ( n < nCurPos )
879cdf0e10cSrcweir                         {
880cdf0e10cSrcweir                             pItem = mpItemList->GetObject( n );
881cdf0e10cSrcweir                             if ( n < nPos )
882cdf0e10cSrcweir                                 bSelect = sal_False;
883cdf0e10cSrcweir                             else
884cdf0e10cSrcweir                                 bSelect = sal_True;
885cdf0e10cSrcweir 
886cdf0e10cSrcweir                             if ( pItem->mbSelect != bSelect )
887cdf0e10cSrcweir                             {
888cdf0e10cSrcweir                                 pItem->mbSelect = bSelect;
889cdf0e10cSrcweir                                 if ( !pItem->maRect.IsEmpty() )
890cdf0e10cSrcweir                                     Invalidate( pItem->maRect );
891cdf0e10cSrcweir                             }
892cdf0e10cSrcweir 
893cdf0e10cSrcweir                             n++;
894cdf0e10cSrcweir                         }
895cdf0e10cSrcweir                     }
896cdf0e10cSrcweir 
897cdf0e10cSrcweir                     if ( nPos >= nCurPos )
898cdf0e10cSrcweir                     {
899cdf0e10cSrcweir                         // Alle Tabs von der aktuellen bis zur angeklickten
900cdf0e10cSrcweir                         // Tab selektieren und alle Tabs von der angeklickten
901cdf0e10cSrcweir                         // Tab bis zur letzten Tab deselektieren
902cdf0e10cSrcweir                         sal_uInt16 nCount = (sal_uInt16)mpItemList->Count();
903cdf0e10cSrcweir                         n = nCurPos;
904cdf0e10cSrcweir                         while ( n < nCount )
905cdf0e10cSrcweir                         {
906cdf0e10cSrcweir                             pItem = mpItemList->GetObject( n );
907cdf0e10cSrcweir 
908cdf0e10cSrcweir                             if ( n <= nPos )
909cdf0e10cSrcweir                                 bSelect = sal_True;
910cdf0e10cSrcweir                             else
911cdf0e10cSrcweir                                 bSelect = sal_False;
912cdf0e10cSrcweir 
913cdf0e10cSrcweir                             if ( pItem->mbSelect != bSelect )
914cdf0e10cSrcweir                             {
915cdf0e10cSrcweir                                 pItem->mbSelect = bSelect;
916cdf0e10cSrcweir                                 if ( !pItem->maRect.IsEmpty() )
917cdf0e10cSrcweir                                     Invalidate( pItem->maRect );
918cdf0e10cSrcweir                             }
919cdf0e10cSrcweir 
920cdf0e10cSrcweir                             n++;
921cdf0e10cSrcweir                         }
922cdf0e10cSrcweir                     }
923cdf0e10cSrcweir                 }
924cdf0e10cSrcweir 
925cdf0e10cSrcweir                 // Gegebenenfalls muss die selektierte Tab gescrollt werden
926cdf0e10cSrcweir                 if ( bSelectTab )
927cdf0e10cSrcweir                 {
928cdf0e10cSrcweir                     ImplShowPage( nPos );
929cdf0e10cSrcweir                     Update();
930cdf0e10cSrcweir                     ImplSelect();
931cdf0e10cSrcweir                 }
932cdf0e10cSrcweir             }
933cdf0e10cSrcweir             else
934cdf0e10cSrcweir                 ImplShowPage( nPos );
935cdf0e10cSrcweir             mbInSelect = sal_True;
936cdf0e10cSrcweir 
937cdf0e10cSrcweir             return;
938cdf0e10cSrcweir         }
939cdf0e10cSrcweir     }
940cdf0e10cSrcweir     else if ( rMEvt.GetClicks() == 2 )
941cdf0e10cSrcweir     {
942cdf0e10cSrcweir         // Gegebenenfalls den Double-Click-Handler rufen
943cdf0e10cSrcweir         if ( !rMEvt.GetModifier() && (!nSelId || (nSelId == mnCurPageId)) )
944cdf0e10cSrcweir         {
945cdf0e10cSrcweir             sal_uInt16 nOldCurId = mnCurPageId;
946cdf0e10cSrcweir             mnCurPageId = nSelId;
947cdf0e10cSrcweir             DoubleClick();
948cdf0e10cSrcweir             // Abfrage, da im DoubleClick-Handler die aktuelle Seite
949cdf0e10cSrcweir             // umgeschaltet werden konnte
950cdf0e10cSrcweir             if ( mnCurPageId == nSelId )
951cdf0e10cSrcweir                 mnCurPageId = nOldCurId;
952cdf0e10cSrcweir         }
953cdf0e10cSrcweir 
954cdf0e10cSrcweir         return;
955cdf0e10cSrcweir     }
956cdf0e10cSrcweir     else
957cdf0e10cSrcweir     {
958cdf0e10cSrcweir         if ( nSelId )
959cdf0e10cSrcweir         {
960cdf0e10cSrcweir             // Nur Select ausfuehren, wenn noch nicht aktuelle Page
961cdf0e10cSrcweir             if ( nSelId != mnCurPageId )
962cdf0e10cSrcweir             {
963cdf0e10cSrcweir                 sal_uInt16 nPos = GetPagePos( nSelId );
964cdf0e10cSrcweir                 pItem = mpItemList->GetObject( nPos );
965cdf0e10cSrcweir 
966cdf0e10cSrcweir                 if ( pItem->mbEnable )
967cdf0e10cSrcweir                 {
968cdf0e10cSrcweir                     if ( !pItem->mbSelect )
969cdf0e10cSrcweir                     {
970cdf0e10cSrcweir                         // Muss invalidiert werden
971cdf0e10cSrcweir                         sal_Bool bUpdate = sal_False;
972cdf0e10cSrcweir                         if ( IsReallyVisible() && IsUpdateMode() )
973cdf0e10cSrcweir                             bUpdate = sal_True;
974cdf0e10cSrcweir 
975cdf0e10cSrcweir                         // Alle selektierten Items deselektieren
976cdf0e10cSrcweir                         pItem = mpItemList->First();
977cdf0e10cSrcweir                         while ( pItem )
978cdf0e10cSrcweir                         {
979cdf0e10cSrcweir                             if ( pItem->mbSelect || (pItem->mnId == mnCurPageId) )
980cdf0e10cSrcweir                             {
981cdf0e10cSrcweir                                 pItem->mbSelect = sal_False;
982cdf0e10cSrcweir                                 if ( bUpdate )
983cdf0e10cSrcweir                                     Invalidate( pItem->maRect );
984cdf0e10cSrcweir                             }
985cdf0e10cSrcweir 
986cdf0e10cSrcweir                             pItem = mpItemList->Next();
987cdf0e10cSrcweir                         }
988cdf0e10cSrcweir                     }
989cdf0e10cSrcweir 
990cdf0e10cSrcweir                     if ( ImplDeactivatePage() )
991cdf0e10cSrcweir                     {
992cdf0e10cSrcweir                         SetCurPageId( nSelId );
993cdf0e10cSrcweir                         Update();
994cdf0e10cSrcweir                         ImplActivatePage();
995cdf0e10cSrcweir                         ImplSelect();
996cdf0e10cSrcweir                     }
997cdf0e10cSrcweir                 }
998cdf0e10cSrcweir                 else
999cdf0e10cSrcweir                     ImplShowPage( nPos );
1000cdf0e10cSrcweir                 mbInSelect = sal_True;
1001cdf0e10cSrcweir             }
1002cdf0e10cSrcweir 
1003cdf0e10cSrcweir             return;
1004cdf0e10cSrcweir         }
1005cdf0e10cSrcweir     }
1006cdf0e10cSrcweir 
1007cdf0e10cSrcweir     Window::MouseButtonDown( rMEvt );
1008cdf0e10cSrcweir }
1009cdf0e10cSrcweir 
1010cdf0e10cSrcweir // -----------------------------------------------------------------------
1011cdf0e10cSrcweir 
MouseButtonUp(const MouseEvent & rMEvt)1012cdf0e10cSrcweir void TabBar::MouseButtonUp( const MouseEvent& rMEvt )
1013cdf0e10cSrcweir {
1014cdf0e10cSrcweir     mbInSelect = sal_False;
1015cdf0e10cSrcweir     Window::MouseButtonUp( rMEvt );
1016cdf0e10cSrcweir }
1017cdf0e10cSrcweir 
1018cdf0e10cSrcweir // -----------------------------------------------------------------------
1019cdf0e10cSrcweir 
Paint(const Rectangle &)1020cdf0e10cSrcweir void TabBar::Paint( const Rectangle& )
1021cdf0e10cSrcweir {
1022cdf0e10cSrcweir     // Items berechnen und ausgeben
1023cdf0e10cSrcweir     sal_uInt16          nItemCount = (sal_uInt16)mpItemList->Count();
1024cdf0e10cSrcweir     ImplTabBarItem* pItem;
1025cdf0e10cSrcweir 
1026cdf0e10cSrcweir     // kein Item, dann auch nichts zu tun
1027cdf0e10cSrcweir     if ( nItemCount )
1028cdf0e10cSrcweir     {
1029cdf0e10cSrcweir         // TabBar muss formatiert sein
1030cdf0e10cSrcweir         ImplFormat();
1031cdf0e10cSrcweir 
1032cdf0e10cSrcweir         // Beim ersten Format auch dafuer sorgen, das aktuelle TabPage
1033cdf0e10cSrcweir         // sichtbar wird
1034cdf0e10cSrcweir         if ( mbFirstFormat )
1035cdf0e10cSrcweir         {
1036cdf0e10cSrcweir             mbFirstFormat = sal_False;
1037cdf0e10cSrcweir 
1038cdf0e10cSrcweir             if ( mnCurPageId && (mnFirstPos == 0) && !mbDropPos )
1039cdf0e10cSrcweir             {
1040cdf0e10cSrcweir                 pItem = mpItemList->GetObject( GetPagePos( mnCurPageId ) );
1041cdf0e10cSrcweir                 if ( pItem->maRect.IsEmpty() )
1042cdf0e10cSrcweir                 {
1043cdf0e10cSrcweir                     // mbDropPos setzen (bzw. misbrauchen) um Invalidate()
1044cdf0e10cSrcweir                     // zu unterbinden
1045cdf0e10cSrcweir                     mbDropPos = sal_True;
1046cdf0e10cSrcweir                     SetFirstPageId( mnCurPageId );
1047cdf0e10cSrcweir                     mbDropPos = sal_False;
1048cdf0e10cSrcweir                     if ( mnFirstPos != 0 )
1049cdf0e10cSrcweir                         ImplFormat();
1050cdf0e10cSrcweir                 }
1051cdf0e10cSrcweir             }
1052cdf0e10cSrcweir         }
1053cdf0e10cSrcweir     }
1054cdf0e10cSrcweir 
1055cdf0e10cSrcweir     // Farben ermitteln
1056cdf0e10cSrcweir     const StyleSettings&    rStyleSettings = GetSettings().GetStyleSettings();
1057cdf0e10cSrcweir     Color                   aFaceColor;
1058cdf0e10cSrcweir     Color                   aSelectColor;
1059cdf0e10cSrcweir     Color                   aFaceTextColor;
1060cdf0e10cSrcweir     Color                   aSelectTextColor;
1061cdf0e10cSrcweir     ImplGetColors( aFaceColor, aFaceTextColor, aSelectColor, aSelectTextColor );
1062cdf0e10cSrcweir 
1063cdf0e10cSrcweir     // Font selektieren
1064cdf0e10cSrcweir     Font aFont = GetFont();
1065cdf0e10cSrcweir     Font aLightFont = aFont;
1066cdf0e10cSrcweir     //aLightFont.SetWeight( WEIGHT_LIGHT ); //TODO Make font weight light on custom color only?
1067cdf0e10cSrcweir     aLightFont.SetWeight( WEIGHT_NORMAL );
1068cdf0e10cSrcweir 
1069cdf0e10cSrcweir     // #i36013# exclude push buttons from painting area
1070cdf0e10cSrcweir     Rectangle aClipRect( Point( mnOffX, 0 ), Point( mnLastOffX, GetOutputHeightPixel() - 1 ) );
1071cdf0e10cSrcweir     SetClipRegion( Region( aClipRect ) );
1072cdf0e10cSrcweir 
1073cdf0e10cSrcweir     // Bei Border oben und unten einen Strich extra malen
1074cdf0e10cSrcweir     if ( (mnWinStyle & WB_BORDER) || (mnWinStyle & WB_TOPBORDER) )
1075cdf0e10cSrcweir     {
1076cdf0e10cSrcweir         Size aOutputSize = GetOutputSizePixel();
1077cdf0e10cSrcweir 
1078cdf0e10cSrcweir         // Bei 3D-Tabs wird auch der Border in 3D gemalt
1079cdf0e10cSrcweir         if ( mnWinStyle & WB_3DTAB )
1080cdf0e10cSrcweir         {
1081cdf0e10cSrcweir             SetLineColor( rStyleSettings.GetShadowColor() );
1082cdf0e10cSrcweir             DrawLine( Point( mnOffX, 0 ), Point( aOutputSize.Width(), 0 ) );
1083cdf0e10cSrcweir         }
1084cdf0e10cSrcweir 
1085cdf0e10cSrcweir         // Border malen (Strich oben und Strich unten)
1086cdf0e10cSrcweir         SetLineColor( rStyleSettings.GetDarkShadowColor() );
1087cdf0e10cSrcweir         DrawLine( Point( mnOffX, mnOffY ), Point( aOutputSize.Width()-1, mnOffY ) );
1088cdf0e10cSrcweir     }
1089cdf0e10cSrcweir     else
1090cdf0e10cSrcweir         SetLineColor( rStyleSettings.GetDarkShadowColor() );
1091cdf0e10cSrcweir 
1092cdf0e10cSrcweir     // Items ausgeben
1093cdf0e10cSrcweir     if ( nItemCount )
1094cdf0e10cSrcweir     {
1095cdf0e10cSrcweir         // letzten sichtbaren Eintrag suchen
1096cdf0e10cSrcweir         sal_uInt16 n = mnFirstPos+1;
1097cdf0e10cSrcweir         if ( n >= nItemCount )
1098cdf0e10cSrcweir             n = nItemCount-1;
1099cdf0e10cSrcweir         pItem = mpItemList->Seek( n );
1100cdf0e10cSrcweir         while ( pItem )
1101cdf0e10cSrcweir         {
1102cdf0e10cSrcweir             if ( !pItem->maRect.IsEmpty() )
1103cdf0e10cSrcweir             {
1104cdf0e10cSrcweir                 n++;
1105cdf0e10cSrcweir                 pItem = mpItemList->Next();
1106cdf0e10cSrcweir             }
1107cdf0e10cSrcweir             else
1108cdf0e10cSrcweir                 break;
1109cdf0e10cSrcweir         }
1110cdf0e10cSrcweir 
1111cdf0e10cSrcweir         // Alle Tabs ausgeben (von hinten nach vorn und aktuellen zuletzt)
1112cdf0e10cSrcweir         if ( pItem )
1113cdf0e10cSrcweir             n--;
1114cdf0e10cSrcweir         else if ( n >= nItemCount )
1115cdf0e10cSrcweir             n = nItemCount-1;
1116cdf0e10cSrcweir         pItem = mpItemList->Seek( n );
1117cdf0e10cSrcweir         ImplTabBarItem* pCurItem = NULL;
1118cdf0e10cSrcweir         while ( pItem )
1119cdf0e10cSrcweir         {
1120cdf0e10cSrcweir             // CurrentItem als letztes ausgeben, da es alle anderen ueberdeckt
1121cdf0e10cSrcweir             if ( !pCurItem && (pItem->mnId == mnCurPageId) )
1122cdf0e10cSrcweir             {
1123cdf0e10cSrcweir                 pCurItem = pItem;
1124cdf0e10cSrcweir                 pItem = mpItemList->Prev();
1125cdf0e10cSrcweir                 if ( !pItem )
1126cdf0e10cSrcweir                     pItem = pCurItem;
1127cdf0e10cSrcweir                 continue;
1128cdf0e10cSrcweir             }
1129cdf0e10cSrcweir 
1130cdf0e10cSrcweir             if ( !pItem->maRect.IsEmpty() )
1131cdf0e10cSrcweir             {
1132cdf0e10cSrcweir                 Rectangle aRect = pItem->maRect;
1133cdf0e10cSrcweir 
1134cdf0e10cSrcweir                 // Aktuelle Page wird mit einem fetten Font ausgegeben
1135cdf0e10cSrcweir                 if ( pItem->mnId == mnCurPageId )
1136cdf0e10cSrcweir                     SetFont( aFont );
1137cdf0e10cSrcweir                 else
1138cdf0e10cSrcweir                     SetFont( aLightFont );
1139cdf0e10cSrcweir 
1140cdf0e10cSrcweir                 // Je nach Status die richtige FillInBrush setzen
1141cdf0e10cSrcweir                 // Set the correct FillInBrush depending upon status
1142cdf0e10cSrcweir                 if ( pItem->mbSelect || (pItem->mnId == mnCurPageId) )
1143cdf0e10cSrcweir                 {
1144cdf0e10cSrcweir                     // Currently selected Tab
1145cdf0e10cSrcweir                     SetFillColor( aSelectColor );
1146cdf0e10cSrcweir                     SetTextColor( aSelectTextColor );
1147cdf0e10cSrcweir                 }
1148cdf0e10cSrcweir                 else
1149cdf0e10cSrcweir                 {
1150cdf0e10cSrcweir                     if ( !pItem->IsDefaultTabBgColor() && !rStyleSettings.GetHighContrastMode() )
1151cdf0e10cSrcweir                     {
1152cdf0e10cSrcweir                         SetFillColor( pItem->maTabBgColor );
1153cdf0e10cSrcweir                         SetTextColor( pItem->maTabTextColor );
1154cdf0e10cSrcweir                     } else {
1155cdf0e10cSrcweir                         SetFillColor( aFaceColor );
1156cdf0e10cSrcweir                         SetTextColor( aFaceTextColor );
1157cdf0e10cSrcweir                     }
1158cdf0e10cSrcweir                 }
1159cdf0e10cSrcweir 
1160cdf0e10cSrcweir                 // Muss Font Kursiv geschaltet werden
1161cdf0e10cSrcweir                 if ( pItem->mnBits & TPB_SPECIAL )
1162cdf0e10cSrcweir                 {
1163cdf0e10cSrcweir                     SetTextColor( Color( COL_LIGHTBLUE ) );
1164cdf0e10cSrcweir                 }
1165cdf0e10cSrcweir 
1166cdf0e10cSrcweir                 // Position der Page berechnen
1167cdf0e10cSrcweir                 Point   aPos0 = Point( aRect.Left(), mnOffY );
1168cdf0e10cSrcweir                 Point   aPos1 = Point( aRect.Left()+TABBAR_OFFSET_X, aRect.Bottom() );
1169cdf0e10cSrcweir                 Point   aPos2 = Point( aRect.Right()-TABBAR_OFFSET_X, aRect.Bottom() );
1170cdf0e10cSrcweir                 Point   aPos3 = Point( aRect.Right(), mnOffY );
1171cdf0e10cSrcweir 
1172cdf0e10cSrcweir                 // Zuerst geben wir das Polygon gefuellt aus
1173cdf0e10cSrcweir                 Polygon aPoly( 4 );
1174cdf0e10cSrcweir                 aPoly[0] = aPos0;
1175cdf0e10cSrcweir                 aPoly[1] = aPos1;
1176cdf0e10cSrcweir                 aPoly[2] = aPos2;
1177cdf0e10cSrcweir                 aPoly[3] = aPos3;
1178cdf0e10cSrcweir                 DrawPolygon( aPoly );
1179cdf0e10cSrcweir 
1180cdf0e10cSrcweir                 // Danach den Text zentiert ausgeben
1181cdf0e10cSrcweir                 XubString aText = pItem->maText;
1182cdf0e10cSrcweir                 if ( pItem->mbShort )
1183cdf0e10cSrcweir                     aText = GetEllipsisString( aText, mnCurMaxWidth, TEXT_DRAW_ENDELLIPSIS );
1184cdf0e10cSrcweir                 Size    aRectSize = aRect.GetSize();
1185cdf0e10cSrcweir                 long    nTextWidth = GetTextWidth( aText );
1186cdf0e10cSrcweir                 long    nTextHeight = GetTextHeight();
1187cdf0e10cSrcweir                 Point   aTxtPos( aRect.Left()+(aRectSize.Width()-nTextWidth)/2,
1188cdf0e10cSrcweir                                  (aRectSize.Height()-nTextHeight)/2 );
1189cdf0e10cSrcweir                 if ( pItem->IsDefaultTabBgColor() || (!pItem->mbSelect) )
1190cdf0e10cSrcweir                 {
1191cdf0e10cSrcweir                      if ( !pItem->mbEnable )
1192cdf0e10cSrcweir                          DrawCtrlText( aTxtPos, aText, 0, STRING_LEN, (TEXT_DRAW_DISABLE | TEXT_DRAW_MNEMONIC) );
1193cdf0e10cSrcweir                     else
1194cdf0e10cSrcweir                          DrawText( aTxtPos, aText );
1195cdf0e10cSrcweir                 }
1196cdf0e10cSrcweir                 // Jetzt im Inhalt den 3D-Effekt ausgeben
1197cdf0e10cSrcweir                 aPos0.X()++;
1198cdf0e10cSrcweir                 aPos1.X()++;
1199cdf0e10cSrcweir                 aPos2.X()--;
1200cdf0e10cSrcweir                 aPos3.X()--;
1201cdf0e10cSrcweir 
1202cdf0e10cSrcweir                 // If this is the current tab, draw the left inner shadow the default color,
1203cdf0e10cSrcweir                 // otherwise make it the same as the custom background color
1204cdf0e10cSrcweir                 if ( pItem->mbSelect || (pItem->mnId == mnCurPageId) ) {
1205cdf0e10cSrcweir                     SetLineColor( rStyleSettings.GetLightColor() );
1206cdf0e10cSrcweir                 } else {
1207cdf0e10cSrcweir                     if ( !pItem->IsDefaultTabBgColor() && ! rStyleSettings.GetHighContrastMode() )
1208cdf0e10cSrcweir                     {
1209cdf0e10cSrcweir                         SetLineColor( pItem->maTabBgColor );
1210cdf0e10cSrcweir                     } else {
1211cdf0e10cSrcweir                         SetLineColor( rStyleSettings.GetLightColor() );
1212cdf0e10cSrcweir                     }
1213cdf0e10cSrcweir                 }
1214cdf0e10cSrcweir                 // Draw the left side of the tab
1215cdf0e10cSrcweir                 DrawLine( aPos0, aPos1 );
1216cdf0e10cSrcweir 
1217cdf0e10cSrcweir                 if ( !pItem->mbSelect && (pItem->mnId != mnCurPageId) )
1218cdf0e10cSrcweir                 {
1219cdf0e10cSrcweir                     // Draw the top inner shadow
1220cdf0e10cSrcweir                     // ToDo: Change from this static color to tab custom bg color
1221cdf0e10cSrcweir                     DrawLine( Point( aPos0.X(), aPos0.Y()+1 ),
1222cdf0e10cSrcweir                                 Point( aPos3.X(), aPos3.Y()+1 ) );
1223cdf0e10cSrcweir                 }
1224cdf0e10cSrcweir 
1225cdf0e10cSrcweir                 SetLineColor( rStyleSettings.GetShadowColor() );
1226cdf0e10cSrcweir                 DrawLine( aPos2, aPos3 );
1227cdf0e10cSrcweir                 aPos1.X()--;
1228cdf0e10cSrcweir                 aPos1.Y()--;
1229cdf0e10cSrcweir                 aPos2.Y()--;
1230cdf0e10cSrcweir                 if ( !pItem->IsDefaultTabBgColor() && ( pItem->mbSelect || (pItem->mnId == mnCurPageId) ) )
1231cdf0e10cSrcweir                 {
1232cdf0e10cSrcweir                     SetLineColor( pItem->maTabBgColor );
1233cdf0e10cSrcweir                     DrawLine( Point(aPos1.X()-1, aPos1.Y()-1), Point(aPos2.X(), aPos2.Y()-1) );
1234cdf0e10cSrcweir                 }
1235cdf0e10cSrcweir                 DrawLine( aPos1, aPos2 );
1236cdf0e10cSrcweir 
1237cdf0e10cSrcweir                 // draw a small 2px sliver of the original background color at the bottom of the selected tab
1238cdf0e10cSrcweir 
1239cdf0e10cSrcweir                 if ( !pItem->IsDefaultTabBgColor() )
1240cdf0e10cSrcweir                 {
1241cdf0e10cSrcweir                     if ( pItem->mbSelect || (pItem->mnId == mnCurPageId) || rStyleSettings.GetHighContrastMode() ) {
1242cdf0e10cSrcweir                         SetLineColor( pItem->maTabBgColor );
1243cdf0e10cSrcweir                         DrawLine( Point(aPos1.X()-1, aPos1.Y()-1), Point(aPos2.X(), aPos2.Y()-1) );
1244cdf0e10cSrcweir                         if ( !pItem->mbEnable )
1245cdf0e10cSrcweir                             DrawCtrlText( aTxtPos, aText, 0, STRING_LEN, (TEXT_DRAW_DISABLE | TEXT_DRAW_MNEMONIC) );
1246cdf0e10cSrcweir                         else
1247cdf0e10cSrcweir                             DrawText( aTxtPos, aText );
1248cdf0e10cSrcweir                     }
1249cdf0e10cSrcweir                 }
1250cdf0e10cSrcweir 
1251cdf0e10cSrcweir                 // Da etwas uebermalt werden konnte, muessen wir die Polygon-
1252cdf0e10cSrcweir                 // umrandung nocheinmal ausgeben
1253cdf0e10cSrcweir                 SetLineColor( rStyleSettings.GetDarkShadowColor() );
1254cdf0e10cSrcweir                 SetFillColor();
1255cdf0e10cSrcweir                 DrawPolygon( aPoly );
1256cdf0e10cSrcweir 
1257cdf0e10cSrcweir                 // Beim dem aktuellen Tab die restlichten Ausgaben vornehmen und
1258cdf0e10cSrcweir                 // die Schleife abbrechen, da die aktuelle Tab als letztes
1259cdf0e10cSrcweir                 // ausgegeben wird
1260cdf0e10cSrcweir                 if ( pItem == pCurItem )
1261cdf0e10cSrcweir                 {
1262cdf0e10cSrcweir                     // Beim aktuellen Item muss der oberstes Strich geloescht
1263cdf0e10cSrcweir                     // werden
1264cdf0e10cSrcweir                     SetLineColor();
1265cdf0e10cSrcweir                     SetFillColor( aSelectColor );
1266cdf0e10cSrcweir                     Rectangle aDelRect( aPos0, aPos3 );
1267cdf0e10cSrcweir                     DrawRect( aDelRect );
1268cdf0e10cSrcweir                     if ( mnWinStyle & WB_3DTAB )
1269cdf0e10cSrcweir                     {
1270cdf0e10cSrcweir                         aDelRect.Top()--;
1271cdf0e10cSrcweir                         DrawRect( aDelRect );
1272cdf0e10cSrcweir                     }
1273cdf0e10cSrcweir 
1274cdf0e10cSrcweir                     break;
1275cdf0e10cSrcweir                 }
1276cdf0e10cSrcweir 
1277cdf0e10cSrcweir                 pItem = mpItemList->Prev();
1278cdf0e10cSrcweir             }
1279cdf0e10cSrcweir             else
1280cdf0e10cSrcweir             {
1281cdf0e10cSrcweir                 if ( pItem == pCurItem )
1282cdf0e10cSrcweir                     break;
1283cdf0e10cSrcweir 
1284cdf0e10cSrcweir                 pItem = NULL;
1285cdf0e10cSrcweir             }
1286cdf0e10cSrcweir 
1287cdf0e10cSrcweir             if ( !pItem )
1288cdf0e10cSrcweir                 pItem = pCurItem;
1289cdf0e10cSrcweir         }
1290cdf0e10cSrcweir     }
1291cdf0e10cSrcweir 
1292cdf0e10cSrcweir     // Font wieder herstellen
1293cdf0e10cSrcweir     SetFont( aFont );
1294cdf0e10cSrcweir     // remove clip region
1295cdf0e10cSrcweir     SetClipRegion();
1296cdf0e10cSrcweir }
1297cdf0e10cSrcweir 
1298cdf0e10cSrcweir // -----------------------------------------------------------------------
1299cdf0e10cSrcweir 
Resize()1300cdf0e10cSrcweir void TabBar::Resize()
1301cdf0e10cSrcweir {
1302cdf0e10cSrcweir     Size aNewSize = GetOutputSizePixel();
1303cdf0e10cSrcweir 
1304cdf0e10cSrcweir     long nSizerWidth = 0;
1305cdf0e10cSrcweir     long nButtonWidth = 0;
1306cdf0e10cSrcweir 
1307cdf0e10cSrcweir     // Sizer anordnen
1308cdf0e10cSrcweir     if ( mpImpl->mpSizer )
1309cdf0e10cSrcweir     {
1310cdf0e10cSrcweir         Size    aSizerSize = mpImpl->mpSizer->GetSizePixel();
1311cdf0e10cSrcweir         Point   aNewSizerPos( mbMirrored ? 0 : (aNewSize.Width()-aSizerSize.Width()), 0 );
1312cdf0e10cSrcweir         Size    aNewSizerSize( aSizerSize.Width(), aNewSize.Height() );
1313cdf0e10cSrcweir         mpImpl->mpSizer->SetPosSizePixel( aNewSizerPos, aNewSizerSize );
1314cdf0e10cSrcweir         nSizerWidth = aSizerSize.Width();
1315cdf0e10cSrcweir     }
1316cdf0e10cSrcweir 
1317cdf0e10cSrcweir     // Scroll-Buttons anordnen
1318cdf0e10cSrcweir     long nHeight = aNewSize.Height();
1319cdf0e10cSrcweir     // Font in der groesse Anpassen?
1320cdf0e10cSrcweir     ImplInitSettings( sal_True, sal_False );
1321cdf0e10cSrcweir 
1322cdf0e10cSrcweir     long nX = mbMirrored ? (aNewSize.Width()-nHeight) : 0;
1323cdf0e10cSrcweir     long nXDiff = mbMirrored ? -nHeight : nHeight;
1324cdf0e10cSrcweir 
1325cdf0e10cSrcweir     Size aBtnSize( nHeight, nHeight );
1326cdf0e10cSrcweir     if ( mpFirstBtn )
1327cdf0e10cSrcweir     {
1328cdf0e10cSrcweir         mpFirstBtn->SetPosSizePixel( Point( nX, 0 ), aBtnSize );
1329cdf0e10cSrcweir         nX += nXDiff;
1330cdf0e10cSrcweir         nButtonWidth += nHeight;
1331cdf0e10cSrcweir     }
1332cdf0e10cSrcweir     if ( mpPrevBtn )
1333cdf0e10cSrcweir     {
1334cdf0e10cSrcweir         mpPrevBtn->SetPosSizePixel( Point( nX, 0 ), aBtnSize );
1335cdf0e10cSrcweir         nX += nXDiff;
1336cdf0e10cSrcweir         nButtonWidth += nHeight;
1337cdf0e10cSrcweir     }
1338cdf0e10cSrcweir     if ( mpNextBtn )
1339cdf0e10cSrcweir     {
1340cdf0e10cSrcweir         mpNextBtn->SetPosSizePixel( Point( nX, 0 ), aBtnSize );
1341cdf0e10cSrcweir         nX += nXDiff;
1342cdf0e10cSrcweir         nButtonWidth += nHeight;
1343cdf0e10cSrcweir     }
1344cdf0e10cSrcweir     if ( mpLastBtn )
1345cdf0e10cSrcweir     {
1346cdf0e10cSrcweir         mpLastBtn->SetPosSizePixel( Point( nX, 0 ), aBtnSize );
1347cdf0e10cSrcweir         nX += nXDiff;
1348cdf0e10cSrcweir         nButtonWidth += nHeight;
1349cdf0e10cSrcweir     }
1350cdf0e10cSrcweir 
1351cdf0e10cSrcweir     // Groesse merken
1352cdf0e10cSrcweir     maWinSize = aNewSize;
1353cdf0e10cSrcweir 
1354cdf0e10cSrcweir     if( mbMirrored )
1355cdf0e10cSrcweir     {
1356cdf0e10cSrcweir         mnOffX = nSizerWidth;
1357cdf0e10cSrcweir         mnLastOffX = maWinSize.Width() - nButtonWidth - 1;
1358cdf0e10cSrcweir     }
1359cdf0e10cSrcweir     else
1360cdf0e10cSrcweir     {
1361cdf0e10cSrcweir         mnOffX = nButtonWidth;
1362cdf0e10cSrcweir         mnLastOffX = maWinSize.Width() - nSizerWidth - 1;
1363cdf0e10cSrcweir     }
1364cdf0e10cSrcweir 
1365cdf0e10cSrcweir     // Neu formatieren
1366cdf0e10cSrcweir     mbSizeFormat = sal_True;
1367cdf0e10cSrcweir     if ( IsReallyVisible() )
1368cdf0e10cSrcweir     {
1369cdf0e10cSrcweir         if ( ImplCalcWidth() )
1370cdf0e10cSrcweir             Invalidate();
1371cdf0e10cSrcweir         ImplFormat();
1372cdf0e10cSrcweir     }
1373cdf0e10cSrcweir 
1374cdf0e10cSrcweir     // Button enablen/disablen
1375cdf0e10cSrcweir     ImplEnableControls();
1376cdf0e10cSrcweir }
1377cdf0e10cSrcweir 
1378cdf0e10cSrcweir // -----------------------------------------------------------------------
1379cdf0e10cSrcweir 
RequestHelp(const HelpEvent & rHEvt)1380cdf0e10cSrcweir void TabBar::RequestHelp( const HelpEvent& rHEvt )
1381cdf0e10cSrcweir {
1382cdf0e10cSrcweir     sal_uInt16 nItemId = GetPageId( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ) );
1383cdf0e10cSrcweir     if ( nItemId )
1384cdf0e10cSrcweir     {
1385cdf0e10cSrcweir         if ( rHEvt.GetMode() & HELPMODE_BALLOON )
1386cdf0e10cSrcweir         {
1387cdf0e10cSrcweir             XubString aStr = GetHelpText( nItemId );
1388cdf0e10cSrcweir             if ( aStr.Len() )
1389cdf0e10cSrcweir             {
1390cdf0e10cSrcweir                 Rectangle aItemRect = GetPageRect( nItemId );
1391cdf0e10cSrcweir                 Point aPt = OutputToScreenPixel( aItemRect.TopLeft() );
1392cdf0e10cSrcweir                 aItemRect.Left()   = aPt.X();
1393cdf0e10cSrcweir                 aItemRect.Top()    = aPt.Y();
1394cdf0e10cSrcweir                 aPt = OutputToScreenPixel( aItemRect.BottomRight() );
1395cdf0e10cSrcweir                 aItemRect.Right()  = aPt.X();
1396cdf0e10cSrcweir                 aItemRect.Bottom() = aPt.Y();
1397cdf0e10cSrcweir                 Help::ShowBalloon( this, aItemRect.Center(), aItemRect, aStr );
1398cdf0e10cSrcweir                 return;
1399cdf0e10cSrcweir             }
1400cdf0e10cSrcweir         }
1401cdf0e10cSrcweir         else if ( rHEvt.GetMode() & HELPMODE_EXTENDED )
1402cdf0e10cSrcweir         {
1403cdf0e10cSrcweir             rtl::OUString aHelpId( rtl::OStringToOUString( GetHelpId( nItemId ), RTL_TEXTENCODING_UTF8 ) );
1404cdf0e10cSrcweir             if ( aHelpId.getLength() )
1405cdf0e10cSrcweir             {
1406cdf0e10cSrcweir                 // Wenn eine Hilfe existiert, dann ausloesen
1407cdf0e10cSrcweir                 Help* pHelp = Application::GetHelp();
1408cdf0e10cSrcweir                 if ( pHelp )
1409cdf0e10cSrcweir                     pHelp->Start( aHelpId, this );
1410cdf0e10cSrcweir                 return;
1411cdf0e10cSrcweir             }
1412cdf0e10cSrcweir         }
1413cdf0e10cSrcweir 
1414cdf0e10cSrcweir         // Bei Quick- oder Ballloon-Help zeigen wir den Text an,
1415cdf0e10cSrcweir         // wenn dieser abgeschnitten oder nicht voll sichtbar ist
1416cdf0e10cSrcweir         if ( rHEvt.GetMode() & (HELPMODE_QUICK | HELPMODE_BALLOON) )
1417cdf0e10cSrcweir         {
1418cdf0e10cSrcweir             sal_uInt16 nPos = GetPagePos( nItemId );
1419cdf0e10cSrcweir             ImplTabBarItem* pItem = mpItemList->GetObject( nPos );
1420cdf0e10cSrcweir             if ( pItem->mbShort ||
1421cdf0e10cSrcweir                 (pItem->maRect.Right()-TABBAR_OFFSET_X-5 > mnLastOffX) )
1422cdf0e10cSrcweir             {
1423cdf0e10cSrcweir                 Rectangle aItemRect = GetPageRect( nItemId );
1424cdf0e10cSrcweir                 Point aPt = OutputToScreenPixel( aItemRect.TopLeft() );
1425cdf0e10cSrcweir                 aItemRect.Left()   = aPt.X();
1426cdf0e10cSrcweir                 aItemRect.Top()    = aPt.Y();
1427cdf0e10cSrcweir                 aPt = OutputToScreenPixel( aItemRect.BottomRight() );
1428cdf0e10cSrcweir                 aItemRect.Right()  = aPt.X();
1429cdf0e10cSrcweir                 aItemRect.Bottom() = aPt.Y();
1430cdf0e10cSrcweir                 XubString aStr = mpItemList->GetObject( nPos )->maText;
1431cdf0e10cSrcweir                 if ( aStr.Len() )
1432cdf0e10cSrcweir                 {
1433cdf0e10cSrcweir                     if ( rHEvt.GetMode() & HELPMODE_BALLOON )
1434cdf0e10cSrcweir                         Help::ShowBalloon( this, aItemRect.Center(), aItemRect, aStr );
1435cdf0e10cSrcweir                     else
1436cdf0e10cSrcweir                         Help::ShowQuickHelp( this, aItemRect, aStr );
1437cdf0e10cSrcweir                     return;
1438cdf0e10cSrcweir                 }
1439cdf0e10cSrcweir             }
1440cdf0e10cSrcweir         }
1441cdf0e10cSrcweir     }
1442cdf0e10cSrcweir 
1443cdf0e10cSrcweir     Window::RequestHelp( rHEvt );
1444cdf0e10cSrcweir }
1445cdf0e10cSrcweir 
1446cdf0e10cSrcweir // -----------------------------------------------------------------------
1447cdf0e10cSrcweir 
StateChanged(StateChangedType nType)1448cdf0e10cSrcweir void TabBar::StateChanged( StateChangedType nType )
1449cdf0e10cSrcweir {
1450cdf0e10cSrcweir     Window::StateChanged( nType );
1451cdf0e10cSrcweir 
1452cdf0e10cSrcweir     if ( nType == STATE_CHANGE_INITSHOW )
1453cdf0e10cSrcweir     {
1454cdf0e10cSrcweir         if ( (mbSizeFormat || mbFormat) && mpItemList->Count() )
1455cdf0e10cSrcweir             ImplFormat();
1456cdf0e10cSrcweir     }
1457cdf0e10cSrcweir     else if ( (nType == STATE_CHANGE_ZOOM) ||
1458cdf0e10cSrcweir               (nType == STATE_CHANGE_CONTROLFONT) )
1459cdf0e10cSrcweir     {
1460cdf0e10cSrcweir         ImplInitSettings( sal_True, sal_False );
1461cdf0e10cSrcweir         Invalidate();
1462cdf0e10cSrcweir     }
1463cdf0e10cSrcweir     else if ( nType == STATE_CHANGE_CONTROLFOREGROUND )
1464cdf0e10cSrcweir         Invalidate();
1465cdf0e10cSrcweir     else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
1466cdf0e10cSrcweir     {
1467cdf0e10cSrcweir         ImplInitSettings( sal_False, sal_True );
1468cdf0e10cSrcweir         Invalidate();
1469cdf0e10cSrcweir     }
1470cdf0e10cSrcweir     else if ( nType == STATE_CHANGE_MIRRORING )
1471cdf0e10cSrcweir     {
1472cdf0e10cSrcweir         // reacts on calls of EnableRTL, have to mirror all child controls
1473cdf0e10cSrcweir         if( mpFirstBtn ) mpFirstBtn->EnableRTL( IsRTLEnabled() );
1474cdf0e10cSrcweir         if( mpPrevBtn ) mpPrevBtn->EnableRTL( IsRTLEnabled() );
1475cdf0e10cSrcweir         if( mpNextBtn ) mpNextBtn->EnableRTL( IsRTLEnabled() );
1476cdf0e10cSrcweir         if( mpLastBtn ) mpLastBtn->EnableRTL( IsRTLEnabled() );
1477cdf0e10cSrcweir         if( mpImpl->mpSizer ) mpImpl->mpSizer->EnableRTL( IsRTLEnabled() );
1478cdf0e10cSrcweir         if( mpEdit ) mpEdit->EnableRTL( IsRTLEnabled() );
1479cdf0e10cSrcweir     }
1480cdf0e10cSrcweir }
1481cdf0e10cSrcweir 
1482cdf0e10cSrcweir // -----------------------------------------------------------------------
1483cdf0e10cSrcweir 
DataChanged(const DataChangedEvent & rDCEvt)1484cdf0e10cSrcweir void TabBar::DataChanged( const DataChangedEvent& rDCEvt )
1485cdf0e10cSrcweir {
1486cdf0e10cSrcweir     Window::DataChanged( rDCEvt );
1487cdf0e10cSrcweir 
1488cdf0e10cSrcweir     if ( (rDCEvt.GetType() == DATACHANGED_FONTS) ||
1489cdf0e10cSrcweir          (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
1490cdf0e10cSrcweir          ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
1491cdf0e10cSrcweir           (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
1492cdf0e10cSrcweir     {
1493cdf0e10cSrcweir         ImplInitSettings( sal_True, sal_True );
1494cdf0e10cSrcweir         Invalidate();
1495cdf0e10cSrcweir     }
1496cdf0e10cSrcweir }
1497cdf0e10cSrcweir 
1498cdf0e10cSrcweir // -----------------------------------------------------------------------
1499cdf0e10cSrcweir 
ImplSelect()1500cdf0e10cSrcweir void TabBar::ImplSelect()
1501cdf0e10cSrcweir {
1502cdf0e10cSrcweir 	Select();
1503cdf0e10cSrcweir 
1504cdf0e10cSrcweir 	CallEventListeners( VCLEVENT_TABBAR_PAGESELECTED, reinterpret_cast<void*>(sal::static_int_cast<sal_IntPtr>(mnCurPageId)) );
1505cdf0e10cSrcweir }
1506cdf0e10cSrcweir 
1507cdf0e10cSrcweir // -----------------------------------------------------------------------
1508cdf0e10cSrcweir 
Select()1509cdf0e10cSrcweir void TabBar::Select()
1510cdf0e10cSrcweir {
1511cdf0e10cSrcweir     maSelectHdl.Call( this );
1512cdf0e10cSrcweir }
1513cdf0e10cSrcweir 
1514cdf0e10cSrcweir // -----------------------------------------------------------------------
1515cdf0e10cSrcweir 
DoubleClick()1516cdf0e10cSrcweir void TabBar::DoubleClick()
1517cdf0e10cSrcweir {
1518cdf0e10cSrcweir     maDoubleClickHdl.Call( this );
1519cdf0e10cSrcweir }
1520cdf0e10cSrcweir 
1521cdf0e10cSrcweir // -----------------------------------------------------------------------
1522cdf0e10cSrcweir 
Split()1523cdf0e10cSrcweir void TabBar::Split()
1524cdf0e10cSrcweir {
1525cdf0e10cSrcweir     maSplitHdl.Call( this );
1526cdf0e10cSrcweir }
1527cdf0e10cSrcweir 
1528cdf0e10cSrcweir // -----------------------------------------------------------------------
1529cdf0e10cSrcweir 
ImplActivatePage()1530cdf0e10cSrcweir void TabBar::ImplActivatePage()
1531cdf0e10cSrcweir {
1532cdf0e10cSrcweir 	ActivatePage();
1533cdf0e10cSrcweir 
1534cdf0e10cSrcweir 	CallEventListeners( VCLEVENT_TABBAR_PAGEACTIVATED, reinterpret_cast<void*>(sal::static_int_cast<sal_IntPtr>(mnCurPageId)) );
1535cdf0e10cSrcweir }
1536cdf0e10cSrcweir 
1537cdf0e10cSrcweir // -----------------------------------------------------------------------
1538cdf0e10cSrcweir 
ActivatePage()1539cdf0e10cSrcweir void TabBar::ActivatePage()
1540cdf0e10cSrcweir {
1541cdf0e10cSrcweir     maActivatePageHdl.Call( this );
1542cdf0e10cSrcweir }
1543cdf0e10cSrcweir 
1544cdf0e10cSrcweir // -----------------------------------------------------------------------
1545cdf0e10cSrcweir 
ImplDeactivatePage()1546cdf0e10cSrcweir long TabBar::ImplDeactivatePage()
1547cdf0e10cSrcweir {
1548cdf0e10cSrcweir 	long nRet = DeactivatePage();
1549cdf0e10cSrcweir 
1550cdf0e10cSrcweir 	CallEventListeners( VCLEVENT_TABBAR_PAGEDEACTIVATED, reinterpret_cast<void*>(sal::static_int_cast<sal_IntPtr>(mnCurPageId)) );
1551cdf0e10cSrcweir 
1552cdf0e10cSrcweir 	return nRet;
1553cdf0e10cSrcweir }
1554cdf0e10cSrcweir 
1555cdf0e10cSrcweir // -----------------------------------------------------------------------
1556cdf0e10cSrcweir 
DeactivatePage()1557cdf0e10cSrcweir long TabBar::DeactivatePage()
1558cdf0e10cSrcweir {
1559cdf0e10cSrcweir     if ( maDeactivatePageHdl.IsSet() )
1560cdf0e10cSrcweir         return maDeactivatePageHdl.Call( this );
1561cdf0e10cSrcweir     else
1562cdf0e10cSrcweir         return sal_True;
1563cdf0e10cSrcweir }
1564cdf0e10cSrcweir 
1565cdf0e10cSrcweir // -----------------------------------------------------------------------
1566cdf0e10cSrcweir 
StartRenaming()1567cdf0e10cSrcweir long TabBar::StartRenaming()
1568cdf0e10cSrcweir {
1569cdf0e10cSrcweir     if ( maStartRenamingHdl.IsSet() )
1570cdf0e10cSrcweir         return maStartRenamingHdl.Call( this );
1571cdf0e10cSrcweir     else
1572cdf0e10cSrcweir         return sal_True;
1573cdf0e10cSrcweir }
1574cdf0e10cSrcweir 
1575cdf0e10cSrcweir // -----------------------------------------------------------------------
1576cdf0e10cSrcweir 
AllowRenaming()1577cdf0e10cSrcweir long TabBar::AllowRenaming()
1578cdf0e10cSrcweir {
1579cdf0e10cSrcweir     if ( maAllowRenamingHdl.IsSet() )
1580cdf0e10cSrcweir         return maAllowRenamingHdl.Call( this );
1581cdf0e10cSrcweir     else
1582cdf0e10cSrcweir         return sal_True;
1583cdf0e10cSrcweir }
1584cdf0e10cSrcweir 
1585cdf0e10cSrcweir // -----------------------------------------------------------------------
1586cdf0e10cSrcweir 
EndRenaming()1587cdf0e10cSrcweir void TabBar::EndRenaming()
1588cdf0e10cSrcweir {
1589cdf0e10cSrcweir     maEndRenamingHdl.Call( this );
1590cdf0e10cSrcweir }
1591cdf0e10cSrcweir 
1592cdf0e10cSrcweir // -----------------------------------------------------------------------
1593cdf0e10cSrcweir 
Mirror()1594cdf0e10cSrcweir void TabBar::Mirror()
1595cdf0e10cSrcweir {
1596cdf0e10cSrcweir 
1597cdf0e10cSrcweir }
1598cdf0e10cSrcweir 
1599cdf0e10cSrcweir // -----------------------------------------------------------------------
1600cdf0e10cSrcweir 
InsertPage(sal_uInt16 nPageId,const XubString & rText,TabBarPageBits nBits,sal_uInt16 nPos)1601cdf0e10cSrcweir void TabBar::InsertPage( sal_uInt16 nPageId, const XubString& rText,
1602cdf0e10cSrcweir                          TabBarPageBits nBits, sal_uInt16 nPos )
1603cdf0e10cSrcweir {
1604cdf0e10cSrcweir     DBG_ASSERT( nPageId, "TabBar::InsertPage(): PageId == 0" );
1605cdf0e10cSrcweir     DBG_ASSERT( GetPagePos( nPageId ) == PAGE_NOT_FOUND,
1606cdf0e10cSrcweir                 "TabBar::InsertPage(): PageId already exists" );
1607cdf0e10cSrcweir     DBG_ASSERT( nBits <= TPB_SPECIAL, "TabBar::InsertPage(): nBits is wrong" );
1608cdf0e10cSrcweir 
1609cdf0e10cSrcweir     // PageItem anlegen und in die Item-Liste eintragen
1610cdf0e10cSrcweir     ImplTabBarItem* pItem = new ImplTabBarItem( nPageId, rText, nBits );
1611cdf0e10cSrcweir     mpItemList->Insert( pItem, nPos );
1612cdf0e10cSrcweir     mbSizeFormat = sal_True;
1613cdf0e10cSrcweir 
1614cdf0e10cSrcweir     // CurPageId gegebenenfalls setzen
1615cdf0e10cSrcweir     if ( !mnCurPageId )
1616cdf0e10cSrcweir         mnCurPageId = nPageId;
1617cdf0e10cSrcweir 
1618cdf0e10cSrcweir     // Leiste neu ausgeben
1619cdf0e10cSrcweir     if ( IsReallyVisible() && IsUpdateMode() )
1620cdf0e10cSrcweir         Invalidate();
1621cdf0e10cSrcweir 
1622cdf0e10cSrcweir 	CallEventListeners( VCLEVENT_TABBAR_PAGEINSERTED, reinterpret_cast<void*>(sal::static_int_cast<sal_IntPtr>(nPageId)) );
1623cdf0e10cSrcweir }
1624cdf0e10cSrcweir 
1625cdf0e10cSrcweir // -----------------------------------------------------------------------
1626cdf0e10cSrcweir 
GetTabBgColor(sal_uInt16 nPageId) const1627cdf0e10cSrcweir Color TabBar::GetTabBgColor( sal_uInt16 nPageId ) const
1628cdf0e10cSrcweir {
1629cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
1630cdf0e10cSrcweir 
1631cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
1632cdf0e10cSrcweir         return mpItemList->GetObject( nPos )->maTabBgColor;
1633cdf0e10cSrcweir     else
1634cdf0e10cSrcweir         return Color( COL_AUTO );
1635cdf0e10cSrcweir }
1636cdf0e10cSrcweir 
SetTabBgColor(sal_uInt16 nPageId,const Color & aTabBgColor)1637cdf0e10cSrcweir void TabBar::SetTabBgColor( sal_uInt16 nPageId, const Color& aTabBgColor )
1638cdf0e10cSrcweir {
1639cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
1640cdf0e10cSrcweir     ImplTabBarItem* pItem;
1641cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
1642cdf0e10cSrcweir     {
1643cdf0e10cSrcweir         pItem = mpItemList->GetObject( nPos );
1644cdf0e10cSrcweir         if ( aTabBgColor != Color( COL_AUTO )  )
1645cdf0e10cSrcweir         {
1646cdf0e10cSrcweir             pItem->maTabBgColor = aTabBgColor;
1647cdf0e10cSrcweir             if ( aTabBgColor.GetLuminance() <= 128 ) //Do not use aTabBgColor.IsDark(), because that threshold is way too low...
1648cdf0e10cSrcweir                 pItem->maTabTextColor = Color( COL_WHITE );
1649cdf0e10cSrcweir             else
1650cdf0e10cSrcweir                 pItem->maTabTextColor = Color( COL_BLACK );
1651cdf0e10cSrcweir         }
1652cdf0e10cSrcweir         else
1653cdf0e10cSrcweir         {
1654cdf0e10cSrcweir             pItem->maTabBgColor = Color( COL_AUTO );
1655cdf0e10cSrcweir             pItem->maTabTextColor = Color( COL_AUTO );
1656cdf0e10cSrcweir         }
1657cdf0e10cSrcweir     }
1658cdf0e10cSrcweir }
1659cdf0e10cSrcweir 
1660cdf0e10cSrcweir // -----------------------------------------------------------------------
1661cdf0e10cSrcweir 
RemovePage(sal_uInt16 nPageId)1662cdf0e10cSrcweir void TabBar::RemovePage( sal_uInt16 nPageId )
1663cdf0e10cSrcweir {
1664cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
1665cdf0e10cSrcweir 
1666cdf0e10cSrcweir     // Existiert Item
1667cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
1668cdf0e10cSrcweir     {
1669cdf0e10cSrcweir         if ( mnCurPageId == nPageId )
1670cdf0e10cSrcweir             mnCurPageId = 0;
1671cdf0e10cSrcweir 
1672cdf0e10cSrcweir         // Testen, ob erste sichtbare Seite verschoben werden muss
1673cdf0e10cSrcweir         if ( mnFirstPos > nPos )
1674cdf0e10cSrcweir             mnFirstPos--;
1675cdf0e10cSrcweir 
1676cdf0e10cSrcweir         // Item-Daten loeschen
1677cdf0e10cSrcweir         delete mpItemList->Remove( nPos );
1678cdf0e10cSrcweir         mbFormat = sal_True;
1679cdf0e10cSrcweir 
1680cdf0e10cSrcweir         // Leiste neu ausgeben
1681cdf0e10cSrcweir         if ( IsReallyVisible() && IsUpdateMode() )
1682cdf0e10cSrcweir             Invalidate();
1683cdf0e10cSrcweir 
1684cdf0e10cSrcweir 		CallEventListeners( VCLEVENT_TABBAR_PAGEREMOVED, reinterpret_cast<void*>(sal::static_int_cast<sal_IntPtr>(nPageId)) );
1685cdf0e10cSrcweir     }
1686cdf0e10cSrcweir }
1687cdf0e10cSrcweir 
1688cdf0e10cSrcweir // -----------------------------------------------------------------------
1689cdf0e10cSrcweir 
MovePage(sal_uInt16 nPageId,sal_uInt16 nNewPos)1690cdf0e10cSrcweir void TabBar::MovePage( sal_uInt16 nPageId, sal_uInt16 nNewPos )
1691cdf0e10cSrcweir {
1692cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
1693cdf0e10cSrcweir 	Pair aPair( nPos, nNewPos );
1694cdf0e10cSrcweir 
1695cdf0e10cSrcweir     if ( nPos < nNewPos )
1696cdf0e10cSrcweir         nNewPos--;
1697cdf0e10cSrcweir 
1698cdf0e10cSrcweir     if ( nPos == nNewPos )
1699cdf0e10cSrcweir         return;
1700cdf0e10cSrcweir 
1701cdf0e10cSrcweir     // Existiert Item
1702cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
1703cdf0e10cSrcweir     {
1704cdf0e10cSrcweir         // TabBar-Item in der Liste verschieben
1705cdf0e10cSrcweir         ImplTabBarItem* pItem = mpItemList->Remove( nPos );
1706cdf0e10cSrcweir         mpItemList->Insert( pItem, nNewPos );
1707cdf0e10cSrcweir         mbFormat = sal_True;
1708cdf0e10cSrcweir 
1709cdf0e10cSrcweir         // Leiste neu ausgeben
1710cdf0e10cSrcweir         if ( IsReallyVisible() && IsUpdateMode() )
1711cdf0e10cSrcweir             Invalidate();
1712cdf0e10cSrcweir 
1713cdf0e10cSrcweir 		CallEventListeners( VCLEVENT_TABBAR_PAGEMOVED, (void*) &aPair );
1714cdf0e10cSrcweir     }
1715cdf0e10cSrcweir }
1716cdf0e10cSrcweir 
1717cdf0e10cSrcweir // -----------------------------------------------------------------------
1718cdf0e10cSrcweir 
Clear()1719cdf0e10cSrcweir void TabBar::Clear()
1720cdf0e10cSrcweir {
1721cdf0e10cSrcweir     // Alle Items loeschen
1722cdf0e10cSrcweir     ImplTabBarItem* pItem = mpItemList->First();
1723cdf0e10cSrcweir     while ( pItem )
1724cdf0e10cSrcweir     {
1725cdf0e10cSrcweir         // Item-Daten loeschen
1726cdf0e10cSrcweir         delete pItem;
1727cdf0e10cSrcweir         pItem = mpItemList->Next();
1728cdf0e10cSrcweir     }
1729cdf0e10cSrcweir 
1730cdf0e10cSrcweir     // Items aus der Liste loeschen
1731cdf0e10cSrcweir     mpItemList->Clear();
1732cdf0e10cSrcweir     mbSizeFormat = sal_True;
1733cdf0e10cSrcweir     mnCurPageId = 0;
1734cdf0e10cSrcweir     mnFirstPos = 0;
1735cdf0e10cSrcweir 
1736cdf0e10cSrcweir     // Leiste neu ausgeben
1737cdf0e10cSrcweir     if ( IsReallyVisible() && IsUpdateMode() )
1738cdf0e10cSrcweir         Invalidate();
1739cdf0e10cSrcweir 
1740cdf0e10cSrcweir     CallEventListeners( VCLEVENT_TABBAR_PAGEREMOVED, (void*) PAGE_NOT_FOUND );
1741cdf0e10cSrcweir }
1742cdf0e10cSrcweir 
1743cdf0e10cSrcweir // -----------------------------------------------------------------------
1744cdf0e10cSrcweir 
EnablePage(sal_uInt16 nPageId,sal_Bool bEnable)1745cdf0e10cSrcweir void TabBar::EnablePage( sal_uInt16 nPageId, sal_Bool bEnable )
1746cdf0e10cSrcweir {
1747cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
1748cdf0e10cSrcweir 
1749cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
1750cdf0e10cSrcweir     {
1751cdf0e10cSrcweir         ImplTabBarItem* pItem = mpItemList->GetObject( nPos );
1752cdf0e10cSrcweir 
1753cdf0e10cSrcweir         if ( pItem->mbEnable != bEnable )
1754cdf0e10cSrcweir         {
1755cdf0e10cSrcweir             pItem->mbEnable = bEnable;
1756cdf0e10cSrcweir 
1757cdf0e10cSrcweir             // Leiste neu ausgeben
1758cdf0e10cSrcweir             if ( IsReallyVisible() && IsUpdateMode() )
1759cdf0e10cSrcweir                 Invalidate( pItem->maRect );
1760cdf0e10cSrcweir 
1761cdf0e10cSrcweir 			CallEventListeners( bEnable ? VCLEVENT_TABBAR_PAGEENABLED : VCLEVENT_TABBAR_PAGEDISABLED, reinterpret_cast<void*>(sal::static_int_cast<sal_IntPtr>(nPageId)) );
1762cdf0e10cSrcweir         }
1763cdf0e10cSrcweir     }
1764cdf0e10cSrcweir }
1765cdf0e10cSrcweir 
1766cdf0e10cSrcweir // -----------------------------------------------------------------------
1767cdf0e10cSrcweir 
IsPageEnabled(sal_uInt16 nPageId) const1768cdf0e10cSrcweir sal_Bool TabBar::IsPageEnabled( sal_uInt16 nPageId ) const
1769cdf0e10cSrcweir {
1770cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
1771cdf0e10cSrcweir 
1772cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
1773cdf0e10cSrcweir         return mpItemList->GetObject( nPos )->mbEnable;
1774cdf0e10cSrcweir     else
1775cdf0e10cSrcweir         return sal_False;
1776cdf0e10cSrcweir }
1777cdf0e10cSrcweir 
1778cdf0e10cSrcweir // -----------------------------------------------------------------------
1779cdf0e10cSrcweir 
SetPageBits(sal_uInt16 nPageId,TabBarPageBits nBits)1780cdf0e10cSrcweir void TabBar::SetPageBits( sal_uInt16 nPageId, TabBarPageBits nBits )
1781cdf0e10cSrcweir {
1782cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
1783cdf0e10cSrcweir 
1784cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
1785cdf0e10cSrcweir     {
1786cdf0e10cSrcweir         ImplTabBarItem* pItem = mpItemList->GetObject( nPos );
1787cdf0e10cSrcweir 
1788cdf0e10cSrcweir         if ( pItem->mnBits != nBits )
1789cdf0e10cSrcweir         {
1790cdf0e10cSrcweir             pItem->mnBits = nBits;
1791cdf0e10cSrcweir 
1792cdf0e10cSrcweir             // Leiste neu ausgeben
1793cdf0e10cSrcweir             if ( IsReallyVisible() && IsUpdateMode() )
1794cdf0e10cSrcweir                 Invalidate( pItem->maRect );
1795cdf0e10cSrcweir         }
1796cdf0e10cSrcweir     }
1797cdf0e10cSrcweir }
1798cdf0e10cSrcweir 
1799cdf0e10cSrcweir // -----------------------------------------------------------------------
1800cdf0e10cSrcweir 
GetPageBits(sal_uInt16 nPageId) const1801cdf0e10cSrcweir TabBarPageBits TabBar::GetPageBits( sal_uInt16 nPageId ) const
1802cdf0e10cSrcweir {
1803cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
1804cdf0e10cSrcweir 
1805cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
1806cdf0e10cSrcweir         return mpItemList->GetObject( nPos )->mnBits;
1807cdf0e10cSrcweir     else
1808cdf0e10cSrcweir         return sal_False;
1809cdf0e10cSrcweir }
1810cdf0e10cSrcweir 
1811cdf0e10cSrcweir // -----------------------------------------------------------------------
1812cdf0e10cSrcweir 
GetPageCount() const1813cdf0e10cSrcweir sal_uInt16 TabBar::GetPageCount() const
1814cdf0e10cSrcweir {
1815cdf0e10cSrcweir     return (sal_uInt16)mpItemList->Count();
1816cdf0e10cSrcweir }
1817cdf0e10cSrcweir 
1818cdf0e10cSrcweir // -----------------------------------------------------------------------
1819cdf0e10cSrcweir 
GetPageId(sal_uInt16 nPos) const1820cdf0e10cSrcweir sal_uInt16 TabBar::GetPageId( sal_uInt16 nPos ) const
1821cdf0e10cSrcweir {
1822cdf0e10cSrcweir     ImplTabBarItem* pItem = mpItemList->GetObject( nPos );
1823cdf0e10cSrcweir     if ( pItem )
1824cdf0e10cSrcweir         return pItem->mnId;
1825cdf0e10cSrcweir     else
1826cdf0e10cSrcweir         return 0;
1827cdf0e10cSrcweir }
1828cdf0e10cSrcweir 
1829cdf0e10cSrcweir // -----------------------------------------------------------------------
1830cdf0e10cSrcweir 
GetPagePos(sal_uInt16 nPageId) const1831cdf0e10cSrcweir sal_uInt16 TabBar::GetPagePos( sal_uInt16 nPageId ) const
1832cdf0e10cSrcweir {
1833cdf0e10cSrcweir     ImplTabBarItem* pItem = mpItemList->First();
1834cdf0e10cSrcweir     while ( pItem )
1835cdf0e10cSrcweir     {
1836cdf0e10cSrcweir         if ( pItem->mnId == nPageId )
1837cdf0e10cSrcweir             return (sal_uInt16)mpItemList->GetCurPos();
1838cdf0e10cSrcweir 
1839cdf0e10cSrcweir         pItem = mpItemList->Next();
1840cdf0e10cSrcweir     }
1841cdf0e10cSrcweir 
1842cdf0e10cSrcweir     return PAGE_NOT_FOUND;
1843cdf0e10cSrcweir }
1844cdf0e10cSrcweir 
1845cdf0e10cSrcweir // -----------------------------------------------------------------------
1846cdf0e10cSrcweir 
GetPageId(const Point & rPos) const1847cdf0e10cSrcweir sal_uInt16 TabBar::GetPageId( const Point& rPos ) const
1848cdf0e10cSrcweir {
1849cdf0e10cSrcweir     ImplTabBarItem* pItem = mpItemList->First();
1850cdf0e10cSrcweir     while ( pItem )
1851cdf0e10cSrcweir     {
1852cdf0e10cSrcweir         if ( pItem->maRect.IsInside( rPos ) )
1853cdf0e10cSrcweir             return pItem->mnId;
1854cdf0e10cSrcweir 
1855cdf0e10cSrcweir         pItem = mpItemList->Next();
1856cdf0e10cSrcweir     }
1857cdf0e10cSrcweir 
1858cdf0e10cSrcweir     return 0;
1859cdf0e10cSrcweir }
1860cdf0e10cSrcweir 
1861cdf0e10cSrcweir // -----------------------------------------------------------------------
1862cdf0e10cSrcweir 
GetPageRect(sal_uInt16 nPageId) const1863cdf0e10cSrcweir Rectangle TabBar::GetPageRect( sal_uInt16 nPageId ) const
1864cdf0e10cSrcweir {
1865cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
1866cdf0e10cSrcweir 
1867cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
1868cdf0e10cSrcweir         return mpItemList->GetObject( nPos )->maRect;
1869cdf0e10cSrcweir     else
1870cdf0e10cSrcweir         return Rectangle();
1871cdf0e10cSrcweir }
1872cdf0e10cSrcweir 
1873cdf0e10cSrcweir // -----------------------------------------------------------------------
1874cdf0e10cSrcweir 
SetCurPageId(sal_uInt16 nPageId)1875cdf0e10cSrcweir void TabBar::SetCurPageId( sal_uInt16 nPageId )
1876cdf0e10cSrcweir {
1877cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
1878cdf0e10cSrcweir 
1879cdf0e10cSrcweir     // Wenn Item nicht existiert, dann nichts machen
1880cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
1881cdf0e10cSrcweir     {
1882cdf0e10cSrcweir         // Wenn sich aktuelle Page nicht geaendert hat, dann muessen wir
1883cdf0e10cSrcweir         // jetzt nichts mehr machen
1884cdf0e10cSrcweir         if ( nPageId == mnCurPageId )
1885cdf0e10cSrcweir             return;
1886cdf0e10cSrcweir 
1887cdf0e10cSrcweir         // Muss invalidiert werden
1888cdf0e10cSrcweir         sal_Bool bUpdate = sal_False;
1889cdf0e10cSrcweir         if ( IsReallyVisible() && IsUpdateMode() )
1890cdf0e10cSrcweir             bUpdate = sal_True;
1891cdf0e10cSrcweir 
1892cdf0e10cSrcweir         ImplTabBarItem* pItem = mpItemList->GetObject( nPos );
1893cdf0e10cSrcweir         ImplTabBarItem* pOldItem;
1894cdf0e10cSrcweir 
1895cdf0e10cSrcweir         if ( mnCurPageId )
1896cdf0e10cSrcweir             pOldItem = mpItemList->GetObject( GetPagePos( mnCurPageId ) );
1897cdf0e10cSrcweir         else
1898cdf0e10cSrcweir             pOldItem = NULL;
1899cdf0e10cSrcweir 
1900cdf0e10cSrcweir         // Wenn Page nicht selektiert, dann vorher selektierte Seite
1901cdf0e10cSrcweir         // deselktieren, wenn dies die einzige selektierte Seite ist
1902cdf0e10cSrcweir         if ( !pItem->mbSelect && pOldItem )
1903cdf0e10cSrcweir         {
1904cdf0e10cSrcweir             sal_uInt16 nSelPageCount = GetSelectPageCount();
1905cdf0e10cSrcweir             if ( nSelPageCount == 1 )
1906cdf0e10cSrcweir                 pOldItem->mbSelect = sal_False;
1907cdf0e10cSrcweir             pItem->mbSelect = sal_True;
1908cdf0e10cSrcweir         }
1909cdf0e10cSrcweir 
1910cdf0e10cSrcweir         mnCurPageId = nPageId;
1911cdf0e10cSrcweir         mbFormat = sal_True;
1912cdf0e10cSrcweir 
1913cdf0e10cSrcweir         // Dafuer sorgen, das aktuelle Page sichtbar wird
1914cdf0e10cSrcweir         if ( IsReallyVisible() )
1915cdf0e10cSrcweir         {
1916cdf0e10cSrcweir             if ( nPos < mnFirstPos )
1917cdf0e10cSrcweir                 SetFirstPageId( nPageId );
1918cdf0e10cSrcweir             else
1919cdf0e10cSrcweir             {
1920cdf0e10cSrcweir                 // sichtbare Breite berechnen
1921cdf0e10cSrcweir                 long nWidth = mnLastOffX;
1922cdf0e10cSrcweir                 if ( nWidth > TABBAR_OFFSET_X )
1923cdf0e10cSrcweir                     nWidth -= TABBAR_OFFSET_X;
1924cdf0e10cSrcweir                 if ( nWidth > ADDNEWPAGE_AREAWIDTH )
1925cdf0e10cSrcweir 					nWidth -= ADDNEWPAGE_AREAWIDTH;
1926cdf0e10cSrcweir 
1927cdf0e10cSrcweir                 if ( pItem->maRect.IsEmpty() )
1928cdf0e10cSrcweir                     ImplFormat();
1929cdf0e10cSrcweir 
1930cdf0e10cSrcweir                 while ( (mbMirrored ? (pItem->maRect.Left() < mnOffX) : (pItem->maRect.Right() > nWidth)) ||
1931cdf0e10cSrcweir                         pItem->maRect.IsEmpty() )
1932cdf0e10cSrcweir                 {
1933cdf0e10cSrcweir                     sal_uInt16 nNewPos = mnFirstPos+1;
1934cdf0e10cSrcweir                     // Dafuer sorgen, das min. die aktuelle TabPages als
1935cdf0e10cSrcweir                     // erste TabPage sichtbar ist
1936cdf0e10cSrcweir                     if ( nNewPos >= nPos )
1937cdf0e10cSrcweir                     {
1938cdf0e10cSrcweir                         SetFirstPageId( nPageId );
1939cdf0e10cSrcweir                         break;
1940cdf0e10cSrcweir                     }
1941cdf0e10cSrcweir                     else
1942cdf0e10cSrcweir                         SetFirstPageId( GetPageId( nNewPos ) );
1943cdf0e10cSrcweir                     ImplFormat();
1944cdf0e10cSrcweir                     // Falls erste Seite nicht weitergeschaltet wird, dann
1945cdf0e10cSrcweir                     // koennen wir abbrechen
1946cdf0e10cSrcweir                     if ( nNewPos != mnFirstPos )
1947cdf0e10cSrcweir                         break;
1948cdf0e10cSrcweir                 }
1949cdf0e10cSrcweir             }
1950cdf0e10cSrcweir         }
1951cdf0e10cSrcweir 
1952cdf0e10cSrcweir         // Leiste neu ausgeben
1953cdf0e10cSrcweir         if ( bUpdate )
1954cdf0e10cSrcweir         {
1955cdf0e10cSrcweir             Invalidate( pItem->maRect );
1956cdf0e10cSrcweir             if ( pOldItem )
1957cdf0e10cSrcweir                 Invalidate( pOldItem->maRect );
1958cdf0e10cSrcweir         }
1959cdf0e10cSrcweir     }
1960cdf0e10cSrcweir }
1961cdf0e10cSrcweir 
1962cdf0e10cSrcweir // -----------------------------------------------------------------------
1963cdf0e10cSrcweir 
MakeVisible(sal_uInt16 nPageId)1964cdf0e10cSrcweir void TabBar::MakeVisible( sal_uInt16 nPageId )
1965cdf0e10cSrcweir {
1966cdf0e10cSrcweir     if ( !IsReallyVisible() )
1967cdf0e10cSrcweir         return;
1968cdf0e10cSrcweir 
1969cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
1970cdf0e10cSrcweir 
1971cdf0e10cSrcweir     // Wenn Item nicht existiert, dann nichts machen
1972cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
1973cdf0e10cSrcweir     {
1974cdf0e10cSrcweir         if ( nPos < mnFirstPos )
1975cdf0e10cSrcweir             SetFirstPageId( nPageId );
1976cdf0e10cSrcweir         else
1977cdf0e10cSrcweir         {
1978cdf0e10cSrcweir             ImplTabBarItem* pItem = mpItemList->GetObject( nPos );
1979cdf0e10cSrcweir 
1980cdf0e10cSrcweir             // sichtbare Breite berechnen
1981cdf0e10cSrcweir             long nWidth = mnLastOffX;
1982cdf0e10cSrcweir             if ( nWidth > TABBAR_OFFSET_X )
1983cdf0e10cSrcweir                 nWidth -= TABBAR_OFFSET_X;
1984cdf0e10cSrcweir 
1985cdf0e10cSrcweir             if ( mbFormat || pItem->maRect.IsEmpty() )
1986cdf0e10cSrcweir             {
1987cdf0e10cSrcweir                 mbFormat = sal_True;
1988cdf0e10cSrcweir                 ImplFormat();
1989cdf0e10cSrcweir             }
1990cdf0e10cSrcweir 
1991cdf0e10cSrcweir             while ( (pItem->maRect.Right() > nWidth) ||
1992cdf0e10cSrcweir                     pItem->maRect.IsEmpty() )
1993cdf0e10cSrcweir             {
1994cdf0e10cSrcweir                 sal_uInt16 nNewPos = mnFirstPos+1;
1995cdf0e10cSrcweir                 // Dafuer sorgen, das min. die aktuelle TabPages als
1996cdf0e10cSrcweir                 // erste TabPage sichtbar ist
1997cdf0e10cSrcweir                 if ( nNewPos >= nPos )
1998cdf0e10cSrcweir                 {
1999cdf0e10cSrcweir                     SetFirstPageId( nPageId );
2000cdf0e10cSrcweir                     break;
2001cdf0e10cSrcweir                 }
2002cdf0e10cSrcweir                 else
2003cdf0e10cSrcweir                     SetFirstPageId( GetPageId( nNewPos ) );
2004cdf0e10cSrcweir                 ImplFormat();
2005cdf0e10cSrcweir                 // Falls erste Seite nicht weitergeschaltet wird, dann
2006cdf0e10cSrcweir                 // koennen wir abbrechen
2007cdf0e10cSrcweir                 if ( nNewPos != mnFirstPos )
2008cdf0e10cSrcweir                     break;
2009cdf0e10cSrcweir             }
2010cdf0e10cSrcweir         }
2011cdf0e10cSrcweir     }
2012cdf0e10cSrcweir }
2013cdf0e10cSrcweir 
2014cdf0e10cSrcweir // -----------------------------------------------------------------------
2015cdf0e10cSrcweir 
SetFirstPageId(sal_uInt16 nPageId)2016cdf0e10cSrcweir void TabBar::SetFirstPageId( sal_uInt16 nPageId )
2017cdf0e10cSrcweir {
2018cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
2019cdf0e10cSrcweir 
2020cdf0e10cSrcweir     // Wenn Item nicht existiert, dann sal_False zurueckgeben
2021cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
2022cdf0e10cSrcweir     {
2023cdf0e10cSrcweir         if ( nPos != mnFirstPos )
2024cdf0e10cSrcweir         {
2025cdf0e10cSrcweir             // Dafuer sorgen, das nach Moeglichkteit soviele Pages wie
2026cdf0e10cSrcweir             // moeglich sichtbar sind
2027cdf0e10cSrcweir             ImplFormat();
2028cdf0e10cSrcweir             sal_uInt16 nLastFirstPos = ImplGetLastFirstPos();
2029cdf0e10cSrcweir             sal_uInt16 nNewPos;
2030cdf0e10cSrcweir             if ( nPos > nLastFirstPos )
2031cdf0e10cSrcweir                 nNewPos = nLastFirstPos;
2032cdf0e10cSrcweir             else
2033cdf0e10cSrcweir                 nNewPos = nPos;
2034cdf0e10cSrcweir 
2035cdf0e10cSrcweir             if ( nNewPos != mnFirstPos )
2036cdf0e10cSrcweir             {
2037cdf0e10cSrcweir                 mnFirstPos = nNewPos;
2038cdf0e10cSrcweir                 mbFormat = sal_True;
2039cdf0e10cSrcweir 
2040cdf0e10cSrcweir                 // Leiste neu ausgeben (Achtung: mbDropPos beachten, da wenn
2041cdf0e10cSrcweir                 // dieses Flag gesetzt ist, wird direkt gepaintet)
2042cdf0e10cSrcweir                 if ( IsReallyVisible() && IsUpdateMode() && !mbDropPos )
2043cdf0e10cSrcweir                     Invalidate();
2044cdf0e10cSrcweir             }
2045cdf0e10cSrcweir         }
2046cdf0e10cSrcweir     }
2047cdf0e10cSrcweir }
2048cdf0e10cSrcweir 
2049cdf0e10cSrcweir // -----------------------------------------------------------------------
2050cdf0e10cSrcweir 
SelectPage(sal_uInt16 nPageId,sal_Bool bSelect)2051cdf0e10cSrcweir void TabBar::SelectPage( sal_uInt16 nPageId, sal_Bool bSelect )
2052cdf0e10cSrcweir {
2053cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
2054cdf0e10cSrcweir 
2055cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
2056cdf0e10cSrcweir     {
2057cdf0e10cSrcweir         ImplTabBarItem* pItem = mpItemList->GetObject( nPos );
2058cdf0e10cSrcweir 
2059cdf0e10cSrcweir         if ( pItem->mbSelect != bSelect )
2060cdf0e10cSrcweir         {
2061cdf0e10cSrcweir             pItem->mbSelect = bSelect;
2062cdf0e10cSrcweir 
2063cdf0e10cSrcweir             // Leiste neu ausgeben
2064cdf0e10cSrcweir             if ( IsReallyVisible() && IsUpdateMode() )
2065cdf0e10cSrcweir                 Invalidate( pItem->maRect );
2066cdf0e10cSrcweir         }
2067cdf0e10cSrcweir     }
2068cdf0e10cSrcweir }
2069cdf0e10cSrcweir 
2070cdf0e10cSrcweir // -----------------------------------------------------------------------
2071cdf0e10cSrcweir 
SelectPageRange(sal_Bool bSelect,sal_uInt16 nStartPos,sal_uInt16 nEndPos)2072cdf0e10cSrcweir void TabBar::SelectPageRange( sal_Bool bSelect, sal_uInt16 nStartPos, sal_uInt16 nEndPos )
2073cdf0e10cSrcweir {
2074cdf0e10cSrcweir     Rectangle       aPaintRect;
2075cdf0e10cSrcweir     sal_uInt16          nPos = nStartPos;
2076cdf0e10cSrcweir     ImplTabBarItem* pItem = mpItemList->Seek( nPos );
2077cdf0e10cSrcweir     while ( pItem && (nPos <= nEndPos) )
2078cdf0e10cSrcweir     {
2079cdf0e10cSrcweir         if ( (pItem->mbSelect != bSelect) && (pItem->mnId != mnCurPageId) )
2080cdf0e10cSrcweir         {
2081cdf0e10cSrcweir             pItem->mbSelect = bSelect;
2082cdf0e10cSrcweir             aPaintRect.Union( pItem->maRect );
2083cdf0e10cSrcweir         }
2084cdf0e10cSrcweir 
2085cdf0e10cSrcweir         nPos++;
2086cdf0e10cSrcweir         pItem = mpItemList->Next();
2087cdf0e10cSrcweir     }
2088cdf0e10cSrcweir 
2089cdf0e10cSrcweir     // Leiste neu ausgeben
2090cdf0e10cSrcweir     if ( IsReallyVisible() && IsUpdateMode() && !aPaintRect.IsEmpty() )
2091cdf0e10cSrcweir         Invalidate( aPaintRect );
2092cdf0e10cSrcweir }
2093cdf0e10cSrcweir 
2094cdf0e10cSrcweir // -----------------------------------------------------------------------
2095cdf0e10cSrcweir 
GetSelectPage(sal_uInt16 nSelIndex) const2096cdf0e10cSrcweir sal_uInt16 TabBar::GetSelectPage( sal_uInt16 nSelIndex ) const
2097cdf0e10cSrcweir {
2098cdf0e10cSrcweir     sal_uInt16          nSelected = 0;
2099cdf0e10cSrcweir     ImplTabBarItem* pItem = mpItemList->First();
2100cdf0e10cSrcweir     while ( pItem )
2101cdf0e10cSrcweir     {
2102cdf0e10cSrcweir         if ( pItem->mbSelect )
2103cdf0e10cSrcweir             nSelected++;
2104cdf0e10cSrcweir 
2105cdf0e10cSrcweir         if ( nSelected == nSelIndex )
2106cdf0e10cSrcweir             return pItem->mnId;
2107cdf0e10cSrcweir 
2108cdf0e10cSrcweir         pItem = mpItemList->Next();
2109cdf0e10cSrcweir     }
2110cdf0e10cSrcweir 
2111cdf0e10cSrcweir     return 0;
2112cdf0e10cSrcweir }
2113cdf0e10cSrcweir 
2114cdf0e10cSrcweir // -----------------------------------------------------------------------
2115cdf0e10cSrcweir 
GetSelectPageCount() const2116cdf0e10cSrcweir sal_uInt16 TabBar::GetSelectPageCount() const
2117cdf0e10cSrcweir {
2118cdf0e10cSrcweir     sal_uInt16          nSelected = 0;
2119cdf0e10cSrcweir     ImplTabBarItem* pItem = mpItemList->First();
2120cdf0e10cSrcweir     while ( pItem )
2121cdf0e10cSrcweir     {
2122cdf0e10cSrcweir         if ( pItem->mbSelect )
2123cdf0e10cSrcweir             nSelected++;
2124cdf0e10cSrcweir 
2125cdf0e10cSrcweir         pItem = mpItemList->Next();
2126cdf0e10cSrcweir     }
2127cdf0e10cSrcweir 
2128cdf0e10cSrcweir     return nSelected;
2129cdf0e10cSrcweir }
2130cdf0e10cSrcweir 
2131cdf0e10cSrcweir // -----------------------------------------------------------------------
2132cdf0e10cSrcweir 
IsPageSelected(sal_uInt16 nPageId) const2133cdf0e10cSrcweir sal_Bool TabBar::IsPageSelected( sal_uInt16 nPageId ) const
2134cdf0e10cSrcweir {
2135cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
2136cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
2137cdf0e10cSrcweir         return mpItemList->GetObject( nPos )->mbSelect;
2138cdf0e10cSrcweir     else
2139cdf0e10cSrcweir         return sal_False;
2140cdf0e10cSrcweir }
2141cdf0e10cSrcweir 
2142cdf0e10cSrcweir // -----------------------------------------------------------------------
2143cdf0e10cSrcweir 
StartEditMode(sal_uInt16 nPageId)2144cdf0e10cSrcweir sal_Bool TabBar::StartEditMode( sal_uInt16 nPageId )
2145cdf0e10cSrcweir {
2146cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
2147cdf0e10cSrcweir     if ( mpEdit || (nPos == PAGE_NOT_FOUND) || (mnLastOffX < 8) )
2148cdf0e10cSrcweir         return sal_False;
2149cdf0e10cSrcweir 
2150cdf0e10cSrcweir     mnEditId = nPageId;
2151cdf0e10cSrcweir     if ( StartRenaming() )
2152cdf0e10cSrcweir     {
2153cdf0e10cSrcweir         ImplShowPage( nPos );
2154cdf0e10cSrcweir         ImplFormat();
2155cdf0e10cSrcweir         Update();
2156cdf0e10cSrcweir 
2157cdf0e10cSrcweir         mpEdit = new TabBarEdit( this, WB_CENTER );
2158cdf0e10cSrcweir         Rectangle aRect = GetPageRect( mnEditId );
2159cdf0e10cSrcweir         long nX = aRect.Left()+TABBAR_OFFSET_X+(TABBAR_OFFSET_X2/2);
2160cdf0e10cSrcweir         long nWidth = aRect.GetWidth()-(TABBAR_OFFSET_X*2)-TABBAR_OFFSET_X2;
2161cdf0e10cSrcweir         if ( mnEditId != GetCurPageId() )
2162cdf0e10cSrcweir             nX += 1;
2163cdf0e10cSrcweir         if ( nX+nWidth > mnLastOffX )
2164cdf0e10cSrcweir             nWidth = mnLastOffX-nX;
2165cdf0e10cSrcweir         if ( nWidth < 3 )
2166cdf0e10cSrcweir         {
2167cdf0e10cSrcweir             nX = aRect.Left();
2168cdf0e10cSrcweir             nWidth = aRect.GetWidth();
2169cdf0e10cSrcweir         }
2170cdf0e10cSrcweir         mpEdit->SetText( GetPageText( mnEditId ) );
2171cdf0e10cSrcweir         mpEdit->SetPosSizePixel( nX, aRect.Top()+mnOffY+1, nWidth, aRect.GetHeight()-3 );
2172cdf0e10cSrcweir         Font    aFont = GetPointFont();
2173cdf0e10cSrcweir         Color   aForegroundColor;
2174cdf0e10cSrcweir         Color   aBackgroundColor;
2175cdf0e10cSrcweir         Color   aFaceColor;
2176cdf0e10cSrcweir         Color   aSelectColor;
2177cdf0e10cSrcweir         Color   aFaceTextColor;
2178cdf0e10cSrcweir         Color   aSelectTextColor;
2179cdf0e10cSrcweir         ImplGetColors( aFaceColor, aFaceTextColor, aSelectColor, aSelectTextColor );
2180cdf0e10cSrcweir         if ( mnEditId != GetCurPageId() )
2181cdf0e10cSrcweir             aFont.SetWeight( WEIGHT_LIGHT );
2182cdf0e10cSrcweir         if ( IsPageSelected( mnEditId ) || (mnEditId == GetCurPageId()) )
2183cdf0e10cSrcweir         {
2184cdf0e10cSrcweir             aForegroundColor = aSelectTextColor;
2185cdf0e10cSrcweir             aBackgroundColor = aSelectColor;
2186cdf0e10cSrcweir         }
2187cdf0e10cSrcweir         else
2188cdf0e10cSrcweir         {
2189cdf0e10cSrcweir             aForegroundColor = aFaceTextColor;
2190cdf0e10cSrcweir             aBackgroundColor = aFaceColor;
2191cdf0e10cSrcweir         }
2192cdf0e10cSrcweir         if ( GetPageBits( mnEditId ) & TPB_SPECIAL )
2193cdf0e10cSrcweir             aForegroundColor = Color( COL_LIGHTBLUE );
2194cdf0e10cSrcweir         mpEdit->SetControlFont( aFont );
2195cdf0e10cSrcweir         mpEdit->SetControlForeground( aForegroundColor );
2196cdf0e10cSrcweir         mpEdit->SetControlBackground( aBackgroundColor );
2197cdf0e10cSrcweir         mpEdit->GrabFocus();
2198cdf0e10cSrcweir         mpEdit->SetSelection( Selection( 0, mpEdit->GetText().Len() ) );
2199cdf0e10cSrcweir         mpEdit->Show();
2200cdf0e10cSrcweir         return sal_True;
2201cdf0e10cSrcweir     }
2202cdf0e10cSrcweir     else
2203cdf0e10cSrcweir     {
2204cdf0e10cSrcweir         mnEditId = 0;
2205cdf0e10cSrcweir         return sal_False;
2206cdf0e10cSrcweir     }
2207cdf0e10cSrcweir }
2208cdf0e10cSrcweir 
2209cdf0e10cSrcweir // -----------------------------------------------------------------------
2210cdf0e10cSrcweir 
EndEditMode(sal_Bool bCancel)2211cdf0e10cSrcweir void TabBar::EndEditMode( sal_Bool bCancel )
2212cdf0e10cSrcweir {
2213cdf0e10cSrcweir     if ( mpEdit )
2214cdf0e10cSrcweir     {
2215cdf0e10cSrcweir         // call hdl
2216cdf0e10cSrcweir         sal_Bool bEnd = sal_True;
2217cdf0e10cSrcweir         mbEditCanceled = bCancel;
2218cdf0e10cSrcweir         maEditText = mpEdit->GetText();
2219cdf0e10cSrcweir         mpEdit->SetPostEvent();
2220cdf0e10cSrcweir         if ( !bCancel )
2221cdf0e10cSrcweir         {
2222cdf0e10cSrcweir             long nAllowRenaming = AllowRenaming();
2223cdf0e10cSrcweir             if ( nAllowRenaming == TABBAR_RENAMING_YES )
2224cdf0e10cSrcweir                 SetPageText( mnEditId, maEditText );
2225cdf0e10cSrcweir             else if ( nAllowRenaming == TABBAR_RENAMING_NO )
2226cdf0e10cSrcweir                 bEnd = sal_False;
2227cdf0e10cSrcweir             else // nAllowRenaming == TABBAR_RENAMING_CANCEL
2228cdf0e10cSrcweir                 mbEditCanceled = sal_True;
2229cdf0e10cSrcweir         }
2230cdf0e10cSrcweir 
2231cdf0e10cSrcweir         // renaming not allowed, than reset edit data
2232cdf0e10cSrcweir         if ( !bEnd )
2233cdf0e10cSrcweir         {
2234cdf0e10cSrcweir             mpEdit->ResetPostEvent();
2235cdf0e10cSrcweir             mpEdit->GrabFocus();
2236cdf0e10cSrcweir         }
2237cdf0e10cSrcweir         else
2238cdf0e10cSrcweir         {
2239cdf0e10cSrcweir             // close edit and call end hdl
2240cdf0e10cSrcweir             delete mpEdit;
2241cdf0e10cSrcweir             mpEdit = NULL;
2242cdf0e10cSrcweir             EndRenaming();
2243cdf0e10cSrcweir             mnEditId = 0;
2244cdf0e10cSrcweir         }
2245cdf0e10cSrcweir 
2246cdf0e10cSrcweir         // reset
2247cdf0e10cSrcweir         maEditText.Erase();
2248cdf0e10cSrcweir         mbEditCanceled = sal_False;
2249cdf0e10cSrcweir     }
2250cdf0e10cSrcweir }
2251cdf0e10cSrcweir 
2252cdf0e10cSrcweir // -----------------------------------------------------------------------
2253cdf0e10cSrcweir 
SetMirrored(sal_Bool bMirrored)2254cdf0e10cSrcweir void TabBar::SetMirrored( sal_Bool bMirrored )
2255cdf0e10cSrcweir {
2256cdf0e10cSrcweir     if( mbMirrored != bMirrored )
2257cdf0e10cSrcweir     {
2258cdf0e10cSrcweir         mbMirrored = bMirrored;
2259cdf0e10cSrcweir         mbSizeFormat = sal_True;
2260cdf0e10cSrcweir         ImplInitControls();     // for button images
2261cdf0e10cSrcweir         Resize();               // recalculates control positions
2262cdf0e10cSrcweir         Mirror();
2263cdf0e10cSrcweir     }
2264cdf0e10cSrcweir }
2265cdf0e10cSrcweir 
SetEffectiveRTL(sal_Bool bRTL)2266cdf0e10cSrcweir void TabBar::SetEffectiveRTL( sal_Bool bRTL )
2267cdf0e10cSrcweir {
2268cdf0e10cSrcweir     SetMirrored( bRTL != Application::GetSettings().GetLayoutRTL() );
2269cdf0e10cSrcweir }
2270cdf0e10cSrcweir 
IsEffectiveRTL() const2271cdf0e10cSrcweir sal_Bool TabBar::IsEffectiveRTL() const
2272cdf0e10cSrcweir {
2273cdf0e10cSrcweir     return IsMirrored() != Application::GetSettings().GetLayoutRTL();
2274cdf0e10cSrcweir }
2275cdf0e10cSrcweir 
2276cdf0e10cSrcweir // -----------------------------------------------------------------------
2277cdf0e10cSrcweir 
SetMaxPageWidth(long nMaxWidth)2278cdf0e10cSrcweir void TabBar::SetMaxPageWidth( long nMaxWidth )
2279cdf0e10cSrcweir {
2280cdf0e10cSrcweir     if ( mnMaxPageWidth != nMaxWidth )
2281cdf0e10cSrcweir     {
2282cdf0e10cSrcweir         mnMaxPageWidth = nMaxWidth;
2283cdf0e10cSrcweir         mbSizeFormat = sal_True;
2284cdf0e10cSrcweir 
2285cdf0e10cSrcweir         // Leiste neu ausgeben
2286cdf0e10cSrcweir         if ( IsReallyVisible() && IsUpdateMode() )
2287cdf0e10cSrcweir             Invalidate();
2288cdf0e10cSrcweir     }
2289cdf0e10cSrcweir }
2290cdf0e10cSrcweir 
2291cdf0e10cSrcweir // -----------------------------------------------------------------------
2292cdf0e10cSrcweir 
SetSelectColor()2293cdf0e10cSrcweir void TabBar::SetSelectColor()
2294cdf0e10cSrcweir {
2295cdf0e10cSrcweir     if ( mbSelColor )
2296cdf0e10cSrcweir     {
2297cdf0e10cSrcweir         maSelColor = Color( COL_TRANSPARENT );
2298cdf0e10cSrcweir         mbSelColor = sal_False;
2299cdf0e10cSrcweir         Invalidate();
2300cdf0e10cSrcweir     }
2301cdf0e10cSrcweir }
2302cdf0e10cSrcweir 
2303cdf0e10cSrcweir // -----------------------------------------------------------------------
2304cdf0e10cSrcweir 
SetSelectColor(const Color & rColor)2305cdf0e10cSrcweir void TabBar::SetSelectColor( const Color& rColor )
2306cdf0e10cSrcweir {
2307cdf0e10cSrcweir     if ( rColor.GetTransparency() )
2308cdf0e10cSrcweir     {
2309cdf0e10cSrcweir         if ( mbSelColor )
2310cdf0e10cSrcweir         {
2311cdf0e10cSrcweir             maSelColor = Color( COL_TRANSPARENT );
2312cdf0e10cSrcweir             mbSelColor = sal_False;
2313cdf0e10cSrcweir             Invalidate();
2314cdf0e10cSrcweir         }
2315cdf0e10cSrcweir     }
2316cdf0e10cSrcweir     else
2317cdf0e10cSrcweir     {
2318cdf0e10cSrcweir         if ( maSelColor != rColor )
2319cdf0e10cSrcweir         {
2320cdf0e10cSrcweir             maSelColor = rColor;
2321cdf0e10cSrcweir             mbSelColor = sal_True;
2322cdf0e10cSrcweir             Invalidate();
2323cdf0e10cSrcweir         }
2324cdf0e10cSrcweir     }
2325cdf0e10cSrcweir }
2326cdf0e10cSrcweir 
2327cdf0e10cSrcweir // -----------------------------------------------------------------------
2328cdf0e10cSrcweir 
SetSelectTextColor()2329cdf0e10cSrcweir void TabBar::SetSelectTextColor()
2330cdf0e10cSrcweir {
2331cdf0e10cSrcweir     if ( mbSelTextColor )
2332cdf0e10cSrcweir     {
2333cdf0e10cSrcweir         maSelTextColor = Color( COL_TRANSPARENT );
2334cdf0e10cSrcweir         mbSelTextColor = sal_False;
2335cdf0e10cSrcweir         Invalidate();
2336cdf0e10cSrcweir     }
2337cdf0e10cSrcweir }
2338cdf0e10cSrcweir 
2339cdf0e10cSrcweir // -----------------------------------------------------------------------
2340cdf0e10cSrcweir 
SetSelectTextColor(const Color & rColor)2341cdf0e10cSrcweir void TabBar::SetSelectTextColor( const Color& rColor )
2342cdf0e10cSrcweir {
2343cdf0e10cSrcweir     if ( rColor.GetTransparency() )
2344cdf0e10cSrcweir     {
2345cdf0e10cSrcweir         if ( mbSelTextColor )
2346cdf0e10cSrcweir         {
2347cdf0e10cSrcweir             maSelTextColor = Color( COL_TRANSPARENT );
2348cdf0e10cSrcweir             mbSelTextColor = sal_False;
2349cdf0e10cSrcweir             Invalidate();
2350cdf0e10cSrcweir         }
2351cdf0e10cSrcweir     }
2352cdf0e10cSrcweir     else
2353cdf0e10cSrcweir     {
2354cdf0e10cSrcweir         if ( maSelTextColor != rColor )
2355cdf0e10cSrcweir         {
2356cdf0e10cSrcweir             maSelTextColor = rColor;
2357cdf0e10cSrcweir             mbSelTextColor = sal_True;
2358cdf0e10cSrcweir             Invalidate();
2359cdf0e10cSrcweir         }
2360cdf0e10cSrcweir     }
2361cdf0e10cSrcweir }
2362cdf0e10cSrcweir 
2363cdf0e10cSrcweir // -----------------------------------------------------------------------
2364cdf0e10cSrcweir 
SetPageText(sal_uInt16 nPageId,const XubString & rText)2365cdf0e10cSrcweir void TabBar::SetPageText( sal_uInt16 nPageId, const XubString& rText )
2366cdf0e10cSrcweir {
2367cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
2368cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
2369cdf0e10cSrcweir     {
2370cdf0e10cSrcweir         mpItemList->GetObject( nPos )->maText = rText;
2371cdf0e10cSrcweir         mbSizeFormat = sal_True;
2372cdf0e10cSrcweir 
2373cdf0e10cSrcweir         // Leiste neu ausgeben
2374cdf0e10cSrcweir         if ( IsReallyVisible() && IsUpdateMode() )
2375cdf0e10cSrcweir             Invalidate();
2376cdf0e10cSrcweir 
2377cdf0e10cSrcweir 		CallEventListeners( VCLEVENT_TABBAR_PAGETEXTCHANGED, reinterpret_cast<void*>(sal::static_int_cast<sal_IntPtr>(nPageId)) );
2378cdf0e10cSrcweir     }
2379cdf0e10cSrcweir }
2380cdf0e10cSrcweir 
2381cdf0e10cSrcweir // -----------------------------------------------------------------------
2382cdf0e10cSrcweir 
GetPageText(sal_uInt16 nPageId) const2383cdf0e10cSrcweir XubString TabBar::GetPageText( sal_uInt16 nPageId ) const
2384cdf0e10cSrcweir {
2385cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
2386cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
2387cdf0e10cSrcweir         return mpItemList->GetObject( nPos )->maText;
2388cdf0e10cSrcweir     else
2389cdf0e10cSrcweir         return XubString();
2390cdf0e10cSrcweir }
2391cdf0e10cSrcweir 
2392cdf0e10cSrcweir // -----------------------------------------------------------------------
2393cdf0e10cSrcweir 
SetHelpText(sal_uInt16 nPageId,const XubString & rText)2394cdf0e10cSrcweir void TabBar::SetHelpText( sal_uInt16 nPageId, const XubString& rText )
2395cdf0e10cSrcweir {
2396cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
2397cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
2398cdf0e10cSrcweir         mpItemList->GetObject( nPos )->maHelpText = rText;
2399cdf0e10cSrcweir }
2400cdf0e10cSrcweir 
2401cdf0e10cSrcweir // -----------------------------------------------------------------------
2402cdf0e10cSrcweir 
GetHelpText(sal_uInt16 nPageId) const2403cdf0e10cSrcweir XubString TabBar::GetHelpText( sal_uInt16 nPageId ) const
2404cdf0e10cSrcweir {
2405cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
2406cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
2407cdf0e10cSrcweir     {
2408cdf0e10cSrcweir         ImplTabBarItem* pItem = mpItemList->GetObject( nPos );
2409cdf0e10cSrcweir         if ( !pItem->maHelpText.Len() && pItem->maHelpId.getLength() )
2410cdf0e10cSrcweir         {
2411cdf0e10cSrcweir             Help* pHelp = Application::GetHelp();
2412cdf0e10cSrcweir             if ( pHelp )
2413cdf0e10cSrcweir                 pItem->maHelpText = pHelp->GetHelpText( rtl::OStringToOUString( pItem->maHelpId, RTL_TEXTENCODING_UTF8 ), this );
2414cdf0e10cSrcweir         }
2415cdf0e10cSrcweir 
2416cdf0e10cSrcweir         return pItem->maHelpText;
2417cdf0e10cSrcweir     }
2418cdf0e10cSrcweir     else
2419cdf0e10cSrcweir         return XubString();
2420cdf0e10cSrcweir }
2421cdf0e10cSrcweir 
2422cdf0e10cSrcweir // -----------------------------------------------------------------------
2423cdf0e10cSrcweir 
SetHelpId(sal_uInt16 nPageId,const rtl::OString & rHelpId)2424cdf0e10cSrcweir void TabBar::SetHelpId( sal_uInt16 nPageId, const rtl::OString& rHelpId )
2425cdf0e10cSrcweir {
2426cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
2427cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
2428cdf0e10cSrcweir         mpItemList->GetObject( nPos )->maHelpId = rHelpId;
2429cdf0e10cSrcweir }
2430cdf0e10cSrcweir 
2431cdf0e10cSrcweir // -----------------------------------------------------------------------
2432cdf0e10cSrcweir 
GetHelpId(sal_uInt16 nPageId) const2433cdf0e10cSrcweir rtl::OString TabBar::GetHelpId( sal_uInt16 nPageId ) const
2434cdf0e10cSrcweir {
2435cdf0e10cSrcweir     sal_uInt16 nPos = GetPagePos( nPageId );
2436cdf0e10cSrcweir     rtl::OString aRet;
2437cdf0e10cSrcweir     if ( nPos != PAGE_NOT_FOUND )
2438cdf0e10cSrcweir         aRet = mpItemList->GetObject( nPos )->maHelpId;
2439cdf0e10cSrcweir     return aRet;
2440cdf0e10cSrcweir }
2441cdf0e10cSrcweir 
2442cdf0e10cSrcweir // -----------------------------------------------------------------------
2443cdf0e10cSrcweir 
GetMinSize() const2444cdf0e10cSrcweir long TabBar::GetMinSize() const
2445cdf0e10cSrcweir {
2446cdf0e10cSrcweir     long nMinSize = TABBAR_MINSIZE + TABBAR_OFFSET_X;
2447cdf0e10cSrcweir     if ( mnWinStyle & WB_MINSCROLL )
2448cdf0e10cSrcweir         nMinSize += mpPrevBtn->GetSizePixel().Width()*2;
2449cdf0e10cSrcweir     else if ( mnWinStyle & WB_SCROLL )
2450cdf0e10cSrcweir         nMinSize += mpFirstBtn->GetSizePixel().Width()*4;
2451cdf0e10cSrcweir     return nMinSize;
2452cdf0e10cSrcweir }
2453cdf0e10cSrcweir 
2454cdf0e10cSrcweir // -----------------------------------------------------------------------
2455cdf0e10cSrcweir 
StartDrag(const CommandEvent & rCEvt,Region & rRegion)2456cdf0e10cSrcweir sal_Bool TabBar::StartDrag( const CommandEvent& rCEvt, Region& rRegion )
2457cdf0e10cSrcweir {
2458cdf0e10cSrcweir     if ( !(mnWinStyle & WB_DRAG) || (rCEvt.GetCommand() != COMMAND_STARTDRAG) )
2459cdf0e10cSrcweir         return sal_False;
2460cdf0e10cSrcweir 
2461cdf0e10cSrcweir     // Testen, ob angeklickte Seite selektiert ist. Falls dies nicht
2462cdf0e10cSrcweir     // der Fall ist, setzen wir ihn als aktuellen Eintrag. Falls Drag and
2463cdf0e10cSrcweir     // Drop auch mal ueber Tastatur ausgeloest werden kann, testen wir
2464cdf0e10cSrcweir     // dies nur bei einer Mausaktion.
2465cdf0e10cSrcweir     // Ausserdem machen wir das nur, wenn kein Select() ausgeloest wurde,
2466cdf0e10cSrcweir     // da der Select schon den Bereich gescrollt haben kann
2467cdf0e10cSrcweir     if ( rCEvt.IsMouseEvent() && !mbInSelect )
2468cdf0e10cSrcweir     {
2469cdf0e10cSrcweir         sal_uInt16 nSelId = GetPageId( rCEvt.GetMousePosPixel() );
2470cdf0e10cSrcweir 
2471cdf0e10cSrcweir         // Falls kein Eintrag angeklickt wurde, starten wir kein Dragging
2472cdf0e10cSrcweir         if ( !nSelId )
2473cdf0e10cSrcweir             return sal_False;
2474cdf0e10cSrcweir 
2475cdf0e10cSrcweir         // Testen, ob Seite selektiertiert ist. Falls nicht, als aktuelle
2476cdf0e10cSrcweir         // Seite setzen und Select rufen.
2477cdf0e10cSrcweir         if ( !IsPageSelected( nSelId ) )
2478cdf0e10cSrcweir         {
2479cdf0e10cSrcweir             if ( ImplDeactivatePage() )
2480cdf0e10cSrcweir             {
2481cdf0e10cSrcweir                 SetCurPageId( nSelId );
2482cdf0e10cSrcweir                 Update();
2483cdf0e10cSrcweir                 ImplActivatePage();
2484cdf0e10cSrcweir                 ImplSelect();
2485cdf0e10cSrcweir             }
2486cdf0e10cSrcweir             else
2487cdf0e10cSrcweir                 return sal_False;
2488cdf0e10cSrcweir         }
2489cdf0e10cSrcweir     }
2490cdf0e10cSrcweir     mbInSelect = sal_False;
2491cdf0e10cSrcweir 
2492cdf0e10cSrcweir     Region aRegion;
2493cdf0e10cSrcweir 
2494cdf0e10cSrcweir     // Region zuweisen
2495cdf0e10cSrcweir     rRegion = aRegion;
2496cdf0e10cSrcweir 
2497cdf0e10cSrcweir     return sal_True;
2498cdf0e10cSrcweir }
2499cdf0e10cSrcweir 
2500cdf0e10cSrcweir // -----------------------------------------------------------------------
2501cdf0e10cSrcweir 
ShowDropPos(const Point & rPos)2502cdf0e10cSrcweir sal_uInt16 TabBar::ShowDropPos( const Point& rPos )
2503cdf0e10cSrcweir {
2504cdf0e10cSrcweir     ImplTabBarItem* pItem;
2505cdf0e10cSrcweir     sal_uInt16      nDropId;
2506cdf0e10cSrcweir     sal_uInt16      nNewDropPos;
2507cdf0e10cSrcweir     sal_uInt16      nItemCount = (sal_uInt16)mpItemList->Count();
2508cdf0e10cSrcweir     short       nScroll = 0;
2509cdf0e10cSrcweir 
2510cdf0e10cSrcweir     if ( rPos.X() > mnLastOffX-TABBAR_DRAG_SCROLLOFF )
2511cdf0e10cSrcweir     {
2512cdf0e10cSrcweir         pItem = mpItemList->GetObject( mpItemList->Count()-1 );
2513cdf0e10cSrcweir         if ( !pItem->maRect.IsEmpty() && (rPos.X() > pItem->maRect.Right()) )
2514cdf0e10cSrcweir             nNewDropPos = (sal_uInt16)mpItemList->Count();
2515cdf0e10cSrcweir         else
2516cdf0e10cSrcweir         {
2517cdf0e10cSrcweir             nNewDropPos = mnFirstPos+1;
2518cdf0e10cSrcweir             nScroll = 1;
2519cdf0e10cSrcweir         }
2520cdf0e10cSrcweir     }
2521cdf0e10cSrcweir     else if ( (rPos.X() <= mnOffX) ||
2522cdf0e10cSrcweir               (!mnOffX && (rPos.X() <= TABBAR_DRAG_SCROLLOFF)) )
2523cdf0e10cSrcweir     {
2524cdf0e10cSrcweir         if ( mnFirstPos )
2525cdf0e10cSrcweir         {
2526cdf0e10cSrcweir             nNewDropPos = mnFirstPos;
2527cdf0e10cSrcweir             nScroll = -1;
2528cdf0e10cSrcweir         }
2529cdf0e10cSrcweir         else
2530cdf0e10cSrcweir             nNewDropPos = 0;
2531cdf0e10cSrcweir     }
2532cdf0e10cSrcweir     else
2533cdf0e10cSrcweir     {
2534cdf0e10cSrcweir         nDropId = GetPageId( rPos );
2535cdf0e10cSrcweir         if ( nDropId )
2536cdf0e10cSrcweir         {
2537cdf0e10cSrcweir             nNewDropPos = GetPagePos( nDropId );
2538cdf0e10cSrcweir             if ( mnFirstPos && (nNewDropPos == mnFirstPos-1) )
2539cdf0e10cSrcweir                 nScroll = -1;
2540cdf0e10cSrcweir         }
2541cdf0e10cSrcweir         else
2542cdf0e10cSrcweir             nNewDropPos = nItemCount;
2543cdf0e10cSrcweir     }
2544cdf0e10cSrcweir 
2545cdf0e10cSrcweir     if ( mbDropPos && (nNewDropPos == mnDropPos) && !nScroll )
2546cdf0e10cSrcweir         return mnDropPos;
2547cdf0e10cSrcweir 
2548cdf0e10cSrcweir     if ( mbDropPos )
2549cdf0e10cSrcweir         HideDropPos();
2550cdf0e10cSrcweir     mbDropPos = sal_True;
2551cdf0e10cSrcweir     mnDropPos = nNewDropPos;
2552cdf0e10cSrcweir 
2553cdf0e10cSrcweir     if ( nScroll )
2554cdf0e10cSrcweir     {
2555cdf0e10cSrcweir         sal_uInt16 nOldFirstPos = mnFirstPos;
2556cdf0e10cSrcweir         SetFirstPageId( GetPageId( mnFirstPos+nScroll ) );
2557cdf0e10cSrcweir 
2558cdf0e10cSrcweir         // Direkt ausgeben, da kein Paint bei Drag and Drop moeglich
2559cdf0e10cSrcweir         if ( nOldFirstPos != mnFirstPos )
2560cdf0e10cSrcweir         {
2561cdf0e10cSrcweir             Rectangle aRect( mnOffX, 0, mnLastOffX, maWinSize.Height() );
2562cdf0e10cSrcweir             SetFillColor( GetBackground().GetColor() );
2563cdf0e10cSrcweir             DrawRect( aRect );
2564cdf0e10cSrcweir             Paint( aRect );
2565cdf0e10cSrcweir         }
2566cdf0e10cSrcweir     }
2567cdf0e10cSrcweir 
2568cdf0e10cSrcweir     // Drop-Position-Pfeile ausgeben
2569cdf0e10cSrcweir     Color       aBlackColor( COL_BLACK );
2570cdf0e10cSrcweir     long        nX;
2571cdf0e10cSrcweir     long        nY = (maWinSize.Height()/2)-1;
2572cdf0e10cSrcweir     sal_uInt16      nCurPos = GetPagePos( mnCurPageId );
2573cdf0e10cSrcweir 
2574cdf0e10cSrcweir     SetLineColor( aBlackColor );
2575cdf0e10cSrcweir     if ( mnDropPos < nItemCount )
2576cdf0e10cSrcweir     {
2577cdf0e10cSrcweir         pItem = mpItemList->GetObject( mnDropPos );
2578cdf0e10cSrcweir         nX = pItem->maRect.Left()+TABBAR_OFFSET_X;
2579cdf0e10cSrcweir         if ( mnDropPos == nCurPos )
2580cdf0e10cSrcweir             nX--;
2581cdf0e10cSrcweir         else
2582cdf0e10cSrcweir             nX++;
2583cdf0e10cSrcweir         if ( !pItem->IsDefaultTabBgColor() && !pItem->mbSelect)
2584cdf0e10cSrcweir             SetLineColor( pItem->maTabTextColor );
2585cdf0e10cSrcweir         DrawLine( Point( nX, nY ), Point( nX, nY ) );
2586cdf0e10cSrcweir         DrawLine( Point( nX+1, nY-1 ), Point( nX+1, nY+1 ) );
2587cdf0e10cSrcweir         DrawLine( Point( nX+2, nY-2 ), Point( nX+2, nY+2 ) );
2588cdf0e10cSrcweir         SetLineColor( aBlackColor );
2589cdf0e10cSrcweir     }
2590cdf0e10cSrcweir     if ( (mnDropPos > 0) && (mnDropPos < nItemCount+1) )
2591cdf0e10cSrcweir     {
2592cdf0e10cSrcweir         pItem = mpItemList->GetObject( mnDropPos-1 );
2593cdf0e10cSrcweir         nX = pItem->maRect.Right()-TABBAR_OFFSET_X;
2594cdf0e10cSrcweir         if ( mnDropPos == nCurPos )
2595cdf0e10cSrcweir             nX++;
2596cdf0e10cSrcweir         if ( !pItem->IsDefaultTabBgColor() && !pItem->mbSelect)
2597cdf0e10cSrcweir             SetLineColor( pItem->maTabTextColor );
2598cdf0e10cSrcweir         DrawLine( Point( nX, nY ), Point( nX, nY ) );
2599cdf0e10cSrcweir         DrawLine( Point( nX-1, nY-1 ), Point( nX-1, nY+1 ) );
2600cdf0e10cSrcweir         DrawLine( Point( nX-2, nY-2 ), Point( nX-2, nY+2 ) );
2601cdf0e10cSrcweir     }
2602cdf0e10cSrcweir 
2603cdf0e10cSrcweir     return mnDropPos;
2604cdf0e10cSrcweir }
2605cdf0e10cSrcweir 
2606cdf0e10cSrcweir // -----------------------------------------------------------------------
2607cdf0e10cSrcweir 
HideDropPos()2608cdf0e10cSrcweir void TabBar::HideDropPos()
2609cdf0e10cSrcweir {
2610cdf0e10cSrcweir     if ( mbDropPos )
2611cdf0e10cSrcweir     {
2612cdf0e10cSrcweir         ImplTabBarItem* pItem;
2613cdf0e10cSrcweir         long        nX;
2614cdf0e10cSrcweir         long        nY1 = (maWinSize.Height()/2)-3;
2615cdf0e10cSrcweir         long        nY2 = nY1 + 5;
2616cdf0e10cSrcweir         sal_uInt16      nItemCount = (sal_uInt16)mpItemList->Count();
2617cdf0e10cSrcweir 
2618cdf0e10cSrcweir         if ( mnDropPos < nItemCount )
2619cdf0e10cSrcweir         {
2620cdf0e10cSrcweir             pItem = mpItemList->GetObject( mnDropPos );
2621cdf0e10cSrcweir             nX = pItem->maRect.Left()+TABBAR_OFFSET_X;
2622cdf0e10cSrcweir             // Paint direkt aufrufen, da bei Drag and Drop kein Paint
2623cdf0e10cSrcweir             // moeglich
2624cdf0e10cSrcweir             Rectangle aRect( nX-1, nY1, nX+3, nY2 );
2625cdf0e10cSrcweir             Region aRegion( aRect );
2626cdf0e10cSrcweir             SetClipRegion( aRegion );
2627cdf0e10cSrcweir             Paint( aRect );
2628cdf0e10cSrcweir             SetClipRegion();
2629cdf0e10cSrcweir         }
2630cdf0e10cSrcweir         if ( (mnDropPos > 0) && (mnDropPos < nItemCount+1) )
2631cdf0e10cSrcweir         {
2632cdf0e10cSrcweir             pItem = mpItemList->GetObject( mnDropPos-1 );
2633cdf0e10cSrcweir             nX = pItem->maRect.Right()-TABBAR_OFFSET_X;
2634cdf0e10cSrcweir             // Paint direkt aufrufen, da bei Drag and Drop kein Paint
2635cdf0e10cSrcweir             // moeglich
2636cdf0e10cSrcweir             Rectangle aRect( nX-2, nY1, nX+1, nY2 );
2637cdf0e10cSrcweir             Region aRegion( aRect );
2638cdf0e10cSrcweir             SetClipRegion( aRegion );
2639cdf0e10cSrcweir             Paint( aRect );
2640cdf0e10cSrcweir             SetClipRegion();
2641cdf0e10cSrcweir         }
2642cdf0e10cSrcweir 
2643cdf0e10cSrcweir         mbDropPos = sal_False;
2644cdf0e10cSrcweir         mnDropPos = 0;
2645cdf0e10cSrcweir     }
2646cdf0e10cSrcweir }
2647cdf0e10cSrcweir 
2648cdf0e10cSrcweir // -----------------------------------------------------------------------
2649cdf0e10cSrcweir 
SwitchPage(const Point & rPos)2650cdf0e10cSrcweir sal_Bool TabBar::SwitchPage( const Point& rPos )
2651cdf0e10cSrcweir {
2652cdf0e10cSrcweir     sal_Bool    bSwitch = sal_False;
2653cdf0e10cSrcweir     sal_uInt16  nSwitchId = GetPageId( rPos );
2654cdf0e10cSrcweir     if ( !nSwitchId )
2655cdf0e10cSrcweir         EndSwitchPage();
2656cdf0e10cSrcweir     else
2657cdf0e10cSrcweir     {
2658cdf0e10cSrcweir         if ( nSwitchId != mnSwitchId )
2659cdf0e10cSrcweir         {
2660cdf0e10cSrcweir             mnSwitchId = nSwitchId;
2661cdf0e10cSrcweir             mnSwitchTime = Time::GetSystemTicks();
2662cdf0e10cSrcweir         }
2663cdf0e10cSrcweir         else
2664cdf0e10cSrcweir         {
2665cdf0e10cSrcweir             // Erst nach 500 ms umschalten
2666cdf0e10cSrcweir             if ( mnSwitchId != GetCurPageId() )
2667cdf0e10cSrcweir             {
2668cdf0e10cSrcweir                 if ( Time::GetSystemTicks() > mnSwitchTime+500 )
2669cdf0e10cSrcweir                 {
2670cdf0e10cSrcweir                     mbInSwitching = sal_True;
2671cdf0e10cSrcweir                     if ( ImplDeactivatePage() )
2672cdf0e10cSrcweir                     {
2673cdf0e10cSrcweir                         SetCurPageId( mnSwitchId );
2674cdf0e10cSrcweir                         Update();
2675cdf0e10cSrcweir                         ImplActivatePage();
2676cdf0e10cSrcweir                         ImplSelect();
2677cdf0e10cSrcweir                         bSwitch = sal_True;
2678cdf0e10cSrcweir                     }
2679cdf0e10cSrcweir                     mbInSwitching = sal_False;
2680cdf0e10cSrcweir                 }
2681cdf0e10cSrcweir             }
2682cdf0e10cSrcweir         }
2683cdf0e10cSrcweir     }
2684cdf0e10cSrcweir 
2685cdf0e10cSrcweir     return bSwitch;
2686cdf0e10cSrcweir }
2687cdf0e10cSrcweir 
2688cdf0e10cSrcweir // -----------------------------------------------------------------------
2689cdf0e10cSrcweir 
EndSwitchPage()2690cdf0e10cSrcweir void TabBar::EndSwitchPage()
2691cdf0e10cSrcweir {
2692cdf0e10cSrcweir     mnSwitchTime    = 0;
2693cdf0e10cSrcweir     mnSwitchId      = 0;
2694cdf0e10cSrcweir }
2695cdf0e10cSrcweir 
2696cdf0e10cSrcweir // -----------------------------------------------------------------------
2697cdf0e10cSrcweir 
SetStyle(WinBits nStyle)2698cdf0e10cSrcweir void TabBar::SetStyle( WinBits nStyle )
2699cdf0e10cSrcweir {
2700cdf0e10cSrcweir     mnWinStyle = nStyle;
2701cdf0e10cSrcweir     ImplInitControls();
2702cdf0e10cSrcweir     // Evt. Controls neu anordnen
2703cdf0e10cSrcweir     if ( IsReallyVisible() && IsUpdateMode() )
2704cdf0e10cSrcweir         Resize();
2705cdf0e10cSrcweir }
2706cdf0e10cSrcweir 
2707cdf0e10cSrcweir // -----------------------------------------------------------------------
2708cdf0e10cSrcweir 
CalcWindowSizePixel() const2709cdf0e10cSrcweir Size TabBar::CalcWindowSizePixel() const
2710cdf0e10cSrcweir {
2711cdf0e10cSrcweir     long nWidth = 0;
2712cdf0e10cSrcweir 
2713cdf0e10cSrcweir     if ( mpItemList->Count() )
2714cdf0e10cSrcweir     {
2715cdf0e10cSrcweir         ((TabBar*)this)->ImplCalcWidth();
2716cdf0e10cSrcweir         ImplTabBarItem* pItem = mpItemList->First();
2717cdf0e10cSrcweir         while ( pItem )
2718cdf0e10cSrcweir         {
2719cdf0e10cSrcweir             nWidth += pItem->mnWidth;
2720cdf0e10cSrcweir             pItem = mpItemList->Next();
2721cdf0e10cSrcweir         }
2722cdf0e10cSrcweir         nWidth += TABBAR_OFFSET_X+TABBAR_OFFSET_X2;
2723cdf0e10cSrcweir     }
2724cdf0e10cSrcweir 
2725cdf0e10cSrcweir     return Size( nWidth, GetSettings().GetStyleSettings().GetScrollBarSize() );
2726cdf0e10cSrcweir }
2727cdf0e10cSrcweir // -----------------------------------------------------------------------
2728cdf0e10cSrcweir 
GetPageArea() const2729cdf0e10cSrcweir Rectangle TabBar::GetPageArea() const
2730cdf0e10cSrcweir {
2731cdf0e10cSrcweir     return Rectangle( Point( mnOffX, mnOffY ), Size( mnLastOffX-mnOffX+1, GetSizePixel().Height()-mnOffY ) );
2732cdf0e10cSrcweir }
2733cdf0e10cSrcweir 
2734cdf0e10cSrcweir // -----------------------------------------------------------------------
2735cdf0e10cSrcweir 
CreateAccessible()2736cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > TabBar::CreateAccessible()
2737cdf0e10cSrcweir {
2738cdf0e10cSrcweir     return mpImpl->maAccessibleFactory.getFactory().createAccessibleTabBar( *this );
2739cdf0e10cSrcweir }
2740cdf0e10cSrcweir 
2741cdf0e10cSrcweir // -----------------------------------------------------------------------
2742