Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include <string>
22 : #include <stdlib.h>
23 : #include <hintids.hxx>
24 : #include <comphelper/string.hxx>
25 : #include <officecfg/Office/Common.hxx>
26 : #include <rtl/logfile.hxx>
27 : #include <vcl/graph.hxx>
28 : #include <vcl/inputctx.hxx>
29 : #include <basic/sbxobj.hxx>
30 : #include <svl/eitem.hxx>
31 : #include <unotools/lingucfg.hxx>
32 : #include <unotools/useroptions.hxx>
33 : #include <sfx2/dispatch.hxx>
34 : #include <sfx2/request.hxx>
35 : #include <sfx2/docfile.hxx>
36 : #include <sfx2/printer.hxx>
37 : #include <sfx2/app.hxx>
38 : #include <svx/ruler.hxx>
39 : #include <editeng/protitem.hxx>
40 : #include <svx/fmshell.hxx>
41 : #include <svx/extrusionbar.hxx>
42 : #include <svx/fontworkbar.hxx>
43 : #include <unotxvw.hxx>
44 : #include <cmdid.h>
45 : #include <swhints.hxx>
46 : #include <swmodule.hxx>
47 : #include <inputwin.hxx>
48 : #include <chartins.hxx>
49 : #include <uivwimp.hxx>
50 : #include <uitool.hxx>
51 : #include <edtwin.hxx>
52 : #include <textsh.hxx>
53 : #include <listsh.hxx>
54 : #include <tabsh.hxx>
55 : #include <grfsh.hxx>
56 : #include <mediash.hxx>
57 : #include <docsh.hxx>
58 : #include <frmsh.hxx>
59 : #include <olesh.hxx>
60 : #include <drawsh.hxx>
61 : #include <drawbase.hxx>
62 : #include <drformsh.hxx>
63 : #include <drwtxtsh.hxx>
64 : #include <beziersh.hxx>
65 : #include <navsh.hxx>
66 : #include <globdoc.hxx>
67 : #include <scroll.hxx>
68 : #include <navipi.hxx>
69 : #include <gloshdl.hxx>
70 : #include <usrpref.hxx>
71 : #include <srcview.hxx>
72 : #include <doc.hxx>
73 : #include <IDocumentUndoRedo.hxx>
74 : #include <drawdoc.hxx>
75 : #include <wdocsh.hxx>
76 : #include <wview.hxx>
77 : #include <workctrl.hxx>
78 : #include <wrtsh.hxx>
79 : #include <barcfg.hxx>
80 : #include <pview.hxx>
81 : #include <swdtflvr.hxx>
82 : #include <view.hrc>
83 : #include <globdoc.hrc>
84 : #include <frmui.hrc>
85 : #include <cfgitems.hxx>
86 : #include <prtopt.hxx>
87 : #include <linguistic/lngprops.hxx>
88 : #include <editeng/unolingu.hxx>
89 : #include <com/sun/star/frame/FrameSearchFlag.hpp>
90 : #include <com/sun/star/scanner/ScannerContext.hpp>
91 : #include <com/sun/star/scanner/XScannerManager2.hpp>
92 : #include <toolkit/unohlp.hxx>
93 : #include <rtl/ustrbuf.hxx>
94 : #include <sax/tools/converter.hxx>
95 :
96 : #include "formatclipboard.hxx"
97 : #include <PostItMgr.hxx>
98 : #include <annotsh.hxx>
99 :
100 : #include <fldbas.hxx>
101 :
102 : #include <unomid.h>
103 :
104 : #include <com/sun/star/document/XDocumentProperties.hpp>
105 : #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
106 :
107 : #include <svl/cjkoptions.hxx>
108 :
109 : using namespace ::com::sun::star;
110 : using namespace ::com::sun::star::uno;
111 : using namespace ::com::sun::star::lang;
112 : using namespace ::com::sun::star::scanner;
113 : using ::rtl::OUString;
114 : using ::rtl::OUStringBuffer;
115 :
116 : extern sal_Bool bNoInterrupt; // in mainwn.cxx
117 :
118 : #define SWVIEWFLAGS ( SFX_VIEW_CAN_PRINT| \
119 : SFX_VIEW_HAS_PRINTOPTIONS)
120 :
121 : /*--------------------------------------------------------------------
122 : Beschreibung: Statics
123 : --------------------------------------------------------------------*/
124 :
125 : int bDocSzUpdated = 1;
126 :
127 : SvxSearchItem* SwView::pSrchItem = 0;
128 :
129 : sal_uInt16 SwView::nInsertCtrlState = FN_INSERT_TABLE;
130 : sal_uInt16 SwView::nWebInsertCtrlState = FN_INSERT_TABLE;
131 : sal_uInt16 SwView::nInsertObjectCtrlState = SID_INSERT_DIAGRAM;
132 :
133 : sal_Bool SwView::bExtra = sal_False;
134 : sal_Bool SwView::bFound = sal_False;
135 : sal_Bool SwView::bJustOpened = sal_False;
136 :
137 : SvxSearchDialog* SwView::pSrchDlg = 0;
138 : SearchAttrItemList* SwView::pSrchList = 0;
139 : SearchAttrItemList* SwView::pReplList = 0;
140 :
141 : DBG_NAME(viewhdl)
142 :
143 1022 : inline SfxDispatcher &SwView::GetDispatcher()
144 : {
145 1022 : return *GetViewFrame()->GetDispatcher();
146 : }
147 :
148 238 : void SwView::ImpSetVerb( int nSelType )
149 : {
150 238 : sal_Bool bResetVerbs = bVerbsActive;
151 238 : if ( !GetViewFrame()->GetFrame().IsInPlace() &&
152 : (nsSelectionType::SEL_OLE|nsSelectionType::SEL_GRF) & nSelType )
153 : {
154 0 : if ( !pWrtShell->IsSelObjProtected(FLYPROTECT_CONTENT) )
155 : {
156 0 : if ( nSelType & nsSelectionType::SEL_OLE )
157 : {
158 0 : SetVerbs( GetWrtShell().GetOLEObject()->getSupportedVerbs() );
159 0 : bVerbsActive = sal_True;
160 0 : bResetVerbs = sal_False;
161 : }
162 : }
163 : }
164 238 : if ( bResetVerbs )
165 : {
166 0 : SetVerbs( Sequence< embed::VerbDescriptor >() );
167 0 : bVerbsActive = sal_False;
168 : }
169 238 : }
170 :
171 : /*--------------------------------------------------------------------
172 : Description:
173 : called by the SwEditWin when it gets the focus
174 : --------------------------------------------------------------------*/
175 142 : void SwView::GotFocus() const
176 : {
177 : // if we got the focus, and the form shell *is* on the top of the dispatcher
178 : // stack, then we need to rebuild the stack (the form shell doesn't belong to
179 : // the top then)
180 142 : const SfxDispatcher& rDispatcher = const_cast< SwView* >( this )->GetDispatcher();
181 142 : SfxShell* pTopShell = rDispatcher.GetShell( 0 );
182 142 : FmFormShell* pAsFormShell = PTR_CAST( FmFormShell, pTopShell );
183 142 : if ( pAsFormShell )
184 : {
185 0 : pAsFormShell->ForgetActiveControl();
186 0 : const_cast< SwView* >( this )->AttrChangedNotify( pWrtShell );
187 : }
188 142 : else if ( mpPostItMgr )
189 : {
190 142 : SwAnnotationShell* pAsAnnotationShell = PTR_CAST( SwAnnotationShell, pTopShell );
191 142 : if ( pAsAnnotationShell )
192 : {
193 0 : mpPostItMgr->SetActiveSidebarWin(0);
194 0 : const_cast< SwView* >( this )->AttrChangedNotify( pWrtShell );
195 : }
196 : }
197 142 : if( GetWrtShellPtr() )
198 : {
199 142 : SwWrtShell& rWrtShell = GetWrtShell();
200 142 : rWrtShell.GetDoc()->SetCurrentViewShell( GetWrtShellPtr() );
201 142 : rWrtShell.GetDoc()->set( IDocumentSettingAccess::BROWSE_MODE,
202 142 : rWrtShell.GetViewOptions()->getBrowseMode() );
203 : }
204 142 : }
205 :
206 : /*--------------------------------------------------------------------
207 : Description:
208 : called by the FormShell when a form control is focused. This is
209 : a request to put the form shell on the top of the dispatcher
210 : stack
211 : --------------------------------------------------------------------*/
212 0 : IMPL_LINK_NOARG(SwView, FormControlActivated)
213 : {
214 : // if a form control has been activated, and the form shell is not on the top
215 : // of the dispatcher stack, then we need to activate it
216 0 : const SfxDispatcher& rDispatcher = GetDispatcher();
217 0 : const SfxShell* pTopShell = rDispatcher.GetShell( 0 );
218 0 : const FmFormShell* pAsFormShell = PTR_CAST( FmFormShell, pTopShell );
219 0 : if ( !pAsFormShell )
220 : {
221 : // if we're editing text currently, cancel this
222 0 : SdrView *pSdrView = pWrtShell ? pWrtShell->GetDrawView() : NULL;
223 0 : if ( pSdrView && pSdrView->IsTextEdit() )
224 0 : pSdrView->SdrEndTextEdit( sal_True );
225 :
226 0 : const_cast< SwView* >( this )->AttrChangedNotify( pWrtShell );
227 : }
228 :
229 0 : return 0L;
230 : }
231 :
232 558 : void SwView::SelectShell()
233 : {
234 : //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
235 : //
236 : // Achtung: SelectShell fuer die WebView mitpflegen
237 : //
238 : //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
239 :
240 558 : if(bInDtor)
241 558 : return;
242 : // Entscheidung, ob UpdateTable gerufen werden muss
243 558 : sal_Bool bUpdateTable = sal_False;
244 558 : const SwFrmFmt* pCurTableFmt = pWrtShell->GetTableFmt();
245 558 : if(pCurTableFmt && pCurTableFmt != pLastTableFormat)
246 : {
247 21 : bUpdateTable = sal_True; // kann erst spaeter ausgefuehrt werden
248 : }
249 558 : pLastTableFormat = pCurTableFmt;
250 :
251 : //SEL_TBL and SEL_TBL_CELLS can be changed!
252 558 : int nNewSelectionType = (pWrtShell->GetSelectionType()
253 558 : & ~nsSelectionType::SEL_TBL_CELLS);
254 :
255 558 : if ( pFormShell && pFormShell->IsActiveControl() )
256 0 : nNewSelectionType |= nsSelectionType::SEL_FOC_FRM_CTRL;
257 :
258 558 : if ( nNewSelectionType == nSelectionType )
259 : {
260 320 : GetViewFrame()->GetBindings().InvalidateAll( sal_False );
261 320 : if ( nSelectionType & nsSelectionType::SEL_OLE ||
262 : nSelectionType & nsSelectionType::SEL_GRF )
263 : //Fuer Grafiken und OLE kann sich natuerlich das Verb aendern!
264 0 : ImpSetVerb( nNewSelectionType );
265 : }
266 : else
267 : {
268 :
269 238 : SfxDispatcher &rDispatcher = GetDispatcher();
270 238 : SwToolbarConfigItem *pBarCfg = SW_MOD()->GetToolbarConfig();
271 :
272 238 : if ( pShell )
273 : {
274 2 : rDispatcher.Flush(); // alle gecachten Shells wirklich loeschen
275 :
276 : //Zur alten Selektion merken welche Toolbar sichtbar war
277 2 : sal_uInt16 nId = static_cast< sal_uInt16 >( rDispatcher.GetObjectBarId( SFX_OBJECTBAR_OBJECT ));
278 2 : if ( nId )
279 2 : pBarCfg->SetTopToolbar( nSelectionType, nId );
280 :
281 : SfxShell *pSfxShell;
282 8 : for ( sal_uInt16 i = 0; sal_True; ++i )
283 : {
284 8 : pSfxShell = rDispatcher.GetShell( i );
285 24 : if ( pSfxShell->ISA( SwBaseShell )
286 4 : || pSfxShell->ISA( SwDrawTextShell )
287 4 : || pSfxShell->ISA( svx::ExtrusionBar )
288 4 : || pSfxShell->ISA( svx::FontworkBar )
289 4 : || pSfxShell->ISA( SwAnnotationShell )
290 : )
291 : {
292 4 : rDispatcher.Pop( *pSfxShell, SFX_SHELL_POP_DELETE );
293 : }
294 4 : else if ( pSfxShell->ISA( FmFormShell ) )
295 : {
296 2 : rDispatcher.Pop( *pSfxShell );
297 : }
298 : else
299 2 : break;
300 : }
301 : }
302 :
303 238 : sal_Bool bInitFormShell = sal_False;
304 238 : if (!pFormShell)
305 : {
306 236 : bInitFormShell = sal_True;
307 236 : pFormShell = new FmFormShell( this );
308 236 : pFormShell->SetControlActivationHandler( LINK( this, SwView, FormControlActivated ) );
309 236 : StartListening(*pFormShell);
310 : }
311 :
312 238 : sal_Bool bSetExtInpCntxt = sal_False;
313 238 : nSelectionType = nNewSelectionType;
314 : ShellModes eShellMode;
315 :
316 238 : if ( !( nSelectionType & nsSelectionType::SEL_FOC_FRM_CTRL ) )
317 238 : rDispatcher.Push( *pFormShell );
318 :
319 238 : eShellMode = SHELL_MODE_NAVIGATION;
320 238 : pShell = new SwNavigationShell( *this );
321 238 : rDispatcher.Push( *pShell );
322 :
323 238 : if ( nSelectionType & nsSelectionType::SEL_OLE )
324 : {
325 0 : eShellMode = SHELL_MODE_OBJECT;
326 0 : pShell = new SwOleShell( *this );
327 0 : rDispatcher.Push( *pShell );
328 : }
329 238 : else if ( nSelectionType & nsSelectionType::SEL_FRM
330 : || nSelectionType & nsSelectionType::SEL_GRF)
331 : {
332 0 : eShellMode = SHELL_MODE_FRAME;
333 0 : pShell = new SwFrameShell( *this );
334 0 : rDispatcher.Push( *pShell );
335 0 : if(nSelectionType & nsSelectionType::SEL_GRF )
336 : {
337 0 : eShellMode = SHELL_MODE_GRAPHIC;
338 0 : pShell = new SwGrfShell( *this );
339 0 : rDispatcher.Push( *pShell );
340 : }
341 : }
342 238 : else if ( nSelectionType & nsSelectionType::SEL_DRW )
343 : {
344 0 : eShellMode = SHELL_MODE_DRAW;
345 0 : pShell = new SwDrawShell( *this );
346 0 : rDispatcher.Push( *pShell );
347 :
348 0 : if ( nSelectionType & nsSelectionType::SEL_BEZ )
349 : {
350 0 : eShellMode = SHELL_MODE_BEZIER;
351 0 : pShell = new SwBezierShell( *this );
352 0 : rDispatcher.Push( *pShell );
353 : }
354 0 : else if( nSelectionType & nsSelectionType::SEL_MEDIA )
355 : {
356 0 : eShellMode = SHELL_MODE_MEDIA;
357 0 : pShell = new SwMediaShell( *this );
358 0 : rDispatcher.Push( *pShell );
359 : }
360 :
361 0 : if (nSelectionType & nsSelectionType::SEL_EXTRUDED_CUSTOMSHAPE)
362 : {
363 0 : eShellMode = SHELL_MODE_EXTRUDED_CUSTOMSHAPE;
364 0 : pShell = new svx::ExtrusionBar(this);
365 0 : rDispatcher.Push( *pShell );
366 : }
367 0 : if (nSelectionType & nsSelectionType::SEL_FONTWORK)
368 : {
369 0 : eShellMode = SHELL_MODE_FONTWORK;
370 0 : pShell = new svx::FontworkBar(this);
371 0 : rDispatcher.Push( *pShell );
372 : }
373 : }
374 238 : else if ( nSelectionType & nsSelectionType::SEL_DRW_FORM )
375 : {
376 0 : eShellMode = SHELL_MODE_DRAW_FORM;
377 0 : pShell = new SwDrawFormShell( *this );
378 :
379 0 : rDispatcher.Push( *pShell );
380 : }
381 238 : else if ( nSelectionType & nsSelectionType::SEL_DRW_TXT )
382 : {
383 0 : bSetExtInpCntxt = sal_True;
384 0 : eShellMode = SHELL_MODE_DRAWTEXT;
385 0 : rDispatcher.Push( *(new SwBaseShell( *this )) );
386 0 : pShell = new SwDrawTextShell( *this );
387 0 : rDispatcher.Push( *pShell );
388 : }
389 238 : else if ( nSelectionType & nsSelectionType::SEL_POSTIT )
390 : {
391 0 : eShellMode = SHELL_MODE_POSTIT;
392 0 : pShell = new SwAnnotationShell( *this );
393 0 : rDispatcher.Push( *pShell );
394 : }
395 : else
396 : {
397 238 : bSetExtInpCntxt = sal_True;
398 238 : eShellMode = SHELL_MODE_TEXT;
399 238 : sal_uInt32 nHelpId = 0;
400 238 : if ( nSelectionType & nsSelectionType::SEL_NUM )
401 : {
402 7 : eShellMode = SHELL_MODE_LIST_TEXT;
403 7 : pShell = new SwListShell( *this );
404 7 : nHelpId = pShell->GetHelpId();
405 7 : rDispatcher.Push( *pShell );
406 : }
407 238 : pShell = new SwTextShell(*this);
408 238 : if(nHelpId)
409 7 : pShell->SetHelpId(nHelpId);
410 238 : rDispatcher.Push( *pShell );
411 238 : if ( nSelectionType & nsSelectionType::SEL_TBL )
412 : {
413 : eShellMode = eShellMode == SHELL_MODE_LIST_TEXT ? SHELL_MODE_TABLE_LIST_TEXT
414 15 : : SHELL_MODE_TABLE_TEXT;
415 15 : pShell = new SwTableShell( *this );
416 15 : rDispatcher.Push( *pShell );
417 : }
418 : }
419 :
420 238 : if ( nSelectionType & nsSelectionType::SEL_FOC_FRM_CTRL )
421 0 : rDispatcher.Push( *pFormShell );
422 :
423 238 : pViewImpl->SetShellMode(eShellMode);
424 238 : ImpSetVerb( nSelectionType );
425 :
426 238 : if( !GetDocShell()->IsReadOnly() )
427 : {
428 238 : if( bSetExtInpCntxt && GetWrtShell().HasReadonlySel() )
429 1 : bSetExtInpCntxt = sal_False;
430 :
431 238 : InputContext aCntxt( GetEditWin().GetInputContext() );
432 : aCntxt.SetOptions( bSetExtInpCntxt
433 237 : ? (aCntxt.GetOptions() |
434 : ( INPUTCONTEXT_TEXT |
435 : INPUTCONTEXT_EXTTEXTINPUT ))
436 1 : : (aCntxt.GetOptions() & ~
437 : ( INPUTCONTEXT_TEXT |
438 476 : INPUTCONTEXT_EXTTEXTINPUT )) );
439 238 : GetEditWin().SetInputContext( aCntxt );
440 : }
441 :
442 : //Zur neuen Selektion die Toolbar aktivieren, die auch beim letzten Mal
443 : //aktiviert war
444 : //Vorher muss ein Flush() sein, betrifft aber lt. MBA nicht das UI und ist
445 : //kein Performance-Problem
446 : // TODO/LATER: maybe now the Flush() command is superfluous?!
447 238 : rDispatcher.Flush();
448 :
449 238 : Point aPnt = GetEditWin().OutputToScreenPixel(GetEditWin().GetPointerPosPixel());
450 238 : aPnt = GetEditWin().PixelToLogic(aPnt);
451 238 : GetEditWin().UpdatePointer(aPnt);
452 :
453 238 : SdrView* pDView = GetWrtShell().GetDrawView();
454 238 : if ( bInitFormShell && pDView )
455 236 : pFormShell->SetView(PTR_CAST(FmFormView, pDView));
456 :
457 : }
458 : //Guenstiger Zeitpunkt fuer die Kommunikation mit OLE-Objekten?
459 558 : if ( GetDocShell()->GetDoc()->IsOLEPrtNotifyPending() )
460 1 : GetDocShell()->GetDoc()->PrtOLENotify( sal_False );
461 :
462 : // now the table-update
463 558 : if(bUpdateTable)
464 21 : pWrtShell->UpdateTable();
465 :
466 558 : GetViewImpl()->GetUNOObject_Impl()->NotifySelChanged();
467 : }
468 :
469 : //Zusammenspiel: AttrChangedNotify() und TimeoutHdl.
470 : //Falls noch Actions offen sind keine Aktualisierung, da der
471 : //Cursor auf der Core-Seite im Wald stehen kann.
472 : //Da wir aber keine Stati mehr liefern koennen und wollen locken wir
473 : //stattdessen den Dispatcher.
474 :
475 : extern "C"
476 : {
477 0 : static int lcl_CmpIds( const void *pFirst, const void *pSecond)
478 : {
479 0 : return (*(sal_uInt16*)pFirst) - (*(sal_uInt16*)pSecond);
480 : }
481 : }
482 :
483 408 : IMPL_LINK_NOARG(SwView, AttrChangedNotify)
484 : {
485 322 : if ( GetEditWin().IsChainMode() )
486 0 : GetEditWin().SetChainMode( sal_False );
487 :
488 : //Opt: Nicht wenn PaintLocked. Beim Unlock wird dafuer nocheinmal ein
489 : //Notify ausgeloest.
490 642 : if( !pWrtShell->IsPaintLocked() && !bNoInterrupt &&
491 320 : GetDocShell()->IsReadOnly() )
492 0 : _CheckReadonlyState();
493 :
494 322 : if( !pWrtShell->IsPaintLocked() && !bNoInterrupt )
495 320 : _CheckReadonlySelection();
496 :
497 322 : if( !bAttrChgNotified )
498 : {
499 966 : if ( pWrtShell->BasicActionPend() || bNoInterrupt ||
500 322 : GetDispatcher().IsLocked() || //do not confuse the SFX
501 322 : GetViewFrame()->GetBindings().IsInUpdate() )//do not confuse the SFX
502 : {
503 0 : bAttrChgNotified = sal_True;
504 0 : aTimer.Start();
505 :
506 : const SfxPoolItem *pItem;
507 0 : if ( SFX_ITEM_SET != GetObjectShell()->GetMedium()->GetItemSet()->
508 0 : GetItemState( SID_HIDDEN, sal_False, &pItem ) ||
509 0 : !((SfxBoolItem*)pItem)->GetValue() )
510 : {
511 0 : GetViewFrame()->GetBindings().ENTERREGISTRATIONS();
512 0 : bAttrChgNotifiedWithRegistrations = sal_True;
513 : }
514 :
515 : }
516 : else
517 322 : SelectShell();
518 :
519 : }
520 :
521 : // change ui if cursor is at a SwPostItField
522 322 : if (mpPostItMgr)
523 : {
524 : // only perform the code that is needed to determine, if at the
525 : // actual cursor position is a post-it field
526 322 : mpPostItMgr->SetShadowState( pWrtShell->GetPostItFieldAtCursor() );
527 : }
528 :
529 322 : return 0;
530 : }
531 :
532 0 : IMPL_LINK_NOARG(SwView, TimeoutHdl)
533 : {
534 : DBG_PROFSTART(viewhdl);
535 :
536 0 : if( pWrtShell->BasicActionPend() || bNoInterrupt )
537 : {
538 0 : aTimer.Start();
539 : DBG_PROFSTOP(viewhdl);
540 0 : return 0;
541 : }
542 :
543 0 : if ( bAttrChgNotifiedWithRegistrations )
544 : {
545 0 : GetViewFrame()->GetBindings().LEAVEREGISTRATIONS();
546 0 : bAttrChgNotifiedWithRegistrations = sal_False;
547 : }
548 :
549 0 : _CheckReadonlyState();
550 0 : _CheckReadonlySelection();
551 :
552 0 : sal_Bool bOldUndo = pWrtShell->DoesUndo();
553 0 : pWrtShell->DoUndo( sal_False );
554 0 : SelectShell();
555 0 : pWrtShell->DoUndo( bOldUndo );
556 0 : bAttrChgNotified = sal_False;
557 0 : GetViewImpl()->GetUNOObject_Impl()->NotifySelChanged();
558 :
559 : DBG_PROFSTOP(viewhdl);
560 0 : return 0;
561 : }
562 :
563 0 : void SwView::_CheckReadonlyState()
564 : {
565 0 : SfxDispatcher &rDis = GetDispatcher();
566 : //Um erkennen zu koennen ob bereits disabled ist!
567 : SfxItemState eStateRO, eStateProtAll;
568 : const SfxPoolItem *pItem;
569 : // von einem nur uns bekannten Slot den Status abfragen.
570 : // Ansonsten kennen andere den Slot; wie z.B. die BasidIde
571 0 : eStateRO = rDis.QueryState( FN_INSERT_BOOKMARK, pItem );
572 0 : eStateProtAll = rDis.QueryState( FN_EDIT_REGION, pItem );
573 0 : sal_Bool bChgd = sal_False;
574 :
575 0 : if ( !pWrtShell->IsCrsrReadonly() )
576 : {
577 : static sal_uInt16 aROIds[] =
578 : {
579 : SID_DELETE, FN_BACKSPACE, FN_SHIFT_BACKSPACE,
580 : SID_UNDO,
581 : SID_REDO, SID_REPEAT, SID_PASTE,
582 : SID_PASTE_UNFORMATTED,
583 : SID_PASTE_SPECIAL, SID_SBA_BRW_INSERT,
584 : SID_BACKGROUND_COLOR, FN_INSERT_BOOKMARK,
585 : SID_CHARMAP, FN_INSERT_SOFT_HYPHEN,
586 : FN_INSERT_HARDHYPHEN, FN_INSERT_HARD_SPACE, FN_INSERT_BREAK,
587 : FN_INSERT_LINEBREAK, FN_INSERT_COLUMN_BREAK, FN_INSERT_BREAK_DLG,
588 : FN_DELETE_SENT, FN_DELETE_BACK_SENT, FN_DELETE_WORD,
589 : FN_DELETE_BACK_WORD, FN_DELETE_LINE, FN_DELETE_BACK_LINE,
590 : FN_DELETE_PARA, FN_DELETE_BACK_PARA, FN_DELETE_WHOLE_LINE,
591 : FN_CALCULATE, FN_FORMAT_RESET,
592 : FN_POSTIT, FN_JAVAEDIT, SID_ATTR_PARA_ADJUST_LEFT,
593 : SID_ATTR_PARA_ADJUST_RIGHT, SID_ATTR_PARA_ADJUST_CENTER,SID_ATTR_PARA_ADJUST_BLOCK,
594 : SID_ATTR_PARA_LINESPACE_10, SID_ATTR_PARA_LINESPACE_15, SID_ATTR_PARA_LINESPACE_20,
595 : SID_ATTR_CHAR_FONT, SID_ATTR_CHAR_FONTHEIGHT, SID_ATTR_CHAR_COLOR_BACKGROUND,
596 : SID_ATTR_CHAR_COLOR_BACKGROUND_EXT, SID_ATTR_CHAR_COLOR_EXT,
597 : SID_ATTR_CHAR_COLOR, SID_ATTR_CHAR_WEIGHT, SID_ATTR_CHAR_POSTURE,
598 : SID_ATTR_CHAR_OVERLINE,
599 : SID_ATTR_CHAR_UNDERLINE, SID_ATTR_FLASH, SID_ATTR_CHAR_STRIKEOUT,
600 : FN_UNDERLINE_DOUBLE, SID_ATTR_CHAR_CONTOUR, SID_ATTR_CHAR_SHADOWED,
601 : SID_ATTR_CHAR_AUTOKERN, SID_ATTR_CHAR_ESCAPEMENT, FN_SET_SUPER_SCRIPT,
602 : FN_SET_SUB_SCRIPT, SID_ATTR_CHAR_CASEMAP, SID_ATTR_CHAR_LANGUAGE,
603 : SID_ATTR_CHAR_KERNING, SID_CHAR_DLG, SID_ATTR_CHAR_WORDLINEMODE,
604 : FN_GROW_FONT_SIZE, FN_SHRINK_FONT_SIZE, FN_TXTATR_INET,
605 : FN_FORMAT_DROPCAPS, SID_ATTR_PARA_ADJUST, SID_ATTR_PARA_LINESPACE,
606 : SID_ATTR_PARA_SPLIT, SID_ATTR_PARA_KEEP, SID_ATTR_PARA_WIDOWS,
607 : SID_ATTR_PARA_ORPHANS,
608 : SID_ATTR_PARA_MODEL, SID_PARA_DLG,
609 : FN_SELECT_PARA, SID_DEC_INDENT,
610 : SID_INC_INDENT
611 : };
612 : static sal_Bool bFirst = sal_True;
613 0 : if ( bFirst )
614 : {
615 0 : qsort( (void*)aROIds, sizeof(aROIds)/sizeof(sal_uInt16), sizeof(sal_uInt16), lcl_CmpIds );
616 0 : bFirst = sal_False;
617 : }
618 0 : if ( SFX_ITEM_DISABLED == eStateRO )
619 : {
620 0 : rDis.SetSlotFilter( sal_Bool(2), sizeof(aROIds)/sizeof(sal_uInt16), aROIds );
621 0 : bChgd = sal_True;
622 : }
623 : }
624 0 : else if( pWrtShell->IsAllProtect() )
625 : {
626 0 : if ( SFX_ITEM_DISABLED == eStateProtAll )
627 : {
628 : static sal_uInt16 aAllProtIds[] = { SID_SAVEDOC, FN_EDIT_REGION };
629 : static sal_Bool bAllProtFirst = sal_True;
630 0 : if ( bAllProtFirst )
631 : {
632 0 : qsort( (void*)aAllProtIds, sizeof(aAllProtIds)/sizeof(sal_uInt16), sizeof(sal_uInt16), lcl_CmpIds );
633 0 : bAllProtFirst = sal_False;
634 : }
635 : rDis.SetSlotFilter( sal_Bool(2),
636 : sizeof(aAllProtIds)/sizeof(sal_uInt16),
637 0 : aAllProtIds );
638 0 : bChgd = sal_True;
639 : }
640 : }
641 0 : else if ( SFX_ITEM_DISABLED != eStateRO ||
642 : SFX_ITEM_DISABLED != eStateProtAll )
643 : {
644 0 : bChgd = sal_True;
645 0 : rDis.SetSlotFilter();
646 : }
647 0 : if ( bChgd )
648 0 : GetViewFrame()->GetBindings().InvalidateAll(sal_True);
649 0 : }
650 :
651 320 : void SwView::_CheckReadonlySelection()
652 : {
653 320 : sal_uInt32 nDisableFlags = 0;
654 320 : SfxDispatcher &rDis = GetDispatcher();
655 :
656 322 : if( pWrtShell->HasReadonlySel() &&
657 1 : ( !pWrtShell->GetDrawView() ||
658 1 : !pWrtShell->GetDrawView()->GetMarkedObjectList().GetMarkCount() ))
659 1 : nDisableFlags |= SW_DISABLE_ON_PROTECTED_CURSOR;
660 :
661 320 : if( (SW_DISABLE_ON_PROTECTED_CURSOR & nDisableFlags ) !=
662 320 : (SW_DISABLE_ON_PROTECTED_CURSOR & rDis.GetDisableFlags() ) )
663 : {
664 : // zusaetzlich am Window den InputContext umsetzen, damit in
665 : // japanischen / chinesischen Versionen die externe Eingabe
666 : // ab-/angeschaltet wird. Das aber nur wenn auch die richtige
667 : // Shell auf dem Stack steht.
668 1 : switch( pViewImpl->GetShellMode() )
669 : {
670 : case SHELL_MODE_TEXT:
671 : case SHELL_MODE_LIST_TEXT:
672 : case SHELL_MODE_TABLE_TEXT:
673 : case SHELL_MODE_TABLE_LIST_TEXT:
674 : {
675 : // temporaere Loesung!!! Sollte bei jeder Cursorbewegung
676 : // den Font von der akt. Einfuegeposition setzen, also ausserhalb
677 : // dieses if's. Aber TH wertet den Font zur Zeit nicht aus und
678 : // das besorgen erscheint mir hier zu teuer zu sein.
679 : // Ausserdem haben wir keinen Font, sondern nur Attribute aus denen
680 : // die Textformatierung dann den richtigen Font zusammen baut.
681 :
682 1 : InputContext aCntxt( GetEditWin().GetInputContext() );
683 : aCntxt.SetOptions( SW_DISABLE_ON_PROTECTED_CURSOR & nDisableFlags
684 1 : ? (aCntxt.GetOptions() & ~
685 : ( INPUTCONTEXT_TEXT |
686 : INPUTCONTEXT_EXTTEXTINPUT ))
687 0 : : (aCntxt.GetOptions() |
688 : ( INPUTCONTEXT_TEXT |
689 2 : INPUTCONTEXT_EXTTEXTINPUT )) );
690 1 : GetEditWin().SetInputContext( aCntxt );
691 : }
692 1 : break;
693 : default:
694 : ;
695 : }
696 :
697 : }
698 :
699 320 : if( nDisableFlags != rDis.GetDisableFlags() )
700 : {
701 1 : rDis.SetDisableFlags( nDisableFlags );
702 1 : GetViewFrame()->GetBindings().InvalidateAll( sal_True );
703 : }
704 320 : }
705 :
706 236 : SwView::SwView( SfxViewFrame *_pFrame, SfxViewShell* pOldSh )
707 : : SfxViewShell( _pFrame, SWVIEWFLAGS ),
708 : aPageStr( SW_RES( STR_PAGE )),
709 : nNewPage(USHRT_MAX),
710 : pNumRuleNodeFromDoc(0),
711 236 : pEditWin( new SwEditWin( &_pFrame->GetWindow(), *this ) ),
712 : pWrtShell(0),
713 : pShell(0),
714 : pFormShell(0),
715 : pHScrollbar(0),
716 : pVScrollbar(0),
717 472 : pScrollFill(new ScrollBarBox( &_pFrame->GetWindow(), _pFrame->GetFrame().GetParentFrame() ? 0 : WB_SIZEABLE )),
718 236 : pHRuler( new SvxRuler(&GetViewFrame()->GetWindow(), pEditWin,
719 : SVXRULER_SUPPORT_TABS |
720 : SVXRULER_SUPPORT_PARAGRAPH_MARGINS |
721 : SVXRULER_SUPPORT_BORDERS |
722 : SVXRULER_SUPPORT_NEGATIVE_MARGINS|
723 : SVXRULER_SUPPORT_REDUCED_METRIC,
724 236 : GetViewFrame()->GetBindings(),
725 236 : WB_STDRULER | WB_EXTRAFIELD | WB_BORDER)),
726 236 : pVRuler(new SvxRuler(&GetViewFrame()->GetWindow(), pEditWin,
727 : SVXRULER_SUPPORT_TABS | SVXRULER_SUPPORT_PARAGRAPH_MARGINS_VERTICAL|
728 : SVXRULER_SUPPORT_BORDERS | SVXRULER_SUPPORT_REDUCED_METRIC,
729 236 : GetViewFrame()->GetBindings(),
730 236 : WB_VSCROLL | WB_EXTRAFIELD | WB_BORDER )),
731 : pTogglePageBtn(0),
732 : pPageUpBtn(0),
733 : pPageDownBtn(0),
734 : pNaviBtn(0),
735 : pGlosHdl(0),
736 : pDrawActual(0),
737 : pLastTableFormat(0),
738 0 : pFormatClipboard(new SwFormatClipboard()),
739 : mpPostItMgr(0),
740 : nSelectionType( INT_MAX ),
741 : nPageCnt(0),
742 : nDrawSfxId( USHRT_MAX ),
743 : nFormSfxId( USHRT_MAX ),
744 : nLastPasteDestination( 0xFFFF ),
745 : nLeftBorderDistance( 0 ),
746 : nRightBorderDistance( 0 ),
747 : bInMailMerge(sal_False),
748 : bInDtor(sal_False),
749 : bOldShellWasPagePreView(sal_False),
750 2360 : bIsPreviewDoubleClick(sal_False)
751 : {
752 : // According to discussion with MBA and further
753 : // investigations, no old SfxViewShell will be set as parameter <pOldSh>,
754 : // if function "New Window" is performed to open an additional view beside
755 : // an already existing one.
756 : // If the view is switch from one to another, the 'old' view is given by
757 : // parameter <pOldSh>.
758 :
759 : RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722", "SwView::SwView" );
760 :
761 : bCenterCrsr = bTopCrsr = bAllwaysShowSel = bTabColFromDoc = bTabRowFromDoc =
762 : bSetTabColFromDoc = bSetTabRowFromDoc = bAttrChgNotified = bAttrChgNotifiedWithRegistrations =
763 : bVerbsActive = bDrawRotate = bInOuterResizePixel = bInInnerResizePixel =
764 236 : bPasteState = bPasteSpecialState = bMakeSelectionVisible = sal_False;
765 :
766 236 : bShowAtResize = bDrawSelMode = bDocSzUpdated = sal_True;
767 :
768 236 : _CreateScrollbar( sal_True );
769 236 : _CreateScrollbar( sal_False );
770 :
771 236 : pViewImpl = new SwView_Impl(this);
772 236 : SetName(rtl::OUString("View"));
773 236 : SetWindow( pEditWin );
774 :
775 236 : aTimer.SetTimeout( 120 );
776 :
777 236 : SwDocShell* pDocSh = PTR_CAST( SwDocShell, _pFrame->GetObjectShell() );
778 236 : sal_Bool bOldModifyFlag = pDocSh->IsEnableSetModified();
779 236 : if(bOldModifyFlag)
780 236 : pDocSh->EnableSetModified( sal_False );
781 : OSL_ENSURE( pDocSh, "view without DocShell." );
782 236 : SwWebDocShell* pWebDShell = PTR_CAST( SwWebDocShell, pDocSh );
783 :
784 236 : const SwMasterUsrPref *pUsrPref = SW_MOD()->GetUsrPref(0 != pWebDShell);
785 236 : SwViewOption aUsrPref( *pUsrPref);
786 :
787 : //! get lingu options without loading lingu DLL
788 236 : SvtLinguOptions aLinguOpt;
789 236 : SvtLinguConfig().GetOptions( aLinguOpt );
790 236 : aUsrPref.SetOnlineSpell( aLinguOpt.bIsSpellAuto );
791 :
792 236 : sal_Bool bOldShellWasSrcView = sal_False;
793 :
794 : // determine if there is an existing view for
795 : // document
796 236 : SfxViewShell* pExistingSh = 0;
797 236 : if ( pOldSh )
798 : {
799 0 : pExistingSh = pOldSh;
800 : // determine type of existing view
801 0 : if( pExistingSh->IsA( TYPE( SwPagePreView ) ) )
802 : {
803 0 : sSwViewData = ((SwPagePreView*)pExistingSh)->GetPrevSwViewData();
804 0 : sNewCrsrPos = ((SwPagePreView*)pExistingSh)->GetNewCrsrPos();
805 0 : nNewPage = ((SwPagePreView*)pExistingSh)->GetNewPage();
806 0 : bOldShellWasPagePreView = sal_True;
807 0 : bIsPreviewDoubleClick = sNewCrsrPos.Len() > 0 || nNewPage != USHRT_MAX;
808 : }
809 0 : else if( pExistingSh->IsA( TYPE( SwSrcView ) ) )
810 0 : bOldShellWasSrcView = sal_True;
811 : }
812 :
813 : RTL_LOGFILE_CONTEXT_TRACE( aLog, "before create WrtShell" );
814 236 : if(PTR_CAST( SwView, pExistingSh))
815 : {
816 : pWrtShell = new SwWrtShell( *((SwView*)pExistingSh)->pWrtShell,
817 0 : pEditWin, *this);
818 : }
819 236 : else if( dynamic_cast<SwWrtShell*>( pDocSh->GetDoc()->GetCurrentViewShell() ) )
820 : {
821 0 : pWrtShell = new SwWrtShell( *(SwWrtShell*)pDocSh->GetDoc()->GetCurrentViewShell(),
822 0 : pEditWin, *this);
823 : }
824 : else
825 : {
826 236 : SwDoc& rDoc = *((SwDocShell*)pDocSh)->GetDoc();
827 :
828 236 : if( !bOldShellWasSrcView && pWebDShell && !bOldShellWasPagePreView )
829 0 : aUsrPref.setBrowseMode( sal_True );
830 : else
831 236 : aUsrPref.setBrowseMode( rDoc.get(IDocumentSettingAccess::BROWSE_MODE) );
832 :
833 : //Fuer den BrowseMode wollen wir keinen Factor uebernehmen.
834 236 : if( aUsrPref.getBrowseMode() && aUsrPref.GetZoomType() != SVX_ZOOM_PERCENT )
835 : {
836 0 : aUsrPref.SetZoomType( SVX_ZOOM_PERCENT );
837 0 : aUsrPref.SetZoom( 100 );
838 : }
839 236 : if(pDocSh->IsPreview())
840 : {
841 0 : aUsrPref.SetZoomType( SVX_ZOOM_WHOLEPAGE );
842 0 : aUsrPref.SetViewLayoutBookMode( false );
843 0 : aUsrPref.SetViewLayoutColumns( 1 );
844 : }
845 236 : pWrtShell = new SwWrtShell( rDoc, pEditWin, *this, &aUsrPref );
846 : // creating an SwView from a SwPagePreView needs to
847 : // add the ViewShell to the ring of the other ViewShell(s)
848 236 : if(bOldShellWasPagePreView)
849 : {
850 0 : ViewShell& rPreviewViewShell = *((SwPagePreView*)pExistingSh)->GetViewShell();
851 0 : pWrtShell->MoveTo(&rPreviewViewShell);
852 : // to update the field command et.al. if necessary
853 0 : const SwViewOption* pPreViewOpt = rPreviewViewShell.GetViewOptions();
854 0 : if( pPreViewOpt->IsFldName() != aUsrPref.IsFldName() ||
855 0 : pPreViewOpt->IsShowHiddenField() != aUsrPref.IsShowHiddenField() ||
856 0 : pPreViewOpt->IsShowHiddenPara() != aUsrPref.IsShowHiddenPara() ||
857 0 : pPreViewOpt->IsShowHiddenChar() != aUsrPref.IsShowHiddenChar() )
858 0 : rPreviewViewShell.ApplyViewOptions(aUsrPref);
859 : // reset design mode at draw view for form
860 : // shell, if needed.
861 0 : if ( ((SwPagePreView*)pExistingSh)->ResetFormDesignMode() &&
862 0 : pWrtShell->HasDrawView() )
863 : {
864 0 : SdrView* pDrawView = pWrtShell->GetDrawView();
865 0 : pDrawView->SetDesignMode( ((SwPagePreView*)pExistingSh)->FormDesignModeToReset() );
866 : }
867 : }
868 : }
869 : RTL_LOGFILE_CONTEXT_TRACE( aLog, "after create WrtShell" );
870 :
871 : // assure that modified state of document
872 : // isn't reset, if document is already modified.
873 236 : const bool bIsDocModified = pWrtShell->GetDoc()->IsModified();
874 :
875 : // damit unter anderem das HLineal im
876 : // ReadonlyFall nicht angezeigt wird
877 236 : aUsrPref.SetReadonly( pWrtShell->GetViewOptions()->IsReadonly() );
878 :
879 : // no margin for OLE!
880 236 : Size aBrwsBorder;
881 236 : if( SFX_CREATE_MODE_EMBEDDED != pDocSh->GetCreateMode() )
882 236 : aBrwsBorder = GetMargin();
883 :
884 236 : pWrtShell->SetBrowseBorder( aBrwsBorder );
885 :
886 : // Im CTOR duerfen keine Shell wechsel erfolgen, die muessen ueber
887 : // den Timer "zwischen gespeichert" werden. Sonst raeumt der SFX
888 : // sie wieder vom Stack!
889 236 : sal_Bool bOld = bNoInterrupt;
890 236 : bNoInterrupt = sal_True;
891 :
892 236 : pHRuler->SetActive( sal_True );
893 236 : pVRuler->SetActive( sal_True );
894 :
895 236 : SfxViewFrame* pViewFrame = GetViewFrame();
896 236 : if( pViewFrame->GetFrame().GetParentFrame())
897 : {
898 0 : aUsrPref.SetViewHRuler(sal_False);
899 0 : aUsrPref.SetViewVRuler(sal_False);
900 : }
901 :
902 236 : StartListening( *pViewFrame, sal_True );
903 236 : StartListening( *pDocSh, sal_True );
904 :
905 : // Set Zoom-factor from HLineal
906 236 : Fraction aZoomFract( aUsrPref.GetZoom(), 100 );
907 236 : pHRuler->SetZoom( aZoomFract );
908 236 : pVRuler->SetZoom( aZoomFract );
909 236 : pHRuler->SetDoubleClickHdl(LINK( this, SwView, ExecRulerClick ));
910 236 : FieldUnit eMetric = pUsrPref->GetHScrollMetric();
911 236 : pHRuler->SetUnit( eMetric );
912 :
913 236 : eMetric = pUsrPref->GetVScrollMetric();
914 236 : pVRuler->SetUnit( eMetric );
915 :
916 236 : pHRuler->SetCharWidth( 371 ); // default character width
917 236 : pVRuler->SetLineHeight( 551 ); // default line height
918 :
919 : // DocShell setzen
920 236 : pDocSh->SetView( this );
921 236 : SW_MOD()->SetView( this );
922 :
923 236 : mpPostItMgr = new SwPostItMgr(this);
924 :
925 : // Die DocSize erfragen und verarbeiten. Ueber die Handler konnte
926 : // die Shell nicht gefunden werden, weil die Shell innerhalb CTOR-Phase
927 : // nicht in der SFX-Verwaltung bekannt ist.
928 236 : DocSzChgd( pWrtShell->GetDocSize() );
929 :
930 : // AttrChangedNotify Link setzen
931 236 : pWrtShell->SetChgLnk(LINK(this, SwView, AttrChangedNotify));
932 :
933 472 : if( pDocSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED &&
934 : //TODO/LATER: why a cast here?
935 : //!((SvEmbeddedObject *)pDocSh)->GetVisArea().IsEmpty() )
936 : //SetVisArea( ((SvEmbeddedObject *)pDocSh)->GetVisArea(),sal_False);
937 236 : !pDocSh->GetVisArea(ASPECT_CONTENT).IsEmpty() )
938 0 : SetVisArea( pDocSh->GetVisArea(ASPECT_CONTENT),sal_False);
939 :
940 : SAL_WARN_IF(
941 : officecfg::Office::Common::Undo::Steps::get() <= 0,
942 : "sw", "/org.openoffice.Office.Common/Undo/Steps <= 0");
943 236 : pWrtShell->DoUndo( true );
944 :
945 236 : const sal_Bool bBrowse = pWrtShell->GetViewOptions()->getBrowseMode();
946 : // Disable "multiple window"
947 236 : SetNewWindowAllowed(!bBrowse);
948 : // End of disabled multiple window
949 :
950 236 : mbVScrollbarEnabled = aUsrPref.IsViewVScrollBar();
951 236 : mbHScrollbarEnabled = aUsrPref.IsViewHScrollBar();
952 236 : pHScrollbar->SetAuto(bBrowse);
953 236 : if( aUsrPref.IsViewHRuler() )
954 236 : CreateTab();
955 236 : if( aUsrPref.IsViewVRuler() )
956 236 : CreateVLineal();
957 :
958 236 : pWrtShell->SetUIOptions( aUsrPref );
959 236 : pWrtShell->SetReadOnlyAvailable( aUsrPref.IsCursorInProtectedArea() );
960 236 : pWrtShell->ApplyAccessiblityOptions(SW_MOD()->GetAccessibilityOptions());
961 :
962 236 : if( pWrtShell->GetDoc()->IsUpdateExpFld() )
963 : {
964 8 : if (pWrtShell->GetDoc()->containsUpdatableFields())
965 : {
966 0 : SET_CURR_SHELL( pWrtShell );
967 0 : pWrtShell->StartAction();
968 0 : pWrtShell->CalcLayout();
969 0 : pWrtShell->GetDoc()->UpdateFlds(NULL, false);
970 0 : pWrtShell->EndAction();
971 : }
972 8 : pWrtShell->GetDoc()->SetUpdateExpFldStat( sal_False );
973 : }
974 :
975 : // ggfs. alle Verzeichnisse updaten:
976 236 : if( pWrtShell->GetDoc()->IsUpdateTOX() )
977 : {
978 0 : SfxRequest aSfxRequest( FN_UPDATE_TOX, SFX_CALLMODE_SLOT, GetPool() );
979 0 : Execute( aSfxRequest );
980 0 : pWrtShell->GetDoc()->SetUpdateTOX( sal_False ); // wieder zurueck setzen
981 0 : pWrtShell->SttEndDoc(sal_True);
982 : }
983 :
984 : // kein ResetModified, wenn es schone eine View auf dieses Doc gibt
985 236 : SfxViewFrame* pVFrame = GetViewFrame();
986 236 : SfxViewFrame* pFirst = SfxViewFrame::GetFirst(pDocSh);
987 : // zur Zeit(360) wird die View erst nach dem Ctor eingetragen
988 : // der folgende Ausdruck funktioniert auch, wenn sich das aendert
989 : // wenn per Undo nicht mehr die Modifizierung aufhebar ist,
990 : // so setze das Modified NICHT zurueck.
991 : // no reset of modified state, if document
992 : // was already modified.
993 472 : if (!pWrtShell->GetDoc()->GetIDocumentUndoRedo().IsUndoNoResetModified() &&
994 : ( !pFirst || pFirst == pVFrame ) &&
995 236 : !bIsDocModified )
996 : {
997 236 : pWrtShell->ResetModified();
998 : }
999 :
1000 236 : bNoInterrupt = bOld;
1001 :
1002 : // wird ein GlobalDoc neu angelegt, soll auch der Navigator erzeugt werden
1003 236 : if( pDocSh->IsA(SwGlobalDocShell::StaticType()) &&
1004 0 : !pVFrame->GetChildWindow( SID_NAVIGATOR ))
1005 : {
1006 0 : SfxBoolItem aNavi(SID_NAVIGATOR, sal_True);
1007 0 : GetDispatcher().Execute(SID_NAVIGATOR, SFX_CALLMODE_ASYNCHRON, &aNavi, 0L);
1008 : }
1009 :
1010 236 : uno::Reference< frame::XFrame > xFrame = pVFrame->GetFrame().GetFrameInterface();
1011 :
1012 236 : uno::Reference< frame::XFrame > xBeamerFrame = xFrame->findFrame(
1013 236 : OUString(RTL_CONSTASCII_USTRINGPARAM("_beamer")), frame::FrameSearchFlag::CHILDREN);
1014 236 : if(xBeamerFrame.is())
1015 : {
1016 0 : SwDBData aData = pWrtShell->GetDBData();
1017 0 : SW_MOD()->ShowDBObj( *this, aData );
1018 : }
1019 :
1020 : // has anybody calls the attrchanged handler in the constructor?
1021 236 : if( bAttrChgNotifiedWithRegistrations )
1022 : {
1023 0 : GetViewFrame()->GetBindings().LEAVEREGISTRATIONS();
1024 0 : if( aTimer.IsActive() )
1025 0 : aTimer.Stop();
1026 : }
1027 :
1028 236 : aTimer.SetTimeoutHdl(LINK(this, SwView, TimeoutHdl));
1029 236 : bAttrChgNotified = bAttrChgNotifiedWithRegistrations = sal_False;
1030 236 : if(bOldModifyFlag)
1031 236 : pDocSh->EnableSetModified( sal_True );
1032 236 : InvalidateBorder();
1033 :
1034 236 : if( !pHScrollbar->IsVisible( sal_True ) )
1035 236 : ShowHScrollbar( sal_False );
1036 236 : if( !pVScrollbar->IsVisible( sal_True ) )
1037 236 : ShowVScrollbar( sal_False );
1038 :
1039 236 : GetViewFrame()->GetWindow().AddChildEventListener( LINK( this, SwView, WindowChildEventListener ) );
1040 236 : }
1041 :
1042 630 : SwView::~SwView()
1043 : {
1044 63 : GetViewFrame()->GetWindow().RemoveChildEventListener( LINK( this, SwView, WindowChildEventListener ) );
1045 63 : delete mpPostItMgr;
1046 63 : mpPostItMgr = 0;
1047 :
1048 63 : bInDtor = sal_True;
1049 63 : pEditWin->Hide(); // damit kein Paint Aerger machen kann!
1050 : // An der SwDocShell den Pointer auf die View ruecksetzen
1051 63 : SwDocShell* pDocSh = GetDocShell();
1052 63 : if( pDocSh && pDocSh->GetView() == this )
1053 63 : pDocSh->SetView( 0 );
1054 63 : if ( SW_MOD()->GetView() == this )
1055 63 : SW_MOD()->SetView( 0 );
1056 :
1057 63 : if( aTimer.IsActive() && bAttrChgNotifiedWithRegistrations )
1058 0 : GetViewFrame()->GetBindings().LEAVEREGISTRATIONS();
1059 :
1060 : // the last view must end the text edit
1061 63 : SdrView *pSdrView = pWrtShell ? pWrtShell->GetDrawView() : 0;
1062 63 : if( pSdrView && pSdrView->IsTextEdit() )
1063 0 : pSdrView->SdrEndTextEdit( sal_True );
1064 :
1065 63 : SetWindow( 0 );
1066 :
1067 63 : pViewImpl->Invalidate();
1068 63 : EndListening(*GetViewFrame());
1069 63 : EndListening(*GetDocShell());
1070 63 : delete pScrollFill;
1071 63 : delete pWrtShell;
1072 63 : pWrtShell = 0; // Auf 0 setzen, damit folgende DToren nicht drauf zugreifen
1073 63 : pShell = 0;
1074 63 : delete pHScrollbar;
1075 63 : delete pVScrollbar;
1076 63 : delete pHRuler;
1077 63 : delete pVRuler;
1078 63 : delete pTogglePageBtn;
1079 63 : delete pPageUpBtn;
1080 63 : delete pNaviBtn;
1081 63 : delete pPageDownBtn;
1082 63 : delete pGlosHdl;
1083 63 : delete pViewImpl;
1084 63 : delete pEditWin;
1085 63 : delete pFormatClipboard;
1086 567 : }
1087 :
1088 6835 : SwDocShell* SwView::GetDocShell()
1089 : {
1090 6835 : SfxObjectShell* pDocShell = GetViewFrame()->GetObjectShell();
1091 6835 : return PTR_CAST(SwDocShell, pDocShell);
1092 : }
1093 :
1094 : /*--------------------------------------------------------------------
1095 : Beschreibung: CursorPos merken
1096 : --------------------------------------------------------------------*/
1097 0 : void SwView::WriteUserData( String &rUserData, sal_Bool bBrowse )
1098 : {
1099 : //Das Browse-Flag wird vom Sfx durchgereicht, wenn Dokumente gebrowsed
1100 : //werden (nicht zu verwechseln mit dem BrowseMode).
1101 : //Die dann gespeicherten Daten sind nicht persistent!!
1102 :
1103 0 : const SwRect& rRect = pWrtShell->GetCharRect();
1104 0 : const Rectangle& rVis = GetVisArea();
1105 :
1106 0 : rUserData = String::CreateFromInt32( rRect.Left() );
1107 0 : rUserData += ';';
1108 0 : rUserData += String::CreateFromInt32( rRect.Top() );
1109 0 : rUserData += ';';
1110 0 : rUserData += String::CreateFromInt32( pWrtShell->GetViewOptions()->GetZoom() );
1111 0 : rUserData += ';';
1112 0 : rUserData += String::CreateFromInt32( rVis.Left() );
1113 0 : rUserData += ';';
1114 0 : rUserData += String::CreateFromInt32( rVis.Top() );
1115 0 : rUserData += ';';
1116 0 : rUserData += String::CreateFromInt32( bBrowse ? SAL_MIN_INT32 : rVis.Right());
1117 0 : rUserData += ';';
1118 0 : rUserData += String::CreateFromInt32( bBrowse ? SAL_MIN_INT32 : rVis.Bottom());
1119 0 : rUserData += ';';
1120 : rUserData += String::CreateFromInt32(
1121 0 : (sal_uInt16)pWrtShell->GetViewOptions()->GetZoomType());//eZoom;
1122 0 : rUserData += ';';
1123 0 : rUserData += FRMTYPE_NONE == pWrtShell->GetSelFrmType() ? '0' : '1';
1124 0 : }
1125 :
1126 : /*--------------------------------------------------------------------
1127 : Beschreibung: CursorPos setzen
1128 : --------------------------------------------------------------------*/
1129 236 : static bool lcl_IsOwnDocument( SwView& rView )
1130 : {
1131 : uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
1132 236 : rView.GetDocShell()->GetModel(), uno::UNO_QUERY_THROW);
1133 : uno::Reference<document::XDocumentProperties> xDocProps
1134 236 : = xDPS->getDocumentProperties();
1135 236 : String Created = xDocProps->getAuthor();
1136 236 : String Changed = xDocProps->getModifiedBy();
1137 236 : String FullName = SW_MOD()->GetUserOptions().GetFullName();
1138 236 : return (FullName.Len() &&
1139 0 : (Changed.Len() && Changed == FullName )) ||
1140 236 : (!Changed.Len() && Created.Len() && Created == FullName );
1141 : }
1142 :
1143 0 : void SwView::ReadUserData( const String &rUserData, sal_Bool bBrowse )
1144 : {
1145 0 : if ( comphelper::string::getTokenCount(rUserData, ';') > 1 &&
1146 : //Fuer Dokumente ohne Layout nur im OnlineLayout oder beim
1147 : //Forward/Backward
1148 0 : (!pWrtShell->IsNewLayout() || pWrtShell->GetViewOptions()->getBrowseMode() || bBrowse) )
1149 : {
1150 0 : bool bIsOwnDocument = lcl_IsOwnDocument( *this );
1151 :
1152 0 : SET_CURR_SHELL(pWrtShell);
1153 :
1154 0 : sal_uInt16 nPos = 0;
1155 :
1156 : // Nein, es ist *keine* gute Idee GetToken gleich im Point-Konstr.
1157 : // aufzurufen, denn welcher Parameter wird zuerst ausgewertet?
1158 0 : long nX = rUserData.GetToken( 0, ';', nPos ).ToInt32(),
1159 0 : nY = rUserData.GetToken( 0, ';', nPos ).ToInt32();
1160 0 : Point aCrsrPos( nX, nY );
1161 :
1162 : sal_uInt16 nZoomFactor =
1163 0 : static_cast< sal_uInt16 >( rUserData.GetToken(0, ';', nPos ).ToInt32() );
1164 :
1165 0 : long nLeft = rUserData.GetToken(0, ';', nPos ).ToInt32(),
1166 0 : nTop = rUserData.GetToken(0, ';', nPos ).ToInt32(),
1167 0 : nRight = rUserData.GetToken(0, ';', nPos ).ToInt32(),
1168 0 : nBottom= rUserData.GetToken(0, ';', nPos ).ToInt32();
1169 :
1170 0 : const long nAdd = pWrtShell->GetViewOptions()->getBrowseMode() ? DOCUMENTBORDER : DOCUMENTBORDER*2;
1171 0 : if ( nBottom <= (pWrtShell->GetDocSize().Height()+nAdd) )
1172 : {
1173 0 : pWrtShell->EnableSmooth( sal_False );
1174 :
1175 0 : const Rectangle aVis( nLeft, nTop, nRight, nBottom );
1176 :
1177 0 : sal_uInt16 nOff = 0;
1178 : SvxZoomType eZoom;
1179 0 : if( !pWrtShell->GetViewOptions()->getBrowseMode() )
1180 0 : eZoom = (SvxZoomType) (sal_uInt16)rUserData.GetToken(nOff, ';', nPos ).ToInt32();
1181 : else
1182 : {
1183 0 : eZoom = SVX_ZOOM_PERCENT;
1184 0 : ++nOff;
1185 : }
1186 :
1187 0 : sal_Bool bSelectObj = (0 != rUserData.GetToken( nOff, ';', nPos ).ToInt32())
1188 0 : && pWrtShell->IsObjSelectable( aCrsrPos );
1189 :
1190 : // restore editing position
1191 0 : pViewImpl->SetRestorePosition(aCrsrPos, bSelectObj);
1192 : // set flag value to avoid macro execution.
1193 0 : bool bSavedFlagValue = pWrtShell->IsMacroExecAllowed();
1194 0 : pWrtShell->SetMacroExecAllowed( false );
1195 : // os: changed: The user data has to be read if the view is switched back from page preview
1196 : // go to the last editing position when opening own files
1197 0 : if(bOldShellWasPagePreView || bIsOwnDocument)
1198 : {
1199 0 : pWrtShell->SwCrsrShell::SetCrsr( aCrsrPos, !bSelectObj );
1200 0 : if( bSelectObj )
1201 : {
1202 0 : pWrtShell->SelectObj( aCrsrPos );
1203 0 : pWrtShell->EnterSelFrmMode( &aCrsrPos );
1204 : }
1205 : }
1206 :
1207 : // reset flag value
1208 0 : pWrtShell->SetMacroExecAllowed( bSavedFlagValue );
1209 :
1210 : // set visible area before applying
1211 : // information from print preview. Otherwise, the applied information
1212 : // is lost.
1213 : // os: changed: The user data has to be read if the view is switched back from page preview
1214 : // go to the last editing position when opening own files
1215 0 : if(bOldShellWasPagePreView || bIsOwnDocument )
1216 : {
1217 0 : if ( bBrowse )
1218 0 : SetVisArea( aVis.TopLeft() );
1219 : else
1220 0 : SetVisArea( aVis );
1221 : }
1222 :
1223 : //apply information from print preview - if available
1224 0 : if( sNewCrsrPos.Len() )
1225 : {
1226 0 : long nXTmp = sNewCrsrPos.GetToken( 0, ';' ).ToInt32(),
1227 0 : nYTmp = sNewCrsrPos.GetToken( 1, ';' ).ToInt32();
1228 0 : Point aCrsrPos2( nXTmp, nYTmp );
1229 0 : bSelectObj = pWrtShell->IsObjSelectable( aCrsrPos2 );
1230 :
1231 0 : pWrtShell->SwCrsrShell::SetCrsr( aCrsrPos2, sal_False );
1232 0 : if( bSelectObj )
1233 : {
1234 0 : pWrtShell->SelectObj( aCrsrPos2 );
1235 0 : pWrtShell->EnterSelFrmMode( &aCrsrPos2 );
1236 : }
1237 0 : pWrtShell->MakeSelVisible();
1238 0 : sNewCrsrPos.Erase();
1239 : }
1240 0 : else if(USHRT_MAX != nNewPage)
1241 : {
1242 0 : pWrtShell->GotoPage(nNewPage, sal_True);
1243 0 : nNewPage = USHRT_MAX;
1244 : }
1245 :
1246 0 : SelectShell();
1247 :
1248 0 : pWrtShell->StartAction();
1249 0 : const SwViewOption* pVOpt = pWrtShell->GetViewOptions();
1250 0 : if( pVOpt->GetZoom() != nZoomFactor || pVOpt->GetZoomType() != eZoom )
1251 0 : SetZoom( eZoom, nZoomFactor);
1252 :
1253 0 : pWrtShell->LockView( sal_True );
1254 0 : pWrtShell->EndAction();
1255 0 : pWrtShell->LockView( sal_False );
1256 0 : pWrtShell->EnableSmooth( sal_True );
1257 0 : }
1258 : }
1259 0 : }
1260 :
1261 236 : void SwView::ReadUserDataSequence ( const uno::Sequence < beans::PropertyValue >& rSequence, sal_Bool bBrowse )
1262 : {
1263 236 : if(GetDocShell()->IsPreview()||bIsPreviewDoubleClick)
1264 236 : return;
1265 236 : bool bIsOwnDocument = lcl_IsOwnDocument( *this );
1266 236 : sal_Int32 nLength = rSequence.getLength();
1267 236 : if (nLength && (!pWrtShell->IsNewLayout() || pWrtShell->GetViewOptions()->getBrowseMode() || bBrowse) )
1268 : {
1269 236 : SET_CURR_SHELL(pWrtShell);
1270 236 : const beans::PropertyValue *pValue = rSequence.getConstArray();
1271 236 : const SwRect& rRect = pWrtShell->GetCharRect();
1272 236 : const Rectangle &rVis = GetVisArea();
1273 236 : const SwViewOption* pVOpt = pWrtShell->GetViewOptions();
1274 :
1275 236 : long nX = rRect.Left(), nY = rRect.Top(), nLeft = rVis.Left(), nTop = rVis.Top();
1276 236 : long nRight = bBrowse ? LONG_MIN : rVis.Right(), nBottom = bBrowse ? LONG_MIN : rVis.Bottom();
1277 236 : sal_Int16 nZoomType = static_cast< sal_Int16 >(pVOpt->GetZoomType());
1278 236 : sal_Int16 nZoomFactor = static_cast < sal_Int16 > (pVOpt->GetZoom());
1279 236 : bool bViewLayoutBookMode = pVOpt->IsViewLayoutBookMode();
1280 236 : sal_Int16 nViewLayoutColumns = pVOpt->GetViewLayoutColumns();
1281 :
1282 236 : sal_Bool bSelectedFrame = ( pWrtShell->GetSelFrmType() != FRMTYPE_NONE ),
1283 236 : bGotVisibleLeft = sal_False,
1284 236 : bGotVisibleTop = sal_False, bGotVisibleRight = sal_False,
1285 236 : bGotVisibleBottom = sal_False, bGotZoomType = sal_False,
1286 236 : bGotZoomFactor = sal_False, bGotIsSelectedFrame = sal_False,
1287 236 : bGotViewLayoutColumns = sal_False, bGotViewLayoutBookMode = sal_False;
1288 :
1289 2033 : for (sal_Int16 i = 0 ; i < nLength; i++)
1290 : {
1291 1797 : if ( pValue->Name == "ViewLeft" )
1292 : {
1293 121 : pValue->Value >>= nX;
1294 121 : nX = MM100_TO_TWIP( nX );
1295 : }
1296 1676 : else if ( pValue->Name == "ViewTop" )
1297 : {
1298 121 : pValue->Value >>= nY;
1299 121 : nY = MM100_TO_TWIP( nY );
1300 : }
1301 1555 : else if ( pValue->Name == "VisibleLeft" )
1302 : {
1303 121 : pValue->Value >>= nLeft;
1304 121 : nLeft = MM100_TO_TWIP( nLeft );
1305 121 : bGotVisibleLeft = sal_True;
1306 : }
1307 1434 : else if ( pValue->Name == "VisibleTop" )
1308 : {
1309 121 : pValue->Value >>= nTop;
1310 121 : nTop = MM100_TO_TWIP( nTop );
1311 121 : bGotVisibleTop = sal_True;
1312 : }
1313 1313 : else if ( pValue->Name == "VisibleRight" )
1314 : {
1315 121 : pValue->Value >>= nRight;
1316 121 : nRight = MM100_TO_TWIP( nRight );
1317 121 : bGotVisibleRight = sal_True;
1318 : }
1319 1192 : else if ( pValue->Name == "VisibleBottom" )
1320 : {
1321 236 : pValue->Value >>= nBottom;
1322 236 : nBottom = MM100_TO_TWIP( nBottom );
1323 236 : bGotVisibleBottom = sal_True;
1324 : }
1325 956 : else if ( pValue->Name == "ZoomType" )
1326 : {
1327 236 : pValue->Value >>= nZoomType;
1328 236 : bGotZoomType = sal_True;
1329 : }
1330 720 : else if ( pValue->Name == "ZoomFactor" )
1331 : {
1332 236 : pValue->Value >>= nZoomFactor;
1333 236 : bGotZoomFactor = sal_True;
1334 : }
1335 484 : else if ( pValue->Name == "ViewLayoutColumns" )
1336 : {
1337 121 : pValue->Value >>= nViewLayoutColumns;
1338 121 : bGotViewLayoutColumns = sal_True;
1339 : }
1340 363 : else if ( pValue->Name == "ViewLayoutBookMode" )
1341 : {
1342 121 : bViewLayoutBookMode = * (sal_Bool *) pValue->Value.getValue();
1343 121 : bGotViewLayoutBookMode = sal_True;
1344 : }
1345 242 : else if ( pValue->Name == "IsSelectedFrame" )
1346 : {
1347 121 : pValue->Value >>= bSelectedFrame;
1348 121 : bGotIsSelectedFrame = sal_True;
1349 : }
1350 1797 : pValue++;
1351 : }
1352 236 : if (bGotVisibleBottom)
1353 : {
1354 236 : Point aCrsrPos( nX, nY );
1355 236 : const long nAdd = pWrtShell->GetViewOptions()->getBrowseMode() ? DOCUMENTBORDER : DOCUMENTBORDER*2;
1356 236 : if (nBottom <= (pWrtShell->GetDocSize().Height()+nAdd) )
1357 : {
1358 236 : pWrtShell->EnableSmooth( sal_False );
1359 236 : const Rectangle aVis( nLeft, nTop, nRight, nBottom );
1360 :
1361 : SvxZoomType eZoom;
1362 236 : if ( !pWrtShell->GetViewOptions()->getBrowseMode() )
1363 236 : eZoom = static_cast < SvxZoomType > ( nZoomType );
1364 : else
1365 : {
1366 0 : eZoom = SVX_ZOOM_PERCENT;
1367 : }
1368 236 : if (bGotIsSelectedFrame)
1369 : {
1370 : sal_Bool bSelectObj = (sal_False != bSelectedFrame )
1371 121 : && pWrtShell->IsObjSelectable( aCrsrPos );
1372 :
1373 : // set flag value to avoid macro execution.
1374 121 : bool bSavedFlagValue = pWrtShell->IsMacroExecAllowed();
1375 121 : pWrtShell->SetMacroExecAllowed( false );
1376 : // os: changed: The user data has to be read if the view is switched back from page preview
1377 : // go to the last editing position when opening own files
1378 121 : pViewImpl->SetRestorePosition(aCrsrPos, bSelectObj);
1379 121 : if(bOldShellWasPagePreView|| bIsOwnDocument)
1380 : {
1381 0 : pWrtShell->SwCrsrShell::SetCrsr( aCrsrPos, !bSelectObj );
1382 :
1383 : // Update the shell to toggle Header/Footer edit if needed
1384 0 : sal_Bool bInHeader = sal_True;
1385 0 : if ( pWrtShell->IsInHeaderFooter( &bInHeader ) )
1386 : {
1387 0 : if ( !bInHeader )
1388 : {
1389 0 : pWrtShell->SetShowHeaderFooterSeparator( Footer, true );
1390 0 : pWrtShell->SetShowHeaderFooterSeparator( Header, false );
1391 : }
1392 : else
1393 : {
1394 0 : pWrtShell->SetShowHeaderFooterSeparator( Header, true );
1395 0 : pWrtShell->SetShowHeaderFooterSeparator( Footer, false );
1396 : }
1397 :
1398 : // Force repaint
1399 0 : pWrtShell->GetWin()->Invalidate();
1400 : }
1401 0 : if ( pWrtShell->IsInHeaderFooter() != pWrtShell->IsHeaderFooterEdit() )
1402 0 : pWrtShell->ToggleHeaderFooterEdit();
1403 :
1404 0 : if( bSelectObj )
1405 : {
1406 0 : pWrtShell->SelectObj( aCrsrPos );
1407 0 : pWrtShell->EnterSelFrmMode( &aCrsrPos );
1408 : }
1409 : }
1410 :
1411 : // reset flag value
1412 121 : pWrtShell->SetMacroExecAllowed( bSavedFlagValue );
1413 : }
1414 236 : SelectShell();
1415 :
1416 : // Set ViewLayoutSettings
1417 : const bool bSetViewLayoutSettings = bGotViewLayoutColumns && bGotViewLayoutBookMode &&
1418 236 : ( pVOpt->GetViewLayoutColumns() != nViewLayoutColumns || pVOpt->IsViewLayoutBookMode() != bViewLayoutBookMode );
1419 :
1420 : const bool bSetViewSettings = bGotZoomType && bGotZoomFactor &&
1421 236 : ( pVOpt->GetZoom() != nZoomFactor || pVOpt->GetZoomType() != eZoom );
1422 :
1423 : // In case we have a 'fixed' view layout of 2 or more columns,
1424 : // we have to apply the view options *before* starting the action.
1425 : // Otherwsie the SetZoom function cannot work correctly, because
1426 : // the view layout hasn't been calculated.
1427 : const bool bZoomNeedsViewLayout = bSetViewLayoutSettings &&
1428 : 1 < nViewLayoutColumns &&
1429 : bSetViewSettings &&
1430 236 : eZoom != SVX_ZOOM_PERCENT;
1431 :
1432 236 : if ( !bZoomNeedsViewLayout )
1433 236 : pWrtShell->StartAction();
1434 :
1435 236 : if ( bSetViewLayoutSettings )
1436 0 : SetViewLayout( nViewLayoutColumns, bViewLayoutBookMode, sal_True );
1437 :
1438 236 : if ( bZoomNeedsViewLayout )
1439 0 : pWrtShell->StartAction();
1440 :
1441 236 : if ( bSetViewSettings )
1442 33 : SetZoom( eZoom, nZoomFactor, sal_True );
1443 :
1444 : // os: changed: The user data has to be read if the view is switched back from page preview
1445 : // go to the last editing position when opening own files
1446 236 : if(bOldShellWasPagePreView||bIsOwnDocument)
1447 : {
1448 0 : if ( bBrowse && bGotVisibleLeft && bGotVisibleTop )
1449 : {
1450 0 : Point aTopLeft(aVis.TopLeft());
1451 : // make sure the document is still centered
1452 0 : const SwTwips lBorder = IsDocumentBorder() ? DOCUMENTBORDER : 2 * DOCUMENTBORDER;
1453 0 : SwTwips nEditWidth = GetEditWin().GetOutputSize().Width();
1454 0 : if(nEditWidth > (aDocSz.Width() + lBorder ))
1455 0 : aTopLeft.X() = ( aDocSz.Width() + lBorder - nEditWidth ) / 2;
1456 : else
1457 : {
1458 : //check if the values are possible
1459 0 : long nXMax = pHScrollbar->GetRangeMax() - pHScrollbar->GetVisibleSize();
1460 0 : if( aTopLeft.X() > nXMax )
1461 0 : aTopLeft.X() = nXMax < 0 ? 0 : nXMax;
1462 : }
1463 0 : SetVisArea( aTopLeft );
1464 : }
1465 0 : else if (bGotVisibleLeft && bGotVisibleTop && bGotVisibleRight && bGotVisibleBottom )
1466 0 : SetVisArea( aVis );
1467 : }
1468 :
1469 236 : pWrtShell->LockView( sal_True );
1470 236 : pWrtShell->EndAction();
1471 236 : pWrtShell->LockView( sal_False );
1472 236 : pWrtShell->EnableSmooth( sal_True );
1473 : }
1474 236 : }
1475 : }
1476 : }
1477 :
1478 : #define NUM_VIEW_SETTINGS 12
1479 107 : void SwView::WriteUserDataSequence ( uno::Sequence < beans::PropertyValue >& rSequence, sal_Bool bBrowse )
1480 : {
1481 107 : const SwRect& rRect = pWrtShell->GetCharRect();
1482 107 : const Rectangle& rVis = GetVisArea();
1483 107 : Any aAny;
1484 :
1485 107 : rSequence.realloc ( NUM_VIEW_SETTINGS );
1486 107 : sal_Int16 nIndex = 0;
1487 107 : beans::PropertyValue *pValue = rSequence.getArray();
1488 :
1489 107 : sal_uInt16 nViewID( GetViewFrame()->GetCurViewId());
1490 107 : pValue->Name = rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM( "ViewId" ) );
1491 107 : OUStringBuffer sBuffer ( OUString(RTL_CONSTASCII_USTRINGPARAM( "view" ) ) );
1492 107 : ::sax::Converter::convertNumber(sBuffer, static_cast<sal_Int32>(nViewID));
1493 107 : pValue->Value <<= sBuffer.makeStringAndClear();
1494 107 : pValue++;nIndex++;
1495 :
1496 107 : pValue->Name = OUString ( RTL_CONSTASCII_USTRINGPARAM ( "ViewLeft" ) );
1497 107 : pValue->Value <<= TWIP_TO_MM100 ( rRect.Left() );
1498 107 : pValue++;nIndex++;
1499 :
1500 107 : pValue->Name = OUString ( RTL_CONSTASCII_USTRINGPARAM ( "ViewTop" ) );
1501 107 : pValue->Value <<= TWIP_TO_MM100 ( rRect.Top() );
1502 107 : pValue++;nIndex++;
1503 :
1504 107 : pValue->Name = OUString ( RTL_CONSTASCII_USTRINGPARAM ( "VisibleLeft" ) );
1505 107 : pValue->Value <<= TWIP_TO_MM100 ( rVis.Left() );
1506 107 : pValue++;nIndex++;
1507 :
1508 107 : pValue->Name = OUString ( RTL_CONSTASCII_USTRINGPARAM ( "VisibleTop" ) );
1509 107 : pValue->Value <<= TWIP_TO_MM100 ( rVis.Top() );
1510 107 : pValue++;nIndex++;
1511 :
1512 107 : pValue->Name = OUString ( RTL_CONSTASCII_USTRINGPARAM ( "VisibleRight" ) );
1513 107 : pValue->Value <<= TWIP_TO_MM100 ( bBrowse ? LONG_MIN : rVis.Right() );
1514 107 : pValue++;nIndex++;
1515 :
1516 107 : pValue->Name = OUString ( RTL_CONSTASCII_USTRINGPARAM ( "VisibleBottom" ) );
1517 107 : pValue->Value <<= TWIP_TO_MM100 ( bBrowse ? LONG_MIN : rVis.Bottom() );
1518 107 : pValue++;nIndex++;
1519 :
1520 107 : pValue->Name = OUString ( RTL_CONSTASCII_USTRINGPARAM ( "ZoomType" ) );
1521 107 : const sal_Int16 nZoomType = static_cast< sal_Int16 >(pWrtShell->GetViewOptions()->GetZoomType());
1522 107 : pValue->Value <<= nZoomType;
1523 107 : pValue++;nIndex++;
1524 :
1525 107 : pValue->Name = OUString ( RTL_CONSTASCII_USTRINGPARAM ( "ViewLayoutColumns" ) );
1526 107 : const sal_Int16 nViewLayoutColumns = static_cast< sal_Int16 >(pWrtShell->GetViewOptions()->GetViewLayoutColumns());
1527 107 : pValue->Value <<= nViewLayoutColumns;
1528 107 : pValue++;nIndex++;
1529 :
1530 107 : pValue->Name = OUString ( RTL_CONSTASCII_USTRINGPARAM ( "ViewLayoutBookMode" ) );
1531 107 : const sal_Bool bIsViewLayoutBookMode = pWrtShell->GetViewOptions()->IsViewLayoutBookMode();
1532 107 : pValue->Value.setValue( &bIsViewLayoutBookMode, ::getBooleanCppuType() );
1533 107 : pValue++;nIndex++;
1534 :
1535 107 : pValue->Name = OUString ( RTL_CONSTASCII_USTRINGPARAM ( "ZoomFactor" ) );
1536 107 : pValue->Value <<= static_cast < sal_Int16 > (pWrtShell->GetViewOptions()->GetZoom());
1537 107 : pValue++;nIndex++;
1538 :
1539 107 : pValue->Name = OUString ( RTL_CONSTASCII_USTRINGPARAM ( "IsSelectedFrame" ) );
1540 107 : const sal_Bool bIsSelected = FRMTYPE_NONE == pWrtShell->GetSelFrmType() ? sal_False : sal_True;
1541 107 : pValue->Value.setValue ( &bIsSelected, ::getBooleanCppuType() );
1542 107 : nIndex++;
1543 :
1544 107 : if ( nIndex < NUM_VIEW_SETTINGS )
1545 0 : rSequence.realloc ( nIndex );
1546 107 : }
1547 : #undef NUM_VIEW_SETTINGS
1548 :
1549 110 : void SwView::ShowCursor( bool bOn )
1550 : {
1551 : //don't scroll the cursor into the visible area
1552 110 : sal_Bool bUnlockView = !pWrtShell->IsViewLocked();
1553 110 : pWrtShell->LockView( sal_True ); //lock visible section
1554 :
1555 110 : if( !bOn )
1556 55 : pWrtShell->HideCrsr();
1557 55 : else if( !pWrtShell->IsFrmSelected() && !pWrtShell->IsObjSelected() )
1558 55 : pWrtShell->ShowCrsr();
1559 :
1560 110 : if( bUnlockView )
1561 110 : pWrtShell->LockView( sal_False );
1562 110 : }
1563 :
1564 0 : ErrCode SwView::DoVerb( long nVerb )
1565 : {
1566 0 : if ( !GetViewFrame()->GetFrame().IsInPlace() )
1567 : {
1568 0 : SwWrtShell &rSh = GetWrtShell();
1569 0 : const int nSel = rSh.GetSelectionType();
1570 0 : if ( nSel & nsSelectionType::SEL_OLE )
1571 0 : rSh.LaunchOLEObj( nVerb );
1572 : }
1573 0 : return ERRCODE_NONE;
1574 : }
1575 :
1576 : /* only return sal_True for a text selection
1577 : */
1578 0 : sal_Bool SwView::HasSelection( sal_Bool bText ) const
1579 : {
1580 0 : return bText ? GetWrtShell().SwCrsrShell::HasSelection()
1581 0 : : GetWrtShell().HasSelection();
1582 : }
1583 :
1584 0 : String SwView::GetSelectionText( sal_Bool bCompleteWrds )
1585 : {
1586 0 : return GetSelectionTextParam( bCompleteWrds, sal_True );
1587 : }
1588 :
1589 0 : String SwView::GetSelectionTextParam( sal_Bool bCompleteWrds,
1590 : sal_Bool bEraseTrail )
1591 : {
1592 0 : String sReturn;
1593 0 : if( bCompleteWrds && !GetWrtShell().HasSelection() )
1594 0 : GetWrtShell().SelWrd();
1595 :
1596 0 : GetWrtShell().GetSelectedText( sReturn );
1597 0 : if( bEraseTrail )
1598 0 : sReturn = comphelper::string::stripEnd(sReturn, ' ');
1599 0 : return sReturn;
1600 : }
1601 :
1602 0 : SwGlossaryHdl* SwView::GetGlosHdl()
1603 : {
1604 0 : if(!pGlosHdl)
1605 0 : pGlosHdl = new SwGlossaryHdl(GetViewFrame(), pWrtShell);
1606 0 : return pGlosHdl;
1607 : }
1608 :
1609 1643 : void SwView::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
1610 : {
1611 1643 : sal_Bool bCallBase = sal_True;
1612 1643 : if ( rHint.ISA(SfxSimpleHint) )
1613 : {
1614 234 : sal_uInt32 nId = ((SfxSimpleHint&)rHint).GetId();
1615 234 : switch ( nId )
1616 : {
1617 : // sub shells will be destroyed by the
1618 : // dispatcher, if the view frame is dying. Thus, reset member <pShell>.
1619 : case SFX_HINT_DYING:
1620 : {
1621 126 : if ( &rBC == GetViewFrame() )
1622 : {
1623 63 : ResetSubShell();
1624 : }
1625 : }
1626 126 : break;
1627 : case SFX_HINT_MODECHANGED:
1628 : {
1629 : // Modalmodus-Umschaltung?
1630 0 : sal_Bool bModal = GetDocShell()->IsInModalMode();
1631 0 : pHRuler->SetActive( !bModal );
1632 0 : pVRuler->SetActive( !bModal );
1633 : }
1634 :
1635 : /* no break here */
1636 :
1637 : case SFX_HINT_TITLECHANGED:
1638 78 : if ( GetDocShell()->IsReadOnly() != GetWrtShell().GetViewOptions()->IsReadonly() )
1639 : {
1640 0 : SwWrtShell &rSh = GetWrtShell();
1641 0 : rSh.SetReadonlyOption( GetDocShell()->IsReadOnly() );
1642 :
1643 0 : if ( rSh.GetViewOptions()->IsViewVRuler() )
1644 0 : CreateVLineal();
1645 : else
1646 0 : KillVLineal();
1647 0 : if ( rSh.GetViewOptions()->IsViewHRuler() )
1648 0 : CreateTab();
1649 : else
1650 0 : KillTab();
1651 0 : bool bReadonly = GetDocShell()->IsReadOnly();
1652 : // if document is to be opened in alive-mode then this has to be regarded while switching from readonly-mode to edit-mode
1653 0 : if( !bReadonly )
1654 : {
1655 0 : SwDrawDocument * pDrawDoc = 0;
1656 0 : if ( 0 != ( pDrawDoc = dynamic_cast< SwDrawDocument * > (GetDocShell()->GetDoc()->GetDrawModel() ) ) )
1657 : {
1658 0 : if( !pDrawDoc->GetOpenInDesignMode() )
1659 : break;// don't touch the design mode
1660 : }
1661 : }
1662 0 : SfxBoolItem aItem( SID_FM_DESIGN_MODE, !bReadonly);
1663 0 : GetDispatcher().Execute( SID_FM_DESIGN_MODE, SFX_CALLMODE_ASYNCHRON,
1664 0 : &aItem, 0L );
1665 : }
1666 78 : break;
1667 :
1668 : case SW_BROADCAST_DRAWVIEWS_CREATED:
1669 : {
1670 0 : bCallBase = sal_False;
1671 0 : if ( GetFormShell() )
1672 : {
1673 : GetFormShell()->SetView(
1674 0 : PTR_CAST(FmFormView, GetWrtShell().GetDrawView()) );
1675 0 : SfxBoolItem aItem( SID_FM_DESIGN_MODE, !GetDocShell()->IsReadOnly());
1676 0 : GetDispatcher().Execute( SID_FM_DESIGN_MODE, SFX_CALLMODE_SYNCHRON,
1677 0 : &aItem, 0L );
1678 : }
1679 : }
1680 0 : break;
1681 : }
1682 : }
1683 1409 : else if(rHint.ISA(FmDesignModeChangedHint))
1684 : {
1685 236 : sal_Bool bDesignMode = ((FmDesignModeChangedHint&)rHint).GetDesignMode();
1686 236 : if (!bDesignMode && GetDrawFuncPtr())
1687 : {
1688 0 : GetDrawFuncPtr()->Deactivate();
1689 0 : SetDrawFuncPtr(NULL);
1690 0 : LeaveDrawCreate();
1691 0 : AttrChangedNotify(pWrtShell);
1692 : }
1693 : }
1694 :
1695 1643 : if ( bCallBase )
1696 1643 : SfxViewShell::Notify(rBC, rHint);
1697 1643 : }
1698 :
1699 : #if defined WNT || defined UNX
1700 :
1701 0 : void SwView::ScannerEventHdl( const EventObject& /*rEventObject*/ )
1702 : {
1703 0 : uno::Reference< XScannerManager2 > xScanMgr = SW_MOD()->GetScannerManager();
1704 0 : if( xScanMgr.is() )
1705 : {
1706 0 : const ScannerContext aContext( xScanMgr->getAvailableScanners().getConstArray()[ 0 ] );
1707 0 : const ScanError eError = xScanMgr->getError( aContext );
1708 :
1709 0 : if( ScanError_ScanErrorNone == eError )
1710 : {
1711 0 : const uno::Reference< awt::XBitmap > xBitmap( xScanMgr->getBitmap( aContext ) );
1712 :
1713 0 : if( xBitmap.is() )
1714 : {
1715 0 : const BitmapEx aScanBmp( VCLUnoHelper::GetBitmap( xBitmap ) );
1716 :
1717 0 : if( !!aScanBmp )
1718 : {
1719 0 : Graphic aGrf(aScanBmp);
1720 0 : pWrtShell->Insert( aEmptyStr, aEmptyStr, aGrf );
1721 0 : }
1722 0 : }
1723 0 : }
1724 : }
1725 0 : SfxBindings& rBind = GetViewFrame()->GetBindings();
1726 0 : rBind.Invalidate( SID_TWAIN_SELECT );
1727 0 : rBind.Invalidate( SID_TWAIN_TRANSFER );
1728 0 : }
1729 : #endif
1730 :
1731 0 : void SwView::StopShellTimer()
1732 : {
1733 0 : if(aTimer.IsActive())
1734 : {
1735 0 : aTimer.Stop();
1736 0 : if ( bAttrChgNotifiedWithRegistrations )
1737 : {
1738 0 : GetViewFrame()->GetBindings().LEAVEREGISTRATIONS();
1739 0 : bAttrChgNotifiedWithRegistrations = sal_False;
1740 : }
1741 0 : SelectShell();
1742 0 : bAttrChgNotified = sal_False;
1743 : }
1744 0 : }
1745 :
1746 126 : sal_uInt16 SwView::PrepareClose( sal_Bool bUI, sal_Bool bForBrowsing )
1747 : {
1748 126 : SfxViewFrame* pVFrame = GetViewFrame();
1749 126 : pVFrame->SetChildWindow( SwInputChild::GetChildWindowId(), sal_False );
1750 126 : if( pVFrame->GetDispatcher()->IsLocked() )
1751 0 : pVFrame->GetDispatcher()->Lock(sal_False);
1752 :
1753 : sal_uInt16 nRet;
1754 252 : if ( pFormShell &&
1755 126 : sal_True != (nRet = pFormShell->PrepareClose( bUI, bForBrowsing )) )
1756 :
1757 : {
1758 0 : return nRet;
1759 : }
1760 126 : return SfxViewShell::PrepareClose( bUI, bForBrowsing );
1761 : }
1762 :
1763 : // status methods for clipboard.
1764 : // Status changes now notified from the clipboard.
1765 0 : sal_Bool SwView::IsPasteAllowed()
1766 : {
1767 0 : sal_uInt16 nPasteDestination = SwTransferable::GetSotDestination( *pWrtShell );
1768 0 : if( nLastPasteDestination != nPasteDestination )
1769 : {
1770 : TransferableDataHelper aDataHelper(
1771 : TransferableDataHelper::CreateFromSystemClipboard(
1772 0 : &GetEditWin()) );
1773 0 : if( aDataHelper.GetXTransferable().is() )
1774 : {
1775 0 : bPasteState = SwTransferable::IsPaste( *pWrtShell, aDataHelper );
1776 : bPasteSpecialState = SwTransferable::IsPasteSpecial(
1777 0 : *pWrtShell, aDataHelper );
1778 : }
1779 : else
1780 0 : bPasteState = bPasteSpecialState = sal_False;
1781 :
1782 0 : if( 0xFFFF == nLastPasteDestination ) // the init value
1783 0 : pViewImpl->AddClipboardListener();
1784 0 : nLastPasteDestination = nPasteDestination;
1785 : }
1786 0 : return bPasteState;
1787 : }
1788 :
1789 0 : sal_Bool SwView::IsPasteSpecialAllowed()
1790 : {
1791 0 : if ( pFormShell && pFormShell->IsActiveControl() )
1792 0 : return sal_False;
1793 :
1794 0 : sal_uInt16 nPasteDestination = SwTransferable::GetSotDestination( *pWrtShell );
1795 0 : if( nLastPasteDestination != nPasteDestination )
1796 : {
1797 : TransferableDataHelper aDataHelper(
1798 : TransferableDataHelper::CreateFromSystemClipboard(
1799 0 : &GetEditWin()) );
1800 0 : if( aDataHelper.GetXTransferable().is() )
1801 : {
1802 0 : bPasteState = SwTransferable::IsPaste( *pWrtShell, aDataHelper );
1803 : bPasteSpecialState = SwTransferable::IsPasteSpecial(
1804 0 : *pWrtShell, aDataHelper );
1805 : }
1806 : else
1807 0 : bPasteState = bPasteSpecialState = sal_False;
1808 :
1809 0 : if( 0xFFFF == nLastPasteDestination ) // the init value
1810 0 : pViewImpl->AddClipboardListener();
1811 : }
1812 0 : return bPasteSpecialState;
1813 : }
1814 :
1815 0 : void SwView::NotifyDBChanged()
1816 : {
1817 0 : GetViewImpl()->GetUNOObject_Impl()->NotifyDBChanged();
1818 0 : }
1819 :
1820 : /*--------------------------------------------------------------------
1821 : Printing
1822 : --------------------------------------------------------------------*/
1823 0 : SfxObjectShellLock SwView::CreateTmpSelectionDoc()
1824 : {
1825 0 : SwXTextView *const pImpl = GetViewImpl()->GetUNOObject_Impl();
1826 0 : return pImpl->BuildTmpSelectionDoc();
1827 : }
1828 :
1829 0 : void SwView::AddTransferable(SwTransferable& rTransferable)
1830 : {
1831 0 : GetViewImpl()->AddTransferable(rTransferable);
1832 0 : }
1833 :
1834 : namespace sw {
1835 :
1836 0 : void InitPrintOptionsFromApplication(SwPrintData & o_rData, bool const bWeb)
1837 : {
1838 0 : o_rData = *SW_MOD()->GetPrtOptions(bWeb);
1839 0 : }
1840 :
1841 : } // namespace sw
1842 :
1843 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|