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 #include <FrameView.hxx>
21 
22 #include <svx/svxids.hrc>
23 #include <com/sun/star/drawing/framework/ResourceId.hpp>
24 #include <com/sun/star/drawing/framework/XView.hpp>
25 #include <rtl/ustrbuf.hxx>
26 #include <unokywds.hxx>
27 #include <vcl/settings.hxx>
28 #include <vcl/svapp.hxx>
29 
30 #include <vector>
31 #include <ViewShell.hxx>
32 #include <drawdoc.hxx>
33 #include <DrawDocShell.hxx>
34 #include <optsitem.hxx>
35 #include <ViewShellBase.hxx>
36 #include <sdmod.hxx>
37 #include <pres.hxx>
38 #include <framework/FrameworkHelper.hxx>
39 #include <comphelper/processfactory.hxx>
40 #include <sfx2/viewfrm.hxx>
41 #include <officecfg/Office/Common.hxx>
42 
43 using namespace ::com::sun::star;
44 using namespace ::com::sun::star::uno;
45 using namespace ::com::sun::star::beans;
46 using namespace ::std;
47 
48 namespace sd {
49 
FrameView(SdDrawDocument * pDrawDoc,FrameView * pFrameView)50 FrameView::FrameView(SdDrawDocument* pDrawDoc, FrameView* pFrameView /* = NULL */)
51 :   SdrView(*pDrawDoc, nullptr), // TTTT SdDrawDocument* -> should be reference
52     mnRefCount(0),
53     mnPresViewShellId(SID_VIEWSHELL0),
54     mbIsNavigatorShowingAllShapes(false)
55 {
56     EndListening(*pDrawDoc);
57 
58     EnableExtendedKeyInputDispatcher(false);
59     EnableExtendedMouseEventDispatcher(false);
60 
61     SetGridFront( false );
62     SetHlplFront( false );
63     SetOConSnap( false );
64     SetFrameDragSingles();
65     SetSlidesPerRow(4);
66 
67     if( nullptr == pFrameView )
68     {
69         DrawDocShell* pDocShell = pDrawDoc->GetDocSh();
70 
71         if ( pDocShell )
72         {
73             // document is loaded, is there a FrameView?
74             sal_uLong nSdViewShellCount = 0;
75             SfxViewFrame* pSfxViewFrame = SfxViewFrame::GetFirst(pDocShell);
76 
77             while (pSfxViewFrame)
78             {
79                 // Count the FrameViews and remember the type of the main
80                 // view shell.
81                 SfxViewShell* pSfxViewSh = pSfxViewFrame->GetViewShell();
82                 ViewShellBase* pBase = dynamic_cast<ViewShellBase*>( pSfxViewSh  );
83 
84                 if (pBase != nullptr)
85                 {
86                     nSdViewShellCount++;
87 
88                     OUString sViewURL;
89                     Reference<drawing::framework::XView> xView (
90                         framework::FrameworkHelper::Instance(*pBase)->GetView(
91                             drawing::framework::ResourceId::create(
92                                 ::comphelper::getProcessComponentContext(),
93                                 framework::FrameworkHelper::msCenterPaneURL)));
94                     if (xView.is())
95                         sViewURL = xView->getResourceId()->getResourceURL();
96 
97                     switch (framework::FrameworkHelper::GetViewId(sViewURL))
98                     {
99                         default:
100 //                        case ViewShell::ST_IMPRESS:
101 //                        case ViewShell::ST_NOTES:
102 //                        case ViewShell::ST_HANDOUT:
103                             mnPresViewShellId = SID_VIEWSHELL0;
104                             break;
105 
106                         case ViewShell::ST_SLIDE_SORTER:
107                             mnPresViewShellId = SID_VIEWSHELL1;
108                             break;
109 
110                         case ViewShell::ST_OUTLINE:
111                             mnPresViewShellId = SID_VIEWSHELL2;
112                             break;
113                     }
114                 }
115 
116                 pSfxViewFrame = SfxViewFrame::GetNext(*pSfxViewFrame, pDocShell);
117             }
118 
119             SdDrawDocument* pDoc = pDocShell->GetDoc();
120             pFrameView = pDoc->GetFrameView(nSdViewShellCount);
121         }
122     }
123 
124     if (pFrameView)
125     {
126         // initialize FrameView with the FrameView of the DocShell
127         SetRuler( pFrameView->HasRuler() );
128         SetGridCoarse( pFrameView->GetGridCoarse() );
129         SetGridFine( pFrameView->GetGridFine() );
130         SetSnapGridWidth(pFrameView->GetSnapGridWidthX(), pFrameView->GetSnapGridWidthY());
131         SetGridVisible( pFrameView->IsGridVisible() );
132         SetGridFront( pFrameView->IsGridFront() );
133         SetSnapAngle( pFrameView->GetSnapAngle() );
134         SetGridSnap( pFrameView->IsGridSnap() );
135         SetBordSnap( pFrameView->IsBordSnap() );
136         SetHlplSnap( pFrameView->IsHlplSnap() );
137         SetOFrmSnap( pFrameView->IsOFrmSnap() );
138         SetOPntSnap( pFrameView->IsOPntSnap() );
139         SetOConSnap( pFrameView->IsOConSnap() );
140         SetHlplVisible( pFrameView->IsHlplVisible() );
141         SetDragStripes( pFrameView->IsDragStripes() );
142         SetPlusHandlesAlwaysVisible( pFrameView->IsPlusHandlesAlwaysVisible() );
143         SetFrameDragSingles( pFrameView->IsFrameDragSingles() );
144         SetSnapMagneticPixel( pFrameView->GetSnapMagneticPixel() );
145         SetMarkedHitMovesAlways( pFrameView->IsMarkedHitMovesAlways() );
146         SetMoveOnlyDragging( pFrameView->IsMoveOnlyDragging() );
147         SetCrookNoContortion( pFrameView->IsCrookNoContortion() );
148         SetSlantButShear( pFrameView->IsSlantButShear() );
149         SetNoDragXorPolys( pFrameView->IsNoDragXorPolys() );
150         SetAngleSnapEnabled( pFrameView->IsAngleSnapEnabled() );
151         SetBigOrtho( pFrameView->IsBigOrtho() );
152         SetOrtho( pFrameView->IsOrtho() );
153         SetEliminatePolyPointLimitAngle( pFrameView->GetEliminatePolyPointLimitAngle() );
154         SetEliminatePolyPoints( pFrameView->IsEliminatePolyPoints() );
155         SetDesignMode( pFrameView->IsDesignMode() );
156 
157         SetSolidDragging( pFrameView->IsSolidDragging() );
158 
159         maVisibleLayers = pFrameView->GetVisibleLayers();
160         maPrintableLayers = pFrameView->GetPrintableLayers();
161         maLockedLayers = pFrameView->GetLockedLayers();
162         maStandardHelpLines = pFrameView->GetStandardHelpLines();
163         maNotesHelpLines = pFrameView->GetNotesHelpLines();
164         maHandoutHelpLines = pFrameView->GetHandoutHelpLines();
165         SetActiveLayer( pFrameView->GetActiveLayer() );
166         mbNoColors = pFrameView->IsNoColors();
167         mbNoAttribs = pFrameView->IsNoAttribs() ;
168         maVisArea = pFrameView->GetVisArea();
169         mePageKind = pFrameView->GetPageKind();
170         mePageKindOnLoad = pFrameView->GetPageKindOnLoad();
171         mnSelectedPage = pFrameView->GetSelectedPage();
172         mnSelectedPageOnLoad = pFrameView->GetSelectedPageOnLoad();
173         mePageEditMode = pFrameView->GetViewShEditMode();
174         // meStandardEditMode = pFrameView->GetViewShEditMode(PageKind::Standard);
175         // meNotesEditMode = pFrameView->GetViewShEditMode(PageKind::Notes);
176         // meHandoutEditMode = pFrameView->GetViewShEditMode(PageKind::Handout);
177         SetViewShEditModeOnLoad(pFrameView->GetViewShEditModeOnLoad());
178         mbLayerMode = pFrameView->IsLayerMode();
179         mbQuickEdit = pFrameView->IsQuickEdit();
180 
181         // #i26631#
182         SetMasterPagePaintCaching( pFrameView->IsMasterPagePaintCaching() );
183 
184         SetDragWithCopy( pFrameView->IsDragWithCopy() );
185         mbDoubleClickTextEdit = pFrameView->IsDoubleClickTextEdit();
186         mbClickChangeRotation = pFrameView->IsClickChangeRotation();
187         mnSlidesPerRow = pFrameView->GetSlidesPerRow();
188         mnDrawMode = pFrameView->GetDrawMode();
189         mbIsNavigatorShowingAllShapes = pFrameView->IsNavigatorShowingAllShapes();
190         SetPreviousViewShellType (pFrameView->GetPreviousViewShellType());
191         SetViewShellTypeOnLoad (pFrameView->GetViewShellTypeOnLoad());
192     }
193     else
194     {
195         // initialize FrameView with the application data
196 
197         // Layers need to be set, otherwise they are not visible and not printable in
198         // Impress documents. The document contains already the actual layers and their
199         // settings for visible, printable and locked. In case not read from <draw:layer-set>,
200         // ODF defaults are used.
201         SdrLayerAdmin rLayerAdmin = pDrawDoc -> GetLayerAdmin();
202         rLayerAdmin.getVisibleLayersODF(maVisibleLayers);
203         rLayerAdmin.getPrintableLayersODF(maPrintableLayers);
204         rLayerAdmin.getLockedLayersODF(maLockedLayers);
205         SetGridCoarse( Size( 1000, 1000 ) );
206         SetSnapGridWidth(Fraction(1000, 1), Fraction(1000, 1));
207         SetActiveLayer(sUNO_LayerName_layout);
208         mbNoColors = true;
209         mbNoAttribs = false;
210         maVisArea = ::tools::Rectangle( Point(), Size(0, 0) );
211         mePageKind = PageKind::Standard;
212         mePageKindOnLoad = PageKind::Standard;
213         mnSelectedPage = 0;
214         mnSelectedPageOnLoad = 0;
215         mePageEditMode = EditMode::Page;
216         // meStandardEditMode = EditMode::Page;
217         // meNotesEditMode = EditMode::Page;
218         // meHandoutEditMode = EditMode::MasterPage;
219         SetViewShEditModeOnLoad(EditMode::Page);
220         mbLayerMode = false;
221         SetEliminatePolyPoints(false);
222         mbDoubleClickTextEdit = false;
223         mbClickChangeRotation = false;
224         mnSlidesPerRow = 4;
225 
226         {
227             bool bUseContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
228             mnDrawMode = bUseContrast ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR;
229         }
230         mbIsNavigatorShowingAllShapes = false;
231         SetPreviousViewShellType (ViewShell::ST_NONE);
232         SetViewShellTypeOnLoad (ViewShell::ST_IMPRESS);
233 
234         // get default for design mode
235         bool bInitDesignMode = pDrawDoc->GetOpenInDesignMode();
236         if( pDrawDoc->OpenInDesignModeIsDefaulted() )
237         {
238             bInitDesignMode = true;
239         }
240 
241         SfxObjectShell* pObjShell = pDrawDoc->GetObjectShell();
242         if( pObjShell && pObjShell->IsReadOnly() )
243             bInitDesignMode = false;
244         SetDesignMode( bInitDesignMode );
245 
246         Update( SD_MOD()->GetSdOptions(pDrawDoc->GetDocumentType()) );
247     }
248 
249 }
250 
~FrameView()251 FrameView::~FrameView()
252 {
253 }
254 
Connect()255 void FrameView::Connect()
256 {
257     mnRefCount++;
258 }
259 
Disconnect()260 void FrameView::Disconnect()
261 {
262     if (mnRefCount > 0)
263     {
264         mnRefCount--;
265     }
266 
267     if (mnRefCount == 0)
268     {
269         delete this;
270     }
271 }
272 
273 /**
274  * Update with data from the specified SdOptions
275  */
Update(SdOptions const * pOptions)276 void FrameView::Update(SdOptions const * pOptions)
277 {
278     if (!pOptions)
279         return;
280 
281     mbRuler = pOptions->IsRulerVisible();
282     SetGridVisible( pOptions->IsGridVisible() );
283     SetSnapAngle( pOptions->GetAngle() );
284     SetGridSnap( pOptions->IsUseGridSnap() );
285     SetBordSnap( pOptions->IsSnapBorder()  );
286     SetHlplSnap( pOptions->IsSnapHelplines() );
287     SetOFrmSnap( pOptions->IsSnapFrame() );
288     SetOPntSnap( pOptions->IsSnapPoints() );
289     SetHlplVisible( pOptions->IsHelplines() );
290     SetDragStripes( pOptions->IsDragStripes() );
291     SetPlusHandlesAlwaysVisible( pOptions->IsHandlesBezier() );
292     SetSnapMagneticPixel( pOptions->GetSnapArea() );
293     SetMarkedHitMovesAlways( pOptions->IsMarkedHitMovesAlways() );
294     SetMoveOnlyDragging( pOptions->IsMoveOnlyDragging() );
295     SetSlantButShear( pOptions->IsMoveOnlyDragging() );
296     SetNoDragXorPolys ( !pOptions->IsMoveOutline() );
297     SetCrookNoContortion( pOptions->IsCrookNoContortion() );
298     SetAngleSnapEnabled( pOptions->IsRotate() );
299     SetBigOrtho( pOptions->IsBigOrtho() );
300     SetOrtho( pOptions->IsOrtho() );
301     SetEliminatePolyPointLimitAngle( pOptions->GetEliminatePolyPointLimitAngle() );
302     GetModel()->SetPickThroughTransparentTextFrames( pOptions->IsPickThrough() );
303 
304     SetSolidDragging( pOptions->IsSolidDragging() );
305 
306     SetGridCoarse( Size( pOptions->GetFieldDrawX(), pOptions->GetFieldDrawY() ) );
307     SetGridFine( Size( pOptions->GetFieldDivisionX(), pOptions->GetFieldDivisionY() ) );
308     Fraction aFractX(pOptions->GetFieldDrawX(), pOptions->GetFieldDrawX() / ( pOptions->GetFieldDivisionX() ? pOptions->GetFieldDivisionX() : 1 ));
309     Fraction aFractY(pOptions->GetFieldDrawY(), pOptions->GetFieldDrawY() / ( pOptions->GetFieldDivisionY() ? pOptions->GetFieldDivisionY() : 1 ));
310     SetSnapGridWidth(aFractX, aFractY);
311     SetQuickEdit(pOptions->IsQuickEdit());
312 
313     // #i26631#
314     SetMasterPagePaintCaching( pOptions->IsMasterPagePaintCaching() );
315 
316     SetDragWithCopy(pOptions->IsDragWithCopy());
317     SetDoubleClickTextEdit( pOptions->IsDoubleClickTextEdit() );
318     SetClickChangeRotation( pOptions->IsClickChangeRotation() );
319 }
320 
321 /**
322  * Set EditMode (Page or MasterPage) of working mode
323  */
SetViewShEditMode(EditMode eMode)324 void FrameView::SetViewShEditMode(EditMode eMode)
325 {
326     mePageEditMode = eMode;
327 }
328 
329 /**
330  * Return EditMode (Page or MasterPage) of working mode
331  */
GetViewShEditMode() const332 EditMode FrameView::GetViewShEditMode() const
333 {
334     return mePageEditMode;
335 }
336 
SetViewShEditModeOnLoad(EditMode eMode)337 void FrameView::SetViewShEditModeOnLoad (EditMode eMode)
338 {
339     meEditModeOnLoad = eMode;
340 }
341 
createHelpLinesString(const SdrHelpLineList & rHelpLines)342 static OUString createHelpLinesString( const SdrHelpLineList& rHelpLines )
343 {
344     OUStringBuffer aLines;
345 
346     const sal_uInt16 nCount = rHelpLines.GetCount();
347     for( sal_uInt16 nHlpLine = 0; nHlpLine < nCount; nHlpLine++ )
348     {
349         const SdrHelpLine& rHelpLine = rHelpLines[nHlpLine];
350         const Point& rPos = rHelpLine.GetPos();
351 
352         switch( rHelpLine.GetKind() )
353         {
354             case SdrHelpLineKind::Point:
355                 aLines.append( 'P' );
356                 aLines.append( static_cast<sal_Int32>(rPos.X()) );
357                 aLines.append( ',' );
358                 aLines.append( static_cast<sal_Int32>(rPos.Y()) );
359                 break;
360             case SdrHelpLineKind::Vertical:
361                 aLines.append( 'V' );
362                 aLines.append( static_cast<sal_Int32>(rPos.X()) );
363                 break;
364             case SdrHelpLineKind::Horizontal:
365                 aLines.append( 'H' );
366                 aLines.append( static_cast<sal_Int32>(rPos.Y()) );
367                 break;
368             default:
369                 OSL_FAIL( "Unsupported helpline Kind!" );
370         }
371     }
372 
373     return aLines.makeStringAndClear();
374 }
375 
376 #define addValue( n, v ) push_back( std::pair< OUString, Any >( OUString( n ), v ) )
WriteUserDataSequence(css::uno::Sequence<css::beans::PropertyValue> & rValues)377 void FrameView::WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& rValues )
378 {
379     std::vector< std::pair< OUString, Any > > aUserData;
380 
381     aUserData.addValue( sUNO_View_GridIsVisible, makeAny( IsGridVisible() ) );
382     aUserData.addValue( sUNO_View_GridIsFront, makeAny( IsGridFront() ) );
383     aUserData.addValue( sUNO_View_IsSnapToGrid, makeAny( IsGridSnap() ) );
384     aUserData.addValue( sUNO_View_IsSnapToPageMargins, makeAny( IsBordSnap() ) );
385     aUserData.addValue( sUNO_View_IsSnapToSnapLines, makeAny( IsHlplSnap() ) );
386     aUserData.addValue( sUNO_View_IsSnapToObjectFrame, makeAny( IsOFrmSnap() ) );
387     aUserData.addValue( sUNO_View_IsSnapToObjectPoints, makeAny( IsOPntSnap() ) );
388 
389     aUserData.addValue( sUNO_View_IsPlusHandlesAlwaysVisible, makeAny( IsPlusHandlesAlwaysVisible() ) );
390     aUserData.addValue( sUNO_View_IsFrameDragSingles, makeAny( IsFrameDragSingles() ) );
391 
392     aUserData.addValue( sUNO_View_EliminatePolyPointLimitAngle, makeAny( static_cast<sal_Int32>(GetEliminatePolyPointLimitAngle()) ) );
393     aUserData.addValue( sUNO_View_IsEliminatePolyPoints, makeAny( IsEliminatePolyPoints() ) );
394 
395     if ( officecfg::Office::Common::Misc::WriteLayerStateAsConfigItem::get() )
396     {
397         SdrLayerAdmin& rLayerAdmin = getSdrModelFromSdrView().GetLayerAdmin();
398         Any aAny;
399         rLayerAdmin.QueryValue(GetVisibleLayers(), aAny);
400         aUserData.addValue( sUNO_View_VisibleLayers, aAny );
401 
402         rLayerAdmin.QueryValue(GetPrintableLayers(), aAny);
403         aUserData.addValue( sUNO_View_PrintableLayers, aAny );
404 
405         rLayerAdmin.QueryValue(GetLockedLayers(), aAny);
406         aUserData.addValue( sUNO_View_LockedLayers, aAny );
407     }
408 
409     aUserData.addValue( sUNO_View_NoAttribs, makeAny( IsNoAttribs() ) );
410     aUserData.addValue( sUNO_View_NoColors, makeAny( IsNoColors() ) );
411 
412     if( GetStandardHelpLines().GetCount() )
413         aUserData.addValue( sUNO_View_SnapLinesDrawing, makeAny( createHelpLinesString( GetStandardHelpLines() ) ) );
414 
415     if( GetNotesHelpLines().GetCount() )
416         aUserData.addValue( sUNO_View_SnapLinesNotes, makeAny( createHelpLinesString( GetNotesHelpLines() ) ) );
417 
418     if( GetHandoutHelpLines().GetCount() )
419         aUserData.addValue( sUNO_View_SnapLinesHandout, makeAny( createHelpLinesString( GetHandoutHelpLines() ) ) );
420 
421     aUserData.addValue( sUNO_View_RulerIsVisible, makeAny( HasRuler() ) );
422     aUserData.addValue( sUNO_View_PageKind, makeAny( static_cast<sal_Int16>(GetPageKind()) ) );
423     aUserData.addValue( sUNO_View_SelectedPage, makeAny( static_cast<sal_Int16>(GetSelectedPage()) ) );
424     aUserData.addValue( sUNO_View_IsLayerMode, makeAny( IsLayerMode() ) );
425 
426     aUserData.addValue( sUNO_View_IsDoubleClickTextEdit,  makeAny( IsDoubleClickTextEdit() ) );
427     aUserData.addValue( sUNO_View_IsClickChangeRotation, makeAny( IsClickChangeRotation() ) );
428 
429     aUserData.addValue( sUNO_View_SlidesPerRow, makeAny( static_cast<sal_Int16>(GetSlidesPerRow()) ) );
430     aUserData.addValue( sUNO_View_EditMode, makeAny( static_cast<sal_Int32>(GetViewShEditMode()) ) );
431     // aUserData.addValue( sUNO_View_EditModeStandard, makeAny( (sal_Int32)GetViewShEditMode( PageKind::Standard ) ) );
432     // aUserData.addValue( sUNO_View_EditModeNotes, makeAny( (sal_Int32)GetViewShEditMode( PageKind::Notes ) ) );
433     // aUserData.addValue( sUNO_View_EditModeHandout, makeAny( (sal_Int32)GetViewShEditMode( PageKind::Handout ) ) );
434 
435     {
436         const ::tools::Rectangle aVisArea = GetVisArea();
437 
438         aUserData.addValue( sUNO_View_VisibleAreaTop, makeAny( static_cast<sal_Int32>(aVisArea.Top()) ) );
439         aUserData.addValue( sUNO_View_VisibleAreaLeft, makeAny( static_cast<sal_Int32>(aVisArea.Left()) ) );
440         aUserData.addValue( sUNO_View_VisibleAreaWidth, makeAny( static_cast<sal_Int32>(aVisArea.GetWidth()) ) );
441         aUserData.addValue( sUNO_View_VisibleAreaHeight, makeAny( static_cast<sal_Int32>(aVisArea.GetHeight()) ) );
442     }
443 
444     aUserData.addValue( sUNO_View_GridCoarseWidth, makeAny( static_cast<sal_Int32>(GetGridCoarse().Width()) ) );
445     aUserData.addValue( sUNO_View_GridCoarseHeight, makeAny( static_cast<sal_Int32>(GetGridCoarse().Height()) ) );
446     aUserData.addValue( sUNO_View_GridFineWidth, makeAny( static_cast<sal_Int32>(GetGridFine().Width()) ) );
447     aUserData.addValue( sUNO_View_GridFineHeight, makeAny( static_cast<sal_Int32>(GetGridFine().Height()) ) );
448     aUserData.addValue( sUNO_View_GridSnapWidthXNumerator, makeAny( GetSnapGridWidthX().GetNumerator() ) );
449     aUserData.addValue( sUNO_View_GridSnapWidthXDenominator, makeAny( GetSnapGridWidthX().GetDenominator() ) );
450     aUserData.addValue( sUNO_View_GridSnapWidthYNumerator, makeAny( GetSnapGridWidthY().GetNumerator() ) );
451     aUserData.addValue( sUNO_View_GridSnapWidthYDenominator, makeAny( GetSnapGridWidthY().GetDenominator() ) );
452     aUserData.addValue( sUNO_View_IsAngleSnapEnabled, makeAny( IsAngleSnapEnabled() ) );
453     aUserData.addValue( sUNO_View_SnapAngle, makeAny( static_cast<sal_Int32>(GetSnapAngle()) ) );
454 
455     const sal_Int32 nOldLength = rValues.getLength();
456     rValues.realloc( nOldLength + aUserData.size() );
457 
458     PropertyValue* pValue = &(rValues.getArray()[nOldLength]);
459 
460     for( const auto& rItem : aUserData )
461     {
462         pValue->Name = rItem.first;
463         pValue->Value = rItem.second;
464         ++pValue;
465     }
466 }
467 #undef addValue
468 
createHelpLinesFromString(const OUString & rLines,SdrHelpLineList & rHelpLines)469 static void createHelpLinesFromString( const OUString& rLines, SdrHelpLineList& rHelpLines )
470 {
471     const sal_Unicode * pStr = rLines.getStr();
472     SdrHelpLine aNewHelpLine;
473     OUStringBuffer sBuffer;
474 
475     while( *pStr )
476     {
477         Point aPoint;
478 
479         switch( *pStr )
480         {
481         case 'P':
482             aNewHelpLine.SetKind( SdrHelpLineKind::Point );
483             break;
484         case 'V':
485             aNewHelpLine.SetKind( SdrHelpLineKind::Vertical );
486             break;
487         case 'H':
488             aNewHelpLine.SetKind( SdrHelpLineKind::Horizontal );
489             break;
490         default:
491             OSL_FAIL( "syntax error in snap lines settings string" );
492             return;
493         }
494 
495         pStr++;
496 
497         while( (*pStr >= '0' && *pStr <= '9') || (*pStr == '+') || (*pStr == '-') )
498         {
499             sBuffer.append( *pStr++ );
500         }
501 
502         sal_Int32 nValue = sBuffer.makeStringAndClear().toInt32();
503 
504         if( aNewHelpLine.GetKind() == SdrHelpLineKind::Horizontal )
505         {
506             aPoint.setY( nValue );
507         }
508         else
509         {
510             aPoint.setX( nValue );
511 
512             if( aNewHelpLine.GetKind() == SdrHelpLineKind::Point )
513             {
514                 if( *pStr++ != ',' )
515                     return;
516 
517                 while( (*pStr >= '0' && *pStr <= '9') || (*pStr == '+') || (*pStr == '-')  )
518                 {
519                     sBuffer.append( *pStr++ );
520                 }
521 
522                 aPoint.setY( sBuffer.makeStringAndClear().toInt32() );
523 
524             }
525         }
526 
527         aNewHelpLine.SetPos( aPoint );
528         rHelpLines.Insert( aNewHelpLine );
529     }
530 }
531 
ReadUserDataSequence(const css::uno::Sequence<css::beans::PropertyValue> & rSequence)532 void FrameView::ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& rSequence )
533 {
534     const sal_Int32 nLength = rSequence.getLength();
535     if (!nLength)
536         return;
537 
538     SdDrawDocument* pDrawDocument = dynamic_cast<SdDrawDocument*>(GetModel());
539     const bool bImpress = pDrawDocument && pDrawDocument->GetDocumentType() == DocumentType::Impress;
540 
541     bool bBool = false;
542     sal_Int32 nInt32 = 0;
543     sal_Int16 nInt16 = 0;
544     OUString aString;
545 
546     sal_Int32 aSnapGridWidthXNum = GetSnapGridWidthX().GetNumerator();
547     sal_Int32 aSnapGridWidthXDom = GetSnapGridWidthX().GetDenominator();
548 
549     sal_Int32 aSnapGridWidthYNum = GetSnapGridWidthY().GetNumerator();
550     sal_Int32 aSnapGridWidthYDom = GetSnapGridWidthY().GetDenominator();
551 
552     for (const css::beans::PropertyValue& rValue : rSequence)
553     {
554         if ( rValue.Name == sUNO_View_ViewId )
555         {
556         }
557         else if ( rValue.Name == sUNO_View_SnapLinesDrawing )
558         {
559             if( rValue.Value >>= aString )
560             {
561                 SdrHelpLineList aHelpLines;
562                 createHelpLinesFromString( aString, aHelpLines );
563                 SetStandardHelpLines( aHelpLines );
564             }
565         }
566         else if ( rValue.Name == sUNO_View_SnapLinesNotes )
567         {
568             if( rValue.Value >>= aString )
569             {
570                 SdrHelpLineList aHelpLines;
571                 createHelpLinesFromString( aString, aHelpLines );
572                 SetNotesHelpLines( aHelpLines );
573             }
574         }
575         else if ( rValue.Name == sUNO_View_SnapLinesHandout )
576         {
577             if( rValue.Value >>= aString )
578             {
579                 SdrHelpLineList aHelpLines;
580                 createHelpLinesFromString( aString, aHelpLines );
581                 SetHandoutHelpLines( aHelpLines );
582             }
583         }
584         else if ( rValue.Name == sUNO_View_RulerIsVisible )
585         {
586             if( rValue.Value >>= bBool )
587             {
588                 SetRuler( bBool );
589             }
590         }
591         else if ( rValue.Name == sUNO_View_PageKind )
592         {
593             if( rValue.Value >>= nInt16 )
594             {
595                 SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( GetModel() );
596                 if( pDoc && pDoc->GetDocSh() && ( SfxObjectCreateMode::EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) )
597                     SetPageKind( static_cast<PageKind>(nInt16) );
598 
599                 SetPageKindOnLoad( static_cast<PageKind>(nInt16) );
600             }
601         }
602         else if ( rValue.Name == sUNO_View_SelectedPage )
603         {
604             if( rValue.Value >>= nInt16 )
605             {
606                 SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( GetModel() );
607                 if( pDoc && pDoc->GetDocSh() && ( SfxObjectCreateMode::EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) )
608                     SetSelectedPage( static_cast<sal_uInt16>(nInt16) );
609 
610                 SetSelectedPageOnLoad( static_cast<sal_uInt16>(nInt16) );
611             }
612         }
613         else if ( rValue.Name == sUNO_View_IsLayerMode )
614         {
615             if( rValue.Value >>= bBool )
616             {
617                 SetLayerMode( bBool );
618             }
619         }
620         else if ( rValue.Name == sUNO_View_IsDoubleClickTextEdit )
621         {
622             if( rValue.Value >>= bBool )
623             {
624                 SetDoubleClickTextEdit( bBool );
625             }
626         }
627         else if ( rValue.Name == sUNO_View_IsClickChangeRotation )
628         {
629             if( rValue.Value >>= bBool )
630             {
631                 SetClickChangeRotation( bBool );
632             }
633         }
634         else if ( rValue.Name == sUNO_View_SlidesPerRow )
635         {
636             if( rValue.Value >>= nInt16 )
637             {
638                 SetSlidesPerRow( static_cast<sal_uInt16>(nInt16) );
639             }
640         }
641         else if ( rValue.Name == sUNO_View_EditMode )
642         {
643             if( rValue.Value >>= nInt32 )
644             {
645                 SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( GetModel() );
646                 if( pDoc && pDoc->GetDocSh() && ( SfxObjectCreateMode::EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) )
647                     SetViewShEditMode( static_cast<EditMode>(nInt32) );
648             }
649         }
650         // This one is kept for compatibility. Old value read from sUNO_View_EditModeStandard
651         // is used. New value will be written into sUNO_View_EditMode.
652         // Values from sUNO_View_EditModeNotes and sUNO_View_EditModeHangout will be ignored.
653         else if ( rValue.Name == sUNO_View_EditModeStandard )
654         {
655             if( rValue.Value >>= nInt32 )
656             {
657                 SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( GetModel() );
658                 if( pDoc && pDoc->GetDocSh() && ( SfxObjectCreateMode::EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) )
659                     SetViewShEditMode( static_cast<EditMode>(nInt32) );
660             }
661         }
662         else if ( rValue.Name == sUNO_View_VisibleAreaTop )
663         {
664             sal_Int32 nTop = 0;
665             if( rValue.Value >>= nTop )
666             {
667                 ::tools::Rectangle aVisArea( GetVisArea() );
668                 aVisArea.AdjustBottom(nTop - aVisArea.Top() );
669                 aVisArea.SetTop( nTop );
670                 SetVisArea( aVisArea );
671             }
672         }
673         else if ( rValue.Name == sUNO_View_VisibleAreaLeft )
674         {
675             sal_Int32 nLeft = 0;
676             if( rValue.Value >>= nLeft )
677             {
678                 ::tools::Rectangle aVisArea( GetVisArea() );
679                 aVisArea.AdjustRight(nLeft - aVisArea.Left() );
680                 aVisArea.SetLeft( nLeft );
681                 SetVisArea( aVisArea );
682             }
683         }
684         else if ( rValue.Name == sUNO_View_VisibleAreaWidth )
685         {
686             sal_Int32 nWidth = 0;
687             if( rValue.Value >>= nWidth )
688             {
689                 ::tools::Rectangle aVisArea( GetVisArea() );
690                 aVisArea.SetRight( aVisArea.Left() + nWidth - 1 );
691                 SetVisArea( aVisArea );
692             }
693         }
694         else if ( rValue.Name == sUNO_View_VisibleAreaHeight )
695         {
696             sal_Int32 nHeight = 0;
697             if( rValue.Value >>= nHeight )
698             {
699                 ::tools::Rectangle aVisArea( GetVisArea() );
700                 aVisArea.SetBottom( nHeight + aVisArea.Top() - 1 );
701                 SetVisArea( aVisArea );
702             }
703         }
704 
705         else if ( rValue.Name == sUNO_View_GridIsVisible )
706         {
707             if( rValue.Value >>= bBool )
708             {
709                 SetGridVisible( bBool );
710             }
711         }
712 
713         else if ( rValue.Name == sUNO_View_IsSnapToGrid )
714         {
715             if( rValue.Value >>= bBool )
716             {
717                 SetGridSnap( bBool );
718             }
719         }
720         else if ( rValue.Name == sUNO_View_GridIsFront )
721         {
722             if( rValue.Value >>= bBool )
723             {
724                 SetGridFront( bBool );
725             }
726         }
727         else if ( rValue.Name == sUNO_View_IsSnapToPageMargins )
728         {
729             if( rValue.Value >>= bBool )
730             {
731                 SetBordSnap( bBool );
732             }
733         }
734         else if ( rValue.Name == sUNO_View_IsSnapToSnapLines )
735         {
736             if( rValue.Value >>= bBool )
737             {
738                 SetHlplSnap( bBool );
739             }
740         }
741         else if ( rValue.Name == sUNO_View_IsSnapToObjectFrame )
742         {
743             if( rValue.Value >>= bBool )
744             {
745                 SetOFrmSnap( bBool );
746             }
747         }
748         else if ( rValue.Name == sUNO_View_IsSnapToObjectPoints )
749         {
750             if( rValue.Value >>= bBool )
751             {
752                 SetOPntSnap( bBool );
753             }
754         }
755         else if ( rValue.Name == sUNO_View_IsPlusHandlesAlwaysVisible )
756         {
757             if( rValue.Value >>= bBool )
758             {
759                 SetPlusHandlesAlwaysVisible( bBool );
760             }
761         }
762         else if ( rValue.Name == sUNO_View_IsFrameDragSingles )
763         {
764             if( rValue.Value >>= bBool )
765             {
766                 SetFrameDragSingles( bBool );
767             }
768         }
769         else if ( rValue.Name == sUNO_View_EliminatePolyPointLimitAngle )
770         {
771             if( rValue.Value >>= nInt32 )
772             {
773                 SetEliminatePolyPointLimitAngle( nInt32 );
774             }
775         }
776         else if ( rValue.Name == sUNO_View_IsEliminatePolyPoints )
777         {
778             if( rValue.Value >>= bBool )
779             {
780                 SetEliminatePolyPoints( bBool );
781             }
782         }
783         else if ( rValue.Name == sUNO_View_ActiveLayer )
784         {
785             if( rValue.Value >>= aString )
786             {
787                 SetActiveLayer( aString );
788             }
789         }
790         else if ( rValue.Name == sUNO_View_NoAttribs )
791         {
792             if( rValue.Value >>= bBool )
793             {
794                 SetNoAttribs( bBool );
795             }
796         }
797         else if ( rValue.Name == sUNO_View_NoColors )
798         {
799             if( rValue.Value >>= bBool )
800             {
801                 SetNoColors( bBool );
802             }
803         }
804         else if ( rValue.Name == sUNO_View_GridCoarseWidth )
805         {
806             if( rValue.Value >>= nInt32 )
807             {
808                 const Size aCoarse( nInt32, GetGridCoarse().Height() );
809                 SetGridCoarse( aCoarse );
810             }
811         }
812         else if ( rValue.Name == sUNO_View_GridCoarseHeight )
813         {
814             if( rValue.Value >>= nInt32 )
815             {
816                 const Size aCoarse( GetGridCoarse().Width(), nInt32 );
817                 SetGridCoarse( aCoarse );
818             }
819         }
820         else if ( rValue.Name == sUNO_View_GridFineWidth )
821         {
822             if( rValue.Value >>= nInt32 )
823             {
824                 const Size aCoarse( nInt32, GetGridFine().Height() );
825                 SetGridFine( aCoarse );
826             }
827         }
828         else if ( rValue.Name == sUNO_View_GridFineHeight )
829         {
830             if( rValue.Value >>= nInt32 )
831             {
832                 const Size aCoarse( GetGridFine().Width(), nInt32 );
833                 SetGridFine( aCoarse );
834             }
835         }
836         else if ( rValue.Name == sUNO_View_IsAngleSnapEnabled )
837         {
838             if( rValue.Value >>= bBool )
839             {
840                 SetAngleSnapEnabled( bBool );
841             }
842         }
843         else if ( rValue.Name == sUNO_View_SnapAngle )
844         {
845             if( rValue.Value >>= nInt32 )
846             {
847                 SetSnapAngle( nInt32 );
848             }
849         }
850         else if ( rValue.Name == sUNO_View_GridSnapWidthXNumerator )
851         {
852             rValue.Value >>= aSnapGridWidthXNum;
853         }
854         else if ( rValue.Name == sUNO_View_GridSnapWidthXDenominator )
855         {
856             rValue.Value >>= aSnapGridWidthXDom;
857         }
858         else if ( rValue.Name == sUNO_View_GridSnapWidthYNumerator )
859         {
860             rValue.Value >>= aSnapGridWidthYNum;
861         }
862         else if ( rValue.Name == sUNO_View_GridSnapWidthYDenominator )
863         {
864             rValue.Value >>= aSnapGridWidthYDom;
865         }
866         else if (!bImpress && rValue.Name == sUNO_View_VisibleLayers  )
867         {
868             SdrLayerIDSet aSdrLayerIDSets;
869             aSdrLayerIDSets.PutValue( rValue.Value );
870             SetVisibleLayers( aSdrLayerIDSets );
871         }
872         else if (!bImpress && rValue.Name == sUNO_View_PrintableLayers )
873         {
874             SdrLayerIDSet aSdrLayerIDSets;
875             aSdrLayerIDSets.PutValue( rValue.Value );
876             SetPrintableLayers( aSdrLayerIDSets );
877         }
878         else if (!bImpress && rValue.Name == sUNO_View_LockedLayers )
879         {
880             SdrLayerIDSet aSdrLayerIDSets;
881             aSdrLayerIDSets.PutValue( rValue.Value );
882             SetLockedLayers( aSdrLayerIDSets );
883         }
884     }
885 
886     SetViewShEditModeOnLoad(EditMode::Page);
887 
888     const Fraction aSnapGridWidthX( aSnapGridWidthXNum, aSnapGridWidthXDom );
889     const Fraction aSnapGridWidthY( aSnapGridWidthYNum, aSnapGridWidthYDom );
890 
891     SetSnapGridWidth( aSnapGridWidthX, aSnapGridWidthY );
892 }
893 
SetPreviousViewShellType(ViewShell::ShellType eType)894 void FrameView::SetPreviousViewShellType (ViewShell::ShellType eType)
895 {
896     mePreviousViewShellType = eType;
897 }
898 
SetViewShellTypeOnLoad(ViewShell::ShellType eType)899 void FrameView::SetViewShellTypeOnLoad (ViewShell::ShellType eType)
900 {
901     meViewShellTypeOnLoad = eType;
902 }
903 
SetSelectedPage(sal_uInt16 nPage)904 void FrameView::SetSelectedPage(sal_uInt16 nPage)
905 {
906     mnSelectedPage = nPage;
907 }
908 
SetIsNavigatorShowingAllShapes(const bool bIsNavigatorShowingAllShapes)909 void FrameView::SetIsNavigatorShowingAllShapes (const bool bIsNavigatorShowingAllShapes)
910 {
911     mbIsNavigatorShowingAllShapes = bIsNavigatorShowingAllShapes;
912 }
913 
914 } // end of namespace sd
915 
916 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
917