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 // System - Includes ----------------------------------------------------- 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir // INCLUDE --------------------------------------------------------------- 36*cdf0e10cSrcweir #include <rangelst.hxx> 37*cdf0e10cSrcweir #include "scitems.hxx" 38*cdf0e10cSrcweir #include <editeng/eeitem.hxx> 39*cdf0e10cSrcweir 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #include <editeng/brshitem.hxx> 42*cdf0e10cSrcweir #include <editeng/editview.hxx> 43*cdf0e10cSrcweir #include <svx/fmshell.hxx> 44*cdf0e10cSrcweir #include <svx/svdoole2.hxx> 45*cdf0e10cSrcweir #include <sfx2/bindings.hxx> 46*cdf0e10cSrcweir #include <sfx2/viewfrm.hxx> 47*cdf0e10cSrcweir #include <vcl/cursor.hxx> 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir #include "tabview.hxx" 50*cdf0e10cSrcweir #include "tabvwsh.hxx" 51*cdf0e10cSrcweir #include "docsh.hxx" 52*cdf0e10cSrcweir #include "gridwin.hxx" 53*cdf0e10cSrcweir #include "olinewin.hxx" 54*cdf0e10cSrcweir #include "colrowba.hxx" 55*cdf0e10cSrcweir #include "tabcont.hxx" 56*cdf0e10cSrcweir #include "scmod.hxx" 57*cdf0e10cSrcweir #include "uiitems.hxx" 58*cdf0e10cSrcweir #include "sc.hrc" 59*cdf0e10cSrcweir #include "viewutil.hxx" 60*cdf0e10cSrcweir #include "editutil.hxx" 61*cdf0e10cSrcweir #include "inputhdl.hxx" 62*cdf0e10cSrcweir #include "inputwin.hxx" 63*cdf0e10cSrcweir #include "validat.hxx" 64*cdf0e10cSrcweir #include "hintwin.hxx" 65*cdf0e10cSrcweir #include "inputopt.hxx" 66*cdf0e10cSrcweir #include "rfindlst.hxx" 67*cdf0e10cSrcweir #include "hiranges.hxx" 68*cdf0e10cSrcweir #include "viewuno.hxx" 69*cdf0e10cSrcweir #include "chartarr.hxx" 70*cdf0e10cSrcweir #include "anyrefdg.hxx" 71*cdf0e10cSrcweir #include "dpobject.hxx" 72*cdf0e10cSrcweir #include "patattr.hxx" 73*cdf0e10cSrcweir #include "dociter.hxx" 74*cdf0e10cSrcweir #include "seltrans.hxx" 75*cdf0e10cSrcweir #include "fillinfo.hxx" 76*cdf0e10cSrcweir #include "AccessibilityHints.hxx" 77*cdf0e10cSrcweir #include "rangeutl.hxx" 78*cdf0e10cSrcweir #include "client.hxx" 79*cdf0e10cSrcweir #include "tabprotection.hxx" 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir #include <com/sun/star/chart2/data/HighlightedRange.hpp> 82*cdf0e10cSrcweir 83*cdf0e10cSrcweir namespace 84*cdf0e10cSrcweir { 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir ScRange lcl_getSubRangeByIndex( const ScRange& rRange, sal_Int32 nIndex ) 87*cdf0e10cSrcweir { 88*cdf0e10cSrcweir ScAddress aResult( rRange.aStart ); 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir SCCOL nWidth = rRange.aEnd.Col() - rRange.aStart.Col() + 1; 91*cdf0e10cSrcweir SCROW nHeight = rRange.aEnd.Row() - rRange.aStart.Row() + 1; 92*cdf0e10cSrcweir SCTAB nDepth = rRange.aEnd.Tab() - rRange.aStart.Tab() + 1; 93*cdf0e10cSrcweir if( (nWidth > 0) && (nHeight > 0) && (nDepth > 0) ) 94*cdf0e10cSrcweir { 95*cdf0e10cSrcweir // row by row from first to last sheet 96*cdf0e10cSrcweir sal_Int32 nArea = nWidth * nHeight; 97*cdf0e10cSrcweir aResult.IncCol( static_cast< SCsCOL >( nIndex % nWidth ) ); 98*cdf0e10cSrcweir aResult.IncRow( static_cast< SCsROW >( (nIndex % nArea) / nWidth ) ); 99*cdf0e10cSrcweir aResult.IncTab( static_cast< SCsTAB >( nIndex / nArea ) ); 100*cdf0e10cSrcweir if( !rRange.In( aResult ) ) 101*cdf0e10cSrcweir aResult = rRange.aStart; 102*cdf0e10cSrcweir } 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir return ScRange( aResult ); 105*cdf0e10cSrcweir } 106*cdf0e10cSrcweir 107*cdf0e10cSrcweir } // anonymous namespace 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir using namespace com::sun::star; 110*cdf0e10cSrcweir 111*cdf0e10cSrcweir // ----------------------------------------------------------------------- 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir // 114*cdf0e10cSrcweir // --- Public-Funktionen 115*cdf0e10cSrcweir // 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir void ScTabView::ClickCursor( SCCOL nPosX, SCROW nPosY, sal_Bool bControl ) 118*cdf0e10cSrcweir { 119*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 120*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 121*cdf0e10cSrcweir while (pDoc->IsHorOverlapped( nPosX, nPosY, nTab )) //! ViewData !!! 122*cdf0e10cSrcweir --nPosX; 123*cdf0e10cSrcweir while (pDoc->IsVerOverlapped( nPosX, nPosY, nTab )) 124*cdf0e10cSrcweir --nPosY; 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir sal_Bool bRefMode = SC_MOD()->IsFormulaMode(); 127*cdf0e10cSrcweir 128*cdf0e10cSrcweir if ( bRefMode ) 129*cdf0e10cSrcweir { 130*cdf0e10cSrcweir DoneRefMode( sal_False ); 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir if (bControl) 133*cdf0e10cSrcweir SC_MOD()->AddRefEntry(); 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir InitRefMode( nPosX, nPosY, nTab, SC_REFTYPE_REF ); 136*cdf0e10cSrcweir } 137*cdf0e10cSrcweir else 138*cdf0e10cSrcweir { 139*cdf0e10cSrcweir DoneBlockMode( bControl ); 140*cdf0e10cSrcweir aViewData.ResetOldCursor(); 141*cdf0e10cSrcweir SetCursor( (SCCOL) nPosX, (SCROW) nPosY ); 142*cdf0e10cSrcweir } 143*cdf0e10cSrcweir } 144*cdf0e10cSrcweir 145*cdf0e10cSrcweir void ScTabView::UpdateAutoFillMark() 146*cdf0e10cSrcweir { 147*cdf0e10cSrcweir // single selection or cursor 148*cdf0e10cSrcweir ScRange aMarkRange; 149*cdf0e10cSrcweir sal_Bool bMarked = (aViewData.GetSimpleArea( aMarkRange ) == SC_MARK_SIMPLE); 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir sal_uInt16 i; 152*cdf0e10cSrcweir for (i=0; i<4; i++) 153*cdf0e10cSrcweir if (pGridWin[i] && pGridWin[i]->IsVisible()) 154*cdf0e10cSrcweir pGridWin[i]->UpdateAutoFillMark( bMarked, aMarkRange ); 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir for (i=0; i<2; i++) 157*cdf0e10cSrcweir { 158*cdf0e10cSrcweir if (pColBar[i] && pColBar[i]->IsVisible()) 159*cdf0e10cSrcweir pColBar[i]->SetMark( bMarked, aMarkRange.aStart.Col(), aMarkRange.aEnd.Col() ); 160*cdf0e10cSrcweir if (pRowBar[i] && pRowBar[i]->IsVisible()) 161*cdf0e10cSrcweir pRowBar[i]->SetMark( bMarked, aMarkRange.aStart.Row(), aMarkRange.aEnd.Row() ); 162*cdf0e10cSrcweir } 163*cdf0e10cSrcweir 164*cdf0e10cSrcweir // selection transfer object is checked together with AutoFill marks, 165*cdf0e10cSrcweir // because it has the same requirement of a single continuous block. 166*cdf0e10cSrcweir CheckSelectionTransfer(); // update selection transfer object 167*cdf0e10cSrcweir } 168*cdf0e10cSrcweir 169*cdf0e10cSrcweir void ScTabView::FakeButtonUp( ScSplitPos eWhich ) 170*cdf0e10cSrcweir { 171*cdf0e10cSrcweir if (pGridWin[eWhich]) 172*cdf0e10cSrcweir pGridWin[eWhich]->FakeButtonUp(); 173*cdf0e10cSrcweir } 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir void ScTabView::HideAllCursors() 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir for (sal_uInt16 i=0; i<4; i++) 178*cdf0e10cSrcweir if (pGridWin[i]) 179*cdf0e10cSrcweir if (pGridWin[i]->IsVisible()) 180*cdf0e10cSrcweir { 181*cdf0e10cSrcweir Cursor* pCur = pGridWin[i]->GetCursor(); 182*cdf0e10cSrcweir if (pCur) 183*cdf0e10cSrcweir if (pCur->IsVisible()) 184*cdf0e10cSrcweir pCur->Hide(); 185*cdf0e10cSrcweir pGridWin[i]->HideCursor(); 186*cdf0e10cSrcweir } 187*cdf0e10cSrcweir } 188*cdf0e10cSrcweir 189*cdf0e10cSrcweir void ScTabView::ShowAllCursors() 190*cdf0e10cSrcweir { 191*cdf0e10cSrcweir for (sal_uInt16 i=0; i<4; i++) 192*cdf0e10cSrcweir if (pGridWin[i]) 193*cdf0e10cSrcweir if (pGridWin[i]->IsVisible()) 194*cdf0e10cSrcweir { 195*cdf0e10cSrcweir pGridWin[i]->ShowCursor(); 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir // #114409# 198*cdf0e10cSrcweir pGridWin[i]->CursorChanged(); 199*cdf0e10cSrcweir } 200*cdf0e10cSrcweir } 201*cdf0e10cSrcweir 202*cdf0e10cSrcweir void ScTabView::HideCursor() 203*cdf0e10cSrcweir { 204*cdf0e10cSrcweir pGridWin[aViewData.GetActivePart()]->HideCursor(); 205*cdf0e10cSrcweir } 206*cdf0e10cSrcweir 207*cdf0e10cSrcweir void ScTabView::ShowCursor() 208*cdf0e10cSrcweir { 209*cdf0e10cSrcweir pGridWin[aViewData.GetActivePart()]->ShowCursor(); 210*cdf0e10cSrcweir 211*cdf0e10cSrcweir // #114409# 212*cdf0e10cSrcweir pGridWin[aViewData.GetActivePart()]->CursorChanged(); 213*cdf0e10cSrcweir } 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir void ScTabView::InvalidateAttribs() 216*cdf0e10cSrcweir { 217*cdf0e10cSrcweir SfxBindings& rBindings = aViewData.GetBindings(); 218*cdf0e10cSrcweir 219*cdf0e10cSrcweir rBindings.Invalidate( SID_STYLE_APPLY ); 220*cdf0e10cSrcweir rBindings.Invalidate( SID_STYLE_FAMILY2 ); 221*cdf0e10cSrcweir // StarCalc kennt nur Absatz- bzw. Zellformat-Vorlagen 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir rBindings.Invalidate( SID_ATTR_CHAR_FONT ); 224*cdf0e10cSrcweir rBindings.Invalidate( SID_ATTR_CHAR_FONTHEIGHT ); 225*cdf0e10cSrcweir rBindings.Invalidate( SID_ATTR_CHAR_COLOR ); 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir rBindings.Invalidate( SID_ATTR_CHAR_WEIGHT ); 228*cdf0e10cSrcweir rBindings.Invalidate( SID_ATTR_CHAR_POSTURE ); 229*cdf0e10cSrcweir rBindings.Invalidate( SID_ATTR_CHAR_UNDERLINE ); 230*cdf0e10cSrcweir rBindings.Invalidate( SID_ULINE_VAL_NONE ); 231*cdf0e10cSrcweir rBindings.Invalidate( SID_ULINE_VAL_SINGLE ); 232*cdf0e10cSrcweir rBindings.Invalidate( SID_ULINE_VAL_DOUBLE ); 233*cdf0e10cSrcweir rBindings.Invalidate( SID_ULINE_VAL_DOTTED ); 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir rBindings.Invalidate( SID_ATTR_CHAR_OVERLINE ); 236*cdf0e10cSrcweir 237*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGNLEFT ); 238*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGNRIGHT ); 239*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGNBLOCK ); 240*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGNCENTERHOR ); 241*cdf0e10cSrcweir 242*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGNTOP ); 243*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGNBOTTOM ); 244*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGNCENTERVER ); 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir rBindings.Invalidate( SID_BACKGROUND_COLOR ); 247*cdf0e10cSrcweir 248*cdf0e10cSrcweir rBindings.Invalidate( SID_ATTR_ALIGN_LINEBREAK ); 249*cdf0e10cSrcweir rBindings.Invalidate( SID_NUMBER_FORMAT ); 250*cdf0e10cSrcweir 251*cdf0e10cSrcweir rBindings.Invalidate( SID_TEXTDIRECTION_LEFT_TO_RIGHT ); 252*cdf0e10cSrcweir rBindings.Invalidate( SID_TEXTDIRECTION_TOP_TO_BOTTOM ); 253*cdf0e10cSrcweir rBindings.Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT ); 254*cdf0e10cSrcweir rBindings.Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT ); 255*cdf0e10cSrcweir 256*cdf0e10cSrcweir // pseudo slots for Format menu 257*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGN_ANY_HDEFAULT ); 258*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGN_ANY_LEFT ); 259*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGN_ANY_HCENTER ); 260*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGN_ANY_RIGHT ); 261*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGN_ANY_JUSTIFIED ); 262*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGN_ANY_VDEFAULT ); 263*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGN_ANY_TOP ); 264*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGN_ANY_VCENTER ); 265*cdf0e10cSrcweir rBindings.Invalidate( SID_ALIGN_ANY_BOTTOM ); 266*cdf0e10cSrcweir 267*cdf0e10cSrcweir // rBindings.Invalidate( SID_RANGE_VALUE ); 268*cdf0e10cSrcweir // rBindings.Invalidate( SID_RANGE_FORMULA ); 269*cdf0e10cSrcweir } 270*cdf0e10cSrcweir 271*cdf0e10cSrcweir // SetCursor - Cursor setzen, zeichnen, InputWin updaten 272*cdf0e10cSrcweir // oder Referenz verschicken 273*cdf0e10cSrcweir // ohne Optimierung wegen BugId 29307 274*cdf0e10cSrcweir 275*cdf0e10cSrcweir #ifdef _MSC_VER 276*cdf0e10cSrcweir #pragma optimize ( "", off ) 277*cdf0e10cSrcweir #endif 278*cdf0e10cSrcweir 279*cdf0e10cSrcweir void ScTabView::SetCursor( SCCOL nPosX, SCROW nPosY, sal_Bool bNew ) 280*cdf0e10cSrcweir { 281*cdf0e10cSrcweir SCCOL nOldX = aViewData.GetCurX(); 282*cdf0e10cSrcweir SCROW nOldY = aViewData.GetCurY(); 283*cdf0e10cSrcweir 284*cdf0e10cSrcweir // DeactivateIP nur noch bei MarkListHasChanged 285*cdf0e10cSrcweir 286*cdf0e10cSrcweir if ( nPosX != nOldX || nPosY != nOldY || bNew ) 287*cdf0e10cSrcweir { 288*cdf0e10cSrcweir ScTabViewShell* pViewShell = aViewData.GetViewShell(); 289*cdf0e10cSrcweir bool bRefMode = ( pViewShell ? pViewShell->IsRefInputMode() : false ); 290*cdf0e10cSrcweir if ( aViewData.HasEditView( aViewData.GetActivePart() ) && !bRefMode ) // 23259 oder so 291*cdf0e10cSrcweir { 292*cdf0e10cSrcweir UpdateInputLine(); 293*cdf0e10cSrcweir } 294*cdf0e10cSrcweir 295*cdf0e10cSrcweir HideAllCursors(); 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir aViewData.SetCurX( nPosX ); 298*cdf0e10cSrcweir aViewData.SetCurY( nPosY ); 299*cdf0e10cSrcweir 300*cdf0e10cSrcweir ShowAllCursors(); 301*cdf0e10cSrcweir 302*cdf0e10cSrcweir CursorPosChanged(); 303*cdf0e10cSrcweir } 304*cdf0e10cSrcweir } 305*cdf0e10cSrcweir 306*cdf0e10cSrcweir #ifdef _MSC_VER 307*cdf0e10cSrcweir #pragma optimize ( "", on ) 308*cdf0e10cSrcweir #endif 309*cdf0e10cSrcweir 310*cdf0e10cSrcweir void ScTabView::CheckSelectionTransfer() 311*cdf0e10cSrcweir { 312*cdf0e10cSrcweir if ( aViewData.IsActive() ) // only for active view 313*cdf0e10cSrcweir { 314*cdf0e10cSrcweir ScModule* pScMod = SC_MOD(); 315*cdf0e10cSrcweir ScSelectionTransferObj* pOld = pScMod->GetSelectionTransfer(); 316*cdf0e10cSrcweir if ( pOld && pOld->GetView() == this && pOld->StillValid() ) 317*cdf0e10cSrcweir { 318*cdf0e10cSrcweir // selection not changed - nothing to do 319*cdf0e10cSrcweir } 320*cdf0e10cSrcweir else 321*cdf0e10cSrcweir { 322*cdf0e10cSrcweir ScSelectionTransferObj* pNew = ScSelectionTransferObj::CreateFromView( this ); 323*cdf0e10cSrcweir if ( pNew ) 324*cdf0e10cSrcweir { 325*cdf0e10cSrcweir // create new selection 326*cdf0e10cSrcweir 327*cdf0e10cSrcweir if (pOld) 328*cdf0e10cSrcweir pOld->ForgetView(); 329*cdf0e10cSrcweir 330*cdf0e10cSrcweir uno::Reference<datatransfer::XTransferable> xRef( pNew ); 331*cdf0e10cSrcweir pScMod->SetSelectionTransfer( pNew ); 332*cdf0e10cSrcweir pNew->CopyToSelection( GetActiveWin() ); // may delete pOld 333*cdf0e10cSrcweir } 334*cdf0e10cSrcweir else if ( pOld && pOld->GetView() == this ) 335*cdf0e10cSrcweir { 336*cdf0e10cSrcweir // remove own selection 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir pOld->ForgetView(); 339*cdf0e10cSrcweir pScMod->SetSelectionTransfer( NULL ); 340*cdf0e10cSrcweir TransferableHelper::ClearSelection( GetActiveWin() ); // may delete pOld 341*cdf0e10cSrcweir } 342*cdf0e10cSrcweir // else: selection from outside: leave unchanged 343*cdf0e10cSrcweir } 344*cdf0e10cSrcweir } 345*cdf0e10cSrcweir } 346*cdf0e10cSrcweir 347*cdf0e10cSrcweir // Eingabezeile / Menues updaten 348*cdf0e10cSrcweir // CursorPosChanged ruft SelectionChanged 349*cdf0e10cSrcweir // SelectionChanged ruft CellContentChanged 350*cdf0e10cSrcweir 351*cdf0e10cSrcweir void ScTabView::CellContentChanged() 352*cdf0e10cSrcweir { 353*cdf0e10cSrcweir SfxBindings& rBindings = aViewData.GetBindings(); 354*cdf0e10cSrcweir 355*cdf0e10cSrcweir rBindings.Invalidate( SID_ATTR_SIZE ); // -> Fehlermeldungen anzeigen 356*cdf0e10cSrcweir rBindings.Invalidate( SID_THESAURUS ); 357*cdf0e10cSrcweir rBindings.Invalidate( SID_HYPERLINK_GETLINK ); 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir InvalidateAttribs(); // Attribut-Updates 360*cdf0e10cSrcweir TestHintWindow(); // Eingabemeldung (Gueltigkeit) 361*cdf0e10cSrcweir 362*cdf0e10cSrcweir aViewData.GetViewShell()->UpdateInputHandler(); 363*cdf0e10cSrcweir } 364*cdf0e10cSrcweir 365*cdf0e10cSrcweir void ScTabView::SelectionChanged() 366*cdf0e10cSrcweir { 367*cdf0e10cSrcweir SfxViewFrame* pViewFrame = aViewData.GetViewShell()->GetViewFrame(); 368*cdf0e10cSrcweir if (pViewFrame) 369*cdf0e10cSrcweir { 370*cdf0e10cSrcweir uno::Reference<frame::XController> xController = pViewFrame->GetFrame().GetController(); 371*cdf0e10cSrcweir if (xController.is()) 372*cdf0e10cSrcweir { 373*cdf0e10cSrcweir ScTabViewObj* pImp = ScTabViewObj::getImplementation( xController ); 374*cdf0e10cSrcweir if (pImp) 375*cdf0e10cSrcweir pImp->SelectionChanged(); 376*cdf0e10cSrcweir } 377*cdf0e10cSrcweir } 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir UpdateAutoFillMark(); // also calls CheckSelectionTransfer 380*cdf0e10cSrcweir 381*cdf0e10cSrcweir SfxBindings& rBindings = aViewData.GetBindings(); 382*cdf0e10cSrcweir 383*cdf0e10cSrcweir rBindings.Invalidate( SID_CURRENTCELL ); // -> Navigator 384*cdf0e10cSrcweir rBindings.Invalidate( SID_AUTO_FILTER ); // -> Menue 385*cdf0e10cSrcweir rBindings.Invalidate( FID_NOTE_VISIBLE ); 386*cdf0e10cSrcweir rBindings.Invalidate( SID_DELETE_NOTE ); 387*cdf0e10cSrcweir 388*cdf0e10cSrcweir // Funktionen, die evtl disabled werden muessen 389*cdf0e10cSrcweir 390*cdf0e10cSrcweir rBindings.Invalidate( FID_INS_ROWBRK ); 391*cdf0e10cSrcweir rBindings.Invalidate( FID_INS_COLBRK ); 392*cdf0e10cSrcweir rBindings.Invalidate( FID_DEL_ROWBRK ); 393*cdf0e10cSrcweir rBindings.Invalidate( FID_DEL_COLBRK ); 394*cdf0e10cSrcweir rBindings.Invalidate( FID_MERGE_ON ); 395*cdf0e10cSrcweir rBindings.Invalidate( FID_MERGE_OFF ); 396*cdf0e10cSrcweir rBindings.Invalidate( FID_MERGE_TOGGLE ); 397*cdf0e10cSrcweir rBindings.Invalidate( SID_AUTOFILTER_HIDE ); 398*cdf0e10cSrcweir rBindings.Invalidate( SID_UNFILTER ); 399*cdf0e10cSrcweir // rBindings.Invalidate( SID_IMPORT_DATA ); // jetzt wieder immer moeglich 400*cdf0e10cSrcweir rBindings.Invalidate( SID_REIMPORT_DATA ); 401*cdf0e10cSrcweir rBindings.Invalidate( SID_REFRESH_DBAREA ); 402*cdf0e10cSrcweir rBindings.Invalidate( SID_OUTLINE_SHOW ); 403*cdf0e10cSrcweir rBindings.Invalidate( SID_OUTLINE_HIDE ); 404*cdf0e10cSrcweir rBindings.Invalidate( SID_OUTLINE_REMOVE ); 405*cdf0e10cSrcweir rBindings.Invalidate( FID_FILL_TO_BOTTOM ); 406*cdf0e10cSrcweir rBindings.Invalidate( FID_FILL_TO_RIGHT ); 407*cdf0e10cSrcweir rBindings.Invalidate( FID_FILL_TO_TOP ); 408*cdf0e10cSrcweir rBindings.Invalidate( FID_FILL_TO_LEFT ); 409*cdf0e10cSrcweir rBindings.Invalidate( FID_FILL_SERIES ); 410*cdf0e10cSrcweir rBindings.Invalidate( SID_SCENARIOS ); 411*cdf0e10cSrcweir rBindings.Invalidate( SID_AUTOFORMAT ); 412*cdf0e10cSrcweir rBindings.Invalidate( SID_OPENDLG_TABOP ); 413*cdf0e10cSrcweir rBindings.Invalidate( SID_DATA_SELECT ); 414*cdf0e10cSrcweir 415*cdf0e10cSrcweir rBindings.Invalidate( SID_CUT ); 416*cdf0e10cSrcweir rBindings.Invalidate( SID_COPY ); 417*cdf0e10cSrcweir rBindings.Invalidate( SID_PASTE ); 418*cdf0e10cSrcweir rBindings.Invalidate( SID_PASTE_SPECIAL ); 419*cdf0e10cSrcweir 420*cdf0e10cSrcweir rBindings.Invalidate( FID_INS_ROW ); 421*cdf0e10cSrcweir rBindings.Invalidate( FID_INS_COLUMN ); 422*cdf0e10cSrcweir rBindings.Invalidate( FID_INS_CELL ); 423*cdf0e10cSrcweir rBindings.Invalidate( FID_INS_CELLSDOWN ); 424*cdf0e10cSrcweir rBindings.Invalidate( FID_INS_CELLSRIGHT ); 425*cdf0e10cSrcweir 426*cdf0e10cSrcweir rBindings.Invalidate( FID_CHG_COMMENT ); 427*cdf0e10cSrcweir 428*cdf0e10cSrcweir // nur wegen Zellschutz: 429*cdf0e10cSrcweir 430*cdf0e10cSrcweir rBindings.Invalidate( SID_CELL_FORMAT_RESET ); 431*cdf0e10cSrcweir rBindings.Invalidate( SID_DELETE ); 432*cdf0e10cSrcweir rBindings.Invalidate( SID_DELETE_CONTENTS ); 433*cdf0e10cSrcweir rBindings.Invalidate( FID_DELETE_CELL ); 434*cdf0e10cSrcweir rBindings.Invalidate( FID_CELL_FORMAT ); 435*cdf0e10cSrcweir rBindings.Invalidate( SID_ENABLE_HYPHENATION ); 436*cdf0e10cSrcweir rBindings.Invalidate( SID_INSERT_POSTIT ); 437*cdf0e10cSrcweir rBindings.Invalidate( SID_CHARMAP ); 438*cdf0e10cSrcweir rBindings.Invalidate( SID_OPENDLG_FUNCTION ); 439*cdf0e10cSrcweir // rBindings.Invalidate( FID_CONDITIONAL_FORMAT ); 440*cdf0e10cSrcweir rBindings.Invalidate( SID_OPENDLG_CONDFRMT ); 441*cdf0e10cSrcweir rBindings.Invalidate( FID_VALIDATION ); 442*cdf0e10cSrcweir rBindings.Invalidate( SID_EXTERNAL_SOURCE ); 443*cdf0e10cSrcweir rBindings.Invalidate( SID_TEXT_TO_COLUMNS ); 444*cdf0e10cSrcweir rBindings.Invalidate( SID_SORT_ASCENDING ); 445*cdf0e10cSrcweir rBindings.Invalidate( SID_SORT_DESCENDING ); 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir if (aViewData.GetViewShell()->HasAccessibilityObjects()) 448*cdf0e10cSrcweir aViewData.GetViewShell()->BroadcastAccessibility(SfxSimpleHint(SC_HINT_ACC_CURSORCHANGED)); 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir CellContentChanged(); 451*cdf0e10cSrcweir } 452*cdf0e10cSrcweir 453*cdf0e10cSrcweir void ScTabView::CursorPosChanged() 454*cdf0e10cSrcweir { 455*cdf0e10cSrcweir sal_Bool bRefMode = SC_MOD()->IsFormulaMode(); 456*cdf0e10cSrcweir if ( !bRefMode ) // Abfrage, damit RefMode bei Tabellenwechsel funktioniert 457*cdf0e10cSrcweir aViewData.GetDocShell()->Broadcast( SfxSimpleHint( FID_KILLEDITVIEW ) ); 458*cdf0e10cSrcweir 459*cdf0e10cSrcweir // Broadcast, damit andere Views des Dokuments auch umschalten 460*cdf0e10cSrcweir 461*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 462*cdf0e10cSrcweir bool bDP = NULL != pDoc->GetDPAtCursor( 463*cdf0e10cSrcweir aViewData.GetCurX(), aViewData.GetCurY(), aViewData.GetTabNo() ); 464*cdf0e10cSrcweir aViewData.GetViewShell()->SetPivotShell(bDP); 465*cdf0e10cSrcweir 466*cdf0e10cSrcweir // UpdateInputHandler jetzt in CellContentChanged 467*cdf0e10cSrcweir 468*cdf0e10cSrcweir SelectionChanged(); 469*cdf0e10cSrcweir 470*cdf0e10cSrcweir aViewData.SetTabStartCol( SC_TABSTART_NONE ); 471*cdf0e10cSrcweir } 472*cdf0e10cSrcweir 473*cdf0e10cSrcweir void ScTabView::TestHintWindow() 474*cdf0e10cSrcweir { 475*cdf0e10cSrcweir // show input help window and list drop-down button for validity 476*cdf0e10cSrcweir 477*cdf0e10cSrcweir sal_Bool bListValButton = sal_False; 478*cdf0e10cSrcweir ScAddress aListValPos; 479*cdf0e10cSrcweir 480*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 481*cdf0e10cSrcweir const SfxUInt32Item* pItem = (const SfxUInt32Item*) 482*cdf0e10cSrcweir pDoc->GetAttr( aViewData.GetCurX(), 483*cdf0e10cSrcweir aViewData.GetCurY(), 484*cdf0e10cSrcweir aViewData.GetTabNo(), 485*cdf0e10cSrcweir ATTR_VALIDDATA ); 486*cdf0e10cSrcweir if ( pItem->GetValue() ) 487*cdf0e10cSrcweir { 488*cdf0e10cSrcweir const ScValidationData* pData = pDoc->GetValidationEntry( pItem->GetValue() ); 489*cdf0e10cSrcweir DBG_ASSERT(pData,"ValidationData nicht gefunden"); 490*cdf0e10cSrcweir String aTitle, aMessage; 491*cdf0e10cSrcweir if ( pData && pData->GetInput( aTitle, aMessage ) && aMessage.Len() > 0 ) 492*cdf0e10cSrcweir { 493*cdf0e10cSrcweir //! Abfrage, ob an gleicher Stelle !!!! 494*cdf0e10cSrcweir 495*cdf0e10cSrcweir DELETEZ(pInputHintWindow); 496*cdf0e10cSrcweir 497*cdf0e10cSrcweir ScSplitPos eWhich = aViewData.GetActivePart(); 498*cdf0e10cSrcweir Window* pWin = pGridWin[eWhich]; 499*cdf0e10cSrcweir SCCOL nCol = aViewData.GetCurX(); 500*cdf0e10cSrcweir SCROW nRow = aViewData.GetCurY(); 501*cdf0e10cSrcweir Point aPos = aViewData.GetScrPos( nCol, nRow, eWhich ); 502*cdf0e10cSrcweir Size aWinSize = pWin->GetOutputSizePixel(); 503*cdf0e10cSrcweir // Cursor sichtbar? 504*cdf0e10cSrcweir if ( nCol >= aViewData.GetPosX(WhichH(eWhich)) && 505*cdf0e10cSrcweir nRow >= aViewData.GetPosY(WhichV(eWhich)) && 506*cdf0e10cSrcweir aPos.X() < aWinSize.Width() && aPos.Y() < aWinSize.Height() ) 507*cdf0e10cSrcweir { 508*cdf0e10cSrcweir aPos += pWin->GetPosPixel(); // Position auf Frame 509*cdf0e10cSrcweir long nSizeXPix; 510*cdf0e10cSrcweir long nSizeYPix; 511*cdf0e10cSrcweir aViewData.GetMergeSizePixel( nCol, nRow, nSizeXPix, nSizeYPix ); 512*cdf0e10cSrcweir 513*cdf0e10cSrcweir // HintWindow anlegen, bestimmt seine Groesse selbst 514*cdf0e10cSrcweir pInputHintWindow = new ScHintWindow( pFrameWin, aTitle, aMessage ); 515*cdf0e10cSrcweir Size aHintSize = pInputHintWindow->GetSizePixel(); 516*cdf0e10cSrcweir Size aFrameWinSize = pFrameWin->GetOutputSizePixel(); 517*cdf0e10cSrcweir 518*cdf0e10cSrcweir // passende Position finden 519*cdf0e10cSrcweir // erster Versuch: unter dem Cursor 520*cdf0e10cSrcweir Point aHintPos( aPos.X() + nSizeXPix / 2, aPos.Y() + nSizeYPix + 3 ); 521*cdf0e10cSrcweir if ( aHintPos.Y() + aHintSize.Height() > aFrameWinSize.Height() ) 522*cdf0e10cSrcweir { 523*cdf0e10cSrcweir // zweiter Versuch: rechts vom Cursor 524*cdf0e10cSrcweir aHintPos = Point( aPos.X() + nSizeXPix + 3, aPos.Y() + nSizeYPix / 2 ); 525*cdf0e10cSrcweir if ( aHintPos.X() + aHintSize.Width() > aFrameWinSize.Width() ) 526*cdf0e10cSrcweir { 527*cdf0e10cSrcweir // dritter Versuch: ueber dem Cursor 528*cdf0e10cSrcweir aHintPos = Point( aPos.X() + nSizeXPix / 2, 529*cdf0e10cSrcweir aPos.Y() - aHintSize.Height() - 3 ); 530*cdf0e10cSrcweir if ( aHintPos.Y() < 0 ) 531*cdf0e10cSrcweir { 532*cdf0e10cSrcweir // oben und unten kein Platz - dann Default und abschneiden 533*cdf0e10cSrcweir aHintPos = Point( aPos.X() + nSizeXPix / 2, aPos.Y() + nSizeYPix + 3 ); 534*cdf0e10cSrcweir aHintSize.Height() = aFrameWinSize.Height() - aHintPos.Y(); 535*cdf0e10cSrcweir pInputHintWindow->SetSizePixel( aHintSize ); 536*cdf0e10cSrcweir } 537*cdf0e10cSrcweir } 538*cdf0e10cSrcweir } 539*cdf0e10cSrcweir 540*cdf0e10cSrcweir // X anpassen 541*cdf0e10cSrcweir if ( aHintPos.X() + aHintSize.Width() > aFrameWinSize.Width() ) 542*cdf0e10cSrcweir aHintPos.X() = aFrameWinSize.Width() - aHintSize.Width(); 543*cdf0e10cSrcweir // Y anpassen 544*cdf0e10cSrcweir if ( aHintPos.Y() + aHintSize.Height() > aFrameWinSize.Height() ) 545*cdf0e10cSrcweir aHintPos.Y() = aFrameWinSize.Height() - aHintSize.Height(); 546*cdf0e10cSrcweir 547*cdf0e10cSrcweir pInputHintWindow->SetPosPixel( aHintPos ); 548*cdf0e10cSrcweir pInputHintWindow->ToTop(); 549*cdf0e10cSrcweir pInputHintWindow->Show(); 550*cdf0e10cSrcweir } 551*cdf0e10cSrcweir } 552*cdf0e10cSrcweir else 553*cdf0e10cSrcweir DELETEZ(pInputHintWindow); 554*cdf0e10cSrcweir 555*cdf0e10cSrcweir // list drop-down button 556*cdf0e10cSrcweir if ( pData && pData->HasSelectionList() ) 557*cdf0e10cSrcweir { 558*cdf0e10cSrcweir aListValPos.Set( aViewData.GetCurX(), aViewData.GetCurY(), aViewData.GetTabNo() ); 559*cdf0e10cSrcweir bListValButton = sal_True; 560*cdf0e10cSrcweir } 561*cdf0e10cSrcweir } 562*cdf0e10cSrcweir else 563*cdf0e10cSrcweir DELETEZ(pInputHintWindow); 564*cdf0e10cSrcweir 565*cdf0e10cSrcweir for ( sal_uInt16 i=0; i<4; i++ ) 566*cdf0e10cSrcweir if ( pGridWin[i] && pGridWin[i]->IsVisible() ) 567*cdf0e10cSrcweir pGridWin[i]->UpdateListValPos( bListValButton, aListValPos ); 568*cdf0e10cSrcweir } 569*cdf0e10cSrcweir 570*cdf0e10cSrcweir void ScTabView::RemoveHintWindow() 571*cdf0e10cSrcweir { 572*cdf0e10cSrcweir DELETEZ(pInputHintWindow); 573*cdf0e10cSrcweir } 574*cdf0e10cSrcweir 575*cdf0e10cSrcweir 576*cdf0e10cSrcweir // find window that should not be over the cursor 577*cdf0e10cSrcweir Window* lcl_GetCareWin(SfxViewFrame* pViewFrm) 578*cdf0e10cSrcweir { 579*cdf0e10cSrcweir //! auch Spelling ??? (dann beim Aufruf Membervariable setzen) 580*cdf0e10cSrcweir 581*cdf0e10cSrcweir // Suchen & Ersetzen 582*cdf0e10cSrcweir if ( pViewFrm->HasChildWindow(SID_SEARCH_DLG) ) 583*cdf0e10cSrcweir { 584*cdf0e10cSrcweir SfxChildWindow* pChild = pViewFrm->GetChildWindow(SID_SEARCH_DLG); 585*cdf0e10cSrcweir if (pChild) 586*cdf0e10cSrcweir { 587*cdf0e10cSrcweir Window* pWin = pChild->GetWindow(); 588*cdf0e10cSrcweir if (pWin && pWin->IsVisible()) 589*cdf0e10cSrcweir return pWin; 590*cdf0e10cSrcweir } 591*cdf0e10cSrcweir } 592*cdf0e10cSrcweir 593*cdf0e10cSrcweir // Aenderungen uebernehmen 594*cdf0e10cSrcweir if ( pViewFrm->HasChildWindow(FID_CHG_ACCEPT) ) 595*cdf0e10cSrcweir { 596*cdf0e10cSrcweir SfxChildWindow* pChild = pViewFrm->GetChildWindow(FID_CHG_ACCEPT); 597*cdf0e10cSrcweir if (pChild) 598*cdf0e10cSrcweir { 599*cdf0e10cSrcweir Window* pWin = pChild->GetWindow(); 600*cdf0e10cSrcweir if (pWin && pWin->IsVisible()) 601*cdf0e10cSrcweir return pWin; 602*cdf0e10cSrcweir } 603*cdf0e10cSrcweir } 604*cdf0e10cSrcweir 605*cdf0e10cSrcweir return NULL; 606*cdf0e10cSrcweir } 607*cdf0e10cSrcweir 608*cdf0e10cSrcweir // 609*cdf0e10cSrcweir // Bildschirm an Cursorposition anpassen 610*cdf0e10cSrcweir // 611*cdf0e10cSrcweir 612*cdf0e10cSrcweir void ScTabView::AlignToCursor( SCsCOL nCurX, SCsROW nCurY, ScFollowMode eMode, 613*cdf0e10cSrcweir const ScSplitPos* pWhich ) 614*cdf0e10cSrcweir { 615*cdf0e10cSrcweir // 616*cdf0e10cSrcweir // aktiven Teil umschalten jetzt hier 617*cdf0e10cSrcweir // 618*cdf0e10cSrcweir 619*cdf0e10cSrcweir ScSplitPos eActive = aViewData.GetActivePart(); 620*cdf0e10cSrcweir ScHSplitPos eActiveX = WhichH(eActive); 621*cdf0e10cSrcweir ScVSplitPos eActiveY = WhichV(eActive); 622*cdf0e10cSrcweir sal_Bool bHFix = (aViewData.GetHSplitMode() == SC_SPLIT_FIX); 623*cdf0e10cSrcweir sal_Bool bVFix = (aViewData.GetVSplitMode() == SC_SPLIT_FIX); 624*cdf0e10cSrcweir if (bHFix) 625*cdf0e10cSrcweir if (eActiveX == SC_SPLIT_LEFT && nCurX >= (SCsCOL)aViewData.GetFixPosX()) 626*cdf0e10cSrcweir { 627*cdf0e10cSrcweir ActivatePart( (eActiveY==SC_SPLIT_TOP) ? SC_SPLIT_TOPRIGHT : SC_SPLIT_BOTTOMRIGHT ); 628*cdf0e10cSrcweir eActiveX = SC_SPLIT_RIGHT; 629*cdf0e10cSrcweir } 630*cdf0e10cSrcweir if (bVFix) 631*cdf0e10cSrcweir if (eActiveY == SC_SPLIT_TOP && nCurY >= (SCsROW)aViewData.GetFixPosY()) 632*cdf0e10cSrcweir { 633*cdf0e10cSrcweir ActivatePart( (eActiveX==SC_SPLIT_LEFT) ? SC_SPLIT_BOTTOMLEFT : SC_SPLIT_BOTTOMRIGHT ); 634*cdf0e10cSrcweir eActiveY = SC_SPLIT_BOTTOM; 635*cdf0e10cSrcweir } 636*cdf0e10cSrcweir 637*cdf0e10cSrcweir // 638*cdf0e10cSrcweir // eigentliches Align 639*cdf0e10cSrcweir // 640*cdf0e10cSrcweir 641*cdf0e10cSrcweir if ( eMode != SC_FOLLOW_NONE ) 642*cdf0e10cSrcweir { 643*cdf0e10cSrcweir ScSplitPos eAlign; 644*cdf0e10cSrcweir if (pWhich) 645*cdf0e10cSrcweir eAlign = *pWhich; 646*cdf0e10cSrcweir else 647*cdf0e10cSrcweir eAlign = aViewData.GetActivePart(); 648*cdf0e10cSrcweir ScHSplitPos eAlignX = WhichH(eAlign); 649*cdf0e10cSrcweir ScVSplitPos eAlignY = WhichV(eAlign); 650*cdf0e10cSrcweir 651*cdf0e10cSrcweir SCsCOL nDeltaX = (SCsCOL) aViewData.GetPosX(eAlignX); 652*cdf0e10cSrcweir SCsROW nDeltaY = (SCsROW) aViewData.GetPosY(eAlignY); 653*cdf0e10cSrcweir SCsCOL nSizeX = (SCsCOL) aViewData.VisibleCellsX(eAlignX); 654*cdf0e10cSrcweir SCsROW nSizeY = (SCsROW) aViewData.VisibleCellsY(eAlignY); 655*cdf0e10cSrcweir 656*cdf0e10cSrcweir long nCellSizeX; 657*cdf0e10cSrcweir long nCellSizeY; 658*cdf0e10cSrcweir if ( nCurX >= 0 && nCurY >= 0 ) 659*cdf0e10cSrcweir aViewData.GetMergeSizePixel( (SCCOL)nCurX, (SCROW)nCurY, nCellSizeX, nCellSizeY ); 660*cdf0e10cSrcweir else 661*cdf0e10cSrcweir nCellSizeX = nCellSizeY = 0; 662*cdf0e10cSrcweir Size aScrSize = aViewData.GetScrSize(); 663*cdf0e10cSrcweir long nSpaceX = ( aScrSize.Width() - nCellSizeX ) / 2; 664*cdf0e10cSrcweir long nSpaceY = ( aScrSize.Height() - nCellSizeY ) / 2; 665*cdf0e10cSrcweir // nSpaceY: desired start position of cell for FOLLOW_JUMP, modified if dialog interferes 666*cdf0e10cSrcweir 667*cdf0e10cSrcweir sal_Bool bForceNew = sal_False; // force new calculation of JUMP position (vertical only) 668*cdf0e10cSrcweir 669*cdf0e10cSrcweir // VisibleCellsY == CellsAtY( GetPosY( eWhichY ), 1, eWhichY ) 670*cdf0e10cSrcweir 671*cdf0e10cSrcweir //------------------------------------------------------------------------------- 672*cdf0e10cSrcweir // falls z.B. Suchen-Dialog offen ist, Cursor nicht hinter den Dialog stellen 673*cdf0e10cSrcweir // wenn moeglich, die Zeile mit dem Cursor oberhalb oder unterhalb des Dialogs 674*cdf0e10cSrcweir 675*cdf0e10cSrcweir //! nicht, wenn schon komplett sichtbar 676*cdf0e10cSrcweir 677*cdf0e10cSrcweir if ( eMode == SC_FOLLOW_JUMP ) 678*cdf0e10cSrcweir { 679*cdf0e10cSrcweir Window* pCare = lcl_GetCareWin( aViewData.GetViewShell()->GetViewFrame() ); 680*cdf0e10cSrcweir if (pCare) 681*cdf0e10cSrcweir { 682*cdf0e10cSrcweir sal_Bool bLimit = sal_False; 683*cdf0e10cSrcweir Rectangle aDlgPixel; 684*cdf0e10cSrcweir Size aWinSize; 685*cdf0e10cSrcweir Window* pWin = GetActiveWin(); 686*cdf0e10cSrcweir if (pWin) 687*cdf0e10cSrcweir { 688*cdf0e10cSrcweir aDlgPixel = pCare->GetWindowExtentsRelative( pWin ); 689*cdf0e10cSrcweir aWinSize = pWin->GetOutputSizePixel(); 690*cdf0e10cSrcweir // ueberdeckt der Dialog das GridWin? 691*cdf0e10cSrcweir if ( aDlgPixel.Right() >= 0 && aDlgPixel.Left() < aWinSize.Width() ) 692*cdf0e10cSrcweir { 693*cdf0e10cSrcweir if ( nCurX < nDeltaX || nCurX >= nDeltaX+nSizeX || 694*cdf0e10cSrcweir nCurY < nDeltaY || nCurY >= nDeltaY+nSizeY ) 695*cdf0e10cSrcweir bLimit = sal_True; // es wird sowieso gescrollt 696*cdf0e10cSrcweir else 697*cdf0e10cSrcweir { 698*cdf0e10cSrcweir // Cursor ist auf dem Bildschirm 699*cdf0e10cSrcweir Point aStart = aViewData.GetScrPos( nCurX, nCurY, eAlign ); 700*cdf0e10cSrcweir long nCSX, nCSY; 701*cdf0e10cSrcweir aViewData.GetMergeSizePixel( nCurX, nCurY, nCSX, nCSY ); 702*cdf0e10cSrcweir Rectangle aCursor( aStart, Size( nCSX, nCSY ) ); 703*cdf0e10cSrcweir if ( aCursor.IsOver( aDlgPixel ) ) 704*cdf0e10cSrcweir bLimit = sal_True; // Zelle vom Dialog ueberdeckt 705*cdf0e10cSrcweir } 706*cdf0e10cSrcweir } 707*cdf0e10cSrcweir } 708*cdf0e10cSrcweir 709*cdf0e10cSrcweir if (bLimit) 710*cdf0e10cSrcweir { 711*cdf0e10cSrcweir sal_Bool bBottom = sal_False; 712*cdf0e10cSrcweir long nTopSpace = aDlgPixel.Top(); 713*cdf0e10cSrcweir long nBotSpace = aWinSize.Height() - aDlgPixel.Bottom(); 714*cdf0e10cSrcweir if ( nBotSpace > 0 && nBotSpace > nTopSpace ) 715*cdf0e10cSrcweir { 716*cdf0e10cSrcweir long nDlgBot = aDlgPixel.Bottom(); 717*cdf0e10cSrcweir SCsCOL nWPosX; 718*cdf0e10cSrcweir SCsROW nWPosY; 719*cdf0e10cSrcweir aViewData.GetPosFromPixel( 0,nDlgBot, eAlign, nWPosX, nWPosY ); 720*cdf0e10cSrcweir ++nWPosY; // unter der letzten betroffenen Zelle 721*cdf0e10cSrcweir 722*cdf0e10cSrcweir SCsROW nDiff = nWPosY - nDeltaY; 723*cdf0e10cSrcweir if ( nCurY >= nDiff ) // Pos. kann nicht negativ werden 724*cdf0e10cSrcweir { 725*cdf0e10cSrcweir nSpaceY = nDlgBot + ( nBotSpace - nCellSizeY ) / 2; 726*cdf0e10cSrcweir bBottom = sal_True; 727*cdf0e10cSrcweir bForceNew = sal_True; 728*cdf0e10cSrcweir } 729*cdf0e10cSrcweir } 730*cdf0e10cSrcweir if ( !bBottom && nTopSpace > 0 ) 731*cdf0e10cSrcweir { 732*cdf0e10cSrcweir nSpaceY = ( nTopSpace - nCellSizeY ) / 2; 733*cdf0e10cSrcweir bForceNew = sal_True; 734*cdf0e10cSrcweir } 735*cdf0e10cSrcweir } 736*cdf0e10cSrcweir } 737*cdf0e10cSrcweir } 738*cdf0e10cSrcweir //------------------------------------------------------------------------------- 739*cdf0e10cSrcweir 740*cdf0e10cSrcweir SCsCOL nNewDeltaX = nDeltaX; 741*cdf0e10cSrcweir SCsROW nNewDeltaY = nDeltaY; 742*cdf0e10cSrcweir sal_Bool bDoLine = sal_False; 743*cdf0e10cSrcweir 744*cdf0e10cSrcweir switch (eMode) 745*cdf0e10cSrcweir { 746*cdf0e10cSrcweir case SC_FOLLOW_JUMP: 747*cdf0e10cSrcweir if ( nCurX < nDeltaX || nCurX >= nDeltaX+nSizeX ) 748*cdf0e10cSrcweir { 749*cdf0e10cSrcweir nNewDeltaX = nCurX - static_cast<SCsCOL>(aViewData.CellsAtX( nCurX, -1, eAlignX, static_cast<sal_uInt16>(nSpaceX) )); 750*cdf0e10cSrcweir if (nNewDeltaX < 0) nNewDeltaX = 0; 751*cdf0e10cSrcweir nSizeX = (SCsCOL) aViewData.CellsAtX( nNewDeltaX, 1, eAlignX ); 752*cdf0e10cSrcweir } 753*cdf0e10cSrcweir if ( nCurY < nDeltaY || nCurY >= nDeltaY+nSizeY || bForceNew ) 754*cdf0e10cSrcweir { 755*cdf0e10cSrcweir nNewDeltaY = nCurY - static_cast<SCsROW>(aViewData.CellsAtY( nCurY, -1, eAlignY, static_cast<sal_uInt16>(nSpaceY) )); 756*cdf0e10cSrcweir if (nNewDeltaY < 0) nNewDeltaY = 0; 757*cdf0e10cSrcweir nSizeY = (SCsROW) aViewData.CellsAtY( nNewDeltaY, 1, eAlignY ); 758*cdf0e10cSrcweir } 759*cdf0e10cSrcweir bDoLine = sal_True; 760*cdf0e10cSrcweir break; 761*cdf0e10cSrcweir 762*cdf0e10cSrcweir case SC_FOLLOW_LINE: 763*cdf0e10cSrcweir bDoLine = sal_True; 764*cdf0e10cSrcweir break; 765*cdf0e10cSrcweir 766*cdf0e10cSrcweir case SC_FOLLOW_FIX: 767*cdf0e10cSrcweir if ( nCurX < nDeltaX || nCurX >= nDeltaX+nSizeX ) 768*cdf0e10cSrcweir { 769*cdf0e10cSrcweir nNewDeltaX = nDeltaX + nCurX - aViewData.GetCurX(); 770*cdf0e10cSrcweir if (nNewDeltaX < 0) nNewDeltaX = 0; 771*cdf0e10cSrcweir nSizeX = (SCsCOL) aViewData.CellsAtX( nNewDeltaX, 1, eAlignX ); 772*cdf0e10cSrcweir } 773*cdf0e10cSrcweir if ( nCurY < nDeltaY || nCurY >= nDeltaY+nSizeY ) 774*cdf0e10cSrcweir { 775*cdf0e10cSrcweir nNewDeltaY = nDeltaY + nCurY - aViewData.GetCurY(); 776*cdf0e10cSrcweir if (nNewDeltaY < 0) nNewDeltaY = 0; 777*cdf0e10cSrcweir nSizeY = (SCsROW) aViewData.CellsAtY( nNewDeltaY, 1, eAlignY ); 778*cdf0e10cSrcweir } 779*cdf0e10cSrcweir 780*cdf0e10cSrcweir // like old version of SC_FOLLOW_JUMP: 781*cdf0e10cSrcweir 782*cdf0e10cSrcweir if ( nCurX < nNewDeltaX || nCurX >= nNewDeltaX+nSizeX ) 783*cdf0e10cSrcweir { 784*cdf0e10cSrcweir nNewDeltaX = nCurX - (nSizeX / 2); 785*cdf0e10cSrcweir if (nNewDeltaX < 0) nNewDeltaX = 0; 786*cdf0e10cSrcweir nSizeX = (SCsCOL) aViewData.CellsAtX( nNewDeltaX, 1, eAlignX ); 787*cdf0e10cSrcweir } 788*cdf0e10cSrcweir if ( nCurY < nNewDeltaY || nCurY >= nNewDeltaY+nSizeY ) 789*cdf0e10cSrcweir { 790*cdf0e10cSrcweir nNewDeltaY = nCurY - (nSizeY / 2); 791*cdf0e10cSrcweir if (nNewDeltaY < 0) nNewDeltaY = 0; 792*cdf0e10cSrcweir nSizeY = (SCsROW) aViewData.CellsAtY( nNewDeltaY, 1, eAlignY ); 793*cdf0e10cSrcweir } 794*cdf0e10cSrcweir 795*cdf0e10cSrcweir bDoLine = sal_True; 796*cdf0e10cSrcweir break; 797*cdf0e10cSrcweir 798*cdf0e10cSrcweir case SC_FOLLOW_NONE: 799*cdf0e10cSrcweir break; 800*cdf0e10cSrcweir default: 801*cdf0e10cSrcweir DBG_ERROR("Falscher Cursormodus"); 802*cdf0e10cSrcweir break; 803*cdf0e10cSrcweir } 804*cdf0e10cSrcweir 805*cdf0e10cSrcweir if (bDoLine) 806*cdf0e10cSrcweir { 807*cdf0e10cSrcweir while ( nCurX >= nNewDeltaX+nSizeX ) 808*cdf0e10cSrcweir { 809*cdf0e10cSrcweir nNewDeltaX = nCurX-nSizeX+1; 810*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 811*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 812*cdf0e10cSrcweir while ( nNewDeltaX < MAXCOL && !pDoc->GetColWidth( nNewDeltaX, nTab ) ) 813*cdf0e10cSrcweir ++nNewDeltaX; 814*cdf0e10cSrcweir nSizeX = (SCsCOL) aViewData.CellsAtX( nNewDeltaX, 1, eAlignX ); 815*cdf0e10cSrcweir } 816*cdf0e10cSrcweir while ( nCurY >= nNewDeltaY+nSizeY ) 817*cdf0e10cSrcweir { 818*cdf0e10cSrcweir nNewDeltaY = nCurY-nSizeY+1; 819*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 820*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 821*cdf0e10cSrcweir while ( nNewDeltaY < MAXROW && !pDoc->GetRowHeight( nNewDeltaY, nTab ) ) 822*cdf0e10cSrcweir ++nNewDeltaY; 823*cdf0e10cSrcweir nSizeY = (SCsROW) aViewData.CellsAtY( nNewDeltaY, 1, eAlignY ); 824*cdf0e10cSrcweir } 825*cdf0e10cSrcweir if ( nCurX < nNewDeltaX ) nNewDeltaX = nCurX; 826*cdf0e10cSrcweir if ( nCurY < nNewDeltaY ) nNewDeltaY = nCurY; 827*cdf0e10cSrcweir } 828*cdf0e10cSrcweir 829*cdf0e10cSrcweir if ( nNewDeltaX != nDeltaX ) 830*cdf0e10cSrcweir nSizeX = (SCsCOL) aViewData.CellsAtX( nNewDeltaX, 1, eAlignX ); 831*cdf0e10cSrcweir if (nNewDeltaX+nSizeX-1 > MAXCOL) nNewDeltaX = MAXCOL-nSizeX+1; 832*cdf0e10cSrcweir if (nNewDeltaX < 0) nNewDeltaX = 0; 833*cdf0e10cSrcweir 834*cdf0e10cSrcweir if ( nNewDeltaY != nDeltaY ) 835*cdf0e10cSrcweir nSizeY = (SCsROW) aViewData.CellsAtY( nNewDeltaY, 1, eAlignY ); 836*cdf0e10cSrcweir if (nNewDeltaY+nSizeY-1 > MAXROW) nNewDeltaY = MAXROW-nSizeY+1; 837*cdf0e10cSrcweir if (nNewDeltaY < 0) nNewDeltaY = 0; 838*cdf0e10cSrcweir 839*cdf0e10cSrcweir if ( nNewDeltaX != nDeltaX ) ScrollX( nNewDeltaX - nDeltaX, eAlignX ); 840*cdf0e10cSrcweir if ( nNewDeltaY != nDeltaY ) ScrollY( nNewDeltaY - nDeltaY, eAlignY ); 841*cdf0e10cSrcweir } 842*cdf0e10cSrcweir 843*cdf0e10cSrcweir // 844*cdf0e10cSrcweir // nochmal aktiven Teil umschalten 845*cdf0e10cSrcweir // 846*cdf0e10cSrcweir 847*cdf0e10cSrcweir if (bHFix) 848*cdf0e10cSrcweir if (eActiveX == SC_SPLIT_RIGHT && nCurX < (SCsCOL)aViewData.GetFixPosX()) 849*cdf0e10cSrcweir { 850*cdf0e10cSrcweir ActivatePart( (eActiveY==SC_SPLIT_TOP) ? SC_SPLIT_TOPLEFT : SC_SPLIT_BOTTOMLEFT ); 851*cdf0e10cSrcweir eActiveX = SC_SPLIT_LEFT; 852*cdf0e10cSrcweir } 853*cdf0e10cSrcweir if (bVFix) 854*cdf0e10cSrcweir if (eActiveY == SC_SPLIT_BOTTOM && nCurY < (SCsROW)aViewData.GetFixPosY()) 855*cdf0e10cSrcweir { 856*cdf0e10cSrcweir ActivatePart( (eActiveX==SC_SPLIT_LEFT) ? SC_SPLIT_TOPLEFT : SC_SPLIT_TOPRIGHT ); 857*cdf0e10cSrcweir eActiveY = SC_SPLIT_TOP; 858*cdf0e10cSrcweir } 859*cdf0e10cSrcweir } 860*cdf0e10cSrcweir 861*cdf0e10cSrcweir sal_Bool ScTabView::SelMouseButtonDown( const MouseEvent& rMEvt ) 862*cdf0e10cSrcweir { 863*cdf0e10cSrcweir sal_Bool bRet = sal_False; 864*cdf0e10cSrcweir 865*cdf0e10cSrcweir // #i3875# *Hack* 866*cdf0e10cSrcweir sal_Bool bMod1Locked = aViewData.GetViewShell()->GetLockedModifiers() & KEY_MOD1 ? sal_True : sal_False; 867*cdf0e10cSrcweir aViewData.SetSelCtrlMouseClick( rMEvt.IsMod1() || bMod1Locked ); 868*cdf0e10cSrcweir 869*cdf0e10cSrcweir if ( pSelEngine ) 870*cdf0e10cSrcweir { 871*cdf0e10cSrcweir bMoveIsShift = rMEvt.IsShift(); 872*cdf0e10cSrcweir bRet = pSelEngine->SelMouseButtonDown( rMEvt ); 873*cdf0e10cSrcweir bMoveIsShift = sal_False; 874*cdf0e10cSrcweir } 875*cdf0e10cSrcweir 876*cdf0e10cSrcweir aViewData.SetSelCtrlMouseClick( sal_False ); // #i3875# *Hack* 877*cdf0e10cSrcweir 878*cdf0e10cSrcweir return bRet; 879*cdf0e10cSrcweir } 880*cdf0e10cSrcweir 881*cdf0e10cSrcweir // 882*cdf0e10cSrcweir // MoveCursor - mit Anpassung des Bildausschnitts 883*cdf0e10cSrcweir // 884*cdf0e10cSrcweir 885*cdf0e10cSrcweir void ScTabView::MoveCursorAbs( SCsCOL nCurX, SCsROW nCurY, ScFollowMode eMode, 886*cdf0e10cSrcweir sal_Bool bShift, sal_Bool bControl, sal_Bool bKeepOld, sal_Bool bKeepSel ) 887*cdf0e10cSrcweir { 888*cdf0e10cSrcweir if (!bKeepOld) 889*cdf0e10cSrcweir aViewData.ResetOldCursor(); 890*cdf0e10cSrcweir 891*cdf0e10cSrcweir if (nCurX < 0) nCurX = 0; 892*cdf0e10cSrcweir if (nCurY < 0) nCurY = 0; 893*cdf0e10cSrcweir if (nCurX > MAXCOL) nCurX = MAXCOL; 894*cdf0e10cSrcweir if (nCurY > MAXROW) nCurY = MAXROW; 895*cdf0e10cSrcweir 896*cdf0e10cSrcweir HideAllCursors(); 897*cdf0e10cSrcweir 898*cdf0e10cSrcweir if ( bShift && bNewStartIfMarking && IsBlockMode() ) 899*cdf0e10cSrcweir { 900*cdf0e10cSrcweir // used for ADD selection mode: start a new block from the cursor position 901*cdf0e10cSrcweir DoneBlockMode( sal_True ); 902*cdf0e10cSrcweir InitBlockMode( aViewData.GetCurX(), aViewData.GetCurY(), aViewData.GetTabNo(), sal_True ); 903*cdf0e10cSrcweir } 904*cdf0e10cSrcweir 905*cdf0e10cSrcweir // aktiven Teil umschalten jetzt in AlignToCursor 906*cdf0e10cSrcweir 907*cdf0e10cSrcweir AlignToCursor( nCurX, nCurY, eMode ); 908*cdf0e10cSrcweir //! auf OS/2: SC_FOLLOW_JUMP statt SC_FOLLOW_LINE, um Nachlaufen zu verhindern ??? 909*cdf0e10cSrcweir 910*cdf0e10cSrcweir if (bKeepSel) 911*cdf0e10cSrcweir SetCursor( nCurX, nCurY ); // Markierung stehenlassen 912*cdf0e10cSrcweir else 913*cdf0e10cSrcweir { 914*cdf0e10cSrcweir sal_Bool bSame = ( nCurX == aViewData.GetCurX() && nCurY == aViewData.GetCurY() ); 915*cdf0e10cSrcweir bMoveIsShift = bShift; 916*cdf0e10cSrcweir pSelEngine->CursorPosChanging( bShift, bControl ); 917*cdf0e10cSrcweir bMoveIsShift = sal_False; 918*cdf0e10cSrcweir aFunctionSet.SetCursorAtCell( nCurX, nCurY, sal_False ); 919*cdf0e10cSrcweir 920*cdf0e10cSrcweir // Wenn der Cursor nicht bewegt wurde, muss das SelectionChanged fuer das 921*cdf0e10cSrcweir // Aufheben der Selektion hier einzeln passieren: 922*cdf0e10cSrcweir if (bSame) 923*cdf0e10cSrcweir SelectionChanged(); 924*cdf0e10cSrcweir } 925*cdf0e10cSrcweir 926*cdf0e10cSrcweir ShowAllCursors(); 927*cdf0e10cSrcweir } 928*cdf0e10cSrcweir 929*cdf0e10cSrcweir void ScTabView::MoveCursorRel( SCsCOL nMovX, SCsROW nMovY, ScFollowMode eMode, 930*cdf0e10cSrcweir sal_Bool bShift, sal_Bool bKeepSel ) 931*cdf0e10cSrcweir { 932*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 933*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 934*cdf0e10cSrcweir 935*cdf0e10cSrcweir bool bSkipProtected = false, bSkipUnprotected = false; 936*cdf0e10cSrcweir ScTableProtection* pProtect = pDoc->GetTabProtection(nTab); 937*cdf0e10cSrcweir if ( pProtect && pProtect->isProtected() ) 938*cdf0e10cSrcweir { 939*cdf0e10cSrcweir bSkipProtected = !pProtect->isOptionEnabled(ScTableProtection::SELECT_LOCKED_CELLS); 940*cdf0e10cSrcweir bSkipUnprotected = !pProtect->isOptionEnabled(ScTableProtection::SELECT_UNLOCKED_CELLS); 941*cdf0e10cSrcweir } 942*cdf0e10cSrcweir 943*cdf0e10cSrcweir if ( bSkipProtected && bSkipUnprotected ) 944*cdf0e10cSrcweir return; 945*cdf0e10cSrcweir 946*cdf0e10cSrcweir SCsCOL nOldX; 947*cdf0e10cSrcweir SCsROW nOldY; 948*cdf0e10cSrcweir SCsCOL nCurX; 949*cdf0e10cSrcweir SCsROW nCurY; 950*cdf0e10cSrcweir if ( aViewData.IsRefMode() ) 951*cdf0e10cSrcweir { 952*cdf0e10cSrcweir nOldX = (SCsCOL) aViewData.GetRefEndX(); 953*cdf0e10cSrcweir nOldY = (SCsROW) aViewData.GetRefEndY(); 954*cdf0e10cSrcweir nCurX = nOldX + nMovX; 955*cdf0e10cSrcweir nCurY = nOldY + nMovY; 956*cdf0e10cSrcweir } 957*cdf0e10cSrcweir else 958*cdf0e10cSrcweir { 959*cdf0e10cSrcweir nOldX = (SCsCOL) aViewData.GetCurX(); 960*cdf0e10cSrcweir nOldY = (SCsROW) aViewData.GetCurY(); 961*cdf0e10cSrcweir nCurX = (nMovX != 0) ? nOldX+nMovX : (SCsCOL) aViewData.GetOldCurX(); 962*cdf0e10cSrcweir nCurY = (nMovY != 0) ? nOldY+nMovY : (SCsROW) aViewData.GetOldCurY(); 963*cdf0e10cSrcweir } 964*cdf0e10cSrcweir 965*cdf0e10cSrcweir sal_Bool bSkipCell = sal_False; 966*cdf0e10cSrcweir aViewData.ResetOldCursor(); 967*cdf0e10cSrcweir 968*cdf0e10cSrcweir if (nMovX != 0 && VALIDCOLROW(nCurX,nCurY)) 969*cdf0e10cSrcweir { 970*cdf0e10cSrcweir sal_Bool bHFlip = sal_False; 971*cdf0e10cSrcweir do 972*cdf0e10cSrcweir { 973*cdf0e10cSrcweir SCCOL nLastCol = -1; 974*cdf0e10cSrcweir bSkipCell = pDoc->ColHidden(nCurX, nTab, nLastCol) || pDoc->IsHorOverlapped( nCurX, nCurY, nTab ); 975*cdf0e10cSrcweir if (bSkipProtected && !bSkipCell) 976*cdf0e10cSrcweir bSkipCell = pDoc->HasAttrib(nCurX, nCurY, nTab, nCurX, nCurY, nTab, HASATTR_PROTECTED); 977*cdf0e10cSrcweir if (bSkipUnprotected && !bSkipCell) 978*cdf0e10cSrcweir bSkipCell = !pDoc->HasAttrib(nCurX, nCurY, nTab, nCurX, nCurY, nTab, HASATTR_PROTECTED); 979*cdf0e10cSrcweir 980*cdf0e10cSrcweir if (bSkipCell) 981*cdf0e10cSrcweir { 982*cdf0e10cSrcweir if ( nCurX<=0 || nCurX>=MAXCOL ) 983*cdf0e10cSrcweir { 984*cdf0e10cSrcweir if (bHFlip) 985*cdf0e10cSrcweir { 986*cdf0e10cSrcweir nCurX = nOldX; 987*cdf0e10cSrcweir bSkipCell = sal_False; 988*cdf0e10cSrcweir } 989*cdf0e10cSrcweir else 990*cdf0e10cSrcweir { 991*cdf0e10cSrcweir nMovX = -nMovX; 992*cdf0e10cSrcweir if (nMovX > 0) ++nCurX; else --nCurX; // zuruecknehmen 993*cdf0e10cSrcweir bHFlip = sal_True; 994*cdf0e10cSrcweir } 995*cdf0e10cSrcweir } 996*cdf0e10cSrcweir else 997*cdf0e10cSrcweir if (nMovX > 0) ++nCurX; else --nCurX; 998*cdf0e10cSrcweir } 999*cdf0e10cSrcweir } 1000*cdf0e10cSrcweir while (bSkipCell); 1001*cdf0e10cSrcweir 1002*cdf0e10cSrcweir if (pDoc->IsVerOverlapped( nCurX, nCurY, nTab )) 1003*cdf0e10cSrcweir { 1004*cdf0e10cSrcweir aViewData.SetOldCursor( nCurX,nCurY ); 1005*cdf0e10cSrcweir while (pDoc->IsVerOverlapped( nCurX, nCurY, nTab )) 1006*cdf0e10cSrcweir --nCurY; 1007*cdf0e10cSrcweir } 1008*cdf0e10cSrcweir } 1009*cdf0e10cSrcweir 1010*cdf0e10cSrcweir if (nMovY != 0 && VALIDCOLROW(nCurX,nCurY)) 1011*cdf0e10cSrcweir { 1012*cdf0e10cSrcweir sal_Bool bVFlip = sal_False; 1013*cdf0e10cSrcweir do 1014*cdf0e10cSrcweir { 1015*cdf0e10cSrcweir SCROW nLastRow = -1; 1016*cdf0e10cSrcweir bSkipCell = pDoc->RowHidden(nCurY, nTab, nLastRow) || pDoc->IsVerOverlapped( nCurX, nCurY, nTab ); 1017*cdf0e10cSrcweir if (bSkipProtected && !bSkipCell) 1018*cdf0e10cSrcweir bSkipCell = pDoc->HasAttrib(nCurX, nCurY, nTab, nCurX, nCurY, nTab, HASATTR_PROTECTED); 1019*cdf0e10cSrcweir if (bSkipUnprotected && !bSkipCell) 1020*cdf0e10cSrcweir bSkipCell = !pDoc->HasAttrib(nCurX, nCurY, nTab, nCurX, nCurY, nTab, HASATTR_PROTECTED); 1021*cdf0e10cSrcweir 1022*cdf0e10cSrcweir if (bSkipCell) 1023*cdf0e10cSrcweir { 1024*cdf0e10cSrcweir if ( nCurY<=0 || nCurY>=MAXROW ) 1025*cdf0e10cSrcweir { 1026*cdf0e10cSrcweir if (bVFlip) 1027*cdf0e10cSrcweir { 1028*cdf0e10cSrcweir nCurY = nOldY; 1029*cdf0e10cSrcweir bSkipCell = sal_False; 1030*cdf0e10cSrcweir } 1031*cdf0e10cSrcweir else 1032*cdf0e10cSrcweir { 1033*cdf0e10cSrcweir nMovY = -nMovY; 1034*cdf0e10cSrcweir if (nMovY > 0) ++nCurY; else --nCurY; // zuruecknehmen 1035*cdf0e10cSrcweir bVFlip = sal_True; 1036*cdf0e10cSrcweir } 1037*cdf0e10cSrcweir } 1038*cdf0e10cSrcweir else 1039*cdf0e10cSrcweir if (nMovY > 0) ++nCurY; else --nCurY; 1040*cdf0e10cSrcweir } 1041*cdf0e10cSrcweir } 1042*cdf0e10cSrcweir while (bSkipCell); 1043*cdf0e10cSrcweir 1044*cdf0e10cSrcweir if (pDoc->IsHorOverlapped( nCurX, nCurY, nTab )) 1045*cdf0e10cSrcweir { 1046*cdf0e10cSrcweir aViewData.SetOldCursor( nCurX,nCurY ); 1047*cdf0e10cSrcweir while (pDoc->IsHorOverlapped( nCurX, nCurY, nTab )) 1048*cdf0e10cSrcweir --nCurX; 1049*cdf0e10cSrcweir } 1050*cdf0e10cSrcweir } 1051*cdf0e10cSrcweir 1052*cdf0e10cSrcweir MoveCursorAbs( nCurX, nCurY, eMode, bShift, sal_False, sal_True, bKeepSel ); 1053*cdf0e10cSrcweir } 1054*cdf0e10cSrcweir 1055*cdf0e10cSrcweir void ScTabView::MoveCursorPage( SCsCOL nMovX, SCsROW nMovY, ScFollowMode eMode, sal_Bool bShift, sal_Bool bKeepSel ) 1056*cdf0e10cSrcweir { 1057*cdf0e10cSrcweir SCCOL nCurX; 1058*cdf0e10cSrcweir SCROW nCurY; 1059*cdf0e10cSrcweir aViewData.GetMoveCursor( nCurX,nCurY ); 1060*cdf0e10cSrcweir 1061*cdf0e10cSrcweir ScSplitPos eWhich = aViewData.GetActivePart(); 1062*cdf0e10cSrcweir ScHSplitPos eWhichX = WhichH( eWhich ); 1063*cdf0e10cSrcweir ScVSplitPos eWhichY = WhichV( eWhich ); 1064*cdf0e10cSrcweir 1065*cdf0e10cSrcweir SCsCOL nPageX; 1066*cdf0e10cSrcweir SCsROW nPageY; 1067*cdf0e10cSrcweir if (nMovX >= 0) 1068*cdf0e10cSrcweir nPageX = ((SCsCOL) aViewData.CellsAtX( nCurX, 1, eWhichX )) * nMovX; 1069*cdf0e10cSrcweir else 1070*cdf0e10cSrcweir nPageX = ((SCsCOL) aViewData.CellsAtX( nCurX, -1, eWhichX )) * nMovX; 1071*cdf0e10cSrcweir 1072*cdf0e10cSrcweir if (nMovY >= 0) 1073*cdf0e10cSrcweir nPageY = ((SCsROW) aViewData.CellsAtY( nCurY, 1, eWhichY )) * nMovY; 1074*cdf0e10cSrcweir else 1075*cdf0e10cSrcweir nPageY = ((SCsROW) aViewData.CellsAtY( nCurY, -1, eWhichY )) * nMovY; 1076*cdf0e10cSrcweir 1077*cdf0e10cSrcweir if (nMovX != 0 && nPageX == 0) nPageX = (nMovX>0) ? 1 : -1; 1078*cdf0e10cSrcweir if (nMovY != 0 && nPageY == 0) nPageY = (nMovY>0) ? 1 : -1; 1079*cdf0e10cSrcweir 1080*cdf0e10cSrcweir MoveCursorRel( nPageX, nPageY, eMode, bShift, bKeepSel ); 1081*cdf0e10cSrcweir } 1082*cdf0e10cSrcweir 1083*cdf0e10cSrcweir void ScTabView::MoveCursorArea( SCsCOL nMovX, SCsROW nMovY, ScFollowMode eMode, sal_Bool bShift, sal_Bool bKeepSel ) 1084*cdf0e10cSrcweir { 1085*cdf0e10cSrcweir SCCOL nCurX; 1086*cdf0e10cSrcweir SCROW nCurY; 1087*cdf0e10cSrcweir aViewData.GetMoveCursor( nCurX,nCurY ); 1088*cdf0e10cSrcweir SCCOL nNewX = nCurX; 1089*cdf0e10cSrcweir SCROW nNewY = nCurY; 1090*cdf0e10cSrcweir 1091*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 1092*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 1093*cdf0e10cSrcweir 1094*cdf0e10cSrcweir // FindAreaPos kennt nur -1 oder 1 als Richtung 1095*cdf0e10cSrcweir 1096*cdf0e10cSrcweir SCsCOLROW i; 1097*cdf0e10cSrcweir if ( nMovX > 0 ) 1098*cdf0e10cSrcweir for ( i=0; i<nMovX; i++ ) 1099*cdf0e10cSrcweir pDoc->FindAreaPos( nNewX, nNewY, nTab, 1, 0 ); 1100*cdf0e10cSrcweir if ( nMovX < 0 ) 1101*cdf0e10cSrcweir for ( i=0; i<-nMovX; i++ ) 1102*cdf0e10cSrcweir pDoc->FindAreaPos( nNewX, nNewY, nTab, -1, 0 ); 1103*cdf0e10cSrcweir if ( nMovY > 0 ) 1104*cdf0e10cSrcweir for ( i=0; i<nMovY; i++ ) 1105*cdf0e10cSrcweir pDoc->FindAreaPos( nNewX, nNewY, nTab, 0, 1 ); 1106*cdf0e10cSrcweir if ( nMovY < 0 ) 1107*cdf0e10cSrcweir for ( i=0; i<-nMovY; i++ ) 1108*cdf0e10cSrcweir pDoc->FindAreaPos( nNewX, nNewY, nTab, 0, -1 ); 1109*cdf0e10cSrcweir 1110*cdf0e10cSrcweir if (eMode==SC_FOLLOW_JUMP) // unten/rechts nicht zuviel grau anzeigen 1111*cdf0e10cSrcweir { 1112*cdf0e10cSrcweir if (nMovX != 0 && nNewX == MAXCOL) 1113*cdf0e10cSrcweir eMode = SC_FOLLOW_LINE; 1114*cdf0e10cSrcweir if (nMovY != 0 && nNewY == MAXROW) 1115*cdf0e10cSrcweir eMode = SC_FOLLOW_LINE; 1116*cdf0e10cSrcweir } 1117*cdf0e10cSrcweir 1118*cdf0e10cSrcweir MoveCursorRel( ((SCsCOL)nNewX)-(SCsCOL)nCurX, ((SCsROW)nNewY)-(SCsROW)nCurY, eMode, bShift, bKeepSel ); 1119*cdf0e10cSrcweir } 1120*cdf0e10cSrcweir 1121*cdf0e10cSrcweir void ScTabView::MoveCursorEnd( SCsCOL nMovX, SCsROW nMovY, ScFollowMode eMode, sal_Bool bShift, sal_Bool bKeepSel ) 1122*cdf0e10cSrcweir { 1123*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 1124*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 1125*cdf0e10cSrcweir 1126*cdf0e10cSrcweir SCCOL nCurX; 1127*cdf0e10cSrcweir SCROW nCurY; 1128*cdf0e10cSrcweir aViewData.GetMoveCursor( nCurX,nCurY ); 1129*cdf0e10cSrcweir SCCOL nNewX = nCurX; 1130*cdf0e10cSrcweir SCROW nNewY = nCurY; 1131*cdf0e10cSrcweir 1132*cdf0e10cSrcweir SCCOL nUsedX = 0; 1133*cdf0e10cSrcweir SCROW nUsedY = 0; 1134*cdf0e10cSrcweir if ( nMovX > 0 || nMovY > 0 ) 1135*cdf0e10cSrcweir pDoc->GetPrintArea( nTab, nUsedX, nUsedY ); // Ende holen 1136*cdf0e10cSrcweir 1137*cdf0e10cSrcweir if (nMovX<0) 1138*cdf0e10cSrcweir nNewX=0; 1139*cdf0e10cSrcweir else if (nMovX>0) 1140*cdf0e10cSrcweir nNewX=nUsedX; // letzter benutzter Bereich 1141*cdf0e10cSrcweir 1142*cdf0e10cSrcweir if (nMovY<0) 1143*cdf0e10cSrcweir nNewY=0; 1144*cdf0e10cSrcweir else if (nMovY>0) 1145*cdf0e10cSrcweir nNewY=nUsedY; 1146*cdf0e10cSrcweir 1147*cdf0e10cSrcweir aViewData.ResetOldCursor(); 1148*cdf0e10cSrcweir MoveCursorRel( ((SCsCOL)nNewX)-(SCsCOL)nCurX, ((SCsROW)nNewY)-(SCsROW)nCurY, eMode, bShift, bKeepSel ); 1149*cdf0e10cSrcweir } 1150*cdf0e10cSrcweir 1151*cdf0e10cSrcweir void ScTabView::MoveCursorScreen( SCsCOL nMovX, SCsROW nMovY, ScFollowMode eMode, sal_Bool bShift ) 1152*cdf0e10cSrcweir { 1153*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 1154*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 1155*cdf0e10cSrcweir 1156*cdf0e10cSrcweir SCCOL nCurX; 1157*cdf0e10cSrcweir SCROW nCurY; 1158*cdf0e10cSrcweir aViewData.GetMoveCursor( nCurX,nCurY ); 1159*cdf0e10cSrcweir SCCOL nNewX = nCurX; 1160*cdf0e10cSrcweir SCROW nNewY = nCurY; 1161*cdf0e10cSrcweir 1162*cdf0e10cSrcweir ScSplitPos eWhich = aViewData.GetActivePart(); 1163*cdf0e10cSrcweir SCCOL nPosX = aViewData.GetPosX( WhichH(eWhich) ); 1164*cdf0e10cSrcweir SCROW nPosY = aViewData.GetPosY( WhichV(eWhich) ); 1165*cdf0e10cSrcweir 1166*cdf0e10cSrcweir SCCOL nAddX = aViewData.VisibleCellsX( WhichH(eWhich) ); 1167*cdf0e10cSrcweir if (nAddX != 0) 1168*cdf0e10cSrcweir --nAddX; 1169*cdf0e10cSrcweir SCROW nAddY = aViewData.VisibleCellsY( WhichV(eWhich) ); 1170*cdf0e10cSrcweir if (nAddY != 0) 1171*cdf0e10cSrcweir --nAddY; 1172*cdf0e10cSrcweir 1173*cdf0e10cSrcweir if (nMovX<0) 1174*cdf0e10cSrcweir nNewX=nPosX; 1175*cdf0e10cSrcweir else if (nMovX>0) 1176*cdf0e10cSrcweir nNewX=nPosX+nAddX; 1177*cdf0e10cSrcweir 1178*cdf0e10cSrcweir if (nMovY<0) 1179*cdf0e10cSrcweir nNewY=nPosY; 1180*cdf0e10cSrcweir else if (nMovY>0) 1181*cdf0e10cSrcweir nNewY=nPosY+nAddY; 1182*cdf0e10cSrcweir 1183*cdf0e10cSrcweir // aViewData.ResetOldCursor(); 1184*cdf0e10cSrcweir aViewData.SetOldCursor( nNewX,nNewY ); 1185*cdf0e10cSrcweir 1186*cdf0e10cSrcweir while (pDoc->IsHorOverlapped( nNewX, nNewY, nTab )) 1187*cdf0e10cSrcweir --nNewX; 1188*cdf0e10cSrcweir while (pDoc->IsVerOverlapped( nNewX, nNewY, nTab )) 1189*cdf0e10cSrcweir --nNewY; 1190*cdf0e10cSrcweir 1191*cdf0e10cSrcweir MoveCursorAbs( nNewX, nNewY, eMode, bShift, sal_False, sal_True ); 1192*cdf0e10cSrcweir } 1193*cdf0e10cSrcweir 1194*cdf0e10cSrcweir void ScTabView::MoveCursorEnter( sal_Bool bShift ) // bShift -> hoch/runter 1195*cdf0e10cSrcweir { 1196*cdf0e10cSrcweir const ScInputOptions& rOpt = SC_MOD()->GetInputOptions(); 1197*cdf0e10cSrcweir if (!rOpt.GetMoveSelection()) 1198*cdf0e10cSrcweir { 1199*cdf0e10cSrcweir aViewData.UpdateInputHandler(sal_True); 1200*cdf0e10cSrcweir return; 1201*cdf0e10cSrcweir } 1202*cdf0e10cSrcweir 1203*cdf0e10cSrcweir SCsCOL nMoveX = 0; 1204*cdf0e10cSrcweir SCsROW nMoveY = 0; 1205*cdf0e10cSrcweir switch ((ScDirection)rOpt.GetMoveDir()) 1206*cdf0e10cSrcweir { 1207*cdf0e10cSrcweir case DIR_BOTTOM: 1208*cdf0e10cSrcweir nMoveY = bShift ? -1 : 1; 1209*cdf0e10cSrcweir break; 1210*cdf0e10cSrcweir case DIR_RIGHT: 1211*cdf0e10cSrcweir nMoveX = bShift ? -1 : 1; 1212*cdf0e10cSrcweir break; 1213*cdf0e10cSrcweir case DIR_TOP: 1214*cdf0e10cSrcweir nMoveY = bShift ? 1 : -1; 1215*cdf0e10cSrcweir break; 1216*cdf0e10cSrcweir case DIR_LEFT: 1217*cdf0e10cSrcweir nMoveX = bShift ? 1 : -1; 1218*cdf0e10cSrcweir break; 1219*cdf0e10cSrcweir } 1220*cdf0e10cSrcweir 1221*cdf0e10cSrcweir ScMarkData& rMark = aViewData.GetMarkData(); 1222*cdf0e10cSrcweir if (rMark.IsMarked() || rMark.IsMultiMarked()) 1223*cdf0e10cSrcweir { 1224*cdf0e10cSrcweir SCCOL nCurX; 1225*cdf0e10cSrcweir SCROW nCurY; 1226*cdf0e10cSrcweir aViewData.GetMoveCursor( nCurX,nCurY ); 1227*cdf0e10cSrcweir SCCOL nNewX = nCurX; 1228*cdf0e10cSrcweir SCROW nNewY = nCurY; 1229*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 1230*cdf0e10cSrcweir 1231*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 1232*cdf0e10cSrcweir pDoc->GetNextPos( nNewX,nNewY, nTab, nMoveX,nMoveY, sal_True,sal_False, rMark ); 1233*cdf0e10cSrcweir 1234*cdf0e10cSrcweir MoveCursorRel( ((SCsCOL)nNewX)-(SCsCOL)nCurX, ((SCsROW)nNewY)-(SCsROW)nCurY, 1235*cdf0e10cSrcweir SC_FOLLOW_LINE, sal_False, sal_True ); 1236*cdf0e10cSrcweir 1237*cdf0e10cSrcweir // update input line even if cursor was not moved 1238*cdf0e10cSrcweir if ( nNewX == nCurX && nNewY == nCurY ) 1239*cdf0e10cSrcweir aViewData.UpdateInputHandler(sal_True); 1240*cdf0e10cSrcweir } 1241*cdf0e10cSrcweir else 1242*cdf0e10cSrcweir { 1243*cdf0e10cSrcweir if ( nMoveY != 0 && !nMoveX ) 1244*cdf0e10cSrcweir { 1245*cdf0e10cSrcweir // nach Tab und Enter wieder zur Ausgangsspalte 1246*cdf0e10cSrcweir SCCOL nTabCol = aViewData.GetTabStartCol(); 1247*cdf0e10cSrcweir if (nTabCol != SC_TABSTART_NONE) 1248*cdf0e10cSrcweir { 1249*cdf0e10cSrcweir SCCOL nCurX; 1250*cdf0e10cSrcweir SCROW nCurY; 1251*cdf0e10cSrcweir aViewData.GetMoveCursor( nCurX,nCurY ); 1252*cdf0e10cSrcweir nMoveX = ((SCsCOL)nTabCol)-(SCsCOL)nCurX; 1253*cdf0e10cSrcweir } 1254*cdf0e10cSrcweir } 1255*cdf0e10cSrcweir 1256*cdf0e10cSrcweir MoveCursorRel( nMoveX,nMoveY, SC_FOLLOW_LINE, sal_False ); 1257*cdf0e10cSrcweir } 1258*cdf0e10cSrcweir } 1259*cdf0e10cSrcweir 1260*cdf0e10cSrcweir 1261*cdf0e10cSrcweir sal_Bool ScTabView::MoveCursorKeyInput( const KeyEvent& rKeyEvent ) 1262*cdf0e10cSrcweir { 1263*cdf0e10cSrcweir const KeyCode& rKCode = rKeyEvent.GetKeyCode(); 1264*cdf0e10cSrcweir 1265*cdf0e10cSrcweir enum { MOD_NONE, MOD_CTRL, MOD_ALT, MOD_BOTH } eModifier = 1266*cdf0e10cSrcweir rKCode.IsMod1() ? 1267*cdf0e10cSrcweir (rKCode.IsMod2() ? MOD_BOTH : MOD_CTRL) : 1268*cdf0e10cSrcweir (rKCode.IsMod2() ? MOD_ALT : MOD_NONE); 1269*cdf0e10cSrcweir 1270*cdf0e10cSrcweir sal_Bool bSel = rKCode.IsShift(); 1271*cdf0e10cSrcweir sal_uInt16 nCode = rKCode.GetCode(); 1272*cdf0e10cSrcweir 1273*cdf0e10cSrcweir // CURSOR keys 1274*cdf0e10cSrcweir SCsCOL nDX = 0; 1275*cdf0e10cSrcweir SCsROW nDY = 0; 1276*cdf0e10cSrcweir switch( nCode ) 1277*cdf0e10cSrcweir { 1278*cdf0e10cSrcweir case KEY_LEFT: nDX = -1; break; 1279*cdf0e10cSrcweir case KEY_RIGHT: nDX = 1; break; 1280*cdf0e10cSrcweir case KEY_UP: nDY = -1; break; 1281*cdf0e10cSrcweir case KEY_DOWN: nDY = 1; break; 1282*cdf0e10cSrcweir } 1283*cdf0e10cSrcweir if( nDX != 0 || nDY != 0 ) 1284*cdf0e10cSrcweir { 1285*cdf0e10cSrcweir switch( eModifier ) 1286*cdf0e10cSrcweir { 1287*cdf0e10cSrcweir case MOD_NONE: MoveCursorRel( nDX, nDY, SC_FOLLOW_LINE, bSel ); break; 1288*cdf0e10cSrcweir case MOD_CTRL: MoveCursorArea( nDX, nDY, SC_FOLLOW_JUMP, bSel ); break; 1289*cdf0e10cSrcweir default: 1290*cdf0e10cSrcweir { 1291*cdf0e10cSrcweir // added to avoid warnings 1292*cdf0e10cSrcweir } 1293*cdf0e10cSrcweir } 1294*cdf0e10cSrcweir // always sal_True to suppress changes of col/row size (ALT+CURSOR) 1295*cdf0e10cSrcweir return sal_True; 1296*cdf0e10cSrcweir } 1297*cdf0e10cSrcweir 1298*cdf0e10cSrcweir // PAGEUP/PAGEDOWN 1299*cdf0e10cSrcweir if( (nCode == KEY_PAGEUP) || (nCode == KEY_PAGEDOWN) ) 1300*cdf0e10cSrcweir { 1301*cdf0e10cSrcweir nDX = (nCode == KEY_PAGEUP) ? -1 : 1; 1302*cdf0e10cSrcweir switch( eModifier ) 1303*cdf0e10cSrcweir { 1304*cdf0e10cSrcweir case MOD_NONE: MoveCursorPage( 0, static_cast<SCsCOLROW>(nDX), SC_FOLLOW_FIX, bSel ); break; 1305*cdf0e10cSrcweir case MOD_ALT: MoveCursorPage( nDX, 0, SC_FOLLOW_FIX, bSel ); break; 1306*cdf0e10cSrcweir case MOD_CTRL: SelectNextTab( nDX ); break; 1307*cdf0e10cSrcweir default: 1308*cdf0e10cSrcweir { 1309*cdf0e10cSrcweir // added to avoid warnings 1310*cdf0e10cSrcweir } 1311*cdf0e10cSrcweir } 1312*cdf0e10cSrcweir return sal_True; 1313*cdf0e10cSrcweir } 1314*cdf0e10cSrcweir 1315*cdf0e10cSrcweir // HOME/END 1316*cdf0e10cSrcweir if( (nCode == KEY_HOME) || (nCode == KEY_END) ) 1317*cdf0e10cSrcweir { 1318*cdf0e10cSrcweir nDX = (nCode == KEY_HOME) ? -1 : 1; 1319*cdf0e10cSrcweir ScFollowMode eMode = (nCode == KEY_HOME) ? SC_FOLLOW_LINE : SC_FOLLOW_JUMP; 1320*cdf0e10cSrcweir switch( eModifier ) 1321*cdf0e10cSrcweir { 1322*cdf0e10cSrcweir case MOD_NONE: MoveCursorEnd( nDX, 0, eMode, bSel ); break; 1323*cdf0e10cSrcweir case MOD_CTRL: MoveCursorEnd( nDX, static_cast<SCsCOLROW>(nDX), eMode, bSel ); break; 1324*cdf0e10cSrcweir default: 1325*cdf0e10cSrcweir { 1326*cdf0e10cSrcweir // added to avoid warnings 1327*cdf0e10cSrcweir } 1328*cdf0e10cSrcweir } 1329*cdf0e10cSrcweir return sal_True; 1330*cdf0e10cSrcweir } 1331*cdf0e10cSrcweir 1332*cdf0e10cSrcweir return sal_False; 1333*cdf0e10cSrcweir } 1334*cdf0e10cSrcweir 1335*cdf0e10cSrcweir 1336*cdf0e10cSrcweir // naechste/vorherige nicht geschuetzte Zelle 1337*cdf0e10cSrcweir void ScTabView::FindNextUnprot( sal_Bool bShift, sal_Bool bInSelection ) 1338*cdf0e10cSrcweir { 1339*cdf0e10cSrcweir short nMove = bShift ? -1 : 1; 1340*cdf0e10cSrcweir 1341*cdf0e10cSrcweir ScMarkData& rMark = aViewData.GetMarkData(); 1342*cdf0e10cSrcweir sal_Bool bMarked = bInSelection && (rMark.IsMarked() || rMark.IsMultiMarked()); 1343*cdf0e10cSrcweir 1344*cdf0e10cSrcweir SCCOL nCurX; 1345*cdf0e10cSrcweir SCROW nCurY; 1346*cdf0e10cSrcweir aViewData.GetMoveCursor( nCurX,nCurY ); 1347*cdf0e10cSrcweir SCCOL nNewX = nCurX; 1348*cdf0e10cSrcweir SCROW nNewY = nCurY; 1349*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 1350*cdf0e10cSrcweir 1351*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 1352*cdf0e10cSrcweir pDoc->GetNextPos( nNewX,nNewY, nTab, nMove,0, bMarked,sal_True, rMark ); 1353*cdf0e10cSrcweir 1354*cdf0e10cSrcweir SCCOL nTabCol = aViewData.GetTabStartCol(); 1355*cdf0e10cSrcweir if ( nTabCol == SC_TABSTART_NONE ) 1356*cdf0e10cSrcweir nTabCol = nCurX; // auf diese Spalte zurueck bei Enter 1357*cdf0e10cSrcweir 1358*cdf0e10cSrcweir MoveCursorRel( ((SCsCOL)nNewX)-(SCsCOL)nCurX, ((SCsROW)nNewY)-(SCsROW)nCurY, 1359*cdf0e10cSrcweir SC_FOLLOW_LINE, sal_False, sal_True ); 1360*cdf0e10cSrcweir 1361*cdf0e10cSrcweir // in MoveCursorRel wird die TabCol zurueckgesetzt... 1362*cdf0e10cSrcweir aViewData.SetTabStartCol( nTabCol ); 1363*cdf0e10cSrcweir } 1364*cdf0e10cSrcweir 1365*cdf0e10cSrcweir void ScTabView::MarkColumns() 1366*cdf0e10cSrcweir { 1367*cdf0e10cSrcweir SCCOL nStartCol; 1368*cdf0e10cSrcweir SCCOL nEndCol; 1369*cdf0e10cSrcweir 1370*cdf0e10cSrcweir ScMarkData& rMark = aViewData.GetMarkData(); 1371*cdf0e10cSrcweir if (rMark.IsMarked()) 1372*cdf0e10cSrcweir { 1373*cdf0e10cSrcweir ScRange aMarkRange; 1374*cdf0e10cSrcweir rMark.GetMarkArea( aMarkRange ); 1375*cdf0e10cSrcweir nStartCol = aMarkRange.aStart.Col(); 1376*cdf0e10cSrcweir nEndCol = aMarkRange.aEnd.Col(); 1377*cdf0e10cSrcweir } 1378*cdf0e10cSrcweir else 1379*cdf0e10cSrcweir { 1380*cdf0e10cSrcweir SCROW nDummy; 1381*cdf0e10cSrcweir aViewData.GetMoveCursor( nStartCol, nDummy ); 1382*cdf0e10cSrcweir nEndCol=nStartCol; 1383*cdf0e10cSrcweir } 1384*cdf0e10cSrcweir 1385*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 1386*cdf0e10cSrcweir DoneBlockMode(); 1387*cdf0e10cSrcweir InitBlockMode( nStartCol,0, nTab ); 1388*cdf0e10cSrcweir MarkCursor( nEndCol,MAXROW, nTab ); 1389*cdf0e10cSrcweir SelectionChanged(); 1390*cdf0e10cSrcweir } 1391*cdf0e10cSrcweir 1392*cdf0e10cSrcweir void ScTabView::MarkRows() 1393*cdf0e10cSrcweir { 1394*cdf0e10cSrcweir SCROW nStartRow; 1395*cdf0e10cSrcweir SCROW nEndRow; 1396*cdf0e10cSrcweir 1397*cdf0e10cSrcweir ScMarkData& rMark = aViewData.GetMarkData(); 1398*cdf0e10cSrcweir if (rMark.IsMarked()) 1399*cdf0e10cSrcweir { 1400*cdf0e10cSrcweir ScRange aMarkRange; 1401*cdf0e10cSrcweir rMark.GetMarkArea( aMarkRange ); 1402*cdf0e10cSrcweir nStartRow = aMarkRange.aStart.Row(); 1403*cdf0e10cSrcweir nEndRow = aMarkRange.aEnd.Row(); 1404*cdf0e10cSrcweir } 1405*cdf0e10cSrcweir else 1406*cdf0e10cSrcweir { 1407*cdf0e10cSrcweir SCCOL nDummy; 1408*cdf0e10cSrcweir aViewData.GetMoveCursor( nDummy, nStartRow ); 1409*cdf0e10cSrcweir nEndRow=nStartRow; 1410*cdf0e10cSrcweir } 1411*cdf0e10cSrcweir 1412*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 1413*cdf0e10cSrcweir DoneBlockMode(); 1414*cdf0e10cSrcweir InitBlockMode( 0,nStartRow, nTab ); 1415*cdf0e10cSrcweir MarkCursor( MAXCOL,nEndRow, nTab ); 1416*cdf0e10cSrcweir SelectionChanged(); 1417*cdf0e10cSrcweir } 1418*cdf0e10cSrcweir 1419*cdf0e10cSrcweir void ScTabView::MarkDataArea( sal_Bool bIncludeCursor ) 1420*cdf0e10cSrcweir { 1421*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 1422*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 1423*cdf0e10cSrcweir SCCOL nStartCol = aViewData.GetCurX(); 1424*cdf0e10cSrcweir SCROW nStartRow = aViewData.GetCurY(); 1425*cdf0e10cSrcweir SCCOL nEndCol = nStartCol; 1426*cdf0e10cSrcweir SCROW nEndRow = nStartRow; 1427*cdf0e10cSrcweir 1428*cdf0e10cSrcweir pDoc->GetDataArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow, bIncludeCursor, false ); 1429*cdf0e10cSrcweir 1430*cdf0e10cSrcweir HideAllCursors(); 1431*cdf0e10cSrcweir DoneBlockMode(); 1432*cdf0e10cSrcweir InitBlockMode( nStartCol, nStartRow, nTab ); 1433*cdf0e10cSrcweir MarkCursor( nEndCol, nEndRow, nTab ); 1434*cdf0e10cSrcweir ShowAllCursors(); 1435*cdf0e10cSrcweir 1436*cdf0e10cSrcweir SelectionChanged(); 1437*cdf0e10cSrcweir } 1438*cdf0e10cSrcweir 1439*cdf0e10cSrcweir void ScTabView::MarkMatrixFormula() 1440*cdf0e10cSrcweir { 1441*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 1442*cdf0e10cSrcweir ScAddress aCursor( aViewData.GetCurX(), aViewData.GetCurY(), aViewData.GetTabNo() ); 1443*cdf0e10cSrcweir ScRange aMatrix; 1444*cdf0e10cSrcweir if ( pDoc->GetMatrixFormulaRange( aCursor, aMatrix ) ) 1445*cdf0e10cSrcweir { 1446*cdf0e10cSrcweir MarkRange( aMatrix, sal_False ); // cursor is already within the range 1447*cdf0e10cSrcweir } 1448*cdf0e10cSrcweir } 1449*cdf0e10cSrcweir 1450*cdf0e10cSrcweir void ScTabView::MarkRange( const ScRange& rRange, sal_Bool bSetCursor, sal_Bool bContinue ) 1451*cdf0e10cSrcweir { 1452*cdf0e10cSrcweir SCTAB nTab = rRange.aStart.Tab(); 1453*cdf0e10cSrcweir SetTabNo( nTab ); 1454*cdf0e10cSrcweir 1455*cdf0e10cSrcweir HideAllCursors(); 1456*cdf0e10cSrcweir DoneBlockMode( bContinue ); // bContinue==sal_True -> clear old mark 1457*cdf0e10cSrcweir if (bSetCursor) // Wenn Cursor gesetzt wird, immer auch alignen 1458*cdf0e10cSrcweir { 1459*cdf0e10cSrcweir SCCOL nAlignX = rRange.aStart.Col(); 1460*cdf0e10cSrcweir SCROW nAlignY = rRange.aStart.Row(); 1461*cdf0e10cSrcweir if ( rRange.aStart.Col() == 0 && rRange.aEnd.Col() == MAXCOL ) 1462*cdf0e10cSrcweir nAlignX = aViewData.GetPosX(WhichH(aViewData.GetActivePart())); 1463*cdf0e10cSrcweir if ( rRange.aStart.Row() == 0 && rRange.aEnd.Row() == MAXROW ) 1464*cdf0e10cSrcweir nAlignY = aViewData.GetPosY(WhichV(aViewData.GetActivePart())); 1465*cdf0e10cSrcweir AlignToCursor( nAlignX, nAlignY, SC_FOLLOW_JUMP ); 1466*cdf0e10cSrcweir } 1467*cdf0e10cSrcweir InitBlockMode( rRange.aStart.Col(), rRange.aStart.Row(), nTab ); 1468*cdf0e10cSrcweir MarkCursor( rRange.aEnd.Col(), rRange.aEnd.Row(), nTab ); 1469*cdf0e10cSrcweir if (bSetCursor) 1470*cdf0e10cSrcweir { 1471*cdf0e10cSrcweir SCCOL nPosX = rRange.aStart.Col(); 1472*cdf0e10cSrcweir SCROW nPosY = rRange.aStart.Row(); 1473*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 1474*cdf0e10cSrcweir 1475*cdf0e10cSrcweir while (pDoc->IsHorOverlapped( nPosX, nPosY, nTab )) //! ViewData !!! 1476*cdf0e10cSrcweir --nPosX; 1477*cdf0e10cSrcweir while (pDoc->IsVerOverlapped( nPosX, nPosY, nTab )) 1478*cdf0e10cSrcweir --nPosY; 1479*cdf0e10cSrcweir 1480*cdf0e10cSrcweir aViewData.ResetOldCursor(); 1481*cdf0e10cSrcweir SetCursor( nPosX, nPosY ); 1482*cdf0e10cSrcweir } 1483*cdf0e10cSrcweir ShowAllCursors(); 1484*cdf0e10cSrcweir 1485*cdf0e10cSrcweir SelectionChanged(); 1486*cdf0e10cSrcweir } 1487*cdf0e10cSrcweir 1488*cdf0e10cSrcweir void ScTabView::Unmark() 1489*cdf0e10cSrcweir { 1490*cdf0e10cSrcweir ScMarkData& rMark = aViewData.GetMarkData(); 1491*cdf0e10cSrcweir if ( rMark.IsMarked() || rMark.IsMultiMarked() ) 1492*cdf0e10cSrcweir { 1493*cdf0e10cSrcweir SCCOL nCurX; 1494*cdf0e10cSrcweir SCROW nCurY; 1495*cdf0e10cSrcweir aViewData.GetMoveCursor( nCurX,nCurY ); 1496*cdf0e10cSrcweir MoveCursorAbs( nCurX, nCurY, SC_FOLLOW_NONE, sal_False, sal_False ); 1497*cdf0e10cSrcweir 1498*cdf0e10cSrcweir SelectionChanged(); 1499*cdf0e10cSrcweir } 1500*cdf0e10cSrcweir } 1501*cdf0e10cSrcweir 1502*cdf0e10cSrcweir void ScTabView::SetMarkData( const ScMarkData& rNew ) 1503*cdf0e10cSrcweir { 1504*cdf0e10cSrcweir DoneBlockMode(); 1505*cdf0e10cSrcweir InitOwnBlockMode(); 1506*cdf0e10cSrcweir aViewData.GetMarkData() = rNew; 1507*cdf0e10cSrcweir 1508*cdf0e10cSrcweir MarkDataChanged(); 1509*cdf0e10cSrcweir } 1510*cdf0e10cSrcweir 1511*cdf0e10cSrcweir void ScTabView::MarkDataChanged() 1512*cdf0e10cSrcweir { 1513*cdf0e10cSrcweir // has to be called after making direct changes to mark data (not via MarkCursor etc) 1514*cdf0e10cSrcweir 1515*cdf0e10cSrcweir UpdateSelectionOverlay(); 1516*cdf0e10cSrcweir } 1517*cdf0e10cSrcweir 1518*cdf0e10cSrcweir void ScTabView::SelectNextTab( short nDir, sal_Bool bExtendSelection ) 1519*cdf0e10cSrcweir { 1520*cdf0e10cSrcweir if (!nDir) return; 1521*cdf0e10cSrcweir DBG_ASSERT( nDir==-1 || nDir==1, "SelectNextTab: falscher Wert"); 1522*cdf0e10cSrcweir 1523*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 1524*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 1525*cdf0e10cSrcweir if (nDir<0) 1526*cdf0e10cSrcweir { 1527*cdf0e10cSrcweir if (!nTab) return; 1528*cdf0e10cSrcweir --nTab; 1529*cdf0e10cSrcweir while (!pDoc->IsVisible(nTab)) 1530*cdf0e10cSrcweir { 1531*cdf0e10cSrcweir if (!nTab) return; 1532*cdf0e10cSrcweir --nTab; 1533*cdf0e10cSrcweir } 1534*cdf0e10cSrcweir } 1535*cdf0e10cSrcweir else 1536*cdf0e10cSrcweir { 1537*cdf0e10cSrcweir SCTAB nCount = pDoc->GetTableCount(); 1538*cdf0e10cSrcweir ++nTab; 1539*cdf0e10cSrcweir if (nTab >= nCount) return; 1540*cdf0e10cSrcweir while (!pDoc->IsVisible(nTab)) 1541*cdf0e10cSrcweir { 1542*cdf0e10cSrcweir ++nTab; 1543*cdf0e10cSrcweir if (nTab >= nCount) return; 1544*cdf0e10cSrcweir } 1545*cdf0e10cSrcweir } 1546*cdf0e10cSrcweir 1547*cdf0e10cSrcweir SetTabNo( nTab, sal_False, bExtendSelection ); 1548*cdf0e10cSrcweir PaintExtras(); 1549*cdf0e10cSrcweir } 1550*cdf0e10cSrcweir 1551*cdf0e10cSrcweir void ScTabView::UpdateVisibleRange() 1552*cdf0e10cSrcweir { 1553*cdf0e10cSrcweir for (sal_uInt16 i=0; i<4; i++) 1554*cdf0e10cSrcweir if (pGridWin[i] && pGridWin[i]->IsVisible()) 1555*cdf0e10cSrcweir pGridWin[i]->UpdateVisibleRange(); 1556*cdf0e10cSrcweir } 1557*cdf0e10cSrcweir 1558*cdf0e10cSrcweir // SetTabNo - angezeigte Tabelle 1559*cdf0e10cSrcweir 1560*cdf0e10cSrcweir void ScTabView::SetTabNo( SCTAB nTab, sal_Bool bNew, sal_Bool bExtendSelection, bool bSameTabButMoved ) 1561*cdf0e10cSrcweir { 1562*cdf0e10cSrcweir if ( !ValidTab(nTab) ) 1563*cdf0e10cSrcweir { 1564*cdf0e10cSrcweir DBG_ERROR("SetTabNo: falsche Tabelle"); 1565*cdf0e10cSrcweir return; 1566*cdf0e10cSrcweir } 1567*cdf0e10cSrcweir 1568*cdf0e10cSrcweir if ( nTab != aViewData.GetTabNo() || bNew ) 1569*cdf0e10cSrcweir { 1570*cdf0e10cSrcweir // #57724# Die FormShell moechte vor dem Umschalten benachrichtigt werden 1571*cdf0e10cSrcweir FmFormShell* pFormSh = aViewData.GetViewShell()->GetFormShell(); 1572*cdf0e10cSrcweir if (pFormSh) 1573*cdf0e10cSrcweir { 1574*cdf0e10cSrcweir sal_Bool bAllowed = sal::static_int_cast<sal_Bool>( pFormSh->PrepareClose( sal_True ) ); 1575*cdf0e10cSrcweir if (!bAllowed) 1576*cdf0e10cSrcweir { 1577*cdf0e10cSrcweir //! Fehlermeldung? oder macht das die FormShell selber? 1578*cdf0e10cSrcweir //! Fehler-Flag zurueckgeben und Aktionen abbrechen 1579*cdf0e10cSrcweir 1580*cdf0e10cSrcweir return; // Die FormShell sagt, es kann nicht umgeschaltet werden 1581*cdf0e10cSrcweir } 1582*cdf0e10cSrcweir } 1583*cdf0e10cSrcweir 1584*cdf0e10cSrcweir // nicht InputEnterHandler wegen Referenzeingabe ! 1585*cdf0e10cSrcweir 1586*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 1587*cdf0e10cSrcweir pDoc->MakeTable( nTab ); 1588*cdf0e10cSrcweir 1589*cdf0e10cSrcweir // Update pending row heights before switching the sheet, so Reschedule from the progress bar 1590*cdf0e10cSrcweir // doesn't paint the new sheet with old heights 1591*cdf0e10cSrcweir aViewData.GetDocShell()->UpdatePendingRowHeights( nTab ); 1592*cdf0e10cSrcweir 1593*cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 1594*cdf0e10cSrcweir SCTAB nOldPos = nTab; 1595*cdf0e10cSrcweir while (!pDoc->IsVisible(nTab)) // naechste sichtbare suchen 1596*cdf0e10cSrcweir { 1597*cdf0e10cSrcweir sal_Bool bUp = (nTab>=nOldPos); 1598*cdf0e10cSrcweir if (bUp) 1599*cdf0e10cSrcweir { 1600*cdf0e10cSrcweir ++nTab; 1601*cdf0e10cSrcweir if (nTab>=nTabCount) 1602*cdf0e10cSrcweir { 1603*cdf0e10cSrcweir nTab = nOldPos; 1604*cdf0e10cSrcweir bUp = sal_False; 1605*cdf0e10cSrcweir } 1606*cdf0e10cSrcweir } 1607*cdf0e10cSrcweir 1608*cdf0e10cSrcweir if (!bUp) 1609*cdf0e10cSrcweir { 1610*cdf0e10cSrcweir if (nTab != 0) 1611*cdf0e10cSrcweir --nTab; 1612*cdf0e10cSrcweir else 1613*cdf0e10cSrcweir { 1614*cdf0e10cSrcweir DBG_ERROR("keine sichtbare Tabelle"); 1615*cdf0e10cSrcweir pDoc->SetVisible( 0, sal_True ); 1616*cdf0e10cSrcweir } 1617*cdf0e10cSrcweir } 1618*cdf0e10cSrcweir } 1619*cdf0e10cSrcweir 1620*cdf0e10cSrcweir // #i71490# Deselect drawing objects before changing the sheet number in view data, 1621*cdf0e10cSrcweir // so the handling of notes still has the sheet selected on which the notes are. 1622*cdf0e10cSrcweir DrawDeselectAll(); 1623*cdf0e10cSrcweir 1624*cdf0e10cSrcweir ScModule* pScMod = SC_MOD(); 1625*cdf0e10cSrcweir sal_Bool bRefMode = pScMod->IsFormulaMode(); 1626*cdf0e10cSrcweir if ( !bRefMode ) // Abfrage, damit RefMode bei Tabellenwechsel funktioniert 1627*cdf0e10cSrcweir { 1628*cdf0e10cSrcweir DoneBlockMode(); 1629*cdf0e10cSrcweir pSelEngine->Reset(); // reset all flags, including locked modifiers 1630*cdf0e10cSrcweir aViewData.SetRefTabNo( nTab ); 1631*cdf0e10cSrcweir } 1632*cdf0e10cSrcweir 1633*cdf0e10cSrcweir ScSplitPos eOldActive = aViewData.GetActivePart(); // before switching 1634*cdf0e10cSrcweir sal_Bool bFocus = pGridWin[eOldActive]->HasFocus(); 1635*cdf0e10cSrcweir 1636*cdf0e10cSrcweir aViewData.SetTabNo( nTab ); 1637*cdf0e10cSrcweir // UpdateShow noch vor SetCursor, damit UpdateAutoFillMark die richtigen 1638*cdf0e10cSrcweir // Fenster findet (wird aus SetCursor gerufen) 1639*cdf0e10cSrcweir UpdateShow(); 1640*cdf0e10cSrcweir aViewData.ResetOldCursor(); 1641*cdf0e10cSrcweir SetCursor( aViewData.GetCurX(), aViewData.GetCurY(), sal_True ); 1642*cdf0e10cSrcweir 1643*cdf0e10cSrcweir SfxBindings& rBindings = aViewData.GetBindings(); 1644*cdf0e10cSrcweir ScMarkData& rMark = aViewData.GetMarkData(); 1645*cdf0e10cSrcweir 1646*cdf0e10cSrcweir bool bAllSelected = true; 1647*cdf0e10cSrcweir for (SCTAB nSelTab = 0; nSelTab < nTabCount; ++nSelTab) 1648*cdf0e10cSrcweir { 1649*cdf0e10cSrcweir if (!pDoc->IsVisible(nSelTab) || rMark.GetTableSelect(nSelTab)) 1650*cdf0e10cSrcweir { 1651*cdf0e10cSrcweir if (nTab == nSelTab) 1652*cdf0e10cSrcweir // This tab is already in selection. Keep the current 1653*cdf0e10cSrcweir // selection. 1654*cdf0e10cSrcweir bExtendSelection = true; 1655*cdf0e10cSrcweir } 1656*cdf0e10cSrcweir else 1657*cdf0e10cSrcweir { 1658*cdf0e10cSrcweir bAllSelected = false; 1659*cdf0e10cSrcweir if (bExtendSelection) 1660*cdf0e10cSrcweir // We got what we need. No need to stay in the loop. 1661*cdf0e10cSrcweir break; 1662*cdf0e10cSrcweir } 1663*cdf0e10cSrcweir } 1664*cdf0e10cSrcweir if (bAllSelected && !bNew) 1665*cdf0e10cSrcweir // #i6327# if all tables are selected, a selection event (#i6330#) will deselect all 1666*cdf0e10cSrcweir // (not if called with bNew to update settings) 1667*cdf0e10cSrcweir bExtendSelection = false; 1668*cdf0e10cSrcweir 1669*cdf0e10cSrcweir if (bExtendSelection) 1670*cdf0e10cSrcweir rMark.SelectTable( nTab, sal_True ); 1671*cdf0e10cSrcweir else 1672*cdf0e10cSrcweir { 1673*cdf0e10cSrcweir rMark.SelectOneTable( nTab ); 1674*cdf0e10cSrcweir rBindings.Invalidate( FID_FILL_TAB ); 1675*cdf0e10cSrcweir rBindings.Invalidate( FID_TAB_DESELECTALL ); 1676*cdf0e10cSrcweir } 1677*cdf0e10cSrcweir 1678*cdf0e10cSrcweir bool bUnoRefDialog = pScMod->IsRefDialogOpen() && pScMod->GetCurRefDlgId() == WID_SIMPLE_REF; 1679*cdf0e10cSrcweir 1680*cdf0e10cSrcweir // recalc zoom-dependent values (before TabChanged, before UpdateEditViewPos) 1681*cdf0e10cSrcweir RefreshZoom(); 1682*cdf0e10cSrcweir UpdateVarZoom(); 1683*cdf0e10cSrcweir 1684*cdf0e10cSrcweir if ( bRefMode ) // hide EditView if necessary (after aViewData.SetTabNo !) 1685*cdf0e10cSrcweir { 1686*cdf0e10cSrcweir for ( sal_uInt16 i=0; i<4; i++ ) 1687*cdf0e10cSrcweir if ( pGridWin[i] ) 1688*cdf0e10cSrcweir if ( pGridWin[i]->IsVisible() ) 1689*cdf0e10cSrcweir pGridWin[i]->UpdateEditViewPos(); 1690*cdf0e10cSrcweir } 1691*cdf0e10cSrcweir 1692*cdf0e10cSrcweir TabChanged( bSameTabButMoved ); // DrawView 1693*cdf0e10cSrcweir 1694*cdf0e10cSrcweir aViewData.GetViewShell()->WindowChanged(); // falls das aktive Fenster anders ist 1695*cdf0e10cSrcweir if ( !bUnoRefDialog ) 1696*cdf0e10cSrcweir aViewData.GetViewShell()->DisconnectAllClients(); // important for floating frames 1697*cdf0e10cSrcweir else 1698*cdf0e10cSrcweir { 1699*cdf0e10cSrcweir // hide / show inplace client 1700*cdf0e10cSrcweir 1701*cdf0e10cSrcweir ScClient* pClient = static_cast<ScClient*>(aViewData.GetViewShell()->GetIPClient()); 1702*cdf0e10cSrcweir if ( pClient && pClient->IsObjectInPlaceActive() ) 1703*cdf0e10cSrcweir { 1704*cdf0e10cSrcweir Rectangle aObjArea = pClient->GetObjArea(); 1705*cdf0e10cSrcweir if ( nTab == aViewData.GetRefTabNo() ) 1706*cdf0e10cSrcweir { 1707*cdf0e10cSrcweir // move to its original position 1708*cdf0e10cSrcweir 1709*cdf0e10cSrcweir SdrOle2Obj* pDrawObj = pClient->GetDrawObj(); 1710*cdf0e10cSrcweir if ( pDrawObj ) 1711*cdf0e10cSrcweir { 1712*cdf0e10cSrcweir Rectangle aRect = pDrawObj->GetLogicRect(); 1713*cdf0e10cSrcweir MapMode aMapMode( MAP_100TH_MM ); 1714*cdf0e10cSrcweir Size aOleSize = pDrawObj->GetOrigObjSize( &aMapMode ); 1715*cdf0e10cSrcweir aRect.SetSize( aOleSize ); 1716*cdf0e10cSrcweir aObjArea = aRect; 1717*cdf0e10cSrcweir } 1718*cdf0e10cSrcweir } 1719*cdf0e10cSrcweir else 1720*cdf0e10cSrcweir { 1721*cdf0e10cSrcweir // move to an invisible position 1722*cdf0e10cSrcweir 1723*cdf0e10cSrcweir aObjArea.SetPos( Point( 0, -2*aObjArea.GetHeight() ) ); 1724*cdf0e10cSrcweir } 1725*cdf0e10cSrcweir pClient->SetObjArea( aObjArea ); 1726*cdf0e10cSrcweir } 1727*cdf0e10cSrcweir } 1728*cdf0e10cSrcweir 1729*cdf0e10cSrcweir if ( bFocus && aViewData.GetActivePart() != eOldActive && !bRefMode ) 1730*cdf0e10cSrcweir ActiveGrabFocus(); // grab focus to the pane that's active now 1731*cdf0e10cSrcweir 1732*cdf0e10cSrcweir // Fixierungen 1733*cdf0e10cSrcweir 1734*cdf0e10cSrcweir sal_Bool bResize = sal_False; 1735*cdf0e10cSrcweir if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX ) 1736*cdf0e10cSrcweir if (aViewData.UpdateFixX()) 1737*cdf0e10cSrcweir bResize = sal_True; 1738*cdf0e10cSrcweir if ( aViewData.GetVSplitMode() == SC_SPLIT_FIX ) 1739*cdf0e10cSrcweir if (aViewData.UpdateFixY()) 1740*cdf0e10cSrcweir bResize = sal_True; 1741*cdf0e10cSrcweir if (bResize) 1742*cdf0e10cSrcweir RepeatResize(); 1743*cdf0e10cSrcweir InvalidateSplit(); 1744*cdf0e10cSrcweir 1745*cdf0e10cSrcweir // #163911# Update the visible range in each GridWin directly, don't wait for the repaint event. 1746*cdf0e10cSrcweir UpdateVisibleRange(); 1747*cdf0e10cSrcweir 1748*cdf0e10cSrcweir if ( aViewData.IsPagebreakMode() ) 1749*cdf0e10cSrcweir UpdatePageBreakData(); //! asynchron ?? 1750*cdf0e10cSrcweir 1751*cdf0e10cSrcweir // #53551# Form-Layer muss den sichtbaren Ausschnitt der neuen Tabelle kennen 1752*cdf0e10cSrcweir // dafuer muss hier schon der MapMode stimmen 1753*cdf0e10cSrcweir for (sal_uInt16 i=0; i<4; i++) 1754*cdf0e10cSrcweir if (pGridWin[i]) 1755*cdf0e10cSrcweir pGridWin[i]->SetMapMode( pGridWin[i]->GetDrawMapMode() ); 1756*cdf0e10cSrcweir SetNewVisArea(); 1757*cdf0e10cSrcweir 1758*cdf0e10cSrcweir PaintGrid(); 1759*cdf0e10cSrcweir PaintTop(); 1760*cdf0e10cSrcweir PaintLeft(); 1761*cdf0e10cSrcweir PaintExtras(); 1762*cdf0e10cSrcweir 1763*cdf0e10cSrcweir DoResize( aBorderPos, aFrameSize ); 1764*cdf0e10cSrcweir rBindings.Invalidate( SID_DELETE_PRINTAREA ); // Menue 1765*cdf0e10cSrcweir rBindings.Invalidate( FID_DEL_MANUALBREAKS ); 1766*cdf0e10cSrcweir rBindings.Invalidate( FID_RESET_PRINTZOOM ); 1767*cdf0e10cSrcweir rBindings.Invalidate( SID_STATUS_DOCPOS ); // Statusbar 1768*cdf0e10cSrcweir rBindings.Invalidate( SID_STATUS_PAGESTYLE ); // Statusbar 1769*cdf0e10cSrcweir rBindings.Invalidate( SID_CURRENTTAB ); // Navigator 1770*cdf0e10cSrcweir rBindings.Invalidate( SID_STYLE_FAMILY2 ); // Gestalter 1771*cdf0e10cSrcweir rBindings.Invalidate( SID_STYLE_FAMILY4 ); // Gestalter 1772*cdf0e10cSrcweir rBindings.Invalidate( SID_TABLES_COUNT ); 1773*cdf0e10cSrcweir 1774*cdf0e10cSrcweir if(pScMod->IsRefDialogOpen()) 1775*cdf0e10cSrcweir { 1776*cdf0e10cSrcweir sal_uInt16 nCurRefDlgId=pScMod->GetCurRefDlgId(); 1777*cdf0e10cSrcweir SfxViewFrame* pViewFrm = aViewData.GetViewShell()->GetViewFrame(); 1778*cdf0e10cSrcweir SfxChildWindow* pChildWnd = pViewFrm->GetChildWindow( nCurRefDlgId ); 1779*cdf0e10cSrcweir if ( pChildWnd ) 1780*cdf0e10cSrcweir { 1781*cdf0e10cSrcweir IAnyRefDialog* pRefDlg = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow()); 1782*cdf0e10cSrcweir pRefDlg->ViewShellChanged(NULL); 1783*cdf0e10cSrcweir } 1784*cdf0e10cSrcweir } 1785*cdf0e10cSrcweir } 1786*cdf0e10cSrcweir } 1787*cdf0e10cSrcweir 1788*cdf0e10cSrcweir // 1789*cdf0e10cSrcweir // Paint-Funktionen - nur fuer diese View 1790*cdf0e10cSrcweir // 1791*cdf0e10cSrcweir 1792*cdf0e10cSrcweir void ScTabView::MakeEditView( ScEditEngineDefaulter* pEngine, SCCOL nCol, SCROW nRow ) 1793*cdf0e10cSrcweir { 1794*cdf0e10cSrcweir DrawDeselectAll(); 1795*cdf0e10cSrcweir 1796*cdf0e10cSrcweir if (pDrawView) 1797*cdf0e10cSrcweir DrawEnableAnim( sal_False ); 1798*cdf0e10cSrcweir 1799*cdf0e10cSrcweir EditView* pSpellingView = aViewData.GetSpellingView(); 1800*cdf0e10cSrcweir 1801*cdf0e10cSrcweir for (sal_uInt16 i=0; i<4; i++) 1802*cdf0e10cSrcweir if (pGridWin[i]) 1803*cdf0e10cSrcweir if ( pGridWin[i]->IsVisible() && !aViewData.HasEditView((ScSplitPos)i) ) 1804*cdf0e10cSrcweir { 1805*cdf0e10cSrcweir ScHSplitPos eHWhich = WhichH( (ScSplitPos) i ); 1806*cdf0e10cSrcweir ScVSplitPos eVWhich = WhichV( (ScSplitPos) i ); 1807*cdf0e10cSrcweir SCCOL nScrX = aViewData.GetPosX( eHWhich ); 1808*cdf0e10cSrcweir SCROW nScrY = aViewData.GetPosY( eVWhich ); 1809*cdf0e10cSrcweir 1810*cdf0e10cSrcweir sal_Bool bPosVisible = 1811*cdf0e10cSrcweir ( nCol >= nScrX && nCol <= nScrX + aViewData.VisibleCellsX(eHWhich) + 1 && 1812*cdf0e10cSrcweir nRow >= nScrY && nRow <= nScrY + aViewData.VisibleCellsY(eVWhich) + 1 ); 1813*cdf0e10cSrcweir 1814*cdf0e10cSrcweir // #102421# for the active part, create edit view even if outside the visible area, 1815*cdf0e10cSrcweir // so input isn't lost (and the edit view may be scrolled into the visible area) 1816*cdf0e10cSrcweir 1817*cdf0e10cSrcweir // #i26433# during spelling, the spelling view must be active 1818*cdf0e10cSrcweir if ( bPosVisible || aViewData.GetActivePart() == (ScSplitPos) i || 1819*cdf0e10cSrcweir ( pSpellingView && aViewData.GetEditView((ScSplitPos) i) == pSpellingView ) ) 1820*cdf0e10cSrcweir { 1821*cdf0e10cSrcweir pGridWin[i]->HideCursor(); 1822*cdf0e10cSrcweir 1823*cdf0e10cSrcweir pGridWin[i]->DeleteCursorOverlay(); 1824*cdf0e10cSrcweir pGridWin[i]->DeleteAutoFillOverlay(); 1825*cdf0e10cSrcweir 1826*cdf0e10cSrcweir // flush OverlayManager before changing MapMode to text edit 1827*cdf0e10cSrcweir pGridWin[i]->flushOverlayManager(); 1828*cdf0e10cSrcweir 1829*cdf0e10cSrcweir // MapMode must be set after HideCursor 1830*cdf0e10cSrcweir pGridWin[i]->SetMapMode(aViewData.GetLogicMode()); 1831*cdf0e10cSrcweir 1832*cdf0e10cSrcweir aViewData.SetEditEngine( (ScSplitPos) i, pEngine, pGridWin[i], nCol, nRow ); 1833*cdf0e10cSrcweir 1834*cdf0e10cSrcweir if ( !bPosVisible ) 1835*cdf0e10cSrcweir { 1836*cdf0e10cSrcweir // move the edit view area to the real (possibly negative) position, 1837*cdf0e10cSrcweir // or hide if completely above or left of the window 1838*cdf0e10cSrcweir pGridWin[i]->UpdateEditViewPos(); 1839*cdf0e10cSrcweir } 1840*cdf0e10cSrcweir } 1841*cdf0e10cSrcweir } 1842*cdf0e10cSrcweir 1843*cdf0e10cSrcweir if (aViewData.GetViewShell()->HasAccessibilityObjects()) 1844*cdf0e10cSrcweir aViewData.GetViewShell()->BroadcastAccessibility(SfxSimpleHint(SC_HINT_ACC_ENTEREDITMODE)); 1845*cdf0e10cSrcweir } 1846*cdf0e10cSrcweir 1847*cdf0e10cSrcweir void ScTabView::UpdateEditView() 1848*cdf0e10cSrcweir { 1849*cdf0e10cSrcweir ScSplitPos eActive = aViewData.GetActivePart(); 1850*cdf0e10cSrcweir for (sal_uInt16 i=0; i<4; i++) 1851*cdf0e10cSrcweir if (aViewData.HasEditView( (ScSplitPos) i )) 1852*cdf0e10cSrcweir { 1853*cdf0e10cSrcweir EditView* pEditView = aViewData.GetEditView( (ScSplitPos) i ); 1854*cdf0e10cSrcweir aViewData.SetEditEngine( (ScSplitPos) i, 1855*cdf0e10cSrcweir static_cast<ScEditEngineDefaulter*>(pEditView->GetEditEngine()), 1856*cdf0e10cSrcweir pGridWin[i], GetViewData()->GetCurX(), GetViewData()->GetCurY() ); 1857*cdf0e10cSrcweir if ( (ScSplitPos)i == eActive ) 1858*cdf0e10cSrcweir pEditView->ShowCursor( sal_False ); 1859*cdf0e10cSrcweir } 1860*cdf0e10cSrcweir } 1861*cdf0e10cSrcweir 1862*cdf0e10cSrcweir void ScTabView::KillEditView( sal_Bool bNoPaint ) 1863*cdf0e10cSrcweir { 1864*cdf0e10cSrcweir sal_uInt16 i; 1865*cdf0e10cSrcweir SCCOL nCol1 = aViewData.GetEditStartCol(); 1866*cdf0e10cSrcweir SCROW nRow1 = aViewData.GetEditStartRow(); 1867*cdf0e10cSrcweir SCCOL nCol2 = aViewData.GetEditEndCol(); 1868*cdf0e10cSrcweir SCROW nRow2 = aViewData.GetEditEndRow(); 1869*cdf0e10cSrcweir sal_Bool bPaint[4]; 1870*cdf0e10cSrcweir sal_Bool bNotifyAcc(false); 1871*cdf0e10cSrcweir 1872*cdf0e10cSrcweir sal_Bool bExtended = nRow1 != nRow2; // Col wird sowieso bis zum Ende gezeichnet 1873*cdf0e10cSrcweir sal_Bool bAtCursor = nCol1 <= aViewData.GetCurX() && 1874*cdf0e10cSrcweir nCol2 >= aViewData.GetCurX() && 1875*cdf0e10cSrcweir nRow1 == aViewData.GetCurY(); 1876*cdf0e10cSrcweir for (i=0; i<4; i++) 1877*cdf0e10cSrcweir { 1878*cdf0e10cSrcweir bPaint[i] = aViewData.HasEditView( (ScSplitPos) i ); 1879*cdf0e10cSrcweir if (bPaint[i]) 1880*cdf0e10cSrcweir bNotifyAcc = true; 1881*cdf0e10cSrcweir } 1882*cdf0e10cSrcweir 1883*cdf0e10cSrcweir // #108931#; notify accessibility before all things happen 1884*cdf0e10cSrcweir if ((bNotifyAcc) && (aViewData.GetViewShell()->HasAccessibilityObjects())) 1885*cdf0e10cSrcweir aViewData.GetViewShell()->BroadcastAccessibility(SfxSimpleHint(SC_HINT_ACC_LEAVEEDITMODE)); 1886*cdf0e10cSrcweir 1887*cdf0e10cSrcweir aViewData.ResetEditView(); 1888*cdf0e10cSrcweir for (i=0; i<4; i++) 1889*cdf0e10cSrcweir if (pGridWin[i] && bPaint[i]) 1890*cdf0e10cSrcweir if (pGridWin[i]->IsVisible()) 1891*cdf0e10cSrcweir { 1892*cdf0e10cSrcweir pGridWin[i]->ShowCursor(); 1893*cdf0e10cSrcweir 1894*cdf0e10cSrcweir pGridWin[i]->SetMapMode(pGridWin[i]->GetDrawMapMode()); 1895*cdf0e10cSrcweir 1896*cdf0e10cSrcweir // #i73567# the cell still has to be repainted 1897*cdf0e10cSrcweir if (bExtended || ( bAtCursor && !bNoPaint )) 1898*cdf0e10cSrcweir { 1899*cdf0e10cSrcweir pGridWin[i]->Draw( nCol1, nRow1, nCol2, nRow2 ); 1900*cdf0e10cSrcweir pGridWin[i]->UpdateSelectionOverlay(); 1901*cdf0e10cSrcweir } 1902*cdf0e10cSrcweir } 1903*cdf0e10cSrcweir 1904*cdf0e10cSrcweir if (pDrawView) 1905*cdf0e10cSrcweir DrawEnableAnim( sal_True ); 1906*cdf0e10cSrcweir 1907*cdf0e10cSrcweir // GrabFocus immer dann, wenn diese View aktiv ist und 1908*cdf0e10cSrcweir // die Eingabezeile den Focus hat 1909*cdf0e10cSrcweir 1910*cdf0e10cSrcweir sal_Bool bGrabFocus = sal_False; 1911*cdf0e10cSrcweir if (aViewData.IsActive()) 1912*cdf0e10cSrcweir { 1913*cdf0e10cSrcweir ScInputHandler* pInputHdl = SC_MOD()->GetInputHdl(); 1914*cdf0e10cSrcweir if ( pInputHdl ) 1915*cdf0e10cSrcweir { 1916*cdf0e10cSrcweir ScInputWindow* pInputWin = pInputHdl->GetInputWindow(); 1917*cdf0e10cSrcweir if (pInputWin && pInputWin->IsInputActive()) 1918*cdf0e10cSrcweir bGrabFocus = sal_True; 1919*cdf0e10cSrcweir } 1920*cdf0e10cSrcweir } 1921*cdf0e10cSrcweir 1922*cdf0e10cSrcweir if (bGrabFocus) 1923*cdf0e10cSrcweir { 1924*cdf0e10cSrcweir // So soll es gemacht werden, damit der Sfx es mitbekommt, klappt aber nicht: 1925*cdf0e10cSrcweir //! aViewData.GetViewShell()->GetViewFrame()->GetWindow().GrabFocus(); 1926*cdf0e10cSrcweir // deshalb erstmal so: 1927*cdf0e10cSrcweir GetActiveWin()->GrabFocus(); 1928*cdf0e10cSrcweir } 1929*cdf0e10cSrcweir 1930*cdf0e10cSrcweir // Cursor-Abfrage erst nach GrabFocus 1931*cdf0e10cSrcweir 1932*cdf0e10cSrcweir for (i=0; i<4; i++) 1933*cdf0e10cSrcweir if (pGridWin[i] && pGridWin[i]->IsVisible()) 1934*cdf0e10cSrcweir { 1935*cdf0e10cSrcweir Cursor* pCur = pGridWin[i]->GetCursor(); 1936*cdf0e10cSrcweir if (pCur && pCur->IsVisible()) 1937*cdf0e10cSrcweir pCur->Hide(); 1938*cdf0e10cSrcweir 1939*cdf0e10cSrcweir if(bPaint[i]) 1940*cdf0e10cSrcweir { 1941*cdf0e10cSrcweir pGridWin[i]->UpdateCursorOverlay(); 1942*cdf0e10cSrcweir pGridWin[i]->UpdateAutoFillOverlay(); 1943*cdf0e10cSrcweir // pGridWin[i]->UpdateAllOverlays(); 1944*cdf0e10cSrcweir } 1945*cdf0e10cSrcweir } 1946*cdf0e10cSrcweir } 1947*cdf0e10cSrcweir 1948*cdf0e10cSrcweir void ScTabView::UpdateFormulas() 1949*cdf0e10cSrcweir { 1950*cdf0e10cSrcweir if ( aViewData.GetDocument()->IsAutoCalcShellDisabled() ) 1951*cdf0e10cSrcweir return ; 1952*cdf0e10cSrcweir 1953*cdf0e10cSrcweir sal_uInt16 i; 1954*cdf0e10cSrcweir for (i=0; i<4; i++) 1955*cdf0e10cSrcweir if (pGridWin[i]) 1956*cdf0e10cSrcweir if (pGridWin[i]->IsVisible()) 1957*cdf0e10cSrcweir pGridWin[i]->UpdateFormulas(); 1958*cdf0e10cSrcweir 1959*cdf0e10cSrcweir if ( aViewData.IsPagebreakMode() ) 1960*cdf0e10cSrcweir UpdatePageBreakData(); //! asynchron 1961*cdf0e10cSrcweir 1962*cdf0e10cSrcweir UpdateHeaderWidth(); 1963*cdf0e10cSrcweir 1964*cdf0e10cSrcweir // if in edit mode, adjust edit view area because widths/heights may have changed 1965*cdf0e10cSrcweir if ( aViewData.HasEditView( aViewData.GetActivePart() ) ) 1966*cdf0e10cSrcweir UpdateEditView(); 1967*cdf0e10cSrcweir } 1968*cdf0e10cSrcweir 1969*cdf0e10cSrcweir // PaintArea -Block neu zeichnen 1970*cdf0e10cSrcweir 1971*cdf0e10cSrcweir void ScTabView::PaintArea( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, 1972*cdf0e10cSrcweir ScUpdateMode eMode ) 1973*cdf0e10cSrcweir { 1974*cdf0e10cSrcweir sal_uInt16 i; 1975*cdf0e10cSrcweir SCCOL nCol1; 1976*cdf0e10cSrcweir SCROW nRow1; 1977*cdf0e10cSrcweir SCCOL nCol2; 1978*cdf0e10cSrcweir SCROW nRow2; 1979*cdf0e10cSrcweir 1980*cdf0e10cSrcweir PutInOrder( nStartCol, nEndCol ); 1981*cdf0e10cSrcweir PutInOrder( nStartRow, nEndRow ); 1982*cdf0e10cSrcweir 1983*cdf0e10cSrcweir for (i=0; i<4; i++) 1984*cdf0e10cSrcweir if (pGridWin[i]) 1985*cdf0e10cSrcweir if (pGridWin[i]->IsVisible()) 1986*cdf0e10cSrcweir { 1987*cdf0e10cSrcweir ScHSplitPos eHWhich = WhichH( (ScSplitPos) i ); 1988*cdf0e10cSrcweir ScVSplitPos eVWhich = WhichV( (ScSplitPos) i ); 1989*cdf0e10cSrcweir sal_Bool bOut = sal_False; 1990*cdf0e10cSrcweir 1991*cdf0e10cSrcweir nCol1 = nStartCol; 1992*cdf0e10cSrcweir nRow1 = nStartRow; 1993*cdf0e10cSrcweir nCol2 = nEndCol; 1994*cdf0e10cSrcweir nRow2 = nEndRow; 1995*cdf0e10cSrcweir 1996*cdf0e10cSrcweir SCCOL nScrX = aViewData.GetPosX( eHWhich ); 1997*cdf0e10cSrcweir SCROW nScrY = aViewData.GetPosY( eVWhich ); 1998*cdf0e10cSrcweir if (nCol1 < nScrX) nCol1 = nScrX; 1999*cdf0e10cSrcweir if (nCol2 < nScrX) 2000*cdf0e10cSrcweir { 2001*cdf0e10cSrcweir if ( eMode == SC_UPDATE_ALL ) // #91240# for UPDATE_ALL, paint anyway 2002*cdf0e10cSrcweir nCol2 = nScrX; // (because of extending strings to the right) 2003*cdf0e10cSrcweir else 2004*cdf0e10cSrcweir bOut = sal_True; // completely outside the window 2005*cdf0e10cSrcweir } 2006*cdf0e10cSrcweir if (nRow1 < nScrY) nRow1 = nScrY; 2007*cdf0e10cSrcweir if (nRow2 < nScrY) bOut = sal_True; 2008*cdf0e10cSrcweir 2009*cdf0e10cSrcweir SCCOL nLastX = nScrX + aViewData.VisibleCellsX( eHWhich ) + 1; 2010*cdf0e10cSrcweir SCROW nLastY = nScrY + aViewData.VisibleCellsY( eVWhich ) + 1; 2011*cdf0e10cSrcweir if (nCol1 > nLastX) bOut = sal_True; 2012*cdf0e10cSrcweir if (nCol2 > nLastX) nCol2 = nLastX; 2013*cdf0e10cSrcweir if (nRow1 > nLastY) bOut = sal_True; 2014*cdf0e10cSrcweir if (nRow2 > nLastY) nRow2 = nLastY; 2015*cdf0e10cSrcweir 2016*cdf0e10cSrcweir if (!bOut) 2017*cdf0e10cSrcweir { 2018*cdf0e10cSrcweir if ( eMode == SC_UPDATE_CHANGED ) 2019*cdf0e10cSrcweir pGridWin[i]->Draw( nCol1, nRow1, nCol2, nRow2, eMode ); 2020*cdf0e10cSrcweir else // ALL oder MARKS 2021*cdf0e10cSrcweir { 2022*cdf0e10cSrcweir sal_Bool bLayoutRTL = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() ); 2023*cdf0e10cSrcweir long nLayoutSign = bLayoutRTL ? -1 : 1; 2024*cdf0e10cSrcweir 2025*cdf0e10cSrcweir Point aStart = aViewData.GetScrPos( nCol1, nRow1, (ScSplitPos) i ); 2026*cdf0e10cSrcweir Point aEnd = aViewData.GetScrPos( nCol2+1, nRow2+1, (ScSplitPos) i ); 2027*cdf0e10cSrcweir if ( eMode == SC_UPDATE_ALL ) 2028*cdf0e10cSrcweir aEnd.X() = bLayoutRTL ? 0 : (pGridWin[i]->GetOutputSizePixel().Width()); 2029*cdf0e10cSrcweir aEnd.X() -= nLayoutSign; 2030*cdf0e10cSrcweir aEnd.Y() -= 1; 2031*cdf0e10cSrcweir 2032*cdf0e10cSrcweir // #i85232# include area below cells (could be done in GetScrPos?) 2033*cdf0e10cSrcweir if ( eMode == SC_UPDATE_ALL && nRow2 >= MAXROW ) 2034*cdf0e10cSrcweir aEnd.Y() = pGridWin[i]->GetOutputSizePixel().Height(); 2035*cdf0e10cSrcweir 2036*cdf0e10cSrcweir sal_Bool bShowChanges = sal_True; //! ... 2037*cdf0e10cSrcweir if (bShowChanges) 2038*cdf0e10cSrcweir { 2039*cdf0e10cSrcweir aStart.X() -= nLayoutSign; // include change marks 2040*cdf0e10cSrcweir aStart.Y() -= 1; 2041*cdf0e10cSrcweir } 2042*cdf0e10cSrcweir 2043*cdf0e10cSrcweir sal_Bool bMarkClipped = aViewData.GetOptions().GetOption( VOPT_CLIPMARKS ); 2044*cdf0e10cSrcweir if (bMarkClipped) 2045*cdf0e10cSrcweir { 2046*cdf0e10cSrcweir // dazu muesste ScColumn::IsEmptyBlock optimiert werden 2047*cdf0e10cSrcweir // (auf Search() umstellen) 2048*cdf0e10cSrcweir //!if ( nCol1 > 0 && !aViewData.GetDocument()->IsBlockEmpty( 2049*cdf0e10cSrcweir //! aViewData.GetTabNo(), 2050*cdf0e10cSrcweir //! 0, nRow1, nCol1-1, nRow2 ) ) 2051*cdf0e10cSrcweir { 2052*cdf0e10cSrcweir long nMarkPixel = (long)( SC_CLIPMARK_SIZE * aViewData.GetPPTX() ); 2053*cdf0e10cSrcweir aStart.X() -= nMarkPixel * nLayoutSign; 2054*cdf0e10cSrcweir if (!bShowChanges) 2055*cdf0e10cSrcweir aStart.X() -= nLayoutSign; // cell grid 2056*cdf0e10cSrcweir } 2057*cdf0e10cSrcweir } 2058*cdf0e10cSrcweir 2059*cdf0e10cSrcweir pGridWin[i]->Invalidate( pGridWin[i]->PixelToLogic( Rectangle( aStart,aEnd ) ) ); 2060*cdf0e10cSrcweir } 2061*cdf0e10cSrcweir } 2062*cdf0e10cSrcweir } 2063*cdf0e10cSrcweir 2064*cdf0e10cSrcweir // #i79909# Calling UpdateAllOverlays here isn't necessary and would lead to overlay calls from a timer, 2065*cdf0e10cSrcweir // with a wrong MapMode if editing in a cell (reference input). 2066*cdf0e10cSrcweir // #i80499# Overlays need updates in a lot of cases, e.g. changing row/column size, 2067*cdf0e10cSrcweir // or showing/hiding outlines. TODO: selections in inactive windows are vanishing. 2068*cdf0e10cSrcweir // #i84689# With relative conditional formats, PaintArea may be called often (for each changed cell), 2069*cdf0e10cSrcweir // so UpdateAllOverlays was moved to ScTabViewShell::Notify and is called only if PAINT_LEFT/PAINT_TOP 2070*cdf0e10cSrcweir // is set (width or height changed). 2071*cdf0e10cSrcweir } 2072*cdf0e10cSrcweir 2073*cdf0e10cSrcweir void ScTabView::PaintRangeFinder( long nNumber ) 2074*cdf0e10cSrcweir { 2075*cdf0e10cSrcweir ScInputHandler* pHdl = SC_MOD()->GetInputHdl( aViewData.GetViewShell() ); 2076*cdf0e10cSrcweir if (pHdl) 2077*cdf0e10cSrcweir { 2078*cdf0e10cSrcweir ScRangeFindList* pRangeFinder = pHdl->GetRangeFindList(); 2079*cdf0e10cSrcweir if ( pRangeFinder && pRangeFinder->GetDocName() == aViewData.GetDocShell()->GetTitle() ) 2080*cdf0e10cSrcweir { 2081*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 2082*cdf0e10cSrcweir sal_uInt16 nCount = (sal_uInt16)pRangeFinder->Count(); 2083*cdf0e10cSrcweir for (sal_uInt16 i=0; i<nCount; i++) 2084*cdf0e10cSrcweir if ( nNumber < 0 || nNumber == i ) 2085*cdf0e10cSrcweir { 2086*cdf0e10cSrcweir ScRangeFindData* pData = pRangeFinder->GetObject(i); 2087*cdf0e10cSrcweir if (pData) 2088*cdf0e10cSrcweir { 2089*cdf0e10cSrcweir ScRange aRef = pData->aRef; 2090*cdf0e10cSrcweir aRef.Justify(); // Justify fuer die Abfragen unten 2091*cdf0e10cSrcweir 2092*cdf0e10cSrcweir if ( aRef.aStart == aRef.aEnd ) //! Tab ignorieren? 2093*cdf0e10cSrcweir aViewData.GetDocument()->ExtendMerge(aRef); 2094*cdf0e10cSrcweir 2095*cdf0e10cSrcweir if ( aRef.aStart.Tab() >= nTab && aRef.aEnd.Tab() <= nTab ) 2096*cdf0e10cSrcweir { 2097*cdf0e10cSrcweir SCCOL nCol1 = aRef.aStart.Col(); 2098*cdf0e10cSrcweir SCROW nRow1 = aRef.aStart.Row(); 2099*cdf0e10cSrcweir SCCOL nCol2 = aRef.aEnd.Col(); 2100*cdf0e10cSrcweir SCROW nRow2 = aRef.aEnd.Row(); 2101*cdf0e10cSrcweir 2102*cdf0e10cSrcweir // wegnehmen -> Repaint 2103*cdf0e10cSrcweir // SC_UPDATE_MARKS: Invalidate, nicht bis zum Zeilenende 2104*cdf0e10cSrcweir 2105*cdf0e10cSrcweir sal_Bool bHiddenEdge = sal_False; 2106*cdf0e10cSrcweir SCROW nTmp; 2107*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 2108*cdf0e10cSrcweir SCCOL nLastCol = -1; 2109*cdf0e10cSrcweir while ( nCol1 > 0 && pDoc->ColHidden(nCol1, nTab, nLastCol) ) 2110*cdf0e10cSrcweir { 2111*cdf0e10cSrcweir --nCol1; 2112*cdf0e10cSrcweir bHiddenEdge = sal_True; 2113*cdf0e10cSrcweir } 2114*cdf0e10cSrcweir while ( nCol2 < MAXCOL && pDoc->ColHidden(nCol2, nTab, nLastCol) ) 2115*cdf0e10cSrcweir { 2116*cdf0e10cSrcweir ++nCol2; 2117*cdf0e10cSrcweir bHiddenEdge = sal_True; 2118*cdf0e10cSrcweir } 2119*cdf0e10cSrcweir nTmp = pDoc->LastVisibleRow(0, nRow1, nTab); 2120*cdf0e10cSrcweir if (!ValidRow(nTmp)) 2121*cdf0e10cSrcweir nTmp = 0; 2122*cdf0e10cSrcweir if (nTmp < nRow1) 2123*cdf0e10cSrcweir { 2124*cdf0e10cSrcweir nRow1 = nTmp; 2125*cdf0e10cSrcweir bHiddenEdge = sal_True; 2126*cdf0e10cSrcweir } 2127*cdf0e10cSrcweir nTmp = pDoc->FirstVisibleRow(nRow2, MAXROW, nTab); 2128*cdf0e10cSrcweir if (!ValidRow(nTmp)) 2129*cdf0e10cSrcweir nTmp = MAXROW; 2130*cdf0e10cSrcweir if (nTmp > nRow2) 2131*cdf0e10cSrcweir { 2132*cdf0e10cSrcweir nRow2 = nTmp; 2133*cdf0e10cSrcweir bHiddenEdge = sal_True; 2134*cdf0e10cSrcweir } 2135*cdf0e10cSrcweir 2136*cdf0e10cSrcweir if ( nCol2 - nCol1 > 1 && nRow2 - nRow1 > 1 && !bHiddenEdge ) 2137*cdf0e10cSrcweir { 2138*cdf0e10cSrcweir // nur an den Raendern entlang 2139*cdf0e10cSrcweir PaintArea( nCol1, nRow1, nCol2, nRow1, SC_UPDATE_MARKS ); 2140*cdf0e10cSrcweir PaintArea( nCol1, nRow1+1, nCol1, nRow2-1, SC_UPDATE_MARKS ); 2141*cdf0e10cSrcweir PaintArea( nCol2, nRow1+1, nCol2, nRow2-1, SC_UPDATE_MARKS ); 2142*cdf0e10cSrcweir PaintArea( nCol1, nRow2, nCol2, nRow2, SC_UPDATE_MARKS ); 2143*cdf0e10cSrcweir } 2144*cdf0e10cSrcweir else // alles am Stueck 2145*cdf0e10cSrcweir PaintArea( nCol1, nRow1, nCol2, nRow2, SC_UPDATE_MARKS ); 2146*cdf0e10cSrcweir } 2147*cdf0e10cSrcweir } 2148*cdf0e10cSrcweir } 2149*cdf0e10cSrcweir } 2150*cdf0e10cSrcweir } 2151*cdf0e10cSrcweir } 2152*cdf0e10cSrcweir 2153*cdf0e10cSrcweir // fuer Chart-Daten-Markierung 2154*cdf0e10cSrcweir 2155*cdf0e10cSrcweir void ScTabView::AddHighlightRange( const ScRange& rRange, const Color& rColor ) 2156*cdf0e10cSrcweir { 2157*cdf0e10cSrcweir if (!pHighlightRanges) 2158*cdf0e10cSrcweir pHighlightRanges = new ScHighlightRanges; 2159*cdf0e10cSrcweir pHighlightRanges->Insert( new ScHighlightEntry( rRange, rColor ) ); 2160*cdf0e10cSrcweir 2161*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 2162*cdf0e10cSrcweir if ( nTab >= rRange.aStart.Tab() && nTab <= rRange.aEnd.Tab() ) 2163*cdf0e10cSrcweir PaintArea( rRange.aStart.Col(), rRange.aStart.Row(), 2164*cdf0e10cSrcweir rRange.aEnd.Col(), rRange.aEnd.Row(), SC_UPDATE_MARKS ); 2165*cdf0e10cSrcweir } 2166*cdf0e10cSrcweir 2167*cdf0e10cSrcweir void ScTabView::ClearHighlightRanges() 2168*cdf0e10cSrcweir { 2169*cdf0e10cSrcweir if (pHighlightRanges) 2170*cdf0e10cSrcweir { 2171*cdf0e10cSrcweir ScHighlightRanges* pTemp = pHighlightRanges; 2172*cdf0e10cSrcweir pHighlightRanges = NULL; // Repaint ohne Highlight 2173*cdf0e10cSrcweir 2174*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 2175*cdf0e10cSrcweir sal_uLong nCount = pTemp->Count(); 2176*cdf0e10cSrcweir for (sal_uLong i=0; i<nCount; i++) 2177*cdf0e10cSrcweir { 2178*cdf0e10cSrcweir ScHighlightEntry* pEntry = pTemp->GetObject( i ); 2179*cdf0e10cSrcweir if (pEntry) 2180*cdf0e10cSrcweir { 2181*cdf0e10cSrcweir ScRange aRange = pEntry->aRef; 2182*cdf0e10cSrcweir if ( nTab >= aRange.aStart.Tab() && nTab <= aRange.aEnd.Tab() ) 2183*cdf0e10cSrcweir PaintArea( aRange.aStart.Col(), aRange.aStart.Row(), 2184*cdf0e10cSrcweir aRange.aEnd.Col(), aRange.aEnd.Row(), SC_UPDATE_MARKS ); 2185*cdf0e10cSrcweir } 2186*cdf0e10cSrcweir } 2187*cdf0e10cSrcweir delete pTemp; 2188*cdf0e10cSrcweir } 2189*cdf0e10cSrcweir } 2190*cdf0e10cSrcweir 2191*cdf0e10cSrcweir void ScTabView::DoChartSelection( 2192*cdf0e10cSrcweir const uno::Sequence< chart2::data::HighlightedRange > & rHilightRanges ) 2193*cdf0e10cSrcweir { 2194*cdf0e10cSrcweir ClearHighlightRanges(); 2195*cdf0e10cSrcweir 2196*cdf0e10cSrcweir for( sal_Int32 i=0; i<rHilightRanges.getLength(); ++i ) 2197*cdf0e10cSrcweir { 2198*cdf0e10cSrcweir Color aSelColor( rHilightRanges[i].PreferredColor ); 2199*cdf0e10cSrcweir ScRangeList aRangeList; 2200*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocShell()->GetDocument(); 2201*cdf0e10cSrcweir if( ScRangeStringConverter::GetRangeListFromString( 2202*cdf0e10cSrcweir aRangeList, rHilightRanges[i].RangeRepresentation, pDoc, pDoc->GetAddressConvention(), ';' )) 2203*cdf0e10cSrcweir { 2204*cdf0e10cSrcweir for ( ScRangePtr p = aRangeList.First(); p; p = aRangeList.Next()) 2205*cdf0e10cSrcweir { 2206*cdf0e10cSrcweir if( rHilightRanges[i].Index == - 1 ) 2207*cdf0e10cSrcweir AddHighlightRange( *p, aSelColor ); 2208*cdf0e10cSrcweir else 2209*cdf0e10cSrcweir AddHighlightRange( lcl_getSubRangeByIndex( *p, rHilightRanges[i].Index ), aSelColor ); 2210*cdf0e10cSrcweir } 2211*cdf0e10cSrcweir } 2212*cdf0e10cSrcweir } 2213*cdf0e10cSrcweir } 2214*cdf0e10cSrcweir 2215*cdf0e10cSrcweir // DrawDragRect - Drag&Drop-Rechteck zeichnen (XOR) 2216*cdf0e10cSrcweir 2217*cdf0e10cSrcweir //UNUSED2008-05 void ScTabView::DrawDragRect( SCCOL nStartX, SCROW nStartY, SCCOL nEndX, SCROW nEndY, 2218*cdf0e10cSrcweir //UNUSED2008-05 ScSplitPos ePos ) 2219*cdf0e10cSrcweir //UNUSED2008-05 { 2220*cdf0e10cSrcweir //UNUSED2008-05 if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX || aViewData.GetVSplitMode() == SC_SPLIT_FIX ) 2221*cdf0e10cSrcweir //UNUSED2008-05 { 2222*cdf0e10cSrcweir //UNUSED2008-05 for (sal_uInt16 i=0; i<4; i++) 2223*cdf0e10cSrcweir //UNUSED2008-05 if (pGridWin[i]) 2224*cdf0e10cSrcweir //UNUSED2008-05 if (pGridWin[i]->IsVisible()) 2225*cdf0e10cSrcweir //UNUSED2008-05 pGridWin[i]->DrawDragRect( nStartX, nStartY, nEndX, nEndY ); 2226*cdf0e10cSrcweir //UNUSED2008-05 } 2227*cdf0e10cSrcweir //UNUSED2008-05 else 2228*cdf0e10cSrcweir //UNUSED2008-05 pGridWin[ePos]->DrawDragRect( nStartX, nStartY, nEndX, nEndY ); 2229*cdf0e10cSrcweir //UNUSED2008-05 } 2230*cdf0e10cSrcweir //UNUSED2008-05 2231*cdf0e10cSrcweir //UNUSED2008-05 // PaintCell - einzelne Zelle neu zeichnen 2232*cdf0e10cSrcweir //UNUSED2008-05 2233*cdf0e10cSrcweir //UNUSED2008-05 void ScTabView::PaintCell( SCCOL nCol, SCROW nRow, SCTAB nTab ) 2234*cdf0e10cSrcweir //UNUSED2008-05 { 2235*cdf0e10cSrcweir //UNUSED2008-05 if ( aViewData.GetTabNo() == nTab ) 2236*cdf0e10cSrcweir //UNUSED2008-05 { 2237*cdf0e10cSrcweir //UNUSED2008-05 sal_uInt16 i; 2238*cdf0e10cSrcweir //UNUSED2008-05 for (i=0; i<4; i++) 2239*cdf0e10cSrcweir //UNUSED2008-05 if (pGridWin[i]) 2240*cdf0e10cSrcweir //UNUSED2008-05 if (pGridWin[i]->IsVisible()) 2241*cdf0e10cSrcweir //UNUSED2008-05 pGridWin[i]->Draw( nCol, nRow, nCol, nRow ); 2242*cdf0e10cSrcweir //UNUSED2008-05 } 2243*cdf0e10cSrcweir //UNUSED2008-05 } 2244*cdf0e10cSrcweir //UNUSED2008-05 2245*cdf0e10cSrcweir //UNUSED2008-05 void ScTabView::PaintLeftRow( SCROW nRow ) 2246*cdf0e10cSrcweir //UNUSED2008-05 { 2247*cdf0e10cSrcweir //UNUSED2008-05 PaintLeftArea( nRow, nRow ); 2248*cdf0e10cSrcweir //UNUSED2008-05 } 2249*cdf0e10cSrcweir //UNUSED2008-05 2250*cdf0e10cSrcweir //UNUSED2008-05 void ScTabView::PaintTopCol( SCCOL nCol ) 2251*cdf0e10cSrcweir //UNUSED2008-05 { 2252*cdf0e10cSrcweir //UNUSED2008-05 PaintTopArea( nCol, nCol ); 2253*cdf0e10cSrcweir //UNUSED2008-05 } 2254*cdf0e10cSrcweir 2255*cdf0e10cSrcweir // PaintGrid - Datenbereiche neu zeichnen 2256*cdf0e10cSrcweir 2257*cdf0e10cSrcweir void ScTabView::PaintGrid() 2258*cdf0e10cSrcweir { 2259*cdf0e10cSrcweir sal_uInt16 i; 2260*cdf0e10cSrcweir for (i=0; i<4; i++) 2261*cdf0e10cSrcweir if (pGridWin[i]) 2262*cdf0e10cSrcweir if (pGridWin[i]->IsVisible()) 2263*cdf0e10cSrcweir pGridWin[i]->Invalidate(); 2264*cdf0e10cSrcweir } 2265*cdf0e10cSrcweir 2266*cdf0e10cSrcweir // PaintTop - obere Kontrollelemente neu zeichnen 2267*cdf0e10cSrcweir 2268*cdf0e10cSrcweir void ScTabView::PaintTop() 2269*cdf0e10cSrcweir { 2270*cdf0e10cSrcweir sal_uInt16 i; 2271*cdf0e10cSrcweir for (i=0; i<2; i++) 2272*cdf0e10cSrcweir { 2273*cdf0e10cSrcweir if (pColBar[i]) 2274*cdf0e10cSrcweir pColBar[i]->Invalidate(); 2275*cdf0e10cSrcweir if (pColOutline[i]) 2276*cdf0e10cSrcweir pColOutline[i]->Invalidate(); 2277*cdf0e10cSrcweir } 2278*cdf0e10cSrcweir } 2279*cdf0e10cSrcweir 2280*cdf0e10cSrcweir void ScTabView::CreateAnchorHandles(SdrHdlList& rHdl, const ScAddress& rAddress) 2281*cdf0e10cSrcweir { 2282*cdf0e10cSrcweir sal_uInt16 i; 2283*cdf0e10cSrcweir 2284*cdf0e10cSrcweir for(i=0; i<4; i++) 2285*cdf0e10cSrcweir { 2286*cdf0e10cSrcweir if(pGridWin[i]) 2287*cdf0e10cSrcweir { 2288*cdf0e10cSrcweir if(pGridWin[i]->IsVisible()) 2289*cdf0e10cSrcweir { 2290*cdf0e10cSrcweir pGridWin[i]->CreateAnchorHandle(rHdl, rAddress); 2291*cdf0e10cSrcweir } 2292*cdf0e10cSrcweir } 2293*cdf0e10cSrcweir } 2294*cdf0e10cSrcweir } 2295*cdf0e10cSrcweir 2296*cdf0e10cSrcweir void ScTabView::PaintTopArea( SCCOL nStartCol, SCCOL nEndCol ) 2297*cdf0e10cSrcweir { 2298*cdf0e10cSrcweir // Pixel-Position der linken Kante 2299*cdf0e10cSrcweir 2300*cdf0e10cSrcweir if ( nStartCol < aViewData.GetPosX(SC_SPLIT_LEFT) || 2301*cdf0e10cSrcweir nStartCol < aViewData.GetPosX(SC_SPLIT_RIGHT) ) 2302*cdf0e10cSrcweir aViewData.RecalcPixPos(); 2303*cdf0e10cSrcweir 2304*cdf0e10cSrcweir // Fixierung anpassen (UpdateFixX setzt HSplitPos neu) 2305*cdf0e10cSrcweir 2306*cdf0e10cSrcweir if ( aViewData.GetHSplitMode() == SC_SPLIT_FIX && nStartCol < aViewData.GetFixPosX() ) 2307*cdf0e10cSrcweir if (aViewData.UpdateFixX()) 2308*cdf0e10cSrcweir RepeatResize(); 2309*cdf0e10cSrcweir 2310*cdf0e10cSrcweir // zeichnen 2311*cdf0e10cSrcweir 2312*cdf0e10cSrcweir if (nStartCol>0) 2313*cdf0e10cSrcweir --nStartCol; //! allgemeiner ? 2314*cdf0e10cSrcweir 2315*cdf0e10cSrcweir sal_Bool bLayoutRTL = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() ); 2316*cdf0e10cSrcweir long nLayoutSign = bLayoutRTL ? -1 : 1; 2317*cdf0e10cSrcweir 2318*cdf0e10cSrcweir for (sal_uInt16 i=0; i<2; i++) 2319*cdf0e10cSrcweir { 2320*cdf0e10cSrcweir ScHSplitPos eWhich = (ScHSplitPos) i; 2321*cdf0e10cSrcweir if (pColBar[eWhich]) 2322*cdf0e10cSrcweir { 2323*cdf0e10cSrcweir Size aWinSize = pColBar[eWhich]->GetSizePixel(); 2324*cdf0e10cSrcweir long nStartX = aViewData.GetScrPos( nStartCol, 0, eWhich ).X(); 2325*cdf0e10cSrcweir long nEndX; 2326*cdf0e10cSrcweir if (nEndCol >= MAXCOL) 2327*cdf0e10cSrcweir nEndX = bLayoutRTL ? 0 : ( aWinSize.Width()-1 ); 2328*cdf0e10cSrcweir else 2329*cdf0e10cSrcweir nEndX = aViewData.GetScrPos( nEndCol+1, 0, eWhich ).X() - nLayoutSign; 2330*cdf0e10cSrcweir pColBar[eWhich]->Invalidate( 2331*cdf0e10cSrcweir Rectangle( nStartX, 0, nEndX, aWinSize.Height()-1 ) ); 2332*cdf0e10cSrcweir } 2333*cdf0e10cSrcweir if (pColOutline[eWhich]) 2334*cdf0e10cSrcweir pColOutline[eWhich]->Invalidate(); 2335*cdf0e10cSrcweir } 2336*cdf0e10cSrcweir } 2337*cdf0e10cSrcweir 2338*cdf0e10cSrcweir 2339*cdf0e10cSrcweir // PaintLeft - linke Kontrollelemente neu zeichnen 2340*cdf0e10cSrcweir 2341*cdf0e10cSrcweir void ScTabView::PaintLeft() 2342*cdf0e10cSrcweir { 2343*cdf0e10cSrcweir sal_uInt16 i; 2344*cdf0e10cSrcweir for (i=0; i<2; i++) 2345*cdf0e10cSrcweir { 2346*cdf0e10cSrcweir if (pRowBar[i]) 2347*cdf0e10cSrcweir pRowBar[i]->Invalidate(); 2348*cdf0e10cSrcweir if (pRowOutline[i]) 2349*cdf0e10cSrcweir pRowOutline[i]->Invalidate(); 2350*cdf0e10cSrcweir } 2351*cdf0e10cSrcweir } 2352*cdf0e10cSrcweir 2353*cdf0e10cSrcweir void ScTabView::PaintLeftArea( SCROW nStartRow, SCROW nEndRow ) 2354*cdf0e10cSrcweir { 2355*cdf0e10cSrcweir // Pixel-Position der oberen Kante 2356*cdf0e10cSrcweir 2357*cdf0e10cSrcweir if ( nStartRow < aViewData.GetPosY(SC_SPLIT_TOP) || 2358*cdf0e10cSrcweir nStartRow < aViewData.GetPosY(SC_SPLIT_BOTTOM) ) 2359*cdf0e10cSrcweir aViewData.RecalcPixPos(); 2360*cdf0e10cSrcweir 2361*cdf0e10cSrcweir // Fixierung anpassen (UpdateFixY setzt VSplitPos neu) 2362*cdf0e10cSrcweir 2363*cdf0e10cSrcweir if ( aViewData.GetVSplitMode() == SC_SPLIT_FIX && nStartRow < aViewData.GetFixPosY() ) 2364*cdf0e10cSrcweir if (aViewData.UpdateFixY()) 2365*cdf0e10cSrcweir RepeatResize(); 2366*cdf0e10cSrcweir 2367*cdf0e10cSrcweir // zeichnen 2368*cdf0e10cSrcweir 2369*cdf0e10cSrcweir if (nStartRow>0) 2370*cdf0e10cSrcweir --nStartRow; 2371*cdf0e10cSrcweir 2372*cdf0e10cSrcweir for (sal_uInt16 i=0; i<2; i++) 2373*cdf0e10cSrcweir { 2374*cdf0e10cSrcweir ScVSplitPos eWhich = (ScVSplitPos) i; 2375*cdf0e10cSrcweir if (pRowBar[eWhich]) 2376*cdf0e10cSrcweir { 2377*cdf0e10cSrcweir Size aWinSize = pRowBar[eWhich]->GetSizePixel(); 2378*cdf0e10cSrcweir long nStartY = aViewData.GetScrPos( 0, nStartRow, eWhich ).Y(); 2379*cdf0e10cSrcweir long nEndY; 2380*cdf0e10cSrcweir if (nEndRow >= MAXROW) 2381*cdf0e10cSrcweir nEndY = aWinSize.Height()-1; 2382*cdf0e10cSrcweir else 2383*cdf0e10cSrcweir nEndY = aViewData.GetScrPos( 0, nEndRow+1, eWhich ).Y() - 1; 2384*cdf0e10cSrcweir pRowBar[eWhich]->Invalidate( 2385*cdf0e10cSrcweir Rectangle( 0, nStartY, aWinSize.Width()-1, nEndY ) ); 2386*cdf0e10cSrcweir } 2387*cdf0e10cSrcweir if (pRowOutline[eWhich]) 2388*cdf0e10cSrcweir pRowOutline[eWhich]->Invalidate(); 2389*cdf0e10cSrcweir } 2390*cdf0e10cSrcweir } 2391*cdf0e10cSrcweir 2392*cdf0e10cSrcweir // InvertBlockMark - Block invertieren 2393*cdf0e10cSrcweir 2394*cdf0e10cSrcweir void ScTabView::InvertBlockMark(SCCOL nStartX, SCROW nStartY, 2395*cdf0e10cSrcweir SCCOL nEndX, SCROW nEndY) 2396*cdf0e10cSrcweir { 2397*cdf0e10cSrcweir if ( !aViewData.IsActive() ) 2398*cdf0e10cSrcweir return; // invertiert wird nur auf aktiver View 2399*cdf0e10cSrcweir 2400*cdf0e10cSrcweir PutInOrder( nStartX, nEndX ); 2401*cdf0e10cSrcweir PutInOrder( nStartY, nEndY ); 2402*cdf0e10cSrcweir 2403*cdf0e10cSrcweir ScMarkData& rMark = aViewData.GetMarkData(); 2404*cdf0e10cSrcweir ScDocShell* pDocSh = aViewData.GetDocShell(); 2405*cdf0e10cSrcweir ScDocument* pDoc = pDocSh->GetDocument(); 2406*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 2407*cdf0e10cSrcweir 2408*cdf0e10cSrcweir if ( pDocSh->GetLockCount() ) 2409*cdf0e10cSrcweir { 2410*cdf0e10cSrcweir // if paint is locked, avoid repeated inverting 2411*cdf0e10cSrcweir // add repaint areas to paint lock data instead 2412*cdf0e10cSrcweir pDocSh->PostPaint( nStartX,nStartY,nTab, nEndX,nEndY,nTab, PAINT_GRID ); 2413*cdf0e10cSrcweir return; 2414*cdf0e10cSrcweir } 2415*cdf0e10cSrcweir 2416*cdf0e10cSrcweir sal_Bool bSingle = rMark.IsMultiMarked(); 2417*cdf0e10cSrcweir sal_Bool bMerge = pDoc->HasAttrib( nStartX, nStartY, nTab, nEndX, nEndY, nTab, 2418*cdf0e10cSrcweir HASATTR_MERGED | HASATTR_OVERLAPPED ); 2419*cdf0e10cSrcweir 2420*cdf0e10cSrcweir sal_uInt16 i; 2421*cdf0e10cSrcweir if ( bMerge || bSingle ) 2422*cdf0e10cSrcweir { 2423*cdf0e10cSrcweir for (i=0; i<4; i++) 2424*cdf0e10cSrcweir if (pGridWin[i]) 2425*cdf0e10cSrcweir if (pGridWin[i]->IsVisible()) 2426*cdf0e10cSrcweir pGridWin[i]->InvertSimple( nStartX, nStartY, nEndX, nEndY, 2427*cdf0e10cSrcweir bMerge, bBlockNeg ); 2428*cdf0e10cSrcweir } 2429*cdf0e10cSrcweir else 2430*cdf0e10cSrcweir { 2431*cdf0e10cSrcweir for (i=0; i<4; i++) 2432*cdf0e10cSrcweir if (pGridWin[i]) 2433*cdf0e10cSrcweir if (pGridWin[i]->IsVisible()) 2434*cdf0e10cSrcweir { 2435*cdf0e10cSrcweir ScSplitPos ePos = (ScSplitPos) i; 2436*cdf0e10cSrcweir Point aStartPoint = aViewData.GetScrPos( nStartX, nStartY, ePos ); 2437*cdf0e10cSrcweir Point aEndPoint = aViewData.GetScrPos( nEndX+1, nEndY+1, ePos ); 2438*cdf0e10cSrcweir if ( pDoc->IsLayoutRTL( nTab ) ) 2439*cdf0e10cSrcweir { 2440*cdf0e10cSrcweir long nTemp = aStartPoint.X(); 2441*cdf0e10cSrcweir aStartPoint.X() = aEndPoint.X() + 1; // +1 - excluding start of nEndX+1 2442*cdf0e10cSrcweir aEndPoint.X() = nTemp; 2443*cdf0e10cSrcweir } 2444*cdf0e10cSrcweir else 2445*cdf0e10cSrcweir aEndPoint.X() -= 1; 2446*cdf0e10cSrcweir aEndPoint.Y() -= 1; 2447*cdf0e10cSrcweir if ( aEndPoint.X() >= aStartPoint.X() && aEndPoint.Y() >= aStartPoint.Y() ) 2448*cdf0e10cSrcweir { 2449*cdf0e10cSrcweir MapMode aOld = pGridWin[ePos]->GetMapMode(); 2450*cdf0e10cSrcweir pGridWin[ePos]->SetMapMode(MAP_PIXEL); 2451*cdf0e10cSrcweir pGridWin[ePos]->Invert( Rectangle(aStartPoint,aEndPoint), INVERT_HIGHLIGHT ); 2452*cdf0e10cSrcweir pGridWin[ePos]->SetMapMode(aOld); 2453*cdf0e10cSrcweir pGridWin[ePos]->CheckInverted(); 2454*cdf0e10cSrcweir } 2455*cdf0e10cSrcweir } 2456*cdf0e10cSrcweir } 2457*cdf0e10cSrcweir 2458*cdf0e10cSrcweir // 2459*cdf0e10cSrcweir // wenn Controls betroffen, neu malen 2460*cdf0e10cSrcweir // 2461*cdf0e10cSrcweir 2462*cdf0e10cSrcweir sal_Bool bHide = sal_True; // wird Teil der Markierung aufgehoben ? 2463*cdf0e10cSrcweir if (rMark.IsMarked()) 2464*cdf0e10cSrcweir { 2465*cdf0e10cSrcweir ScRange aMarkRange; 2466*cdf0e10cSrcweir rMark.GetMarkArea( aMarkRange ); 2467*cdf0e10cSrcweir if ( aMarkRange.aStart.Col() <= nStartX && aMarkRange.aEnd.Col() >= nEndX && 2468*cdf0e10cSrcweir aMarkRange.aStart.Row() <= nStartY && aMarkRange.aEnd.Row() >= nEndY ) 2469*cdf0e10cSrcweir { 2470*cdf0e10cSrcweir bHide = sal_False; // der ganze Bereich ist markiert 2471*cdf0e10cSrcweir } 2472*cdf0e10cSrcweir } 2473*cdf0e10cSrcweir } 2474*cdf0e10cSrcweir 2475*cdf0e10cSrcweir sal_Bool ScTabView::PaintExtras() 2476*cdf0e10cSrcweir { 2477*cdf0e10cSrcweir sal_Bool bRet = sal_False; 2478*cdf0e10cSrcweir ScDocument* pDoc = aViewData.GetDocument(); 2479*cdf0e10cSrcweir SCTAB nTab = aViewData.GetTabNo(); 2480*cdf0e10cSrcweir if (!pDoc->HasTable(nTab)) // Tabelle geloescht ? 2481*cdf0e10cSrcweir { 2482*cdf0e10cSrcweir SCTAB nCount = pDoc->GetTableCount(); 2483*cdf0e10cSrcweir aViewData.SetTabNo(nCount-1); 2484*cdf0e10cSrcweir bRet = sal_True; 2485*cdf0e10cSrcweir } 2486*cdf0e10cSrcweir pTabControl->UpdateStatus(); // sal_True = active 2487*cdf0e10cSrcweir return bRet; 2488*cdf0e10cSrcweir } 2489*cdf0e10cSrcweir 2490*cdf0e10cSrcweir void ScTabView::RecalcPPT() 2491*cdf0e10cSrcweir { 2492*cdf0e10cSrcweir // called after changes that require the PPT values to be recalculated 2493*cdf0e10cSrcweir // (currently from detective operations) 2494*cdf0e10cSrcweir 2495*cdf0e10cSrcweir double nOldX = aViewData.GetPPTX(); 2496*cdf0e10cSrcweir double nOldY = aViewData.GetPPTY(); 2497*cdf0e10cSrcweir 2498*cdf0e10cSrcweir aViewData.RefreshZoom(); // pre-calculate new PPT values 2499*cdf0e10cSrcweir 2500*cdf0e10cSrcweir sal_Bool bChangedX = ( aViewData.GetPPTX() != nOldX ); 2501*cdf0e10cSrcweir sal_Bool bChangedY = ( aViewData.GetPPTY() != nOldY ); 2502*cdf0e10cSrcweir if ( bChangedX || bChangedY ) 2503*cdf0e10cSrcweir { 2504*cdf0e10cSrcweir // call view SetZoom (including draw scale, split update etc) 2505*cdf0e10cSrcweir // and paint only if values changed 2506*cdf0e10cSrcweir 2507*cdf0e10cSrcweir Fraction aZoomX = aViewData.GetZoomX(); 2508*cdf0e10cSrcweir Fraction aZoomY = aViewData.GetZoomY(); 2509*cdf0e10cSrcweir SetZoom( aZoomX, aZoomY, sal_False ); 2510*cdf0e10cSrcweir 2511*cdf0e10cSrcweir PaintGrid(); 2512*cdf0e10cSrcweir if (bChangedX) 2513*cdf0e10cSrcweir PaintTop(); 2514*cdf0e10cSrcweir if (bChangedY) 2515*cdf0e10cSrcweir PaintLeft(); 2516*cdf0e10cSrcweir } 2517*cdf0e10cSrcweir } 2518*cdf0e10cSrcweir 2519*cdf0e10cSrcweir void ScTabView::ActivateView( sal_Bool bActivate, sal_Bool bFirst ) 2520*cdf0e10cSrcweir { 2521*cdf0e10cSrcweir if ( bActivate == aViewData.IsActive() && !bFirst ) 2522*cdf0e10cSrcweir { 2523*cdf0e10cSrcweir // keine Assertion mehr - kommt vor, wenn vorher im Drag&Drop 2524*cdf0e10cSrcweir // auf ein anderes Dokument umgeschaltet wurde 2525*cdf0e10cSrcweir return; 2526*cdf0e10cSrcweir } 2527*cdf0e10cSrcweir 2528*cdf0e10cSrcweir // wird nur bei MDI-(De)Activate gerufen 2529*cdf0e10cSrcweir // aViewData.Activate hinten wegen Cursor-Show bei KillEditView 2530*cdf0e10cSrcweir // Markierung nicht mehr loeschen - wenn an der ViewData Activate(sal_False) gesetzt ist, 2531*cdf0e10cSrcweir // wird die Markierung nicht ausgegeben 2532*cdf0e10cSrcweir 2533*cdf0e10cSrcweir if (!bActivate) 2534*cdf0e10cSrcweir { 2535*cdf0e10cSrcweir ScModule* pScMod = SC_MOD(); 2536*cdf0e10cSrcweir sal_Bool bRefMode = pScMod->IsFormulaMode(); 2537*cdf0e10cSrcweir 2538*cdf0e10cSrcweir // Referenzeingabe nicht abbrechen, um Referenzen auf 2539*cdf0e10cSrcweir // andere Dokumente zuzulassen 2540*cdf0e10cSrcweir 2541*cdf0e10cSrcweir if (!bRefMode) 2542*cdf0e10cSrcweir { 2543*cdf0e10cSrcweir //pScMod->InputEnterHandler(); 2544*cdf0e10cSrcweir 2545*cdf0e10cSrcweir // #80843# pass view to GetInputHdl, this view may not be current anymore 2546*cdf0e10cSrcweir ScInputHandler* pHdl = SC_MOD()->GetInputHdl(aViewData.GetViewShell()); 2547*cdf0e10cSrcweir if (pHdl) 2548*cdf0e10cSrcweir pHdl->EnterHandler(); 2549*cdf0e10cSrcweir } 2550*cdf0e10cSrcweir } 2551*cdf0e10cSrcweir pTabControl->ActivateView(bActivate); 2552*cdf0e10cSrcweir PaintExtras(); 2553*cdf0e10cSrcweir 2554*cdf0e10cSrcweir aViewData.Activate(bActivate); 2555*cdf0e10cSrcweir 2556*cdf0e10cSrcweir PaintBlock(sal_False); // Repaint, Markierung je nach Active-Status 2557*cdf0e10cSrcweir 2558*cdf0e10cSrcweir if (!bActivate) 2559*cdf0e10cSrcweir HideAllCursors(); // Cursor 2560*cdf0e10cSrcweir else if (!bFirst) 2561*cdf0e10cSrcweir ShowAllCursors(); 2562*cdf0e10cSrcweir 2563*cdf0e10cSrcweir //HMHif (pDrawView) 2564*cdf0e10cSrcweir //HMH DrawShowMarkHdl(bActivate); // Drawing-Markierung 2565*cdf0e10cSrcweir 2566*cdf0e10cSrcweir if (bActivate) 2567*cdf0e10cSrcweir { 2568*cdf0e10cSrcweir if ( bFirst ) 2569*cdf0e10cSrcweir { 2570*cdf0e10cSrcweir ScSplitPos eWin = aViewData.GetActivePart(); 2571*cdf0e10cSrcweir DBG_ASSERT( pGridWin[eWin], "rottes Dokument, nicht alle SplitPos in GridWin" ); 2572*cdf0e10cSrcweir if ( !pGridWin[eWin] ) 2573*cdf0e10cSrcweir { 2574*cdf0e10cSrcweir eWin = SC_SPLIT_BOTTOMLEFT; 2575*cdf0e10cSrcweir if ( !pGridWin[eWin] ) 2576*cdf0e10cSrcweir { 2577*cdf0e10cSrcweir short i; 2578*cdf0e10cSrcweir for ( i=0; i<4; i++ ) 2579*cdf0e10cSrcweir { 2580*cdf0e10cSrcweir if ( pGridWin[i] ) 2581*cdf0e10cSrcweir { 2582*cdf0e10cSrcweir eWin = (ScSplitPos) i; 2583*cdf0e10cSrcweir break; // for 2584*cdf0e10cSrcweir } 2585*cdf0e10cSrcweir } 2586*cdf0e10cSrcweir DBG_ASSERT( i<4, "und BUMM" ); 2587*cdf0e10cSrcweir } 2588*cdf0e10cSrcweir aViewData.SetActivePart( eWin ); 2589*cdf0e10cSrcweir } 2590*cdf0e10cSrcweir } 2591*cdf0e10cSrcweir // hier nicht mehr selber GrabFocus rufen! 2592*cdf0e10cSrcweir // Wenn das Doc bearbeitet wird, ruft der Sfx selber GrabFocus am Fenster der Shell. 2593*cdf0e10cSrcweir // Wenn es z.B. ein Mailbody ist, darf es den Focus nicht bekommen (Bug #43638#) 2594*cdf0e10cSrcweir 2595*cdf0e10cSrcweir UpdateInputContext(); 2596*cdf0e10cSrcweir } 2597*cdf0e10cSrcweir else 2598*cdf0e10cSrcweir pGridWin[aViewData.GetActivePart()]->ClickExtern(); 2599*cdf0e10cSrcweir } 2600*cdf0e10cSrcweir 2601*cdf0e10cSrcweir void ScTabView::ActivatePart( ScSplitPos eWhich ) 2602*cdf0e10cSrcweir { 2603*cdf0e10cSrcweir ScSplitPos eOld = aViewData.GetActivePart(); 2604*cdf0e10cSrcweir if ( eOld != eWhich ) 2605*cdf0e10cSrcweir { 2606*cdf0e10cSrcweir bInActivatePart = sal_True; 2607*cdf0e10cSrcweir 2608*cdf0e10cSrcweir sal_Bool bRefMode = SC_MOD()->IsFormulaMode(); 2609*cdf0e10cSrcweir 2610*cdf0e10cSrcweir // #40565# the HasEditView call during SetCursor would fail otherwise 2611*cdf0e10cSrcweir if ( aViewData.HasEditView(eOld) && !bRefMode ) 2612*cdf0e10cSrcweir UpdateInputLine(); 2613*cdf0e10cSrcweir 2614*cdf0e10cSrcweir ScHSplitPos eOldH = WhichH(eOld); 2615*cdf0e10cSrcweir ScVSplitPos eOldV = WhichV(eOld); 2616*cdf0e10cSrcweir ScHSplitPos eNewH = WhichH(eWhich); 2617*cdf0e10cSrcweir ScVSplitPos eNewV = WhichV(eWhich); 2618*cdf0e10cSrcweir sal_Bool bTopCap = pColBar[eOldH] && pColBar[eOldH]->IsMouseCaptured(); 2619*cdf0e10cSrcweir sal_Bool bLeftCap = pRowBar[eOldV] && pRowBar[eOldV]->IsMouseCaptured(); 2620*cdf0e10cSrcweir 2621*cdf0e10cSrcweir sal_Bool bFocus = pGridWin[eOld]->HasFocus(); 2622*cdf0e10cSrcweir sal_Bool bCapture = pGridWin[eOld]->IsMouseCaptured(); 2623*cdf0e10cSrcweir if (bCapture) 2624*cdf0e10cSrcweir pGridWin[eOld]->ReleaseMouse(); 2625*cdf0e10cSrcweir pGridWin[eOld]->ClickExtern(); 2626*cdf0e10cSrcweir pGridWin[eOld]->HideCursor(); 2627*cdf0e10cSrcweir pGridWin[eWhich]->HideCursor(); 2628*cdf0e10cSrcweir aViewData.SetActivePart( eWhich ); 2629*cdf0e10cSrcweir 2630*cdf0e10cSrcweir ScTabViewShell* pShell = aViewData.GetViewShell(); 2631*cdf0e10cSrcweir pShell->WindowChanged(); 2632*cdf0e10cSrcweir 2633*cdf0e10cSrcweir pSelEngine->SetWindow(pGridWin[eWhich]); 2634*cdf0e10cSrcweir pSelEngine->SetWhich(eWhich); 2635*cdf0e10cSrcweir pSelEngine->SetVisibleArea( Rectangle(Point(), pGridWin[eWhich]->GetOutputSizePixel()) ); 2636*cdf0e10cSrcweir 2637*cdf0e10cSrcweir pGridWin[eOld]->MoveMouseStatus(*pGridWin[eWhich]); 2638*cdf0e10cSrcweir 2639*cdf0e10cSrcweir if ( bCapture || pGridWin[eWhich]->IsMouseCaptured() ) 2640*cdf0e10cSrcweir { 2641*cdf0e10cSrcweir // Tracking statt CaptureMouse, damit sauber abgebrochen werden kann 2642*cdf0e10cSrcweir // (SelectionEngine ruft CaptureMouse beim SetWindow) 2643*cdf0e10cSrcweir //! Irgendwann sollte die SelectionEngine selber StartTracking rufen!?! 2644*cdf0e10cSrcweir pGridWin[eWhich]->ReleaseMouse(); 2645*cdf0e10cSrcweir pGridWin[eWhich]->StartTracking(); 2646*cdf0e10cSrcweir } 2647*cdf0e10cSrcweir 2648*cdf0e10cSrcweir if ( bTopCap && pColBar[eNewH] ) 2649*cdf0e10cSrcweir { 2650*cdf0e10cSrcweir pColBar[eOldH]->SetIgnoreMove(sal_True); 2651*cdf0e10cSrcweir pColBar[eNewH]->SetIgnoreMove(sal_False); 2652*cdf0e10cSrcweir pHdrSelEng->SetWindow( pColBar[eNewH] ); 2653*cdf0e10cSrcweir long nWidth = pColBar[eNewH]->GetOutputSizePixel().Width(); 2654*cdf0e10cSrcweir pHdrSelEng->SetVisibleArea( Rectangle( 0, LONG_MIN, nWidth-1, LONG_MAX ) ); 2655*cdf0e10cSrcweir pColBar[eNewH]->CaptureMouse(); 2656*cdf0e10cSrcweir } 2657*cdf0e10cSrcweir if ( bLeftCap && pRowBar[eNewV] ) 2658*cdf0e10cSrcweir { 2659*cdf0e10cSrcweir pRowBar[eOldV]->SetIgnoreMove(sal_True); 2660*cdf0e10cSrcweir pRowBar[eNewV]->SetIgnoreMove(sal_False); 2661*cdf0e10cSrcweir pHdrSelEng->SetWindow( pRowBar[eNewV] ); 2662*cdf0e10cSrcweir long nHeight = pRowBar[eNewV]->GetOutputSizePixel().Height(); 2663*cdf0e10cSrcweir pHdrSelEng->SetVisibleArea( Rectangle( LONG_MIN, 0, LONG_MAX, nHeight-1 ) ); 2664*cdf0e10cSrcweir pRowBar[eNewV]->CaptureMouse(); 2665*cdf0e10cSrcweir } 2666*cdf0e10cSrcweir aHdrFunc.SetWhich(eWhich); 2667*cdf0e10cSrcweir 2668*cdf0e10cSrcweir pGridWin[eOld]->ShowCursor(); 2669*cdf0e10cSrcweir pGridWin[eWhich]->ShowCursor(); 2670*cdf0e10cSrcweir 2671*cdf0e10cSrcweir SfxInPlaceClient* pClient = aViewData.GetViewShell()->GetIPClient(); 2672*cdf0e10cSrcweir sal_Bool bOleActive = ( pClient && pClient->IsObjectInPlaceActive() ); 2673*cdf0e10cSrcweir 2674*cdf0e10cSrcweir // #103823# don't switch ViewShell's active window during RefInput, because the focus 2675*cdf0e10cSrcweir // might change, and subsequent SetReference calls wouldn't find the right EditView 2676*cdf0e10cSrcweir if ( !bRefMode && !bOleActive ) 2677*cdf0e10cSrcweir aViewData.GetViewShell()->SetWindow( pGridWin[eWhich] ); 2678*cdf0e10cSrcweir 2679*cdf0e10cSrcweir if ( bFocus && !aViewData.IsAnyFillMode() && !bRefMode ) 2680*cdf0e10cSrcweir { 2681*cdf0e10cSrcweir // GrabFocus nur, wenn vorher das andere GridWindow den Focus hatte 2682*cdf0e10cSrcweir // (z.B. wegen Suchen & Ersetzen) 2683*cdf0e10cSrcweir //! aViewData.GetViewShell()->GetViewFrame()->GetWindow().GrabFocus(); 2684*cdf0e10cSrcweir pGridWin[eWhich]->GrabFocus(); 2685*cdf0e10cSrcweir } 2686*cdf0e10cSrcweir 2687*cdf0e10cSrcweir bInActivatePart = sal_False; 2688*cdf0e10cSrcweir } 2689*cdf0e10cSrcweir } 2690*cdf0e10cSrcweir 2691*cdf0e10cSrcweir void ScTabView::HideListBox() 2692*cdf0e10cSrcweir { 2693*cdf0e10cSrcweir for (sal_uInt16 i=0; i<4; i++) 2694*cdf0e10cSrcweir if (pGridWin[i]) 2695*cdf0e10cSrcweir pGridWin[i]->ClickExtern(); 2696*cdf0e10cSrcweir } 2697*cdf0e10cSrcweir 2698*cdf0e10cSrcweir void ScTabView::UpdateInputContext() 2699*cdf0e10cSrcweir { 2700*cdf0e10cSrcweir ScGridWindow* pWin = pGridWin[aViewData.GetActivePart()]; 2701*cdf0e10cSrcweir if (pWin) 2702*cdf0e10cSrcweir pWin->UpdateInputContext(); 2703*cdf0e10cSrcweir } 2704*cdf0e10cSrcweir 2705*cdf0e10cSrcweir // GetGridWidth - Breite eines Ausgabebereichs (fuer ViewData) 2706*cdf0e10cSrcweir 2707*cdf0e10cSrcweir long ScTabView::GetGridWidth( ScHSplitPos eWhich ) 2708*cdf0e10cSrcweir { 2709*cdf0e10cSrcweir ScSplitPos eGridWhich = ( eWhich == SC_SPLIT_LEFT ) ? SC_SPLIT_BOTTOMLEFT : SC_SPLIT_BOTTOMRIGHT; 2710*cdf0e10cSrcweir if (pGridWin[eGridWhich]) 2711*cdf0e10cSrcweir return pGridWin[eGridWhich]->GetSizePixel().Width(); 2712*cdf0e10cSrcweir else 2713*cdf0e10cSrcweir return 0; 2714*cdf0e10cSrcweir } 2715*cdf0e10cSrcweir 2716*cdf0e10cSrcweir // GetGridHeight - Hoehe eines Ausgabebereichs (fuer ViewData) 2717*cdf0e10cSrcweir 2718*cdf0e10cSrcweir long ScTabView::GetGridHeight( ScVSplitPos eWhich ) 2719*cdf0e10cSrcweir { 2720*cdf0e10cSrcweir ScSplitPos eGridWhich = ( eWhich == SC_SPLIT_TOP ) ? SC_SPLIT_TOPLEFT : SC_SPLIT_BOTTOMLEFT; 2721*cdf0e10cSrcweir if (pGridWin[eGridWhich]) 2722*cdf0e10cSrcweir return pGridWin[eGridWhich]->GetSizePixel().Height(); 2723*cdf0e10cSrcweir else 2724*cdf0e10cSrcweir return 0; 2725*cdf0e10cSrcweir } 2726*cdf0e10cSrcweir 2727*cdf0e10cSrcweir void ScTabView::UpdateInputLine() 2728*cdf0e10cSrcweir { 2729*cdf0e10cSrcweir SC_MOD()->InputEnterHandler(); 2730*cdf0e10cSrcweir } 2731*cdf0e10cSrcweir 2732*cdf0e10cSrcweir void ScTabView::ZoomChanged() 2733*cdf0e10cSrcweir { 2734*cdf0e10cSrcweir ScInputHandler* pHdl = SC_MOD()->GetInputHdl(aViewData.GetViewShell()); 2735*cdf0e10cSrcweir if (pHdl) 2736*cdf0e10cSrcweir pHdl->SetRefScale( aViewData.GetZoomX(), aViewData.GetZoomY() ); 2737*cdf0e10cSrcweir 2738*cdf0e10cSrcweir UpdateFixPos(); 2739*cdf0e10cSrcweir 2740*cdf0e10cSrcweir UpdateScrollBars(); 2741*cdf0e10cSrcweir 2742*cdf0e10cSrcweir // VisArea... 2743*cdf0e10cSrcweir // AW: Discussed with NN if there is a reason that new map mode was only set for one window, 2744*cdf0e10cSrcweir // but is not. Setting only on one window causes the first repaint to have the old mapMode 2745*cdf0e10cSrcweir // in three of four views, so the overlay will save the wrong content e.g. when zooming out. 2746*cdf0e10cSrcweir // Changing to setting map mode at all windows. 2747*cdf0e10cSrcweir sal_uInt32 a; 2748*cdf0e10cSrcweir 2749*cdf0e10cSrcweir for(a = 0L; a < 4L; a++) 2750*cdf0e10cSrcweir { 2751*cdf0e10cSrcweir if(pGridWin[a]) 2752*cdf0e10cSrcweir { 2753*cdf0e10cSrcweir pGridWin[a]->SetMapMode(pGridWin[a]->GetDrawMapMode()); 2754*cdf0e10cSrcweir } 2755*cdf0e10cSrcweir } 2756*cdf0e10cSrcweir 2757*cdf0e10cSrcweir SetNewVisArea(); 2758*cdf0e10cSrcweir 2759*cdf0e10cSrcweir /* the old code 2760*cdf0e10cSrcweir ScGridWindow* pWin = pGridWin[aViewData.GetActivePart()]; 2761*cdf0e10cSrcweir if (pWin) 2762*cdf0e10cSrcweir { 2763*cdf0e10cSrcweir pWin->SetMapMode( pWin->GetDrawMapMode() ); // mit neuem Zoom 2764*cdf0e10cSrcweir SetNewVisArea(); // benutzt den gesetzten MapMode 2765*cdf0e10cSrcweir } */ 2766*cdf0e10cSrcweir 2767*cdf0e10cSrcweir InterpretVisible(); // #69343# have everything calculated before painting 2768*cdf0e10cSrcweir 2769*cdf0e10cSrcweir SfxBindings& rBindings = aViewData.GetBindings(); 2770*cdf0e10cSrcweir rBindings.Invalidate( SID_ATTR_ZOOM ); 2771*cdf0e10cSrcweir rBindings.Invalidate( SID_ATTR_ZOOMSLIDER ); 2772*cdf0e10cSrcweir 2773*cdf0e10cSrcweir HideNoteMarker(); 2774*cdf0e10cSrcweir 2775*cdf0e10cSrcweir // AW: To not change too much, use pWin here 2776*cdf0e10cSrcweir ScGridWindow* pWin = pGridWin[aViewData.GetActivePart()]; 2777*cdf0e10cSrcweir 2778*cdf0e10cSrcweir if ( pWin && aViewData.HasEditView( aViewData.GetActivePart() ) ) 2779*cdf0e10cSrcweir { 2780*cdf0e10cSrcweir // flush OverlayManager before changing the MapMode 2781*cdf0e10cSrcweir pWin->flushOverlayManager(); 2782*cdf0e10cSrcweir 2783*cdf0e10cSrcweir // #93650# make sure the EditView's position and size are updated 2784*cdf0e10cSrcweir // with the right (logic, not drawing) MapMode 2785*cdf0e10cSrcweir pWin->SetMapMode( aViewData.GetLogicMode() ); 2786*cdf0e10cSrcweir UpdateEditView(); 2787*cdf0e10cSrcweir } 2788*cdf0e10cSrcweir } 2789*cdf0e10cSrcweir 2790*cdf0e10cSrcweir void ScTabView::CheckNeedsRepaint() 2791*cdf0e10cSrcweir { 2792*cdf0e10cSrcweir sal_uInt16 i; 2793*cdf0e10cSrcweir for (i=0; i<4; i++) 2794*cdf0e10cSrcweir if ( pGridWin[i] && pGridWin[i]->IsVisible() ) 2795*cdf0e10cSrcweir pGridWin[i]->CheckNeedsRepaint(); 2796*cdf0e10cSrcweir } 2797*cdf0e10cSrcweir 2798*cdf0e10cSrcweir 2799*cdf0e10cSrcweir 2800*cdf0e10cSrcweir 2801*cdf0e10cSrcweir 2802