summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCédric Bosdonnat <cedric.bosdonnat.ooo@free.fr>2012-01-04 09:33:44 +0100
committerCédric Bosdonnat <cedric.bosdonnat.ooo@free.fr>2012-01-04 14:03:00 +0100
commit965e72d64c3e38780a69cace3f1bcc5fb35d6c1e (patch)
tree8c2c810b124167b1362233e1f8b45699c6bcccc1
parent6572e22de69d5fbb51e6b8dead507f04e49681b8 (diff)
Page Break: show the page break right under the mouse
-rw-r--r--sw/source/ui/docvw/PageBreakWin.cxx96
-rw-r--r--sw/source/ui/inc/PageBreakWin.hxx4
2 files changed, 38 insertions, 62 deletions
diff --git a/sw/source/ui/docvw/PageBreakWin.cxx b/sw/source/ui/docvw/PageBreakWin.cxx
index 538f6d796850..300aa4d14fd2 100644
--- a/sw/source/ui/docvw/PageBreakWin.cxx
+++ b/sw/source/ui/docvw/PageBreakWin.cxx
@@ -68,59 +68,22 @@ using namespace drawinglayer::primitive2d;
namespace
{
- static B2DPolygon lcl_CreatePolygon( B2DRectangle aBounds, bool bMirror )
+ static B2DPolygon lcl_CreatePolygon( B2DRectangle aBounds )
{
B2DPolygon aRetval;
const double nRadius = 1;
const double nKappa((M_SQRT2 - 1.0) * 4.0 / 3.0);
- // Create the top left corner
- {
- B2DPoint aTLCorner = aBounds.getMinimum();
- B2DPoint aStart( 0.0, nRadius );
- B2DPoint aEnd( nRadius, 0.0 );
- aRetval.append( aStart );
- aRetval.appendBezierSegment(
- interpolate( aStart, aTLCorner, nKappa ),
- interpolate( aEnd, aTLCorner, nKappa ),
- aEnd );
- }
-
- // Create the top right angle
- {
- B2DPoint aTMCorner( aBounds.getWidth() - ARROW_WIDTH, 0.0 );
- B2DPoint aStart = aTMCorner + B2DVector( - nRadius, 0.0 );
- B2DVector aEndVect( double( ARROW_WIDTH ), aBounds.getHeight() / 2.0 );
- aEndVect.setLength( nRadius );
- B2DPoint aEnd = aTMCorner + aEndVect;
- aRetval.append( aStart );
- aRetval.appendBezierSegment(
- interpolate( aStart, aTMCorner, nKappa ),
- interpolate( aEnd, aTMCorner, nKappa ),
- aEnd );
- }
-
- // Create the right corner
+ // Create the top right corner
{
- B2DPoint aMRCorner( aBounds.getWidth(), aBounds.getHeight() / 2.0 );
- B2DVector aStartVect( double( - ARROW_WIDTH ), - aBounds.getHeight() / 2.0 );
- aStartVect.setLength( nRadius );
- B2DPoint aStart = aMRCorner + aStartVect;
- B2DVector aEndVect( double( - ARROW_WIDTH ), aBounds.getHeight() / 2.0 );
- aEndVect.setLength( nRadius );
- B2DPoint aEnd = aMRCorner + aEndVect;
- aRetval.append( aStart );
- aRetval.appendBezierSegment(
- interpolate( aStart, aMRCorner, nKappa ),
- interpolate( aEnd, aMRCorner, nKappa ),
- aEnd );
+ B2DPoint aTMCorner( aBounds.getWidth(), 0.0 );
+ aRetval.append( aTMCorner );
}
- // Create the bottom right angle
+ // Create the bottom right corner
{
- B2DPoint aBMCorner( aBounds.getWidth() - ARROW_WIDTH, aBounds.getHeight() );
- B2DVector aStartVect( double( ARROW_WIDTH ), - aBounds.getHeight() / 2.0 );
- aStartVect.setLength( nRadius );
+ B2DPoint aBMCorner( aBounds.getWidth(), aBounds.getHeight() );
+ B2DVector aStartVect( 0.0, - nRadius );
B2DPoint aStart = aBMCorner + aStartVect;
B2DPoint aEnd = aBMCorner + B2DVector( - nRadius, 0.0 );
aRetval.append( aStart );
@@ -142,13 +105,10 @@ namespace
aEnd );
}
- aRetval.setClosed( true );
-
- if ( bMirror )
+ // Create the top left corner
{
- B2DHomMatrix bRotMatrix = createRotateAroundPoint(
- aBounds.getCenterX(), aBounds.getCenterY(), M_PI );
- aRetval.transform( bRotMatrix );
+ B2DPoint aTLCorner = aBounds.getMinimum();
+ aRetval.append( aTLCorner );
}
return aRetval;
@@ -178,7 +138,12 @@ namespace
m_pWin->Fade( false );
}
else if ( !m_pWin->IsVisible() )
+ {
m_pWin->Fade( true );
+ }
+
+ Point* pPtr = new Point( rMEvt.GetPosPixel() );
+ m_pWin->UpdatePosition( pPtr );
}
void SwBreakDashedLine::MouseButtonDown( const MouseEvent& rMEvt )
@@ -199,7 +164,8 @@ SwPageBreakWin::SwPageBreakWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm )
m_pLine( NULL ),
m_bIsAppearing( false ),
m_nFadeRate( 100 ),
- m_bDestroyed( false )
+ m_bDestroyed( false ),
+ m_pMousePt( NULL )
{
// Use pixels for the rest of the drawing
SetMapMode( MapMode ( MAP_PIXEL ) );
@@ -224,6 +190,7 @@ SwPageBreakWin::~SwPageBreakWin( )
delete m_pPopupMenu;
delete m_pLine;
+ delete m_pMousePt;
}
void SwPageBreakWin::Paint( const Rectangle& )
@@ -255,7 +222,7 @@ void SwPageBreakWin::Paint( const Rectangle& )
B2DRectangle aBRect( double( aRect.Left() ), double( aRect.Top( ) ),
double( aRect.Right() ), double( aRect.Bottom( ) ) );
bool bMirror = ( bShowOnRight && !bRtl ) || ( !bShowOnRight && bRtl );
- B2DPolygon aPolygon = lcl_CreatePolygon( aBRect, bMirror );
+ B2DPolygon aPolygon = lcl_CreatePolygon( aBRect );
// Create the polygon primitives
aSeq[0] = Primitive2DReference( new PolyPolygonColorPrimitive2D(
@@ -401,7 +368,7 @@ void SwPageBreakWin::MouseMove( const MouseEvent& rMEvt )
if ( rMEvt.IsLeaveWindow() )
{
// don't fade if we just move to the 'line', or the popup menu is open
- Point aEventPos( GetPosPixel() + rMEvt.GetPosPixel() );
+ Point aEventPos( rMEvt.GetPosPixel() + rMEvt.GetPosPixel() );
if ( !Contains( aEventPos ) && !PopupMenu::IsInExecute() )
Fade( false );
}
@@ -433,8 +400,16 @@ bool SwPageBreakWin::ShowOnRight( )
return bOnRight;
}
-void SwPageBreakWin::UpdatePosition( )
+void SwPageBreakWin::UpdatePosition( const Point* pEvtPt )
{
+ if ( pEvtPt != NULL )
+ {
+ if ( pEvtPt == m_pMousePt )
+ return;
+ delete m_pMousePt;
+ m_pMousePt = pEvtPt;
+ }
+
const SwPageFrm* pPageFrm = GetPageFrame();
const SwFrm* pPrevPage = pPageFrm->GetPrev();
while ( pPrevPage && ( pPrevPage->Frm().Top( ) == pPageFrm->Frm().Top( ) ) )
@@ -471,18 +446,17 @@ void SwPageBreakWin::UpdatePosition( )
long nLineLeft = std::max( nPgLeft, aVisArea.Left() );
long nLineRight = std::min( nPgRight, aVisArea.Right() );
- long nBtnLeft = nPgLeft;
+ long nBtnLeft = nLineLeft;
- if ( ShowOnRight( ) )
+ if ( m_pMousePt )
{
- long nRight = std::min( nPgRight + aBtnSize.getWidth() - ARROW_WIDTH / 2, aVisArea.Right() );
- nBtnLeft = nRight - aBtnSize.getWidth();
+ nBtnLeft = nLineLeft + m_pMousePt->X();
+ if ( ( nBtnLeft + aBtnSize.getWidth() ) > nLineRight )
+ nBtnLeft = nLineRight - aBtnSize.getWidth();
}
- else
- nBtnLeft = std::max( nPgLeft - aBtnSize.Width() + ARROW_WIDTH / 2, aVisArea.Left() );
// Set the button position
- Point aBtnPos( nBtnLeft, nYLineOffset - aBtnSize.Height() / 2 );
+ Point aBtnPos( nBtnLeft, nYLineOffset + 1 );
SetPosSizePixel( aBtnPos, aBtnSize );
// Set the line position
diff --git a/sw/source/ui/inc/PageBreakWin.hxx b/sw/source/ui/inc/PageBreakWin.hxx
index e1967f3c2c94..bd4eb647f26c 100644
--- a/sw/source/ui/inc/PageBreakWin.hxx
+++ b/sw/source/ui/inc/PageBreakWin.hxx
@@ -48,6 +48,8 @@ class SwPageBreakWin : public MenuButton, public SwFrameControl
Timer m_aFadeTimer;
bool m_bDestroyed;
+ const Point* m_pMousePt;
+
public:
SwPageBreakWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm );
~SwPageBreakWin( );
@@ -57,7 +59,7 @@ public:
virtual void MouseMove( const MouseEvent& rMEvt );
virtual void Activate( );
- void UpdatePosition( );
+ void UpdatePosition( const Point* pEvtPt = NULL );
virtual void ShowAll( bool bShow );
virtual bool Contains( const Point &rDocPt ) const;