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