/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef _IMPICNVW_HXX #define _IMPICNVW_HXX #ifndef _VIRDEV_HXX #include #endif #ifndef _SCRBAR_HXX #include #endif #include #include #include #include "svtaccessiblefactory.hxx" #include #include #include class IcnCursor_Impl; class SvtIconChoiceCtrl; class SvxIconChoiceCtrlEntry; class IcnViewEdit_Impl; class IcnGridMap_Impl; /////////////////////////////////////////////////////////////////////////////// // // some defines // #define PAINTFLAG_HOR_CENTERED 0x0001 #define PAINTFLAG_VER_CENTERED 0x0002 #define F_VER_SBARSIZE_WITH_HBAR 0x0001 #define F_HOR_SBARSIZE_WITH_VBAR 0x0002 #define F_PAINTED 0x0004 // sal_True nach erstem Paint #define F_ADD_MODE 0x0008 #define F_SELECTING_RECT 0x0020 #define F_DOWN_CTRL 0x0080 #define F_DOWN_DESELECT 0x0100 #define F_START_EDITTIMER_IN_MOUSEUP 0x0400 #define F_MOVED_ENTRIES 0x0800 #define F_ENTRYLISTPOS_VALID 0x1000 #define F_CLEARING_SELECTION 0x2000 #define F_ARRANGING 0x4000 // alle Angaben in Pixel // Abstaende von Fensterraendern #define LROFFS_WINBORDER 4 #define TBOFFS_WINBORDER 4 // fuer das Bounding-Rectangle #define LROFFS_BOUND 2 #define TBOFFS_BOUND 2 // Abstand Fokusrechteck - Icon #define LROFFS_ICON 2 #define TBOFFS_ICON 2 // Abstaende Icon - Text #define HOR_DIST_BMP_STRING 3 #define VER_DIST_BMP_STRING 3 // Breitenoffset Highlight-Rect bei Text #define LROFFS_TEXT 2 #define DEFAULT_MAX_VIRT_WIDTH 200 #define DEFAULT_MAX_VIRT_HEIGHT 200 #define VIEWMODE_MASK (WB_ICON | WB_SMALLICON | WB_DETAILS) /////////////////////////////////////////////////////////////////////////////// // // // enum IcnViewFieldType { IcnViewFieldTypeDontknow = 0, IcnViewFieldTypeImage = 1, IcnViewFieldTypeText = 2 }; /////////////////////////////////////////////////////////////////////////////// // // Data about the focus of entries // struct LocalFocus { sal_Bool bOn; Rectangle aRect; Color aPenColor; LocalFocus() { bOn = sal_False; } }; /////////////////////////////////////////////////////////////////////////////// // // Entry-List // class EntryList_Impl : public List { private: using List::Replace; SvxIconChoiceCtrl_Impl* _pOwner; void Removed_Impl( SvxIconChoiceCtrlEntry* pEntry ); public: EntryList_Impl( SvxIconChoiceCtrl_Impl*, sal_uInt16 _nInitSize = 1024, sal_uInt16 _nReSize = 1024 ); EntryList_Impl( SvxIconChoiceCtrl_Impl*, sal_uInt16 _nBlockSize, sal_uInt16 _nInitSize, sal_uInt16 _nReSize ); ~EntryList_Impl(); void Clear(); void Insert( SvxIconChoiceCtrlEntry* pEntry, sal_uLong nPos ); SvxIconChoiceCtrlEntry* Remove( sal_uLong nPos ); void Remove( SvxIconChoiceCtrlEntry* pEntry ); }; /////////////////////////////////////////////////////////////////////////////// // // Implementation-class of IconChoiceCtrl // class SvxIconChoiceCtrl_Impl { friend class IcnCursor_Impl; friend class EntryList_Impl; friend class IcnGridMap_Impl; sal_Bool bChooseWithCursor; EntryList_Impl aEntries; ScrollBar aVerSBar; ScrollBar aHorSBar; ScrollBarBox aScrBarBox; Rectangle aCurSelectionRect; SvPtrarr aSelectedRectList; Timer aEditTimer; // fuer Inplace-Editieren Timer aAutoArrangeTimer; Timer aDocRectChangedTimer; Timer aVisRectChangedTimer; Timer aCallSelectHdlTimer; Size aVirtOutputSize; Size aImageSize; Size aDefaultTextSize; Size aOutputSize; // Pixel Point aDDLastEntryPos; Point aDDLastRectPos; Point aDDPaintOffs; Point aDDStartPos; SvtIconChoiceCtrl* pView; IcnCursor_Impl* pImpCursor; IcnGridMap_Impl* pGridMap; long nMaxVirtWidth; // max. Breite aVirtOutputSize bei ALIGN_TOP long nMaxVirtHeight; // max. Hoehe aVirtOutputSize bei ALIGN_LEFT List* pZOrderList; SvPtrarr* pColumns; IcnViewEdit_Impl* pEdit; WinBits nWinBits; long nMaxBoundHeight; // Hoehe des hoechsten BoundRects sal_uInt16 nFlags; sal_uInt16 nCurTextDrawFlags; sal_uLong nUserEventAdjustScrBars; sal_uLong nUserEventShowCursor; SvxIconChoiceCtrlEntry* pCurHighlightFrame; sal_Bool bHighlightFramePressed; SvxIconChoiceCtrlEntry* pHead; // Eintrag oben links SvxIconChoiceCtrlEntry* pCursor; SvxIconChoiceCtrlEntry* pPrevDropTarget; SvxIconChoiceCtrlEntry* pHdlEntry; SvxIconChoiceCtrlEntry* pDDRefEntry; VirtualDevice* pDDDev; VirtualDevice* pDDBufDev; VirtualDevice* pDDTempDev; VirtualDevice* pEntryPaintDev; SvxIconChoiceCtrlEntry* pAnchor; // fuer Selektion LocalFocus aFocus; // Data for focusrect ::svt::AccessibleFactoryAccess aAccFactory; List* pDraggedSelection; SvxIconChoiceCtrlEntry* pCurEditedEntry; SvxIconChoiceCtrlTextMode eTextMode; SelectionMode eSelectionMode; sal_uLong nSelectionCount; SvxIconChoiceCtrlPositionMode ePositionMode; sal_Bool bBoundRectsDirty; sal_Bool bUpdateMode; sal_Bool bEntryEditingEnabled; sal_Bool bInDragDrop; void ShowCursor( sal_Bool bShow ); void ImpArrange( sal_Bool bKeepPredecessors = sal_False ); void AdjustVirtSize( const Rectangle& ); void ResetVirtSize(); void CheckScrollBars(); DECL_LINK( ScrollUpDownHdl, ScrollBar * ); DECL_LINK( ScrollLeftRightHdl, ScrollBar * ); DECL_LINK( EditTimeoutHdl, Timer* ); DECL_LINK( UserEventHdl, void* ); DECL_LINK( EndScrollHdl, void* ); DECL_LINK( AutoArrangeHdl, void* ); DECL_LINK( DocRectChangedHdl, void* ); DECL_LINK( VisRectChangedHdl, void* ); DECL_LINK( CallSelectHdlHdl, void* ); void AdjustScrollBars( sal_Bool bVirtSizeGrowedOnly = sal_False); void PositionScrollBars( long nRealWidth, long nRealHeight ); long GetScrollBarPageSize( long nVisibleRange ) const { return ((nVisibleRange*75)/100); } long GetScrollBarLineSize() const { return nMaxBoundHeight / 2; } sal_Bool HandleScrollCommand( const CommandEvent& rCmd ); void ToDocPos( Point& rPosPixel ) { rPosPixel -= pView->GetMapMode().GetOrigin(); } void InitScrollBarBox(); SvxIconChoiceCtrlEntry* FindNewCursor(); void ToggleSelection( SvxIconChoiceCtrlEntry* ); void DeselectAllBut( SvxIconChoiceCtrlEntry*, sal_Bool bPaintSync=sal_False ); void Center( SvxIconChoiceCtrlEntry* pEntry ) const; void StopEditTimer() { aEditTimer.Stop(); } void StartEditTimer() { aEditTimer.Start(); } void ImpHideDDIcon(); void CallSelectHandler( SvxIconChoiceCtrlEntry* ); void SelectRect( SvxIconChoiceCtrlEntry* pEntry1, SvxIconChoiceCtrlEntry* pEntry2, sal_Bool bAdd = sal_True, SvPtrarr* pOtherRects = 0 ); void SelectRange( SvxIconChoiceCtrlEntry* pStart, SvxIconChoiceCtrlEntry* pEnd, sal_Bool bAdd = sal_True ); void AddSelectedRect( const Rectangle& ); void AddSelectedRect( SvxIconChoiceCtrlEntry* pEntry1, SvxIconChoiceCtrlEntry* pEntry2 ); void ClearSelectedRectList(); void ClearColumnList(); Rectangle CalcMaxTextRect( const SvxIconChoiceCtrlEntry* pEntry ) const; void ClipAtVirtOutRect( Rectangle& rRect ) const; void AdjustAtGrid( const SvPtrarr& rRow, SvxIconChoiceCtrlEntry* pStart=0 ); Point AdjustAtGrid( const Rectangle& rCenterRect, // "Schwerpunkt" des Objekts (typ. Bmp-Rect) const Rectangle& rBoundRect ) const; sal_uLong GetPredecessorGrid( const Point& rDocPos) const; void InitPredecessors(); void ClearPredecessors(); sal_Bool CheckVerScrollBar(); sal_Bool CheckHorScrollBar(); void CancelUserEvents(); void EntrySelected( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bSelect, sal_Bool bSyncPaint ); void SaveSelection( List** ); void RepaintEntries( sal_uInt16 nEntryFlagsMask ); void SetListPositions(); void SetDefaultTextSize(); sal_Bool IsAutoArrange() const { return (sal_Bool)(ePositionMode == IcnViewPositionModeAutoArrange); } sal_Bool IsAutoAdjust() const { return (sal_Bool)(ePositionMode == IcnViewPositionModeAutoAdjust); } void DocRectChanged() { aDocRectChangedTimer.Start(); } void VisRectChanged() { aVisRectChangedTimer.Start(); } void SetOrigin( const Point&, sal_Bool bDoNotUpdateWallpaper = sal_False ); DECL_LINK( TextEditEndedHdl, IcnViewEdit_Impl* ); void ShowFocus ( Rectangle& rRect ); void HideFocus (); void DrawFocusRect ( OutputDevice* pOut ); sal_Bool IsMnemonicChar( sal_Unicode cChar, sal_uLong& rPos ) const; public: long nGridDX, nGridDY; long nHorSBarHeight, nVerSBarWidth; SvxIconChoiceCtrl_Impl( SvtIconChoiceCtrl* pView, WinBits nWinStyle ); ~SvxIconChoiceCtrl_Impl(); sal_Bool SetChoiceWithCursor ( sal_Bool bDo = sal_True ) { sal_Bool bOld=bChooseWithCursor; bChooseWithCursor = bDo; return bOld; } void Clear( sal_Bool bInCtor = sal_False ); void SetStyle( WinBits nWinStyle ); WinBits GetStyle() const { return nWinBits; } void InsertEntry( SvxIconChoiceCtrlEntry*, sal_uLong nPos, const Point* pPos=0 ); void CreateAutoMnemonics( MnemonicGenerator* _pGenerator = NULL ); void RemoveEntry( SvxIconChoiceCtrlEntry* pEntry ); void FontModified(); void SelectAll( sal_Bool bSelect = sal_True, sal_Bool bPaint = sal_True ); void SelectEntry( SvxIconChoiceCtrlEntry*, sal_Bool bSelect, sal_Bool bCallHdl = sal_True, sal_Bool bAddToSelection = sal_False, sal_Bool bSyncPaint = sal_False ); void Paint( const Rectangle& rRect ); sal_Bool MouseButtonDown( const MouseEvent& ); sal_Bool MouseButtonUp( const MouseEvent& ); sal_Bool MouseMove( const MouseEvent&); sal_Bool RequestHelp( const HelpEvent& rHEvt ); void SetCursor_Impl( SvxIconChoiceCtrlEntry* pOldCursor, SvxIconChoiceCtrlEntry* pNewCursor, sal_Bool bMod1, sal_Bool bShift, sal_Bool bPaintSync = sal_False); sal_Bool KeyInput( const KeyEvent& ); void Resize(); void GetFocus(); void LoseFocus(); void SetUpdateMode( sal_Bool bUpdate ); sal_Bool GetUpdateMode() const { return bUpdateMode; } void PaintEntry( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bIsBackgroundPainted=sal_False ); void PaintEntry( SvxIconChoiceCtrlEntry*, const Point&, OutputDevice* pOut = 0, sal_Bool bIsBackgroundPainted = sal_False); void PaintEntryVirtOutDev( SvxIconChoiceCtrlEntry* ); void SetEntryPos( SvxIconChoiceCtrlEntry* pEntry, const Point& rPos, sal_Bool bAdjustRow = sal_False, sal_Bool bCheckScrollBars = sal_False, sal_Bool bKeepGridMap = sal_False ); void InvalidateEntry( SvxIconChoiceCtrlEntry* ); IcnViewFieldType GetItem( SvxIconChoiceCtrlEntry*, const Point& rAbsPos ); void SetNoSelection(); SvxIconChoiceCtrlEntry* GetCurEntry() const { return pCursor; } void SetCursor( SvxIconChoiceCtrlEntry*, // sal_True == bei Single-Selection die Sel. mitfuehren sal_Bool bSyncSingleSelection = sal_True, sal_Bool bShowFocusAsync = sal_False ); SvxIconChoiceCtrlEntry* GetEntry( const Point& rDocPos, sal_Bool bHit = sal_False ); SvxIconChoiceCtrlEntry* GetNextEntry( const Point& rDocPos, SvxIconChoiceCtrlEntry* pCurEntry ); SvxIconChoiceCtrlEntry* GetPrevEntry( const Point& rDocPos, SvxIconChoiceCtrlEntry* pCurEntry ); Point GetEntryPos( SvxIconChoiceCtrlEntry* ); void MakeEntryVisible( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bBound = sal_True ); void Arrange(sal_Bool bKeepPredecessors = sal_False, long nSetMaxVirtWidth =0, long nSetMaxVirtHeight =0 ); Rectangle CalcFocusRect( SvxIconChoiceCtrlEntry* ); Rectangle CalcBmpRect( SvxIconChoiceCtrlEntry*, const Point* pPos = 0 ); Rectangle CalcTextRect( SvxIconChoiceCtrlEntry*, const Point* pPos = 0, sal_Bool bForInplaceEdit = sal_False, const String* pStr = 0 ); long CalcBoundingWidth( SvxIconChoiceCtrlEntry* ) const; long CalcBoundingHeight( SvxIconChoiceCtrlEntry* ) const; Size CalcBoundingSize( SvxIconChoiceCtrlEntry* ) const; void FindBoundingRect( SvxIconChoiceCtrlEntry* pEntry ); void SetBoundingRect_Impl( SvxIconChoiceCtrlEntry* pEntry, const Point& rPos, const Size& rBoundingSize ); // berechnet alle BoundRects neu void RecalcAllBoundingRects(); // berechnet alle ungueltigen BoundRects neu void RecalcAllBoundingRectsSmart(); const Rectangle& GetEntryBoundRect( SvxIconChoiceCtrlEntry* ); void InvalidateBoundingRect( SvxIconChoiceCtrlEntry* ); void InvalidateBoundingRect( Rectangle& rRect ) { rRect.Right() = LONG_MAX; bBoundRectsDirty = sal_True; } sal_Bool IsBoundingRectValid( const Rectangle& rRect ) const { return (sal_Bool)( rRect.Right() != LONG_MAX ); } void PaintEmphasis( const Rectangle& rRect1, const Rectangle& rRect2, sal_Bool bSelected, sal_Bool bDropTarget, sal_Bool bCursored, OutputDevice* pOut, sal_Bool bIsBackgroundPainted = sal_False); void PaintItem( const Rectangle& rRect, IcnViewFieldType eItem, SvxIconChoiceCtrlEntry* pEntry, sal_uInt16 nPaintFlags, OutputDevice* pOut, const String* pStr = 0, ::vcl::ControlLayoutData* _pLayoutData = NULL ); // berechnet alle BoundingRects neu, wenn bMustRecalcBoundingRects == sal_True void CheckBoundingRects() { if (bBoundRectsDirty) RecalcAllBoundingRectsSmart(); } // berechnet alle invalidierten BoundingRects neu void UpdateBoundingRects(); void ShowTargetEmphasis( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bShow ); void PrepareCommandEvent( const CommandEvent& ); void Command( const CommandEvent& rCEvt ); void ToTop( SvxIconChoiceCtrlEntry* ); sal_uLong GetSelectionCount() const; void SetGrid( const Size& ); Size GetMinGrid() const; sal_uLong GetGridCount( const Size& rSize, sal_Bool bCheckScrBars, sal_Bool bSmartScrBar ) const; void Scroll( long nDeltaX, long nDeltaY, sal_Bool bScrollBar = sal_False ); const Size& GetItemSize( SvxIconChoiceCtrlEntry*, IcnViewFieldType ) const; void HideDDIcon(); void ShowDDIcon( SvxIconChoiceCtrlEntry* pRefEntry, const Point& rPos ); void HideShowDDIcon( SvxIconChoiceCtrlEntry* pRefEntry, const Point& rPos ); sal_Bool IsOver( SvPtrarr* pSelectedRectList, const Rectangle& rEntryBoundRect ) const; void SelectRect( const Rectangle&, sal_Bool bAdd = sal_True, SvPtrarr* pOtherRects = 0 ); void CalcScrollOffsets( const Point& rRefPosPixel, long& rX, long& rY, sal_Bool bDragDrop = sal_False, sal_uInt16 nBorderWidth = 10 ); sal_Bool IsTextHit( SvxIconChoiceCtrlEntry* pEntry, const Point& rDocPos ); void MakeVisible( const Rectangle& rDocPos, sal_Bool bInScrollBarEvent=sal_False, sal_Bool bCallRectChangedHdl = sal_True ); void AdjustEntryAtGrid( SvxIconChoiceCtrlEntry* pStart = 0 ); void SetEntryTextMode( SvxIconChoiceCtrlTextMode, SvxIconChoiceCtrlEntry* pEntry = 0 ); SvxIconChoiceCtrlTextMode GetTextMode( const SvxIconChoiceCtrlEntry* pEntry = 0 ) const; void ShowEntryFocusRect( const SvxIconChoiceCtrlEntry* pEntry ); void EnableEntryEditing( sal_Bool bEnable ) { bEntryEditingEnabled = bEnable; } sal_Bool IsEntryEditingEnabled() const { return bEntryEditingEnabled; } sal_Bool IsEntryEditing() const { return (sal_Bool)(pCurEditedEntry!=0); } void EditEntry( SvxIconChoiceCtrlEntry* pEntry ); void StopEntryEditing( sal_Bool bCancel ); void LockEntryPos( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bLock ); sal_uLong GetEntryCount() const { return aEntries.Count(); } SvxIconChoiceCtrlEntry* GetEntry( sal_uLong nPos ) const { return (SvxIconChoiceCtrlEntry*)aEntries.GetObject(nPos); } SvxIconChoiceCtrlEntry* GetFirstSelectedEntry( sal_uLong& ) const; SvxIconChoiceCtrlEntry* GetNextSelectedEntry( sal_uLong& ) const; SvxIconChoiceCtrlEntry* GetHdlEntry() const { return pHdlEntry; } void SetHdlEntry( SvxIconChoiceCtrlEntry* pEntry ) { pHdlEntry = pEntry; } SvxIconChoiceCtrlTextMode GetEntryTextModeSmart( const SvxIconChoiceCtrlEntry* pEntry ) const; void SetSelectionMode( SelectionMode eMode ) { eSelectionMode=eMode; } SelectionMode GetSelectionMode() const { return eSelectionMode; } sal_Bool AreEntriesMoved() const { return (sal_Bool)((nFlags & F_MOVED_ENTRIES)!=0); } void SetEntriesMoved( sal_Bool bMoved ) { if( bMoved ) nFlags |= F_MOVED_ENTRIES; else nFlags &= ~(F_MOVED_ENTRIES); } sal_uLong GetEntryListPos( SvxIconChoiceCtrlEntry* ) const; void SetEntryListPos( SvxIconChoiceCtrlEntry* pEntry, sal_uLong nNewPos ); void SetEntryImageSize( const Size& rSize ) { aImageSize = rSize; } void SetEntryFlags( SvxIconChoiceCtrlEntry* pEntry, sal_uInt16 nFlags ); SvxIconChoiceCtrlEntry* GoLeftRight( SvxIconChoiceCtrlEntry*, sal_Bool bRight ); SvxIconChoiceCtrlEntry* GoUpDown( SvxIconChoiceCtrlEntry*, sal_Bool bDown ); void InitSettings(); Rectangle GetOutputRect() const; sal_Bool ArePredecessorsSet() const { return (sal_Bool)(pHead != 0); } SvxIconChoiceCtrlEntry* GetPredecessorHead() const { return pHead; } void SetEntryPredecessor(SvxIconChoiceCtrlEntry* pEntry,SvxIconChoiceCtrlEntry* pPredecessor); sal_Bool GetEntryPredecessor(SvxIconChoiceCtrlEntry* pEntry,SvxIconChoiceCtrlEntry** ppPredecessor); // liefert gueltige Ergebnisse nur im AutoArrange-Modus! SvxIconChoiceCtrlEntry* FindEntryPredecessor( SvxIconChoiceCtrlEntry* pEntry, const Point& ); void SetPositionMode( SvxIconChoiceCtrlPositionMode ); SvxIconChoiceCtrlPositionMode GetPositionMode() const { return ePositionMode;} void Flush(); void SetColumn( sal_uInt16 nIndex, const SvxIconChoiceCtrlColumnInfo& ); const SvxIconChoiceCtrlColumnInfo* GetColumn( sal_uInt16 nIndex ) const; const SvxIconChoiceCtrlColumnInfo* GetItemColumn( sal_uInt16 nSubItem, long& rLeft ) const; Rectangle GetDocumentRect() const { return Rectangle( Point(), aVirtOutputSize ); } Rectangle GetVisibleRect() const { return GetOutputRect(); } void SetEntryHighlightFrame( SvxIconChoiceCtrlEntry* pEntry,sal_Bool bKeepHighlightFlags=sal_False ); void HideEntryHighlightFrame(); void DrawHighlightFrame( OutputDevice* pOut, const Rectangle& rBmpRect, sal_Bool bHide ); void StopSelectTimer() { aCallSelectHdlTimer.Stop(); } void Tracking( const TrackingEvent& rTEvt ); Point GetPopupMenuPosPixel() const; sal_Bool HandleShortCutKey( const KeyEvent& rKeyEvent ); void CallEventListeners( sal_uLong nEvent, void* pData = NULL ); inline ::svt::IAccessibleFactory& GetAccessibleFactory() { return aAccFactory.getFactory(); } }; // ---------------------------------------------------------------------------------------------- class IcnCursor_Impl { SvxIconChoiceCtrl_Impl* pView; SvPtrarr* pColumns; SvPtrarr* pRows; long nCols; long nRows; short nDeltaWidth; short nDeltaHeight; SvxIconChoiceCtrlEntry* pCurEntry; void SetDeltas(); void ImplCreate(); void Create() { if( !pColumns ) ImplCreate(); } sal_uInt16 GetSortListPos( SvPtrarr* pList, long nValue, int bVertical); SvxIconChoiceCtrlEntry* SearchCol(sal_uInt16 nCol,sal_uInt16 nTop,sal_uInt16 nBottom,sal_uInt16 nPref, sal_Bool bDown, sal_Bool bSimple ); SvxIconChoiceCtrlEntry* SearchRow(sal_uInt16 nRow,sal_uInt16 nRight,sal_uInt16 nLeft,sal_uInt16 nPref, sal_Bool bRight, sal_Bool bSimple ); public: IcnCursor_Impl( SvxIconChoiceCtrl_Impl* pOwner ); ~IcnCursor_Impl(); void Clear(); // fuer Cursortravelling usw. SvxIconChoiceCtrlEntry* GoLeftRight( SvxIconChoiceCtrlEntry*, sal_Bool bRight ); SvxIconChoiceCtrlEntry* GoUpDown( SvxIconChoiceCtrlEntry*, sal_Bool bDown ); SvxIconChoiceCtrlEntry* GoPageUpDown( SvxIconChoiceCtrlEntry*, sal_Bool bDown ); // Erzeugt fuer jede Zeile (Hoehe=nGridDY) eine nach BoundRect.Left() // sortierte Liste der Eintraege, die in ihr stehen. Eine Liste kann // leer sein. Die Listen gehen in das Eigentum des Rufenden ueber und // muessen mit DestroyGridAdjustData geloescht werden void CreateGridAjustData( SvPtrarr& pLists, SvxIconChoiceCtrlEntry* pRow=0); static void DestroyGridAdjustData( SvPtrarr& rLists ); }; // ---------------------------------------------------------------------------------------------- typedef sal_uLong GridId; #define GRID_NOT_FOUND ((GridId)ULONG_MAX) class IcnGridMap_Impl { Rectangle _aLastOccupiedGrid; SvxIconChoiceCtrl_Impl* _pView; sal_Bool* _pGridMap; sal_uInt16 _nGridCols, _nGridRows; void Expand(); void Create_Impl(); void Create() { if(!_pGridMap) Create_Impl(); } void GetMinMapSize( sal_uInt16& rDX, sal_uInt16& rDY ) const; public: IcnGridMap_Impl(SvxIconChoiceCtrl_Impl* pView); ~IcnGridMap_Impl(); void Clear(); GridId GetGrid( const Point& rDocPos, sal_Bool* pbClipped = 0 ); GridId GetGrid( sal_uInt16 nGridX, sal_uInt16 nGridY ); GridId GetUnoccupiedGrid( sal_Bool bOccupyFound=sal_True ); void OccupyGrids( const Rectangle&, sal_Bool bOccupy = sal_True ); void OccupyGrids( const SvxIconChoiceCtrlEntry*, sal_Bool bOccupy = sal_True ); void OccupyGrid( GridId nId, sal_Bool bOccupy = sal_True ) { DBG_ASSERT(!_pGridMap || nId<(sal_uLong)(_nGridCols*_nGridRows),"OccupyGrid: Bad GridId"); if(_pGridMap && nId < (sal_uLong)(_nGridCols *_nGridRows) ) _pGridMap[ nId ] = bOccupy; } Rectangle GetGridRect( GridId ); void GetGridCoord( GridId, sal_uInt16& rGridX, sal_uInt16& rGridY ); static sal_uLong GetGridCount( const Size& rSizePixel, sal_uInt16 nGridWidth, sal_uInt16 nGridHeight ); void OutputSizeChanged(); }; #endif