LCOV - code coverage report
Current view: top level - sc/source/ui/view - tabvwsh4.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 350 931 37.6 %
Date: 2015-06-13 12:38:46 Functions: 26 70 37.1 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <sal/config.h>
      21             : 
      22             : #include "olkact.hxx"
      23             : #include "scitems.hxx"
      24             : #include <editeng/eeitem.hxx>
      25             : 
      26             : #include <sfx2/app.hxx>
      27             : #include <svx/extrusionbar.hxx>
      28             : #include <svx/fontworkbar.hxx>
      29             : #include <editeng/boxitem.hxx>
      30             : #include <svx/fmpage.hxx>
      31             : #include <svx/fmshell.hxx>
      32             : #include <editeng/sizeitem.hxx>
      33             : #include <svx/prtqry.hxx>
      34             : #include <svx/sidebar/ContextChangeEventMultiplexer.hxx>
      35             : #include <sfx2/request.hxx>
      36             : #include <sfx2/printer.hxx>
      37             : #include <sfx2/dispatch.hxx>
      38             : #include <svl/whiter.hxx>
      39             : #include <unotools/moduleoptions.hxx>
      40             : #include <tools/urlobj.hxx>
      41             : #include <sfx2/docfile.hxx>
      42             : #include <vcl/openglwin.hxx>
      43             : 
      44             : #include "tabvwsh.hxx"
      45             : #include "sc.hrc"
      46             : #include "globstr.hrc"
      47             : #include "stlpool.hxx"
      48             : #include "stlsheet.hxx"
      49             : #include "docsh.hxx"
      50             : #include "scmod.hxx"
      51             : #include "appoptio.hxx"
      52             : #include "rangeutl.hxx"
      53             : #include "printfun.hxx"
      54             : #include "drawsh.hxx"
      55             : #include "drformsh.hxx"
      56             : #include "editsh.hxx"
      57             : #include "pivotsh.hxx"
      58             : #include "auditsh.hxx"
      59             : #include "drtxtob.hxx"
      60             : #include "inputhdl.hxx"
      61             : #include "editutil.hxx"
      62             : #include "inputopt.hxx"
      63             : #include "inputwin.hxx"
      64             : #include "scresid.hxx"
      65             : #include "dbdata.hxx"
      66             : #include "reffact.hxx"
      67             : #include "viewuno.hxx"
      68             : #include "dispuno.hxx"
      69             : #include "anyrefdg.hxx"
      70             : #include "chgtrack.hxx"
      71             : #include "cellsh.hxx"
      72             : #include "oleobjsh.hxx"
      73             : #include "chartsh.hxx"
      74             : #include "graphsh.hxx"
      75             : #include "mediash.hxx"
      76             : #include "pgbrksh.hxx"
      77             : #include "dpobject.hxx"
      78             : #include "prevwsh.hxx"
      79             : #include "tpprint.hxx"
      80             : #include "scextopt.hxx"
      81             : #include "printopt.hxx"
      82             : #include "drawview.hxx"
      83             : #include "fupoor.hxx"
      84             : #include "navsett.hxx"
      85             : #include "scabstdlg.hxx"
      86             : #include "externalrefmgr.hxx"
      87             : #include "defaultsoptions.hxx"
      88             : #include "markdata.hxx"
      89             : #include "preview.hxx"
      90             : #include "docoptio.hxx"
      91             : #include <documentlinkmgr.hxx>
      92             : #include <gridwin.hxx>
      93             : 
      94             : #include <com/sun/star/document/XDocumentProperties.hpp>
      95             : #include <com/sun/star/chart2/X3DChartWindowProvider.hpp>
      96             : #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
      97             : #include <com/sun/star/chart2/XCoordinateSystem.hpp>
      98             : #include <com/sun/star/chart2/XChartTypeContainer.hpp>
      99             : #include <com/sun/star/chart2/XChartType.hpp>
     100             : 
     101             : extern SfxViewShell* pScActiveViewShell;            // global.cxx
     102             : 
     103             : using namespace com::sun::star;
     104             : 
     105             : // STATIC DATA -----------------------------------------------------------
     106             : 
     107             : sal_uInt16 ScTabViewShell::nInsertCtrlState = SID_INSERT_GRAPHIC;
     108             : sal_uInt16 ScTabViewShell::nInsCellsCtrlState = 0;
     109             : sal_uInt16 ScTabViewShell::nInsObjCtrlState = SID_INSERT_DIAGRAM;
     110             : 
     111         338 : void ScTabViewShell::Activate(bool bMDI)
     112             : {
     113         338 :     SfxViewShell::Activate(bMDI);
     114         338 :     bIsActive = true;
     115             :     //  hier kein GrabFocus, sonst gibt's Probleme wenn etwas inplace editiert wird!
     116             : 
     117         338 :     if ( bMDI )
     118             :     {
     119             :         //  fuer Eingabezeile (ClearCache)
     120         338 :         ScModule* pScMod = SC_MOD();
     121         338 :         pScMod->ViewShellChanged();
     122             : 
     123         338 :         ActivateView( true, bFirstActivate );
     124             : 
     125             :         //  AutoCorrect umsetzen, falls der Writer seins neu angelegt hat
     126         338 :         UpdateDrawTextOutliner();
     127             : 
     128             :         //  RegisterNewTargetNames gibts nicht mehr
     129             : 
     130         338 :         SfxViewFrame* pThisFrame  = GetViewFrame();
     131         338 :         if ( pInputHandler && pThisFrame->HasChildWindow(FID_INPUTLINE_STATUS) )
     132             :         {
     133             :             //  eigentlich nur beim Reload (letzte Version) noetig:
     134             :             //  Das InputWindow bleibt stehen, aber die View mitsamt InputHandler wird
     135             :             //  neu angelegt, darum muss der InputHandler am InputWindow gesetzt werden.
     136         338 :             SfxChildWindow* pChild = pThisFrame->GetChildWindow(FID_INPUTLINE_STATUS);
     137         338 :             if (pChild)
     138             :             {
     139         338 :                 ScInputWindow* pWin = static_cast<ScInputWindow*>(pChild->GetWindow());
     140         338 :                 if (pWin && pWin->IsVisible())
     141             :                 {
     142             : 
     143         150 :                     ScInputHandler* pOldHdl=pWin->GetInputHandler();
     144             : 
     145         150 :                     TypeId aScType = TYPE(ScTabViewShell);
     146             : 
     147         150 :                     SfxViewShell* pSh = SfxViewShell::GetFirst( &aScType );
     148         305 :                     while ( pSh!=NULL && pOldHdl!=NULL)
     149             :                     {
     150         155 :                         if (static_cast<ScTabViewShell*>(pSh)->GetInputHandler() == pOldHdl)
     151             :                         {
     152         150 :                             pOldHdl->ResetDelayTimer();
     153         150 :                             break;
     154             :                         }
     155           5 :                         pSh = SfxViewShell::GetNext( *pSh, &aScType );
     156             :                     }
     157             : 
     158         150 :                     pWin->SetInputHandler( pInputHandler );
     159             :                 }
     160             :             }
     161             :         }
     162             : 
     163         338 :         UpdateInputHandler( true );
     164             : 
     165         338 :         if ( bFirstActivate )
     166             :         {
     167         338 :             SfxGetpApp()->Broadcast( SfxSimpleHint( SC_HINT_NAVIGATOR_UPDATEALL ) );
     168         338 :             bFirstActivate = false;
     169             : 
     170             :             // ReadExtOptions (view settings from Excel import) must also be done
     171             :             // after the ctor, because of the potential calls to Window::Show.
     172             :             // Even after a bugfix (Window::Show no longer notifies the access
     173             :             // bridge, it's done in ImplSetReallyVisible), there are problems if Window::Show
     174             :             // is called during the ViewShell ctor and reschedules asynchronous calls
     175             :             // (for example from the FmFormShell ctor).
     176         338 :             ScExtDocOptions* pExtOpt = GetViewData().GetDocument()->GetExtDocOptions();
     177         338 :             if ( pExtOpt && pExtOpt->IsChanged() )
     178             :             {
     179          29 :                 GetViewData().ReadExtOptions(*pExtOpt);        // Excel view settings
     180          29 :                 SetTabNo( GetViewData().GetTabNo(), true );
     181          29 :                 pExtOpt->SetChanged( false );
     182             :             }
     183             :         }
     184             : 
     185         338 :         pScActiveViewShell = this;
     186             : 
     187         338 :         ScInputHandler* pHdl = pScMod->GetInputHdl(this);
     188         338 :         if (pHdl)
     189             :         {
     190         338 :             pHdl->SetRefScale( GetViewData().GetZoomX(), GetViewData().GetZoomY() );
     191             :         }
     192             : 
     193             :         //  Aenderungs-Dialog aktualisieren
     194             : 
     195         338 :         if ( pThisFrame->HasChildWindow(FID_CHG_ACCEPT) )
     196             :         {
     197           0 :             SfxChildWindow* pChild = pThisFrame->GetChildWindow(FID_CHG_ACCEPT);
     198           0 :             if (pChild)
     199             :             {
     200           0 :                 static_cast<ScAcceptChgDlgWrapper*>(pChild)->ReInitDlg();
     201             :             }
     202             :         }
     203             : 
     204         338 :         if(pScMod->IsRefDialogOpen())
     205             :         {
     206           0 :             sal_uInt16 nModRefDlgId=pScMod->GetCurRefDlgId();
     207           0 :             SfxChildWindow* pChildWnd = pThisFrame->GetChildWindow( nModRefDlgId );
     208           0 :             if ( pChildWnd )
     209             :             {
     210           0 :                 IAnyRefDialog* pRefDlg = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow());
     211             :                 assert(pRefDlg);
     212           0 :                 if(pRefDlg)
     213             :                 {
     214           0 :                     pRefDlg->ViewShellChanged();
     215             :                 }
     216             :             }
     217             :         }
     218             :     }
     219             : 
     220             :     //  don't call CheckSelectionTransfer here - activating a view should not change the
     221             :     //  primary selection (may be happening just because the mouse was moved over the window)
     222             : 
     223             :     //  Wenn Referenzeingabe-Tip-Hilfe hier wieder angezeigt werden soll (ShowRefTip),
     224             :     //  muss sie beim Verschieben der View angepasst werden (gibt sonst Probleme unter OS/2
     225             :     //  beim Umschalten zwischen Dokumenten)
     226             : 
     227             :     ContextChangeEventMultiplexer::NotifyContextChange(
     228             :         GetController(),
     229         338 :         ::sfx2::sidebar::EnumContext::Context_Default);
     230         338 : }
     231             : 
     232         336 : void ScTabViewShell::Deactivate(bool bMDI)
     233             : {
     234         336 :     HideTip();
     235             : 
     236         336 :     ScDocument* pDoc=GetViewData().GetDocument();
     237             : 
     238         336 :     ScChangeTrack* pChanges=pDoc->GetChangeTrack();
     239             : 
     240         336 :     if(pChanges!=NULL)
     241             :     {
     242           2 :         Link<> aLink;
     243           2 :         pChanges->SetModifiedLink(aLink);
     244             :     }
     245             : 
     246         336 :     SfxViewShell::Deactivate(bMDI);
     247         336 :     bIsActive = false;
     248         336 :     ScInputHandler* pHdl = SC_MOD()->GetInputHdl(this);
     249             : 
     250         336 :     if( bMDI )
     251             :     {
     252             :         //  during shell deactivation, shells must not be switched, or the loop
     253             :         //  through the shell stack (in SfxDispatcher::DoDeactivate_Impl) will not work
     254         336 :         bool bOldDontSwitch = bDontSwitch;
     255         336 :         bDontSwitch = true;
     256             : 
     257         336 :         ActivateView( false, false );
     258             : 
     259         336 :         if ( GetViewFrame()->GetFrame().IsInPlace() ) // inplace
     260           0 :             GetViewData().GetDocShell()->UpdateOle(&GetViewData(), true);
     261             : 
     262         336 :         if ( pHdl )
     263         336 :             pHdl->NotifyChange( NULL, true ); // Timer-verzoegert wg. Dokumentwechsel
     264             : 
     265         336 :         if (pScActiveViewShell == this)
     266         336 :             pScActiveViewShell = NULL;
     267             : 
     268         336 :         bDontSwitch = bOldDontSwitch;
     269             :     }
     270             :     else
     271             :     {
     272           0 :         HideNoteMarker();           // Notiz-Anzeige
     273             : 
     274           0 :         if ( pHdl )
     275           0 :             pHdl->HideTip();        // Formel-AutoEingabe-Tip abschalten
     276             :     }
     277         336 : }
     278             : 
     279           0 : void ScTabViewShell::SetActive()
     280             : {
     281             :     // Die Sfx-View moechte sich gerne selbst aktivieren, weil dabei noch
     282             :     // magische Dinge geschehen (z.B. stuerzt sonst evtl. der Gestalter ab)
     283           0 :     ActiveGrabFocus();
     284           0 : }
     285             : 
     286         654 : bool ScTabViewShell::PrepareClose(bool bUI)
     287             : {
     288             :     // Call EnterHandler even in formula mode here,
     289             :     // so a formula change in an embedded object isn't lost
     290             :     // (ScDocShell::PrepareClose isn't called then).
     291         654 :     ScInputHandler* pHdl = SC_MOD()->GetInputHdl( this );
     292         654 :     if ( pHdl && pHdl->IsInputMode() )
     293           0 :         pHdl->EnterHandler();
     294             : 
     295             :     // draw text edit mode must be closed
     296         654 :     FuPoor* pPoor = GetDrawFuncPtr();
     297         654 :     if ( pPoor && ( IsDrawTextShell() || pPoor->GetSlotID() == SID_DRAW_NOTEEDIT ) )
     298             :     {
     299             :         // "clean" end of text edit, including note handling, subshells and draw func switching,
     300             :         // as in FuDraw and ScTabView::DrawDeselectAll
     301           0 :         GetViewData().GetDispatcher().Execute( pPoor->GetSlotID(), SfxCallMode::SLOT | SfxCallMode::RECORD );
     302             :     }
     303         654 :     ScDrawView* pDrView = GetScDrawView();
     304         654 :     if ( pDrView )
     305             :     {
     306             :         // force end of text edit, to be safe
     307             :         // ScEndTextEdit must always be used, to ensure correct UndoManager
     308         654 :         pDrView->ScEndTextEdit();
     309             :     }
     310             : 
     311         654 :     if ( pFormShell )
     312             :     {
     313         654 :         bool nRet = pFormShell->PrepareClose(bUI);
     314         654 :         if (!nRet)
     315           0 :             return nRet;
     316             :     }
     317         654 :     return SfxViewShell::PrepareClose(bUI);
     318             : }
     319             : 
     320             : //  Zoom fuer In-Place berechnen
     321             : //  aus Verhaeltnis von VisArea und Fenstergroesse des GridWin
     322             : 
     323           0 : void ScTabViewShell::UpdateOleZoom()
     324             : {
     325           0 :     ScDocShell* pDocSh = GetViewData().GetDocShell();
     326           0 :     if ( pDocSh->GetCreateMode() == SfxObjectCreateMode::EMBEDDED )
     327             :     {
     328             :         //TODO/LATER: is there a difference between the two GetVisArea methods?
     329           0 :         Size aObjSize = static_cast<const SfxObjectShell*>(pDocSh)->GetVisArea().GetSize();
     330           0 :         if ( aObjSize.Width() > 0 && aObjSize.Height() > 0 )
     331             :         {
     332           0 :             vcl::Window* pWin = GetActiveWin();
     333           0 :             Size aWinHMM = pWin->PixelToLogic( pWin->GetOutputSizePixel(), MAP_100TH_MM );
     334           0 :             SetZoomFactor( Fraction( aWinHMM.Width(),aObjSize.Width() ),
     335           0 :                             Fraction( aWinHMM.Height(),aObjSize.Height() ) );
     336             :         }
     337             :     }
     338           0 : }
     339             : 
     340           0 : void ScTabViewShell::AdjustPosSizePixel( const Point &rPos, const Size &rSize )
     341             : {
     342           0 :     OuterResizePixel( rPos, rSize );
     343           0 : }
     344             : 
     345           0 : void ScTabViewShell::InnerResizePixel( const Point &rOfs, const Size &rSize )
     346             : {
     347           0 :     Size aNewSize( rSize );
     348           0 :     if ( GetViewFrame()->GetFrame().IsInPlace() )
     349             :     {
     350           0 :         SvBorder aBorder;
     351           0 :            GetBorderSize( aBorder, rSize );
     352           0 :         SetBorderPixel( aBorder );
     353             : 
     354           0 :         Size aObjSize = GetObjectShell()->GetVisArea().GetSize();
     355             : 
     356           0 :           Size aSize( rSize );
     357           0 :         aSize.Width() -= (aBorder.Left() + aBorder.Right());
     358           0 :         aSize.Height() -= (aBorder.Top() + aBorder.Bottom());
     359             : 
     360           0 :         if ( aObjSize.Width() > 0 && aObjSize.Height() > 0 )
     361             :         {
     362           0 :             Size aLogicSize = GetWindow()->PixelToLogic( aSize, MAP_100TH_MM );
     363           0 :             SfxViewShell::SetZoomFactor( Fraction( aLogicSize.Width(),aObjSize.Width() ),
     364           0 :                             Fraction( aLogicSize.Height(),aObjSize.Height() ) );
     365             :         }
     366             : 
     367           0 :         Point aPos( rOfs );
     368           0 :         aPos.X() += aBorder.Left();
     369           0 :         aPos.Y() += aBorder.Top();
     370           0 :         GetWindow()->SetPosSizePixel( aPos, aSize );
     371             :     }
     372             :     else
     373             :     {
     374           0 :         SvBorder aBorder;
     375           0 :         GetBorderSize( aBorder, rSize );
     376           0 :         SetBorderPixel( aBorder );
     377           0 :         aNewSize.Width()  += aBorder.Left() + aBorder.Right();
     378           0 :         aNewSize.Height() += aBorder.Top() + aBorder.Bottom();
     379             :     }
     380             : 
     381           0 :     DoResize( rOfs, aNewSize, true );                   // rSize = Groesse von gridwin
     382             : 
     383           0 :     UpdateOleZoom();                                    //  Zoom fuer In-Place berechnen
     384             : 
     385           0 :     GetViewData().GetDocShell()->SetDocumentModified();
     386           0 : }
     387             : 
     388        1155 : void ScTabViewShell::OuterResizePixel( const Point &rOfs, const Size &rSize )
     389             : {
     390        1155 :     SvBorder aBorder;
     391        1155 :     GetBorderSize( aBorder, rSize );
     392        1155 :     SetBorderPixel( aBorder );
     393             : 
     394        1155 :     DoResize( rOfs, rSize );                    // Position und Groesse von tabview wie uebergeben
     395             : 
     396             :     // ForceMove als Ersatz fuer den Sfx-Move-Mechanismus
     397             :     // (aWinPos muss aktuell gehalten werden, damit ForceMove beim Ole-Deaktivieren klappt)
     398             : 
     399        1155 :     ForceMove();
     400        1155 : }
     401             : 
     402           0 : void ScTabViewShell::SetZoomFactor( const Fraction &rZoomX, const Fraction &rZoomY )
     403             : {
     404             :     //  fuer OLE...
     405             : 
     406           0 :     Fraction aFrac20( 1,5 );
     407           0 :     Fraction aFrac400( 4,1 );
     408             : 
     409           0 :     Fraction aNewX( rZoomX );
     410           0 :     if ( aNewX < aFrac20 )
     411           0 :         aNewX = aFrac20;
     412           0 :     if ( aNewX > aFrac400 )
     413           0 :         aNewX = aFrac400;
     414           0 :     Fraction aNewY( rZoomY );
     415           0 :     if ( aNewY < aFrac20 )
     416           0 :         aNewY = aFrac20;
     417           0 :     if ( aNewY > aFrac400 )
     418           0 :         aNewY = aFrac400;
     419             : 
     420           0 :     GetViewData().UpdateScreenZoom( aNewX, aNewY );
     421           0 :     SetZoom( aNewX, aNewY, true );
     422             : 
     423           0 :     PaintGrid();
     424           0 :     PaintTop();
     425           0 :     PaintLeft();
     426             : 
     427           0 :     SfxViewShell::SetZoomFactor( rZoomX, rZoomY );
     428           0 : }
     429             : 
     430           0 : void ScTabViewShell::QueryObjAreaPixel( Rectangle& rRect ) const
     431             : {
     432             :     //  auf ganze Zellen anpassen (in 1/100 mm)
     433             : 
     434           0 :     Size aPixelSize = rRect.GetSize();
     435           0 :     vcl::Window* pWin = const_cast<ScTabViewShell*>(this)->GetActiveWin();
     436           0 :     Size aLogicSize = pWin->PixelToLogic( aPixelSize );
     437             : 
     438           0 :     const ScViewData& rViewData = GetViewData();
     439           0 :     ScDocument* pDoc = rViewData.GetDocument();
     440           0 :     ScSplitPos ePos = rViewData.GetActivePart();
     441           0 :     SCCOL nCol = rViewData.GetPosX(WhichH(ePos));
     442           0 :     SCROW nRow = rViewData.GetPosY(WhichV(ePos));
     443           0 :     SCTAB nTab = rViewData.GetTabNo();
     444           0 :     bool bNegativePage = pDoc->IsNegativePage( nTab );
     445             : 
     446           0 :     Rectangle aLogicRect = pDoc->GetMMRect( nCol, nRow, nCol, nRow, nTab );
     447           0 :     if ( bNegativePage )
     448             :     {
     449             :         // use right edge of aLogicRect, and aLogicSize
     450           0 :         aLogicRect.Left() = aLogicRect.Right() - aLogicSize.Width() + 1;    // Right() is set below
     451             :     }
     452           0 :     aLogicRect.SetSize( aLogicSize );
     453             : 
     454           0 :     rViewData.GetDocShell()->SnapVisArea( aLogicRect );
     455             : 
     456           0 :     rRect.SetSize( pWin->LogicToPixel( aLogicRect.GetSize() ) );
     457           0 : }
     458             : 
     459        1155 : void ScTabViewShell::Move()
     460             : {
     461        1155 :     Point aNewPos = GetViewFrame()->GetWindow().OutputToScreenPixel(Point());
     462             : 
     463        1155 :     if (aNewPos != aWinPos)
     464             :     {
     465         689 :         StopMarking();
     466         689 :         aWinPos = aNewPos;
     467             :     }
     468        1155 : }
     469             : 
     470          65 : void ScTabViewShell::ShowCursor(bool /* bOn */)
     471             : {
     472             : /*!!!   ShowCursor wird nicht paarweise wie im gridwin gerufen.
     473             :         Der CursorLockCount am Gridwin muss hier direkt auf 0 gesetzt werden
     474             : 
     475             :     if (bOn)
     476             :         ShowAllCursors();
     477             :     else
     478             :         HideAllCursors();
     479             : */
     480          65 : }
     481             : 
     482           1 : void ScTabViewShell::WriteUserData(OUString& rData, bool /* bBrowse */)
     483             : {
     484           1 :     GetViewData().WriteUserData(rData);
     485           1 : }
     486             : 
     487         228 : void ScTabViewShell::WriteUserDataSequence (uno::Sequence < beans::PropertyValue >& rSettings, bool /* bBrowse */ )
     488             : {
     489         228 :     GetViewData().WriteUserDataSequence (rSettings);
     490         228 : }
     491             : 
     492           0 : void ScTabViewShell::ReadUserData(const OUString& rData, bool /* bBrowse */)
     493             : {
     494           0 :     if ( !GetViewData().GetDocShell()->IsPreview() )
     495           0 :         DoReadUserData( rData );
     496           0 : }
     497             : 
     498         347 : void ScTabViewShell::ReadUserDataSequence (const uno::Sequence < beans::PropertyValue >& rSettings, bool /* bBrowse */ )
     499             : {
     500         347 :     if ( !GetViewData().GetDocShell()->IsPreview() )
     501         347 :         DoReadUserDataSequence( rSettings );
     502         347 : }
     503             : 
     504         347 : void ScTabViewShell::DoReadUserDataSequence( const uno::Sequence < beans::PropertyValue >& rSettings )
     505             : {
     506         347 :     vcl::Window* pOldWin = GetActiveWin();
     507         347 :     bool bFocus = pOldWin && pOldWin->HasFocus();
     508             : 
     509         347 :     GetViewData().ReadUserDataSequence(rSettings);
     510         347 :     SetTabNo( GetViewData().GetTabNo(), true );
     511             : 
     512         347 :     if ( GetViewData().IsPagebreakMode() )
     513           0 :         SetCurSubShell( GetCurObjectSelectionType(), true );
     514             : 
     515         347 :     vcl::Window* pNewWin = GetActiveWin();
     516         347 :     if (pNewWin && pNewWin != pOldWin)
     517             :     {
     518           0 :         SetWindow( pNewWin );       //! ist diese ViewShell immer aktiv???
     519           0 :         if (bFocus)
     520           0 :             pNewWin->GrabFocus();
     521           0 :         WindowChanged();            // Drawing-Layer (z.B. #56771#)
     522             :     }
     523             : 
     524         694 :     if (GetViewData().GetHSplitMode() == SC_SPLIT_FIX ||
     525         347 :         GetViewData().GetVSplitMode() == SC_SPLIT_FIX)
     526             :     {
     527           0 :         InvalidateSplit();
     528             :     }
     529             : 
     530         347 :     ZoomChanged();
     531             : 
     532         347 :     TestHintWindow();
     533             : 
     534             :     //! if ViewData has more tables than document, remove tables in ViewData
     535         347 : }
     536             : 
     537             : // DoReadUserData is also called from ctor when switching from print preview
     538             : 
     539           0 : void ScTabViewShell::DoReadUserData( const OUString& rData )
     540             : {
     541           0 :     vcl::Window* pOldWin = GetActiveWin();
     542           0 :     bool bFocus = pOldWin && pOldWin->HasFocus();
     543             : 
     544           0 :     GetViewData().ReadUserData(rData);
     545           0 :     SetTabNo( GetViewData().GetTabNo(), true );
     546             : 
     547           0 :     if ( GetViewData().IsPagebreakMode() )
     548           0 :         SetCurSubShell( GetCurObjectSelectionType(), true );
     549             : 
     550           0 :     vcl::Window* pNewWin = GetActiveWin();
     551           0 :     if (pNewWin && pNewWin != pOldWin)
     552             :     {
     553           0 :         SetWindow( pNewWin );       //! ist diese ViewShell immer aktiv???
     554           0 :         if (bFocus)
     555           0 :             pNewWin->GrabFocus();
     556           0 :         WindowChanged();            // Drawing-Layer (z.B. #56771#)
     557             :     }
     558             : 
     559           0 :     if (GetViewData().GetHSplitMode() == SC_SPLIT_FIX ||
     560           0 :         GetViewData().GetVSplitMode() == SC_SPLIT_FIX)
     561             :     {
     562           0 :         InvalidateSplit();
     563             :     }
     564             : 
     565           0 :     ZoomChanged();
     566             : 
     567           0 :     TestHintWindow();
     568             : 
     569             :     //! if ViewData has more tables than document, remove tables in ViewData
     570           0 : }
     571             : 
     572           4 : void ScTabViewShell::UpdateDrawShell()
     573             : {
     574             :     // Called after user interaction that may delete the selected drawing object.
     575             :     // Remove DrawShell if nothing is selected.
     576             : 
     577           4 :     SdrView* pDrView = GetSdrView();
     578           4 :     if ( pDrView && !pDrView->AreObjectsMarked() && !IsDrawSelMode() )
     579           0 :         SetDrawShell( false );
     580           4 : }
     581             : 
     582           0 : void ScTabViewShell::SetDrawShellOrSub()
     583             : {
     584           0 :     bActiveDrawSh = true;
     585             : 
     586           0 :     if(bActiveDrawFormSh)
     587             :     {
     588           0 :         SetCurSubShell(OST_DrawForm);
     589             :     }
     590           0 :     else if(bActiveGraphicSh)
     591             :     {
     592           0 :         SetCurSubShell(OST_Graphic);
     593             :     }
     594           0 :     else if(bActiveMediaSh)
     595             :     {
     596           0 :         SetCurSubShell(OST_Media);
     597             :     }
     598           0 :     else if(bActiveChartSh)
     599             :     {
     600           0 :         SetCurSubShell(OST_Chart);
     601             :     }
     602           0 :     else if(bActiveOleObjectSh)
     603             :     {
     604           0 :         SetCurSubShell(OST_OleObject);
     605             :     }
     606             :     else
     607             :     {
     608             :         SetCurSubShell(OST_Drawing, true /* force: different toolbars are
     609             :                                             visible concerning shape type
     610           0 :                                             and shape state */);
     611             :     }
     612           0 : }
     613             : 
     614        1413 : void ScTabViewShell::SetDrawShell( bool bActive )
     615             : {
     616        1413 :     if(bActive)
     617             :     {
     618             :         SetCurSubShell(OST_Drawing, true /* force: different toolbars are
     619             :                                             visible concerning shape type
     620           6 :                                             and shape state */);
     621             :     }
     622             :     else
     623             :     {
     624        1407 :         if(bActiveDrawFormSh || bActiveDrawSh ||
     625        1407 :             bActiveGraphicSh || bActiveMediaSh || bActiveOleObjectSh||
     626        1407 :             bActiveChartSh || bActiveDrawTextSh)
     627             :         {
     628           0 :             SetCurSubShell(OST_Cell);
     629             :         }
     630        1407 :         bActiveDrawFormSh=false;
     631        1407 :         bActiveGraphicSh=false;
     632        1407 :         bActiveMediaSh=false;
     633        1407 :         bActiveOleObjectSh=false;
     634        1407 :         bActiveChartSh=false;
     635             :     }
     636             : 
     637        1413 :     bool bWasDraw = bActiveDrawSh || bActiveDrawTextSh;
     638             : 
     639        1413 :     bActiveDrawSh = bActive;
     640        1413 :     bActiveDrawTextSh = false;
     641             : 
     642        1413 :     if ( !bActive )
     643             :     {
     644        1407 :         ResetDrawDragMode();        //  Mirror / Rotate aus
     645             : 
     646        1407 :         if (bWasDraw && (GetViewData().GetHSplitMode() == SC_SPLIT_FIX ||
     647           0 :                          GetViewData().GetVSplitMode() == SC_SPLIT_FIX))
     648             :         {
     649             :             //  Aktiven Teil an Cursor anpassen, etc.
     650           0 :             MoveCursorAbs( GetViewData().GetCurX(), GetViewData().GetCurY(),
     651           0 :                             SC_FOLLOW_NONE, false, false, true );
     652             :         }
     653             :     }
     654        1413 : }
     655             : 
     656           0 : void ScTabViewShell::SetDrawTextShell( bool bActive )
     657             : {
     658           0 :     bActiveDrawTextSh = bActive;
     659           0 :     if ( bActive )
     660             :     {
     661           0 :         bActiveDrawFormSh=false;
     662           0 :         bActiveGraphicSh=false;
     663           0 :         bActiveMediaSh=false;
     664           0 :         bActiveOleObjectSh=false;
     665           0 :         bActiveChartSh=false;
     666           0 :         bActiveDrawSh = false;
     667           0 :         SetCurSubShell(OST_DrawText);
     668             :     }
     669             :     else
     670           0 :         SetCurSubShell(OST_Cell);
     671             : 
     672           0 : }
     673             : 
     674         778 : void ScTabViewShell::SetPivotShell( bool bActive )
     675             : {
     676         778 :     bActivePivotSh = bActive;
     677             : 
     678             :     //  SetPivotShell is called from CursorPosChanged every time
     679             :     //  -> don't change anything except switching between cell and pivot shell
     680             : 
     681         778 :     if ( eCurOST == OST_Pivot || eCurOST == OST_Cell )
     682             :     {
     683         778 :         if ( bActive )
     684             :         {
     685           1 :             bActiveDrawTextSh = bActiveDrawSh = false;
     686           1 :             bActiveDrawFormSh=false;
     687           1 :             bActiveGraphicSh=false;
     688           1 :             bActiveMediaSh=false;
     689           1 :             bActiveOleObjectSh=false;
     690           1 :             bActiveChartSh=false;
     691           1 :             SetCurSubShell(OST_Pivot);
     692             :         }
     693             :         else
     694         777 :             SetCurSubShell(OST_Cell);
     695             :     }
     696         778 : }
     697             : 
     698           0 : void ScTabViewShell::SetAuditShell( bool bActive )
     699             : {
     700           0 :     bActiveAuditingSh = bActive;
     701           0 :     if ( bActive )
     702             :     {
     703           0 :         bActiveDrawTextSh = bActiveDrawSh = false;
     704           0 :         bActiveDrawFormSh=false;
     705           0 :         bActiveGraphicSh=false;
     706           0 :         bActiveMediaSh=false;
     707           0 :         bActiveOleObjectSh=false;
     708           0 :         bActiveChartSh=false;
     709           0 :         SetCurSubShell(OST_Auditing);
     710             :     }
     711             :     else
     712           0 :         SetCurSubShell(OST_Cell);
     713           0 : }
     714             : 
     715           0 : void ScTabViewShell::SetDrawFormShell( bool bActive )
     716             : {
     717           0 :     bActiveDrawFormSh = bActive;
     718             : 
     719           0 :     if(bActiveDrawFormSh)
     720           0 :         SetCurSubShell(OST_DrawForm);
     721           0 : }
     722           0 : void ScTabViewShell::SetChartShell( bool bActive )
     723             : {
     724           0 :     bActiveChartSh = bActive;
     725             : 
     726           0 :     if(bActiveChartSh)
     727           0 :         SetCurSubShell(OST_Chart);
     728           0 : }
     729             : 
     730           1 : void ScTabViewShell::SetGraphicShell( bool bActive )
     731             : {
     732           1 :     bActiveGraphicSh = bActive;
     733             : 
     734           1 :     if(bActiveGraphicSh)
     735           1 :         SetCurSubShell(OST_Graphic);
     736           1 : }
     737             : 
     738           0 : void ScTabViewShell::SetMediaShell( bool bActive )
     739             : {
     740           0 :     bActiveMediaSh = bActive;
     741             : 
     742           0 :     if(bActiveMediaSh)
     743           0 :         SetCurSubShell(OST_Media);
     744           0 : }
     745             : 
     746           0 : void ScTabViewShell::SetOleObjectShell( bool bActive )
     747             : {
     748           0 :     bActiveOleObjectSh = bActive;
     749             : 
     750           0 :     if(bActiveOleObjectSh)
     751           0 :         SetCurSubShell(OST_OleObject);
     752             :     else
     753           0 :         SetCurSubShell(OST_Cell);
     754           0 : }
     755             : 
     756           0 : void ScTabViewShell::SetEditShell(EditView* pView, bool bActive )
     757             : {
     758           0 :     if(bActive)
     759             :     {
     760           0 :         if (pEditShell)
     761           0 :             pEditShell->SetEditView( pView );
     762             :         else
     763           0 :             pEditShell = new ScEditShell( pView, &GetViewData() );
     764             : 
     765           0 :         SetCurSubShell(OST_Editing);
     766             :     }
     767           0 :     else if(bActiveEditSh)
     768             :     {
     769           0 :         SetCurSubShell(OST_Cell);
     770             :     }
     771           0 :     bActiveEditSh = bActive;
     772           0 : }
     773             : 
     774        1135 : void ScTabViewShell::SetCurSubShell(ObjectSelectionType eOST, bool bForce)
     775             : {
     776        1135 :     ScViewData& rViewData   = GetViewData();
     777        1135 :     ScDocShell* pDocSh      = rViewData.GetDocShell();
     778             : 
     779        2270 :     if(bDontSwitch) return;
     780             : 
     781        1135 :     if(!pCellShell) //Wird eh immer gebraucht.
     782             :     {
     783         348 :         pCellShell = new ScCellShell( &GetViewData() );
     784         348 :         pCellShell->SetRepeatTarget( &aTarget );
     785             :     }
     786             : 
     787        1135 :     bool bPgBrk = rViewData.IsPagebreakMode();
     788             : 
     789        1135 :     if(bPgBrk && !pPageBreakShell)
     790             :     {
     791           1 :         pPageBreakShell = new ScPageBreakShell( this );
     792           1 :         pPageBreakShell->SetRepeatTarget( &aTarget );
     793             :     }
     794             : 
     795        1135 :     if ( eOST!=eCurOST || bForce )
     796             :     {
     797         358 :         bool bCellBrush = false;    // "format paint brush" allowed for cells
     798         358 :         bool bDrawBrush = false;    // "format paint brush" allowed for drawing objects
     799             : 
     800         358 :         if(eCurOST!=OST_NONE) RemoveSubShell();
     801             : 
     802         358 :         if (pFormShell && !bFormShellAtTop)
     803         358 :             AddSubShell(*pFormShell);               // add below own subshells
     804             : 
     805         358 :         switch(eOST)
     806             :         {
     807             :             case    OST_Cell:
     808             :                     {
     809         350 :                         AddSubShell(*pCellShell);
     810         350 :                         if(bPgBrk) AddSubShell(*pPageBreakShell);
     811         350 :                         bCellBrush = true;
     812             :                     }
     813         350 :                     break;
     814             :             case    OST_Editing:
     815             :                     {
     816           0 :                         AddSubShell(*pCellShell);
     817           0 :                         if(bPgBrk) AddSubShell(*pPageBreakShell);
     818             : 
     819           0 :                         if(pEditShell)
     820             :                         {
     821           0 :                             AddSubShell(*pEditShell);
     822             :                         }
     823             :                     }
     824           0 :                     break;
     825             :             case    OST_DrawText:
     826             :                     {
     827           0 :                         if ( !pDrawTextShell )
     828             :                         {
     829           0 :                             pDocSh->MakeDrawLayer();
     830           0 :                             pDrawTextShell = new ScDrawTextObjectBar( &GetViewData() );
     831             :                         }
     832           0 :                         AddSubShell(*pDrawTextShell);
     833             :                     }
     834           0 :                     break;
     835             :             case    OST_Drawing:
     836             :                     {
     837           6 :                         if (svx::checkForSelectedCustomShapes(
     838           6 :                                 GetScDrawView(), true /* bOnlyExtruded */ )) {
     839           0 :                             if (pExtrusionBarShell == 0)
     840           0 :                                 pExtrusionBarShell = new svx::ExtrusionBar(this);
     841           0 :                             AddSubShell( *pExtrusionBarShell );
     842             :                         }
     843           6 :                         sal_uInt32 nCheckStatus = 0;
     844           6 :                         if (svx::checkForSelectedFontWork(
     845           6 :                                 GetScDrawView(), nCheckStatus )) {
     846           0 :                             if (pFontworkBarShell == 0)
     847           0 :                                 pFontworkBarShell = new svx::FontworkBar(this);
     848           0 :                             AddSubShell( *pFontworkBarShell );
     849             :                         }
     850             : 
     851           6 :                         if ( !pDrawShell )
     852             :                         {
     853           1 :                             pDocSh->MakeDrawLayer();
     854           1 :                             pDrawShell = new ScDrawShell( &GetViewData() );
     855           1 :                             pDrawShell->SetRepeatTarget( &aTarget );
     856             :                         }
     857           6 :                         AddSubShell(*pDrawShell);
     858           6 :                         bDrawBrush = true;
     859             :                     }
     860           6 :                     break;
     861             : 
     862             :             case    OST_DrawForm:
     863             :                     {
     864           0 :                         if ( !pDrawFormShell )
     865             :                         {
     866           0 :                             pDocSh->MakeDrawLayer();
     867           0 :                             pDrawFormShell = new ScDrawFormShell( &GetViewData() );
     868           0 :                             pDrawFormShell->SetRepeatTarget( &aTarget );
     869             :                         }
     870           0 :                         AddSubShell(*pDrawFormShell);
     871           0 :                         bDrawBrush = true;
     872             :                     }
     873           0 :                     break;
     874             : 
     875             :             case    OST_Chart:
     876             :                     {
     877           0 :                         if ( !pChartShell )
     878             :                         {
     879           0 :                             pDocSh->MakeDrawLayer();
     880           0 :                             pChartShell = new ScChartShell( &GetViewData() );
     881           0 :                             pChartShell->SetRepeatTarget( &aTarget );
     882             :                         }
     883           0 :                         AddSubShell(*pChartShell);
     884           0 :                         bDrawBrush = true;
     885             :                     }
     886           0 :                     break;
     887             : 
     888             :             case    OST_OleObject:
     889             :                     {
     890           0 :                         if ( !pOleObjectShell )
     891             :                         {
     892           0 :                             pDocSh->MakeDrawLayer();
     893           0 :                             pOleObjectShell = new ScOleObjectShell( &GetViewData() );
     894           0 :                             pOleObjectShell->SetRepeatTarget( &aTarget );
     895             :                         }
     896           0 :                         AddSubShell(*pOleObjectShell);
     897           0 :                         bDrawBrush = true;
     898             :                     }
     899           0 :                     break;
     900             : 
     901             :             case    OST_Graphic:
     902             :                     {
     903           1 :                         if ( !pGraphicShell)
     904             :                         {
     905           1 :                             pDocSh->MakeDrawLayer();
     906           1 :                             pGraphicShell = new ScGraphicShell( &GetViewData() );
     907           1 :                             pGraphicShell->SetRepeatTarget( &aTarget );
     908             :                         }
     909           1 :                         AddSubShell(*pGraphicShell);
     910           1 :                         bDrawBrush = true;
     911             :                     }
     912           1 :                     break;
     913             : 
     914             :             case    OST_Media:
     915             :                     {
     916           0 :                         if ( !pMediaShell)
     917             :                         {
     918           0 :                             pDocSh->MakeDrawLayer();
     919           0 :                             pMediaShell = new ScMediaShell( &GetViewData() );
     920           0 :                             pMediaShell->SetRepeatTarget( &aTarget );
     921             :                         }
     922           0 :                         AddSubShell(*pMediaShell);
     923             :                     }
     924           0 :                     break;
     925             : 
     926             :             case    OST_Pivot:
     927             :                     {
     928           1 :                         AddSubShell(*pCellShell);
     929           1 :                         if(bPgBrk) AddSubShell(*pPageBreakShell);
     930             : 
     931           1 :                         if ( !pPivotShell )
     932             :                         {
     933           1 :                             pPivotShell = new ScPivotShell( this );
     934           1 :                             pPivotShell->SetRepeatTarget( &aTarget );
     935             :                         }
     936           1 :                         AddSubShell(*pPivotShell);
     937           1 :                         bCellBrush = true;
     938             :                     }
     939           1 :                     break;
     940             :             case    OST_Auditing:
     941             :                     {
     942           0 :                         AddSubShell(*pCellShell);
     943           0 :                         if(bPgBrk) AddSubShell(*pPageBreakShell);
     944             : 
     945           0 :                         if ( !pAuditingShell )
     946             :                         {
     947           0 :                             pDocSh->MakeDrawLayer();    // die Wartezeit lieber jetzt als beim Klick
     948             : 
     949           0 :                             pAuditingShell = new ScAuditingShell( &GetViewData() );
     950           0 :                             pAuditingShell->SetRepeatTarget( &aTarget );
     951             :                         }
     952           0 :                         AddSubShell(*pAuditingShell);
     953           0 :                         bCellBrush = true;
     954             :                     }
     955           0 :                     break;
     956             :             default:
     957             :                     OSL_FAIL("Falsche Shell angefordert");
     958           0 :                     break;
     959             :         }
     960             : 
     961         358 :         if (pFormShell && bFormShellAtTop)
     962           0 :             AddSubShell(*pFormShell);               // add on top of own subshells
     963             : 
     964         358 :         eCurOST=eOST;
     965             : 
     966             :         // abort "format paint brush" when switching to an incompatible shell
     967         358 :         if ( ( GetBrushDocument() && !bCellBrush ) || ( GetDrawBrushSet() && !bDrawBrush ) )
     968           0 :             ResetBrushDocument();
     969             :     }
     970             : }
     971             : 
     972         502 : void ScTabViewShell::SetFormShellAtTop( bool bSet )
     973             : {
     974         502 :     if ( pFormShell && !bSet )
     975         502 :         pFormShell->ForgetActiveControl();      // let the FormShell know it no longer has the focus
     976             : 
     977         502 :     if ( bFormShellAtTop != bSet )
     978             :     {
     979           0 :         bFormShellAtTop = bSet;
     980           0 :         SetCurSubShell( GetCurObjectSelectionType(), true );
     981             :     }
     982         502 : }
     983             : 
     984           0 : IMPL_LINK_NOARG(ScTabViewShell, FormControlActivated)
     985             : {
     986             :     // a form control got the focus, so the form shell has to be on top
     987           0 :     SetFormShellAtTop( true );
     988           0 :     return 0;
     989             : }
     990             : 
     991             : //  GetMySubShell / SetMySubShell: altes Verhalten simulieren,
     992             : //  dass es nur eine SubShell gibt (nur innerhalb der 5 eignenen SubShells)
     993             : 
     994           0 : SfxShell* ScTabViewShell::GetMySubShell() const
     995             : {
     996             :     //  GetSubShell() war frueher const, und GetSubShell(sal_uInt16) sollte es auch sein...
     997             : 
     998           0 :     sal_uInt16 nPos = 0;
     999           0 :     SfxShell* pSub = const_cast<ScTabViewShell*>(this)->GetSubShell(nPos);
    1000           0 :     while (pSub)
    1001             :     {
    1002           0 :         if ( pSub == pDrawShell  || pSub == pDrawTextShell || pSub == pEditShell ||
    1003           0 :              pSub == pPivotShell || pSub == pAuditingShell || pSub == pDrawFormShell ||
    1004           0 :              pSub == pCellShell  || pSub == pOleObjectShell|| pSub == pChartShell ||
    1005           0 :              pSub == pGraphicShell || pSub == pMediaShell || pSub == pPageBreakShell)
    1006           0 :             return pSub;    // gefunden
    1007             : 
    1008           0 :         pSub = const_cast<ScTabViewShell*>(this)->GetSubShell(++nPos);
    1009             :     }
    1010           0 :     return NULL;        // keine von meinen dabei
    1011             : }
    1012             : 
    1013        1848 : bool ScTabViewShell::IsDrawTextShell() const
    1014             : {
    1015        1848 :     return ( pDrawTextShell && ( GetMySubShell() == pDrawTextShell ) );
    1016             : }
    1017             : 
    1018           0 : bool ScTabViewShell::IsAuditShell() const
    1019             : {
    1020           0 :     return ( pAuditingShell && ( GetMySubShell() == pAuditingShell ) );
    1021             : }
    1022             : 
    1023           0 : void ScTabViewShell::SetDrawTextUndo( ::svl::IUndoManager* pNewUndoMgr )
    1024             : {
    1025             :     // Default: Undo-Manager der DocShell
    1026           0 :     if (!pNewUndoMgr)
    1027           0 :         pNewUndoMgr = GetViewData().GetDocShell()->GetUndoManager();
    1028             : 
    1029           0 :     if (pDrawTextShell)
    1030             :     {
    1031           0 :         pDrawTextShell->SetUndoManager(pNewUndoMgr);
    1032           0 :         ScDocShell* pDocSh = GetViewData().GetDocShell();
    1033           0 :         if ( pNewUndoMgr == pDocSh->GetUndoManager() &&
    1034           0 :              !pDocSh->GetDocument().IsUndoEnabled() )
    1035             :         {
    1036           0 :             pNewUndoMgr->SetMaxUndoActionCount( 0 );
    1037             :         }
    1038             :     }
    1039             :     else
    1040             :     {
    1041             :         OSL_FAIL("SetDrawTextUndo ohne DrawTextShell");
    1042             :     }
    1043           0 : }
    1044             : 
    1045       50321 : ScTabViewShell* ScTabViewShell::GetActiveViewShell()
    1046             : {
    1047       50321 :     return PTR_CAST(ScTabViewShell,Current());
    1048             : }
    1049             : 
    1050        1187 : SfxPrinter* ScTabViewShell::GetPrinter( bool bCreate )
    1051             : {
    1052             :     //  Drucker ist immer da (wird fuer die FontListe schon beim Starten angelegt)
    1053        1187 :     return GetViewData().GetDocShell()->GetPrinter(bCreate);
    1054             : }
    1055             : 
    1056           0 : sal_uInt16 ScTabViewShell::SetPrinter( SfxPrinter *pNewPrinter, SfxPrinterChangeFlags nDiffFlags, bool )
    1057             : {
    1058           0 :     return GetViewData().GetDocShell()->SetPrinter( pNewPrinter, nDiffFlags );
    1059             : }
    1060             : 
    1061           0 : bool ScTabViewShell::HasPrintOptionsPage() const
    1062             : {
    1063           0 :     return true;
    1064             : }
    1065             : 
    1066           0 : VclPtr<SfxTabPage> ScTabViewShell::CreatePrintOptionsPage( vcl::Window *pParent, const SfxItemSet &rOptions )
    1067             : {
    1068           0 :     ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
    1069             :     OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
    1070           0 :     ::CreateTabPage ScTpPrintOptionsCreate = pFact->GetTabPageCreatorFunc( RID_SCPAGE_PRINT );
    1071           0 :     if ( ScTpPrintOptionsCreate )
    1072           0 :         return ScTpPrintOptionsCreate( pParent, &rOptions );
    1073           0 :     return VclPtr<SfxTabPage>();
    1074             : }
    1075             : 
    1076        2685 : void ScTabViewShell::StopEditShell()
    1077             : {
    1078        2685 :     if ( pEditShell != NULL && !bDontSwitch )
    1079           0 :         SetEditShell(NULL, false );
    1080        2685 : }
    1081             : 
    1082             : // close handler to ensure function of dialog:
    1083             : 
    1084           0 : IMPL_LINK_NOARG(ScTabViewShell, SimpleRefClose)
    1085             : {
    1086           0 :     SfxInPlaceClient* pClient = GetIPClient();
    1087           0 :     if ( pClient && pClient->IsObjectInPlaceActive() )
    1088             :     {
    1089             :         // If range selection was started with an active embedded object,
    1090             :         // switch back to original sheet (while the dialog is still open).
    1091             : 
    1092           0 :         SetTabNo( GetViewData().GetRefTabNo() );
    1093             :     }
    1094             : 
    1095           0 :     ScSimpleRefDlgWrapper::SetAutoReOpen( true );
    1096           0 :     return 0;
    1097             : }
    1098             : 
    1099             : // handlers to call UNO listeners:
    1100             : 
    1101           0 : static ScTabViewObj* lcl_GetViewObj( ScTabViewShell& rShell )
    1102             : {
    1103           0 :     ScTabViewObj* pRet = NULL;
    1104           0 :     SfxViewFrame* pViewFrame = rShell.GetViewFrame();
    1105           0 :     if (pViewFrame)
    1106             :     {
    1107           0 :         SfxFrame& rFrame = pViewFrame->GetFrame();
    1108           0 :         uno::Reference<frame::XController> xController = rFrame.GetController();
    1109           0 :         if (xController.is())
    1110           0 :             pRet = ScTabViewObj::getImplementation( xController );
    1111             :     }
    1112           0 :     return pRet;
    1113             : }
    1114             : 
    1115           0 : IMPL_LINK( ScTabViewShell, SimpleRefDone, OUString*, pResult )
    1116             : {
    1117           0 :     ScTabViewObj* pImpObj = lcl_GetViewObj( *this );
    1118           0 :     if ( pImpObj && pResult )
    1119           0 :         pImpObj->RangeSelDone( *pResult );
    1120           0 :     return 0;
    1121             : }
    1122             : 
    1123           0 : IMPL_LINK( ScTabViewShell, SimpleRefAborted, OUString*, pResult )
    1124             : {
    1125           0 :     ScTabViewObj* pImpObj = lcl_GetViewObj( *this );
    1126           0 :     if ( pImpObj && pResult )
    1127           0 :         pImpObj->RangeSelAborted( *pResult );
    1128           0 :     return 0;
    1129             : }
    1130             : 
    1131           0 : IMPL_LINK( ScTabViewShell, SimpleRefChange, OUString*, pResult )
    1132             : {
    1133           0 :     ScTabViewObj* pImpObj = lcl_GetViewObj( *this );
    1134           0 :     if ( pImpObj && pResult )
    1135           0 :         pImpObj->RangeSelChanged( *pResult );
    1136           0 :     return 0;
    1137             : }
    1138             : 
    1139           0 : void ScTabViewShell::StartSimpleRefDialog(
    1140             :             const OUString& rTitle, const OUString& rInitVal,
    1141             :             bool bCloseOnButtonUp, bool bSingleCell, bool bMultiSelection )
    1142             : {
    1143           0 :     SfxViewFrame* pViewFrm = GetViewFrame();
    1144             : 
    1145           0 :     if ( GetActiveViewShell() != this )
    1146             :     {
    1147             :         // #i18833# / #i34499# The API method can be called for a view that's not active.
    1148             :         // Then the view has to be activated first, the same way as in Execute for SID_CURRENTDOC.
    1149             :         // Can't use GrabFocus here, because it needs to take effect immediately.
    1150             : 
    1151           0 :         pViewFrm->GetFrame().Appear();
    1152             :     }
    1153             : 
    1154           0 :     sal_uInt16 nId = ScSimpleRefDlgWrapper::GetChildWindowId();
    1155             : 
    1156           0 :     SC_MOD()->SetRefDialog( nId, true, pViewFrm );
    1157             : 
    1158           0 :     ScSimpleRefDlgWrapper* pWnd = static_cast<ScSimpleRefDlgWrapper*>(pViewFrm->GetChildWindow( nId ));
    1159           0 :     if (pWnd)
    1160             :     {
    1161           0 :         pWnd->SetCloseHdl( LINK( this, ScTabViewShell, SimpleRefClose ) );
    1162             :         pWnd->SetUnoLinks( LINK( this, ScTabViewShell, SimpleRefDone ),
    1163             :                            LINK( this, ScTabViewShell, SimpleRefAborted ),
    1164           0 :                            LINK( this, ScTabViewShell, SimpleRefChange ) );
    1165           0 :         pWnd->SetRefString( rInitVal );
    1166           0 :         pWnd->SetFlags( bCloseOnButtonUp, bSingleCell, bMultiSelection );
    1167           0 :         ScSimpleRefDlgWrapper::SetAutoReOpen( false );
    1168           0 :         vcl::Window* pWin = pWnd->GetWindow();
    1169           0 :         pWin->SetText( rTitle );
    1170           0 :         pWnd->StartRefInput();
    1171             :     }
    1172           0 : }
    1173             : 
    1174           0 : void ScTabViewShell::StopSimpleRefDialog()
    1175             : {
    1176           0 :     SfxViewFrame* pViewFrm = GetViewFrame();
    1177           0 :     sal_uInt16 nId = ScSimpleRefDlgWrapper::GetChildWindowId();
    1178             : 
    1179           0 :     ScSimpleRefDlgWrapper* pWnd = static_cast<ScSimpleRefDlgWrapper*>(pViewFrm->GetChildWindow( nId ));
    1180           0 :     if (pWnd)
    1181             :     {
    1182           0 :         vcl::Window* pWin = pWnd->GetWindow();
    1183           0 :         if (pWin && pWin->IsSystemWindow())
    1184           0 :             static_cast<SystemWindow*>(pWin)->Close();     // calls abort handler
    1185             :     }
    1186           0 : }
    1187             : 
    1188           0 : bool ScTabViewShell::TabKeyInput(const KeyEvent& rKEvt)
    1189             : {
    1190           0 :     ScModule* pScMod = SC_MOD();
    1191             : 
    1192           0 :     SfxViewFrame* pThisFrame = GetViewFrame();
    1193           0 :     if ( pThisFrame->GetChildWindow( SID_OPENDLG_FUNCTION ) )
    1194           0 :         return false;
    1195             : 
    1196           0 :     vcl::KeyCode aCode = rKEvt.GetKeyCode();
    1197           0 :     bool bShift     = aCode.IsShift();
    1198           0 :     bool bControl   = aCode.IsMod1();
    1199           0 :     bool bAlt       = aCode.IsMod2();
    1200           0 :     sal_uInt16 nCode    = aCode.GetCode();
    1201           0 :     bool bUsed      = false;
    1202           0 :     bool bInPlace   = pScMod->IsEditMode();     // Editengine bekommt alles
    1203           0 :     bool bAnyEdit   = pScMod->IsInputMode();    // nur Zeichen & Backspace
    1204           0 :     bool bDraw      = IsDrawTextEdit();
    1205             : 
    1206           0 :     HideNoteMarker();   // Notiz-Anzeige
    1207             : 
    1208             :     // don't do extra HideCursor/ShowCursor calls if EnterHandler will switch to a different sheet
    1209           0 :     bool bOnRefSheet = ( GetViewData().GetRefTabNo() == GetViewData().GetTabNo() );
    1210           0 :     bool bHideCursor = ( ( nCode == KEY_RETURN && bInPlace ) || nCode == KEY_TAB ) && bOnRefSheet;
    1211             : 
    1212           0 :     if (bHideCursor)
    1213           0 :         HideAllCursors();
    1214             : 
    1215           0 :     ScDocument* pDoc = GetViewData().GetDocument();
    1216           0 :     if ( pDoc )
    1217           0 :         pDoc->KeyInput( rKEvt );    // TimerDelays etc.
    1218             : 
    1219           0 :     if( bInPlace )
    1220             :     {
    1221           0 :         bUsed = pScMod->InputKeyEvent( rKEvt );         // Eingabe
    1222           0 :         if( !bUsed )
    1223           0 :             bUsed = SfxViewShell::KeyInput( rKEvt );    // accelerators
    1224             :     }
    1225           0 :     else if( bAnyEdit )
    1226             :     {
    1227           0 :         bool bIsType = false;
    1228           0 :         sal_uInt16 nModi = aCode.GetModifier();
    1229           0 :         sal_uInt16 nGroup = aCode.GetGroup();
    1230             : 
    1231           0 :         if ( nGroup == KEYGROUP_NUM || nGroup == KEYGROUP_ALPHA || nGroup == 0 )
    1232           0 :             if ( !bControl && !bAlt )
    1233           0 :                 bIsType = true;
    1234             : 
    1235           0 :         if ( nGroup == KEYGROUP_MISC )
    1236           0 :             switch ( nCode )
    1237             :             {
    1238             :                 case KEY_RETURN:
    1239           0 :                     bIsType = bControl && !bAlt;        // Control, Shift-Control-Return
    1240           0 :                     if ( !bIsType && nModi == 0 )
    1241             :                     {
    1242             :                         //  Will der InputHandler auch ein einfaches Return?
    1243             : 
    1244           0 :                         ScInputHandler* pHdl = pScMod->GetInputHdl(this);
    1245           0 :                         bIsType = pHdl && pHdl->TakesReturn();
    1246             :                     }
    1247           0 :                     break;
    1248             :                 case KEY_SPACE:
    1249           0 :                     bIsType = !bControl && !bAlt;       // ohne Modifier oder Shift-Space
    1250           0 :                     break;
    1251             :                 case KEY_ESCAPE:
    1252           0 :                     bIsType = (nModi == 0); // nur ohne Modifier
    1253           0 :                     break;
    1254             :                 default:
    1255           0 :                     bIsType = true;
    1256             :             }
    1257             : 
    1258           0 :         if( bIsType )
    1259           0 :             bUsed = pScMod->InputKeyEvent( rKEvt );     // Eingabe
    1260             : 
    1261           0 :         if( !bUsed )
    1262           0 :             bUsed = SfxViewShell::KeyInput( rKEvt );    // accelerators
    1263             : 
    1264           0 :         if ( !bUsed && !bIsType && nCode != KEY_RETURN )    // Eingabe nochmal hinterher
    1265           0 :             bUsed = pScMod->InputKeyEvent( rKEvt );
    1266             :     }
    1267             :     else
    1268             :     {
    1269             :         //  Spezialfall: Copy/Cut bei Mehrfachselektion -> Fehlermeldung
    1270             :         //  (Slot ist disabled, SfxViewShell::KeyInput wuerde also kommentarlos verschluckt)
    1271           0 :         KeyFuncType eFunc = aCode.GetFunction();
    1272           0 :         if ( eFunc == KeyFuncType::CUT )
    1273             :         {
    1274           0 :             ScRange aDummy;
    1275           0 :             ScMarkType eMarkType = GetViewData().GetSimpleArea( aDummy );
    1276           0 :             if (eMarkType != SC_MARK_SIMPLE)
    1277             :             {
    1278           0 :                 ErrorMessage(STR_NOMULTISELECT);
    1279           0 :                 bUsed = true;
    1280             :             }
    1281             :         }
    1282           0 :         if (!bUsed)
    1283           0 :             bUsed = SfxViewShell::KeyInput( rKEvt );    // accelerators
    1284             : 
    1285             :         //  during inplace editing, some slots are handled by the
    1286             :         //  container app and are executed during Window::KeyInput.
    1287             :         //  -> don't pass keys to input handler that would be used there
    1288             :         //  but should call slots instead.
    1289           0 :         bool bParent = ( GetViewFrame()->GetFrame().IsInPlace() && eFunc != KeyFuncType::DONTKNOW );
    1290             : 
    1291           0 :         if( !bUsed && !bDraw && nCode != KEY_RETURN && !bParent )
    1292           0 :             bUsed = pScMod->InputKeyEvent( rKEvt, true );       // Eingabe
    1293             :     }
    1294             : 
    1295           0 :     if (!bInPlace && !bUsed && !bDraw)
    1296             :     {
    1297           0 :         switch (nCode)
    1298             :         {
    1299             :             case KEY_RETURN:
    1300             :                 {
    1301           0 :                     bool bNormal = !bControl && !bAlt;
    1302           0 :                     if ( !bAnyEdit && bNormal )
    1303             :                     {
    1304             :                         //  je nach Optionen mit Enter in den Edit-Modus schalten
    1305             : 
    1306           0 :                         const ScInputOptions& rOpt = pScMod->GetInputOptions();
    1307           0 :                         if ( rOpt.GetEnterEdit() )
    1308             :                         {
    1309           0 :                             pScMod->SetInputMode( SC_INPUT_TABLE );
    1310           0 :                             bUsed = true;
    1311             :                         }
    1312             :                     }
    1313             : 
    1314           0 :                     bool bEditReturn = bControl && !bShift;         // An Edit-Engine weiter
    1315           0 :                     if ( !bUsed && !bEditReturn )
    1316             :                     {
    1317           0 :                         if ( bOnRefSheet )
    1318           0 :                             HideAllCursors();
    1319             : 
    1320           0 :                         sal_uInt8 nMode = SC_ENTER_NORMAL;
    1321           0 :                         if ( bShift && bControl )
    1322           0 :                             nMode = SC_ENTER_MATRIX;
    1323           0 :                         else if ( bAlt )
    1324           0 :                             nMode = SC_ENTER_BLOCK;
    1325           0 :                         pScMod->InputEnterHandler(nMode);
    1326             : 
    1327           0 :                         if (nMode == SC_ENTER_NORMAL)
    1328             :                         {
    1329           0 :                             if( bShift )
    1330           0 :                                 GetViewData().GetDispatcher().Execute( SID_CURSORENTERUP,
    1331           0 :                                             SfxCallMode::SLOT | SfxCallMode::RECORD );
    1332             :                             else
    1333           0 :                                 GetViewData().GetDispatcher().Execute( SID_CURSORENTERDOWN,
    1334           0 :                                             SfxCallMode::SLOT | SfxCallMode::RECORD );
    1335             :                         }
    1336             :                         else
    1337           0 :                             UpdateInputHandler(true);
    1338             : 
    1339           0 :                         if ( bOnRefSheet )
    1340           0 :                             ShowAllCursors();
    1341             : 
    1342             :                         //  hier kein UpdateInputHandler, weil bei Referenzeingabe auf ein
    1343             :                         //  anderes Dokument diese ViewShell nicht die ist, auf der eingegeben
    1344             :                         //  wird!
    1345             : 
    1346           0 :                         bUsed = true;
    1347             :                     }
    1348             :                 }
    1349           0 :                 break;
    1350             :         }
    1351             :     }
    1352             : 
    1353             :     //  Alt-Cursortasten hart codiert, weil Alt nicht konfigurierbar ist
    1354             : 
    1355           0 :     if ( !bUsed && bAlt && !bControl )
    1356             :     {
    1357           0 :         sal_uInt16 nSlotId = 0;
    1358           0 :         switch (nCode)
    1359             :         {
    1360             :             case KEY_UP:
    1361           0 :                 ModifyCellSize( DIR_TOP, bShift );
    1362           0 :                 bUsed = true;
    1363           0 :                 break;
    1364             :             case KEY_DOWN:
    1365           0 :                 ModifyCellSize( DIR_BOTTOM, bShift );
    1366           0 :                 bUsed = true;
    1367           0 :                 break;
    1368             :             case KEY_LEFT:
    1369           0 :                 ModifyCellSize( DIR_LEFT, bShift );
    1370           0 :                 bUsed = true;
    1371           0 :                 break;
    1372             :             case KEY_RIGHT:
    1373           0 :                 ModifyCellSize( DIR_RIGHT, bShift );
    1374           0 :                 bUsed = true;
    1375           0 :                 break;
    1376             :             case KEY_PAGEUP:
    1377           0 :                 nSlotId = bShift ? SID_CURSORPAGELEFT_SEL : SID_CURSORPAGELEFT_;
    1378           0 :                 break;
    1379             :             case KEY_PAGEDOWN:
    1380           0 :                 nSlotId = bShift ? SID_CURSORPAGERIGHT_SEL : SID_CURSORPAGERIGHT_;
    1381           0 :                 break;
    1382             :         }
    1383           0 :         if ( nSlotId )
    1384             :         {
    1385           0 :             GetViewData().GetDispatcher().Execute( nSlotId, SfxCallMode::SLOT | SfxCallMode::RECORD );
    1386           0 :             bUsed = true;
    1387             :         }
    1388             :     }
    1389             : 
    1390             :     // use Ctrl+Alt+Shift+arrow keys to move the cursor in cells
    1391             :     // while keeping the last selection
    1392           0 :     if ( !bUsed && bAlt && bControl && bShift)
    1393             :     {
    1394           0 :         sal_uInt16 nSlotId = 0;
    1395           0 :         switch (nCode)
    1396             :         {
    1397             :             case KEY_UP:
    1398           0 :                 nSlotId = SID_CURSORUP;
    1399           0 :                 break;
    1400             :             case KEY_DOWN:
    1401           0 :                 nSlotId = SID_CURSORDOWN;
    1402           0 :                 break;
    1403             :             case KEY_LEFT:
    1404           0 :                 nSlotId = SID_CURSORLEFT;
    1405           0 :                 break;
    1406             :             case KEY_RIGHT:
    1407           0 :                 nSlotId = SID_CURSORRIGHT;
    1408           0 :                 break;
    1409             :             case KEY_PAGEUP:
    1410           0 :                 nSlotId = SID_CURSORPAGEUP;
    1411           0 :                 break;
    1412             :             case KEY_PAGEDOWN:
    1413           0 :                 nSlotId = SID_CURSORPAGEDOWN;
    1414           0 :                 break;
    1415             :             case KEY_HOME:
    1416           0 :                 nSlotId = SID_CURSORHOME;
    1417           0 :                 break;
    1418             :             case KEY_END:
    1419           0 :                 nSlotId = SID_CURSOREND;
    1420           0 :                 break;
    1421             :             default:
    1422           0 :                 nSlotId = 0;
    1423           0 :                 break;
    1424             :         }
    1425           0 :         if ( nSlotId )
    1426             :         {
    1427           0 :             sal_uInt16 nMode = GetLockedModifiers();
    1428           0 :             LockModifiers(KEY_MOD1);
    1429           0 :             GetViewData().GetDispatcher().Execute( nSlotId, SfxCallMode::SLOT | SfxCallMode::RECORD );
    1430           0 :             LockModifiers(nMode);
    1431           0 :             bUsed = true;
    1432             :         }
    1433             :     }
    1434           0 :     if (bHideCursor)
    1435           0 :         ShowAllCursors();
    1436             : 
    1437           0 :     return bUsed;
    1438             : }
    1439             : 
    1440           0 : bool ScTabViewShell::SfxKeyInput(const KeyEvent& rKeyEvent)
    1441             : {
    1442           0 :     return SfxViewShell::KeyInput( rKeyEvent );
    1443             : }
    1444             : 
    1445           0 : bool ScTabViewShell::KeyInput( const KeyEvent &rKeyEvent )
    1446             : {
    1447           0 :     return TabKeyInput( rKeyEvent );
    1448             : }
    1449             : 
    1450         348 : void ScTabViewShell::Construct( TriState nForceDesignMode )
    1451             : {
    1452         348 :     SfxApplication* pSfxApp  = SfxGetpApp();
    1453         348 :     ScDocShell* pDocSh = GetViewData().GetDocShell();
    1454         348 :     ScDocument& rDoc = pDocSh->GetDocument();
    1455         348 :     bReadOnly = pDocSh->IsReadOnly();
    1456         348 :     bIsActive = false;
    1457             : 
    1458         348 :     EnableAutoSpell(rDoc.GetDocOptions().IsAutoSpell());
    1459             : 
    1460         348 :     SetName(OUString("View")); // fuer SBX
    1461         348 :     Color aColBlack( COL_BLACK );
    1462         348 :     SetPool( &SC_MOD()->GetPool() );
    1463         348 :     SetWindow( GetActiveWin() );
    1464             : 
    1465             :     pCurFrameLine   = new ::editeng::SvxBorderLine(&aColBlack, 20,
    1466         348 :                             table::BorderLineStyle::SOLID);
    1467         348 :     pPivotSource    = new ScArea;
    1468         348 :     StartListening(*GetViewData().GetDocShell(),true);
    1469         348 :     StartListening(*GetViewFrame(),true);
    1470         348 :     StartListening(*pSfxApp,true);              // #i62045# #i62046# application is needed for Calc's own hints
    1471             : 
    1472         348 :     SfxViewFrame* pFirst = SfxViewFrame::GetFirst(pDocSh);
    1473             :     bool bFirstView = !pFirst
    1474         348 :           || (pFirst == GetViewFrame() && !SfxViewFrame::GetNext(*pFirst,pDocSh));
    1475             : 
    1476         348 :     if ( pDocSh->GetCreateMode() == SfxObjectCreateMode::EMBEDDED )
    1477             :     {
    1478             :         //TODO/LATER: is there a difference between the two GetVisArea methods?
    1479           1 :         Rectangle aVisArea = static_cast<const SfxObjectShell*>(pDocSh)->GetVisArea();
    1480             : 
    1481           1 :         SCTAB nVisTab = rDoc.GetVisibleTab();
    1482           1 :         if (!rDoc.HasTable(nVisTab))
    1483             :         {
    1484           0 :             nVisTab = 0;
    1485           0 :             rDoc.SetVisibleTab(nVisTab);
    1486             :         }
    1487           1 :         SetTabNo( nVisTab );
    1488           1 :         bool bNegativePage = rDoc.IsNegativePage( nVisTab );
    1489             :         // show the right cells
    1490           1 :         GetViewData().SetScreenPos( bNegativePage ? aVisArea.TopRight() : aVisArea.TopLeft() );
    1491             : 
    1492           1 :         if ( GetViewFrame()->GetFrame().IsInPlace() )                         // inplace
    1493             :         {
    1494           0 :             pDocSh->SetInplace( true );             // schon so initialisiert
    1495           0 :             if (rDoc.IsEmbedded())
    1496           0 :                 rDoc.ResetEmbedded();              // keine blaue Markierung
    1497             :         }
    1498           1 :         else if ( bFirstView )
    1499             :         {
    1500           1 :             pDocSh->SetInplace( false );
    1501           1 :             GetViewData().RefreshZoom();           // recalculate PPT
    1502           1 :             if (!rDoc.IsEmbedded())
    1503           1 :                 rDoc.SetEmbedded( rDoc.GetVisibleTab(), aVisArea );                  // VisArea markieren
    1504             :         }
    1505             :     }
    1506             : 
    1507             :     // ViewInputHandler
    1508             :     //  jeder Task hat neuerdings sein eigenes InputWindow,
    1509             :     //  darum muesste eigentlich entweder jeder Task seinen InputHandler bekommen,
    1510             :     //  oder das InputWindow muesste sich beim App-InputHandler anmelden, wenn der
    1511             :     //  Task aktiv wird, oder das InputWindow muesste sich den InputHandler selbst
    1512             :     //  anlegen (dann immer ueber das InputWindow suchen, und nur wenn das nicht da
    1513             :     //  ist, den InputHandler von der App nehmen).
    1514             :     //  Als Sofortloesung bekommt erstmal jede View ihren Inputhandler, das gibt
    1515             :     //  nur noch Probleme, wenn zwei Views in einem Task-Fenster sind.
    1516             : 
    1517         348 :     pInputHandler = new ScInputHandler;
    1518             : 
    1519             :     // Alte Version:
    1520             :     //  if ( !GetViewFrame()->ISA(SfxTopViewFrame) )        // OLE oder Plug-In
    1521             :     //      pInputHandler = new ScInputHandler;
    1522             : 
    1523             :             //  FormShell vor MakeDrawView anlegen, damit die DrawView auf jeden Fall
    1524             :             //  an der FormShell angemeldet werden kann
    1525             :             //  Gepusht wird die FormShell im ersten Activate
    1526         348 :     pFormShell = new FmFormShell(this);
    1527         348 :     pFormShell->SetControlActivationHandler( LINK( this, ScTabViewShell, FormControlActivated ) );
    1528             : 
    1529             :             //  DrawView darf nicht im TabView - ctor angelegt werden,
    1530             :             //  wenn die ViewShell noch nicht kostruiert ist...
    1531         348 :     if (rDoc.GetDrawLayer())
    1532         135 :         MakeDrawView( nForceDesignMode );
    1533         348 :     ViewOptionsHasChanged(false);   // legt auch evtl. DrawView an
    1534             : 
    1535         348 :     ::svl::IUndoManager* pMgr = pDocSh->GetUndoManager();
    1536         348 :     SetUndoManager( pMgr );
    1537         348 :     pFormShell->SetUndoManager( pMgr );
    1538         348 :     if ( !rDoc.IsUndoEnabled() )
    1539             :     {
    1540           0 :         pMgr->SetMaxUndoActionCount( 0 );
    1541             :     }
    1542         348 :     SetRepeatTarget( &aTarget );
    1543         348 :     pFormShell->SetRepeatTarget( &aTarget );
    1544         348 :     SetHelpId( HID_SCSHELL_TABVWSH );
    1545             : 
    1546         348 :     if ( bFirstView )   // first view?
    1547             :     {
    1548         347 :         rDoc.SetDocVisible( true );        // used when creating new sheets
    1549         347 :         if ( pDocSh->IsEmpty() )
    1550             :         {
    1551             :             // set first sheet's RTL flag (following will already be initialized because of SetDocVisible)
    1552         187 :             rDoc.SetLayoutRTL( 0, ScGlobal::IsSystemRTL() );
    1553             : 
    1554             :             // append additional sheets (not for OLE object)
    1555         187 :             if ( pDocSh->GetCreateMode() != SfxObjectCreateMode::EMBEDDED )
    1556             :             {
    1557             :                 // Get the customized initial tab count
    1558         187 :                 const ScDefaultsOptions& rOpt = SC_MOD()->GetDefaultsOptions();
    1559         187 :                 SCTAB nInitTabCount = rOpt.GetInitTabCount();
    1560             : 
    1561         187 :                 for (SCTAB i=1; i<nInitTabCount; i++)
    1562           0 :                     rDoc.MakeTable(i,false);
    1563             :             }
    1564             : 
    1565         187 :             pDocSh->SetEmpty( false );          // #i6232# make sure this is done only once
    1566             :         }
    1567             : 
    1568             :         // ReadExtOptions is now in Activate
    1569             : 
    1570             :         //  Link-Update nicht verschachteln
    1571         694 :         if ( pDocSh->GetCreateMode() != SfxObjectCreateMode::INTERNAL &&
    1572         347 :              pDocSh->IsUpdateEnabled() )  // #105575#; update only in the first creation of the ViewShell
    1573             :         {
    1574             :             // Check if there are any external data.
    1575         347 :             bool bLink = rDoc.GetExternalRefManager()->hasExternalData();
    1576         347 :             if (!bLink)
    1577             :             {
    1578             :                 // #i100042# sheet links can still exist independently from external formula references
    1579         347 :                 SCTAB nTabCount = rDoc.GetTableCount();
    1580         851 :                 for (SCTAB i=0; i<nTabCount && !bLink; i++)
    1581         504 :                     if (rDoc.IsLinked(i))
    1582           0 :                         bLink = true;
    1583             :             }
    1584         347 :             if (!bLink)
    1585             :             {
    1586         347 :                 const sc::DocumentLinkManager& rMgr = rDoc.GetDocLinkManager();
    1587         347 :                 if (rMgr.hasDdeLinks() || rDoc.HasAreaLinks())
    1588           0 :                     bLink = true;
    1589             :             }
    1590         347 :             if (bLink)
    1591             :             {
    1592           0 :                 if ( !pFirst )
    1593           0 :                     pFirst = GetViewFrame();
    1594             : 
    1595           0 :                 if(SC_MOD()->GetCurRefDlgId()==0)
    1596             :                 {
    1597             :                         pFirst->GetDispatcher()->Execute( SID_UPDATETABLINKS,
    1598           0 :                                             SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
    1599             :                 }
    1600             :             }
    1601             : 
    1602         347 :             bool bReImport = false;                             // importierte Daten aktualisieren
    1603         347 :             ScDBCollection* pDBColl = rDoc.GetDBCollection();
    1604         347 :             if ( pDBColl )
    1605             :             {
    1606         347 :                 const ScDBCollection::NamedDBs& rDBs = pDBColl->getNamedDBs();
    1607         347 :                 ScDBCollection::NamedDBs::const_iterator itr = rDBs.begin(), itrEnd = rDBs.end();
    1608         354 :                 for (; itr != itrEnd; ++itr)
    1609             :                 {
    1610           7 :                     if (itr->IsStripData() && itr->HasImportParam() && !itr->HasImportSelection())
    1611             :                     {
    1612           0 :                         bReImport = true;
    1613           0 :                         break;
    1614             :                     }
    1615             :                 }
    1616             :             }
    1617         347 :             if (bReImport)
    1618             :             {
    1619           0 :                 if ( !pFirst )
    1620           0 :                     pFirst = GetViewFrame();
    1621           0 :                 if(SC_MOD()->GetCurRefDlgId()==0)
    1622             :                 {
    1623             :                     pFirst->GetDispatcher()->Execute( SID_REIMPORT_AFTER_LOAD,
    1624           0 :                                             SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
    1625             :                 }
    1626             :             }
    1627             :         }
    1628             :     }
    1629             : 
    1630         348 :     UpdateAutoFillMark();
    1631             : 
    1632             :     // ScDispatchProviderInterceptor registers itself in ctor
    1633         348 :     xDisProvInterceptor = new ScDispatchProviderInterceptor( this );
    1634             : 
    1635         348 :     bFirstActivate = true; // NavigatorUpdate aufschieben bis Activate()
    1636             : 
    1637             :     // #105575#; update only in the first creation of the ViewShell
    1638         348 :     pDocSh->SetUpdateEnabled(false);
    1639             : 
    1640         348 :     if ( GetViewFrame()->GetFrame().IsInPlace() )
    1641           0 :         UpdateHeaderWidth(); // The implace activation requires headers to be calculated
    1642             : 
    1643         348 :     SvBorder aBorder;
    1644         348 :     GetBorderSize( aBorder, Size() );
    1645         348 :     SetBorderPixel( aBorder );
    1646         348 : }
    1647             : 
    1648         348 : ScTabViewShell::ScTabViewShell( SfxViewFrame* pViewFrame,
    1649             :                                 SfxViewShell* pOldSh ) :
    1650         696 :     SfxViewShell( pViewFrame, SfxViewShellFlags::CAN_PRINT | SfxViewShellFlags::HAS_PRINTOPTIONS ),
    1651         348 :     ScDBFunc( &pViewFrame->GetWindow(), static_cast<ScDocShell&>(*pViewFrame->GetObjectShell()), this ),
    1652             :     eCurOST(OST_NONE),
    1653             :     nDrawSfxId(0),
    1654             :     nCtrlSfxId(USHRT_MAX),
    1655             :     nFormSfxId(USHRT_MAX),
    1656             :     pDrawShell(NULL),
    1657             :     pDrawTextShell(NULL),
    1658             :     pEditShell(NULL),
    1659             :     pPivotShell(NULL),
    1660             :     pAuditingShell(NULL),
    1661             :     pDrawFormShell(NULL),
    1662             :     pCellShell(NULL),
    1663             :     pOleObjectShell(NULL),
    1664             :     pChartShell(NULL),
    1665             :     pGraphicShell(NULL),
    1666             :     pMediaShell(NULL),
    1667             :     pPageBreakShell(NULL),
    1668             :     pExtrusionBarShell(NULL),
    1669             :     pFontworkBarShell(NULL),
    1670             :     pFormShell(NULL),
    1671             :     pInputHandler(NULL),
    1672             :     pCurFrameLine(NULL),
    1673             :     aTarget(this),
    1674             :     pDialogDPObject(NULL),
    1675             :     pNavSettings(NULL),
    1676             :     bActiveDrawSh(false),
    1677             :     bActiveDrawTextSh(false),
    1678             :     bActivePivotSh(false),
    1679             :     bActiveAuditingSh(false),
    1680             :     bActiveDrawFormSh(false),
    1681             :     bActiveOleObjectSh(false),
    1682             :     bActiveChartSh(false),
    1683             :     bActiveGraphicSh(false),
    1684             :     bActiveMediaSh(false),
    1685             :     bActiveEditSh(false),
    1686             :     bFormShellAtTop(false),
    1687             :     bDontSwitch(false),
    1688             :     bInFormatDialog(false),
    1689             :     bPrintSelected(false),
    1690             :     bReadOnly(false),
    1691             :     pScSbxObject(NULL),
    1692             :     bChartAreaValid(false),
    1693             :     bForceFocusOnCurCell(false),
    1694             :     nCurRefDlgId(0),
    1695             :     pAccessibilityBroadcaster(NULL),
    1696         696 :     mbInSwitch(false)
    1697             : {
    1698         348 :     const ScAppOptions& rAppOpt = SC_MOD()->GetAppOptions();
    1699             : 
    1700             :     //  if switching back from print preview,
    1701             :     //  restore the view settings that were active when creating the preview
    1702             :     //  ReadUserData must not happen from ctor, because the view's edit window
    1703             :     //  has to be shown by the sfx. ReadUserData is deferred until the first Activate call.
    1704             :     //  old DesignMode state from form layer must be restored, too
    1705             : 
    1706         348 :     TriState nForceDesignMode = TRISTATE_INDET;
    1707         348 :     if ( pOldSh && pOldSh->ISA( ScPreviewShell ) )
    1708             :     {
    1709           0 :         ScPreviewShell* pPreviewShell = static_cast<ScPreviewShell*>(pOldSh);
    1710           0 :         nForceDesignMode = pPreviewShell->GetSourceDesignMode();
    1711           0 :         ScPreview* p = pPreviewShell->GetPreview();
    1712           0 :         if (p)
    1713           0 :             GetViewData().GetMarkData().SetSelectedTabs(p->GetSelectedTabs());
    1714             :     }
    1715             : 
    1716         348 :     Construct( nForceDesignMode );
    1717             : 
    1718         348 :     if ( GetViewData().GetDocShell()->IsPreview() )
    1719             :     {
    1720             :         //  preview for template dialog: always show whole page
    1721           0 :         SetZoomType( SvxZoomType::WHOLEPAGE, true );    // zoom value is recalculated at next Resize
    1722             :     }
    1723             :     else
    1724             :     {
    1725         348 :         Fraction aFract( rAppOpt.GetZoom(), 100 );
    1726         348 :         SetZoom( aFract, aFract, true );
    1727         348 :         SetZoomType( rAppOpt.GetZoomType(), true );
    1728             :     }
    1729             : 
    1730             :     // make Controller known to SFX
    1731         348 :     new ScTabViewObj( this );
    1732             : 
    1733         348 :     SetCurSubShell(OST_Cell);
    1734         348 :     SvBorder aBorder;
    1735         348 :     GetBorderSize( aBorder, Size() );
    1736         348 :     SetBorderPixel( aBorder );
    1737             : 
    1738             :     // #114409#
    1739         348 :     MakeDrawLayer();
    1740         348 : }
    1741             : 
    1742        1035 : ScTabViewShell::~ScTabViewShell()
    1743             : {
    1744         345 :     ScDocShell* pDocSh = GetViewData().GetDocShell();
    1745         345 :     EndListening(*pDocSh);
    1746         345 :     EndListening(*GetViewFrame());
    1747         345 :     EndListening(*SfxGetpApp());           // #i62045# #i62046# needed now - SfxViewShell no longer does it
    1748             : 
    1749         345 :     SC_MOD()->ViewShellGone(this);
    1750             : 
    1751         345 :     RemoveSubShell();           // alle
    1752         345 :     SetWindow(0);
    1753             : 
    1754             :     //  alles auf NULL, falls aus dem TabView-dtor noch darauf zugegriffen wird
    1755             :     //! (soll eigentlich nicht !??!?!)
    1756             : 
    1757         345 :     if (pInputHandler)
    1758         345 :         pInputHandler->SetDocumentDisposing(true);
    1759             : 
    1760         345 :     DELETEZ(pFontworkBarShell);
    1761         345 :     DELETEZ(pExtrusionBarShell);
    1762         345 :     DELETEZ(pCellShell);
    1763         345 :     DELETEZ(pPageBreakShell);
    1764         345 :     DELETEZ(pDrawShell);
    1765         345 :     DELETEZ(pDrawFormShell);
    1766         345 :     DELETEZ(pOleObjectShell);
    1767         345 :     DELETEZ(pChartShell);
    1768         345 :     DELETEZ(pGraphicShell);
    1769         345 :     DELETEZ(pMediaShell);
    1770         345 :     DELETEZ(pDrawTextShell);
    1771         345 :     DELETEZ(pEditShell);
    1772         345 :     DELETEZ(pPivotShell);
    1773         345 :     DELETEZ(pAuditingShell);
    1774         345 :     DELETEZ(pCurFrameLine);
    1775         345 :     DELETEZ(pInputHandler);
    1776         345 :     DELETEZ(pPivotSource);
    1777         345 :     DELETEZ(pDialogDPObject);
    1778         345 :     DELETEZ(pNavSettings);
    1779             : 
    1780         345 :     DELETEZ(pFormShell);
    1781         345 :     DELETEZ(pAccessibilityBroadcaster);
    1782         690 : }
    1783             : 
    1784           0 : void ScTabViewShell::SetDialogDPObject( const ScDPObject* pObj )
    1785             : {
    1786           0 :     delete pDialogDPObject;
    1787           0 :     if (pObj)
    1788           0 :         pDialogDPObject = new ScDPObject( *pObj );
    1789             :     else
    1790           0 :         pDialogDPObject = NULL;
    1791           0 : }
    1792             : 
    1793           0 : void ScTabViewShell::FillFieldData( ScHeaderFieldData& rData )
    1794             : {
    1795           0 :     ScDocShell* pDocShell = GetViewData().GetDocShell();
    1796           0 :     ScDocument& rDoc = pDocShell->GetDocument();
    1797           0 :     SCTAB nTab = GetViewData().GetTabNo();
    1798           0 :     OUString aTmp;
    1799           0 :     rDoc.GetName(nTab, aTmp);
    1800           0 :     rData.aTabName = aTmp;
    1801             : 
    1802           0 :     if( pDocShell->getDocProperties()->getTitle().getLength() != 0 )
    1803           0 :         rData.aTitle = pDocShell->getDocProperties()->getTitle();
    1804             :     else
    1805           0 :         rData.aTitle = pDocShell->GetTitle();
    1806             : 
    1807           0 :     const INetURLObject& rURLObj = pDocShell->GetMedium()->GetURLObject();
    1808           0 :     rData.aLongDocName  = rURLObj.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS );
    1809           0 :     if ( !rData.aLongDocName.isEmpty() )
    1810           0 :         rData.aShortDocName = rURLObj.GetName( INetURLObject::DECODE_UNAMBIGUOUS );
    1811             :     else
    1812           0 :         rData.aShortDocName = rData.aLongDocName = rData.aTitle;
    1813           0 :     rData.nPageNo       = 1;
    1814           0 :     rData.nTotalPages   = 99;
    1815             : 
    1816             :     //  eNumType kennt der Dialog selber
    1817           0 : }
    1818             : 
    1819           0 : bool ScTabViewShell::GetChartArea( ScRangeListRef& rSource, Rectangle& rDest, SCTAB& rTab ) const
    1820             : {
    1821           0 :     rSource = aChartSource;
    1822           0 :     rDest   = aChartPos;
    1823           0 :     rTab    = nChartDestTab;
    1824           0 :     return bChartAreaValid;
    1825             : }
    1826             : 
    1827           0 : ScNavigatorSettings* ScTabViewShell::GetNavigatorSettings()
    1828             : {
    1829           0 :     if( !pNavSettings )
    1830           0 :         pNavSettings = new ScNavigatorSettings;
    1831           0 :     return pNavSettings;
    1832             : }
    1833             : 
    1834           0 : void ScTabViewShell::ExecTbx( SfxRequest& rReq )
    1835             : {
    1836           0 :     const SfxItemSet* pReqArgs = rReq.GetArgs();
    1837           0 :     sal_uInt16 nSlot = rReq.GetSlot();
    1838           0 :     const SfxPoolItem* pItem = NULL;
    1839           0 :     if ( pReqArgs )
    1840           0 :         pReqArgs->GetItemState( nSlot, true, &pItem );
    1841             : 
    1842           0 :     switch ( nSlot )
    1843             :     {
    1844             :         case SID_TBXCTL_INSERT:
    1845           0 :             if ( pItem )
    1846           0 :                 nInsertCtrlState = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
    1847           0 :             break;
    1848             :         case SID_TBXCTL_INSCELLS:
    1849           0 :             if ( pItem )
    1850           0 :                 nInsCellsCtrlState = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
    1851           0 :             break;
    1852             :         case SID_TBXCTL_INSOBJ:
    1853           0 :             if ( pItem )
    1854           0 :                 nInsObjCtrlState = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
    1855           0 :             break;
    1856             :         default:
    1857             :             OSL_FAIL("Slot im Wald");
    1858             :     }
    1859           0 :     GetViewFrame()->GetBindings().Invalidate( nSlot );
    1860           0 : }
    1861             : 
    1862           0 : void ScTabViewShell::GetTbxState( SfxItemSet& rSet )
    1863             : {
    1864           0 :     rSet.Put( SfxUInt16Item( SID_TBXCTL_INSERT,   nInsertCtrlState ) );
    1865           0 :     rSet.Put( SfxUInt16Item( SID_TBXCTL_INSCELLS, nInsCellsCtrlState ) );
    1866             : 
    1867             :     //  ohne installiertes Chart darf Chart nicht Default sein...
    1868           0 :     if ( nInsObjCtrlState == SID_DRAW_CHART && !SvtModuleOptions().IsChart() )
    1869           0 :         nInsObjCtrlState = SID_INSERT_OBJECT;
    1870             : 
    1871           0 :     rSet.Put( SfxUInt16Item( SID_TBXCTL_INSOBJ,   nInsObjCtrlState ) );
    1872         156 : }
    1873             : 
    1874             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11