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

Generated by: LCOV version 1.10