Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef INCLUDED_SVTOOLS_SOURCE_CONTNR_IMIVCTL_HXX
21 : #define INCLUDED_SVTOOLS_SOURCE_CONTNR_IMIVCTL_HXX
22 :
23 : #include <vcl/virdev.hxx>
24 : #include <vcl/scrbar.hxx>
25 : #include <vcl/timer.hxx>
26 : #include <vcl/idle.hxx>
27 : #include <vcl/vclptr.hxx>
28 : #include <vcl/seleng.hxx>
29 : #include <tools/debug.hxx>
30 : #include "svtaccessiblefactory.hxx"
31 :
32 : #include <limits.h>
33 :
34 : #include <svtools/ivctrl.hxx>
35 : #include <boost/ptr_container/ptr_map.hpp>
36 :
37 : class IcnCursor_Impl;
38 : class SvtIconChoiceCtrl;
39 : class SvxIconChoiceCtrlEntry;
40 : class IcnViewEdit_Impl;
41 : class IcnGridMap_Impl;
42 :
43 :
44 :
45 : // some defines
46 :
47 : #define PAINTFLAG_HOR_CENTERED 0x0001
48 : #define PAINTFLAG_VER_CENTERED 0x0002
49 :
50 : #define F_VER_SBARSIZE_WITH_HBAR 0x0001
51 : #define F_HOR_SBARSIZE_WITH_VBAR 0x0002
52 : #define F_PAINTED 0x0004 // true after first paint
53 : #define F_ADD_MODE 0x0008
54 : #define F_SELECTING_RECT 0x0020
55 : #define F_DOWN_CTRL 0x0080
56 : #define F_DOWN_DESELECT 0x0100
57 : #define F_START_EDITTIMER_IN_MOUSEUP 0x0400
58 : #define F_MOVED_ENTRIES 0x0800
59 : #define F_ENTRYLISTPOS_VALID 0x1000
60 : #define F_CLEARING_SELECTION 0x2000
61 : #define F_ARRANGING 0x4000
62 :
63 : // unit = pixels
64 : // distances from window borders
65 : #define LROFFS_WINBORDER 4
66 : #define TBOFFS_WINBORDER 4
67 : // for the bounding rectangle
68 : #define LROFFS_BOUND 2
69 : #define TBOFFS_BOUND 2
70 : // distance icon to text
71 : #define HOR_DIST_BMP_STRING 3
72 : #define VER_DIST_BMP_STRING 3
73 : // width offset of highlight rectangle for Text
74 : #define LROFFS_TEXT 2
75 :
76 : #define DEFAULT_MAX_VIRT_WIDTH 200
77 : #define DEFAULT_MAX_VIRT_HEIGHT 200
78 :
79 : #define VIEWMODE_MASK (WB_ICON | WB_SMALLICON | WB_DETAILS)
80 :
81 :
82 :
83 :
84 :
85 : enum IcnViewFieldType
86 : {
87 : IcnViewFieldTypeDontknow = 0,
88 : IcnViewFieldTypeImage = 1,
89 : IcnViewFieldTypeText = 2
90 : };
91 :
92 :
93 :
94 : // Data about the focus of entries
95 :
96 : struct LocalFocus
97 : {
98 : bool bOn;
99 : Rectangle aRect;
100 : Color aPenColor;
101 :
102 7 : LocalFocus() { bOn = false; }
103 : };
104 :
105 :
106 :
107 : // Entry-List
108 :
109 : typedef ::std::vector< SvxIconChoiceCtrlEntry* > SvxIconChoiceCtrlEntryList_impl;
110 :
111 : class EntryList_Impl
112 : {
113 : private:
114 : SvxIconChoiceCtrlEntryList_impl maIconChoiceCtrlEntryList;
115 : SvxIconChoiceCtrl_Impl* _pOwner;
116 :
117 : public:
118 : explicit EntryList_Impl( SvxIconChoiceCtrl_Impl* );
119 : ~EntryList_Impl();
120 :
121 : void clear();
122 :
123 219 : size_t size()
124 : {
125 219 : return maIconChoiceCtrlEntryList.size();
126 : }
127 400 : size_t size() const
128 : {
129 400 : return maIconChoiceCtrlEntryList.size();
130 : }
131 :
132 1014 : SvxIconChoiceCtrlEntry* operator[]( size_t nPos )
133 : {
134 1014 : return ( nPos < maIconChoiceCtrlEntryList.size() )
135 1014 : ? maIconChoiceCtrlEntryList[ nPos ]
136 2028 : : NULL;
137 : }
138 522 : SvxIconChoiceCtrlEntry* operator[]( size_t nPos ) const
139 : {
140 522 : return ( nPos < maIconChoiceCtrlEntryList.size() )
141 522 : ? maIconChoiceCtrlEntryList[ nPos ]
142 1044 : : NULL;
143 : }
144 : void insert( size_t nPos, SvxIconChoiceCtrlEntry* pEntry );
145 : };
146 :
147 :
148 :
149 :
150 : // Implementation-class of IconChoiceCtrl
151 :
152 :
153 : typedef boost::ptr_map<sal_uInt16, SvxIconChoiceCtrlColumnInfo> SvxIconChoiceCtrlColumnInfoMap;
154 : typedef std::vector<SvxIconChoiceCtrlEntry*> SvxIconChoiceCtrlEntryPtrVec;
155 :
156 : class SvxIconChoiceCtrl_Impl
157 : {
158 : friend class IcnCursor_Impl;
159 : friend class EntryList_Impl;
160 : friend class IcnGridMap_Impl;
161 :
162 : bool bChooseWithCursor;
163 : EntryList_Impl aEntries;
164 : VclPtr<ScrollBar> aVerSBar;
165 : VclPtr<ScrollBar> aHorSBar;
166 : VclPtr<ScrollBarBox> aScrBarBox;
167 : Rectangle aCurSelectionRect;
168 : std::vector<Rectangle*> aSelectedRectList;
169 : Idle aEditIdle; // for editing in place
170 : Idle aAutoArrangeIdle;
171 : Idle aDocRectChangedIdle;
172 : Idle aVisRectChangedIdle;
173 : Idle aCallSelectHdlIdle;
174 : Size aVirtOutputSize;
175 : Size aImageSize;
176 : Size aDefaultTextSize;
177 : Size aOutputSize; // Pixel
178 : Point aDDLastEntryPos;
179 : Point aDDLastRectPos;
180 : Point aDDPaintOffs;
181 : Point aDDStartPos;
182 : VclPtr<SvtIconChoiceCtrl> pView;
183 : IcnCursor_Impl* pImpCursor;
184 : IcnGridMap_Impl* pGridMap;
185 : long nMaxVirtWidth; // max. width aVirtOutputSize for ALIGN_TOP
186 : long nMaxVirtHeight; // max. height aVirtOutputSize for ALIGN_LEFT
187 : SvxIconChoiceCtrlEntryList_impl* pZOrderList;
188 : SvxIconChoiceCtrlColumnInfoMap* pColumns;
189 : VclPtr<IcnViewEdit_Impl> pEdit;
190 : WinBits nWinBits;
191 : long nMaxBoundHeight; // height of highest BoundRects
192 : sal_uInt16 nFlags;
193 : DrawTextFlags nCurTextDrawFlags;
194 : ImplSVEvent * nUserEventAdjustScrBars;
195 : ImplSVEvent * nUserEventShowCursor;
196 : SvxIconChoiceCtrlEntry* pCurHighlightFrame;
197 : bool bHighlightFramePressed;
198 : SvxIconChoiceCtrlEntry* pHead; // top left entry
199 : SvxIconChoiceCtrlEntry* pCursor;
200 : SvxIconChoiceCtrlEntry* pPrevDropTarget;
201 : SvxIconChoiceCtrlEntry* pHdlEntry;
202 : SvxIconChoiceCtrlEntry* pDDRefEntry;
203 : VclPtr<VirtualDevice> pDDDev;
204 : VclPtr<VirtualDevice> pDDBufDev;
205 : VclPtr<VirtualDevice> pDDTempDev;
206 : VclPtr<VirtualDevice> pEntryPaintDev;
207 : SvxIconChoiceCtrlEntry* pAnchor; // for selection
208 : LocalFocus aFocus; // Data for focusrect
209 : ::svt::AccessibleFactoryAccess aAccFactory;
210 :
211 : SvxIconChoiceCtrlEntry* pCurEditedEntry;
212 : SvxIconChoiceCtrlTextMode eTextMode;
213 : SelectionMode eSelectionMode;
214 : sal_uLong nSelectionCount;
215 : SvxIconChoiceCtrlPositionMode ePositionMode;
216 : bool bBoundRectsDirty;
217 : bool bUpdateMode;
218 : bool bEntryEditingEnabled;
219 :
220 : void ShowCursor( bool bShow );
221 :
222 : void ImpArrange( bool bKeepPredecessors = false );
223 : void AdjustVirtSize( const Rectangle& );
224 : void ResetVirtSize();
225 : void CheckScrollBars();
226 :
227 : DECL_LINK( ScrollUpDownHdl, ScrollBar * );
228 : DECL_LINK( ScrollLeftRightHdl, ScrollBar * );
229 : DECL_LINK_TYPED(EditTimeoutHdl, Idle *, void);
230 : DECL_LINK( UserEventHdl, void* );
231 : DECL_LINK_TYPED( AutoArrangeHdl, Idle*, void );
232 : DECL_LINK_TYPED( DocRectChangedHdl, Idle*, void );
233 : DECL_LINK_TYPED( VisRectChangedHdl, Idle*, void );
234 : DECL_LINK_TYPED( CallSelectHdlHdl, Idle*, void );
235 :
236 : void AdjustScrollBars( bool bVirtSizeGrowedOnly = false);
237 : void PositionScrollBars( long nRealWidth, long nRealHeight );
238 658 : static long GetScrollBarPageSize( long nVisibleRange )
239 : {
240 658 : return ((nVisibleRange*75)/100);
241 : }
242 130 : long GetScrollBarLineSize() const
243 : {
244 130 : return nMaxBoundHeight / 2;
245 : }
246 : bool HandleScrollCommand( const CommandEvent& rCmd );
247 0 : void ToDocPos( Point& rPosPixel )
248 : {
249 0 : rPosPixel -= pView->GetMapMode().GetOrigin();
250 0 : }
251 : void InitScrollBarBox();
252 : void ToggleSelection( SvxIconChoiceCtrlEntry* );
253 : void DeselectAllBut( SvxIconChoiceCtrlEntry*, bool bPaintSync = false );
254 : void Center( SvxIconChoiceCtrlEntry* pEntry ) const;
255 203 : void StopEditTimer() { aEditIdle.Stop(); }
256 0 : void StartEditTimer() { aEditIdle.Start(); }
257 : void ImpHideDDIcon();
258 : void CallSelectHandler( SvxIconChoiceCtrlEntry* );
259 : void SelectRect(
260 : SvxIconChoiceCtrlEntry* pEntry1,
261 : SvxIconChoiceCtrlEntry* pEntry2,
262 : bool bAdd = true,
263 : std::vector<Rectangle*>* pOtherRects = 0
264 : );
265 :
266 : void SelectRange(
267 : SvxIconChoiceCtrlEntry* pStart,
268 : SvxIconChoiceCtrlEntry* pEnd,
269 : bool bAdd = true
270 : );
271 :
272 : void AddSelectedRect( const Rectangle& );
273 : void AddSelectedRect(
274 : SvxIconChoiceCtrlEntry* pEntry1,
275 : SvxIconChoiceCtrlEntry* pEntry2
276 : );
277 :
278 : void ClearSelectedRectList();
279 : void ClearColumnList();
280 : Rectangle CalcMaxTextRect( const SvxIconChoiceCtrlEntry* pEntry ) const;
281 :
282 : void ClipAtVirtOutRect( Rectangle& rRect ) const;
283 : void AdjustAtGrid( const SvxIconChoiceCtrlEntryPtrVec& rRow, SvxIconChoiceCtrlEntry* pStart=0 );
284 : Point AdjustAtGrid(
285 : const Rectangle& rCenterRect, // balance point of object (typically Bmp-Rect)
286 : const Rectangle& rBoundRect
287 : ) const;
288 : sal_uLong GetPredecessorGrid( const Point& rDocPos) const;
289 :
290 : void InitPredecessors();
291 : void ClearPredecessors();
292 :
293 : bool CheckVerScrollBar();
294 : bool CheckHorScrollBar();
295 : void CancelUserEvents();
296 : void EntrySelected(
297 : SvxIconChoiceCtrlEntry* pEntry,
298 : bool bSelect,
299 : bool bSyncPaint
300 : );
301 : void RepaintEntries( SvxIconViewFlags nEntryFlagsMask );
302 : void SetListPositions();
303 : void SetDefaultTextSize();
304 58 : bool IsAutoArrange() const
305 : {
306 58 : return (ePositionMode == IcnViewPositionModeAutoArrange);
307 : }
308 : bool IsAutoAdjust() const
309 : {
310 : return (ePositionMode == IcnViewPositionModeAutoAdjust);
311 : }
312 265 : void DocRectChanged() { aDocRectChangedIdle.Start(); }
313 157 : void VisRectChanged() { aVisRectChangedIdle.Start(); }
314 : void SetOrigin( const Point& );
315 :
316 : DECL_LINK(TextEditEndedHdl, void *);
317 :
318 : void ShowFocus ( Rectangle& rRect );
319 : void DrawFocusRect(vcl::RenderContext& rRenderContext);
320 :
321 : bool IsMnemonicChar( sal_Unicode cChar, sal_uLong& rPos ) const;
322 :
323 : public:
324 :
325 : long nGridDX;
326 : long nGridDY;
327 : long nHorSBarHeight;
328 : long nVerSBarWidth;
329 :
330 : SvxIconChoiceCtrl_Impl( SvtIconChoiceCtrl* pView, WinBits nWinStyle );
331 : ~SvxIconChoiceCtrl_Impl();
332 :
333 7 : bool SetChoiceWithCursor ( bool bDo = true ) { bool bOld = bChooseWithCursor; bChooseWithCursor = bDo; return bOld; }
334 : void Clear( bool bInCtor = false );
335 : void SetStyle( WinBits nWinStyle );
336 58 : WinBits GetStyle() const { return nWinBits; }
337 : void InsertEntry( SvxIconChoiceCtrlEntry*, size_t nPos, const Point* pPos=0 );
338 : void CreateAutoMnemonics( MnemonicGenerator* _pGenerator = NULL );
339 : void FontModified();
340 : void SelectAll( bool bSelect = true, bool bPaint = true );
341 : void SelectEntry(
342 : SvxIconChoiceCtrlEntry*,
343 : bool bSelect,
344 : bool bCallHdl = true,
345 : bool bAddToSelection = false,
346 : bool bSyncPaint = false
347 : );
348 : void Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect);
349 : bool MouseButtonDown( const MouseEvent& );
350 : bool MouseButtonUp( const MouseEvent& );
351 : bool MouseMove( const MouseEvent&);
352 : bool RequestHelp( const HelpEvent& rHEvt );
353 : void SetCursor_Impl(
354 : SvxIconChoiceCtrlEntry* pOldCursor,
355 : SvxIconChoiceCtrlEntry* pNewCursor,
356 : bool bMod1,
357 : bool bShift,
358 : bool bPaintSync = false
359 : );
360 : bool KeyInput( const KeyEvent& );
361 : void Resize();
362 : void GetFocus();
363 : void LoseFocus();
364 : void SetUpdateMode( bool bUpdate );
365 0 : bool GetUpdateMode() const { return bUpdateMode; }
366 : void PaintEntry(SvxIconChoiceCtrlEntry*, const Point&, vcl::RenderContext& rRenderContext, bool bIsBackgroundPainted = false);
367 :
368 : void SetEntryPos(
369 : SvxIconChoiceCtrlEntry* pEntry,
370 : const Point& rPos,
371 : bool bAdjustRow = false,
372 : bool bCheckScrollBars = false,
373 : bool bKeepGridMap = false
374 : );
375 :
376 : void InvalidateEntry( SvxIconChoiceCtrlEntry* );
377 :
378 : void SetNoSelection();
379 :
380 0 : SvxIconChoiceCtrlEntry* GetCurEntry() const { return pCursor; }
381 : void SetCursor(
382 : SvxIconChoiceCtrlEntry*,
383 : // true == carry selection when single-selecting
384 : bool bSyncSingleSelection = true,
385 : bool bShowFocusAsync = false
386 : );
387 :
388 : SvxIconChoiceCtrlEntry* GetEntry( const Point& rDocPos, bool bHit = false );
389 :
390 : void MakeEntryVisible( SvxIconChoiceCtrlEntry* pEntry, bool bBound = true );
391 :
392 : void Arrange(
393 : bool bKeepPredecessors = false,
394 : long nSetMaxVirtWidth =0,
395 : long nSetMaxVirtHeight =0
396 : );
397 :
398 : Rectangle CalcFocusRect( SvxIconChoiceCtrlEntry* );
399 : Rectangle CalcBmpRect( SvxIconChoiceCtrlEntry*, const Point* pPos = 0 );
400 : Rectangle CalcTextRect(
401 : SvxIconChoiceCtrlEntry*,
402 : const Point* pPos = 0,
403 : bool bForInplaceEdit = false,
404 : const OUString* pStr = 0
405 : );
406 :
407 : long CalcBoundingWidth( SvxIconChoiceCtrlEntry* ) const;
408 : long CalcBoundingHeight( SvxIconChoiceCtrlEntry* ) const;
409 : Size CalcBoundingSize( SvxIconChoiceCtrlEntry* ) const;
410 : void FindBoundingRect( SvxIconChoiceCtrlEntry* pEntry );
411 : void SetBoundingRect_Impl(
412 : SvxIconChoiceCtrlEntry* pEntry,
413 : const Point& rPos,
414 : const Size& rBoundingSize
415 : );
416 : // recalculates all invalid BoundRects
417 : void RecalcAllBoundingRectsSmart();
418 : const Rectangle& GetEntryBoundRect( SvxIconChoiceCtrlEntry* );
419 232 : void InvalidateBoundingRect( Rectangle& rRect )
420 : {
421 232 : rRect.Right() = LONG_MAX;
422 232 : bBoundRectsDirty = true;
423 232 : }
424 1142 : static bool IsBoundingRectValid( const Rectangle& rRect ) { return ( rRect.Right() != LONG_MAX ); }
425 :
426 : void PaintEmphasis(const Rectangle& rRect1, const Rectangle& rRect2, bool bSelected,
427 : bool bDropTarget, bool bCursored, vcl::RenderContext& rRenderContext,
428 : bool bIsBackgroundPainted = false);
429 :
430 : void PaintItem(const Rectangle& rRect, IcnViewFieldType eItem, SvxIconChoiceCtrlEntry* pEntry,
431 : sal_uInt16 nPaintFlags, vcl::RenderContext& rRenderContext, const OUString* pStr = 0,
432 : vcl::ControlLayoutData* _pLayoutData = NULL);
433 :
434 : // recalculates all BoundingRects if bMustRecalcBoundingRects == true
435 0 : void CheckBoundingRects() { if (bBoundRectsDirty) RecalcAllBoundingRectsSmart(); }
436 : // recalculates all invalidated BoundingRects
437 : void ShowTargetEmphasis( SvxIconChoiceCtrlEntry* pEntry, bool bShow );
438 : void Command( const CommandEvent& rCEvt );
439 : void ToTop( SvxIconChoiceCtrlEntry* );
440 :
441 : sal_uLong GetSelectionCount() const;
442 : void SetGrid( const Size& );
443 : Size GetMinGrid() const;
444 : void Scroll( long nDeltaX, long nDeltaY, bool bScrollBar = false );
445 : const Size& GetItemSize( SvxIconChoiceCtrlEntry*, IcnViewFieldType ) const;
446 :
447 : void HideDDIcon();
448 :
449 : static bool IsOver(
450 : std::vector<Rectangle*>* pSelectedRectList,
451 : const Rectangle& rEntryBoundRect
452 : );
453 :
454 : void SelectRect(
455 : const Rectangle&,
456 : bool bAdd = true,
457 : std::vector<Rectangle*>* pOtherRects = 0
458 : );
459 :
460 : bool IsTextHit( SvxIconChoiceCtrlEntry* pEntry, const Point& rDocPos );
461 : void MakeVisible(
462 : const Rectangle& rDocPos,
463 : bool bInScrollBarEvent=false,
464 : bool bCallRectChangedHdl = true
465 : );
466 :
467 : void AdjustEntryAtGrid( SvxIconChoiceCtrlEntry* pStart = 0 );
468 : #ifdef DBG_UTIL
469 : void SetEntryTextMode(
470 : SvxIconChoiceCtrlTextMode,
471 : SvxIconChoiceCtrlEntry* pEntry = 0
472 : );
473 : #endif
474 : void EnableEntryEditing( bool bEnable ) { bEntryEditingEnabled = bEnable; }
475 0 : bool IsEntryEditingEnabled() const { return bEntryEditingEnabled; }
476 0 : bool IsEntryEditing() const { return (pCurEditedEntry!=0); }
477 : void EditEntry( SvxIconChoiceCtrlEntry* pEntry );
478 : void StopEntryEditing( bool bCancel );
479 226 : size_t GetEntryCount() const { return aEntries.size(); }
480 264 : SvxIconChoiceCtrlEntry* GetEntry( size_t nPos )
481 : {
482 264 : return aEntries[ nPos ];
483 : }
484 0 : SvxIconChoiceCtrlEntry* GetEntry( size_t nPos ) const
485 : {
486 0 : return aEntries[ nPos ];
487 : }
488 : SvxIconChoiceCtrlEntry* GetFirstSelectedEntry( sal_uLong& ) const;
489 : SvxIconChoiceCtrlEntry* GetHdlEntry() const { return pHdlEntry; }
490 : void SetHdlEntry( SvxIconChoiceCtrlEntry* pEntry ) { pHdlEntry = pEntry; }
491 :
492 : SvxIconChoiceCtrlTextMode GetEntryTextModeSmart( const SvxIconChoiceCtrlEntry* pEntry ) const;
493 7 : void SetSelectionMode( SelectionMode eMode ) { eSelectionMode=eMode; }
494 : SelectionMode GetSelectionMode() const { return eSelectionMode; }
495 : bool AreEntriesMoved() const { return ((nFlags & F_MOVED_ENTRIES) != 0); }
496 0 : void SetEntriesMoved( bool bMoved )
497 : {
498 0 : if( bMoved )
499 0 : nFlags |= F_MOVED_ENTRIES;
500 : else
501 0 : nFlags &= ~(F_MOVED_ENTRIES);
502 0 : }
503 : sal_uLong GetEntryListPos( SvxIconChoiceCtrlEntry* ) const;
504 : void SetEntryImageSize( const Size& rSize ) { aImageSize = rSize; }
505 : void InitSettings();
506 : Rectangle GetOutputRect() const;
507 :
508 : bool ArePredecessorsSet() const { return (pHead != 0); }
509 : SvxIconChoiceCtrlEntry* GetPredecessorHead() const { return pHead; }
510 : void SetEntryPredecessor(SvxIconChoiceCtrlEntry* pEntry,SvxIconChoiceCtrlEntry* pPredecessor);
511 : // only delivers valid results when in AutoArrange mode!
512 : SvxIconChoiceCtrlEntry* FindEntryPredecessor( SvxIconChoiceCtrlEntry* pEntry, const Point& );
513 :
514 : void SetPositionMode( SvxIconChoiceCtrlPositionMode );
515 : SvxIconChoiceCtrlPositionMode GetPositionMode() const { return ePositionMode;}
516 :
517 : void SetColumn( sal_uInt16 nIndex, const SvxIconChoiceCtrlColumnInfo& );
518 : const SvxIconChoiceCtrlColumnInfo* GetColumn( sal_uInt16 nIndex ) const;
519 :
520 0 : Rectangle GetDocumentRect() const { return Rectangle( Point(), aVirtOutputSize ); }
521 0 : Rectangle GetVisibleRect() const { return GetOutputRect(); }
522 :
523 : void SetEntryHighlightFrame(
524 : SvxIconChoiceCtrlEntry* pEntry,
525 : bool bKeepHighlightFlags = false
526 : );
527 : void DrawHighlightFrame(vcl::RenderContext& rRenderContext, const Rectangle& rBmpRect, bool bHide);
528 : void StopSelectTimer() { aCallSelectHdlIdle.Stop(); }
529 :
530 : void CallEventListeners( sal_uLong nEvent, void* pData = NULL );
531 :
532 0 : inline ::svt::IAccessibleFactory& GetAccessibleFactory()
533 : {
534 0 : return aAccFactory.getFactory();
535 : }
536 : };
537 :
538 :
539 :
540 : typedef std::map<sal_uInt16, SvxIconChoiceCtrlEntryPtrVec> IconChoiceMap;
541 :
542 : class IcnCursor_Impl
543 : {
544 : SvxIconChoiceCtrl_Impl* pView;
545 : std::unique_ptr<IconChoiceMap> xColumns;
546 : std::unique_ptr<IconChoiceMap> xRows;
547 : long nCols;
548 : long nRows;
549 : short nDeltaWidth;
550 : short nDeltaHeight;
551 : SvxIconChoiceCtrlEntry* pCurEntry;
552 : void SetDeltas();
553 : void ImplCreate();
554 0 : void Create() { if( !xColumns ) ImplCreate(); }
555 :
556 : sal_uInt16 GetSortListPos(
557 : SvxIconChoiceCtrlEntryPtrVec& rList,
558 : long nValue,
559 : bool bVertical);
560 : SvxIconChoiceCtrlEntry* SearchCol(
561 : sal_uInt16 nCol,
562 : sal_uInt16 nTop,
563 : sal_uInt16 nBottom,
564 : sal_uInt16 nPref,
565 : bool bDown,
566 : bool bSimple
567 : );
568 :
569 : SvxIconChoiceCtrlEntry* SearchRow(
570 : sal_uInt16 nRow,
571 : sal_uInt16 nRight,
572 : sal_uInt16 nLeft,
573 : sal_uInt16 nPref,
574 : bool bRight,
575 : bool bSimple
576 : );
577 :
578 : public:
579 : explicit IcnCursor_Impl( SvxIconChoiceCtrl_Impl* pOwner );
580 : ~IcnCursor_Impl();
581 : void Clear();
582 :
583 : // for Cursortravelling etc.
584 : SvxIconChoiceCtrlEntry* GoLeftRight( SvxIconChoiceCtrlEntry*, bool bRight );
585 : SvxIconChoiceCtrlEntry* GoUpDown( SvxIconChoiceCtrlEntry*, bool bDown );
586 : SvxIconChoiceCtrlEntry* GoPageUpDown( SvxIconChoiceCtrlEntry*, bool bDown );
587 :
588 : // Creates a list of entries for every row (height = nGridDY) sorted by
589 : // BoundRect.Left(). A list may be empty. The lists become the property of
590 : // the caller and have to be deleted with DestroyGridAdjustData.
591 : void CreateGridAjustData( IconChoiceMap& pLists, SvxIconChoiceCtrlEntry* pRow=0);
592 : static void DestroyGridAdjustData( IconChoiceMap& rLists );
593 : };
594 :
595 :
596 :
597 : typedef sal_uLong GridId;
598 :
599 : #define GRID_NOT_FOUND ((GridId)ULONG_MAX)
600 :
601 : class IcnGridMap_Impl
602 : {
603 : Rectangle _aLastOccupiedGrid;
604 : SvxIconChoiceCtrl_Impl* _pView;
605 : bool * _pGridMap;
606 : sal_uInt16 _nGridCols, _nGridRows;
607 :
608 : void Expand();
609 : void Create_Impl();
610 1356 : void Create() { if(!_pGridMap) Create_Impl(); }
611 :
612 : void GetMinMapSize( sal_uInt16& rDX, sal_uInt16& rDY ) const;
613 :
614 : public:
615 : explicit IcnGridMap_Impl(SvxIconChoiceCtrl_Impl* pView);
616 : ~IcnGridMap_Impl();
617 :
618 : void Clear();
619 :
620 : GridId GetGrid( const Point& rDocPos, bool* pbClipped = 0 );
621 : GridId GetGrid( sal_uInt16 nGridX, sal_uInt16 nGridY );
622 : GridId GetUnoccupiedGrid( bool bOccupyFound=true );
623 :
624 : void OccupyGrids( const SvxIconChoiceCtrlEntry*, bool bOccupy = true );
625 288 : void OccupyGrid( GridId nId, bool bOccupy = true )
626 : {
627 : DBG_ASSERT(!_pGridMap || nId<(sal_uLong)(_nGridCols*_nGridRows),"OccupyGrid: Bad GridId");
628 288 : if(_pGridMap && nId < (sal_uLong)(_nGridCols *_nGridRows) )
629 288 : _pGridMap[ nId ] = bOccupy;
630 288 : }
631 :
632 : Rectangle GetGridRect( GridId );
633 : void GetGridCoord( GridId, sal_uInt16& rGridX, sal_uInt16& rGridY );
634 : static sal_uLong GetGridCount(
635 : const Size& rSizePixel,
636 : sal_uInt16 nGridWidth,
637 : sal_uInt16 nGridHeight
638 : );
639 :
640 : void OutputSizeChanged();
641 : };
642 :
643 : #endif
644 :
645 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|