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