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