diff options
Diffstat (limited to 'vcl/unx/generic/app/i18n_status.cxx')
-rw-r--r-- | vcl/unx/generic/app/i18n_status.cxx | 81 |
1 files changed, 44 insertions, 37 deletions
diff --git a/vcl/unx/generic/app/i18n_status.cxx b/vcl/unx/generic/app/i18n_status.cxx index e957671c8ce3..5df56b0d9362 100644 --- a/vcl/unx/generic/app/i18n_status.cxx +++ b/vcl/unx/generic/app/i18n_status.cxx @@ -52,7 +52,6 @@ class StatusWindow : public WorkWindow protected: StatusWindow( WinBits nWinBits ); public: - virtual ~StatusWindow(); virtual void setPosition( SalFrame* ); virtual void setText( const OUString & ) = 0; @@ -67,8 +66,6 @@ StatusWindow::StatusWindow( WinBits nWinBits ) : { } -StatusWindow::~StatusWindow() {} - void StatusWindow::setPosition( SalFrame* ) { } @@ -77,7 +74,7 @@ namespace vcl { class XIMStatusWindow : public StatusWindow { - FixedText m_aStatusText; + VclPtr<FixedText> m_aStatusText; SalFrame* m_pLastParent; Size m_aWindowSize; bool m_bAnchoredAtRight; @@ -104,6 +101,7 @@ public: virtual void setText( const OUString & ) SAL_OVERRIDE; virtual void show( bool bShow, I18NStatus::ShowReason eReason ) SAL_OVERRIDE; virtual void toggle( bool bOn ) SAL_OVERRIDE; + virtual void dispose() SAL_OVERRIDE; // override WorkWindow::DataChanged virtual void DataChanged( const DataChangedEvent& rEvt ) SAL_OVERRIDE; @@ -113,7 +111,7 @@ public: XIMStatusWindow::XIMStatusWindow( bool bOn ) : StatusWindow( WB_BORDER | WB_SYSTEMFLOATWIN | WB_TOOLTIPWIN ), - m_aStatusText( this, 0 ), + m_aStatusText(VclPtr<FixedText>::Create(this, 0)), m_pLastParent( NULL ), m_bAnchoredAtRight( false ), m_bDelayedShow( false ), @@ -126,8 +124,15 @@ XIMStatusWindow::XIMStatusWindow( bool bOn ) : XIMStatusWindow::~XIMStatusWindow() { + disposeOnce(); +} + +void XIMStatusWindow::dispose() +{ if( m_nDelayedEvent ) Application::RemoveUserEvent( m_nDelayedEvent ); + m_aStatusText.disposeAndClear(); + StatusWindow::dispose(); } void XIMStatusWindow::toggle( bool bOn ) @@ -138,8 +143,8 @@ void XIMStatusWindow::toggle( bool bOn ) void XIMStatusWindow::layout() { - m_aWindowSize.Width() = m_aStatusText.GetTextWidth( m_aStatusText.GetText() )+8; - Font aFont( m_aStatusText.GetFont() ); + m_aWindowSize.Width() = m_aStatusText->GetTextWidth( m_aStatusText->GetText() )+8; + Font aFont( m_aStatusText->GetFont() ); m_aWindowSize.Height() = aFont.GetHeight()+10; m_aWindowSize = LogicToPixel( m_aWindowSize ); @@ -147,9 +152,9 @@ void XIMStatusWindow::layout() aControlSize.Width() -= 4; aControlSize.Height() -= 4; - m_aStatusText.SetPosSizePixel( Point( 1, 1 ), aControlSize ); - m_aStatusText.SetFont( aFont ); - m_aStatusText.Show( true ); + m_aStatusText->SetPosSizePixel( Point( 1, 1 ), aControlSize ); + m_aStatusText->SetFont( aFont ); + m_aStatusText->Show( true ); if (m_bAnchoredAtRight && IsVisible()) { @@ -181,7 +186,7 @@ bool XIMStatusWindow::checkLastParent() const void XIMStatusWindow::DataChanged( const DataChangedEvent& ) { - m_aStatusText.SetSettings( GetSettings() ); + m_aStatusText->SetSettings( GetSettings() ); layout(); } @@ -261,7 +266,7 @@ IMPL_LINK_NOARG(XIMStatusWindow, DelayedShowHdl) if( m_bDelayedShow ) { Size aControlSize( m_aWindowSize.Width()-4, m_aWindowSize.Height()-4 ); - m_aStatusText.SetPosSizePixel( Point( 1, 1 ), aControlSize ); + m_aStatusText->SetPosSizePixel( Point( 1, 1 ), aControlSize ); Point aPoint = updatePosition(); pStatusFrame->SetPosSize( aPoint.X(), aPoint.Y(), m_aWindowSize.Width(), m_aWindowSize.Height(), SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y | SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT ); } @@ -276,7 +281,7 @@ IMPL_LINK_NOARG(XIMStatusWindow, DelayedShowHdl) void XIMStatusWindow::show( bool bShow, I18NStatus::ShowReason eReason ) { - if( bShow && m_aStatusText.GetText().isEmpty() ) + if( bShow && m_aStatusText->GetText().isEmpty() ) bShow = false; m_bDelayedShow = bShow; @@ -287,15 +292,15 @@ void XIMStatusWindow::show( bool bShow, I18NStatus::ShowReason eReason ) void XIMStatusWindow::setText( const OUString& rText ) { - m_aStatusText.SetText( rText ); - m_aWindowSize.Width() = m_aStatusText.GetTextWidth( rText )+8; + m_aStatusText->SetText( rText ); + m_aWindowSize.Width() = m_aStatusText->GetTextWidth( rText )+8; } namespace vcl { class IIIMPStatusWindow : public StatusWindow { - MenuButton m_aStatusBtn; + VclPtr<MenuButton> m_aStatusBtn; PopupMenu m_aMenu; SalFrame* m_pResetFocus; bool m_bShow; @@ -307,11 +312,12 @@ class IIIMPStatusWindow : public StatusWindow public: IIIMPStatusWindow( SalFrame* pParent, bool bOn ); // for initial position - virtual ~IIIMPStatusWindow(); virtual void setText( const OUString & ) SAL_OVERRIDE; virtual void show( bool bShow, I18NStatus::ShowReason eReason ) SAL_OVERRIDE; virtual void toggle( bool bOn ) SAL_OVERRIDE; + virtual ~IIIMPStatusWindow() { disposeOnce(); } + virtual void dispose() SAL_OVERRIDE; void layout(); // override Window focus handler @@ -324,7 +330,7 @@ public: IIIMPStatusWindow::IIIMPStatusWindow( SalFrame* pParent, bool bOn ) : StatusWindow( WB_MOVEABLE ), - m_aStatusBtn( this, WB_BORDER ), + m_aStatusBtn(VclPtr<MenuButton>::Create(this, WB_BORDER)), m_pResetFocus( pParent ), m_bShow( true ), m_bOn( bOn ) @@ -333,9 +339,9 @@ IIIMPStatusWindow::IIIMPStatusWindow( SalFrame* pParent, bool bOn ) : layout(); - m_aStatusBtn.SetSelectHdl( LINK( this, IIIMPStatusWindow, SelectHdl ) ); - m_aStatusBtn.SetPopupMenu( &m_aMenu ); - m_aStatusBtn.Show( true ); + m_aStatusBtn->SetSelectHdl( LINK( this, IIIMPStatusWindow, SelectHdl ) ); + m_aStatusBtn->SetPopupMenu( &m_aMenu ); + m_aStatusBtn->Show( true ); const ::std::vector< I18NStatus::ChoiceData >& rChoices( I18NStatus::get().getChoices() ); int i = 1; @@ -363,17 +369,13 @@ IIIMPStatusWindow::IIIMPStatusWindow( SalFrame* pParent, bool bOn ) : EnableAlwaysOnTop( true ); } -IIIMPStatusWindow::~IIIMPStatusWindow() -{ -} - void IIIMPStatusWindow::layout() { - Font aFont( m_aStatusBtn.GetFont() ); + Font aFont( m_aStatusBtn->GetFont() ); Size aSize( 15*aFont.GetHeight(), aFont.GetHeight()+14 ); - aSize = m_aStatusBtn.LogicToPixel( aSize ); + aSize = m_aStatusBtn->LogicToPixel( aSize ); - m_aStatusBtn.SetPosSizePixel( Point( 0, 0 ), aSize ); + m_aStatusBtn->SetPosSizePixel( Point( 0, 0 ), aSize ); SetOutputSizePixel( aSize ); if( IsVisible() ) Invalidate(); @@ -381,13 +383,13 @@ void IIIMPStatusWindow::layout() void IIIMPStatusWindow::DataChanged( const DataChangedEvent& ) { - m_aStatusBtn.SetSettings( GetSettings() ); + m_aStatusBtn->SetSettings( GetSettings() ); layout(); } void IIIMPStatusWindow::setText( const OUString& rText ) { - m_aStatusBtn.SetText( rText ); + m_aStatusBtn->SetText( rText ); } void IIIMPStatusWindow::show( bool bShow, I18NStatus::ShowReason eReason ) @@ -411,6 +413,12 @@ void IIIMPStatusWindow::toggle( bool bOn ) } } +void IIIMPStatusWindow::dispose() +{ + m_aStatusBtn.disposeAndClear(); + StatusWindow::dispose(); +} + void IIIMPStatusWindow::show() { if (m_bOn && m_bShow && !IsVisible()) @@ -454,10 +462,10 @@ void IIIMPStatusWindow::GetFocus() IMPL_LINK( IIIMPStatusWindow, SelectHdl, MenuButton*, pBtn ) { - if( pBtn == & m_aStatusBtn ) + if( pBtn == m_aStatusBtn ) { const ::std::vector< I18NStatus::ChoiceData >& rChoices( I18NStatus::get().getChoices() ); - unsigned int nIndex = m_aStatusBtn.GetCurItemId()-1; + unsigned int nIndex = m_aStatusBtn->GetCurItemId()-1; if( nIndex < rChoices.size() ) { XSetICValues( static_cast<X11SalFrame*>(I18NStatus::get().getParent())->getInputContext()->GetContext(), @@ -515,8 +523,7 @@ I18NStatus::I18NStatus() : I18NStatus::~I18NStatus() { - if( m_pStatusWindow ) - delete m_pStatusWindow, m_pStatusWindow = NULL; + m_pStatusWindow.disposeAndClear(); if( pInstance == this ) pInstance = NULL; } @@ -528,10 +535,10 @@ void I18NStatus::setParent( SalFrame* pParent ) { bool bIIIMPmode = m_aChoices.begin() != m_aChoices.end(); if( bIIIMPmode ) - m_pStatusWindow = new IIIMPStatusWindow( pParent, + m_pStatusWindow = VclPtr<IIIMPStatusWindow>::Create( pParent, getStatusWindowMode() ); else - m_pStatusWindow = new XIMStatusWindow( getStatusWindowMode() ); + m_pStatusWindow = VclPtr<XIMStatusWindow>::Create( getStatusWindowMode() ); setStatusText( m_aCurrentIM ); } m_pStatusWindow->setPosition( m_pParent ); @@ -599,7 +606,7 @@ SalFrame* I18NStatus::getStatusFrame() const void I18NStatus::toggleStatusWindow() { - if (m_pStatusWindow != 0) + if (m_pStatusWindow != nullptr) m_pStatusWindow->toggle(getStatusWindowMode()); } |