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 : #include "ViewShell.hxx"
21 : #include "ViewShellImplementation.hxx"
22 : #include "createtableobjectbar.hxx"
23 :
24 : #include <com/sun/star/embed/EmbedStates.hpp>
25 : #include "ViewShellBase.hxx"
26 : #include "ShellFactory.hxx"
27 : #include "DrawController.hxx"
28 : #include "LayerTabBar.hxx"
29 :
30 : #include <sfx2/viewfrm.hxx>
31 : #include <sfx2/bindings.hxx>
32 : #include <sfx2/dispatch.hxx>
33 : #include <vcl/scrbar.hxx>
34 : #include <svl/eitem.hxx>
35 : #include <svx/ruler.hxx>
36 : #include <svx/svxids.hrc>
37 : #include <svx/fmshell.hxx>
38 : #include "WindowUpdater.hxx"
39 : #include "GraphicViewShell.hxx"
40 : #include <sfx2/childwin.hxx>
41 : #include <sdxfer.hxx>
42 :
43 : #include "app.hrc"
44 : #include "helpids.h"
45 : #include "strings.hrc"
46 : #include "res_bmp.hrc"
47 : #include "OutlineView.hxx"
48 : #include "Client.hxx"
49 : #include "sdresid.hxx"
50 : #include "DrawDocShell.hxx"
51 : #include "slideshow.hxx"
52 : #include "drawdoc.hxx"
53 : #include "sdpage.hxx"
54 : #include "zoomlist.hxx"
55 : #include "FrameView.hxx"
56 : #include "optsitem.hxx"
57 : #include "BezierObjectBar.hxx"
58 : #include "TextObjectBar.hxx"
59 : #include "GraphicObjectBar.hxx"
60 : #include "MediaObjectBar.hxx"
61 : #include "ViewShellManager.hxx"
62 : #include "FormShellManager.hxx"
63 : #include <svx/dialogs.hrc>
64 : #include <svx/extrusionbar.hxx>
65 : #include <svx/fontworkbar.hxx>
66 : #include <svx/svdoutl.hxx>
67 : #include <tools/diagnose_ex.h>
68 :
69 : #include <svl/slstitm.hxx>
70 : #include <sfx2/request.hxx>
71 : #include "SpellDialogChildWindow.hxx"
72 :
73 : #include <basegfx/tools/zoomtools.hxx>
74 :
75 : #include "Window.hxx"
76 : #include "fupoor.hxx"
77 :
78 : #include <editeng/numitem.hxx>
79 : #include <editeng/eeitem.hxx>
80 : #include <editeng/editview.hxx>
81 : #include <svl/poolitem.hxx>
82 : #include <glob.hrc>
83 : #include "AccessibleDocumentViewBase.hxx"
84 :
85 : using namespace ::com::sun::star;
86 : using namespace ::com::sun::star::uno;
87 : using namespace ::com::sun::star::presentation;
88 :
89 : namespace {
90 :
91 : class ViewShellObjectBarFactory
92 : : public ::sd::ShellFactory<SfxShell>
93 : {
94 : public:
95 : ViewShellObjectBarFactory (::sd::ViewShell& rViewShell);
96 : virtual ~ViewShellObjectBarFactory();
97 : virtual SfxShell* CreateShell (
98 : ::sd::ShellId nId,
99 : vcl::Window* pParentWindow,
100 : ::sd::FrameView* pFrameView) SAL_OVERRIDE;
101 : virtual void ReleaseShell (SfxShell* pShell) SAL_OVERRIDE;
102 : private:
103 : ::sd::ViewShell& mrViewShell;
104 : /** This cache holds the already created object bars.
105 : */
106 : typedef ::std::map< ::sd::ShellId,SfxShell*> ShellCache;
107 : ShellCache maShellCache;
108 : };
109 :
110 : } // end of anonymous namespace
111 :
112 : namespace sd {
113 :
114 901 : bool ViewShell::IsPageFlipMode() const
115 : {
116 1802 : return this->ISA(DrawViewShell) && mpContentWindow.get() != NULL &&
117 1802 : mpContentWindow->GetVisibleHeight() >= 1.0;
118 : }
119 :
120 15888 : SfxViewFrame* ViewShell::GetViewFrame() const
121 : {
122 15888 : const SfxViewShell* pViewShell = GetViewShell();
123 15888 : if (pViewShell != NULL)
124 : {
125 15888 : return pViewShell->GetViewFrame();
126 : }
127 : else
128 : {
129 : OSL_ASSERT (GetViewShell()!=NULL);
130 0 : return NULL;
131 : }
132 : }
133 :
134 : /// declare SFX-Slotmap and standard interface
135 3980 : TYPEINIT1(ViewShell, SfxShell);
136 :
137 197 : ViewShell::ViewShell( SfxViewFrame*, vcl::Window* pParentWindow, ViewShellBase& rViewShellBase, bool bAllowCenter)
138 : : SfxShell(&rViewShellBase)
139 : , mbCenterAllowed(bAllowCenter)
140 197 : , mpParentWindow(pParentWindow)
141 : {
142 197 : construct();
143 197 : }
144 :
145 394 : ViewShell::~ViewShell()
146 : {
147 : // Keep the content window from accessing in its destructor the
148 : // WindowUpdater.
149 197 : if (mpContentWindow)
150 197 : mpContentWindow->SetViewShell(NULL);
151 :
152 197 : delete mpZoomList;
153 :
154 197 : mpLayerTabBar.disposeAndClear();
155 :
156 197 : if (mpImpl->mpSubShellFactory.get() != NULL)
157 197 : GetViewShellBase().GetViewShellManager()->RemoveSubShellFactory(
158 394 : this,mpImpl->mpSubShellFactory);
159 :
160 197 : if (mpContentWindow)
161 : {
162 : SAL_INFO(
163 : "sd.ui",
164 : "destroying mpContentWindow at " << mpContentWindow.get()
165 : << " with parent " << mpContentWindow->GetParent());
166 197 : mpContentWindow.disposeAndClear();
167 : }
168 :
169 197 : mpScrollBarBox.disposeAndClear();
170 197 : mpVerticalRuler.disposeAndClear();
171 197 : mpHorizontalRuler.disposeAndClear();
172 197 : mpVerticalScrollBar.disposeAndClear();
173 197 : mpHorizontalScrollBar.disposeAndClear();
174 197 : }
175 :
176 : /**
177 : * common initialization part of both constructors
178 : */
179 197 : void ViewShell::construct()
180 : {
181 197 : mbHasRulers = false;
182 197 : mpActiveWindow = 0;
183 197 : mpView = 0;
184 197 : mpFrameView = 0;
185 197 : mpZoomList = 0;
186 197 : mbStartShowWithDialog = false;
187 197 : mnPrintedHandoutPageNum = 1;
188 197 : mnPrintedHandoutPageCount = 0;
189 197 : mpWindowUpdater.reset( new ::sd::WindowUpdater() );
190 197 : mpImpl.reset(new Implementation(*this));
191 197 : meShellType = ST_NONE;
192 :
193 : OSL_ASSERT (GetViewShell()!=NULL);
194 :
195 197 : if (IsMainViewShell())
196 0 : GetDocSh()->Connect (this);
197 :
198 197 : mpZoomList = new ZoomList( this );
199 :
200 197 : mpContentWindow.reset(VclPtr< ::sd::Window >::Create(GetParentWindow()));
201 197 : SetActiveWindow (mpContentWindow.get());
202 :
203 197 : GetParentWindow()->SetBackground (Wallpaper());
204 197 : mpContentWindow->SetBackground (Wallpaper());
205 197 : mpContentWindow->SetCenterAllowed(mbCenterAllowed);
206 197 : mpContentWindow->SetViewShell(this);
207 197 : mpContentWindow->SetPosSizePixel(
208 197 : GetParentWindow()->GetPosPixel(),GetParentWindow()->GetSizePixel());
209 :
210 197 : if ( ! GetDocSh()->IsPreview())
211 : {
212 : // Create scroll bars and the filler between the scroll bars.
213 197 : mpHorizontalScrollBar.reset (VclPtr<ScrollBar>::Create(GetParentWindow(), WinBits(WB_HSCROLL | WB_DRAG)));
214 197 : mpHorizontalScrollBar->EnableRTL (false);
215 197 : mpHorizontalScrollBar->SetRange(Range(0, 32000));
216 197 : mpHorizontalScrollBar->SetScrollHdl(LINK(this, ViewShell, HScrollHdl));
217 :
218 197 : mpVerticalScrollBar.reset (VclPtr<ScrollBar>::Create(GetParentWindow(), WinBits(WB_VSCROLL | WB_DRAG)));
219 197 : mpVerticalScrollBar->SetRange(Range(0, 32000));
220 197 : mpVerticalScrollBar->SetScrollHdl(LINK(this, ViewShell, VScrollHdl));
221 :
222 197 : mpScrollBarBox.reset(VclPtr<ScrollBarBox>::Create(GetParentWindow(), WB_SIZEABLE));
223 : }
224 :
225 197 : OUString aName( "ViewShell" );
226 197 : SetName (aName);
227 :
228 197 : GetDoc()->StartOnlineSpelling(false);
229 :
230 197 : mpWindowUpdater->SetViewShell (*this);
231 197 : mpWindowUpdater->SetDocument (GetDoc());
232 :
233 : // Re-initialize the spell dialog.
234 : ::sd::SpellDialogChildWindow* pSpellDialog =
235 : static_cast< ::sd::SpellDialogChildWindow*> (
236 : GetViewFrame()->GetChildWindow (
237 197 : ::sd::SpellDialogChildWindow::GetChildWindowId()));
238 197 : if (pSpellDialog != NULL)
239 0 : pSpellDialog->InvalidateSpellDialog();
240 :
241 : // Register the sub shell factory.
242 197 : mpImpl->mpSubShellFactory.reset(new ViewShellObjectBarFactory(*this));
243 197 : GetViewShellBase().GetViewShellManager()->AddSubShellFactory(this,mpImpl->mpSubShellFactory);
244 197 : }
245 :
246 197 : void ViewShell::doShow()
247 : {
248 197 : mpContentWindow->Show();
249 197 : static_cast< vcl::Window*>(mpContentWindow.get())->Resize();
250 : SAL_INFO(
251 : "sd.view",
252 : "content window has size " << mpContentWindow->GetSizePixel().Width()
253 : << " " << mpContentWindow->GetSizePixel().Height());
254 :
255 197 : if ( ! GetDocSh()->IsPreview())
256 : {
257 : // Show scroll bars
258 197 : mpHorizontalScrollBar->Show();
259 :
260 197 : mpVerticalScrollBar->Show();
261 : maScrBarWH = Size(
262 394 : mpVerticalScrollBar->GetSizePixel().Width(),
263 591 : mpHorizontalScrollBar->GetSizePixel().Height());
264 :
265 197 : mpScrollBarBox->Show();
266 : }
267 :
268 197 : GetParentWindow()->Show();
269 197 : }
270 :
271 197 : void ViewShell::Init (bool bIsMainViewShell)
272 : {
273 197 : mpImpl->mbIsInitialized = true;
274 197 : SetIsMainViewShell(bIsMainViewShell);
275 197 : if (bIsMainViewShell)
276 133 : SetActiveWindow (mpContentWindow.get());
277 197 : }
278 :
279 197 : void ViewShell::Exit()
280 : {
281 197 : sd::View* pView = GetView();
282 197 : if (pView!=NULL && pView->IsTextEdit())
283 : {
284 0 : pView->SdrEndTextEdit();
285 0 : pView->UnmarkAll();
286 : }
287 :
288 197 : Deactivate (true);
289 :
290 197 : if (IsMainViewShell())
291 133 : GetDocSh()->Disconnect(this);
292 :
293 197 : SetIsMainViewShell(false);
294 197 : }
295 :
296 : /**
297 : * set focus to working window
298 : */
299 266 : void ViewShell::Activate(bool bIsMDIActivate)
300 : {
301 : // Do not forward to SfxShell::Activate()
302 :
303 : /* According to MI, nobody is allowed to call GrabFocus, who does not
304 : exactly know from which window the focus is grabbed. Since Activate()
305 : is sent sometimes asynchronous, it can happen, that the wrong window
306 : gets the focus. */
307 :
308 266 : if (mpHorizontalRuler.get() != NULL)
309 137 : mpHorizontalRuler->SetActive(true);
310 266 : if (mpVerticalRuler.get() != NULL)
311 137 : mpVerticalRuler->SetActive(true);
312 :
313 266 : if (bIsMDIActivate)
314 : {
315 : // thus, the Navigator will also get a current status
316 266 : SfxBoolItem aItem( SID_NAVIGATOR_INIT, true );
317 266 : if (GetDispatcher() != NULL)
318 : GetDispatcher()->Execute(
319 : SID_NAVIGATOR_INIT,
320 : SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
321 : &aItem,
322 266 : 0L);
323 :
324 266 : SfxViewShell* pViewShell = GetViewShell();
325 : OSL_ASSERT (pViewShell!=NULL);
326 266 : SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings();
327 266 : rBindings.Invalidate( SID_3D_STATE, true, false );
328 :
329 532 : rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
330 266 : if(xSlideShow.is() && xSlideShow->isRunning() )
331 0 : xSlideShow->activate(GetViewShellBase());
332 :
333 266 : if(HasCurrentFunction())
334 266 : GetCurrentFunction()->Activate();
335 :
336 266 : if(!GetDocSh()->IsUIActive())
337 532 : UpdatePreview( GetActualPage(), true );
338 : }
339 :
340 266 : ReadFrameViewData( mpFrameView );
341 :
342 266 : if (IsMainViewShell())
343 202 : GetDocSh()->Connect(this);
344 266 : }
345 :
346 0 : void ViewShell::UIActivating( SfxInPlaceClient* )
347 : {
348 : OSL_ASSERT (GetViewShell()!=NULL);
349 0 : GetViewShellBase().GetToolBarManager()->ToolBarsDestroyed();
350 0 : }
351 :
352 0 : void ViewShell::UIDeactivated( SfxInPlaceClient* )
353 : {
354 : OSL_ASSERT (GetViewShell()!=NULL);
355 0 : GetViewShellBase().GetToolBarManager()->ToolBarsDestroyed();
356 0 : if ( GetDrawView() )
357 0 : GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*this, *GetDrawView());
358 0 : }
359 :
360 531 : void ViewShell::Deactivate(bool bIsMDIActivate)
361 : {
362 : // remove view from a still active drag'n'drop session
363 531 : SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag;
364 :
365 531 : if (IsMainViewShell())
366 519 : GetDocSh()->Disconnect(this);
367 :
368 531 : if( pDragTransferable )
369 0 : pDragTransferable->SetView( NULL );
370 :
371 : OSL_ASSERT (GetViewShell()!=NULL);
372 :
373 : // remember view attributes of FrameView
374 531 : WriteFrameViewData();
375 :
376 531 : if (bIsMDIActivate)
377 : {
378 531 : rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
379 531 : if(xSlideShow.is() && xSlideShow->isRunning() )
380 0 : xSlideShow->deactivate(GetViewShellBase());
381 :
382 531 : if(HasCurrentFunction())
383 160 : GetCurrentFunction()->Deactivate();
384 : }
385 :
386 531 : if (mpHorizontalRuler.get() != NULL)
387 360 : mpHorizontalRuler->SetActive(false);
388 531 : if (mpVerticalRuler.get() != NULL)
389 360 : mpVerticalRuler->SetActive(false);
390 :
391 531 : SfxShell::Deactivate(bIsMDIActivate);
392 531 : }
393 :
394 197 : void ViewShell::Shutdown()
395 : {
396 197 : Exit ();
397 197 : }
398 :
399 1 : bool ViewShell::KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin)
400 : {
401 1 : bool bReturn(false);
402 :
403 1 : if(pWin)
404 1 : SetActiveWindow(pWin);
405 :
406 1 : if(!bReturn)
407 : {
408 : // give key input first to SfxViewShell to give CTRL+Key
409 : // (e.g. CTRL+SHIFT+'+', to front) priority.
410 : OSL_ASSERT (GetViewShell()!=NULL);
411 1 : bReturn = GetViewShell()->KeyInput(rKEvt);
412 : }
413 :
414 1 : const size_t OriCount = GetView()->GetMarkedObjectList().GetMarkCount();
415 1 : if(!bReturn)
416 : {
417 1 : rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
418 1 : if(xSlideShow.is() && xSlideShow->isRunning())
419 : {
420 0 : bReturn = xSlideShow->keyInput(rKEvt);
421 : }
422 : else
423 : {
424 1 : bool bConsumed = false;
425 1 : if( GetView() )
426 1 : bConsumed = GetView()->getSmartTags().KeyInput(rKEvt);
427 :
428 1 : if( !bConsumed )
429 : {
430 1 : rtl::Reference< sdr::SelectionController > xSelectionController( GetView()->getSelectionController() );
431 1 : if( !xSelectionController.is() || !xSelectionController->onKeyInput( rKEvt, pWin ) )
432 : {
433 1 : if(HasCurrentFunction())
434 1 : bReturn = GetCurrentFunction()->KeyInput(rKEvt);
435 : }
436 : else
437 : {
438 0 : bReturn = true;
439 1 : }
440 : }
441 1 : }
442 : }
443 1 : const size_t EndCount = GetView()->GetMarkedObjectList().GetMarkCount();
444 : // Here, oriCount or endCount must have one value=0, another value > 0, then to switch focus between Document and shape objects
445 1 : if(bReturn && (OriCount + EndCount > 0) && (OriCount * EndCount == 0))
446 0 : SwitchActiveViewFireFocus();
447 :
448 1 : if(!bReturn && GetActiveWindow())
449 : {
450 0 : vcl::KeyCode aKeyCode = rKEvt.GetKeyCode();
451 :
452 0 : if (aKeyCode.IsMod1() && aKeyCode.IsShift()
453 0 : && aKeyCode.GetCode() == KEY_R)
454 : {
455 0 : InvalidateWindows();
456 0 : bReturn = true;
457 : }
458 : }
459 :
460 1 : return bReturn;
461 : }
462 :
463 2 : void ViewShell::MouseButtonDown(const MouseEvent& rMEvt, ::sd::Window* pWin)
464 : {
465 : // We have to lock tool bar updates while the mouse button is pressed in
466 : // order to prevent the shape under the mouse to be moved (this happens
467 : // when the number of docked tool bars changes as result of a changed
468 : // selection; this changes the window size and thus the mouse position
469 : // in model coordinates: with respect to model coordinates the mouse
470 : // moves.)
471 : OSL_ASSERT(mpImpl->mpUpdateLockForMouse.expired());
472 4 : mpImpl->mpUpdateLockForMouse = ViewShell::Implementation::ToolBarManagerLock::Create(
473 4 : GetViewShellBase().GetToolBarManager());
474 :
475 2 : if ( pWin && !pWin->HasFocus() )
476 : {
477 0 : pWin->GrabFocus();
478 0 : SetActiveWindow(pWin);
479 : }
480 :
481 : // insert MouseEvent into E3dView
482 2 : if (GetView() != NULL)
483 2 : GetView()->SetMouseEvent(rMEvt);
484 :
485 2 : bool bConsumed = false;
486 2 : if( GetView() )
487 2 : bConsumed = GetView()->getSmartTags().MouseButtonDown( rMEvt );
488 :
489 2 : if( !bConsumed )
490 : {
491 2 : rtl::Reference< sdr::SelectionController > xSelectionController( GetView()->getSelectionController() );
492 2 : if( !xSelectionController.is() || !xSelectionController->onMouseButtonDown( rMEvt, pWin ) )
493 : {
494 2 : if(HasCurrentFunction())
495 2 : GetCurrentFunction()->MouseButtonDown(rMEvt);
496 2 : }
497 : }
498 2 : }
499 :
500 1 : void ViewShell::LogicMouseButtonDown(const MouseEvent& rMouseEvent)
501 : {
502 : // When we're not doing tiled rendering, then positions must be passed as pixels.
503 : assert(GetDoc()->isTiledRendering());
504 :
505 1 : Point aPoint = mpActiveWindow->GetPointerPosPixel();
506 1 : mpActiveWindow->SetLastMousePos(rMouseEvent.GetPosPixel());
507 :
508 1 : MouseButtonDown(rMouseEvent, 0);
509 :
510 1 : mpActiveWindow->SetPointerPosPixel(aPoint);
511 1 : }
512 :
513 1 : void ViewShell::LogicMouseButtonUp(const MouseEvent& rMouseEvent)
514 : {
515 : // When we're not doing tiled rendering, then positions must be passed as pixels.
516 : assert(GetDoc()->isTiledRendering());
517 :
518 1 : Point aPoint = mpActiveWindow->GetPointerPosPixel();
519 1 : mpActiveWindow->SetLastMousePos(rMouseEvent.GetPosPixel());
520 :
521 1 : MouseButtonUp(rMouseEvent, 0);
522 :
523 1 : mpActiveWindow->SetPointerPosPixel(aPoint);
524 1 : }
525 :
526 1 : void ViewShell::SetCursorMm100Position(const Point& rPosition, bool bPoint, bool bClearMark)
527 : {
528 1 : if (SdrView* pSdrView = GetView())
529 : {
530 1 : rtl::Reference<sdr::SelectionController> xSelectionController(GetView()->getSelectionController());
531 1 : if (!xSelectionController.is() || !xSelectionController->setCursorLogicPosition(rPosition, bPoint))
532 : {
533 1 : if (pSdrView->GetTextEditObject())
534 : {
535 1 : EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView();
536 1 : rEditView.SetCursorLogicPosition(rPosition, bPoint, bClearMark);
537 : }
538 1 : }
539 : }
540 1 : }
541 :
542 2 : void ViewShell::SetGraphicMm100Position(bool bStart, const Point& rPosition)
543 : {
544 2 : if (bStart)
545 : {
546 1 : MouseEvent aClickEvent(rPosition, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT);
547 1 : MouseButtonDown(aClickEvent, 0);
548 1 : MouseEvent aMoveEvent(Point(rPosition.getX(), rPosition.getY()), 0, MouseEventModifiers::SIMPLEMOVE, MOUSE_LEFT);
549 1 : MouseMove(aMoveEvent, 0);
550 : }
551 : else
552 : {
553 1 : MouseEvent aMoveEvent(Point(rPosition.getX(), rPosition.getY()), 0, MouseEventModifiers::SIMPLEMOVE, MOUSE_LEFT);
554 1 : MouseMove(aMoveEvent, 0);
555 1 : MouseEvent aClickEvent(rPosition, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT);
556 1 : MouseButtonUp(aClickEvent, 0);
557 : }
558 2 : }
559 :
560 2 : void ViewShell::MouseMove(const MouseEvent& rMEvt, ::sd::Window* pWin)
561 : {
562 2 : if (rMEvt.IsLeaveWindow())
563 : {
564 0 : if ( ! mpImpl->mpUpdateLockForMouse.expired())
565 : {
566 : ::boost::shared_ptr<ViewShell::Implementation::ToolBarManagerLock> pLock(
567 0 : mpImpl->mpUpdateLockForMouse);
568 0 : if (pLock.get() != NULL)
569 0 : pLock->Release();
570 : }
571 : }
572 :
573 2 : if ( pWin )
574 : {
575 0 : SetActiveWindow(pWin);
576 : }
577 :
578 : // insert MouseEvent into E3dView
579 2 : if (GetView() != NULL)
580 2 : GetView()->SetMouseEvent(rMEvt);
581 :
582 2 : if(HasCurrentFunction())
583 : {
584 2 : rtl::Reference< sdr::SelectionController > xSelectionController( GetView()->getSelectionController() );
585 2 : if( !xSelectionController.is() || !xSelectionController->onMouseMove( rMEvt, pWin ) )
586 : {
587 2 : if(HasCurrentFunction())
588 2 : GetCurrentFunction()->MouseMove(rMEvt);
589 2 : }
590 : }
591 2 : }
592 :
593 2 : void ViewShell::MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin)
594 : {
595 2 : if ( pWin )
596 0 : SetActiveWindow(pWin);
597 :
598 : // insert MouseEvent into E3dView
599 2 : if (GetView() != NULL)
600 2 : GetView()->SetMouseEvent(rMEvt);
601 :
602 2 : if( HasCurrentFunction())
603 : {
604 2 : rtl::Reference< sdr::SelectionController > xSelectionController( GetView()->getSelectionController() );
605 2 : if( !xSelectionController.is() || !xSelectionController->onMouseButtonUp( rMEvt, pWin ) )
606 : {
607 2 : if(HasCurrentFunction())
608 2 : GetCurrentFunction()->MouseButtonUp(rMEvt);
609 2 : }
610 : }
611 :
612 2 : if ( ! mpImpl->mpUpdateLockForMouse.expired())
613 : {
614 : ::boost::shared_ptr<ViewShell::Implementation::ToolBarManagerLock> pLock(
615 2 : mpImpl->mpUpdateLockForMouse);
616 2 : if (pLock.get() != NULL)
617 2 : pLock->Release();
618 : }
619 2 : }
620 :
621 0 : void ViewShell::Command(const CommandEvent& rCEvt, ::sd::Window* pWin)
622 : {
623 0 : bool bDone = HandleScrollCommand (rCEvt, pWin);
624 :
625 0 : if( !bDone )
626 : {
627 0 : if( rCEvt.GetCommand() == CommandEventId::InputLanguageChange )
628 : {
629 : //#i42732# update state of fontname if input language changes
630 0 : GetViewFrame()->GetBindings().Invalidate( SID_ATTR_CHAR_FONT );
631 0 : GetViewFrame()->GetBindings().Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
632 : }
633 : else
634 : {
635 0 : bool bConsumed = false;
636 0 : if( GetView() )
637 0 : bConsumed = GetView()->getSmartTags().Command(rCEvt);
638 :
639 0 : if( !bConsumed && HasCurrentFunction())
640 0 : GetCurrentFunction()->Command(rCEvt);
641 : }
642 : }
643 0 : }
644 :
645 106 : bool ViewShell::Notify(NotifyEvent& rNEvt, ::sd::Window* pWin)
646 : {
647 : // handle scroll commands when they arrived at child windows
648 106 : bool nRet = false;
649 106 : if( rNEvt.GetType() == MouseNotifyEvent::COMMAND )
650 : {
651 : // note: dynamic_cast is not possible as GetData() returns a void*
652 0 : CommandEvent* pCmdEvent = static_cast< CommandEvent* >(rNEvt.GetData());
653 0 : nRet = HandleScrollCommand(*pCmdEvent, pWin);
654 : }
655 106 : return nRet;
656 : }
657 :
658 0 : bool ViewShell::HandleScrollCommand(const CommandEvent& rCEvt, ::sd::Window* pWin)
659 : {
660 0 : bool bDone = false;
661 :
662 0 : switch( rCEvt.GetCommand() )
663 : {
664 : case CommandEventId::Swipe:
665 : {
666 0 : rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
667 0 : if (xSlideShow.is())
668 : {
669 0 : const CommandSwipeData* pSwipeData = rCEvt.GetSwipeData();
670 0 : bDone = xSlideShow->swipe(*pSwipeData);
671 0 : }
672 : }
673 0 : break;
674 : case CommandEventId::LongPress:
675 : {
676 0 : rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
677 0 : if (xSlideShow.is())
678 : {
679 0 : const CommandLongPressData* pLongPressData = rCEvt.GetLongPressData();
680 0 : bDone = xSlideShow->longpress(*pLongPressData);
681 0 : }
682 : }
683 0 : break;
684 :
685 : case CommandEventId::Wheel:
686 : {
687 0 : Reference< XSlideShowController > xSlideShowController( SlideShow::GetSlideShowController(GetViewShellBase() ) );
688 0 : if( xSlideShowController.is() )
689 : {
690 : // We ignore zooming with control+mouse wheel.
691 0 : const CommandWheelData* pData = rCEvt.GetWheelData();
692 0 : if( pData && !pData->GetModifier() && ( pData->GetMode() == CommandWheelMode::SCROLL ) && !pData->IsHorz() )
693 : {
694 0 : long nDelta = pData->GetDelta();
695 0 : if( nDelta > 0 )
696 0 : xSlideShowController->gotoPreviousSlide();
697 0 : else if( nDelta < 0 )
698 0 : xSlideShowController->gotoNextEffect();
699 : }
700 0 : break;
701 0 : }
702 : }
703 : // fall through when not running slideshow
704 : case CommandEventId::StartAutoScroll:
705 : case CommandEventId::AutoScroll:
706 : {
707 0 : const CommandWheelData* pData = rCEvt.GetWheelData();
708 :
709 0 : if (pData != NULL)
710 : {
711 0 : if (pData->IsMod1())
712 : {
713 0 : if( !GetDocSh()->IsUIActive() )
714 : {
715 0 : const long nOldZoom = GetActiveWindow()->GetZoom();
716 : long nNewZoom;
717 0 : Point aOldMousePos = GetActiveWindow()->PixelToLogic(rCEvt.GetMousePosPixel());
718 :
719 0 : if( pData->GetDelta() < 0L )
720 0 : nNewZoom = std::max( (long) pWin->GetMinZoom(), basegfx::zoomtools::zoomOut( nOldZoom ));
721 : else
722 0 : nNewZoom = std::min( (long) pWin->GetMaxZoom(), basegfx::zoomtools::zoomIn( nOldZoom ));
723 :
724 0 : SetZoom( nNewZoom );
725 : // Keep mouse at same doc point before zoom
726 0 : Point aNewMousePos = GetActiveWindow()->PixelToLogic(rCEvt.GetMousePosPixel());
727 0 : SetWinViewPos(GetWinViewPos() - (aNewMousePos - aOldMousePos), true);
728 :
729 0 : Invalidate( SID_ATTR_ZOOM );
730 0 : Invalidate( SID_ATTR_ZOOMSLIDER );
731 :
732 0 : bDone = true;
733 : }
734 : }
735 : else
736 : {
737 0 : if( mpContentWindow.get() == pWin )
738 : {
739 0 : sal_uLong nScrollLines = pData->GetScrollLines();
740 0 : if(IsPageFlipMode())
741 0 : nScrollLines = COMMAND_WHEEL_PAGESCROLL;
742 : CommandWheelData aWheelData( pData->GetDelta(),pData->GetNotchDelta(),
743 0 : nScrollLines,pData->GetMode(),pData->GetModifier(),pData->IsHorz() );
744 0 : CommandEvent aReWrite( rCEvt.GetMousePosPixel(),rCEvt.GetCommand(),
745 0 : rCEvt.IsMouseEvent(),static_cast<const void *>(&aWheelData) );
746 : bDone = pWin->HandleScrollCommand( aReWrite,
747 : mpHorizontalScrollBar.get(),
748 0 : mpVerticalScrollBar.get());
749 : }
750 : }
751 : }
752 : }
753 0 : break;
754 :
755 : default:
756 0 : break;
757 : }
758 :
759 0 : return bDone;
760 : }
761 :
762 1104 : void ViewShell::SetupRulers()
763 : {
764 1104 : if(mbHasRulers && (mpContentWindow.get() != NULL) && !SlideShow::IsRunning(GetViewShellBase()))
765 : {
766 628 : long nHRulerOfs = 0;
767 :
768 628 : if ( mpVerticalRuler.get() == NULL )
769 : {
770 86 : mpVerticalRuler.reset(CreateVRuler(GetActiveWindow()));
771 86 : if ( mpVerticalRuler.get() != NULL )
772 : {
773 86 : nHRulerOfs = mpVerticalRuler->GetSizePixel().Width();
774 86 : mpVerticalRuler->SetActive(true);
775 86 : mpVerticalRuler->Show();
776 : }
777 : }
778 628 : if ( mpHorizontalRuler.get() == NULL )
779 : {
780 86 : mpHorizontalRuler.reset(CreateHRuler(GetActiveWindow(), true));
781 86 : if ( mpHorizontalRuler.get() != NULL )
782 : {
783 86 : mpHorizontalRuler->SetWinPos(nHRulerOfs);
784 86 : mpHorizontalRuler->SetActive(true);
785 86 : mpHorizontalRuler->Show();
786 : }
787 : }
788 : }
789 1104 : }
790 :
791 0 : const SfxPoolItem* ViewShell::GetNumBulletItem(SfxItemSet& aNewAttr, sal_uInt16& nNumItemId)
792 : {
793 0 : const SfxPoolItem* pTmpItem = NULL;
794 :
795 0 : if(aNewAttr.GetItemState(nNumItemId, false, &pTmpItem) == SfxItemState::SET)
796 : {
797 0 : return pTmpItem;
798 : }
799 : else
800 : {
801 0 : nNumItemId = aNewAttr.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE);
802 0 : SfxItemState eState = aNewAttr.GetItemState(nNumItemId, false, &pTmpItem);
803 0 : if (eState == SfxItemState::SET)
804 0 : return pTmpItem;
805 : else
806 : {
807 0 : bool bOutliner = false;
808 0 : bool bTitle = false;
809 :
810 0 : if( mpView )
811 : {
812 0 : const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
813 0 : const size_t nCount = rMarkList.GetMarkCount();
814 :
815 0 : for(size_t nNum = 0; nNum < nCount; ++nNum)
816 : {
817 0 : SdrObject* pObj = rMarkList.GetMark(nNum)->GetMarkedSdrObj();
818 0 : if( pObj->GetObjInventor() == SdrInventor )
819 : {
820 0 : switch(pObj->GetObjIdentifier())
821 : {
822 : case OBJ_TITLETEXT:
823 0 : bTitle = true;
824 0 : break;
825 : case OBJ_OUTLINETEXT:
826 0 : bOutliner = true;
827 0 : break;
828 : }
829 : }
830 : }
831 : }
832 :
833 0 : const SvxNumBulletItem *pItem = NULL;
834 0 : if(bOutliner)
835 : {
836 0 : SfxStyleSheetBasePool* pSSPool = mpView->GetDocSh()->GetStyleSheetPool();
837 0 : OUString aStyleName(SD_RESSTR(STR_LAYOUT_OUTLINE) + " 1");
838 0 : SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( aStyleName, SD_STYLE_FAMILY_PSEUDO);
839 0 : if( pFirstStyleSheet )
840 0 : pFirstStyleSheet->GetItemSet().GetItemState(EE_PARA_NUMBULLET, false, reinterpret_cast<const SfxPoolItem**>(&pItem));
841 : }
842 :
843 0 : if( pItem == NULL )
844 0 : pItem = static_cast<const SvxNumBulletItem*>( aNewAttr.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET) );
845 :
846 0 : aNewAttr.Put(*pItem, EE_PARA_NUMBULLET);
847 :
848 0 : if(bTitle && aNewAttr.GetItemState(EE_PARA_NUMBULLET,true) == SfxItemState::SET )
849 : {
850 0 : const SvxNumBulletItem* pBulletItem = static_cast<const SvxNumBulletItem*>(aNewAttr.GetItem(EE_PARA_NUMBULLET,true));
851 0 : SvxNumRule* pRule = pBulletItem->GetNumRule();
852 0 : if(pRule)
853 : {
854 0 : SvxNumRule aNewRule( *pRule );
855 0 : aNewRule.SetFeatureFlag( SvxNumRuleFlags::NO_NUMBERS, true );
856 :
857 0 : SvxNumBulletItem aNewItem( aNewRule, EE_PARA_NUMBULLET );
858 0 : aNewAttr.Put(aNewItem);
859 : }
860 : }
861 :
862 0 : SfxItemState eNumState = aNewAttr.GetItemState(nNumItemId, false, &pTmpItem);
863 0 : if (eNumState == SfxItemState::SET)
864 0 : return pTmpItem;
865 :
866 : }
867 : }
868 0 : return pTmpItem;
869 : }
870 :
871 790 : void ViewShell::Resize()
872 : {
873 790 : SetupRulers ();
874 :
875 790 : if (mpParentWindow == nullptr)
876 299 : return;
877 :
878 : // Make sure that the new size is not degenerate.
879 790 : const Size aSize (mpParentWindow->GetSizePixel());
880 790 : if (aSize.Width()==0 || aSize.Height()==0)
881 299 : return;
882 :
883 : // Remember the new position and size.
884 491 : maViewPos = Point(0,0);
885 491 : maViewSize = aSize;
886 :
887 : // Rearrange the UI elements to take care of the new position and size.
888 491 : ArrangeGUIElements ();
889 : // end of included AdjustPosSizePixel.
890 :
891 491 : ::sd::View* pView = GetView();
892 :
893 491 : if (pView)
894 491 : pView->VisAreaChanged(GetActiveWindow());
895 : }
896 :
897 499 : SvBorder ViewShell::GetBorder (bool )
898 : {
899 499 : SvBorder aBorder;
900 :
901 : // Horizontal scrollbar.
902 998 : if (mpHorizontalScrollBar.get()!=NULL
903 499 : && mpHorizontalScrollBar->IsVisible())
904 : {
905 499 : aBorder.Bottom() = maScrBarWH.Height();
906 : }
907 :
908 : // Vertical scrollbar.
909 998 : if (mpVerticalScrollBar.get()!=NULL
910 499 : && mpVerticalScrollBar->IsVisible())
911 : {
912 499 : aBorder.Right() = maScrBarWH.Width();
913 : }
914 :
915 : // Place horizontal ruler below tab bar.
916 499 : if (mbHasRulers && mpContentWindow.get() != NULL)
917 : {
918 314 : SetupRulers();
919 314 : if (mpHorizontalRuler.get() != NULL)
920 314 : aBorder.Top() = mpHorizontalRuler->GetSizePixel().Height();
921 314 : if (mpVerticalRuler.get() != NULL)
922 314 : aBorder.Left() = mpVerticalRuler->GetSizePixel().Width();
923 : }
924 :
925 499 : return aBorder;
926 : }
927 :
928 427 : void ViewShell::ArrangeGUIElements()
929 : {
930 427 : if (mpImpl->mbArrangeActive)
931 427 : return;
932 427 : mpImpl->mbArrangeActive = true;
933 :
934 : // Calculate border for in-place editing.
935 427 : long nLeft = maViewPos.X();
936 427 : long nTop = maViewPos.Y();
937 427 : long nRight = maViewPos.X() + maViewSize.Width();
938 427 : long nBottom = maViewPos.Y() + maViewSize.Height();
939 :
940 : // Horizontal scrollbar.
941 854 : if (mpHorizontalScrollBar.get()!=NULL
942 427 : && mpHorizontalScrollBar->IsVisible())
943 : {
944 427 : nBottom -= maScrBarWH.Height();
945 427 : if (mpLayerTabBar.get()!=NULL && mpLayerTabBar->IsVisible())
946 230 : nBottom -= mpLayerTabBar->GetSizePixel().Height();
947 427 : mpHorizontalScrollBar->SetPosSizePixel (
948 : Point(nLeft, nBottom),
949 427 : Size(nRight - nLeft - maScrBarWH.Width(), maScrBarWH.Height()));
950 : }
951 :
952 : // Vertical scrollbar.
953 854 : if (mpVerticalScrollBar.get()!=NULL
954 427 : && mpVerticalScrollBar->IsVisible())
955 : {
956 427 : nRight -= maScrBarWH.Width();
957 427 : mpVerticalScrollBar->SetPosSizePixel (
958 : Point(nRight,nTop),
959 427 : Size (maScrBarWH.Width(), nBottom-nTop));
960 : }
961 :
962 : // Filler in the lower right corner.
963 427 : if (mpScrollBarBox.get() != NULL)
964 : {
965 854 : if (mpHorizontalScrollBar.get()!=NULL
966 427 : && mpHorizontalScrollBar->IsVisible()
967 427 : && mpVerticalScrollBar.get()!=NULL
968 854 : && mpVerticalScrollBar->IsVisible())
969 : {
970 427 : mpScrollBarBox->Show();
971 427 : mpScrollBarBox->SetPosSizePixel(Point(nRight, nBottom), maScrBarWH);
972 : }
973 : else
974 0 : mpScrollBarBox->Hide();
975 : }
976 :
977 : // Place horizontal ruler below tab bar.
978 427 : if (mbHasRulers && mpContentWindow.get() != NULL)
979 : {
980 230 : if (mpHorizontalRuler.get() != NULL)
981 : {
982 230 : Size aRulerSize = mpHorizontalRuler->GetSizePixel();
983 230 : aRulerSize.Width() = nRight - nLeft;
984 230 : mpHorizontalRuler->SetPosSizePixel (
985 230 : Point(nLeft,nTop), aRulerSize);
986 230 : if (mpVerticalRuler.get() != NULL)
987 230 : mpHorizontalRuler->SetBorderPos(
988 460 : mpVerticalRuler->GetSizePixel().Width()-1);
989 230 : nTop += aRulerSize.Height();
990 : }
991 230 : if (mpVerticalRuler.get() != NULL)
992 : {
993 230 : Size aRulerSize = mpVerticalRuler->GetSizePixel();
994 230 : aRulerSize.Height() = nBottom - nTop;
995 230 : mpVerticalRuler->SetPosSizePixel (
996 230 : Point (nLeft,nTop), aRulerSize);
997 230 : nLeft += aRulerSize.Width();
998 : }
999 : }
1000 :
1001 427 : rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
1002 :
1003 : // The size of the window of the center pane is set differently from
1004 : // that of the windows in the docking windows.
1005 427 : bool bSlideShowActive = (xSlideShow.is() && xSlideShow->isRunning()) && !xSlideShow->isFullScreen() && xSlideShow->getAnimationMode() == ANIMATIONMODE_SHOW;
1006 427 : if ( !bSlideShowActive)
1007 : {
1008 : OSL_ASSERT (GetViewShell()!=NULL);
1009 :
1010 427 : if (mpContentWindow)
1011 427 : mpContentWindow->SetPosSizePixel(
1012 : Point(nLeft,nTop),
1013 427 : Size(nRight-nLeft,nBottom-nTop));
1014 : }
1015 :
1016 : // Windows in the center and rulers at the left and top side.
1017 : maAllWindowRectangle = Rectangle(
1018 : maViewPos,
1019 854 : Size(maViewSize.Width()-maScrBarWH.Width(),
1020 1281 : maViewSize.Height()-maScrBarWH.Height()));
1021 :
1022 427 : if (mpContentWindow.get() != NULL)
1023 427 : mpContentWindow->UpdateMapOrigin();
1024 :
1025 427 : UpdateScrollBars();
1026 :
1027 427 : mpImpl->mbArrangeActive = false;
1028 : }
1029 :
1030 0 : void ViewShell::SetUIUnit(FieldUnit eUnit)
1031 : {
1032 : // Set unit at horizontal and vertical rulers.
1033 0 : if (mpHorizontalRuler.get() != NULL)
1034 0 : mpHorizontalRuler->SetUnit(eUnit);
1035 :
1036 0 : if (mpVerticalRuler.get() != NULL)
1037 0 : mpVerticalRuler->SetUnit(eUnit);
1038 0 : }
1039 :
1040 : /**
1041 : * set DefTab at horizontal rulers
1042 : */
1043 0 : void ViewShell::SetDefTabHRuler( sal_uInt16 nDefTab )
1044 : {
1045 0 : if (mpHorizontalRuler.get() != NULL)
1046 0 : mpHorizontalRuler->SetDefTabDist( nDefTab );
1047 0 : }
1048 :
1049 : /** Tell the FmFormShell that the view shell is closing. Give it the
1050 : opportunity to prevent that.
1051 : */
1052 207 : bool ViewShell::PrepareClose (bool bUI)
1053 : {
1054 207 : bool nResult = true;
1055 :
1056 207 : FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell();
1057 207 : if (pFormShell != NULL)
1058 207 : nResult = pFormShell->PrepareClose (bUI);
1059 :
1060 207 : return nResult;
1061 : }
1062 :
1063 501 : void ViewShell::UpdatePreview (SdPage*, bool )
1064 : {
1065 : // Do nothing. After the actual preview has been removed,
1066 : // OutlineViewShell::UpdatePreview() is the place where something
1067 : // useful is still done.
1068 501 : }
1069 :
1070 266 : ::svl::IUndoManager* ViewShell::ImpGetUndoManager() const
1071 : {
1072 266 : const ViewShell* pMainViewShell = GetViewShellBase().GetMainViewShell().get();
1073 :
1074 266 : if( pMainViewShell == 0 )
1075 0 : pMainViewShell = this;
1076 :
1077 266 : ::sd::View* pView = pMainViewShell->GetView();
1078 :
1079 : // check for text edit our outline view
1080 266 : if( pView )
1081 : {
1082 266 : if( pMainViewShell->GetShellType() == ViewShell::ST_OUTLINE )
1083 : {
1084 0 : OutlineView* pOlView = dynamic_cast< OutlineView* >( pView );
1085 0 : if( pOlView )
1086 : {
1087 0 : ::Outliner& rOutl = pOlView->GetOutliner();
1088 0 : return &rOutl.GetUndoManager();
1089 : }
1090 : }
1091 266 : else if( pView->IsTextEdit() )
1092 : {
1093 0 : SdrOutliner* pOL = pView->GetTextEditOutliner();
1094 0 : if( pOL )
1095 0 : return &pOL->GetUndoManager();
1096 : }
1097 : }
1098 :
1099 266 : if( GetDocSh() )
1100 266 : return GetDocSh()->GetUndoManager();
1101 :
1102 0 : return NULL;
1103 : }
1104 :
1105 0 : void ViewShell::ImpGetUndoStrings(SfxItemSet &rSet) const
1106 : {
1107 0 : ::svl::IUndoManager* pUndoManager = ImpGetUndoManager();
1108 0 : if(pUndoManager)
1109 : {
1110 0 : sal_uInt16 nCount(pUndoManager->GetUndoActionCount());
1111 0 : if(nCount)
1112 : {
1113 : // prepare list
1114 0 : std::vector<OUString> aStringList;
1115 :
1116 0 : for (sal_uInt16 a = 0; a < nCount; ++a)
1117 : {
1118 : // generate one String in list per undo step
1119 0 : aStringList.push_back( pUndoManager->GetUndoActionComment(a) );
1120 : }
1121 :
1122 : // set item
1123 0 : rSet.Put(SfxStringListItem(SID_GETUNDOSTRINGS, &aStringList));
1124 : }
1125 : else
1126 : {
1127 0 : rSet.DisableItem(SID_GETUNDOSTRINGS);
1128 : }
1129 : }
1130 0 : }
1131 :
1132 0 : void ViewShell::ImpGetRedoStrings(SfxItemSet &rSet) const
1133 : {
1134 0 : ::svl::IUndoManager* pUndoManager = ImpGetUndoManager();
1135 0 : if(pUndoManager)
1136 : {
1137 0 : sal_uInt16 nCount(pUndoManager->GetRedoActionCount());
1138 0 : if(nCount)
1139 : {
1140 : // prepare list
1141 0 : ::std::vector< OUString > aStringList;
1142 : sal_uInt16 a;
1143 :
1144 0 : for( a = 0; a < nCount; a++)
1145 : // generate one String in list per undo step
1146 0 : aStringList.push_back( pUndoManager->GetRedoActionComment(a) );
1147 :
1148 : // set item
1149 0 : rSet.Put(SfxStringListItem(SID_GETREDOSTRINGS, &aStringList));
1150 : }
1151 : else
1152 : {
1153 0 : rSet.DisableItem(SID_GETREDOSTRINGS);
1154 : }
1155 : }
1156 0 : }
1157 :
1158 6 : void ViewShell::ImpSidUndo(bool, SfxRequest& rReq)
1159 : {
1160 6 : ::svl::IUndoManager* pUndoManager = ImpGetUndoManager();
1161 6 : sal_uInt16 nNumber(1);
1162 6 : const SfxItemSet* pReqArgs = rReq.GetArgs();
1163 :
1164 6 : if(pReqArgs)
1165 : {
1166 0 : const SfxUInt16Item* pUIntItem = static_cast<const SfxUInt16Item*>(&pReqArgs->Get(SID_UNDO));
1167 0 : nNumber = pUIntItem->GetValue();
1168 : }
1169 :
1170 6 : if(nNumber && pUndoManager)
1171 : {
1172 6 : sal_uInt16 nCount(pUndoManager->GetUndoActionCount());
1173 6 : if(nCount >= nNumber)
1174 : {
1175 : try
1176 : {
1177 : // when UndoStack is cleared by ModifyPageUndoAction
1178 : // the nCount may have changed, so test GetUndoActionCount()
1179 16 : while(nNumber-- && pUndoManager->GetUndoActionCount())
1180 6 : pUndoManager->Undo();
1181 : }
1182 2 : catch( const Exception& )
1183 : {
1184 : // no need to handle. By definition, the UndoManager handled this by clearing the
1185 : // Undo/Redo stacks
1186 : }
1187 : }
1188 :
1189 : // refresh rulers, maybe UNDO was move of TAB marker in ruler
1190 6 : if (mbHasRulers)
1191 3 : Invalidate(SID_ATTR_TABSTOP);
1192 : }
1193 :
1194 : // This one is corresponding to the default handling
1195 : // of SID_UNDO in sfx2
1196 6 : GetViewFrame()->GetBindings().InvalidateAll(false);
1197 :
1198 6 : rReq.Done();
1199 6 : }
1200 :
1201 2 : void ViewShell::ImpSidRedo(bool, SfxRequest& rReq)
1202 : {
1203 2 : ::svl::IUndoManager* pUndoManager = ImpGetUndoManager();
1204 2 : sal_uInt16 nNumber(1);
1205 2 : const SfxItemSet* pReqArgs = rReq.GetArgs();
1206 :
1207 2 : if(pReqArgs)
1208 : {
1209 0 : const SfxUInt16Item* pUIntItem = static_cast<const SfxUInt16Item*>(&pReqArgs->Get(SID_REDO));
1210 0 : nNumber = pUIntItem->GetValue();
1211 : }
1212 :
1213 2 : if(nNumber && pUndoManager)
1214 : {
1215 2 : sal_uInt16 nCount(pUndoManager->GetRedoActionCount());
1216 2 : if(nCount >= nNumber)
1217 : {
1218 : try
1219 : {
1220 : // when UndoStack is cleared by ModifyPageRedoAction
1221 : // the nCount may have changed, so test GetRedoActionCount()
1222 4 : while(nNumber-- && pUndoManager->GetRedoActionCount())
1223 2 : pUndoManager->Redo();
1224 : }
1225 2 : catch( const Exception& )
1226 : {
1227 : // no need to handle. By definition, the UndoManager handled this by clearing the
1228 : // Undo/Redo stacks
1229 : }
1230 : }
1231 :
1232 : // refresh rulers, maybe REDO was move of TAB marker in ruler
1233 2 : if (mbHasRulers)
1234 : {
1235 1 : Invalidate(SID_ATTR_TABSTOP);
1236 : }
1237 : }
1238 :
1239 : // This one is corresponding to the default handling
1240 : // of SID_UNDO in sfx2
1241 2 : GetViewFrame()->GetBindings().InvalidateAll(false);
1242 :
1243 2 : rReq.Done();
1244 2 : }
1245 :
1246 4 : void ViewShell::ExecReq( SfxRequest& rReq )
1247 : {
1248 4 : sal_uInt16 nSlot = rReq.GetSlot();
1249 4 : switch( nSlot )
1250 : {
1251 : case SID_MAIL_SCROLLBODY_PAGEDOWN:
1252 : {
1253 0 : rtl::Reference<FuPoor> xFunc( GetCurrentFunction() );
1254 0 : if( xFunc.is() )
1255 0 : ScrollLines( 0, -1 );
1256 :
1257 0 : rReq.Done();
1258 : }
1259 0 : break;
1260 :
1261 : case SID_OUTPUT_QUALITY_COLOR:
1262 : case SID_OUTPUT_QUALITY_GRAYSCALE:
1263 : case SID_OUTPUT_QUALITY_BLACKWHITE:
1264 : case SID_OUTPUT_QUALITY_CONTRAST:
1265 : {
1266 0 : DrawModeFlags nMode = OUTPUT_DRAWMODE_COLOR;
1267 :
1268 0 : switch( nSlot )
1269 : {
1270 0 : case SID_OUTPUT_QUALITY_COLOR: nMode = OUTPUT_DRAWMODE_COLOR; break;
1271 0 : case SID_OUTPUT_QUALITY_GRAYSCALE: nMode = OUTPUT_DRAWMODE_GRAYSCALE; break;
1272 0 : case SID_OUTPUT_QUALITY_BLACKWHITE: nMode = OUTPUT_DRAWMODE_BLACKWHITE; break;
1273 0 : case SID_OUTPUT_QUALITY_CONTRAST: nMode = OUTPUT_DRAWMODE_CONTRAST; break;
1274 : }
1275 :
1276 0 : GetActiveWindow()->SetDrawMode( nMode );
1277 0 : mpFrameView->SetDrawMode( nMode );
1278 :
1279 0 : GetActiveWindow()->Invalidate();
1280 :
1281 0 : Invalidate();
1282 0 : rReq.Done();
1283 0 : break;
1284 : }
1285 : }
1286 4 : }
1287 :
1288 : /** This default implementation returns only an empty reference. See derived
1289 : classes for more interesting examples.
1290 : */
1291 : ::com::sun::star::uno::Reference<
1292 : ::com::sun::star::accessibility::XAccessible>
1293 0 : ViewShell::CreateAccessibleDocumentView (::sd::Window* )
1294 : {
1295 : OSL_FAIL("ViewShell::CreateAccessibleDocumentView should not be called!, perhaps Meyers, 3rd edition, Item 9:\n");
1296 :
1297 : return ::com::sun::star::uno::Reference<
1298 0 : ::com::sun::star::accessibility::XAccessible> ();
1299 : }
1300 :
1301 522 : ::sd::WindowUpdater* ViewShell::GetWindowUpdater() const
1302 : {
1303 522 : return mpWindowUpdater.get();
1304 : }
1305 :
1306 76611 : ViewShellBase& ViewShell::GetViewShellBase() const
1307 : {
1308 76611 : return *static_cast<ViewShellBase*>(GetViewShell());
1309 : }
1310 :
1311 2463 : ViewShell::ShellType ViewShell::GetShellType() const
1312 : {
1313 2463 : return meShellType;
1314 : }
1315 :
1316 20856 : DrawDocShell* ViewShell::GetDocSh() const
1317 : {
1318 20856 : return GetViewShellBase().GetDocShell();
1319 : }
1320 :
1321 32004 : SdDrawDocument* ViewShell::GetDoc() const
1322 : {
1323 32004 : return GetViewShellBase().GetDocument();
1324 : }
1325 :
1326 0 : ErrCode ViewShell::DoVerb (long )
1327 : {
1328 0 : return ERRCODE_NONE;
1329 : }
1330 :
1331 206 : void ViewShell::SetCurrentFunction( const rtl::Reference<FuPoor>& xFunction)
1332 : {
1333 206 : if( mxCurrentFunction.is() && (mxOldFunction != mxCurrentFunction) )
1334 4 : mxCurrentFunction->Dispose();
1335 206 : rtl::Reference<FuPoor> xTemp( mxCurrentFunction );
1336 206 : mxCurrentFunction = xFunction;
1337 206 : }
1338 :
1339 207 : void ViewShell::SetOldFunction(const rtl::Reference<FuPoor>& xFunction)
1340 : {
1341 207 : if( mxOldFunction.is() && (xFunction != mxOldFunction) && (mxCurrentFunction != mxOldFunction) )
1342 1 : mxOldFunction->Dispose();
1343 :
1344 207 : rtl::Reference<FuPoor> xTemp( mxOldFunction );
1345 207 : mxOldFunction = xFunction;
1346 207 : }
1347 :
1348 : /** this method deactivates the current function. If an old function is
1349 : saved, this will become activated and current function.
1350 : */
1351 0 : void ViewShell::Cancel()
1352 : {
1353 0 : if(mxCurrentFunction.is() && (mxCurrentFunction != mxOldFunction ))
1354 : {
1355 0 : rtl::Reference<FuPoor> xTemp( mxCurrentFunction );
1356 0 : mxCurrentFunction.clear();
1357 0 : xTemp->Deactivate();
1358 0 : xTemp->Dispose();
1359 : }
1360 :
1361 0 : if(mxOldFunction.is())
1362 : {
1363 0 : mxCurrentFunction = mxOldFunction;
1364 0 : mxCurrentFunction->Activate();
1365 : }
1366 0 : }
1367 :
1368 127 : void ViewShell::DeactivateCurrentFunction( bool bPermanent /* == false */ )
1369 : {
1370 127 : if( mxCurrentFunction.is() )
1371 : {
1372 127 : if(bPermanent && (mxOldFunction == mxCurrentFunction))
1373 0 : mxOldFunction.clear();
1374 :
1375 127 : mxCurrentFunction->Deactivate();
1376 127 : if( mxCurrentFunction != mxOldFunction )
1377 0 : mxCurrentFunction->Dispose();
1378 :
1379 127 : rtl::Reference<FuPoor> xTemp( mxCurrentFunction );
1380 127 : mxCurrentFunction.clear();
1381 : }
1382 127 : }
1383 :
1384 197 : void ViewShell::DisposeFunctions()
1385 : {
1386 197 : if(mxCurrentFunction.is())
1387 : {
1388 71 : rtl::Reference<FuPoor> xTemp( mxCurrentFunction );
1389 71 : mxCurrentFunction.clear();
1390 71 : xTemp->Deactivate();
1391 71 : xTemp->Dispose();
1392 : }
1393 :
1394 197 : if(mxOldFunction.is())
1395 : {
1396 197 : rtl::Reference<FuPoor> xTemp( mxOldFunction );
1397 197 : mxOldFunction->Dispose();
1398 197 : mxOldFunction.clear();
1399 : }
1400 197 : }
1401 :
1402 3375 : bool ViewShell::IsMainViewShell() const
1403 : {
1404 3375 : return mpImpl->mbIsMainViewShell;
1405 : }
1406 :
1407 394 : void ViewShell::SetIsMainViewShell (bool bIsMainViewShell)
1408 : {
1409 394 : if (bIsMainViewShell != mpImpl->mbIsMainViewShell)
1410 : {
1411 266 : mpImpl->mbIsMainViewShell = bIsMainViewShell;
1412 266 : if (bIsMainViewShell)
1413 133 : GetDocSh()->Connect (this);
1414 : else
1415 133 : GetDocSh()->Disconnect (this);
1416 : }
1417 394 : }
1418 :
1419 1051 : void ViewShell::PrePaint()
1420 : {
1421 1051 : }
1422 :
1423 0 : void ViewShell::Paint (const Rectangle&, ::sd::Window* )
1424 : {
1425 0 : }
1426 :
1427 0 : void ViewShell::ShowUIControls (bool bVisible)
1428 : {
1429 0 : mpImpl->mbIsShowingUIControls = bVisible;
1430 :
1431 0 : if (mbHasRulers)
1432 : {
1433 0 : if (mpHorizontalRuler.get() != NULL)
1434 0 : mpHorizontalRuler->Show( bVisible );
1435 :
1436 0 : if (mpVerticalRuler.get() != NULL)
1437 0 : mpVerticalRuler->Show( bVisible );
1438 : }
1439 :
1440 0 : if (mpVerticalScrollBar.get() != NULL)
1441 0 : mpVerticalScrollBar->Show( bVisible );
1442 :
1443 0 : if (mpHorizontalScrollBar.get() != NULL)
1444 0 : mpHorizontalScrollBar->Show( bVisible );
1445 :
1446 0 : if (mpScrollBarBox.get() != NULL)
1447 0 : mpScrollBarBox->Show(bVisible);
1448 :
1449 0 : if (mpContentWindow.get() != NULL)
1450 0 : mpContentWindow->Show( bVisible );
1451 0 : }
1452 :
1453 68 : bool ViewShell::RelocateToParentWindow (vcl::Window* pParentWindow)
1454 : {
1455 68 : mpParentWindow = pParentWindow;
1456 :
1457 68 : if (mpParentWindow)
1458 68 : mpParentWindow->SetBackground (Wallpaper());
1459 :
1460 68 : if (mpContentWindow.get() != NULL)
1461 68 : mpContentWindow->SetParent(pParentWindow);
1462 :
1463 68 : if (mpHorizontalScrollBar.get() != NULL)
1464 68 : mpHorizontalScrollBar->SetParent(mpParentWindow);
1465 68 : if (mpVerticalScrollBar.get() != NULL)
1466 68 : mpVerticalScrollBar->SetParent(mpParentWindow);
1467 68 : if (mpScrollBarBox.get() != NULL)
1468 68 : mpScrollBarBox->SetParent(mpParentWindow);
1469 :
1470 68 : return true;
1471 : }
1472 :
1473 0 : void ViewShell::SwitchViewFireFocus(::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xAcc )
1474 : {
1475 0 : if (xAcc.get())
1476 : {
1477 0 : ::accessibility::AccessibleDocumentViewBase* pBase = static_cast< ::accessibility::AccessibleDocumentViewBase* >(xAcc.get());
1478 0 : if (pBase)
1479 0 : pBase->SwitchViewActivated();
1480 : }
1481 0 : }
1482 0 : void ViewShell::SwitchActiveViewFireFocus()
1483 : {
1484 0 : if (mpContentWindow)
1485 : {
1486 0 : SwitchViewFireFocus(mpContentWindow->GetAccessible(false));
1487 : }
1488 0 : }
1489 : // move these two methods from DrawViewShell.
1490 0 : void ViewShell::fireSwitchCurrentPage(sal_Int32 pageIndex)
1491 : {
1492 0 : GetViewShellBase().GetDrawController().fireSwitchCurrentPage(pageIndex);
1493 0 : }
1494 0 : void ViewShell::NotifyAccUpdate( )
1495 : {
1496 0 : GetViewShellBase().GetDrawController().NotifyAccUpdate();
1497 0 : }
1498 :
1499 : } // end of namespace sd
1500 :
1501 : //===== ViewShellObjectBarFactory =============================================
1502 :
1503 : namespace {
1504 :
1505 197 : ViewShellObjectBarFactory::ViewShellObjectBarFactory (
1506 : ::sd::ViewShell& rViewShell)
1507 197 : : mrViewShell (rViewShell)
1508 : {
1509 197 : }
1510 :
1511 591 : ViewShellObjectBarFactory::~ViewShellObjectBarFactory()
1512 : {
1513 591 : for (ShellCache::iterator aI(maShellCache.begin());
1514 394 : aI!=maShellCache.end();
1515 : ++aI)
1516 : {
1517 0 : delete aI->second;
1518 : }
1519 394 : }
1520 :
1521 3 : SfxShell* ViewShellObjectBarFactory::CreateShell (
1522 : ::sd::ShellId nId,
1523 : vcl::Window*,
1524 : ::sd::FrameView* )
1525 : {
1526 3 : SfxShell* pShell = NULL;
1527 :
1528 3 : ShellCache::iterator aI (maShellCache.find(nId));
1529 3 : if (aI == maShellCache.end() || aI->second==NULL)
1530 : {
1531 3 : ::sd::View* pView = mrViewShell.GetView();
1532 3 : switch (nId)
1533 : {
1534 : case RID_BEZIER_TOOLBOX:
1535 0 : pShell = new ::sd::BezierObjectBar(&mrViewShell, pView);
1536 0 : break;
1537 :
1538 : case RID_DRAW_TEXT_TOOLBOX:
1539 : pShell = new ::sd::TextObjectBar(
1540 3 : &mrViewShell, mrViewShell.GetDoc()->GetPool(), pView);
1541 3 : break;
1542 :
1543 : case RID_DRAW_GRAF_TOOLBOX:
1544 0 : pShell = new ::sd::GraphicObjectBar(&mrViewShell, pView);
1545 0 : break;
1546 :
1547 : case RID_DRAW_MEDIA_TOOLBOX:
1548 0 : pShell = new ::sd::MediaObjectBar(&mrViewShell, pView);
1549 0 : break;
1550 :
1551 : case RID_DRAW_TABLE_TOOLBOX:
1552 0 : pShell = ::sd::ui::table::CreateTableObjectBar( mrViewShell, pView );
1553 0 : break;
1554 :
1555 : case RID_SVX_EXTRUSION_BAR:
1556 : pShell = new svx::ExtrusionBar(
1557 0 : &mrViewShell.GetViewShellBase());
1558 0 : break;
1559 :
1560 : case RID_SVX_FONTWORK_BAR:
1561 : pShell = new svx::FontworkBar(
1562 0 : &mrViewShell.GetViewShellBase());
1563 0 : break;
1564 :
1565 : default:
1566 0 : pShell = NULL;
1567 0 : break;
1568 : }
1569 : }
1570 : else
1571 0 : pShell = aI->second;
1572 :
1573 3 : return pShell;
1574 : }
1575 :
1576 3 : void ViewShellObjectBarFactory::ReleaseShell (SfxShell* pShell)
1577 : {
1578 3 : if (pShell != NULL)
1579 3 : delete pShell;
1580 3 : }
1581 :
1582 66 : } // end of anonymous namespace
1583 :
1584 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|