xref: /aoo41x/main/svtools/source/contnr/imivctl.hxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef _IMPICNVW_HXX
29 #define _IMPICNVW_HXX
30 
31 #ifndef _VIRDEV_HXX
32 #include <vcl/virdev.hxx>
33 #endif
34 #ifndef _SCRBAR_HXX
35 #include <vcl/scrbar.hxx>
36 #endif
37 #include <vcl/timer.hxx>
38 #include <vcl/seleng.hxx>
39 #include <tools/debug.hxx>
40 #include "svtaccessiblefactory.hxx"
41 
42 #include <limits.h>
43 
44 #include <svtools/ivctrl.hxx>
45 #include <svl/svarray.hxx>
46 
47 class IcnCursor_Impl;
48 class SvtIconChoiceCtrl;
49 class SvxIconChoiceCtrlEntry;
50 class IcnViewEdit_Impl;
51 class IcnGridMap_Impl;
52 
53 ///////////////////////////////////////////////////////////////////////////////
54 //
55 // some defines
56 //
57 #define PAINTFLAG_HOR_CENTERED	0x0001
58 #define PAINTFLAG_VER_CENTERED	0x0002
59 
60 #define F_VER_SBARSIZE_WITH_HBAR		0x0001
61 #define F_HOR_SBARSIZE_WITH_VBAR		0x0002
62 #define F_PAINTED						0x0004	// sal_True nach erstem Paint
63 #define F_ADD_MODE						0x0008
64 #define F_SELECTING_RECT				0x0020
65 #define F_DOWN_CTRL						0x0080
66 #define F_DOWN_DESELECT					0x0100
67 #define F_START_EDITTIMER_IN_MOUSEUP	0x0400
68 #define F_MOVED_ENTRIES					0x0800
69 #define F_ENTRYLISTPOS_VALID			0x1000
70 #define F_CLEARING_SELECTION			0x2000
71 #define F_ARRANGING						0x4000
72 
73 // alle Angaben in Pixel
74 // Abstaende von Fensterraendern
75 #define LROFFS_WINBORDER			4
76 #define TBOFFS_WINBORDER			4
77 // fuer das Bounding-Rectangle
78 #define LROFFS_BOUND				2
79 #define TBOFFS_BOUND				2
80 // Abstand Fokusrechteck - Icon
81 #define LROFFS_ICON					2
82 #define TBOFFS_ICON					2
83 // Abstaende Icon - Text
84 #define HOR_DIST_BMP_STRING			3
85 #define VER_DIST_BMP_STRING			3
86 // Breitenoffset Highlight-Rect bei Text
87 #define LROFFS_TEXT					2
88 
89 #define DEFAULT_MAX_VIRT_WIDTH	200
90 #define DEFAULT_MAX_VIRT_HEIGHT	200
91 
92 #define VIEWMODE_MASK	(WB_ICON | WB_SMALLICON | WB_DETAILS)
93 
94 ///////////////////////////////////////////////////////////////////////////////
95 //
96 //
97 //
98 enum IcnViewFieldType
99 {
100 	IcnViewFieldTypeDontknow = 0,
101 	IcnViewFieldTypeImage = 1,
102 	IcnViewFieldTypeText = 2
103 };
104 
105 ///////////////////////////////////////////////////////////////////////////////
106 //
107 // Data about the focus of entries
108 //
109 struct LocalFocus
110 {
111 	sal_Bool		bOn;
112 	Rectangle	aRect;
113 	Color		aPenColor;
114 
115 	LocalFocus() { bOn = sal_False; }
116 };
117 
118 ///////////////////////////////////////////////////////////////////////////////
119 //
120 // Entry-List
121 //
122 class EntryList_Impl : public List
123 {
124 private:
125 
126 	using List::Replace;
127 
128 	SvxIconChoiceCtrl_Impl*			_pOwner;
129 
130 	void 					Removed_Impl( SvxIconChoiceCtrlEntry* pEntry );
131 
132 public:
133 							EntryList_Impl(
134 								SvxIconChoiceCtrl_Impl*,
135 								sal_uInt16 _nInitSize = 1024,
136 								sal_uInt16 _nReSize = 1024 );
137 							EntryList_Impl(
138 								SvxIconChoiceCtrl_Impl*,
139 								sal_uInt16 _nBlockSize,
140 								sal_uInt16 _nInitSize,
141 								sal_uInt16 _nReSize );
142 							~EntryList_Impl();
143 
144 	void 					Clear();
145 	void 					Insert( SvxIconChoiceCtrlEntry* pEntry, sal_uLong nPos );
146 	SvxIconChoiceCtrlEntry*			Remove( sal_uLong nPos );
147 	void					Remove( SvxIconChoiceCtrlEntry* pEntry );
148 };
149 
150 
151 ///////////////////////////////////////////////////////////////////////////////
152 //
153 // Implementation-class of IconChoiceCtrl
154 //
155 class SvxIconChoiceCtrl_Impl
156 {
157 	friend class IcnCursor_Impl;
158 	friend class EntryList_Impl;
159 	friend class IcnGridMap_Impl;
160 
161 	sal_Bool			bChooseWithCursor;
162 	EntryList_Impl	aEntries;
163 	ScrollBar   	aVerSBar;
164 	ScrollBar   	aHorSBar;
165 	ScrollBarBox	aScrBarBox;
166 	Rectangle		aCurSelectionRect;
167 	SvPtrarr		aSelectedRectList;
168 	Timer			aEditTimer;  				// fuer Inplace-Editieren
169 	Timer			aAutoArrangeTimer;
170 	Timer			aDocRectChangedTimer;
171 	Timer			aVisRectChangedTimer;
172 	Timer			aCallSelectHdlTimer;
173 	Size			aVirtOutputSize;
174 	Size			aImageSize;
175 	Size			aDefaultTextSize;
176 	Size			aOutputSize; // Pixel
177 	Point			aDDLastEntryPos;
178 	Point			aDDLastRectPos;
179 	Point 			aDDPaintOffs;
180 	Point			aDDStartPos;
181 	SvtIconChoiceCtrl*		pView;
182 	IcnCursor_Impl*	pImpCursor;
183 	IcnGridMap_Impl* pGridMap;
184 	long			nMaxVirtWidth;	// max. Breite aVirtOutputSize bei ALIGN_TOP
185 	long			nMaxVirtHeight; // max. Hoehe aVirtOutputSize bei ALIGN_LEFT
186 	List*			pZOrderList;
187 	SvPtrarr*		pColumns;
188 	IcnViewEdit_Impl* pEdit;
189 	WinBits			nWinBits;
190 	long			nMaxBoundHeight; 			// Hoehe des hoechsten BoundRects
191 	sal_uInt16			nFlags;
192 	sal_uInt16			nCurTextDrawFlags;
193 	sal_uLong			nUserEventAdjustScrBars;
194 	sal_uLong			nUserEventShowCursor;
195 	SvxIconChoiceCtrlEntry*	pCurHighlightFrame;
196 	sal_Bool			bHighlightFramePressed;
197 	SvxIconChoiceCtrlEntry*	pHead;						// Eintrag oben links
198 	SvxIconChoiceCtrlEntry* pCursor;
199 	SvxIconChoiceCtrlEntry*	pPrevDropTarget;
200 	SvxIconChoiceCtrlEntry*	pHdlEntry;
201 	SvxIconChoiceCtrlEntry*	pDDRefEntry;
202 	VirtualDevice*	pDDDev;
203 	VirtualDevice*	pDDBufDev;
204 	VirtualDevice*  pDDTempDev;
205 	VirtualDevice*	pEntryPaintDev;
206 	SvxIconChoiceCtrlEntry* pAnchor;					// fuer Selektion
207 	LocalFocus		aFocus;								// Data for focusrect
208     ::svt::AccessibleFactoryAccess aAccFactory;
209 
210 	List*			pDraggedSelection;
211 	SvxIconChoiceCtrlEntry*	pCurEditedEntry;
212 	SvxIconChoiceCtrlTextMode eTextMode;
213 	SelectionMode	eSelectionMode;
214 	sal_uLong			nSelectionCount;
215 	SvxIconChoiceCtrlPositionMode ePositionMode;
216 	sal_Bool			bBoundRectsDirty;
217 	sal_Bool			bUpdateMode;
218 	sal_Bool			bEntryEditingEnabled;
219 	sal_Bool			bInDragDrop;
220 
221 	void 			ShowCursor( sal_Bool bShow );
222 
223 	void			ImpArrange( sal_Bool bKeepPredecessors = sal_False );
224 	void			AdjustVirtSize( const Rectangle& );
225 	void			ResetVirtSize();
226 	void			CheckScrollBars();
227 
228 					DECL_LINK( ScrollUpDownHdl, ScrollBar * );
229 					DECL_LINK( ScrollLeftRightHdl, ScrollBar * );
230 					DECL_LINK( EditTimeoutHdl, Timer* );
231 					DECL_LINK( UserEventHdl, void* );
232 					DECL_LINK( EndScrollHdl, void* );
233 					DECL_LINK( AutoArrangeHdl, void* );
234 					DECL_LINK( DocRectChangedHdl, void* );
235 					DECL_LINK( VisRectChangedHdl, void* );
236 					DECL_LINK( CallSelectHdlHdl, void* );
237 
238 	void			AdjustScrollBars( sal_Bool bVirtSizeGrowedOnly = sal_False);
239 	void			PositionScrollBars( long nRealWidth, long nRealHeight );
240 	long			GetScrollBarPageSize( long nVisibleRange ) const { return ((nVisibleRange*75)/100); }
241 	long			GetScrollBarLineSize() const { return nMaxBoundHeight / 2; }
242 	sal_Bool 			HandleScrollCommand( const CommandEvent& rCmd );
243 	void			ToDocPos( Point& rPosPixel ) { rPosPixel -= pView->GetMapMode().GetOrigin(); }
244 	void			InitScrollBarBox();
245 	SvxIconChoiceCtrlEntry*	FindNewCursor();
246 	void			ToggleSelection( SvxIconChoiceCtrlEntry* );
247 	void			DeselectAllBut( SvxIconChoiceCtrlEntry*, sal_Bool bPaintSync=sal_False );
248 	void			Center( SvxIconChoiceCtrlEntry* pEntry ) const;
249 	void			StopEditTimer() { aEditTimer.Stop(); }
250 	void			StartEditTimer() { aEditTimer.Start(); }
251 	void 			ImpHideDDIcon();
252 	void			CallSelectHandler( SvxIconChoiceCtrlEntry* );
253 	void			SelectRect(
254 						SvxIconChoiceCtrlEntry* pEntry1,
255 						SvxIconChoiceCtrlEntry* pEntry2,
256 						sal_Bool bAdd = sal_True,
257 						SvPtrarr* pOtherRects = 0 );
258 
259 	void			SelectRange(
260 						SvxIconChoiceCtrlEntry* pStart,
261 						SvxIconChoiceCtrlEntry* pEnd,
262 						sal_Bool bAdd = sal_True );
263 
264 	void			AddSelectedRect( const Rectangle& );
265 	void			AddSelectedRect(
266 						SvxIconChoiceCtrlEntry* pEntry1,
267 						SvxIconChoiceCtrlEntry* pEntry2 );
268 
269 	void			ClearSelectedRectList();
270 	void			ClearColumnList();
271 	Rectangle		CalcMaxTextRect( const SvxIconChoiceCtrlEntry* pEntry ) const;
272 
273 	void			ClipAtVirtOutRect( Rectangle& rRect ) const;
274 	void 			AdjustAtGrid( const SvPtrarr& rRow, SvxIconChoiceCtrlEntry* pStart=0 );
275 	Point			AdjustAtGrid(
276 						const Rectangle& rCenterRect, // "Schwerpunkt" des Objekts (typ. Bmp-Rect)
277 						const Rectangle& rBoundRect ) const;
278 	sal_uLong			GetPredecessorGrid( const Point& rDocPos) const;
279 
280 	void			InitPredecessors();
281 	void			ClearPredecessors();
282 
283 	sal_Bool			CheckVerScrollBar();
284 	sal_Bool			CheckHorScrollBar();
285 	void 			CancelUserEvents();
286 	void			EntrySelected( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bSelect,
287 						sal_Bool bSyncPaint );
288 	void			SaveSelection( List** );
289 	void			RepaintEntries( sal_uInt16 nEntryFlagsMask );
290 	void			SetListPositions();
291 	void			SetDefaultTextSize();
292 	sal_Bool			IsAutoArrange() const {
293 						return (sal_Bool)(ePositionMode == IcnViewPositionModeAutoArrange); }
294 	sal_Bool			IsAutoAdjust() const {
295 						return (sal_Bool)(ePositionMode == IcnViewPositionModeAutoAdjust); }
296 	void			DocRectChanged() { aDocRectChangedTimer.Start(); }
297 	void			VisRectChanged() { aVisRectChangedTimer.Start(); }
298 	void			SetOrigin( const Point&, sal_Bool bDoNotUpdateWallpaper = sal_False );
299 
300 					DECL_LINK( TextEditEndedHdl, IcnViewEdit_Impl* );
301 
302 	void ShowFocus ( Rectangle& rRect );
303 	void HideFocus ();
304 	void DrawFocusRect ( OutputDevice* pOut );
305 
306 	sal_Bool			IsMnemonicChar( sal_Unicode cChar, sal_uLong& rPos ) const;
307 
308 public:
309 
310 	long			nGridDX,
311 					nGridDY;
312 	long			nHorSBarHeight,
313 					nVerSBarWidth;
314 
315 					SvxIconChoiceCtrl_Impl( SvtIconChoiceCtrl* pView, WinBits nWinStyle );
316 					~SvxIconChoiceCtrl_Impl();
317 
318 	sal_Bool			SetChoiceWithCursor ( sal_Bool bDo = sal_True ) { sal_Bool bOld=bChooseWithCursor; bChooseWithCursor = bDo; return bOld; }
319 	void 			Clear( sal_Bool bInCtor = sal_False );
320 	void 			SetStyle( WinBits nWinStyle );
321 	WinBits			GetStyle() const { return nWinBits; }
322 	void 			InsertEntry( SvxIconChoiceCtrlEntry*, sal_uLong nPos, const Point* pPos=0 );
323 	void			CreateAutoMnemonics( MnemonicGenerator* _pGenerator = NULL );
324 	void 			RemoveEntry( SvxIconChoiceCtrlEntry* pEntry );
325 	void 			FontModified();
326 	void			SelectAll( sal_Bool bSelect = sal_True, sal_Bool bPaint = sal_True );
327 	void 			SelectEntry(
328 						SvxIconChoiceCtrlEntry*,
329 						sal_Bool bSelect,
330 						sal_Bool bCallHdl = sal_True,
331 						sal_Bool bAddToSelection = sal_False,
332 						sal_Bool bSyncPaint = sal_False );
333 	void 			Paint( const Rectangle& rRect );
334 	sal_Bool 			MouseButtonDown( const MouseEvent& );
335 	sal_Bool 			MouseButtonUp( const MouseEvent& );
336 	sal_Bool 			MouseMove( const MouseEvent&);
337 	sal_Bool 			RequestHelp( const HelpEvent& rHEvt );
338 	void 			SetCursor_Impl(
339 						SvxIconChoiceCtrlEntry* pOldCursor,
340 						SvxIconChoiceCtrlEntry* pNewCursor,
341 						sal_Bool bMod1,
342 						sal_Bool bShift,
343 						sal_Bool bPaintSync = sal_False);
344 	sal_Bool 			KeyInput( const KeyEvent& );
345 	void 			Resize();
346 	void 			GetFocus();
347 	void 			LoseFocus();
348 	void 			SetUpdateMode( sal_Bool bUpdate );
349 	sal_Bool			GetUpdateMode() const { return bUpdateMode; }
350 	void 			PaintEntry( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bIsBackgroundPainted=sal_False );
351 	void 			PaintEntry(
352 						SvxIconChoiceCtrlEntry*,
353 						const Point&,
354 						OutputDevice* pOut = 0,
355 						sal_Bool bIsBackgroundPainted = sal_False);
356 	void 			PaintEntryVirtOutDev( SvxIconChoiceCtrlEntry* );
357 
358 	void 			SetEntryPos(
359 						SvxIconChoiceCtrlEntry* pEntry,
360 						const Point& rPos,
361 						sal_Bool bAdjustRow = sal_False,
362 						sal_Bool bCheckScrollBars = sal_False,
363 						sal_Bool bKeepGridMap = sal_False );
364 
365 	void 			InvalidateEntry( SvxIconChoiceCtrlEntry* );
366 	IcnViewFieldType 	GetItem( SvxIconChoiceCtrlEntry*, const Point& rAbsPos );
367 
368 	void 			SetNoSelection();
369 
370 	SvxIconChoiceCtrlEntry* GetCurEntry() const { return pCursor; }
371 	void 			SetCursor(
372 						SvxIconChoiceCtrlEntry*,
373 						// sal_True == bei Single-Selection die Sel. mitfuehren
374 						sal_Bool bSyncSingleSelection = sal_True,
375 						sal_Bool bShowFocusAsync = sal_False );
376 
377 	SvxIconChoiceCtrlEntry* GetEntry( const Point& rDocPos, sal_Bool bHit = sal_False );
378 	SvxIconChoiceCtrlEntry*	GetNextEntry( const Point& rDocPos, SvxIconChoiceCtrlEntry* pCurEntry );
379 	SvxIconChoiceCtrlEntry*	GetPrevEntry( const Point& rDocPos, SvxIconChoiceCtrlEntry* pCurEntry  );
380 
381 	Point 			GetEntryPos( SvxIconChoiceCtrlEntry* );
382 	void 			MakeEntryVisible( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bBound = sal_True );
383 
384 	void			Arrange(sal_Bool bKeepPredecessors = sal_False, long nSetMaxVirtWidth =0, long nSetMaxVirtHeight =0 );
385 
386 	Rectangle		CalcFocusRect( SvxIconChoiceCtrlEntry* );
387 	Rectangle		CalcBmpRect( SvxIconChoiceCtrlEntry*, const Point* pPos = 0 );
388 	Rectangle		CalcTextRect(
389 						SvxIconChoiceCtrlEntry*,
390 						const Point* pPos = 0,
391 						sal_Bool bForInplaceEdit = sal_False,
392 						const String* pStr = 0 );
393 
394 	long			CalcBoundingWidth( SvxIconChoiceCtrlEntry* ) const;
395 	long			CalcBoundingHeight( SvxIconChoiceCtrlEntry* ) const;
396 	Size			CalcBoundingSize( SvxIconChoiceCtrlEntry* ) const;
397 	void			FindBoundingRect( SvxIconChoiceCtrlEntry* pEntry );
398 	void 			SetBoundingRect_Impl(
399 						SvxIconChoiceCtrlEntry* pEntry,
400 						const Point& rPos,
401 						const Size& rBoundingSize );
402 	// berechnet alle BoundRects neu
403 	void			RecalcAllBoundingRects();
404 	// berechnet alle ungueltigen BoundRects neu
405 	void			RecalcAllBoundingRectsSmart();
406 	const Rectangle&  GetEntryBoundRect( SvxIconChoiceCtrlEntry* );
407 	void			InvalidateBoundingRect( SvxIconChoiceCtrlEntry* );
408 	void			InvalidateBoundingRect( Rectangle& rRect ) { rRect.Right() = LONG_MAX; bBoundRectsDirty = sal_True; }
409 	sal_Bool			IsBoundingRectValid( const Rectangle& rRect ) const { return (sal_Bool)( rRect.Right() != LONG_MAX ); }
410 
411 	void 			PaintEmphasis(
412 						const Rectangle& rRect1,
413 						const Rectangle& rRect2,
414 						sal_Bool bSelected,
415 						sal_Bool bDropTarget,
416 						sal_Bool bCursored,
417 						OutputDevice* pOut,
418 						sal_Bool bIsBackgroundPainted = sal_False);
419 
420 	void 			PaintItem(
421 						const Rectangle& rRect,
422 						IcnViewFieldType eItem,
423 						SvxIconChoiceCtrlEntry* pEntry,
424 						sal_uInt16 nPaintFlags,
425 						OutputDevice* pOut,
426 						const String* pStr = 0,
427 						::vcl::ControlLayoutData* _pLayoutData = NULL );
428 
429 	// berechnet alle BoundingRects neu, wenn bMustRecalcBoundingRects == sal_True
430 	void			CheckBoundingRects() { if (bBoundRectsDirty) RecalcAllBoundingRectsSmart(); }
431 	// berechnet alle invalidierten BoundingRects neu
432 	void			UpdateBoundingRects();
433 	void			ShowTargetEmphasis( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bShow );
434 	void			PrepareCommandEvent( const CommandEvent& );
435 	void			Command( const CommandEvent& rCEvt );
436 	void			ToTop( SvxIconChoiceCtrlEntry* );
437 
438 	sal_uLong			GetSelectionCount() const;
439 	void			SetGrid( const Size& );
440 	Size 			GetMinGrid() const;
441 	sal_uLong			GetGridCount(
442 						const Size& rSize,
443 						sal_Bool bCheckScrBars,
444 						sal_Bool bSmartScrBar ) const;
445 	void			Scroll( long nDeltaX, long nDeltaY, sal_Bool bScrollBar = sal_False );
446 	const Size&		GetItemSize( SvxIconChoiceCtrlEntry*, IcnViewFieldType ) const;
447 
448 	void 			HideDDIcon();
449 	void 			ShowDDIcon( SvxIconChoiceCtrlEntry* pRefEntry, const Point& rPos );
450 	void			HideShowDDIcon(
451 						SvxIconChoiceCtrlEntry* pRefEntry,
452 						const Point& rPos );
453 
454 	sal_Bool			IsOver(
455 						SvPtrarr* pSelectedRectList,
456 						const Rectangle& rEntryBoundRect ) const;
457 
458 	void			SelectRect(
459 						const Rectangle&,
460 						sal_Bool bAdd = sal_True,
461 						SvPtrarr* pOtherRects = 0 );
462 
463 	void			CalcScrollOffsets(
464 						const Point& rRefPosPixel,
465 						long& rX,
466 						long& rY,
467 						sal_Bool bDragDrop = sal_False,
468 						sal_uInt16 nBorderWidth = 10 );
469 
470 	sal_Bool			IsTextHit( SvxIconChoiceCtrlEntry* pEntry, const Point& rDocPos );
471 	void			MakeVisible(
472 						const Rectangle& rDocPos,
473 						sal_Bool bInScrollBarEvent=sal_False,
474 						sal_Bool bCallRectChangedHdl = sal_True );
475 
476 	void			AdjustEntryAtGrid( SvxIconChoiceCtrlEntry* pStart = 0 );
477 	void			SetEntryTextMode( SvxIconChoiceCtrlTextMode, SvxIconChoiceCtrlEntry* pEntry = 0 );
478 	SvxIconChoiceCtrlTextMode GetTextMode( const SvxIconChoiceCtrlEntry* pEntry = 0 ) const;
479 	void			ShowEntryFocusRect( const SvxIconChoiceCtrlEntry* pEntry );
480 	void			EnableEntryEditing( sal_Bool bEnable ) { bEntryEditingEnabled = bEnable; }
481 	sal_Bool			IsEntryEditingEnabled() const { return bEntryEditingEnabled; }
482 	sal_Bool 			IsEntryEditing() const { return (sal_Bool)(pCurEditedEntry!=0); }
483 	void			EditEntry( SvxIconChoiceCtrlEntry* pEntry );
484 	void			StopEntryEditing( sal_Bool bCancel );
485 	void			LockEntryPos( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bLock );
486 	sal_uLong			GetEntryCount() const { return aEntries.Count(); }
487 	SvxIconChoiceCtrlEntry*	GetEntry( sal_uLong nPos ) const { return (SvxIconChoiceCtrlEntry*)aEntries.GetObject(nPos); }
488 	SvxIconChoiceCtrlEntry*	GetFirstSelectedEntry( sal_uLong& ) const;
489 	SvxIconChoiceCtrlEntry*	GetNextSelectedEntry( sal_uLong& ) const;
490 	SvxIconChoiceCtrlEntry* GetHdlEntry() const { return pHdlEntry; }
491 	void 			SetHdlEntry( SvxIconChoiceCtrlEntry* pEntry ) { pHdlEntry = pEntry; }
492 
493 	SvxIconChoiceCtrlTextMode GetEntryTextModeSmart( const SvxIconChoiceCtrlEntry* pEntry ) const;
494 	void			SetSelectionMode( SelectionMode eMode ) { eSelectionMode=eMode; }
495 	SelectionMode	GetSelectionMode() const { return eSelectionMode; }
496 	sal_Bool			AreEntriesMoved() const { return (sal_Bool)((nFlags & F_MOVED_ENTRIES)!=0); }
497 	void			SetEntriesMoved( sal_Bool bMoved )
498 					{
499 						if( bMoved ) nFlags |= F_MOVED_ENTRIES;
500 						else nFlags &= ~(F_MOVED_ENTRIES);
501 					}
502 	sal_uLong			GetEntryListPos( SvxIconChoiceCtrlEntry* ) const;
503 	void 			SetEntryListPos( SvxIconChoiceCtrlEntry* pEntry, sal_uLong nNewPos );
504 	void			SetEntryImageSize( const Size& rSize ) { aImageSize = rSize; }
505 	void			SetEntryFlags( SvxIconChoiceCtrlEntry* pEntry, sal_uInt16 nFlags );
506 	SvxIconChoiceCtrlEntry* GoLeftRight( SvxIconChoiceCtrlEntry*, sal_Bool bRight );
507 	SvxIconChoiceCtrlEntry* GoUpDown( SvxIconChoiceCtrlEntry*, sal_Bool bDown );
508 	void 			InitSettings();
509 	Rectangle		GetOutputRect() const;
510 
511 	sal_Bool			ArePredecessorsSet() const { return (sal_Bool)(pHead != 0); }
512 	SvxIconChoiceCtrlEntry* GetPredecessorHead() const { return pHead; }
513 	void			SetEntryPredecessor(SvxIconChoiceCtrlEntry* pEntry,SvxIconChoiceCtrlEntry* pPredecessor);
514 	sal_Bool			GetEntryPredecessor(SvxIconChoiceCtrlEntry* pEntry,SvxIconChoiceCtrlEntry** ppPredecessor);
515 	// liefert gueltige Ergebnisse nur im AutoArrange-Modus!
516 	SvxIconChoiceCtrlEntry*	FindEntryPredecessor( SvxIconChoiceCtrlEntry* pEntry, const Point& );
517 
518 	void			SetPositionMode( SvxIconChoiceCtrlPositionMode );
519 	SvxIconChoiceCtrlPositionMode GetPositionMode() const { return ePositionMode;}
520 
521 	void			Flush();
522 	void			SetColumn( sal_uInt16 nIndex, const SvxIconChoiceCtrlColumnInfo& );
523 	const SvxIconChoiceCtrlColumnInfo* GetColumn( sal_uInt16 nIndex ) const;
524 	const SvxIconChoiceCtrlColumnInfo* GetItemColumn( sal_uInt16 nSubItem, long& rLeft ) const;
525 
526 	Rectangle 		GetDocumentRect() const { return Rectangle( Point(), aVirtOutputSize ); }
527 	Rectangle		GetVisibleRect() const { return GetOutputRect(); }
528 
529 	void			SetEntryHighlightFrame( SvxIconChoiceCtrlEntry* pEntry,sal_Bool bKeepHighlightFlags=sal_False );
530 	void			HideEntryHighlightFrame();
531 	void 			DrawHighlightFrame( OutputDevice* pOut,
532 						const Rectangle& rBmpRect, sal_Bool bHide );
533 	void			StopSelectTimer() { aCallSelectHdlTimer.Stop(); }
534 	void 			Tracking( const TrackingEvent& rTEvt );
535 	Point			GetPopupMenuPosPixel() const;
536 
537 	sal_Bool			HandleShortCutKey( const KeyEvent& rKeyEvent );
538 
539 	void			CallEventListeners( sal_uLong nEvent, void* pData = NULL );
540 
541     inline ::svt::IAccessibleFactory&
542         GetAccessibleFactory() { return aAccFactory.getFactory(); }
543 };
544 
545 // ----------------------------------------------------------------------------------------------
546 
547 class IcnCursor_Impl
548 {
549 	SvxIconChoiceCtrl_Impl*	pView;
550 	SvPtrarr* 		pColumns;
551 	SvPtrarr* 		pRows;
552 	long			nCols;
553 	long			nRows;
554 	short 			nDeltaWidth;
555 	short 			nDeltaHeight;
556 	SvxIconChoiceCtrlEntry* pCurEntry;
557 	void 			SetDeltas();
558 	void 			ImplCreate();
559 	void 			Create() {	if( !pColumns )	ImplCreate(); }
560 
561 	sal_uInt16 			GetSortListPos( SvPtrarr* pList, long nValue, int bVertical);
562 	SvxIconChoiceCtrlEntry* SearchCol(sal_uInt16 nCol,sal_uInt16 nTop,sal_uInt16 nBottom,sal_uInt16 nPref,
563 						sal_Bool bDown, sal_Bool bSimple );
564 
565 	SvxIconChoiceCtrlEntry* SearchRow(sal_uInt16 nRow,sal_uInt16 nRight,sal_uInt16 nLeft,sal_uInt16 nPref,
566 						sal_Bool bRight, sal_Bool bSimple );
567 
568 public:
569 					IcnCursor_Impl( SvxIconChoiceCtrl_Impl* pOwner );
570 					~IcnCursor_Impl();
571 	void 			Clear();
572 
573 	// fuer Cursortravelling usw.
574 	SvxIconChoiceCtrlEntry* GoLeftRight( SvxIconChoiceCtrlEntry*, sal_Bool bRight );
575 	SvxIconChoiceCtrlEntry* GoUpDown( SvxIconChoiceCtrlEntry*, sal_Bool bDown );
576 	SvxIconChoiceCtrlEntry* GoPageUpDown( SvxIconChoiceCtrlEntry*, sal_Bool bDown );
577 
578 	// Erzeugt fuer jede Zeile (Hoehe=nGridDY) eine nach BoundRect.Left()
579 	// sortierte Liste der Eintraege, die in ihr stehen. Eine Liste kann
580 	// leer sein. Die Listen gehen in das Eigentum des Rufenden ueber und
581 	// muessen mit DestroyGridAdjustData geloescht werden
582 	void			CreateGridAjustData( SvPtrarr& pLists, SvxIconChoiceCtrlEntry* pRow=0);
583 	static void 	DestroyGridAdjustData( SvPtrarr& rLists );
584 };
585 
586 // ----------------------------------------------------------------------------------------------
587 
588 typedef sal_uLong GridId;
589 
590 #define GRID_NOT_FOUND	((GridId)ULONG_MAX)
591 
592 class IcnGridMap_Impl
593 {
594 	Rectangle		_aLastOccupiedGrid;
595 	SvxIconChoiceCtrl_Impl*	_pView;
596 	sal_Bool*			_pGridMap;
597 	sal_uInt16			_nGridCols, _nGridRows;
598 
599 	void			Expand();
600 	void			Create_Impl();
601 	void			Create() { if(!_pGridMap) Create_Impl(); }
602 
603 	void			GetMinMapSize( sal_uInt16& rDX, sal_uInt16& rDY ) const;
604 
605 public:
606 					IcnGridMap_Impl(SvxIconChoiceCtrl_Impl*	pView);
607 					~IcnGridMap_Impl();
608 
609 	void			Clear();
610 
611 	GridId	 		GetGrid( const Point& rDocPos, sal_Bool* pbClipped = 0 );
612 	GridId			GetGrid( sal_uInt16 nGridX, sal_uInt16 nGridY );
613 	GridId			GetUnoccupiedGrid( sal_Bool bOccupyFound=sal_True );
614 
615 	void			OccupyGrids( const Rectangle&, sal_Bool bOccupy = sal_True );
616 	void			OccupyGrids( const SvxIconChoiceCtrlEntry*, sal_Bool bOccupy = sal_True );
617 	void			OccupyGrid( GridId nId, sal_Bool bOccupy = sal_True )
618 					{
619 						DBG_ASSERT(!_pGridMap || nId<(sal_uLong)(_nGridCols*_nGridRows),"OccupyGrid: Bad GridId");
620 						if(_pGridMap && nId < (sal_uLong)(_nGridCols *_nGridRows) )
621 							_pGridMap[ nId ] = bOccupy;
622 					}
623 
624 	Rectangle		GetGridRect( GridId );
625 	void			GetGridCoord( GridId, sal_uInt16& rGridX, sal_uInt16& rGridY );
626 	static sal_uLong 	GetGridCount( const Size& rSizePixel, sal_uInt16 nGridWidth, sal_uInt16 nGridHeight );
627 
628 	void			OutputSizeChanged();
629 };
630 
631 
632 
633 
634 
635 #endif
636 
637 
638