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