summaryrefslogtreecommitdiffstats
path: root/bf_forms/source/component/forms_Button.cxx
diff options
context:
space:
mode:
authorNorbert Thiebaud <nthiebaud@gmail.com>2012-09-01 09:49:15 -0500
committerNorbert Thiebaud <nthiebaud@gmail.com>2012-10-16 11:08:16 -0500
commit87293419e4ceea4db8104197ae001f1a087ea449 (patch)
tree9a707ff7f6d0c490d8d2b3a89e8e7d441d5b9ea7 /bf_forms/source/component/forms_Button.cxx
parentrename jpeg_filter to prevent the hiding of global jpeg library (diff)
downloadbinfilter-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.cxx400
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: */