diff options
author | Norbert Thiebaud <nthiebaud@gmail.com> | 2012-09-01 09:49:15 -0500 |
---|---|---|
committer | Norbert Thiebaud <nthiebaud@gmail.com> | 2012-10-16 11:08:16 -0500 |
commit | 87293419e4ceea4db8104197ae001f1a087ea449 (patch) | |
tree | 9a707ff7f6d0c490d8d2b3a89e8e7d441d5b9ea7 /bf_forms/source/component/forms_Button.cxx | |
parent | rename jpeg_filter to prevent the hiding of global jpeg library (diff) | |
download | binfilter-87293419e4ceea4db8104197ae001f1a087ea449.tar.gz binfilter-87293419e4ceea4db8104197ae001f1a087ea449.zip |
move binfilter structure one directory up
Change-Id: I0d6772e8b1206f8bfdb43122a47958fecf586a40
Diffstat (limited to 'bf_forms/source/component/forms_Button.cxx')
-rw-r--r-- | bf_forms/source/component/forms_Button.cxx | 400 |
1 files changed, 400 insertions, 0 deletions
diff --git a/bf_forms/source/component/forms_Button.cxx b/bf_forms/source/component/forms_Button.cxx new file mode 100644 index 000000000..c37d0ef70 --- /dev/null +++ b/bf_forms/source/component/forms_Button.cxx @@ -0,0 +1,400 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <comphelper/proparrhlp.hxx> +#include "Button.hxx" +#include <tools/urlobj.hxx> +#include <vcl/svapp.hxx> +#include <comphelper/streamsection.hxx> +#include "services.hxx" +#include <com/sun/star/form/FormComponentType.hpp> +#include <com/sun/star/beans/PropertyAttribute.hpp> +#include "bf_so3/staticbaseurl.hxx" + +namespace binfilter { + +//......................................................................... +namespace frm +{ +//......................................................................... +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::sdb; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::form; +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::io; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::util; + +//================================================================== +//= OButtonModel +//================================================================== +DBG_NAME(OButtonModel) +//------------------------------------------------------------------ +InterfaceRef SAL_CALL OButtonModel_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory) +{ + return *(new OButtonModel(_rxFactory)); +} + +//------------------------------------------------------------------ +OButtonModel::OButtonModel(const Reference<XMultiServiceFactory>& _rxFactory) + :OImageModel(_rxFactory, VCL_CONTROLMODEL_COMMANDBUTTON, FRM_CONTROL_COMMANDBUTTON) + // use the old control name for compytibility reasons +{ + DBG_CTOR( OButtonModel, NULL ); + m_nClassId = FormComponentType::COMMANDBUTTON; +} + +//------------------------------------------------------------------ +OButtonModel::OButtonModel( const OButtonModel* _pOriginal, const Reference<XMultiServiceFactory>& _rxFactory ) + :OImageModel( _pOriginal, _rxFactory ) +{ + DBG_CTOR( OButtonModel, NULL ); + implInitializeImageURL(); +} + +//------------------------------------------------------------------------------ +OButtonModel::~OButtonModel() +{ + DBG_DTOR(OButtonModel, NULL); +} + +//------------------------------------------------------------------------------ +Reference<XPropertySetInfo> SAL_CALL OButtonModel::getPropertySetInfo() throw( RuntimeException ) +{ + Reference<XPropertySetInfo> xInfo( createPropertySetInfo( getInfoHelper() ) ); + return xInfo; +} + +//------------------------------------------------------------------------------ +void OButtonModel::fillProperties( + Sequence< Property >& _rProps, + Sequence< Property >& _rAggregateProps ) const +{ + FRM_BEGIN_PROP_HELPER(8) + DECL_PROP2(CLASSID, sal_Int16, READONLY, TRANSIENT); + DECL_PROP1(BUTTONTYPE, FormButtonType, BOUND); + DECL_PROP1(DISPATCHURLINTERNAL, sal_Bool, BOUND); + DECL_PROP1(TARGET_URL, ::rtl::OUString, BOUND); + DECL_PROP1(TARGET_FRAME, ::rtl::OUString, BOUND); + DECL_PROP1(NAME, ::rtl::OUString, BOUND); + DECL_PROP1(TAG, ::rtl::OUString, BOUND); + DECL_PROP1(TABINDEX, sal_Int16, BOUND); + FRM_END_PROP_HELPER(); +} + +//------------------------------------------------------------------------------ +::cppu::IPropertyArrayHelper& OButtonModel::getInfoHelper() +{ + return *const_cast<OButtonModel*>(this)->getArrayHelper(); +} + +//------------------------------------------------------------------------------ +IMPLEMENT_DEFAULT_CLONING( OButtonModel ) + +// XServiceInfo +//------------------------------------------------------------------------------ +StringSequence OButtonModel::getSupportedServiceNames() throw() +{ + StringSequence aSupported = OControlModel::getSupportedServiceNames(); + aSupported.realloc(aSupported.getLength() + 1); + + ::rtl::OUString*pArray = aSupported.getArray(); + pArray[aSupported.getLength()-1] = FRM_SUN_COMPONENT_COMMANDBUTTON; + return aSupported; +} + +//------------------------------------------------------------------------------ +::rtl::OUString OButtonModel::getServiceName() throw ( ::com::sun::star::uno::RuntimeException) +{ + return FRM_COMPONENT_COMMANDBUTTON; // old (non-sun) name for compatibility ! +} + +//------------------------------------------------------------------------------ +void OButtonModel::write(const Reference<XObjectOutputStream>& _rxOutStream) throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException) +{ + OImageModel::write(_rxOutStream); + + _rxOutStream->writeShort(0x0003); // Version + + { + OStreamSection aSection( _rxOutStream.get() ); + // this will allow readers to skip unknown bytes in their dtor + + _rxOutStream->writeShort( (sal_uInt16)m_eButtonType ); + + ::rtl::OUString sTmp = INetURLObject::decode(::binfilter::StaticBaseUrl::AbsToRel( m_sTargetURL ), '%', INetURLObject::DECODE_UNAMBIGUOUS); + _rxOutStream << sTmp; + _rxOutStream << m_sTargetFrame; + writeHelpTextCompatibly(_rxOutStream); + _rxOutStream << isDispatchUrlInternal(); + } +} + +//------------------------------------------------------------------------------ +void OButtonModel::read(const Reference<XObjectInputStream>& _rxInStream) throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException) +{ + OImageModel::read(_rxInStream); + + sal_uInt16 nVersion = _rxInStream->readShort(); // Version + switch (nVersion) + { + case 0x0001: + { + m_eButtonType = (FormButtonType)_rxInStream->readShort(); + + ::rtl::OUString sTmp; + _rxInStream >> sTmp; + m_sTargetURL = ::binfilter::StaticBaseUrl::RelToAbs( sTmp ); + _rxInStream >> m_sTargetFrame; + } + break; + + case 0x0002: + { + m_eButtonType = (FormButtonType)_rxInStream->readShort(); + + ::rtl::OUString sTmp; + _rxInStream >> sTmp; + m_sTargetURL = ::binfilter::StaticBaseUrl::RelToAbs( sTmp ); + _rxInStream >> m_sTargetFrame; + readHelpTextCompatibly(_rxInStream); + } + break; + + case 0x0003: + { + OStreamSection aSection( _rxInStream.get() ); + // this will skip any unknown bytes in it's dtor + + // button type + m_eButtonType = (FormButtonType)_rxInStream->readShort(); + + // URL + ::rtl::OUString sTmp; + _rxInStream >> sTmp; + m_sTargetURL = ::binfilter::StaticBaseUrl::RelToAbs( sTmp ); + + // target frame + _rxInStream >> m_sTargetFrame; + + // help text + readHelpTextCompatibly(_rxInStream); + + // DispatchInternal + sal_Bool bDispath; + _rxInStream >> bDispath; + setDispatchUrlInternal(bDispath); + } + break; + + default: + OSL_FAIL("OButtonModel::read : unknown version !"); + m_eButtonType = FormButtonType_PUSH; + m_sTargetURL = ::rtl::OUString(); + m_sTargetFrame = ::rtl::OUString(); + break; + } +} + +//================================================================== +// OButtonControl +//================================================================== +//------------------------------------------------------------------ +InterfaceRef SAL_CALL OButtonControl_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory) +{ + return *(new OButtonControl(_rxFactory)); +} + +//------------------------------------------------------------------------------ +Sequence<Type> OButtonControl::_getTypes() +{ + return ::comphelper::concatSequences( + OButtonControl_BASE::getTypes(), OImageControl::_getTypes() + ); +} + +//------------------------------------------------------------------------------ +StringSequence OButtonControl::getSupportedServiceNames() throw() +{ + StringSequence aSupported = OControl::getSupportedServiceNames(); + aSupported.realloc(aSupported.getLength() + 1); + + ::rtl::OUString*pArray = aSupported.getArray(); + pArray[aSupported.getLength()-1] = FRM_SUN_CONTROL_COMMANDBUTTON; + return aSupported; +} + +//------------------------------------------------------------------------------ +OButtonControl::OButtonControl(const Reference<XMultiServiceFactory>& _rxFactory) + :OImageControl(_rxFactory, VCL_CONTROL_COMMANDBUTTON) + ,nClickEvent(0) +{ + increment(m_refCount); + { + // als ActionListener anmelden + Reference<XButton> xButton; + query_aggregation( m_xAggregate, xButton); + if (xButton.is()) + xButton->addActionListener(this); + } + // Refcount bei 1 fuer Listener + /*sal_Int32 n =*/ decrement(m_refCount); +} + +//------------------------------------------------------------------------------ +OButtonControl::~OButtonControl() +{ + if (nClickEvent) + Application::RemoveUserEvent(nClickEvent); +} + +// UNO Anbindung +//------------------------------------------------------------------------------ +Any SAL_CALL OButtonControl::queryAggregation(const Type& _rType) throw (RuntimeException) +{ + // if asked for the XTypeProvider, don't let OButtonControl_BASE do this + Any aReturn; + if ( !_rType.equals( ::getCppuType( static_cast< Reference< XTypeProvider >* >( NULL ) ) ) ) + aReturn = OButtonControl_BASE::queryInterface( _rType ); + + if ( !aReturn.hasValue() ) + aReturn = OImageControl::queryAggregation( _rType ); + + return aReturn; +} + +// ActionListener +//------------------------------------------------------------------------------ +void OButtonControl::actionPerformed(const ActionEvent& /*rEvent*/) throw ( ::com::sun::star::uno::RuntimeException) +{ + // Asynchron fuer starutil::URL-Button + sal_uInt32 n = Application::PostUserEvent( LINK(this, OButtonControl,OnClick) ); + { + ::osl::MutexGuard aGuard( m_aMutex ); + nClickEvent = n; + } +} + +//------------------------------------------------------------------------------ +IMPL_LINK( OButtonControl, OnClick, void*, EMPTYARG ) +{ + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + nClickEvent = 0; + + if (m_aApproveActionListeners.getLength()) + { + // Wenn es ApproveAction-Lisener gibt, muss ein eigener Thread + // aufgemacht werden. + if( !m_pThread ) + { + m_pThread = new OImageControlThread_Impl( this ); + m_pThread->acquire(); + m_pThread->create(); + } + m_pThread->addEvent(); + } + else + { + // Sonst nicht. Dann darf man aber auf keinen Fal die Listener + // benachrichtigen, auch dann nicht, wenn er spaeter hinzukommt. + aGuard.clear(); + + // recognize the button type + Reference<XPropertySet> xSet(getModel(), UNO_QUERY); + if (!xSet.is()) + return 0L; + + if (FormButtonType_PUSH == *(FormButtonType*)xSet->getPropertyValue(PROPERTY_BUTTONTYPE).getValue()) + { + // notify the action listeners for a push button + ::cppu::OInterfaceIteratorHelper aIter(m_aActionListeners); + ActionEvent aEvt(static_cast<XWeak*>(this), m_aActionCommand); + while(aIter.hasMoreElements() ) + { + // catch exceptions + // and catch them on a per-listener basis - if one listener fails, the others still need + // to get notified + try + { + static_cast< XActionListener* >( aIter.next() )->actionPerformed(aEvt); + } +#ifdef DBG_UTIL + catch( const RuntimeException& ) + { + // silent this + } +#endif + catch( const Exception& ) + { + OSL_FAIL( "OButtonControl::OnClick: caught a exception other than RuntimeException!" ); + } + } + } + else + actionPerformed_Impl( sal_False ); + } + return 0L; +} + +// XButton +//------------------------------------------------------------------------------ +void OButtonControl::setLabel(const ::rtl::OUString& Label) throw( RuntimeException ) +{ + Reference<XButton> xButton; + query_aggregation( m_xAggregate, xButton ); + if (xButton.is()) + xButton->setLabel(Label); +} + +//------------------------------------------------------------------------------ +void SAL_CALL OButtonControl::setActionCommand(const ::rtl::OUString& _rCommand) throw( RuntimeException ) +{ + { + ::osl::MutexGuard aGuard( m_aMutex ); + m_aActionCommand = _rCommand; + } + + Reference<XButton> xButton; + query_aggregation( m_xAggregate, xButton); + if (xButton.is()) + xButton->setActionCommand(_rCommand); +} + +//------------------------------------------------------------------------------ +void SAL_CALL OButtonControl::addActionListener(const Reference<XActionListener>& _rxListener) throw( RuntimeException ) +{ + m_aActionListeners.addInterface(_rxListener); +} + +//------------------------------------------------------------------------------ +void SAL_CALL OButtonControl::removeActionListener(const Reference<XActionListener>& _rxListener) throw( RuntimeException ) +{ + m_aActionListeners.removeInterface(_rxListener); +} + +//......................................................................... +} // namespace frm +//......................................................................... + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |