[Libreoffice-commits] .: sw/source vcl/inc
Jan Holesovsky
kendy at kemper.freedesktop.org
Thu Dec 22 03:05:17 PST 2011
sw/source/ui/docvw/PageBreakWin.cxx | 77 +++++++++++++++++++++---------------
sw/source/ui/inc/PageBreakWin.hxx | 2
vcl/inc/vcl/menubtn.hxx | 3 -
3 files changed, 50 insertions(+), 32 deletions(-)
New commits:
commit ee1eb926550028da6e5e44089d4706798f94e0bb
Author: Jan Holesovsky <kendy at suse.cz>
Date: Thu Dec 22 11:59:36 2011 +0100
Improve usability of the Page Break control.
- use the same fade in/out values that we use for headers/footers
- clicking on the line opens the menu too
- clicking outside the menu hides the button
- leaving the line or the button hides the button immediately
diff --git a/sw/source/ui/docvw/PageBreakWin.cxx b/sw/source/ui/docvw/PageBreakWin.cxx
index 9279c00..7c1f00e 100644
--- a/sw/source/ui/docvw/PageBreakWin.cxx
+++ b/sw/source/ui/docvw/PageBreakWin.cxx
@@ -68,7 +68,7 @@ using namespace drawinglayer::primitive2d;
namespace
{
- B2DPolygon lcl_CreatePolygon( B2DRectangle aBounds, bool bMirror )
+ static B2DPolygon lcl_CreatePolygon( B2DRectangle aBounds, bool bMirror )
{
B2DPolygon aRetval;
const double nRadius = 1;
@@ -164,17 +164,33 @@ namespace
SwDashedLine( pParent, rColor ),
m_pWin( pWin ) {};
-
virtual void MouseMove( const MouseEvent& rMEvt );
+ virtual void MouseButtonDown( const MouseEvent& rMEvt );
};
void SwBreakDashedLine::MouseMove( const MouseEvent& rMEvt )
{
if ( rMEvt.IsLeaveWindow() )
- m_pWin->Fade( false );
+ {
+ // don't fade if we just move to the 'button'
+ Rectangle aRect( m_pWin->GetPosPixel(), m_pWin->GetSizePixel() );
+ Point aEventPos( GetPosPixel() + rMEvt.GetPosPixel() );
+ if ( !aRect.IsInside( aEventPos ) )
+ m_pWin->Fade( false );
+ }
else if ( !m_pWin->IsVisible() )
m_pWin->Fade( true );
}
+
+ void SwBreakDashedLine::MouseButtonDown( const MouseEvent& rMEvt )
+ {
+ sal_uInt16 nItemId = m_pWin->GetPopupMenu()->Execute( this, rMEvt.GetPosPixel() );
+ if ( nItemId )
+ {
+ m_pWin->SetCurItemId( nItemId );
+ m_pWin->Select();
+ }
+ }
}
SwPageBreakWin::SwPageBreakWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm ) :
@@ -195,9 +211,10 @@ SwPageBreakWin::SwPageBreakWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm )
// Create the popup menu
m_pPopupMenu = new PopupMenu( SW_RES( MN_PAGEBREAK_BUTTON ) );
+ m_pPopupMenu->SetDeactivateHdl( LINK( this, SwPageBreakWin, HideHandler ) );
SetPopupMenu( m_pPopupMenu );
- m_aFadeTimer.SetTimeout( 500 );
+ m_aFadeTimer.SetTimeout( 50 );
m_aFadeTimer.SetTimeoutHdl( LINK( this, SwPageBreakWin, FadeHandler ) );
}
@@ -383,7 +400,13 @@ void SwPageBreakWin::Select( )
void SwPageBreakWin::MouseMove( const MouseEvent& rMEvt )
{
if ( rMEvt.IsLeaveWindow() )
- Fade( false );
+ {
+ // don't fade if we just move to the 'line', or the popup menu is open
+ Rectangle aRect( m_pLine->GetPosPixel(), m_pLine->GetSizePixel() );
+ Point aEventPos( GetPosPixel() + rMEvt.GetPosPixel() );
+ if ( !aRect.IsInside( aEventPos ) && !PopupMenu::IsInExecute() )
+ Fade( false );
+ }
else if ( !IsVisible() )
Fade( true );
}
@@ -457,13 +480,13 @@ void SwPageBreakWin::UpdatePosition( )
long nRight = std::min( nPgRight + aBtnSize.getWidth() - ARROW_WIDTH / 2, aVisArea.Right() );
nBtnLeft = nRight - aBtnSize.getWidth();
if ( IsVisible() )
- nLineRight = nBtnLeft - ARROW_WIDTH / 2;
+ nLineRight = nBtnLeft;
}
else
{
nBtnLeft = std::max( nPgLeft - aBtnSize.Width() + ARROW_WIDTH / 2, aVisArea.Left() );
if ( IsVisible() )
- nLineLeft = nBtnLeft + aBtnSize.Width( ) + ARROW_WIDTH / 2;
+ nLineLeft = nBtnLeft + aBtnSize.Width();
}
// Set the button position
@@ -493,22 +516,26 @@ void SwPageBreakWin::SetReadonly( bool bReadonly )
void SwPageBreakWin::Fade( bool bFadeIn )
{
- if ( !PopupMenu::IsInExecute() )
- {
- m_bIsAppearing = bFadeIn;
- if ( !m_bDestroyed && m_aFadeTimer.IsActive( ) )
- m_aFadeTimer.Stop();
- if ( !m_bDestroyed )
- m_aFadeTimer.Start( );
- }
+ m_bIsAppearing = bFadeIn;
+ if ( !m_bDestroyed && m_aFadeTimer.IsActive( ) )
+ m_aFadeTimer.Stop();
+ if ( !m_bDestroyed )
+ m_aFadeTimer.Start( );
+}
+
+IMPL_LINK( SwPageBreakWin, HideHandler, void *, EMPTYARG )
+{
+ Fade( false );
+
+ return 0;
}
IMPL_LINK( SwPageBreakWin, FadeHandler, Timer *, EMPTYARG )
{
if ( m_bIsAppearing && m_nFadeRate > 0 )
- m_nFadeRate -= 10;
+ m_nFadeRate -= 25;
else if ( !m_bIsAppearing && m_nFadeRate < 100 )
- m_nFadeRate += 10;
+ m_nFadeRate += 25;
if ( m_nFadeRate != 100 && !IsVisible() )
Show();
@@ -520,20 +547,8 @@ IMPL_LINK( SwPageBreakWin, FadeHandler, Timer *, EMPTYARG )
Invalidate();
}
- if ( IsVisible( ) )
- {
- if ( m_nFadeRate > 0 )
- m_aFadeTimer.SetTimeout( 100 );
- else
- {
- m_aFadeTimer.SetTimeout( 3000 );
- }
-
- if ( m_nFadeRate > 0 && m_nFadeRate < 100 )
- m_aFadeTimer.Start();
- }
- else
- m_aFadeTimer.SetTimeout( 500 );
+ if ( IsVisible( ) && m_nFadeRate > 0 && m_nFadeRate < 100 )
+ m_aFadeTimer.Start();
return 0;
}
diff --git a/sw/source/ui/inc/PageBreakWin.hxx b/sw/source/ui/inc/PageBreakWin.hxx
index bac664c..fa2631c 100644
--- a/sw/source/ui/inc/PageBreakWin.hxx
+++ b/sw/source/ui/inc/PageBreakWin.hxx
@@ -70,6 +70,8 @@ public:
private:
bool ShowOnRight();
+ /// Hide the button (used when the popup menu is closed by clicking outside)
+ DECL_LINK( HideHandler, void * );
DECL_LINK( FadeHandler, Timer * );
};
diff --git a/vcl/inc/vcl/menubtn.hxx b/vcl/inc/vcl/menubtn.hxx
index 1e65504..b9bdd81 100644
--- a/vcl/inc/vcl/menubtn.hxx
+++ b/vcl/inc/vcl/menubtn.hxx
@@ -88,7 +88,8 @@ public:
void SetPopupMenu( PopupMenu* pNewMenu );
PopupMenu* GetPopupMenu() const { return mpMenu; }
- sal_uInt16 GetCurItemId() const { return mnCurItemId; }
+ sal_uInt16 GetCurItemId() const { return mnCurItemId; }
+ void SetCurItemId( sal_uInt16 nItemId ) { mnCurItemId = nItemId; }
void SetActivateHdl( const Link& rLink ) { maActivateHdl = rLink; }
const Link& GetActivateHdl() const { return maActivateHdl; }
More information about the Libreoffice-commits
mailing list