xref: /aoo4110/main/sd/source/ui/view/drviews3.cxx (revision b1cdbd2c)
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