diff options
Diffstat (limited to 'sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx')
-rwxr-xr-x | sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx | 778 |
1 files changed, 778 insertions, 0 deletions
diff --git a/sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx b/sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx new file mode 100755 index 000000000000..86ec4002cd02 --- /dev/null +++ b/sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx @@ -0,0 +1,778 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "precompiled_sd.hxx" + +#include "SlideSorterViewShell.hxx" +#include "ViewShellImplementation.hxx" + +#include "SlideSorter.hxx" +#include "controller/SlideSorterController.hxx" +#include "controller/SlsClipboard.hxx" +#include "controller/SlsFocusManager.hxx" +#include "controller/SlsScrollBarManager.hxx" +#include "controller/SlsPageSelector.hxx" +#include "controller/SlsSlotManager.hxx" +#include "controller/SlsCurrentSlideManager.hxx" +#include "controller/SlsSelectionManager.hxx" +#include "view/SlideSorterView.hxx" +#include "view/SlsLayouter.hxx" +#include "model/SlideSorterModel.hxx" +#include "model/SlsPageEnumeration.hxx" +#include "model/SlsPageDescriptor.hxx" +#include "framework/FrameworkHelper.hxx" +#include "ViewShellBase.hxx" +#include "drawdoc.hxx" +#include "app.hrc" +#include "glob.hrc" +#include "sdattr.hrc" +#include "sdresid.hxx" +#include "AccessibleSlideSorterView.hxx" +#include "DrawDocShell.hxx" +#include "FrameView.hxx" +#include "SdUnoSlideView.hxx" +#include "ViewShellManager.hxx" +#include "Window.hxx" +#include <sfx2/app.hxx> +#include <sfx2/msg.hxx> +#include <sfx2/objface.hxx> +#include <sfx2/viewfrm.hxx> +#include <sfx2/bindings.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/request.hxx> +#include <svx/svxids.hrc> +#include <com/sun/star/drawing/framework/XControllerManager.hpp> +#include <com/sun/star/drawing/framework/ResourceId.hpp> +#include <cppuhelper/bootstrap.hxx> +#include <comphelper/processfactory.hxx> + +using namespace ::sd::slidesorter; +#define SlideSorterViewShell +#include "sdslots.hxx" + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::drawing::framework; + +using ::sd::framework::FrameworkHelper; + +namespace sd { namespace slidesorter { + + +SFX_IMPL_INTERFACE(SlideSorterViewShell, SfxShell, SdResId(STR_SLIDESORTERVIEWSHELL)) +{ +} + + + +TYPEINIT1(SlideSorterViewShell, ViewShell); + + + +::boost::shared_ptr<SlideSorterViewShell> SlideSorterViewShell::Create ( + SfxViewFrame* pFrame, + ViewShellBase& rViewShellBase, + ::Window* pParentWindow, + FrameView* pFrameViewArgument) +{ + ::boost::shared_ptr<SlideSorterViewShell> pViewShell; + try + { + pViewShell.reset( + new SlideSorterViewShell(pFrame,rViewShellBase,pParentWindow,pFrameViewArgument)); + pViewShell->Initialize(); + if (pViewShell->mpSlideSorter.get() == NULL) + pViewShell.reset(); + } + catch(Exception&) + { + pViewShell.reset(); + } + return pViewShell; +} + + + + +SlideSorterViewShell::SlideSorterViewShell ( + SfxViewFrame* pFrame, + ViewShellBase& rViewShellBase, + ::Window* pParentWindow, + FrameView* pFrameViewArgument) + : ViewShell (pFrame, pParentWindow, rViewShellBase), + mpSlideSorter() +{ + meShellType = ST_SLIDE_SORTER; + + SetPool( &GetDoc()->GetPool() ); + SetUndoManager( GetDoc()->GetDocSh()->GetUndoManager() ); + + if (pFrameViewArgument != NULL) + mpFrameView = pFrameViewArgument; + else + mpFrameView = new FrameView(GetDoc()); + GetFrameView()->Connect(); + + SetName (String (RTL_CONSTASCII_USTRINGPARAM("SlideSorterViewShell"))); + + pParentWindow->SetStyle(pParentWindow->GetStyle() | WB_DIALOGCONTROL); +} + + + + +SlideSorterViewShell::~SlideSorterViewShell (void) +{ + DisposeFunctions(); + + try + { + ::sd::Window* pWindow = GetActiveWindow(); + if (pWindow!=NULL) + { + ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XComponent> xComponent ( + pWindow->GetAccessible(false), + ::com::sun::star::uno::UNO_QUERY); + if (xComponent.is()) + xComponent->dispose(); + } + } + catch( ::com::sun::star::uno::Exception& e ) + { + (void)e; + DBG_ERROR("sd::SlideSorterViewShell::~SlideSorterViewShell(), exception caught!" ); + } +} + + + + + +void SlideSorterViewShell::Initialize (void) +{ + mpSlideSorter = SlideSorter::CreateSlideSorter( + *this, + mpContentWindow, + mpHorizontalScrollBar, + mpVerticalScrollBar, + mpScrollBarBox); + mpView = &mpSlideSorter->GetView(); + + // For accessibility we have to shortly hide the content window. + // This triggers the construction of a new accessibility object for + // the new view shell. (One is created earlier while the construtor + // of the base class is executed. At that time the correct + // accessibility object can not be constructed.) + ::Window* pWindow = mpSlideSorter->GetActiveWindow(); + if (pWindow != NULL) + { + pWindow->Hide(); + pWindow->Show(); + } +} + + + + +void SlideSorterViewShell::Init (bool bIsMainViewShell) +{ + ViewShell::Init(bIsMainViewShell); + + mpSlideSorter->GetModel().UpdatePageList(); + + if (mpContentWindow.get() != NULL) + mpContentWindow->SetViewShell(this); +} + + + + +SlideSorterViewShell* SlideSorterViewShell::GetSlideSorter (ViewShellBase& rBase) +{ + SlideSorterViewShell* pViewShell = NULL; + + // Test the center, left, and then the right pane for showing a slide sorter. + ::rtl::OUString aPaneURLs[] = { + FrameworkHelper::msCenterPaneURL, + FrameworkHelper::msFullScreenPaneURL, + FrameworkHelper::msLeftImpressPaneURL, + FrameworkHelper::msRightPaneURL, + ::rtl::OUString()}; + + try + { + ::boost::shared_ptr<FrameworkHelper> pFrameworkHelper (FrameworkHelper::Instance(rBase)); + if (pFrameworkHelper->IsValid()) + for (int i=0; pViewShell==NULL && aPaneURLs[i].getLength()>0; ++i) + { + pViewShell = dynamic_cast<SlideSorterViewShell*>( + pFrameworkHelper->GetViewShell(aPaneURLs[i]).get()); + } + } + catch (RuntimeException&) + {} + + return pViewShell; +} + + + + +Reference<drawing::XDrawSubController> SlideSorterViewShell::CreateSubController (void) +{ + Reference<drawing::XDrawSubController> xSubController; + + if (IsMainViewShell()) + { + // Create uno controller for the main view shell. + xSubController = Reference<drawing::XDrawSubController>( + new SdUnoSlideView ( + GetViewShellBase().GetDrawController(), + *mpSlideSorter, + *GetView())); + } + + return xSubController; +} + + + + +/** If there is a valid controller then create a new instance of + <type>AccessibleSlideSorterView</type>. Otherwise delegate this call + to the base class to return a default object (probably an empty + reference). +*/ +::com::sun::star::uno::Reference< + ::com::sun::star::accessibility::XAccessible> + SlideSorterViewShell::CreateAccessibleDocumentView (::sd::Window* pWindow) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + + // When the view is not set then the initialization is not yet complete + // and we can not yet provide an accessibility object. + if (mpView == NULL) + return NULL; + + return new ::accessibility::AccessibleSlideSorterView ( + *mpSlideSorter.get(), + pWindow->GetAccessibleParentWindow()->GetAccessible(), + pWindow); +} + + + + +SlideSorter& SlideSorterViewShell::GetSlideSorter (void) const +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + return *mpSlideSorter; +} + + + + +bool SlideSorterViewShell::RelocateToParentWindow (::Window* pParentWindow) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + return mpSlideSorter->RelocateToWindow(pParentWindow); +} + + + + +SfxUndoManager* SlideSorterViewShell::ImpGetUndoManager (void) const +{ + SfxShell* pObjectBar = GetViewShellBase().GetViewShellManager()->GetTopShell(); + if (pObjectBar != NULL) + { + // When it exists then return the undo manager of the currently + // active object bar. The object bar is missing when the + // SlideSorterViewShell is not the main view shell. + return pObjectBar->GetUndoManager(); + } + else + { + // Return the undo manager of this shell when there is no object or + // tool bar. + return const_cast<SlideSorterViewShell*>(this)->GetUndoManager(); + } +} + + + + +void SlideSorterViewShell::GetFocus (void) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().GetFocusManager().ShowFocus(); +} + + + + +void SlideSorterViewShell::LoseFocus (void) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().GetFocusManager().HideFocus(); +} + + + + +SdPage* SlideSorterViewShell::getCurrentPage(void) const +{ + // since SlideSorterViewShell::GetActualPage() currently also + // returns master pages, which is a wrong behaviour for GetActualPage(), + // we can just use that for now + return const_cast<SlideSorterViewShell*>(this)->GetActualPage(); +} + + + + +SdPage* SlideSorterViewShell::GetActualPage (void) +{ + SdPage* pCurrentPage = NULL; + + // 1. Try to get the current page from the view shell in the center pane + // (if we are that not ourself). + if ( ! IsMainViewShell()) + { + ::boost::shared_ptr<ViewShell> pMainViewShell = GetViewShellBase().GetMainViewShell(); + if (pMainViewShell.get() != NULL) + pCurrentPage = pMainViewShell->GetActualPage(); + } + + if (pCurrentPage == NULL) + { + model::SharedPageDescriptor pDescriptor ( + mpSlideSorter->GetController().GetCurrentSlideManager()->GetCurrentSlide()); + if (pDescriptor.get() != NULL) + pCurrentPage = pDescriptor->GetPage(); + } + + return pCurrentPage; +} + + + + +void SlideSorterViewShell::GetMenuState ( SfxItemSet& rSet) +{ + ViewShell::GetMenuState(rSet); + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().GetSlotManager()->GetMenuState(rSet); +} + + + + +void SlideSorterViewShell::GetClipboardState ( SfxItemSet& rSet) +{ + ViewShell::GetMenuState(rSet); + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().GetSlotManager()->GetClipboardState(rSet); +} + + + + +void SlideSorterViewShell::ExecCtrl (SfxRequest& rRequest) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().ExecCtrl(rRequest); +} + + + + +void SlideSorterViewShell::GetCtrlState (SfxItemSet& rSet) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().GetCtrlState(rSet); +} + + + + +void SlideSorterViewShell::FuSupport (SfxRequest& rRequest) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().FuSupport(rRequest); +} + + + + +/** We have to handle those slot calls here that need to have access to + private or protected members and methods of this class. +*/ +void SlideSorterViewShell::FuTemporary (SfxRequest& rRequest) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + switch (rRequest.GetSlot()) + { + case SID_MODIFYPAGE: + { + SdPage* pCurrentPage = GetActualPage(); + if (pCurrentPage != NULL) + mpImpl->ProcessModifyPageSlot ( + rRequest, + pCurrentPage, + mpSlideSorter->GetModel().GetPageType()); + Cancel(); + rRequest.Done (); + } + break; + + default: + mpSlideSorter->GetController().FuTemporary(rRequest); + break; + } +} + + + + +void SlideSorterViewShell::GetStatusBarState (SfxItemSet& rSet) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().GetStatusBarState(rSet); +} + + + + +void SlideSorterViewShell::FuPermanent (SfxRequest& rRequest) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().FuPermanent(rRequest); +} + + + + +void SlideSorterViewShell::GetAttrState (SfxItemSet& rSet) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().GetAttrState(rSet); +} + + + + +void SlideSorterViewShell::ExecStatusBar (SfxRequest& rRequest) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().ExecStatusBar(rRequest); +} + + + + +void SlideSorterViewShell::PrePaint() +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + if (mpSlideSorter.get() != NULL) + mpSlideSorter->GetController().PrePaint(); +} + + + + +void SlideSorterViewShell::Paint ( + const Rectangle& rBBox, + ::sd::Window* pWindow) +{ + SetActiveWindow (pWindow); + OSL_ASSERT(mpSlideSorter.get()!=NULL); + if (mpSlideSorter.get() != NULL) + mpSlideSorter->GetController().Paint(rBBox,pWindow); +} + + + + +void SlideSorterViewShell::ArrangeGUIElements (void) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->ArrangeGUIElements( + maViewPos, + maViewSize); +} + + + + +SvBorder SlideSorterViewShell::GetBorder (bool ) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + return mpSlideSorter->GetBorder(); +} + + + + +void SlideSorterViewShell::Command ( + const CommandEvent& rEvent, + ::sd::Window* pWindow) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + if ( ! mpSlideSorter->GetController().Command (rEvent, pWindow)) + ViewShell::Command (rEvent, pWindow); +} + + + + +void SlideSorterViewShell::ReadFrameViewData (FrameView* pFrameView) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + if (pFrameView != NULL) + { + view::SlideSorterView& rView (mpSlideSorter->GetView()); + + USHORT nSlidesPerRow (pFrameView->GetSlidesPerRow()); + if (nSlidesPerRow == 0 || ! IsMainViewShell()) + { + // When a value of 0 (automatic) is given or the the slide + // sorter is displayed in a side pane then we ignore the value + // of the frame view and adapt the number of columns + // automatically to the window width. + rView.GetLayouter().SetColumnCount(1,5); + } + else + rView.GetLayouter().SetColumnCount(nSlidesPerRow,nSlidesPerRow); + mpSlideSorter->GetController().Rearrange(true); + + // DrawMode for 'main' window + if (GetActiveWindow()->GetDrawMode() != pFrameView->GetDrawMode() ) + GetActiveWindow()->SetDrawMode( pFrameView->GetDrawMode() ); + } +} + + + + +void SlideSorterViewShell::WriteFrameViewData() +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + if (mpFrameView != NULL) + { + view::SlideSorterView& rView (mpSlideSorter->GetView()); + mpFrameView->SetSlidesPerRow((USHORT)rView.GetLayouter().GetColumnCount()); + + // DrawMode for 'main' window + if( mpFrameView->GetDrawMode() != GetActiveWindow()->GetDrawMode() ) + mpFrameView->SetDrawMode( GetActiveWindow()->GetDrawMode() ); + + SdPage* pActualPage = GetActualPage(); + if (pActualPage != NULL) + { + // The slide sorter is not expected to switch the current page + // other then by double clicks. That is handled seperatly. + // mpFrameView->SetSelectedPage((pActualPage->GetPageNum()- 1) / 2); + } + else + { + // We have no current page to set but at least we can make sure + // that the index of the frame view has a legal value. + if (mpFrameView->GetSelectedPage() >= mpSlideSorter->GetModel().GetPageCount()) + mpFrameView->SetSelectedPage((USHORT)mpSlideSorter->GetModel().GetPageCount()-1); + } + } +} + + + + +void SlideSorterViewShell::SetZoom (long int ) +{ + // Ignored. + // The zoom scale is adapted internally to fit a number of columns in + // the window. +} + +void SlideSorterViewShell::SetZoomRect (const Rectangle& rZoomRect) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + Size aPageSize (mpSlideSorter->GetView().GetPageBoundingBox( + 0, + view::SlideSorterView::CS_MODEL, + view::SlideSorterView::BBT_SHAPE).GetSize()); + + Rectangle aRect(rZoomRect); + + if (aRect.GetWidth() < aPageSize.Width()) + { + long nWidthDiff = (aPageSize.Width() - aRect.GetWidth()) / 2; + + aRect.Left() -= nWidthDiff; + aRect.Right() += nWidthDiff; + + if (aRect.Left() < 0) + { + aRect.SetPos(Point(0, aRect.Top())); + } + } + + if (aRect.GetHeight() < aPageSize.Height()) + { + long nHeightDiff = (aPageSize.Height() - aRect.GetHeight()) / 2; + + aRect.Top() -= nHeightDiff; + aRect.Bottom() += nHeightDiff; + + if (aRect.Top() < 0) + { + aRect.SetPos(Point(aRect.Left(), 0)); + } + } + + ViewShell::SetZoomRect(aRect); + + // #106268# + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM ); + GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER ); +} + + + + +void SlideSorterViewShell::UpdateScrollBars (void) +{ + // Do not call the overwritten method of the base class: We do all the + // scroll bar setup by ourselves. + mpSlideSorter->GetController().GetScrollBarManager().UpdateScrollBars (false); +} + + + + +void SlideSorterViewShell::StartDrag ( + const Point& rDragPt, + ::Window* pWindow ) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().GetClipboard().StartDrag ( + rDragPt, + pWindow); +} + + + + +void SlideSorterViewShell::DragFinished ( + sal_Int8 nDropAction) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().GetClipboard().DragFinished (nDropAction); +} + + + + +sal_Int8 SlideSorterViewShell::AcceptDrop ( + const AcceptDropEvent& rEvt, + DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, + USHORT nPage, + USHORT nLayer) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + return mpSlideSorter->GetController().GetClipboard().AcceptDrop ( + rEvt, + rTargetHelper, + pTargetWindow, + nPage, + nLayer); +} + + + + +sal_Int8 SlideSorterViewShell::ExecuteDrop ( + const ExecuteDropEvent& rEvt, + DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, + USHORT nPage, + USHORT nLayer) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + return mpSlideSorter->GetController().GetClipboard().ExecuteDrop ( + rEvt, + rTargetHelper, + pTargetWindow, + nPage, + nLayer); +} + + + + +::boost::shared_ptr<SlideSorterViewShell::PageSelection> + SlideSorterViewShell::GetPageSelection (void) const +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + return mpSlideSorter->GetController().GetPageSelector().GetPageSelection(); +} + + + + +void SlideSorterViewShell::SetPageSelection ( + const ::boost::shared_ptr<PageSelection>& rSelection) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().GetPageSelector().SetPageSelection(rSelection); +} + + + + +void SlideSorterViewShell::AddSelectionChangeListener ( + const Link& rCallback) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().GetSelectionManager()->AddSelectionChangeListener(rCallback); +} + + + + +void SlideSorterViewShell::RemoveSelectionChangeListener ( + const Link& rCallback) +{ + OSL_ASSERT(mpSlideSorter.get()!=NULL); + mpSlideSorter->GetController().GetSelectionManager()->RemoveSelectionChangeListener(rCallback); +} + + + +} } // end of namespace ::sd::slidesorter |