xref: /core/sd/source/ui/view/drviews3.cxx (revision 5da4acd4)
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 <config_features.h>
21 
22 #include <DrawViewShell.hxx>
23 
24 #include <sfx2/viewfrm.hxx>
25 #include <editeng/eeitem.hxx>
26 #include <editeng/tstpitem.hxx>
27 #include <editeng/lrspitem.hxx>
28 #include <editeng/protitem.hxx>
29 #include <editeng/frmdiritem.hxx>
30 #include <editeng/adjustitem.hxx>
31 #include <svx/svdotable.hxx>
32 #include <editeng/numitem.hxx>
33 #include <svx/rulritem.hxx>
34 #include <svx/svxids.hrc>
35 #include <svx/svdpagv.hxx>
36 #include <sfx2/request.hxx>
37 #include <sfx2/dispatch.hxx>
38 #include <tools/urlobj.hxx>
39 #include <svl/eitem.hxx>
40 #include <svl/rectitem.hxx>
41 #include <svl/stritem.hxx>
42 #include <svx/svdoole2.hxx>
43 #include <svl/itempool.hxx>
44 #include <svl/ptitem.hxx>
45 #include <basic/sbstar.hxx>
46 #include <basic/sberrors.hxx>
47 #include <svx/fmshell.hxx>
48 #include <svx/f3dchild.hxx>
49 #include <svx/float3d.hxx>
50 #include <svx/sdmetitm.hxx>
51 #include <svx/svdogrp.hxx>
52 #include <svx/diagram/IDiagramHelper.hxx>
53 
54 #include <app.hrc>
55 #include <strings.hrc>
56 
57 #include <sdundogr.hxx>
58 #include <undopage.hxx>
59 #include <fupoor.hxx>
60 #include <slideshow.hxx>
61 #include <sdpage.hxx>
62 #include <Window.hxx>
63 #include <sdresid.hxx>
64 #include <unokywds.hxx>
65 #include <drawview.hxx>
66 #include <drawdoc.hxx>
67 #include <DrawDocShell.hxx>
68 #include <sdabstdlg.hxx>
69 #include <sfx2/ipclient.hxx>
70 #include <comphelper/diagnose_ex.hxx>
71 #include <ViewShellBase.hxx>
72 #include <FormShellManager.hxx>
73 #include <LayerTabBar.hxx>
74 #include <com/sun/star/drawing/framework/XControllerManager.hpp>
75 #include <com/sun/star/drawing/framework/XConfigurationController.hpp>
76 #include <com/sun/star/drawing/framework/XConfiguration.hpp>
77 #include <com/sun/star/drawing/XShape.hpp>
78 #include <com/sun/star/frame/XFrame.hpp>
79 #include <editeng/lspcitem.hxx>
80 #include <editeng/ulspitem.hxx>
81 #include <memory>
82 #include <comphelper/processfactory.hxx>
83 #include <oox/drawingml/diagram/diagram.hxx>
84 #include <oox/export/drawingml.hxx>
85 #include <oox/shape/ShapeFilterBase.hxx>
86 
87 using namespace ::com::sun::star::uno;
88 using namespace ::com::sun::star::drawing::framework;
89 using ::com::sun::star::frame::XFrame;
90 using ::com::sun::star::frame::XController;
91 
92 namespace sd {
93 
94 /**
95  * handle SfxRequests for controller
96  */
ExecCtrl(SfxRequest & rReq)97 void  DrawViewShell::ExecCtrl(SfxRequest& rReq)
98 {
99     // except a page switch and jumps to bookmarks, nothing is executed during
100     // a slide show
101     if( HasCurrentFunction(SID_PRESENTATION) &&
102         rReq.GetSlot() != SID_SWITCHPAGE &&
103         rReq.GetSlot() != SID_JUMPTOMARK)
104         return;
105 
106     CheckLineTo (rReq);
107 
108     // End text edit mode for some requests.
109     sal_uInt16 nSlot = rReq.GetSlot();
110     bool bAllowFocusChange = true;
111     switch (nSlot)
112     {
113         case SID_OUTPUT_QUALITY_COLOR:
114         case SID_OUTPUT_QUALITY_GRAYSCALE:
115         case SID_OUTPUT_QUALITY_BLACKWHITE:
116         case SID_OUTPUT_QUALITY_CONTRAST:
117             // Do nothing.
118             break;
119         case SID_SWITCHPAGE:
120             if (rReq.GetArgs() && rReq.GetArgs()->Count () == 1)
121             {
122                 const SfxBoolItem* pAllowFocusChange = rReq.GetArg<SfxBoolItem>(SID_SWITCHPAGE);
123                 bAllowFocusChange = pAllowFocusChange->GetValue();
124                 if (!bAllowFocusChange)
125                     break;
126             }
127             [[fallthrough]];
128         default:
129             if ( mpDrawView->IsTextEdit() )
130             {
131                 mpDrawView->SdrEndTextEdit();
132             }
133     }
134 
135     const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
136     //  sal_uInt16 nSlot = rReq.GetSlot();
137     switch (nSlot)
138     {
139         case SID_SWITCHPAGE:  // BASIC
140         {
141             // switch page in running slide show
142             if(SlideShow::IsRunning(GetViewShellBase())
143                 && !SlideShow::IsInteractiveSlideshow(&GetViewShellBase()) // IASS
144                 && rReq.GetArgs())
145             {
146                 if (const SfxUInt32Item* pWhatPage = rReq.GetArg<SfxUInt32Item>(ID_VAL_WHATPAGE))
147                     SlideShow::GetSlideShow(GetViewShellBase())->jumpToPageNumber(static_cast<sal_Int32>((pWhatPage->GetValue()-1)>>1));
148             }
149             else
150             {
151                 const SfxItemSet *pArgs = rReq.GetArgs ();
152                 sal_uInt16 nSelectedPage = 0;
153 
154                 if (! pArgs || pArgs->Count () == 1)
155                 {
156                     nSelectedPage = maTabControl->GetCurPagePos();
157                 }
158                 else if (pArgs->Count () == 2)
159                 {
160                     const SfxUInt32Item* pWhatPage = rReq.GetArg<SfxUInt32Item>(ID_VAL_WHATPAGE);
161                     const SfxUInt32Item* pWhatKind = rReq.GetArg<SfxUInt32Item>(ID_VAL_WHATKIND);
162 
163                     sal_Int32 nWhatPage = static_cast<sal_Int32>(pWhatPage->GetValue ());
164                     PageKind nWhatKind = static_cast<PageKind>(pWhatKind->GetValue ());
165                     if (nWhatKind < PageKind::Standard || nWhatKind > PageKind::Handout)
166                     {
167 #if HAVE_FEATURE_SCRIPTING
168                         StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE);
169 #endif
170                         rReq.Ignore ();
171                         break;
172                     }
173                     else if (meEditMode != EditMode::MasterPage)
174                     {
175                         if (! CHECK_RANGE (0, nWhatPage, GetDoc()->GetSdPageCount(nWhatKind)))
176                         {
177 #if HAVE_FEATURE_SCRIPTING
178                             StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE);
179 #endif
180                             rReq.Ignore ();
181                             break;
182                         }
183 
184                         nSelectedPage = static_cast<short>(nWhatPage);
185                         mePageKind    = nWhatKind;
186                     }
187                 }
188                 else
189                 {
190 #if HAVE_FEATURE_SCRIPTING
191                     StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
192 #endif
193                     rReq.Ignore ();
194                     break;
195                 }
196 
197                 if( GetDocSh() && (GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED))
198                     GetDocSh()->SetModified();
199 
200                 SwitchPage(nSelectedPage, bAllowFocusChange);
201 
202                 if(HasCurrentFunction(SID_BEZIER_EDIT))
203                     GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
204 
205                 Invalidate();
206                 InvalidateWindows();
207                 rReq.Done ();
208             }
209             break;
210         }
211 
212         case SID_SWITCHLAYER:  // BASIC
213         {
214             const SfxItemSet *pArgs = rReq.GetArgs ();
215 
216             // #i87182#
217             bool bCurPageValid(false);
218             sal_uInt16 nCurPage(0);
219 
220             if(GetLayerTabControl())
221             {
222                 nCurPage = GetLayerTabControl()->GetCurPageId();
223                 bCurPageValid = true;
224             }
225 
226             if(pArgs && 1 == pArgs->Count())
227             {
228                 const SfxUInt32Item* pWhatLayer = rReq.GetArg<SfxUInt32Item>(ID_VAL_WHATLAYER);
229 
230                 if(pWhatLayer)
231                 {
232                     nCurPage = static_cast<short>(pWhatLayer->GetValue());
233                     bCurPageValid = true;
234                 }
235             }
236 
237             if(bCurPageValid)
238             {
239                 OUString aLayerName( GetLayerTabControl()->GetLayerName(nCurPage));
240                 if (!aLayerName.isEmpty())
241                 {
242                     mpDrawView->SetActiveLayer(aLayerName);
243                 }
244                 Invalidate();
245             }
246 
247             rReq.Done ();
248 
249             break;
250         }
251 
252         case SID_PAGEMODE:  // BASIC
253         {
254 
255             const SfxItemSet *pArgs = rReq.GetArgs();
256 
257             if (pArgs && pArgs->Count () == 2)
258             {
259                 const SfxBoolItem* pIsActive = rReq.GetArg<SfxBoolItem>(ID_VAL_ISACTIVE);
260                 const SfxUInt32Item* pWhatKind = rReq.GetArg<SfxUInt32Item>(ID_VAL_WHATKIND);
261 
262                 PageKind nWhatKind = static_cast<PageKind>(pWhatKind->GetValue());
263                 if ( nWhatKind >= PageKind::Standard && nWhatKind <= PageKind::Handout)
264                 {
265                     mbIsLayerModeActive = pIsActive->GetValue();
266                     mePageKind = nWhatKind;
267                 }
268             }
269 
270             // turn on default layer of page
271             mpDrawView->SetActiveLayer(sUNO_LayerName_layout);
272 
273             ChangeEditMode(EditMode::Page, mbIsLayerModeActive);
274 
275             Invalidate();
276             rReq.Done ();
277 
278             break;
279         }
280 
281         case SID_LAYERMODE:  // BASIC
282         {
283             const SfxItemSet *pArgs = rReq.GetArgs();
284 
285             if (pArgs && pArgs->Count() == 2)
286             {
287                 const SfxUInt32Item* pWhatLayer = rReq.GetArg<SfxUInt32Item>(ID_VAL_WHATLAYER);
288                 EditMode nWhatLayer = static_cast<EditMode>(pWhatLayer->GetValue());
289                 if (nWhatLayer == EditMode::Page || nWhatLayer == EditMode::MasterPage)
290                 {
291                     mbIsLayerModeActive = rReq.GetArg<SfxBoolItem>(ID_VAL_ISACTIVE)->GetValue();
292                     meEditMode = nWhatLayer;
293                 }
294             }
295 
296             ChangeEditMode(meEditMode, !mbIsLayerModeActive);
297 
298             Invalidate();
299             rReq.Done();
300 
301             break;
302         }
303 
304         case SID_HEADER_AND_FOOTER:
305         case SID_INSERT_PAGE_NUMBER:
306         case SID_INSERT_DATE_TIME:
307         {
308             SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
309             vcl::Window* pWin = GetActiveWindow();
310             VclPtr<AbstractHeaderFooterDialog> pDlg(pFact->CreateHeaderFooterDialog(this, pWin ? pWin->GetFrameWeld() : nullptr, GetDoc(), mpActualPage));
311             auto xRequest = std::make_shared<SfxRequest>(rReq);
312             rReq.Ignore(); // the 'old' request is not relevant any more
313             pDlg->StartExecuteAsync([this, pDlg, xRequest=std::move(xRequest)](sal_Int32 /*nResult*/){
314                 GetActiveWindow()->Invalidate();
315                 UpdatePreview( mpActualPage );
316 
317                 Invalidate();
318                 xRequest->Done();
319 
320                 pDlg->disposeOnce();
321             });
322             break;
323         }
324 
325         case SID_MASTER_LAYOUTS:
326         {
327             SdPage* pPage = GetActualPage();
328             if (meEditMode == EditMode::MasterPage)
329                 // Use the master page of the current page.
330                 pPage = static_cast<SdPage*>(&pPage->TRG_GetMasterPage());
331 
332             SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
333             vcl::Window* pWin = GetActiveWindow();
334             ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateMasterLayoutDialog(pWin ? pWin->GetFrameWeld() : nullptr, GetDoc(), pPage));
335             pDlg->Execute();
336             Invalidate();
337             rReq.Done ();
338             break;
339         }
340         case SID_OBJECTRESIZE:
341         {
342             // The server likes to change the client size
343             OSL_ASSERT (GetViewShell()!=nullptr);
344             SfxInPlaceClient* pIPClient = GetViewShell()->GetIPClient();
345 
346             if ( pIPClient && pIPClient->IsObjectInPlaceActive() )
347             {
348                 const SfxRectangleItem& rRect =
349                     rReq.GetArgs()->Get(SID_OBJECTRESIZE);
350                 ::tools::Rectangle aRect( GetActiveWindow()->PixelToLogic( rRect.GetValue() ) );
351 
352                 if ( rMarkList.GetMarkCount() != 0 )
353                 {
354                     if (rMarkList.GetMarkCount() == 1)
355                     {
356                         SdrMark* pMark = rMarkList.GetMark(0);
357                         SdrObject* pObj = pMark->GetMarkedSdrObj();
358 
359                         SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( pObj );
360                         if(pOle2Obj)
361                         {
362                             if( pOle2Obj->GetObjRef().is() )
363                             {
364                                 pOle2Obj->SetLogicRect(aRect);
365                             }
366                         }
367                     }
368                 }
369             }
370             rReq.Ignore ();
371             break;
372         }
373 
374         case SID_RELOAD:
375         {
376             sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId();
377             SfxViewFrame* pFrame = GetViewFrame();
378 
379             try
380             {
381                 Reference< XFrame > xFrame( pFrame->GetFrame().GetFrameInterface(), UNO_SET_THROW );
382 
383                 // Save the current configuration of panes and views.
384                 Reference<XControllerManager> xControllerManager (
385                     GetViewShellBase().GetController(), UNO_QUERY_THROW);
386                 Reference<XConfigurationController> xConfigurationController (
387                     xControllerManager->getConfigurationController(), UNO_SET_THROW );
388                 Reference<XConfiguration> xConfiguration (
389                     xConfigurationController->getRequestedConfiguration(), UNO_SET_THROW );
390 
391                 SfxChildWindow* pWindow = pFrame->GetChildWindow(nId);
392                 if(pWindow)
393                 {
394                     Svx3DWin* p3DWin = static_cast<Svx3DWin*>(pWindow->GetWindow());
395                     if(p3DWin)
396                         p3DWin->DocumentReload();
397                 }
398 
399                 // normal forwarding to ViewFrame for execution
400                 GetViewFrame()->ExecuteSlot(rReq);
401 
402                 // From here on we must cope with this object and the frame already being
403                 // deleted.  Do not call any methods or use data members.
404                 Reference<XController> xController( xFrame->getController(), UNO_SET_THROW );
405 
406                 // Restore the configuration.
407                 xControllerManager.set( xController, UNO_QUERY_THROW );
408                 xConfigurationController.set( xControllerManager->getConfigurationController() );
409                 if ( ! xConfigurationController.is())
410                     throw RuntimeException();
411                 xConfigurationController->restoreConfiguration(xConfiguration);
412             }
413             catch (RuntimeException&)
414             {
415                 DBG_UNHANDLED_EXCEPTION("sd.view");
416             }
417 
418             // We have to return immediately to avoid accessing this object.
419             return;
420         }
421 
422         case SID_JUMPTOMARK:
423         {
424             if( rReq.GetArgs() )
425             {
426                 const SfxStringItem* pBookmark = rReq.GetArg<SfxStringItem>(SID_JUMPTOMARK);
427 
428                 if (pBookmark)
429                 {
430                     OUString sBookmark(INetURLObject::decode(pBookmark->GetValue(), INetURLObject::DecodeMechanism::WithCharset));
431 
432                     rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetViewShellBase() ) );
433                     if(xSlideshow.is() && xSlideshow->isRunning())
434                     {
435                         xSlideshow->jumpToBookmark(sBookmark);
436                     }
437                     else
438                     {
439                         GotoBookmark(sBookmark);
440                     }
441                 }
442             }
443             rReq.Done();
444             break;
445         }
446 
447         case SID_OUTPUT_QUALITY_COLOR:
448         case SID_OUTPUT_QUALITY_GRAYSCALE:
449         case SID_OUTPUT_QUALITY_BLACKWHITE:
450         case SID_OUTPUT_QUALITY_CONTRAST:
451         {
452             ExecReq( rReq );
453             break;
454         }
455 
456         case SID_MAIL_SCROLLBODY_PAGEDOWN:
457         {
458             ExecReq( rReq );
459             break;
460         }
461 
462         case SID_ATTR_YEAR2000:
463         {
464             FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell();
465             if (pFormShell != nullptr)
466             {
467                 const SfxPoolItem* pItem;
468                 if (rReq.GetArgs()->GetItemState(
469                     SID_ATTR_YEAR2000, true, &pItem) == SfxItemState::SET)
470                     pFormShell->SetY2KState (
471                         static_cast<const SfxUInt16Item*>(pItem)->GetValue());
472             }
473 
474             rReq.Done();
475         }
476         break;
477 
478         case SID_OPT_LOCALE_CHANGED:
479         {
480             GetActiveWindow()->Invalidate();
481             UpdatePreview( mpActualPage );
482             rReq.Done();
483         }
484         break;
485 
486         case SID_REGENERATE_DIAGRAM:
487         case SID_EDIT_DIAGRAM:
488         {
489             if (1 == rMarkList.GetMarkCount())
490             {
491                 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
492 
493                 // Support advanced DiagramHelper
494                 if(nullptr != pObj && pObj->isDiagram())
495                 {
496                     if(SID_REGENERATE_DIAGRAM == nSlot)
497                     {
498                         mpDrawView->UnmarkAll();
499                         pObj->getDiagramHelper()->reLayout(*static_cast<SdrObjGroup*>(pObj));
500                         mpDrawView->MarkObj(pObj, mpDrawView->GetSdrPageView());
501                     }
502                     else // SID_EDIT_DIAGRAM
503                     {
504                         VclAbstractDialogFactory* pFact = VclAbstractDialogFactory::Create();
505                         VclPtr<VclAbstractDialog> pDlg = pFact->CreateDiagramDialog(
506                             GetFrameWeld(),
507                             *static_cast<SdrObjGroup*>(pObj));
508                         pDlg->StartExecuteAsync(
509                             [pDlg] (sal_Int32 /*nResult*/)->void
510                             {
511                                 pDlg->disposeOnce();
512                             }
513                         );
514                     }
515                 }
516             }
517 
518             rReq.Done();
519         }
520         break;
521 
522         default:
523         break;
524     }
525 }
526 
ExecRuler(SfxRequest & rReq)527 void  DrawViewShell::ExecRuler(SfxRequest& rReq)
528 {
529     // nothing is executed during a slide show!
530     if(HasCurrentFunction(SID_PRESENTATION))
531         return;
532 
533     CheckLineTo (rReq);
534 
535     const SfxItemSet* pArgs = rReq.GetArgs();
536     const Point aPagePos( GetActiveWindow()->GetViewOrigin() );
537     Size aPageSize = mpActualPage->GetSize();
538     Size aViewSize = GetActiveWindow()->GetViewSize();
539 
540     switch ( rReq.GetSlot() )
541     {
542         case SID_ATTR_LONG_LRSPACE:
543             if (pArgs)
544             {
545                 std::unique_ptr<SdUndoGroup> pUndoGroup(new SdUndoGroup(GetDoc()));
546                 pUndoGroup->SetComment(SdResId(STR_UNDO_CHANGE_PAGEBORDER));
547 
548                 const SvxLongLRSpaceItem& rLRSpace =
549                         pArgs->Get(SID_ATTR_LONG_LRSPACE);
550 
551                 if( mpDrawView->IsTextEdit() )
552                 {
553                     ::tools::Rectangle aRect = maMarkRect;
554                     aRect.SetPos(aRect.TopLeft() + aPagePos);
555                     aRect.SetLeft( rLRSpace.GetLeft() );
556                     aRect.SetRight( aViewSize.Width() - rLRSpace.GetRight() );
557                     aRect.SetPos(aRect.TopLeft() - aPagePos);
558                     if ( aRect != maMarkRect)
559                     {
560                         mpDrawView->SetAllMarkedRect(aRect);
561                         maMarkRect = mpDrawView->GetAllMarkedRect();
562                         Invalidate( SID_RULER_OBJECT );
563                     }
564                 }
565                 else
566                 {
567                     ::tools::Long nLeft = std::max(::tools::Long(0), rLRSpace.GetLeft() - aPagePos.X());
568                     ::tools::Long nRight = std::max(::tools::Long(0), rLRSpace.GetRight() + aPagePos.X() +
569                                           aPageSize.Width() - aViewSize.Width());
570 
571                     sal_uInt16 nPageCnt = GetDoc()->GetSdPageCount(mePageKind);
572                     sal_uInt16 i;
573                     for ( i = 0; i < nPageCnt; i++)
574                     {
575                         SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind);
576                         SdUndoAction* pUndo = new SdPageLRUndoAction(GetDoc(),
577                                                 pPage,
578                                                 pPage->GetLeftBorder(),
579                                                 pPage->GetRightBorder(),
580                                                 nLeft, nRight);
581                         pUndoGroup->AddAction(pUndo);
582                         pPage->SetLeftBorder(nLeft);
583                         pPage->SetRightBorder(nRight);
584                     }
585                     nPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind);
586 
587                     for (i = 0; i < nPageCnt; i++)
588                     {
589                         SdPage* pPage = GetDoc()->GetMasterSdPage(i, mePageKind);
590                         SdUndoAction* pUndo = new SdPageLRUndoAction(GetDoc(),
591                                                 pPage,
592                                                 pPage->GetLeftBorder(),
593                                                 pPage->GetRightBorder(),
594                                                 nLeft, nRight);
595                         pUndoGroup->AddAction(pUndo);
596                         pPage->SetLeftBorder(nLeft);
597                         pPage->SetRightBorder(nRight);
598                     }
599                     InvalidateWindows();
600                 }
601 
602                 // give the undo group to the undo manager
603                 GetViewFrame()->GetObjectShell()->GetUndoManager()->
604                                                     AddUndoAction(std::move(pUndoGroup));
605             }
606             break;
607         case SID_ATTR_LONG_ULSPACE:
608             if (pArgs)
609             {
610                 std::unique_ptr<SdUndoGroup> pUndoGroup(new SdUndoGroup(GetDoc()));
611                 pUndoGroup->SetComment(SdResId(STR_UNDO_CHANGE_PAGEBORDER));
612 
613                 const SvxLongULSpaceItem& rULSpace =
614                         pArgs->Get(SID_ATTR_LONG_ULSPACE);
615 
616                 if( mpDrawView->IsTextEdit() )
617                 {
618                     ::tools::Rectangle aRect = maMarkRect;
619                     aRect.SetPos(aRect.TopLeft() + aPagePos);
620                     aRect.SetTop( rULSpace.GetUpper() );
621                     aRect.SetBottom( aViewSize.Height() - rULSpace.GetLower() );
622                     aRect.SetPos(aRect.TopLeft() - aPagePos);
623 
624                     if ( aRect != maMarkRect)
625                     {
626                         mpDrawView->SetAllMarkedRect(aRect);
627                         maMarkRect = mpDrawView->GetAllMarkedRect();
628                         Invalidate( SID_RULER_OBJECT );
629                     }
630                 }
631                 else
632                 {
633                     ::tools::Long nUpper = std::max(::tools::Long(0), rULSpace.GetUpper() - aPagePos.Y());
634                     ::tools::Long nLower = std::max(::tools::Long(0), rULSpace.GetLower() + aPagePos.Y() +
635                                           aPageSize.Height() - aViewSize.Height());
636 
637                     sal_uInt16 nPageCnt = GetDoc()->GetSdPageCount(mePageKind);
638                     sal_uInt16 i;
639                     for ( i = 0; i < nPageCnt; i++)
640                     {
641                         SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind);
642                         SdUndoAction* pUndo = new SdPageULUndoAction(GetDoc(),
643                                                 pPage,
644                                                 pPage->GetUpperBorder(),
645                                                 pPage->GetLowerBorder(),
646                                                 nUpper, nLower);
647                         pUndoGroup->AddAction(pUndo);
648                         pPage->SetUpperBorder(nUpper);
649                         pPage->SetLowerBorder(nLower);
650                     }
651                     nPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind);
652 
653                     for (i = 0; i < nPageCnt; i++)
654                     {
655                         SdPage* pPage = GetDoc()->GetMasterSdPage(i, mePageKind);
656                         SdUndoAction* pUndo = new SdPageULUndoAction(GetDoc(),
657                                                 pPage,
658                                                 pPage->GetUpperBorder(),
659                                                 pPage->GetLowerBorder(),
660                                                 nUpper, nLower);
661                         pUndoGroup->AddAction(pUndo);
662                         pPage->SetUpperBorder(nUpper);
663                         pPage->SetLowerBorder(nLower);
664                     }
665                     InvalidateWindows();
666                 }
667 
668                 // give the undo group to the undo manager
669                 GetViewFrame()->GetObjectShell()->GetUndoManager()->
670                                                     AddUndoAction(std::move(pUndoGroup));
671             }
672             break;
673         case SID_RULER_OBJECT:
674             if (pArgs)
675             {
676                 ::tools::Rectangle aRect = maMarkRect;
677                 aRect.SetPos(aRect.TopLeft() + aPagePos);
678 
679                 const SvxObjectItem& rOI = pArgs->Get(SID_RULER_OBJECT);
680 
681                 if ( rOI.GetStartX() != rOI.GetEndX() )
682                 {
683                     aRect.SetLeft( rOI.GetStartX() );
684                     aRect.SetRight( rOI.GetEndX() );
685                 }
686                 if ( rOI.GetStartY() != rOI.GetEndY() )
687                 {
688                     aRect.SetTop( rOI.GetStartY() );
689                     aRect.SetBottom( rOI.GetEndY() );
690                 }
691                 aRect.SetPos(aRect.TopLeft() - aPagePos);
692                 if ( aRect != maMarkRect)
693                 {
694                     mpDrawView->SetAllMarkedRect(aRect);
695                     maMarkRect = mpDrawView->GetAllMarkedRect();
696                     Invalidate( SID_RULER_OBJECT );
697                 }
698             }
699             break;
700         case SID_ATTR_TABSTOP:
701             if (pArgs && mpDrawView->IsTextEdit())
702             {
703                 const SvxTabStopItem& rItem = pArgs->Get( EE_PARA_TABS );
704 
705                 SfxItemSetFixed<EE_PARA_TABS, EE_PARA_TABS> aEditAttr( GetPool() );
706 
707                 aEditAttr.Put( rItem );
708                 mpDrawView->SetAttributes( aEditAttr );
709 
710                 Invalidate(SID_ATTR_TABSTOP);
711             }
712             break;
713         case SID_ATTR_PARA_LINESPACE:
714             if (pArgs)
715             {
716                 SvxLineSpacingItem aParaLineSP = pArgs->Get(
717                     GetPool().GetWhichIDFromSlotID(SID_ATTR_PARA_LINESPACE));
718 
719                 SfxItemSetFixed<EE_PARA_SBL, EE_PARA_SBL> aEditAttr( GetPool() );
720                 aParaLineSP.SetWhich( EE_PARA_SBL );
721 
722                 aEditAttr.Put( aParaLineSP );
723                 mpDrawView->SetAttributes( aEditAttr );
724 
725                 Invalidate(SID_ATTR_PARA_LINESPACE);
726             }
727             break;
728         case SID_ATTR_PARA_ADJUST_LEFT:
729         {
730             SvxAdjustItem aItem( SvxAdjust::Left, EE_PARA_JUST );
731             SfxItemSetFixed<EE_PARA_JUST, EE_PARA_JUST> aEditAttr( GetPool() );
732 
733             aEditAttr.Put( aItem );
734             mpDrawView->SetAttributes( aEditAttr );
735 
736             Invalidate(SID_ATTR_PARA_ADJUST_LEFT);
737             break;
738         }
739         case SID_ATTR_PARA_ADJUST_CENTER:
740         {
741             SvxAdjustItem aItem( SvxAdjust::Center, EE_PARA_JUST );
742             SfxItemSetFixed<EE_PARA_JUST, EE_PARA_JUST> aEditAttr( GetPool() );
743 
744             aEditAttr.Put( aItem );
745             mpDrawView->SetAttributes( aEditAttr );
746 
747             Invalidate(SID_ATTR_PARA_ADJUST_CENTER);
748             break;
749         }
750         case SID_ATTR_PARA_ADJUST_RIGHT:
751         {
752             SvxAdjustItem aItem( SvxAdjust::Right, EE_PARA_JUST );
753             SfxItemSetFixed<EE_PARA_JUST, EE_PARA_JUST> aEditAttr( GetPool() );
754 
755             aEditAttr.Put( aItem );
756             mpDrawView->SetAttributes( aEditAttr );
757 
758             Invalidate(SID_ATTR_PARA_ADJUST_RIGHT);
759             break;
760         }
761         case SID_ATTR_PARA_ADJUST_BLOCK:
762         {
763             SvxAdjustItem aItem( SvxAdjust::Block, EE_PARA_JUST );
764             SfxItemSetFixed<EE_PARA_JUST, EE_PARA_JUST> aEditAttr( GetPool() );
765 
766             aEditAttr.Put( aItem );
767             mpDrawView->SetAttributes( aEditAttr );
768 
769             Invalidate(SID_ATTR_PARA_ADJUST_BLOCK);
770             break;
771         }
772         case SID_ATTR_PARA_ULSPACE:
773             if (pArgs)
774             {
775                 SvxULSpaceItem aULSP = static_cast<const SvxULSpaceItem&>(pArgs->Get(
776                     SID_ATTR_PARA_ULSPACE));
777                 SfxItemSetFixed<EE_PARA_ULSPACE, EE_PARA_ULSPACE> aEditAttr( GetPool() );
778                 aULSP.SetWhich( EE_PARA_ULSPACE );
779 
780                 aEditAttr.Put( aULSP );
781                 mpDrawView->SetAttributes( aEditAttr );
782 
783                 Invalidate(SID_ATTR_PARA_ULSPACE);
784             }
785             break;
786         case SID_ATTR_PARA_LRSPACE:
787             if (pArgs)
788             {
789                 SvxLRSpaceItem aLRSpace = static_cast<const SvxLRSpaceItem&>(pArgs->Get(
790                     SID_ATTR_PARA_LRSPACE));
791 
792                 SfxItemSetFixed<EE_PARA_LRSPACE, EE_PARA_LRSPACE> aEditAttr( GetPool() );
793                 aLRSpace.SetWhich( EE_PARA_LRSPACE );
794 
795                 aEditAttr.Put( aLRSpace );
796                 mpDrawView->SetAttributes( aEditAttr );
797 
798                 Invalidate(SID_ATTR_PARA_LRSPACE);
799             }
800             break;
801         case SID_ATTR_LRSPACE:
802             if (pArgs && mpDrawView->IsTextEdit())
803             {
804                 sal_uInt16 nId = SID_ATTR_PARA_LRSPACE;
805                 const SvxLRSpaceItem& rItem = static_cast<const SvxLRSpaceItem&>(
806                             pArgs->Get( nId ));
807 
808                 SfxItemSetFixed<
809                     EE_PARA_NUMBULLET, EE_PARA_NUMBULLET,
810                     EE_PARA_OUTLLEVEL, EE_PARA_OUTLLEVEL,
811                     EE_PARA_LRSPACE, EE_PARA_LRSPACE> aEditAttr( GetDoc()->GetPool() );
812                 mpDrawView->GetAttributes( aEditAttr );
813 
814                 nId = EE_PARA_LRSPACE;
815                 SvxLRSpaceItem aLRSpaceItem( rItem.GetLeft(),
816                         rItem.GetRight(),
817                         rItem.GetTextFirstLineOffset(), nId );
818 
819                 const sal_Int16 nOutlineLevel = aEditAttr.Get( EE_PARA_OUTLLEVEL ).GetValue();
820                 const SvxLRSpaceItem& rOrigLRSpaceItem = aEditAttr.Get( EE_PARA_LRSPACE );
821                 const SvxNumBulletItem& rNumBulletItem = aEditAttr.Get( EE_PARA_NUMBULLET );
822                 if( nOutlineLevel != -1 &&
823                     rNumBulletItem.GetNumRule().GetLevelCount() > nOutlineLevel )
824                 {
825                     const SvxNumberFormat& rFormat = rNumBulletItem.GetNumRule().GetLevel(nOutlineLevel);
826                     SvxNumberFormat aFormat(rFormat);
827 
828                     // left margin gets distributed onto LRSpace item
829                     // and number format AbsLSpace - this fixes
830                     // n#707779 (previously, LRSpace left indent could
831                     // become negative - EditEngine really does not
832                     // like that.
833                     const auto nAbsLSpace=aFormat.GetAbsLSpace();
834                     const ::tools::Long  nTxtLeft=rItem.GetTextLeft();
835                     const ::tools::Long  nLeftIndent=std::max(::tools::Long(0),nTxtLeft - nAbsLSpace);
836                     aLRSpaceItem.SetTextLeft(nLeftIndent);
837                     // control for clipped left indent - remainder
838                     // reduces number format first line indent
839                     aFormat.SetAbsLSpace(nTxtLeft - nLeftIndent);
840 
841                     // negative first line indent goes to the number
842                     // format, positive to the lrSpace item
843                     if( rItem.GetTextFirstLineOffset() < 0 )
844                     {
845                         aFormat.SetFirstLineOffset(
846                             rItem.GetTextFirstLineOffset()
847                             - rOrigLRSpaceItem.GetTextFirstLineOffset()
848                             + aFormat.GetCharTextDistance());
849                         aLRSpaceItem.SetTextFirstLineOffset(0);
850                     }
851                     else
852                     {
853                         aFormat.SetFirstLineOffset(0);
854                         aLRSpaceItem.SetTextFirstLineOffset(
855                             rItem.GetTextFirstLineOffset()
856                             - aFormat.GetFirstLineOffset() //TODO: overflow
857                             + aFormat.GetCharTextDistance());
858                     }
859 
860                     if( rFormat != aFormat )
861                     {
862                         // put all items
863                         const_cast<SvxNumRule&>(rNumBulletItem.GetNumRule()).SetLevel(nOutlineLevel,aFormat);
864                         aEditAttr.Put( rNumBulletItem );
865                         aEditAttr.Put( aLRSpaceItem );
866                         mpDrawView->SetAttributes( aEditAttr );
867 
868                         Invalidate(SID_ATTR_PARA_LRSPACE);
869                         break;
870                     }
871                 }
872 
873                 // only put lrSpace item
874                 SfxItemSetFixed<EE_PARA_LRSPACE, EE_PARA_LRSPACE> aEditAttrReduced( GetDoc()->GetPool() );
875                 aEditAttrReduced.Put( aLRSpaceItem );
876                 mpDrawView->SetAttributes( aEditAttrReduced );
877 
878                 Invalidate(SID_ATTR_PARA_LRSPACE);
879             }
880             break;
881     }
882 }
883 
GetRulerState(SfxItemSet & rSet)884 void  DrawViewShell::GetRulerState(SfxItemSet& rSet)
885 {
886     Point aOrigin;
887 
888     if (mpDrawView->GetSdrPageView())
889     {
890         aOrigin = mpDrawView->GetSdrPageView()->GetPageOrigin();
891     }
892 
893     Size aViewSize = GetActiveWindow()->GetViewSize();
894 
895     const Point aPagePos( GetActiveWindow()->GetViewOrigin() );
896     Size aPageSize = mpActualPage->GetSize();
897 
898     ::tools::Rectangle aRect(aPagePos, Point( aViewSize.Width() - (aPagePos.X() + aPageSize.Width()),
899                                      aViewSize.Height() - (aPagePos.Y() + aPageSize.Height())));
900 
901     if( mpDrawView->IsTextEdit() )
902     {
903         Point aPnt1 = GetActiveWindow()->GetWinViewPos();
904         ::tools::Rectangle aMinMaxRect( aPnt1, Size(-1, -1) );
905         rSet.Put( SfxRectangleItem(SID_RULER_LR_MIN_MAX, aMinMaxRect) );
906     }
907     else
908     {
909         rSet.Put( SfxRectangleItem(SID_RULER_LR_MIN_MAX, aRect) );
910     }
911 
912     SvxLongLRSpaceItem aLRSpace(aPagePos.X() + mpActualPage->GetLeftBorder(),
913                                 aRect.Right() + mpActualPage->GetRightBorder(),
914                                 SID_ATTR_LONG_LRSPACE);
915     SvxLongULSpaceItem aULSpace(aPagePos.Y() + mpActualPage->GetUpperBorder(),
916                                 aRect.Bottom() + mpActualPage->GetLowerBorder(),
917                                 SID_ATTR_LONG_ULSPACE);
918     rSet.Put(SvxPagePosSizeItem(Point(0,0) - aPagePos, aViewSize.Width(),
919                                                        aViewSize.Height()));
920     SfxPointItem aPointItem( SID_RULER_NULL_OFFSET, aPagePos + aOrigin );
921 
922     SvxProtectItem aProtect( SID_RULER_PROTECT );
923 
924     maMarkRect = mpDrawView->GetAllMarkedRect();
925 
926     const bool bRTL = GetDoc() && GetDoc()->GetDefaultWritingMode() == css::text::WritingMode_RL_TB;
927     rSet.Put(SfxBoolItem(SID_RULER_TEXT_RIGHT_TO_LEFT, bRTL));
928     const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
929 
930     if( rMarkList.GetMarkCount() != 0 )
931     {
932         if( mpDrawView->IsTextEdit() )
933         {
934             SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
935             if( pObj->GetObjInventor() == SdrInventor::Default)
936             {
937                 SfxItemSet aEditAttr( GetDoc()->GetPool() );
938                 mpDrawView->GetAttributes( aEditAttr );
939                 if( aEditAttr.GetItemState( EE_PARA_TABS ) >= SfxItemState::DEFAULT )
940                 {
941                     const SvxTabStopItem& rItem = aEditAttr.Get( EE_PARA_TABS );
942                     rSet.Put( rItem );
943 
944                     const SvxLRSpaceItem& rLRSpaceItem = aEditAttr.Get( EE_PARA_LRSPACE );
945                     SvxLRSpaceItem aLRSpaceItem( rLRSpaceItem.GetLeft(),
946                             rLRSpaceItem.GetRight(),
947                             rLRSpaceItem.GetTextFirstLineOffset(), SID_ATTR_PARA_LRSPACE );
948 
949                     const sal_Int16 nOutlineLevel = aEditAttr.Get( EE_PARA_OUTLLEVEL ).GetValue();
950                     const SvxNumBulletItem& rNumBulletItem = aEditAttr.Get( EE_PARA_NUMBULLET );
951                     if( nOutlineLevel != -1 &&
952                         rNumBulletItem.GetNumRule().GetLevelCount() > nOutlineLevel )
953                     {
954                         const SvxNumberFormat& rFormat = rNumBulletItem.GetNumRule().GetLevel(nOutlineLevel);
955                         aLRSpaceItem.SetTextLeft(rFormat.GetAbsLSpace() + rLRSpaceItem.GetTextLeft());
956                         aLRSpaceItem.SetTextFirstLineOffset(
957                             rLRSpaceItem.GetTextFirstLineOffset() + rFormat.GetFirstLineOffset()
958                                 //TODO: overflow
959                             - rFormat.GetCharTextDistance());
960                     }
961 
962                     rSet.Put( aLRSpaceItem );
963 
964                     Point aPos( aPagePos + maMarkRect.TopLeft() );
965 
966                     if ( aEditAttr.GetItemState( SDRATTR_TEXT_LEFTDIST ) == SfxItemState::SET )
967                     {
968                         const SdrMetricItem& rTLDItem = aEditAttr.Get( SDRATTR_TEXT_LEFTDIST );
969                         ::tools::Long nLD = rTLDItem.GetValue();
970                         aPos.AdjustX(nLD );
971                     }
972 
973                     aPointItem.SetValue( aPos );
974 
975                     ::tools::Rectangle aParaRect(maMarkRect);
976                     if (pObj->GetObjIdentifier() == SdrObjKind::Table)
977                     {
978                         sdr::table::SdrTableObj* pTable = static_cast<sdr::table::SdrTableObj*>(pObj);
979                         sdr::table::CellPos cellpos;
980                         pTable->getActiveCellPos(cellpos);
981                         pTable->getCellBounds(cellpos, aParaRect);
982                     }
983 
984                     aLRSpace.SetLeft(aPagePos.X() + aParaRect.Left());
985 
986                     if ( aEditAttr.GetItemState( SDRATTR_TEXT_LEFTDIST ) == SfxItemState::SET )
987                     {
988                         const SdrMetricItem& rTLDItem = aEditAttr.Get( SDRATTR_TEXT_LEFTDIST );
989                         ::tools::Long nLD = rTLDItem.GetValue();
990                         aLRSpace.SetLeft( aLRSpace.GetLeft() + nLD );
991                     }
992 
993                     aLRSpace.SetRight(aRect.Right() + aPageSize.Width() - aParaRect.Right());
994 
995                     if ( aEditAttr.GetItemState( SDRATTR_TEXT_RIGHTDIST ) == SfxItemState::SET )
996                     {
997                         const SdrMetricItem& rTRDItem = aEditAttr.Get( SDRATTR_TEXT_RIGHTDIST );
998                         ::tools::Long nRD = rTRDItem.GetValue();
999                         aLRSpace.SetRight( aLRSpace.GetRight() + nRD );
1000                     }
1001 
1002                     aULSpace.SetUpper( aPagePos.Y() + maMarkRect.Top() );
1003                     aULSpace.SetLower( aRect.Bottom() + aPageSize.Height() - maMarkRect.Bottom() );
1004 
1005                     rSet.DisableItem( SID_RULER_OBJECT );
1006 
1007                     // lock page margins
1008                     aProtect.SetSizeProtect( true );
1009                     aProtect.SetPosProtect( true );
1010                 }
1011 
1012                 if( aEditAttr.GetItemState( EE_PARA_WRITINGDIR ) >= SfxItemState::DEFAULT )
1013                 {
1014                     const SvxFrameDirectionItem& rItem = aEditAttr.Get( EE_PARA_WRITINGDIR );
1015                     rSet.Put(SfxBoolItem(SID_RULER_TEXT_RIGHT_TO_LEFT, rItem.GetValue() == SvxFrameDirection::Horizontal_RL_TB));
1016                 }
1017             }
1018         }
1019         else
1020         {
1021             rSet.DisableItem( EE_PARA_TABS );
1022             rSet.DisableItem( SID_RULER_TEXT_RIGHT_TO_LEFT );
1023 
1024             if( mpDrawView->IsResizeAllowed(true) )
1025             {
1026                 ::tools::Rectangle aResizeRect( maMarkRect );
1027 
1028                 aResizeRect.SetPos(aResizeRect.TopLeft() + aPagePos);
1029                 SvxObjectItem aObjItem(aResizeRect.Left(), aResizeRect.Right(),
1030                                        aResizeRect.Top(), aResizeRect.Bottom());
1031                 rSet.Put(aObjItem);
1032                 rSet.DisableItem( EE_PARA_TABS );
1033             }
1034             else
1035             {
1036                 rSet.DisableItem( SID_RULER_OBJECT );
1037             }
1038         }
1039     }
1040     else
1041     {
1042         rSet.DisableItem( SID_RULER_OBJECT );
1043         rSet.DisableItem( EE_PARA_TABS );
1044     }
1045 
1046     rSet.Put( aLRSpace );
1047     rSet.Put( aULSpace );
1048 
1049     rSet.Put( aPointItem );
1050     rSet.Put( aProtect );
1051 }
1052 
ExecStatusBar(SfxRequest & rReq)1053 void  DrawViewShell::ExecStatusBar(SfxRequest& rReq)
1054 {
1055     // nothing is executed during a slide show!
1056     if(HasCurrentFunction(SID_PRESENTATION))
1057         return;
1058 
1059     CheckLineTo (rReq);
1060 
1061     switch ( rReq.GetSlot() )
1062     {
1063         case SID_ATTR_SIZE:
1064         {
1065             GetViewFrame()->GetDispatcher()->Execute( SID_ATTR_TRANSFORM, SfxCallMode::ASYNCHRON );
1066         }
1067         break;
1068 
1069         case SID_STATUS_LAYOUT:
1070         {
1071             GetViewFrame()->GetDispatcher()->Execute( SID_PRESENTATION_LAYOUT, SfxCallMode::ASYNCHRON );
1072         }
1073         break;
1074 
1075         case SID_STATUS_PAGE:
1076         {
1077             GetViewFrame()->GetDispatcher()->Execute(SID_GO_TO_PAGE,
1078                                 SfxCallMode::SYNCHRON | SfxCallMode::RECORD);
1079         }
1080         break;
1081     }
1082 }
1083 
1084 /**
1085  * set state of snap object entries in popup
1086  */
GetSnapItemState(SfxItemSet & rSet)1087 void  DrawViewShell::GetSnapItemState( SfxItemSet &rSet )
1088 {
1089     SdrPageView* pPV;
1090     Point   aMPos = GetActiveWindow()->PixelToLogic(maMousePos);
1091     sal_uInt16  nHitLog = static_cast<sal_uInt16>(GetActiveWindow()->PixelToLogic(
1092         Size(FuPoor::HITPIX,0)).Width());
1093     sal_uInt16  nHelpLine;
1094 
1095     if ( !mpDrawView->PickHelpLine(aMPos, nHitLog, *GetActiveWindow()->GetOutDev(), nHelpLine, pPV) )
1096         return;
1097 
1098     const SdrHelpLine& rHelpLine = (pPV->GetHelpLines())[nHelpLine];
1099 
1100     if ( rHelpLine.GetKind() == SdrHelpLineKind::Point )
1101     {
1102         rSet.Put( SfxStringItem( SID_SET_SNAPITEM,
1103                             SdResId( STR_POPUP_EDIT_SNAPPOINT)) );
1104         rSet.Put( SfxStringItem( SID_DELETE_SNAPITEM,
1105                             SdResId( STR_POPUP_DELETE_SNAPPOINT)) );
1106     }
1107     else
1108     {
1109         rSet.Put( SfxStringItem( SID_SET_SNAPITEM,
1110                             SdResId( STR_POPUP_EDIT_SNAPLINE)) );
1111         rSet.Put( SfxStringItem( SID_DELETE_SNAPITEM,
1112                             SdResId( STR_POPUP_DELETE_SNAPLINE)) );
1113     }
1114 }
1115 
1116 } // end of namespace sd
1117 
1118 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
1119