xref: /aoo41x/main/svtools/source/contnr/imivctl1.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_svtools.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <limits.h>
32*cdf0e10cSrcweir #include <tools/debug.hxx>
33*cdf0e10cSrcweir #include <vcl/wall.hxx>
34*cdf0e10cSrcweir #include <vcl/help.hxx>
35*cdf0e10cSrcweir #include <vcl/decoview.hxx>
36*cdf0e10cSrcweir #include <vcl/svapp.hxx>
37*cdf0e10cSrcweir #include <tools/poly.hxx>
38*cdf0e10cSrcweir #include <vcl/lineinfo.hxx>
39*cdf0e10cSrcweir #include <vcl/i18nhelp.hxx>
40*cdf0e10cSrcweir #include <vcl/mnemonic.hxx>
41*cdf0e10cSrcweir #include <vcl/controllayout.hxx>
42*cdf0e10cSrcweir 
43*cdf0e10cSrcweir #include <svtools/ivctrl.hxx>
44*cdf0e10cSrcweir #include "imivctl.hxx"
45*cdf0e10cSrcweir #include <svtools/svmedit.hxx>
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir #include <algorithm>
48*cdf0e10cSrcweir #include <memory>
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir #define DD_SCROLL_PIXEL 24
51*cdf0e10cSrcweir #define IMPICNVIEW_ACC_RETURN 1
52*cdf0e10cSrcweir #define IMPICNVIEW_ACC_ESCAPE 2
53*cdf0e10cSrcweir 
54*cdf0e10cSrcweir #define DRAWTEXT_FLAGS_ICON \
55*cdf0e10cSrcweir 	( TEXT_DRAW_CENTER | TEXT_DRAW_TOP | TEXT_DRAW_ENDELLIPSIS | \
56*cdf0e10cSrcweir 	  TEXT_DRAW_CLIP | TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK | TEXT_DRAW_MNEMONIC )
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir #define DRAWTEXT_FLAGS_SMALLICON (TEXT_DRAW_LEFT|TEXT_DRAW_ENDELLIPSIS|TEXT_DRAW_CLIP)
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir #define EVENTID_SHOW_CURSOR				((void*)1)
61*cdf0e10cSrcweir #define EVENTID_ADJUST_SCROLLBARS		((void*)2)
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir struct SvxIconChoiceCtrlEntry_Impl
64*cdf0e10cSrcweir {
65*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry*	_pEntry;
66*cdf0e10cSrcweir 	Point			_aPos;
67*cdf0e10cSrcweir 					SvxIconChoiceCtrlEntry_Impl( SvxIconChoiceCtrlEntry* pEntry, const Rectangle& rBoundRect )
68*cdf0e10cSrcweir 					: _pEntry( pEntry), _aPos( rBoundRect.TopLeft()) {}
69*cdf0e10cSrcweir };
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir static sal_Bool bEndScrollInvalidate = sal_True;
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir // ----------------------------------------------------------------------------------------------
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir class IcnViewEdit_Impl : public MultiLineEdit
76*cdf0e10cSrcweir {
77*cdf0e10cSrcweir 	Link 			aCallBackHdl;
78*cdf0e10cSrcweir 	Accelerator 	aAccReturn;
79*cdf0e10cSrcweir 	Accelerator 	aAccEscape;
80*cdf0e10cSrcweir 	Timer 			aTimer;
81*cdf0e10cSrcweir 	sal_Bool 			bCanceled;
82*cdf0e10cSrcweir 	sal_Bool 			bAlreadyInCallback;
83*cdf0e10cSrcweir 	sal_Bool			bGrabFocus;
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir 	void 			CallCallBackHdl_Impl();
86*cdf0e10cSrcweir 					DECL_LINK( Timeout_Impl, Timer * );
87*cdf0e10cSrcweir 					DECL_LINK( ReturnHdl_Impl, Accelerator * );
88*cdf0e10cSrcweir 					DECL_LINK( EscapeHdl_Impl, Accelerator * );
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir public:
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir 					IcnViewEdit_Impl(
93*cdf0e10cSrcweir 						SvtIconChoiceCtrl* pParent,
94*cdf0e10cSrcweir 						const Point& rPos,
95*cdf0e10cSrcweir 						const Size& rSize,
96*cdf0e10cSrcweir 						const XubString& rData,
97*cdf0e10cSrcweir 						const Link& rNotifyEditEnd );
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir 					~IcnViewEdit_Impl();
100*cdf0e10cSrcweir 	virtual void 	KeyInput( const KeyEvent& rKEvt );
101*cdf0e10cSrcweir 	virtual long 	PreNotify( NotifyEvent& rNEvt );
102*cdf0e10cSrcweir 	sal_Bool			EditingCanceled() const { return bCanceled; }
103*cdf0e10cSrcweir 	void			StopEditing( sal_Bool bCancel = sal_False );
104*cdf0e10cSrcweir 	sal_Bool			IsGrabFocus() const { return bGrabFocus; }
105*cdf0e10cSrcweir };
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir // ----------------------------------------------------------------------------------------------
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir // ----------------------------------------------------------------------------------------------
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir SvxIconChoiceCtrl_Impl::SvxIconChoiceCtrl_Impl( SvtIconChoiceCtrl* pCurView,
112*cdf0e10cSrcweir 	WinBits nWinStyle ) :
113*cdf0e10cSrcweir 	aEntries( this ),
114*cdf0e10cSrcweir 	aVerSBar( pCurView, WB_DRAG | WB_VSCROLL ),
115*cdf0e10cSrcweir 	aHorSBar( pCurView, WB_DRAG | WB_HSCROLL ),
116*cdf0e10cSrcweir 	aScrBarBox( pCurView ),
117*cdf0e10cSrcweir 	aImageSize( 32, 32 ),
118*cdf0e10cSrcweir 	pColumns( 0 )
119*cdf0e10cSrcweir {
120*cdf0e10cSrcweir 	bChooseWithCursor=sal_False;
121*cdf0e10cSrcweir 	pEntryPaintDev = 0;
122*cdf0e10cSrcweir 	pCurEditedEntry = 0;
123*cdf0e10cSrcweir 	pCurHighlightFrame = 0;
124*cdf0e10cSrcweir 	pEdit = 0;
125*cdf0e10cSrcweir 	pAnchor = 0;
126*cdf0e10cSrcweir 	pDraggedSelection = 0;
127*cdf0e10cSrcweir 	pPrevDropTarget = 0;
128*cdf0e10cSrcweir 	pHdlEntry = 0;
129*cdf0e10cSrcweir 	pHead = NULL;
130*cdf0e10cSrcweir 	pCursor = NULL;
131*cdf0e10cSrcweir 	bUpdateMode = sal_True;
132*cdf0e10cSrcweir     bEntryEditingEnabled = sal_False;
133*cdf0e10cSrcweir 	bInDragDrop = sal_False;
134*cdf0e10cSrcweir 	bHighlightFramePressed = sal_False;
135*cdf0e10cSrcweir 	eSelectionMode = MULTIPLE_SELECTION;
136*cdf0e10cSrcweir 	pView = pCurView;
137*cdf0e10cSrcweir 	pZOrderList = new List; //SvPtrarr;
138*cdf0e10cSrcweir 	ePositionMode = IcnViewPositionModeFree;
139*cdf0e10cSrcweir 	SetStyle( nWinStyle );
140*cdf0e10cSrcweir 	nFlags = 0;
141*cdf0e10cSrcweir 	nUserEventAdjustScrBars = 0;
142*cdf0e10cSrcweir 	nUserEventShowCursor = 0;
143*cdf0e10cSrcweir 	nMaxVirtWidth = DEFAULT_MAX_VIRT_WIDTH;
144*cdf0e10cSrcweir 	nMaxVirtHeight = DEFAULT_MAX_VIRT_HEIGHT;
145*cdf0e10cSrcweir 	pDDRefEntry = 0;
146*cdf0e10cSrcweir 	pDDDev = 0;
147*cdf0e10cSrcweir 	pDDBufDev = 0;
148*cdf0e10cSrcweir 	pDDTempDev = 0;
149*cdf0e10cSrcweir 	eTextMode = IcnShowTextShort;
150*cdf0e10cSrcweir 	pImpCursor = new IcnCursor_Impl( this );
151*cdf0e10cSrcweir 	pGridMap = new IcnGridMap_Impl( this );
152*cdf0e10cSrcweir 
153*cdf0e10cSrcweir 	aVerSBar.SetScrollHdl( LINK( this, SvxIconChoiceCtrl_Impl, ScrollUpDownHdl ) );
154*cdf0e10cSrcweir 	aHorSBar.SetScrollHdl( LINK( this, SvxIconChoiceCtrl_Impl, ScrollLeftRightHdl ) );
155*cdf0e10cSrcweir 	Link aEndScrollHdl( LINK( this, SvxIconChoiceCtrl_Impl, EndScrollHdl ) );
156*cdf0e10cSrcweir 	aVerSBar.SetEndScrollHdl( aEndScrollHdl );
157*cdf0e10cSrcweir 	aHorSBar.SetEndScrollHdl( aEndScrollHdl );
158*cdf0e10cSrcweir 
159*cdf0e10cSrcweir 	nHorSBarHeight = aHorSBar.GetSizePixel().Height();
160*cdf0e10cSrcweir 	nVerSBarWidth = aVerSBar.GetSizePixel().Width();
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir 	aEditTimer.SetTimeout( 800 );
163*cdf0e10cSrcweir 	aEditTimer.SetTimeoutHdl(LINK(this,SvxIconChoiceCtrl_Impl,EditTimeoutHdl));
164*cdf0e10cSrcweir 	aAutoArrangeTimer.SetTimeout( 100 );
165*cdf0e10cSrcweir 	aAutoArrangeTimer.SetTimeoutHdl(LINK(this,SvxIconChoiceCtrl_Impl,AutoArrangeHdl));
166*cdf0e10cSrcweir 	aCallSelectHdlTimer.SetTimeout( 500 );
167*cdf0e10cSrcweir 	aCallSelectHdlTimer.SetTimeoutHdl( LINK(this,SvxIconChoiceCtrl_Impl,CallSelectHdlHdl));
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir 	aDocRectChangedTimer.SetTimeout( 50 );
170*cdf0e10cSrcweir 	aDocRectChangedTimer.SetTimeoutHdl(LINK(this,SvxIconChoiceCtrl_Impl,DocRectChangedHdl));
171*cdf0e10cSrcweir 	aVisRectChangedTimer.SetTimeout( 50 );
172*cdf0e10cSrcweir 	aVisRectChangedTimer.SetTimeoutHdl(LINK(this,SvxIconChoiceCtrl_Impl,VisRectChangedHdl));
173*cdf0e10cSrcweir 
174*cdf0e10cSrcweir 	Clear( sal_True );
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir     SetGrid( Size(100, 70) );
177*cdf0e10cSrcweir }
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir SvxIconChoiceCtrl_Impl::~SvxIconChoiceCtrl_Impl()
180*cdf0e10cSrcweir {
181*cdf0e10cSrcweir 	pCurEditedEntry = 0;
182*cdf0e10cSrcweir 	DELETEZ(pEdit);
183*cdf0e10cSrcweir 	Clear();
184*cdf0e10cSrcweir 	StopEditTimer();
185*cdf0e10cSrcweir 	CancelUserEvents();
186*cdf0e10cSrcweir 	delete pZOrderList;
187*cdf0e10cSrcweir 	delete pImpCursor;
188*cdf0e10cSrcweir 	delete pGridMap;
189*cdf0e10cSrcweir 	delete pDDDev;
190*cdf0e10cSrcweir 	delete pDDBufDev;
191*cdf0e10cSrcweir 	delete pDDTempDev;
192*cdf0e10cSrcweir 	delete pDraggedSelection;
193*cdf0e10cSrcweir 	delete pEntryPaintDev;
194*cdf0e10cSrcweir 	ClearSelectedRectList();
195*cdf0e10cSrcweir 	ClearColumnList();
196*cdf0e10cSrcweir }
197*cdf0e10cSrcweir 
198*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::Clear( sal_Bool bInCtor )
199*cdf0e10cSrcweir {
200*cdf0e10cSrcweir 	StopEntryEditing( sal_True );
201*cdf0e10cSrcweir 	nSelectionCount = 0;
202*cdf0e10cSrcweir 	DELETEZ(pDraggedSelection);
203*cdf0e10cSrcweir 	bInDragDrop = sal_False;
204*cdf0e10cSrcweir 	pCurHighlightFrame = 0;
205*cdf0e10cSrcweir 	StopEditTimer();
206*cdf0e10cSrcweir 	CancelUserEvents();
207*cdf0e10cSrcweir 	ShowCursor( sal_False );
208*cdf0e10cSrcweir 	bBoundRectsDirty = sal_False;
209*cdf0e10cSrcweir 	nMaxBoundHeight = 0;
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir 	nFlags &= ~(F_PAINTED | F_MOVED_ENTRIES);
212*cdf0e10cSrcweir 	pCursor = 0;
213*cdf0e10cSrcweir 	if( !bInCtor )
214*cdf0e10cSrcweir 	{
215*cdf0e10cSrcweir 		pImpCursor->Clear();
216*cdf0e10cSrcweir 		pGridMap->Clear();
217*cdf0e10cSrcweir 		aVirtOutputSize.Width() = 0;
218*cdf0e10cSrcweir 		aVirtOutputSize.Height() = 0;
219*cdf0e10cSrcweir 		Size aSize( pView->GetOutputSizePixel() );
220*cdf0e10cSrcweir 		nMaxVirtWidth = aSize.Width() - nVerSBarWidth;
221*cdf0e10cSrcweir 		if( nMaxVirtWidth <= 0 )
222*cdf0e10cSrcweir 			nMaxVirtWidth = DEFAULT_MAX_VIRT_WIDTH;
223*cdf0e10cSrcweir 		nMaxVirtHeight = aSize.Height() - nHorSBarHeight;
224*cdf0e10cSrcweir 		if( nMaxVirtHeight <= 0 )
225*cdf0e10cSrcweir 			nMaxVirtHeight = DEFAULT_MAX_VIRT_HEIGHT;
226*cdf0e10cSrcweir 		pZOrderList->Clear(); //Remove(0,pZOrderList->Count());
227*cdf0e10cSrcweir 		SetOrigin( Point() );
228*cdf0e10cSrcweir 		if( bUpdateMode )
229*cdf0e10cSrcweir 			pView->Invalidate(INVALIDATE_NOCHILDREN);
230*cdf0e10cSrcweir 	}
231*cdf0e10cSrcweir 	AdjustScrollBars();
232*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
233*cdf0e10cSrcweir 	for( sal_uLong nCur = 0; nCur < nCount; nCur++ )
234*cdf0e10cSrcweir 	{
235*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pCur = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nCur );
236*cdf0e10cSrcweir 		delete pCur;
237*cdf0e10cSrcweir 	}
238*cdf0e10cSrcweir 	aEntries.Clear();
239*cdf0e10cSrcweir 	DocRectChanged();
240*cdf0e10cSrcweir 	VisRectChanged();
241*cdf0e10cSrcweir }
242*cdf0e10cSrcweir 
243*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetStyle( WinBits nWinStyle )
244*cdf0e10cSrcweir {
245*cdf0e10cSrcweir 	nWinBits = nWinStyle;
246*cdf0e10cSrcweir 	nCurTextDrawFlags = DRAWTEXT_FLAGS_ICON;
247*cdf0e10cSrcweir 	if( nWinBits & (WB_SMALLICON | WB_DETAILS) )
248*cdf0e10cSrcweir 		nCurTextDrawFlags = DRAWTEXT_FLAGS_SMALLICON;
249*cdf0e10cSrcweir 	if( nWinBits & WB_NOSELECTION )
250*cdf0e10cSrcweir 		eSelectionMode = NO_SELECTION;
251*cdf0e10cSrcweir 	if( !(nWinStyle & (WB_ALIGN_TOP | WB_ALIGN_LEFT)))
252*cdf0e10cSrcweir 		nWinBits |= WB_ALIGN_LEFT;
253*cdf0e10cSrcweir 	if( (nWinStyle & WB_DETAILS))
254*cdf0e10cSrcweir 	{
255*cdf0e10cSrcweir 		if( !pColumns  )
256*cdf0e10cSrcweir 			SetColumn( 0, SvxIconChoiceCtrlColumnInfo( 0, 100, IcnViewAlignLeft ));
257*cdf0e10cSrcweir 	}
258*cdf0e10cSrcweir }
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir IMPL_LINK( SvxIconChoiceCtrl_Impl, ScrollUpDownHdl, ScrollBar*, pScrollBar )
261*cdf0e10cSrcweir {
262*cdf0e10cSrcweir 	StopEntryEditing( sal_True );
263*cdf0e10cSrcweir 	// Pfeil hoch: delta=-1; Pfeil runter: delta=+1
264*cdf0e10cSrcweir 	Scroll( 0, pScrollBar->GetDelta(), sal_True );
265*cdf0e10cSrcweir 	bEndScrollInvalidate = sal_True;
266*cdf0e10cSrcweir 	return 0;
267*cdf0e10cSrcweir }
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir IMPL_LINK( SvxIconChoiceCtrl_Impl, ScrollLeftRightHdl, ScrollBar*, pScrollBar )
270*cdf0e10cSrcweir {
271*cdf0e10cSrcweir 	StopEntryEditing( sal_True );
272*cdf0e10cSrcweir 	// Pfeil links: delta=-1; Pfeil rechts: delta=+1
273*cdf0e10cSrcweir 	Scroll( pScrollBar->GetDelta(), 0, sal_True );
274*cdf0e10cSrcweir 	bEndScrollInvalidate = sal_True;
275*cdf0e10cSrcweir 	return 0;
276*cdf0e10cSrcweir }
277*cdf0e10cSrcweir 
278*cdf0e10cSrcweir IMPL_LINK( SvxIconChoiceCtrl_Impl, EndScrollHdl, void*, EMPTYARG )
279*cdf0e10cSrcweir {
280*cdf0e10cSrcweir 	if( pView->HasBackground() && !pView->GetBackground().IsScrollable() &&
281*cdf0e10cSrcweir 		bEndScrollInvalidate )
282*cdf0e10cSrcweir 	{
283*cdf0e10cSrcweir 		pView->Invalidate(INVALIDATE_NOCHILDREN);
284*cdf0e10cSrcweir 	}
285*cdf0e10cSrcweir 	return 0;
286*cdf0e10cSrcweir }
287*cdf0e10cSrcweir 
288*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::FontModified()
289*cdf0e10cSrcweir {
290*cdf0e10cSrcweir 	StopEditTimer();
291*cdf0e10cSrcweir 	DELETEZ(pDDDev);
292*cdf0e10cSrcweir 	DELETEZ(pDDBufDev);
293*cdf0e10cSrcweir 	DELETEZ(pDDTempDev);
294*cdf0e10cSrcweir 	DELETEZ(pEntryPaintDev);
295*cdf0e10cSrcweir 	SetDefaultTextSize();
296*cdf0e10cSrcweir 	ShowCursor( sal_False );
297*cdf0e10cSrcweir 	ShowCursor( sal_True );
298*cdf0e10cSrcweir }
299*cdf0e10cSrcweir 
300*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::InsertEntry( SvxIconChoiceCtrlEntry* pEntry, sal_uLong nPos,
301*cdf0e10cSrcweir 	const Point* pPos )
302*cdf0e10cSrcweir {
303*cdf0e10cSrcweir 	StopEditTimer();
304*cdf0e10cSrcweir 	aEntries.Insert( pEntry, nPos );
305*cdf0e10cSrcweir 	if( (nFlags & F_ENTRYLISTPOS_VALID) && nPos >= aEntries.Count() - 1 )
306*cdf0e10cSrcweir 		pEntry->nPos = aEntries.Count() - 1;
307*cdf0e10cSrcweir 	else
308*cdf0e10cSrcweir 		nFlags &= ~F_ENTRYLISTPOS_VALID;
309*cdf0e10cSrcweir 
310*cdf0e10cSrcweir 	pZOrderList->Insert( (void*)pEntry, LIST_APPEND ); //pZOrderList->Count() );
311*cdf0e10cSrcweir 	pImpCursor->Clear();
312*cdf0e10cSrcweir //	pGridMap->Clear();
313*cdf0e10cSrcweir 	if( pPos )
314*cdf0e10cSrcweir 	{
315*cdf0e10cSrcweir 		Size aSize( CalcBoundingSize( pEntry ) );
316*cdf0e10cSrcweir 		SetBoundingRect_Impl( pEntry, *pPos, aSize );
317*cdf0e10cSrcweir 		SetEntryPos( pEntry, *pPos, sal_False, sal_True, sal_True /*keep grid map*/ );
318*cdf0e10cSrcweir 		pEntry->nFlags |= ICNVIEW_FLAG_POS_MOVED;
319*cdf0e10cSrcweir 		SetEntriesMoved( sal_True );
320*cdf0e10cSrcweir 	}
321*cdf0e10cSrcweir 	else
322*cdf0e10cSrcweir 	{
323*cdf0e10cSrcweir 		// wenn der UpdateMode sal_True ist, wollen wir nicht pauschal alle
324*cdf0e10cSrcweir 		// BoundRects auf 'zu ueberpruefen' setzen, sondern nur das des
325*cdf0e10cSrcweir 		// neuen Eintrags. Deshalb kein InvalidateBoundingRect aufrufen!
326*cdf0e10cSrcweir 		pEntry->aRect.Right() = LONG_MAX;
327*cdf0e10cSrcweir 		if( bUpdateMode )
328*cdf0e10cSrcweir 		{
329*cdf0e10cSrcweir 			FindBoundingRect( pEntry );
330*cdf0e10cSrcweir 			Rectangle aOutputArea( GetOutputRect() );
331*cdf0e10cSrcweir 			pGridMap->OccupyGrids( pEntry );
332*cdf0e10cSrcweir 			if( !aOutputArea.IsOver( pEntry->aRect ) )
333*cdf0e10cSrcweir 				return;	// ist nicht sichtbar
334*cdf0e10cSrcweir 			pView->Invalidate( pEntry->aRect );
335*cdf0e10cSrcweir 		}
336*cdf0e10cSrcweir 		else
337*cdf0e10cSrcweir 			InvalidateBoundingRect( pEntry->aRect );
338*cdf0e10cSrcweir 	}
339*cdf0e10cSrcweir }
340*cdf0e10cSrcweir 
341*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::CreateAutoMnemonics( MnemonicGenerator* _pGenerator )
342*cdf0e10cSrcweir {
343*cdf0e10cSrcweir     ::std::auto_ptr< MnemonicGenerator > pAutoDeleteOwnGenerator;
344*cdf0e10cSrcweir     if ( !_pGenerator )
345*cdf0e10cSrcweir     {
346*cdf0e10cSrcweir         _pGenerator = new MnemonicGenerator;
347*cdf0e10cSrcweir         pAutoDeleteOwnGenerator.reset( _pGenerator );
348*cdf0e10cSrcweir     }
349*cdf0e10cSrcweir 
350*cdf0e10cSrcweir     sal_uLong   nEntryCount = GetEntryCount();
351*cdf0e10cSrcweir 	sal_uLong   i;
352*cdf0e10cSrcweir 
353*cdf0e10cSrcweir 	// insert texts in generator
354*cdf0e10cSrcweir 	for( i = 0; i < nEntryCount; ++i )
355*cdf0e10cSrcweir 	{
356*cdf0e10cSrcweir 		DBG_ASSERT( GetEntry( i ), "-SvxIconChoiceCtrl_Impl::CreateAutoMnemonics(): more expected than provided!" );
357*cdf0e10cSrcweir 
358*cdf0e10cSrcweir 		_pGenerator->RegisterMnemonic( GetEntry( i )->GetText() );
359*cdf0e10cSrcweir 	}
360*cdf0e10cSrcweir 
361*cdf0e10cSrcweir 	// exchange texts with generated mnemonics
362*cdf0e10cSrcweir 	for( i = 0; i < nEntryCount; ++i )
363*cdf0e10cSrcweir 	{
364*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry*	pEntry = GetEntry( i );
365*cdf0e10cSrcweir 		String					aTxt = pEntry->GetText();
366*cdf0e10cSrcweir 
367*cdf0e10cSrcweir 		if( _pGenerator->CreateMnemonic( aTxt ) )
368*cdf0e10cSrcweir 			pEntry->SetText( aTxt );
369*cdf0e10cSrcweir 	}
370*cdf0e10cSrcweir }
371*cdf0e10cSrcweir 
372*cdf0e10cSrcweir Rectangle SvxIconChoiceCtrl_Impl::GetOutputRect() const
373*cdf0e10cSrcweir {
374*cdf0e10cSrcweir 	Point aOrigin( pView->GetMapMode().GetOrigin() );
375*cdf0e10cSrcweir 	aOrigin *= -1;
376*cdf0e10cSrcweir 	return Rectangle( aOrigin, aOutputSize );
377*cdf0e10cSrcweir }
378*cdf0e10cSrcweir 
379*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetListPositions()
380*cdf0e10cSrcweir {
381*cdf0e10cSrcweir 	if( nFlags & F_ENTRYLISTPOS_VALID )
382*cdf0e10cSrcweir 		return;
383*cdf0e10cSrcweir 
384*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
385*cdf0e10cSrcweir 	for( sal_uLong nCur = 0; nCur < nCount; nCur++ )
386*cdf0e10cSrcweir 	{
387*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nCur );
388*cdf0e10cSrcweir 		pEntry->nPos = nCur;
389*cdf0e10cSrcweir 	}
390*cdf0e10cSrcweir 	nFlags |= F_ENTRYLISTPOS_VALID;
391*cdf0e10cSrcweir }
392*cdf0e10cSrcweir 
393*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::RemoveEntry( SvxIconChoiceCtrlEntry* pEntry )
394*cdf0e10cSrcweir {
395*cdf0e10cSrcweir 	sal_Bool bSyncSingleSelection;
396*cdf0e10cSrcweir 	// bei Single-Selection wird die Selektion beim Umsetzen des Cursors
397*cdf0e10cSrcweir 	// mitgefuehrt. Das soll aber nur erfolgen, wenn ueberhaupt ein
398*cdf0e10cSrcweir 	// Eintrag selektiert ist.
399*cdf0e10cSrcweir 	if( GetSelectionCount() )
400*cdf0e10cSrcweir 		bSyncSingleSelection = sal_True;
401*cdf0e10cSrcweir 	else
402*cdf0e10cSrcweir 		bSyncSingleSelection = sal_False;
403*cdf0e10cSrcweir 
404*cdf0e10cSrcweir 	if( pEntry == pCurHighlightFrame )
405*cdf0e10cSrcweir 		pCurHighlightFrame = 0;
406*cdf0e10cSrcweir 
407*cdf0e10cSrcweir 	if( bInDragDrop )
408*cdf0e10cSrcweir 	{
409*cdf0e10cSrcweir 		DELETEZ(pDraggedSelection);
410*cdf0e10cSrcweir 		bInDragDrop = sal_False;
411*cdf0e10cSrcweir 	}
412*cdf0e10cSrcweir 
413*cdf0e10cSrcweir 	if( pEntry->IsSelected() )
414*cdf0e10cSrcweir 		CallSelectHandler( 0 );
415*cdf0e10cSrcweir 
416*cdf0e10cSrcweir 	if( aEntries.Count() == 1 && aEntries.GetObject(0) == pEntry )
417*cdf0e10cSrcweir 	{
418*cdf0e10cSrcweir 		Clear();
419*cdf0e10cSrcweir 		return;
420*cdf0e10cSrcweir 	}
421*cdf0e10cSrcweir 
422*cdf0e10cSrcweir 	StopEditTimer();
423*cdf0e10cSrcweir 	if( pEntry == pAnchor )
424*cdf0e10cSrcweir 		pAnchor = 0;
425*cdf0e10cSrcweir 	if( pEntry->IsSelected() )
426*cdf0e10cSrcweir 		nSelectionCount--;
427*cdf0e10cSrcweir 	sal_Bool bEntryBoundValid = IsBoundingRectValid( pEntry->aRect );
428*cdf0e10cSrcweir 	if( bEntryBoundValid )
429*cdf0e10cSrcweir 		pView->Invalidate( pEntry->aRect );
430*cdf0e10cSrcweir 
431*cdf0e10cSrcweir 	sal_Bool bSetNewCursor = sal_False;
432*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pNewCursor = NULL;
433*cdf0e10cSrcweir 
434*cdf0e10cSrcweir 	if( pEntry == pCursor )
435*cdf0e10cSrcweir 	{
436*cdf0e10cSrcweir 		bSetNewCursor = sal_True;
437*cdf0e10cSrcweir 		pNewCursor = FindNewCursor();
438*cdf0e10cSrcweir 		ShowCursor( sal_False );
439*cdf0e10cSrcweir 		pCursor = 0;
440*cdf0e10cSrcweir 	}
441*cdf0e10cSrcweir 
442*cdf0e10cSrcweir 	sal_Bool bCurEntryPosValid = (nFlags & F_ENTRYLISTPOS_VALID) ? sal_True : sal_False;
443*cdf0e10cSrcweir 	if( bCurEntryPosValid && aEntries.GetObject(aEntries.Count()-1) != pEntry )
444*cdf0e10cSrcweir 		nFlags &= ~F_ENTRYLISTPOS_VALID;
445*cdf0e10cSrcweir 	sal_uLong nPos = pZOrderList->GetPos( (void*)pEntry );
446*cdf0e10cSrcweir 	pZOrderList->Remove( nPos );
447*cdf0e10cSrcweir 	if( bCurEntryPosValid )
448*cdf0e10cSrcweir 	{
449*cdf0e10cSrcweir 		DBG_ASSERT(aEntries.GetObject(pEntry->nPos)==pEntry,"RemoveEntry: Wrong nPos in entry");
450*cdf0e10cSrcweir 		aEntries.Remove( pEntry->nPos );
451*cdf0e10cSrcweir 	}
452*cdf0e10cSrcweir 	else
453*cdf0e10cSrcweir 		aEntries.Remove( pEntry );
454*cdf0e10cSrcweir 	pImpCursor->Clear();
455*cdf0e10cSrcweir 	pGridMap->Clear();
456*cdf0e10cSrcweir 	delete pEntry;
457*cdf0e10cSrcweir 	if( IsAutoArrange() && aEntries.Count() )
458*cdf0e10cSrcweir 		aAutoArrangeTimer.Start();
459*cdf0e10cSrcweir 	if( bSetNewCursor )
460*cdf0e10cSrcweir 	{
461*cdf0e10cSrcweir 		// Fokusrechteck asynchron einblenden, um das Loeschen einer
462*cdf0e10cSrcweir 		// Multiselektion zu beschleunigen.
463*cdf0e10cSrcweir 		SetCursor( pNewCursor, bSyncSingleSelection, sal_True );
464*cdf0e10cSrcweir 	}
465*cdf0e10cSrcweir }
466*cdf0e10cSrcweir 
467*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SelectEntry( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bSelect,
468*cdf0e10cSrcweir 	sal_Bool bCallHdl, sal_Bool bAdd, sal_Bool bSyncPaint )
469*cdf0e10cSrcweir {
470*cdf0e10cSrcweir 	if( eSelectionMode == NO_SELECTION )
471*cdf0e10cSrcweir 		return;
472*cdf0e10cSrcweir 
473*cdf0e10cSrcweir 	if( !bAdd )
474*cdf0e10cSrcweir 	{
475*cdf0e10cSrcweir 		if ( 0 == ( nFlags & F_CLEARING_SELECTION ) )
476*cdf0e10cSrcweir 		{
477*cdf0e10cSrcweir 			nFlags |= F_CLEARING_SELECTION;
478*cdf0e10cSrcweir 			DeselectAllBut( pEntry, sal_True );
479*cdf0e10cSrcweir 			nFlags &= ~F_CLEARING_SELECTION;
480*cdf0e10cSrcweir 		}
481*cdf0e10cSrcweir 	}
482*cdf0e10cSrcweir 	if( pEntry->IsSelected() != bSelect )
483*cdf0e10cSrcweir 	{
484*cdf0e10cSrcweir 		pHdlEntry = pEntry;
485*cdf0e10cSrcweir 		sal_uInt16 nEntryFlags = pEntry->GetFlags();
486*cdf0e10cSrcweir 		if( bSelect )
487*cdf0e10cSrcweir 		{
488*cdf0e10cSrcweir 			nEntryFlags |= ICNVIEW_FLAG_SELECTED;
489*cdf0e10cSrcweir 			pEntry->AssignFlags( nEntryFlags );
490*cdf0e10cSrcweir 			nSelectionCount++;
491*cdf0e10cSrcweir 			if( bCallHdl )
492*cdf0e10cSrcweir 				CallSelectHandler( pEntry );
493*cdf0e10cSrcweir 		}
494*cdf0e10cSrcweir 		else
495*cdf0e10cSrcweir 		{
496*cdf0e10cSrcweir 			nEntryFlags &= ~( ICNVIEW_FLAG_SELECTED);
497*cdf0e10cSrcweir 			pEntry->AssignFlags( nEntryFlags );
498*cdf0e10cSrcweir 			nSelectionCount--;
499*cdf0e10cSrcweir 			if( bCallHdl )
500*cdf0e10cSrcweir 				CallSelectHandler( 0 );
501*cdf0e10cSrcweir 		}
502*cdf0e10cSrcweir 		EntrySelected( pEntry, bSelect, bSyncPaint );
503*cdf0e10cSrcweir 	}
504*cdf0e10cSrcweir }
505*cdf0e10cSrcweir 
506*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::EntrySelected( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bSelect,
507*cdf0e10cSrcweir 	sal_Bool bSyncPaint )
508*cdf0e10cSrcweir {
509*cdf0e10cSrcweir 	// bei SingleSelection dafuer sorgen, dass der Cursor immer
510*cdf0e10cSrcweir 	// auf dem (einzigen) selektierten Eintrag steht. Aber nur,
511*cdf0e10cSrcweir 	// wenn es bereits einen Cursor gibt
512*cdf0e10cSrcweir 	if( bSelect && pCursor &&
513*cdf0e10cSrcweir 		eSelectionMode == SINGLE_SELECTION &&
514*cdf0e10cSrcweir 		pEntry != pCursor )
515*cdf0e10cSrcweir 	{
516*cdf0e10cSrcweir 		SetCursor( pEntry );
517*cdf0e10cSrcweir 		//DBG_ASSERT(pView->GetSelectionCount()==1,"selection count?")
518*cdf0e10cSrcweir 	}
519*cdf0e10cSrcweir 
520*cdf0e10cSrcweir 	// beim Aufziehen nicht, da sonst die Schleife in SelectRect
521*cdf0e10cSrcweir 	// nicht richtig funktioniert!
522*cdf0e10cSrcweir 	if( !(nFlags & F_SELECTING_RECT) )
523*cdf0e10cSrcweir 		ToTop( pEntry );
524*cdf0e10cSrcweir 	if( bUpdateMode )
525*cdf0e10cSrcweir 	{
526*cdf0e10cSrcweir 		if( pEntry == pCursor )
527*cdf0e10cSrcweir 			ShowCursor( sal_False );
528*cdf0e10cSrcweir 		if( pView->IsTracking() && (bSelect || !pView->HasBackground()) ) // beim Tracken immer synchron
529*cdf0e10cSrcweir 			PaintEntry( pEntry );
530*cdf0e10cSrcweir 		else if( bSyncPaint ) // synchron & mit virtuellem OutDev!
531*cdf0e10cSrcweir 			PaintEntryVirtOutDev( pEntry );
532*cdf0e10cSrcweir 		else
533*cdf0e10cSrcweir 		{
534*cdf0e10cSrcweir 			pView->Invalidate( CalcFocusRect( pEntry ) );
535*cdf0e10cSrcweir 		}
536*cdf0e10cSrcweir 		if( pEntry == pCursor )
537*cdf0e10cSrcweir 			ShowCursor( sal_True );
538*cdf0e10cSrcweir 	} // if( bUpdateMode )
539*cdf0e10cSrcweir 
540*cdf0e10cSrcweir     // --> OD 2009-05-27 #i101012#
541*cdf0e10cSrcweir     // emit vcl event LISTBOX_SELECT only in case that the given entry is selected.
542*cdf0e10cSrcweir     if ( bSelect )
543*cdf0e10cSrcweir     {
544*cdf0e10cSrcweir         CallEventListeners( VCLEVENT_LISTBOX_SELECT, pEntry );
545*cdf0e10cSrcweir     }
546*cdf0e10cSrcweir     // <--
547*cdf0e10cSrcweir }
548*cdf0e10cSrcweir 
549*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::ResetVirtSize()
550*cdf0e10cSrcweir {
551*cdf0e10cSrcweir 	StopEditTimer();
552*cdf0e10cSrcweir 	aVirtOutputSize.Width() = 0;
553*cdf0e10cSrcweir 	aVirtOutputSize.Height() = 0;
554*cdf0e10cSrcweir 	sal_Bool bLockedEntryFound = sal_False;
555*cdf0e10cSrcweir 	const sal_uLong nCount = aEntries.Count();
556*cdf0e10cSrcweir 	for( sal_uLong nCur = 0; nCur < nCount; nCur++ )
557*cdf0e10cSrcweir 	{
558*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pCur = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nCur );
559*cdf0e10cSrcweir 		pCur->ClearFlags( ICNVIEW_FLAG_POS_MOVED );
560*cdf0e10cSrcweir 		if( pCur->IsPosLocked() )
561*cdf0e10cSrcweir 		{
562*cdf0e10cSrcweir 			// VirtSize u.a. anpassen
563*cdf0e10cSrcweir 			if( !IsBoundingRectValid( pCur->aRect ) )
564*cdf0e10cSrcweir 				FindBoundingRect( pCur );
565*cdf0e10cSrcweir 			else
566*cdf0e10cSrcweir 				AdjustVirtSize( pCur->aRect );
567*cdf0e10cSrcweir 			bLockedEntryFound = sal_True;
568*cdf0e10cSrcweir 		}
569*cdf0e10cSrcweir 		else
570*cdf0e10cSrcweir 			InvalidateBoundingRect( pCur->aRect );
571*cdf0e10cSrcweir 	}
572*cdf0e10cSrcweir 
573*cdf0e10cSrcweir 	if( !(nWinBits & (WB_NOVSCROLL | WB_NOHSCROLL)) )
574*cdf0e10cSrcweir 	{
575*cdf0e10cSrcweir 		Size aRealOutputSize( pView->GetOutputSizePixel() );
576*cdf0e10cSrcweir 		if( aVirtOutputSize.Width() < aRealOutputSize.Width() ||
577*cdf0e10cSrcweir 			aVirtOutputSize.Height() < aRealOutputSize.Height() )
578*cdf0e10cSrcweir 		{
579*cdf0e10cSrcweir 			sal_uLong nGridCount = IcnGridMap_Impl::GetGridCount(
580*cdf0e10cSrcweir 				aRealOutputSize, (sal_uInt16)nGridDX, (sal_uInt16)nGridDY );
581*cdf0e10cSrcweir 			if( nGridCount < nCount )
582*cdf0e10cSrcweir 			{
583*cdf0e10cSrcweir 				if( nWinBits & WB_ALIGN_TOP )
584*cdf0e10cSrcweir 					nMaxVirtWidth = aRealOutputSize.Width() - nVerSBarWidth;
585*cdf0e10cSrcweir 				else // WB_ALIGN_LEFT
586*cdf0e10cSrcweir 					nMaxVirtHeight = aRealOutputSize.Height() - nHorSBarHeight;
587*cdf0e10cSrcweir 			}
588*cdf0e10cSrcweir 		}
589*cdf0e10cSrcweir 	}
590*cdf0e10cSrcweir 
591*cdf0e10cSrcweir 	pImpCursor->Clear();
592*cdf0e10cSrcweir 	pGridMap->Clear();
593*cdf0e10cSrcweir 	VisRectChanged();
594*cdf0e10cSrcweir }
595*cdf0e10cSrcweir 
596*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::AdjustVirtSize( const Rectangle& rRect )
597*cdf0e10cSrcweir {
598*cdf0e10cSrcweir 	long nHeightOffs = 0;
599*cdf0e10cSrcweir 	long nWidthOffs = 0;
600*cdf0e10cSrcweir 
601*cdf0e10cSrcweir 	if( aVirtOutputSize.Width() < (rRect.Right()+LROFFS_WINBORDER) )
602*cdf0e10cSrcweir 		nWidthOffs = (rRect.Right()+LROFFS_WINBORDER) - aVirtOutputSize.Width();
603*cdf0e10cSrcweir 
604*cdf0e10cSrcweir 	if( aVirtOutputSize.Height() < (rRect.Bottom()+TBOFFS_WINBORDER) )
605*cdf0e10cSrcweir 		nHeightOffs = (rRect.Bottom()+TBOFFS_WINBORDER) - aVirtOutputSize.Height();
606*cdf0e10cSrcweir 
607*cdf0e10cSrcweir 	if( nWidthOffs || nHeightOffs )
608*cdf0e10cSrcweir 	{
609*cdf0e10cSrcweir 		Range aRange;
610*cdf0e10cSrcweir 		aVirtOutputSize.Width() += nWidthOffs;
611*cdf0e10cSrcweir 		aRange.Max() = aVirtOutputSize.Width();
612*cdf0e10cSrcweir 		aHorSBar.SetRange( aRange );
613*cdf0e10cSrcweir 
614*cdf0e10cSrcweir 		aVirtOutputSize.Height() += nHeightOffs;
615*cdf0e10cSrcweir 		aRange.Max() = aVirtOutputSize.Height();
616*cdf0e10cSrcweir 		aVerSBar.SetRange( aRange );
617*cdf0e10cSrcweir 
618*cdf0e10cSrcweir 		pImpCursor->Clear();
619*cdf0e10cSrcweir 		pGridMap->OutputSizeChanged();
620*cdf0e10cSrcweir 		AdjustScrollBars();
621*cdf0e10cSrcweir 		DocRectChanged();
622*cdf0e10cSrcweir 	}
623*cdf0e10cSrcweir }
624*cdf0e10cSrcweir 
625*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::InitPredecessors()
626*cdf0e10cSrcweir {
627*cdf0e10cSrcweir 	DBG_ASSERT(!pHead,"SvxIconChoiceCtrl_Impl::InitPredecessors() >> Already initialized");
628*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
629*cdf0e10cSrcweir 	if( nCount )
630*cdf0e10cSrcweir 	{
631*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pPrev = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( 0 );
632*cdf0e10cSrcweir 		for( sal_uLong nCur = 1; nCur <= nCount; nCur++ )
633*cdf0e10cSrcweir 		{
634*cdf0e10cSrcweir 			pPrev->ClearFlags( ICNVIEW_FLAG_POS_LOCKED | ICNVIEW_FLAG_POS_MOVED |
635*cdf0e10cSrcweir 								ICNVIEW_FLAG_PRED_SET);
636*cdf0e10cSrcweir 
637*cdf0e10cSrcweir 			SvxIconChoiceCtrlEntry* pNext;
638*cdf0e10cSrcweir 			if( nCur == nCount )
639*cdf0e10cSrcweir 				pNext = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( 0 );
640*cdf0e10cSrcweir 			else
641*cdf0e10cSrcweir 				pNext = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nCur );
642*cdf0e10cSrcweir 			pPrev->pflink = pNext;
643*cdf0e10cSrcweir 			pNext->pblink = pPrev;
644*cdf0e10cSrcweir 			pPrev = pNext;
645*cdf0e10cSrcweir 		}
646*cdf0e10cSrcweir 		pHead = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( 0 );
647*cdf0e10cSrcweir 	}
648*cdf0e10cSrcweir 	else
649*cdf0e10cSrcweir 		pHead = 0;
650*cdf0e10cSrcweir 	nFlags &= ~F_MOVED_ENTRIES;
651*cdf0e10cSrcweir }
652*cdf0e10cSrcweir 
653*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::ClearPredecessors()
654*cdf0e10cSrcweir {
655*cdf0e10cSrcweir 	if( pHead )
656*cdf0e10cSrcweir 	{
657*cdf0e10cSrcweir 		sal_uLong nCount = aEntries.Count();
658*cdf0e10cSrcweir 		for( sal_uLong nCur = 0; nCur < nCount; nCur++ )
659*cdf0e10cSrcweir 		{
660*cdf0e10cSrcweir 			SvxIconChoiceCtrlEntry* pCur = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nCur );
661*cdf0e10cSrcweir 			pCur->pflink = 0;
662*cdf0e10cSrcweir 			pCur->pblink = 0;
663*cdf0e10cSrcweir 			pCur->ClearFlags( ICNVIEW_FLAG_PRED_SET );
664*cdf0e10cSrcweir 		}
665*cdf0e10cSrcweir 		pHead = 0;
666*cdf0e10cSrcweir 	}
667*cdf0e10cSrcweir }
668*cdf0e10cSrcweir 
669*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::Arrange( sal_Bool bKeepPredecessors, long nSetMaxVirtWidth, long nSetMaxVirtHeight )
670*cdf0e10cSrcweir {
671*cdf0e10cSrcweir 	if ( nSetMaxVirtWidth != 0 )
672*cdf0e10cSrcweir 		nMaxVirtWidth = nSetMaxVirtWidth;
673*cdf0e10cSrcweir 	else
674*cdf0e10cSrcweir 		nMaxVirtWidth = aOutputSize.Width();
675*cdf0e10cSrcweir 
676*cdf0e10cSrcweir 	if ( nSetMaxVirtHeight != 0 )
677*cdf0e10cSrcweir 		nMaxVirtHeight = nSetMaxVirtHeight;
678*cdf0e10cSrcweir 	else
679*cdf0e10cSrcweir 		nMaxVirtHeight = aOutputSize.Height();
680*cdf0e10cSrcweir 
681*cdf0e10cSrcweir 	ImpArrange( bKeepPredecessors );
682*cdf0e10cSrcweir }
683*cdf0e10cSrcweir 
684*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::ImpArrange( sal_Bool bKeepPredecessors )
685*cdf0e10cSrcweir {
686*cdf0e10cSrcweir 	static Point aEmptyPoint;
687*cdf0e10cSrcweir 
688*cdf0e10cSrcweir 	sal_Bool bOldUpdate = bUpdateMode;
689*cdf0e10cSrcweir 	Rectangle aCurOutputArea( GetOutputRect() );
690*cdf0e10cSrcweir 	if( (nWinBits & WB_SMART_ARRANGE) && aCurOutputArea.TopLeft() != aEmptyPoint )
691*cdf0e10cSrcweir 		bUpdateMode = sal_False;
692*cdf0e10cSrcweir 	aAutoArrangeTimer.Stop();
693*cdf0e10cSrcweir 	nFlags &= ~F_MOVED_ENTRIES;
694*cdf0e10cSrcweir 	nFlags |= F_ARRANGING;
695*cdf0e10cSrcweir 	StopEditTimer();
696*cdf0e10cSrcweir 	ShowCursor( sal_False );
697*cdf0e10cSrcweir 	ResetVirtSize();
698*cdf0e10cSrcweir 	if( !bKeepPredecessors )
699*cdf0e10cSrcweir 		ClearPredecessors();
700*cdf0e10cSrcweir 	bBoundRectsDirty = sal_False;
701*cdf0e10cSrcweir 	SetOrigin( Point() );
702*cdf0e10cSrcweir 	VisRectChanged();
703*cdf0e10cSrcweir 	RecalcAllBoundingRectsSmart();
704*cdf0e10cSrcweir 	// in der Detailsview muss das Invalidieren intelligenter erfolgen
705*cdf0e10cSrcweir 	//if( !(nWinBits & WB_DETAILS ))
706*cdf0e10cSrcweir 		pView->Invalidate( INVALIDATE_NOCHILDREN );
707*cdf0e10cSrcweir 	nFlags &= ~F_ARRANGING;
708*cdf0e10cSrcweir 	if( (nWinBits & WB_SMART_ARRANGE) && aCurOutputArea.TopLeft() != aEmptyPoint )
709*cdf0e10cSrcweir 	{
710*cdf0e10cSrcweir 		MakeVisible( aCurOutputArea );
711*cdf0e10cSrcweir 		SetUpdateMode( bOldUpdate );
712*cdf0e10cSrcweir 	}
713*cdf0e10cSrcweir 	ShowCursor( sal_True );
714*cdf0e10cSrcweir }
715*cdf0e10cSrcweir 
716*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::Paint( const Rectangle& rRect )
717*cdf0e10cSrcweir {
718*cdf0e10cSrcweir 	bEndScrollInvalidate = sal_False;
719*cdf0e10cSrcweir 
720*cdf0e10cSrcweir #if defined(OV_DRAWGRID)
721*cdf0e10cSrcweir 	Color aOldColor ( pView->GetLineColor() );
722*cdf0e10cSrcweir 	Color aColor( COL_BLACK );
723*cdf0e10cSrcweir 	pView->SetLineColor( aColor );
724*cdf0e10cSrcweir 	Point aOffs( pView->GetMapMode().GetOrigin());
725*cdf0e10cSrcweir 	Size aXSize( pView->GetOutputSizePixel() );
726*cdf0e10cSrcweir 
727*cdf0e10cSrcweir 	{
728*cdf0e10cSrcweir 	Point aStart( LROFFS_WINBORDER, 0 );
729*cdf0e10cSrcweir 	Point aEnd( LROFFS_WINBORDER, aXSize.Height());
730*cdf0e10cSrcweir 	aStart -= aOffs;
731*cdf0e10cSrcweir 	aEnd -= aOffs;
732*cdf0e10cSrcweir 	pView->DrawLine( aStart, aEnd );
733*cdf0e10cSrcweir 	}
734*cdf0e10cSrcweir 	{
735*cdf0e10cSrcweir 	Point aStart( 0, TBOFFS_WINBORDER );
736*cdf0e10cSrcweir 	Point aEnd( aXSize.Width(), TBOFFS_WINBORDER );
737*cdf0e10cSrcweir 	aStart -= aOffs;
738*cdf0e10cSrcweir 	aEnd -= aOffs;
739*cdf0e10cSrcweir 	pView->DrawLine( aStart, aEnd );
740*cdf0e10cSrcweir 	}
741*cdf0e10cSrcweir 
742*cdf0e10cSrcweir 	for( long nDX = nGridDX; nDX <= aXSize.Width(); nDX += nGridDX )
743*cdf0e10cSrcweir 	{
744*cdf0e10cSrcweir 		Point aStart( nDX+LROFFS_WINBORDER, 0 );
745*cdf0e10cSrcweir 		Point aEnd( nDX+LROFFS_WINBORDER, aXSize.Height());
746*cdf0e10cSrcweir 		aStart -= aOffs;
747*cdf0e10cSrcweir 		aEnd -= aOffs;
748*cdf0e10cSrcweir 		pView->DrawLine( aStart, aEnd );
749*cdf0e10cSrcweir 	}
750*cdf0e10cSrcweir 	for( long nDY = nGridDY; nDY <= aXSize.Height(); nDY += nGridDY )
751*cdf0e10cSrcweir 	{
752*cdf0e10cSrcweir 		Point aStart( 0, nDY+TBOFFS_WINBORDER );
753*cdf0e10cSrcweir 		Point aEnd( aXSize.Width(), nDY+TBOFFS_WINBORDER );
754*cdf0e10cSrcweir 		aStart -= aOffs;
755*cdf0e10cSrcweir 		aEnd -= aOffs;
756*cdf0e10cSrcweir 		pView->DrawLine( aStart, aEnd );
757*cdf0e10cSrcweir 	}
758*cdf0e10cSrcweir 	pView->SetLineColor( aOldColor );
759*cdf0e10cSrcweir #endif
760*cdf0e10cSrcweir 	nFlags |= F_PAINTED;
761*cdf0e10cSrcweir 
762*cdf0e10cSrcweir 	if( !aEntries.Count() )
763*cdf0e10cSrcweir 		return;
764*cdf0e10cSrcweir 	if( !pCursor )
765*cdf0e10cSrcweir 	{
766*cdf0e10cSrcweir 		// set cursor to item with focus-flag
767*cdf0e10cSrcweir 		sal_Bool bfound = sal_False;
768*cdf0e10cSrcweir 		for ( sal_uLong i = 0; i < pView->GetEntryCount() && !bfound; i++)
769*cdf0e10cSrcweir 		{
770*cdf0e10cSrcweir 			SvxIconChoiceCtrlEntry* pEntry = pView->GetEntry ( i );
771*cdf0e10cSrcweir 			if( pEntry->IsFocused() )
772*cdf0e10cSrcweir 			{
773*cdf0e10cSrcweir 				pCursor = pEntry;
774*cdf0e10cSrcweir 				bfound=sal_True;
775*cdf0e10cSrcweir 			}
776*cdf0e10cSrcweir 		}
777*cdf0e10cSrcweir 
778*cdf0e10cSrcweir 		if( !bfound )
779*cdf0e10cSrcweir 			pCursor = (SvxIconChoiceCtrlEntry*)aEntries.First();
780*cdf0e10cSrcweir 	}
781*cdf0e10cSrcweir 
782*cdf0e10cSrcweir 	// Show Focus at Init-Time
783*cdf0e10cSrcweir 	if ( pView->HasFocus() )
784*cdf0e10cSrcweir 		GetFocus();
785*cdf0e10cSrcweir 
786*cdf0e10cSrcweir 	sal_uLong nCount = pZOrderList->Count();
787*cdf0e10cSrcweir 	if( !nCount )
788*cdf0e10cSrcweir 		return;
789*cdf0e10cSrcweir 
790*cdf0e10cSrcweir 	sal_Bool bResetClipRegion = sal_False;
791*cdf0e10cSrcweir 	if( !pView->IsClipRegion() )
792*cdf0e10cSrcweir 	{
793*cdf0e10cSrcweir 		Rectangle aOutputArea( GetOutputRect() );
794*cdf0e10cSrcweir 		bResetClipRegion = sal_True;
795*cdf0e10cSrcweir 		pView->SetClipRegion( aOutputArea );
796*cdf0e10cSrcweir 	}
797*cdf0e10cSrcweir 
798*cdf0e10cSrcweir 	const sal_uInt16 nListInitSize = aEntries.Count() > USHRT_MAX ?
799*cdf0e10cSrcweir 		USHRT_MAX : (sal_uInt16)aEntries.Count();
800*cdf0e10cSrcweir 	List* pNewZOrderList = new List( nListInitSize );
801*cdf0e10cSrcweir 	List* pPaintedEntries = new List( nListInitSize );
802*cdf0e10cSrcweir 
803*cdf0e10cSrcweir 	sal_uLong nPos = 0;
804*cdf0e10cSrcweir 	while( nCount )
805*cdf0e10cSrcweir 	{
806*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)(pZOrderList->GetObject(nPos ));
807*cdf0e10cSrcweir 		const Rectangle& rBoundRect = GetEntryBoundRect( pEntry );
808*cdf0e10cSrcweir 		if( rRect.IsOver( rBoundRect ) )
809*cdf0e10cSrcweir 		{
810*cdf0e10cSrcweir 			PaintEntry( pEntry, rBoundRect.TopLeft(), pView, sal_True );
811*cdf0e10cSrcweir 			// Eintraege, die neu gezeichnet werden, auf Top setzen
812*cdf0e10cSrcweir 			pPaintedEntries->Insert( pEntry, LIST_APPEND );
813*cdf0e10cSrcweir 		}
814*cdf0e10cSrcweir 		else
815*cdf0e10cSrcweir 			pNewZOrderList->Insert( pEntry, LIST_APPEND );
816*cdf0e10cSrcweir 
817*cdf0e10cSrcweir 		nCount--;
818*cdf0e10cSrcweir 		nPos++;
819*cdf0e10cSrcweir 	}
820*cdf0e10cSrcweir 	delete pZOrderList;
821*cdf0e10cSrcweir 	pZOrderList = pNewZOrderList;
822*cdf0e10cSrcweir 	nCount = pPaintedEntries->Count();
823*cdf0e10cSrcweir 	if( nCount )
824*cdf0e10cSrcweir 	{
825*cdf0e10cSrcweir 		for( sal_uLong nCur = 0; nCur < nCount; nCur++ )
826*cdf0e10cSrcweir 			pZOrderList->Insert( pPaintedEntries->GetObject(nCur), LIST_APPEND);
827*cdf0e10cSrcweir 	}
828*cdf0e10cSrcweir 	delete pPaintedEntries;
829*cdf0e10cSrcweir 
830*cdf0e10cSrcweir 	if( bResetClipRegion )
831*cdf0e10cSrcweir 		pView->SetClipRegion();
832*cdf0e10cSrcweir }
833*cdf0e10cSrcweir 
834*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::RepaintEntries( sal_uInt16 nEntryFlagsMask )
835*cdf0e10cSrcweir {
836*cdf0e10cSrcweir 	const sal_uLong nCount = pZOrderList->Count();
837*cdf0e10cSrcweir 	if( !nCount )
838*cdf0e10cSrcweir 		return;
839*cdf0e10cSrcweir 
840*cdf0e10cSrcweir 	sal_Bool bResetClipRegion = sal_False;
841*cdf0e10cSrcweir 	Rectangle aOutRect( GetOutputRect() );
842*cdf0e10cSrcweir 	if( !pView->IsClipRegion() )
843*cdf0e10cSrcweir 	{
844*cdf0e10cSrcweir 		bResetClipRegion = sal_True;
845*cdf0e10cSrcweir 		pView->SetClipRegion( aOutRect );
846*cdf0e10cSrcweir 	}
847*cdf0e10cSrcweir 	for( sal_uLong nCur = 0; nCur < nCount; nCur++ )
848*cdf0e10cSrcweir 	{
849*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)(pZOrderList->GetObject(nCur));
850*cdf0e10cSrcweir 		if( pEntry->GetFlags() & nEntryFlagsMask )
851*cdf0e10cSrcweir 		{
852*cdf0e10cSrcweir 			const Rectangle& rBoundRect = GetEntryBoundRect( pEntry );
853*cdf0e10cSrcweir 			if( aOutRect.IsOver( rBoundRect ) )
854*cdf0e10cSrcweir 				PaintEntry( pEntry, rBoundRect.TopLeft() );
855*cdf0e10cSrcweir 		}
856*cdf0e10cSrcweir 	}
857*cdf0e10cSrcweir 	if( bResetClipRegion )
858*cdf0e10cSrcweir 		pView->SetClipRegion();
859*cdf0e10cSrcweir }
860*cdf0e10cSrcweir 
861*cdf0e10cSrcweir 
862*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::InitScrollBarBox()
863*cdf0e10cSrcweir {
864*cdf0e10cSrcweir 	aScrBarBox.SetSizePixel( Size(nVerSBarWidth-1, nHorSBarHeight-1) );
865*cdf0e10cSrcweir 	Size aSize( pView->GetOutputSizePixel() );
866*cdf0e10cSrcweir 	aScrBarBox.SetPosPixel( Point(aSize.Width()-nVerSBarWidth+1, aSize.Height()-nHorSBarHeight+1));
867*cdf0e10cSrcweir }
868*cdf0e10cSrcweir 
869*cdf0e10cSrcweir IcnViewFieldType SvxIconChoiceCtrl_Impl::GetItem( SvxIconChoiceCtrlEntry* pEntry,
870*cdf0e10cSrcweir 	const Point& rAbsPos )
871*cdf0e10cSrcweir {
872*cdf0e10cSrcweir 	Rectangle aRect( CalcTextRect( pEntry ) );
873*cdf0e10cSrcweir 	if( aRect.IsInside( rAbsPos ) )
874*cdf0e10cSrcweir 		return IcnViewFieldTypeText;
875*cdf0e10cSrcweir 
876*cdf0e10cSrcweir 	aRect = CalcBmpRect( pEntry );
877*cdf0e10cSrcweir 	if( aRect.IsInside( rAbsPos ) )
878*cdf0e10cSrcweir 		return IcnViewFieldTypeImage;
879*cdf0e10cSrcweir 
880*cdf0e10cSrcweir 	return IcnViewFieldTypeDontknow;
881*cdf0e10cSrcweir }
882*cdf0e10cSrcweir 
883*cdf0e10cSrcweir sal_Bool SvxIconChoiceCtrl_Impl::MouseButtonDown( const MouseEvent& rMEvt)
884*cdf0e10cSrcweir {
885*cdf0e10cSrcweir 	sal_Bool bHandled = sal_True;
886*cdf0e10cSrcweir 	bHighlightFramePressed = sal_False;
887*cdf0e10cSrcweir 	StopEditTimer();
888*cdf0e10cSrcweir 	sal_Bool bGotFocus = (sal_Bool)(!pView->HasFocus() && !(nWinBits & WB_NOPOINTERFOCUS));
889*cdf0e10cSrcweir 	if( !(nWinBits & WB_NOPOINTERFOCUS) )
890*cdf0e10cSrcweir 		pView->GrabFocus();
891*cdf0e10cSrcweir 
892*cdf0e10cSrcweir 	Point aDocPos( rMEvt.GetPosPixel() );
893*cdf0e10cSrcweir 	if(aDocPos.X()>=aOutputSize.Width() || aDocPos.Y()>=aOutputSize.Height())
894*cdf0e10cSrcweir 		return sal_False;
895*cdf0e10cSrcweir 	ToDocPos( aDocPos );
896*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pEntry = GetEntry( aDocPos, sal_True );
897*cdf0e10cSrcweir 	if( pEntry )
898*cdf0e10cSrcweir 		MakeEntryVisible( pEntry, sal_False );
899*cdf0e10cSrcweir 
900*cdf0e10cSrcweir 	if( rMEvt.IsShift() && eSelectionMode != SINGLE_SELECTION )
901*cdf0e10cSrcweir 	{
902*cdf0e10cSrcweir 		if( pEntry )
903*cdf0e10cSrcweir 			SetCursor_Impl( pCursor, pEntry, rMEvt.IsMod1(), rMEvt.IsShift(), sal_True);
904*cdf0e10cSrcweir 		return sal_True;
905*cdf0e10cSrcweir 	}
906*cdf0e10cSrcweir 
907*cdf0e10cSrcweir 	if( pAnchor && (rMEvt.IsShift() || rMEvt.IsMod1())) // Tastaturselektion?
908*cdf0e10cSrcweir 	{
909*cdf0e10cSrcweir 		DBG_ASSERT(eSelectionMode != SINGLE_SELECTION,"Invalid selection mode");
910*cdf0e10cSrcweir 		if( rMEvt.IsMod1() )
911*cdf0e10cSrcweir 			nFlags |= F_ADD_MODE;
912*cdf0e10cSrcweir 
913*cdf0e10cSrcweir 		if( rMEvt.IsShift() )
914*cdf0e10cSrcweir 		{
915*cdf0e10cSrcweir 			Rectangle aRect( GetEntryBoundRect( pAnchor ));
916*cdf0e10cSrcweir 			if( pEntry )
917*cdf0e10cSrcweir 				aRect.Union( GetEntryBoundRect( pEntry ) );
918*cdf0e10cSrcweir 			else
919*cdf0e10cSrcweir 			{
920*cdf0e10cSrcweir 				Rectangle aTempRect( aDocPos, Size(1,1));
921*cdf0e10cSrcweir 				aRect.Union( aTempRect );
922*cdf0e10cSrcweir 			}
923*cdf0e10cSrcweir 			aCurSelectionRect = aRect;
924*cdf0e10cSrcweir 			SelectRect( aRect, (nFlags & F_ADD_MODE)!=0, &aSelectedRectList );
925*cdf0e10cSrcweir 		}
926*cdf0e10cSrcweir 		else if( rMEvt.IsMod1() )
927*cdf0e10cSrcweir 		{
928*cdf0e10cSrcweir 			AddSelectedRect( aCurSelectionRect );
929*cdf0e10cSrcweir 			pAnchor = 0;
930*cdf0e10cSrcweir 			aCurSelectionRect.SetPos( aDocPos );
931*cdf0e10cSrcweir 		}
932*cdf0e10cSrcweir 
933*cdf0e10cSrcweir 		if( !pEntry && !(nWinBits & WB_NODRAGSELECTION))
934*cdf0e10cSrcweir 			pView->StartTracking( STARTTRACK_SCROLLREPEAT );
935*cdf0e10cSrcweir 		return sal_True;
936*cdf0e10cSrcweir 	}
937*cdf0e10cSrcweir 	else
938*cdf0e10cSrcweir 	{
939*cdf0e10cSrcweir 		if( !pEntry )
940*cdf0e10cSrcweir 		{
941*cdf0e10cSrcweir 			if( eSelectionMode == MULTIPLE_SELECTION )
942*cdf0e10cSrcweir 			{
943*cdf0e10cSrcweir 				if( !rMEvt.IsMod1() )  // Ctrl
944*cdf0e10cSrcweir 				{
945*cdf0e10cSrcweir 					if( !bGotFocus )
946*cdf0e10cSrcweir 					{
947*cdf0e10cSrcweir 						SetNoSelection();
948*cdf0e10cSrcweir 						ClearSelectedRectList();
949*cdf0e10cSrcweir 					}
950*cdf0e10cSrcweir 				}
951*cdf0e10cSrcweir 				else
952*cdf0e10cSrcweir 					nFlags |= F_ADD_MODE;
953*cdf0e10cSrcweir 				aCurSelectionRect.SetPos( aDocPos );
954*cdf0e10cSrcweir 				pView->StartTracking( STARTTRACK_SCROLLREPEAT );
955*cdf0e10cSrcweir 			}
956*cdf0e10cSrcweir 			else
957*cdf0e10cSrcweir 				bHandled = sal_False;
958*cdf0e10cSrcweir 			return bHandled;
959*cdf0e10cSrcweir 		}
960*cdf0e10cSrcweir 	}
961*cdf0e10cSrcweir 	sal_Bool bSelected = pEntry->IsSelected();
962*cdf0e10cSrcweir 	sal_Bool bEditingEnabled = IsEntryEditingEnabled();
963*cdf0e10cSrcweir 
964*cdf0e10cSrcweir 	if( rMEvt.GetClicks() == 2 )
965*cdf0e10cSrcweir 	{
966*cdf0e10cSrcweir 		DeselectAllBut( pEntry );
967*cdf0e10cSrcweir 		SelectEntry( pEntry, sal_True, sal_True, sal_False, sal_True );
968*cdf0e10cSrcweir 		pHdlEntry = pEntry;
969*cdf0e10cSrcweir 		pView->ClickIcon();
970*cdf0e10cSrcweir 	}
971*cdf0e10cSrcweir 	else
972*cdf0e10cSrcweir 	{
973*cdf0e10cSrcweir 		// Inplace-Editing ?
974*cdf0e10cSrcweir 		if( rMEvt.IsMod2() )  // Alt?
975*cdf0e10cSrcweir 		{
976*cdf0e10cSrcweir 			if( bEntryEditingEnabled && pEntry &&
977*cdf0e10cSrcweir 				pEntry->IsSelected())
978*cdf0e10cSrcweir 			{
979*cdf0e10cSrcweir 				if( pView->EditingEntry( pEntry ))
980*cdf0e10cSrcweir 					EditEntry( pEntry );
981*cdf0e10cSrcweir 			}
982*cdf0e10cSrcweir 		}
983*cdf0e10cSrcweir 		else if( eSelectionMode == SINGLE_SELECTION )
984*cdf0e10cSrcweir 		{
985*cdf0e10cSrcweir 			DeselectAllBut( pEntry );
986*cdf0e10cSrcweir 			SetCursor( pEntry );
987*cdf0e10cSrcweir 			if( bEditingEnabled && bSelected && !rMEvt.GetModifier() &&
988*cdf0e10cSrcweir 				rMEvt.IsLeft() && IsTextHit( pEntry, aDocPos ) )
989*cdf0e10cSrcweir 			{
990*cdf0e10cSrcweir 				nFlags |= F_START_EDITTIMER_IN_MOUSEUP;
991*cdf0e10cSrcweir 			}
992*cdf0e10cSrcweir 		}
993*cdf0e10cSrcweir 		else if( eSelectionMode == NO_SELECTION )
994*cdf0e10cSrcweir 		{
995*cdf0e10cSrcweir 			if( rMEvt.IsLeft() && (nWinBits & WB_HIGHLIGHTFRAME) )
996*cdf0e10cSrcweir 			{
997*cdf0e10cSrcweir 				pCurHighlightFrame = 0; // Neues painten des Frames erzwingen
998*cdf0e10cSrcweir 				bHighlightFramePressed = sal_True;
999*cdf0e10cSrcweir 				SetEntryHighlightFrame( pEntry, sal_True );
1000*cdf0e10cSrcweir 			}
1001*cdf0e10cSrcweir 		}
1002*cdf0e10cSrcweir 		else
1003*cdf0e10cSrcweir 		{
1004*cdf0e10cSrcweir 			if( !rMEvt.GetModifier() && rMEvt.IsLeft() )
1005*cdf0e10cSrcweir 			{
1006*cdf0e10cSrcweir 				if( !bSelected )
1007*cdf0e10cSrcweir 				{
1008*cdf0e10cSrcweir 					DeselectAllBut( pEntry, sal_True /* Synchron painten */ );
1009*cdf0e10cSrcweir 					SetCursor( pEntry );
1010*cdf0e10cSrcweir 					SelectEntry( pEntry, sal_True, sal_True, sal_False, sal_True );
1011*cdf0e10cSrcweir 				}
1012*cdf0e10cSrcweir 				else
1013*cdf0e10cSrcweir 				{
1014*cdf0e10cSrcweir 					// erst im Up deselektieren, falls Move per D&D!
1015*cdf0e10cSrcweir 					nFlags |= F_DOWN_DESELECT;
1016*cdf0e10cSrcweir 					if( bEditingEnabled && IsTextHit( pEntry, aDocPos ) &&
1017*cdf0e10cSrcweir 						rMEvt.IsLeft())
1018*cdf0e10cSrcweir 					{
1019*cdf0e10cSrcweir 						nFlags |= F_START_EDITTIMER_IN_MOUSEUP;
1020*cdf0e10cSrcweir 					}
1021*cdf0e10cSrcweir 				}
1022*cdf0e10cSrcweir 			}
1023*cdf0e10cSrcweir 			else if( rMEvt.IsMod1() )
1024*cdf0e10cSrcweir 				nFlags |= F_DOWN_CTRL;
1025*cdf0e10cSrcweir 		}
1026*cdf0e10cSrcweir 	}
1027*cdf0e10cSrcweir 	return bHandled;
1028*cdf0e10cSrcweir }
1029*cdf0e10cSrcweir 
1030*cdf0e10cSrcweir sal_Bool SvxIconChoiceCtrl_Impl::MouseButtonUp( const MouseEvent& rMEvt )
1031*cdf0e10cSrcweir {
1032*cdf0e10cSrcweir 	sal_Bool bHandled = sal_False;
1033*cdf0e10cSrcweir 	if( rMEvt.IsRight() && (nFlags & (F_DOWN_CTRL | F_DOWN_DESELECT) ))
1034*cdf0e10cSrcweir 	{
1035*cdf0e10cSrcweir 		nFlags &= ~(F_DOWN_CTRL | F_DOWN_DESELECT);
1036*cdf0e10cSrcweir 		bHandled = sal_True;
1037*cdf0e10cSrcweir 	}
1038*cdf0e10cSrcweir 
1039*cdf0e10cSrcweir 	Point aDocPos( rMEvt.GetPosPixel() );
1040*cdf0e10cSrcweir 	ToDocPos( aDocPos );
1041*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pDocEntry = GetEntry( aDocPos );
1042*cdf0e10cSrcweir 	if( pDocEntry )
1043*cdf0e10cSrcweir 	{
1044*cdf0e10cSrcweir 		if( nFlags & F_DOWN_CTRL )
1045*cdf0e10cSrcweir 		{
1046*cdf0e10cSrcweir 			// Ctrl & MultiSelection
1047*cdf0e10cSrcweir 			ToggleSelection( pDocEntry );
1048*cdf0e10cSrcweir 			SetCursor( pDocEntry );
1049*cdf0e10cSrcweir 			bHandled = sal_True;
1050*cdf0e10cSrcweir 		}
1051*cdf0e10cSrcweir 		else if( nFlags & F_DOWN_DESELECT )
1052*cdf0e10cSrcweir 		{
1053*cdf0e10cSrcweir 			DeselectAllBut( pDocEntry );
1054*cdf0e10cSrcweir 			SetCursor( pDocEntry );
1055*cdf0e10cSrcweir 			SelectEntry( pDocEntry, sal_True, sal_True, sal_False, sal_True );
1056*cdf0e10cSrcweir 			bHandled = sal_True;
1057*cdf0e10cSrcweir 		}
1058*cdf0e10cSrcweir 	}
1059*cdf0e10cSrcweir 
1060*cdf0e10cSrcweir 	nFlags &= ~(F_DOWN_CTRL | F_DOWN_DESELECT);
1061*cdf0e10cSrcweir 	if( nFlags & F_START_EDITTIMER_IN_MOUSEUP )
1062*cdf0e10cSrcweir 	{
1063*cdf0e10cSrcweir 		bHandled = sal_True;
1064*cdf0e10cSrcweir 		StartEditTimer();
1065*cdf0e10cSrcweir 		nFlags &= ~F_START_EDITTIMER_IN_MOUSEUP;
1066*cdf0e10cSrcweir 	}
1067*cdf0e10cSrcweir 
1068*cdf0e10cSrcweir 	if((nWinBits & WB_HIGHLIGHTFRAME) && bHighlightFramePressed && pCurHighlightFrame)
1069*cdf0e10cSrcweir 	{
1070*cdf0e10cSrcweir 		bHandled = sal_True;
1071*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pEntry = pCurHighlightFrame;
1072*cdf0e10cSrcweir 		pCurHighlightFrame = 0; // Neues painten des Frames erzwingen
1073*cdf0e10cSrcweir 		bHighlightFramePressed = sal_False;
1074*cdf0e10cSrcweir 		SetEntryHighlightFrame( pEntry, sal_True );
1075*cdf0e10cSrcweir #if 0
1076*cdf0e10cSrcweir 		CallSelectHandler( pCurHighlightFrame );
1077*cdf0e10cSrcweir #else
1078*cdf0e10cSrcweir 		pHdlEntry = pCurHighlightFrame;
1079*cdf0e10cSrcweir 		pView->ClickIcon();
1080*cdf0e10cSrcweir 
1081*cdf0e10cSrcweir 		// set focus on Icon
1082*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pOldCursor = pCursor;
1083*cdf0e10cSrcweir 		SetCursor_Impl( pOldCursor, pHdlEntry, sal_False, sal_False, sal_True );
1084*cdf0e10cSrcweir #endif
1085*cdf0e10cSrcweir 		pHdlEntry = 0;
1086*cdf0e10cSrcweir 	}
1087*cdf0e10cSrcweir 	return bHandled;
1088*cdf0e10cSrcweir }
1089*cdf0e10cSrcweir 
1090*cdf0e10cSrcweir sal_Bool SvxIconChoiceCtrl_Impl::MouseMove( const MouseEvent& rMEvt )
1091*cdf0e10cSrcweir {
1092*cdf0e10cSrcweir 	const Point aDocPos( pView->PixelToLogic(rMEvt.GetPosPixel()) );
1093*cdf0e10cSrcweir 
1094*cdf0e10cSrcweir 	if( pView->IsTracking() )
1095*cdf0e10cSrcweir 		return sal_False;
1096*cdf0e10cSrcweir 	else if( nWinBits & WB_HIGHLIGHTFRAME )
1097*cdf0e10cSrcweir 	{
1098*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pEntry = GetEntry( aDocPos, sal_True );
1099*cdf0e10cSrcweir 		SetEntryHighlightFrame( pEntry );
1100*cdf0e10cSrcweir 	}
1101*cdf0e10cSrcweir 	else
1102*cdf0e10cSrcweir 		return sal_False;
1103*cdf0e10cSrcweir 	return sal_True;
1104*cdf0e10cSrcweir }
1105*cdf0e10cSrcweir 
1106*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::Tracking( const TrackingEvent& rTEvt )
1107*cdf0e10cSrcweir {
1108*cdf0e10cSrcweir 	if ( rTEvt.IsTrackingEnded() )
1109*cdf0e10cSrcweir 	{
1110*cdf0e10cSrcweir 		// Das Rechteck darf nicht "justified" sein, da seine
1111*cdf0e10cSrcweir 		// TopLeft-Position u.U. zur Berechnung eines Ankers
1112*cdf0e10cSrcweir 		// benutzt wird.
1113*cdf0e10cSrcweir 		AddSelectedRect( aCurSelectionRect );
1114*cdf0e10cSrcweir 		pView->HideTracking();
1115*cdf0e10cSrcweir 		nFlags &= ~(F_ADD_MODE);
1116*cdf0e10cSrcweir 		if( rTEvt.IsTrackingCanceled() )
1117*cdf0e10cSrcweir 			SetNoSelection();
1118*cdf0e10cSrcweir 	}
1119*cdf0e10cSrcweir 	else
1120*cdf0e10cSrcweir 	{
1121*cdf0e10cSrcweir 		Point aPosPixel = rTEvt.GetMouseEvent().GetPosPixel();
1122*cdf0e10cSrcweir 		Point aDocPos( aPosPixel );
1123*cdf0e10cSrcweir 		ToDocPos( aDocPos );
1124*cdf0e10cSrcweir 
1125*cdf0e10cSrcweir 		long nScrollDX, nScrollDY;
1126*cdf0e10cSrcweir 
1127*cdf0e10cSrcweir 		CalcScrollOffsets( aPosPixel, nScrollDX, nScrollDY, sal_False );
1128*cdf0e10cSrcweir 		if( nScrollDX || nScrollDY )
1129*cdf0e10cSrcweir 		{
1130*cdf0e10cSrcweir 			pView->HideTracking();
1131*cdf0e10cSrcweir 			pView->Scroll( nScrollDX, nScrollDY );
1132*cdf0e10cSrcweir 		}
1133*cdf0e10cSrcweir 		Rectangle aRect( aCurSelectionRect.TopLeft(), aDocPos );
1134*cdf0e10cSrcweir 		if( aRect != aCurSelectionRect )
1135*cdf0e10cSrcweir 		{
1136*cdf0e10cSrcweir 			pView->HideTracking();
1137*cdf0e10cSrcweir 			sal_Bool bAdd = (nFlags & F_ADD_MODE) ? sal_True : sal_False;
1138*cdf0e10cSrcweir 			SelectRect( aRect, bAdd, &aSelectedRectList );
1139*cdf0e10cSrcweir 		}
1140*cdf0e10cSrcweir 		pView->ShowTracking( aRect, SHOWTRACK_SMALL | SHOWTRACK_CLIP );
1141*cdf0e10cSrcweir 	}
1142*cdf0e10cSrcweir }
1143*cdf0e10cSrcweir 
1144*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetCursor_Impl( SvxIconChoiceCtrlEntry* pOldCursor,
1145*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pNewCursor, sal_Bool bMod1, sal_Bool bShift, sal_Bool bPaintSync )
1146*cdf0e10cSrcweir {
1147*cdf0e10cSrcweir 	if( pNewCursor )
1148*cdf0e10cSrcweir 	{
1149*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pFilterEntry = 0;
1150*cdf0e10cSrcweir 		sal_Bool bDeselectAll = sal_False;
1151*cdf0e10cSrcweir 		if( eSelectionMode != SINGLE_SELECTION )
1152*cdf0e10cSrcweir 		{
1153*cdf0e10cSrcweir 			if( !bMod1 && !bShift )
1154*cdf0e10cSrcweir 				bDeselectAll = sal_True;
1155*cdf0e10cSrcweir 			else if( bShift && !bMod1 && !pAnchor )
1156*cdf0e10cSrcweir 			{
1157*cdf0e10cSrcweir 				bDeselectAll = sal_True;
1158*cdf0e10cSrcweir 				pFilterEntry = pOldCursor;
1159*cdf0e10cSrcweir 			}
1160*cdf0e10cSrcweir 		}
1161*cdf0e10cSrcweir 		if( bDeselectAll )
1162*cdf0e10cSrcweir 			DeselectAllBut( pFilterEntry, bPaintSync );
1163*cdf0e10cSrcweir 		ShowCursor( sal_False );
1164*cdf0e10cSrcweir 		MakeEntryVisible( pNewCursor );
1165*cdf0e10cSrcweir 		SetCursor( pNewCursor );
1166*cdf0e10cSrcweir 		if( bMod1 && !bShift )
1167*cdf0e10cSrcweir 		{
1168*cdf0e10cSrcweir 			if( pAnchor )
1169*cdf0e10cSrcweir 			{
1170*cdf0e10cSrcweir 				AddSelectedRect( pAnchor, pOldCursor );
1171*cdf0e10cSrcweir 				pAnchor = 0;
1172*cdf0e10cSrcweir 			}
1173*cdf0e10cSrcweir 		}
1174*cdf0e10cSrcweir 		else if( bShift )
1175*cdf0e10cSrcweir 		{
1176*cdf0e10cSrcweir 			if( !pAnchor )
1177*cdf0e10cSrcweir 				pAnchor = pOldCursor;
1178*cdf0e10cSrcweir 			if ( nWinBits & WB_ALIGN_LEFT )
1179*cdf0e10cSrcweir 				SelectRange( pAnchor, pNewCursor, (nFlags & F_ADD_MODE)!=0 );
1180*cdf0e10cSrcweir 			else
1181*cdf0e10cSrcweir 				SelectRect(pAnchor,pNewCursor,(nFlags & F_ADD_MODE)!=0,&aSelectedRectList);
1182*cdf0e10cSrcweir 		}
1183*cdf0e10cSrcweir 		else
1184*cdf0e10cSrcweir 		{
1185*cdf0e10cSrcweir 			SelectEntry( pCursor, sal_True, sal_True,  sal_False, bPaintSync );
1186*cdf0e10cSrcweir 			aCurSelectionRect = GetEntryBoundRect( pCursor );
1187*cdf0e10cSrcweir 		}
1188*cdf0e10cSrcweir 	}
1189*cdf0e10cSrcweir }
1190*cdf0e10cSrcweir 
1191*cdf0e10cSrcweir sal_Bool SvxIconChoiceCtrl_Impl::KeyInput( const KeyEvent& rKEvt )
1192*cdf0e10cSrcweir {
1193*cdf0e10cSrcweir 	StopEditTimer();
1194*cdf0e10cSrcweir 
1195*cdf0e10cSrcweir 	sal_Bool bMod2 = rKEvt.GetKeyCode().IsMod2();
1196*cdf0e10cSrcweir 	sal_Unicode cChar = rKEvt.GetCharCode();
1197*cdf0e10cSrcweir 	sal_uLong nPos = (sal_uLong)-1;
1198*cdf0e10cSrcweir 	if ( bMod2 && cChar && IsMnemonicChar( cChar, nPos ) )
1199*cdf0e10cSrcweir 	{
1200*cdf0e10cSrcweir 		// shortcut is clicked
1201*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pNewCursor = GetEntry( nPos );
1202*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pOldCursor = pCursor;
1203*cdf0e10cSrcweir 		if ( pNewCursor != pOldCursor )
1204*cdf0e10cSrcweir 			SetCursor_Impl( pOldCursor, pNewCursor, sal_False, sal_False, sal_False );
1205*cdf0e10cSrcweir 		return sal_True;
1206*cdf0e10cSrcweir 	}
1207*cdf0e10cSrcweir 
1208*cdf0e10cSrcweir 	if ( bMod2 )
1209*cdf0e10cSrcweir 		// no actions with <ALT>
1210*cdf0e10cSrcweir 		return sal_False;
1211*cdf0e10cSrcweir 
1212*cdf0e10cSrcweir 	sal_Bool bKeyUsed = sal_True;
1213*cdf0e10cSrcweir 	sal_Bool bMod1 = rKEvt.GetKeyCode().IsMod1();
1214*cdf0e10cSrcweir 	sal_Bool bShift = rKEvt.GetKeyCode().IsShift();
1215*cdf0e10cSrcweir 
1216*cdf0e10cSrcweir 	if( eSelectionMode == SINGLE_SELECTION || eSelectionMode == NO_SELECTION)
1217*cdf0e10cSrcweir 	{
1218*cdf0e10cSrcweir 		bShift = sal_False;
1219*cdf0e10cSrcweir 		bMod1 = sal_False;
1220*cdf0e10cSrcweir 	}
1221*cdf0e10cSrcweir 
1222*cdf0e10cSrcweir 	if( bMod1 )
1223*cdf0e10cSrcweir 		nFlags |= F_ADD_MODE;
1224*cdf0e10cSrcweir 	sal_Bool bDeselectAll = sal_False;
1225*cdf0e10cSrcweir 	if( eSelectionMode != SINGLE_SELECTION )
1226*cdf0e10cSrcweir 	{
1227*cdf0e10cSrcweir 		if( !bMod1 && !bShift )
1228*cdf0e10cSrcweir 			bDeselectAll = sal_True;
1229*cdf0e10cSrcweir 		if( bShift && !bMod1 && !pAnchor )
1230*cdf0e10cSrcweir 			bDeselectAll = sal_True;
1231*cdf0e10cSrcweir 	}
1232*cdf0e10cSrcweir 
1233*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pNewCursor;
1234*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pOldCursor = pCursor;
1235*cdf0e10cSrcweir 
1236*cdf0e10cSrcweir 	sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
1237*cdf0e10cSrcweir 	switch( nCode )
1238*cdf0e10cSrcweir 	{
1239*cdf0e10cSrcweir 		case KEY_UP:
1240*cdf0e10cSrcweir 		case KEY_PAGEUP:
1241*cdf0e10cSrcweir 			if( pCursor )
1242*cdf0e10cSrcweir 			{
1243*cdf0e10cSrcweir 				MakeEntryVisible( pCursor );
1244*cdf0e10cSrcweir 				if( nCode == KEY_UP )
1245*cdf0e10cSrcweir 					pNewCursor = pImpCursor->GoUpDown(pCursor,sal_False);
1246*cdf0e10cSrcweir 				else
1247*cdf0e10cSrcweir 					pNewCursor = pImpCursor->GoPageUpDown(pCursor,sal_False);
1248*cdf0e10cSrcweir 				SetCursor_Impl( pOldCursor, pNewCursor, bMod1, bShift, sal_True );
1249*cdf0e10cSrcweir 				if( !pNewCursor )
1250*cdf0e10cSrcweir 				{
1251*cdf0e10cSrcweir 					Rectangle aRect( GetEntryBoundRect( pCursor ) );
1252*cdf0e10cSrcweir 					if( aRect.Top())
1253*cdf0e10cSrcweir 					{
1254*cdf0e10cSrcweir 						aRect.Bottom() -= aRect.Top();
1255*cdf0e10cSrcweir 						aRect.Top() = 0;
1256*cdf0e10cSrcweir 						MakeVisible( aRect );
1257*cdf0e10cSrcweir 					}
1258*cdf0e10cSrcweir 				}
1259*cdf0e10cSrcweir 
1260*cdf0e10cSrcweir 				if ( bChooseWithCursor && pNewCursor != NULL )
1261*cdf0e10cSrcweir 				{
1262*cdf0e10cSrcweir 					pHdlEntry = pNewCursor;//GetCurEntry();
1263*cdf0e10cSrcweir 					pCurHighlightFrame = pHdlEntry;
1264*cdf0e10cSrcweir 					pView->ClickIcon();
1265*cdf0e10cSrcweir 					pCurHighlightFrame = NULL;
1266*cdf0e10cSrcweir 				}
1267*cdf0e10cSrcweir 			}
1268*cdf0e10cSrcweir 			break;
1269*cdf0e10cSrcweir 
1270*cdf0e10cSrcweir 		case KEY_DOWN:
1271*cdf0e10cSrcweir 		case KEY_PAGEDOWN:
1272*cdf0e10cSrcweir 			if( pCursor )
1273*cdf0e10cSrcweir 			{
1274*cdf0e10cSrcweir 				if( nCode == KEY_DOWN )
1275*cdf0e10cSrcweir 					pNewCursor=pImpCursor->GoUpDown( pCursor,sal_True );
1276*cdf0e10cSrcweir 				else
1277*cdf0e10cSrcweir 					pNewCursor=pImpCursor->GoPageUpDown( pCursor,sal_True );
1278*cdf0e10cSrcweir 				SetCursor_Impl( pOldCursor, pNewCursor, bMod1, bShift, sal_True );
1279*cdf0e10cSrcweir 
1280*cdf0e10cSrcweir 				if ( bChooseWithCursor && pNewCursor != NULL)
1281*cdf0e10cSrcweir 				{
1282*cdf0e10cSrcweir 					pHdlEntry = pNewCursor;//GetCurEntry();
1283*cdf0e10cSrcweir 					pCurHighlightFrame = pHdlEntry;
1284*cdf0e10cSrcweir 					pView->ClickIcon();
1285*cdf0e10cSrcweir 					pCurHighlightFrame = NULL;
1286*cdf0e10cSrcweir 				}
1287*cdf0e10cSrcweir 			}
1288*cdf0e10cSrcweir 			break;
1289*cdf0e10cSrcweir 
1290*cdf0e10cSrcweir 		case KEY_RIGHT:
1291*cdf0e10cSrcweir 			if( pCursor )
1292*cdf0e10cSrcweir 			{
1293*cdf0e10cSrcweir 				pNewCursor=pImpCursor->GoLeftRight(pCursor,sal_True );
1294*cdf0e10cSrcweir 				SetCursor_Impl( pOldCursor, pNewCursor, bMod1, bShift, sal_True );
1295*cdf0e10cSrcweir 			}
1296*cdf0e10cSrcweir 			break;
1297*cdf0e10cSrcweir 
1298*cdf0e10cSrcweir 		case KEY_LEFT:
1299*cdf0e10cSrcweir 			if( pCursor )
1300*cdf0e10cSrcweir 			{
1301*cdf0e10cSrcweir 				MakeEntryVisible( pCursor );
1302*cdf0e10cSrcweir 				pNewCursor = pImpCursor->GoLeftRight(pCursor,sal_False );
1303*cdf0e10cSrcweir 				SetCursor_Impl( pOldCursor, pNewCursor, bMod1, bShift, sal_True );
1304*cdf0e10cSrcweir 				if( !pNewCursor )
1305*cdf0e10cSrcweir 				{
1306*cdf0e10cSrcweir 					Rectangle aRect( GetEntryBoundRect(pCursor));
1307*cdf0e10cSrcweir 					if( aRect.Left() )
1308*cdf0e10cSrcweir 					{
1309*cdf0e10cSrcweir 						aRect.Right() -= aRect.Left();
1310*cdf0e10cSrcweir 						aRect.Left() = 0;
1311*cdf0e10cSrcweir 						MakeVisible( aRect );
1312*cdf0e10cSrcweir 					}
1313*cdf0e10cSrcweir 				}
1314*cdf0e10cSrcweir 			}
1315*cdf0e10cSrcweir 			break;
1316*cdf0e10cSrcweir 
1317*cdf0e10cSrcweir // wird vom VCL-Tracking gesteuert
1318*cdf0e10cSrcweir #if 0
1319*cdf0e10cSrcweir 		case KEY_ESCAPE:
1320*cdf0e10cSrcweir 			if( pView->IsTracking() )
1321*cdf0e10cSrcweir 			{
1322*cdf0e10cSrcweir 				HideSelectionRect();
1323*cdf0e10cSrcweir 				//SelectAll( sal_False );
1324*cdf0e10cSrcweir 				SetNoSelection();
1325*cdf0e10cSrcweir 				ClearSelectedRectList();
1326*cdf0e10cSrcweir 				nFlags &= ~F_TRACKING;
1327*cdf0e10cSrcweir 			}
1328*cdf0e10cSrcweir 			else
1329*cdf0e10cSrcweir 				bKeyUsed = sal_False;
1330*cdf0e10cSrcweir 			break;
1331*cdf0e10cSrcweir #endif
1332*cdf0e10cSrcweir 
1333*cdf0e10cSrcweir 
1334*cdf0e10cSrcweir 		case KEY_F2:
1335*cdf0e10cSrcweir 			if( !bMod1 && !bShift )
1336*cdf0e10cSrcweir 				EditTimeoutHdl( 0 );
1337*cdf0e10cSrcweir 			else
1338*cdf0e10cSrcweir 				bKeyUsed = sal_False;
1339*cdf0e10cSrcweir 			break;
1340*cdf0e10cSrcweir 
1341*cdf0e10cSrcweir 		case KEY_F8:
1342*cdf0e10cSrcweir 			if( rKEvt.GetKeyCode().IsShift() )
1343*cdf0e10cSrcweir 			{
1344*cdf0e10cSrcweir 				if( nFlags & F_ADD_MODE )
1345*cdf0e10cSrcweir 					nFlags &= (~F_ADD_MODE);
1346*cdf0e10cSrcweir 				else
1347*cdf0e10cSrcweir 					nFlags |= F_ADD_MODE;
1348*cdf0e10cSrcweir 			}
1349*cdf0e10cSrcweir 			else
1350*cdf0e10cSrcweir 				bKeyUsed = sal_False;
1351*cdf0e10cSrcweir 			break;
1352*cdf0e10cSrcweir 
1353*cdf0e10cSrcweir 		case KEY_SPACE:
1354*cdf0e10cSrcweir 			if( pCursor && eSelectionMode != SINGLE_SELECTION )
1355*cdf0e10cSrcweir 			{
1356*cdf0e10cSrcweir 				if( !bMod1 )
1357*cdf0e10cSrcweir 				{
1358*cdf0e10cSrcweir 					//SelectAll( sal_False );
1359*cdf0e10cSrcweir 					SetNoSelection();
1360*cdf0e10cSrcweir 					ClearSelectedRectList();
1361*cdf0e10cSrcweir 
1362*cdf0e10cSrcweir 					// click Icon with spacebar
1363*cdf0e10cSrcweir 					SetEntryHighlightFrame( GetCurEntry(), sal_True );
1364*cdf0e10cSrcweir 					pView->ClickIcon();
1365*cdf0e10cSrcweir 					pHdlEntry = pCurHighlightFrame;
1366*cdf0e10cSrcweir 					pCurHighlightFrame=0;
1367*cdf0e10cSrcweir 				}
1368*cdf0e10cSrcweir 				else
1369*cdf0e10cSrcweir 					ToggleSelection( pCursor );
1370*cdf0e10cSrcweir 			}
1371*cdf0e10cSrcweir 			break;
1372*cdf0e10cSrcweir 
1373*cdf0e10cSrcweir #ifdef DBG_UTIL
1374*cdf0e10cSrcweir 		case KEY_F10:
1375*cdf0e10cSrcweir 			if( rKEvt.GetKeyCode().IsShift() )
1376*cdf0e10cSrcweir 			{
1377*cdf0e10cSrcweir 				if( pCursor )
1378*cdf0e10cSrcweir 					pView->SetEntryTextMode( IcnShowTextFull, pCursor );
1379*cdf0e10cSrcweir 			}
1380*cdf0e10cSrcweir 			if( rKEvt.GetKeyCode().IsMod1() )
1381*cdf0e10cSrcweir 			{
1382*cdf0e10cSrcweir 				if( pCursor )
1383*cdf0e10cSrcweir 					pView->SetEntryTextMode( IcnShowTextShort, pCursor );
1384*cdf0e10cSrcweir 			}
1385*cdf0e10cSrcweir 			break;
1386*cdf0e10cSrcweir #endif
1387*cdf0e10cSrcweir 
1388*cdf0e10cSrcweir 		case KEY_ADD:
1389*cdf0e10cSrcweir 		case KEY_DIVIDE :
1390*cdf0e10cSrcweir 		case KEY_A:
1391*cdf0e10cSrcweir 			if( bMod1 && (eSelectionMode != SINGLE_SELECTION))
1392*cdf0e10cSrcweir 				SelectAll( sal_True );
1393*cdf0e10cSrcweir 			else
1394*cdf0e10cSrcweir 				bKeyUsed = sal_False;
1395*cdf0e10cSrcweir 			break;
1396*cdf0e10cSrcweir 
1397*cdf0e10cSrcweir 		case KEY_SUBTRACT:
1398*cdf0e10cSrcweir 		case KEY_COMMA :
1399*cdf0e10cSrcweir 			if( bMod1 )
1400*cdf0e10cSrcweir 				SetNoSelection();
1401*cdf0e10cSrcweir 			else
1402*cdf0e10cSrcweir 				bKeyUsed = sal_False;
1403*cdf0e10cSrcweir 			break;
1404*cdf0e10cSrcweir 
1405*cdf0e10cSrcweir 		case KEY_RETURN:
1406*cdf0e10cSrcweir 			if( bMod1 )
1407*cdf0e10cSrcweir 			{
1408*cdf0e10cSrcweir 				if( pCursor && bEntryEditingEnabled )
1409*cdf0e10cSrcweir 					/*pView->*/EditEntry( pCursor );
1410*cdf0e10cSrcweir 			}
1411*cdf0e10cSrcweir 			else
1412*cdf0e10cSrcweir 				bKeyUsed = sal_False;
1413*cdf0e10cSrcweir 			break;
1414*cdf0e10cSrcweir 
1415*cdf0e10cSrcweir 		case KEY_END:
1416*cdf0e10cSrcweir 			if( pCursor )
1417*cdf0e10cSrcweir 			{
1418*cdf0e10cSrcweir 				pNewCursor = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( aEntries.Count() - 1 );
1419*cdf0e10cSrcweir 				SetCursor_Impl( pOldCursor, pNewCursor, bMod1, bShift, sal_True );
1420*cdf0e10cSrcweir 			}
1421*cdf0e10cSrcweir 			break;
1422*cdf0e10cSrcweir 
1423*cdf0e10cSrcweir 		case KEY_HOME:
1424*cdf0e10cSrcweir 			if( pCursor )
1425*cdf0e10cSrcweir 			{
1426*cdf0e10cSrcweir 				pNewCursor = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( 0 );
1427*cdf0e10cSrcweir 				SetCursor_Impl( pOldCursor, pNewCursor, bMod1, bShift, sal_True );
1428*cdf0e10cSrcweir 			}
1429*cdf0e10cSrcweir 			break;
1430*cdf0e10cSrcweir 
1431*cdf0e10cSrcweir 		default:
1432*cdf0e10cSrcweir 			bKeyUsed = sal_False;
1433*cdf0e10cSrcweir 
1434*cdf0e10cSrcweir 	}
1435*cdf0e10cSrcweir 	return bKeyUsed;
1436*cdf0e10cSrcweir }
1437*cdf0e10cSrcweir 
1438*cdf0e10cSrcweir // Berechnet TopLeft der Scrollbars (nicht ihre Groessen!)
1439*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::PositionScrollBars( long nRealWidth, long nRealHeight )
1440*cdf0e10cSrcweir {
1441*cdf0e10cSrcweir 	// hor scrollbar
1442*cdf0e10cSrcweir 	Point aPos( 0, nRealHeight );
1443*cdf0e10cSrcweir 	aPos.Y() -= nHorSBarHeight;
1444*cdf0e10cSrcweir 
1445*cdf0e10cSrcweir 	if( aHorSBar.GetPosPixel() != aPos )
1446*cdf0e10cSrcweir 		aHorSBar.SetPosPixel( aPos );
1447*cdf0e10cSrcweir 
1448*cdf0e10cSrcweir 	// ver scrollbar
1449*cdf0e10cSrcweir 	aPos.X() = nRealWidth; aPos.Y() = 0;
1450*cdf0e10cSrcweir 	aPos.X() -= nVerSBarWidth;
1451*cdf0e10cSrcweir 	aPos.X()++;
1452*cdf0e10cSrcweir 	aPos.Y()--;
1453*cdf0e10cSrcweir 
1454*cdf0e10cSrcweir 	if( aVerSBar.GetPosPixel() != aPos )
1455*cdf0e10cSrcweir 		aVerSBar.SetPosPixel( aPos );
1456*cdf0e10cSrcweir }
1457*cdf0e10cSrcweir 
1458*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::AdjustScrollBars( sal_Bool )
1459*cdf0e10cSrcweir {
1460*cdf0e10cSrcweir 	Rectangle aOldOutRect( GetOutputRect() );
1461*cdf0e10cSrcweir 	long nVirtHeight = aVirtOutputSize.Height();
1462*cdf0e10cSrcweir 	long nVirtWidth = aVirtOutputSize.Width();
1463*cdf0e10cSrcweir 
1464*cdf0e10cSrcweir 	Size aOSize( pView->Control::GetOutputSizePixel() );
1465*cdf0e10cSrcweir 	long nRealHeight = aOSize.Height();
1466*cdf0e10cSrcweir 	long nRealWidth = aOSize.Width();
1467*cdf0e10cSrcweir 
1468*cdf0e10cSrcweir 	PositionScrollBars( nRealWidth, nRealHeight );
1469*cdf0e10cSrcweir 
1470*cdf0e10cSrcweir 	const MapMode& rMapMode = pView->GetMapMode();
1471*cdf0e10cSrcweir 	Point aOrigin( rMapMode.GetOrigin() );
1472*cdf0e10cSrcweir 
1473*cdf0e10cSrcweir 	long nVisibleWidth;
1474*cdf0e10cSrcweir 	if( nRealWidth > nVirtWidth )
1475*cdf0e10cSrcweir 		nVisibleWidth = nVirtWidth + aOrigin.X();
1476*cdf0e10cSrcweir 	else
1477*cdf0e10cSrcweir 		nVisibleWidth = nRealWidth;
1478*cdf0e10cSrcweir 
1479*cdf0e10cSrcweir 	long nVisibleHeight;
1480*cdf0e10cSrcweir 	if( nRealHeight > nVirtHeight )
1481*cdf0e10cSrcweir 		nVisibleHeight = nVirtHeight + aOrigin.Y();
1482*cdf0e10cSrcweir 	else
1483*cdf0e10cSrcweir 		nVisibleHeight = nRealHeight;
1484*cdf0e10cSrcweir 
1485*cdf0e10cSrcweir 	sal_Bool bVerSBar = ( nWinBits & WB_VSCROLL ) != 0;
1486*cdf0e10cSrcweir 	sal_Bool bHorSBar = ( nWinBits & WB_HSCROLL ) != 0;
1487*cdf0e10cSrcweir 	sal_Bool bNoVerSBar = ( nWinBits & WB_NOVSCROLL ) != 0;
1488*cdf0e10cSrcweir 	sal_Bool bNoHorSBar = ( nWinBits & WB_NOHSCROLL ) != 0;
1489*cdf0e10cSrcweir 
1490*cdf0e10cSrcweir 	sal_uInt16 nResult = 0;
1491*cdf0e10cSrcweir 	if( nVirtHeight )
1492*cdf0e10cSrcweir 	{
1493*cdf0e10cSrcweir 		// activate ver scrollbar ?
1494*cdf0e10cSrcweir 		if( !bNoVerSBar && (bVerSBar || ( nVirtHeight > nVisibleHeight)) )
1495*cdf0e10cSrcweir 		{
1496*cdf0e10cSrcweir 			nResult = 0x0001;
1497*cdf0e10cSrcweir 			nRealWidth -= nVerSBarWidth;
1498*cdf0e10cSrcweir 
1499*cdf0e10cSrcweir 			if( nRealWidth > nVirtWidth )
1500*cdf0e10cSrcweir 				nVisibleWidth = nVirtWidth + aOrigin.X();
1501*cdf0e10cSrcweir 			else
1502*cdf0e10cSrcweir 				nVisibleWidth = nRealWidth;
1503*cdf0e10cSrcweir 
1504*cdf0e10cSrcweir 			nFlags |= F_HOR_SBARSIZE_WITH_VBAR;
1505*cdf0e10cSrcweir 		}
1506*cdf0e10cSrcweir 		// activate hor scrollbar ?
1507*cdf0e10cSrcweir 		if( !bNoHorSBar && (bHorSBar || (nVirtWidth > nVisibleWidth)) )
1508*cdf0e10cSrcweir 		{
1509*cdf0e10cSrcweir 			nResult |= 0x0002;
1510*cdf0e10cSrcweir 			nRealHeight -= nHorSBarHeight;
1511*cdf0e10cSrcweir 
1512*cdf0e10cSrcweir 			if( nRealHeight > nVirtHeight )
1513*cdf0e10cSrcweir 				nVisibleHeight = nVirtHeight + aOrigin.Y();
1514*cdf0e10cSrcweir 			else
1515*cdf0e10cSrcweir 				nVisibleHeight = nRealHeight;
1516*cdf0e10cSrcweir 
1517*cdf0e10cSrcweir 			// brauchen wir jetzt doch eine senkrechte Scrollbar ?
1518*cdf0e10cSrcweir 			if( !(nResult & 0x0001) &&  // nur wenn nicht schon da
1519*cdf0e10cSrcweir 				( !bNoVerSBar && ((nVirtHeight > nVisibleHeight) || bVerSBar)) )
1520*cdf0e10cSrcweir 			{
1521*cdf0e10cSrcweir 				nResult = 3; // beide sind an
1522*cdf0e10cSrcweir 				nRealWidth -= nVerSBarWidth;
1523*cdf0e10cSrcweir 
1524*cdf0e10cSrcweir 				if( nRealWidth > nVirtWidth )
1525*cdf0e10cSrcweir 					nVisibleWidth = nVirtWidth + aOrigin.X();
1526*cdf0e10cSrcweir 				else
1527*cdf0e10cSrcweir 					nVisibleWidth = nRealWidth;
1528*cdf0e10cSrcweir 
1529*cdf0e10cSrcweir 				nFlags |= F_VER_SBARSIZE_WITH_HBAR;
1530*cdf0e10cSrcweir 			}
1531*cdf0e10cSrcweir 		}
1532*cdf0e10cSrcweir 	}
1533*cdf0e10cSrcweir 
1534*cdf0e10cSrcweir 	// size ver scrollbar
1535*cdf0e10cSrcweir 	long nThumb = aVerSBar.GetThumbPos();
1536*cdf0e10cSrcweir 	Size aSize( nVerSBarWidth, nRealHeight );
1537*cdf0e10cSrcweir 	aSize.Height() += 2;
1538*cdf0e10cSrcweir 	if( aSize != aVerSBar.GetSizePixel() )
1539*cdf0e10cSrcweir 		aVerSBar.SetSizePixel( aSize );
1540*cdf0e10cSrcweir 	aVerSBar.SetVisibleSize( nVisibleHeight );
1541*cdf0e10cSrcweir 	aVerSBar.SetPageSize( GetScrollBarPageSize( nVisibleHeight ));
1542*cdf0e10cSrcweir 
1543*cdf0e10cSrcweir 	if( nResult & 0x0001 )
1544*cdf0e10cSrcweir 	{
1545*cdf0e10cSrcweir 		aVerSBar.SetThumbPos( nThumb );
1546*cdf0e10cSrcweir 		aVerSBar.Show();
1547*cdf0e10cSrcweir 	}
1548*cdf0e10cSrcweir 	else
1549*cdf0e10cSrcweir 	{
1550*cdf0e10cSrcweir 		aVerSBar.SetThumbPos( 0 );
1551*cdf0e10cSrcweir 		aVerSBar.Hide();
1552*cdf0e10cSrcweir 	}
1553*cdf0e10cSrcweir 
1554*cdf0e10cSrcweir 	// size hor scrollbar
1555*cdf0e10cSrcweir 	nThumb = aHorSBar.GetThumbPos();
1556*cdf0e10cSrcweir 	aSize.Width() = nRealWidth;
1557*cdf0e10cSrcweir 	aSize.Height() = nHorSBarHeight;
1558*cdf0e10cSrcweir 	aSize.Width()++;
1559*cdf0e10cSrcweir 	if( nResult & 0x0001 ) // vertikale Scrollbar ?
1560*cdf0e10cSrcweir 	{
1561*cdf0e10cSrcweir 		aSize.Width()++;
1562*cdf0e10cSrcweir 		nRealWidth++;
1563*cdf0e10cSrcweir 	}
1564*cdf0e10cSrcweir 	if( aSize != aHorSBar.GetSizePixel() )
1565*cdf0e10cSrcweir 		aHorSBar.SetSizePixel( aSize );
1566*cdf0e10cSrcweir 	aHorSBar.SetVisibleSize( nVisibleWidth );
1567*cdf0e10cSrcweir 	aHorSBar.SetPageSize( GetScrollBarPageSize(nVisibleWidth ));
1568*cdf0e10cSrcweir 	if( nResult & 0x0002 )
1569*cdf0e10cSrcweir 	{
1570*cdf0e10cSrcweir 		aHorSBar.SetThumbPos( nThumb );
1571*cdf0e10cSrcweir 		aHorSBar.Show();
1572*cdf0e10cSrcweir 	}
1573*cdf0e10cSrcweir 	else
1574*cdf0e10cSrcweir 	{
1575*cdf0e10cSrcweir 		aHorSBar.SetThumbPos( 0 );
1576*cdf0e10cSrcweir 		aHorSBar.Hide();
1577*cdf0e10cSrcweir 	}
1578*cdf0e10cSrcweir 
1579*cdf0e10cSrcweir 	aOutputSize.Width() = nRealWidth;
1580*cdf0e10cSrcweir 	if( nResult & 0x0002 ) // hor scrollbar ?
1581*cdf0e10cSrcweir 		nRealHeight++; // weil unterer Rand geclippt wird
1582*cdf0e10cSrcweir 	aOutputSize.Height() = nRealHeight;
1583*cdf0e10cSrcweir 
1584*cdf0e10cSrcweir 	Rectangle aNewOutRect( GetOutputRect() );
1585*cdf0e10cSrcweir 	if( aNewOutRect != aOldOutRect && pView->HasBackground() )
1586*cdf0e10cSrcweir 	{
1587*cdf0e10cSrcweir 		Wallpaper aPaper( pView->GetBackground() );
1588*cdf0e10cSrcweir 		aPaper.SetRect( aNewOutRect );
1589*cdf0e10cSrcweir 		pView->SetBackground( aPaper );
1590*cdf0e10cSrcweir 	}
1591*cdf0e10cSrcweir 
1592*cdf0e10cSrcweir 	if( (nResult & (0x0001|0x0002)) == (0x0001|0x0002) )
1593*cdf0e10cSrcweir 		aScrBarBox.Show();
1594*cdf0e10cSrcweir 	else
1595*cdf0e10cSrcweir 		aScrBarBox.Hide();
1596*cdf0e10cSrcweir }
1597*cdf0e10cSrcweir 
1598*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::Resize()
1599*cdf0e10cSrcweir {
1600*cdf0e10cSrcweir 	StopEditTimer();
1601*cdf0e10cSrcweir 	InitScrollBarBox();
1602*cdf0e10cSrcweir 	aOutputSize = pView->GetOutputSizePixel();
1603*cdf0e10cSrcweir 	pImpCursor->Clear();
1604*cdf0e10cSrcweir 	pGridMap->OutputSizeChanged();
1605*cdf0e10cSrcweir 
1606*cdf0e10cSrcweir 	const Size& rSize = pView->Control::GetOutputSizePixel();
1607*cdf0e10cSrcweir 	PositionScrollBars( rSize.Width(), rSize.Height() );
1608*cdf0e10cSrcweir 	// Die ScrollBars werden asynchron ein/ausgeblendet, damit abgeleitete
1609*cdf0e10cSrcweir 	// Klassen im Resize ein Arrange durchfuehren koennen, ohne dass
1610*cdf0e10cSrcweir 	// die ScrollBars aufblitzen
1611*cdf0e10cSrcweir 	// Wenn schon ein Event unterwegs ist, dann braucht kein neues verschickt werden,
1612*cdf0e10cSrcweir 	// zumindest, solange es nur einen EventTypen gibt
1613*cdf0e10cSrcweir 	if ( ! nUserEventAdjustScrBars )
1614*cdf0e10cSrcweir 		nUserEventAdjustScrBars =
1615*cdf0e10cSrcweir 			Application::PostUserEvent( LINK( this, SvxIconChoiceCtrl_Impl, UserEventHdl),
1616*cdf0e10cSrcweir 				EVENTID_ADJUST_SCROLLBARS);
1617*cdf0e10cSrcweir 
1618*cdf0e10cSrcweir 	if( pView->HasBackground() && !pView->GetBackground().IsScrollable() )
1619*cdf0e10cSrcweir 	{
1620*cdf0e10cSrcweir 		Rectangle aRect( GetOutputRect());
1621*cdf0e10cSrcweir 		Wallpaper aPaper( pView->GetBackground() );
1622*cdf0e10cSrcweir 		aPaper.SetRect( aRect );
1623*cdf0e10cSrcweir 		pView->SetBackground( aPaper );
1624*cdf0e10cSrcweir 	}
1625*cdf0e10cSrcweir 	VisRectChanged();
1626*cdf0e10cSrcweir }
1627*cdf0e10cSrcweir 
1628*cdf0e10cSrcweir sal_Bool SvxIconChoiceCtrl_Impl::CheckHorScrollBar()
1629*cdf0e10cSrcweir {
1630*cdf0e10cSrcweir 	if( !pZOrderList || !aHorSBar.IsVisible() )
1631*cdf0e10cSrcweir 		return sal_False;
1632*cdf0e10cSrcweir 	const MapMode& rMapMode = pView->GetMapMode();
1633*cdf0e10cSrcweir 	Point aOrigin( rMapMode.GetOrigin() );
1634*cdf0e10cSrcweir 	if(!( nWinBits & WB_HSCROLL) && !aOrigin.X() )
1635*cdf0e10cSrcweir 	{
1636*cdf0e10cSrcweir 		long nWidth = aOutputSize.Width();
1637*cdf0e10cSrcweir 		const sal_uLong nCount = pZOrderList->Count();
1638*cdf0e10cSrcweir 		long nMostRight = 0;
1639*cdf0e10cSrcweir 		for( sal_uLong nCur = 0; nCur < nCount; nCur++ )
1640*cdf0e10cSrcweir 		{
1641*cdf0e10cSrcweir 			SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)pZOrderList->GetObject(nCur);
1642*cdf0e10cSrcweir 			long nRight = GetEntryBoundRect(pEntry).Right();
1643*cdf0e10cSrcweir 			if( nRight > nWidth )
1644*cdf0e10cSrcweir 				return sal_False;
1645*cdf0e10cSrcweir 			if( nRight > nMostRight )
1646*cdf0e10cSrcweir 				nMostRight = nRight;
1647*cdf0e10cSrcweir 		}
1648*cdf0e10cSrcweir 		aHorSBar.Hide();
1649*cdf0e10cSrcweir 		aOutputSize.Height() += nHorSBarHeight;
1650*cdf0e10cSrcweir 		aVirtOutputSize.Width() = nMostRight;
1651*cdf0e10cSrcweir 		aHorSBar.SetThumbPos( 0 );
1652*cdf0e10cSrcweir 		Range aRange;
1653*cdf0e10cSrcweir 		aRange.Max() = nMostRight - 1;
1654*cdf0e10cSrcweir 		aHorSBar.SetRange( aRange  );
1655*cdf0e10cSrcweir 		if( aVerSBar.IsVisible() )
1656*cdf0e10cSrcweir 		{
1657*cdf0e10cSrcweir 			Size aSize( aVerSBar.GetSizePixel());
1658*cdf0e10cSrcweir 			aSize.Height() += nHorSBarHeight;
1659*cdf0e10cSrcweir 			aVerSBar.SetSizePixel( aSize );
1660*cdf0e10cSrcweir 		}
1661*cdf0e10cSrcweir 		return sal_True;
1662*cdf0e10cSrcweir 	}
1663*cdf0e10cSrcweir 	return sal_False;
1664*cdf0e10cSrcweir }
1665*cdf0e10cSrcweir 
1666*cdf0e10cSrcweir sal_Bool SvxIconChoiceCtrl_Impl::CheckVerScrollBar()
1667*cdf0e10cSrcweir {
1668*cdf0e10cSrcweir 	if( !pZOrderList || !aVerSBar.IsVisible() )
1669*cdf0e10cSrcweir 		return sal_False;
1670*cdf0e10cSrcweir 	const MapMode& rMapMode = pView->GetMapMode();
1671*cdf0e10cSrcweir 	Point aOrigin( rMapMode.GetOrigin() );
1672*cdf0e10cSrcweir 	if(!( nWinBits & WB_VSCROLL) && !aOrigin.Y() )
1673*cdf0e10cSrcweir 	{
1674*cdf0e10cSrcweir 		long nDeepest = 0;
1675*cdf0e10cSrcweir 		long nHeight = aOutputSize.Height();
1676*cdf0e10cSrcweir 		const sal_uLong nCount = pZOrderList->Count();
1677*cdf0e10cSrcweir 		for( sal_uLong nCur = 0; nCur < nCount; nCur++ )
1678*cdf0e10cSrcweir 		{
1679*cdf0e10cSrcweir 			SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)pZOrderList->GetObject(nCur);
1680*cdf0e10cSrcweir 			long nBottom = GetEntryBoundRect(pEntry).Bottom();
1681*cdf0e10cSrcweir 			if( nBottom > nHeight )
1682*cdf0e10cSrcweir 				return sal_False;
1683*cdf0e10cSrcweir 			if( nBottom > nDeepest )
1684*cdf0e10cSrcweir 				nDeepest = nBottom;
1685*cdf0e10cSrcweir 		}
1686*cdf0e10cSrcweir 		aVerSBar.Hide();
1687*cdf0e10cSrcweir 		aOutputSize.Width() += nVerSBarWidth;
1688*cdf0e10cSrcweir 		aVirtOutputSize.Height() = nDeepest;
1689*cdf0e10cSrcweir 		aVerSBar.SetThumbPos( 0 );
1690*cdf0e10cSrcweir 		Range aRange;
1691*cdf0e10cSrcweir 		aRange.Max() = nDeepest - 1;
1692*cdf0e10cSrcweir 		aVerSBar.SetRange( aRange  );
1693*cdf0e10cSrcweir 		if( aHorSBar.IsVisible() )
1694*cdf0e10cSrcweir 		{
1695*cdf0e10cSrcweir 			Size aSize( aHorSBar.GetSizePixel());
1696*cdf0e10cSrcweir 			aSize.Width() += nVerSBarWidth;
1697*cdf0e10cSrcweir 			aHorSBar.SetSizePixel( aSize );
1698*cdf0e10cSrcweir 		}
1699*cdf0e10cSrcweir 		return sal_True;
1700*cdf0e10cSrcweir 	}
1701*cdf0e10cSrcweir 	return sal_False;
1702*cdf0e10cSrcweir }
1703*cdf0e10cSrcweir 
1704*cdf0e10cSrcweir 
1705*cdf0e10cSrcweir // blendet Scrollbars aus, wenn sie nicht mehr benoetigt werden
1706*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::CheckScrollBars()
1707*cdf0e10cSrcweir {
1708*cdf0e10cSrcweir 	CheckVerScrollBar();
1709*cdf0e10cSrcweir 	if( CheckHorScrollBar() )
1710*cdf0e10cSrcweir 		CheckVerScrollBar();
1711*cdf0e10cSrcweir 	if( aVerSBar.IsVisible() && aHorSBar.IsVisible() )
1712*cdf0e10cSrcweir 		aScrBarBox.Show();
1713*cdf0e10cSrcweir 	else
1714*cdf0e10cSrcweir 		aScrBarBox.Hide();
1715*cdf0e10cSrcweir }
1716*cdf0e10cSrcweir 
1717*cdf0e10cSrcweir 
1718*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::GetFocus()
1719*cdf0e10cSrcweir {
1720*cdf0e10cSrcweir 	RepaintEntries( ICNVIEW_FLAG_SELECTED );
1721*cdf0e10cSrcweir 	if( pCursor )
1722*cdf0e10cSrcweir 	{
1723*cdf0e10cSrcweir 		pCursor->SetFlags( ICNVIEW_FLAG_FOCUSED );
1724*cdf0e10cSrcweir 		ShowCursor( sal_True );
1725*cdf0e10cSrcweir 	}
1726*cdf0e10cSrcweir }
1727*cdf0e10cSrcweir 
1728*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::LoseFocus()
1729*cdf0e10cSrcweir {
1730*cdf0e10cSrcweir 	StopEditTimer();
1731*cdf0e10cSrcweir 	if( pCursor )
1732*cdf0e10cSrcweir 		pCursor->ClearFlags( ICNVIEW_FLAG_FOCUSED );
1733*cdf0e10cSrcweir 	ShowCursor( sal_False );
1734*cdf0e10cSrcweir 
1735*cdf0e10cSrcweir //	HideFocus ();
1736*cdf0e10cSrcweir //	pView->Invalidate ( aFocus.aRect );
1737*cdf0e10cSrcweir 
1738*cdf0e10cSrcweir 	RepaintEntries( ICNVIEW_FLAG_SELECTED );
1739*cdf0e10cSrcweir }
1740*cdf0e10cSrcweir 
1741*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetUpdateMode( sal_Bool bUpdate )
1742*cdf0e10cSrcweir {
1743*cdf0e10cSrcweir 	if( bUpdate != bUpdateMode )
1744*cdf0e10cSrcweir 	{
1745*cdf0e10cSrcweir 		bUpdateMode = bUpdate;
1746*cdf0e10cSrcweir 		if( bUpdate )
1747*cdf0e10cSrcweir 		{
1748*cdf0e10cSrcweir 			AdjustScrollBars();
1749*cdf0e10cSrcweir 			pImpCursor->Clear();
1750*cdf0e10cSrcweir 			pGridMap->Clear();
1751*cdf0e10cSrcweir 			pView->Invalidate(INVALIDATE_NOCHILDREN);
1752*cdf0e10cSrcweir 		}
1753*cdf0e10cSrcweir 	}
1754*cdf0e10cSrcweir }
1755*cdf0e10cSrcweir 
1756*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::PaintEntry( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bIsBackgroundPainted )
1757*cdf0e10cSrcweir {
1758*cdf0e10cSrcweir 	Point aPos( GetEntryPos( pEntry ) );
1759*cdf0e10cSrcweir 	PaintEntry( pEntry, aPos, 0, bIsBackgroundPainted );
1760*cdf0e10cSrcweir }
1761*cdf0e10cSrcweir 
1762*cdf0e10cSrcweir // Prios der Emphasis:  bDropTarget => bCursored => bSelected
1763*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::PaintEmphasis(
1764*cdf0e10cSrcweir 	const Rectangle& rTextRect, const Rectangle& rImageRect,
1765*cdf0e10cSrcweir 	sal_Bool bSelected, sal_Bool bDropTarget, sal_Bool bCursored, OutputDevice* pOut,
1766*cdf0e10cSrcweir 	sal_Bool bIsBackgroundPainted )
1767*cdf0e10cSrcweir {
1768*cdf0e10cSrcweir 	static Color aTransparent( COL_TRANSPARENT );
1769*cdf0e10cSrcweir 
1770*cdf0e10cSrcweir 	if( !pOut )
1771*cdf0e10cSrcweir 		pOut = pView;
1772*cdf0e10cSrcweir 
1773*cdf0e10cSrcweir #ifdef OV_CHECK_EMPH_RECTS
1774*cdf0e10cSrcweir 	{
1775*cdf0e10cSrcweir 		Color aXOld( pOut->GetFillColor() );
1776*cdf0e10cSrcweir 		pOut->SetFillColor( Color( COL_GREEN ));
1777*cdf0e10cSrcweir 		pOut->DrawRect( rTextRect );
1778*cdf0e10cSrcweir 		pOut->DrawRect( rImageRect );
1779*cdf0e10cSrcweir 		pOut->SetFillColor( aXOld );
1780*cdf0e10cSrcweir 	}
1781*cdf0e10cSrcweir #endif
1782*cdf0e10cSrcweir 
1783*cdf0e10cSrcweir 	const StyleSettings& rSettings = pOut->GetSettings().GetStyleSettings();
1784*cdf0e10cSrcweir 	Color aOldFillColor( pOut->GetFillColor() );
1785*cdf0e10cSrcweir 
1786*cdf0e10cSrcweir 	sal_Bool bSolidTextRect = sal_False;
1787*cdf0e10cSrcweir 	sal_Bool bSolidImageRect = sal_False;
1788*cdf0e10cSrcweir 
1789*cdf0e10cSrcweir 	if( bDropTarget && ( eSelectionMode != NO_SELECTION ) )
1790*cdf0e10cSrcweir 	{
1791*cdf0e10cSrcweir 		pOut->SetFillColor( rSettings.GetHighlightColor() );
1792*cdf0e10cSrcweir 		bSolidTextRect = sal_True;
1793*cdf0e10cSrcweir 		bSolidImageRect = sal_True;
1794*cdf0e10cSrcweir 	}
1795*cdf0e10cSrcweir 	else
1796*cdf0e10cSrcweir 	{
1797*cdf0e10cSrcweir 		if ( !bSelected || bCursored )
1798*cdf0e10cSrcweir 		{
1799*cdf0e10cSrcweir 			if( !pView->HasFontFillColor() )
1800*cdf0e10cSrcweir 				pOut->SetFillColor( pOut->GetBackground().GetColor() );
1801*cdf0e10cSrcweir 			else
1802*cdf0e10cSrcweir 			{
1803*cdf0e10cSrcweir 				const Color& rFillColor = pView->GetFont().GetFillColor();
1804*cdf0e10cSrcweir 				pOut->SetFillColor( rFillColor );
1805*cdf0e10cSrcweir 				if( rFillColor != aTransparent )
1806*cdf0e10cSrcweir 					bSolidTextRect = sal_True;
1807*cdf0e10cSrcweir 			}
1808*cdf0e10cSrcweir 		}
1809*cdf0e10cSrcweir 	}
1810*cdf0e10cSrcweir 
1811*cdf0e10cSrcweir 	// Textrechteck zeichnen
1812*cdf0e10cSrcweir 	if( !bSolidTextRect )
1813*cdf0e10cSrcweir 	{
1814*cdf0e10cSrcweir 		if( !bIsBackgroundPainted )
1815*cdf0e10cSrcweir 			pOut->Erase( rTextRect );
1816*cdf0e10cSrcweir 	}
1817*cdf0e10cSrcweir 	else
1818*cdf0e10cSrcweir 	{
1819*cdf0e10cSrcweir 		Color aOldLineColor;
1820*cdf0e10cSrcweir 		if( bCursored )
1821*cdf0e10cSrcweir 		{
1822*cdf0e10cSrcweir 			aOldLineColor = pOut->GetLineColor();
1823*cdf0e10cSrcweir 			pOut->SetLineColor( Color( COL_GRAY ) );
1824*cdf0e10cSrcweir 		}
1825*cdf0e10cSrcweir 		pOut->DrawRect( rTextRect );
1826*cdf0e10cSrcweir 		if( bCursored )
1827*cdf0e10cSrcweir 			pOut->SetLineColor( aOldLineColor );
1828*cdf0e10cSrcweir 	}
1829*cdf0e10cSrcweir 
1830*cdf0e10cSrcweir 	// Bildrechteck zeichnen
1831*cdf0e10cSrcweir 	if( !bSolidImageRect )
1832*cdf0e10cSrcweir 	{
1833*cdf0e10cSrcweir 		if( !bIsBackgroundPainted )
1834*cdf0e10cSrcweir 			pOut->Erase( rImageRect );
1835*cdf0e10cSrcweir 	}
1836*cdf0e10cSrcweir // die Emphasis des Images muss von der abgeleiteten Klasse gezeichnet werden
1837*cdf0e10cSrcweir // (in der virtuellen Funktion DrawEntryImage)
1838*cdf0e10cSrcweir //	else
1839*cdf0e10cSrcweir //		pOut->DrawRect( rImageRect );
1840*cdf0e10cSrcweir 
1841*cdf0e10cSrcweir 	pOut->SetFillColor( aOldFillColor );
1842*cdf0e10cSrcweir }
1843*cdf0e10cSrcweir 
1844*cdf0e10cSrcweir 
1845*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::PaintItem( const Rectangle& rRect,
1846*cdf0e10cSrcweir 	IcnViewFieldType eItem, SvxIconChoiceCtrlEntry* pEntry, sal_uInt16 nPaintFlags,
1847*cdf0e10cSrcweir 	OutputDevice* pOut, const String* pStr, ::vcl::ControlLayoutData* _pLayoutData )
1848*cdf0e10cSrcweir {
1849*cdf0e10cSrcweir 	if( eItem == IcnViewFieldTypeText )
1850*cdf0e10cSrcweir 	{
1851*cdf0e10cSrcweir 		String aText;
1852*cdf0e10cSrcweir 		if( !pStr )
1853*cdf0e10cSrcweir 			aText = pView->GetEntryText( pEntry, sal_False );
1854*cdf0e10cSrcweir 		else
1855*cdf0e10cSrcweir 			aText = *pStr;
1856*cdf0e10cSrcweir 
1857*cdf0e10cSrcweir 		if ( _pLayoutData )
1858*cdf0e10cSrcweir 		{
1859*cdf0e10cSrcweir 			pOut->DrawText( rRect, aText, nCurTextDrawFlags,
1860*cdf0e10cSrcweir 				&_pLayoutData->m_aUnicodeBoundRects, &_pLayoutData->m_aDisplayText );
1861*cdf0e10cSrcweir 		}
1862*cdf0e10cSrcweir 		else
1863*cdf0e10cSrcweir 		{
1864*cdf0e10cSrcweir 			Color aOldFontColor = pOut->GetTextColor();
1865*cdf0e10cSrcweir 			if ( pView->AutoFontColor() )
1866*cdf0e10cSrcweir 			{
1867*cdf0e10cSrcweir 				Color aBkgColor( pOut->GetBackground().GetColor() );
1868*cdf0e10cSrcweir 				Color aFontColor;
1869*cdf0e10cSrcweir 				sal_uInt16 nColor = ( aBkgColor.GetRed() + aBkgColor.GetGreen() + aBkgColor.GetBlue() ) / 3;
1870*cdf0e10cSrcweir 				if ( nColor > 127 )
1871*cdf0e10cSrcweir 					aFontColor.SetColor ( COL_BLACK );
1872*cdf0e10cSrcweir 				else
1873*cdf0e10cSrcweir 					aFontColor.SetColor( COL_WHITE );
1874*cdf0e10cSrcweir 				pOut->SetTextColor( aFontColor );
1875*cdf0e10cSrcweir 			}
1876*cdf0e10cSrcweir 
1877*cdf0e10cSrcweir 			pOut->DrawText( rRect, aText, nCurTextDrawFlags );
1878*cdf0e10cSrcweir 
1879*cdf0e10cSrcweir 			if ( pView->AutoFontColor() )
1880*cdf0e10cSrcweir 				pOut->SetTextColor( aOldFontColor );
1881*cdf0e10cSrcweir 
1882*cdf0e10cSrcweir 			if( pEntry->IsFocused() )
1883*cdf0e10cSrcweir 			{
1884*cdf0e10cSrcweir 				Rectangle aRect ( CalcFocusRect( (SvxIconChoiceCtrlEntry*)pEntry ) );
1885*cdf0e10cSrcweir 				/*pView->*/ShowFocus( aRect );
1886*cdf0e10cSrcweir 				DrawFocusRect( pOut );
1887*cdf0e10cSrcweir 			}
1888*cdf0e10cSrcweir 		}
1889*cdf0e10cSrcweir 	}
1890*cdf0e10cSrcweir 	else
1891*cdf0e10cSrcweir 	{
1892*cdf0e10cSrcweir 		Point aPos( rRect.TopLeft() );
1893*cdf0e10cSrcweir 		if( nPaintFlags & PAINTFLAG_HOR_CENTERED )
1894*cdf0e10cSrcweir 			aPos.X() += (rRect.GetWidth() - aImageSize.Width() ) / 2;
1895*cdf0e10cSrcweir 		if( nPaintFlags & PAINTFLAG_VER_CENTERED )
1896*cdf0e10cSrcweir 			aPos.Y() += (rRect.GetHeight() - aImageSize.Height() ) / 2;
1897*cdf0e10cSrcweir 		pView->DrawEntryImage( pEntry, aPos, *pOut );
1898*cdf0e10cSrcweir 	}
1899*cdf0e10cSrcweir }
1900*cdf0e10cSrcweir 
1901*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::PaintEntryVirtOutDev( SvxIconChoiceCtrlEntry* pEntry )
1902*cdf0e10cSrcweir {
1903*cdf0e10cSrcweir #ifdef OV_NO_VIRT_OUTDEV
1904*cdf0e10cSrcweir 	PaintEntry( pEntry );
1905*cdf0e10cSrcweir #else
1906*cdf0e10cSrcweir 	if( !pEntryPaintDev )
1907*cdf0e10cSrcweir 	{
1908*cdf0e10cSrcweir 		pEntryPaintDev = new VirtualDevice( *pView );
1909*cdf0e10cSrcweir 		pEntryPaintDev->SetFont( pView->GetFont() );
1910*cdf0e10cSrcweir 		pEntryPaintDev->SetLineColor();
1911*cdf0e10cSrcweir 		//pEntryPaintDev->SetBackground( pView->GetBackground() );
1912*cdf0e10cSrcweir 	}
1913*cdf0e10cSrcweir 	const Rectangle& rRect = GetEntryBoundRect( pEntry );
1914*cdf0e10cSrcweir 	Rectangle aOutRect( GetOutputRect() );
1915*cdf0e10cSrcweir 	if( !rRect.IsOver( aOutRect ) )
1916*cdf0e10cSrcweir 		return;
1917*cdf0e10cSrcweir 	Wallpaper aPaper( pView->GetBackground() );
1918*cdf0e10cSrcweir 	Rectangle aRect( aPaper.GetRect() );
1919*cdf0e10cSrcweir 
1920*cdf0e10cSrcweir 	// Rechteck verschieben, so dass das Boundrect des Entries im
1921*cdf0e10cSrcweir 	// VirtOut-Dev bei 0,0 liegt.
1922*cdf0e10cSrcweir 	aRect.Move( -rRect.Left(), -rRect.Top() );
1923*cdf0e10cSrcweir 	aPaper.SetRect( aRect );
1924*cdf0e10cSrcweir 	pEntryPaintDev->SetBackground( aPaper );
1925*cdf0e10cSrcweir 	pEntryPaintDev->SetFont( pView->GetFont() );
1926*cdf0e10cSrcweir 	Rectangle aPix ( pEntryPaintDev->LogicToPixel(aRect) );
1927*cdf0e10cSrcweir 
1928*cdf0e10cSrcweir 
1929*cdf0e10cSrcweir 	Size aSize( rRect.GetSize() );
1930*cdf0e10cSrcweir 	pEntryPaintDev->SetOutputSizePixel( aSize );
1931*cdf0e10cSrcweir 	pEntryPaintDev->DrawOutDev(
1932*cdf0e10cSrcweir 		Point(), aSize, rRect.TopLeft(), aSize, *pView );
1933*cdf0e10cSrcweir 
1934*cdf0e10cSrcweir 	PaintEntry( pEntry, Point(), pEntryPaintDev );
1935*cdf0e10cSrcweir 
1936*cdf0e10cSrcweir 	pView->DrawOutDev(
1937*cdf0e10cSrcweir 		rRect.TopLeft(),
1938*cdf0e10cSrcweir 		aSize,
1939*cdf0e10cSrcweir 		Point(),
1940*cdf0e10cSrcweir 		aSize,
1941*cdf0e10cSrcweir 		*pEntryPaintDev );
1942*cdf0e10cSrcweir #endif
1943*cdf0e10cSrcweir }
1944*cdf0e10cSrcweir 
1945*cdf0e10cSrcweir 
1946*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::PaintEntry( SvxIconChoiceCtrlEntry* pEntry, const Point& rPos,
1947*cdf0e10cSrcweir 	OutputDevice* pOut, sal_Bool bIsBackgroundPainted )
1948*cdf0e10cSrcweir {
1949*cdf0e10cSrcweir 	if( !pOut )
1950*cdf0e10cSrcweir 		pOut = pView;
1951*cdf0e10cSrcweir 
1952*cdf0e10cSrcweir 	sal_Bool bSelected = sal_False;
1953*cdf0e10cSrcweir 
1954*cdf0e10cSrcweir 	if( eSelectionMode != NO_SELECTION )
1955*cdf0e10cSrcweir 		bSelected = pEntry->IsSelected();
1956*cdf0e10cSrcweir 
1957*cdf0e10cSrcweir 	sal_Bool bCursored = pEntry->IsCursored();
1958*cdf0e10cSrcweir 	sal_Bool bDropTarget = pEntry->IsDropTarget();
1959*cdf0e10cSrcweir 	sal_Bool bNoEmphasis = pEntry->IsBlockingEmphasis();
1960*cdf0e10cSrcweir 
1961*cdf0e10cSrcweir 	Font aTempFont( pOut->GetFont() );
1962*cdf0e10cSrcweir 
1963*cdf0e10cSrcweir 	// AutoFontColor
1964*cdf0e10cSrcweir 	/*
1965*cdf0e10cSrcweir 	if ( pView->AutoFontColor() )
1966*cdf0e10cSrcweir 	{
1967*cdf0e10cSrcweir 		aTempFont.SetColor ( aFontColor );
1968*cdf0e10cSrcweir 	}
1969*cdf0e10cSrcweir 	*/
1970*cdf0e10cSrcweir 
1971*cdf0e10cSrcweir 	String aEntryText( pView->GetEntryText( pEntry, sal_False ) );
1972*cdf0e10cSrcweir 	Rectangle aTextRect( CalcTextRect(pEntry,&rPos,sal_False,&aEntryText));
1973*cdf0e10cSrcweir 	Rectangle aBmpRect( CalcBmpRect(pEntry, &rPos ) );
1974*cdf0e10cSrcweir 
1975*cdf0e10cSrcweir 	sal_Bool	bShowSelection =
1976*cdf0e10cSrcweir 		(	(	( bSelected && !bCursored )
1977*cdf0e10cSrcweir 			||	bDropTarget
1978*cdf0e10cSrcweir 			)
1979*cdf0e10cSrcweir 		&&	!bNoEmphasis
1980*cdf0e10cSrcweir 		&&	( eSelectionMode != NO_SELECTION )
1981*cdf0e10cSrcweir 		);
1982*cdf0e10cSrcweir 	sal_Bool bActiveSelection = ( 0 != ( nWinBits & WB_NOHIDESELECTION ) ) || pView->HasFocus();
1983*cdf0e10cSrcweir 
1984*cdf0e10cSrcweir 	if ( bShowSelection )
1985*cdf0e10cSrcweir 	{
1986*cdf0e10cSrcweir 		const StyleSettings& rSettings = pOut->GetSettings().GetStyleSettings();
1987*cdf0e10cSrcweir 		Font aNewFont( aTempFont );
1988*cdf0e10cSrcweir 
1989*cdf0e10cSrcweir 		// bei hart attributierter Font-Fuellcolor muessen wir diese
1990*cdf0e10cSrcweir 		// hart auf die Highlight-Color setzen
1991*cdf0e10cSrcweir 		if( pView->HasFontFillColor() )
1992*cdf0e10cSrcweir 		{
1993*cdf0e10cSrcweir 			if( (nWinBits & WB_NOHIDESELECTION) || pView->HasFocus() )
1994*cdf0e10cSrcweir 				aNewFont.SetFillColor( rSettings.GetHighlightColor() );
1995*cdf0e10cSrcweir 			else
1996*cdf0e10cSrcweir 				aNewFont.SetFillColor( rSettings.GetDeactiveColor() );
1997*cdf0e10cSrcweir 		}
1998*cdf0e10cSrcweir 
1999*cdf0e10cSrcweir 		Color aWinCol = rSettings.GetWindowTextColor();
2000*cdf0e10cSrcweir 		if ( !bActiveSelection && rSettings.GetFaceColor().IsBright() == aWinCol.IsBright() )
2001*cdf0e10cSrcweir 			aNewFont.SetColor( rSettings.GetWindowTextColor() );
2002*cdf0e10cSrcweir 		else
2003*cdf0e10cSrcweir 			aNewFont.SetColor( rSettings.GetHighlightTextColor() );
2004*cdf0e10cSrcweir 
2005*cdf0e10cSrcweir 		pOut->SetFont( aNewFont );
2006*cdf0e10cSrcweir 
2007*cdf0e10cSrcweir 		pOut->SetFillColor( pOut->GetBackground().GetColor() );
2008*cdf0e10cSrcweir 		pOut->DrawRect( CalcFocusRect( pEntry ) );
2009*cdf0e10cSrcweir 		pOut->SetFillColor( );
2010*cdf0e10cSrcweir 	}
2011*cdf0e10cSrcweir 
2012*cdf0e10cSrcweir 	sal_Bool bResetClipRegion = sal_False;
2013*cdf0e10cSrcweir 	if( !pView->IsClipRegion() && (aVerSBar.IsVisible() || aHorSBar.IsVisible()) )
2014*cdf0e10cSrcweir 	{
2015*cdf0e10cSrcweir 		Rectangle aOutputArea( GetOutputRect() );
2016*cdf0e10cSrcweir 		if( aOutputArea.IsOver(aTextRect) || aOutputArea.IsOver(aBmpRect) )
2017*cdf0e10cSrcweir 		{
2018*cdf0e10cSrcweir 			pView->SetClipRegion( aOutputArea );
2019*cdf0e10cSrcweir 			bResetClipRegion = sal_True;
2020*cdf0e10cSrcweir 		}
2021*cdf0e10cSrcweir 	}
2022*cdf0e10cSrcweir 
2023*cdf0e10cSrcweir #ifdef OV_DRAWBOUNDRECT
2024*cdf0e10cSrcweir 	{
2025*cdf0e10cSrcweir 		Color aXOldColor = pOut->GetLineColor();
2026*cdf0e10cSrcweir 		pOut->SetLineColor( Color( COL_LIGHTRED ) );
2027*cdf0e10cSrcweir 		Rectangle aXRect( pEntry->aRect );
2028*cdf0e10cSrcweir 		aXRect.SetPos( rPos );
2029*cdf0e10cSrcweir 		pOut->DrawRect( aXRect );
2030*cdf0e10cSrcweir 		pOut->SetLineColor( aXOldColor );
2031*cdf0e10cSrcweir 	}
2032*cdf0e10cSrcweir #endif
2033*cdf0e10cSrcweir 
2034*cdf0e10cSrcweir 	sal_Bool bLargeIconMode = WB_ICON == ( nWinBits & (VIEWMODE_MASK) );
2035*cdf0e10cSrcweir 	sal_uInt16 nBmpPaintFlags = PAINTFLAG_VER_CENTERED;
2036*cdf0e10cSrcweir 	if ( bLargeIconMode )
2037*cdf0e10cSrcweir 		nBmpPaintFlags |= PAINTFLAG_HOR_CENTERED;
2038*cdf0e10cSrcweir 	sal_uInt16 nTextPaintFlags = bLargeIconMode ? PAINTFLAG_HOR_CENTERED : PAINTFLAG_VER_CENTERED;
2039*cdf0e10cSrcweir 
2040*cdf0e10cSrcweir 	if( !bNoEmphasis )
2041*cdf0e10cSrcweir 		PaintEmphasis(aTextRect,aBmpRect,bSelected,bDropTarget,bCursored,pOut,bIsBackgroundPainted);
2042*cdf0e10cSrcweir 
2043*cdf0e10cSrcweir 	if ( bShowSelection )
2044*cdf0e10cSrcweir 		pView->DrawSelectionBackground( CalcFocusRect( pEntry ),
2045*cdf0e10cSrcweir 		bActiveSelection ? 1 : 2 /* highlight */, sal_False /* check */, sal_True /* border */, sal_False /* ext border only */ );
2046*cdf0e10cSrcweir 
2047*cdf0e10cSrcweir 	PaintItem( aBmpRect, IcnViewFieldTypeImage, pEntry, nBmpPaintFlags, pOut );
2048*cdf0e10cSrcweir 
2049*cdf0e10cSrcweir 	PaintItem( aTextRect, IcnViewFieldTypeText, pEntry,
2050*cdf0e10cSrcweir 		nTextPaintFlags, pOut );
2051*cdf0e10cSrcweir 
2052*cdf0e10cSrcweir 	// Highlight-Frame zeichnen
2053*cdf0e10cSrcweir 	if( pEntry == pCurHighlightFrame && !bNoEmphasis )
2054*cdf0e10cSrcweir 		DrawHighlightFrame( pOut, CalcFocusRect( pEntry ), sal_False );
2055*cdf0e10cSrcweir 
2056*cdf0e10cSrcweir 	pOut->SetFont( aTempFont );
2057*cdf0e10cSrcweir 	if( bResetClipRegion )
2058*cdf0e10cSrcweir 		pView->SetClipRegion();
2059*cdf0e10cSrcweir }
2060*cdf0e10cSrcweir 
2061*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetEntryPos( SvxIconChoiceCtrlEntry* pEntry, const Point& rPos,
2062*cdf0e10cSrcweir 	sal_Bool bAdjustAtGrid, sal_Bool bCheckScrollBars, sal_Bool bKeepGridMap )
2063*cdf0e10cSrcweir {
2064*cdf0e10cSrcweir 	ShowCursor( sal_False );
2065*cdf0e10cSrcweir 	Rectangle aBoundRect( GetEntryBoundRect( pEntry ));
2066*cdf0e10cSrcweir 	pView->Invalidate( aBoundRect );
2067*cdf0e10cSrcweir 	ToTop( pEntry );
2068*cdf0e10cSrcweir 	if( !IsAutoArrange() )
2069*cdf0e10cSrcweir 	{
2070*cdf0e10cSrcweir 		sal_Bool bAdjustVirtSize = sal_False;
2071*cdf0e10cSrcweir 		if( rPos != aBoundRect.TopLeft() )
2072*cdf0e10cSrcweir 		{
2073*cdf0e10cSrcweir 			Point aGridOffs(
2074*cdf0e10cSrcweir 				pEntry->aGridRect.TopLeft() - pEntry->aRect.TopLeft() );
2075*cdf0e10cSrcweir 			pImpCursor->Clear();
2076*cdf0e10cSrcweir 			if( !bKeepGridMap )
2077*cdf0e10cSrcweir 				pGridMap->Clear();
2078*cdf0e10cSrcweir 			aBoundRect.SetPos( rPos );
2079*cdf0e10cSrcweir 			pEntry->aRect = aBoundRect;
2080*cdf0e10cSrcweir 			pEntry->aGridRect.SetPos( rPos + aGridOffs );
2081*cdf0e10cSrcweir 			bAdjustVirtSize = sal_True;
2082*cdf0e10cSrcweir 		}
2083*cdf0e10cSrcweir 		if( bAdjustAtGrid )
2084*cdf0e10cSrcweir 		{
2085*cdf0e10cSrcweir 			if( bAdjustVirtSize )
2086*cdf0e10cSrcweir 			{
2087*cdf0e10cSrcweir 				// Durch das Ausrichten des (ggf. gerade neu positionierten) Eintrags,
2088*cdf0e10cSrcweir 				// kann er wieder komplett
2089*cdf0e10cSrcweir 				// in den sichtbaren Bereich rutschen, so dass u.U. doch keine Scrollbar
2090*cdf0e10cSrcweir 				// eingeblendet werden muss. Um deshalb ein 'Aufblitzen' der
2091*cdf0e10cSrcweir 				// Scrollbar(s) zu vermeiden, wird zum Aufplustern der virtuellen
2092*cdf0e10cSrcweir 				// Ausgabegroesse bereits das ausgerichtete Boundrect des
2093*cdf0e10cSrcweir 				// Eintrags genommen. Die virtuelle Groesse muss angepasst werden,
2094*cdf0e10cSrcweir 				// da AdjustEntryAtGrid von ihr abhaengt.
2095*cdf0e10cSrcweir 				const Rectangle& rBoundRect = GetEntryBoundRect( pEntry );
2096*cdf0e10cSrcweir 				Rectangle aCenterRect( CalcBmpRect( pEntry, 0 ));
2097*cdf0e10cSrcweir 				Point aNewPos( AdjustAtGrid( aCenterRect, rBoundRect ) );
2098*cdf0e10cSrcweir 				Rectangle aNewBoundRect( aNewPos, pEntry->aRect.GetSize());
2099*cdf0e10cSrcweir 				AdjustVirtSize( aNewBoundRect );
2100*cdf0e10cSrcweir 				bAdjustVirtSize = sal_False;
2101*cdf0e10cSrcweir 			}
2102*cdf0e10cSrcweir 			AdjustEntryAtGrid( pEntry );
2103*cdf0e10cSrcweir 			ToTop( pEntry );
2104*cdf0e10cSrcweir 		}
2105*cdf0e10cSrcweir 		if( bAdjustVirtSize )
2106*cdf0e10cSrcweir 			AdjustVirtSize( pEntry->aRect );
2107*cdf0e10cSrcweir 
2108*cdf0e10cSrcweir 		if( bCheckScrollBars && bUpdateMode )
2109*cdf0e10cSrcweir 			CheckScrollBars();
2110*cdf0e10cSrcweir 
2111*cdf0e10cSrcweir 		pView->Invalidate( pEntry->aRect );
2112*cdf0e10cSrcweir 		pGridMap->OccupyGrids( pEntry );
2113*cdf0e10cSrcweir 	}
2114*cdf0e10cSrcweir 	else
2115*cdf0e10cSrcweir 	{
2116*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry*	pPrev = FindEntryPredecessor( pEntry, rPos );
2117*cdf0e10cSrcweir 		SetEntryPredecessor( pEntry, pPrev );
2118*cdf0e10cSrcweir 		aAutoArrangeTimer.Start();
2119*cdf0e10cSrcweir 	}
2120*cdf0e10cSrcweir 	ShowCursor( sal_True );
2121*cdf0e10cSrcweir }
2122*cdf0e10cSrcweir 
2123*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetNoSelection()
2124*cdf0e10cSrcweir {
2125*cdf0e10cSrcweir 	// rekursive Aufrufe ueber SelectEntry abblocken
2126*cdf0e10cSrcweir 	if( !(nFlags & F_CLEARING_SELECTION ))
2127*cdf0e10cSrcweir 	{
2128*cdf0e10cSrcweir 		nFlags |= F_CLEARING_SELECTION;
2129*cdf0e10cSrcweir 		DeselectAllBut( 0, sal_True );
2130*cdf0e10cSrcweir 		nFlags &= ~F_CLEARING_SELECTION;
2131*cdf0e10cSrcweir 	}
2132*cdf0e10cSrcweir }
2133*cdf0e10cSrcweir 
2134*cdf0e10cSrcweir SvxIconChoiceCtrlEntry* SvxIconChoiceCtrl_Impl::GetEntry( const Point& rDocPos, sal_Bool bHit )
2135*cdf0e10cSrcweir {
2136*cdf0e10cSrcweir 	CheckBoundingRects();
2137*cdf0e10cSrcweir 	// Z-Order-Liste vom Ende her absuchen
2138*cdf0e10cSrcweir 	sal_uLong nCount = pZOrderList->Count();
2139*cdf0e10cSrcweir 	while( nCount )
2140*cdf0e10cSrcweir 	{
2141*cdf0e10cSrcweir 		nCount--;
2142*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)(pZOrderList->GetObject(nCount));
2143*cdf0e10cSrcweir 		if( pEntry->aRect.IsInside( rDocPos ) )
2144*cdf0e10cSrcweir 		{
2145*cdf0e10cSrcweir 			if( bHit )
2146*cdf0e10cSrcweir 			{
2147*cdf0e10cSrcweir 				Rectangle aRect = CalcBmpRect( pEntry );
2148*cdf0e10cSrcweir 				aRect.Top() -= 3;
2149*cdf0e10cSrcweir 				aRect.Bottom() += 3;
2150*cdf0e10cSrcweir 				aRect.Left() -= 3;
2151*cdf0e10cSrcweir 				aRect.Right() += 3;
2152*cdf0e10cSrcweir 				if( aRect.IsInside( rDocPos ) )
2153*cdf0e10cSrcweir 					return pEntry;
2154*cdf0e10cSrcweir 				aRect = CalcTextRect( pEntry );
2155*cdf0e10cSrcweir 				if( aRect.IsInside( rDocPos ) )
2156*cdf0e10cSrcweir 					return pEntry;
2157*cdf0e10cSrcweir 			}
2158*cdf0e10cSrcweir 			else
2159*cdf0e10cSrcweir 				return pEntry;
2160*cdf0e10cSrcweir 		}
2161*cdf0e10cSrcweir 	}
2162*cdf0e10cSrcweir 	return 0;
2163*cdf0e10cSrcweir }
2164*cdf0e10cSrcweir 
2165*cdf0e10cSrcweir SvxIconChoiceCtrlEntry* SvxIconChoiceCtrl_Impl::GetNextEntry( const Point& rDocPos, SvxIconChoiceCtrlEntry* pCurEntry )
2166*cdf0e10cSrcweir {
2167*cdf0e10cSrcweir 	CheckBoundingRects();
2168*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pTarget = 0;
2169*cdf0e10cSrcweir 	const sal_uLong nStartPos = pZOrderList->GetPos( (void*)pCurEntry );
2170*cdf0e10cSrcweir 	if( nStartPos != LIST_ENTRY_NOTFOUND )
2171*cdf0e10cSrcweir 	{
2172*cdf0e10cSrcweir 		const sal_uLong nCount = pZOrderList->Count();
2173*cdf0e10cSrcweir 		for( sal_uLong nCur = nStartPos+1; nCur < nCount; nCur++ )
2174*cdf0e10cSrcweir 		{
2175*cdf0e10cSrcweir 			SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)(pZOrderList->GetObject(nCur));
2176*cdf0e10cSrcweir 			if( pEntry->aRect.IsInside( rDocPos ) )
2177*cdf0e10cSrcweir 			{
2178*cdf0e10cSrcweir 				pTarget = pEntry;
2179*cdf0e10cSrcweir 				break;
2180*cdf0e10cSrcweir 			}
2181*cdf0e10cSrcweir 		}
2182*cdf0e10cSrcweir 	}
2183*cdf0e10cSrcweir 	return pTarget;
2184*cdf0e10cSrcweir }
2185*cdf0e10cSrcweir 
2186*cdf0e10cSrcweir SvxIconChoiceCtrlEntry* SvxIconChoiceCtrl_Impl::GetPrevEntry( const Point& rDocPos, SvxIconChoiceCtrlEntry* pCurEntry )
2187*cdf0e10cSrcweir {
2188*cdf0e10cSrcweir 	CheckBoundingRects();
2189*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pTarget = 0;
2190*cdf0e10cSrcweir 	sal_uLong nStartPos = pZOrderList->GetPos( (void*)pCurEntry );
2191*cdf0e10cSrcweir 	if( nStartPos != LIST_ENTRY_NOTFOUND && nStartPos != 0 )
2192*cdf0e10cSrcweir 	{
2193*cdf0e10cSrcweir 		nStartPos--;
2194*cdf0e10cSrcweir 		do
2195*cdf0e10cSrcweir 		{
2196*cdf0e10cSrcweir 			SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)(pZOrderList->GetObject(nStartPos));
2197*cdf0e10cSrcweir 			if( pEntry->aRect.IsInside( rDocPos ) )
2198*cdf0e10cSrcweir 			{
2199*cdf0e10cSrcweir 				pTarget = pEntry;
2200*cdf0e10cSrcweir 				break;
2201*cdf0e10cSrcweir 			}
2202*cdf0e10cSrcweir 		} while( nStartPos > 0 );
2203*cdf0e10cSrcweir 	}
2204*cdf0e10cSrcweir 	return pTarget;
2205*cdf0e10cSrcweir }
2206*cdf0e10cSrcweir 
2207*cdf0e10cSrcweir Point SvxIconChoiceCtrl_Impl::GetEntryPos( SvxIconChoiceCtrlEntry* pEntry )
2208*cdf0e10cSrcweir {
2209*cdf0e10cSrcweir 	return pEntry->aRect.TopLeft();
2210*cdf0e10cSrcweir }
2211*cdf0e10cSrcweir 
2212*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::MakeEntryVisible( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bBound )
2213*cdf0e10cSrcweir {
2214*cdf0e10cSrcweir 	if ( bBound )
2215*cdf0e10cSrcweir 	{
2216*cdf0e10cSrcweir 		const Rectangle& rRect = GetEntryBoundRect( pEntry );
2217*cdf0e10cSrcweir 		MakeVisible( rRect );
2218*cdf0e10cSrcweir 	}
2219*cdf0e10cSrcweir 	else
2220*cdf0e10cSrcweir 	{
2221*cdf0e10cSrcweir 		Rectangle aRect = CalcBmpRect( pEntry );
2222*cdf0e10cSrcweir 		aRect.Union( CalcTextRect( pEntry ) );
2223*cdf0e10cSrcweir 		aRect.Top() += TBOFFS_BOUND;
2224*cdf0e10cSrcweir 		aRect.Bottom() += TBOFFS_BOUND;
2225*cdf0e10cSrcweir 		aRect.Left() += LROFFS_BOUND;
2226*cdf0e10cSrcweir 		aRect.Right() += LROFFS_BOUND;
2227*cdf0e10cSrcweir 		MakeVisible( aRect );
2228*cdf0e10cSrcweir 	}
2229*cdf0e10cSrcweir }
2230*cdf0e10cSrcweir 
2231*cdf0e10cSrcweir const Rectangle& SvxIconChoiceCtrl_Impl::GetEntryBoundRect( SvxIconChoiceCtrlEntry* pEntry )
2232*cdf0e10cSrcweir {
2233*cdf0e10cSrcweir 	if( !IsBoundingRectValid( pEntry->aRect ))
2234*cdf0e10cSrcweir 		FindBoundingRect( pEntry );
2235*cdf0e10cSrcweir 	return pEntry->aRect;
2236*cdf0e10cSrcweir }
2237*cdf0e10cSrcweir 
2238*cdf0e10cSrcweir Rectangle SvxIconChoiceCtrl_Impl::CalcBmpRect( SvxIconChoiceCtrlEntry* pEntry, const Point* pPos )
2239*cdf0e10cSrcweir {
2240*cdf0e10cSrcweir 	Rectangle aBound = GetEntryBoundRect( pEntry );
2241*cdf0e10cSrcweir 	if( pPos )
2242*cdf0e10cSrcweir 		aBound.SetPos( *pPos );
2243*cdf0e10cSrcweir 	Point aPos( aBound.TopLeft() );
2244*cdf0e10cSrcweir 
2245*cdf0e10cSrcweir 	switch( nWinBits & (VIEWMODE_MASK) )
2246*cdf0e10cSrcweir 	{
2247*cdf0e10cSrcweir 		case WB_ICON:
2248*cdf0e10cSrcweir 		{
2249*cdf0e10cSrcweir 			aPos.X() += ( aBound.GetWidth() - aImageSize.Width() ) / 2;
2250*cdf0e10cSrcweir 			return Rectangle( aPos, aImageSize );
2251*cdf0e10cSrcweir 		}
2252*cdf0e10cSrcweir 
2253*cdf0e10cSrcweir 		case WB_SMALLICON:
2254*cdf0e10cSrcweir 		case WB_DETAILS:
2255*cdf0e10cSrcweir 			aPos.Y() += ( aBound.GetHeight() - aImageSize.Height() ) / 2;
2256*cdf0e10cSrcweir 			//todo: hor. Abstand zum BoundRect?
2257*cdf0e10cSrcweir 			return Rectangle( aPos, aImageSize );
2258*cdf0e10cSrcweir 
2259*cdf0e10cSrcweir 		default:
2260*cdf0e10cSrcweir 			DBG_ERROR("IconView: Viewmode not set");
2261*cdf0e10cSrcweir 			return aBound;
2262*cdf0e10cSrcweir 	}
2263*cdf0e10cSrcweir }
2264*cdf0e10cSrcweir 
2265*cdf0e10cSrcweir Rectangle SvxIconChoiceCtrl_Impl::CalcTextRect( SvxIconChoiceCtrlEntry* pEntry,
2266*cdf0e10cSrcweir 	const Point* pEntryPos, sal_Bool bEdit, const String* pStr )
2267*cdf0e10cSrcweir {
2268*cdf0e10cSrcweir 	String aEntryText;
2269*cdf0e10cSrcweir 	if( !pStr )
2270*cdf0e10cSrcweir 		aEntryText = pView->GetEntryText( pEntry, bEdit );
2271*cdf0e10cSrcweir 	else
2272*cdf0e10cSrcweir 		aEntryText = *pStr;
2273*cdf0e10cSrcweir 
2274*cdf0e10cSrcweir 	const Rectangle aMaxTextRect( CalcMaxTextRect( pEntry ) );
2275*cdf0e10cSrcweir 	Rectangle aBound( GetEntryBoundRect( pEntry ) );
2276*cdf0e10cSrcweir 	if( pEntryPos )
2277*cdf0e10cSrcweir 		aBound.SetPos( *pEntryPos );
2278*cdf0e10cSrcweir 
2279*cdf0e10cSrcweir 	Rectangle aTextRect( aMaxTextRect );
2280*cdf0e10cSrcweir 	if( !bEdit )
2281*cdf0e10cSrcweir 		aTextRect = pView->GetTextRect( aTextRect, aEntryText, nCurTextDrawFlags );
2282*cdf0e10cSrcweir 
2283*cdf0e10cSrcweir 	Size aTextSize( aTextRect.GetSize() );
2284*cdf0e10cSrcweir 
2285*cdf0e10cSrcweir 	Point aPos( aBound.TopLeft() );
2286*cdf0e10cSrcweir 	long nBoundWidth = aBound.GetWidth();
2287*cdf0e10cSrcweir 	long nBoundHeight = aBound.GetHeight();
2288*cdf0e10cSrcweir 
2289*cdf0e10cSrcweir 	switch( nWinBits & (VIEWMODE_MASK) )
2290*cdf0e10cSrcweir 	{
2291*cdf0e10cSrcweir 		case WB_ICON:
2292*cdf0e10cSrcweir 			aPos.Y() += aImageSize.Height();
2293*cdf0e10cSrcweir 			aPos.Y() += VER_DIST_BMP_STRING;
2294*cdf0e10cSrcweir 			// beim Editieren etwas mehr Platz
2295*cdf0e10cSrcweir 			if( bEdit )
2296*cdf0e10cSrcweir 			{
2297*cdf0e10cSrcweir 				// 20% rauf
2298*cdf0e10cSrcweir 				long nMinWidth = (( (aImageSize.Width()*10) / 100 ) * 2 ) +
2299*cdf0e10cSrcweir 								 aImageSize.Width();
2300*cdf0e10cSrcweir 				if( nMinWidth > nBoundWidth )
2301*cdf0e10cSrcweir 					nMinWidth = nBoundWidth;
2302*cdf0e10cSrcweir 
2303*cdf0e10cSrcweir 				if( aTextSize.Width() < nMinWidth )
2304*cdf0e10cSrcweir 					aTextSize.Width() = nMinWidth;
2305*cdf0e10cSrcweir 
2306*cdf0e10cSrcweir 				// beim Editieren ist Ueberlappung nach unten erlaubt
2307*cdf0e10cSrcweir 				Size aOptSize = aMaxTextRect.GetSize();
2308*cdf0e10cSrcweir 				if( aOptSize.Height() > aTextSize.Height() )
2309*cdf0e10cSrcweir 					aTextSize.Height() = aOptSize.Height();
2310*cdf0e10cSrcweir 			}
2311*cdf0e10cSrcweir 			aPos.X() += (nBoundWidth - aTextSize.Width()) / 2;
2312*cdf0e10cSrcweir 			break;
2313*cdf0e10cSrcweir 
2314*cdf0e10cSrcweir 		case WB_SMALLICON:
2315*cdf0e10cSrcweir 		case WB_DETAILS:
2316*cdf0e10cSrcweir 			aPos.X() += aImageSize.Width();
2317*cdf0e10cSrcweir 			aPos.X() += HOR_DIST_BMP_STRING;
2318*cdf0e10cSrcweir 			aPos.Y() += (nBoundHeight - aTextSize.Height()) / 2;
2319*cdf0e10cSrcweir 			break;
2320*cdf0e10cSrcweir 	}
2321*cdf0e10cSrcweir 	return Rectangle( aPos, aTextSize );
2322*cdf0e10cSrcweir }
2323*cdf0e10cSrcweir 
2324*cdf0e10cSrcweir 
2325*cdf0e10cSrcweir long SvxIconChoiceCtrl_Impl::CalcBoundingWidth( SvxIconChoiceCtrlEntry* pEntry ) const
2326*cdf0e10cSrcweir {
2327*cdf0e10cSrcweir 	long nStringWidth = GetItemSize( pEntry, IcnViewFieldTypeText ).Width();
2328*cdf0e10cSrcweir //	nStringWidth += 2*LROFFS_TEXT;
2329*cdf0e10cSrcweir 	long nWidth = 0;
2330*cdf0e10cSrcweir 
2331*cdf0e10cSrcweir 	switch( nWinBits & (VIEWMODE_MASK) )
2332*cdf0e10cSrcweir 	{
2333*cdf0e10cSrcweir 		case WB_ICON:
2334*cdf0e10cSrcweir 			nWidth = Max( nStringWidth, aImageSize.Width() );
2335*cdf0e10cSrcweir 			break;
2336*cdf0e10cSrcweir 
2337*cdf0e10cSrcweir 		case WB_SMALLICON:
2338*cdf0e10cSrcweir 		case WB_DETAILS:
2339*cdf0e10cSrcweir 			nWidth = aImageSize.Width();
2340*cdf0e10cSrcweir 			nWidth += HOR_DIST_BMP_STRING;
2341*cdf0e10cSrcweir 			nWidth += nStringWidth;
2342*cdf0e10cSrcweir 			break;
2343*cdf0e10cSrcweir 	}
2344*cdf0e10cSrcweir 	return nWidth;
2345*cdf0e10cSrcweir }
2346*cdf0e10cSrcweir 
2347*cdf0e10cSrcweir long SvxIconChoiceCtrl_Impl::CalcBoundingHeight( SvxIconChoiceCtrlEntry* pEntry ) const
2348*cdf0e10cSrcweir {
2349*cdf0e10cSrcweir 	long nStringHeight = GetItemSize( pEntry, IcnViewFieldTypeText).Height();
2350*cdf0e10cSrcweir 	long nHeight = 0;
2351*cdf0e10cSrcweir 
2352*cdf0e10cSrcweir 	switch( nWinBits & (VIEWMODE_MASK) )
2353*cdf0e10cSrcweir 	{
2354*cdf0e10cSrcweir 		case WB_ICON:
2355*cdf0e10cSrcweir 			nHeight = aImageSize.Height();
2356*cdf0e10cSrcweir 			nHeight += VER_DIST_BMP_STRING;
2357*cdf0e10cSrcweir 			nHeight += nStringHeight;
2358*cdf0e10cSrcweir 			break;
2359*cdf0e10cSrcweir 
2360*cdf0e10cSrcweir 		case WB_SMALLICON:
2361*cdf0e10cSrcweir 		case WB_DETAILS:
2362*cdf0e10cSrcweir 			nHeight = Max( aImageSize.Height(), nStringHeight );
2363*cdf0e10cSrcweir 			break;
2364*cdf0e10cSrcweir 	}
2365*cdf0e10cSrcweir 	if( nHeight > nMaxBoundHeight )
2366*cdf0e10cSrcweir 	{
2367*cdf0e10cSrcweir 		((SvxIconChoiceCtrl_Impl*)this)->nMaxBoundHeight = nHeight;
2368*cdf0e10cSrcweir 		((SvxIconChoiceCtrl_Impl*)this)->aHorSBar.SetLineSize( GetScrollBarLineSize() );
2369*cdf0e10cSrcweir 		((SvxIconChoiceCtrl_Impl*)this)->aVerSBar.SetLineSize( GetScrollBarLineSize() );
2370*cdf0e10cSrcweir 	}
2371*cdf0e10cSrcweir 	return nHeight;
2372*cdf0e10cSrcweir }
2373*cdf0e10cSrcweir 
2374*cdf0e10cSrcweir Size SvxIconChoiceCtrl_Impl::CalcBoundingSize( SvxIconChoiceCtrlEntry* pEntry ) const
2375*cdf0e10cSrcweir {
2376*cdf0e10cSrcweir 	return Size( CalcBoundingWidth( pEntry ),
2377*cdf0e10cSrcweir 				 CalcBoundingHeight( pEntry ) );
2378*cdf0e10cSrcweir }
2379*cdf0e10cSrcweir 
2380*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::RecalcAllBoundingRects()
2381*cdf0e10cSrcweir {
2382*cdf0e10cSrcweir 	nMaxBoundHeight	= 0;
2383*cdf0e10cSrcweir 	pZOrderList->Clear();
2384*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
2385*cdf0e10cSrcweir 	sal_uLong nCur;
2386*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pEntry;
2387*cdf0e10cSrcweir 
2388*cdf0e10cSrcweir 	if( !IsAutoArrange() || !pHead )
2389*cdf0e10cSrcweir 	{
2390*cdf0e10cSrcweir 		for( nCur = 0; nCur < nCount; nCur++ )
2391*cdf0e10cSrcweir 		{
2392*cdf0e10cSrcweir 			pEntry = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nCur );
2393*cdf0e10cSrcweir 			FindBoundingRect( pEntry );
2394*cdf0e10cSrcweir 			pZOrderList->Insert( pEntry, LIST_APPEND );
2395*cdf0e10cSrcweir 		}
2396*cdf0e10cSrcweir 	}
2397*cdf0e10cSrcweir 	else
2398*cdf0e10cSrcweir 	{
2399*cdf0e10cSrcweir 		nCur = 0;
2400*cdf0e10cSrcweir 		pEntry = pHead;
2401*cdf0e10cSrcweir 		while( nCur != nCount )
2402*cdf0e10cSrcweir 		{
2403*cdf0e10cSrcweir 			DBG_ASSERT(pEntry->pflink&&pEntry->pblink,"SvxIconChoiceCtrl_Impl::RecalcAllBoundingRect > Bad link(s)");
2404*cdf0e10cSrcweir 			FindBoundingRect( pEntry );
2405*cdf0e10cSrcweir 			pZOrderList->Insert( pEntry, pZOrderList->Count() );
2406*cdf0e10cSrcweir 			pEntry = pEntry->pflink;
2407*cdf0e10cSrcweir 			nCur++;
2408*cdf0e10cSrcweir 		}
2409*cdf0e10cSrcweir 	}
2410*cdf0e10cSrcweir 	bBoundRectsDirty = sal_False;
2411*cdf0e10cSrcweir 	AdjustScrollBars();
2412*cdf0e10cSrcweir }
2413*cdf0e10cSrcweir 
2414*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::RecalcAllBoundingRectsSmart()
2415*cdf0e10cSrcweir {
2416*cdf0e10cSrcweir 	nMaxBoundHeight	= 0;
2417*cdf0e10cSrcweir 	pZOrderList->Clear();
2418*cdf0e10cSrcweir 	sal_uLong nCur;
2419*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pEntry;
2420*cdf0e10cSrcweir 	const sal_uLong nCount = aEntries.Count();
2421*cdf0e10cSrcweir 
2422*cdf0e10cSrcweir 	if( !IsAutoArrange() || !pHead )
2423*cdf0e10cSrcweir 	{
2424*cdf0e10cSrcweir 		for( nCur = 0; nCur < nCount; nCur++ )
2425*cdf0e10cSrcweir 		{
2426*cdf0e10cSrcweir 			pEntry = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nCur );
2427*cdf0e10cSrcweir 			if( IsBoundingRectValid( pEntry->aRect ))
2428*cdf0e10cSrcweir 			{
2429*cdf0e10cSrcweir 				Size aBoundSize( pEntry->aRect.GetSize() );
2430*cdf0e10cSrcweir 				if( aBoundSize.Height() > nMaxBoundHeight )
2431*cdf0e10cSrcweir 					nMaxBoundHeight = aBoundSize.Height();
2432*cdf0e10cSrcweir 			}
2433*cdf0e10cSrcweir 			else
2434*cdf0e10cSrcweir 				FindBoundingRect( pEntry );
2435*cdf0e10cSrcweir 			pZOrderList->Insert( pEntry, LIST_APPEND );
2436*cdf0e10cSrcweir 		}
2437*cdf0e10cSrcweir 	}
2438*cdf0e10cSrcweir 	else
2439*cdf0e10cSrcweir 	{
2440*cdf0e10cSrcweir 		nCur = 0;
2441*cdf0e10cSrcweir 		pEntry = pHead;
2442*cdf0e10cSrcweir 		while( nCur != nCount )
2443*cdf0e10cSrcweir 		{
2444*cdf0e10cSrcweir 			DBG_ASSERT(pEntry->pflink&&pEntry->pblink,"SvxIconChoiceCtrl_Impl::RecalcAllBoundingRect > Bad link(s)");
2445*cdf0e10cSrcweir 			if( IsBoundingRectValid( pEntry->aRect ))
2446*cdf0e10cSrcweir 			{
2447*cdf0e10cSrcweir 				Size aBoundSize( pEntry->aRect.GetSize() );
2448*cdf0e10cSrcweir 				if( aBoundSize.Height() > nMaxBoundHeight )
2449*cdf0e10cSrcweir 					nMaxBoundHeight = aBoundSize.Height();
2450*cdf0e10cSrcweir 			}
2451*cdf0e10cSrcweir 			else
2452*cdf0e10cSrcweir 				FindBoundingRect( pEntry );
2453*cdf0e10cSrcweir 			pZOrderList->Insert( pEntry, LIST_APPEND );
2454*cdf0e10cSrcweir 			pEntry = pEntry->pflink;
2455*cdf0e10cSrcweir 			nCur++;
2456*cdf0e10cSrcweir 		}
2457*cdf0e10cSrcweir 	}
2458*cdf0e10cSrcweir 	AdjustScrollBars();
2459*cdf0e10cSrcweir }
2460*cdf0e10cSrcweir 
2461*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::UpdateBoundingRects()
2462*cdf0e10cSrcweir {
2463*cdf0e10cSrcweir 	const sal_uLong nCount = aEntries.Count();
2464*cdf0e10cSrcweir 	for( sal_uLong nCur = 0; nCur < nCount; nCur++ )
2465*cdf0e10cSrcweir 	{
2466*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nCur );
2467*cdf0e10cSrcweir 		GetEntryBoundRect( pEntry );
2468*cdf0e10cSrcweir 	}
2469*cdf0e10cSrcweir }
2470*cdf0e10cSrcweir 
2471*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::FindBoundingRect( SvxIconChoiceCtrlEntry* pEntry )
2472*cdf0e10cSrcweir {
2473*cdf0e10cSrcweir 	DBG_ASSERT(!pEntry->IsPosLocked(),"Locked entry pos in FindBoundingRect");
2474*cdf0e10cSrcweir 	if( pEntry->IsPosLocked() && IsBoundingRectValid( pEntry->aRect) )
2475*cdf0e10cSrcweir 	{
2476*cdf0e10cSrcweir 		AdjustVirtSize( pEntry->aRect );
2477*cdf0e10cSrcweir 		return;
2478*cdf0e10cSrcweir 	}
2479*cdf0e10cSrcweir 	Size aSize( CalcBoundingSize( pEntry ) );
2480*cdf0e10cSrcweir 	Point aPos(pGridMap->GetGridRect(pGridMap->GetUnoccupiedGrid(sal_True)).TopLeft());
2481*cdf0e10cSrcweir 	SetBoundingRect_Impl( pEntry, aPos, aSize );
2482*cdf0e10cSrcweir }
2483*cdf0e10cSrcweir 
2484*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetBoundingRect_Impl( SvxIconChoiceCtrlEntry* pEntry, const Point& rPos,
2485*cdf0e10cSrcweir 	const Size& /*rBoundingSize*/ )
2486*cdf0e10cSrcweir {
2487*cdf0e10cSrcweir 	Rectangle aGridRect( rPos, Size(nGridDX, nGridDY) );
2488*cdf0e10cSrcweir 	pEntry->aGridRect = aGridRect;
2489*cdf0e10cSrcweir 	Center( pEntry );
2490*cdf0e10cSrcweir 	AdjustVirtSize( pEntry->aRect );
2491*cdf0e10cSrcweir 	pGridMap->OccupyGrids( pEntry );
2492*cdf0e10cSrcweir }
2493*cdf0e10cSrcweir 
2494*cdf0e10cSrcweir 
2495*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetCursor( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bSyncSingleSelection,
2496*cdf0e10cSrcweir 	sal_Bool bShowFocusAsync )
2497*cdf0e10cSrcweir {
2498*cdf0e10cSrcweir 	if( pEntry == pCursor )
2499*cdf0e10cSrcweir 	{
2500*cdf0e10cSrcweir 		if( pCursor && eSelectionMode == SINGLE_SELECTION && bSyncSingleSelection &&
2501*cdf0e10cSrcweir 				!pCursor->IsSelected() )
2502*cdf0e10cSrcweir 			SelectEntry( pCursor, sal_True, sal_True );
2503*cdf0e10cSrcweir 		return;
2504*cdf0e10cSrcweir 	}
2505*cdf0e10cSrcweir 	ShowCursor( sal_False );
2506*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pOldCursor = pCursor;
2507*cdf0e10cSrcweir 	pCursor = pEntry;
2508*cdf0e10cSrcweir 	if( pOldCursor )
2509*cdf0e10cSrcweir 	{
2510*cdf0e10cSrcweir 		pOldCursor->ClearFlags( ICNVIEW_FLAG_FOCUSED );
2511*cdf0e10cSrcweir 		if( eSelectionMode == SINGLE_SELECTION && bSyncSingleSelection )
2512*cdf0e10cSrcweir 			SelectEntry( pOldCursor, sal_False, sal_True ); // alten Cursor deselektieren
2513*cdf0e10cSrcweir 	}
2514*cdf0e10cSrcweir 	if( pCursor )
2515*cdf0e10cSrcweir 	{
2516*cdf0e10cSrcweir 		ToTop( pCursor );
2517*cdf0e10cSrcweir 		pCursor->SetFlags( ICNVIEW_FLAG_FOCUSED );
2518*cdf0e10cSrcweir 		if( eSelectionMode == SINGLE_SELECTION && bSyncSingleSelection )
2519*cdf0e10cSrcweir 			SelectEntry( pCursor, sal_True, sal_True );
2520*cdf0e10cSrcweir 		if( !bShowFocusAsync )
2521*cdf0e10cSrcweir 			ShowCursor( sal_True );
2522*cdf0e10cSrcweir 		else
2523*cdf0e10cSrcweir 		{
2524*cdf0e10cSrcweir 			if( !nUserEventShowCursor )
2525*cdf0e10cSrcweir 				nUserEventShowCursor =
2526*cdf0e10cSrcweir 					Application::PostUserEvent( LINK( this, SvxIconChoiceCtrl_Impl, UserEventHdl),
2527*cdf0e10cSrcweir 						EVENTID_SHOW_CURSOR );
2528*cdf0e10cSrcweir 		}
2529*cdf0e10cSrcweir 	}
2530*cdf0e10cSrcweir }
2531*cdf0e10cSrcweir 
2532*cdf0e10cSrcweir 
2533*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::ShowCursor( sal_Bool bShow )
2534*cdf0e10cSrcweir {
2535*cdf0e10cSrcweir 	if( !pCursor || !bShow || !pView->HasFocus() )
2536*cdf0e10cSrcweir 	{
2537*cdf0e10cSrcweir 		pView->HideFocus();
2538*cdf0e10cSrcweir 		return;
2539*cdf0e10cSrcweir 	}
2540*cdf0e10cSrcweir 	Rectangle aRect ( CalcFocusRect( pCursor ) );
2541*cdf0e10cSrcweir 	/*pView->*/ShowFocus( aRect );
2542*cdf0e10cSrcweir }
2543*cdf0e10cSrcweir 
2544*cdf0e10cSrcweir 
2545*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::HideDDIcon()
2546*cdf0e10cSrcweir {
2547*cdf0e10cSrcweir 	pView->Update();
2548*cdf0e10cSrcweir 	ImpHideDDIcon();
2549*cdf0e10cSrcweir 	pDDBufDev = pDDDev;
2550*cdf0e10cSrcweir 	pDDDev = 0;
2551*cdf0e10cSrcweir }
2552*cdf0e10cSrcweir 
2553*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::ImpHideDDIcon()
2554*cdf0e10cSrcweir {
2555*cdf0e10cSrcweir 	if( pDDDev )
2556*cdf0e10cSrcweir 	{
2557*cdf0e10cSrcweir 		Size aSize( pDDDev->GetOutputSizePixel() );
2558*cdf0e10cSrcweir 		// pView restaurieren
2559*cdf0e10cSrcweir 		pView->DrawOutDev( aDDLastRectPos, aSize, Point(), aSize, *pDDDev );
2560*cdf0e10cSrcweir 	}
2561*cdf0e10cSrcweir }
2562*cdf0e10cSrcweir 
2563*cdf0e10cSrcweir 
2564*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::ShowDDIcon( SvxIconChoiceCtrlEntry* pRefEntry, const Point& rPosPix )
2565*cdf0e10cSrcweir {
2566*cdf0e10cSrcweir 	pView->Update();
2567*cdf0e10cSrcweir 	if( pRefEntry != pDDRefEntry )
2568*cdf0e10cSrcweir 	{
2569*cdf0e10cSrcweir 		DELETEZ(pDDDev);
2570*cdf0e10cSrcweir 		DELETEZ(pDDBufDev);
2571*cdf0e10cSrcweir 	}
2572*cdf0e10cSrcweir 	sal_Bool bSelected = pRefEntry->IsSelected();
2573*cdf0e10cSrcweir 	pRefEntry->ClearFlags( ICNVIEW_FLAG_SELECTED );
2574*cdf0e10cSrcweir 	if( !pDDDev )
2575*cdf0e10cSrcweir 	{
2576*cdf0e10cSrcweir 		if( pDDBufDev )
2577*cdf0e10cSrcweir 		{
2578*cdf0e10cSrcweir 			// nicht bei jedem Move ein Device anlegen, da dies besonders
2579*cdf0e10cSrcweir 			// auf Remote-Clients zu langsam ist
2580*cdf0e10cSrcweir 			pDDDev = pDDBufDev;
2581*cdf0e10cSrcweir 			pDDBufDev = 0;
2582*cdf0e10cSrcweir 		}
2583*cdf0e10cSrcweir 		else
2584*cdf0e10cSrcweir 		{
2585*cdf0e10cSrcweir 			pDDDev = new VirtualDevice( *pView );
2586*cdf0e10cSrcweir 			pDDDev->SetFont( pView->GetFont() );
2587*cdf0e10cSrcweir 		}
2588*cdf0e10cSrcweir 	}
2589*cdf0e10cSrcweir 	else
2590*cdf0e10cSrcweir 	{
2591*cdf0e10cSrcweir 		ImpHideDDIcon();
2592*cdf0e10cSrcweir 	}
2593*cdf0e10cSrcweir 	const Rectangle& rRect = GetEntryBoundRect( pRefEntry );
2594*cdf0e10cSrcweir 	pDDDev->SetOutputSizePixel( rRect.GetSize() );
2595*cdf0e10cSrcweir 
2596*cdf0e10cSrcweir 	Point aPos( rPosPix );
2597*cdf0e10cSrcweir 	ToDocPos( aPos );
2598*cdf0e10cSrcweir 
2599*cdf0e10cSrcweir 	Size aSize( pDDDev->GetOutputSizePixel() );
2600*cdf0e10cSrcweir 	pDDRefEntry = pRefEntry;
2601*cdf0e10cSrcweir 	aDDLastEntryPos = aPos;
2602*cdf0e10cSrcweir 	aDDLastRectPos = aPos;
2603*cdf0e10cSrcweir 
2604*cdf0e10cSrcweir 	// Hintergrund sichern
2605*cdf0e10cSrcweir 	pDDDev->DrawOutDev( Point(), aSize, aPos, aSize, *pView );
2606*cdf0e10cSrcweir 	// Icon in pView malen
2607*cdf0e10cSrcweir 	pRefEntry->SetFlags( ICNVIEW_FLAG_BLOCK_EMPHASIS );
2608*cdf0e10cSrcweir 	PaintEntry( pRefEntry, aPos );
2609*cdf0e10cSrcweir 	pRefEntry->ClearFlags( ICNVIEW_FLAG_BLOCK_EMPHASIS );
2610*cdf0e10cSrcweir 	if( bSelected )
2611*cdf0e10cSrcweir 		pRefEntry->SetFlags( ICNVIEW_FLAG_SELECTED );
2612*cdf0e10cSrcweir }
2613*cdf0e10cSrcweir 
2614*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::HideShowDDIcon( SvxIconChoiceCtrlEntry* pRefEntry, const Point& rPosPix )
2615*cdf0e10cSrcweir {
2616*cdf0e10cSrcweir /*  In Notfaellen folgenden flackernden Code aktivieren:
2617*cdf0e10cSrcweir 
2618*cdf0e10cSrcweir 		HideDDIcon();
2619*cdf0e10cSrcweir 		ShowDDIcon( pRefEntry, rPosPix );
2620*cdf0e10cSrcweir 		return;
2621*cdf0e10cSrcweir */
2622*cdf0e10cSrcweir 	if( !pDDDev )
2623*cdf0e10cSrcweir 	{
2624*cdf0e10cSrcweir 		ShowDDIcon( pRefEntry, rPosPix );
2625*cdf0e10cSrcweir 		return;
2626*cdf0e10cSrcweir 	}
2627*cdf0e10cSrcweir 
2628*cdf0e10cSrcweir 	if( pRefEntry != pDDRefEntry )
2629*cdf0e10cSrcweir 	{
2630*cdf0e10cSrcweir 		HideDDIcon();
2631*cdf0e10cSrcweir 		ShowDDIcon( pRefEntry, rPosPix );
2632*cdf0e10cSrcweir 		return;
2633*cdf0e10cSrcweir 	}
2634*cdf0e10cSrcweir 
2635*cdf0e10cSrcweir 	Point aEmptyPoint;
2636*cdf0e10cSrcweir 
2637*cdf0e10cSrcweir 	Point aCurEntryPos( rPosPix );
2638*cdf0e10cSrcweir 	ToDocPos( aCurEntryPos );
2639*cdf0e10cSrcweir 
2640*cdf0e10cSrcweir 	const Rectangle& rRect = GetEntryBoundRect( pRefEntry );
2641*cdf0e10cSrcweir 	Size aEntrySize( rRect.GetSize() );
2642*cdf0e10cSrcweir 	Rectangle aPrevEntryRect( aDDLastEntryPos, aEntrySize );
2643*cdf0e10cSrcweir 	Rectangle aCurEntryRect( aCurEntryPos, aEntrySize );
2644*cdf0e10cSrcweir 
2645*cdf0e10cSrcweir 	if( !aPrevEntryRect.IsOver( aCurEntryRect ) )
2646*cdf0e10cSrcweir 	{
2647*cdf0e10cSrcweir 		HideDDIcon();
2648*cdf0e10cSrcweir 		ShowDDIcon( pRefEntry, rPosPix );
2649*cdf0e10cSrcweir 		return;
2650*cdf0e10cSrcweir 	}
2651*cdf0e10cSrcweir 
2652*cdf0e10cSrcweir 	// Ueberlappung des neuen und alten D&D-Pointers!
2653*cdf0e10cSrcweir 
2654*cdf0e10cSrcweir 	Rectangle aFullRect( aPrevEntryRect.Union( aCurEntryRect ) );
2655*cdf0e10cSrcweir 	if( !pDDTempDev )
2656*cdf0e10cSrcweir 	{
2657*cdf0e10cSrcweir 		pDDTempDev = new VirtualDevice( *pView );
2658*cdf0e10cSrcweir 		pDDTempDev->SetFont( pView->GetFont() );
2659*cdf0e10cSrcweir 	}
2660*cdf0e10cSrcweir 
2661*cdf0e10cSrcweir 	Size aFullSize( aFullRect.GetSize() );
2662*cdf0e10cSrcweir 	Point aFullPos( aFullRect.TopLeft() );
2663*cdf0e10cSrcweir 
2664*cdf0e10cSrcweir 	pDDTempDev->SetOutputSizePixel( aFullSize );
2665*cdf0e10cSrcweir 
2666*cdf0e10cSrcweir 	// Hintergrund (mit dem alten D&D-Pointer!) sichern
2667*cdf0e10cSrcweir 	pDDTempDev->DrawOutDev( aEmptyPoint, aFullSize, aFullPos, aFullSize, *pView );
2668*cdf0e10cSrcweir 	// den alten Buffer in den neuen Buffer pasten
2669*cdf0e10cSrcweir 	aDDLastRectPos = aDDLastRectPos - aFullPos;
2670*cdf0e10cSrcweir 
2671*cdf0e10cSrcweir 	pDDTempDev->DrawOutDev(
2672*cdf0e10cSrcweir 		aDDLastRectPos,
2673*cdf0e10cSrcweir 		pDDDev->GetOutputSizePixel(),
2674*cdf0e10cSrcweir 		aEmptyPoint,
2675*cdf0e10cSrcweir 		pDDDev->GetOutputSizePixel(),
2676*cdf0e10cSrcweir 		*pDDDev );
2677*cdf0e10cSrcweir 
2678*cdf0e10cSrcweir 	// Swap
2679*cdf0e10cSrcweir 	VirtualDevice* pTemp = pDDDev;
2680*cdf0e10cSrcweir 	pDDDev = pDDTempDev;
2681*cdf0e10cSrcweir 	pDDTempDev = pTemp;
2682*cdf0e10cSrcweir 
2683*cdf0e10cSrcweir 	// in den restaurierten Hintergrund den neuen D&D-Pointer zeichnen
2684*cdf0e10cSrcweir 	pDDTempDev->SetOutputSizePixel( pDDDev->GetOutputSizePixel() );
2685*cdf0e10cSrcweir 	pDDTempDev->DrawOutDev(
2686*cdf0e10cSrcweir 		aEmptyPoint, aFullSize, aEmptyPoint, aFullSize, *pDDDev );
2687*cdf0e10cSrcweir 	Point aRelPos = aCurEntryPos - aFullPos;
2688*cdf0e10cSrcweir 	pRefEntry->SetFlags( ICNVIEW_FLAG_BLOCK_EMPHASIS );
2689*cdf0e10cSrcweir 	PaintEntry( pRefEntry, aRelPos, pDDTempDev );
2690*cdf0e10cSrcweir 	pRefEntry->ClearFlags( ICNVIEW_FLAG_BLOCK_EMPHASIS );
2691*cdf0e10cSrcweir 
2692*cdf0e10cSrcweir 	aDDLastRectPos = aFullPos;
2693*cdf0e10cSrcweir 	aDDLastEntryPos = aCurEntryPos;
2694*cdf0e10cSrcweir 
2695*cdf0e10cSrcweir 	pView->DrawOutDev(
2696*cdf0e10cSrcweir 		aDDLastRectPos,
2697*cdf0e10cSrcweir 		pDDDev->GetOutputSizePixel(),
2698*cdf0e10cSrcweir 		aEmptyPoint,
2699*cdf0e10cSrcweir 		pDDDev->GetOutputSizePixel(),
2700*cdf0e10cSrcweir 		*pDDTempDev );
2701*cdf0e10cSrcweir }
2702*cdf0e10cSrcweir 
2703*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::InvalidateBoundingRect( SvxIconChoiceCtrlEntry* pEntry )
2704*cdf0e10cSrcweir {
2705*cdf0e10cSrcweir 	InvalidateBoundingRect( pEntry->aRect );
2706*cdf0e10cSrcweir }
2707*cdf0e10cSrcweir 
2708*cdf0e10cSrcweir 
2709*cdf0e10cSrcweir sal_Bool SvxIconChoiceCtrl_Impl::HandleScrollCommand( const CommandEvent& rCmd )
2710*cdf0e10cSrcweir {
2711*cdf0e10cSrcweir 	Rectangle aDocRect(	GetDocumentRect() );
2712*cdf0e10cSrcweir 	Rectangle aVisRect( GetVisibleRect() );
2713*cdf0e10cSrcweir 	if( aVisRect.IsInside( aDocRect ))
2714*cdf0e10cSrcweir 		return sal_False;
2715*cdf0e10cSrcweir 	Size aDocSize( aDocRect.GetSize() );
2716*cdf0e10cSrcweir 	Size aVisSize( aVisRect.GetSize() );
2717*cdf0e10cSrcweir 	sal_Bool bHor = aDocSize.Width() > aVisSize.Width();
2718*cdf0e10cSrcweir 	sal_Bool bVer = aDocSize.Height() > aVisSize.Height();
2719*cdf0e10cSrcweir 
2720*cdf0e10cSrcweir 	long nScrollDX = 0, nScrollDY = 0;
2721*cdf0e10cSrcweir 
2722*cdf0e10cSrcweir 	switch( rCmd.GetCommand() )
2723*cdf0e10cSrcweir 	{
2724*cdf0e10cSrcweir 		case COMMAND_STARTAUTOSCROLL:
2725*cdf0e10cSrcweir 		{
2726*cdf0e10cSrcweir 			pView->EndTracking();
2727*cdf0e10cSrcweir 			sal_uInt16 nScrollFlags = 0;
2728*cdf0e10cSrcweir 			if( bHor )
2729*cdf0e10cSrcweir 				nScrollFlags |= AUTOSCROLL_HORZ;
2730*cdf0e10cSrcweir 			if( bVer )
2731*cdf0e10cSrcweir 				nScrollFlags |= AUTOSCROLL_VERT;
2732*cdf0e10cSrcweir 			if( nScrollFlags )
2733*cdf0e10cSrcweir 			{
2734*cdf0e10cSrcweir 				pView->StartAutoScroll( nScrollFlags );
2735*cdf0e10cSrcweir 				return sal_True;
2736*cdf0e10cSrcweir 			}
2737*cdf0e10cSrcweir 		}
2738*cdf0e10cSrcweir 		break;
2739*cdf0e10cSrcweir 
2740*cdf0e10cSrcweir 		case COMMAND_WHEEL:
2741*cdf0e10cSrcweir 		{
2742*cdf0e10cSrcweir 			const CommandWheelData* pData = rCmd.GetWheelData();
2743*cdf0e10cSrcweir 			if( pData && (COMMAND_WHEEL_SCROLL == pData->GetMode()) && !pData->IsHorz() )
2744*cdf0e10cSrcweir 			{
2745*cdf0e10cSrcweir 				sal_uLong nScrollLines = pData->GetScrollLines();
2746*cdf0e10cSrcweir 				if( nScrollLines == COMMAND_WHEEL_PAGESCROLL )
2747*cdf0e10cSrcweir 				{
2748*cdf0e10cSrcweir 					nScrollDY = GetScrollBarPageSize( aVisSize.Width() );
2749*cdf0e10cSrcweir 					if( pData->GetDelta() < 0 )
2750*cdf0e10cSrcweir 						nScrollDY *= -1;
2751*cdf0e10cSrcweir 				}
2752*cdf0e10cSrcweir 				else
2753*cdf0e10cSrcweir 				{
2754*cdf0e10cSrcweir 					nScrollDY = pData->GetNotchDelta() * (long)nScrollLines;
2755*cdf0e10cSrcweir 					nScrollDY *= GetScrollBarLineSize();
2756*cdf0e10cSrcweir 				}
2757*cdf0e10cSrcweir 			}
2758*cdf0e10cSrcweir 		}
2759*cdf0e10cSrcweir 		break;
2760*cdf0e10cSrcweir 
2761*cdf0e10cSrcweir 		case COMMAND_AUTOSCROLL:
2762*cdf0e10cSrcweir 		{
2763*cdf0e10cSrcweir 			const CommandScrollData* pData = rCmd.GetAutoScrollData();
2764*cdf0e10cSrcweir 			if( pData )
2765*cdf0e10cSrcweir 			{
2766*cdf0e10cSrcweir 				nScrollDX = pData->GetDeltaX() * GetScrollBarLineSize();
2767*cdf0e10cSrcweir 				nScrollDY = pData->GetDeltaY() * GetScrollBarLineSize();
2768*cdf0e10cSrcweir 			}
2769*cdf0e10cSrcweir 		}
2770*cdf0e10cSrcweir 		break;
2771*cdf0e10cSrcweir 	}
2772*cdf0e10cSrcweir 
2773*cdf0e10cSrcweir 	if( nScrollDX || nScrollDY )
2774*cdf0e10cSrcweir 	{
2775*cdf0e10cSrcweir 		aVisRect.Top() -= nScrollDY;
2776*cdf0e10cSrcweir 		aVisRect.Bottom() -= nScrollDY;
2777*cdf0e10cSrcweir 		aVisRect.Left() -= nScrollDX;
2778*cdf0e10cSrcweir 		aVisRect.Right() -= nScrollDX;
2779*cdf0e10cSrcweir 		MakeVisible( aVisRect );
2780*cdf0e10cSrcweir 		return sal_True;
2781*cdf0e10cSrcweir 	}
2782*cdf0e10cSrcweir 	return sal_False;
2783*cdf0e10cSrcweir }
2784*cdf0e10cSrcweir 
2785*cdf0e10cSrcweir 
2786*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::Command( const CommandEvent& rCEvt )
2787*cdf0e10cSrcweir {
2788*cdf0e10cSrcweir 	// Rollmaus-Event?
2789*cdf0e10cSrcweir 	if( (rCEvt.GetCommand() == COMMAND_WHEEL) ||
2790*cdf0e10cSrcweir 		(rCEvt.GetCommand() == COMMAND_STARTAUTOSCROLL) ||
2791*cdf0e10cSrcweir 		(rCEvt.GetCommand() == COMMAND_AUTOSCROLL) )
2792*cdf0e10cSrcweir 	{
2793*cdf0e10cSrcweir #if 1
2794*cdf0e10cSrcweir 		if( HandleScrollCommand( rCEvt ) )
2795*cdf0e10cSrcweir 			return;
2796*cdf0e10cSrcweir #else
2797*cdf0e10cSrcweir 		ScrollBar* pHor = aHorSBar.IsVisible() ? &aHorSBar : 0;
2798*cdf0e10cSrcweir 		ScrollBar* pVer = aVerSBar.IsVisible() ? &aVerSBar : 0;
2799*cdf0e10cSrcweir 		if( pView->HandleScrollCommand( rCEvt, pHor, pVer ) )
2800*cdf0e10cSrcweir 			return;
2801*cdf0e10cSrcweir #endif
2802*cdf0e10cSrcweir 	}
2803*cdf0e10cSrcweir }
2804*cdf0e10cSrcweir 
2805*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::ToTop( SvxIconChoiceCtrlEntry* pEntry )
2806*cdf0e10cSrcweir {
2807*cdf0e10cSrcweir 	if( pZOrderList->GetObject( pZOrderList->Count() - 1 ) != pEntry )
2808*cdf0e10cSrcweir 	{
2809*cdf0e10cSrcweir 		sal_uLong nPos = pZOrderList->GetPos( (void*)pEntry );
2810*cdf0e10cSrcweir 		pZOrderList->Remove( nPos );
2811*cdf0e10cSrcweir 		pZOrderList->Insert( pEntry, LIST_APPEND );
2812*cdf0e10cSrcweir 	}
2813*cdf0e10cSrcweir }
2814*cdf0e10cSrcweir 
2815*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::ClipAtVirtOutRect( Rectangle& rRect ) const
2816*cdf0e10cSrcweir {
2817*cdf0e10cSrcweir 	if( rRect.Bottom() >= aVirtOutputSize.Height() )
2818*cdf0e10cSrcweir 		rRect.Bottom() = aVirtOutputSize.Height() - 1;
2819*cdf0e10cSrcweir 	if( rRect.Right() >= aVirtOutputSize.Width() )
2820*cdf0e10cSrcweir 		rRect.Right() = aVirtOutputSize.Width() - 1;
2821*cdf0e10cSrcweir 	if( rRect.Top() < 0 )
2822*cdf0e10cSrcweir 		rRect.Top() = 0;
2823*cdf0e10cSrcweir 	if( rRect.Left() < 0 )
2824*cdf0e10cSrcweir 		rRect.Left() = 0;
2825*cdf0e10cSrcweir }
2826*cdf0e10cSrcweir 
2827*cdf0e10cSrcweir // rRect: Bereich des Dokumentes (in Dokumentkoordinaten), der
2828*cdf0e10cSrcweir // sichtbar gemacht werden soll.
2829*cdf0e10cSrcweir // bScrBar == sal_True: Das Rect wurde aufgrund eines ScrollBar-Events berechnet
2830*cdf0e10cSrcweir 
2831*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::MakeVisible( const Rectangle& rRect, sal_Bool bScrBar,
2832*cdf0e10cSrcweir 	sal_Bool bCallRectChangedHdl )
2833*cdf0e10cSrcweir {
2834*cdf0e10cSrcweir 	Rectangle aVirtRect( rRect );
2835*cdf0e10cSrcweir 	ClipAtVirtOutRect( aVirtRect );
2836*cdf0e10cSrcweir 	Point aOrigin( pView->GetMapMode().GetOrigin() );
2837*cdf0e10cSrcweir 	// in Dokumentkoordinate umwandeln
2838*cdf0e10cSrcweir 	aOrigin *= -1;
2839*cdf0e10cSrcweir 	Rectangle aOutputArea( GetOutputRect() );
2840*cdf0e10cSrcweir 	if( aOutputArea.IsInside( aVirtRect ) )
2841*cdf0e10cSrcweir 		return;	// ist schon sichtbar
2842*cdf0e10cSrcweir 
2843*cdf0e10cSrcweir 	long nDy;
2844*cdf0e10cSrcweir 	if( aVirtRect.Top() < aOutputArea.Top() )
2845*cdf0e10cSrcweir 	{
2846*cdf0e10cSrcweir 		// nach oben scrollen (nDy < 0)
2847*cdf0e10cSrcweir 		nDy = aVirtRect.Top() - aOutputArea.Top();
2848*cdf0e10cSrcweir 	}
2849*cdf0e10cSrcweir 	else if( aVirtRect.Bottom() > aOutputArea.Bottom() )
2850*cdf0e10cSrcweir 	{
2851*cdf0e10cSrcweir 		// nach unten scrollen (nDy > 0)
2852*cdf0e10cSrcweir 		nDy = aVirtRect.Bottom() - aOutputArea.Bottom();
2853*cdf0e10cSrcweir 	}
2854*cdf0e10cSrcweir 	else
2855*cdf0e10cSrcweir 		nDy = 0;
2856*cdf0e10cSrcweir 
2857*cdf0e10cSrcweir 	long nDx;
2858*cdf0e10cSrcweir 	if( aVirtRect.Left() < aOutputArea.Left() )
2859*cdf0e10cSrcweir 	{
2860*cdf0e10cSrcweir 		// nach links scrollen (nDx < 0)
2861*cdf0e10cSrcweir 		nDx = aVirtRect.Left() - aOutputArea.Left();
2862*cdf0e10cSrcweir 	}
2863*cdf0e10cSrcweir 	else if( aVirtRect.Right() > aOutputArea.Right() )
2864*cdf0e10cSrcweir 	{
2865*cdf0e10cSrcweir 		// nach rechts scrollen (nDx > 0)
2866*cdf0e10cSrcweir 		nDx = aVirtRect.Right() - aOutputArea.Right();
2867*cdf0e10cSrcweir 	}
2868*cdf0e10cSrcweir 	else
2869*cdf0e10cSrcweir 		nDx = 0;
2870*cdf0e10cSrcweir 
2871*cdf0e10cSrcweir 	aOrigin.X() += nDx;
2872*cdf0e10cSrcweir 	aOrigin.Y() += nDy;
2873*cdf0e10cSrcweir 	aOutputArea.SetPos( aOrigin );
2874*cdf0e10cSrcweir 	if( GetUpdateMode() )
2875*cdf0e10cSrcweir 	{
2876*cdf0e10cSrcweir 		HideDDIcon();
2877*cdf0e10cSrcweir 		pView->Update();
2878*cdf0e10cSrcweir 		ShowCursor( sal_False );
2879*cdf0e10cSrcweir 	}
2880*cdf0e10cSrcweir 
2881*cdf0e10cSrcweir 	// Origin fuer SV invertieren (damit wir in
2882*cdf0e10cSrcweir 	// Dokumentkoordinaten scrollen/painten koennen)
2883*cdf0e10cSrcweir 	aOrigin *= -1;
2884*cdf0e10cSrcweir 	SetOrigin( aOrigin );
2885*cdf0e10cSrcweir 
2886*cdf0e10cSrcweir 	sal_Bool bScrollable = pView->GetBackground().IsScrollable();
2887*cdf0e10cSrcweir 	if( pView->HasBackground() && !bScrollable )
2888*cdf0e10cSrcweir 	{
2889*cdf0e10cSrcweir 		Rectangle aRect( GetOutputRect());
2890*cdf0e10cSrcweir 		Wallpaper aPaper( pView->GetBackground() );
2891*cdf0e10cSrcweir 		aPaper.SetRect( aRect );
2892*cdf0e10cSrcweir 		pView->SetBackground( aPaper );
2893*cdf0e10cSrcweir 	}
2894*cdf0e10cSrcweir 
2895*cdf0e10cSrcweir 	if( bScrollable && GetUpdateMode() )
2896*cdf0e10cSrcweir 	{
2897*cdf0e10cSrcweir 		// in umgekehrte Richtung scrollen!
2898*cdf0e10cSrcweir 		pView->Control::Scroll( -nDx, -nDy, aOutputArea,
2899*cdf0e10cSrcweir 			SCROLL_NOCHILDREN | SCROLL_USECLIPREGION | SCROLL_CLIP );
2900*cdf0e10cSrcweir 	}
2901*cdf0e10cSrcweir 	else
2902*cdf0e10cSrcweir 		pView->Invalidate(INVALIDATE_NOCHILDREN);
2903*cdf0e10cSrcweir 
2904*cdf0e10cSrcweir 	if( aHorSBar.IsVisible() || aVerSBar.IsVisible() )
2905*cdf0e10cSrcweir 	{
2906*cdf0e10cSrcweir 		if( !bScrBar )
2907*cdf0e10cSrcweir 		{
2908*cdf0e10cSrcweir 			aOrigin *= -1;
2909*cdf0e10cSrcweir 			// Thumbs korrigieren
2910*cdf0e10cSrcweir 			if(aHorSBar.IsVisible() && aHorSBar.GetThumbPos() != aOrigin.X())
2911*cdf0e10cSrcweir 				aHorSBar.SetThumbPos( aOrigin.X() );
2912*cdf0e10cSrcweir 			if(aVerSBar.IsVisible() && aVerSBar.GetThumbPos() != aOrigin.Y())
2913*cdf0e10cSrcweir 				aVerSBar.SetThumbPos( aOrigin.Y() );
2914*cdf0e10cSrcweir 		}
2915*cdf0e10cSrcweir 	}
2916*cdf0e10cSrcweir 
2917*cdf0e10cSrcweir 	if( GetUpdateMode() )
2918*cdf0e10cSrcweir 		ShowCursor( sal_True );
2919*cdf0e10cSrcweir 
2920*cdf0e10cSrcweir 	// pruefen, ob ScrollBars noch benoetigt werden
2921*cdf0e10cSrcweir 	CheckScrollBars();
2922*cdf0e10cSrcweir 	if( bScrollable && GetUpdateMode() )
2923*cdf0e10cSrcweir 		pView->Update();
2924*cdf0e10cSrcweir 
2925*cdf0e10cSrcweir 	// kann der angeforderte Bereich nicht komplett sichtbar gemacht werden,
2926*cdf0e10cSrcweir 	// wird auf jeden Fall der Vis-Rect-Changed-Handler gerufen. Eintreten kann der
2927*cdf0e10cSrcweir 	// Fall z.B. wenn nur wenige Pixel des unteren Randes nicht sichtbar sind,
2928*cdf0e10cSrcweir 	// eine ScrollBar aber eine groessere Line-Size eingestellt hat.
2929*cdf0e10cSrcweir 	if( bCallRectChangedHdl || GetOutputRect() != rRect )
2930*cdf0e10cSrcweir 		VisRectChanged();
2931*cdf0e10cSrcweir }
2932*cdf0e10cSrcweir 
2933*cdf0e10cSrcweir 
2934*cdf0e10cSrcweir SvxIconChoiceCtrlEntry* SvxIconChoiceCtrl_Impl::FindNewCursor()
2935*cdf0e10cSrcweir {
2936*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pNewCursor;
2937*cdf0e10cSrcweir 	if( pCursor )
2938*cdf0e10cSrcweir 	{
2939*cdf0e10cSrcweir 		pNewCursor = pImpCursor->GoLeftRight( pCursor, sal_False );
2940*cdf0e10cSrcweir 		if( !pNewCursor )
2941*cdf0e10cSrcweir 		{
2942*cdf0e10cSrcweir 			pNewCursor = pImpCursor->GoLeftRight( pCursor, sal_True );
2943*cdf0e10cSrcweir 			if( !pNewCursor )
2944*cdf0e10cSrcweir 			{
2945*cdf0e10cSrcweir 				pNewCursor = pImpCursor->GoUpDown( pCursor, sal_False );
2946*cdf0e10cSrcweir 				if( !pNewCursor )
2947*cdf0e10cSrcweir 					pNewCursor = pImpCursor->GoUpDown( pCursor, sal_True );
2948*cdf0e10cSrcweir 			}
2949*cdf0e10cSrcweir 		}
2950*cdf0e10cSrcweir 	}
2951*cdf0e10cSrcweir 	else
2952*cdf0e10cSrcweir 		pNewCursor = (SvxIconChoiceCtrlEntry*)aEntries.First();
2953*cdf0e10cSrcweir 	DBG_ASSERT(!pNewCursor|| (pCursor&&pCursor!=pNewCursor),"FindNewCursor failed");
2954*cdf0e10cSrcweir 	return pNewCursor;
2955*cdf0e10cSrcweir }
2956*cdf0e10cSrcweir 
2957*cdf0e10cSrcweir sal_uLong SvxIconChoiceCtrl_Impl::GetSelectionCount() const
2958*cdf0e10cSrcweir {
2959*cdf0e10cSrcweir 	if( (nWinBits & WB_HIGHLIGHTFRAME) && pCurHighlightFrame )
2960*cdf0e10cSrcweir 		return 1;
2961*cdf0e10cSrcweir 	return nSelectionCount;
2962*cdf0e10cSrcweir }
2963*cdf0e10cSrcweir 
2964*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::ToggleSelection( SvxIconChoiceCtrlEntry* pEntry )
2965*cdf0e10cSrcweir {
2966*cdf0e10cSrcweir 	sal_Bool bSel;
2967*cdf0e10cSrcweir 	if( pEntry->IsSelected() )
2968*cdf0e10cSrcweir 		bSel = sal_False;
2969*cdf0e10cSrcweir 	else
2970*cdf0e10cSrcweir 		bSel = sal_True;
2971*cdf0e10cSrcweir 	SelectEntry( pEntry, bSel, sal_True, sal_True );
2972*cdf0e10cSrcweir }
2973*cdf0e10cSrcweir 
2974*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::DeselectAllBut( SvxIconChoiceCtrlEntry* pThisEntryNot,
2975*cdf0e10cSrcweir 	sal_Bool bPaintSync )
2976*cdf0e10cSrcweir {
2977*cdf0e10cSrcweir 	ClearSelectedRectList();
2978*cdf0e10cSrcweir 	//
2979*cdf0e10cSrcweir 	// !!!!!!! Todo: Evtl. Z-Orderlist abarbeiten !!!!!!!
2980*cdf0e10cSrcweir 	//
2981*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
2982*cdf0e10cSrcweir 	for( sal_uLong nCur = 0; nCur < nCount; nCur++ )
2983*cdf0e10cSrcweir 	{
2984*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nCur );
2985*cdf0e10cSrcweir 		if( pEntry != pThisEntryNot && pEntry->IsSelected() )
2986*cdf0e10cSrcweir 			SelectEntry( pEntry, sal_False, sal_True, sal_True, bPaintSync );
2987*cdf0e10cSrcweir 	}
2988*cdf0e10cSrcweir 	pAnchor = 0;
2989*cdf0e10cSrcweir 	nFlags &= (~F_ADD_MODE);
2990*cdf0e10cSrcweir }
2991*cdf0e10cSrcweir 
2992*cdf0e10cSrcweir Size SvxIconChoiceCtrl_Impl::GetMinGrid() const
2993*cdf0e10cSrcweir {
2994*cdf0e10cSrcweir 	Size aMinSize( aImageSize );
2995*cdf0e10cSrcweir 	aMinSize.Width() += 2 * LROFFS_BOUND;
2996*cdf0e10cSrcweir 	aMinSize.Height() += TBOFFS_BOUND;	// PB: einmal Offset reicht (FileDlg)
2997*cdf0e10cSrcweir 	String aStrDummy( RTL_CONSTASCII_USTRINGPARAM( "XXX" ) );
2998*cdf0e10cSrcweir 	Size aTextSize( pView->GetTextWidth( aStrDummy ), pView->GetTextHeight() );
2999*cdf0e10cSrcweir 	if( nWinBits & WB_ICON )
3000*cdf0e10cSrcweir 	{
3001*cdf0e10cSrcweir 		aMinSize.Height() += VER_DIST_BMP_STRING;
3002*cdf0e10cSrcweir 		aMinSize.Height() += aTextSize.Height();
3003*cdf0e10cSrcweir 	}
3004*cdf0e10cSrcweir 	else
3005*cdf0e10cSrcweir 	{
3006*cdf0e10cSrcweir 		aMinSize.Width() += HOR_DIST_BMP_STRING;
3007*cdf0e10cSrcweir 		aMinSize.Width() += aTextSize.Width();
3008*cdf0e10cSrcweir 	}
3009*cdf0e10cSrcweir 	return aMinSize;
3010*cdf0e10cSrcweir }
3011*cdf0e10cSrcweir 
3012*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetGrid( const Size& rSize )
3013*cdf0e10cSrcweir {
3014*cdf0e10cSrcweir 	Size aSize( rSize );
3015*cdf0e10cSrcweir 	Size aMinSize( GetMinGrid() );
3016*cdf0e10cSrcweir 	if( aSize.Width() < aMinSize.Width() )
3017*cdf0e10cSrcweir 		aSize.Width() = aMinSize.Width();
3018*cdf0e10cSrcweir 	if( aSize.Height() < aMinSize.Height() )
3019*cdf0e10cSrcweir 		aSize.Height() = aMinSize.Height();
3020*cdf0e10cSrcweir 
3021*cdf0e10cSrcweir 	nGridDX = aSize.Width();
3022*cdf0e10cSrcweir 	// HACK(Detail-Modus ist noch nicht vollstaendig implementiert!)
3023*cdf0e10cSrcweir 	// dieses Workaround bringts mit einer Spalte zum Fliegen
3024*cdf0e10cSrcweir 	if( nWinBits & WB_DETAILS )
3025*cdf0e10cSrcweir 	{
3026*cdf0e10cSrcweir 		const SvxIconChoiceCtrlColumnInfo* pCol = GetColumn( 0 );
3027*cdf0e10cSrcweir 		if( pCol )
3028*cdf0e10cSrcweir 			((SvxIconChoiceCtrlColumnInfo*)pCol)->SetWidth( nGridDX );
3029*cdf0e10cSrcweir 	}
3030*cdf0e10cSrcweir 	nGridDY = aSize.Height();
3031*cdf0e10cSrcweir 	SetDefaultTextSize();
3032*cdf0e10cSrcweir }
3033*cdf0e10cSrcweir 
3034*cdf0e10cSrcweir // berechnet die maximale Groesse, die das Textrechteck innerhalb des
3035*cdf0e10cSrcweir // umschliessenden Rechtecks einnehmen kann. Im Modus WB_ICON und
3036*cdf0e10cSrcweir // IcnShowTextFull wird Bottom auf LONG_MAX gesetzt
3037*cdf0e10cSrcweir 
3038*cdf0e10cSrcweir Rectangle SvxIconChoiceCtrl_Impl::CalcMaxTextRect( const SvxIconChoiceCtrlEntry* pEntry ) const
3039*cdf0e10cSrcweir {
3040*cdf0e10cSrcweir 	Rectangle aBoundRect;
3041*cdf0e10cSrcweir 	// keine Endlosrekursion! deshalb das Bound-Rect hier nicht berechnen
3042*cdf0e10cSrcweir 	if( IsBoundingRectValid( pEntry->aRect ) )
3043*cdf0e10cSrcweir 		aBoundRect = pEntry->aRect;
3044*cdf0e10cSrcweir 	else
3045*cdf0e10cSrcweir 		aBoundRect = pEntry->aGridRect;
3046*cdf0e10cSrcweir 
3047*cdf0e10cSrcweir 	Rectangle aBmpRect( ((SvxIconChoiceCtrl_Impl*)this)->CalcBmpRect(
3048*cdf0e10cSrcweir 		(SvxIconChoiceCtrlEntry*)pEntry ) );
3049*cdf0e10cSrcweir 	if( nWinBits & WB_ICON )
3050*cdf0e10cSrcweir 	{
3051*cdf0e10cSrcweir 		aBoundRect.Top() = aBmpRect.Bottom();
3052*cdf0e10cSrcweir 		aBoundRect.Top() += VER_DIST_BMP_STRING;
3053*cdf0e10cSrcweir 		if( aBoundRect.Top() > aBoundRect.Bottom())
3054*cdf0e10cSrcweir 			aBoundRect.Top() = aBoundRect.Bottom();
3055*cdf0e10cSrcweir 		aBoundRect.Left() += LROFFS_BOUND;
3056*cdf0e10cSrcweir 		aBoundRect.Left()++;
3057*cdf0e10cSrcweir 		aBoundRect.Right() -= LROFFS_BOUND;
3058*cdf0e10cSrcweir 		aBoundRect.Right()--;
3059*cdf0e10cSrcweir 		if( aBoundRect.Left() > aBoundRect.Right())
3060*cdf0e10cSrcweir 			aBoundRect.Left() = aBoundRect.Right();
3061*cdf0e10cSrcweir 		if( GetEntryTextModeSmart( pEntry ) == IcnShowTextFull )
3062*cdf0e10cSrcweir 			aBoundRect.Bottom() = LONG_MAX;
3063*cdf0e10cSrcweir 	}
3064*cdf0e10cSrcweir 	else
3065*cdf0e10cSrcweir 	{
3066*cdf0e10cSrcweir 		aBoundRect.Left() = aBmpRect.Right();
3067*cdf0e10cSrcweir 		aBoundRect.Left() += HOR_DIST_BMP_STRING;
3068*cdf0e10cSrcweir 		aBoundRect.Right() -= LROFFS_BOUND;
3069*cdf0e10cSrcweir 		if( aBoundRect.Left() > aBoundRect.Right() )
3070*cdf0e10cSrcweir 			aBoundRect.Left() = aBoundRect.Right();
3071*cdf0e10cSrcweir 		long nHeight = aBoundRect.GetSize().Height();
3072*cdf0e10cSrcweir 		nHeight = nHeight - aDefaultTextSize.Height();
3073*cdf0e10cSrcweir 		nHeight /= 2;
3074*cdf0e10cSrcweir 		aBoundRect.Top() += nHeight;
3075*cdf0e10cSrcweir 		aBoundRect.Bottom() -= nHeight;
3076*cdf0e10cSrcweir 	}
3077*cdf0e10cSrcweir 	return aBoundRect;
3078*cdf0e10cSrcweir }
3079*cdf0e10cSrcweir 
3080*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetDefaultTextSize()
3081*cdf0e10cSrcweir {
3082*cdf0e10cSrcweir 	long nDY = nGridDY;
3083*cdf0e10cSrcweir 	nDY -= aImageSize.Height();
3084*cdf0e10cSrcweir 	nDY -= VER_DIST_BMP_STRING;
3085*cdf0e10cSrcweir 	nDY -= 2*TBOFFS_BOUND;
3086*cdf0e10cSrcweir 	if( nDY <= 0 )
3087*cdf0e10cSrcweir 		nDY = 2;
3088*cdf0e10cSrcweir 
3089*cdf0e10cSrcweir 	long nDX = nGridDX;
3090*cdf0e10cSrcweir 	nDX -= 2*LROFFS_BOUND;
3091*cdf0e10cSrcweir 	nDX -= 2;
3092*cdf0e10cSrcweir 	if( nDX <= 0 )
3093*cdf0e10cSrcweir 		nDX = 2;
3094*cdf0e10cSrcweir 
3095*cdf0e10cSrcweir 	String aStrDummy( RTL_CONSTASCII_USTRINGPARAM( "X" ) );
3096*cdf0e10cSrcweir 	long nHeight = pView->GetTextHeight();
3097*cdf0e10cSrcweir 	if( nDY < nHeight )
3098*cdf0e10cSrcweir 		nDY = nHeight;
3099*cdf0e10cSrcweir 	aDefaultTextSize = Size( nDX, nDY );
3100*cdf0e10cSrcweir }
3101*cdf0e10cSrcweir 
3102*cdf0e10cSrcweir 
3103*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::Center( SvxIconChoiceCtrlEntry* pEntry ) const
3104*cdf0e10cSrcweir {
3105*cdf0e10cSrcweir 	pEntry->aRect = pEntry->aGridRect;
3106*cdf0e10cSrcweir 	Size aSize( CalcBoundingSize( pEntry ) );
3107*cdf0e10cSrcweir 	if( nWinBits & WB_ICON )
3108*cdf0e10cSrcweir 	{
3109*cdf0e10cSrcweir 		// horizontal zentrieren
3110*cdf0e10cSrcweir 		long nBorder = pEntry->aGridRect.GetWidth() - aSize.Width();
3111*cdf0e10cSrcweir 		pEntry->aRect.Left() += nBorder / 2;
3112*cdf0e10cSrcweir 		pEntry->aRect.Right() -= nBorder / 2;
3113*cdf0e10cSrcweir 	}
3114*cdf0e10cSrcweir 	// vertikal zentrieren
3115*cdf0e10cSrcweir 	pEntry->aRect.Bottom() = pEntry->aRect.Top() + aSize.Height();
3116*cdf0e10cSrcweir }
3117*cdf0e10cSrcweir 
3118*cdf0e10cSrcweir 
3119*cdf0e10cSrcweir // Die Deltas entsprechen Offsets, um die die View auf dem Doc verschoben wird
3120*cdf0e10cSrcweir // links, hoch: Offsets < 0
3121*cdf0e10cSrcweir // rechts, runter: Offsets > 0
3122*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::Scroll( long nDeltaX, long nDeltaY, sal_Bool bScrollBar )
3123*cdf0e10cSrcweir {
3124*cdf0e10cSrcweir 	const MapMode& rMapMode = pView->GetMapMode();
3125*cdf0e10cSrcweir 	Point aOrigin( rMapMode.GetOrigin() );
3126*cdf0e10cSrcweir 	// in Dokumentkoordinate umwandeln
3127*cdf0e10cSrcweir 	aOrigin *= -1;
3128*cdf0e10cSrcweir 	aOrigin.Y() += nDeltaY;
3129*cdf0e10cSrcweir 	aOrigin.X() += nDeltaX;
3130*cdf0e10cSrcweir 	Rectangle aRect( aOrigin, aOutputSize );
3131*cdf0e10cSrcweir 	MakeVisible( aRect, bScrollBar );
3132*cdf0e10cSrcweir }
3133*cdf0e10cSrcweir 
3134*cdf0e10cSrcweir 
3135*cdf0e10cSrcweir const Size& SvxIconChoiceCtrl_Impl::GetItemSize( SvxIconChoiceCtrlEntry*,
3136*cdf0e10cSrcweir 	IcnViewFieldType eItem ) const
3137*cdf0e10cSrcweir {
3138*cdf0e10cSrcweir 	if( eItem == IcnViewFieldTypeText )
3139*cdf0e10cSrcweir 		return aDefaultTextSize;
3140*cdf0e10cSrcweir 	return aImageSize;
3141*cdf0e10cSrcweir }
3142*cdf0e10cSrcweir 
3143*cdf0e10cSrcweir Rectangle SvxIconChoiceCtrl_Impl::CalcFocusRect( SvxIconChoiceCtrlEntry* pEntry )
3144*cdf0e10cSrcweir {
3145*cdf0e10cSrcweir 	Rectangle aBmpRect( CalcBmpRect( pEntry ) );
3146*cdf0e10cSrcweir 	Rectangle aTextRect( CalcTextRect( pEntry ) );
3147*cdf0e10cSrcweir 	Rectangle aBoundRect( GetEntryBoundRect( pEntry ) );
3148*cdf0e10cSrcweir 	Rectangle aFocusRect( aBoundRect.Left(), aBmpRect.Top() - 1,
3149*cdf0e10cSrcweir 						  aBoundRect.Right() - 4, aTextRect.Bottom() + 1 );
3150*cdf0e10cSrcweir 	// Das Fokusrechteck soll nicht den Text beruehren
3151*cdf0e10cSrcweir 	if( aFocusRect.Left() - 1 >= pEntry->aRect.Left() )
3152*cdf0e10cSrcweir 		aFocusRect.Left()--;
3153*cdf0e10cSrcweir 	if( aFocusRect.Right() + 1 <= pEntry->aRect.Right() )
3154*cdf0e10cSrcweir 		aFocusRect.Right()++;
3155*cdf0e10cSrcweir 
3156*cdf0e10cSrcweir 	return aFocusRect;
3157*cdf0e10cSrcweir }
3158*cdf0e10cSrcweir 
3159*cdf0e10cSrcweir // Der 'Hot Spot' sind die inneren 50% der Rechteckflaeche
3160*cdf0e10cSrcweir static Rectangle GetHotSpot( const Rectangle& rRect )
3161*cdf0e10cSrcweir {
3162*cdf0e10cSrcweir 	Rectangle aResult( rRect );
3163*cdf0e10cSrcweir 	aResult.Justify();
3164*cdf0e10cSrcweir 	Size aSize( rRect.GetSize() );
3165*cdf0e10cSrcweir 	long nDelta = aSize.Width() / 4;
3166*cdf0e10cSrcweir 	aResult.Left() += nDelta;
3167*cdf0e10cSrcweir 	aResult.Right() -= nDelta;
3168*cdf0e10cSrcweir 	nDelta = aSize.Height() / 4;
3169*cdf0e10cSrcweir 	aResult.Top() += nDelta;
3170*cdf0e10cSrcweir 	aResult.Bottom() -= nDelta;
3171*cdf0e10cSrcweir 	return aResult;
3172*cdf0e10cSrcweir }
3173*cdf0e10cSrcweir 
3174*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SelectRect( SvxIconChoiceCtrlEntry* pEntry1, SvxIconChoiceCtrlEntry* pEntry2,
3175*cdf0e10cSrcweir 	sal_Bool bAdd, SvPtrarr* pOtherRects )
3176*cdf0e10cSrcweir {
3177*cdf0e10cSrcweir 	DBG_ASSERT(pEntry1 && pEntry2,"SelectEntry: Invalid Entry-Ptr");
3178*cdf0e10cSrcweir 	Rectangle aRect( GetEntryBoundRect( pEntry1 ) );
3179*cdf0e10cSrcweir 	aRect.Union( GetEntryBoundRect( pEntry2 ) );
3180*cdf0e10cSrcweir 	SelectRect( aRect, bAdd, pOtherRects );
3181*cdf0e10cSrcweir }
3182*cdf0e10cSrcweir 
3183*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SelectRect( const Rectangle& rRect, sal_Bool bAdd,
3184*cdf0e10cSrcweir 	SvPtrarr* pOtherRects )
3185*cdf0e10cSrcweir {
3186*cdf0e10cSrcweir 	aCurSelectionRect = rRect;
3187*cdf0e10cSrcweir 	if( !pZOrderList || !pZOrderList->Count() )
3188*cdf0e10cSrcweir 		return;
3189*cdf0e10cSrcweir 
3190*cdf0e10cSrcweir 	// Flag setzen, damit im Select kein ToTop gerufen wird
3191*cdf0e10cSrcweir 	sal_Bool bAlreadySelectingRect = nFlags & F_SELECTING_RECT ? sal_True : sal_False;
3192*cdf0e10cSrcweir 	nFlags |= F_SELECTING_RECT;
3193*cdf0e10cSrcweir 
3194*cdf0e10cSrcweir 	CheckBoundingRects();
3195*cdf0e10cSrcweir 	pView->Update();
3196*cdf0e10cSrcweir 	const sal_uLong nCount = pZOrderList->Count();
3197*cdf0e10cSrcweir 
3198*cdf0e10cSrcweir 	Rectangle aRect( rRect );
3199*cdf0e10cSrcweir 	aRect.Justify();
3200*cdf0e10cSrcweir 	sal_Bool bCalcOverlap = (bAdd && pOtherRects && pOtherRects->Count()) ? sal_True : sal_False;
3201*cdf0e10cSrcweir 
3202*cdf0e10cSrcweir 	sal_Bool bResetClipRegion = sal_False;
3203*cdf0e10cSrcweir 	if( !pView->IsClipRegion() )
3204*cdf0e10cSrcweir 	{
3205*cdf0e10cSrcweir 		bResetClipRegion = sal_True;
3206*cdf0e10cSrcweir 		pView->SetClipRegion( GetOutputRect() );
3207*cdf0e10cSrcweir 	}
3208*cdf0e10cSrcweir 
3209*cdf0e10cSrcweir 	for( sal_uLong nPos = 0; nPos < nCount; nPos++ )
3210*cdf0e10cSrcweir 	{
3211*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)(pZOrderList->GetObject(nPos ));
3212*cdf0e10cSrcweir 
3213*cdf0e10cSrcweir 		if( !IsBoundingRectValid( pEntry->aRect ))
3214*cdf0e10cSrcweir 			FindBoundingRect( pEntry );
3215*cdf0e10cSrcweir 		Rectangle aBoundRect( GetHotSpot( pEntry->aRect ) );
3216*cdf0e10cSrcweir 		sal_Bool bSelected = pEntry->IsSelected();
3217*cdf0e10cSrcweir 
3218*cdf0e10cSrcweir 		sal_Bool bOverlaps;
3219*cdf0e10cSrcweir 		if( bCalcOverlap )
3220*cdf0e10cSrcweir 			bOverlaps = IsOver( pOtherRects, aBoundRect );
3221*cdf0e10cSrcweir 		else
3222*cdf0e10cSrcweir 			bOverlaps = sal_False;
3223*cdf0e10cSrcweir 		sal_Bool bOver = aRect.IsOver( aBoundRect );
3224*cdf0e10cSrcweir 
3225*cdf0e10cSrcweir 		if( bOver && !bOverlaps )
3226*cdf0e10cSrcweir 		{
3227*cdf0e10cSrcweir 			// Ist im neuen Selektionsrechteck und in keinem alten
3228*cdf0e10cSrcweir 			// => selektieren
3229*cdf0e10cSrcweir 			if( !bSelected )
3230*cdf0e10cSrcweir 				SelectEntry( pEntry, sal_True, sal_True, sal_True );
3231*cdf0e10cSrcweir 		}
3232*cdf0e10cSrcweir 		else if( !bAdd )
3233*cdf0e10cSrcweir 		{
3234*cdf0e10cSrcweir 			// ist ausserhalb des Selektionsrechtecks
3235*cdf0e10cSrcweir 			// => Selektion entfernen
3236*cdf0e10cSrcweir 			if( bSelected )
3237*cdf0e10cSrcweir 				SelectEntry( pEntry, sal_False, sal_True, sal_True );
3238*cdf0e10cSrcweir 		}
3239*cdf0e10cSrcweir 		else if( bAdd && bOverlaps )
3240*cdf0e10cSrcweir 		{
3241*cdf0e10cSrcweir 			// Der Eintrag befindet sich in einem alten (=>Aufspannen
3242*cdf0e10cSrcweir 			// mehrerer Rechtecke mit Ctrl!) Selektionsrechteck
3243*cdf0e10cSrcweir 
3244*cdf0e10cSrcweir 			// Hier ist noch ein Bug! Der Selektionsstatus eines Eintrags
3245*cdf0e10cSrcweir 			// in einem vorherigen Rechteck, muss restauriert werden, wenn
3246*cdf0e10cSrcweir 			// er vom aktuellen Selektionsrechteck beruehrt wurde, jetzt aber
3247*cdf0e10cSrcweir 			// nicht mehr in ihm liegt. Ich gehe hier der Einfachheit halber
3248*cdf0e10cSrcweir 			// pauschal davon aus, dass die Eintraege in den alten Rechtecken
3249*cdf0e10cSrcweir 			// alle selektiert sind. Ebenso ist es falsch, die Schnittmenge
3250*cdf0e10cSrcweir 			// nur zu deselektieren.
3251*cdf0e10cSrcweir 			// Loesungsmoeglichkeit: Snapshot der Selektion vor dem Auf-
3252*cdf0e10cSrcweir 			// spannen des Rechtecks merken
3253*cdf0e10cSrcweir 			if( aBoundRect.IsOver( rRect))
3254*cdf0e10cSrcweir 			{
3255*cdf0e10cSrcweir 				// Schnittmenge zwischen alten Rects & aktuellem Rect desel.
3256*cdf0e10cSrcweir 				if( bSelected )
3257*cdf0e10cSrcweir 					SelectEntry( pEntry, sal_False, sal_True, sal_True );
3258*cdf0e10cSrcweir 			}
3259*cdf0e10cSrcweir 			else
3260*cdf0e10cSrcweir 			{
3261*cdf0e10cSrcweir 				// Eintrag eines alten Rects selektieren
3262*cdf0e10cSrcweir 				if( !bSelected )
3263*cdf0e10cSrcweir 					SelectEntry( pEntry, sal_True, sal_True, sal_True );
3264*cdf0e10cSrcweir 			}
3265*cdf0e10cSrcweir 		}
3266*cdf0e10cSrcweir 		else if( !bOver && bSelected )
3267*cdf0e10cSrcweir 		{
3268*cdf0e10cSrcweir 			// Der Eintrag liegt voellig ausserhalb und wird deshalb desel.
3269*cdf0e10cSrcweir 			SelectEntry( pEntry, sal_False, sal_True, sal_True );
3270*cdf0e10cSrcweir 		}
3271*cdf0e10cSrcweir 	}
3272*cdf0e10cSrcweir 
3273*cdf0e10cSrcweir 	if( !bAlreadySelectingRect )
3274*cdf0e10cSrcweir 		nFlags &= ~F_SELECTING_RECT;
3275*cdf0e10cSrcweir 
3276*cdf0e10cSrcweir 	pView->Update();
3277*cdf0e10cSrcweir 	if( bResetClipRegion )
3278*cdf0e10cSrcweir 		pView->SetClipRegion();
3279*cdf0e10cSrcweir }
3280*cdf0e10cSrcweir 
3281*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SelectRange(
3282*cdf0e10cSrcweir 						SvxIconChoiceCtrlEntry* pStart,
3283*cdf0e10cSrcweir 						SvxIconChoiceCtrlEntry* pEnd,
3284*cdf0e10cSrcweir 						sal_Bool bAdd )
3285*cdf0e10cSrcweir {
3286*cdf0e10cSrcweir 	sal_uLong nFront = GetEntryListPos( pStart );
3287*cdf0e10cSrcweir 	sal_uLong nBack	 = GetEntryListPos( pEnd );
3288*cdf0e10cSrcweir 	sal_uLong nFirst = std::min( nFront, nBack );
3289*cdf0e10cSrcweir 	sal_uLong nLast	 = std::max( nFront, nBack );
3290*cdf0e10cSrcweir 	sal_uLong i;
3291*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pEntry;
3292*cdf0e10cSrcweir 
3293*cdf0e10cSrcweir 	if ( ! bAdd )
3294*cdf0e10cSrcweir 	{
3295*cdf0e10cSrcweir 		// deselect everything before the first entry if not in
3296*cdf0e10cSrcweir 		// adding mode
3297*cdf0e10cSrcweir 		for ( i=0; i<nFirst; i++ )
3298*cdf0e10cSrcweir 		{
3299*cdf0e10cSrcweir 			pEntry = GetEntry( i );
3300*cdf0e10cSrcweir 			if( pEntry->IsSelected() )
3301*cdf0e10cSrcweir 				SelectEntry( pEntry, sal_False, sal_True, sal_True, sal_True );
3302*cdf0e10cSrcweir 		}
3303*cdf0e10cSrcweir 	}
3304*cdf0e10cSrcweir 
3305*cdf0e10cSrcweir 	// select everything between nFirst and nLast
3306*cdf0e10cSrcweir 	for ( i=nFirst; i<=nLast; i++ )
3307*cdf0e10cSrcweir 	{
3308*cdf0e10cSrcweir 		pEntry = GetEntry( i );
3309*cdf0e10cSrcweir 		if( ! pEntry->IsSelected() )
3310*cdf0e10cSrcweir 			SelectEntry( pEntry, sal_True, sal_True,  sal_True, sal_True );
3311*cdf0e10cSrcweir 	}
3312*cdf0e10cSrcweir 
3313*cdf0e10cSrcweir 	if ( ! bAdd )
3314*cdf0e10cSrcweir 	{
3315*cdf0e10cSrcweir 		// deselect everything behind the last entry if not in
3316*cdf0e10cSrcweir 		// adding mode
3317*cdf0e10cSrcweir 		sal_uLong nEnd = GetEntryCount();
3318*cdf0e10cSrcweir 		for ( ; i<nEnd; i++ )
3319*cdf0e10cSrcweir 		{
3320*cdf0e10cSrcweir 			pEntry = GetEntry( i );
3321*cdf0e10cSrcweir 			if( pEntry->IsSelected() )
3322*cdf0e10cSrcweir 				SelectEntry( pEntry, sal_False, sal_True, sal_True, sal_True );
3323*cdf0e10cSrcweir 		}
3324*cdf0e10cSrcweir 	}
3325*cdf0e10cSrcweir }
3326*cdf0e10cSrcweir 
3327*cdf0e10cSrcweir sal_Bool SvxIconChoiceCtrl_Impl::IsOver( SvPtrarr* pRectList, const Rectangle& rBoundRect ) const
3328*cdf0e10cSrcweir {
3329*cdf0e10cSrcweir 	const sal_uInt16 nCount = pRectList->Count();
3330*cdf0e10cSrcweir 	for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
3331*cdf0e10cSrcweir 	{
3332*cdf0e10cSrcweir 		Rectangle* pRect = (Rectangle*)pRectList->GetObject( nCur );
3333*cdf0e10cSrcweir 		if( rBoundRect.IsOver( *pRect ))
3334*cdf0e10cSrcweir 			return sal_True;
3335*cdf0e10cSrcweir 	}
3336*cdf0e10cSrcweir 	return sal_False;
3337*cdf0e10cSrcweir }
3338*cdf0e10cSrcweir 
3339*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::AddSelectedRect( SvxIconChoiceCtrlEntry* pEntry1,
3340*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pEntry2 )
3341*cdf0e10cSrcweir {
3342*cdf0e10cSrcweir 	DBG_ASSERT(pEntry1 && pEntry2,"SelectEntry: Invalid Entry-Ptr");
3343*cdf0e10cSrcweir 	Rectangle aRect( GetEntryBoundRect( pEntry1 ) );
3344*cdf0e10cSrcweir 	aRect.Union( GetEntryBoundRect( pEntry2 ) );
3345*cdf0e10cSrcweir 	AddSelectedRect( aRect );
3346*cdf0e10cSrcweir }
3347*cdf0e10cSrcweir 
3348*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::AddSelectedRect( const Rectangle& rRect )
3349*cdf0e10cSrcweir {
3350*cdf0e10cSrcweir 	Rectangle* pRect = new Rectangle( rRect );
3351*cdf0e10cSrcweir 	pRect->Justify();
3352*cdf0e10cSrcweir 	aSelectedRectList.Insert( (void*)pRect, aSelectedRectList.Count() );
3353*cdf0e10cSrcweir }
3354*cdf0e10cSrcweir 
3355*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::ClearSelectedRectList()
3356*cdf0e10cSrcweir {
3357*cdf0e10cSrcweir 	const sal_uInt16 nCount = aSelectedRectList.Count();
3358*cdf0e10cSrcweir 	for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
3359*cdf0e10cSrcweir 	{
3360*cdf0e10cSrcweir 		Rectangle* pRect = (Rectangle*)aSelectedRectList.GetObject( nCur );
3361*cdf0e10cSrcweir 		delete pRect;
3362*cdf0e10cSrcweir 	}
3363*cdf0e10cSrcweir 	aSelectedRectList.Remove( 0, aSelectedRectList.Count() );
3364*cdf0e10cSrcweir }
3365*cdf0e10cSrcweir 
3366*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::CalcScrollOffsets( const Point& rPosPixel,
3367*cdf0e10cSrcweir 	long& rX, long& rY, sal_Bool isInDragDrop, sal_uInt16 nBorderWidth)
3368*cdf0e10cSrcweir {
3369*cdf0e10cSrcweir 	// Scrolling der View, falls sich der Mauszeiger im Grenzbereich des
3370*cdf0e10cSrcweir 	// Fensters befindet
3371*cdf0e10cSrcweir 	long nPixelToScrollX = 0;
3372*cdf0e10cSrcweir 	long nPixelToScrollY = 0;
3373*cdf0e10cSrcweir 	Size aWndSize = aOutputSize;
3374*cdf0e10cSrcweir 
3375*cdf0e10cSrcweir 	nBorderWidth = (sal_uInt16)(Min( (long)(aWndSize.Height()-1), (long)nBorderWidth ));
3376*cdf0e10cSrcweir 	nBorderWidth = (sal_uInt16)(Min( (long)(aWndSize.Width()-1), (long)nBorderWidth ));
3377*cdf0e10cSrcweir 
3378*cdf0e10cSrcweir 	if ( rPosPixel.X() < nBorderWidth )
3379*cdf0e10cSrcweir 	{
3380*cdf0e10cSrcweir 		if( isInDragDrop )
3381*cdf0e10cSrcweir 			nPixelToScrollX = -DD_SCROLL_PIXEL;
3382*cdf0e10cSrcweir 		else
3383*cdf0e10cSrcweir 			nPixelToScrollX = rPosPixel.X()- nBorderWidth;
3384*cdf0e10cSrcweir 	}
3385*cdf0e10cSrcweir 	else if ( rPosPixel.X() > aWndSize.Width() - nBorderWidth )
3386*cdf0e10cSrcweir 	{
3387*cdf0e10cSrcweir 		if( isInDragDrop )
3388*cdf0e10cSrcweir 			nPixelToScrollX = DD_SCROLL_PIXEL;
3389*cdf0e10cSrcweir 		else
3390*cdf0e10cSrcweir 			nPixelToScrollX = rPosPixel.X() - (aWndSize.Width() - nBorderWidth);
3391*cdf0e10cSrcweir 	}
3392*cdf0e10cSrcweir 	if ( rPosPixel.Y() < nBorderWidth )
3393*cdf0e10cSrcweir 	{
3394*cdf0e10cSrcweir 		if( isInDragDrop )
3395*cdf0e10cSrcweir 			nPixelToScrollY = -DD_SCROLL_PIXEL;
3396*cdf0e10cSrcweir 		else
3397*cdf0e10cSrcweir 			nPixelToScrollY = rPosPixel.Y() - nBorderWidth;
3398*cdf0e10cSrcweir 	}
3399*cdf0e10cSrcweir 	else if ( rPosPixel.Y() > aWndSize.Height() - nBorderWidth )
3400*cdf0e10cSrcweir 	{
3401*cdf0e10cSrcweir 		if( isInDragDrop )
3402*cdf0e10cSrcweir 			nPixelToScrollY = DD_SCROLL_PIXEL;
3403*cdf0e10cSrcweir 		else
3404*cdf0e10cSrcweir 			nPixelToScrollY = rPosPixel.Y() - (aWndSize.Height() - nBorderWidth);
3405*cdf0e10cSrcweir 	}
3406*cdf0e10cSrcweir 
3407*cdf0e10cSrcweir 	rX = nPixelToScrollX;
3408*cdf0e10cSrcweir 	rY = nPixelToScrollY;
3409*cdf0e10cSrcweir }
3410*cdf0e10cSrcweir 
3411*cdf0e10cSrcweir IMPL_LINK(SvxIconChoiceCtrl_Impl, AutoArrangeHdl, void*, EMPTYARG )
3412*cdf0e10cSrcweir {
3413*cdf0e10cSrcweir 	aAutoArrangeTimer.Stop();
3414*cdf0e10cSrcweir 	Arrange( IsAutoArrange() );
3415*cdf0e10cSrcweir 	return 0;
3416*cdf0e10cSrcweir }
3417*cdf0e10cSrcweir 
3418*cdf0e10cSrcweir IMPL_LINK(SvxIconChoiceCtrl_Impl, VisRectChangedHdl, void*, EMPTYARG )
3419*cdf0e10cSrcweir {
3420*cdf0e10cSrcweir 	aVisRectChangedTimer.Stop();
3421*cdf0e10cSrcweir 	pView->VisibleRectChanged();
3422*cdf0e10cSrcweir 	return 0;
3423*cdf0e10cSrcweir }
3424*cdf0e10cSrcweir 
3425*cdf0e10cSrcweir IMPL_LINK(SvxIconChoiceCtrl_Impl, DocRectChangedHdl, void*, EMPTYARG )
3426*cdf0e10cSrcweir {
3427*cdf0e10cSrcweir 	aDocRectChangedTimer.Stop();
3428*cdf0e10cSrcweir 	pView->DocumentRectChanged();
3429*cdf0e10cSrcweir 	return 0;
3430*cdf0e10cSrcweir }
3431*cdf0e10cSrcweir 
3432*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::PrepareCommandEvent( const CommandEvent& rCEvt )
3433*cdf0e10cSrcweir {
3434*cdf0e10cSrcweir 	StopEditTimer();
3435*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pEntry = pView->GetEntry( rCEvt.GetMousePosPixel() );
3436*cdf0e10cSrcweir 	if( (nFlags & F_DOWN_CTRL) && pEntry && !pEntry->IsSelected() )
3437*cdf0e10cSrcweir 		SelectEntry( pEntry, sal_True, sal_True );
3438*cdf0e10cSrcweir 	nFlags &= ~(F_DOWN_CTRL | F_DOWN_DESELECT);
3439*cdf0e10cSrcweir }
3440*cdf0e10cSrcweir 
3441*cdf0e10cSrcweir sal_Bool SvxIconChoiceCtrl_Impl::IsTextHit( SvxIconChoiceCtrlEntry* pEntry, const Point& rDocPos )
3442*cdf0e10cSrcweir {
3443*cdf0e10cSrcweir 	Rectangle aRect( CalcTextRect( pEntry ));
3444*cdf0e10cSrcweir 	if( aRect.IsInside( rDocPos ) )
3445*cdf0e10cSrcweir 		return sal_True;
3446*cdf0e10cSrcweir 	return sal_False;
3447*cdf0e10cSrcweir }
3448*cdf0e10cSrcweir 
3449*cdf0e10cSrcweir IMPL_LINK(SvxIconChoiceCtrl_Impl, EditTimeoutHdl, Timer*, EMPTYARG )
3450*cdf0e10cSrcweir {
3451*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pEntry = GetCurEntry();
3452*cdf0e10cSrcweir 	if( bEntryEditingEnabled && pEntry &&
3453*cdf0e10cSrcweir 		pEntry->IsSelected())
3454*cdf0e10cSrcweir 	{
3455*cdf0e10cSrcweir 		if( pView->EditingEntry( pEntry ))
3456*cdf0e10cSrcweir 			EditEntry( pEntry );
3457*cdf0e10cSrcweir 	}
3458*cdf0e10cSrcweir 	return 0;
3459*cdf0e10cSrcweir }
3460*cdf0e10cSrcweir 
3461*cdf0e10cSrcweir 
3462*cdf0e10cSrcweir //
3463*cdf0e10cSrcweir // Funktionen zum Ausrichten der Eintraege am Grid
3464*cdf0e10cSrcweir //
3465*cdf0e10cSrcweir 
3466*cdf0e10cSrcweir // pStart == 0: Alle Eintraege werden ausgerichtet
3467*cdf0e10cSrcweir // sonst: Alle Eintraege der Zeile ab einschliesslich pStart werden ausgerichtet
3468*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::AdjustEntryAtGrid( SvxIconChoiceCtrlEntry* pStart )
3469*cdf0e10cSrcweir {
3470*cdf0e10cSrcweir 	SvPtrarr aLists;
3471*cdf0e10cSrcweir 	pImpCursor->CreateGridAjustData( aLists, pStart );
3472*cdf0e10cSrcweir 	const sal_uInt16 nCount = aLists.Count();
3473*cdf0e10cSrcweir 	for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
3474*cdf0e10cSrcweir 		AdjustAtGrid( *(SvPtrarr*)aLists[ nCur ], pStart );
3475*cdf0e10cSrcweir 	IcnCursor_Impl::DestroyGridAdjustData( aLists );
3476*cdf0e10cSrcweir 	CheckScrollBars();
3477*cdf0e10cSrcweir }
3478*cdf0e10cSrcweir 
3479*cdf0e10cSrcweir // Richtet eine Zeile aus, erweitert ggf. die Breite; Bricht die Zeile nicht um
3480*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::AdjustAtGrid( const SvPtrarr& rRow, SvxIconChoiceCtrlEntry* pStart )
3481*cdf0e10cSrcweir {
3482*cdf0e10cSrcweir 	if( !rRow.Count() )
3483*cdf0e10cSrcweir 		return;
3484*cdf0e10cSrcweir 
3485*cdf0e10cSrcweir 	sal_Bool bGo;
3486*cdf0e10cSrcweir 	if( !pStart )
3487*cdf0e10cSrcweir 		bGo = sal_True;
3488*cdf0e10cSrcweir 	else
3489*cdf0e10cSrcweir 		bGo = sal_False;
3490*cdf0e10cSrcweir 
3491*cdf0e10cSrcweir 	long nCurRight = 0;
3492*cdf0e10cSrcweir 	for( sal_uInt16 nCur = 0; nCur < rRow.Count(); nCur++ )
3493*cdf0e10cSrcweir 	{
3494*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pCur = (SvxIconChoiceCtrlEntry*)rRow[ nCur ];
3495*cdf0e10cSrcweir 		if( !bGo && pCur == pStart )
3496*cdf0e10cSrcweir 			bGo = sal_True;
3497*cdf0e10cSrcweir 
3498*cdf0e10cSrcweir 		//SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pCur);
3499*cdf0e10cSrcweir 		// Massgebend (fuer unser Auge) ist die Bitmap, da sonst
3500*cdf0e10cSrcweir 		// durch lange Texte der Eintrag stark springen kann
3501*cdf0e10cSrcweir 		const Rectangle& rBoundRect = GetEntryBoundRect( pCur );
3502*cdf0e10cSrcweir 		Rectangle aCenterRect( CalcBmpRect( pCur, 0 ));
3503*cdf0e10cSrcweir 		if( bGo && !pCur->IsPosLocked() )
3504*cdf0e10cSrcweir 		{
3505*cdf0e10cSrcweir 			long nWidth = aCenterRect.GetSize().Width();
3506*cdf0e10cSrcweir 			Point aNewPos( AdjustAtGrid( aCenterRect, rBoundRect ) );
3507*cdf0e10cSrcweir 			while( aNewPos.X() < nCurRight )
3508*cdf0e10cSrcweir 				aNewPos.X() += nGridDX;
3509*cdf0e10cSrcweir 			if( aNewPos != rBoundRect.TopLeft() )
3510*cdf0e10cSrcweir 			{
3511*cdf0e10cSrcweir 				SetEntryPos( pCur, aNewPos );
3512*cdf0e10cSrcweir 				pCur->SetFlags( ICNVIEW_FLAG_POS_MOVED );
3513*cdf0e10cSrcweir 				nFlags |= F_MOVED_ENTRIES;
3514*cdf0e10cSrcweir 			}
3515*cdf0e10cSrcweir 			nCurRight = aNewPos.X() + nWidth;
3516*cdf0e10cSrcweir 		}
3517*cdf0e10cSrcweir 		else
3518*cdf0e10cSrcweir 		{
3519*cdf0e10cSrcweir 			nCurRight = rBoundRect.Right();
3520*cdf0e10cSrcweir 		}
3521*cdf0e10cSrcweir 	}
3522*cdf0e10cSrcweir }
3523*cdf0e10cSrcweir 
3524*cdf0e10cSrcweir // Richtet Rect am Grid aus, garantiert jedoch nicht, dass die
3525*cdf0e10cSrcweir // neue Pos. frei ist. Die Pos. kann fuer SetEntryPos verwendet werden.
3526*cdf0e10cSrcweir // Das CenterRect beschreibt den Teil des BoundRects, der fuer
3527*cdf0e10cSrcweir // die Berechnung des Ziel-Rechtecks verwendet wird.
3528*cdf0e10cSrcweir Point SvxIconChoiceCtrl_Impl::AdjustAtGrid( const Rectangle& rCenterRect,
3529*cdf0e10cSrcweir 	const Rectangle& rBoundRect ) const
3530*cdf0e10cSrcweir {
3531*cdf0e10cSrcweir 	Point aPos( rCenterRect.TopLeft() );
3532*cdf0e10cSrcweir 	Size aSize( rCenterRect.GetSize() );
3533*cdf0e10cSrcweir 
3534*cdf0e10cSrcweir 	aPos.X() -= LROFFS_WINBORDER;
3535*cdf0e10cSrcweir 	aPos.Y() -= TBOFFS_WINBORDER;
3536*cdf0e10cSrcweir 
3537*cdf0e10cSrcweir 	// align (ref ist mitte des rects)
3538*cdf0e10cSrcweir 	short nGridX = (short)((aPos.X()+(aSize.Width()/2)) / nGridDX);
3539*cdf0e10cSrcweir 	short nGridY = (short)((aPos.Y()+(aSize.Height()/2)) / nGridDY);
3540*cdf0e10cSrcweir 	aPos.X() = nGridX * nGridDX;
3541*cdf0e10cSrcweir 	aPos.Y() = nGridY * nGridDY;
3542*cdf0e10cSrcweir 	// hor. center
3543*cdf0e10cSrcweir 	aPos.X() += (nGridDX - rBoundRect.GetSize().Width() ) / 2;
3544*cdf0e10cSrcweir 
3545*cdf0e10cSrcweir 	aPos.X() += LROFFS_WINBORDER;
3546*cdf0e10cSrcweir 	aPos.Y() += TBOFFS_WINBORDER;
3547*cdf0e10cSrcweir 
3548*cdf0e10cSrcweir 	return aPos;
3549*cdf0e10cSrcweir }
3550*cdf0e10cSrcweir 
3551*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetEntryTextMode( SvxIconChoiceCtrlTextMode eMode, SvxIconChoiceCtrlEntry* pEntry )
3552*cdf0e10cSrcweir {
3553*cdf0e10cSrcweir 	if( !pEntry )
3554*cdf0e10cSrcweir 	{
3555*cdf0e10cSrcweir 		if( eTextMode != eMode )
3556*cdf0e10cSrcweir 		{
3557*cdf0e10cSrcweir 			if( eTextMode == IcnShowTextDontKnow )
3558*cdf0e10cSrcweir 				eTextMode = IcnShowTextShort;
3559*cdf0e10cSrcweir 			eTextMode = eMode;
3560*cdf0e10cSrcweir 			Arrange( sal_True );
3561*cdf0e10cSrcweir 		}
3562*cdf0e10cSrcweir 	}
3563*cdf0e10cSrcweir 	else
3564*cdf0e10cSrcweir 	{
3565*cdf0e10cSrcweir 		if( pEntry->eTextMode != eMode )
3566*cdf0e10cSrcweir 		{
3567*cdf0e10cSrcweir 			pEntry->eTextMode = eMode;
3568*cdf0e10cSrcweir 			InvalidateEntry( pEntry );
3569*cdf0e10cSrcweir 			pView->Invalidate( GetEntryBoundRect( pEntry ) );
3570*cdf0e10cSrcweir 			AdjustVirtSize( pEntry->aRect );
3571*cdf0e10cSrcweir 		}
3572*cdf0e10cSrcweir 	}
3573*cdf0e10cSrcweir }
3574*cdf0e10cSrcweir 
3575*cdf0e10cSrcweir SvxIconChoiceCtrlTextMode SvxIconChoiceCtrl_Impl::GetTextMode( const SvxIconChoiceCtrlEntry* pEntry ) const
3576*cdf0e10cSrcweir {
3577*cdf0e10cSrcweir 	if( !pEntry )
3578*cdf0e10cSrcweir 		return eTextMode;
3579*cdf0e10cSrcweir 	return pEntry->GetTextMode();
3580*cdf0e10cSrcweir }
3581*cdf0e10cSrcweir 
3582*cdf0e10cSrcweir SvxIconChoiceCtrlTextMode SvxIconChoiceCtrl_Impl::GetEntryTextModeSmart( const SvxIconChoiceCtrlEntry* pEntry ) const
3583*cdf0e10cSrcweir {
3584*cdf0e10cSrcweir 	DBG_ASSERT(pEntry,"GetEntryTextModeSmart: Entry not set");
3585*cdf0e10cSrcweir 	SvxIconChoiceCtrlTextMode eMode = pEntry->GetTextMode();
3586*cdf0e10cSrcweir 	if( eMode == IcnShowTextDontKnow )
3587*cdf0e10cSrcweir 		return eTextMode;
3588*cdf0e10cSrcweir 	return eMode;
3589*cdf0e10cSrcweir }
3590*cdf0e10cSrcweir 
3591*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::ShowEntryFocusRect( const SvxIconChoiceCtrlEntry* pEntry )
3592*cdf0e10cSrcweir {
3593*cdf0e10cSrcweir 	if( !pEntry )
3594*cdf0e10cSrcweir 	{
3595*cdf0e10cSrcweir 		pView->HideFocus();
3596*cdf0e10cSrcweir 	}
3597*cdf0e10cSrcweir 	else
3598*cdf0e10cSrcweir 	{
3599*cdf0e10cSrcweir 		Rectangle aRect ( CalcFocusRect( (SvxIconChoiceCtrlEntry*)pEntry ) );
3600*cdf0e10cSrcweir 		/*pView->*/ShowFocus( aRect );
3601*cdf0e10cSrcweir 	}
3602*cdf0e10cSrcweir }
3603*cdf0e10cSrcweir 
3604*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////
3605*cdf0e10cSrcweir //
3606*cdf0e10cSrcweir // Draw my own focusrect, because the focusrect of the outputdevice has got the inverted color
3607*cdf0e10cSrcweir // of the background. But what will we see, if the the backgroundcolor is gray ? - We will see
3608*cdf0e10cSrcweir // a gray focusrect on a gray background !!!
3609*cdf0e10cSrcweir //
3610*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::ShowFocus ( Rectangle& rRect )
3611*cdf0e10cSrcweir {
3612*cdf0e10cSrcweir 	Color aBkgColor ( pView->GetBackground().GetColor() );
3613*cdf0e10cSrcweir 	Color aPenColor;
3614*cdf0e10cSrcweir 	sal_uInt16 nColor = ( aBkgColor.GetRed() + aBkgColor.GetGreen() + aBkgColor.GetBlue() ) / 3;
3615*cdf0e10cSrcweir 	if ( nColor > 128 )
3616*cdf0e10cSrcweir 		aPenColor.SetColor ( COL_BLACK );
3617*cdf0e10cSrcweir 	else
3618*cdf0e10cSrcweir 		aPenColor.SetColor( COL_WHITE );
3619*cdf0e10cSrcweir 
3620*cdf0e10cSrcweir 	aFocus.bOn = sal_True;
3621*cdf0e10cSrcweir 	aFocus.aPenColor = aPenColor;
3622*cdf0e10cSrcweir 	aFocus.aRect = rRect;
3623*cdf0e10cSrcweir }
3624*cdf0e10cSrcweir 
3625*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::HideFocus ()
3626*cdf0e10cSrcweir {
3627*cdf0e10cSrcweir 	aFocus.bOn = sal_False;
3628*cdf0e10cSrcweir }
3629*cdf0e10cSrcweir 
3630*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::DrawFocusRect ( OutputDevice* pOut )
3631*cdf0e10cSrcweir {
3632*cdf0e10cSrcweir 	pOut->SetLineColor( aFocus.aPenColor );
3633*cdf0e10cSrcweir 	pOut->SetFillColor();
3634*cdf0e10cSrcweir 	Polygon aPolygon ( aFocus.aRect );
3635*cdf0e10cSrcweir 
3636*cdf0e10cSrcweir 	LineInfo aLineInfo ( LINE_DASH );
3637*cdf0e10cSrcweir 
3638*cdf0e10cSrcweir 	aLineInfo.SetDashLen ( 1 );
3639*cdf0e10cSrcweir 
3640*cdf0e10cSrcweir 	aLineInfo.SetDotLen ( 1L );
3641*cdf0e10cSrcweir 	aLineInfo.SetDistance ( 1L );
3642*cdf0e10cSrcweir 	aLineInfo.SetDotCount ( 1 );
3643*cdf0e10cSrcweir 
3644*cdf0e10cSrcweir 	pOut->DrawPolyLine ( aPolygon, aLineInfo );
3645*cdf0e10cSrcweir }
3646*cdf0e10cSrcweir 
3647*cdf0e10cSrcweir sal_Bool SvxIconChoiceCtrl_Impl::IsMnemonicChar( sal_Unicode cChar, sal_uLong& rPos ) const
3648*cdf0e10cSrcweir {
3649*cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
3650*cdf0e10cSrcweir     const vcl::I18nHelper& rI18nHelper = Application::GetSettings().GetUILocaleI18nHelper();
3651*cdf0e10cSrcweir 	sal_uLong nEntryCount = GetEntryCount();
3652*cdf0e10cSrcweir 	for ( sal_uLong i = 0; i < nEntryCount; ++i )
3653*cdf0e10cSrcweir 	{
3654*cdf0e10cSrcweir 		if ( rI18nHelper.MatchMnemonic( GetEntry( i )->GetText(), cChar ) )
3655*cdf0e10cSrcweir 		{
3656*cdf0e10cSrcweir 			bRet = sal_True;
3657*cdf0e10cSrcweir 			rPos = i;
3658*cdf0e10cSrcweir 			break;
3659*cdf0e10cSrcweir 		}
3660*cdf0e10cSrcweir 	}
3661*cdf0e10cSrcweir 
3662*cdf0e10cSrcweir 	return bRet;
3663*cdf0e10cSrcweir }
3664*cdf0e10cSrcweir 
3665*cdf0e10cSrcweir //
3666*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////
3667*cdf0e10cSrcweir 
3668*cdf0e10cSrcweir IMPL_LINK(SvxIconChoiceCtrl_Impl, UserEventHdl, void*, nId )
3669*cdf0e10cSrcweir {
3670*cdf0e10cSrcweir 	if( nId == EVENTID_ADJUST_SCROLLBARS )
3671*cdf0e10cSrcweir 	{
3672*cdf0e10cSrcweir 		nUserEventAdjustScrBars = 0;
3673*cdf0e10cSrcweir 		AdjustScrollBars();
3674*cdf0e10cSrcweir 	}
3675*cdf0e10cSrcweir 	else if( nId == EVENTID_SHOW_CURSOR )
3676*cdf0e10cSrcweir 	{
3677*cdf0e10cSrcweir 		nUserEventShowCursor = 0;
3678*cdf0e10cSrcweir 		ShowCursor( sal_True );
3679*cdf0e10cSrcweir 	}
3680*cdf0e10cSrcweir 	return 0;
3681*cdf0e10cSrcweir }
3682*cdf0e10cSrcweir 
3683*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::CancelUserEvents()
3684*cdf0e10cSrcweir {
3685*cdf0e10cSrcweir 	if( nUserEventAdjustScrBars )
3686*cdf0e10cSrcweir 	{
3687*cdf0e10cSrcweir 		Application::RemoveUserEvent( nUserEventAdjustScrBars );
3688*cdf0e10cSrcweir 		nUserEventAdjustScrBars = 0;
3689*cdf0e10cSrcweir 	}
3690*cdf0e10cSrcweir 	if( nUserEventShowCursor )
3691*cdf0e10cSrcweir 	{
3692*cdf0e10cSrcweir 		Application::RemoveUserEvent( nUserEventShowCursor );
3693*cdf0e10cSrcweir 		nUserEventShowCursor = 0;
3694*cdf0e10cSrcweir 	}
3695*cdf0e10cSrcweir }
3696*cdf0e10cSrcweir 
3697*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::InvalidateEntry( SvxIconChoiceCtrlEntry* pEntry )
3698*cdf0e10cSrcweir {
3699*cdf0e10cSrcweir 	if( pEntry == pCursor )
3700*cdf0e10cSrcweir 		ShowCursor( sal_False );
3701*cdf0e10cSrcweir 	pView->Invalidate( pEntry->aRect );
3702*cdf0e10cSrcweir 	Center( pEntry );
3703*cdf0e10cSrcweir 	pView->Invalidate( pEntry->aRect );
3704*cdf0e10cSrcweir 	if( pEntry == pCursor )
3705*cdf0e10cSrcweir 		ShowCursor( sal_True );
3706*cdf0e10cSrcweir }
3707*cdf0e10cSrcweir 
3708*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::EditEntry( SvxIconChoiceCtrlEntry* pEntry )
3709*cdf0e10cSrcweir {
3710*cdf0e10cSrcweir 	DBG_ASSERT(pEntry,"EditEntry: Entry not set");
3711*cdf0e10cSrcweir 	if( !pEntry )
3712*cdf0e10cSrcweir 		return;
3713*cdf0e10cSrcweir 
3714*cdf0e10cSrcweir 	StopEntryEditing( sal_True );
3715*cdf0e10cSrcweir 	DELETEZ(pEdit);
3716*cdf0e10cSrcweir 	SetNoSelection();
3717*cdf0e10cSrcweir 
3718*cdf0e10cSrcweir 	pCurEditedEntry = pEntry;
3719*cdf0e10cSrcweir 	String aEntryText( pView->GetEntryText( pEntry, sal_True ) );
3720*cdf0e10cSrcweir 	Rectangle aRect( CalcTextRect( pEntry, 0, sal_True, &aEntryText ) );
3721*cdf0e10cSrcweir 	MakeVisible( aRect );
3722*cdf0e10cSrcweir 	Point aPos( aRect.TopLeft() );
3723*cdf0e10cSrcweir 	aPos = pView->GetPixelPos( aPos );
3724*cdf0e10cSrcweir 	aRect.SetPos( aPos );
3725*cdf0e10cSrcweir 	pView->HideFocus();
3726*cdf0e10cSrcweir 	pEdit = new IcnViewEdit_Impl(
3727*cdf0e10cSrcweir 		pView,
3728*cdf0e10cSrcweir 		aRect.TopLeft(),
3729*cdf0e10cSrcweir 		aRect.GetSize(),
3730*cdf0e10cSrcweir 		aEntryText,
3731*cdf0e10cSrcweir 		LINK( this, SvxIconChoiceCtrl_Impl, TextEditEndedHdl ) );
3732*cdf0e10cSrcweir }
3733*cdf0e10cSrcweir 
3734*cdf0e10cSrcweir IMPL_LINK( SvxIconChoiceCtrl_Impl, TextEditEndedHdl, IcnViewEdit_Impl*, EMPTYARG )
3735*cdf0e10cSrcweir {
3736*cdf0e10cSrcweir 	DBG_ASSERT(pEdit,"TextEditEnded: pEdit not set");
3737*cdf0e10cSrcweir 	if( !pEdit )
3738*cdf0e10cSrcweir 	{
3739*cdf0e10cSrcweir 		pCurEditedEntry = 0;
3740*cdf0e10cSrcweir 		return 0;
3741*cdf0e10cSrcweir 	}
3742*cdf0e10cSrcweir 	DBG_ASSERT(pCurEditedEntry,"TextEditEnded: pCurEditedEntry not set");
3743*cdf0e10cSrcweir 
3744*cdf0e10cSrcweir 	if( !pCurEditedEntry )
3745*cdf0e10cSrcweir 	{
3746*cdf0e10cSrcweir 		pEdit->Hide();
3747*cdf0e10cSrcweir 		if( pEdit->IsGrabFocus() )
3748*cdf0e10cSrcweir 			pView->GrabFocus();
3749*cdf0e10cSrcweir 		return 0;
3750*cdf0e10cSrcweir 	}
3751*cdf0e10cSrcweir 
3752*cdf0e10cSrcweir 	String aText;
3753*cdf0e10cSrcweir 	if ( !pEdit->EditingCanceled() )
3754*cdf0e10cSrcweir 		aText = pEdit->GetText();
3755*cdf0e10cSrcweir 	else
3756*cdf0e10cSrcweir 		aText = pEdit->GetSavedValue();
3757*cdf0e10cSrcweir 
3758*cdf0e10cSrcweir 	if( pView->EditedEntry( pCurEditedEntry, aText, pEdit->EditingCanceled() ) )
3759*cdf0e10cSrcweir 		InvalidateEntry( pCurEditedEntry );
3760*cdf0e10cSrcweir 	if( !GetSelectionCount() )
3761*cdf0e10cSrcweir 		SelectEntry( pCurEditedEntry, sal_True );
3762*cdf0e10cSrcweir 
3763*cdf0e10cSrcweir 	pEdit->Hide();
3764*cdf0e10cSrcweir 	if( pEdit->IsGrabFocus() )
3765*cdf0e10cSrcweir 		pView->GrabFocus();
3766*cdf0e10cSrcweir 	// Das Edit kann nicht hier geloescht werden, weil es noch in einem
3767*cdf0e10cSrcweir 	// Handler steht. Es wird im Dtor oder im naechsten EditEntry geloescht.
3768*cdf0e10cSrcweir 	pCurEditedEntry = 0;
3769*cdf0e10cSrcweir 	return 0;
3770*cdf0e10cSrcweir }
3771*cdf0e10cSrcweir 
3772*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::StopEntryEditing( sal_Bool bCancel )
3773*cdf0e10cSrcweir {
3774*cdf0e10cSrcweir 	if( pEdit )
3775*cdf0e10cSrcweir 		pEdit->StopEditing( bCancel );
3776*cdf0e10cSrcweir }
3777*cdf0e10cSrcweir 
3778*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::LockEntryPos( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bLock )
3779*cdf0e10cSrcweir {
3780*cdf0e10cSrcweir 	if( bLock )
3781*cdf0e10cSrcweir 		pEntry->SetFlags( ICNVIEW_FLAG_POS_LOCKED );
3782*cdf0e10cSrcweir 	else
3783*cdf0e10cSrcweir 		pEntry->ClearFlags( ICNVIEW_FLAG_POS_LOCKED );
3784*cdf0e10cSrcweir }
3785*cdf0e10cSrcweir 
3786*cdf0e10cSrcweir SvxIconChoiceCtrlEntry* SvxIconChoiceCtrl_Impl::GetFirstSelectedEntry( sal_uLong& rPos ) const
3787*cdf0e10cSrcweir {
3788*cdf0e10cSrcweir 	if( !GetSelectionCount() )
3789*cdf0e10cSrcweir 		return 0;
3790*cdf0e10cSrcweir 
3791*cdf0e10cSrcweir 	if( (nWinBits & WB_HIGHLIGHTFRAME) && (eSelectionMode == NO_SELECTION) )
3792*cdf0e10cSrcweir 	{
3793*cdf0e10cSrcweir 		rPos = pView->GetEntryListPos( pCurHighlightFrame );
3794*cdf0e10cSrcweir 		return pCurHighlightFrame;
3795*cdf0e10cSrcweir 	}
3796*cdf0e10cSrcweir 
3797*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
3798*cdf0e10cSrcweir 	if( !pHead )
3799*cdf0e10cSrcweir 	{
3800*cdf0e10cSrcweir 		for( sal_uLong nCur = 0; nCur < nCount; nCur++ )
3801*cdf0e10cSrcweir 		{
3802*cdf0e10cSrcweir 			SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nCur );
3803*cdf0e10cSrcweir 			if( pEntry->IsSelected() )
3804*cdf0e10cSrcweir 			{
3805*cdf0e10cSrcweir 				rPos = nCur;
3806*cdf0e10cSrcweir 				return pEntry;
3807*cdf0e10cSrcweir 			}
3808*cdf0e10cSrcweir 		}
3809*cdf0e10cSrcweir 	}
3810*cdf0e10cSrcweir 	else
3811*cdf0e10cSrcweir 	{
3812*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pEntry = pHead;
3813*cdf0e10cSrcweir 		while( nCount-- )
3814*cdf0e10cSrcweir 		{
3815*cdf0e10cSrcweir 			if( pEntry->IsSelected() )
3816*cdf0e10cSrcweir 			{
3817*cdf0e10cSrcweir 				rPos = GetEntryListPos( pEntry );
3818*cdf0e10cSrcweir 				return pEntry;
3819*cdf0e10cSrcweir 			}
3820*cdf0e10cSrcweir 			pEntry = pEntry->pflink;
3821*cdf0e10cSrcweir 			if( nCount && pEntry == pHead )
3822*cdf0e10cSrcweir 			{
3823*cdf0e10cSrcweir 				DBG_ERROR("SvxIconChoiceCtrl_Impl::GetFirstSelectedEntry > Endlosschleife!");
3824*cdf0e10cSrcweir 				return 0;
3825*cdf0e10cSrcweir 			}
3826*cdf0e10cSrcweir 		}
3827*cdf0e10cSrcweir 	}
3828*cdf0e10cSrcweir 	return 0;
3829*cdf0e10cSrcweir }
3830*cdf0e10cSrcweir 
3831*cdf0e10cSrcweir // kein Round Robin!
3832*cdf0e10cSrcweir SvxIconChoiceCtrlEntry* SvxIconChoiceCtrl_Impl::GetNextSelectedEntry( sal_uLong& rStartPos ) const
3833*cdf0e10cSrcweir {
3834*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
3835*cdf0e10cSrcweir 	if( rStartPos > nCount || !GetSelectionCount() )
3836*cdf0e10cSrcweir 		return 0;
3837*cdf0e10cSrcweir 	if( !pHead )
3838*cdf0e10cSrcweir 	{
3839*cdf0e10cSrcweir 		for( sal_uLong nCur = rStartPos+1; nCur < nCount; nCur++ )
3840*cdf0e10cSrcweir 		{
3841*cdf0e10cSrcweir 			SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nCur );
3842*cdf0e10cSrcweir 			if( pEntry->IsSelected() )
3843*cdf0e10cSrcweir 			{
3844*cdf0e10cSrcweir 				rStartPos = nCur;
3845*cdf0e10cSrcweir 				return pEntry;
3846*cdf0e10cSrcweir 			}
3847*cdf0e10cSrcweir 		}
3848*cdf0e10cSrcweir 	}
3849*cdf0e10cSrcweir 	else
3850*cdf0e10cSrcweir 	{
3851*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( rStartPos );
3852*cdf0e10cSrcweir 		pEntry = pEntry->pflink;
3853*cdf0e10cSrcweir 		while( pEntry != pHead )
3854*cdf0e10cSrcweir 		{
3855*cdf0e10cSrcweir 			if( pEntry->IsSelected() )
3856*cdf0e10cSrcweir 			{
3857*cdf0e10cSrcweir 				rStartPos = GetEntryListPos( pEntry );
3858*cdf0e10cSrcweir 				return pEntry;
3859*cdf0e10cSrcweir 			}
3860*cdf0e10cSrcweir 			pEntry = pEntry->pflink;
3861*cdf0e10cSrcweir 		}
3862*cdf0e10cSrcweir 	}
3863*cdf0e10cSrcweir 
3864*cdf0e10cSrcweir 	rStartPos = 0xffffffff;
3865*cdf0e10cSrcweir 	return 0;
3866*cdf0e10cSrcweir }
3867*cdf0e10cSrcweir 
3868*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SelectAll( sal_Bool bSelect, sal_Bool bPaint )
3869*cdf0e10cSrcweir {
3870*cdf0e10cSrcweir 	bPaint = sal_True;
3871*cdf0e10cSrcweir 
3872*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
3873*cdf0e10cSrcweir 	for( sal_uLong nCur = 0; nCur < nCount && (bSelect || GetSelectionCount() ); nCur++ )
3874*cdf0e10cSrcweir 	{
3875*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nCur );
3876*cdf0e10cSrcweir 		SelectEntry( pEntry, bSelect, sal_True, sal_True, bPaint );
3877*cdf0e10cSrcweir 	}
3878*cdf0e10cSrcweir 	nFlags &= (~F_ADD_MODE);
3879*cdf0e10cSrcweir 	pAnchor = 0;
3880*cdf0e10cSrcweir }
3881*cdf0e10cSrcweir 
3882*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SaveSelection( List** ppList )
3883*cdf0e10cSrcweir {
3884*cdf0e10cSrcweir 	if( !*ppList )
3885*cdf0e10cSrcweir 		*ppList = new List;
3886*cdf0e10cSrcweir 	sal_uLong nPos;
3887*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pEntry = GetFirstSelectedEntry( nPos );
3888*cdf0e10cSrcweir 	while( pEntry && GetSelectionCount() != (*ppList)->Count() )
3889*cdf0e10cSrcweir 	{
3890*cdf0e10cSrcweir 		(*ppList)->Insert( pEntry, LIST_APPEND );
3891*cdf0e10cSrcweir 		pEntry = GetNextSelectedEntry( nPos );
3892*cdf0e10cSrcweir 	}
3893*cdf0e10cSrcweir }
3894*cdf0e10cSrcweir 
3895*cdf0e10cSrcweir IcnViewEdit_Impl::IcnViewEdit_Impl( SvtIconChoiceCtrl* pParent, const Point& rPos,
3896*cdf0e10cSrcweir 	const Size& rSize, const XubString& rData, const Link& rNotifyEditEnd ) :
3897*cdf0e10cSrcweir 	MultiLineEdit( pParent, (pParent->GetStyle() & WB_ICON) ? WB_CENTER : WB_LEFT),
3898*cdf0e10cSrcweir 	aCallBackHdl( rNotifyEditEnd ),
3899*cdf0e10cSrcweir 	bCanceled( sal_False ),
3900*cdf0e10cSrcweir 	bAlreadyInCallback( sal_False ),
3901*cdf0e10cSrcweir 	bGrabFocus( sal_False )
3902*cdf0e10cSrcweir {
3903*cdf0e10cSrcweir 	Font aFont( pParent->GetPointFont() );
3904*cdf0e10cSrcweir 	aFont.SetTransparent( sal_False );
3905*cdf0e10cSrcweir 	SetControlFont( aFont );
3906*cdf0e10cSrcweir 	if( !pParent->HasFontFillColor() )
3907*cdf0e10cSrcweir 	{
3908*cdf0e10cSrcweir 		Color aColor( pParent->GetBackground().GetColor() );
3909*cdf0e10cSrcweir 		SetControlBackground( aColor );
3910*cdf0e10cSrcweir 	}
3911*cdf0e10cSrcweir 	else
3912*cdf0e10cSrcweir 		SetControlBackground( aFont.GetFillColor() );
3913*cdf0e10cSrcweir 	SetControlForeground( aFont.GetColor() );
3914*cdf0e10cSrcweir 	SetPosPixel( rPos );
3915*cdf0e10cSrcweir 	SetSizePixel( CalcAdjustedSize(rSize) );
3916*cdf0e10cSrcweir 	SetText( rData );
3917*cdf0e10cSrcweir 	SaveValue();
3918*cdf0e10cSrcweir 
3919*cdf0e10cSrcweir 	aAccReturn.InsertItem( IMPICNVIEW_ACC_RETURN, KeyCode(KEY_RETURN) );
3920*cdf0e10cSrcweir 	aAccEscape.InsertItem( IMPICNVIEW_ACC_ESCAPE, KeyCode(KEY_ESCAPE) );
3921*cdf0e10cSrcweir 
3922*cdf0e10cSrcweir 	aAccReturn.SetActivateHdl( LINK( this, IcnViewEdit_Impl, ReturnHdl_Impl) );
3923*cdf0e10cSrcweir 	aAccEscape.SetActivateHdl( LINK( this, IcnViewEdit_Impl, EscapeHdl_Impl) );
3924*cdf0e10cSrcweir 	GetpApp()->InsertAccel( &aAccReturn);//, ACCEL_ALWAYS );
3925*cdf0e10cSrcweir 	GetpApp()->InsertAccel( &aAccEscape);//, ACCEL_ALWAYS );
3926*cdf0e10cSrcweir 	Show();
3927*cdf0e10cSrcweir 	GrabFocus();
3928*cdf0e10cSrcweir }
3929*cdf0e10cSrcweir 
3930*cdf0e10cSrcweir IcnViewEdit_Impl::~IcnViewEdit_Impl()
3931*cdf0e10cSrcweir {
3932*cdf0e10cSrcweir 	if( !bAlreadyInCallback )
3933*cdf0e10cSrcweir 	{
3934*cdf0e10cSrcweir 		GetpApp()->RemoveAccel( &aAccReturn );
3935*cdf0e10cSrcweir 		GetpApp()->RemoveAccel( &aAccEscape );
3936*cdf0e10cSrcweir 	}
3937*cdf0e10cSrcweir }
3938*cdf0e10cSrcweir 
3939*cdf0e10cSrcweir void IcnViewEdit_Impl::CallCallBackHdl_Impl()
3940*cdf0e10cSrcweir {
3941*cdf0e10cSrcweir 	aTimer.Stop();
3942*cdf0e10cSrcweir 	if ( !bAlreadyInCallback )
3943*cdf0e10cSrcweir 	{
3944*cdf0e10cSrcweir 		bAlreadyInCallback = sal_True;
3945*cdf0e10cSrcweir 		GetpApp()->RemoveAccel( &aAccReturn );
3946*cdf0e10cSrcweir 		GetpApp()->RemoveAccel( &aAccEscape );
3947*cdf0e10cSrcweir 		Hide();
3948*cdf0e10cSrcweir 		aCallBackHdl.Call( this );
3949*cdf0e10cSrcweir 	}
3950*cdf0e10cSrcweir }
3951*cdf0e10cSrcweir 
3952*cdf0e10cSrcweir IMPL_LINK( IcnViewEdit_Impl, Timeout_Impl, Timer*, EMPTYARG )
3953*cdf0e10cSrcweir {
3954*cdf0e10cSrcweir 	CallCallBackHdl_Impl();
3955*cdf0e10cSrcweir 	return 0;
3956*cdf0e10cSrcweir }
3957*cdf0e10cSrcweir 
3958*cdf0e10cSrcweir IMPL_LINK( IcnViewEdit_Impl, ReturnHdl_Impl, Accelerator*, EMPTYARG  )
3959*cdf0e10cSrcweir {
3960*cdf0e10cSrcweir 	bCanceled = sal_False;
3961*cdf0e10cSrcweir 	bGrabFocus = sal_True;
3962*cdf0e10cSrcweir 	CallCallBackHdl_Impl();
3963*cdf0e10cSrcweir 	return 1;
3964*cdf0e10cSrcweir }
3965*cdf0e10cSrcweir 
3966*cdf0e10cSrcweir IMPL_LINK( IcnViewEdit_Impl, EscapeHdl_Impl, Accelerator*, EMPTYARG  )
3967*cdf0e10cSrcweir {
3968*cdf0e10cSrcweir 	bCanceled = sal_True;
3969*cdf0e10cSrcweir 	bGrabFocus = sal_True;
3970*cdf0e10cSrcweir 	CallCallBackHdl_Impl();
3971*cdf0e10cSrcweir 	return 1;
3972*cdf0e10cSrcweir }
3973*cdf0e10cSrcweir 
3974*cdf0e10cSrcweir void IcnViewEdit_Impl::KeyInput( const KeyEvent& rKEvt )
3975*cdf0e10cSrcweir {
3976*cdf0e10cSrcweir 	KeyCode aCode = rKEvt.GetKeyCode();
3977*cdf0e10cSrcweir 	sal_uInt16 nCode = aCode.GetCode();
3978*cdf0e10cSrcweir 
3979*cdf0e10cSrcweir 	switch ( nCode )
3980*cdf0e10cSrcweir 	{
3981*cdf0e10cSrcweir 		case KEY_ESCAPE:
3982*cdf0e10cSrcweir 			bCanceled = sal_True;
3983*cdf0e10cSrcweir 			bGrabFocus = sal_True;
3984*cdf0e10cSrcweir 			CallCallBackHdl_Impl();
3985*cdf0e10cSrcweir 			break;
3986*cdf0e10cSrcweir 
3987*cdf0e10cSrcweir 		case KEY_RETURN:
3988*cdf0e10cSrcweir 			bCanceled = sal_False;
3989*cdf0e10cSrcweir 			bGrabFocus = sal_True;
3990*cdf0e10cSrcweir 			CallCallBackHdl_Impl();
3991*cdf0e10cSrcweir 			break;
3992*cdf0e10cSrcweir 
3993*cdf0e10cSrcweir 		default:
3994*cdf0e10cSrcweir 			MultiLineEdit::KeyInput( rKEvt );
3995*cdf0e10cSrcweir 	}
3996*cdf0e10cSrcweir }
3997*cdf0e10cSrcweir 
3998*cdf0e10cSrcweir long IcnViewEdit_Impl::PreNotify( NotifyEvent& rNEvt )
3999*cdf0e10cSrcweir {
4000*cdf0e10cSrcweir 	if( rNEvt.GetType() == EVENT_LOSEFOCUS )
4001*cdf0e10cSrcweir 	{
4002*cdf0e10cSrcweir 		if ( !bAlreadyInCallback &&
4003*cdf0e10cSrcweir 			((!Application::GetFocusWindow()) || !IsChild(Application::GetFocusWindow())))
4004*cdf0e10cSrcweir 		{
4005*cdf0e10cSrcweir 			bCanceled = sal_False;
4006*cdf0e10cSrcweir 			aTimer.SetTimeout(10);
4007*cdf0e10cSrcweir 			aTimer.SetTimeoutHdl(LINK(this,IcnViewEdit_Impl,Timeout_Impl));
4008*cdf0e10cSrcweir 			aTimer.Start();
4009*cdf0e10cSrcweir 		}
4010*cdf0e10cSrcweir 	}
4011*cdf0e10cSrcweir 	return 0;
4012*cdf0e10cSrcweir }
4013*cdf0e10cSrcweir 
4014*cdf0e10cSrcweir void IcnViewEdit_Impl::StopEditing( sal_Bool bCancel )
4015*cdf0e10cSrcweir {
4016*cdf0e10cSrcweir 	if ( !bAlreadyInCallback )
4017*cdf0e10cSrcweir 	{
4018*cdf0e10cSrcweir 		bCanceled = bCancel;
4019*cdf0e10cSrcweir 		CallCallBackHdl_Impl();
4020*cdf0e10cSrcweir 	}
4021*cdf0e10cSrcweir }
4022*cdf0e10cSrcweir 
4023*cdf0e10cSrcweir sal_uLong SvxIconChoiceCtrl_Impl::GetEntryListPos( SvxIconChoiceCtrlEntry* pEntry ) const
4024*cdf0e10cSrcweir {
4025*cdf0e10cSrcweir 	if( !(nFlags & F_ENTRYLISTPOS_VALID ))
4026*cdf0e10cSrcweir 		((SvxIconChoiceCtrl_Impl*)this)->SetListPositions();
4027*cdf0e10cSrcweir 	return pEntry->nPos;
4028*cdf0e10cSrcweir }
4029*cdf0e10cSrcweir 
4030*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetEntryListPos( SvxIconChoiceCtrlEntry* pListEntry, sal_uLong nNewPos )
4031*cdf0e10cSrcweir {
4032*cdf0e10cSrcweir 	sal_uLong nCurPos = GetEntryListPos( pListEntry );
4033*cdf0e10cSrcweir 	if( nCurPos == nNewPos )
4034*cdf0e10cSrcweir 		return;
4035*cdf0e10cSrcweir 	aEntries.List::Remove( nCurPos );
4036*cdf0e10cSrcweir 	aEntries.List::Insert( (void*)pListEntry, nNewPos );
4037*cdf0e10cSrcweir 	// Eintragspositionen anpassen
4038*cdf0e10cSrcweir 	sal_uLong nStart, nEnd;
4039*cdf0e10cSrcweir 	if( nNewPos < nCurPos )
4040*cdf0e10cSrcweir 	{
4041*cdf0e10cSrcweir 		nStart = nNewPos;
4042*cdf0e10cSrcweir 		nEnd = nCurPos;
4043*cdf0e10cSrcweir 	}
4044*cdf0e10cSrcweir 	else
4045*cdf0e10cSrcweir 	{
4046*cdf0e10cSrcweir 		nStart = nCurPos;
4047*cdf0e10cSrcweir 		nEnd = nNewPos;
4048*cdf0e10cSrcweir 	}
4049*cdf0e10cSrcweir 	for( ; nStart <= nEnd; nStart++ )
4050*cdf0e10cSrcweir 	{
4051*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nStart );
4052*cdf0e10cSrcweir 		pEntry->nPos = nStart;
4053*cdf0e10cSrcweir 	}
4054*cdf0e10cSrcweir }
4055*cdf0e10cSrcweir 
4056*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetEntryFlags( SvxIconChoiceCtrlEntry* pEntry, sal_uInt16 nEntryFlags )
4057*cdf0e10cSrcweir {
4058*cdf0e10cSrcweir 	pEntry->nFlags = nEntryFlags;
4059*cdf0e10cSrcweir 	if( nEntryFlags & ICNVIEW_FLAG_POS_MOVED )
4060*cdf0e10cSrcweir 		nFlags |= F_MOVED_ENTRIES;
4061*cdf0e10cSrcweir }
4062*cdf0e10cSrcweir 
4063*cdf0e10cSrcweir SvxIconChoiceCtrlEntry* SvxIconChoiceCtrl_Impl::GoLeftRight( SvxIconChoiceCtrlEntry* pStart, sal_Bool bRight )
4064*cdf0e10cSrcweir {
4065*cdf0e10cSrcweir 	return pImpCursor->GoLeftRight( pStart, bRight );
4066*cdf0e10cSrcweir }
4067*cdf0e10cSrcweir 
4068*cdf0e10cSrcweir SvxIconChoiceCtrlEntry* SvxIconChoiceCtrl_Impl::GoUpDown( SvxIconChoiceCtrlEntry* pStart, sal_Bool bDown )
4069*cdf0e10cSrcweir {
4070*cdf0e10cSrcweir 	return pImpCursor->GoUpDown( pStart, bDown );
4071*cdf0e10cSrcweir }
4072*cdf0e10cSrcweir 
4073*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::InitSettings()
4074*cdf0e10cSrcweir {
4075*cdf0e10cSrcweir 	const StyleSettings& rStyleSettings = pView->GetSettings().GetStyleSettings();
4076*cdf0e10cSrcweir 
4077*cdf0e10cSrcweir 	if( !pView->HasFont() )
4078*cdf0e10cSrcweir 	{
4079*cdf0e10cSrcweir 		// Unit aus den Settings ist Point
4080*cdf0e10cSrcweir 		Font aFont( rStyleSettings.GetFieldFont() );
4081*cdf0e10cSrcweir 		//const Font& rFont = pView->GetFont();
4082*cdf0e10cSrcweir 		//if( pView->HasFontTextColor() )
4083*cdf0e10cSrcweir 			aFont.SetColor( rStyleSettings.GetWindowTextColor() );
4084*cdf0e10cSrcweir 		//if( pView->HasFontFillColor() )
4085*cdf0e10cSrcweir 			//aFont.SetFillColor( rFont.GetFillColor() );
4086*cdf0e10cSrcweir 		pView->SetPointFont( aFont );
4087*cdf0e10cSrcweir 		SetDefaultTextSize();
4088*cdf0e10cSrcweir 	}
4089*cdf0e10cSrcweir 
4090*cdf0e10cSrcweir 	//if( !pView->HasFontTextColor() )
4091*cdf0e10cSrcweir 		pView->SetTextColor( rStyleSettings.GetFieldTextColor() );
4092*cdf0e10cSrcweir 	//if( !pView->HasFontFillColor() )
4093*cdf0e10cSrcweir 		pView->SetTextFillColor();
4094*cdf0e10cSrcweir 
4095*cdf0e10cSrcweir 	//if( !pView->HasBackground() )
4096*cdf0e10cSrcweir 		pView->SetBackground( rStyleSettings.GetFieldColor());
4097*cdf0e10cSrcweir 
4098*cdf0e10cSrcweir 	long nScrBarSize = rStyleSettings.GetScrollBarSize();
4099*cdf0e10cSrcweir 	if( nScrBarSize != nHorSBarHeight || nScrBarSize != nVerSBarWidth )
4100*cdf0e10cSrcweir 	{
4101*cdf0e10cSrcweir 		nHorSBarHeight = nScrBarSize;
4102*cdf0e10cSrcweir 		Size aSize( aHorSBar.GetSizePixel() );
4103*cdf0e10cSrcweir 		aSize.Height() = nScrBarSize;
4104*cdf0e10cSrcweir 		aHorSBar.Hide();
4105*cdf0e10cSrcweir 		aHorSBar.SetSizePixel( aSize );
4106*cdf0e10cSrcweir 
4107*cdf0e10cSrcweir 		nVerSBarWidth = nScrBarSize;
4108*cdf0e10cSrcweir 		aSize = aVerSBar.GetSizePixel();
4109*cdf0e10cSrcweir 		aSize.Width() = nScrBarSize;
4110*cdf0e10cSrcweir 		aVerSBar.Hide();
4111*cdf0e10cSrcweir 		aVerSBar.SetSizePixel( aSize );
4112*cdf0e10cSrcweir 
4113*cdf0e10cSrcweir 		Size aOSize( pView->Control::GetOutputSizePixel() );
4114*cdf0e10cSrcweir 		PositionScrollBars( aOSize.Width(), aOSize.Height() );
4115*cdf0e10cSrcweir 		AdjustScrollBars();
4116*cdf0e10cSrcweir 	}
4117*cdf0e10cSrcweir }
4118*cdf0e10cSrcweir 
4119*cdf0e10cSrcweir EntryList_Impl::EntryList_Impl( SvxIconChoiceCtrl_Impl* pOwner, sal_uInt16 _nInitSize , sal_uInt16 _nReSize ) :
4120*cdf0e10cSrcweir 	List( _nInitSize, _nReSize ),
4121*cdf0e10cSrcweir 	_pOwner( pOwner )
4122*cdf0e10cSrcweir {
4123*cdf0e10cSrcweir 	_pOwner->pHead = 0;
4124*cdf0e10cSrcweir }
4125*cdf0e10cSrcweir 
4126*cdf0e10cSrcweir EntryList_Impl::EntryList_Impl( SvxIconChoiceCtrl_Impl* pOwner, sal_uInt16 _nBlockSize, sal_uInt16 _nInitSize, sal_uInt16 _nReSize ) :
4127*cdf0e10cSrcweir 	List( _nBlockSize, _nInitSize, _nReSize ),
4128*cdf0e10cSrcweir 	_pOwner( pOwner )
4129*cdf0e10cSrcweir {
4130*cdf0e10cSrcweir 	_pOwner->pHead = 0;
4131*cdf0e10cSrcweir }
4132*cdf0e10cSrcweir 
4133*cdf0e10cSrcweir EntryList_Impl::~EntryList_Impl()
4134*cdf0e10cSrcweir {
4135*cdf0e10cSrcweir 	_pOwner->pHead = 0;
4136*cdf0e10cSrcweir }
4137*cdf0e10cSrcweir 
4138*cdf0e10cSrcweir void EntryList_Impl::Clear()
4139*cdf0e10cSrcweir {
4140*cdf0e10cSrcweir 	_pOwner->pHead = 0;
4141*cdf0e10cSrcweir 	List::Clear();
4142*cdf0e10cSrcweir }
4143*cdf0e10cSrcweir 
4144*cdf0e10cSrcweir void EntryList_Impl::Insert( SvxIconChoiceCtrlEntry* pEntry, sal_uLong nPos )
4145*cdf0e10cSrcweir {
4146*cdf0e10cSrcweir 	List::Insert( pEntry, nPos );
4147*cdf0e10cSrcweir 	if( _pOwner->pHead )
4148*cdf0e10cSrcweir 		pEntry->SetBacklink( _pOwner->pHead->pblink );
4149*cdf0e10cSrcweir }
4150*cdf0e10cSrcweir 
4151*cdf0e10cSrcweir SvxIconChoiceCtrlEntry* EntryList_Impl::Remove( sal_uLong nPos )
4152*cdf0e10cSrcweir {
4153*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)List::Remove( nPos );
4154*cdf0e10cSrcweir 	DBG_ASSERT(pEntry,"EntryList_Impl::Remove > Entry not found");
4155*cdf0e10cSrcweir 	Removed_Impl( pEntry );
4156*cdf0e10cSrcweir 	return pEntry;
4157*cdf0e10cSrcweir }
4158*cdf0e10cSrcweir 
4159*cdf0e10cSrcweir void EntryList_Impl::Remove( SvxIconChoiceCtrlEntry* pEntry )
4160*cdf0e10cSrcweir {
4161*cdf0e10cSrcweir 	List::Remove( (void*)pEntry );
4162*cdf0e10cSrcweir 	Removed_Impl( pEntry );
4163*cdf0e10cSrcweir }
4164*cdf0e10cSrcweir 
4165*cdf0e10cSrcweir void EntryList_Impl::Removed_Impl( SvxIconChoiceCtrlEntry* pEntry )
4166*cdf0e10cSrcweir {
4167*cdf0e10cSrcweir 	if( _pOwner->pHead )
4168*cdf0e10cSrcweir 	{
4169*cdf0e10cSrcweir 		if( _pOwner->pHead == pEntry )
4170*cdf0e10cSrcweir 		{
4171*cdf0e10cSrcweir 			if( _pOwner->pHead != pEntry->pflink )
4172*cdf0e10cSrcweir 				_pOwner->pHead = pEntry->pflink;
4173*cdf0e10cSrcweir 			else
4174*cdf0e10cSrcweir 			{
4175*cdf0e10cSrcweir 				DBG_ASSERT(!Count(),"EntryList_Impl::Remove > Invalid predecessor" );
4176*cdf0e10cSrcweir 				_pOwner->pHead = 0;
4177*cdf0e10cSrcweir 			}
4178*cdf0e10cSrcweir 		}
4179*cdf0e10cSrcweir 		pEntry->Unlink();
4180*cdf0e10cSrcweir 	}
4181*cdf0e10cSrcweir }
4182*cdf0e10cSrcweir 
4183*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetPositionMode( SvxIconChoiceCtrlPositionMode eMode )
4184*cdf0e10cSrcweir {
4185*cdf0e10cSrcweir 	sal_uLong nCur;
4186*cdf0e10cSrcweir 
4187*cdf0e10cSrcweir 	if( eMode == ePositionMode )
4188*cdf0e10cSrcweir 		return;
4189*cdf0e10cSrcweir 
4190*cdf0e10cSrcweir 	SvxIconChoiceCtrlPositionMode eOldMode = ePositionMode;
4191*cdf0e10cSrcweir 	ePositionMode = eMode;
4192*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
4193*cdf0e10cSrcweir 
4194*cdf0e10cSrcweir 	if( eOldMode == IcnViewPositionModeAutoArrange )
4195*cdf0e10cSrcweir 	{
4196*cdf0e10cSrcweir 		// positionieren wir verschobene Eintraege 'hart' gibts noch Probleme
4197*cdf0e10cSrcweir 		// mit ungewollten Ueberlappungen, da diese Eintrage im Arrange
4198*cdf0e10cSrcweir 		// nicht beruecksichtigt werden.
4199*cdf0e10cSrcweir #if 1
4200*cdf0e10cSrcweir 		if( aEntries.Count() )
4201*cdf0e10cSrcweir 			aAutoArrangeTimer.Start();
4202*cdf0e10cSrcweir #else
4203*cdf0e10cSrcweir 		if( pHead )
4204*cdf0e10cSrcweir 		{
4205*cdf0e10cSrcweir 			// verschobene Eintraege 'hart' auf ihre Position setzen
4206*cdf0e10cSrcweir 			nCur = nCount;
4207*cdf0e10cSrcweir 			SvxIconChoiceCtrlEntry* pEntry = pHead;
4208*cdf0e10cSrcweir 			while( nCur )
4209*cdf0e10cSrcweir 			{
4210*cdf0e10cSrcweir 				SvxIconChoiceCtrlEntry* pPred;
4211*cdf0e10cSrcweir 				if( GetEntryPredecessor( pEntry, &pPred ))
4212*cdf0e10cSrcweir 					SetEntryFlags( pEntry, ICNVIEW_FLAG_POS_MOVED );
4213*cdf0e10cSrcweir 				pEntry = pEntry->pflink;
4214*cdf0e10cSrcweir 				nCur--;
4215*cdf0e10cSrcweir 			}
4216*cdf0e10cSrcweir 			ClearPredecessors();
4217*cdf0e10cSrcweir 		}
4218*cdf0e10cSrcweir #endif
4219*cdf0e10cSrcweir 		return;
4220*cdf0e10cSrcweir 	}
4221*cdf0e10cSrcweir 
4222*cdf0e10cSrcweir 	if( ePositionMode == IcnViewPositionModeAutoArrange )
4223*cdf0e10cSrcweir 	{
4224*cdf0e10cSrcweir 		List aMovedEntries;
4225*cdf0e10cSrcweir 		for( nCur = 0; nCur < nCount; nCur++ )
4226*cdf0e10cSrcweir 		{
4227*cdf0e10cSrcweir 			SvxIconChoiceCtrlEntry* pEntry = (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nCur );
4228*cdf0e10cSrcweir 			if( pEntry->GetFlags() & (ICNVIEW_FLAG_POS_LOCKED | ICNVIEW_FLAG_POS_MOVED))
4229*cdf0e10cSrcweir 			{
4230*cdf0e10cSrcweir 				SvxIconChoiceCtrlEntry_Impl* pE = new SvxIconChoiceCtrlEntry_Impl(
4231*cdf0e10cSrcweir 						pEntry, GetEntryBoundRect( pEntry ));
4232*cdf0e10cSrcweir 				aMovedEntries.Insert( pE, LIST_APPEND );
4233*cdf0e10cSrcweir 			}
4234*cdf0e10cSrcweir 		}
4235*cdf0e10cSrcweir 		nCount = aMovedEntries.Count();
4236*cdf0e10cSrcweir 		for( nCur = 0; nCur < nCount; nCur++ )
4237*cdf0e10cSrcweir 		{
4238*cdf0e10cSrcweir 			SvxIconChoiceCtrlEntry_Impl* pE = (SvxIconChoiceCtrlEntry_Impl*)aMovedEntries.GetObject(nCur);
4239*cdf0e10cSrcweir 			SetEntryPos( pE->_pEntry, pE->_aPos );
4240*cdf0e10cSrcweir 		}
4241*cdf0e10cSrcweir 		for( nCur = 0; nCur < nCount; nCur++ )
4242*cdf0e10cSrcweir 			delete (SvxIconChoiceCtrlEntry_Impl*)aMovedEntries.GetObject( nCur );
4243*cdf0e10cSrcweir 		if( aEntries.Count() )
4244*cdf0e10cSrcweir 			aAutoArrangeTimer.Start();
4245*cdf0e10cSrcweir 	}
4246*cdf0e10cSrcweir 	else if( ePositionMode == IcnViewPositionModeAutoAdjust )
4247*cdf0e10cSrcweir 	{
4248*cdf0e10cSrcweir 		AdjustEntryAtGrid( 0 );
4249*cdf0e10cSrcweir 	}
4250*cdf0e10cSrcweir }
4251*cdf0e10cSrcweir 
4252*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetEntryPredecessor( SvxIconChoiceCtrlEntry* pEntry,
4253*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pPredecessor )
4254*cdf0e10cSrcweir {
4255*cdf0e10cSrcweir 	if( !IsAutoArrange() )
4256*cdf0e10cSrcweir 		return;
4257*cdf0e10cSrcweir 
4258*cdf0e10cSrcweir 	if( pEntry == pPredecessor )
4259*cdf0e10cSrcweir 		return;
4260*cdf0e10cSrcweir 
4261*cdf0e10cSrcweir 	sal_uLong nPos1 = GetEntryListPos( pEntry );
4262*cdf0e10cSrcweir 	if( !pHead )
4263*cdf0e10cSrcweir 	{
4264*cdf0e10cSrcweir 		if( pPredecessor )
4265*cdf0e10cSrcweir 		{
4266*cdf0e10cSrcweir 			sal_uLong nPos2 = GetEntryListPos( pPredecessor );
4267*cdf0e10cSrcweir 			if( nPos1 == (nPos2 + 1) )
4268*cdf0e10cSrcweir 				return; // ist schon Vorgaenger
4269*cdf0e10cSrcweir 		}
4270*cdf0e10cSrcweir 		else if( !nPos1 )
4271*cdf0e10cSrcweir 			return;
4272*cdf0e10cSrcweir 	}
4273*cdf0e10cSrcweir 
4274*cdf0e10cSrcweir 	if( !pHead )
4275*cdf0e10cSrcweir 		InitPredecessors();
4276*cdf0e10cSrcweir 
4277*cdf0e10cSrcweir 	if( !pPredecessor && pHead == pEntry )
4278*cdf0e10cSrcweir 		return; // ist schon der Erste
4279*cdf0e10cSrcweir 
4280*cdf0e10cSrcweir 	sal_Bool bSetHead = sal_False;
4281*cdf0e10cSrcweir 	if( !pPredecessor )
4282*cdf0e10cSrcweir 	{
4283*cdf0e10cSrcweir 		bSetHead = sal_True;
4284*cdf0e10cSrcweir 		pPredecessor = pHead->pblink;
4285*cdf0e10cSrcweir 	}
4286*cdf0e10cSrcweir 	if( pEntry == pHead )
4287*cdf0e10cSrcweir 	{
4288*cdf0e10cSrcweir 		pHead = pHead->pflink;
4289*cdf0e10cSrcweir 		bSetHead = sal_False;
4290*cdf0e10cSrcweir 	}
4291*cdf0e10cSrcweir 	if( pEntry != pPredecessor )
4292*cdf0e10cSrcweir 	{
4293*cdf0e10cSrcweir 		pEntry->Unlink();
4294*cdf0e10cSrcweir 		pEntry->SetBacklink( pPredecessor );
4295*cdf0e10cSrcweir 	}
4296*cdf0e10cSrcweir 	if( bSetHead )
4297*cdf0e10cSrcweir 		pHead = pEntry;
4298*cdf0e10cSrcweir 	pEntry->SetFlags( ICNVIEW_FLAG_PRED_SET );
4299*cdf0e10cSrcweir 	aAutoArrangeTimer.Start();
4300*cdf0e10cSrcweir }
4301*cdf0e10cSrcweir 
4302*cdf0e10cSrcweir sal_Bool SvxIconChoiceCtrl_Impl::GetEntryPredecessor( SvxIconChoiceCtrlEntry* pEntry,
4303*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry** ppPredecessor )
4304*cdf0e10cSrcweir {
4305*cdf0e10cSrcweir 	*ppPredecessor = 0;
4306*cdf0e10cSrcweir 	if( !pHead )
4307*cdf0e10cSrcweir 		return sal_False;
4308*cdf0e10cSrcweir 	DBG_ASSERT(pEntry->pblink,"GetEntryPredecessor: Backward link not set");
4309*cdf0e10cSrcweir 	DBG_ASSERT(pEntry->pflink,"GetEntryPredecessor: Forward link not set");
4310*cdf0e10cSrcweir 
4311*cdf0e10cSrcweir 	if( pEntry == pHead )
4312*cdf0e10cSrcweir 	{
4313*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pFirst = (SvxIconChoiceCtrlEntry*)aEntries.GetObject(0);
4314*cdf0e10cSrcweir 		if( pFirst != pEntry )
4315*cdf0e10cSrcweir 			return sal_True;
4316*cdf0e10cSrcweir 		return sal_False;
4317*cdf0e10cSrcweir 	}
4318*cdf0e10cSrcweir 	*ppPredecessor = pEntry->pblink;
4319*cdf0e10cSrcweir 	if( !(pEntry->nFlags & ICNVIEW_FLAG_PRED_SET) &&
4320*cdf0e10cSrcweir 		(GetEntryListPos( *ppPredecessor ) + 1) == GetEntryListPos( pEntry ))
4321*cdf0e10cSrcweir 		return sal_False;
4322*cdf0e10cSrcweir 	return sal_True;
4323*cdf0e10cSrcweir }
4324*cdf0e10cSrcweir 
4325*cdf0e10cSrcweir SvxIconChoiceCtrlEntry*	SvxIconChoiceCtrl_Impl::FindEntryPredecessor( SvxIconChoiceCtrlEntry* pEntry,
4326*cdf0e10cSrcweir 	const Point& rPosTopLeft )
4327*cdf0e10cSrcweir {
4328*cdf0e10cSrcweir 	Point aPos( rPosTopLeft ); //TopLeft
4329*cdf0e10cSrcweir 	Rectangle aCenterRect( CalcBmpRect( pEntry, &aPos ));
4330*cdf0e10cSrcweir 	Point aNewPos( aCenterRect.Center() );
4331*cdf0e10cSrcweir 	sal_uLong nGrid = GetPredecessorGrid( aNewPos );
4332*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
4333*cdf0e10cSrcweir 	if( nGrid == ULONG_MAX )
4334*cdf0e10cSrcweir 		return 0;
4335*cdf0e10cSrcweir 	if( nGrid >= nCount )
4336*cdf0e10cSrcweir 		nGrid = nCount - 1;
4337*cdf0e10cSrcweir 	if( !pHead )
4338*cdf0e10cSrcweir 		return (SvxIconChoiceCtrlEntry*)aEntries.GetObject( nGrid );
4339*cdf0e10cSrcweir 
4340*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pCur = pHead; // Grid 0
4341*cdf0e10cSrcweir 	// todo: Liste von hinten aufrollen wenn nGrid > nCount/2
4342*cdf0e10cSrcweir 	for( sal_uLong nCur = 0; nCur < nGrid; nCur++ )
4343*cdf0e10cSrcweir 		pCur = pCur->pflink;
4344*cdf0e10cSrcweir 
4345*cdf0e10cSrcweir 	return pCur;
4346*cdf0e10cSrcweir }
4347*cdf0e10cSrcweir 
4348*cdf0e10cSrcweir sal_uLong SvxIconChoiceCtrl_Impl::GetPredecessorGrid( const Point& rPos) const
4349*cdf0e10cSrcweir {
4350*cdf0e10cSrcweir 	Point aPos( rPos );
4351*cdf0e10cSrcweir 	aPos.X() -= LROFFS_WINBORDER;
4352*cdf0e10cSrcweir 	aPos.Y() -= TBOFFS_WINBORDER;
4353*cdf0e10cSrcweir 	sal_uInt16 nMaxCol = (sal_uInt16)(aVirtOutputSize.Width() / nGridDX);
4354*cdf0e10cSrcweir 	if( nMaxCol )
4355*cdf0e10cSrcweir 		nMaxCol--;
4356*cdf0e10cSrcweir 	sal_uInt16 nGridX = (sal_uInt16)(aPos.X() / nGridDX);
4357*cdf0e10cSrcweir 	if( nGridX > nMaxCol )
4358*cdf0e10cSrcweir 		nGridX = nMaxCol;
4359*cdf0e10cSrcweir 	sal_uInt16 nGridY = (sal_uInt16)(aPos.Y() / nGridDY);
4360*cdf0e10cSrcweir 	sal_uInt16 nGridsX = (sal_uInt16)(aOutputSize.Width() / nGridDX);
4361*cdf0e10cSrcweir 	sal_uLong nGrid = (nGridY * nGridsX) + nGridX;
4362*cdf0e10cSrcweir 	long nMiddle = (nGridX * nGridDX) + (nGridDX / 2);
4363*cdf0e10cSrcweir 	if( rPos.X() < nMiddle )
4364*cdf0e10cSrcweir 	{
4365*cdf0e10cSrcweir 		if( !nGrid )
4366*cdf0e10cSrcweir 			nGrid = ULONG_MAX;
4367*cdf0e10cSrcweir 		else
4368*cdf0e10cSrcweir 			nGrid--;
4369*cdf0e10cSrcweir 	}
4370*cdf0e10cSrcweir 	return nGrid;
4371*cdf0e10cSrcweir }
4372*cdf0e10cSrcweir 
4373*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::Flush()
4374*cdf0e10cSrcweir {
4375*cdf0e10cSrcweir 	if( aAutoArrangeTimer.IsActive() )
4376*cdf0e10cSrcweir 	{
4377*cdf0e10cSrcweir 		AutoArrangeHdl( 0 );
4378*cdf0e10cSrcweir 	}
4379*cdf0e10cSrcweir }
4380*cdf0e10cSrcweir 
4381*cdf0e10cSrcweir sal_Bool SvxIconChoiceCtrl_Impl::RequestHelp( const HelpEvent& rHEvt )
4382*cdf0e10cSrcweir {
4383*cdf0e10cSrcweir 	if ( !(rHEvt.GetMode() & HELPMODE_QUICK ) )
4384*cdf0e10cSrcweir 		return sal_False;
4385*cdf0e10cSrcweir 
4386*cdf0e10cSrcweir 	Point aPos( pView->ScreenToOutputPixel(rHEvt.GetMousePosPixel() ) );
4387*cdf0e10cSrcweir 	aPos -= pView->GetMapMode().GetOrigin();
4388*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pEntry = GetEntry( aPos, sal_True );
4389*cdf0e10cSrcweir 
4390*cdf0e10cSrcweir 	if ( !pEntry )
4391*cdf0e10cSrcweir 		return sal_False;
4392*cdf0e10cSrcweir 
4393*cdf0e10cSrcweir 	String sQuickHelpText = pEntry->GetQuickHelpText();
4394*cdf0e10cSrcweir 	String aEntryText( pView->GetEntryText( pEntry, sal_False ) );
4395*cdf0e10cSrcweir 	Rectangle aTextRect( CalcTextRect( pEntry, 0, sal_False, &aEntryText ) );
4396*cdf0e10cSrcweir 	if ( ( !aTextRect.IsInside( aPos ) || !aEntryText.Len() ) && !sQuickHelpText.Len() )
4397*cdf0e10cSrcweir 		return sal_False;
4398*cdf0e10cSrcweir 
4399*cdf0e10cSrcweir 	Rectangle aOptTextRect( aTextRect );
4400*cdf0e10cSrcweir 	aOptTextRect.Bottom() = LONG_MAX;
4401*cdf0e10cSrcweir 	sal_uInt16 nNewFlags = nCurTextDrawFlags;
4402*cdf0e10cSrcweir 	nNewFlags &= ~( TEXT_DRAW_CLIP | TEXT_DRAW_ENDELLIPSIS );
4403*cdf0e10cSrcweir 	aOptTextRect = pView->GetTextRect( aOptTextRect, aEntryText, nNewFlags );
4404*cdf0e10cSrcweir 	if ( aOptTextRect != aTextRect || sQuickHelpText.Len() > 0 )
4405*cdf0e10cSrcweir 	{
4406*cdf0e10cSrcweir 		//aTextRect.Right() = aTextRect.Left() + aRealSize.Width() + 4;
4407*cdf0e10cSrcweir 		Point aPt( aOptTextRect.TopLeft() );
4408*cdf0e10cSrcweir 		aPt += pView->GetMapMode().GetOrigin();
4409*cdf0e10cSrcweir 		aPt = pView->OutputToScreenPixel( aPt );
4410*cdf0e10cSrcweir 		// Border der Tiphilfe abziehen
4411*cdf0e10cSrcweir 		aPt.Y() -= 1;
4412*cdf0e10cSrcweir 		aPt.X() -= 3;
4413*cdf0e10cSrcweir 		aOptTextRect.SetPos( aPt );
4414*cdf0e10cSrcweir 		String sHelpText;
4415*cdf0e10cSrcweir 		if ( sQuickHelpText.Len() > 0 )
4416*cdf0e10cSrcweir 			sHelpText = sQuickHelpText;
4417*cdf0e10cSrcweir 		else
4418*cdf0e10cSrcweir 			sHelpText = aEntryText;
4419*cdf0e10cSrcweir 		Help::ShowQuickHelp( (Window*)pView, aOptTextRect, sHelpText, QUICKHELP_LEFT | QUICKHELP_VCENTER );
4420*cdf0e10cSrcweir 	}
4421*cdf0e10cSrcweir 
4422*cdf0e10cSrcweir 	return sal_True;
4423*cdf0e10cSrcweir }
4424*cdf0e10cSrcweir 
4425*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::ClearColumnList()
4426*cdf0e10cSrcweir {
4427*cdf0e10cSrcweir 	if( !pColumns )
4428*cdf0e10cSrcweir 		return;
4429*cdf0e10cSrcweir 
4430*cdf0e10cSrcweir 	const sal_uInt16 nCount = pColumns->Count();
4431*cdf0e10cSrcweir 	for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
4432*cdf0e10cSrcweir 	{
4433*cdf0e10cSrcweir 		SvxIconChoiceCtrlColumnInfo* pInfo = (SvxIconChoiceCtrlColumnInfo*)
4434*cdf0e10cSrcweir 			pColumns->GetObject( nCur );
4435*cdf0e10cSrcweir 		delete pInfo;
4436*cdf0e10cSrcweir 	}
4437*cdf0e10cSrcweir 	DELETEZ(pColumns);
4438*cdf0e10cSrcweir }
4439*cdf0e10cSrcweir 
4440*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetColumn( sal_uInt16 nIndex, const SvxIconChoiceCtrlColumnInfo& rInfo)
4441*cdf0e10cSrcweir {
4442*cdf0e10cSrcweir 	if( !pColumns )
4443*cdf0e10cSrcweir 		pColumns = new SvPtrarr;
4444*cdf0e10cSrcweir 	while( pColumns->Count() < nIndex + 1 )
4445*cdf0e10cSrcweir 		pColumns->Insert( (void*)0, pColumns->Count() );
4446*cdf0e10cSrcweir 
4447*cdf0e10cSrcweir 	SvxIconChoiceCtrlColumnInfo* pInfo =
4448*cdf0e10cSrcweir 		(SvxIconChoiceCtrlColumnInfo*)pColumns->GetObject(nIndex);
4449*cdf0e10cSrcweir 	if( !pInfo )
4450*cdf0e10cSrcweir 	{
4451*cdf0e10cSrcweir 		pInfo = new SvxIconChoiceCtrlColumnInfo( rInfo );
4452*cdf0e10cSrcweir 		pColumns->Insert( (void*)pInfo, nIndex );
4453*cdf0e10cSrcweir 	}
4454*cdf0e10cSrcweir 	else
4455*cdf0e10cSrcweir 	{
4456*cdf0e10cSrcweir 		delete pInfo;
4457*cdf0e10cSrcweir 		pInfo = new SvxIconChoiceCtrlColumnInfo( rInfo );
4458*cdf0e10cSrcweir 		pColumns->Replace( pInfo, nIndex );
4459*cdf0e10cSrcweir 	}
4460*cdf0e10cSrcweir 
4461*cdf0e10cSrcweir 	// HACK(Detail-Modus ist noch nicht vollstaendig implementiert!)
4462*cdf0e10cSrcweir 	// dieses Workaround bringts mit einer Spalte zum Fliegen
4463*cdf0e10cSrcweir 	if( !nIndex && (nWinBits & WB_DETAILS) )
4464*cdf0e10cSrcweir 		nGridDX = pInfo->GetWidth();
4465*cdf0e10cSrcweir 
4466*cdf0e10cSrcweir 	if( GetUpdateMode() )
4467*cdf0e10cSrcweir 		Arrange( IsAutoArrange() );
4468*cdf0e10cSrcweir }
4469*cdf0e10cSrcweir 
4470*cdf0e10cSrcweir const SvxIconChoiceCtrlColumnInfo* SvxIconChoiceCtrl_Impl::GetColumn( sal_uInt16 nIndex ) const
4471*cdf0e10cSrcweir {
4472*cdf0e10cSrcweir 	if( !pColumns || nIndex >= pColumns->Count() )
4473*cdf0e10cSrcweir 		return 0;
4474*cdf0e10cSrcweir 	return (const SvxIconChoiceCtrlColumnInfo*)pColumns->GetObject( nIndex );
4475*cdf0e10cSrcweir }
4476*cdf0e10cSrcweir 
4477*cdf0e10cSrcweir const SvxIconChoiceCtrlColumnInfo* SvxIconChoiceCtrl_Impl::GetItemColumn( sal_uInt16 nSubItem,
4478*cdf0e10cSrcweir 	long& rLeft ) const
4479*cdf0e10cSrcweir {
4480*cdf0e10cSrcweir 	rLeft = 0;
4481*cdf0e10cSrcweir 	if( !pColumns )
4482*cdf0e10cSrcweir 		return 0;
4483*cdf0e10cSrcweir 	const sal_uInt16 nCount = pColumns->Count();
4484*cdf0e10cSrcweir 	const SvxIconChoiceCtrlColumnInfo* pCol = 0;
4485*cdf0e10cSrcweir 	for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
4486*cdf0e10cSrcweir 	{
4487*cdf0e10cSrcweir 		 pCol = (const SvxIconChoiceCtrlColumnInfo*)pColumns->GetObject( nCur );
4488*cdf0e10cSrcweir 		if( !pCol || pCol->GetSubItem() == nSubItem )
4489*cdf0e10cSrcweir 			return pCol;
4490*cdf0e10cSrcweir 		rLeft += pCol->GetWidth();
4491*cdf0e10cSrcweir 	}
4492*cdf0e10cSrcweir 	return pCol;
4493*cdf0e10cSrcweir }
4494*cdf0e10cSrcweir 
4495*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::DrawHighlightFrame(
4496*cdf0e10cSrcweir 	OutputDevice* pOut, const Rectangle& rBmpRect, sal_Bool bHide )
4497*cdf0e10cSrcweir {
4498*cdf0e10cSrcweir 	Rectangle aBmpRect( rBmpRect );
4499*cdf0e10cSrcweir 	long nBorder = 2;
4500*cdf0e10cSrcweir 	if( aImageSize.Width() < 32 )
4501*cdf0e10cSrcweir 		nBorder = 1;
4502*cdf0e10cSrcweir 	aBmpRect.Right() += nBorder;
4503*cdf0e10cSrcweir 	aBmpRect.Left() -= nBorder;
4504*cdf0e10cSrcweir 	aBmpRect.Bottom() += nBorder;
4505*cdf0e10cSrcweir 	aBmpRect.Top() -= nBorder;
4506*cdf0e10cSrcweir 
4507*cdf0e10cSrcweir 	if ( bHide )
4508*cdf0e10cSrcweir 		pView->Invalidate( aBmpRect );
4509*cdf0e10cSrcweir 	else
4510*cdf0e10cSrcweir 	{
4511*cdf0e10cSrcweir 		DecorationView aDecoView( pOut );
4512*cdf0e10cSrcweir 		sal_uInt16 nDecoFlags;
4513*cdf0e10cSrcweir 		if ( bHighlightFramePressed )
4514*cdf0e10cSrcweir 			nDecoFlags = FRAME_HIGHLIGHT_TESTBACKGROUND | FRAME_HIGHLIGHT_IN;
4515*cdf0e10cSrcweir 		else
4516*cdf0e10cSrcweir 			nDecoFlags = FRAME_HIGHLIGHT_TESTBACKGROUND | FRAME_HIGHLIGHT_OUT;
4517*cdf0e10cSrcweir 		aDecoView.DrawHighlightFrame( aBmpRect, nDecoFlags );
4518*cdf0e10cSrcweir 	}
4519*cdf0e10cSrcweir }
4520*cdf0e10cSrcweir 
4521*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetEntryHighlightFrame( SvxIconChoiceCtrlEntry* pEntry,
4522*cdf0e10cSrcweir 	sal_Bool bKeepHighlightFlags )
4523*cdf0e10cSrcweir {
4524*cdf0e10cSrcweir 	if( pEntry == pCurHighlightFrame )
4525*cdf0e10cSrcweir 		return;
4526*cdf0e10cSrcweir 
4527*cdf0e10cSrcweir 	if( !bKeepHighlightFlags )
4528*cdf0e10cSrcweir 		bHighlightFramePressed = sal_False;
4529*cdf0e10cSrcweir 
4530*cdf0e10cSrcweir 	HideEntryHighlightFrame();
4531*cdf0e10cSrcweir 	pCurHighlightFrame = pEntry;
4532*cdf0e10cSrcweir 	if( pEntry )
4533*cdf0e10cSrcweir 	{
4534*cdf0e10cSrcweir 		Rectangle aBmpRect( CalcFocusRect(pEntry) );
4535*cdf0e10cSrcweir 		DrawHighlightFrame( pView, aBmpRect, sal_False );
4536*cdf0e10cSrcweir 	}
4537*cdf0e10cSrcweir }
4538*cdf0e10cSrcweir 
4539*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::HideEntryHighlightFrame()
4540*cdf0e10cSrcweir {
4541*cdf0e10cSrcweir 	if( !pCurHighlightFrame )
4542*cdf0e10cSrcweir 		return;
4543*cdf0e10cSrcweir 
4544*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pEntry = pCurHighlightFrame;
4545*cdf0e10cSrcweir 	pCurHighlightFrame = 0;
4546*cdf0e10cSrcweir 	Rectangle aBmpRect( CalcFocusRect(pEntry) );
4547*cdf0e10cSrcweir 	DrawHighlightFrame( pView, aBmpRect, sal_True );
4548*cdf0e10cSrcweir }
4549*cdf0e10cSrcweir 
4550*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::CallSelectHandler( SvxIconChoiceCtrlEntry* )
4551*cdf0e10cSrcweir {
4552*cdf0e10cSrcweir 	// Bei aktiviertem Single-Click-Modus sollte der Selektionshandler
4553*cdf0e10cSrcweir 	// synchron gerufen werden, weil die Selektion automatisch
4554*cdf0e10cSrcweir 	// weggenommen wird, wenn der Mauszeiger nicht mehr das Objekt
4555*cdf0e10cSrcweir 	// beruehrt. Es kann sonst zu fehlenden Select-Aufrufen kommen,
4556*cdf0e10cSrcweir 	// wenn das Objekt aus einer Mausbewegung heraus selektiert wird,
4557*cdf0e10cSrcweir 	// weil beim Ausloesen des Timers der Mauszeiger das Objekt u.U.
4558*cdf0e10cSrcweir 	// schon verlassen hat.
4559*cdf0e10cSrcweir 	// Fuer spezielle Faelle (=>SfxFileDialog!) koennen synchrone
4560*cdf0e10cSrcweir 	// Aufrufe auch per WB_NOASYNCSELECTHDL erzwungen werden.
4561*cdf0e10cSrcweir 	if( nWinBits & (WB_NOASYNCSELECTHDL | WB_HIGHLIGHTFRAME) )
4562*cdf0e10cSrcweir 	{
4563*cdf0e10cSrcweir 		pHdlEntry = 0;
4564*cdf0e10cSrcweir 		pView->ClickIcon();
4565*cdf0e10cSrcweir 		//pView->Select();
4566*cdf0e10cSrcweir 	}
4567*cdf0e10cSrcweir 	else
4568*cdf0e10cSrcweir 		aCallSelectHdlTimer.Start();
4569*cdf0e10cSrcweir }
4570*cdf0e10cSrcweir 
4571*cdf0e10cSrcweir IMPL_LINK( SvxIconChoiceCtrl_Impl, CallSelectHdlHdl, void*, EMPTYARG )
4572*cdf0e10cSrcweir {
4573*cdf0e10cSrcweir 	pHdlEntry = 0;
4574*cdf0e10cSrcweir 	pView->ClickIcon();
4575*cdf0e10cSrcweir 	//pView->Select();
4576*cdf0e10cSrcweir 	return 0;
4577*cdf0e10cSrcweir }
4578*cdf0e10cSrcweir 
4579*cdf0e10cSrcweir Point SvxIconChoiceCtrl_Impl::GetPopupMenuPosPixel() const
4580*cdf0e10cSrcweir {
4581*cdf0e10cSrcweir 	Point aResult;
4582*cdf0e10cSrcweir 	if( !GetSelectionCount() )
4583*cdf0e10cSrcweir 		return aResult;
4584*cdf0e10cSrcweir 
4585*cdf0e10cSrcweir 	SvxIconChoiceCtrlEntry* pEntry = GetCurEntry();
4586*cdf0e10cSrcweir 	if( !pEntry || !pEntry->IsSelected() )
4587*cdf0e10cSrcweir 	{
4588*cdf0e10cSrcweir 		sal_uLong nNext;
4589*cdf0e10cSrcweir 		pEntry = GetFirstSelectedEntry( nNext );
4590*cdf0e10cSrcweir 	}
4591*cdf0e10cSrcweir 	if( pEntry )
4592*cdf0e10cSrcweir 	{
4593*cdf0e10cSrcweir 		Rectangle aRect( ((SvxIconChoiceCtrl_Impl*)this)->CalcBmpRect( pEntry ) );
4594*cdf0e10cSrcweir 		aResult = aRect.Center();
4595*cdf0e10cSrcweir 		aResult = pView->GetPixelPos( aResult );
4596*cdf0e10cSrcweir 	}
4597*cdf0e10cSrcweir 	return aResult;
4598*cdf0e10cSrcweir }
4599*cdf0e10cSrcweir 
4600*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::SetOrigin( const Point& rPos, sal_Bool bDoNotUpdateWallpaper )
4601*cdf0e10cSrcweir {
4602*cdf0e10cSrcweir 	MapMode aMapMode( pView->GetMapMode() );
4603*cdf0e10cSrcweir 	aMapMode.SetOrigin( rPos );
4604*cdf0e10cSrcweir 	pView->SetMapMode( aMapMode );
4605*cdf0e10cSrcweir 	if( !bDoNotUpdateWallpaper )
4606*cdf0e10cSrcweir 	{
4607*cdf0e10cSrcweir 		sal_Bool bScrollable = pView->GetBackground().IsScrollable();
4608*cdf0e10cSrcweir 		if( pView->HasBackground() && !bScrollable )
4609*cdf0e10cSrcweir 		{
4610*cdf0e10cSrcweir 			Rectangle aRect( GetOutputRect());
4611*cdf0e10cSrcweir 			Wallpaper aPaper( pView->GetBackground() );
4612*cdf0e10cSrcweir 			aPaper.SetRect( aRect );
4613*cdf0e10cSrcweir 			pView->SetBackground( aPaper );
4614*cdf0e10cSrcweir 		}
4615*cdf0e10cSrcweir 	}
4616*cdf0e10cSrcweir }
4617*cdf0e10cSrcweir 
4618*cdf0e10cSrcweir sal_uLong SvxIconChoiceCtrl_Impl::GetGridCount( const Size& rSize, sal_Bool bCheckScrBars,
4619*cdf0e10cSrcweir 	sal_Bool bSmartScrBar ) const
4620*cdf0e10cSrcweir {
4621*cdf0e10cSrcweir 	Size aSize( rSize );
4622*cdf0e10cSrcweir 	if( bCheckScrBars && aHorSBar.IsVisible() )
4623*cdf0e10cSrcweir 		aSize.Height() -= nHorSBarHeight;
4624*cdf0e10cSrcweir 	else if( bSmartScrBar && (nWinBits & WB_ALIGN_LEFT) )
4625*cdf0e10cSrcweir 		aSize.Height() -= nHorSBarHeight;
4626*cdf0e10cSrcweir 
4627*cdf0e10cSrcweir 	if( bCheckScrBars && aVerSBar.IsVisible() )
4628*cdf0e10cSrcweir 		aSize.Width() -= nVerSBarWidth;
4629*cdf0e10cSrcweir 	else if( bSmartScrBar && (nWinBits & WB_ALIGN_TOP) )
4630*cdf0e10cSrcweir 		aSize.Width() -= nVerSBarWidth;
4631*cdf0e10cSrcweir 
4632*cdf0e10cSrcweir 	if( aSize.Width() < 0 )
4633*cdf0e10cSrcweir 		aSize.Width() = 0;
4634*cdf0e10cSrcweir 	if( aSize.Height() < 0 )
4635*cdf0e10cSrcweir 		aSize.Height() = 0;
4636*cdf0e10cSrcweir 
4637*cdf0e10cSrcweir 	return IcnGridMap_Impl::GetGridCount( aSize, (sal_uInt16)nGridDX, (sal_uInt16)nGridDY );
4638*cdf0e10cSrcweir }
4639*cdf0e10cSrcweir 
4640*cdf0e10cSrcweir sal_Bool SvxIconChoiceCtrl_Impl::HandleShortCutKey( const KeyEvent& rKEvt )
4641*cdf0e10cSrcweir {
4642*cdf0e10cSrcweir 	StopEditTimer();
4643*cdf0e10cSrcweir 
4644*cdf0e10cSrcweir 	sal_Bool		bRet = sal_False;
4645*cdf0e10cSrcweir 
4646*cdf0e10cSrcweir 	DBG_ASSERT( rKEvt.GetKeyCode().IsMod2(), "*SvxIconChoiceCtrl_Impl::HandleShortCutKey(): no <ALT> pressed!?" );
4647*cdf0e10cSrcweir 
4648*cdf0e10cSrcweir 	sal_Unicode	cChar = rKEvt.GetCharCode();
4649*cdf0e10cSrcweir 	sal_uLong		nPos = (sal_uLong)-1;
4650*cdf0e10cSrcweir 
4651*cdf0e10cSrcweir 	if( cChar && IsMnemonicChar( cChar, nPos ) )
4652*cdf0e10cSrcweir 	{
4653*cdf0e10cSrcweir 		// shortcut is clicked
4654*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pNewCursor = GetEntry( nPos );
4655*cdf0e10cSrcweir 		SvxIconChoiceCtrlEntry* pOldCursor = pCursor;
4656*cdf0e10cSrcweir 		if( pNewCursor != pOldCursor )
4657*cdf0e10cSrcweir 		{
4658*cdf0e10cSrcweir 			SetCursor_Impl( pOldCursor, pNewCursor, sal_False, sal_False, sal_False );
4659*cdf0e10cSrcweir 
4660*cdf0e10cSrcweir 			if( pNewCursor != NULL )
4661*cdf0e10cSrcweir 			{
4662*cdf0e10cSrcweir 				pHdlEntry = pNewCursor;
4663*cdf0e10cSrcweir 				pCurHighlightFrame = pHdlEntry;
4664*cdf0e10cSrcweir 				pView->ClickIcon();
4665*cdf0e10cSrcweir 				pCurHighlightFrame = NULL;
4666*cdf0e10cSrcweir 			}
4667*cdf0e10cSrcweir 		}
4668*cdf0e10cSrcweir 		bRet = sal_True;
4669*cdf0e10cSrcweir 	}
4670*cdf0e10cSrcweir 
4671*cdf0e10cSrcweir 	return bRet;
4672*cdf0e10cSrcweir }
4673*cdf0e10cSrcweir 
4674*cdf0e10cSrcweir // -----------------------------------------------------------------------
4675*cdf0e10cSrcweir 
4676*cdf0e10cSrcweir void SvxIconChoiceCtrl_Impl::CallEventListeners( sal_uLong nEvent, void* pData )
4677*cdf0e10cSrcweir {
4678*cdf0e10cSrcweir     pView->CallImplEventListeners( nEvent, pData );
4679*cdf0e10cSrcweir }
4680*cdf0e10cSrcweir 
4681*cdf0e10cSrcweir 
4682