summaryrefslogtreecommitdiff
path: root/forms/source
diff options
context:
space:
mode:
authorOliver Bolte <obo@openoffice.org>2003-10-21 08:01:03 +0000
committerOliver Bolte <obo@openoffice.org>2003-10-21 08:01:03 +0000
commita8c3a28651850bc1b7fead7441cdb1eb6b460d4d (patch)
treedd86bf5b9615bbe49b1de54165ec0811836f98d6 /forms/source
parentcc0511dd400bedd357666b09725f0220ba20d7e0 (diff)
INTEGRATION: CWS formcelllinkage (1.1.6); FILE ADDED
2003/10/01 09:18:37 fs 1.1.6.1: #i18994# merging the changes from the CWS fs002
Diffstat (limited to 'forms/source')
-rw-r--r--forms/source/component/entrylisthelper.cxx303
-rw-r--r--forms/source/component/entrylisthelper.hxx202
2 files changed, 505 insertions, 0 deletions
diff --git a/forms/source/component/entrylisthelper.cxx b/forms/source/component/entrylisthelper.cxx
new file mode 100644
index 000000000000..1f42aeb2ecfa
--- /dev/null
+++ b/forms/source/component/entrylisthelper.cxx
@@ -0,0 +1,303 @@
+/*************************************************************************
+ *
+ * $RCSfile: entrylisthelper.cxx,v $
+ *
+ * $Revision: 1.2 $
+ *
+ * last change: $Author: obo $ $Date: 2003-10-21 09:00:54 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (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.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifndef FORMS_ENTRYLISTHELPER_HXX
+#include "entrylisthelper.hxx"
+#endif
+#ifndef _OSL_DIAGNOSE_H_
+#include <osl/diagnose.h>
+#endif
+#ifndef _COMPHELPER_SEQUENCE_HXX_
+#include <comphelper/sequence.hxx>
+#endif
+#ifndef _COMPHELPER_PROPERTY_HXX_
+#include <comphelper/property.hxx>
+#endif
+#include <algorithm>
+
+//.........................................................................
+namespace frm
+{
+//.........................................................................
+
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::lang;
+ using namespace ::drafts::com::sun::star::form;
+
+ //=====================================================================
+ //= OEntryListHelper
+ //=====================================================================
+ //---------------------------------------------------------------------
+ OEntryListHelper::OEntryListHelper( ::osl::Mutex& _rMutex )
+ :m_rMutex( _rMutex )
+ {
+ }
+
+ //---------------------------------------------------------------------
+ OEntryListHelper::~OEntryListHelper( )
+ {
+ }
+
+ //---------------------------------------------------------------------
+ void SAL_CALL OEntryListHelper::setListEntrySource( const Reference< XListEntrySource >& _rxSource ) throw (RuntimeException)
+ {
+ ::osl::MutexGuard aGuard( m_rMutex );
+
+ // disconnect from the current external list source
+ disconnectExternalListSource();
+
+ // and connect to the new one
+ if ( _rxSource.is() )
+ connectExternalListSource( _rxSource );
+ }
+
+ //---------------------------------------------------------------------
+ Reference< XListEntrySource > SAL_CALL OEntryListHelper::getListEntrySource( ) throw (RuntimeException)
+ {
+ return m_xListSource;
+ }
+
+
+ //---------------------------------------------------------------------
+ void SAL_CALL OEntryListHelper::entryChanged( const ListEntryEvent& _rEvent ) throw (RuntimeException)
+ {
+ ::osl::MutexGuard aGuard( m_rMutex );
+ OSL_ENSURE( _rEvent.Source == m_xListSource,
+ "OEntryListHelper::entryChanged: where did this come from?" );
+ OSL_ENSURE( ( _rEvent.Position >= 0 ) && ( _rEvent.Position < m_aStringItems.getLength() ),
+ "OEntryListHelper::entryChanged: invalid index!" );
+ OSL_ENSURE( _rEvent.Entries.getLength() == 1,
+ "OEntryListHelper::entryChanged: invalid string list!" );
+
+ if ( ( _rEvent.Position >= 0 )
+ && ( _rEvent.Position < m_aStringItems.getLength() )
+ && ( _rEvent.Entries.getLength() > 0 )
+ )
+ {
+ m_aStringItems[ _rEvent.Position ] = _rEvent.Entries[ 0 ];
+ stringItemListChanged();
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void SAL_CALL OEntryListHelper::entryRangeInserted( const ListEntryEvent& _rEvent ) throw (RuntimeException)
+ {
+ ::osl::MutexGuard aGuard( m_rMutex );
+ OSL_ENSURE( _rEvent.Source == m_xListSource,
+ "OEntryListHelper::entryRangeInserted: where did this come from?" );
+ OSL_ENSURE( ( _rEvent.Position > 0 ) && ( _rEvent.Position < m_aStringItems.getLength() ) && ( _rEvent.Entries.getLength() > 0 ),
+ "OEntryListHelper::entryRangeRemoved: invalid count and/or position!" );
+
+ if ( ( _rEvent.Position > 0 )
+ && ( _rEvent.Position < m_aStringItems.getLength() )
+ && ( _rEvent.Entries.getLength() > 0 )
+ )
+ {
+ // the entries *before* the insertion pos
+ Sequence< ::rtl::OUString > aKeepEntries(
+ m_aStringItems.getConstArray(),
+ _rEvent.Position
+ );
+ // the entries *behind* the insertion pos
+ Sequence< ::rtl::OUString > aMovedEntries(
+ m_aStringItems.getConstArray() + _rEvent.Position,
+ m_aStringItems.getLength() - _rEvent.Position
+ );
+
+ // concat all three parts
+ m_aStringItems = ::comphelper::concatSequences(
+ aKeepEntries,
+ _rEvent.Entries,
+ aMovedEntries
+ );
+
+ stringItemListChanged();
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void SAL_CALL OEntryListHelper::entryRangeRemoved( const ListEntryEvent& _rEvent ) throw (RuntimeException)
+ {
+ ::osl::MutexGuard aGuard( m_rMutex );
+ OSL_ENSURE( _rEvent.Source == m_xListSource,
+ "OEntryListHelper::entryRangeRemoved: where did this come from?" );
+ OSL_ENSURE( ( _rEvent.Position > 0 ) && ( _rEvent.Count > 0 ) && ( _rEvent.Position + _rEvent.Count <= m_aStringItems.getLength() ),
+ "OEntryListHelper::entryRangeRemoved: invalid count and/or position!" );
+
+ if ( ( _rEvent.Position > 0 )
+ && ( _rEvent.Count > 0 )
+ && ( _rEvent.Position + _rEvent.Count <= m_aStringItems.getLength() )
+ )
+ {
+ // copy all items after the removed ones
+ ::std::copy(
+ m_aStringItems.getConstArray() + _rEvent.Position + _rEvent.Count,
+ m_aStringItems.getConstArray() + m_aStringItems.getLength(),
+ m_aStringItems.getArray( ) + _rEvent.Position
+ );
+ // shrink the array
+ m_aStringItems.realloc( m_aStringItems.getLength() - _rEvent.Count );
+
+ stringItemListChanged();
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void SAL_CALL OEntryListHelper::allEntriesChanged( const EventObject& _rEvent ) throw (RuntimeException)
+ {
+ ::osl::MutexGuard aGuard( m_rMutex );
+ OSL_ENSURE( _rEvent.Source == m_xListSource,
+ "OEntryListHelper::allEntriesChanged: where did this come from?" );
+
+ Reference< XListEntrySource > xSource( _rEvent.Source, UNO_QUERY );
+ if ( xSource.is() )
+ {
+ m_aStringItems = xSource->getAllListEntries( );
+ stringItemListChanged();
+ }
+ }
+
+ //---------------------------------------------------------------------
+ bool OEntryListHelper::handleDisposing( const EventObject& _rEvent )
+ {
+ if ( m_xListSource .is() && ( _rEvent.Source == m_xListSource ) )
+ {
+ disconnectExternalListSource( );
+ return true;
+ }
+ return false;
+ }
+
+ //---------------------------------------------------------------------
+ void OEntryListHelper::disposing( )
+ {
+ if ( hasExternalListSource( ) )
+ disconnectExternalListSource( );
+ }
+
+ //---------------------------------------------------------------------
+ void OEntryListHelper::disconnectExternalListSource( )
+ {
+ if ( m_xListSource.is() )
+ m_xListSource->removeListEntryListener( this );
+
+ m_xListSource.clear();
+
+ disconnectedExternalListSource();
+ }
+
+ //---------------------------------------------------------------------
+ void OEntryListHelper::connectedExternalListSource( )
+ {
+ // nothing to do here
+ }
+
+ //---------------------------------------------------------------------
+ void OEntryListHelper::disconnectedExternalListSource( )
+ {
+ // nothing to do here
+ }
+
+ //---------------------------------------------------------------------
+ void OEntryListHelper::connectExternalListSource( const Reference< XListEntrySource >& _rxSource )
+ {
+ OSL_ENSURE( !hasExternalListSource(), "OEntryListHelper::connectExternalListSource: only to be called if no external source is active!" );
+ OSL_ENSURE( _rxSource.is(), "OEntryListHelper::connectExternalListSource: invalid list source!" );
+
+ // remember it
+ m_xListSource = _rxSource;
+
+ // initially fill our item list
+ if ( m_xListSource.is() )
+ {
+ // be notified when the list changes ...
+ m_xListSource->addListEntryListener( this );
+
+ m_aStringItems = m_xListSource->getAllListEntries( );
+ stringItemListChanged();
+
+ // let derivees react on the new list source
+ connectedExternalListSource();
+ }
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OEntryListHelper::convertNewListSourceProperty( Any& _rConvertedValue,
+ Any& _rOldValue, const Any& _rValue ) SAL_THROW( ( IllegalArgumentException ) )
+ {
+ if ( hasExternalListSource() )
+ throw IllegalArgumentException( );
+ // TODO: error message
+
+ return ::comphelper::tryPropertyValue( _rConvertedValue, _rOldValue, _rValue, m_aStringItems );
+ }
+
+ //---------------------------------------------------------------------
+ void OEntryListHelper::setNewStringItemList( const ::com::sun::star::uno::Any& _rValue )
+ {
+ OSL_PRECOND( !hasExternalListSource(), "OEntryListHelper::setNewStringItemList: this should never have survived convertNewListSourceProperty!" );
+ OSL_VERIFY( _rValue >>= m_aStringItems );
+ stringItemListChanged( );
+ }
+
+//.........................................................................
+} // namespace frm
+//.........................................................................
diff --git a/forms/source/component/entrylisthelper.hxx b/forms/source/component/entrylisthelper.hxx
new file mode 100644
index 000000000000..dc8af9a096c0
--- /dev/null
+++ b/forms/source/component/entrylisthelper.hxx
@@ -0,0 +1,202 @@
+/*************************************************************************
+ *
+ * $RCSfile: entrylisthelper.hxx,v $
+ *
+ * $Revision: 1.2 $
+ *
+ * last change: $Author: obo $ $Date: 2003-10-21 09:01:03 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (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.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifndef FORMS_ENTRYLISTHELPER_HXX
+#define FORMS_ENTRYLISTHELPER_HXX
+
+#ifndef _DRAFTS_COM_SUN_STAR_FORM_XLISTENTRYSINK_HDL_
+#include <drafts/com/sun/star/form/XListEntrySink.hpp>
+#endif
+#ifndef _DRAFTS_COM_SUN_STAR_FORM_XLISTENTRYLISTENER_HDL_
+#include <drafts/com/sun/star/form/XListEntryListener.hpp>
+#endif
+#ifndef _COM_SUN_STAR_LANG_ILLEGALARGUMENTEXCEPTION_HPP_
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#endif
+#ifndef _CPPUHELPER_IMPLBASE2_HXX_
+#include <cppuhelper/implbase2.hxx>
+#endif
+
+//.........................................................................
+namespace frm
+{
+//.........................................................................
+
+ //=====================================================================
+ //= OEntryListHelper
+ //=====================================================================
+ typedef ::cppu::ImplHelper2 < ::drafts::com::sun::star::form::XListEntrySink
+ , ::drafts::com::sun::star::form::XListEntryListener
+ > OEntryListHelper_BASE;
+
+ class OEntryListHelper : public OEntryListHelper_BASE
+ {
+ private:
+ ::osl::Mutex& m_rMutex;
+
+ ::com::sun::star::uno::Reference< ::drafts::com::sun::star::form::XListEntrySource >
+ m_xListSource; /// our external list source
+ ::com::sun::star::uno::Sequence< ::rtl::OUString >
+ m_aStringItems; /// "overridden" StringItemList property value
+
+ protected:
+ OEntryListHelper( ::osl::Mutex& _rMutex );
+ ~OEntryListHelper( );
+
+ /// returns the current string item list
+ inline const ::com::sun::star::uno::Sequence< ::rtl::OUString >&
+ getStringItemList() const { return m_aStringItems; }
+ inline const ::com::sun::star::uno::Reference< ::drafts::com::sun::star::form::XListEntrySource >&
+ getExternalListEntrySource() const { return m_xListSource; }
+
+ /// determines whether we actually have an external list source
+ inline bool hasExternalListSource( ) const { return m_xListSource.is(); }
+
+ /** handling the XEventListener::disposing call for the case where
+ our list source is being disposed
+ @return
+ <TRUE/> if and only if the disposed object was our list source, and so the
+ event was handled
+ */
+ bool handleDisposing( const ::com::sun::star::lang::EventObject& _rEvent );
+
+ /** to be called by derived classes' instances when they're being disposed
+ */
+ void disposing( );
+
+ /** helper for implementing convertFastPropertyValue( StringItemList )
+
+ <p>The signature of this method and the return type have the same semantics
+ as convertFastPropertyValue.</p>
+ */
+ sal_Bool convertNewListSourceProperty(
+ ::com::sun::star::uno::Any& _rConvertedValue,
+ ::com::sun::star::uno::Any& _rOldValue,
+ const ::com::sun::star::uno::Any& _rValue
+ )
+ SAL_THROW( ( ::com::sun::star::lang::IllegalArgumentException ) );
+
+ /** helper for implementing setFastPropertyValueNoBroadcast
+
+ <p>Will internally call stringItemListChanged after the new item list
+ has been set.</p>
+
+ @precond
+ not to be called when we have an external list source
+ @see hasExternalListSource
+ */
+ void setNewStringItemList( const ::com::sun::star::uno::Any& _rValue );
+
+ /** announces that the list of entries has changed.
+
+ <p>Derived classes have to override this. Most probably, they'll set the new
+ as model property.</p>
+
+ @pure
+ @see getStringItemList
+ */
+ virtual void stringItemListChanged( ) = 0;
+
+ /** called whenever a connection to a new external list source has been established
+ */
+ virtual void connectedExternalListSource( );
+
+ /** called whenever a connection to a new external list source has been revoked
+ */
+ virtual void disconnectedExternalListSource( );
+
+ private:
+ // XListEntrySink
+ virtual void SAL_CALL setListEntrySource( const ::com::sun::star::uno::Reference< ::drafts::com::sun::star::form::XListEntrySource >& _rxSource ) throw (::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::drafts::com::sun::star::form::XListEntrySource > SAL_CALL getListEntrySource( ) throw (::com::sun::star::uno::RuntimeException);
+
+ // XListEntryListener
+ virtual void SAL_CALL entryChanged( const ::drafts::com::sun::star::form::ListEntryEvent& _rSource ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL entryRangeInserted( const ::drafts::com::sun::star::form::ListEntryEvent& _rSource ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL entryRangeRemoved( const ::drafts::com::sun::star::form::ListEntryEvent& _rSource ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL allEntriesChanged( const ::com::sun::star::lang::EventObject& _rSource ) throw (::com::sun::star::uno::RuntimeException);
+ private:
+ /** disconnects from the active external list source, if present
+ @see connectExternalListSource
+ */
+ void disconnectExternalListSource( );
+
+ /** connects to a new external list source
+ @param _rxSource
+ the new list source. Must not be <NULL/>
+ @see disconnectExternalListSource
+ */
+ void connectExternalListSource(
+ const ::com::sun::star::uno::Reference< ::drafts::com::sun::star::form::XListEntrySource >& _rxSource
+ );
+
+ private:
+ OEntryListHelper(); // never implemented
+ OEntryListHelper( const OEntryListHelper& ); // never implemented
+ OEntryListHelper& operator=( const OEntryListHelper& ); // never implemented
+ };
+
+//.........................................................................
+} // namespace frm
+//.........................................................................
+
+
+#endif // FORMS_ENTRYLISTHELPER_HXX