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