xref: /trunk/main/sd/source/ui/docshell/docshell.cxx (revision 79aad27f)
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_sd.hxx"
26 
27 #include "DrawDocShell.hxx"
28 #include <tools/pstm.hxx>
29 #include <vcl/svapp.hxx>
30 
31 #include <sfx2/docfac.hxx>
32 #include <sfx2/objface.hxx>
33 
34 #ifndef _SVXIDS_HRC
35 #include <svx/svxids.hrc>
36 #endif
37 #include <svl/srchitem.hxx>
38 #include <svx/srchdlg.hxx>
39 #include <editeng/flstitem.hxx>
40 #include <svl/eitem.hxx>
41 #include <svl/intitem.hxx>
42 #include <sfx2/printer.hxx>
43 #ifndef _SFX_DOCFILE_HXX //autogen
44 #include <sfx2/docfile.hxx>
45 #endif
46 #include <svx/drawitem.hxx>
47 #include <editeng/flstitem.hxx>
48 #include <svx/drawitem.hxx>
49 #include <svx/srchdlg.hxx>
50 #include <sfx2/dispatch.hxx>
51 #include <svl/whiter.hxx>
52 #include <svl/itempool.hxx>
53 #include <svtools/ctrltool.hxx>
54 #include <svtools/filter.hxx>
55 #ifndef _SO_CLSIDS_HXX
56 #include <sot/clsids.hxx>
57 #endif
58 #include <svl/cjkoptions.hxx>
59 #include <svl/visitem.hxx>
60 
61 #include <svx/svdoutl.hxx>
62 
63 #include <sfx2/fcontnr.hxx>
64 
65 #include "app.hrc"
66 #include "app.hxx"
67 #include "strmname.h"
68 #include "stlpool.hxx"
69 #include "strings.hrc"
70 #include "View.hxx"
71 #include "drawdoc.hxx"
72 #include "sdpage.hxx"
73 #include "glob.hrc"
74 #include "res_bmp.hrc"
75 #include "fupoor.hxx"
76 #include "fusearch.hxx"
77 #include "ViewShell.hxx"
78 #include "sdresid.hxx"
79 #ifndef SD_FU_SLIDE_SHOW_DLG_HXX
80 #include "slideshow.hxx"
81 #endif
82 #include "drawview.hxx"
83 #ifndef SD_FRAMW_VIEW_HXX
84 #include "FrameView.hxx"
85 #endif
86 #include "unomodel.hxx"
87 #include "undo/undomanager.hxx"
88 #include "undo/undofactory.hxx"
89 #include "OutlineView.hxx"
90 #include "ViewShellBase.hxx"
91 
92 using namespace sd;
93 #define DrawDocShell
94 #include "sdslots.hxx"
95 
96 SFX_IMPL_INTERFACE(DrawDocShell, SfxObjectShell, SdResId(0))
97 {
98 	SFX_CHILDWINDOW_REGISTRATION(SvxSearchDialogWrapper::GetChildWindowId());
99         SFX_CHILDWINDOW_REGISTRATION(SID_HYPERLINK_INSERT);
100 }
101 
102 
103 namespace sd {
104 
105 #define POOL_BUFFER_SIZE				(sal_uInt16)32768
106 #define BASIC_BUFFER_SIZE				(sal_uInt16)8192
107 #define DOCUMENT_BUFFER_SIZE            (sal_uInt16)32768
108 
109 
110 GraphicFilter* GetGrfFilter();
111 
112 /*************************************************************************
113 |*
114 |* SFX-Slotmaps und -Definitionen
115 |*
116 \************************************************************************/
117 TYPEINIT1( DrawDocShell, SfxObjectShell );
118 
119 SFX_IMPL_OBJECTFACTORY(
120     DrawDocShell,
121     SvGlobalName(SO3_SIMPRESS_CLASSID),
122     SFXOBJECTSHELL_STD_NORMAL,
123     "simpress" )
124 
125 /*************************************************************************
126 |*
127 |* Construct
128 |*
129 \************************************************************************/
130 
131 void DrawDocShell::Construct( bool bClipboard )
132 {
133 	mbInDestruction = sal_False;
134 	SetSlotFilter();     // setzt Filter zurueck
135 
136 	mbOwnDocument = mpDoc == 0;
137 	if( mbOwnDocument )
138 		mpDoc = new SdDrawDocument(meDocType, this);
139 
140     // The document has been created so we can call UpdateRefDevice() to set
141     // the document's ref device.
142     UpdateRefDevice();
143 
144 	SetBaseModel( new SdXImpressDocument( this, bClipboard ) );
145 	SetPool( &mpDoc->GetItemPool() );
146 	mpUndoManager = new sd::UndoManager;
147 	mpDoc->SetSdrUndoManager( mpUndoManager );
148 	mpDoc->SetSdrUndoFactory( new sd::UndoFactory );
149 	UpdateTablePointers();
150 	SetStyleFamily(5);       //CL: eigentlich SFX_STYLE_FAMILY_PSEUDO
151 }
152 
153 /*************************************************************************
154 |*
155 |* Konstruktor 1
156 |*
157 \************************************************************************/
158 
159 DrawDocShell::DrawDocShell(SfxObjectCreateMode eMode,
160 							   sal_Bool bDataObject,
161 							   DocumentType eDocumentType) :
162     SfxObjectShell( eMode == SFX_CREATE_MODE_INTERNAL ?  SFX_CREATE_MODE_EMBEDDED : eMode),
163 	mpDoc(NULL),
164 	mpUndoManager(NULL),
165 	mpPrinter(NULL),
166 	mpViewShell(NULL),
167 	mpFontList(NULL),
168 	meDocType(eDocumentType),
169 	mpFilterSIDs(0),
170 	mbSdDataObj(bDataObject),
171 	mbOwnPrinter(sal_False),
172     mbNewDocument( sal_True )
173 {
174 	Construct( eMode == SFX_CREATE_MODE_INTERNAL );
175 }
176 
177 /*************************************************************************
178 |*
179 |* Konstruktor 2
180 |*
181 \************************************************************************/
182 
183 DrawDocShell::DrawDocShell( const sal_uInt64 nModelCreationFlags, sal_Bool bDataObject, DocumentType eDocumentType ) :
184     SfxObjectShell( nModelCreationFlags ),
185 	mpDoc(NULL),
186 	mpUndoManager(NULL),
187 	mpPrinter(NULL),
188 	mpViewShell(NULL),
189 	mpFontList(NULL),
190 	meDocType(eDocumentType),
191 	mpFilterSIDs(0),
192 	mbSdDataObj(bDataObject),
193 	mbOwnPrinter(sal_False),
194     mbNewDocument( sal_True )
195 {
196 	Construct( sal_False );
197 }
198 
199 /*************************************************************************
200 |*
201 |* Konstruktor 3
202 |*
203 \************************************************************************/
204 
205 DrawDocShell::DrawDocShell(SdDrawDocument* pDoc, SfxObjectCreateMode eMode,
206 							   sal_Bool bDataObject,
207 							   DocumentType eDocumentType) :
208 	SfxObjectShell(eMode == SFX_CREATE_MODE_INTERNAL ?  SFX_CREATE_MODE_EMBEDDED : eMode),
209 	mpDoc(pDoc),
210 	mpUndoManager(NULL),
211 	mpPrinter(NULL),
212 	mpViewShell(NULL),
213 	mpFontList(NULL),
214 	meDocType(eDocumentType),
215 	mpFilterSIDs(0),
216 	mbSdDataObj(bDataObject),
217 	mbOwnPrinter(sal_False),
218     mbNewDocument( sal_True )
219 {
220 	Construct( eMode == SFX_CREATE_MODE_INTERNAL );
221 }
222 
223 /*************************************************************************
224 |*
225 |* Destruktor
226 |*
227 \************************************************************************/
228 
229 DrawDocShell::~DrawDocShell()
230 {
231     // Tell all listeners that the doc shell is about to be
232     // destroyed.  This has been introduced for the PreviewRenderer to
233     // free its view (that uses the item poll of the doc shell) but
234     // may be usefull in other places as well.
235 	Broadcast(SfxSimpleHint(SFX_HINT_DYING));
236 
237 	mbInDestruction = sal_True;
238 
239 	SetDocShellFunction(0);
240 
241 	delete mpFontList;
242 
243 	if( mpDoc )
244 		mpDoc->SetSdrUndoManager( 0 );
245 	delete mpUndoManager;
246 
247 	if (mbOwnPrinter)
248 		delete mpPrinter;
249 
250 	if( mbOwnDocument )
251 		delete mpDoc;
252 
253 	// damit der Navigator das Verschwinden des Dokuments mitbekommt
254 	SfxBoolItem		aItem(SID_NAVIGATOR_INIT, sal_True);
255 	SfxViewFrame*	pFrame = mpViewShell ? mpViewShell->GetFrame() : GetFrame();
256 
257 	if( !pFrame )
258 		pFrame = SfxViewFrame::GetFirst( this );
259 
260 	if( pFrame )
261 		pFrame->GetDispatcher()->Execute(
262 			SID_NAVIGATOR_INIT, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L);
263 }
264 
265 /*************************************************************************
266 |*
267 |* Slot-Stati setzen
268 |*
269 \************************************************************************/
270 
271 void DrawDocShell::GetState(SfxItemSet &rSet)
272 {
273 
274 	SfxWhichIter aIter( rSet );
275 	sal_uInt16 nWhich = aIter.FirstWhich();
276 
277 	while ( nWhich )
278 	{
279 		sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich)
280 			? GetPool().GetSlotId(nWhich)
281 			: nWhich;
282 
283 		switch ( nSlotId )
284 		{
285 			case SID_SEARCH_ITEM:
286 			{
287 				rSet.Put( *SD_MOD()->GetSearchItem() );
288 			}
289 			break;
290 
291 			case SID_CLOSEDOC:
292 			{
293 				sal_Bool bDisabled = sal_False;
294 				if (bDisabled)
295 				{
296 					rSet.DisableItem(SID_CLOSEDOC);
297 				}
298 				else
299 				{
300 					GetSlotState(SID_CLOSEDOC, SfxObjectShell::GetInterface(), &rSet);
301 				}
302 			}
303 			break;
304 
305 			case SID_SEARCH_OPTIONS:
306 			{
307 				sal_uInt16 nOpt = SEARCH_OPTIONS_SEARCH 	 |
308 							  SEARCH_OPTIONS_WHOLE_WORDS |
309 							  SEARCH_OPTIONS_BACKWARDS	 |
310 							  SEARCH_OPTIONS_REG_EXP	 |
311 							  SEARCH_OPTIONS_EXACT		 |
312 							  SEARCH_OPTIONS_SIMILARITY  |
313 							  SEARCH_OPTIONS_SELECTION;
314 
315 				if (!IsReadOnly())
316 				{
317 					nOpt |= SEARCH_OPTIONS_REPLACE;
318 					nOpt |= SEARCH_OPTIONS_REPLACE_ALL;
319 				}
320 
321 				rSet.Put(SfxUInt16Item(nWhich, nOpt));
322 			}
323 			break;
324 
325 			case SID_VERSION:
326 			{
327 				GetSlotState( SID_VERSION, SfxObjectShell::GetInterface(), &rSet );
328 			}
329 			break;
330 
331             case SID_CHINESE_CONVERSION:
332 			case SID_HANGUL_HANJA_CONVERSION:
333 			{
334                 rSet.Put(SfxVisibilityItem(nWhich, SvtCJKOptions().IsAnyEnabled()));
335 			}
336 			break;
337 
338 			default:
339 			break;
340 		}
341 		nWhich = aIter.NextWhich();
342 	}
343 
344     SfxViewFrame* pFrame = SfxViewFrame::Current();
345 
346 	if (pFrame)
347 	{
348 		if (rSet.GetItemState(SID_RELOAD) != SFX_ITEM_UNKNOWN)
349 		{
350 			pFrame->GetSlotState(SID_RELOAD,
351 								 pFrame->GetInterface(), &rSet);
352 		}
353 	}
354 }
355 
356 void DrawDocShell::InPlaceActivate( sal_Bool bActive )
357 {
358 	if( !bActive )
359 	{
360 		FrameView* pFrameView = NULL;
361 		List* pFrameViewList = mpDoc->GetFrameViewList();
362 
363 		DBG_ASSERT( pFrameViewList, "No FrameViewList?" );
364 		if( pFrameViewList )
365 		{
366 			sal_uInt32 i;
367 			for ( i = 0; i < pFrameViewList->Count(); i++)
368 			{
369 				// Ggf. FrameViews loeschen
370 				pFrameView = (FrameView*) pFrameViewList->GetObject(i);
371 
372 				if (pFrameView)
373 					delete pFrameView;
374 			}
375 
376 			pFrameViewList->Clear();
377 
378 			ViewShell* pViewSh = NULL;
379 			SfxViewShell* pSfxViewSh = NULL;
380 			SfxViewFrame* pSfxViewFrame = SfxViewFrame::GetFirst(this, false);
381 
382 			while (pSfxViewFrame)
383 			{
384 				// Anzahl FrameViews ermitteln
385 				pSfxViewSh = pSfxViewFrame->GetViewShell();
386 				pViewSh = PTR_CAST( ViewShell, pSfxViewSh );
387 
388 				if ( pViewSh && pViewSh->GetFrameView() )
389 				{
390 					pViewSh->WriteFrameViewData();
391 					pFrameViewList->Insert( new FrameView( mpDoc, pViewSh->GetFrameView() ) );
392 				}
393 
394 				pSfxViewFrame = SfxViewFrame::GetNext(*pSfxViewFrame, this, false);
395 			}
396 		}
397 	}
398 
399     SfxObjectShell::InPlaceActivate( bActive );
400 
401 	if( bActive )
402 	{
403 		List* pFrameViewList = mpDoc->GetFrameViewList();
404 
405 		DBG_ASSERT( pFrameViewList, "No FrameViewList?" );
406 		if( pFrameViewList )
407 		{
408 			ViewShell* pViewSh = NULL;
409 			SfxViewShell* pSfxViewSh = NULL;
410 			SfxViewFrame* pSfxViewFrame = SfxViewFrame::GetFirst(this, false);
411 
412 			sal_uInt32 i;
413 			for( i = 0; pSfxViewFrame && (i < pFrameViewList->Count()); i++ )
414 			{
415 				// Anzahl FrameViews ermitteln
416 				pSfxViewSh = pSfxViewFrame->GetViewShell();
417 				pViewSh = PTR_CAST( ViewShell, pSfxViewSh );
418 
419 				if ( pViewSh )
420 				{
421 					pViewSh->ReadFrameViewData( (FrameView*)pFrameViewList->GetObject(i) );
422 				}
423 
424 				pSfxViewFrame = SfxViewFrame::GetNext(*pSfxViewFrame, this, false);
425 			}
426 		}
427 	}
428 }
429 
430 /*************************************************************************
431 |*
432 |* SFX-Aktivierung
433 |*
434 \************************************************************************/
435 
436 void DrawDocShell::Activate( sal_Bool bMDI)
437 {
438 	if (bMDI)
439 	{
440 		ApplySlotFilter();
441 		mpDoc->StartOnlineSpelling();
442 	}
443 }
444 
445 /*************************************************************************
446 |*
447 |* SFX-Deaktivierung
448 |*
449 \************************************************************************/
450 
451 void DrawDocShell::Deactivate( sal_Bool )
452 {
453 }
454 
455 /*************************************************************************
456 |*
457 |* SFX-Undomanager zurueckgeben
458 |*
459 \************************************************************************/
460 
461 ::svl::IUndoManager* DrawDocShell::GetUndoManager()
462 {
463 	return mpUndoManager;
464 }
465 
466 
467 
468 /*************************************************************************
469 |*
470 |* Tabellenzeiger auffrischen
471 |*
472 \************************************************************************/
473 
474 void DrawDocShell::UpdateTablePointers()
475 {
476     PutItem( SvxColorTableItem( mpDoc->GetColorTable(), SID_COLOR_TABLE ) );
477     PutItem( SvxGradientListItem( mpDoc->GetGradientList(), SID_GRADIENT_LIST ) );
478     PutItem( SvxHatchListItem( mpDoc->GetHatchList(), SID_HATCH_LIST ) );
479     PutItem( SvxBitmapListItem( mpDoc->GetBitmapList(), SID_BITMAP_LIST ) );
480     PutItem( SvxDashListItem( mpDoc->GetDashList(), SID_DASH_LIST ) );
481     PutItem( SvxLineEndListItem( mpDoc->GetLineEndList(), SID_LINEEND_LIST ) );
482 
483 	UpdateFontList();
484 }
485 
486 /*************************************************************************
487 |*
488 |*
489 |*
490 \************************************************************************/
491 
492 void DrawDocShell::CancelSearching()
493 {
494 	if( dynamic_cast<FuSearch*>( mxDocShellFunction.get() ) )
495 	{
496 		SetDocShellFunction(0);
497 	}
498 }
499 
500 /*************************************************************************
501 |*
502 |*  den eingestellten SlotFilter anwenden
503 |*
504 \************************************************************************/
505 
506 void DrawDocShell::ApplySlotFilter() const
507 {
508     SfxViewShell* pTestViewShell = SfxViewShell::GetFirst();
509 
510     while( pTestViewShell )
511     {
512         if( pTestViewShell->GetObjectShell()
513             == const_cast<DrawDocShell*>( this )
514             && pTestViewShell->GetViewFrame()
515             && pTestViewShell->GetViewFrame()->GetDispatcher() )
516         {
517 	        SfxDispatcher* pDispatcher = pTestViewShell->GetViewFrame()->GetDispatcher();
518 
519 	        if( mpFilterSIDs )
520 		        pDispatcher->SetSlotFilter( mbFilterEnable, mnFilterCount, mpFilterSIDs );
521 	        else
522 		        pDispatcher->SetSlotFilter();
523 
524             if( pDispatcher->GetBindings() )
525                 pDispatcher->GetBindings()->InvalidateAll( sal_True );
526         }
527 
528         pTestViewShell = SfxViewShell::GetNext( *pTestViewShell );
529     }
530 }
531 
532 void DrawDocShell::SetModified( sal_Bool bSet /* = sal_True */ )
533 {
534     SfxObjectShell::SetModified( bSet );
535 
536     // #100237# change model state, too
537     // #103182# only set the changed state if modification is enabled
538     if( IsEnableSetModified() )
539 	{
540 		if ( mpDoc )
541         	mpDoc->NbcSetChanged( bSet );
542 
543 		Broadcast( SfxSimpleHint( SFX_HINT_DOCCHANGED ) );
544 	}
545 }
546 
547 /*************************************************************************
548 |*
549 |* Callback fuer ExecuteSpellPopup()
550 |*
551 \************************************************************************/
552 
553 // #91457# ExecuteSpellPopup now handled by DrawDocShell. This is necessary
554 // to get hands on the outliner and the text object.
555 IMPL_LINK(DrawDocShell, OnlineSpellCallback, SpellCallbackInfo*, pInfo)
556 {
557 	SdrObject* pObj = NULL;
558 	SdrOutliner* pOutl = NULL;
559 
560 	if(GetViewShell())
561 	{
562 		pOutl = GetViewShell()->GetView()->GetTextEditOutliner();
563 		pObj = GetViewShell()->GetView()->GetTextEditObject();
564 	}
565 
566 	mpDoc->ImpOnlineSpellCallback(pInfo, pObj, pOutl);
567 	return(0);
568 }
569 
570 void DrawDocShell::ClearUndoBuffer()
571 {
572 	// clear possible undo buffers of outliners
573 	SfxViewFrame* pSfxViewFrame = SfxViewFrame::GetFirst(this, false);
574 	while(pSfxViewFrame)
575 	{
576 		ViewShellBase* pViewShellBase = dynamic_cast< ViewShellBase* >( pSfxViewFrame->GetViewShell() );
577 		if( pViewShellBase )
578 		{
579 			::boost::shared_ptr<ViewShell> pViewSh( pViewShellBase->GetMainViewShell() );
580 			if( pViewSh.get() )
581 			{
582 				::sd::View* pView = pViewSh->GetView();
583 				if( pView )
584 				{
585 					pView->SdrEndTextEdit();
586 					sd::OutlineView* pOutlView = dynamic_cast< sd::OutlineView* >( pView );
587 					if( pOutlView )
588 					{
589 						SdrOutliner* pOutliner = pOutlView->GetOutliner();
590 						if( pOutliner )
591 							pOutliner->GetUndoManager().Clear();
592 					}
593 				}
594 			}
595 		}
596 		pSfxViewFrame = SfxViewFrame::GetNext(*pSfxViewFrame, this, false);
597 	}
598 
599 	::svl::IUndoManager* pUndoManager = GetUndoManager();
600     if(pUndoManager && pUndoManager->GetUndoActionCount())
601         pUndoManager->Clear();
602 }
603 
604 } // end of namespace sd
605