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