xref: /trunk/main/svtools/source/control/headbar.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
15900e8ecSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
35900e8ecSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
45900e8ecSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
55900e8ecSAndrew Rist  * distributed with this work for additional information
65900e8ecSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
75900e8ecSAndrew Rist  * to you under the Apache License, Version 2.0 (the
85900e8ecSAndrew Rist  * "License"); you may not use this file except in compliance
95900e8ecSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
115900e8ecSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
135900e8ecSAndrew Rist  * Unless required by applicable law or agreed to in writing,
145900e8ecSAndrew Rist  * software distributed under the License is distributed on an
155900e8ecSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
165900e8ecSAndrew Rist  * KIND, either express or implied.  See the License for the
175900e8ecSAndrew Rist  * specific language governing permissions and limitations
185900e8ecSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
205900e8ecSAndrew Rist  *************************************************************/
215900e8ecSAndrew Rist 
225900e8ecSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svtools.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #define _SV_HEADBAR_CXX
28cdf0e10cSrcweir #include <svtools/headbar.hxx>
29cdf0e10cSrcweir #include <tools/debug.hxx>
30cdf0e10cSrcweir #ifndef _TOOLS_LIST_HXX
31cdf0e10cSrcweir #include <tools/list.hxx>
32cdf0e10cSrcweir #endif
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #ifndef _VCL_APP_HXX
35cdf0e10cSrcweir #include <vcl/svapp.hxx>
36cdf0e10cSrcweir #endif
37cdf0e10cSrcweir #ifndef _VCL_HELP_HXX
38cdf0e10cSrcweir #include <vcl/help.hxx>
39cdf0e10cSrcweir #endif
40cdf0e10cSrcweir #ifndef _VCL_IMAGE_HXX
41cdf0e10cSrcweir #include <vcl/image.hxx>
42cdf0e10cSrcweir #endif
43cdf0e10cSrcweir #include <com/sun/star/accessibility/XAccessible.hpp>
44cdf0e10cSrcweir 
452bfcd321SSteve Yin #include <com/sun/star/accessibility/AccessibleRole.hpp>
462bfcd321SSteve Yin #include <vclxaccessibleheaderbar.hxx>
47cdf0e10cSrcweir // =======================================================================
48cdf0e10cSrcweir 
49cdf0e10cSrcweir struct ImplHeadItem
50cdf0e10cSrcweir {
51cdf0e10cSrcweir     sal_uInt16              mnId;
52cdf0e10cSrcweir     HeaderBarItemBits   mnBits;
53cdf0e10cSrcweir     long                mnSize;
54cdf0e10cSrcweir     rtl::OString        maHelpId;
55cdf0e10cSrcweir     Image               maImage;
56cdf0e10cSrcweir     XubString           maOutText;
57cdf0e10cSrcweir     XubString           maText;
58cdf0e10cSrcweir     XubString           maHelpText;
59cdf0e10cSrcweir     void*               mpUserData;
60cdf0e10cSrcweir };
61cdf0e10cSrcweir 
DECLARE_LIST(ImplHeadItemList,ImplHeadItem *)62cdf0e10cSrcweir DECLARE_LIST( ImplHeadItemList, ImplHeadItem* )
63cdf0e10cSrcweir 
64cdf0e10cSrcweir // =======================================================================
65cdf0e10cSrcweir 
66cdf0e10cSrcweir #define HEAD_ARROWSIZE1             4
67cdf0e10cSrcweir #define HEAD_ARROWSIZE2             7
68cdf0e10cSrcweir 
69cdf0e10cSrcweir #define HEADERBAR_TEXTOFF           2
70cdf0e10cSrcweir #define HEADERBAR_ARROWOFF          5
71cdf0e10cSrcweir #define HEADERBAR_SPLITOFF          3
72cdf0e10cSrcweir 
73cdf0e10cSrcweir #define HEADERBAR_DRAGOFF           4
74cdf0e10cSrcweir #define HEADERBAR_DRAGOUTOFF        15
75cdf0e10cSrcweir 
76cdf0e10cSrcweir #define HEAD_HITTEST_ITEM           ((sal_uInt16)0x0001)
77cdf0e10cSrcweir #define HEAD_HITTEST_DIVIDER        ((sal_uInt16)0x0002)
78cdf0e10cSrcweir 
79cdf0e10cSrcweir // =======================================================================
80cdf0e10cSrcweir 
81cdf0e10cSrcweir void HeaderBar::ImplInit( WinBits nWinStyle )
82cdf0e10cSrcweir {
83cdf0e10cSrcweir     mpItemList      = new ImplHeadItemList;
84cdf0e10cSrcweir     mnBorderOff1    = 0;
85cdf0e10cSrcweir     mnBorderOff2    = 0;
86cdf0e10cSrcweir     mnOffset        = 0;
87cdf0e10cSrcweir     mnDX            = 0;
88cdf0e10cSrcweir     mnDY            = 0;
89cdf0e10cSrcweir     mnDragSize      = 0;
90cdf0e10cSrcweir     mnStartPos      = 0;
91cdf0e10cSrcweir     mnDragPos       = 0;
92cdf0e10cSrcweir     mnMouseOff      = 0;
93cdf0e10cSrcweir     mnCurItemId     = 0;
94cdf0e10cSrcweir     mnItemDragPos   = HEADERBAR_ITEM_NOTFOUND;
95cdf0e10cSrcweir     mbDrag          = sal_False;
96cdf0e10cSrcweir     mbItemDrag      = sal_False;
97cdf0e10cSrcweir     mbOutDrag       = sal_False;
98cdf0e10cSrcweir     mbItemMode      = sal_False;
99cdf0e10cSrcweir 
1002bfcd321SSteve Yin     m_pVCLXHeaderBar = NULL;
101cdf0e10cSrcweir     // StyleBits auswerten
102cdf0e10cSrcweir     if ( nWinStyle & WB_DRAG )
103cdf0e10cSrcweir         mbDragable = sal_True;
104cdf0e10cSrcweir     else
105cdf0e10cSrcweir         mbDragable = sal_False;
106cdf0e10cSrcweir     if ( nWinStyle & WB_BUTTONSTYLE )
107cdf0e10cSrcweir         mbButtonStyle = sal_True;
108cdf0e10cSrcweir     else
109cdf0e10cSrcweir         mbButtonStyle = sal_False;
110cdf0e10cSrcweir     if ( nWinStyle & WB_BORDER )
111cdf0e10cSrcweir     {
112cdf0e10cSrcweir         mnBorderOff1 = 1;
113cdf0e10cSrcweir         mnBorderOff2 = 1;
114cdf0e10cSrcweir     }
115cdf0e10cSrcweir     else
116cdf0e10cSrcweir     {
117cdf0e10cSrcweir         if ( nWinStyle & WB_BOTTOMBORDER )
118cdf0e10cSrcweir             mnBorderOff2 = 1;
119cdf0e10cSrcweir     }
120cdf0e10cSrcweir 
121cdf0e10cSrcweir     ImplInitSettings( sal_True, sal_True, sal_True );
1222bfcd321SSteve Yin     //SetAccessibleRole(com::sun::star::accessibility::AccessibleRole::COLUMN_HEADER);
123cdf0e10cSrcweir }
124cdf0e10cSrcweir 
125cdf0e10cSrcweir // -----------------------------------------------------------------------
126cdf0e10cSrcweir 
HeaderBar(Window * pParent,WinBits nWinStyle)127cdf0e10cSrcweir HeaderBar::HeaderBar( Window* pParent, WinBits nWinStyle ) :
128cdf0e10cSrcweir     Window( pParent, nWinStyle & WB_3DLOOK )
129cdf0e10cSrcweir {
130cdf0e10cSrcweir     ImplInit( nWinStyle );
131cdf0e10cSrcweir     SetSizePixel( CalcWindowSizePixel() );
132cdf0e10cSrcweir }
133cdf0e10cSrcweir 
134cdf0e10cSrcweir // -----------------------------------------------------------------------
135cdf0e10cSrcweir 
HeaderBar(Window * pParent,const ResId & rResId)136cdf0e10cSrcweir HeaderBar::HeaderBar( Window* pParent, const ResId& rResId ) :
137cdf0e10cSrcweir     Window( pParent, rResId )
138cdf0e10cSrcweir {
139cdf0e10cSrcweir     ImplInit( rResId.GetWinBits() );
140cdf0e10cSrcweir }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir // -----------------------------------------------------------------------
143cdf0e10cSrcweir 
~HeaderBar()144cdf0e10cSrcweir HeaderBar::~HeaderBar()
145cdf0e10cSrcweir {
146cdf0e10cSrcweir     // Alle Items loeschen
147cdf0e10cSrcweir     ImplHeadItem* pItem = mpItemList->First();
148cdf0e10cSrcweir     while ( pItem )
149cdf0e10cSrcweir     {
150cdf0e10cSrcweir         delete pItem;
151cdf0e10cSrcweir         pItem = mpItemList->Next();
152cdf0e10cSrcweir     }
153cdf0e10cSrcweir 
154cdf0e10cSrcweir     delete mpItemList;
155cdf0e10cSrcweir }
156cdf0e10cSrcweir 
157cdf0e10cSrcweir // -----------------------------------------------------------------------
158cdf0e10cSrcweir 
ImplInitSettings(sal_Bool bFont,sal_Bool bForeground,sal_Bool bBackground)159cdf0e10cSrcweir void HeaderBar::ImplInitSettings( sal_Bool bFont,
160cdf0e10cSrcweir                                   sal_Bool bForeground, sal_Bool bBackground )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
163cdf0e10cSrcweir 
164cdf0e10cSrcweir     if ( bFont )
165cdf0e10cSrcweir     {
166cdf0e10cSrcweir         Font aFont;
167cdf0e10cSrcweir         aFont = rStyleSettings.GetToolFont();
168cdf0e10cSrcweir         if ( IsControlFont() )
169cdf0e10cSrcweir             aFont.Merge( GetControlFont() );
170cdf0e10cSrcweir         SetZoomedPointFont( aFont );
171cdf0e10cSrcweir     }
172cdf0e10cSrcweir 
173cdf0e10cSrcweir     if ( bForeground || bFont )
174cdf0e10cSrcweir     {
175cdf0e10cSrcweir         Color aColor;
176cdf0e10cSrcweir         if ( IsControlForeground() )
177cdf0e10cSrcweir             aColor = GetControlForeground();
178cdf0e10cSrcweir         else
179cdf0e10cSrcweir             aColor = rStyleSettings.GetButtonTextColor();
180cdf0e10cSrcweir         SetTextColor( aColor );
181cdf0e10cSrcweir         SetTextFillColor();
182cdf0e10cSrcweir     }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir     if ( bBackground )
185cdf0e10cSrcweir     {
186cdf0e10cSrcweir         Color aColor;
187cdf0e10cSrcweir         if ( IsControlBackground() )
188cdf0e10cSrcweir             aColor = GetControlBackground();
189cdf0e10cSrcweir         else
190cdf0e10cSrcweir             aColor = rStyleSettings.GetFaceColor();
191cdf0e10cSrcweir         SetBackground( aColor );
192cdf0e10cSrcweir     }
193cdf0e10cSrcweir }
194cdf0e10cSrcweir 
195cdf0e10cSrcweir // -----------------------------------------------------------------------
196cdf0e10cSrcweir 
ImplGetItemPos(sal_uInt16 nPos) const197cdf0e10cSrcweir long HeaderBar::ImplGetItemPos( sal_uInt16 nPos ) const
198cdf0e10cSrcweir {
199cdf0e10cSrcweir     long nX = -mnOffset;
200cdf0e10cSrcweir     for ( sal_uInt16 i = 0; i < nPos; i++ )
201cdf0e10cSrcweir         nX += mpItemList->GetObject( i )->mnSize;
202cdf0e10cSrcweir     return nX;
203cdf0e10cSrcweir }
204cdf0e10cSrcweir 
205cdf0e10cSrcweir // -----------------------------------------------------------------------
206cdf0e10cSrcweir 
ImplGetItemRect(sal_uInt16 nPos) const207cdf0e10cSrcweir Rectangle HeaderBar::ImplGetItemRect( sal_uInt16 nPos ) const
208cdf0e10cSrcweir {
209cdf0e10cSrcweir     Rectangle aRect( ImplGetItemPos( nPos ), 0, 0, mnDY-1 );
210cdf0e10cSrcweir     aRect.Right() = aRect.Left() + mpItemList->GetObject( nPos )->mnSize - 1;
211cdf0e10cSrcweir     // Gegen Ueberlauf auf einigen Systemen testen
212cdf0e10cSrcweir     if ( aRect.Right() > 16000 )
213cdf0e10cSrcweir         aRect.Right() = 16000;
214cdf0e10cSrcweir     return aRect;
215cdf0e10cSrcweir }
216cdf0e10cSrcweir 
217cdf0e10cSrcweir // -----------------------------------------------------------------------
218cdf0e10cSrcweir 
ImplHitTest(const Point & rPos,long & nMouseOff,sal_uInt16 & nPos) const219cdf0e10cSrcweir sal_uInt16 HeaderBar::ImplHitTest( const Point& rPos,
220cdf0e10cSrcweir                                long& nMouseOff, sal_uInt16& nPos ) const
221cdf0e10cSrcweir {
222cdf0e10cSrcweir     ImplHeadItem*   pItem;
223cdf0e10cSrcweir     sal_uInt16          nCount = (sal_uInt16)mpItemList->Count();
224cdf0e10cSrcweir     sal_Bool            bLastFixed = sal_True;
225cdf0e10cSrcweir     long            nX = -mnOffset;
226cdf0e10cSrcweir 
227cdf0e10cSrcweir     for ( sal_uInt16 i = 0; i < nCount; i++ )
228cdf0e10cSrcweir     {
229cdf0e10cSrcweir         pItem = mpItemList->GetObject( i );
230cdf0e10cSrcweir 
231cdf0e10cSrcweir         if ( rPos.X() < (nX+pItem->mnSize) )
232cdf0e10cSrcweir         {
233cdf0e10cSrcweir             sal_uInt16 nMode;
234cdf0e10cSrcweir 
235cdf0e10cSrcweir             if ( !bLastFixed && (rPos.X() < (nX+HEADERBAR_SPLITOFF)) )
236cdf0e10cSrcweir             {
237cdf0e10cSrcweir                 nMode = HEAD_HITTEST_DIVIDER;
238cdf0e10cSrcweir                 nPos = i-1;
239cdf0e10cSrcweir                 nMouseOff = rPos.X()-nX+1;
240cdf0e10cSrcweir             }
241cdf0e10cSrcweir             else
242cdf0e10cSrcweir             {
243cdf0e10cSrcweir                 nPos = i;
244cdf0e10cSrcweir 
245cdf0e10cSrcweir                 if ( !(pItem->mnBits & HIB_FIXED) && (rPos.X() >= (nX+pItem->mnSize-HEADERBAR_SPLITOFF)) )
246cdf0e10cSrcweir                 {
247cdf0e10cSrcweir                     nMode = HEAD_HITTEST_DIVIDER;
248cdf0e10cSrcweir                     nMouseOff = rPos.X()-(nX+pItem->mnSize);
249cdf0e10cSrcweir                 }
250cdf0e10cSrcweir                 else
251cdf0e10cSrcweir                 {
252cdf0e10cSrcweir                     nMode = HEAD_HITTEST_ITEM;
253cdf0e10cSrcweir                     nMouseOff = rPos.X()-nX;
254cdf0e10cSrcweir                 }
255cdf0e10cSrcweir             }
256cdf0e10cSrcweir 
257cdf0e10cSrcweir             return nMode;
258cdf0e10cSrcweir         }
259cdf0e10cSrcweir 
260cdf0e10cSrcweir         if ( pItem->mnBits & HIB_FIXED )
261cdf0e10cSrcweir             bLastFixed = sal_True;
262cdf0e10cSrcweir         else
263cdf0e10cSrcweir             bLastFixed = sal_False;
264cdf0e10cSrcweir 
265cdf0e10cSrcweir         nX += pItem->mnSize;
266cdf0e10cSrcweir     }
267cdf0e10cSrcweir 
268cdf0e10cSrcweir     if ( !bLastFixed )
269cdf0e10cSrcweir     {
270cdf0e10cSrcweir         pItem = mpItemList->GetObject( nCount-1 );
271cdf0e10cSrcweir         if ( (pItem->mnSize < 4)  && (rPos.X() < (nX+HEADERBAR_SPLITOFF)) )
272cdf0e10cSrcweir         {
273cdf0e10cSrcweir             nPos = nCount-1;
274cdf0e10cSrcweir             nMouseOff = rPos.X()-nX+1;
275cdf0e10cSrcweir             return HEAD_HITTEST_DIVIDER;
276cdf0e10cSrcweir         }
277cdf0e10cSrcweir     }
278cdf0e10cSrcweir 
279cdf0e10cSrcweir     return 0;
280cdf0e10cSrcweir }
281cdf0e10cSrcweir 
282cdf0e10cSrcweir // -----------------------------------------------------------------------
283cdf0e10cSrcweir 
ImplInvertDrag(sal_uInt16 nStartPos,sal_uInt16 nEndPos)284cdf0e10cSrcweir void HeaderBar::ImplInvertDrag( sal_uInt16 nStartPos, sal_uInt16 nEndPos )
285cdf0e10cSrcweir {
286cdf0e10cSrcweir     Rectangle aRect1 = ImplGetItemRect( nStartPos );
287cdf0e10cSrcweir     Rectangle aRect2 = ImplGetItemRect( nEndPos );
288cdf0e10cSrcweir     Point     aStartPos = aRect1.Center();
289cdf0e10cSrcweir     Point     aEndPos = aStartPos;
290cdf0e10cSrcweir     Rectangle aStartRect( aStartPos.X()-2, aStartPos.Y()-2,
291cdf0e10cSrcweir                           aStartPos.X()+2, aStartPos.Y()+2 );
292cdf0e10cSrcweir 
293cdf0e10cSrcweir     if ( nEndPos > nStartPos )
294cdf0e10cSrcweir     {
295cdf0e10cSrcweir         aStartPos.X() += 3;
296cdf0e10cSrcweir         aEndPos.X() = aRect2.Right()-6;
297cdf0e10cSrcweir     }
298cdf0e10cSrcweir     else
299cdf0e10cSrcweir     {
300cdf0e10cSrcweir         aStartPos.X() -= 3;
301cdf0e10cSrcweir         aEndPos.X() = aRect2.Left()+6;
302cdf0e10cSrcweir     }
303cdf0e10cSrcweir 
304cdf0e10cSrcweir     SetRasterOp( ROP_INVERT );
305cdf0e10cSrcweir     DrawRect( aStartRect );
306cdf0e10cSrcweir     DrawLine( aStartPos, aEndPos );
307cdf0e10cSrcweir     if ( nEndPos > nStartPos )
308cdf0e10cSrcweir     {
309cdf0e10cSrcweir         DrawLine( Point( aEndPos.X()+1, aEndPos.Y()-3 ),
310cdf0e10cSrcweir                   Point( aEndPos.X()+1, aEndPos.Y()+3 ) );
311cdf0e10cSrcweir         DrawLine( Point( aEndPos.X()+2, aEndPos.Y()-2 ),
312cdf0e10cSrcweir                   Point( aEndPos.X()+2, aEndPos.Y()+2 ) );
313cdf0e10cSrcweir         DrawLine( Point( aEndPos.X()+3, aEndPos.Y()-1 ),
314cdf0e10cSrcweir                   Point( aEndPos.X()+3, aEndPos.Y()+1 ) );
315cdf0e10cSrcweir         DrawPixel( Point( aEndPos.X()+4, aEndPos.Y() ) );
316cdf0e10cSrcweir     }
317cdf0e10cSrcweir     else
318cdf0e10cSrcweir     {
319cdf0e10cSrcweir         DrawLine( Point( aEndPos.X()-1, aEndPos.Y()-3 ),
320cdf0e10cSrcweir                   Point( aEndPos.X()-1, aEndPos.Y()+3 ) );
321cdf0e10cSrcweir         DrawLine( Point( aEndPos.X()-2, aEndPos.Y()-2 ),
322cdf0e10cSrcweir                   Point( aEndPos.X()-2, aEndPos.Y()+2 ) );
323cdf0e10cSrcweir         DrawLine( Point( aEndPos.X()-3, aEndPos.Y()-1 ),
324cdf0e10cSrcweir                   Point( aEndPos.X()-3, aEndPos.Y()+1 ) );
325cdf0e10cSrcweir         DrawPixel( Point( aEndPos.X()-4, aEndPos.Y() ) );
326cdf0e10cSrcweir     }
327cdf0e10cSrcweir     SetRasterOp( ROP_OVERPAINT );
328cdf0e10cSrcweir }
329cdf0e10cSrcweir 
330cdf0e10cSrcweir // -----------------------------------------------------------------------
331cdf0e10cSrcweir 
ImplDrawItem(OutputDevice * pDev,sal_uInt16 nPos,sal_Bool bHigh,sal_Bool bDrag,const Rectangle & rItemRect,const Rectangle * pRect,sal_uLong)332cdf0e10cSrcweir void HeaderBar::ImplDrawItem( OutputDevice* pDev,
333cdf0e10cSrcweir                               sal_uInt16 nPos, sal_Bool bHigh, sal_Bool bDrag,
334cdf0e10cSrcweir                               const Rectangle& rItemRect,
335cdf0e10cSrcweir                               const Rectangle* pRect,
336cdf0e10cSrcweir                               sal_uLong )
337cdf0e10cSrcweir {
338cdf0e10cSrcweir     Rectangle aRect = rItemRect;
339cdf0e10cSrcweir 
340cdf0e10cSrcweir     // Wenn kein Platz, dann brauchen wir auch nichts ausgeben
341cdf0e10cSrcweir     if ( aRect.GetWidth() <= 1 )
342cdf0e10cSrcweir         return;
343cdf0e10cSrcweir 
344cdf0e10cSrcweir     // Feststellen, ob Rectangle ueberhaupt sichtbar
345cdf0e10cSrcweir     if ( pRect )
346cdf0e10cSrcweir     {
347cdf0e10cSrcweir         if ( aRect.Right() < pRect->Left() )
348cdf0e10cSrcweir             return;
349cdf0e10cSrcweir         else if ( aRect.Left() > pRect->Right() )
350cdf0e10cSrcweir             return;
351cdf0e10cSrcweir     }
352cdf0e10cSrcweir     else
353cdf0e10cSrcweir     {
354cdf0e10cSrcweir         if ( aRect.Right() < 0 )
355cdf0e10cSrcweir             return;
356cdf0e10cSrcweir         else if ( aRect.Left() > mnDX )
357cdf0e10cSrcweir             return;
358cdf0e10cSrcweir     }
359cdf0e10cSrcweir 
360cdf0e10cSrcweir     ImplHeadItem*           pItem  = mpItemList->GetObject( nPos );
361cdf0e10cSrcweir     HeaderBarItemBits       nBits = pItem->mnBits;
362cdf0e10cSrcweir     const StyleSettings&    rStyleSettings = GetSettings().GetStyleSettings();
363cdf0e10cSrcweir 
364cdf0e10cSrcweir     // Border muss nicht gemalt werden
365cdf0e10cSrcweir     aRect.Top()     += mnBorderOff1;
366cdf0e10cSrcweir     aRect.Bottom()  -= mnBorderOff2;
367cdf0e10cSrcweir 
368cdf0e10cSrcweir     // Hintergrund loeschen
369cdf0e10cSrcweir     if ( !pRect || bDrag )
370cdf0e10cSrcweir     {
371cdf0e10cSrcweir         if ( bDrag )
372cdf0e10cSrcweir         {
373cdf0e10cSrcweir             pDev->SetLineColor();
374cdf0e10cSrcweir             pDev->SetFillColor( rStyleSettings.GetCheckedColor() );
375cdf0e10cSrcweir             pDev->DrawRect( aRect );
376cdf0e10cSrcweir         }
377cdf0e10cSrcweir         else
378cdf0e10cSrcweir             pDev->DrawWallpaper( aRect, GetBackground() );
379cdf0e10cSrcweir     }
380cdf0e10cSrcweir 
381cdf0e10cSrcweir     // Trennlinie malen
382cdf0e10cSrcweir     pDev->SetLineColor( rStyleSettings.GetDarkShadowColor() );
383cdf0e10cSrcweir     pDev->DrawLine( Point( aRect.Right(), aRect.Top() ),
384cdf0e10cSrcweir                     Point( aRect.Right(), aRect.Bottom() ) );
385cdf0e10cSrcweir 
386cdf0e10cSrcweir     // ButtonStyle malen
387cdf0e10cSrcweir     // avoid 3D borders
388cdf0e10cSrcweir     Color aSelectionTextColor( COL_TRANSPARENT );
389cdf0e10cSrcweir     if( bHigh )
390cdf0e10cSrcweir         DrawSelectionBackground( aRect, 1, sal_True, sal_False, sal_False, &aSelectionTextColor );
391cdf0e10cSrcweir     else if ( !mbButtonStyle || (nBits & HIB_FLAT) )
392cdf0e10cSrcweir         DrawSelectionBackground( aRect, 0, sal_True, sal_False, sal_False, &aSelectionTextColor );
393cdf0e10cSrcweir 
394cdf0e10cSrcweir     // Wenn kein Platz, dann brauchen wir auch nichts ausgeben
395cdf0e10cSrcweir     if ( aRect.GetWidth() < 1 )
396cdf0e10cSrcweir         return;
397cdf0e10cSrcweir 
398cdf0e10cSrcweir     // Positionen und Groessen berechnen und Inhalt ausgeben
399cdf0e10cSrcweir     pItem->maOutText = pItem->maText;
400cdf0e10cSrcweir     Size aImageSize = pItem->maImage.GetSizePixel();
401cdf0e10cSrcweir     Size aTxtSize( pDev->GetTextWidth( pItem->maOutText ), 0  );
402cdf0e10cSrcweir     if ( pItem->maOutText.Len() )
403cdf0e10cSrcweir         aTxtSize.Height() = pDev->GetTextHeight();
404cdf0e10cSrcweir     long nArrowWidth = 0;
405cdf0e10cSrcweir     if ( nBits & (HIB_UPARROW | HIB_DOWNARROW) )
406cdf0e10cSrcweir         nArrowWidth = HEAD_ARROWSIZE2+HEADERBAR_ARROWOFF;
407cdf0e10cSrcweir 
408cdf0e10cSrcweir     // Wenn kein Platz fuer Image, dann nicht ausgeben
409cdf0e10cSrcweir     long nTestHeight = aImageSize.Height();
410cdf0e10cSrcweir     if ( !(nBits & (HIB_LEFTIMAGE | HIB_RIGHTIMAGE)) )
411cdf0e10cSrcweir         nTestHeight += aTxtSize.Height();
412cdf0e10cSrcweir     if ( (aImageSize.Width() > aRect.GetWidth()) || (nTestHeight > aRect.GetHeight()) )
413cdf0e10cSrcweir     {
414cdf0e10cSrcweir         aImageSize.Width() = 0;
415cdf0e10cSrcweir         aImageSize.Height() = 0;
416cdf0e10cSrcweir     }
417cdf0e10cSrcweir 
418cdf0e10cSrcweir     // Text auf entsprechende Laenge kuerzen
419cdf0e10cSrcweir     sal_Bool bLeftText = sal_False;
420cdf0e10cSrcweir     long nMaxTxtWidth = aRect.GetWidth()-(HEADERBAR_TEXTOFF*2)-nArrowWidth;
421cdf0e10cSrcweir     if ( nBits & (HIB_LEFTIMAGE | HIB_RIGHTIMAGE) )
422cdf0e10cSrcweir         nMaxTxtWidth -= aImageSize.Width();
423cdf0e10cSrcweir     long nTxtWidth = aTxtSize.Width();
424cdf0e10cSrcweir     if ( nTxtWidth > nMaxTxtWidth )
425cdf0e10cSrcweir     {
426cdf0e10cSrcweir         bLeftText = sal_True;
427cdf0e10cSrcweir         // 3 == Len of "..."
428cdf0e10cSrcweir         pItem->maOutText.AppendAscii( "..." );
429cdf0e10cSrcweir         do
430cdf0e10cSrcweir         {
431cdf0e10cSrcweir             pItem->maOutText.Erase( pItem->maOutText.Len()-3-1, 1 );
432cdf0e10cSrcweir             nTxtWidth = pDev->GetTextWidth( pItem->maOutText );
433cdf0e10cSrcweir         }
434cdf0e10cSrcweir         while ( (nTxtWidth > nMaxTxtWidth) && (pItem->maOutText.Len() > 3) );
435cdf0e10cSrcweir         if ( pItem->maOutText.Len() == 3 )
436cdf0e10cSrcweir         {
437cdf0e10cSrcweir             nTxtWidth = 0;
438cdf0e10cSrcweir             pItem->maOutText.Erase();
439cdf0e10cSrcweir         }
440cdf0e10cSrcweir     }
441cdf0e10cSrcweir 
442cdf0e10cSrcweir     // Text/Imageposition berechnen
443cdf0e10cSrcweir     long nTxtPos;
444cdf0e10cSrcweir     if ( !bLeftText && (nBits & HIB_RIGHT) )
445cdf0e10cSrcweir     {
446cdf0e10cSrcweir         nTxtPos = aRect.Right()-nTxtWidth-HEADERBAR_TEXTOFF;
447cdf0e10cSrcweir         if ( nBits & HIB_RIGHTIMAGE )
448cdf0e10cSrcweir             nTxtPos -= aImageSize.Width();
449cdf0e10cSrcweir     }
450cdf0e10cSrcweir     else if ( !bLeftText && (nBits & HIB_CENTER) )
451cdf0e10cSrcweir     {
452cdf0e10cSrcweir         long nTempWidth = nTxtWidth;
453cdf0e10cSrcweir         if ( nBits & (HIB_LEFTIMAGE | HIB_RIGHTIMAGE) )
454cdf0e10cSrcweir             nTempWidth += aImageSize.Width();
455cdf0e10cSrcweir         nTxtPos = aRect.Left()+(aRect.GetWidth()-nTempWidth)/2;
456cdf0e10cSrcweir         if ( nBits & HIB_LEFTIMAGE )
457cdf0e10cSrcweir             nTxtPos += aImageSize.Width();
458cdf0e10cSrcweir         if ( nArrowWidth )
459cdf0e10cSrcweir         {
460cdf0e10cSrcweir             if ( nTxtPos+nTxtWidth+nArrowWidth >= aRect.Right() )
461cdf0e10cSrcweir             {
462cdf0e10cSrcweir                 nTxtPos = aRect.Left()+HEADERBAR_TEXTOFF;
463cdf0e10cSrcweir                 if ( nBits & HIB_LEFTIMAGE )
464cdf0e10cSrcweir                     nTxtPos += aImageSize.Width();
465cdf0e10cSrcweir             }
466cdf0e10cSrcweir         }
467cdf0e10cSrcweir     }
468cdf0e10cSrcweir     else
469cdf0e10cSrcweir     {
470cdf0e10cSrcweir         nTxtPos = aRect.Left()+HEADERBAR_TEXTOFF;
471cdf0e10cSrcweir         if ( nBits & HIB_LEFTIMAGE )
472cdf0e10cSrcweir             nTxtPos += aImageSize.Width();
473cdf0e10cSrcweir         if ( nBits & HIB_RIGHT )
474cdf0e10cSrcweir             nTxtPos += nArrowWidth;
475cdf0e10cSrcweir     }
476cdf0e10cSrcweir 
477cdf0e10cSrcweir     // TextPosition berechnen
478cdf0e10cSrcweir     long nTxtPosY = 0;
479cdf0e10cSrcweir     if ( pItem->maOutText.Len() || (nArrowWidth && aTxtSize.Height()) )
480cdf0e10cSrcweir     {
481cdf0e10cSrcweir         if ( nBits & HIB_TOP )
482cdf0e10cSrcweir         {
483cdf0e10cSrcweir             nTxtPosY = aRect.Top();
484cdf0e10cSrcweir             if ( !(nBits & (HIB_LEFTIMAGE | HIB_RIGHTIMAGE)) )
485cdf0e10cSrcweir                 nTxtPosY += aImageSize.Height();
486cdf0e10cSrcweir         }
487cdf0e10cSrcweir         else if ( nBits & HIB_BOTTOM )
488cdf0e10cSrcweir             nTxtPosY = aRect.Bottom()-aTxtSize.Height();
489cdf0e10cSrcweir         else
490cdf0e10cSrcweir         {
491cdf0e10cSrcweir             long nTempHeight = aTxtSize.Height();
492cdf0e10cSrcweir             if ( !(nBits & (HIB_LEFTIMAGE | HIB_RIGHTIMAGE)) )
493cdf0e10cSrcweir                 nTempHeight += aImageSize.Height();
494cdf0e10cSrcweir             nTxtPosY = aRect.Top()+((aRect.GetHeight()-nTempHeight)/2);
495cdf0e10cSrcweir             if ( !(nBits & (HIB_LEFTIMAGE | HIB_RIGHTIMAGE)) )
496cdf0e10cSrcweir                 nTxtPosY += aImageSize.Height();
497cdf0e10cSrcweir         }
498cdf0e10cSrcweir     }
499cdf0e10cSrcweir 
500cdf0e10cSrcweir     // Text ausgebeben
501cdf0e10cSrcweir     if ( pItem->maOutText.Len() )
502cdf0e10cSrcweir     {
503cdf0e10cSrcweir         if( aSelectionTextColor != Color( COL_TRANSPARENT ) )
504cdf0e10cSrcweir         {
505cdf0e10cSrcweir             pDev->Push( PUSH_TEXTCOLOR );
506cdf0e10cSrcweir             pDev->SetTextColor( aSelectionTextColor );
507cdf0e10cSrcweir         }
508cdf0e10cSrcweir         if ( IsEnabled() )
509cdf0e10cSrcweir             pDev->DrawText( Point( nTxtPos, nTxtPosY ), pItem->maOutText );
510cdf0e10cSrcweir         else
511cdf0e10cSrcweir             pDev->DrawCtrlText( Point( nTxtPos, nTxtPosY ), pItem->maOutText, 0, STRING_LEN, TEXT_DRAW_DISABLE );
512cdf0e10cSrcweir         if( aSelectionTextColor != Color( COL_TRANSPARENT ) )
513cdf0e10cSrcweir             pDev->Pop();
514cdf0e10cSrcweir     }
515cdf0e10cSrcweir 
516cdf0e10cSrcweir     // Wenn Image vorhanden, Position berechnen und ausgeben
517cdf0e10cSrcweir     long nImagePosY = 0;
518cdf0e10cSrcweir     if ( aImageSize.Width() && aImageSize.Height() )
519cdf0e10cSrcweir     {
520cdf0e10cSrcweir         long nImagePos = nTxtPos;
521cdf0e10cSrcweir         if ( nBits & HIB_LEFTIMAGE )
522cdf0e10cSrcweir         {
523cdf0e10cSrcweir             nImagePos -= aImageSize.Width();
524cdf0e10cSrcweir             if ( nBits & HIB_RIGHT )
525cdf0e10cSrcweir                 nImagePos -= nArrowWidth;
526cdf0e10cSrcweir         }
527cdf0e10cSrcweir         else if ( nBits & HIB_RIGHTIMAGE )
528cdf0e10cSrcweir         {
529cdf0e10cSrcweir             nImagePos += nTxtWidth;
530cdf0e10cSrcweir             if ( !(nBits & HIB_RIGHT) )
531cdf0e10cSrcweir                 nImagePos += nArrowWidth;
532cdf0e10cSrcweir         }
533cdf0e10cSrcweir         else
534cdf0e10cSrcweir         {
535cdf0e10cSrcweir             if ( nBits & HIB_RIGHT )
536cdf0e10cSrcweir                 nImagePos = aRect.Right()-aImageSize.Width();
537cdf0e10cSrcweir             else if ( nBits & HIB_CENTER )
538cdf0e10cSrcweir                 nImagePos = aRect.Left()+(aRect.GetWidth()-aImageSize.Width())/2;
539cdf0e10cSrcweir             else
540cdf0e10cSrcweir                 nImagePos = aRect.Left()+HEADERBAR_TEXTOFF;
541cdf0e10cSrcweir         }
542cdf0e10cSrcweir 
543cdf0e10cSrcweir         if ( nBits & HIB_TOP )
544cdf0e10cSrcweir             nImagePosY = aRect.Top();
545cdf0e10cSrcweir         else if ( nBits & HIB_BOTTOM )
546cdf0e10cSrcweir         {
547cdf0e10cSrcweir             nImagePosY = aRect.Bottom()-aImageSize.Height();
548cdf0e10cSrcweir             if ( !(nBits & (HIB_LEFTIMAGE | HIB_RIGHTIMAGE)) )
549cdf0e10cSrcweir                 nImagePosY -= aTxtSize.Height();
550cdf0e10cSrcweir         }
551cdf0e10cSrcweir         else
552cdf0e10cSrcweir         {
553cdf0e10cSrcweir             long nTempHeight = aImageSize.Height();
554cdf0e10cSrcweir             if ( !(nBits & (HIB_LEFTIMAGE | HIB_RIGHTIMAGE)) )
555cdf0e10cSrcweir                 nTempHeight += aTxtSize.Height();
556cdf0e10cSrcweir             nImagePosY = aRect.Top()+((aRect.GetHeight()-nTempHeight)/2);
557cdf0e10cSrcweir         }
558cdf0e10cSrcweir         if ( nImagePos+aImageSize.Width() <= aRect.Right() )
559cdf0e10cSrcweir         {
560cdf0e10cSrcweir             sal_uInt16 nStyle = 0;
561cdf0e10cSrcweir             if ( !IsEnabled() )
562cdf0e10cSrcweir                 nStyle |= IMAGE_DRAW_DISABLE;
563cdf0e10cSrcweir             pDev->DrawImage( Point( nImagePos, nImagePosY ), pItem->maImage, nStyle );
564cdf0e10cSrcweir         }
565cdf0e10cSrcweir     }
566cdf0e10cSrcweir 
567cdf0e10cSrcweir     if ( nBits & (HIB_UPARROW | HIB_DOWNARROW) )
568cdf0e10cSrcweir     {
569cdf0e10cSrcweir         long nArrowX = nTxtPos;
570cdf0e10cSrcweir         if ( nBits & HIB_RIGHT )
571cdf0e10cSrcweir             nArrowX -= nArrowWidth;
572cdf0e10cSrcweir         else
573cdf0e10cSrcweir             nArrowX += nTxtWidth+HEADERBAR_ARROWOFF;
574cdf0e10cSrcweir         if ( !(nBits & (HIB_LEFTIMAGE | HIB_RIGHTIMAGE)) && !pItem->maText.Len() )
575cdf0e10cSrcweir         {
576cdf0e10cSrcweir             if ( nBits & HIB_RIGHT )
577cdf0e10cSrcweir                 nArrowX -= aImageSize.Width();
578cdf0e10cSrcweir             else
579cdf0e10cSrcweir                 nArrowX += aImageSize.Width();
580cdf0e10cSrcweir         }
581cdf0e10cSrcweir 
582cdf0e10cSrcweir         // Feststellen, ob Platz genug ist, das Item zu malen
583cdf0e10cSrcweir         sal_Bool bDraw = sal_True;
584cdf0e10cSrcweir         if ( nArrowX < aRect.Left()+HEADERBAR_TEXTOFF )
585cdf0e10cSrcweir             bDraw = sal_False;
586cdf0e10cSrcweir         else if ( nArrowX+HEAD_ARROWSIZE2 > aRect.Right() )
587cdf0e10cSrcweir             bDraw = sal_False;
588cdf0e10cSrcweir 
589cdf0e10cSrcweir         if ( bDraw )
590cdf0e10cSrcweir         {
591cdf0e10cSrcweir             long nArrowY;
592cdf0e10cSrcweir             if ( aTxtSize.Height() )
593cdf0e10cSrcweir                 nArrowY = nTxtPosY+(aTxtSize.Height()/2);
594cdf0e10cSrcweir             else if ( aImageSize.Width() && aImageSize.Height() )
595cdf0e10cSrcweir                 nArrowY = nImagePosY+(aImageSize.Height()/2);
596cdf0e10cSrcweir             else
597cdf0e10cSrcweir             {
598cdf0e10cSrcweir                 if ( nBits & HIB_TOP )
599cdf0e10cSrcweir                     nArrowY = aRect.Top()+1;
600cdf0e10cSrcweir                 else if ( nBits & HIB_BOTTOM )
601cdf0e10cSrcweir                     nArrowY = aRect.Bottom()-HEAD_ARROWSIZE2-1;
602cdf0e10cSrcweir                 else
603*6bcc9fe0Smseidel                     nArrowY = aRect.Top()+((aRect.GetHeight()-HEAD_ARROWSIZE2)/2);
604cdf0e10cSrcweir             }
605cdf0e10cSrcweir             nArrowY -= HEAD_ARROWSIZE1-1;
606cdf0e10cSrcweir             if ( nBits & HIB_DOWNARROW )
607cdf0e10cSrcweir             {
608cdf0e10cSrcweir                 pDev->SetLineColor( rStyleSettings.GetLightColor() );
609cdf0e10cSrcweir                 pDev->DrawLine( Point( nArrowX, nArrowY ),
610cdf0e10cSrcweir                                 Point( nArrowX+HEAD_ARROWSIZE2, nArrowY ) );
611cdf0e10cSrcweir                 pDev->DrawLine( Point( nArrowX, nArrowY ),
612cdf0e10cSrcweir                                 Point( nArrowX+HEAD_ARROWSIZE1, nArrowY+HEAD_ARROWSIZE2 ) );
613cdf0e10cSrcweir                 pDev->SetLineColor( rStyleSettings.GetShadowColor() );
614cdf0e10cSrcweir                 pDev->DrawLine( Point( nArrowX+HEAD_ARROWSIZE1, nArrowY+HEAD_ARROWSIZE2 ),
615cdf0e10cSrcweir                                 Point( nArrowX+HEAD_ARROWSIZE2, nArrowY ) );
616cdf0e10cSrcweir             }
617cdf0e10cSrcweir             else
618cdf0e10cSrcweir             {
619cdf0e10cSrcweir                 pDev->SetLineColor( rStyleSettings.GetLightColor() );
620cdf0e10cSrcweir                 pDev->DrawLine( Point( nArrowX, nArrowY+HEAD_ARROWSIZE2 ),
621cdf0e10cSrcweir                                 Point( nArrowX+HEAD_ARROWSIZE1, nArrowY ) );
622cdf0e10cSrcweir                 pDev->SetLineColor( rStyleSettings.GetShadowColor() );
623cdf0e10cSrcweir                 pDev->DrawLine( Point( nArrowX, nArrowY+HEAD_ARROWSIZE2 ),
624cdf0e10cSrcweir                                 Point( nArrowX+HEAD_ARROWSIZE2, nArrowY+HEAD_ARROWSIZE2 ) );
625cdf0e10cSrcweir                 pDev->DrawLine( Point( nArrowX+HEAD_ARROWSIZE2, nArrowY+HEAD_ARROWSIZE2 ),
626cdf0e10cSrcweir                                 Point( nArrowX+HEAD_ARROWSIZE1, nArrowY ) );
627cdf0e10cSrcweir             }
628cdf0e10cSrcweir         }
629cdf0e10cSrcweir     }
630cdf0e10cSrcweir 
631cdf0e10cSrcweir     // Gegebenenfalls auch UserDraw aufrufen
632cdf0e10cSrcweir     if ( nBits & HIB_USERDRAW )
633cdf0e10cSrcweir     {
634cdf0e10cSrcweir         Region aRegion( aRect );
635cdf0e10cSrcweir         if ( pRect )
636cdf0e10cSrcweir             aRegion.Intersect( *pRect );
637cdf0e10cSrcweir         pDev->SetClipRegion( aRegion );
638cdf0e10cSrcweir         UserDrawEvent aODEvt( pDev, aRect, pItem->mnId );
639cdf0e10cSrcweir         UserDraw( aODEvt );
640cdf0e10cSrcweir         pDev->SetClipRegion();
641cdf0e10cSrcweir     }
642cdf0e10cSrcweir }
643cdf0e10cSrcweir 
644cdf0e10cSrcweir // -----------------------------------------------------------------------
645cdf0e10cSrcweir 
ImplDrawItem(sal_uInt16 nPos,sal_Bool bHigh,sal_Bool bDrag,const Rectangle * pRect)646cdf0e10cSrcweir void HeaderBar::ImplDrawItem( sal_uInt16 nPos, sal_Bool bHigh, sal_Bool bDrag,
647cdf0e10cSrcweir                               const Rectangle* pRect )
648cdf0e10cSrcweir {
649cdf0e10cSrcweir     Rectangle aRect = ImplGetItemRect( nPos );
650cdf0e10cSrcweir     ImplDrawItem( this, nPos, bHigh, bDrag, aRect, pRect, 0 );
651cdf0e10cSrcweir }
652cdf0e10cSrcweir 
653cdf0e10cSrcweir // -----------------------------------------------------------------------
654cdf0e10cSrcweir 
ImplUpdate(sal_uInt16 nPos,sal_Bool bEnd,sal_Bool bDirect)655cdf0e10cSrcweir void HeaderBar::ImplUpdate( sal_uInt16 nPos, sal_Bool bEnd, sal_Bool bDirect )
656cdf0e10cSrcweir {
657cdf0e10cSrcweir     if ( IsVisible() && IsUpdateMode() )
658cdf0e10cSrcweir     {
659cdf0e10cSrcweir         if ( !bDirect )
660cdf0e10cSrcweir         {
661cdf0e10cSrcweir             Rectangle   aRect;
662cdf0e10cSrcweir             sal_uInt16      nItemCount = (sal_uInt16)(mpItemList->Count());
663cdf0e10cSrcweir             if ( nPos < nItemCount )
664cdf0e10cSrcweir                 aRect = ImplGetItemRect( nPos );
665cdf0e10cSrcweir             else
666cdf0e10cSrcweir             {
667cdf0e10cSrcweir                 aRect.Bottom() = mnDY-1;
668cdf0e10cSrcweir                 if ( nItemCount )
669cdf0e10cSrcweir                     aRect.Left() = ImplGetItemRect( nItemCount-1 ).Right();
670cdf0e10cSrcweir             }
671cdf0e10cSrcweir             if ( bEnd )
672cdf0e10cSrcweir                 aRect.Right() = mnDX-1;
673cdf0e10cSrcweir             aRect.Top()     += mnBorderOff1;
674cdf0e10cSrcweir             aRect.Bottom()  -= mnBorderOff2;
675cdf0e10cSrcweir             Invalidate( aRect );
676cdf0e10cSrcweir         }
677cdf0e10cSrcweir         else
678cdf0e10cSrcweir         {
679cdf0e10cSrcweir             for ( sal_uInt16 i = nPos; i < mpItemList->Count(); i++ )
680cdf0e10cSrcweir                 ImplDrawItem( i );
681cdf0e10cSrcweir             if ( bEnd )
682cdf0e10cSrcweir             {
683cdf0e10cSrcweir                 Rectangle aRect = ImplGetItemRect( (sal_uInt16)mpItemList->Count() );
684cdf0e10cSrcweir                 aRect.Left()  = aRect.Right();
685cdf0e10cSrcweir                 aRect.Right() = mnDX-1;
686cdf0e10cSrcweir                 if ( aRect.Left() < aRect.Right() )
687cdf0e10cSrcweir                 {
688cdf0e10cSrcweir                     aRect.Top()     += mnBorderOff1;
689cdf0e10cSrcweir                     aRect.Bottom()  -= mnBorderOff2;
690cdf0e10cSrcweir                     Erase( aRect );
691cdf0e10cSrcweir                 }
692cdf0e10cSrcweir             }
693cdf0e10cSrcweir         }
694cdf0e10cSrcweir     }
695cdf0e10cSrcweir }
696cdf0e10cSrcweir 
697cdf0e10cSrcweir // -----------------------------------------------------------------------
698cdf0e10cSrcweir 
ImplStartDrag(const Point & rMousePos,sal_Bool bCommand)699cdf0e10cSrcweir void HeaderBar::ImplStartDrag( const Point& rMousePos, sal_Bool bCommand )
700cdf0e10cSrcweir {
701cdf0e10cSrcweir     sal_uInt16  nPos;
702cdf0e10cSrcweir     sal_uInt16  nHitTest = ImplHitTest( rMousePos, mnMouseOff, nPos );
703cdf0e10cSrcweir     if ( nHitTest )
704cdf0e10cSrcweir     {
705cdf0e10cSrcweir         mbDrag = sal_False;
706cdf0e10cSrcweir         ImplHeadItem* pItem = mpItemList->GetObject( nPos );
707cdf0e10cSrcweir         if ( nHitTest & HEAD_HITTEST_DIVIDER )
708cdf0e10cSrcweir             mbDrag = sal_True;
709cdf0e10cSrcweir         else
710cdf0e10cSrcweir         {
711cdf0e10cSrcweir             if ( ((pItem->mnBits & HIB_CLICKABLE) && !(pItem->mnBits & HIB_FLAT)) ||
712cdf0e10cSrcweir                  (mbDragable && !(pItem->mnBits & HIB_FIXEDPOS)) )
713cdf0e10cSrcweir             {
714cdf0e10cSrcweir                 mbItemMode = sal_True;
715cdf0e10cSrcweir                 mbDrag = sal_True;
716cdf0e10cSrcweir                 if ( bCommand )
717cdf0e10cSrcweir                 {
718cdf0e10cSrcweir                     if ( mbDragable )
719cdf0e10cSrcweir                         mbItemDrag = sal_True;
720cdf0e10cSrcweir                     else
721cdf0e10cSrcweir                     {
722cdf0e10cSrcweir                         mbItemMode = sal_False;
723cdf0e10cSrcweir                         mbDrag = sal_False;
724cdf0e10cSrcweir                     }
725cdf0e10cSrcweir                 }
726cdf0e10cSrcweir             }
727cdf0e10cSrcweir             else
728cdf0e10cSrcweir             {
729cdf0e10cSrcweir                 if ( !bCommand )
730cdf0e10cSrcweir                 {
731cdf0e10cSrcweir                     mnCurItemId = pItem->mnId;
732cdf0e10cSrcweir                     Select();
733cdf0e10cSrcweir                     mnCurItemId = 0;
734cdf0e10cSrcweir                 }
735cdf0e10cSrcweir             }
736cdf0e10cSrcweir         }
737cdf0e10cSrcweir 
738cdf0e10cSrcweir         if ( mbDrag )
739cdf0e10cSrcweir         {
740cdf0e10cSrcweir             mbOutDrag = sal_False;
741cdf0e10cSrcweir             mnCurItemId = pItem->mnId;
742cdf0e10cSrcweir             mnItemDragPos = nPos;
743cdf0e10cSrcweir             StartTracking();
744cdf0e10cSrcweir             mnStartPos = rMousePos.X()-mnMouseOff;
745cdf0e10cSrcweir             mnDragPos = mnStartPos;
746cdf0e10cSrcweir             StartDrag();
747cdf0e10cSrcweir             if ( mbItemMode )
748cdf0e10cSrcweir                 ImplDrawItem( nPos, sal_True, mbItemDrag );
749cdf0e10cSrcweir             else
750cdf0e10cSrcweir             {
751cdf0e10cSrcweir                 Rectangle aSizeRect( mnDragPos, 0, mnDragPos, mnDragSize+mnDY );
752cdf0e10cSrcweir                 ShowTracking( aSizeRect, SHOWTRACK_SPLIT );
753cdf0e10cSrcweir             }
754cdf0e10cSrcweir         }
755cdf0e10cSrcweir         else
756cdf0e10cSrcweir             mnMouseOff = 0;
757cdf0e10cSrcweir     }
758cdf0e10cSrcweir }
759cdf0e10cSrcweir 
760cdf0e10cSrcweir // -----------------------------------------------------------------------
761cdf0e10cSrcweir 
ImplDrag(const Point & rMousePos)762cdf0e10cSrcweir void HeaderBar::ImplDrag( const Point& rMousePos )
763cdf0e10cSrcweir {
764cdf0e10cSrcweir     sal_Bool    bNewOutDrag;
765cdf0e10cSrcweir     sal_uInt16  nPos = GetItemPos( mnCurItemId );
766cdf0e10cSrcweir 
767cdf0e10cSrcweir     mnDragPos = rMousePos.X()-mnMouseOff;
768cdf0e10cSrcweir     if ( mbItemMode )
769cdf0e10cSrcweir     {
770cdf0e10cSrcweir         Rectangle aItemRect = ImplGetItemRect( nPos );
771cdf0e10cSrcweir         if ( aItemRect.IsInside( rMousePos ) )
772cdf0e10cSrcweir             bNewOutDrag = sal_False;
773cdf0e10cSrcweir         else
774cdf0e10cSrcweir             bNewOutDrag = sal_True;
775cdf0e10cSrcweir 
776cdf0e10cSrcweir         // Evt. ItemDrag anschalten
777cdf0e10cSrcweir         if ( bNewOutDrag && mbDragable && !mbItemDrag &&
778cdf0e10cSrcweir              !(mpItemList->GetObject(nPos)->mnBits & HIB_FIXEDPOS) )
779cdf0e10cSrcweir         {
780cdf0e10cSrcweir             if ( (rMousePos.Y() >= aItemRect.Top()) && (rMousePos.Y() <= aItemRect.Bottom()) )
781cdf0e10cSrcweir             {
782cdf0e10cSrcweir                 mbItemDrag = sal_True;
783cdf0e10cSrcweir                 ImplDrawItem( nPos, sal_True, mbItemDrag );
784cdf0e10cSrcweir             }
785cdf0e10cSrcweir         }
786cdf0e10cSrcweir 
787cdf0e10cSrcweir         sal_uInt16 nOldItemDragPos = mnItemDragPos;
788cdf0e10cSrcweir         if ( mbItemDrag )
789cdf0e10cSrcweir         {
790cdf0e10cSrcweir             if ( (rMousePos.Y() < -HEADERBAR_DRAGOUTOFF) || (rMousePos.Y() > mnDY+HEADERBAR_DRAGOUTOFF) )
791cdf0e10cSrcweir                 bNewOutDrag = sal_True;
792cdf0e10cSrcweir             else
793cdf0e10cSrcweir                 bNewOutDrag = sal_False;
794cdf0e10cSrcweir 
795cdf0e10cSrcweir             if ( bNewOutDrag )
796cdf0e10cSrcweir                 mnItemDragPos = HEADERBAR_ITEM_NOTFOUND;
797cdf0e10cSrcweir             else
798cdf0e10cSrcweir             {
799cdf0e10cSrcweir                 sal_uInt16 nTempId = GetItemId( Point( rMousePos.X(), 2 ) );
800cdf0e10cSrcweir                 if ( nTempId )
801cdf0e10cSrcweir                     mnItemDragPos = GetItemPos( nTempId );
802cdf0e10cSrcweir                 else
803cdf0e10cSrcweir                 {
804cdf0e10cSrcweir                     if ( rMousePos.X() <= 0 )
805cdf0e10cSrcweir                         mnItemDragPos = 0;
806cdf0e10cSrcweir                     else
807cdf0e10cSrcweir                         mnItemDragPos = GetItemCount()-1;
808cdf0e10cSrcweir                 }
809cdf0e10cSrcweir 
810cdf0e10cSrcweir                 // Nicht verschiebbare Items aussparen
811cdf0e10cSrcweir                 if ( mnItemDragPos < nPos )
812cdf0e10cSrcweir                 {
813cdf0e10cSrcweir                     while ( (mpItemList->GetObject(mnItemDragPos)->mnBits & HIB_FIXEDPOS) &&
814cdf0e10cSrcweir                             (mnItemDragPos < nPos) )
815cdf0e10cSrcweir                         mnItemDragPos++;
816cdf0e10cSrcweir                 }
817cdf0e10cSrcweir                 else if ( mnItemDragPos > nPos )
818cdf0e10cSrcweir                 {
819cdf0e10cSrcweir                     while ( (mpItemList->GetObject(mnItemDragPos)->mnBits & HIB_FIXEDPOS) &&
820cdf0e10cSrcweir                             (mnItemDragPos > nPos) )
821cdf0e10cSrcweir                         mnItemDragPos--;
822cdf0e10cSrcweir                 }
823cdf0e10cSrcweir             }
824cdf0e10cSrcweir 
825cdf0e10cSrcweir             if ( (mnItemDragPos != nOldItemDragPos) &&
826cdf0e10cSrcweir                  (nOldItemDragPos != nPos) &&
827cdf0e10cSrcweir                  (nOldItemDragPos != HEADERBAR_ITEM_NOTFOUND) )
828cdf0e10cSrcweir             {
829cdf0e10cSrcweir                 ImplInvertDrag( nPos, nOldItemDragPos );
830cdf0e10cSrcweir                 ImplDrawItem( nOldItemDragPos );
831cdf0e10cSrcweir             }
832cdf0e10cSrcweir         }
833cdf0e10cSrcweir 
834cdf0e10cSrcweir         if ( bNewOutDrag != mbOutDrag )
835cdf0e10cSrcweir             ImplDrawItem( nPos, !bNewOutDrag, mbItemDrag );
836cdf0e10cSrcweir 
837cdf0e10cSrcweir         if ( mbItemDrag  )
838cdf0e10cSrcweir         {
839cdf0e10cSrcweir             if ( (mnItemDragPos != nOldItemDragPos) &&
840cdf0e10cSrcweir                  (mnItemDragPos != nPos) &&
841cdf0e10cSrcweir                  (mnItemDragPos != HEADERBAR_ITEM_NOTFOUND) )
842cdf0e10cSrcweir             {
843cdf0e10cSrcweir                 ImplDrawItem( mnItemDragPos, sal_False, sal_True );
844cdf0e10cSrcweir                 ImplInvertDrag( nPos, mnItemDragPos );
845cdf0e10cSrcweir             }
846cdf0e10cSrcweir         }
847cdf0e10cSrcweir 
848cdf0e10cSrcweir         mbOutDrag = bNewOutDrag;
849cdf0e10cSrcweir     }
850cdf0e10cSrcweir     else
851cdf0e10cSrcweir     {
852cdf0e10cSrcweir         Rectangle aItemRect = ImplGetItemRect( nPos );
853cdf0e10cSrcweir         if ( mnDragPos < aItemRect.Left() )
854cdf0e10cSrcweir             mnDragPos = aItemRect.Left();
855cdf0e10cSrcweir         if ( (mnDragPos < 0) || (mnDragPos > mnDX-1) )
856cdf0e10cSrcweir             HideTracking();
857cdf0e10cSrcweir         else
858cdf0e10cSrcweir         {
859cdf0e10cSrcweir             Rectangle aSizeRect( mnDragPos, 0, mnDragPos, mnDragSize+mnDY );
860cdf0e10cSrcweir             ShowTracking( aSizeRect, SHOWTRACK_SPLIT );
861cdf0e10cSrcweir         }
862cdf0e10cSrcweir     }
863cdf0e10cSrcweir 
864cdf0e10cSrcweir     Drag();
865cdf0e10cSrcweir }
866cdf0e10cSrcweir 
867cdf0e10cSrcweir // -----------------------------------------------------------------------
868cdf0e10cSrcweir 
ImplEndDrag(sal_Bool bCancel)869cdf0e10cSrcweir void HeaderBar::ImplEndDrag( sal_Bool bCancel )
870cdf0e10cSrcweir {
871cdf0e10cSrcweir     HideTracking();
872cdf0e10cSrcweir 
873cdf0e10cSrcweir     if ( bCancel || mbOutDrag )
874cdf0e10cSrcweir     {
875cdf0e10cSrcweir         if ( mbItemMode && (!mbOutDrag || mbItemDrag) )
876cdf0e10cSrcweir         {
877cdf0e10cSrcweir             sal_uInt16 nPos = GetItemPos( mnCurItemId );
878cdf0e10cSrcweir             ImplDrawItem( nPos );
879cdf0e10cSrcweir         }
880cdf0e10cSrcweir 
881cdf0e10cSrcweir         mnCurItemId = 0;
882cdf0e10cSrcweir     }
883cdf0e10cSrcweir     else
884cdf0e10cSrcweir     {
885cdf0e10cSrcweir         sal_uInt16 nPos = GetItemPos( mnCurItemId );
886cdf0e10cSrcweir         if ( mbItemMode )
887cdf0e10cSrcweir         {
888cdf0e10cSrcweir             if ( mbItemDrag )
889cdf0e10cSrcweir             {
890cdf0e10cSrcweir                 Pointer aPointer( POINTER_ARROW );
891cdf0e10cSrcweir                 SetPointer( aPointer );
892cdf0e10cSrcweir                 if ( (mnItemDragPos != nPos) &&
893cdf0e10cSrcweir                      (mnItemDragPos != HEADERBAR_ITEM_NOTFOUND) )
894cdf0e10cSrcweir                 {
895cdf0e10cSrcweir                     ImplInvertDrag( nPos, mnItemDragPos );
896cdf0e10cSrcweir                     MoveItem( mnCurItemId, mnItemDragPos );
897cdf0e10cSrcweir                 }
898cdf0e10cSrcweir                 else
899cdf0e10cSrcweir                     ImplDrawItem( nPos );
900cdf0e10cSrcweir             }
901cdf0e10cSrcweir             else
902cdf0e10cSrcweir             {
903cdf0e10cSrcweir                 Select();
904cdf0e10cSrcweir                 ImplUpdate( nPos );
905cdf0e10cSrcweir             }
906cdf0e10cSrcweir         }
907cdf0e10cSrcweir         else
908cdf0e10cSrcweir         {
909cdf0e10cSrcweir             long nDelta = mnDragPos - mnStartPos;
910cdf0e10cSrcweir             if ( nDelta )
911cdf0e10cSrcweir             {
912cdf0e10cSrcweir                 ImplHeadItem* pItem = mpItemList->GetObject( nPos );
913cdf0e10cSrcweir                 pItem->mnSize += nDelta;
914cdf0e10cSrcweir                 ImplUpdate( nPos, sal_True );
915cdf0e10cSrcweir             }
916cdf0e10cSrcweir         }
917cdf0e10cSrcweir     }
918cdf0e10cSrcweir 
919cdf0e10cSrcweir     mbDrag          = sal_False;
920cdf0e10cSrcweir     EndDrag();
921cdf0e10cSrcweir     mnCurItemId     = 0;
922cdf0e10cSrcweir     mnItemDragPos   = HEADERBAR_ITEM_NOTFOUND;
923cdf0e10cSrcweir     mbOutDrag       = sal_False;
924cdf0e10cSrcweir     mbItemMode      = sal_False;
925cdf0e10cSrcweir     mbItemDrag      = sal_False;
926cdf0e10cSrcweir }
927cdf0e10cSrcweir 
928cdf0e10cSrcweir // -----------------------------------------------------------------------
929cdf0e10cSrcweir 
MouseButtonDown(const MouseEvent & rMEvt)930cdf0e10cSrcweir void HeaderBar::MouseButtonDown( const MouseEvent& rMEvt )
931cdf0e10cSrcweir {
932cdf0e10cSrcweir     if ( rMEvt.IsLeft() )
933cdf0e10cSrcweir     {
934cdf0e10cSrcweir         if ( rMEvt.GetClicks() == 2 )
935cdf0e10cSrcweir         {
936cdf0e10cSrcweir             long    nTemp;
937cdf0e10cSrcweir             sal_uInt16  nPos;
938cdf0e10cSrcweir             sal_uInt16  nHitTest = ImplHitTest( rMEvt.GetPosPixel(), nTemp, nPos );
939cdf0e10cSrcweir             if ( nHitTest )
940cdf0e10cSrcweir             {
941cdf0e10cSrcweir                 ImplHeadItem* pItem = mpItemList->GetObject( nPos );
942cdf0e10cSrcweir                 if ( nHitTest & HEAD_HITTEST_DIVIDER )
943cdf0e10cSrcweir                     mbItemMode = sal_False;
944cdf0e10cSrcweir                 else
945cdf0e10cSrcweir                     mbItemMode = sal_True;
946cdf0e10cSrcweir                 mnCurItemId = pItem->mnId;
947cdf0e10cSrcweir                 DoubleClick();
948cdf0e10cSrcweir                 mbItemMode = sal_False;
949cdf0e10cSrcweir                 mnCurItemId = 0;
950cdf0e10cSrcweir             }
951cdf0e10cSrcweir         }
952cdf0e10cSrcweir         else
953cdf0e10cSrcweir             ImplStartDrag( rMEvt.GetPosPixel(), sal_False );
954cdf0e10cSrcweir     }
955cdf0e10cSrcweir }
956cdf0e10cSrcweir 
957cdf0e10cSrcweir // -----------------------------------------------------------------------
958cdf0e10cSrcweir 
MouseMove(const MouseEvent & rMEvt)959cdf0e10cSrcweir void HeaderBar::MouseMove( const MouseEvent& rMEvt )
960cdf0e10cSrcweir {
961cdf0e10cSrcweir     long            nTemp1;
962cdf0e10cSrcweir     sal_uInt16          nTemp2;
963cdf0e10cSrcweir     PointerStyle    eStyle = POINTER_ARROW;
964cdf0e10cSrcweir     sal_uInt16          nHitTest = ImplHitTest( rMEvt.GetPosPixel(), nTemp1, nTemp2 );
965cdf0e10cSrcweir 
966cdf0e10cSrcweir     if ( nHitTest & HEAD_HITTEST_DIVIDER )
967cdf0e10cSrcweir         eStyle = POINTER_HSIZEBAR;
968cdf0e10cSrcweir     Pointer aPtr( eStyle );
969cdf0e10cSrcweir     SetPointer( aPtr );
970cdf0e10cSrcweir }
971cdf0e10cSrcweir 
972cdf0e10cSrcweir // -----------------------------------------------------------------------
973cdf0e10cSrcweir 
Tracking(const TrackingEvent & rTEvt)974cdf0e10cSrcweir void HeaderBar::Tracking( const TrackingEvent& rTEvt )
975cdf0e10cSrcweir {
976cdf0e10cSrcweir     Point aMousePos = rTEvt.GetMouseEvent().GetPosPixel();
977cdf0e10cSrcweir 
978cdf0e10cSrcweir     if ( rTEvt.IsTrackingEnded() )
979cdf0e10cSrcweir         ImplEndDrag( rTEvt.IsTrackingCanceled() );
980cdf0e10cSrcweir     else
981cdf0e10cSrcweir         ImplDrag( aMousePos );
982cdf0e10cSrcweir }
983cdf0e10cSrcweir 
984cdf0e10cSrcweir // -----------------------------------------------------------------------
985cdf0e10cSrcweir 
Paint(const Rectangle & rRect)986cdf0e10cSrcweir void HeaderBar::Paint( const Rectangle& rRect )
987cdf0e10cSrcweir {
988cdf0e10cSrcweir     if ( mnBorderOff1 || mnBorderOff2 )
989cdf0e10cSrcweir     {
990cdf0e10cSrcweir         SetLineColor( GetSettings().GetStyleSettings().GetDarkShadowColor() );
991cdf0e10cSrcweir         if ( mnBorderOff1 )
992cdf0e10cSrcweir             DrawLine( Point( 0, 0 ), Point( mnDX-1, 0 ) );
993cdf0e10cSrcweir         if ( mnBorderOff2 )
994cdf0e10cSrcweir             DrawLine( Point( 0, mnDY-1 ), Point( mnDX-1, mnDY-1 ) );
995cdf0e10cSrcweir         // #i40393# draw left and right border, if WB_BORDER was set in ImplInit()
996cdf0e10cSrcweir         if ( mnBorderOff1 && mnBorderOff2 )
997cdf0e10cSrcweir         {
998cdf0e10cSrcweir             DrawLine( Point( 0, 0 ), Point( 0, mnDY-1 ) );
999cdf0e10cSrcweir             DrawLine( Point( mnDX-1, 0 ), Point( mnDX-1, mnDY-1 ) );
1000cdf0e10cSrcweir         }
1001cdf0e10cSrcweir     }
1002cdf0e10cSrcweir 
1003cdf0e10cSrcweir     sal_uInt16 nCurItemPos;
1004cdf0e10cSrcweir     if ( mbDrag )
1005cdf0e10cSrcweir         nCurItemPos = GetItemPos( mnCurItemId );
1006cdf0e10cSrcweir     else
1007cdf0e10cSrcweir         nCurItemPos = HEADERBAR_ITEM_NOTFOUND;
1008cdf0e10cSrcweir     sal_uInt16 nItemCount = (sal_uInt16)mpItemList->Count();
1009cdf0e10cSrcweir     for ( sal_uInt16 i = 0; i < nItemCount; i++ )
1010cdf0e10cSrcweir         ImplDrawItem( i, (i == nCurItemPos) ? sal_True : sal_False, sal_False, &rRect );
1011cdf0e10cSrcweir }
1012cdf0e10cSrcweir 
1013cdf0e10cSrcweir // -----------------------------------------------------------------------
1014cdf0e10cSrcweir 
Draw(OutputDevice * pDev,const Point & rPos,const Size & rSize,sal_uLong nFlags)1015cdf0e10cSrcweir void HeaderBar::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize,
1016cdf0e10cSrcweir                       sal_uLong nFlags )
1017cdf0e10cSrcweir {
1018cdf0e10cSrcweir     Point       aPos  = pDev->LogicToPixel( rPos );
1019cdf0e10cSrcweir     Size        aSize = pDev->LogicToPixel( rSize );
1020cdf0e10cSrcweir     Rectangle   aRect( aPos, aSize );
1021cdf0e10cSrcweir     Font        aFont = GetDrawPixelFont( pDev );
1022cdf0e10cSrcweir 
1023cdf0e10cSrcweir     pDev->Push();
1024cdf0e10cSrcweir     pDev->SetMapMode();
1025cdf0e10cSrcweir     pDev->SetFont( aFont );
1026cdf0e10cSrcweir     if ( nFlags & WINDOW_DRAW_MONO )
1027cdf0e10cSrcweir         pDev->SetTextColor( Color( COL_BLACK ) );
1028cdf0e10cSrcweir     else
1029cdf0e10cSrcweir         pDev->SetTextColor( GetTextColor() );
1030cdf0e10cSrcweir     pDev->SetTextFillColor();
1031cdf0e10cSrcweir 
1032cdf0e10cSrcweir     if ( !(nFlags & WINDOW_DRAW_NOBACKGROUND) )
1033cdf0e10cSrcweir     {
1034cdf0e10cSrcweir         pDev->DrawWallpaper( aRect, GetBackground() );
1035cdf0e10cSrcweir         if ( mnBorderOff1 || mnBorderOff2 )
1036cdf0e10cSrcweir         {
1037cdf0e10cSrcweir             pDev->SetLineColor( GetSettings().GetStyleSettings().GetDarkShadowColor() );
1038cdf0e10cSrcweir             if ( mnBorderOff1 )
1039cdf0e10cSrcweir                 pDev->DrawLine( aRect.TopLeft(), Point( aRect.Right(), aRect.Top() ) );
1040cdf0e10cSrcweir             if ( mnBorderOff2 )
1041cdf0e10cSrcweir                 pDev->DrawLine( Point( aRect.Left(), aRect.Bottom() ), Point( aRect.Right(), aRect.Bottom() ) );
1042cdf0e10cSrcweir             // #i40393# draw left and right border, if WB_BORDER was set in ImplInit()
1043cdf0e10cSrcweir             if ( mnBorderOff1 && mnBorderOff2 )
1044cdf0e10cSrcweir             {
1045cdf0e10cSrcweir                 pDev->DrawLine( aRect.TopLeft(), Point( aRect.Left(), aRect.Bottom() ) );
1046cdf0e10cSrcweir                 pDev->DrawLine( Point( aRect.Right(), aRect.Top() ), Point( aRect.Right(), aRect.Bottom() ) );
1047cdf0e10cSrcweir             }
1048cdf0e10cSrcweir         }
1049cdf0e10cSrcweir     }
1050cdf0e10cSrcweir 
1051cdf0e10cSrcweir     Rectangle aItemRect( aRect );
1052cdf0e10cSrcweir //    aItemRect.Bottom()--;
1053cdf0e10cSrcweir     sal_uInt16 nItemCount = (sal_uInt16)mpItemList->Count();
1054cdf0e10cSrcweir     for ( sal_uInt16 i = 0; i < nItemCount; i++ )
1055cdf0e10cSrcweir     {
1056cdf0e10cSrcweir         aItemRect.Left() = aRect.Left()+ImplGetItemPos( i );
1057cdf0e10cSrcweir         aItemRect.Right() = aItemRect.Left() + mpItemList->GetObject( i )->mnSize - 1;
1058cdf0e10cSrcweir         // Gegen Ueberlauf auf einigen Systemen testen
1059cdf0e10cSrcweir         if ( aItemRect.Right() > 16000 )
1060cdf0e10cSrcweir             aItemRect.Right() = 16000;
1061cdf0e10cSrcweir         Region aRegion( aRect );
1062cdf0e10cSrcweir         pDev->SetClipRegion( aRegion );
1063cdf0e10cSrcweir         ImplDrawItem( pDev, i, sal_False, sal_False, aItemRect, &aRect, nFlags );
1064cdf0e10cSrcweir         pDev->SetClipRegion();
1065cdf0e10cSrcweir     }
1066cdf0e10cSrcweir 
1067cdf0e10cSrcweir     pDev->Pop();
1068cdf0e10cSrcweir }
1069cdf0e10cSrcweir 
1070cdf0e10cSrcweir // -----------------------------------------------------------------------
1071cdf0e10cSrcweir 
Resize()1072cdf0e10cSrcweir void HeaderBar::Resize()
1073cdf0e10cSrcweir {
1074cdf0e10cSrcweir     Size aSize = GetOutputSizePixel();
1075cdf0e10cSrcweir     if ( IsVisible() && (mnDY != aSize.Height()) )
1076cdf0e10cSrcweir         Invalidate();
1077cdf0e10cSrcweir     mnDX = aSize.Width();
1078cdf0e10cSrcweir     mnDY = aSize.Height();
1079cdf0e10cSrcweir }
1080cdf0e10cSrcweir 
1081cdf0e10cSrcweir // -----------------------------------------------------------------------
1082cdf0e10cSrcweir 
Command(const CommandEvent & rCEvt)1083cdf0e10cSrcweir void HeaderBar::Command( const CommandEvent& rCEvt )
1084cdf0e10cSrcweir {
1085cdf0e10cSrcweir     if ( rCEvt.IsMouseEvent() && (rCEvt.GetCommand() == COMMAND_STARTDRAG) && !mbDrag )
1086cdf0e10cSrcweir     {
1087cdf0e10cSrcweir         ImplStartDrag( rCEvt.GetMousePosPixel(), sal_True );
1088cdf0e10cSrcweir         return;
1089cdf0e10cSrcweir     }
1090cdf0e10cSrcweir 
1091cdf0e10cSrcweir     Window::Command( rCEvt );
1092cdf0e10cSrcweir }
1093cdf0e10cSrcweir 
1094cdf0e10cSrcweir // -----------------------------------------------------------------------
1095cdf0e10cSrcweir 
RequestHelp(const HelpEvent & rHEvt)1096cdf0e10cSrcweir void HeaderBar::RequestHelp( const HelpEvent& rHEvt )
1097cdf0e10cSrcweir {
1098cdf0e10cSrcweir     sal_uInt16 nItemId = GetItemId( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ) );
1099cdf0e10cSrcweir     if ( nItemId )
1100cdf0e10cSrcweir     {
1101cdf0e10cSrcweir         if ( rHEvt.GetMode() & (HELPMODE_QUICK | HELPMODE_BALLOON) )
1102cdf0e10cSrcweir         {
1103cdf0e10cSrcweir             Rectangle aItemRect = GetItemRect( nItemId );
1104cdf0e10cSrcweir             Point aPt = OutputToScreenPixel( aItemRect.TopLeft() );
1105cdf0e10cSrcweir             aItemRect.Left()   = aPt.X();
1106cdf0e10cSrcweir             aItemRect.Top()    = aPt.Y();
1107cdf0e10cSrcweir             aPt = OutputToScreenPixel( aItemRect.BottomRight() );
1108cdf0e10cSrcweir             aItemRect.Right()  = aPt.X();
1109cdf0e10cSrcweir             aItemRect.Bottom() = aPt.Y();
1110cdf0e10cSrcweir 
1111cdf0e10cSrcweir             XubString aStr = GetHelpText( nItemId );
1112cdf0e10cSrcweir             if ( !aStr.Len() || !(rHEvt.GetMode() & HELPMODE_BALLOON) )
1113cdf0e10cSrcweir             {
1114cdf0e10cSrcweir                 ImplHeadItem* pItem = mpItemList->GetObject( GetItemPos( nItemId ) );
1115cdf0e10cSrcweir                 // Wir zeigen die Quick-Hilfe nur an, wenn Text nicht
1116cdf0e10cSrcweir                 // vollstaendig sichtbar, ansonsten zeigen wir den Hilfetext
1117cdf0e10cSrcweir                 // an, wenn das Item keinen Text besitzt
1118cdf0e10cSrcweir                 if ( pItem->maOutText != pItem->maText )
1119cdf0e10cSrcweir                     aStr = pItem->maText;
1120cdf0e10cSrcweir                 else if ( pItem->maText.Len() )
1121cdf0e10cSrcweir                     aStr.Erase();
1122cdf0e10cSrcweir             }
1123cdf0e10cSrcweir 
1124cdf0e10cSrcweir             if ( aStr.Len() )
1125cdf0e10cSrcweir             {
1126cdf0e10cSrcweir                 if ( rHEvt.GetMode() & HELPMODE_BALLOON )
1127cdf0e10cSrcweir                     Help::ShowBalloon( this, aItemRect.Center(), aItemRect, aStr );
1128cdf0e10cSrcweir                 else
1129cdf0e10cSrcweir                     Help::ShowQuickHelp( this, aItemRect, aStr );
1130cdf0e10cSrcweir                 return;
1131cdf0e10cSrcweir             }
1132cdf0e10cSrcweir         }
1133cdf0e10cSrcweir         else if ( rHEvt.GetMode() & HELPMODE_EXTENDED )
1134cdf0e10cSrcweir         {
1135cdf0e10cSrcweir             rtl::OUString aHelpId( rtl::OStringToOUString( GetHelpId( nItemId ), RTL_TEXTENCODING_UTF8 ) );
1136cdf0e10cSrcweir             if ( aHelpId.getLength() )
1137cdf0e10cSrcweir             {
1138cdf0e10cSrcweir                 // Wenn eine Hilfe existiert, dann ausloesen
1139cdf0e10cSrcweir                 Help* pHelp = Application::GetHelp();
1140cdf0e10cSrcweir                 if ( pHelp )
1141cdf0e10cSrcweir                     pHelp->Start( aHelpId, this );
1142cdf0e10cSrcweir                 return;
1143cdf0e10cSrcweir             }
1144cdf0e10cSrcweir         }
1145cdf0e10cSrcweir     }
1146cdf0e10cSrcweir 
1147cdf0e10cSrcweir     Window::RequestHelp( rHEvt );
1148cdf0e10cSrcweir }
1149cdf0e10cSrcweir 
1150cdf0e10cSrcweir // -----------------------------------------------------------------------
1151cdf0e10cSrcweir 
StateChanged(StateChangedType nType)1152cdf0e10cSrcweir void HeaderBar::StateChanged( StateChangedType nType )
1153cdf0e10cSrcweir {
1154cdf0e10cSrcweir     Window::StateChanged( nType );
1155cdf0e10cSrcweir 
1156cdf0e10cSrcweir     if ( nType == STATE_CHANGE_ENABLE )
1157cdf0e10cSrcweir         Invalidate();
1158cdf0e10cSrcweir     else if ( (nType == STATE_CHANGE_ZOOM) ||
1159cdf0e10cSrcweir               (nType == STATE_CHANGE_CONTROLFONT) )
1160cdf0e10cSrcweir     {
1161cdf0e10cSrcweir         ImplInitSettings( sal_True, sal_False, sal_False );
1162cdf0e10cSrcweir         Invalidate();
1163cdf0e10cSrcweir     }
1164cdf0e10cSrcweir     else if ( nType == STATE_CHANGE_CONTROLFOREGROUND )
1165cdf0e10cSrcweir     {
1166cdf0e10cSrcweir         ImplInitSettings( sal_False, sal_True, sal_False );
1167cdf0e10cSrcweir         Invalidate();
1168cdf0e10cSrcweir     }
1169cdf0e10cSrcweir     else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
1170cdf0e10cSrcweir     {
1171cdf0e10cSrcweir         ImplInitSettings( sal_False, sal_False, sal_True );
1172cdf0e10cSrcweir         Invalidate();
1173cdf0e10cSrcweir     }
1174cdf0e10cSrcweir }
1175cdf0e10cSrcweir 
1176cdf0e10cSrcweir // -----------------------------------------------------------------------
1177cdf0e10cSrcweir 
DataChanged(const DataChangedEvent & rDCEvt)1178cdf0e10cSrcweir void HeaderBar::DataChanged( const DataChangedEvent& rDCEvt )
1179cdf0e10cSrcweir {
1180cdf0e10cSrcweir     Window::DataChanged( rDCEvt );
1181cdf0e10cSrcweir 
1182cdf0e10cSrcweir     if ( (rDCEvt.GetType() == DATACHANGED_FONTS) ||
1183cdf0e10cSrcweir          (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
1184cdf0e10cSrcweir          ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
1185cdf0e10cSrcweir           (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
1186cdf0e10cSrcweir     {
1187cdf0e10cSrcweir         ImplInitSettings( sal_True, sal_True, sal_True );
1188cdf0e10cSrcweir         Invalidate();
1189cdf0e10cSrcweir     }
1190cdf0e10cSrcweir }
1191cdf0e10cSrcweir 
1192cdf0e10cSrcweir // -----------------------------------------------------------------------
1193cdf0e10cSrcweir 
UserDraw(const UserDrawEvent &)1194cdf0e10cSrcweir void HeaderBar::UserDraw( const UserDrawEvent& )
1195cdf0e10cSrcweir {
1196cdf0e10cSrcweir }
1197cdf0e10cSrcweir 
1198cdf0e10cSrcweir // -----------------------------------------------------------------------
1199cdf0e10cSrcweir 
StartDrag()1200cdf0e10cSrcweir void HeaderBar::StartDrag()
1201cdf0e10cSrcweir {
1202cdf0e10cSrcweir     maStartDragHdl.Call( this );
1203cdf0e10cSrcweir }
1204cdf0e10cSrcweir 
1205cdf0e10cSrcweir // -----------------------------------------------------------------------
1206cdf0e10cSrcweir 
Drag()1207cdf0e10cSrcweir void HeaderBar::Drag()
1208cdf0e10cSrcweir {
1209cdf0e10cSrcweir     maDragHdl.Call( this );
1210cdf0e10cSrcweir }
1211cdf0e10cSrcweir 
1212cdf0e10cSrcweir // -----------------------------------------------------------------------
1213cdf0e10cSrcweir 
EndDrag()1214cdf0e10cSrcweir void HeaderBar::EndDrag()
1215cdf0e10cSrcweir {
1216cdf0e10cSrcweir     maEndDragHdl.Call( this );
1217cdf0e10cSrcweir }
1218cdf0e10cSrcweir 
1219cdf0e10cSrcweir // -----------------------------------------------------------------------
1220cdf0e10cSrcweir 
Select()1221cdf0e10cSrcweir void HeaderBar::Select()
1222cdf0e10cSrcweir {
1223cdf0e10cSrcweir     maSelectHdl.Call( this );
1224cdf0e10cSrcweir }
1225cdf0e10cSrcweir 
1226cdf0e10cSrcweir // -----------------------------------------------------------------------
1227cdf0e10cSrcweir 
DoubleClick()1228cdf0e10cSrcweir void HeaderBar::DoubleClick()
1229cdf0e10cSrcweir {
1230cdf0e10cSrcweir     maDoubleClickHdl.Call( this );
1231cdf0e10cSrcweir }
1232cdf0e10cSrcweir 
1233cdf0e10cSrcweir // -----------------------------------------------------------------------
1234cdf0e10cSrcweir 
InsertItem(sal_uInt16 nItemId,const Image & rImage,long nSize,HeaderBarItemBits nBits,sal_uInt16 nPos)1235cdf0e10cSrcweir void HeaderBar::InsertItem( sal_uInt16 nItemId, const Image& rImage,
1236cdf0e10cSrcweir                             long nSize, HeaderBarItemBits nBits, sal_uInt16 nPos )
1237cdf0e10cSrcweir {
1238cdf0e10cSrcweir     DBG_ASSERT( nItemId, "HeaderBar::InsertItem(): ItemId == 0" );
1239cdf0e10cSrcweir     DBG_ASSERT( GetItemPos( nItemId ) == HEADERBAR_ITEM_NOTFOUND,
1240cdf0e10cSrcweir                 "HeaderBar::InsertItem(): ItemId already exists" );
1241cdf0e10cSrcweir 
1242cdf0e10cSrcweir     // Item anlegen und in die Liste einfuegen
1243cdf0e10cSrcweir     ImplHeadItem* pItem = new ImplHeadItem;
1244cdf0e10cSrcweir     pItem->mnId         = nItemId;
1245cdf0e10cSrcweir     pItem->mnBits       = nBits;
1246cdf0e10cSrcweir     pItem->mnSize       = nSize;
1247cdf0e10cSrcweir     pItem->maImage      = rImage;
1248cdf0e10cSrcweir     pItem->mpUserData   = 0;
1249cdf0e10cSrcweir     mpItemList->Insert( pItem, nPos );
1250cdf0e10cSrcweir 
1251cdf0e10cSrcweir     // Ausgabe updaten
1252cdf0e10cSrcweir     ImplUpdate( nPos, sal_True );
1253cdf0e10cSrcweir }
1254cdf0e10cSrcweir 
1255cdf0e10cSrcweir // -----------------------------------------------------------------------
1256cdf0e10cSrcweir 
InsertItem(sal_uInt16 nItemId,const XubString & rText,long nSize,HeaderBarItemBits nBits,sal_uInt16 nPos)1257cdf0e10cSrcweir void HeaderBar::InsertItem( sal_uInt16 nItemId, const XubString& rText,
1258cdf0e10cSrcweir                             long nSize, HeaderBarItemBits nBits, sal_uInt16 nPos )
1259cdf0e10cSrcweir {
1260cdf0e10cSrcweir     DBG_ASSERT( nItemId, "HeaderBar::InsertItem(): ItemId == 0" );
1261cdf0e10cSrcweir     DBG_ASSERT( GetItemPos( nItemId ) == HEADERBAR_ITEM_NOTFOUND,
1262cdf0e10cSrcweir                 "HeaderBar::InsertItem(): ItemId already exists" );
1263cdf0e10cSrcweir 
1264cdf0e10cSrcweir     // Item anlegen und in die Liste einfuegen
1265cdf0e10cSrcweir     ImplHeadItem* pItem = new ImplHeadItem;
1266cdf0e10cSrcweir     pItem->mnId         = nItemId;
1267cdf0e10cSrcweir     pItem->mnBits       = nBits;
1268cdf0e10cSrcweir     pItem->mnSize       = nSize;
1269cdf0e10cSrcweir     pItem->maText       = rText;
1270cdf0e10cSrcweir     pItem->mpUserData   = 0;
1271cdf0e10cSrcweir     mpItemList->Insert( pItem, nPos );
1272cdf0e10cSrcweir 
1273cdf0e10cSrcweir     // Ausgabe updaten
1274cdf0e10cSrcweir     ImplUpdate( nPos, sal_True );
1275cdf0e10cSrcweir }
1276cdf0e10cSrcweir 
1277cdf0e10cSrcweir // -----------------------------------------------------------------------
1278cdf0e10cSrcweir 
InsertItem(sal_uInt16 nItemId,const Image & rImage,const XubString & rText,long nSize,HeaderBarItemBits nBits,sal_uInt16 nPos)1279cdf0e10cSrcweir void HeaderBar::InsertItem( sal_uInt16 nItemId,
1280cdf0e10cSrcweir                             const Image& rImage, const XubString& rText,
1281cdf0e10cSrcweir                             long nSize, HeaderBarItemBits nBits,
1282cdf0e10cSrcweir                             sal_uInt16 nPos )
1283cdf0e10cSrcweir {
1284cdf0e10cSrcweir     DBG_ASSERT( nItemId, "HeaderBar::InsertItem(): ItemId == 0" );
1285cdf0e10cSrcweir     DBG_ASSERT( GetItemPos( nItemId ) == HEADERBAR_ITEM_NOTFOUND,
1286cdf0e10cSrcweir                 "HeaderBar::InsertItem(): ItemId already exists" );
1287cdf0e10cSrcweir 
1288cdf0e10cSrcweir     // Item anlegen und in die Liste einfuegen
1289cdf0e10cSrcweir     ImplHeadItem* pItem = new ImplHeadItem;
1290cdf0e10cSrcweir     pItem->mnId         = nItemId;
1291cdf0e10cSrcweir     pItem->mnBits       = nBits;
1292cdf0e10cSrcweir     pItem->mnSize       = nSize;
1293cdf0e10cSrcweir     pItem->maImage      = rImage;
1294cdf0e10cSrcweir     pItem->maText       = rText;
1295cdf0e10cSrcweir     pItem->mpUserData   = 0;
1296cdf0e10cSrcweir     mpItemList->Insert( pItem, nPos );
1297cdf0e10cSrcweir 
1298cdf0e10cSrcweir     // Ausgabe updaten
1299cdf0e10cSrcweir     ImplUpdate( nPos, sal_True );
1300cdf0e10cSrcweir }
1301cdf0e10cSrcweir 
1302cdf0e10cSrcweir // -----------------------------------------------------------------------
1303cdf0e10cSrcweir 
RemoveItem(sal_uInt16 nItemId)1304cdf0e10cSrcweir void HeaderBar::RemoveItem( sal_uInt16 nItemId )
1305cdf0e10cSrcweir {
1306cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1307cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1308cdf0e10cSrcweir     {
1309cdf0e10cSrcweir         ImplHeadItem* pItem = mpItemList->Remove( nPos );
1310cdf0e10cSrcweir         delete pItem;
1311cdf0e10cSrcweir         ImplUpdate( nPos, sal_True );
1312cdf0e10cSrcweir     }
1313cdf0e10cSrcweir }
1314cdf0e10cSrcweir 
1315cdf0e10cSrcweir // -----------------------------------------------------------------------
1316cdf0e10cSrcweir 
MoveItem(sal_uInt16 nItemId,sal_uInt16 nNewPos)1317cdf0e10cSrcweir void HeaderBar::MoveItem( sal_uInt16 nItemId, sal_uInt16 nNewPos )
1318cdf0e10cSrcweir {
1319cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1320cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1321cdf0e10cSrcweir     {
1322cdf0e10cSrcweir         if ( nPos != nNewPos )
1323cdf0e10cSrcweir         {
1324cdf0e10cSrcweir             ImplHeadItem* pItem = mpItemList->Remove( nPos );
1325cdf0e10cSrcweir             if ( nNewPos < nPos )
1326cdf0e10cSrcweir                 nPos = nNewPos;
1327cdf0e10cSrcweir             mpItemList->Insert( pItem, nNewPos );
1328cdf0e10cSrcweir             ImplUpdate( nPos, sal_True );
1329cdf0e10cSrcweir         }
1330cdf0e10cSrcweir     }
1331cdf0e10cSrcweir }
1332cdf0e10cSrcweir 
1333cdf0e10cSrcweir // -----------------------------------------------------------------------
1334cdf0e10cSrcweir 
Clear()1335cdf0e10cSrcweir void HeaderBar::Clear()
1336cdf0e10cSrcweir {
1337cdf0e10cSrcweir     // Alle Items loeschen
1338cdf0e10cSrcweir     ImplHeadItem* pItem = mpItemList->First();
1339cdf0e10cSrcweir     while ( pItem )
1340cdf0e10cSrcweir     {
1341cdf0e10cSrcweir         delete pItem;
1342cdf0e10cSrcweir         pItem = mpItemList->Next();
1343cdf0e10cSrcweir     }
1344cdf0e10cSrcweir     mpItemList->Clear();
1345cdf0e10cSrcweir 
1346cdf0e10cSrcweir     ImplUpdate( 0, sal_True );
1347cdf0e10cSrcweir }
1348cdf0e10cSrcweir 
1349cdf0e10cSrcweir // -----------------------------------------------------------------------
1350cdf0e10cSrcweir 
SetOffset(long nNewOffset)1351cdf0e10cSrcweir void HeaderBar::SetOffset( long nNewOffset )
1352cdf0e10cSrcweir {
1353cdf0e10cSrcweir     // Hier erstmal neu zeichnen, damit mit alten Offset noch das
1354cdf0e10cSrcweir     // richtige gemalt wird
1355cdf0e10cSrcweir     //Update();
1356cdf0e10cSrcweir 
1357cdf0e10cSrcweir     // Bereich verschieben
1358cdf0e10cSrcweir     Rectangle aRect( 0, mnBorderOff1, mnDX-1, mnDY-mnBorderOff1-mnBorderOff2-1 );
1359cdf0e10cSrcweir     long nDelta = mnOffset-nNewOffset;
1360cdf0e10cSrcweir     mnOffset = nNewOffset;
1361cdf0e10cSrcweir     Scroll( nDelta, 0, aRect );
1362cdf0e10cSrcweir }
1363cdf0e10cSrcweir 
1364cdf0e10cSrcweir // -----------------------------------------------------------------------
1365cdf0e10cSrcweir 
GetItemCount() const1366cdf0e10cSrcweir sal_uInt16 HeaderBar::GetItemCount() const
1367cdf0e10cSrcweir {
1368cdf0e10cSrcweir     return (sal_uInt16)mpItemList->Count();
1369cdf0e10cSrcweir }
1370cdf0e10cSrcweir 
1371cdf0e10cSrcweir // -----------------------------------------------------------------------
1372cdf0e10cSrcweir 
GetItemPos(sal_uInt16 nItemId) const1373cdf0e10cSrcweir sal_uInt16 HeaderBar::GetItemPos( sal_uInt16 nItemId ) const
1374cdf0e10cSrcweir {
1375cdf0e10cSrcweir     ImplHeadItem* pItem = mpItemList->First();
1376cdf0e10cSrcweir     while ( pItem )
1377cdf0e10cSrcweir     {
1378cdf0e10cSrcweir         if ( pItem->mnId == nItemId )
1379cdf0e10cSrcweir             return (sal_uInt16)mpItemList->GetCurPos();
1380cdf0e10cSrcweir         pItem = mpItemList->Next();
1381cdf0e10cSrcweir     }
1382cdf0e10cSrcweir 
1383cdf0e10cSrcweir     return HEADERBAR_ITEM_NOTFOUND;
1384cdf0e10cSrcweir }
1385cdf0e10cSrcweir 
1386cdf0e10cSrcweir // -----------------------------------------------------------------------
1387cdf0e10cSrcweir 
GetItemId(sal_uInt16 nPos) const1388cdf0e10cSrcweir sal_uInt16 HeaderBar::GetItemId( sal_uInt16 nPos ) const
1389cdf0e10cSrcweir {
1390cdf0e10cSrcweir     ImplHeadItem* pItem = mpItemList->GetObject( nPos );
1391cdf0e10cSrcweir     if ( pItem )
1392cdf0e10cSrcweir         return pItem->mnId;
1393cdf0e10cSrcweir     else
1394cdf0e10cSrcweir         return 0;
1395cdf0e10cSrcweir }
1396cdf0e10cSrcweir 
1397cdf0e10cSrcweir // -----------------------------------------------------------------------
1398cdf0e10cSrcweir 
GetItemId(const Point & rPos) const1399cdf0e10cSrcweir sal_uInt16 HeaderBar::GetItemId( const Point& rPos ) const
1400cdf0e10cSrcweir {
1401cdf0e10cSrcweir     sal_uInt16 nPos = 0;
1402cdf0e10cSrcweir     while ( nPos < mpItemList->Count() )
1403cdf0e10cSrcweir     {
1404cdf0e10cSrcweir         if ( ImplGetItemRect( nPos ).IsInside( rPos ) )
1405cdf0e10cSrcweir             return GetItemId( nPos );
1406cdf0e10cSrcweir 
1407cdf0e10cSrcweir         nPos++;
1408cdf0e10cSrcweir     }
1409cdf0e10cSrcweir 
1410cdf0e10cSrcweir     return 0;
1411cdf0e10cSrcweir }
1412cdf0e10cSrcweir 
1413cdf0e10cSrcweir // -----------------------------------------------------------------------
1414cdf0e10cSrcweir 
GetItemRect(sal_uInt16 nItemId) const1415cdf0e10cSrcweir Rectangle HeaderBar::GetItemRect( sal_uInt16 nItemId ) const
1416cdf0e10cSrcweir {
1417cdf0e10cSrcweir     Rectangle aRect;
1418cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1419cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1420cdf0e10cSrcweir         aRect = ImplGetItemRect( nPos );
1421cdf0e10cSrcweir     return aRect;
1422cdf0e10cSrcweir }
1423cdf0e10cSrcweir 
1424cdf0e10cSrcweir // -----------------------------------------------------------------------
1425cdf0e10cSrcweir 
SetItemSize(sal_uInt16 nItemId,long nNewSize)1426cdf0e10cSrcweir void HeaderBar::SetItemSize( sal_uInt16 nItemId, long nNewSize )
1427cdf0e10cSrcweir {
1428cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1429cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1430cdf0e10cSrcweir     {
1431cdf0e10cSrcweir         ImplHeadItem* pItem = mpItemList->GetObject( nPos );
1432cdf0e10cSrcweir         if ( pItem->mnSize != nNewSize )
1433cdf0e10cSrcweir         {
1434cdf0e10cSrcweir             pItem->mnSize = nNewSize;
1435cdf0e10cSrcweir             ImplUpdate( nPos, sal_True );
1436cdf0e10cSrcweir         }
1437cdf0e10cSrcweir     }
1438cdf0e10cSrcweir }
1439cdf0e10cSrcweir 
1440cdf0e10cSrcweir // -----------------------------------------------------------------------
1441cdf0e10cSrcweir 
GetItemSize(sal_uInt16 nItemId) const1442cdf0e10cSrcweir long HeaderBar::GetItemSize( sal_uInt16 nItemId ) const
1443cdf0e10cSrcweir {
1444cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1445cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1446cdf0e10cSrcweir         return mpItemList->GetObject( nPos )->mnSize;
1447cdf0e10cSrcweir     else
1448cdf0e10cSrcweir         return 0;
1449cdf0e10cSrcweir }
1450cdf0e10cSrcweir 
1451cdf0e10cSrcweir // -----------------------------------------------------------------------
1452cdf0e10cSrcweir 
SetItemBits(sal_uInt16 nItemId,HeaderBarItemBits nNewBits)1453cdf0e10cSrcweir void HeaderBar::SetItemBits( sal_uInt16 nItemId, HeaderBarItemBits nNewBits )
1454cdf0e10cSrcweir {
1455cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1456cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1457cdf0e10cSrcweir     {
1458cdf0e10cSrcweir         ImplHeadItem* pItem = mpItemList->GetObject( nPos );
1459cdf0e10cSrcweir         if ( pItem->mnBits != nNewBits )
1460cdf0e10cSrcweir         {
1461cdf0e10cSrcweir             pItem->mnBits = nNewBits;
1462cdf0e10cSrcweir             ImplUpdate( nPos );
1463cdf0e10cSrcweir         }
1464cdf0e10cSrcweir     }
1465cdf0e10cSrcweir }
1466cdf0e10cSrcweir 
1467cdf0e10cSrcweir // -----------------------------------------------------------------------
1468cdf0e10cSrcweir 
GetItemBits(sal_uInt16 nItemId) const1469cdf0e10cSrcweir HeaderBarItemBits HeaderBar::GetItemBits( sal_uInt16 nItemId ) const
1470cdf0e10cSrcweir {
1471cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1472cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1473cdf0e10cSrcweir         return mpItemList->GetObject( nPos )->mnBits;
1474cdf0e10cSrcweir     else
1475cdf0e10cSrcweir         return 0;
1476cdf0e10cSrcweir }
1477cdf0e10cSrcweir 
1478cdf0e10cSrcweir // -----------------------------------------------------------------------
1479cdf0e10cSrcweir 
SetItemData(sal_uInt16 nItemId,void * pNewData)1480cdf0e10cSrcweir void HeaderBar::SetItemData( sal_uInt16 nItemId, void* pNewData )
1481cdf0e10cSrcweir {
1482cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1483cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1484cdf0e10cSrcweir     {
1485cdf0e10cSrcweir         mpItemList->GetObject( nPos )->mpUserData = pNewData;
1486cdf0e10cSrcweir         ImplUpdate( nPos );
1487cdf0e10cSrcweir     }
1488cdf0e10cSrcweir }
1489cdf0e10cSrcweir 
1490cdf0e10cSrcweir // -----------------------------------------------------------------------
1491cdf0e10cSrcweir 
GetItemData(sal_uInt16 nItemId) const1492cdf0e10cSrcweir void* HeaderBar::GetItemData( sal_uInt16 nItemId ) const
1493cdf0e10cSrcweir {
1494cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1495cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1496cdf0e10cSrcweir         return mpItemList->GetObject( nPos )->mpUserData;
1497cdf0e10cSrcweir     else
1498cdf0e10cSrcweir         return NULL;
1499cdf0e10cSrcweir }
1500cdf0e10cSrcweir 
1501cdf0e10cSrcweir // -----------------------------------------------------------------------
1502cdf0e10cSrcweir 
SetItemImage(sal_uInt16 nItemId,const Image & rImage)1503cdf0e10cSrcweir void HeaderBar::SetItemImage( sal_uInt16 nItemId, const Image& rImage )
1504cdf0e10cSrcweir {
1505cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1506cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1507cdf0e10cSrcweir     {
1508cdf0e10cSrcweir         mpItemList->GetObject( nPos )->maImage = rImage;
1509cdf0e10cSrcweir         ImplUpdate( nPos );
1510cdf0e10cSrcweir     }
1511cdf0e10cSrcweir }
1512cdf0e10cSrcweir 
1513cdf0e10cSrcweir // -----------------------------------------------------------------------
1514cdf0e10cSrcweir 
GetItemImage(sal_uInt16 nItemId) const1515cdf0e10cSrcweir Image HeaderBar::GetItemImage( sal_uInt16 nItemId ) const
1516cdf0e10cSrcweir {
1517cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1518cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1519cdf0e10cSrcweir         return mpItemList->GetObject( nPos )->maImage;
1520cdf0e10cSrcweir     else
1521cdf0e10cSrcweir         return Image();
1522cdf0e10cSrcweir }
1523cdf0e10cSrcweir 
1524cdf0e10cSrcweir // -----------------------------------------------------------------------
1525cdf0e10cSrcweir 
SetItemText(sal_uInt16 nItemId,const XubString & rText)1526cdf0e10cSrcweir void HeaderBar::SetItemText( sal_uInt16 nItemId, const XubString& rText )
1527cdf0e10cSrcweir {
1528cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1529cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1530cdf0e10cSrcweir     {
1531cdf0e10cSrcweir         mpItemList->GetObject( nPos )->maText = rText;
1532cdf0e10cSrcweir         ImplUpdate( nPos );
1533cdf0e10cSrcweir     }
1534cdf0e10cSrcweir }
1535cdf0e10cSrcweir 
1536cdf0e10cSrcweir // -----------------------------------------------------------------------
1537cdf0e10cSrcweir 
GetItemText(sal_uInt16 nItemId) const1538cdf0e10cSrcweir XubString HeaderBar::GetItemText( sal_uInt16 nItemId ) const
1539cdf0e10cSrcweir {
1540cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1541cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1542cdf0e10cSrcweir         return mpItemList->GetObject( nPos )->maText;
1543cdf0e10cSrcweir     else
1544cdf0e10cSrcweir         return String();
1545cdf0e10cSrcweir }
1546cdf0e10cSrcweir 
1547cdf0e10cSrcweir // -----------------------------------------------------------------------
1548cdf0e10cSrcweir 
SetHelpText(sal_uInt16 nItemId,const XubString & rText)1549cdf0e10cSrcweir void HeaderBar::SetHelpText( sal_uInt16 nItemId, const XubString& rText )
1550cdf0e10cSrcweir {
1551cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1552cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1553cdf0e10cSrcweir         mpItemList->GetObject( nPos )->maHelpText = rText;
1554cdf0e10cSrcweir }
1555cdf0e10cSrcweir 
1556cdf0e10cSrcweir // -----------------------------------------------------------------------
1557cdf0e10cSrcweir 
GetHelpText(sal_uInt16 nItemId) const1558cdf0e10cSrcweir XubString HeaderBar::GetHelpText( sal_uInt16 nItemId ) const
1559cdf0e10cSrcweir {
1560cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1561cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1562cdf0e10cSrcweir     {
1563cdf0e10cSrcweir         ImplHeadItem* pItem = mpItemList->GetObject( nPos );
1564cdf0e10cSrcweir         if ( !pItem->maHelpText.Len() && pItem->maHelpId.getLength() )
1565cdf0e10cSrcweir         {
1566cdf0e10cSrcweir             Help* pHelp = Application::GetHelp();
1567cdf0e10cSrcweir             if ( pHelp )
1568cdf0e10cSrcweir                 pItem->maHelpText = pHelp->GetHelpText( rtl::OStringToOUString( pItem->maHelpId, RTL_TEXTENCODING_UTF8 ), this );
1569cdf0e10cSrcweir         }
1570cdf0e10cSrcweir 
1571cdf0e10cSrcweir         return pItem->maHelpText;
1572cdf0e10cSrcweir     }
1573cdf0e10cSrcweir     else
1574cdf0e10cSrcweir         return XubString();
1575cdf0e10cSrcweir }
1576cdf0e10cSrcweir 
1577cdf0e10cSrcweir // -----------------------------------------------------------------------
1578cdf0e10cSrcweir 
SetHelpId(sal_uInt16 nItemId,const rtl::OString & rHelpId)1579cdf0e10cSrcweir void HeaderBar::SetHelpId( sal_uInt16 nItemId, const rtl::OString& rHelpId )
1580cdf0e10cSrcweir {
1581cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1582cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1583cdf0e10cSrcweir         mpItemList->GetObject( nPos )->maHelpId = rHelpId;
1584cdf0e10cSrcweir }
1585cdf0e10cSrcweir 
1586cdf0e10cSrcweir // -----------------------------------------------------------------------
1587cdf0e10cSrcweir 
GetHelpId(sal_uInt16 nItemId) const1588cdf0e10cSrcweir rtl::OString HeaderBar::GetHelpId( sal_uInt16 nItemId ) const
1589cdf0e10cSrcweir {
1590cdf0e10cSrcweir     sal_uInt16 nPos = GetItemPos( nItemId );
1591cdf0e10cSrcweir     rtl::OString aRet;
1592cdf0e10cSrcweir     if ( nPos != HEADERBAR_ITEM_NOTFOUND )
1593cdf0e10cSrcweir         aRet = mpItemList->GetObject( nPos )->maHelpId;
1594cdf0e10cSrcweir     return aRet;
1595cdf0e10cSrcweir }
1596cdf0e10cSrcweir 
1597cdf0e10cSrcweir // -----------------------------------------------------------------------
1598cdf0e10cSrcweir 
CalcWindowSizePixel() const1599cdf0e10cSrcweir Size HeaderBar::CalcWindowSizePixel() const
1600cdf0e10cSrcweir {
1601cdf0e10cSrcweir     long nMaxImageSize = 0;
1602cdf0e10cSrcweir     Size aSize( 0, GetTextHeight() );
1603cdf0e10cSrcweir 
1604cdf0e10cSrcweir     ImplHeadItem* pItem = mpItemList->First();
1605cdf0e10cSrcweir     while ( pItem )
1606cdf0e10cSrcweir     {
1607cdf0e10cSrcweir         // Image-Groessen beruecksichtigen
1608cdf0e10cSrcweir         long nImageHeight = pItem->maImage.GetSizePixel().Height();
1609cdf0e10cSrcweir         if ( !(pItem->mnBits & (HIB_LEFTIMAGE | HIB_RIGHTIMAGE)) && pItem->maText.Len() )
1610cdf0e10cSrcweir             nImageHeight += aSize.Height();
1611cdf0e10cSrcweir         if ( nImageHeight > nMaxImageSize )
1612cdf0e10cSrcweir             nMaxImageSize = nImageHeight;
1613cdf0e10cSrcweir 
1614cdf0e10cSrcweir         // Breite aufaddieren
1615cdf0e10cSrcweir         aSize.Width() += pItem->mnSize;
1616cdf0e10cSrcweir 
1617cdf0e10cSrcweir         pItem = mpItemList->Next();
1618cdf0e10cSrcweir     }
1619cdf0e10cSrcweir 
1620cdf0e10cSrcweir     if ( nMaxImageSize > aSize.Height() )
1621cdf0e10cSrcweir         aSize.Height() = nMaxImageSize;
1622cdf0e10cSrcweir 
1623cdf0e10cSrcweir     // Border aufaddieren
1624cdf0e10cSrcweir     if ( mbButtonStyle )
1625cdf0e10cSrcweir         aSize.Height() += 4;
1626cdf0e10cSrcweir     else
1627cdf0e10cSrcweir         aSize.Height() += 2;
1628cdf0e10cSrcweir     aSize.Height() += mnBorderOff1+mnBorderOff2;
1629cdf0e10cSrcweir 
1630cdf0e10cSrcweir     return aSize;
1631cdf0e10cSrcweir }
1632cdf0e10cSrcweir 
CreateAccessible()1633cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > HeaderBar::CreateAccessible()
1634cdf0e10cSrcweir {
1635cdf0e10cSrcweir     if ( !mxAccessible.is() )
1636cdf0e10cSrcweir     {
1637cdf0e10cSrcweir         if ( maCreateAccessibleHdl.IsSet() )
1638cdf0e10cSrcweir             maCreateAccessibleHdl.Call( this );
1639cdf0e10cSrcweir 
1640cdf0e10cSrcweir         if ( !mxAccessible.is() )
1641cdf0e10cSrcweir             mxAccessible = Window::CreateAccessible();
1642cdf0e10cSrcweir     }
1643cdf0e10cSrcweir 
1644cdf0e10cSrcweir     return mxAccessible;
1645cdf0e10cSrcweir }
1646cdf0e10cSrcweir 
SetAccessible(::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> _xAccessible)1647cdf0e10cSrcweir void HeaderBar::SetAccessible( ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > _xAccessible )
1648cdf0e10cSrcweir {
1649cdf0e10cSrcweir     mxAccessible = _xAccessible;
1650cdf0e10cSrcweir }
1651cdf0e10cSrcweir 
GetComponentInterface(sal_Bool bCreate)16522bfcd321SSteve Yin ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > HeaderBar::GetComponentInterface( sal_Bool bCreate )
16532bfcd321SSteve Yin {
16542bfcd321SSteve Yin     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > xPeer
16552bfcd321SSteve Yin         (Window::GetComponentInterface(false));
16562bfcd321SSteve Yin     if ( !xPeer.is() && bCreate )
16572bfcd321SSteve Yin     {
16582bfcd321SSteve Yin         ::com::sun::star::awt::XWindowPeer* mxPeer = new VCLXHeaderBar(this);
16592bfcd321SSteve Yin         m_pVCLXHeaderBar = (VCLXHeaderBar*)(mxPeer);
16602bfcd321SSteve Yin         SetComponentInterface(mxPeer);
16612bfcd321SSteve Yin         return mxPeer;
16622bfcd321SSteve Yin     }
16632bfcd321SSteve Yin     else
16642bfcd321SSteve Yin         return xPeer;
16652bfcd321SSteve Yin }
1666