office-gobmx/svtools/source/contnr/imivctl.hxx
2011-11-14 07:35:58 +00:00

674 lines
29 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#ifndef _IMPICNVW_HXX
#define _IMPICNVW_HXX
#include <vcl/virdev.hxx>
#include <vcl/scrbar.hxx>
#include <vcl/timer.hxx>
#include <vcl/seleng.hxx>
#include <tools/debug.hxx>
#include "svtaccessiblefactory.hxx"
#include <limits.h>
#include <svtools/ivctrl.hxx>
#include <svl/svarray.hxx>
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
//
typedef ::std::vector< SvxIconChoiceCtrlEntry* > SvxIconChoiceCtrlEntryList_impl;
class EntryList_Impl
{
private:
SvxIconChoiceCtrlEntryList_impl maIconChoiceCtrlEntryList;
SvxIconChoiceCtrl_Impl* _pOwner;
public:
EntryList_Impl( SvxIconChoiceCtrl_Impl* );
~EntryList_Impl();
void clear();
size_t size()
{
return maIconChoiceCtrlEntryList.size();
}
size_t size() const
{
return maIconChoiceCtrlEntryList.size();
}
SvxIconChoiceCtrlEntry* operator[]( size_t nPos )
{
return ( nPos < maIconChoiceCtrlEntryList.size() )
? maIconChoiceCtrlEntryList[ nPos ]
: NULL;
}
SvxIconChoiceCtrlEntry* operator[]( size_t nPos ) const
{
return ( nPos < maIconChoiceCtrlEntryList.size() )
? maIconChoiceCtrlEntryList[ nPos ]
: NULL;
}
void insert( size_t nPos, 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
SvxIconChoiceCtrlEntryList_impl* 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;
SvxIconChoiceCtrlEntry* pCurEditedEntry;
SvxIconChoiceCtrlTextMode eTextMode;
SelectionMode eSelectionMode;
sal_uLong nSelectionCount;
SvxIconChoiceCtrlPositionMode ePositionMode;
sal_Bool bBoundRectsDirty;
sal_Bool bUpdateMode;
sal_Bool bEntryEditingEnabled;
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();
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 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 DrawFocusRect ( OutputDevice* pOut );
sal_Bool IsMnemonicChar( sal_Unicode cChar, sal_uLong& rPos ) const;
public:
long nGridDX;
long nGridDY;
long nHorSBarHeight;
long 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*, size_t nPos, const Point* pPos=0 );
void CreateAutoMnemonics( MnemonicGenerator* _pGenerator = NULL );
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* );
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 );
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 ungueltigen BoundRects neu
void RecalcAllBoundingRectsSmart();
const Rectangle& GetEntryBoundRect( 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 ShowTargetEmphasis( SvxIconChoiceCtrlEntry* pEntry, sal_Bool bShow );
void Command( const CommandEvent& rCEvt );
void ToTop( SvxIconChoiceCtrlEntry* );
sal_uLong GetSelectionCount() const;
void SetGrid( const Size& );
Size GetMinGrid() const;
void Scroll( long nDeltaX, long nDeltaY, sal_Bool bScrollBar = sal_False );
const Size& GetItemSize( SvxIconChoiceCtrlEntry*, IcnViewFieldType ) const;
void HideDDIcon();
sal_Bool IsOver(
SvPtrarr* pSelectedRectList,
const Rectangle& rEntryBoundRect
) const;
void SelectRect(
const Rectangle&,
sal_Bool bAdd = sal_True,
SvPtrarr* pOtherRects = 0
);
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
);
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 );
size_t GetEntryCount() const { return aEntries.size(); }
SvxIconChoiceCtrlEntry* GetEntry( size_t nPos )
{
return aEntries[ nPos ];
}
SvxIconChoiceCtrlEntry* GetEntry( size_t nPos ) const
{
return aEntries[ nPos ];
}
SvxIconChoiceCtrlEntry* GetFirstSelectedEntry( 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 SetEntryImageSize( const Size& rSize ) { aImageSize = rSize; }
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);
// liefert gueltige Ergebnisse nur im AutoArrange-Modus!
SvxIconChoiceCtrlEntry* FindEntryPredecessor( SvxIconChoiceCtrlEntry* pEntry, const Point& );
void SetPositionMode( SvxIconChoiceCtrlPositionMode );
SvxIconChoiceCtrlPositionMode GetPositionMode() const { return ePositionMode;}
void SetColumn( sal_uInt16 nIndex, const SvxIconChoiceCtrlColumnInfo& );
const SvxIconChoiceCtrlColumnInfo* GetColumn( sal_uInt16 nIndex ) 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 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 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
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */