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