summaryrefslogtreecommitdiff
path: root/sd/source/ui/slidesorter/view/SlsButtonBar.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/slidesorter/view/SlsButtonBar.cxx')
-rw-r--r--sd/source/ui/slidesorter/view/SlsButtonBar.cxx1558
1 files changed, 0 insertions, 1558 deletions
diff --git a/sd/source/ui/slidesorter/view/SlsButtonBar.cxx b/sd/source/ui/slidesorter/view/SlsButtonBar.cxx
deleted file mode 100644
index 5c0adf49a..000000000
--- a/sd/source/ui/slidesorter/view/SlsButtonBar.cxx
+++ /dev/null
@@ -1,1558 +0,0 @@
-/*************************************************************************
- *
- * 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 "view/SlsButtonBar.hxx"
-
-#include "SlideSorter.hxx"
-#include "model/SlsPageDescriptor.hxx"
-#include "model/SlideSorterModel.hxx"
-#include "view/SlsTheme.hxx"
-#include "view/SlideSorterView.hxx"
-#include "view/SlsToolTip.hxx"
-#include "controller/SlideSorterController.hxx"
-#include "controller/SlsSlotManager.hxx"
-#include "controller/SlsCurrentSlideManager.hxx"
-#include "controller/SlsPageSelector.hxx"
-#include "controller/SlsAnimator.hxx"
-#include "controller/SlsAnimationFunction.hxx"
-#include "app.hrc"
-#include "drawdoc.hxx"
-#include <svx/svxids.hrc>
-#include <sfx2/dispatch.hxx>
-#include <vcl/bmpacc.hxx>
-#include <vcl/virdev.hxx>
-#include <basegfx/polygon/b2dpolygontools.hxx>
-#include <basegfx/polygon/b2dpolygon.hxx>
-#include <com/sun/star/presentation/XPresentation2.hpp>
-#include <boost/bind.hpp>
-
-using ::com::sun::star::uno::Any;
-using ::com::sun::star::uno::Reference;
-using ::com::sun::star::uno::Sequence;
-using ::com::sun::star::beans::PropertyValue;
-using ::com::sun::star::presentation::XPresentation2;
-
-namespace sd { namespace slidesorter { namespace view {
-
-/** Base class for the painter of the background bar onto which the buttons
- are painted. It also provides some size information.
-*/
-class ButtonBar::BackgroundTheme
-{
-public:
- BackgroundTheme(
- const ::boost::shared_ptr<Theme>& rpTheme,
- const ::std::vector<SharedButton>& rButtons);
- /** Set the preview bounding box, the maximal area in which to display
- buttons. A call to this method triggers a call to Layout().
- */
- void SetPreviewBoundingBox (const Rectangle& rPreviewBoundingBox);
- Button::IconSize GetIconSize (void) const;
-
- virtual BitmapEx CreateBackground (
- const OutputDevice& rTemplateDevice,
- const bool bIsButtonDown) const = 0;
- virtual Point GetBackgroundLocation (void) = 0;
- virtual Rectangle GetButtonArea (void) = 0;
-
-protected:
- ::boost::shared_ptr<Theme> mpTheme;
- Rectangle maPreviewBoundingBox;
- Size maMinimumLargeButtonAreaSize;
- Size maMinimumMediumButtonAreaSize;
- Size maMinimumSmallButtonAreaSize;
- Button::IconSize meIconSize;
-
- virtual void Layout (void) = 0;
-
-private:
- void UpdateMinimumIconSizes(const ::std::vector<SharedButton>& rButtons);
-};
-
-
-namespace {
- /** Rectangular button bar that covers the whole width of the preview.
- */
- class RectangleBackgroundTheme : public ButtonBar::BackgroundTheme
- {
- public:
- RectangleBackgroundTheme(
- const ::boost::shared_ptr<Theme>& rpTheme,
- const ::std::vector<SharedButton>& rButtons);
- virtual BitmapEx CreateBackground (
- const OutputDevice& rTemplateDevice,
- const bool bIsButtonDown) const;
- virtual Point GetBackgroundLocation (void);
- virtual Rectangle GetButtonArea (void);
- protected:
- virtual void Layout (void);
- private:
- sal_Int32 mnBarHeight;
- };
-
- /** Button bar is composed of three images, the left and right end of
- the bar and the center image. Buttons are only placed over the
- center image. The center image is painted as is, it is not scaled.
- */
- class BitmapBackgroundTheme : public ButtonBar::BackgroundTheme
- {
- public:
- BitmapBackgroundTheme(
- const ::boost::shared_ptr<Theme>& rpTheme,
- const ::std::vector<SharedButton>& rButtons);
- virtual BitmapEx CreateBackground (
- const OutputDevice& rTemplateDevice,
- const bool bIsButtonDown) const;
- virtual Point GetBackgroundLocation (void);
- virtual Rectangle GetButtonArea (void);
- protected:
- virtual void Layout (void);
- private:
- Rectangle maButtonArea;
- Point maBackgroundLocation;
- };
-
- /** The source mask is essentially multiplied with the given alpha value.
- The result is writen to the result mask.
- */
- void AdaptTransparency (AlphaMask& rMask, const AlphaMask& rSourceMask, const double nAlpha)
- {
- BitmapWriteAccess* pBitmap = rMask.AcquireWriteAccess();
- const BitmapReadAccess* pSourceBitmap = const_cast<AlphaMask&>(rSourceMask).AcquireReadAccess();
-
- if (pBitmap!=NULL && pSourceBitmap!=NULL)
- {
- const sal_Int32 nWidth (pBitmap->Width());
- const sal_Int32 nHeight (pBitmap->Height());
-
- for (sal_Int32 nY = 0; nY<nHeight; ++nY)
- for (sal_Int32 nX = 0; nX<nWidth; ++nX)
- {
- const sal_uInt8 nValue (255 - pSourceBitmap->GetPixel(nY, nX).GetBlueOrIndex());
- const sal_uInt8 nNewValue (static_cast<sal_uInt8>(nValue * (1-nAlpha)));
- pBitmap->SetPixel(nY, nX, 255-nNewValue);
- }
- }
- }
-
-} // end of anonymous namespace
-
-
-//===== ButtonBar::Lock =======================================================
-
-ButtonBar::Lock::Lock (SlideSorter& rSlideSorter)
- : mrButtonBar(rSlideSorter.GetView().GetButtonBar())
-{
- mrButtonBar.AcquireLock();
-}
-
-
-
-
-ButtonBar::Lock::~Lock (void)
-{
- mrButtonBar.ReleaseLock();
-}
-
-
-
-
-//===== ButtonBar =============================================================
-
-ButtonBar::ButtonBar (SlideSorter& rSlideSorter)
- : mrSlideSorter(rSlideSorter),
- maPageObjectSize(0,0),
- maButtonBoundingBox(),
- maBackgroundLocation(),
- mpDescriptor(),
- mbIsExcluded(false),
- mpButtonUnderMouse(),
- mpDownButton(),
- maRegularButtons(),
- maExcludedButtons(),
- maNormalBackground(),
- maButtonDownBackground(),
- mbIsMouseOverBar(false),
- mpBackgroundTheme(),
- mnLockCount(0)
-{
- HandleDataChangeEvent();
-}
-
-
-
-
-ButtonBar::~ButtonBar (void)
-{
-}
-
-
-
-
-void ButtonBar::ProcessButtonDownEvent (
- const model::SharedPageDescriptor& rpDescriptor,
- const Point aMouseModelLocation)
-{
- SetButtonUnderMouse(GetButtonAt(aMouseModelLocation));
- if (mpButtonUnderMouse)
- mpButtonUnderMouse->SetState(Button::State_Down);
- mpDownButton = mpButtonUnderMouse;
-
- mrSlideSorter.GetView().RequestRepaint(rpDescriptor);
-}
-
-
-
-
-void ButtonBar::ProcessButtonUpEvent (
- const model::SharedPageDescriptor& rpDescriptor,
- const Point aMouseModelLocation)
-{
- SetButtonUnderMouse(GetButtonAt(aMouseModelLocation));
- if (mpButtonUnderMouse)
- {
- mpButtonUnderMouse->SetState(Button::State_Hover);
- if (mpButtonUnderMouse == mpDownButton)
- {
- // This is done only when the buttons are sufficiently visible.
- if (mpDescriptor->GetVisualState().GetButtonAlpha()<0.7)
- {
- mpButtonUnderMouse->ProcessClick(mpDescriptor);
- mbIsExcluded = mpDescriptor->HasState(model::PageDescriptor::ST_Excluded);
- ProcessMouseMotionEvent (rpDescriptor, aMouseModelLocation, false);
- }
- }
- }
- mpDownButton.reset();
- mrSlideSorter.GetView().RequestRepaint(rpDescriptor);
-}
-
-
-
-
-void ButtonBar::ProcessMouseMotionEvent (
- const model::SharedPageDescriptor& rpDescriptor,
- const Point aMouseModelLocation,
- const bool bIsMouseButtonDown)
-{
- model::SharedPageDescriptor pOldDescriptor (mpDescriptor);
- bool bPageHasChanged (false);
- bool bButtonHasChanged (false);
- bool bButtonStateHasChanged (false);
-
- // Update the page object for which to manage the buttons.
- bPageHasChanged = SetPage(rpDescriptor);
- mbIsMouseOverBar = IsMouseOverBar(aMouseModelLocation);
-
- // Update button under mouse.
- if (rpDescriptor)
- {
- bButtonHasChanged = SetButtonUnderMouse(GetButtonAt(aMouseModelLocation));
-
- if (mpButtonUnderMouse)
- {
- // When the mouse button is down, mark the button under the
- // mouse only as pressed when it is the same button the mouse
- // button was pressed over, and where the button release would
- // lead to a click action.
- if (bIsMouseButtonDown)
- {
- if (mpButtonUnderMouse==mpDownButton)
- bButtonStateHasChanged = mpButtonUnderMouse->SetState(Button::State_Down);
- }
- else
- bButtonStateHasChanged = mpButtonUnderMouse->SetState(Button::State_Hover);
- }
- }
-
- // Show a quick help text when the mouse is over a button.
- if (bButtonHasChanged)
- {
- SharedSdWindow pWindow (mrSlideSorter.GetContentWindow());
- if (pWindow)
- {
- if (mpButtonUnderMouse)
- mrSlideSorter.GetView().GetToolTip().ShowHelpText(mpButtonUnderMouse->GetHelpText());
- else
- mrSlideSorter.GetView().GetToolTip().ShowDefaultHelpText();
- }
- }
-
- if (bPageHasChanged || bButtonHasChanged || bButtonStateHasChanged)
- {
- if (pOldDescriptor)
- mrSlideSorter.GetView().RequestRepaint(pOldDescriptor);
- if (mpDescriptor && pOldDescriptor!=mpDescriptor)
- mrSlideSorter.GetView().RequestRepaint(mpDescriptor);
- }
-}
-
-
-
-
-void ButtonBar::ResetPage (void)
-{
- SetPage(model::SharedPageDescriptor());
-}
-
-
-
-
-bool ButtonBar::SetPage (const model::SharedPageDescriptor& rpDescriptor)
-{
- if (mpDescriptor != rpDescriptor)
- {
- mpDescriptor = rpDescriptor;
-
- if (mpDescriptor)
- mbIsExcluded = mpDescriptor->HasState(model::PageDescriptor::ST_Excluded);
- else
- mbIsExcluded = false;
- SetButtonUnderMouse();
- mpDownButton.reset();
-
- return true;
- }
- else
- return false;
-}
-
-
-
-
-sal_Int32 ButtonBar::GetButtonCount (const bool bIsExcluded) const
-{
- if (bIsExcluded)
- return maExcludedButtons.size();
- else
- return maRegularButtons.size();
-}
-
-
-
-
-::boost::shared_ptr<Button> ButtonBar::GetButton (
- const bool bIsExcluded,
- const sal_Int32 nIndex) const
-{
- const ::std::vector<boost::shared_ptr<Button> >& rButtons (bIsExcluded
- ? maExcludedButtons
- : maRegularButtons);
-
- if (nIndex<0 || sal_uInt32(nIndex)>=rButtons.size())
- {
- OSL_ASSERT(nIndex<0 || sal_uInt32(nIndex)>=rButtons.size());
- return ::boost::shared_ptr<Button>();
- }
- else
- return rButtons[sal_uInt32(nIndex)];
-}
-
-
-
-
-SharedButton ButtonBar::GetButtonAt (const Point aModelLocation)
-{
- if (IsMouseOverBar(aModelLocation))
- {
- const Point aLocalLocation (aModelLocation - mpDescriptor->GetBoundingBox().TopLeft());
- ::std::vector<SharedButton>& rButtons (
- mbIsExcluded ? maExcludedButtons : maRegularButtons);
- for (sal_uInt32 nIndex=0; nIndex<rButtons.size(); ++nIndex)
- {
- if (rButtons[sal_uInt32(nIndex)]->GetBoundingBox().IsInside(aLocalLocation))
- {
- if (rButtons[sal_uInt32(nIndex)]->IsEnabled())
- return rButtons[sal_uInt32(nIndex)];
- else
- return SharedButton();
- }
- }
- }
-
- return SharedButton();
-}
-
-
-
-
-bool ButtonBar::IsMouseOverBar (void) const
-{
- return mbIsMouseOverBar;
-}
-
-
-
-
-bool ButtonBar::SetButtonUnderMouse (const SharedButton& rButton)
-{
- if (mpButtonUnderMouse != rButton)
- {
- if (mpButtonUnderMouse)
- mpButtonUnderMouse->SetState(Button::State_Normal);
-
- mpButtonUnderMouse = rButton;
-
- return true;
- }
- else
- return false;
-}
-
-
-
-
-void ButtonBar::Paint (
- OutputDevice& rDevice,
- const model::SharedPageDescriptor& rpDescriptor)
-{
- if ( ! rpDescriptor)
- return;
-
- const double nButtonBarAlpha (rpDescriptor->GetVisualState().GetButtonBarAlpha());
- if (nButtonBarAlpha >= 1)
- return;
-
- LayoutButtons(rpDescriptor->GetBoundingBox().GetSize());
-
- const Point aOffset (rpDescriptor->GetBoundingBox().TopLeft());
-
- // Paint the background.
- PaintButtonBackground(rDevice, rpDescriptor, aOffset);
-
- // Paint the buttons.
- const ::std::vector<SharedButton>& rButtons (
- rpDescriptor->HasState(model::PageDescriptor::ST_Excluded)
- ? maExcludedButtons
- : maRegularButtons);
-
-
- const double nButtonAlpha (rpDescriptor->GetVisualState().GetButtonAlpha());
- for (sal_uInt32 nIndex=0; nIndex<rButtons.size(); ++nIndex)
- rButtons[nIndex]->Paint(
- rDevice,
- aOffset,
- nButtonAlpha,
- mrSlideSorter.GetTheme());
-}
-
-
-
-
-bool ButtonBar::IsMouseOverButton (void) const
-{
- return mpButtonUnderMouse;
-}
-
-
-
-
-void ButtonBar::PaintButtonBackground (
- OutputDevice& rDevice,
- const model::SharedPageDescriptor& rpDescriptor,
- const Point aOffset)
-{
- BitmapEx* pBitmap = NULL;
- if (maButtonDownBackground.IsEmpty() || maNormalBackground.IsEmpty())
- {
- if (mpBackgroundTheme)
- {
- maButtonDownBackground = mpBackgroundTheme->CreateBackground(rDevice, true);
- maNormalBackground = mpBackgroundTheme->CreateBackground(rDevice, false);
- }
- }
- if (mpButtonUnderMouse && mpButtonUnderMouse->IsDown())
- pBitmap = &maButtonDownBackground;
- else
- pBitmap = &maNormalBackground;
- if (pBitmap != NULL)
- {
- AlphaMask aMask (pBitmap->GetSizePixel());
- AdaptTransparency(
- aMask,
- pBitmap->GetAlpha(),
- rpDescriptor->GetVisualState().GetButtonBarAlpha());
- rDevice.DrawBitmapEx(maBackgroundLocation+aOffset, BitmapEx(pBitmap->GetBitmap(), aMask));
- }
-}
-
-
-
-
-bool ButtonBar::IsMouseOverBar (const Point aModelLocation) const
-{
- if ( ! mpDescriptor || ! mpDescriptor->GetBoundingBox().IsInside(aModelLocation))
- return false;
-
- if ( ! maButtonBoundingBox.IsInside(aModelLocation - mpDescriptor->GetBoundingBox().TopLeft()))
- return false;
-
- return true;
-}
-
-
-
-
-void ButtonBar::RequestLayout (void)
-{
- maPageObjectSize = Size(0,0);
-}
-
-
-
-
-void ButtonBar::LayoutButtons (const Size aPageObjectSize)
-{
- if (maPageObjectSize != aPageObjectSize)
- {
- maPageObjectSize = aPageObjectSize;
-
- if (mpBackgroundTheme)
- {
- mpBackgroundTheme->SetPreviewBoundingBox(
- mrSlideSorter.GetView().GetLayouter().GetPageObjectLayouter()->GetBoundingBox(
- Point(0,0),
- PageObjectLayouter::Preview,
- PageObjectLayouter::ModelCoordinateSystem));
- LayoutButtons();
- }
-
- // Release the background bitmaps so that on the next paint
- // they are created anew in the right size.
- maNormalBackground.SetEmpty();
- maButtonDownBackground.SetEmpty();
- }
-}
-
-
-
-
-bool ButtonBar::LayoutButtons (void)
-{
- const sal_Int32 nGap (mrSlideSorter.GetTheme()->GetIntegerValue(Theme::Integer_ButtonGap));
- const sal_Int32 nBorder (mrSlideSorter.GetTheme()->GetIntegerValue(Theme::Integer_ButtonBorder));
-
- const Button::IconSize eIconSize (mpBackgroundTheme->GetIconSize());
-
- // Tell buttons which size they are.
- for (sal_uInt32 nIndex=0; nIndex<maExcludedButtons.size(); ++nIndex)
- maExcludedButtons[nIndex]->SetIconSize(eIconSize);
- for (sal_uInt32 nIndex=0; nIndex<maRegularButtons.size(); ++nIndex)
- maRegularButtons[nIndex]->SetIconSize(eIconSize);
-
- // Determine maximal height and total width of the buttons.
- // Start with the buttons used for the excluded state.
- sal_Int32 nMaximumHeight (0);
- sal_Int32 nExcludedTotalWidth ((maExcludedButtons.size()-1) * nGap + 2*nBorder);
- for (sal_uInt32 nIndex=0; nIndex<maExcludedButtons.size(); ++nIndex)
- {
- const Size aSize (maExcludedButtons[nIndex]->GetSize());
- if (aSize.Height() > nMaximumHeight)
- nMaximumHeight = aSize.Height();
- nExcludedTotalWidth += aSize.Width();
- }
-
- // Do the same for the regular buttons.
- sal_Int32 nRegularTotalWidth ((maRegularButtons.size()-1) * nGap + 2*nBorder);
- for (sal_uInt32 nIndex=0; nIndex<maRegularButtons.size(); ++nIndex)
- {
- const Size aSize (maRegularButtons[nIndex]->GetSize());
- if (aSize.Height() > nMaximumHeight)
- nMaximumHeight = aSize.Height();
- nRegularTotalWidth += aSize.Width();
- }
- nMaximumHeight += 2*nBorder;
-
- // Set up the bounding box of the button bar.
- maButtonBoundingBox = mpBackgroundTheme->GetButtonArea();
- maBackgroundLocation = mpBackgroundTheme->GetBackgroundLocation();
- if (mrSlideSorter.GetTheme()->GetIntegerValue(Theme::Integer_ButtonPaintType) == 1)
- {
- // Center the buttons.
- maButtonBoundingBox.Left() += (maButtonBoundingBox.GetWidth() - nRegularTotalWidth)/2;
- maButtonBoundingBox.Right() = maButtonBoundingBox.Left() + nRegularTotalWidth - 1;
- }
-
- // Place the buttons.
- Rectangle aBox (maButtonBoundingBox);
- aBox.Right() -= nBorder;
- for (sal_Int32 nIndex=maRegularButtons.size()-1; nIndex>=0; --nIndex)
- {
- maRegularButtons[nIndex]->Place(aBox);
- aBox.Right() = maRegularButtons[nIndex]->GetBoundingBox().Left() - nGap;
- }
-
- // For slides excluded from the show there is only one icon placed
- // exactly like the second of the regular icons.
- if (maRegularButtons.size()>=2 && maExcludedButtons.size()>=1)
- {
- aBox = maRegularButtons[1]->GetBoundingBox();
- maExcludedButtons[0]->Place(aBox);
- }
-
- // We return true only when there is no inactive button.
- for (sal_uInt32 nIndex=0; nIndex<maExcludedButtons.size(); ++nIndex)
- if ( ! maExcludedButtons[nIndex]->IsActive())
- return false;
- for (sal_uInt32 nIndex=0; nIndex<maRegularButtons.size(); ++nIndex)
- if ( ! maRegularButtons[nIndex]->IsActive())
- return false;
-
- return true;
-}
-
-
-
-
-void ButtonBar::RequestFadeIn (
- const model::SharedPageDescriptor& rpDescriptor,
- const bool bAnimate)
-{
- if ( ! rpDescriptor)
- return;
- if (mnLockCount > 0)
- return;
-
- const double nMinAlpha (0);
- if ( ! bAnimate)
- {
- rpDescriptor->GetVisualState().SetButtonAlpha(nMinAlpha);
- rpDescriptor->GetVisualState().SetButtonBarAlpha(nMinAlpha);
- }
- else
- StartFadeAnimation(rpDescriptor, nMinAlpha, true);
-}
-
-
-
-
-void ButtonBar::RequestFadeOut (
- const model::SharedPageDescriptor& rpDescriptor,
- const bool bAnimate)
-{
- if ( ! rpDescriptor)
- return;
- if (mnLockCount > 0)
- return;
-
- const double nMaxAlpha (1);
- if ( ! bAnimate)
- {
- rpDescriptor->GetVisualState().SetButtonAlpha(nMaxAlpha);
- rpDescriptor->GetVisualState().SetButtonBarAlpha(nMaxAlpha);
- }
- else
- StartFadeAnimation(rpDescriptor, nMaxAlpha, false);
-}
-
-
-
-
-bool ButtonBar::IsVisible (const model::SharedPageDescriptor& rpDescriptor)
-{
- const double nMaxAlpha (1);
- return rpDescriptor && rpDescriptor->GetVisualState().GetButtonBarAlpha() < nMaxAlpha;
-}
-
-
-
-
-void ButtonBar::HandleDataChangeEvent (void)
-{
- maExcludedButtons.clear();
- maExcludedButtons.push_back(::boost::shared_ptr<Button>(new UnhideButton(mrSlideSorter)));
-
- maRegularButtons.clear();
- maRegularButtons.push_back(::boost::shared_ptr<Button>(new StartShowButton(mrSlideSorter)));
- maRegularButtons.push_back(::boost::shared_ptr<Button>(new HideButton(mrSlideSorter)));
- maRegularButtons.push_back(::boost::shared_ptr<Button>(new DuplicateButton(mrSlideSorter)));
-
- mpBackgroundTheme.reset(
- new BitmapBackgroundTheme(
- mrSlideSorter.GetTheme(),
- maRegularButtons));
-
- // Force layout on next Paint().
- maPageObjectSize = Size(0,0);
-}
-
-
-
-
-void ButtonBar::StartFadeAnimation (
- const model::SharedPageDescriptor& rpDescriptor,
- const double nTargetAlpha,
- const bool bFadeIn)
-{
- model::SharedPageDescriptor pDescriptor (rpDescriptor);
-
- const double nCurrentButtonAlpha (pDescriptor->GetVisualState().GetButtonAlpha());
- const double nCurrentButtonBarAlpha (pDescriptor->GetVisualState().GetButtonBarAlpha());
-
- // Stop a running animation.
- const controller::Animator::AnimationId nId (
- pDescriptor->GetVisualState().GetButtonAlphaAnimationId());
- if (nId != controller::Animator::NotAnAnimationId)
- mrSlideSorter.GetController().GetAnimator()->RemoveAnimation(nId);
-
- // Prepare the blending functors that translate [0,1] animation
- // times into alpha values of buttons and button bar.
- const ::boost::function<double(double)> aButtonBlendFunctor (
- ::boost::bind(
- controller::AnimationFunction::Blend,
- nCurrentButtonAlpha,
- nTargetAlpha,
- ::boost::bind(controller::AnimationFunction::Linear, _1)));
- const ::boost::function<double(double)> aButtonBarBlendFunctor (
- ::boost::bind(
- controller::AnimationFunction::Blend,
- nCurrentButtonBarAlpha,
- nTargetAlpha,
- ::boost::bind(controller::AnimationFunction::Linear, _1)));
-
- // Delay the fade in a little bit when the buttons are not visible at
- // all so that we do not leave a trail of half-visible buttons when the
- // mouse is moved across the screen. No delay on fade out or when the
- // buttons are already showing. Fade out is faster than fade in.
- const double nDelay (nCurrentButtonBarAlpha>0 && nCurrentButtonBarAlpha<1
- ? 0
- : (mrSlideSorter.GetTheme()->GetIntegerValue(bFadeIn
- ? Theme::Integer_ButtonFadeInDelay
- : Theme::Integer_ButtonFadeOutDelay)));
- const double nDuration (mrSlideSorter.GetTheme()->GetIntegerValue(bFadeIn
- ? Theme::Integer_ButtonFadeInDuration
- : Theme::Integer_ButtonFadeOutDuration));
- pDescriptor->GetVisualState().SetButtonAlphaAnimationId(
- mrSlideSorter.GetController().GetAnimator()->AddAnimation(
- ::boost::bind(
- controller::AnimationFunction::ApplyButtonAlphaChange,
- pDescriptor,
- ::boost::ref(mrSlideSorter.GetView()),
- ::boost::bind(aButtonBlendFunctor, _1),
- ::boost::bind(aButtonBarBlendFunctor, _1)),
- static_cast<sal_Int32>(nDelay),
- static_cast<sal_Int32>(nDuration),
- ::boost::bind(
- &model::VisualState::SetButtonAlphaAnimationId,
- ::boost::ref(pDescriptor->GetVisualState()),
- controller::Animator::NotAnAnimationId)
- ));
-}
-
-
-
-
-void ButtonBar::AcquireLock (void)
-{
- if (mnLockCount == 0 && mpDescriptor)
- RequestFadeOut(mpDescriptor, true);
-
- ++mnLockCount;
-}
-
-
-
-
-void ButtonBar::ReleaseLock (void)
-{
- --mnLockCount;
-
- if (mnLockCount == 0 && mpDescriptor)
- RequestFadeIn(mpDescriptor, true);
-}
-
-
-
-
-//===== BackgroundTheme =====================================================
-
-ButtonBar::BackgroundTheme::BackgroundTheme (
- const ::boost::shared_ptr<Theme>& rpTheme,
- const ::std::vector<SharedButton>& rButtons)
- : mpTheme(rpTheme)
-{
- UpdateMinimumIconSizes(rButtons);
-}
-
-
-
-
-void ButtonBar::BackgroundTheme::SetPreviewBoundingBox (const Rectangle& rPreviewBoundingBox)
-{
- maPreviewBoundingBox = rPreviewBoundingBox;
- Layout();
-}
-
-
-
-
-void ButtonBar::BackgroundTheme::UpdateMinimumIconSizes (
- const ::std::vector<SharedButton>& rButtons)
-{
- OSL_ASSERT(mpTheme);
-
- sal_Int32 nMaximumHeightLarge (0);
- sal_Int32 nMaximumHeightMedium (0);
- sal_Int32 nMaximumHeightSmall (0);
- const sal_Int32 nGap (mpTheme->GetIntegerValue(Theme::Integer_ButtonGap));
- const sal_Int32 nBorder (mpTheme->GetIntegerValue(Theme::Integer_ButtonBorder));
- sal_Int32 nTotalWidthLarge ((rButtons.size()-1) * nGap + 2*nBorder);
- sal_Int32 nTotalWidthMedium ((rButtons.size()-1) * nGap + 2*nBorder);
- sal_Int32 nTotalWidthSmall ((rButtons.size()-1) * nGap + 2*nBorder);
- for (sal_uInt32 nIndex=0; nIndex<rButtons.size(); ++nIndex)
- {
- // Update large size.
- Size aSize = rButtons[nIndex]->GetSize(Button::IconSize_Large);
- if (aSize.Height() > nMaximumHeightLarge)
- nMaximumHeightLarge = aSize.Height();
- nTotalWidthLarge += aSize.Width();
-
- // Update medium size.
- aSize = rButtons[nIndex]->GetSize(Button::IconSize_Medium);
- if (aSize.Height() > nMaximumHeightMedium)
- nMaximumHeightMedium = aSize.Height();
- nTotalWidthMedium += aSize.Width();
-
- // Update small size.
- aSize = rButtons[nIndex]->GetSize(Button::IconSize_Small);
- if (aSize.Height() > nMaximumHeightSmall)
- nMaximumHeightSmall = aSize.Height();
- nTotalWidthSmall += aSize.Width();
- }
- maMinimumLargeButtonAreaSize = Size(nTotalWidthLarge, nMaximumHeightLarge+2*nBorder);
- maMinimumMediumButtonAreaSize = Size(nTotalWidthMedium, nMaximumHeightMedium+2*nBorder);
- maMinimumSmallButtonAreaSize = Size(nTotalWidthSmall, nMaximumHeightSmall+2*nBorder);
-}
-
-
-
-
-Button::IconSize ButtonBar::BackgroundTheme::GetIconSize (void) const
-{
- return meIconSize;
-}
-
-
-
-
-//===== RectangleBackgroundTheme ============================================
-
-RectangleBackgroundTheme::RectangleBackgroundTheme (
- const ::boost::shared_ptr<Theme>& rpTheme,
- const ::std::vector<SharedButton>& rButtons)
- : BackgroundTheme(rpTheme, rButtons),
- mnBarHeight(0)
-{
-}
-
-
-
-
-BitmapEx RectangleBackgroundTheme::CreateBackground (
- const OutputDevice& rTemplateDevice,
- const bool bIsButtonDown) const
-{
- OSL_ASSERT(mpTheme);
-
- // Setup background color.
- Color aTopFillColor (mpTheme->GetGradientColor(
- Theme::Gradient_ButtonBackground,
- Theme::Fill1));
- Color aTopBorderColor (mpTheme->GetGradientColor(
- Theme::Gradient_ButtonBackground,
- Theme::Border1));
- Color aBottomFillColor (mpTheme->GetGradientColor(
- Theme::Gradient_ButtonBackground,
- Theme::Fill2));
- Color aBottomBorderColor (mpTheme->GetGradientColor(
- Theme::Gradient_ButtonBackground,
- Theme::Border2));
- if (bIsButtonDown)
- {
- aTopFillColor.DecreaseLuminance(50);
- aTopBorderColor.DecreaseLuminance(50);
- aBottomFillColor.DecreaseLuminance(50);
- aBottomBorderColor.DecreaseLuminance(50);
- }
-
- const int nWidth (maPreviewBoundingBox.GetWidth()+2);
- const int nHeight (mnBarHeight);
- const int nCenter (nHeight / 2);
-
- VirtualDevice aDevice (rTemplateDevice, 0, 8);
- aDevice.SetOutputSizePixel(Size(nWidth,nHeight));
-
- // Fill upper and lower half.
- aDevice.SetLineColor();
- aDevice.SetFillColor(aTopFillColor);
- aDevice.DrawRect(Rectangle(0,0,nWidth-1,nCenter));
- aDevice.SetFillColor(aBottomFillColor);
- aDevice.DrawRect(Rectangle(0,nCenter,nWidth-1,nHeight-1));
-
- // Draw border.
- aDevice.SetFillColor();
- aDevice.SetLineColor(aTopBorderColor);
- aDevice.DrawLine(Point(0,nCenter),Point(0,0));
- aDevice.DrawLine(Point(0,0), Point(nWidth-1,0));
- aDevice.DrawLine(Point(nWidth-1,0),Point(nWidth-1,nCenter));
- aDevice.SetLineColor(aBottomBorderColor);
- aDevice.DrawLine(Point(0,nCenter),Point(0,nHeight-1));
- aDevice.DrawLine(Point(0,nHeight-1), Point(nWidth-1,nHeight-1));
- aDevice.DrawLine(Point(nWidth-1,nHeight-1),Point(nWidth-1,nCenter));
-
- return aDevice.GetBitmapEx(Point(0,0), Size(nWidth,nHeight));
-}
-
-
-
-
-Point RectangleBackgroundTheme::GetBackgroundLocation (void)
-{
- return Point(
- maPreviewBoundingBox.Left()-1,
- maPreviewBoundingBox.Bottom() - mnBarHeight + 2);
-}
-
-
-
-
-Rectangle RectangleBackgroundTheme::GetButtonArea (void)
-{
- return Rectangle(
- maPreviewBoundingBox.Left(),
- maPreviewBoundingBox.Bottom() - mnBarHeight + 2,
- maPreviewBoundingBox.Right(),
- maPreviewBoundingBox.Bottom());
-}
-
-
-
-
-void RectangleBackgroundTheme::Layout (void)
-{
- if (maPreviewBoundingBox.GetWidth() < maMinimumLargeButtonAreaSize.Width())
- if (maPreviewBoundingBox.GetWidth() < maMinimumMediumButtonAreaSize.Width())
- {
- meIconSize = Button::IconSize_Small;
- mnBarHeight = maMinimumSmallButtonAreaSize.Height();
- }
- else
- {
- meIconSize = Button::IconSize_Medium;
- mnBarHeight = maMinimumMediumButtonAreaSize.Height();
- }
- else
- {
- meIconSize = Button::IconSize_Large;
- mnBarHeight = maMinimumLargeButtonAreaSize.Height();
- }
-}
-
-
-
-
-//===== BitmapBackgroundTheme =================================================
-
-BitmapBackgroundTheme::BitmapBackgroundTheme (
- const ::boost::shared_ptr<Theme>& rpTheme,
- const ::std::vector<SharedButton>& rButtons)
- : BackgroundTheme(rpTheme, rButtons),
- maButtonArea(),
- maBackgroundLocation()
-{
-}
-
-
-
-
-BitmapEx BitmapBackgroundTheme::CreateBackground (
- const OutputDevice& rTemplateDevice,
- const bool bIsButtonDown) const
-{
- (void)rTemplateDevice;
- (void)bIsButtonDown;
-
- OSL_ASSERT(mpTheme);
-
- // Get images.
- switch (meIconSize)
- {
- case Button::IconSize_Large:
- default:
- return mpTheme->GetIcon(Theme::Icon_ButtonBarLarge);
-
- case Button::IconSize_Medium:
- return mpTheme->GetIcon(Theme::Icon_ButtonBarMedium);
-
- case Button::IconSize_Small:
- return mpTheme->GetIcon(Theme::Icon_ButtonBarSmall);
- }
-}
-
-
-
-
-Point BitmapBackgroundTheme::GetBackgroundLocation (void)
-{
- return maBackgroundLocation;
-}
-
-
-
-
-Rectangle BitmapBackgroundTheme::GetButtonArea (void)
-{
- return maButtonArea;
-}
-
-
-
-
-void BitmapBackgroundTheme::Layout (void)
-{
- Size aImageSize (mpTheme->GetIcon(Theme::Icon_ButtonBarLarge).GetSizePixel());
- if (aImageSize.Width() >= maPreviewBoundingBox.GetWidth())
- {
- aImageSize = mpTheme->GetIcon(Theme::Icon_ButtonBarMedium).GetSizePixel();
- if (aImageSize.Width() >= maPreviewBoundingBox.GetWidth())
- {
- meIconSize = Button::IconSize_Small;
- aImageSize = mpTheme->GetIcon(Theme::Icon_ButtonBarSmall).GetSizePixel();
- }
- else
- meIconSize = Button::IconSize_Medium;
- }
- else
- {
- meIconSize = Button::IconSize_Large;
- }
-
- maBackgroundLocation = Point(
- maPreviewBoundingBox.Left()
- + (maPreviewBoundingBox.GetWidth()-aImageSize.Width())/2,
- maPreviewBoundingBox.Bottom() - aImageSize.Height());
- maButtonArea = Rectangle(maBackgroundLocation, aImageSize);
-}
-
-
-
-
-//===== Button ================================================================
-
-Button::Button (
- SlideSorter& rSlideSorter,
- const ::rtl::OUString& rsHelpText)
- : mrSlideSorter(rSlideSorter),
- meState(State_Normal),
- maBoundingBox(),
- msHelpText(rsHelpText),
- mbIsActive(false),
- meIconSize(IconSize_Large)
-{
-}
-
-
-
-
-Button::~Button (void)
-{
-}
-
-
-
-
-bool Button::SetState (const State eState)
-{
- if (meState != eState)
- {
- meState = eState;
- return true;
- }
- else
- return false;
-}
-
-
-
-
-Button::State Button::GetState (void) const
-{
- return meState;
-}
-
-
-
-
-Rectangle Button::GetBoundingBox (void) const
-{
- if (mbIsActive)
- return maBoundingBox;
- else
- return Rectangle();
-}
-
-
-
-
-::rtl::OUString Button::GetHelpText (void) const
-{
- if (mbIsActive)
- return msHelpText;
- else
- return ::rtl::OUString();
-}
-
-
-
-
-bool Button::IsDown (void) const
-{
- return mbIsActive && meState==State_Down;
-}
-
-
-
-
-void Button::SetActiveState (const bool bIsActive)
-{
- mbIsActive = bIsActive;
-}
-
-
-
-
-bool Button::IsActive (void) const
-{
- return mbIsActive;
-}
-
-
-
-
-void Button::SetIconSize (const IconSize eIconSize)
-{
- meIconSize = eIconSize;
-}
-
-
-
-
-Button::IconSize Button::GetIconSize (void) const
-{
- return meIconSize;
-}
-
-
-
-
-bool Button::IsEnabled (void) const
-{
- return true;
-}
-
-
-
-
-//===== TextButton ============================================================
-
-TextButton::TextButton (
- SlideSorter& rSlideSorter,
- const ::rtl::OUString& rsText,
- const ::rtl::OUString& rsHelpText)
- : Button(rSlideSorter, rsHelpText),
- msText(rsText)
-{
-}
-
-
-
-
-void TextButton::Place (const Rectangle aButtonBarBox)
-{
- maBoundingBox = aButtonBarBox;
- SetActiveState(true);
-}
-
-
-
-
-void TextButton::Paint (
- OutputDevice& rDevice,
- const Point aOffset,
- const double nAlpha,
- const ::boost::shared_ptr<Theme>& rpTheme) const
-{
- (void)nAlpha;
-
- if (mbIsActive)
- {
- // Paint text over the button background.
- if (meState == State_Normal)
- rDevice.SetTextColor(rpTheme->GetColor(Theme::Color_ButtonText));
- else
- rDevice.SetTextColor(rpTheme->GetColor(Theme::Color_ButtonTextHover));
- Rectangle aBox (maBoundingBox);
- aBox += aOffset;
- rDevice.DrawText(aBox, msText, TEXT_DRAW_CENTER | TEXT_DRAW_VCENTER);
- }
-}
-
-
-
-
-Size TextButton::GetSize (void) const
-{
- return Size();
-}
-
-
-
-
-Size TextButton::GetSize (const Button::IconSize) const
-{
- return Size();
-}
-
-
-
-
-//===== ImageButon ============================================================
-
-ImageButton::ImageButton (
- SlideSorter& rSlideSorter,
- const BitmapEx& rLargeIcon,
- const BitmapEx& rLargeHoverIcon,
- const BitmapEx& rMediumIcon,
- const BitmapEx& rMediumHoverIcon,
- const BitmapEx& rSmallIcon,
- const BitmapEx& rSmallHoverIcon,
- const ::rtl::OUString& rsHelpText)
- : Button(rSlideSorter, rsHelpText),
- maLargeIcon(rLargeIcon),
- maLargeHoverIcon(rLargeHoverIcon.IsEmpty() ? rLargeIcon : rLargeHoverIcon),
- maMediumIcon(rMediumIcon),
- maMediumHoverIcon(rMediumHoverIcon.IsEmpty() ? rMediumIcon : rMediumHoverIcon),
- maSmallIcon(rSmallIcon),
- maSmallHoverIcon(rSmallHoverIcon.IsEmpty() ? rSmallIcon : rSmallHoverIcon)
-{
-}
-
-
-
-
-void ImageButton::Place (const Rectangle aButtonBarBox)
-{
- const sal_Int32 nWidth (GetSize().Width());
- maBoundingBox = Rectangle(
- aButtonBarBox.Right() - nWidth,
- aButtonBarBox.Top(),
- aButtonBarBox.Right(),
- aButtonBarBox.Bottom());
- SetActiveState(aButtonBarBox.IsInside(maBoundingBox));
-}
-
-
-
-
-void ImageButton::Paint (
- OutputDevice& rDevice,
- const Point aOffset,
- const double nAlpha,
- const ::boost::shared_ptr<Theme>& rpTheme) const
-{
- (void)rpTheme;
-
- if ( ! mbIsActive)
- return;
-
- const sal_uInt16 nSavedAntialiasingMode (rDevice.GetAntialiasing());
- rDevice.SetAntialiasing(nSavedAntialiasingMode | ANTIALIASING_ENABLE_B2DDRAW);
-
- rDevice.SetLineColor();
-
- // Choose icon.
- BitmapEx aIcon;
- switch (meIconSize)
- {
- case IconSize_Large:
- default:
- if (meState == State_Normal)
- aIcon = maLargeIcon;
- else
- aIcon = maLargeHoverIcon;
- break;
-
- case IconSize_Medium:
- if (meState == State_Normal)
- aIcon = maMediumIcon;
- else
- aIcon = maMediumHoverIcon;
- break;
-
- case IconSize_Small:
- if (meState == State_Normal)
- aIcon = maSmallIcon;
- else
- aIcon = maSmallHoverIcon;
- break;
- }
-
- // Paint icon.
- if ( ! aIcon.IsEmpty())
- {
- AlphaMask aMask (aIcon.GetSizePixel());
- AdaptTransparency(aMask, aIcon.GetAlpha(), nAlpha);
- rDevice.DrawBitmapEx(
- Point(
- maBoundingBox.Left()
- + aOffset.X()
- + (maBoundingBox.GetWidth()-aIcon.GetSizePixel().Width())/2,
- maBoundingBox.Top()
- + aOffset.Y()
- + (maBoundingBox.GetHeight()-aIcon.GetSizePixel().Height())/2),
- BitmapEx(aIcon.GetBitmap(), aMask));
- }
-
- rDevice.SetAntialiasing(nSavedAntialiasingMode);
-}
-
-
-
-
-Size ImageButton::GetSize (void) const
-{
- return GetSize(meIconSize);
-}
-
-
-
-
-Size ImageButton::GetSize (const Button::IconSize eIconSize) const
-{
- switch (eIconSize)
- {
- case IconSize_Large:
- default:
- return maLargeIcon.GetSizePixel();
-
- case IconSize_Medium:
- return maMediumIcon.GetSizePixel();
-
- case IconSize_Small:
- return maSmallIcon.GetSizePixel();
- }
-}
-
-
-
-
-//===== UnhideButton ==========================================================
-
-UnhideButton::UnhideButton (SlideSorter& rSlideSorter)
- : ImageButton(
- rSlideSorter,
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command2BLarge),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command2BLargeHover),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command2BMedium),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command2BMediumHover),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command2BSmall),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command2BSmallHover),
- rSlideSorter.GetTheme()->GetString(Theme::String_Command2B))
-{
-}
-
-
-
-
-void UnhideButton::ProcessClick (const model::SharedPageDescriptor& rpDescriptor)
-{
- if ( ! rpDescriptor)
- return;
- mrSlideSorter.GetController().GetSlotManager()->ChangeSlideExclusionState(
- (rpDescriptor->HasState(model::PageDescriptor::ST_Selected)
- ? model::SharedPageDescriptor()
- : rpDescriptor),
- false);
-}
-
-
-
-
-//===== StartSlideShowButton ==================================================
-
-StartShowButton::StartShowButton (SlideSorter& rSlideSorter)
- : ImageButton(
- rSlideSorter,
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command1Large),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command1LargeHover),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command1Medium),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command1MediumHover),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command1Small),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command1SmallHover),
- rSlideSorter.GetTheme()->GetString(Theme::String_Command1))
-{
-}
-
-
-
-
-bool StartShowButton::IsEnabled (void) const
-{
- ViewShell* pViewShell = mrSlideSorter.GetViewShell();
- if (pViewShell == NULL)
- return false;
- SfxDispatcher* pDispatcher = pViewShell->GetDispatcher();
- if (pDispatcher == NULL)
- return false;
-
- const SfxPoolItem* pState = NULL;
- const SfxItemState eState (pDispatcher->QueryState(SID_PRESENTATION, pState));
- return (eState & SFX_ITEM_DISABLED) == 0;
-}
-
-
-
-
-void StartShowButton::ProcessClick (const model::SharedPageDescriptor& rpDescriptor)
-{
- // Hide the tool tip early, while the slide show still intializes.
- mrSlideSorter.GetView().GetToolTip().SetPage(model::SharedPageDescriptor());
-
- Reference< XPresentation2 > xPresentation(
- mrSlideSorter.GetModel().GetDocument()->getPresentation());
- if (xPresentation.is())
- {
- Sequence<PropertyValue> aProperties (1);
- aProperties[0].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FirstPage"));
- const ::rtl::OUString sName (rpDescriptor->GetPage()->GetName());
- aProperties[0].Value = Any(sName);
- xPresentation->startWithArguments(aProperties);
- }
-}
-
-
-
-
-//===== HideButton ============================================================
-
-HideButton::HideButton (SlideSorter& rSlideSorter)
- : ImageButton(
- rSlideSorter,
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command2Large),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command2LargeHover),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command2Medium),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command2MediumHover),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command2Small),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command2SmallHover),
- rSlideSorter.GetTheme()->GetString(Theme::String_Command2))
-{
-}
-
-
-
-
-void HideButton::ProcessClick (const model::SharedPageDescriptor& rpDescriptor)
-{
- if ( ! rpDescriptor)
- return;
- mrSlideSorter.GetController().GetSlotManager()->ChangeSlideExclusionState(
- (rpDescriptor->HasState(model::PageDescriptor::ST_Selected)
- ? model::SharedPageDescriptor()
- : rpDescriptor),
- true);
-}
-
-
-
-
-//===== DuplicateButton =======================================================
-
-DuplicateButton::DuplicateButton (SlideSorter& rSlideSorter)
- : ImageButton(
- rSlideSorter,
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command3Large),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command3LargeHover),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command3Medium),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command3MediumHover),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command3Small),
- rSlideSorter.GetTheme()->GetIcon(Theme::Icon_Command3SmallHover),
- rSlideSorter.GetTheme()->GetString(Theme::String_Command3))
-{
-}
-
-
-
-
-bool DuplicateButton::IsEnabled (void) const
-{
- ViewShell* pViewShell = mrSlideSorter.GetViewShell();
- if (pViewShell == NULL)
- return false;
- SfxDispatcher* pDispatcher = pViewShell->GetDispatcher();
- if (pDispatcher == NULL)
- return false;
-
- const SfxPoolItem* pState = NULL;
- const SfxItemState eState (pDispatcher->QueryState(
- SID_DUPLICATE_PAGE,
- pState));
- return (eState & SFX_ITEM_DISABLED) == 0;
-}
-
-
-
-
-void DuplicateButton::ProcessClick (const model::SharedPageDescriptor& rpDescriptor)
-{
- if ( ! rpDescriptor)
- return;
-
- mrSlideSorter.GetView().SetPageUnderMouse(model::SharedPageDescriptor(),false);
-
- // When the page under the button is not selected then set the
- // selection to just this page.
- if ( ! rpDescriptor->HasState(model::PageDescriptor::ST_Selected))
- {
- mrSlideSorter.GetController().GetPageSelector().DeselectAllPages();
- mrSlideSorter.GetController().GetPageSelector().SelectPage(rpDescriptor);
- }
- // Duplicate the selected pages. Insert the new pages right
- // after the current selection and select them
- if (mrSlideSorter.GetViewShell() != NULL
- && mrSlideSorter.GetViewShell()->GetDispatcher() != NULL)
- {
- mrSlideSorter.GetViewShell()->GetDispatcher()->Execute(
- SID_DUPLICATE_PAGE,
- SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
- }
-}
-
-
-
-} } } // end of namespace ::sd::slidesorter::view