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