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_sc.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir #include <vcl/svapp.hxx> 33*cdf0e10cSrcweir #include <vcl/taskpanelist.hxx> 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir #include "olinewin.hxx" 36*cdf0e10cSrcweir #include "olinetab.hxx" 37*cdf0e10cSrcweir #include "document.hxx" 38*cdf0e10cSrcweir #include "dbfunc.hxx" 39*cdf0e10cSrcweir #include "sc.hrc" 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir // ============================================================================ 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir const long SC_OL_BITMAPSIZE = 12; 44*cdf0e10cSrcweir const long SC_OL_POSOFFSET = 2; 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir const size_t SC_OL_NOLEVEL = static_cast< size_t >( -1 ); 47*cdf0e10cSrcweir const size_t SC_OL_HEADERENTRY = static_cast< size_t >( -1 ); 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir const sal_uInt16 SC_OL_IMAGE_PLUS = 9; 50*cdf0e10cSrcweir const sal_uInt16 SC_OL_IMAGE_MINUS = SC_OL_IMAGE_PLUS + 1; 51*cdf0e10cSrcweir const sal_uInt16 SC_OL_IMAGE_NOTPRESSED = SC_OL_IMAGE_MINUS + 1; 52*cdf0e10cSrcweir const sal_uInt16 SC_OL_IMAGE_PRESSED = SC_OL_IMAGE_NOTPRESSED + 1; 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir // ============================================================================ 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir ScOutlineWindow::ScOutlineWindow( Window* pParent, ScOutlineMode eMode, ScViewData* pViewData, ScSplitPos eWhich ) : 57*cdf0e10cSrcweir Window( pParent ), 58*cdf0e10cSrcweir mrViewData( *pViewData ), 59*cdf0e10cSrcweir meWhich( eWhich ), 60*cdf0e10cSrcweir mbHoriz( eMode == SC_OUTLINE_HOR ), 61*cdf0e10cSrcweir mbMirrorEntries( false ), // updated in SetHeaderSize 62*cdf0e10cSrcweir mbMirrorLevels( false ), // updated in SetHeaderSize 63*cdf0e10cSrcweir mpSymbols( NULL ), 64*cdf0e10cSrcweir maLineColor( COL_BLACK ), 65*cdf0e10cSrcweir mnHeaderSize( 0 ), 66*cdf0e10cSrcweir mnHeaderPos( 0 ), 67*cdf0e10cSrcweir mnMainFirstPos( 0 ), 68*cdf0e10cSrcweir mnMainLastPos( 0 ), 69*cdf0e10cSrcweir mbMTActive( false ), 70*cdf0e10cSrcweir mbMTPressed( false ), 71*cdf0e10cSrcweir mnFocusLevel( 0 ), 72*cdf0e10cSrcweir mnFocusEntry( SC_OL_HEADERENTRY ), 73*cdf0e10cSrcweir mbDontDrawFocus( false ) 74*cdf0e10cSrcweir { 75*cdf0e10cSrcweir EnableRTL( sal_False ); // mirroring is done manually 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir InitSettings(); 78*cdf0e10cSrcweir maFocusRect.SetEmpty(); 79*cdf0e10cSrcweir SetHeaderSize( 0 ); 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir // insert the window into task pane list for "F6 cycling" 82*cdf0e10cSrcweir if( SystemWindow* pSysWin = GetSystemWindow() ) 83*cdf0e10cSrcweir if( TaskPaneList* pTaskPaneList = pSysWin->GetTaskPaneList() ) 84*cdf0e10cSrcweir pTaskPaneList->AddWindow( this ); 85*cdf0e10cSrcweir } 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir ScOutlineWindow::~ScOutlineWindow() 88*cdf0e10cSrcweir { 89*cdf0e10cSrcweir // remove the window from task pane list 90*cdf0e10cSrcweir if( SystemWindow* pSysWin = GetSystemWindow() ) 91*cdf0e10cSrcweir if( TaskPaneList* pTaskPaneList = pSysWin->GetTaskPaneList() ) 92*cdf0e10cSrcweir pTaskPaneList->RemoveWindow( this ); 93*cdf0e10cSrcweir } 94*cdf0e10cSrcweir 95*cdf0e10cSrcweir void ScOutlineWindow::SetHeaderSize( long nNewSize ) 96*cdf0e10cSrcweir { 97*cdf0e10cSrcweir sal_Bool bLayoutRTL = GetDoc().IsLayoutRTL( GetTab() ); 98*cdf0e10cSrcweir mbMirrorEntries = bLayoutRTL && mbHoriz; 99*cdf0e10cSrcweir mbMirrorLevels = bLayoutRTL && !mbHoriz; 100*cdf0e10cSrcweir 101*cdf0e10cSrcweir bool bNew = (nNewSize != mnHeaderSize); 102*cdf0e10cSrcweir mnHeaderSize = nNewSize; 103*cdf0e10cSrcweir mnHeaderPos = mbMirrorEntries ? (GetOutputSizeEntry() - mnHeaderSize) : 0; 104*cdf0e10cSrcweir mnMainFirstPos = mbMirrorEntries ? 0 : mnHeaderSize; 105*cdf0e10cSrcweir mnMainLastPos = GetOutputSizeEntry() - (mbMirrorEntries ? mnHeaderSize : 0) - 1; 106*cdf0e10cSrcweir if ( bNew ) 107*cdf0e10cSrcweir Invalidate(); 108*cdf0e10cSrcweir } 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir long ScOutlineWindow::GetDepthSize() const 111*cdf0e10cSrcweir { 112*cdf0e10cSrcweir long nSize = GetLevelCount() * SC_OL_BITMAPSIZE; 113*cdf0e10cSrcweir if ( nSize > 0 ) 114*cdf0e10cSrcweir nSize += 2 * SC_OL_POSOFFSET + 1; 115*cdf0e10cSrcweir return nSize; 116*cdf0e10cSrcweir } 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir void ScOutlineWindow::ScrollPixel( long nDiff ) 119*cdf0e10cSrcweir { 120*cdf0e10cSrcweir HideFocus(); 121*cdf0e10cSrcweir mbDontDrawFocus = true; 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir long nStart = mnMainFirstPos; 124*cdf0e10cSrcweir long nEnd = mnMainLastPos; 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir long nInvStart, nInvEnd; 127*cdf0e10cSrcweir if (nDiff < 0) 128*cdf0e10cSrcweir { 129*cdf0e10cSrcweir nStart -= nDiff; 130*cdf0e10cSrcweir nInvStart = nEnd + nDiff; 131*cdf0e10cSrcweir nInvEnd = nEnd; 132*cdf0e10cSrcweir } 133*cdf0e10cSrcweir else 134*cdf0e10cSrcweir { 135*cdf0e10cSrcweir nEnd -= nDiff; 136*cdf0e10cSrcweir nInvStart = nStart; 137*cdf0e10cSrcweir nInvEnd = nStart + nDiff; 138*cdf0e10cSrcweir } 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir ScrollRel( nDiff, nStart, nEnd ); 141*cdf0e10cSrcweir Invalidate( GetRectangle( 0, nInvStart, GetOutputSizeLevel() - 1, nInvEnd ) ); 142*cdf0e10cSrcweir Update(); 143*cdf0e10cSrcweir 144*cdf0e10cSrcweir // if focus becomes invisible, move it to next visible button 145*cdf0e10cSrcweir ImplMoveFocusToVisible( nDiff < 0 ); 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir mbDontDrawFocus = false; 148*cdf0e10cSrcweir ShowFocus(); 149*cdf0e10cSrcweir } 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir void ScOutlineWindow::ScrollRel( long nEntryDiff, long nEntryStart, long nEntryEnd ) 152*cdf0e10cSrcweir { 153*cdf0e10cSrcweir Rectangle aRect( GetRectangle( 0, nEntryStart, GetOutputSizeLevel() - 1, nEntryEnd ) ); 154*cdf0e10cSrcweir if ( mbHoriz ) 155*cdf0e10cSrcweir Scroll( nEntryDiff, 0, aRect ); 156*cdf0e10cSrcweir else 157*cdf0e10cSrcweir Scroll( 0, nEntryDiff, aRect ); 158*cdf0e10cSrcweir } 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir // internal ------------------------------------------------------------------- 161*cdf0e10cSrcweir 162*cdf0e10cSrcweir void ScOutlineWindow::InitSettings() 163*cdf0e10cSrcweir { 164*cdf0e10cSrcweir const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); 165*cdf0e10cSrcweir SetBackground( rStyleSettings.GetFaceColor() ); 166*cdf0e10cSrcweir maLineColor = rStyleSettings.GetButtonTextColor(); 167*cdf0e10cSrcweir mpSymbols = ScGlobal::GetOutlineSymbols( rStyleSettings.GetHighContrastMode() ); 168*cdf0e10cSrcweir Invalidate(); 169*cdf0e10cSrcweir } 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir const ScOutlineArray* ScOutlineWindow::GetOutlineArray() const 172*cdf0e10cSrcweir { 173*cdf0e10cSrcweir const ScOutlineTable* pTable = GetDoc().GetOutlineTable( GetTab() ); 174*cdf0e10cSrcweir if ( !pTable ) return NULL; 175*cdf0e10cSrcweir return mbHoriz ? pTable->GetColArray() : pTable->GetRowArray(); 176*cdf0e10cSrcweir } 177*cdf0e10cSrcweir 178*cdf0e10cSrcweir const ScOutlineEntry* ScOutlineWindow::GetOutlineEntry( size_t nLevel, size_t nEntry ) const 179*cdf0e10cSrcweir { 180*cdf0e10cSrcweir const ScOutlineArray* pArray = GetOutlineArray(); 181*cdf0e10cSrcweir return pArray ? pArray->GetEntry( sal::static_int_cast<sal_uInt16>(nLevel), sal::static_int_cast<sal_uInt16>(nEntry) ) : NULL; 182*cdf0e10cSrcweir } 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir bool ScOutlineWindow::IsHidden( SCCOLROW nColRowIndex ) const 185*cdf0e10cSrcweir { 186*cdf0e10cSrcweir return mbHoriz ? 187*cdf0e10cSrcweir GetDoc().ColHidden(static_cast<SCCOL>(nColRowIndex), GetTab()) : 188*cdf0e10cSrcweir GetDoc().RowHidden(static_cast<SCROW>(nColRowIndex), GetTab()); 189*cdf0e10cSrcweir } 190*cdf0e10cSrcweir 191*cdf0e10cSrcweir bool ScOutlineWindow::IsFiltered( SCCOLROW nColRowIndex ) const 192*cdf0e10cSrcweir { 193*cdf0e10cSrcweir // columns cannot be filtered 194*cdf0e10cSrcweir return !mbHoriz && GetDoc().RowFiltered( static_cast<SCROW>(nColRowIndex), GetTab() ); 195*cdf0e10cSrcweir } 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir bool ScOutlineWindow::IsFirstVisible( SCCOLROW nColRowIndex ) const 198*cdf0e10cSrcweir { 199*cdf0e10cSrcweir bool bAllHidden = true; 200*cdf0e10cSrcweir for ( SCCOLROW nPos = 0; (nPos < nColRowIndex) && bAllHidden; ++nPos ) 201*cdf0e10cSrcweir bAllHidden = IsHidden( nPos ); 202*cdf0e10cSrcweir return bAllHidden; 203*cdf0e10cSrcweir } 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir void ScOutlineWindow::GetVisibleRange( SCCOLROW& rnColRowStart, SCCOLROW& rnColRowEnd ) const 206*cdf0e10cSrcweir { 207*cdf0e10cSrcweir if ( mbHoriz ) 208*cdf0e10cSrcweir { 209*cdf0e10cSrcweir rnColRowStart = mrViewData.GetPosX( WhichH( meWhich ) ); 210*cdf0e10cSrcweir rnColRowEnd = rnColRowStart + mrViewData.VisibleCellsX( WhichH( meWhich ) ); 211*cdf0e10cSrcweir } 212*cdf0e10cSrcweir else 213*cdf0e10cSrcweir { 214*cdf0e10cSrcweir rnColRowStart = mrViewData.GetPosY( WhichV( meWhich ) ); 215*cdf0e10cSrcweir rnColRowEnd = rnColRowStart + mrViewData.VisibleCellsY( WhichV( meWhich ) ); 216*cdf0e10cSrcweir } 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir // include collapsed columns/rows in front of visible range 219*cdf0e10cSrcweir while ( (rnColRowStart > 0) && IsHidden( rnColRowStart - 1 ) ) 220*cdf0e10cSrcweir --rnColRowStart; 221*cdf0e10cSrcweir } 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir Point ScOutlineWindow::GetPoint( long nLevelPos, long nEntryPos ) const 224*cdf0e10cSrcweir { 225*cdf0e10cSrcweir return mbHoriz ? Point( nEntryPos, nLevelPos ) : Point( nLevelPos, nEntryPos ); 226*cdf0e10cSrcweir } 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir Rectangle ScOutlineWindow::GetRectangle( 229*cdf0e10cSrcweir long nLevelStart, long nEntryStart, long nLevelEnd, long nEntryEnd ) const 230*cdf0e10cSrcweir { 231*cdf0e10cSrcweir return Rectangle( GetPoint( nLevelStart, nEntryStart ), GetPoint( nLevelEnd, nEntryEnd ) ); 232*cdf0e10cSrcweir } 233*cdf0e10cSrcweir 234*cdf0e10cSrcweir long ScOutlineWindow::GetOutputSizeLevel() const 235*cdf0e10cSrcweir { 236*cdf0e10cSrcweir Size aSize( GetOutputSizePixel() ); 237*cdf0e10cSrcweir return mbHoriz ? aSize.Height() : aSize.Width(); 238*cdf0e10cSrcweir } 239*cdf0e10cSrcweir 240*cdf0e10cSrcweir long ScOutlineWindow::GetOutputSizeEntry() const 241*cdf0e10cSrcweir { 242*cdf0e10cSrcweir Size aSize( GetOutputSizePixel() ); 243*cdf0e10cSrcweir return mbHoriz ? aSize.Width() : aSize.Height(); 244*cdf0e10cSrcweir } 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir size_t ScOutlineWindow::GetLevelCount() const 247*cdf0e10cSrcweir { 248*cdf0e10cSrcweir const ScOutlineArray* pArray = GetOutlineArray(); 249*cdf0e10cSrcweir size_t nLevelCount = pArray ? pArray->GetDepth() : 0; 250*cdf0e10cSrcweir return nLevelCount ? (nLevelCount + 1) : 0; 251*cdf0e10cSrcweir } 252*cdf0e10cSrcweir 253*cdf0e10cSrcweir long ScOutlineWindow::GetLevelPos( size_t nLevel ) const 254*cdf0e10cSrcweir { 255*cdf0e10cSrcweir // #i51970# must always return the *left* edge of the area used by a level 256*cdf0e10cSrcweir long nPos = static_cast< long >( SC_OL_POSOFFSET + nLevel * SC_OL_BITMAPSIZE ); 257*cdf0e10cSrcweir return mbMirrorLevels ? (GetOutputSizeLevel() - nPos - SC_OL_BITMAPSIZE) : nPos; 258*cdf0e10cSrcweir } 259*cdf0e10cSrcweir 260*cdf0e10cSrcweir size_t ScOutlineWindow::GetLevelFromPos( long nLevelPos ) const 261*cdf0e10cSrcweir { 262*cdf0e10cSrcweir if( mbMirrorLevels ) nLevelPos = GetOutputSizeLevel() - nLevelPos - 1; 263*cdf0e10cSrcweir long nStart = SC_OL_POSOFFSET; 264*cdf0e10cSrcweir if ( nLevelPos < nStart ) return SC_OL_NOLEVEL; 265*cdf0e10cSrcweir size_t nLevel = static_cast< size_t >( (nLevelPos - nStart) / SC_OL_BITMAPSIZE ); 266*cdf0e10cSrcweir return (nLevel < GetLevelCount()) ? nLevel : SC_OL_NOLEVEL; 267*cdf0e10cSrcweir } 268*cdf0e10cSrcweir 269*cdf0e10cSrcweir long ScOutlineWindow::GetColRowPos( SCCOLROW nColRowIndex ) const 270*cdf0e10cSrcweir { 271*cdf0e10cSrcweir long nDocPos = mbHoriz ? 272*cdf0e10cSrcweir mrViewData.GetScrPos( static_cast<SCCOL>(nColRowIndex), 0, meWhich, sal_True ).X() : 273*cdf0e10cSrcweir mrViewData.GetScrPos( 0, static_cast<SCROW>(nColRowIndex), meWhich, sal_True ).Y(); 274*cdf0e10cSrcweir return mnMainFirstPos + nDocPos; 275*cdf0e10cSrcweir } 276*cdf0e10cSrcweir 277*cdf0e10cSrcweir long ScOutlineWindow::GetHeaderEntryPos() const 278*cdf0e10cSrcweir { 279*cdf0e10cSrcweir return mnHeaderPos + (mnHeaderSize - SC_OL_BITMAPSIZE) / 2; 280*cdf0e10cSrcweir } 281*cdf0e10cSrcweir 282*cdf0e10cSrcweir bool ScOutlineWindow::GetEntryPos( 283*cdf0e10cSrcweir size_t nLevel, size_t nEntry, 284*cdf0e10cSrcweir long& rnStartPos, long& rnEndPos, long& rnImagePos ) const 285*cdf0e10cSrcweir { 286*cdf0e10cSrcweir const ScOutlineEntry* pEntry = GetOutlineEntry( nLevel, nEntry ); 287*cdf0e10cSrcweir if ( !pEntry || !pEntry->IsVisible() ) 288*cdf0e10cSrcweir return false; 289*cdf0e10cSrcweir 290*cdf0e10cSrcweir SCCOLROW nStart = pEntry->GetStart(); 291*cdf0e10cSrcweir SCCOLROW nEnd = pEntry->GetEnd(); 292*cdf0e10cSrcweir 293*cdf0e10cSrcweir long nEntriesSign = mbMirrorEntries ? -1 : 1; 294*cdf0e10cSrcweir 295*cdf0e10cSrcweir // --- common calculation --- 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir rnStartPos = GetColRowPos( nStart ); 298*cdf0e10cSrcweir rnEndPos = GetColRowPos( nEnd + 1 ); 299*cdf0e10cSrcweir 300*cdf0e10cSrcweir bool bHidden = IsHidden( nStart ); 301*cdf0e10cSrcweir rnImagePos = bHidden ? 302*cdf0e10cSrcweir (rnStartPos - ( SC_OL_BITMAPSIZE / 2 ) * nEntriesSign) : 303*cdf0e10cSrcweir rnStartPos + nEntriesSign; 304*cdf0e10cSrcweir long nCenter = (rnStartPos + rnEndPos - SC_OL_BITMAPSIZE * nEntriesSign + 305*cdf0e10cSrcweir ( mbMirrorEntries ? 1 : 0 )) / 2L; 306*cdf0e10cSrcweir rnImagePos = mbMirrorEntries ? Max( rnImagePos, nCenter ) : Min( rnImagePos, nCenter ); 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir // --- refinements --- 309*cdf0e10cSrcweir 310*cdf0e10cSrcweir // do not cut leftmost/topmost image 311*cdf0e10cSrcweir if ( bHidden && IsFirstVisible( nStart ) ) 312*cdf0e10cSrcweir rnImagePos = rnStartPos; 313*cdf0e10cSrcweir 314*cdf0e10cSrcweir // do not cover previous collapsed image 315*cdf0e10cSrcweir if ( !bHidden && nEntry ) 316*cdf0e10cSrcweir { 317*cdf0e10cSrcweir const ScOutlineEntry* pPrevEntry = GetOutlineEntry( nLevel, nEntry - 1 ); 318*cdf0e10cSrcweir SCCOLROW nPrevEnd = pPrevEntry->GetEnd(); 319*cdf0e10cSrcweir if ( (nPrevEnd + 1 == nStart) && IsHidden( nPrevEnd ) ) 320*cdf0e10cSrcweir { 321*cdf0e10cSrcweir if ( IsFirstVisible( pPrevEntry->GetStart() ) ) 322*cdf0e10cSrcweir rnStartPos += SC_OL_BITMAPSIZE * nEntriesSign; 323*cdf0e10cSrcweir else 324*cdf0e10cSrcweir rnStartPos += ( SC_OL_BITMAPSIZE / 2 ) * nEntriesSign; 325*cdf0e10cSrcweir rnImagePos = rnStartPos; 326*cdf0e10cSrcweir } 327*cdf0e10cSrcweir } 328*cdf0e10cSrcweir 329*cdf0e10cSrcweir // restrict rnStartPos...rnEndPos to valid area 330*cdf0e10cSrcweir rnStartPos = std::max( rnStartPos, mnMainFirstPos ); 331*cdf0e10cSrcweir rnEndPos = std::max( rnEndPos, mnMainFirstPos ); 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir if ( mbMirrorEntries ) 334*cdf0e10cSrcweir rnImagePos -= SC_OL_BITMAPSIZE - 1; // start pos aligns with right edge of bitmap 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir // --- all rows filtered? --- 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir bool bVisible = true; 339*cdf0e10cSrcweir if ( !mbHoriz ) 340*cdf0e10cSrcweir { 341*cdf0e10cSrcweir bVisible = false; 342*cdf0e10cSrcweir for ( SCCOLROW nRow = nStart; (nRow <= nEnd) && !bVisible; ++nRow ) 343*cdf0e10cSrcweir bVisible = !IsFiltered( nRow ); 344*cdf0e10cSrcweir } 345*cdf0e10cSrcweir return bVisible; 346*cdf0e10cSrcweir } 347*cdf0e10cSrcweir 348*cdf0e10cSrcweir bool ScOutlineWindow::GetImagePos( size_t nLevel, size_t nEntry, Point& rPos ) const 349*cdf0e10cSrcweir { 350*cdf0e10cSrcweir bool bRet = nLevel < GetLevelCount(); 351*cdf0e10cSrcweir if ( bRet ) 352*cdf0e10cSrcweir { 353*cdf0e10cSrcweir long nLevelPos = GetLevelPos( nLevel ); 354*cdf0e10cSrcweir if ( nEntry == SC_OL_HEADERENTRY ) 355*cdf0e10cSrcweir rPos = GetPoint( nLevelPos, GetHeaderEntryPos() ); 356*cdf0e10cSrcweir else 357*cdf0e10cSrcweir { 358*cdf0e10cSrcweir long nStartPos, nEndPos, nImagePos; 359*cdf0e10cSrcweir bRet = GetEntryPos( nLevel, nEntry, nStartPos, nEndPos, nImagePos ); 360*cdf0e10cSrcweir rPos = GetPoint( nLevelPos, nImagePos ); 361*cdf0e10cSrcweir } 362*cdf0e10cSrcweir } 363*cdf0e10cSrcweir return bRet; 364*cdf0e10cSrcweir } 365*cdf0e10cSrcweir 366*cdf0e10cSrcweir bool ScOutlineWindow::IsButtonVisible( size_t nLevel, size_t nEntry ) const 367*cdf0e10cSrcweir { 368*cdf0e10cSrcweir bool bRet = false; 369*cdf0e10cSrcweir if ( nEntry == SC_OL_HEADERENTRY ) 370*cdf0e10cSrcweir bRet = (mnHeaderSize > 0) && (nLevel < GetLevelCount()); 371*cdf0e10cSrcweir else 372*cdf0e10cSrcweir { 373*cdf0e10cSrcweir const ScOutlineEntry* pEntry = GetOutlineEntry( nLevel, nEntry ); 374*cdf0e10cSrcweir if ( pEntry && pEntry->IsVisible() ) 375*cdf0e10cSrcweir { 376*cdf0e10cSrcweir SCCOLROW nStart, nEnd; 377*cdf0e10cSrcweir GetVisibleRange( nStart, nEnd ); 378*cdf0e10cSrcweir bRet = (nStart <= pEntry->GetStart()) && (pEntry->GetStart() <= nEnd); 379*cdf0e10cSrcweir } 380*cdf0e10cSrcweir } 381*cdf0e10cSrcweir return bRet; 382*cdf0e10cSrcweir } 383*cdf0e10cSrcweir 384*cdf0e10cSrcweir bool ScOutlineWindow::ItemHit( const Point& rPos, size_t& rnLevel, size_t& rnEntry, bool& rbButton ) const 385*cdf0e10cSrcweir { 386*cdf0e10cSrcweir const ScOutlineArray* pArray = GetOutlineArray(); 387*cdf0e10cSrcweir if ( !pArray ) return false; 388*cdf0e10cSrcweir 389*cdf0e10cSrcweir SCCOLROW nStartIndex, nEndIndex; 390*cdf0e10cSrcweir GetVisibleRange( nStartIndex, nEndIndex ); 391*cdf0e10cSrcweir 392*cdf0e10cSrcweir size_t nLevel = GetLevelFromPos( mbHoriz ? rPos.Y() : rPos.X() ); 393*cdf0e10cSrcweir if ( nLevel == SC_OL_NOLEVEL ) 394*cdf0e10cSrcweir return false; 395*cdf0e10cSrcweir 396*cdf0e10cSrcweir // long nLevelPos = GetLevelPos( nLevel ); 397*cdf0e10cSrcweir long nEntryMousePos = mbHoriz ? rPos.X() : rPos.Y(); 398*cdf0e10cSrcweir 399*cdf0e10cSrcweir // --- level buttons --- 400*cdf0e10cSrcweir 401*cdf0e10cSrcweir if ( mnHeaderSize > 0 ) 402*cdf0e10cSrcweir { 403*cdf0e10cSrcweir long nImagePos = GetHeaderEntryPos(); 404*cdf0e10cSrcweir if ( (nImagePos <= nEntryMousePos) && (nEntryMousePos < nImagePos + SC_OL_BITMAPSIZE) ) 405*cdf0e10cSrcweir { 406*cdf0e10cSrcweir rnLevel = nLevel; 407*cdf0e10cSrcweir rnEntry = SC_OL_HEADERENTRY; 408*cdf0e10cSrcweir rbButton = true; 409*cdf0e10cSrcweir return true; 410*cdf0e10cSrcweir } 411*cdf0e10cSrcweir } 412*cdf0e10cSrcweir 413*cdf0e10cSrcweir // --- expand/collapse buttons and expanded lines --- 414*cdf0e10cSrcweir 415*cdf0e10cSrcweir // search outline entries backwards 416*cdf0e10cSrcweir size_t nEntry = pArray->GetCount( sal::static_int_cast<sal_uInt16>(nLevel) ); 417*cdf0e10cSrcweir while ( nEntry ) 418*cdf0e10cSrcweir { 419*cdf0e10cSrcweir --nEntry; 420*cdf0e10cSrcweir 421*cdf0e10cSrcweir const ScOutlineEntry* pEntry = pArray->GetEntry( sal::static_int_cast<sal_uInt16>(nLevel), 422*cdf0e10cSrcweir sal::static_int_cast<sal_uInt16>(nEntry) ); 423*cdf0e10cSrcweir SCCOLROW nStart = pEntry->GetStart(); 424*cdf0e10cSrcweir SCCOLROW nEnd = pEntry->GetEnd(); 425*cdf0e10cSrcweir 426*cdf0e10cSrcweir if ( (nEnd >= nStartIndex) && (nStart <= nEndIndex) ) 427*cdf0e10cSrcweir { 428*cdf0e10cSrcweir long nStartPos, nEndPos, nImagePos; 429*cdf0e10cSrcweir if ( GetEntryPos( nLevel, nEntry, nStartPos, nEndPos, nImagePos ) ) 430*cdf0e10cSrcweir { 431*cdf0e10cSrcweir rnLevel = nLevel; 432*cdf0e10cSrcweir rnEntry = nEntry; 433*cdf0e10cSrcweir 434*cdf0e10cSrcweir // button? 435*cdf0e10cSrcweir if ( (nStart >= nStartIndex) && (nImagePos <= nEntryMousePos) && (nEntryMousePos < nImagePos + SC_OL_BITMAPSIZE) ) 436*cdf0e10cSrcweir { 437*cdf0e10cSrcweir rbButton = true; 438*cdf0e10cSrcweir return true; 439*cdf0e10cSrcweir } 440*cdf0e10cSrcweir 441*cdf0e10cSrcweir // line? 442*cdf0e10cSrcweir if ( mbMirrorEntries ) 443*cdf0e10cSrcweir ::std::swap( nStartPos, nEndPos ); // in RTL mode, nStartPos is the larger value 444*cdf0e10cSrcweir if ( (nStartPos <= nEntryMousePos) && (nEntryMousePos <= nEndPos) ) 445*cdf0e10cSrcweir { 446*cdf0e10cSrcweir rbButton = false; 447*cdf0e10cSrcweir return true; 448*cdf0e10cSrcweir } 449*cdf0e10cSrcweir } 450*cdf0e10cSrcweir } 451*cdf0e10cSrcweir } 452*cdf0e10cSrcweir 453*cdf0e10cSrcweir return false; 454*cdf0e10cSrcweir } 455*cdf0e10cSrcweir 456*cdf0e10cSrcweir bool ScOutlineWindow::ButtonHit( const Point& rPos, size_t& rnLevel, size_t& rnEntry ) const 457*cdf0e10cSrcweir { 458*cdf0e10cSrcweir bool bButton; 459*cdf0e10cSrcweir bool bRet = ItemHit( rPos, rnLevel, rnEntry, bButton ); 460*cdf0e10cSrcweir return bRet && bButton; 461*cdf0e10cSrcweir } 462*cdf0e10cSrcweir 463*cdf0e10cSrcweir bool ScOutlineWindow::LineHit( const Point& rPos, size_t& rnLevel, size_t& rnEntry ) const 464*cdf0e10cSrcweir { 465*cdf0e10cSrcweir bool bButton; 466*cdf0e10cSrcweir bool bRet = ItemHit( rPos, rnLevel, rnEntry, bButton ); 467*cdf0e10cSrcweir return bRet && !bButton; 468*cdf0e10cSrcweir } 469*cdf0e10cSrcweir 470*cdf0e10cSrcweir void ScOutlineWindow::DoFunction( size_t nLevel, size_t nEntry ) const 471*cdf0e10cSrcweir { 472*cdf0e10cSrcweir ScDBFunc& rFunc = *mrViewData.GetView(); 473*cdf0e10cSrcweir if ( nEntry == SC_OL_HEADERENTRY ) 474*cdf0e10cSrcweir rFunc.SelectLevel( mbHoriz, sal::static_int_cast<sal_uInt16>(nLevel) ); 475*cdf0e10cSrcweir else 476*cdf0e10cSrcweir { 477*cdf0e10cSrcweir const ScOutlineEntry* pEntry = GetOutlineEntry( nLevel, nEntry ); 478*cdf0e10cSrcweir if ( pEntry ) 479*cdf0e10cSrcweir { 480*cdf0e10cSrcweir if ( pEntry->IsHidden() ) 481*cdf0e10cSrcweir rFunc.ShowOutline( mbHoriz, sal::static_int_cast<sal_uInt16>(nLevel), sal::static_int_cast<sal_uInt16>(nEntry) ); 482*cdf0e10cSrcweir else 483*cdf0e10cSrcweir rFunc.HideOutline( mbHoriz, sal::static_int_cast<sal_uInt16>(nLevel), sal::static_int_cast<sal_uInt16>(nEntry) ); 484*cdf0e10cSrcweir } 485*cdf0e10cSrcweir } 486*cdf0e10cSrcweir } 487*cdf0e10cSrcweir 488*cdf0e10cSrcweir void ScOutlineWindow::DoExpand( size_t nLevel, size_t nEntry ) const 489*cdf0e10cSrcweir { 490*cdf0e10cSrcweir const ScOutlineEntry* pEntry = GetOutlineEntry( nLevel, nEntry ); 491*cdf0e10cSrcweir if ( pEntry && pEntry->IsHidden() ) 492*cdf0e10cSrcweir DoFunction( nLevel, nEntry ); 493*cdf0e10cSrcweir } 494*cdf0e10cSrcweir 495*cdf0e10cSrcweir void ScOutlineWindow::DoCollapse( size_t nLevel, size_t nEntry ) const 496*cdf0e10cSrcweir { 497*cdf0e10cSrcweir const ScOutlineEntry* pEntry = GetOutlineEntry( nLevel, nEntry ); 498*cdf0e10cSrcweir if ( pEntry && !pEntry->IsHidden() ) 499*cdf0e10cSrcweir DoFunction( nLevel, nEntry ); 500*cdf0e10cSrcweir } 501*cdf0e10cSrcweir 502*cdf0e10cSrcweir void ScOutlineWindow::Resize() 503*cdf0e10cSrcweir { 504*cdf0e10cSrcweir Window::Resize(); 505*cdf0e10cSrcweir SetHeaderSize( mnHeaderSize ); // recalculates header/group positions 506*cdf0e10cSrcweir if ( !IsFocusButtonVisible() ) 507*cdf0e10cSrcweir { 508*cdf0e10cSrcweir HideFocus(); 509*cdf0e10cSrcweir ShowFocus(); // calculates valid position 510*cdf0e10cSrcweir } 511*cdf0e10cSrcweir } 512*cdf0e10cSrcweir 513*cdf0e10cSrcweir void ScOutlineWindow::DataChanged( const DataChangedEvent& rDCEvt ) 514*cdf0e10cSrcweir { 515*cdf0e10cSrcweir if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && 516*cdf0e10cSrcweir (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 517*cdf0e10cSrcweir { 518*cdf0e10cSrcweir InitSettings(); 519*cdf0e10cSrcweir Invalidate(); 520*cdf0e10cSrcweir } 521*cdf0e10cSrcweir Window::DataChanged( rDCEvt ); 522*cdf0e10cSrcweir } 523*cdf0e10cSrcweir 524*cdf0e10cSrcweir // drawing -------------------------------------------------------------------- 525*cdf0e10cSrcweir 526*cdf0e10cSrcweir void ScOutlineWindow::SetEntryAreaClipRegion() 527*cdf0e10cSrcweir { 528*cdf0e10cSrcweir SetClipRegion( Rectangle( 529*cdf0e10cSrcweir GetPoint( 0, mnMainFirstPos ), 530*cdf0e10cSrcweir GetPoint( GetOutputSizeLevel() - 1, mnMainLastPos ) ) ); 531*cdf0e10cSrcweir } 532*cdf0e10cSrcweir 533*cdf0e10cSrcweir void ScOutlineWindow::DrawLineRel( 534*cdf0e10cSrcweir long nLevelStart, long nEntryStart, long nLevelEnd, long nEntryEnd ) 535*cdf0e10cSrcweir { 536*cdf0e10cSrcweir DrawLine( GetPoint( nLevelStart, nEntryStart ), GetPoint( nLevelEnd, nEntryEnd ) ); 537*cdf0e10cSrcweir } 538*cdf0e10cSrcweir 539*cdf0e10cSrcweir void ScOutlineWindow::DrawRectRel( 540*cdf0e10cSrcweir long nLevelStart, long nEntryStart, long nLevelEnd, long nEntryEnd ) 541*cdf0e10cSrcweir { 542*cdf0e10cSrcweir DrawRect( GetRectangle( nLevelStart, nEntryStart, nLevelEnd, nEntryEnd ) ); 543*cdf0e10cSrcweir } 544*cdf0e10cSrcweir 545*cdf0e10cSrcweir void ScOutlineWindow::DrawImageRel( long nLevelPos, long nEntryPos, sal_uInt16 nId ) 546*cdf0e10cSrcweir { 547*cdf0e10cSrcweir DBG_ASSERT( mpSymbols, "ScOutlineWindow::DrawImageRel - no images" ); 548*cdf0e10cSrcweir const Image& rImage = mpSymbols->GetImage( nId ); 549*cdf0e10cSrcweir SetLineColor(); 550*cdf0e10cSrcweir SetFillColor( GetBackground().GetColor() ); 551*cdf0e10cSrcweir Point aPos( GetPoint( nLevelPos, nEntryPos ) ); 552*cdf0e10cSrcweir DrawRect( Rectangle( aPos, rImage.GetSizePixel() ) ); 553*cdf0e10cSrcweir DrawImage( aPos, rImage ); 554*cdf0e10cSrcweir } 555*cdf0e10cSrcweir 556*cdf0e10cSrcweir void ScOutlineWindow::DrawBorderRel( size_t nLevel, size_t nEntry, bool bPressed ) 557*cdf0e10cSrcweir { 558*cdf0e10cSrcweir Point aPos; 559*cdf0e10cSrcweir if ( GetImagePos( nLevel, nEntry, aPos ) ) 560*cdf0e10cSrcweir { 561*cdf0e10cSrcweir DBG_ASSERT( mpSymbols, "ScOutlineWindow::DrawBorderRel - no images" ); 562*cdf0e10cSrcweir sal_uInt16 nId = bPressed ? SC_OL_IMAGE_PRESSED : SC_OL_IMAGE_NOTPRESSED; 563*cdf0e10cSrcweir bool bClip = (nEntry != SC_OL_HEADERENTRY); 564*cdf0e10cSrcweir if ( bClip ) 565*cdf0e10cSrcweir SetEntryAreaClipRegion(); 566*cdf0e10cSrcweir DrawImage( aPos, mpSymbols->GetImage( nId ) ); 567*cdf0e10cSrcweir if ( bClip ) 568*cdf0e10cSrcweir SetClipRegion(); 569*cdf0e10cSrcweir } 570*cdf0e10cSrcweir mbMTPressed = bPressed; 571*cdf0e10cSrcweir } 572*cdf0e10cSrcweir 573*cdf0e10cSrcweir void ScOutlineWindow::ShowFocus() 574*cdf0e10cSrcweir { 575*cdf0e10cSrcweir if ( HasFocus() ) 576*cdf0e10cSrcweir { 577*cdf0e10cSrcweir // first move to a visible position 578*cdf0e10cSrcweir ImplMoveFocusToVisible( true ); 579*cdf0e10cSrcweir 580*cdf0e10cSrcweir if ( IsFocusButtonVisible() ) 581*cdf0e10cSrcweir { 582*cdf0e10cSrcweir Point aPos; 583*cdf0e10cSrcweir if ( GetImagePos( mnFocusLevel, mnFocusEntry, aPos ) ) 584*cdf0e10cSrcweir { 585*cdf0e10cSrcweir aPos += Point( 1, 1 ); 586*cdf0e10cSrcweir maFocusRect = Rectangle( aPos, Size( SC_OL_BITMAPSIZE - 2, SC_OL_BITMAPSIZE - 2 ) ); 587*cdf0e10cSrcweir bool bClip = (mnFocusEntry != SC_OL_HEADERENTRY); 588*cdf0e10cSrcweir if ( bClip ) 589*cdf0e10cSrcweir SetEntryAreaClipRegion(); 590*cdf0e10cSrcweir InvertTracking( maFocusRect, SHOWTRACK_SMALL | SHOWTRACK_WINDOW ); 591*cdf0e10cSrcweir if ( bClip ) 592*cdf0e10cSrcweir SetClipRegion(); 593*cdf0e10cSrcweir } 594*cdf0e10cSrcweir } 595*cdf0e10cSrcweir } 596*cdf0e10cSrcweir } 597*cdf0e10cSrcweir 598*cdf0e10cSrcweir void ScOutlineWindow::HideFocus() 599*cdf0e10cSrcweir { 600*cdf0e10cSrcweir if ( !maFocusRect.IsEmpty() ) 601*cdf0e10cSrcweir { 602*cdf0e10cSrcweir bool bClip = (mnFocusEntry != SC_OL_HEADERENTRY); 603*cdf0e10cSrcweir if ( bClip ) 604*cdf0e10cSrcweir SetEntryAreaClipRegion(); 605*cdf0e10cSrcweir InvertTracking( maFocusRect, SHOWTRACK_SMALL | SHOWTRACK_WINDOW ); 606*cdf0e10cSrcweir if ( bClip ) 607*cdf0e10cSrcweir SetClipRegion(); 608*cdf0e10cSrcweir maFocusRect.SetEmpty(); 609*cdf0e10cSrcweir } 610*cdf0e10cSrcweir } 611*cdf0e10cSrcweir 612*cdf0e10cSrcweir void ScOutlineWindow::Paint( const Rectangle& /* rRect */ ) 613*cdf0e10cSrcweir { 614*cdf0e10cSrcweir long nEntriesSign = mbMirrorEntries ? -1 : 1; 615*cdf0e10cSrcweir long nLevelsSign = mbMirrorLevels ? -1 : 1; 616*cdf0e10cSrcweir 617*cdf0e10cSrcweir Size aSize = GetOutputSizePixel(); 618*cdf0e10cSrcweir long nLevelEnd = (mbHoriz ? aSize.Height() : aSize.Width()) - 1; 619*cdf0e10cSrcweir long nEntryEnd = (mbHoriz ? aSize.Width() : aSize.Height()) - 1; 620*cdf0e10cSrcweir 621*cdf0e10cSrcweir SetLineColor( maLineColor ); 622*cdf0e10cSrcweir long nBorderPos = mbMirrorLevels ? 0 : nLevelEnd; 623*cdf0e10cSrcweir DrawLineRel( nBorderPos, 0, nBorderPos, nEntryEnd ); 624*cdf0e10cSrcweir 625*cdf0e10cSrcweir const ScOutlineArray* pArray = GetOutlineArray(); 626*cdf0e10cSrcweir if ( !pArray ) return; 627*cdf0e10cSrcweir 628*cdf0e10cSrcweir size_t nLevelCount = GetLevelCount(); 629*cdf0e10cSrcweir 630*cdf0e10cSrcweir // --- draw header images --- 631*cdf0e10cSrcweir 632*cdf0e10cSrcweir if ( mnHeaderSize > 0 ) 633*cdf0e10cSrcweir { 634*cdf0e10cSrcweir long nEntryPos = GetHeaderEntryPos(); 635*cdf0e10cSrcweir for ( size_t nLevel = 0; nLevel < nLevelCount; ++nLevel ) 636*cdf0e10cSrcweir DrawImageRel( GetLevelPos( nLevel ), nEntryPos, static_cast< sal_uInt16 >( nLevel + 1 ) ); 637*cdf0e10cSrcweir 638*cdf0e10cSrcweir SetLineColor( maLineColor ); 639*cdf0e10cSrcweir long nLinePos = mnHeaderPos + (mbMirrorEntries ? 0 : (mnHeaderSize - 1)); 640*cdf0e10cSrcweir DrawLineRel( 0, nLinePos, nLevelEnd, nLinePos ); 641*cdf0e10cSrcweir } 642*cdf0e10cSrcweir 643*cdf0e10cSrcweir // --- draw lines & collapse/expand images --- 644*cdf0e10cSrcweir 645*cdf0e10cSrcweir SetEntryAreaClipRegion(); 646*cdf0e10cSrcweir 647*cdf0e10cSrcweir SCCOLROW nStartIndex, nEndIndex; 648*cdf0e10cSrcweir GetVisibleRange( nStartIndex, nEndIndex ); 649*cdf0e10cSrcweir 650*cdf0e10cSrcweir for ( size_t nLevel = 0; nLevel + 1 < nLevelCount; ++nLevel ) 651*cdf0e10cSrcweir { 652*cdf0e10cSrcweir long nLevelPos = GetLevelPos( nLevel ); 653*cdf0e10cSrcweir long nEntryPos1 = 0, nEntryPos2 = 0, nImagePos = 0; 654*cdf0e10cSrcweir 655*cdf0e10cSrcweir size_t nEntryCount = pArray->GetCount( sal::static_int_cast<sal_uInt16>(nLevel) ); 656*cdf0e10cSrcweir size_t nEntry; 657*cdf0e10cSrcweir 658*cdf0e10cSrcweir // first draw all lines in the current level 659*cdf0e10cSrcweir SetLineColor(); 660*cdf0e10cSrcweir SetFillColor( maLineColor ); 661*cdf0e10cSrcweir for ( nEntry = 0; nEntry < nEntryCount; ++nEntry ) 662*cdf0e10cSrcweir { 663*cdf0e10cSrcweir const ScOutlineEntry* pEntry = pArray->GetEntry( sal::static_int_cast<sal_uInt16>(nLevel), 664*cdf0e10cSrcweir sal::static_int_cast<sal_uInt16>(nEntry) ); 665*cdf0e10cSrcweir SCCOLROW nStart = pEntry->GetStart(); 666*cdf0e10cSrcweir SCCOLROW nEnd = pEntry->GetEnd(); 667*cdf0e10cSrcweir 668*cdf0e10cSrcweir // visible range? 669*cdf0e10cSrcweir bool bDraw = (nEnd >= nStartIndex) && (nStart <= nEndIndex); 670*cdf0e10cSrcweir // find output coordinates 671*cdf0e10cSrcweir if ( bDraw ) 672*cdf0e10cSrcweir bDraw = GetEntryPos( nLevel, nEntry, nEntryPos1, nEntryPos2, nImagePos ); 673*cdf0e10cSrcweir // draw, if not collapsed 674*cdf0e10cSrcweir if ( bDraw && !pEntry->IsHidden() ) 675*cdf0e10cSrcweir { 676*cdf0e10cSrcweir if ( nStart >= nStartIndex ) 677*cdf0e10cSrcweir nEntryPos1 += nEntriesSign; 678*cdf0e10cSrcweir nEntryPos2 -= 2 * nEntriesSign; 679*cdf0e10cSrcweir long nLinePos = nLevelPos; 680*cdf0e10cSrcweir if ( mbMirrorLevels ) 681*cdf0e10cSrcweir nLinePos += SC_OL_BITMAPSIZE - 1; // align with right edge of bitmap 682*cdf0e10cSrcweir DrawRectRel( nLinePos, nEntryPos1, nLinePos + nLevelsSign, nEntryPos2 ); 683*cdf0e10cSrcweir 684*cdf0e10cSrcweir if ( nEnd <= nEndIndex ) 685*cdf0e10cSrcweir DrawRectRel( nLinePos, nEntryPos2 - nEntriesSign, 686*cdf0e10cSrcweir nLinePos + ( SC_OL_BITMAPSIZE / 3 ) * nLevelsSign, nEntryPos2 ); 687*cdf0e10cSrcweir } 688*cdf0e10cSrcweir } 689*cdf0e10cSrcweir 690*cdf0e10cSrcweir // draw all images in the level from last to first 691*cdf0e10cSrcweir nEntry = nEntryCount; 692*cdf0e10cSrcweir while ( nEntry ) 693*cdf0e10cSrcweir { 694*cdf0e10cSrcweir --nEntry; 695*cdf0e10cSrcweir 696*cdf0e10cSrcweir const ScOutlineEntry* pEntry = pArray->GetEntry( sal::static_int_cast<sal_uInt16>(nLevel), 697*cdf0e10cSrcweir sal::static_int_cast<sal_uInt16>(nEntry) ); 698*cdf0e10cSrcweir SCCOLROW nStart = pEntry->GetStart(); 699*cdf0e10cSrcweir // SCCOLROW nEnd = pEntry->GetEnd(); 700*cdf0e10cSrcweir 701*cdf0e10cSrcweir // visible range? 702*cdf0e10cSrcweir bool bDraw = (nStartIndex <= nStart) && (nStart <= nEndIndex + 1); 703*cdf0e10cSrcweir // find output coordinates 704*cdf0e10cSrcweir if ( bDraw ) 705*cdf0e10cSrcweir bDraw = GetEntryPos( nLevel, nEntry, nEntryPos1, nEntryPos2, nImagePos ); 706*cdf0e10cSrcweir // draw, if not hidden by higher levels 707*cdf0e10cSrcweir if ( bDraw ) 708*cdf0e10cSrcweir { 709*cdf0e10cSrcweir sal_uInt16 nImageId = pEntry->IsHidden() ? SC_OL_IMAGE_PLUS : SC_OL_IMAGE_MINUS; 710*cdf0e10cSrcweir DrawImageRel( nLevelPos, nImagePos, nImageId ); 711*cdf0e10cSrcweir } 712*cdf0e10cSrcweir } 713*cdf0e10cSrcweir } 714*cdf0e10cSrcweir 715*cdf0e10cSrcweir SetClipRegion(); 716*cdf0e10cSrcweir 717*cdf0e10cSrcweir if ( !mbDontDrawFocus ) 718*cdf0e10cSrcweir ShowFocus(); 719*cdf0e10cSrcweir } 720*cdf0e10cSrcweir 721*cdf0e10cSrcweir // focus ---------------------------------------------------------------------- 722*cdf0e10cSrcweir 723*cdf0e10cSrcweir /** Increments or decrements a value and wraps at the specified limits. 724*cdf0e10cSrcweir @return true = value wrapped. */ 725*cdf0e10cSrcweir bool lcl_RotateValue( size_t& rnValue, size_t nMin, size_t nMax, bool bForward ) 726*cdf0e10cSrcweir { 727*cdf0e10cSrcweir DBG_ASSERT( nMin <= nMax, "lcl_RotateValue - invalid range" ); 728*cdf0e10cSrcweir DBG_ASSERT( nMax < static_cast< size_t >( -1 ), "lcl_RotateValue - range overflow" ); 729*cdf0e10cSrcweir bool bWrap = false; 730*cdf0e10cSrcweir if ( bForward ) 731*cdf0e10cSrcweir { 732*cdf0e10cSrcweir if ( rnValue < nMax ) 733*cdf0e10cSrcweir ++rnValue; 734*cdf0e10cSrcweir else 735*cdf0e10cSrcweir { 736*cdf0e10cSrcweir rnValue = nMin; 737*cdf0e10cSrcweir bWrap = true; 738*cdf0e10cSrcweir } 739*cdf0e10cSrcweir } 740*cdf0e10cSrcweir else 741*cdf0e10cSrcweir { 742*cdf0e10cSrcweir if ( rnValue > nMin ) 743*cdf0e10cSrcweir --rnValue; 744*cdf0e10cSrcweir else 745*cdf0e10cSrcweir { 746*cdf0e10cSrcweir rnValue = nMax; 747*cdf0e10cSrcweir bWrap = true; 748*cdf0e10cSrcweir } 749*cdf0e10cSrcweir } 750*cdf0e10cSrcweir return bWrap; 751*cdf0e10cSrcweir } 752*cdf0e10cSrcweir 753*cdf0e10cSrcweir bool ScOutlineWindow::IsFocusButtonVisible() const 754*cdf0e10cSrcweir { 755*cdf0e10cSrcweir return IsButtonVisible( mnFocusLevel, mnFocusEntry ); 756*cdf0e10cSrcweir } 757*cdf0e10cSrcweir 758*cdf0e10cSrcweir bool ScOutlineWindow::ImplMoveFocusByEntry( bool bForward, bool bFindVisible ) 759*cdf0e10cSrcweir { 760*cdf0e10cSrcweir const ScOutlineArray* pArray = GetOutlineArray(); 761*cdf0e10cSrcweir if ( !pArray ) 762*cdf0e10cSrcweir return false; 763*cdf0e10cSrcweir 764*cdf0e10cSrcweir bool bWrapped = false; 765*cdf0e10cSrcweir size_t nEntryCount = pArray->GetCount( sal::static_int_cast<sal_uInt16>(mnFocusLevel) ); 766*cdf0e10cSrcweir // #i29530# entry count may be decreased after changing active sheet 767*cdf0e10cSrcweir if( mnFocusEntry >= nEntryCount ) 768*cdf0e10cSrcweir mnFocusEntry = SC_OL_HEADERENTRY; 769*cdf0e10cSrcweir size_t nOldEntry = mnFocusEntry; 770*cdf0e10cSrcweir 771*cdf0e10cSrcweir do 772*cdf0e10cSrcweir { 773*cdf0e10cSrcweir if ( mnFocusEntry == SC_OL_HEADERENTRY ) 774*cdf0e10cSrcweir { 775*cdf0e10cSrcweir // move from header to first or last entry 776*cdf0e10cSrcweir if ( nEntryCount > 0 ) 777*cdf0e10cSrcweir mnFocusEntry = bForward ? 0 : (nEntryCount - 1); 778*cdf0e10cSrcweir /* wrapped, if forward from right header to first entry, 779*cdf0e10cSrcweir or if backward from left header to last entry */ 780*cdf0e10cSrcweir // Header and entries are now always in consistent order, 781*cdf0e10cSrcweir // so there's no need to check for mirroring here. 782*cdf0e10cSrcweir if ( !nEntryCount || !bForward ) 783*cdf0e10cSrcweir bWrapped = true; 784*cdf0e10cSrcweir } 785*cdf0e10cSrcweir else if ( lcl_RotateValue( mnFocusEntry, 0, nEntryCount - 1, bForward ) ) 786*cdf0e10cSrcweir { 787*cdf0e10cSrcweir // lcl_RotateValue returns true -> wrapped the entry range -> move to header 788*cdf0e10cSrcweir mnFocusEntry = SC_OL_HEADERENTRY; 789*cdf0e10cSrcweir /* wrapped, if forward from last entry to left header, 790*cdf0e10cSrcweir or if backward from first entry to right header */ 791*cdf0e10cSrcweir if ( bForward ) 792*cdf0e10cSrcweir bWrapped = true; 793*cdf0e10cSrcweir } 794*cdf0e10cSrcweir } 795*cdf0e10cSrcweir while ( bFindVisible && !IsFocusButtonVisible() && (nOldEntry != mnFocusEntry) ); 796*cdf0e10cSrcweir 797*cdf0e10cSrcweir return bWrapped; 798*cdf0e10cSrcweir } 799*cdf0e10cSrcweir 800*cdf0e10cSrcweir bool ScOutlineWindow::ImplMoveFocusByLevel( bool bForward ) 801*cdf0e10cSrcweir { 802*cdf0e10cSrcweir const ScOutlineArray* pArray = GetOutlineArray(); 803*cdf0e10cSrcweir if ( !pArray ) 804*cdf0e10cSrcweir return false; 805*cdf0e10cSrcweir 806*cdf0e10cSrcweir bool bWrapped = false; 807*cdf0e10cSrcweir size_t nLevelCount = GetLevelCount(); 808*cdf0e10cSrcweir 809*cdf0e10cSrcweir if ( mnFocusEntry == SC_OL_HEADERENTRY ) 810*cdf0e10cSrcweir { 811*cdf0e10cSrcweir if ( nLevelCount > 0 ) 812*cdf0e10cSrcweir bWrapped = lcl_RotateValue( mnFocusLevel, 0, nLevelCount - 1, bForward ); 813*cdf0e10cSrcweir } 814*cdf0e10cSrcweir else 815*cdf0e10cSrcweir { 816*cdf0e10cSrcweir const ScOutlineEntry* pEntry = pArray->GetEntry( sal::static_int_cast<sal_uInt16>(mnFocusLevel), 817*cdf0e10cSrcweir sal::static_int_cast<sal_uInt16>(mnFocusEntry) ); 818*cdf0e10cSrcweir if ( pEntry ) 819*cdf0e10cSrcweir { 820*cdf0e10cSrcweir SCCOLROW nStart = pEntry->GetStart(); 821*cdf0e10cSrcweir SCCOLROW nEnd = pEntry->GetEnd(); 822*cdf0e10cSrcweir size_t nNewLevel = mnFocusLevel; 823*cdf0e10cSrcweir size_t nNewEntry = 0; 824*cdf0e10cSrcweir 825*cdf0e10cSrcweir bool bFound = false; 826*cdf0e10cSrcweir if ( bForward && (mnFocusLevel + 2 < nLevelCount) ) 827*cdf0e10cSrcweir { 828*cdf0e10cSrcweir // next level -> find first child entry 829*cdf0e10cSrcweir nNewLevel = mnFocusLevel + 1; 830*cdf0e10cSrcweir // TODO - change ScOutlineArray interface to size_t usage 831*cdf0e10cSrcweir sal_uInt16 nTmpEntry = 0; 832*cdf0e10cSrcweir bFound = pArray->GetEntryIndexInRange( sal::static_int_cast<sal_uInt16>(nNewLevel), nStart, nEnd, nTmpEntry ); 833*cdf0e10cSrcweir nNewEntry = nTmpEntry; 834*cdf0e10cSrcweir } 835*cdf0e10cSrcweir else if ( !bForward && (mnFocusLevel > 0) ) 836*cdf0e10cSrcweir { 837*cdf0e10cSrcweir // previous level -> find parent entry 838*cdf0e10cSrcweir nNewLevel = mnFocusLevel - 1; 839*cdf0e10cSrcweir // TODO - change ScOutlineArray interface to size_t usage 840*cdf0e10cSrcweir sal_uInt16 nTmpEntry = 0; 841*cdf0e10cSrcweir bFound = pArray->GetEntryIndex( sal::static_int_cast<sal_uInt16>(nNewLevel), nStart, nTmpEntry ); 842*cdf0e10cSrcweir nNewEntry = nTmpEntry; 843*cdf0e10cSrcweir } 844*cdf0e10cSrcweir 845*cdf0e10cSrcweir if ( bFound && IsButtonVisible( nNewLevel, nNewEntry ) ) 846*cdf0e10cSrcweir { 847*cdf0e10cSrcweir mnFocusLevel = nNewLevel; 848*cdf0e10cSrcweir mnFocusEntry = nNewEntry; 849*cdf0e10cSrcweir } 850*cdf0e10cSrcweir } 851*cdf0e10cSrcweir } 852*cdf0e10cSrcweir 853*cdf0e10cSrcweir return bWrapped; 854*cdf0e10cSrcweir } 855*cdf0e10cSrcweir 856*cdf0e10cSrcweir bool ScOutlineWindow::ImplMoveFocusByTabOrder( bool bForward, bool bFindVisible ) 857*cdf0e10cSrcweir { 858*cdf0e10cSrcweir bool bRet = false; 859*cdf0e10cSrcweir size_t nOldLevel = mnFocusLevel; 860*cdf0e10cSrcweir size_t nOldEntry = mnFocusEntry; 861*cdf0e10cSrcweir 862*cdf0e10cSrcweir do 863*cdf0e10cSrcweir { 864*cdf0e10cSrcweir /* one level up, if backward from left header, 865*cdf0e10cSrcweir or one level down, if forward from right header */ 866*cdf0e10cSrcweir if ( (!bForward) && (mnFocusEntry == SC_OL_HEADERENTRY) ) 867*cdf0e10cSrcweir bRet |= ImplMoveFocusByLevel( bForward ); 868*cdf0e10cSrcweir // move to next/previous entry 869*cdf0e10cSrcweir bool bWrapInLevel = ImplMoveFocusByEntry( bForward, false ); 870*cdf0e10cSrcweir bRet |= bWrapInLevel; 871*cdf0e10cSrcweir /* one level up, if wrapped backward to right header, 872*cdf0e10cSrcweir or one level down, if wrapped forward to right header */ 873*cdf0e10cSrcweir if ( bForward && bWrapInLevel ) 874*cdf0e10cSrcweir bRet |= ImplMoveFocusByLevel( bForward ); 875*cdf0e10cSrcweir } 876*cdf0e10cSrcweir while ( bFindVisible && !IsFocusButtonVisible() && ((nOldLevel != mnFocusLevel) || (nOldEntry != mnFocusEntry)) ); 877*cdf0e10cSrcweir 878*cdf0e10cSrcweir return bRet; 879*cdf0e10cSrcweir } 880*cdf0e10cSrcweir 881*cdf0e10cSrcweir void ScOutlineWindow::ImplMoveFocusToVisible( bool bForward ) 882*cdf0e10cSrcweir { 883*cdf0e10cSrcweir // first try to find an entry in the same level 884*cdf0e10cSrcweir if ( !IsFocusButtonVisible() ) 885*cdf0e10cSrcweir ImplMoveFocusByEntry( bForward, true ); 886*cdf0e10cSrcweir // then try to find any other entry 887*cdf0e10cSrcweir if ( !IsFocusButtonVisible() ) 888*cdf0e10cSrcweir ImplMoveFocusByTabOrder( bForward, true ); 889*cdf0e10cSrcweir } 890*cdf0e10cSrcweir 891*cdf0e10cSrcweir void ScOutlineWindow::MoveFocusByEntry( bool bForward ) 892*cdf0e10cSrcweir { 893*cdf0e10cSrcweir HideFocus(); 894*cdf0e10cSrcweir ImplMoveFocusByEntry( bForward, true ); 895*cdf0e10cSrcweir ShowFocus(); 896*cdf0e10cSrcweir } 897*cdf0e10cSrcweir 898*cdf0e10cSrcweir void ScOutlineWindow::MoveFocusByLevel( bool bForward ) 899*cdf0e10cSrcweir { 900*cdf0e10cSrcweir HideFocus(); 901*cdf0e10cSrcweir ImplMoveFocusByLevel( bForward ); 902*cdf0e10cSrcweir ShowFocus(); 903*cdf0e10cSrcweir } 904*cdf0e10cSrcweir 905*cdf0e10cSrcweir void ScOutlineWindow::MoveFocusByTabOrder( bool bForward ) 906*cdf0e10cSrcweir { 907*cdf0e10cSrcweir HideFocus(); 908*cdf0e10cSrcweir ImplMoveFocusByTabOrder( bForward, true ); 909*cdf0e10cSrcweir ShowFocus(); 910*cdf0e10cSrcweir } 911*cdf0e10cSrcweir 912*cdf0e10cSrcweir void ScOutlineWindow::GetFocus() 913*cdf0e10cSrcweir { 914*cdf0e10cSrcweir Window::GetFocus(); 915*cdf0e10cSrcweir ShowFocus(); 916*cdf0e10cSrcweir } 917*cdf0e10cSrcweir 918*cdf0e10cSrcweir void ScOutlineWindow::LoseFocus() 919*cdf0e10cSrcweir { 920*cdf0e10cSrcweir HideFocus(); 921*cdf0e10cSrcweir Window::LoseFocus(); 922*cdf0e10cSrcweir } 923*cdf0e10cSrcweir 924*cdf0e10cSrcweir 925*cdf0e10cSrcweir // mouse ---------------------------------------------------------------------- 926*cdf0e10cSrcweir 927*cdf0e10cSrcweir void ScOutlineWindow::StartMouseTracking( size_t nLevel, size_t nEntry ) 928*cdf0e10cSrcweir { 929*cdf0e10cSrcweir mbMTActive = true; 930*cdf0e10cSrcweir mnMTLevel = nLevel; 931*cdf0e10cSrcweir mnMTEntry = nEntry; 932*cdf0e10cSrcweir DrawBorderRel( nLevel, nEntry, true ); 933*cdf0e10cSrcweir } 934*cdf0e10cSrcweir 935*cdf0e10cSrcweir void ScOutlineWindow::EndMouseTracking() 936*cdf0e10cSrcweir { 937*cdf0e10cSrcweir if ( mbMTPressed ) 938*cdf0e10cSrcweir DrawBorderRel( mnMTLevel, mnMTEntry, false ); 939*cdf0e10cSrcweir mbMTActive = false; 940*cdf0e10cSrcweir } 941*cdf0e10cSrcweir 942*cdf0e10cSrcweir void ScOutlineWindow::MouseMove( const MouseEvent& rMEvt ) 943*cdf0e10cSrcweir { 944*cdf0e10cSrcweir if ( IsMouseTracking() ) 945*cdf0e10cSrcweir { 946*cdf0e10cSrcweir size_t nLevel, nEntry; 947*cdf0e10cSrcweir bool bHit = false; 948*cdf0e10cSrcweir 949*cdf0e10cSrcweir if ( ButtonHit( rMEvt.GetPosPixel(), nLevel, nEntry ) ) 950*cdf0e10cSrcweir bHit = (nLevel == mnMTLevel) && (nEntry == mnMTEntry); 951*cdf0e10cSrcweir 952*cdf0e10cSrcweir if ( bHit != mbMTPressed ) 953*cdf0e10cSrcweir DrawBorderRel( mnMTLevel, mnMTEntry, bHit ); 954*cdf0e10cSrcweir } 955*cdf0e10cSrcweir } 956*cdf0e10cSrcweir 957*cdf0e10cSrcweir void ScOutlineWindow::MouseButtonUp( const MouseEvent& rMEvt ) 958*cdf0e10cSrcweir { 959*cdf0e10cSrcweir if ( IsMouseTracking() ) 960*cdf0e10cSrcweir { 961*cdf0e10cSrcweir EndMouseTracking(); 962*cdf0e10cSrcweir 963*cdf0e10cSrcweir size_t nLevel, nEntry; 964*cdf0e10cSrcweir if ( ButtonHit( rMEvt.GetPosPixel(), nLevel, nEntry ) ) 965*cdf0e10cSrcweir if ( (nLevel == mnMTLevel) && (nEntry == mnMTEntry) ) 966*cdf0e10cSrcweir DoFunction( nLevel, nEntry ); 967*cdf0e10cSrcweir } 968*cdf0e10cSrcweir } 969*cdf0e10cSrcweir 970*cdf0e10cSrcweir void ScOutlineWindow::MouseButtonDown( const MouseEvent& rMEvt ) 971*cdf0e10cSrcweir { 972*cdf0e10cSrcweir size_t nLevel, nEntry; 973*cdf0e10cSrcweir bool bHit = ButtonHit( rMEvt.GetPosPixel(), nLevel, nEntry ); 974*cdf0e10cSrcweir if ( bHit ) 975*cdf0e10cSrcweir StartMouseTracking( nLevel, nEntry ); 976*cdf0e10cSrcweir else if ( rMEvt.GetClicks() == 2 ) 977*cdf0e10cSrcweir { 978*cdf0e10cSrcweir bHit = LineHit( rMEvt.GetPosPixel(), nLevel, nEntry ); 979*cdf0e10cSrcweir if ( bHit ) 980*cdf0e10cSrcweir DoFunction( nLevel, nEntry ); 981*cdf0e10cSrcweir } 982*cdf0e10cSrcweir 983*cdf0e10cSrcweir // if an item has been hit and window is focused, move focus to this item 984*cdf0e10cSrcweir if ( bHit && HasFocus() ) 985*cdf0e10cSrcweir { 986*cdf0e10cSrcweir HideFocus(); 987*cdf0e10cSrcweir mnFocusLevel = nLevel; 988*cdf0e10cSrcweir mnFocusEntry = nEntry; 989*cdf0e10cSrcweir ShowFocus(); 990*cdf0e10cSrcweir } 991*cdf0e10cSrcweir } 992*cdf0e10cSrcweir 993*cdf0e10cSrcweir 994*cdf0e10cSrcweir // keyboard ------------------------------------------------------------------- 995*cdf0e10cSrcweir 996*cdf0e10cSrcweir void ScOutlineWindow::KeyInput( const KeyEvent& rKEvt ) 997*cdf0e10cSrcweir { 998*cdf0e10cSrcweir const KeyCode& rKCode = rKEvt.GetKeyCode(); 999*cdf0e10cSrcweir bool bNoMod = !rKCode.GetModifier(); 1000*cdf0e10cSrcweir bool bShift = (rKCode.GetModifier() == KEY_SHIFT); 1001*cdf0e10cSrcweir bool bCtrl = (rKCode.GetModifier() == KEY_MOD1); 1002*cdf0e10cSrcweir 1003*cdf0e10cSrcweir sal_uInt16 nCode = rKCode.GetCode(); 1004*cdf0e10cSrcweir bool bUpDownKey = (nCode == KEY_UP) || (nCode == KEY_DOWN); 1005*cdf0e10cSrcweir bool bLeftRightKey = (nCode == KEY_LEFT) || (nCode == KEY_RIGHT); 1006*cdf0e10cSrcweir 1007*cdf0e10cSrcweir // TAB key 1008*cdf0e10cSrcweir if ( (nCode == KEY_TAB) && (bNoMod || bShift) ) 1009*cdf0e10cSrcweir // move forward without SHIFT key 1010*cdf0e10cSrcweir MoveFocusByTabOrder( bNoMod ); // TAB uses logical order, regardless of mirroring 1011*cdf0e10cSrcweir 1012*cdf0e10cSrcweir // LEFT/RIGHT/UP/DOWN keys 1013*cdf0e10cSrcweir else if ( bNoMod && (bUpDownKey || bLeftRightKey) ) 1014*cdf0e10cSrcweir { 1015*cdf0e10cSrcweir bool bForward = (nCode == KEY_DOWN) || (nCode == KEY_RIGHT); 1016*cdf0e10cSrcweir if ( mbHoriz == bLeftRightKey ) 1017*cdf0e10cSrcweir // move inside level with LEFT/RIGHT in horizontal and with UP/DOWN in vertical 1018*cdf0e10cSrcweir MoveFocusByEntry( bForward != mbMirrorEntries ); 1019*cdf0e10cSrcweir else 1020*cdf0e10cSrcweir // move to next/prev level with LEFT/RIGHT in vertical and with UP/DOWN in horizontal 1021*cdf0e10cSrcweir MoveFocusByLevel( bForward != mbMirrorLevels ); 1022*cdf0e10cSrcweir } 1023*cdf0e10cSrcweir 1024*cdf0e10cSrcweir // CTRL + number 1025*cdf0e10cSrcweir else if ( bCtrl && (nCode >= KEY_1) && (nCode <= KEY_9) ) 1026*cdf0e10cSrcweir { 1027*cdf0e10cSrcweir size_t nLevel = static_cast< size_t >( nCode - KEY_1 ); 1028*cdf0e10cSrcweir if ( nLevel < GetLevelCount() ) 1029*cdf0e10cSrcweir DoFunction( nLevel, SC_OL_HEADERENTRY ); 1030*cdf0e10cSrcweir } 1031*cdf0e10cSrcweir 1032*cdf0e10cSrcweir // other key codes 1033*cdf0e10cSrcweir else switch ( rKCode.GetFullCode() ) 1034*cdf0e10cSrcweir { 1035*cdf0e10cSrcweir case KEY_ADD: DoExpand( mnFocusLevel, mnFocusEntry ); break; 1036*cdf0e10cSrcweir case KEY_SUBTRACT: DoCollapse( mnFocusLevel, mnFocusEntry ); break; 1037*cdf0e10cSrcweir case KEY_SPACE: 1038*cdf0e10cSrcweir case KEY_RETURN: DoFunction( mnFocusLevel, mnFocusEntry ); break; 1039*cdf0e10cSrcweir default: Window::KeyInput( rKEvt ); 1040*cdf0e10cSrcweir } 1041*cdf0e10cSrcweir } 1042*cdf0e10cSrcweir 1043*cdf0e10cSrcweir 1044*cdf0e10cSrcweir // ============================================================================ 1045*cdf0e10cSrcweir 1046