xref: /trunk/main/sc/source/ui/view/tabvwsh4.cxx (revision 710dc5ad)
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