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_sw.hxx"
26
27
28 #include <sfx2/printer.hxx>
29 #include <rtl/logfile.hxx>
30 #include <doc.hxx>
31 #include <IDocumentUndoRedo.hxx>
32 #include <docsh.hxx>
33 #include <viewsh.hxx>
34 #include <rootfrm.hxx>
35 #include <viewimp.hxx>
36 #include <viewopt.hxx>
37 #include <txtfrm.hxx> // Zugriff auf TxtCache
38 #include <notxtfrm.hxx>
39 #include <fntcache.hxx>
40 #include <docufld.hxx>
41 #include <ptqueue.hxx>
42 #include <dview.hxx> // SdrView
43 #include <ndgrf.hxx>
44 #include <ndindex.hxx>
45 #include <accessibilityoptions.hxx>
46 #include <switerator.hxx>
47
48 /*************************************************************************
49 |*
50 |* ViewShell::Init()
51 |*************************************************************************/
52
Init(const SwViewOption * pNewOpt)53 void ViewShell::Init( const SwViewOption *pNewOpt )
54 {
55 RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722", "ViewShell::Init" );
56
57 bDocSizeChgd = sal_False;
58
59 // Wir gehen auf Nummer sicher:
60 // Wir muessen die alten Fontinformationen wegschmeissen,
61 // wenn die Druckeraufloesung oder der Zoomfaktor sich aendert.
62 // Init() und Reformat() sind die sichersten Stellen.
63 pFntCache->Flush( );
64
65 // ViewOptions werden dynamisch angelegt
66 if( !pOpt )
67 {
68 pOpt = new SwViewOption;
69
70 // Ein ApplyViewOptions braucht nicht gerufen zu werden
71 if( pNewOpt )
72 {
73 *pOpt = *pNewOpt;
74 // Der Zoomfaktor muss eingestellt werden, weil in der CTOR-
75 // phase aus Performancegruenden kein ApplyViewOptions gerufen wird.
76 if( GetWin() && 100 != pOpt->GetZoom() )
77 {
78 MapMode aMode( pWin->GetMapMode() );
79 const Fraction aNewFactor( pOpt->GetZoom(), 100 );
80 aMode.SetScaleX( aNewFactor );
81 aMode.SetScaleY( aNewFactor );
82 pWin->SetMapMode( aMode );
83 }
84 }
85 }
86
87 SwDocShell* pDShell = pDoc->GetDocShell();
88 pDoc->set(IDocumentSettingAccess::HTML_MODE, 0 != ::GetHtmlMode( pDShell ) );
89
90 // JP 02.02.99: Bug 61335 - Readonly-Flag an den ViewOptions setzen,
91 // bevor das Layout angelegt wird. Ansonsten muesste man
92 // nochmals durchformatieren!!
93 if( pDShell && pDShell->IsReadOnly() )
94 pOpt->SetReadonly( sal_True );
95
96 RTL_LOGFILE_CONTEXT_TRACE( aLog, "View::Init - before InitPrt" );
97
98 // --> FME 2007-11-06 #i82967#
99 OutputDevice* pPDFOut = 0;
100 if ( pOut && pOut->GetPDFWriter() )
101 pPDFOut = pOut;
102 // <--
103
104 // --> FME 2005-01-21 #i41075#
105 // Only setup the printer if we need one:
106 const bool bBrowseMode = pOpt->getBrowseMode();
107 if( pPDFOut )
108 InitPrt( pPDFOut );
109 // <--
110
111 // --> FME 2005-03-16 #i44963# Good occasion to check if page sizes in
112 // page descriptions are still set to (LONG_MAX, LONG_MAX) (html import)
113 if ( !bBrowseMode )
114 {
115 pDoc->CheckDefaultPageFmt();
116 }
117 // <--
118
119 RTL_LOGFILE_CONTEXT_TRACE( aLog, "View::Init - after InitPrt" );
120
121 if( GetWin() )
122 {
123 pOpt->Init( GetWin() );
124 GetWin()->SetFillColor();
125 GetWin()->SetBackground();
126 GetWin()->SetLineColor();
127 }
128
129 // Create a new layout, if there is no one available
130 if( !pLayout )
131 {
132 // Here's the code which disables the usage of "multiple" layouts at the moment
133 // If the problems with controls and groups objects are solved,
134 // this code can be removed...
135 ViewShell *pCurrShell = GetDoc()->GetCurrentViewShell();
136 if( pCurrShell )
137 pLayout = pCurrShell->pLayout;
138 // end of "disable multiple layouts"
139 if( !pLayout )
140 {
141 // switched to two step construction because creating the layout in SwRootFrm needs a valid pLayout set
142 pLayout = SwRootFrmPtr(new SwRootFrm( pDoc->GetDfltFrmFmt(), this ));//swmod081016
143 pLayout->Init( pDoc->GetDfltFrmFmt() );
144
145 // mba: the layout refactoring overlooked an important detail
146 // prior to that change, the layout always was destroyed in the dtor of swdoc
147 // it is necessary to suppress notifications in the layout when the layout is discarded in its dtor
148 // unfortunately this was done by asking whether the doc is in dtor - though the correct question should
149 // have been if the rootfrm is in dtor (or even better: discard the layout before the SwRootFrm is destroyed!)
150 // SwDoc::IsInDtor() is used at several places all over the code that need to be checked whether
151 // "pDoc->IsInDtor()" means what is says or in fact should check for "pRootFrm->IsInDtor()". As this will take some time, I decided
152 // to postpone that investigations and the changes it will bring to the 3.5 release and for 3.4 make sure
153 // that the layout still gets destroyed in the doc dtor. This is done by sharing "the" layout (that we still have) with the doc.
154 GetDoc()->ShareLayout( pLayout );
155 }
156 }
157 SizeChgNotify(); //swmod 071108
158
159 // --> #i31958#
160 // XForms mode: initialize XForms mode, based on design mode (draw view)
161 // MakeDrawView() requires layout
162 if( GetDoc()->isXForms() )
163 {
164 if( ! HasDrawView() )
165 MakeDrawView();
166 pOpt->SetFormView( ! GetDrawView()->IsDesignMode() );
167 }
168 // <-- #i31958#
169 }
170
171 /*************************************************************************
172 |*
173 |* ViewShell::ViewShell() CTor fuer die erste Shell.
174 |*************************************************************************/
175
ViewShell(SwDoc & rDocument,Window * pWindow,const SwViewOption * pNewOpt,OutputDevice * pOutput,long nFlags)176 ViewShell::ViewShell( SwDoc& rDocument, Window *pWindow,
177 const SwViewOption *pNewOpt, OutputDevice *pOutput,
178 long nFlags )
179 :
180 aBrowseBorder(),
181 pSfxViewShell( 0 ),
182 pImp( new SwViewImp( this ) ),
183 pWin( pWindow ),
184 pOut( pOutput ? pOutput
185 : pWindow ? (OutputDevice*)pWindow
186 : (OutputDevice*)rDocument.getPrinter( true )),
187 mpTmpRef( 0 ),
188 pOpt( 0 ),
189 pAccOptions( new SwAccessibilityOptions ),
190 mpTargetPaintWindow(0), // #i74769#
191 mpBufferedOut(0), // #i74769#
192 pDoc( &rDocument ),
193 nStartAction( 0 ),
194 nLockPaint( 0 ),
195 mnPrePostPaintCount(0L), // #i72754#
196 mpPrePostOutDev(0), // #i72754#
197 maPrePostMapMode()
198 {
199 RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722", "ViewShell::SwViewShell" );
200
201 // OD 2004-06-01 #i26791# - in order to suppress event handling in
202 // <SwDrawContact::Changed> during contruction of <ViewShell> instance
203 mbInConstructor = true;
204
205 bPaintInProgress = bViewLocked = bInEndAction = bFrameView =
206 bEndActionByVirDev = sal_False;
207 bPaintWorks = bEnableSmooth = sal_True;
208 bPreView = 0 !=( VSHELLFLAG_ISPREVIEW & nFlags );
209
210 // --> OD 2005-02-11 #i38810# - Do not reset modified state of document,
211 // if it's already been modified.
212 const bool bIsDocModified( pDoc->IsModified() );
213 // <--
214 pDoc->acquire();
215 pOutput = pOut;
216 Init( pNewOpt ); //verstellt ggf. das Outdev (InitPrt())
217 pOut = pOutput;
218
219 // OD 28.03.2003 #108470# - initialize print preview layout after layout
220 // is created in <ViewShell::Init(..)> - called above.
221 if ( bPreView )
222 {
223 // OD 12.12.2002 #103492# - init page preview layout
224 pImp->InitPagePreviewLayout();
225 }
226
227 SET_CURR_SHELL( this );
228
229 ((SwHiddenTxtFieldType*)pDoc->GetSysFldType( RES_HIDDENTXTFLD ))->
230 SetHiddenFlag( !pOpt->IsShowHiddenField() );
231
232 //In Init wird ein Standard-FrmFmt angelegt.
233 // --> OD 2005-02-11 #i38810#
234 if ( !pDoc->GetIDocumentUndoRedo().IsUndoNoResetModified()
235 && !bIsDocModified )
236 // <--
237 {
238 pDoc->ResetModified();
239 }
240
241 //Format-Cache erweitern.
242 if ( SwTxtFrm::GetTxtCache()->GetCurMax() < 2550 )
243 SwTxtFrm::GetTxtCache()->IncreaseMax( 100 );
244 if( pOpt->IsGridVisible() || getIDocumentDrawModelAccess()->GetDrawModel() )
245 Imp()->MakeDrawView();
246
247 // OD 2004-06-01 #i26791#
248 mbInConstructor = false;
249 }
250
251 /*************************************************************************
252 |*
253 |* ViewShell::ViewShell() CTor fuer weitere Shells auf ein Dokument.
254 |*************************************************************************/
255
ViewShell(ViewShell & rShell,Window * pWindow,OutputDevice * pOutput,long nFlags)256 ViewShell::ViewShell( ViewShell& rShell, Window *pWindow,
257 OutputDevice *pOutput, long nFlags ) :
258 Ring( &rShell ),
259 aBrowseBorder( rShell.aBrowseBorder ),
260 pSfxViewShell( 0 ),
261 pImp( new SwViewImp( this ) ),
262 pWin( pWindow ),
263 pOut( pOutput ? pOutput
264 : pWindow ? (OutputDevice*)pWindow
265 : (OutputDevice*)rShell.GetDoc()->getPrinter( true )),
266 mpTmpRef( 0 ),
267 pOpt( 0 ),
268 pAccOptions( new SwAccessibilityOptions ),
269 mpTargetPaintWindow(0), // #i74769#
270 mpBufferedOut(0), // #i74769#
271 pDoc( rShell.GetDoc() ),
272 nStartAction( 0 ),
273 nLockPaint( 0 ),
274 mnPrePostPaintCount(0L), // #i72754#
275 mpPrePostOutDev(0), // #i72754#
276 maPrePostMapMode()
277 {
278 RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722", "ViewShell::SwViewShell" );
279
280 // OD 2004-06-01 #i26791# - in order to suppress event handling in
281 // <SwDrawContact::Changed> during contruction of <ViewShell> instance
282 mbInConstructor = true;
283
284 bPaintWorks = bEnableSmooth = sal_True;
285 bPaintInProgress = bViewLocked = bInEndAction = bFrameView =
286 bEndActionByVirDev = sal_False;
287 bPreView = 0 !=( VSHELLFLAG_ISPREVIEW & nFlags );
288 if( nFlags & VSHELLFLAG_SHARELAYOUT ) //swmod 080125
289 pLayout = rShell.pLayout;//swmod 080125
290
291 SET_CURR_SHELL( this );
292
293 pDoc->acquire();
294 sal_Bool bModified = pDoc->IsModified();
295
296 pOutput = pOut;
297 Init( rShell.GetViewOptions() ); //verstellt ggf. das Outdev (InitPrt())
298 pOut = pOutput;
299
300 // OD 12.12.2002 #103492#
301 if ( bPreView )
302 pImp->InitPagePreviewLayout();
303
304 ((SwHiddenTxtFieldType*)pDoc->GetSysFldType( RES_HIDDENTXTFLD ))->
305 SetHiddenFlag( !pOpt->IsShowHiddenField() );
306
307 // in Init wird ein Standard-FrmFmt angelegt
308 if( !bModified && !pDoc->GetIDocumentUndoRedo().IsUndoNoResetModified() )
309 {
310 pDoc->ResetModified();
311 }
312
313 //Format-Cache erweitern.
314 if ( SwTxtFrm::GetTxtCache()->GetCurMax() < 2550 )
315 SwTxtFrm::GetTxtCache()->IncreaseMax( 100 );
316 if( pOpt->IsGridVisible() || getIDocumentDrawModelAccess()->GetDrawModel() )
317 Imp()->MakeDrawView();
318
319 // OD 2004-06-01 #i26791#
320 mbInConstructor = false;
321
322 }
323
324 /******************************************************************************
325 |*
326 |* ViewShell::~ViewShell()
327 |*
328 ******************************************************************************/
329
~ViewShell()330 ViewShell::~ViewShell()
331 {
332 {
333 SET_CURR_SHELL( this );
334 bPaintWorks = sal_False;
335
336 // FME 2004-06-21 #i9684# Stopping the animated graphics is not
337 // necessary during printing or pdf export, because the animation
338 // has not been started in this case.
339 if( pDoc && GetWin() )
340 {
341 SwNodes& rNds = pDoc->GetNodes();
342 SwGrfNode *pGNd;
343
344 SwStartNode *pStNd;
345 SwNodeIndex aIdx( *rNds.GetEndOfAutotext().StartOfSectionNode(), 1 );
346 while ( 0 != (pStNd = aIdx.GetNode().GetStartNode()) )
347 {
348 aIdx++;
349 if ( 0 != ( pGNd = aIdx.GetNode().GetGrfNode() ) )
350 {
351 if( pGNd->IsAnimated() )
352 {
353 SwIterator<SwFrm,SwGrfNode> aIter( *pGNd );
354 for( SwFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() )
355 {
356 ASSERT( pFrm->IsNoTxtFrm(), "GraphicNode with Text?" );
357 ((SwNoTxtFrm*)pFrm)->StopAnimation( pOut );
358 }
359 }
360 }
361 aIdx.Assign( *pStNd->EndOfSectionNode(), +1 );
362 }
363
364 GetDoc()->StopNumRuleAnimations( pOut );
365 }
366
367 delete pImp; //Erst loeschen, damit die LayoutViews vernichtet werden.
368 pImp = 0; // Set to zero, because ~SwFrm relies on it.
369
370 if ( pDoc )
371 {
372 if( !pDoc->release() )
373 delete pDoc, pDoc = 0;
374 else
375 GetLayout()->ResetNewLayout();
376 }//swmod 080317
377
378 delete pOpt;
379
380 //Format-Cache zurueckschrauben.
381 if ( SwTxtFrm::GetTxtCache()->GetCurMax() > 250 )
382 SwTxtFrm::GetTxtCache()->DecreaseMax( 100 );
383
384 //Ggf. aus der PaintQueue entfernen lassen
385 SwPaintQueue::Remove( this );
386
387 ASSERT( !nStartAction, "EndAction() pending." );
388 }
389
390 if ( pDoc )
391 {
392 GetLayout()->DeRegisterShell( this );
393 if(pDoc->GetCurrentViewShell()==this)
394 pDoc->SetCurrentViewShell( this->GetNext()!=this ?
395 (ViewShell*)this->GetNext() : NULL );
396 }
397
398 delete mpTmpRef;
399 delete pAccOptions;
400 }
401
HasDrawView() const402 sal_Bool ViewShell::HasDrawView() const
403 {
404 return Imp() ? Imp()->HasDrawView() : 0;
405 }
406
MakeDrawView()407 void ViewShell::MakeDrawView()
408 {
409 Imp()->MakeDrawView( );
410 }
411
GetDrawView()412 SdrView* ViewShell::GetDrawView()
413 {
414 return Imp()->GetDrawView();
415 }
416
GetDrawViewWithValidMarkList()417 SdrView* ViewShell::GetDrawViewWithValidMarkList()
418 {
419 SwDrawView* pDView = Imp()->GetDrawView();
420 pDView->ValidateMarkList();
421 return pDView;
422 }
423