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