Kaydet (Commit) 6b6e6b8d authored tarafından Cédric Bosdonnat's avatar Cédric Bosdonnat

Header/Footer: the whole separator tab is now a menu button

üst f189e727
...@@ -102,32 +102,20 @@ namespace ...@@ -102,32 +102,20 @@ namespace
} }
} }
class SwHeaderFooterButton : public MenuButton
{
SwHeaderFooterWin* m_pWindow;
PopupMenu* m_pPopupMenu;
public:
SwHeaderFooterButton( SwHeaderFooterWin* pWindow );
~SwHeaderFooterButton( );
// overloaded <MenuButton> methods
virtual void Select();
// overloaded <Window> methods
virtual void Paint( const Rectangle& rRect );
virtual void MouseButtonDown( const MouseEvent& rMEvt );
};
SwHeaderFooterWin::SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm, bool bHeader ) : SwHeaderFooterWin::SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm, bool bHeader ) :
Window( pEditWin, WB_DIALOGCONTROL ), MenuButton( pEditWin, WB_DIALOGCONTROL ),
m_pEditWin( pEditWin ), m_pEditWin( pEditWin ),
m_sLabel( ), m_sLabel( ),
m_pPageFrm( pPageFrm ), m_pPageFrm( pPageFrm ),
m_bIsHeader( bHeader ), m_bIsHeader( bHeader ),
m_pButton( NULL ) m_bReadonly( false ),
m_pPopupMenu( NULL )
{ {
// Define the readonly member
const SwViewOption* pViewOpt = m_pEditWin->GetView().GetWrtShell().GetViewOptions();
m_bReadonly = pViewOpt->IsReadonly();
// Get the font and configure it // Get the font and configure it
Font aFont = GetSettings().GetStyleSettings().GetToolFont(); Font aFont = GetSettings().GetStyleSettings().GetToolFont();
SetZoomedPointFont( aFont ); SetZoomedPointFont( aFont );
...@@ -141,25 +129,28 @@ SwHeaderFooterWin::SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPag ...@@ -141,25 +129,28 @@ SwHeaderFooterWin::SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPag
m_sLabel = ResId::toString( SW_RES( STR_FOOTER_TITLE ) ); m_sLabel = ResId::toString( SW_RES( STR_FOOTER_TITLE ) );
sal_Int32 nPos = m_sLabel.lastIndexOf( rtl::OUString::createFromAscii( "%1" ) ); sal_Int32 nPos = m_sLabel.lastIndexOf( rtl::OUString::createFromAscii( "%1" ) );
m_sLabel = m_sLabel.replaceAt( nPos, 2, m_pPageFrm->GetPageDesc()->GetName() ); m_sLabel = m_sLabel.replaceAt( nPos, 2, m_pPageFrm->GetPageDesc()->GetName() );
}
SwHeaderFooterWin::~SwHeaderFooterWin( ) // Create and set the PopupMenu
{ m_pPopupMenu = new PopupMenu( SW_RES( MN_HEADERFOOTER_BUTTON ) );
delete m_pButton;
}
MenuButton* SwHeaderFooterWin::GetMenuButton() // Rewrite the menu entries' text
{ String sType = SW_RESSTR( STR_FOOTER );
if ( !m_pButton ) if ( m_bIsHeader )
{ sType = SW_RESSTR( STR_HEADER );
m_pButton = new SwHeaderFooterButton( this ); SwRewriter aRewriter;
aRewriter.AddRule( String::CreateFromAscii( "$1" ), sType );
// Don't blindly show it: check for readonly document String aText = m_pPopupMenu->GetItemText( FN_HEADERFOOTER_EDIT );
const SwViewOption* pViewOpt = m_pEditWin->GetView().GetWrtShell().GetViewOptions(); m_pPopupMenu->SetItemText( FN_HEADERFOOTER_EDIT, aRewriter.Apply( aText ) );
m_pButton->Show( !pViewOpt->IsReadonly() );
}
return m_pButton; aText = m_pPopupMenu->GetItemText( FN_HEADERFOOTER_DELETE );
m_pPopupMenu->SetItemText( FN_HEADERFOOTER_DELETE, aRewriter.Apply( aText ) );
SetPopupMenu( m_pPopupMenu );
}
SwHeaderFooterWin::~SwHeaderFooterWin( )
{
delete m_pPopupMenu;
} }
void SwHeaderFooterWin::SetOffset( Point aOffset ) void SwHeaderFooterWin::SetOffset( Point aOffset )
...@@ -181,11 +172,6 @@ void SwHeaderFooterWin::SetOffset( Point aOffset ) ...@@ -181,11 +172,6 @@ void SwHeaderFooterWin::SetOffset( Point aOffset )
// Set the position & Size of the window // Set the position & Size of the window
SetPosSizePixel( aBoxPos, aBoxSize ); SetPosSizePixel( aBoxPos, aBoxSize );
// Set the button position and size
Point aBtnPos( aBoxSize.getWidth() - BUTTON_WIDTH, 0 );
Size aBtnSize( BUTTON_WIDTH, aBoxSize.getHeight() );
GetMenuButton()->SetPosSizePixel( aBtnPos, aBtnSize );
} }
void SwHeaderFooterWin::Paint( const Rectangle& ) void SwHeaderFooterWin::Paint( const Rectangle& )
...@@ -201,6 +187,45 @@ void SwHeaderFooterWin::Paint( const Rectangle& ) ...@@ -201,6 +187,45 @@ void SwHeaderFooterWin::Paint( const Rectangle& )
basegfx::BColor aLineColor = SwViewOption::GetHeaderFooterMarkColor().getBColor(); basegfx::BColor aLineColor = SwViewOption::GetHeaderFooterMarkColor().getBColor();
SetTextColor( Color( aLineColor ) ); SetTextColor( Color( aLineColor ) );
DrawText( aTextPos, String( m_sLabel ) ); DrawText( aTextPos, String( m_sLabel ) );
// Paint the symbol if not readonly button
if ( !m_bReadonly )
{
Point aPicPos( aRect.getWidth() - BUTTON_WIDTH, 0 );
Size aPicSize( BUTTON_WIDTH, aRect.getHeight() );
Rectangle aSymbolRect( aPicPos, aPicSize );
if ( IsEmptyHeaderFooter( ) )
{
SvtResId id( BMP_LIST_ADD );
Image aPlusImg( id );
Size aSize = aPlusImg.GetSizePixel();
Point aPt = aSymbolRect.TopLeft();
long nXOffset = ( aSymbolRect.GetWidth() - aSize.Width() ) / 2;
long nYOffset = ( aSymbolRect.GetHeight() - aSize.Height() ) / 2;
aPt += Point( nXOffset, nYOffset );
DrawImage(aPt, aPlusImg);
}
else
{
// 25% distance to the left and right button border
const long nBorderDistanceLeftAndRight = ((aSymbolRect.GetWidth()*250)+500)/1000;
aSymbolRect.Left()+=nBorderDistanceLeftAndRight;
aSymbolRect.Right()-=nBorderDistanceLeftAndRight;
// 30% distance to the top button border
const long nBorderDistanceTop = ((aSymbolRect.GetHeight()*300)+500)/1000;
aSymbolRect.Top()+=nBorderDistanceTop;
// 25% distance to the bottom button border
const long nBorderDistanceBottom = ((aSymbolRect.GetHeight()*250)+500)/1000;
aSymbolRect.Bottom()-=nBorderDistanceBottom;
DecorationView aDecoView( this );
aDecoView.DrawSymbol( aSymbolRect, SYMBOL_SPIN_DOWN,
( Application::GetSettings().GetStyleSettings().GetHighContrastMode()
? Color( COL_WHITE )
: Color( COL_BLACK ) ) );
}
}
} }
bool SwHeaderFooterWin::IsEmptyHeaderFooter( ) bool SwHeaderFooterWin::IsEmptyHeaderFooter( )
...@@ -281,94 +306,24 @@ void SwHeaderFooterWin::ExecuteCommand( sal_uInt16 nSlot ) ...@@ -281,94 +306,24 @@ void SwHeaderFooterWin::ExecuteCommand( sal_uInt16 nSlot )
void SwHeaderFooterWin::SetReadonly( bool bReadonly ) void SwHeaderFooterWin::SetReadonly( bool bReadonly )
{ {
if ( bReadonly ) m_bReadonly = bReadonly;
m_pButton->Hide();
else
m_pButton->Show();
Update(); Update();
} }
SwHeaderFooterButton::SwHeaderFooterButton( SwHeaderFooterWin* pWindow ) : void SwHeaderFooterWin::MouseButtonDown( const MouseEvent& rMEvt )
MenuButton( pWindow ),
m_pWindow( pWindow )
{
// Create and set the PopupMenu
m_pPopupMenu = new PopupMenu( SW_RES( MN_HEADERFOOTER_BUTTON ) );
// Rewrite the menu entries' text
String sType = SW_RESSTR( STR_FOOTER );
if ( m_pWindow->IsHeader() )
sType = SW_RESSTR( STR_HEADER );
SwRewriter aRewriter;
aRewriter.AddRule( String::CreateFromAscii( "$1" ), sType );
String aText = m_pPopupMenu->GetItemText( FN_HEADERFOOTER_EDIT );
m_pPopupMenu->SetItemText( FN_HEADERFOOTER_EDIT, aRewriter.Apply( aText ) );
aText = m_pPopupMenu->GetItemText( FN_HEADERFOOTER_DELETE );
m_pPopupMenu->SetItemText( FN_HEADERFOOTER_DELETE, aRewriter.Apply( aText ) );
SetPopupMenu( m_pPopupMenu );
}
SwHeaderFooterButton::~SwHeaderFooterButton( )
{
delete m_pPopupMenu;
}
void SwHeaderFooterButton::Paint( const Rectangle& )
{
const Rectangle aRect( Rectangle( Point( 0, 0 ), PixelToLogic( GetSizePixel() ) ) );
lcl_DrawBackground( this, aRect, m_pWindow->IsHeader() );
Rectangle aSymbolRect( aRect );
// 25% distance to the left and right button border
const long nBorderDistanceLeftAndRight = ((aSymbolRect.GetWidth()*250)+500)/1000;
aSymbolRect.Left()+=nBorderDistanceLeftAndRight;
aSymbolRect.Right()-=nBorderDistanceLeftAndRight;
// 30% distance to the top button border
const long nBorderDistanceTop = ((aSymbolRect.GetHeight()*300)+500)/1000;
aSymbolRect.Top()+=nBorderDistanceTop;
// 25% distance to the bottom button border
const long nBorderDistanceBottom = ((aSymbolRect.GetHeight()*250)+500)/1000;
aSymbolRect.Bottom()-=nBorderDistanceBottom;
if ( m_pWindow->IsEmptyHeaderFooter( ) )
{
SvtResId id( BMP_LIST_ADD );
Image aPlusImg( id );
Size aSize = aPlusImg.GetSizePixel();
Point aPt = aRect.TopLeft();
long nXOffset = ( aRect.GetWidth() - aSize.Width() ) / 2;
long nYOffset = ( aRect.GetHeight() - aSize.Height() ) / 2;
aPt += Point( nXOffset, nYOffset );
DrawImage(aPt, aPlusImg);
}
else
{
DecorationView aDecoView( this );
aDecoView.DrawSymbol( aSymbolRect, SYMBOL_SPIN_DOWN,
( Application::GetSettings().GetStyleSettings().GetHighContrastMode()
? Color( COL_WHITE )
: Color( COL_BLACK ) ) );
}
}
void SwHeaderFooterButton::MouseButtonDown( const MouseEvent& rMEvt )
{ {
if ( m_pWindow->IsEmptyHeaderFooter( ) ) if ( IsEmptyHeaderFooter( ) )
{ {
// Add the header / footer // Add the header / footer
m_pWindow->ChangeHeaderOrFooter( true ); ChangeHeaderOrFooter( true );
} }
else else
MenuButton::MouseButtonDown( rMEvt ); MenuButton::MouseButtonDown( rMEvt );
} }
void SwHeaderFooterButton::Select( ) void SwHeaderFooterWin::Select( )
{ {
m_pWindow->ExecuteCommand( GetCurItemId() ); ExecuteCommand( GetCurItemId() );
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -33,20 +33,19 @@ ...@@ -33,20 +33,19 @@
#include <vcl/menubtn.hxx> #include <vcl/menubtn.hxx>
#include <vcl/window.hxx> #include <vcl/window.hxx>
class SwHeaderFooterButton;
/** Class for the header and footer separator control window. /** Class for the header and footer separator control window.
This control is showing the header / footer style name and provides This control is showing the header / footer style name and provides
a few useful actions to the user. a few useful actions to the user.
*/ */
class SwHeaderFooterWin : public Window class SwHeaderFooterWin : public MenuButton
{ {
SwEditWin* m_pEditWin; SwEditWin* m_pEditWin;
rtl::OUString m_sLabel; rtl::OUString m_sLabel;
const SwPageFrm* m_pPageFrm; const SwPageFrm* m_pPageFrm;
bool m_bIsHeader; bool m_bIsHeader;
SwHeaderFooterButton* m_pButton; bool m_bReadonly;
PopupMenu* m_pPopupMenu;
public: public:
SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm, bool bHeader ); SwHeaderFooterWin( SwEditWin* pEditWin, const SwPageFrm* pPageFrm, bool bHeader );
...@@ -55,6 +54,8 @@ public: ...@@ -55,6 +54,8 @@ public:
void SetOffset( Point aOffset ); void SetOffset( Point aOffset );
virtual void Paint( const Rectangle& rRect ); virtual void Paint( const Rectangle& rRect );
virtual void MouseButtonDown( const MouseEvent& rMEvt );
virtual void Select( );
bool IsHeader() { return m_bIsHeader; }; bool IsHeader() { return m_bIsHeader; };
bool IsEmptyHeaderFooter( ); bool IsEmptyHeaderFooter( );
...@@ -64,9 +65,6 @@ public: ...@@ -64,9 +65,6 @@ public:
void ExecuteCommand(sal_uInt16 nSlot); void ExecuteCommand(sal_uInt16 nSlot);
void SetReadonly( bool bReadonly ); void SetReadonly( bool bReadonly );
private:
MenuButton* GetMenuButton( );
}; };
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment