xref: /AOO41X/main/sd/source/ui/view/drviews3.cxx (revision ca62e2c2083b5d0995f1245bad6c2edfb455fbec)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 
27 #include "DrawViewShell.hxx"
28 
29 #include <sfx2/viewfrm.hxx>
30 #include <editeng/eeitem.hxx>
31 #include <editeng/tstpitem.hxx>
32 #include <editeng/lrspitem.hxx>
33 #include <editeng/protitem.hxx>
34 #include <editeng/frmdiritem.hxx>
35 #include <editeng/adjitem.hxx>
36 #include <svx/ruler.hxx>
37 #ifndef _SVX_RULERITEM_HXX
38 #include <svx/rulritem.hxx>
39 #endif
40 #include <svx/zoomitem.hxx>
41 #ifndef _SVXIDS_HRC
42 #include <svx/svxids.hrc>
43 #endif
44 #include <svx/svdpagv.hxx>
45 #include <sfx2/request.hxx>
46 #include <sfx2/dispatch.hxx>
47 #include <tools/urlobj.hxx>
48 #include <svl/aeitem.hxx>
49 #include <svl/eitem.hxx>
50 #include <svl/rectitem.hxx>
51 #include <svl/stritem.hxx>
52 #include <svx/svdoole2.hxx>
53 #include <svl/itempool.hxx>
54 #include <svl/ptitem.hxx>
55 #include <basic/sbstar.hxx>
56 #include <basic/sberrors.hxx>
57 #include <svx/fmshell.hxx>
58 #include <svx/f3dchild.hxx>
59 #include <svx/float3d.hxx>
60 #include "optsitem.hxx"
61 
62 #include "app.hrc"
63 #include "glob.hrc"
64 #include "strings.hrc"
65 #include "res_bmp.hrc"
66 
67 #include "sdundogr.hxx"
68 #include "undopage.hxx"
69 #include "glob.hxx"
70 #include "app.hxx"
71 #include "fupoor.hxx"
72 #include "slideshow.hxx"
73 #ifndef SD_FRAME_VIEW
74 #include "FrameView.hxx"
75 #endif
76 #include "sdpage.hxx"
77 #include "Window.hxx"
78 #include "sdresid.hxx"
79 #include "drawview.hxx"
80 #include "drawdoc.hxx"
81 #include "DrawViewShell.hxx"
82 #include "Ruler.hxx"
83 #include "DrawDocShell.hxx"
84 #include "headerfooterdlg.hxx"
85 #include "masterlayoutdlg.hxx"
86 #include "Ruler.hxx"
87 #include "DrawDocShell.hxx"
88 #include "sdabstdlg.hxx"
89 #include <sfx2/ipclient.hxx>
90 #include <tools/diagnose_ex.h>
91 #include "ViewShellBase.hxx"
92 #include "FormShellManager.hxx"
93 #include "LayerTabBar.hxx"
94 #include "sdabstdlg.hxx"
95 #include "sdpage.hxx"
96 #include <com/sun/star/drawing/framework/XControllerManager.hpp>
97 #include <com/sun/star/drawing/framework/XConfigurationController.hpp>
98 #include <com/sun/star/drawing/framework/XConfiguration.hpp>
99 #include <com/sun/star/frame/XFrame.hpp>
100 #include <editeng/lspcitem.hxx>
101 #include <editeng/ulspitem.hxx>
102 using namespace ::com::sun::star::uno;
103 using namespace ::com::sun::star::drawing::framework;
104 using ::com::sun::star::frame::XFrame;
105 using ::com::sun::star::frame::XController;
106 
107 namespace sd {
108 
109 #ifndef SO2_DECL_SVINPLACEOBJECT_DEFINED
110 #define SO2_DECL_SVINPLACEOBJECT_DEFINED
SO2_DECL_REF(SvInPlaceObject)111 SO2_DECL_REF(SvInPlaceObject)
112 #endif
113 
114 
115 
116 /*************************************************************************
117 |*
118 |* SfxRequests fuer Controller bearbeiten
119 |*
120 \************************************************************************/
121 
122 void  DrawViewShell::ExecCtrl(SfxRequest& rReq)
123 {
124     // waehrend einer Diashow wird nichts ausser dem Seitenwechsel und dem
125     // Sprung zur Bookmark ausgefuehrt!
126     if( HasCurrentFunction(SID_PRESENTATION) &&
127         rReq.GetSlot() != SID_SWITCHPAGE &&
128         rReq.GetSlot() != SID_JUMPTOMARK)
129         return;
130 
131     CheckLineTo (rReq);
132 
133     // End text edit mode for some requests.
134     sal_uInt16 nSlot = rReq.GetSlot();
135     switch (nSlot)
136     {
137         case SID_OUTPUT_QUALITY_COLOR:
138         case SID_OUTPUT_QUALITY_GRAYSCALE:
139         case SID_OUTPUT_QUALITY_BLACKWHITE:
140         case SID_OUTPUT_QUALITY_CONTRAST:
141             // Do nothing.
142             break;
143         default:
144             if ( mpDrawView->IsTextEdit() )
145             {
146                 mpDrawView->SdrEndTextEdit();
147             }
148     }
149 
150     //  sal_uInt16 nSlot = rReq.GetSlot();
151     switch (nSlot)
152     {
153         case SID_SWITCHPAGE:  // BASIC
154         {
155             sal_Bool bWasBasic = sal_False;
156 
157             // switch page in running slide show
158             if(SlideShow::IsRunning(GetViewShellBase()) && rReq.GetArgs())
159             {
160                 SFX_REQUEST_ARG(rReq, pWhatPage, SfxUInt32Item, ID_VAL_WHATPAGE, sal_False);
161                 SlideShow::GetSlideShow(GetViewShellBase())->jumpToPageNumber((sal_Int32)((pWhatPage->GetValue()-1)>>1));
162             }
163             else
164             {
165                 const SfxItemSet *pArgs = rReq.GetArgs ();
166                 sal_uInt16 nSelectedPage = 0;
167 
168                 if (! pArgs)
169                 {
170                     nSelectedPage = maTabControl.GetCurPageId() - 1;
171                 }
172                 else if (pArgs->Count () == 2)
173                 {
174                     SFX_REQUEST_ARG (rReq, pWhatPage, SfxUInt32Item, ID_VAL_WHATPAGE, sal_False);
175                     SFX_REQUEST_ARG (rReq, pWhatKind, SfxUInt32Item, ID_VAL_WHATKIND, sal_False);
176 
177                     sal_Int32 nWhatPage = (sal_Int32)pWhatPage->GetValue ();
178                     sal_Int32 nWhatKind = (sal_Int32)pWhatKind->GetValue ();
179                     if (! CHECK_RANGE (PK_STANDARD, nWhatKind, PK_HANDOUT))
180                     {
181                         StarBASIC::FatalError (SbERR_BAD_PROP_VALUE);
182                         rReq.Ignore ();
183                         break;
184                     }
185                     else if (meEditMode != EM_MASTERPAGE)
186                     {
187                         if (! CHECK_RANGE (0, nWhatPage, GetDoc()->GetSdPageCount((PageKind)nWhatKind)))
188                         {
189                             StarBASIC::FatalError (SbERR_BAD_PROP_VALUE);
190                             rReq.Ignore ();
191                             break;
192                         }
193 
194                         nSelectedPage = (short) nWhatPage;
195                         mePageKind    = (PageKind) nWhatKind;
196                         bWasBasic     = sal_True;
197                     }
198                 }
199                 else
200                 {
201                     StarBASIC::FatalError (SbERR_WRONG_ARGS);
202                     rReq.Ignore ();
203                     break;
204                 }
205 
206 
207                 if( GetDocSh() && (GetDocSh()->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED))
208                     GetDocSh()->SetModified();
209 
210                 SwitchPage(nSelectedPage);
211 
212                 if(HasCurrentFunction(SID_BEZIER_EDIT))
213                     GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
214 
215                 Invalidate();
216                 InvalidateWindows();
217                 rReq.Done ();
218             }
219             break;
220         }
221 
222         case SID_SWITCHLAYER:  // BASIC
223         {
224             const SfxItemSet *pArgs = rReq.GetArgs ();
225             sal_uInt16 nCurPage = GetLayerTabControl()->GetCurPageId ();
226 
227             if( pArgs && pArgs->Count () == 1)
228             {
229                 SFX_REQUEST_ARG (rReq, pWhatLayer, SfxUInt32Item, ID_VAL_WHATLAYER, sal_False);
230                 if( pWhatLayer )
231                     nCurPage = (short) pWhatLayer->GetValue ();
232             }
233 
234             mpDrawView->SetActiveLayer( GetLayerTabControl()->GetPageText(nCurPage) );
235             Invalidate();
236             rReq.Done ();
237 
238             break;
239         }
240 
241         case SID_PAGEMODE:  // BASIC
242         {
243 
244             const SfxItemSet *pArgs = rReq.GetArgs ();
245 
246             if ( pArgs && pArgs->Count () == 2)
247             {
248                 SFX_REQUEST_ARG (rReq, pIsActive, SfxBoolItem, ID_VAL_ISACTIVE, sal_False);
249                 SFX_REQUEST_ARG (rReq, pWhatKind, SfxUInt32Item, ID_VAL_WHATKIND, sal_False);
250 
251                 sal_Int32 nWhatKind = (sal_Int32)pWhatKind->GetValue ();
252                 if (CHECK_RANGE (PK_STANDARD, nWhatKind, PK_HANDOUT))
253                 {
254                     mbIsLayerModeActive = pIsActive->GetValue ();
255                     mePageKind = (PageKind) nWhatKind;
256                 }
257             }
258 
259             // Default-Layer der Page einschalten
260             mpDrawView->SetActiveLayer( String( SdResId(STR_LAYER_LAYOUT) ) );
261 
262             ChangeEditMode(EM_PAGE, mbIsLayerModeActive);
263 
264             Invalidate();
265             rReq.Done ();
266 
267             break;
268         }
269 
270         case SID_LAYERMODE:  // BASIC
271         {
272             const SfxItemSet *pArgs = rReq.GetArgs ();
273 
274             if ( pArgs && pArgs->Count () == 2)
275             {
276                 SFX_REQUEST_ARG (rReq, pWhatLayerMode, SfxBoolItem, ID_VAL_ISACTIVE, sal_False);
277                 SFX_REQUEST_ARG (rReq, pWhatLayer, SfxUInt32Item, ID_VAL_WHATLAYER, sal_False);
278 
279                 sal_Int32 nWhatLayer = (sal_Int32)pWhatLayer->GetValue ();
280                 if (CHECK_RANGE (EM_PAGE, nWhatLayer, EM_MASTERPAGE))
281                 {
282                     mbIsLayerModeActive = pWhatLayerMode->GetValue ();
283                     meEditMode = (EditMode) nWhatLayer;
284                 }
285             }
286 
287             ChangeEditMode(meEditMode, !mbIsLayerModeActive);
288 
289             Invalidate();
290             rReq.Done ();
291 
292             break;
293         }
294 
295         case SID_HEADER_AND_FOOTER:
296         case SID_INSERT_PAGE_NUMBER:
297         case SID_INSERT_DATE_TIME:
298         {
299             SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
300             AbstractHeaderFooterDialog* pDlg = pFact ? pFact->CreateHeaderFooterDialog( (::ViewShell*)this, GetActiveWindow(), GetDoc(), mpActualPage ) : 0;
301             if( pDlg )
302             {
303                 pDlg->Execute();
304                 delete pDlg;
305 
306                 GetActiveWindow()->Invalidate();
307                 UpdatePreview( mpActualPage );
308             }
309 
310             Invalidate();
311             rReq.Done ();
312 
313             break;
314         }
315 
316         case SID_MASTER_LAYOUTS:
317         {
318             SdPage* pPage = GetActualPage();
319             if (meEditMode == EM_MASTERPAGE)
320                 // Use the master page of the current page.
321                 pPage = static_cast<SdPage*>(&pPage->TRG_GetMasterPage());
322 
323             SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
324             VclAbstractDialog* pDlg = pFact ? pFact->CreateMasterLayoutDialog( GetActiveWindow(), GetDoc(), pPage ) : 0;
325             if( pDlg )
326             {
327                 pDlg->Execute();
328                 delete pDlg;
329                 Invalidate();
330             }
331             rReq.Done ();
332             break;
333         }
334         case SID_OBJECTRESIZE:
335         {
336             /******************************************************************
337             * Der Server moechte die Clientgrosse verandern
338             ******************************************************************/
339             OSL_ASSERT (GetViewShell()!=NULL);
340             SfxInPlaceClient* pIPClient = GetViewShell()->GetIPClient();
341 
342             if ( pIPClient && pIPClient->IsObjectInPlaceActive() )
343             {
344                 const SfxRectangleItem& rRect =
345                     (SfxRectangleItem&)rReq.GetArgs()->Get(SID_OBJECTRESIZE);
346                 Rectangle aRect( GetActiveWindow()->PixelToLogic( rRect.GetValue() ) );
347 
348                 if ( mpDrawView->AreObjectsMarked() )
349                 {
350                     const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
351 
352                     if (rMarkList.GetMarkCount() == 1)
353                     {
354                         SdrMark* pMark = rMarkList.GetMark(0);
355                         SdrObject* pObj = pMark->GetMarkedSdrObj();
356 
357                         SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( pObj );
358                         if(pOle2Obj)
359                         {
360                             if( pOle2Obj->GetObjRef().is() )
361                             {
362                                 pOle2Obj->SetLogicRect(aRect);
363                             }
364                         }
365                     }
366                 }
367             }
368             rReq.Ignore ();
369             break;
370         }
371 
372         case SID_RELOAD:
373         {
374             // #83951#
375             sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId();
376             SfxViewFrame* pFrame = GetViewFrame();
377 
378             try
379             {
380                 Reference< XFrame > xFrame( pFrame->GetFrame().GetFrameInterface(), UNO_SET_THROW );
381 
382                 // Save the current configuration of panes and views.
383                 Reference<XControllerManager> xControllerManager (
384                     GetViewShellBase().GetController(), UNO_QUERY_THROW);
385                 Reference<XConfigurationController> xConfigurationController (
386                     xControllerManager->getConfigurationController(), UNO_QUERY_THROW );
387                 Reference<XConfiguration> xConfiguration (
388                     xConfigurationController->getRequestedConfiguration(), UNO_SET_THROW );
389 
390                 SfxChildWindow* pWindow = pFrame->GetChildWindow(nId);
391                 if(pWindow)
392                 {
393                     Svx3DWin* p3DWin = (Svx3DWin*)(pWindow->GetWindow());
394                     if(p3DWin)
395                         p3DWin->DocumentReload();
396                 }
397 
398                 // Normale Weiterleitung an ViewFrame zur Ausfuehrung
399                 GetViewFrame()->ExecuteSlot(rReq);
400 
401                 // From here on we must cope with this object and the frame already being
402                 // deleted.  Do not call any methods or use data members.
403                 Reference<XController> xController( xFrame->getController(), UNO_SET_THROW );
404 
405                 // Restore the configuration.
406                 xControllerManager = Reference<XControllerManager>( xController, UNO_QUERY_THROW);
407                 xConfigurationController = Reference<XConfigurationController>(
408                     xControllerManager->getConfigurationController());
409                 if ( ! xConfigurationController.is())
410                     throw RuntimeException();
411                 xConfigurationController->restoreConfiguration(xConfiguration);
412             }
413             catch (RuntimeException&)
414             {
415                 DBG_UNHANDLED_EXCEPTION();
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                 SFX_REQUEST_ARG(rReq, pBookmark, SfxStringItem, SID_JUMPTOMARK, sal_False);
427 
428                 if (pBookmark)
429                 {
430                     UniString sBookmark( INetURLObject::decode( pBookmark->GetValue(), '%', INetURLObject::DECODE_WITH_CHARSET ) );
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 != NULL)
466             {
467                 const SfxPoolItem* pItem;
468                 if (rReq.GetArgs()->GetItemState(
469                     SID_ATTR_YEAR2000, sal_True, &pItem) == SFX_ITEM_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 
485         default:
486         break;
487     }
488 }
489 
490 /*************************************************************************
491 |*
492 |* SfxRequests fuer Lineale bearbeiten
493 |*
494 \************************************************************************/
495 
ExecRuler(SfxRequest & rReq)496 void  DrawViewShell::ExecRuler(SfxRequest& rReq)
497 {
498     // waehrend einer Diashow wird nichts ausgefuehrt!
499     if(HasCurrentFunction(SID_PRESENTATION))
500         return;
501 
502     CheckLineTo (rReq);
503 
504     const SfxItemSet* pArgs = rReq.GetArgs();
505     const Point aPagePos( GetActiveWindow()->GetViewOrigin() );
506     Size aPageSize = mpActualPage->GetSize();
507     Size aViewSize = GetActiveWindow()->GetViewSize();
508     SdUndoGroup* pUndoGroup = NULL;
509 
510     if ( rReq.GetSlot() == SID_ATTR_LONG_LRSPACE ||
511          rReq.GetSlot() == SID_ATTR_LONG_ULSPACE )
512     {
513         pUndoGroup = new SdUndoGroup(GetDoc());
514         String aString(SdResId(STR_UNDO_CHANGE_PAGEBORDER));
515         pUndoGroup->SetComment(aString);
516     }
517 
518     switch ( rReq.GetSlot() )
519     {
520         case SID_ATTR_LONG_LRSPACE:
521         {
522             const SvxLongLRSpaceItem& rLRSpace = (const SvxLongLRSpaceItem&)
523                     pArgs->Get(GetPool().GetWhich(SID_ATTR_LONG_LRSPACE));
524 
525             if( mpDrawView->IsTextEdit() )
526             {
527                 Rectangle aRect = maMarkRect;
528                 aRect.SetPos(aRect.TopLeft() + aPagePos);
529                 aRect.Left()  = rLRSpace.GetLeft();
530                 aRect.Right() = aViewSize.Width() - rLRSpace.GetRight();
531                 aRect.SetPos(aRect.TopLeft() - aPagePos);
532                 if ( aRect != maMarkRect)
533                 {
534                     mpDrawView->SetAllMarkedRect(aRect);
535                     maMarkRect = mpDrawView->GetAllMarkedRect();
536                     Invalidate( SID_RULER_OBJECT );
537                 }
538             }
539             else
540             {
541                 long nLeft = Max(0L, rLRSpace.GetLeft() - aPagePos.X());
542                 long nRight = Max(0L, rLRSpace.GetRight() + aPagePos.X() +
543                                     aPageSize.Width() - aViewSize.Width());
544 
545                 sal_uInt16 nPageCnt = GetDoc()->GetSdPageCount(mePageKind);
546                 sal_uInt16 i;
547                 for ( i = 0; i < nPageCnt; i++)
548                 {
549                     SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind);
550                     SdUndoAction* pUndo = new SdPageLRUndoAction(GetDoc(),
551                                             pPage,
552                                             pPage->GetLftBorder(),
553                                             pPage->GetRgtBorder(),
554                                             nLeft, nRight);
555                     pUndoGroup->AddAction(pUndo);
556                     pPage->SetLftBorder(nLeft);
557                     pPage->SetRgtBorder(nRight);
558                 }
559                 nPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind);
560 
561                 for (i = 0; i < nPageCnt; i++)
562                 {
563                     SdPage* pPage = GetDoc()->GetMasterSdPage(i, mePageKind);
564                     SdUndoAction* pUndo = new SdPageLRUndoAction(GetDoc(),
565                                             pPage,
566                                             pPage->GetLftBorder(),
567                                             pPage->GetRgtBorder(),
568                                             nLeft, nRight);
569                     pUndoGroup->AddAction(pUndo);
570                     pPage->SetLftBorder(nLeft);
571                     pPage->SetRgtBorder(nRight);
572                 }
573                 InvalidateWindows();
574             }
575             break;
576         }
577         case SID_ATTR_LONG_ULSPACE:
578         {
579             const SvxLongULSpaceItem& rULSpace = (const SvxLongULSpaceItem&)
580                     pArgs->Get(GetPool().GetWhich(SID_ATTR_LONG_ULSPACE));
581 
582             if( mpDrawView->IsTextEdit() )
583             {
584                 Rectangle aRect = maMarkRect;
585                 aRect.SetPos(aRect.TopLeft() + aPagePos);
586                 aRect.Top()  = rULSpace.GetUpper();
587                 aRect.Bottom() = aViewSize.Height() - rULSpace.GetLower();
588                 aRect.SetPos(aRect.TopLeft() - aPagePos);
589 
590                 if ( aRect != maMarkRect)
591                 {
592                     mpDrawView->SetAllMarkedRect(aRect);
593                     maMarkRect = mpDrawView->GetAllMarkedRect();
594                     Invalidate( SID_RULER_OBJECT );
595                 }
596             }
597             else
598             {
599                 long nUpper = Max(0L, rULSpace.GetUpper() - aPagePos.Y());
600                 long nLower = Max(0L, rULSpace.GetLower() + aPagePos.Y() +
601                                       aPageSize.Height() - aViewSize.Height());
602 
603                 sal_uInt16 nPageCnt = GetDoc()->GetSdPageCount(mePageKind);
604                 sal_uInt16 i;
605                 for ( i = 0; i < nPageCnt; i++)
606                 {
607                     SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind);
608                     SdUndoAction* pUndo = new SdPageULUndoAction(GetDoc(),
609                                             pPage,
610                                             pPage->GetUppBorder(),
611                                             pPage->GetLwrBorder(),
612                                             nUpper, nLower);
613                     pUndoGroup->AddAction(pUndo);
614                     pPage->SetUppBorder(nUpper);
615                     pPage->SetLwrBorder(nLower);
616                 }
617                 nPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind);
618 
619                 for (i = 0; i < nPageCnt; i++)
620                 {
621                     SdPage* pPage = GetDoc()->GetMasterSdPage(i, mePageKind);
622                     SdUndoAction* pUndo = new SdPageULUndoAction(GetDoc(),
623                                             pPage,
624                                             pPage->GetUppBorder(),
625                                             pPage->GetLwrBorder(),
626                                             nUpper, nLower);
627                     pUndoGroup->AddAction(pUndo);
628                     pPage->SetUppBorder(nUpper);
629                     pPage->SetLwrBorder(nLower);
630                 }
631                 InvalidateWindows();
632             }
633             break;
634         }
635 
636         case SID_RULER_OBJECT:
637         {
638             Rectangle aRect = maMarkRect;
639             aRect.SetPos(aRect.TopLeft() + aPagePos);
640 
641             const SvxObjectItem& rOI = (const SvxObjectItem&)
642                     pArgs->Get(GetPool().GetWhich(SID_RULER_OBJECT));
643 
644             if ( rOI.GetStartX() != rOI.GetEndX() )
645             {
646                 aRect.Left()  = rOI.GetStartX();
647                 aRect.Right() = rOI.GetEndX();
648             }
649             if ( rOI.GetStartY() != rOI.GetEndY() )
650             {
651                 aRect.Top()    = rOI.GetStartY();
652                 aRect.Bottom() = rOI.GetEndY();
653             }
654             aRect.SetPos(aRect.TopLeft() - aPagePos);
655             if ( aRect != maMarkRect)
656             {
657                 mpDrawView->SetAllMarkedRect(aRect);
658                 maMarkRect = mpDrawView->GetAllMarkedRect();
659                 Invalidate( SID_RULER_OBJECT );
660             }
661             break;
662         }
663 
664         case SID_ATTR_TABSTOP:
665         {
666             if( mpDrawView->IsTextEdit() )
667             {
668                 const SvxTabStopItem& rItem = (const SvxTabStopItem&)
669                             pArgs->Get( EE_PARA_TABS );
670 
671                 SfxItemSet aEditAttr( GetPool(), EE_PARA_TABS, EE_PARA_TABS );
672 
673                 aEditAttr.Put( rItem );
674                 mpDrawView->SetAttributes( aEditAttr );
675 
676                 // #91081# Invalidate is missing here
677                 Invalidate(SID_ATTR_TABSTOP);
678             }
679             break;
680         }
681 
682         case SID_ATTR_PARA_LINESPACE:
683         {
684             sal_uInt16 nSlot = SID_ATTR_PARA_LINESPACE;
685             SvxLineSpacingItem aParaLineSP = (const SvxLineSpacingItem&)pArgs->Get(
686                 GetPool().GetWhich(nSlot));
687 
688             SfxItemSet aEditAttr( GetPool(), EE_PARA_SBL, EE_PARA_SBL );
689             aParaLineSP.SetWhich( EE_PARA_SBL );
690 
691             aEditAttr.Put( aParaLineSP );
692             mpDrawView->SetAttributes( aEditAttr );
693 
694             Invalidate(SID_ATTR_PARA_LINESPACE);
695         }
696         break;
697         case SID_ATTR_PARA_ADJUST_LEFT:
698         {
699             SvxAdjustItem aItem( SVX_ADJUST_LEFT, EE_PARA_JUST );
700             SfxItemSet aEditAttr( GetPool(), EE_PARA_JUST, EE_PARA_JUST );
701 
702             aEditAttr.Put( aItem );
703             mpDrawView->SetAttributes( aEditAttr );
704 
705             Invalidate(SID_ATTR_PARA_ADJUST_LEFT);
706         }
707         break;
708         case SID_ATTR_PARA_ADJUST_CENTER:
709         {
710             SvxAdjustItem aItem( SVX_ADJUST_CENTER, EE_PARA_JUST );
711             SfxItemSet aEditAttr( GetPool(), EE_PARA_JUST, EE_PARA_JUST );
712 
713             aEditAttr.Put( aItem );
714             mpDrawView->SetAttributes( aEditAttr );
715 
716             Invalidate(SID_ATTR_PARA_ADJUST_CENTER);
717         }
718         break;
719         case SID_ATTR_PARA_ADJUST_RIGHT:
720         {
721             SvxAdjustItem aItem( SVX_ADJUST_RIGHT, EE_PARA_JUST );
722             SfxItemSet aEditAttr( GetPool(), EE_PARA_JUST, EE_PARA_JUST );
723 
724             aEditAttr.Put( aItem );
725             mpDrawView->SetAttributes( aEditAttr );
726 
727             Invalidate(SID_ATTR_PARA_ADJUST_RIGHT);
728         }
729         break;
730         case SID_ATTR_PARA_ADJUST_BLOCK:
731         {
732             SvxAdjustItem aItem( SVX_ADJUST_BLOCK, EE_PARA_JUST );
733             SfxItemSet aEditAttr( GetPool(), EE_PARA_JUST, EE_PARA_JUST );
734 
735             aEditAttr.Put( aItem );
736             mpDrawView->SetAttributes( aEditAttr );
737 
738             Invalidate(SID_ATTR_PARA_ADJUST_BLOCK);
739         }
740         break;
741         case SID_ATTR_PARA_ULSPACE:
742         {
743             sal_uInt16 nSlot = SID_ATTR_PARA_ULSPACE;
744             SvxULSpaceItem aULSP = (const SvxULSpaceItem&)pArgs->Get(
745                 GetPool().GetWhich(nSlot));
746             SfxItemSet aEditAttr( GetPool(), EE_PARA_ULSPACE, EE_PARA_ULSPACE );
747             aULSP.SetWhich( EE_PARA_ULSPACE );
748 
749             aEditAttr.Put( aULSP );
750             mpDrawView->SetAttributes( aEditAttr );
751 
752             Invalidate(SID_ATTR_PARA_ULSPACE);
753         }
754         break;
755 
756         case SID_ATTR_PARA_LRSPACE:
757         {
758             sal_uInt16 nSlot = SID_ATTR_PARA_LRSPACE;
759             SvxLRSpaceItem aLRSpace = (const SvxLRSpaceItem&)pArgs->Get(
760                 GetPool().GetWhich(nSlot));
761 
762             SfxItemSet aEditAttr( GetPool(), EE_PARA_LRSPACE, EE_PARA_LRSPACE );
763             aLRSpace.SetWhich( EE_PARA_LRSPACE );
764 
765             aEditAttr.Put( aLRSpace );
766             mpDrawView->SetAttributes( aEditAttr );
767 
768             Invalidate(SID_ATTR_PARA_LRSPACE);
769             break;
770         }
771         case SID_ATTR_LRSPACE:
772         {
773             if( mpDrawView->IsTextEdit() )
774             {
775                 sal_uInt16 nId = SID_ATTR_PARA_LRSPACE;
776                 const SvxLRSpaceItem& rItem = (const SvxLRSpaceItem&)
777                             pArgs->Get( nId );
778 
779                         SfxItemSet aEditAttr( GetPool(), EE_PARA_LRSPACE, EE_PARA_LRSPACE );
780 
781                         nId = EE_PARA_LRSPACE;
782                 SvxLRSpaceItem aLRSpaceItem( rItem.GetLeft(),
783                         rItem.GetRight(), rItem.GetTxtLeft(),
784                         rItem.GetTxtFirstLineOfst(), nId );
785                 aEditAttr.Put( aLRSpaceItem );
786                 mpDrawView->SetAttributes( aEditAttr );
787 
788                 // #92557# Invalidate is missing here
789                 Invalidate(SID_ATTR_PARA_LRSPACE);
790             }
791             break;
792         }
793     }
794     if ( pUndoGroup )
795         // Undo Gruppe dem Undo Manager uebergeben
796         GetViewFrame()->GetObjectShell()->GetUndoManager()->
797                                             AddUndoAction(pUndoGroup);
798 }
799 
800 /*************************************************************************
801 |*
802 |* Statuswerte der Lineale bestimmen
803 |*
804 \************************************************************************/
GetRulerState(SfxItemSet & rSet)805 void  DrawViewShell::GetRulerState(SfxItemSet& rSet)
806 {
807     Point aOrigin;
808 
809     if (mpDrawView->GetSdrPageView())
810     {
811         aOrigin = mpDrawView->GetSdrPageView()->GetPageOrigin();
812     }
813 
814     Size aViewSize = GetActiveWindow()->GetViewSize();
815 
816     const Point aPagePos( GetActiveWindow()->GetViewOrigin() );
817     Size aPageSize = mpActualPage->GetSize();
818 
819     Rectangle aRect(aPagePos, Point( aViewSize.Width() - (aPagePos.X() + aPageSize.Width()),
820                                      aViewSize.Height() - (aPagePos.Y() + aPageSize.Height())));
821 
822     if( mpDrawView->IsTextEdit() )
823     {
824         Point aPnt1 = GetActiveWindow()->GetWinViewPos();
825         Point aPnt2 = GetActiveWindow()->GetViewOrigin();
826         Rectangle aMinMaxRect = Rectangle( aPnt1, Size(ULONG_MAX, ULONG_MAX) );
827         rSet.Put( SfxRectangleItem(SID_RULER_LR_MIN_MAX, aMinMaxRect) );
828     }
829     else
830     {
831         rSet.Put( SfxRectangleItem(SID_RULER_LR_MIN_MAX, aRect) );
832     }
833 
834     SvxLongLRSpaceItem aLRSpace(aPagePos.X() + mpActualPage->GetLftBorder(),
835                                 aRect.Right() + mpActualPage->GetRgtBorder(),
836                                 GetPool().GetWhich(SID_ATTR_LONG_LRSPACE));
837     SvxLongULSpaceItem aULSpace(aPagePos.Y() + mpActualPage->GetUppBorder(),
838                                 aRect.Bottom() + mpActualPage->GetLwrBorder(),
839                                 GetPool().GetWhich(SID_ATTR_LONG_ULSPACE));
840     rSet.Put(SvxPagePosSizeItem(Point(0,0) - aPagePos, aViewSize.Width(),
841                                                        aViewSize.Height()));
842     SfxPointItem aPointItem( SID_RULER_NULL_OFFSET, aPagePos + aOrigin );
843 
844     SvxProtectItem aProtect( SID_RULER_PROTECT );
845 
846     maMarkRect = mpDrawView->GetAllMarkedRect();
847 
848     const sal_Bool bRTL = GetDoc() && GetDoc()->GetDefaultWritingMode() == ::com::sun::star::text::WritingMode_RL_TB;
849     rSet.Put(SfxBoolItem(SID_RULER_TEXT_RIGHT_TO_LEFT, bRTL));
850 
851     if( mpDrawView->AreObjectsMarked() )
852     {
853         if( mpDrawView->IsTextEdit() )
854         {
855             SdrObject* pObj = mpDrawView->GetMarkedObjectList().GetMark( 0 )->GetMarkedSdrObj();
856             if( pObj->GetObjInventor() == SdrInventor)
857             {
858                 SfxItemSet aEditAttr( GetDoc()->GetPool() );
859                 mpDrawView->GetAttributes( aEditAttr );
860                 if( aEditAttr.GetItemState( EE_PARA_TABS ) >= SFX_ITEM_AVAILABLE )
861                 {
862                     const SvxTabStopItem& rItem = (const SvxTabStopItem&) aEditAttr.Get( EE_PARA_TABS );
863                     rSet.Put( rItem );
864 
865                     //Rectangle aRect = maMarkRect;
866 
867                     const SvxLRSpaceItem& rLRSpaceItem = (const SvxLRSpaceItem&) aEditAttr.Get( EE_PARA_LRSPACE );
868                     sal_uInt16 nId = SID_ATTR_PARA_LRSPACE;
869                     SvxLRSpaceItem aLRSpaceItem( rLRSpaceItem.GetLeft(),
870                             rLRSpaceItem.GetRight(), rLRSpaceItem.GetTxtLeft(),
871                             rLRSpaceItem.GetTxtFirstLineOfst(), nId );
872                     rSet.Put( aLRSpaceItem );
873 
874                     Point aPos( aPagePos + maMarkRect.TopLeft() );
875 
876                     if ( aEditAttr.GetItemState( SDRATTR_TEXT_LEFTDIST ) == SFX_ITEM_ON )
877                     {
878                         const SdrTextLeftDistItem& rTLDItem = (const SdrTextLeftDistItem&)
879                                                               aEditAttr.Get( SDRATTR_TEXT_LEFTDIST );
880                         long nLD = rTLDItem.GetValue();
881                         aPos.X() += nLD;
882                     }
883 
884                     aPointItem.SetValue( aPos );
885 
886                     aLRSpace.SetLeft( aPagePos.X() + maMarkRect.Left() );
887 
888                     if ( aEditAttr.GetItemState( SDRATTR_TEXT_LEFTDIST ) == SFX_ITEM_ON )
889                     {
890                         const SdrTextLeftDistItem& rTLDItem = (const SdrTextLeftDistItem&)
891                                                               aEditAttr.Get( SDRATTR_TEXT_LEFTDIST );
892                         long nLD = rTLDItem.GetValue();
893                         aLRSpace.SetLeft( aLRSpace.GetLeft() + nLD );
894                     }
895 
896                     aLRSpace.SetRight( aRect.Right() + aPageSize.Width() - maMarkRect.Right() );
897                     aULSpace.SetUpper( aPagePos.Y() + maMarkRect.Top() );
898                     aULSpace.SetLower( aRect.Bottom() + aPageSize.Height() - maMarkRect.Bottom() );
899 
900                     rSet.DisableItem( SID_RULER_OBJECT );
901 
902                     // Seitenraender werden gelocked
903                     aProtect.SetSizeProtect( sal_True );
904                     aProtect.SetPosProtect( sal_True );
905                 }
906 
907                 if( aEditAttr.GetItemState( EE_PARA_WRITINGDIR ) >= SFX_ITEM_AVAILABLE )
908                 {
909                     const SvxFrameDirectionItem& rItem = (const SvxFrameDirectionItem&) aEditAttr.Get( EE_PARA_WRITINGDIR );
910                     rSet.Put(SfxBoolItem(SID_RULER_TEXT_RIGHT_TO_LEFT, rItem.GetValue() == ::com::sun::star::text::WritingMode_RL_TB));
911                 }
912             }
913         }
914         else
915         {
916             rSet.DisableItem( EE_PARA_TABS );
917             rSet.DisableItem( SID_RULER_TEXT_RIGHT_TO_LEFT );
918 
919             if( mpDrawView->IsResizeAllowed(sal_True) )
920             {
921                 Rectangle aResizeRect( maMarkRect );
922 
923                 aResizeRect.SetPos(aResizeRect.TopLeft() + aPagePos);
924                 SvxObjectItem aObjItem(aResizeRect.Left(), aResizeRect.Right(),
925                                        aResizeRect.Top(), aResizeRect.Bottom());
926                 rSet.Put(aObjItem);
927                 rSet.DisableItem( EE_PARA_TABS );
928             }
929             else
930             {
931                 rSet.DisableItem( SID_RULER_OBJECT );
932             }
933         }
934     }
935     else
936     {
937         rSet.DisableItem( SID_RULER_OBJECT );
938         rSet.DisableItem( EE_PARA_TABS );
939 //      rSet.DisableItem( SID_RULER_TEXT_RIGHT_TO_LEFT );
940     }
941 
942     rSet.Put( aLRSpace );
943     rSet.Put( aULSpace );
944 
945     rSet.Put( aPointItem );
946     rSet.Put( aProtect );
947 }
948 
949 /*************************************************************************
950 |*
951 |* SfxRequests fuer StatusBar bearbeiten
952 |*
953 \************************************************************************/
954 
ExecStatusBar(SfxRequest & rReq)955 void  DrawViewShell::ExecStatusBar(SfxRequest& rReq)
956 {
957     // waehrend einer Diashow wird nichts ausgefuehrt!
958     if(HasCurrentFunction(SID_PRESENTATION))
959         return;
960 
961     CheckLineTo (rReq);
962 
963     switch ( rReq.GetSlot() )
964     {
965         case SID_ATTR_SIZE:
966         {
967             GetViewFrame()->GetDispatcher()->Execute( SID_ATTR_TRANSFORM, SFX_CALLMODE_ASYNCHRON );
968         }
969         break;
970 
971         case SID_STATUS_LAYOUT:
972         {
973             GetViewFrame()->GetDispatcher()->Execute( SID_PRESENTATION_LAYOUT, SFX_CALLMODE_ASYNCHRON );
974         }
975         break;
976     }
977 }
978 
979 /*************************************************************************
980 |*
981 |* Status der Snap-Objekt-Eintraege im Popup setzen
982 |*
983 \************************************************************************/
984 
GetSnapItemState(SfxItemSet & rSet)985 void  DrawViewShell::GetSnapItemState( SfxItemSet &rSet )
986 {
987     SdrPageView* pPV;
988     Point   aMPos = GetActiveWindow()->PixelToLogic(maMousePos);
989     sal_uInt16  nHitLog = (sal_uInt16) GetActiveWindow()->PixelToLogic(
990         Size(FuPoor::HITPIX,0)).Width();
991     sal_uInt16  nHelpLine;
992 
993     if ( mpDrawView->PickHelpLine(aMPos, nHitLog, *GetActiveWindow(), nHelpLine, pPV) )
994     {
995         const SdrHelpLine& rHelpLine = (pPV->GetHelpLines())[nHelpLine];
996 
997         if ( rHelpLine.GetKind() == SDRHELPLINE_POINT )
998         {
999             rSet.Put( SfxStringItem( SID_SET_SNAPITEM,
1000                                 String( SdResId( STR_POPUP_EDIT_SNAPPOINT))) );
1001             rSet.Put( SfxStringItem( SID_DELETE_SNAPITEM,
1002                                 String( SdResId( STR_POPUP_DELETE_SNAPPOINT))) );
1003         }
1004         else
1005         {
1006             rSet.Put( SfxStringItem( SID_SET_SNAPITEM,
1007                                 String( SdResId( STR_POPUP_EDIT_SNAPLINE))) );
1008             rSet.Put( SfxStringItem( SID_DELETE_SNAPITEM,
1009                                 String( SdResId( STR_POPUP_DELETE_SNAPLINE))) );
1010         }
1011     }
1012 }
1013 
1014 
1015 /*************************************************************************
1016 |*
1017 |*
1018 |*
1019 \************************************************************************/
1020 
AddWindow(::sd::Window * pWin)1021 void DrawViewShell::AddWindow (::sd::Window* pWin)
1022 {
1023     mpDrawView->AddWindowToPaintView(pWin);
1024 }
1025 
1026 /*************************************************************************
1027 |*
1028 |*
1029 |*
1030 \************************************************************************/
1031 
RemoveWindow(::sd::Window * pWin)1032 void DrawViewShell::RemoveWindow(::sd::Window* pWin)
1033 {
1034     mpDrawView->DeleteWindowFromPaintView(pWin);
1035 }
1036 
1037 } // end of namespace sd
1038