blob: 21b2fb2e49fc12d1f4d16fa2f6cd320d53e34211 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef SD_SLIDESORTER_VIEW_BUTTON_BAR_HXX
#define SD_SLIDESORTER_VIEW_BUTTON_BAR_HXX
#include "model/SlsSharedPageDescriptor.hxx"
#include <tools/gen.hxx>
#include <rtl/ustring.hxx>
#include <vcl/bitmapex.hxx>
#include <vcl/bmpacc.hxx>
#include <boost/scoped_ptr.hpp>
namespace sd { namespace slidesorter {
class SlideSorter;
} }
namespace sd { namespace slidesorter { namespace view {
class Theme;
class Button;
typedef ::boost::shared_ptr<Button> SharedButton;
/** This is a container of buttons and a coordinating controller.
The last means that it receives mouse events and forwards them to
the right button.
*/
class ButtonBar
{
public:
ButtonBar (SlideSorter& rSlideSorter);
~ButtonBar (void);
void ProcessButtonDownEvent (
const model::SharedPageDescriptor& rpDescriptor,
const Point aMouseModelLocation);
void ProcessButtonUpEvent (
const model::SharedPageDescriptor& rpDescriptor,
const Point aMouseModelLocation);
void ProcessMouseMotionEvent (
const model::SharedPageDescriptor& rpDescriptor,
const Point aMouseModelLocation,
const bool bIsMouseButtonDown);
void ResetPage (void);
/** Return the number of buttons that are to be displayed in page
objects which the mouse hovers over.
@param bIsExcluded
When this flag is <TRUE/> then return the number of
buttons that is to be displayed for pages that are
excluded from the slide show.
*/
sal_Int32 GetButtonCount (const bool bIsExcluded) const;
/** Return the specified button.
@param nIndex
Valid values lie in the range [0,GetButtonCount()).
@param bIsExcluded
When this flag is <TRUE/> then return a button that is to
be displayed for pages that are excluded from the slide
show.
@return
Returns an empty pointer when the given index is not valid.
*/
::boost::shared_ptr<Button> GetButton (
const bool bIsExcluded,
const sal_Int32 nIndex) const;
bool IsMouseOverBar (void) const;
/** Paint the specified page object. When this is not the same as the
one under the mouse (mpDescriptor) then the buttons are all
painted in their normal state.
*/
void Paint (
OutputDevice& rDevice,
const model::SharedPageDescriptor& rpPageDescriptor);
bool IsMouseOverButton (void) const;
void RequestLayout (void);
/** Return the help text for the button under the mouse.
@return
When the mouse is not over a button then an empty string
is returned.
*/
::rtl::OUString GetButtonHelpText (void) const;
/** Request the button bar to be shown.
@param bAnimate
This flag controls whether to just show the button bar (<FALSE/>)
or to fade it in smoothly (<TRUE/>.)
*/
void RequestFadeIn (
const model::SharedPageDescriptor& rpDescriptor,
const bool bAnimate);
/** Request the button bar to be hidden.
@param bAnimate
This flag controls whether to just hide the button bar (<FALSE/>)
or to fade it out smoothly (<TRUE/>.)
*/
void RequestFadeOut (
const model::SharedPageDescriptor& rpDescriptor,
const bool bAnimate);
/** Return whether the button bar is visible for the givn descriptor (or
being faded in.)
*/
bool IsVisible (const model::SharedPageDescriptor& rpDescriptor);
void HandleDataChangeEvent (void);
class BackgroundTheme;
/** While at least one Lock object exists the button bar will not be
displayed. Used, e.g. during a mouse multiselection to avoid
confusing and unhelpfull visual signals.
*/
class Lock
{
public:
Lock (SlideSorter& rSlideSorter);
~Lock (void);
private:
ButtonBar& mrButtonBar;
};
private:
SlideSorter& mrSlideSorter;
Size maPageObjectSize;
Rectangle maButtonBoundingBox;
Point maBackgroundLocation;
model::SharedPageDescriptor mpDescriptor;
bool mbIsExcluded;
boost::shared_ptr<Button> mpButtonUnderMouse;
// The button on which the mouse button was pressed.
boost::shared_ptr<Button> mpDownButton;
::std::vector<SharedButton> maRegularButtons;
::std::vector<SharedButton> maExcludedButtons;
BitmapEx maNormalBackground;
BitmapEx maButtonDownBackground;
bool mbIsMouseOverBar;
::boost::scoped_ptr<BackgroundTheme> mpBackgroundTheme;
int mnLockCount;
/** Remember the specified page. If it differs from mpDescriptor then
the buttons are placed anew.
@return
The returned flag indicates wether the mpDescriptor member
is set to a new value.
*/
bool SetPage (const model::SharedPageDescriptor& rpDescriptor);
SharedButton GetButtonAt (const Point aModelLocation);
bool SetButtonUnderMouse (const SharedButton& rButton = SharedButton());
void PaintButtonBackground (
OutputDevice& rDevice,
const model::SharedPageDescriptor& rpPageDescriptor,
const Point aOffset);
void LayoutButtons (const Size aPageModelSize);
bool LayoutButtons (void);
BitmapEx CreateBackground (
const OutputDevice& rTemplateDevice,
const bool bIsButtonDown) const;
bool IsMouseOverBar (const Point aModelLocation) const;
void StartFadeAnimation (
const model::SharedPageDescriptor& rpDescriptor,
const double nTargetAlpha,
const bool bFadeIn);
void AcquireLock (void);
void ReleaseLock (void);
};
class Button
{
public:
Button (
SlideSorter& rSlideSorter,
const ::rtl::OUString& rsHelpText);
virtual ~Button (void);
enum State { State_Normal, State_Hover, State_Down };
enum IconSize { IconSize_Large, IconSize_Medium, IconSize_Small };
/** Set a new state.
@return
When the new state is different from the old state
then <TRUE/> is returned.
*/
bool SetState (const State eState);
State GetState (void) const;
virtual void Place (const Rectangle aButtonBarBox) = 0;
virtual void Paint (
OutputDevice& rDevice,
const Point aOffset,
const double nAlpha,
const ::boost::shared_ptr<Theme>& rpTheme) const = 0;
virtual void ProcessClick (const model::SharedPageDescriptor& rpDescriptor) = 0;
/** Return the bounding box of the layouted button.
*/
Rectangle GetBoundingBox (void) const;
/** Return the minimum size required to completely paint the
button.
*/
virtual Size GetSize (void) const = 0;
virtual Size GetSize (const IconSize eIconSize) const = 0;
::rtl::OUString GetHelpText (void) const;
bool IsDown (void) const;
void SetActiveState (const bool bIsActive);
bool IsActive (void) const;
void SetIconSize (const IconSize eIconSize);
IconSize GetIconSize (void) const;
/** By default a button is always enabled. Override to change this.
*/
virtual bool IsEnabled (void) const;
protected:
SlideSorter& mrSlideSorter;
State meState;
Rectangle maBoundingBox;
const ::rtl::OUString msHelpText;
// Buttons that lie (partly) outside the button bar are deactivated.
bool mbIsActive;
IconSize meIconSize;
};
class TextButton : public Button
{
public:
TextButton (
SlideSorter& rSlideSorter,
const ::rtl::OUString& rsText,
const ::rtl::OUString& rsHelpText);
virtual void Place (const Rectangle aButtonBarBox);
virtual void Paint (
OutputDevice& rDevice,
const Point aOffset,
const double nAlpha,
const ::boost::shared_ptr<Theme>& rpTheme) const;
virtual Size GetSize (void) const;
virtual Size GetSize (const IconSize eIconSize) const;
private:
const ::rtl::OUString msText;
};
class ImageButton : public Button
{
public:
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);
virtual void Place (const Rectangle aButtonBarBox);
virtual void Paint (
OutputDevice& rDevice,
const Point aOffset,
const double nAlpha,
const ::boost::shared_ptr<Theme>& rpTheme) const;
virtual Size GetSize (void) const;
virtual Size GetSize (const IconSize eIconSize) const;
private:
const BitmapEx maLargeIcon;
const BitmapEx maLargeHoverIcon;
const BitmapEx maMediumIcon;
const BitmapEx maMediumHoverIcon;
const BitmapEx maSmallIcon;
const BitmapEx maSmallHoverIcon;
};
class UnhideButton : public ImageButton
{
public:
UnhideButton (SlideSorter& rSlideSorter);
protected:
virtual void ProcessClick (const model::SharedPageDescriptor& rpDescriptor);
};
class StartShowButton : public ImageButton
{
public:
StartShowButton (SlideSorter& rSlideSorter);
virtual bool IsEnabled (void) const;
protected:
virtual void ProcessClick (const model::SharedPageDescriptor& rpDescriptor);
};
class HideButton : public ImageButton
{
public:
HideButton (SlideSorter& rSlideSorter);
protected:
virtual void ProcessClick (const model::SharedPageDescriptor& rpDescriptor);
};
class DuplicateButton : public ImageButton
{
public:
DuplicateButton (SlideSorter& rSlideSorter);
virtual bool IsEnabled (void) const;
protected:
virtual void ProcessClick (const model::SharedPageDescriptor& rpDescriptor);
};
} } } // end of namespace ::sd::slidesorter::view
#endif