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