diff options
author | Kurt Zenker <kz@openoffice.org> | 2008-03-06 10:49:41 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2008-03-06 10:49:41 +0000 |
commit | 50d29b9f9253b0ec0f8e314343262b1043d06b24 (patch) | |
tree | c6695617e48a0d14e2a06dccfa3818968f89c7c7 /toolkit | |
parent | 672dde158f1a0b1d7e66d87fabc64cbf0a8b7182 (diff) |
INTEGRATION: CWS layout_DEV300 (1.1.2); FILE ADDED
2008/02/12 11:05:46 jcn 1.1.2.2: Annotate classes with TOOLKIT_DLLPUBLIC.
Remove -fvisibility=default, -fno-visibility-inlines-hidden hack.
2008/02/08 18:44:45 jcn 1.1.2.1: Initial toolkit import from ee9a2fcc29d7e2f01cc80ef7c13bf7bc7d55ae7e.
layout/source/awt -> toolkit/source/awt
layout/source/core -> toolkit/source/layout
layout/source/wrapper -> toolkit/source/vclcompat
layout/inc/layout -> toolkit/inc/layout
layout/source/inc -> toolkit/inc/layout
layout/workben -> toolkit/workben/layout
That's ooo-build trunk r11539 @ ooh680-m5/src680-m245.
Diffstat (limited to 'toolkit')
-rw-r--r-- | toolkit/source/vclcompat/wbutton.cxx | 382 |
1 files changed, 382 insertions, 0 deletions
diff --git a/toolkit/source/vclcompat/wbutton.cxx b/toolkit/source/vclcompat/wbutton.cxx new file mode 100644 index 000000000000..d9015323c4a5 --- /dev/null +++ b/toolkit/source/vclcompat/wbutton.cxx @@ -0,0 +1,382 @@ +#include "wrapper.hxx" + +#include <com/sun/star/awt/XActionListener.hpp> +#include <com/sun/star/awt/XButton.hpp> +#include <com/sun/star/awt/XCheckBox.hpp> +#include <com/sun/star/awt/XRadioButton.hpp> +#include <cppuhelper/implbase1.hxx> +#include <toolkit/awt/vclxwindow.hxx> +#include <vcl/event.hxx> +#include <vcl/msgbox.hxx> +#include <vcl/svapp.hxx> +#include <vcl/window.hxx> + +#include <list> + +#include "layoutcore.hxx" + +using namespace ::com::sun::star; + +namespace layout +{ + +// Window/Control/Button +//class TOOLKIT_DLLPUBLIC ButtonImpl : public ControlImpl, +class ButtonImpl : public ControlImpl, + public ::cppu::WeakImplHelper1< awt::XActionListener >, + public ::cppu::WeakImplHelper1< awt::XItemListener > +{ + Link maClickHdl; + protected: + // we add toggle hooks here to cut on code + Link maToggleHdl; + public: + uno::Reference< awt::XButton > mxButton; + ButtonImpl( Context *pCtx, const PeerHandle &xPeer, Window *pWindow ) + : ControlImpl( pCtx, xPeer, pWindow ) + , mxButton( xPeer, uno::UNO_QUERY ) + { + mxButton->addActionListener( this ); + } + + ~ButtonImpl() + { + } + + virtual void Click() { /* make me pure virtual? */ }; + + void SetClickHdl( const Link& rLink ) + { + maClickHdl = rLink; + if ( !rLink ) + mxButton->removeActionListener( this ); + else + mxButton->addActionListener( this ); + } + + virtual void SAL_CALL disposing( const css::lang::EventObject& /* Source */ ) + throw (css::uno::RuntimeException) + { mxButton.clear(); } + + virtual void SAL_CALL actionPerformed( const css::awt::ActionEvent& /* rEvent */ ) + throw (css::uno::RuntimeException) + { + if ( !maClickHdl ) + Click(); + else + maClickHdl.Call( static_cast<Window *>( mpWindow ) ); + } + + virtual // HACK: doesn't need to be virtual... remove in future... + void SAL_CALL itemStateChanged( const css::awt::ItemEvent& /* rEvent */ ) + throw (css::uno::RuntimeException) + { + maToggleHdl.Call( static_cast<Window *>( mpWindow ) ); + } + + BOOL SetModeImage( css::uno::Reference< css::graphic::XGraphic > xGraph ) + { + setProperty( "Graphic", uno::Any( xGraph ) ); + return true; + } +}; + +void Button::SetText( const String& rStr ) +{ + if ( !getImpl().mxButton.is() ) + return; + getImpl().mxButton->setLabel( rStr ); +} + +void Button::SetClickHdl( const Link& rLink ) +{ + getImpl().SetClickHdl( rLink ); +} + +BOOL Button::SetModeImage( const Image& rImage ) +{ + return getImpl().SetModeImage( rImage.getImpl().mxGraphic ); +} + +void Button::SetImageAlign( ImageAlign eAlign ) +{ + getImpl().setProperty( "ImageAlign", uno::Any( (sal_Int16) eAlign ) ); +} + +void Button::Click() +{ +} + +DECL_GET_IMPL_IMPL( Button ) +DECL_CONSTRUCTOR_IMPLS( Button, Control, "button" ); + +// Window/Control/Button/PushButton +class PushButtonImpl : public ButtonImpl +{ + public: + PushButtonImpl( Context *pCtx, const PeerHandle &xPeer, Window *pWindow ) + : ButtonImpl( pCtx, xPeer, pWindow ) {} + + void SetToggleHdl( const Link& rLink ) + { + // XButton doesn't have an explicit event for Toggle. Anyway, it is a + // superset of the clicks: all clicks, and explicit toggles + maToggleHdl = rLink; + if ( !rLink ) + mxButton->removeActionListener( this ); + else + mxButton->addActionListener( this ); + } + + virtual void SAL_CALL actionPerformed( const css::awt::ActionEvent& rEvent ) + throw (css::uno::RuntimeException) + { + ButtonImpl::actionPerformed( rEvent ); + fireToggle(); + } + + inline void fireToggle() + { + maToggleHdl.Call( static_cast<Window *>( mpWindow ) ); + } +}; + +void PushButton::Check( BOOL bCheck ) +{ + getImpl().setProperty( "State", uno::Any( (sal_Int16) !!bCheck ) ); + // XButton doesn't have explicit toggle event + getImpl().fireToggle(); +} + +BOOL PushButton::IsChecked() const +{ + return !!( getImpl().getProperty( "State" ).get< sal_Int16 >() ); +} + +void PushButton::Toggle() +{ + Check( true ); +} + +void PushButton::SetToggleHdl( const Link& rLink ) +{ + getImpl().SetToggleHdl( rLink ); +} + +DECL_GET_IMPL_IMPL( PushButton ) +DECL_CONSTRUCTOR_IMPLS( PushButton, Button, "pushbutton" ); + + // HACK: put every radio button into a group :/ +static std::list< RadioButtonImpl*> mpRadioGroup; + +// Window/Control/Button/RadioButton +class RadioButtonImpl : public ButtonImpl +{ +public: + uno::Reference< awt::XRadioButton > mxRadioButton; + RadioButtonImpl( Context *pCtx, const PeerHandle &xPeer, Window *pWindow ) + : ButtonImpl( pCtx, xPeer, pWindow ) + , mxRadioButton( xPeer, uno::UNO_QUERY ) + { + // TEMP: + mpRadioGroup.push_back( this ); + mxRadioButton->addItemListener( this ); + } + + ~RadioButtonImpl() + { + //mxRadioButton->removeItemListener( this ); + mpRadioGroup.pop_front(); + } + + void Check( BOOL bCheck ) + { + if ( !mxRadioButton.is() ) + return; + mxRadioButton->setState( !!bCheck ); + fireToggle(); + + if ( bCheck ) + unsetOthersGroup( this ); + } + + BOOL IsChecked() + { + if ( !mxRadioButton.is() ) + return FALSE; + return mxRadioButton->getState(); + } + + static void unsetOthersGroup( RadioButtonImpl* current ) + { + // set all others to false + for( std::list< RadioButtonImpl*>::iterator it = mpRadioGroup.begin(); + it != mpRadioGroup.end(); it++ ) + { +#if 0 // BREAKS in OOo + if ( *it != current ) + (*it)->Check( false ); +#else + if ( *it != current && (*it)->IsChecked() ) + { + (*it)->Check( false ); + return; + } +#endif + } + } + + void SetToggleHdl( const Link& rLink ) + { + maToggleHdl = rLink; +#if 0 + if ( !rLink ) + mxRadioButton->removeItemListener( this ); + else + mxRadioButton->addItemListener( this ); +#endif + } + + inline void fireToggle() + { + maToggleHdl.Call( static_cast<Window *>( mpWindow ) ); + } + +//HACK: temp + virtual void SAL_CALL itemStateChanged( const css::awt::ItemEvent& rEvent ) + throw (css::uno::RuntimeException) + { + if ( !!maToggleHdl ) + ButtonImpl::itemStateChanged( rEvent ); + + if ( IsChecked() ) + unsetOthersGroup( this ); + } +}; + +void RadioButton::Check( BOOL bCheck ) +{ + getImpl().Check( bCheck ); +} + +BOOL RadioButton::IsChecked() const +{ + return getImpl().IsChecked(); +} + +void RadioButton::SetToggleHdl( const Link& rLink ) +{ + getImpl().SetToggleHdl( rLink ); +} + +DECL_GET_IMPL_IMPL( RadioButton ) +DECL_CONSTRUCTOR_IMPLS( RadioButton, Button, "radiobutton" ); + +// Window/Control/Button/CheckBox +class CheckBoxImpl : public ButtonImpl +{ + public: + uno::Reference< awt::XCheckBox > mxCheckBox; + CheckBoxImpl( Context *pCtx, const PeerHandle &xPeer, Window *pWindow ) + : ButtonImpl( pCtx, xPeer, pWindow ) + , mxCheckBox( xPeer, uno::UNO_QUERY ) {} + + void SetToggleHdl( const Link& rLink ) + { + maToggleHdl = rLink; + if ( !rLink ) + mxCheckBox->removeItemListener( this ); + else + mxCheckBox->addItemListener( this ); + } +}; + +void CheckBox::Check( BOOL bCheck ) +{ + if ( !getImpl().mxCheckBox.is() ) + return; + getImpl().mxCheckBox->setState( !!bCheck ); +} + +BOOL CheckBox::IsChecked() const +{ + if ( !getImpl().mxCheckBox.is() ) + return FALSE; + return getImpl().mxCheckBox->getState(); +} + +void CheckBox::SetToggleHdl( const Link& rLink ) +{ + getImpl().SetToggleHdl( rLink ); +} + +DECL_GET_IMPL_IMPL( CheckBox ) +DECL_CONSTRUCTOR_IMPLS( CheckBox, Button, "checkbox" ); + +// Window/Control/Button/PushButton/etc +#define BUTTON_IMPL(t, parent, response) \ + class t##Impl : public parent##Impl \ + { \ + public: \ + t##Impl( Context *pCtx, PeerHandle const& xPeer, Window *pWindow ) \ + : parent##Impl( pCtx, xPeer, pWindow ) \ + { \ + } \ + void Click() \ + { \ + Dialog *d = static_cast<Dialog *>( mpCtx ); \ + d->EndDialog( response ); \ + } \ + } + +/* Common button types currently unavailable in OOo: */ +/* mpReset */ +/* mpApply */ +/* mpAction */ +#define RET_RESET 6 +#define RET_APPLY 7 +#define BUTTONID_RESET RET_RESET +#define BUTTONID_APPLY RET_APPLY + +BUTTON_IMPL( OKButton, PushButton, BUTTONID_OK ); +BUTTON_IMPL( CancelButton, PushButton, BUTTONID_CANCEL ); +BUTTON_IMPL( YesButton, PushButton, BUTTONID_YES ); +BUTTON_IMPL( NoButton, PushButton, BUTTONID_NO ); +BUTTON_IMPL( RetryButton, PushButton, BUTTONID_RETRY ); +BUTTON_IMPL( IgnoreButton, PushButton, BUTTONID_IGNORE ); +BUTTON_IMPL( ResetButton, PushButton, BUTTONID_RESET ); +BUTTON_IMPL( ApplyButton, PushButton, BUTTONID_APPLY ); /* Deprecated? */ +BUTTON_IMPL( HelpButton, PushButton, BUTTONID_HELP ); + +DECL_CONSTRUCTOR_IMPLS( OKButton, PushButton, "okbutton" ); +DECL_CONSTRUCTOR_IMPLS( CancelButton, PushButton, "cancelbutton" ); +DECL_CONSTRUCTOR_IMPLS( YesButton, PushButton, "yesbutton" ); +DECL_CONSTRUCTOR_IMPLS( NoButton, PushButton, "nobutton" ); +DECL_CONSTRUCTOR_IMPLS( RetryButton, PushButton, "retrybutton" ); +DECL_CONSTRUCTOR_IMPLS( IgnoreButton, PushButton, "ignorebutton" ); +DECL_CONSTRUCTOR_IMPLS( ResetButton, PushButton, "resetbutton" ); +DECL_CONSTRUCTOR_IMPLS( ApplyButton, PushButton, "applybutton" ); /* Deprecated? */ +DECL_CONSTRUCTOR_IMPLS( HelpButton, PushButton, "helpbutton" ); + + +ImageImpl::ImageImpl( const char *pName ) + : mxGraphic( layoutimpl::loadGraphic( pName ) ) +{ + if ( !mxGraphic.is() ) + { + DBG_ERROR1( "ERROR: failed to load image: `%s'", pName ); + } + +} + +Image::Image( const char *pName ) + : pImpl( new ImageImpl( pName ) ) +{ +} + +Image::~Image() +{ + delete pImpl; +} + +}; // namespace layout |