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