summaryrefslogtreecommitdiff
path: root/forms/source/component/clickableimage.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'forms/source/component/clickableimage.cxx')
-rw-r--r--forms/source/component/clickableimage.cxx927
1 files changed, 0 insertions, 927 deletions
diff --git a/forms/source/component/clickableimage.cxx b/forms/source/component/clickableimage.cxx
deleted file mode 100644
index 249094849..000000000
--- a/forms/source/component/clickableimage.cxx
+++ /dev/null
@@ -1,927 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_forms.hxx"
-#include "clickableimage.hxx"
-#include "controlfeatureinterception.hxx"
-#include "urltransformer.hxx"
-#include "componenttools.hxx"
-#include <com/sun/star/form/XSubmit.hpp>
-#include <com/sun/star/awt/SystemPointer.hpp>
-#include <com/sun/star/form/FormComponentType.hpp>
-#include <com/sun/star/frame/XDispatch.hpp>
-#include <com/sun/star/frame/XDispatchProvider.hpp>
-#include <com/sun/star/frame/FrameSearchFlag.hpp>
-#include <com/sun/star/frame/XController.hpp>
-#include <com/sun/star/frame/XFrame.hpp>
-#include <com/sun/star/awt/ActionEvent.hpp>
-#include <com/sun/star/awt/XActionListener.hpp>
-#include <tools/urlobj.hxx>
-#include <tools/debug.hxx>
-#include <vcl/svapp.hxx>
-#include <sfx2/docfile.hxx>
-#include <sfx2/objsh.hxx>
-#include <osl/mutex.hxx>
-#include "services.hxx"
-#include <comphelper/container.hxx>
-#include <comphelper/listenernotification.hxx>
-#include <svtools/imageresourceaccess.hxx>
-#define LOCAL_URL_PREFIX '#'
-
-//.........................................................................
-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::sdbcx;
- 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;
- using namespace ::com::sun::star::frame;
- using namespace ::com::sun::star::form::submission;
- using ::com::sun::star::awt::MouseEvent;
- using ::com::sun::star::task::XInteractionHandler;
-
- //==================================================================
- // OClickableImageBaseControl
- //==================================================================
- //------------------------------------------------------------------------------
- Sequence<Type> OClickableImageBaseControl::_getTypes()
- {
- static Sequence<Type> aTypes;
- if (!aTypes.getLength())
- aTypes = concatSequences(OControl::_getTypes(), OClickableImageBaseControl_BASE::getTypes());
- return aTypes;
- }
-
- //------------------------------------------------------------------------------
- OClickableImageBaseControl::OClickableImageBaseControl(const Reference<XMultiServiceFactory>& _rxFactory, const ::rtl::OUString& _aService)
- :OControl(_rxFactory, _aService)
- ,m_pThread(NULL)
- ,m_aSubmissionVetoListeners( m_aMutex )
- ,m_aApproveActionListeners( m_aMutex )
- ,m_aActionListeners( m_aMutex )
- {
- m_pFeatureInterception.reset( new ControlFeatureInterception( _rxFactory ) );
- }
-
- //------------------------------------------------------------------------------
- OClickableImageBaseControl::~OClickableImageBaseControl()
- {
- if (!OComponentHelper::rBHelper.bDisposed)
- {
- acquire();
- dispose();
- }
- }
-
- // UNO Anbindung
- //------------------------------------------------------------------------------
- Any SAL_CALL OClickableImageBaseControl::queryAggregation(const Type& _rType) throw (RuntimeException)
- {
- Any aReturn = OControl::queryAggregation(_rType);
- if (!aReturn.hasValue())
- aReturn = OClickableImageBaseControl_BASE::queryInterface(_rType);
- return aReturn;
- }
-
- // XApproveActionBroadcaster
- //------------------------------------------------------------------------------
- void OClickableImageBaseControl::addApproveActionListener(
- const Reference<XApproveActionListener>& l) throw( RuntimeException )
- {
- m_aApproveActionListeners.addInterface(l);
- }
-
- //------------------------------------------------------------------------------
- void OClickableImageBaseControl::removeApproveActionListener(
- const Reference<XApproveActionListener>& l) throw( RuntimeException )
- {
- m_aApproveActionListeners.removeInterface(l);
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL OClickableImageBaseControl::registerDispatchProviderInterceptor( const Reference< XDispatchProviderInterceptor >& _rxInterceptor ) throw (RuntimeException)
- {
- m_pFeatureInterception->registerDispatchProviderInterceptor( _rxInterceptor );
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL OClickableImageBaseControl::releaseDispatchProviderInterceptor( const Reference< XDispatchProviderInterceptor >& _rxInterceptor ) throw (RuntimeException)
- {
- m_pFeatureInterception->releaseDispatchProviderInterceptor( _rxInterceptor );
- }
-
- // OComponentHelper
- //------------------------------------------------------------------------------
- void OClickableImageBaseControl::disposing()
- {
- EventObject aEvent( static_cast< XWeak* >( this ) );
- m_aApproveActionListeners.disposeAndClear( aEvent );
- m_aActionListeners.disposeAndClear( aEvent );
- m_aSubmissionVetoListeners.disposeAndClear( aEvent );
- m_pFeatureInterception->dispose();
-
- {
- ::osl::MutexGuard aGuard( m_aMutex );
- if( m_pThread )
- {
- m_pThread->release();
- m_pThread = NULL;
- }
- }
-
- OControl::disposing();
- }
-
- //------------------------------------------------------------------------------
- OImageProducerThread_Impl* OClickableImageBaseControl::getImageProducerThread()
- {
- if ( !m_pThread )
- {
- m_pThread = new OImageProducerThread_Impl( this );
- m_pThread->acquire();
- m_pThread->create();
- }
- return m_pThread;
- }
-
- //------------------------------------------------------------------------------
- bool OClickableImageBaseControl::approveAction( )
- {
- sal_Bool bCancelled = sal_False;
- EventObject aEvent( static_cast< XWeak* >( this ) );
-
- ::cppu::OInterfaceIteratorHelper aIter( m_aApproveActionListeners );
- while( !bCancelled && aIter.hasMoreElements() )
- {
- // Jede approveAction-Methode muss thread-safe sein!!!
- if( !static_cast< XApproveActionListener* >( aIter.next() )->approveAction( aEvent ) )
- bCancelled = sal_True;
- }
-
- return !bCancelled;
- }
-
- //------------------------------------------------------------------------------
- // Diese Methode wird auch aus einem Thread gerufen und muss deshalb
- // thread-safe sein.
- void OClickableImageBaseControl::actionPerformed_Impl(sal_Bool bNotifyListener, const MouseEvent& rEvt)
- {
- if( bNotifyListener )
- {
- if ( !approveAction() )
- return;
- }
-
- // Ob der Rest des Codes Thread-Safe ist weiss man nicht genau. Deshalb
- // wird das meiste bei gelocktem Solar-Mutex erledigen.
- Reference<XPropertySet> xSet;
- Reference< XInterface > xModelsParent;
- FormButtonType eButtonType = FormButtonType_PUSH;
- {
- SolarMutexGuard aGuard;
-
- // Parent holen
- Reference<XFormComponent> xComp(getModel(), UNO_QUERY);
- if (!xComp.is())
- return;
-
- xModelsParent = xComp->getParent();
- if (!xModelsParent.is())
- return;
-
- // which button type?
- xSet = xSet.query( xComp );
- if ( !xSet.is() )
- return;
- xSet->getPropertyValue(PROPERTY_BUTTONTYPE) >>= eButtonType;
- }
-
- switch (eButtonType)
- {
- case FormButtonType_RESET:
- {
- // reset-Methoden muessen thread-safe sein!
- Reference<XReset> xReset(xModelsParent, UNO_QUERY);
- if (!xReset.is())
- return;
-
- xReset->reset();
- }
- break;
-
- case FormButtonType_SUBMIT:
- {
- // if some outer component can provide an interaction handler, use it
- Reference< XInteractionHandler > xHandler( m_pFeatureInterception->queryDispatch( "private:/InteractionHandler" ), UNO_QUERY );
- try
- {
- implSubmit( rEvt, xHandler );
- }
- catch( const Exception& )
- {
- // ignore
- }
- }
- break;
-
- case FormButtonType_URL:
- {
- SolarMutexGuard aGuard;
-
- Reference< XModel > xModel = getXModel(xModelsParent);
- if (!xModel.is())
- return;
-
- ///////////////////////////////////////////////////////////////////////
- // Jetzt URL ausfuehren
- Reference< XController > xController = xModel->getCurrentController();
- if (!xController.is())
- return;
-
- Reference< XFrame > xFrame = xController->getFrame();
- if( !xFrame.is() )
- return;
-
- URL aURL;
- aURL.Complete =
- getString(xSet->getPropertyValue(PROPERTY_TARGET_URL));
-
- if (aURL.Complete.getLength() && (LOCAL_URL_PREFIX == aURL.Complete.getStr()[0]))
- { // the URL contains a local URL only. Since the URLTransformer does not handle this case correctly
- // (it can't: it does not know the document URL), we have to take care for this ourself.
- // The real solution would be to not allow such relative URLs (there is a rule that at runtime, all
- // URLs have to be absolute), but for compatibility reasons this is no option.
- // The more as the user does not want to see a local URL as "file://<path>/<document>#mark" if it
- // could be "#mark" as well.
- // If we someday say that this hack (yes, it's kind of a hack) is not sustainable anymore, the complete
- // solutiuon would be:
- // * recognize URLs consisting of a mark only while _reading_ the document
- // * for this, allow the INetURLObject (which at the moment is invoked when reading URLs) to
- // transform such mark-only URLs into correct absolute URLs
- // * at the UI, show only the mark
- // * !!!! recognize every SAVEAS on the document, so the absolute URL can be adjusted. This seems
- // rather impossible !!!
- aURL.Mark = aURL.Complete;
- aURL.Complete = xModel->getURL();
- aURL.Complete += aURL.Mark;
- }
-
- sal_Bool bDispatchUrlInternal = sal_False;
- xSet->getPropertyValue(PROPERTY_DISPATCHURLINTERNAL) >>= bDispatchUrlInternal;
- if ( bDispatchUrlInternal )
- {
- m_pFeatureInterception->getTransformer().parseSmartWithAsciiProtocol( aURL, INET_FILE_SCHEME );
-
- ::rtl::OUString aTargetFrame;
- xSet->getPropertyValue(PROPERTY_TARGET_FRAME) >>= aTargetFrame;
-
- Reference< XDispatch > xDisp = Reference< XDispatchProvider > (xFrame,UNO_QUERY)->queryDispatch( aURL, aTargetFrame,
- FrameSearchFlag::SELF | FrameSearchFlag::PARENT |
- FrameSearchFlag::SIBLINGS | FrameSearchFlag::CREATE );
-
- Sequence<PropertyValue> aArgs(1);
- PropertyValue& rProp = aArgs.getArray()[0];
- rProp.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Referer") );
- rProp.Value <<= xModel->getURL();
-
- if (xDisp.is())
- xDisp->dispatch( aURL, aArgs );
- }
- else
- {
- URL aHyperLink = m_pFeatureInterception->getTransformer().getStrictURLFromAscii( ".uno:OpenHyperlink" );
-
- Reference< XDispatch > xDisp = Reference< XDispatchProvider > (xFrame,UNO_QUERY)->queryDispatch(aHyperLink, ::rtl::OUString() , 0);
-
- if ( xDisp.is() )
- {
- Sequence<PropertyValue> aProps(3);
- aProps[0].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("URL"));
- aProps[0].Value <<= aURL.Complete;
-
- aProps[1].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FrameName"));
- aProps[1].Value = xSet->getPropertyValue(PROPERTY_TARGET_FRAME);
-
- aProps[2].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Referer"));
- aProps[2].Value <<= xModel->getURL();
-
- xDisp->dispatch( aHyperLink, aProps );
- }
- }
- } break;
- default:
- {
- // notify the action listeners for a push button
- ActionEvent aEvt(static_cast<XWeak*>(this), m_aActionCommand);
- m_aActionListeners.notifyEach( &XActionListener::actionPerformed, aEvt );
- }
- }
- }
-
-
- //--------------------------------------------------------------------
- void SAL_CALL OClickableImageBaseControl::addSubmissionVetoListener( const Reference< submission::XSubmissionVetoListener >& listener ) throw (NoSupportException, RuntimeException)
- {
- m_aSubmissionVetoListeners.addInterface( listener );
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL OClickableImageBaseControl::removeSubmissionVetoListener( const Reference< submission::XSubmissionVetoListener >& listener ) throw (NoSupportException, RuntimeException)
- {
- m_aSubmissionVetoListeners.removeInterface( listener );
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL OClickableImageBaseControl::submitWithInteraction( const Reference< XInteractionHandler >& _rxHandler ) throw (VetoException, WrappedTargetException, RuntimeException)
- {
- implSubmit( MouseEvent(), _rxHandler );
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL OClickableImageBaseControl::submit( ) throw (VetoException, WrappedTargetException, RuntimeException)
- {
- implSubmit( MouseEvent(), NULL );
- }
-
- //--------------------------------------------------------------------
- Sequence< ::rtl::OUString > SAL_CALL OClickableImageBaseControl::getSupportedServiceNames( ) throw (RuntimeException)
- {
- Sequence< ::rtl::OUString > aSupported = OControl::getSupportedServiceNames();
- aSupported.realloc( aSupported.getLength() + 1 );
-
- ::rtl::OUString* pArray = aSupported.getArray();
- pArray[ aSupported.getLength() - 1 ] = FRM_SUN_CONTROL_SUBMITBUTTON;
-
- return aSupported;
- }
-
- //--------------------------------------------------------------------
- void OClickableImageBaseControl::implSubmit( const MouseEvent& _rEvent, const Reference< XInteractionHandler >& _rxHandler ) SAL_THROW((VetoException, WrappedTargetException, RuntimeException))
- {
- try
- {
- // allow the veto listeners to join the game
- m_aSubmissionVetoListeners.notifyEach( &XSubmissionVetoListener::submitting, EventObject( *this ) );
-
- // see whether there's an "submit interceptor" set at our model
- Reference< submission::XSubmissionSupplier > xSubmissionSupp( getModel(), UNO_QUERY );
- Reference< XSubmission > xSubmission;
- if ( xSubmissionSupp.is() )
- xSubmission = xSubmissionSupp->getSubmission();
-
- if ( xSubmission.is() )
- {
- if ( !_rxHandler.is() )
- xSubmission->submit();
- else
- xSubmission->submitWithInteraction( _rxHandler );
- }
- else
- {
- // no "interceptor" -> ordinary (old-way) submission
- Reference< XChild > xChild( getModel(), UNO_QUERY );
- Reference< XSubmit > xParentSubmission;
- if ( xChild.is() )
- xParentSubmission = xParentSubmission.query( xChild->getParent() );
- if ( xParentSubmission.is() )
- xParentSubmission->submit( this, _rEvent );
- }
- }
- catch( const VetoException& )
- {
- // allowed to leave
- throw;
- }
- catch( const RuntimeException& )
- {
- // allowed to leave
- throw;
- }
- catch( const WrappedTargetException& e )
- {
- // allowed to leave
- throw;
- }
- catch( const Exception& e )
- {
- OSL_FAIL( "OClickableImageBaseControl::implSubmit: caught an unknown exception!" );
- throw WrappedTargetException( ::rtl::OUString(), *this, makeAny( e ) );
- }
- }
-
- //==================================================================
- // OClickableImageBaseModel
- //==================================================================
- //------------------------------------------------------------------------------
- Sequence<Type> OClickableImageBaseModel::_getTypes()
- {
- return concatSequences(
- OControlModel::_getTypes(),
- OClickableImageBaseModel_Base::getTypes()
- );
- }
-
- //------------------------------------------------------------------
- DBG_NAME( OClickableImageBaseModel )
- //------------------------------------------------------------------
- OClickableImageBaseModel::OClickableImageBaseModel( const Reference< XMultiServiceFactory >& _rxFactory, const ::rtl::OUString& _rUnoControlModelTypeName,
- const ::rtl::OUString& rDefault )
- :OControlModel( _rxFactory, _rUnoControlModelTypeName, rDefault )
- ,OPropertyChangeListener(m_aMutex)
- ,m_pMedium(NULL)
- ,m_pProducer( NULL )
- ,m_bDispatchUrlInternal(sal_False)
- ,m_bDownloading(sal_False)
- ,m_bProdStarted(sal_False)
- {
- DBG_CTOR( OClickableImageBaseModel, NULL );
- implConstruct();
- m_eButtonType = FormButtonType_PUSH;
- }
-
- //------------------------------------------------------------------
- OClickableImageBaseModel::OClickableImageBaseModel( const OClickableImageBaseModel* _pOriginal, const Reference<XMultiServiceFactory>& _rxFactory )
- :OControlModel( _pOriginal, _rxFactory )
- ,OPropertyChangeListener( m_aMutex )
- ,m_pMedium( NULL )
- ,m_pProducer( NULL )
- ,m_bDispatchUrlInternal(sal_False)
- ,m_bDownloading( sal_False )
- ,m_bProdStarted( sal_False )
- {
- DBG_CTOR( OClickableImageBaseModel, NULL );
- implConstruct();
-
- // copy properties
- m_eButtonType = _pOriginal->m_eButtonType;
- m_sTargetURL = _pOriginal->m_sTargetURL;
- m_sTargetFrame = _pOriginal->m_sTargetFrame;
- m_bDispatchUrlInternal = _pOriginal->m_bDispatchUrlInternal;
- }
-
- //------------------------------------------------------------------------------
- void OClickableImageBaseModel::implInitializeImageURL( )
- {
- osl_incrementInterlockedCount( &m_refCount );
- {
- // simulate a propertyChanged event for the ImageURL
- Any aImageURL;
- getFastPropertyValue( aImageURL, PROPERTY_ID_IMAGE_URL );
- _propertyChanged( PropertyChangeEvent( *this, PROPERTY_IMAGE_URL, sal_False, PROPERTY_ID_IMAGE_URL, Any( ), aImageURL ) );
- }
- osl_decrementInterlockedCount( &m_refCount );
- }
-
- //------------------------------------------------------------------------------
- void OClickableImageBaseModel::implConstruct()
- {
- m_pProducer = new ImageProducer;
- increment( m_refCount );
- {
- m_xProducer = m_pProducer;
-
- if ( m_xAggregateSet.is() )
- {
- OPropertyChangeMultiplexer* pMultiplexer = new OPropertyChangeMultiplexer( this, m_xAggregateSet );
- pMultiplexer->addProperty( PROPERTY_IMAGE_URL );
- }
- }
- decrement(m_refCount);
- }
-
- //------------------------------------------------------------------------------
- OClickableImageBaseModel::~OClickableImageBaseModel()
- {
- if (!OComponentHelper::rBHelper.bDisposed)
- {
- acquire();
- dispose();
- }
- DBG_ASSERT(m_pMedium == NULL, "OClickableImageBaseModel::~OClickableImageBaseModel : leaving a memory leak ...");
- // spaetestens im dispose sollte das aufgeraeumt worden sein
-
- DBG_DTOR( OClickableImageBaseModel, NULL );
- }
-
- // XImageProducer
- //--------------------------------------------------------------------
- void SAL_CALL OClickableImageBaseModel::addConsumer( const Reference< XImageConsumer >& _rxConsumer ) throw (RuntimeException)
- {
- ImageModelMethodGuard aGuard( *this );
- GetImageProducer()->addConsumer( _rxConsumer );
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL OClickableImageBaseModel::removeConsumer( const Reference< XImageConsumer >& _rxConsumer ) throw (RuntimeException)
- {
- ImageModelMethodGuard aGuard( *this );
- GetImageProducer()->removeConsumer( _rxConsumer );
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL OClickableImageBaseModel::startProduction( ) throw (RuntimeException)
- {
- ImageModelMethodGuard aGuard( *this );
- GetImageProducer()->startProduction();
- }
-
- //--------------------------------------------------------------------
- Reference< submission::XSubmission > SAL_CALL OClickableImageBaseModel::getSubmission() throw (RuntimeException)
- {
- return m_xSubmissionDelegate;
- }
-
- //--------------------------------------------------------------------
- void SAL_CALL OClickableImageBaseModel::setSubmission( const Reference< submission::XSubmission >& _submission ) throw (RuntimeException)
- {
- m_xSubmissionDelegate = _submission;
- }
-
- //--------------------------------------------------------------------
- Sequence< ::rtl::OUString > SAL_CALL OClickableImageBaseModel::getSupportedServiceNames( ) throw (RuntimeException)
- {
- Sequence< ::rtl::OUString > aSupported = OControlModel::getSupportedServiceNames();
- aSupported.realloc( aSupported.getLength() + 1 );
-
- ::rtl::OUString* pArray = aSupported.getArray();
- pArray[ aSupported.getLength() - 1 ] = FRM_SUN_COMPONENT_SUBMITBUTTON;
-
- return aSupported;
- }
-
- // OComponentHelper
- //------------------------------------------------------------------------------
- void OClickableImageBaseModel::disposing()
- {
- OControlModel::disposing();
- if (m_pMedium)
- {
- delete m_pMedium;
- m_pMedium = NULL;
- }
-
- m_xProducer = NULL;
- m_pProducer = NULL;
- }
-
- //------------------------------------------------------------------------------
- Any SAL_CALL OClickableImageBaseModel::queryAggregation(const Type& _rType) throw (RuntimeException)
- {
- // order matters:
- // we definately want to "overload" the XImageProducer interface of our aggregate,
- // thus check OClickableImageBaseModel_Base (which provides this) first
- Any aReturn = OClickableImageBaseModel_Base::queryInterface( _rType );
-
- // BUT: _don't_ let it feel responsible for the XTypeProvider interface
- // (as this is implemented by our base class in the proper way)
- if ( _rType.equals( ::getCppuType( static_cast< Reference< XTypeProvider >* >( NULL ) ) )
- || !aReturn.hasValue()
- )
- aReturn = OControlModel::queryAggregation( _rType );
-
- return aReturn;
- }
-
- //------------------------------------------------------------------------------
- void OClickableImageBaseModel::getFastPropertyValue(Any& rValue, sal_Int32 nHandle) const
- {
- switch (nHandle)
- {
- case PROPERTY_ID_BUTTONTYPE : rValue <<= m_eButtonType; break;
- case PROPERTY_ID_TARGET_URL : rValue <<= m_sTargetURL; break;
- case PROPERTY_ID_TARGET_FRAME : rValue <<= m_sTargetFrame; break;
- case PROPERTY_ID_DISPATCHURLINTERNAL : rValue <<= m_bDispatchUrlInternal; break;
- default:
- OControlModel::getFastPropertyValue(rValue, nHandle);
- }
- }
-
- //------------------------------------------------------------------------------
- void OClickableImageBaseModel::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, const Any& rValue) throw ( Exception)
- {
- switch (nHandle)
- {
- case PROPERTY_ID_BUTTONTYPE :
- DBG_ASSERT(isA(rValue, static_cast<FormButtonType*>(NULL)), "OClickableImageBaseModel::setFastPropertyValue_NoBroadcast : invalid type !" );
- rValue >>= m_eButtonType;
- break;
-
- case PROPERTY_ID_TARGET_URL :
- DBG_ASSERT(rValue.getValueType().getTypeClass() == TypeClass_STRING, "OClickableImageBaseModel::setFastPropertyValue_NoBroadcast : invalid type !" );
- rValue >>= m_sTargetURL;
- break;
-
- case PROPERTY_ID_TARGET_FRAME :
- DBG_ASSERT(rValue.getValueType().getTypeClass() == TypeClass_STRING, "OClickableImageBaseModel::setFastPropertyValue_NoBroadcast : invalid type !" );
- rValue >>= m_sTargetFrame;
- break;
-
- case PROPERTY_ID_DISPATCHURLINTERNAL:
- DBG_ASSERT(rValue.getValueType().getTypeClass() == TypeClass_BOOLEAN, "OClickableImageBaseModel::setFastPropertyValue_NoBroadcast : invalid type !" );
- rValue >>= m_bDispatchUrlInternal;
- break;
-
- default:
- OControlModel::setFastPropertyValue_NoBroadcast(nHandle, rValue);
- }
- }
-
- //------------------------------------------------------------------------------
- sal_Bool OClickableImageBaseModel::convertFastPropertyValue(Any& rConvertedValue, Any& rOldValue, sal_Int32 nHandle, const Any& rValue)
- throw( IllegalArgumentException )
- {
- switch (nHandle)
- {
- case PROPERTY_ID_BUTTONTYPE :
- return tryPropertyValueEnum( rConvertedValue, rOldValue, rValue, m_eButtonType );
-
- case PROPERTY_ID_TARGET_URL :
- return tryPropertyValue(rConvertedValue, rOldValue, rValue, m_sTargetURL);
-
- case PROPERTY_ID_TARGET_FRAME :
- return tryPropertyValue(rConvertedValue, rOldValue, rValue, m_sTargetFrame);
-
- case PROPERTY_ID_DISPATCHURLINTERNAL :
- return tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bDispatchUrlInternal);
-
- default:
- return OControlModel::convertFastPropertyValue(rConvertedValue, rOldValue, nHandle, rValue);
- }
- }
-
- //------------------------------------------------------------------------------
- void OClickableImageBaseModel::StartProduction()
- {
- ImageProducer *pImgProd = GetImageProducer();
- // grab the ImageURL
- rtl::OUString sURL;
- getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ImageURL") ) ) >>= sURL;
- if (!m_pMedium)
- {
- if ( ::svt::GraphicAccess::isSupportedURL( sURL ) )
- pImgProd->SetImage( sURL );
- else
- // caution: the medium may be NULL if somebody gave us a invalid URL to work with
- pImgProd->SetImage(String());
- m_bDownloading = sal_False;
- return;
- }
- if (m_pMedium->GetErrorCode()==0)
- {
- SvStream* pStream = m_pMedium->GetInStream();
-
- pImgProd->SetImage(*pStream);
- pImgProd->startProduction();
- m_bProdStarted = sal_True;
- }
- else
- {
- pImgProd->SetImage(String());
- delete m_pMedium;
- m_pMedium = 0;
- m_bDownloading = sal_False;
- }
- }
-
- //------------------------------------------------------------------------------
- void OClickableImageBaseModel::SetURL( const ::rtl::OUString& rURL )
- {
- if (m_pMedium || !rURL.getLength())
- {
- // Den Stream am Producer freigeben, bevor das Medium geloscht wird.
- GetImageProducer()->SetImage(String());
- delete m_pMedium;
- m_pMedium = NULL;
- }
-
- // the SfxMedium is not allowed to be created with an invalid URL, so we have to check this first
- INetURLObject aUrl(rURL);
- if (INET_PROT_NOT_VALID == aUrl.GetProtocol())
- // we treat an invalid URL like we would treat no URL
- return;
-
- if (rURL.getLength() && !::svt::GraphicAccess::isSupportedURL( rURL ) )
- {
- if (m_pMedium)
- delete m_pMedium;
-
- m_pMedium = new SfxMedium(rURL, STREAM_STD_READ, sal_False);
- m_pMedium->SetDataAvailableLink(
- STATIC_LINK(this, OClickableImageBaseModel, DataAvailableLink));
-
- // Das XModel suchen, um an die Object-Shell oder zumindest den
- // Referer zu gelangen.
- // Das Model findet man allerdings nur beim Laden von HTML-Dokumenten
- // und dann, wenn die URL in einem bereits geladenen Dokument
- // geaendert wird. Waehrend des Ladens kommt man nicht an das
- // Model ran.
- Reference< XModel > xModel;
- InterfaceRef xIfc( *this );
- while( !xModel.is() && xIfc.is() )
- {
- Reference<XChild> xChild( xIfc, UNO_QUERY );
- xIfc = xChild->getParent();
- query_interface(xIfc, xModel);
- }
-
- // Die Object-Shell suchen, indem wir
- // ueber alle Object-Shells iterieren und deren XModel mit dem
- // eigenen vergleichen. Als Optimierung probieren wir aber erstmal
- // die aktuelle Object-Shell.
- // wir unser XModel mit dem aller Object
- SfxObjectShell *pObjSh = 0;
-
- if( xModel.is() )
- {
- SfxObjectShell *pTestObjSh = SfxObjectShell::Current();
- if( pTestObjSh )
- {
- Reference< XModel > xTestModel = pTestObjSh->GetModel();
- if( xTestModel == xModel )
- pObjSh = pTestObjSh;
- }
- if( !pObjSh )
- {
- pTestObjSh = SfxObjectShell::GetFirst();
- while( !pObjSh && pTestObjSh )
- {
- Reference< XModel > xTestModel = pTestObjSh->GetModel();
- if( xTestModel == xModel )
- pObjSh = pTestObjSh;
- else
- pTestObjSh = SfxObjectShell::GetNext( *pTestObjSh );
- }
- }
- }
-
- #ifdef USE_REGISTER_TRANSFER
- if( pObjSh )
- {
- // Medium registrieren, damit abgebrochen werden kann
- pObjSh->RegisterTransfer( *m_pMedium );
-
- // Target-Frame uebertragen, damit auch javascript:-URLs
- // "geladen" werden koennen.
- const SfxMedium *pShMedium = pObjSh->GetMedium();
- if( pShMedium )
- m_pMedium->SetLoadTargetFrame(pShMedium->GetLoadTargetFrame());
- }
- else
- {
- // Keine Object-Shell, aber ein Medium? Dann uebernehmen wir
- // zumindest den Referer.
- if( xModel.is() )
- {
- ::rtl::OUString sReferer( xModel->getURL() );
- if( sReferer.getLength() )
- m_pMedium->SetReferer( OUStringToString(sReferer, CHARSET_SYSTEM) );
- }
- }
- #else
- if( pObjSh )
- {
- // Target-Frame uebertragen, damit auch javascript:-URLs
- // "geladen" werden koennen.
- const SfxMedium *pShMedium = pObjSh->GetMedium();
- if( pShMedium )
- m_pMedium->SetLoadTargetFrame(pShMedium->GetLoadTargetFrame());
- }
-
- if( xModel.is() )
- {
- ::rtl::OUString sReferer( xModel->getURL() );
- if( sReferer.getLength() )
- m_pMedium->SetReferer( sReferer );
- }
- #endif
-
- // Downloading-Flag auf sal_True setzen. Es werden dann auch
- // Data-Available-Links, wenn wir in den Pending-Staus gelangen.
- m_bDownloading = sal_True;
- m_bProdStarted = sal_False;
-
- // Download anstossen (Achtung: Kann auch synchron sein).
- m_pMedium->DownLoad(STATIC_LINK(this, OClickableImageBaseModel, DownloadDoneLink));
- }
- else
- {
- if ( ::svt::GraphicAccess::isSupportedURL( rURL ) )
- GetImageProducer()->SetImage( rURL );
- GetImageProducer()->startProduction();
- }
- }
-
- //------------------------------------------------------------------------------
- void OClickableImageBaseModel::DataAvailable()
- {
- if (!m_bProdStarted)
- StartProduction();
-
- GetImageProducer()->NewDataAvailable();
- }
-
- //------------------------------------------------------------------------------
- void OClickableImageBaseModel::DownloadDone()
- {
- DataAvailable();
- m_bDownloading = sal_False;
- }
-
- //------------------------------------------------------------------------------
- IMPL_STATIC_LINK( OClickableImageBaseModel, DownloadDoneLink, void*, EMPTYARG )
- {
- ::osl::MutexGuard aGuard( pThis->m_aMutex );
- pThis->DownloadDone();
- return 0;
- }
-
- //------------------------------------------------------------------------------
- IMPL_STATIC_LINK( OClickableImageBaseModel, DataAvailableLink, void*, EMPTYARG )
- {
- ::osl::MutexGuard aGuard( pThis->m_aMutex );
- pThis->DataAvailable();
- return 0;
- }
-
- //------------------------------------------------------------------------------
- void OClickableImageBaseModel::_propertyChanged( const PropertyChangeEvent& rEvt )
- throw( RuntimeException )
- {
- // Wenn eine URL gesetzt worden ist, muss die noch an den ImageProducer
- // weitergereicht werden.
- ::osl::MutexGuard aGuard(m_aMutex);
- SetURL( getString(rEvt.NewValue) );
- }
-
- // -----------------------------------------------------------------------------
- Any OClickableImageBaseModel::getPropertyDefaultByHandle( sal_Int32 nHandle ) const
- {
- switch (nHandle)
- {
- case PROPERTY_ID_BUTTONTYPE : return makeAny( FormButtonType_PUSH );
- case PROPERTY_ID_TARGET_URL :
- case PROPERTY_ID_TARGET_FRAME : return makeAny( ::rtl::OUString() );
- case PROPERTY_ID_DISPATCHURLINTERNAL : return makeAny( sal_False );
- default:
- return OControlModel::getPropertyDefaultByHandle(nHandle);
- }
- }
-
- //==================================================================
- // OImageProducerThread_Impl
- //==================================================================
- //------------------------------------------------------------------
- EventObject* OImageProducerThread_Impl::cloneEvent( const EventObject* _pEvt ) const
- {
- return new EventObject( *_pEvt );
- }
-
- //------------------------------------------------------------------
- void OImageProducerThread_Impl::processEvent( ::cppu::OComponentHelper *pCompImpl,
- const EventObject* pEvt,
- const Reference<XControl>&,
- sal_Bool )
- {
- ((OClickableImageBaseControl *)pCompImpl)->actionPerformed_Impl( sal_True, *(MouseEvent *)pEvt );
- }
-
-//.........................................................................
-} // namespace frm
-//.........................................................................
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */