2000-09-18 16:07:07 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
|
|
|
* $RCSfile: fmtools.cxx,v $
|
|
|
|
*
|
2000-11-06 06:19:53 +00:00
|
|
|
* $Revision: 1.5 $
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2000-11-06 06:19:53 +00:00
|
|
|
* last change: $Author: oj $ $Date: 2000-11-06 07:07:42 $
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
|
|
|
* 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): _______________________________________
|
|
|
|
*
|
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
#pragma hdrstop
|
|
|
|
|
|
|
|
#ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HPP_
|
|
|
|
#include <com/sun/star/lang/XServiceInfo.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_IO_XPERSISTOBJECT_HPP_
|
|
|
|
#include <com/sun/star/io/XPersistObject.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _ISOLANG_HXX
|
|
|
|
#include <tools/isolang.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_LANG_LOCALE_HPP_
|
|
|
|
#include <com/sun/star/lang/Locale.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _SVX_FMTOOLS_HXX
|
|
|
|
#include "fmtools.hxx"
|
|
|
|
#endif
|
|
|
|
#ifndef _SVX_FMSERVS_HXX
|
|
|
|
#include "fmservs.hxx"
|
|
|
|
#endif
|
|
|
|
#ifndef _SVX_FMGLOB_HXX
|
|
|
|
#include "fmglob.hxx"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <wchar.h>
|
|
|
|
|
|
|
|
#ifndef _COM_SUN_STAR_UNO_XNAMINGSERVICE_HPP_
|
|
|
|
#include <com/sun/star/uno/XNamingService.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDBC_XDATASOURCE_HPP_
|
|
|
|
#include <com/sun/star/sdbc/XDataSource.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDB_COMMANDTYPE_HPP_
|
|
|
|
#include <com/sun/star/sdb/CommandType.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_
|
|
|
|
#include <com/sun/star/sdb/XQueriesSupplier.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDB_XDATABASEENVIRONMENT_HPP_
|
|
|
|
#include <com/sun/star/sdb/XDatabaseEnvironment.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDB_SQLCONTEXT_HPP_
|
|
|
|
#include <com/sun/star/sdb/SQLContext.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
|
|
|
|
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDB_XRESULTSETACCESS_HPP_
|
|
|
|
#include <com/sun/star/sdb/XResultSetAccess.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
|
|
|
|
#include <com/sun/star/sdbc/DataType.hpp>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _COM_SUN_STAR_UTIL_NUMBERFORMAT_HPP_
|
|
|
|
#include <com/sun/star/util/NumberFormat.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_IO_XACTIVEDATASINK_HPP_
|
|
|
|
#include <com/sun/star/io/XActiveDataSink.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_IO_XACTIVEDATASOURCE_HPP_
|
|
|
|
#include <com/sun/star/io/XActiveDataSource.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SCRIPT_XEVENTATTACHERMANAGER_HPP_
|
|
|
|
#include <com/sun/star/script/XEventAttacherManager.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_FORM_XFORM_HPP_
|
|
|
|
#include <com/sun/star/form/XForm.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_FORM_XFORMCOMPONENT_HPP_
|
|
|
|
#include <com/sun/star/form/XFormComponent.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTER_HPP_
|
|
|
|
#include <com/sun/star/util/XNumberFormatter.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATSSUPPLIER_HPP_
|
|
|
|
#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_UTIL_LANGUAGE_HPP_
|
|
|
|
#include <com/sun/star/util/Language.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATS_HPP_
|
|
|
|
#include <com/sun/star/util/XNumberFormats.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTYPES_HPP_
|
|
|
|
#include <com/sun/star/util/XNumberFormatTypes.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_UTIL_XCLONEABLE_HPP_
|
|
|
|
#include <com/sun/star/util/XCloneable.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_IO_XOBJECTINPUTSTREAM_HPP_
|
|
|
|
#include <com/sun/star/io/XObjectInputStream.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_IO_XOBJECTOUTPUTSTREAM_HPP_
|
|
|
|
#include <com/sun/star/io/XObjectOutputStream.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_REFLECTION_XIDLCLASS_HPP_
|
|
|
|
#include <com/sun/star/reflection/XIdlClass.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_REFLECTION_XIDLMETHOD_HPP_
|
|
|
|
#include <com/sun/star/reflection/XIdlMethod.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_BEANS_XINTROSPECTION_HPP_
|
|
|
|
#include <com/sun/star/beans/XIntrospection.hpp>
|
|
|
|
#endif
|
|
|
|
#include <com/sun/star/beans/PropertyAttribute.hpp>
|
|
|
|
#ifndef _COM_SUN_STAR_CONTAINER_XCHILD_HPP_
|
|
|
|
#include <com/sun/star/container/XChild.hpp>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _TOOLS_DEBUG_HXX //autogen
|
|
|
|
#include <tools/debug.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _STRING_HXX
|
|
|
|
#include <tools/string.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _SBXVAR_HXX //autogen
|
|
|
|
#include <svtools/sbxvar.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _TOOLS_SOLMATH_HXX //autogen wg. SolarMath
|
|
|
|
#include <tools/solmath.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _SV_SVAPP_HXX //autogen
|
|
|
|
#include <vcl/svapp.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _INTN_HXX //autogen
|
|
|
|
#include <tools/intn.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _SVX_DBERRBOX_HXX
|
|
|
|
#include "dbmsgbox.hxx"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _SVX_FMPROP_HRC
|
|
|
|
#include "fmprop.hrc"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _SFX_BINDINGS_HXX //autogen wg. SfxBindings
|
|
|
|
#include <sfx2/bindings.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _SFXENUMITEM_HXX //autogen wg. SfxBoolItem
|
|
|
|
#include <svtools/eitem.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _SFXSTRITEM_HXX //autogen wg. SfxStringItem
|
|
|
|
#include <svtools/stritem.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _CPPUHELPER_SERVICEFACTORY_HXX_
|
|
|
|
#include <cppuhelper/servicefactory.hxx>
|
|
|
|
#endif
|
2000-10-20 13:18:57 +00:00
|
|
|
#ifndef _COMPHELPER_TYPES_HXX_
|
|
|
|
#include <comphelper/types.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
#endif
|
2000-10-20 13:18:57 +00:00
|
|
|
#ifndef _COMPHELPER_PROPERTY_HXX_
|
|
|
|
#include <comphelper/property.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
#endif
|
2000-10-20 13:18:57 +00:00
|
|
|
#ifndef _COMPHELPER_CONTAINER_HXX_
|
|
|
|
#include <comphelper/container.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
#endif
|
2000-10-20 13:18:57 +00:00
|
|
|
#ifndef _CONNECTIVITY_DBTOOLS_HXX_
|
|
|
|
#include <connectivity/dbtools.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
#endif
|
2000-10-20 13:18:57 +00:00
|
|
|
#ifndef _COMPHELPER_PROCESSFACTORY_HXX_
|
|
|
|
#include <comphelper/processfactory.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
#endif
|
2000-10-20 13:18:57 +00:00
|
|
|
#ifndef _COMPHELPER_SEQUENCE_HXX_
|
|
|
|
#include <comphelper/sequence.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
#endif
|
|
|
|
#ifndef _FM_STATIC_HXX_
|
|
|
|
#include "fmstatic.hxx"
|
|
|
|
#endif
|
|
|
|
#ifndef _CPPUHELPER_EXTRACT_HXX_
|
|
|
|
#include <cppuhelper/extract.hxx>
|
|
|
|
#endif
|
2000-10-20 13:18:57 +00:00
|
|
|
#ifndef _COMPHELPER_UNO3_HXX_
|
|
|
|
#include <comphelper/uno3.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
#endif
|
2000-10-20 13:18:57 +00:00
|
|
|
#ifndef _DBHELPER_DBEXCEPTION_HXX_
|
|
|
|
#include <connectivity/dbexception.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
#endif
|
|
|
|
#ifndef _CPPUHELPER_EXTRACT_HXX_
|
|
|
|
#include <cppuhelper/extract.hxx>
|
|
|
|
#endif
|
|
|
|
|
2000-10-31 10:59:33 +00:00
|
|
|
using namespace ::com::sun::star::uno;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
IMPLEMENT_CONSTASCII_USTRING(DATA_MODE,"DataMode");
|
|
|
|
IMPLEMENT_CONSTASCII_USTRING(FILTER_MODE,"FilterMode");
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
using namespace ::com::sun::star::uno;
|
|
|
|
using namespace ::com::sun::star::util;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
//------------------------------------------------------------------------------
|
2000-10-20 13:18:57 +00:00
|
|
|
void displayException(const ::dbtools::SQLExceptionInfo& _rError)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
::vos::OGuard aGuard(Application::GetSolarMutex());
|
2000-10-20 13:18:57 +00:00
|
|
|
if (_rError.isKindOf(::dbtools::SQLExceptionInfo::SQL_EXCEPTION))
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
SvxDBMsgBox aSvxDBMsgBox(GetpApp()->GetAppWindow(), *(const ::com::sun::star::sdbc::SQLException*)_rError, WB_OK);
|
|
|
|
aSvxDBMsgBox.Execute();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
DBG_ERROR("::displayException : invalid event (does not contain an ::com::sun::star::sdbc::SQLException) !");
|
|
|
|
::com::sun::star::sdbc::SQLException aDummy;
|
|
|
|
SvxDBMsgBox aSvxDBMsgBox(GetpApp()->GetAppWindow(), aDummy, WB_OK);
|
|
|
|
aSvxDBMsgBox.Execute();
|
|
|
|
// the SvxDBMsgBox will create a default context info ("read error") for this
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------
|
|
|
|
void displayException(const ::com::sun::star::sdbc::SQLException& _rExcept, WinBits nStyle)
|
|
|
|
{
|
2000-10-20 13:18:57 +00:00
|
|
|
::dbtools::SQLExceptionInfo aInfo(_rExcept);
|
2000-09-18 16:07:07 +00:00
|
|
|
displayException(aInfo);
|
|
|
|
}
|
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------
|
|
|
|
void displayException(const ::com::sun::star::sdb::SQLErrorEvent& _rEvent, WinBits nStyle)
|
|
|
|
{
|
2000-10-20 13:18:57 +00:00
|
|
|
::dbtools::SQLExceptionInfo aInfo(_rEvent);
|
2000-09-18 16:07:07 +00:00
|
|
|
displayException(aInfo);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Vergleichen von Properties
|
|
|
|
extern "C" int
|
|
|
|
#if defined( WNT )
|
|
|
|
__cdecl
|
|
|
|
#endif
|
|
|
|
#if defined( ICC ) && defined( OS2 )
|
|
|
|
_Optlink
|
|
|
|
#endif
|
|
|
|
PropertyCompare( const void* pFirst, const void* pSecond)
|
|
|
|
{
|
|
|
|
return ((::com::sun::star::beans::Property*)pFirst)->Name.compareTo(((::com::sun::star::beans::Property*)pSecond)->Name);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< XInterface> clone(const Reference< ::com::sun::star::io::XPersistObject>& _xObj)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< XInterface> xClone;
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!_xObj.is())
|
2000-11-06 06:19:53 +00:00
|
|
|
return Reference< XInterface>();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// ::std::copy it by streaming
|
|
|
|
|
|
|
|
// creating a pipe
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::io::XOutputStream> xOutPipe(::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.io.Pipe")), UNO_QUERY);
|
|
|
|
Reference< ::com::sun::star::io::XInputStream> xInPipe(xOutPipe, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// creating the mark streams
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::io::XInputStream> xMarkIn(::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.io.MarkableInputStream")), UNO_QUERY);
|
|
|
|
Reference< ::com::sun::star::io::XActiveDataSink> xMarkSink(xMarkIn, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
xMarkSink->setInputStream(xInPipe);
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::io::XOutputStream> xMarkOut(::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.io.MarkableOutputStream")), UNO_QUERY);
|
|
|
|
Reference< ::com::sun::star::io::XActiveDataSource> xMarkSource(xMarkOut, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
xMarkSource->setOutputStream(xOutPipe);
|
|
|
|
|
|
|
|
// connect mark and sink
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::io::XActiveDataSink> xSink(::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.io.ObjectInputStream")), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
xSink->setInputStream(xMarkIn);
|
|
|
|
|
|
|
|
// connect mark and source
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::io::XActiveDataSource> xSource(::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.io.ObjectOutputStream")), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
xSource->setOutputStream(xMarkOut);
|
|
|
|
|
|
|
|
// write the string to source
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::io::XObjectOutputStream> xOutStrm(xSource, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
xOutStrm->writeObject(_xObj);
|
|
|
|
xOutStrm->closeOutput();
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::io::XObjectInputStream> xInStrm(xSink, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
xClone = xInStrm->readObject();
|
|
|
|
xInStrm->closeInput();
|
|
|
|
|
|
|
|
return xClone;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< XInterface> cloneUsingProperties(const Reference< ::com::sun::star::io::XPersistObject>& _xObj)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if (!_xObj.is())
|
2000-11-06 06:19:53 +00:00
|
|
|
return Reference< XInterface>();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// create a new object
|
|
|
|
::rtl::OUString aObjectService = _xObj->getServiceName();
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::beans::XPropertySet> xDestSet(::comphelper::getProcessServiceFactory()->createInstance(aObjectService), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!xDestSet.is())
|
|
|
|
{
|
|
|
|
DBG_ERROR("cloneUsingProperties : could not instantiate an object of the given type !");
|
2000-11-06 06:19:53 +00:00
|
|
|
return Reference< XInterface>();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
// transfer properties
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::beans::XPropertySet> xSourceSet(_xObj, UNO_QUERY);
|
|
|
|
Reference< ::com::sun::star::beans::XPropertySetInfo> xSourceInfo( xSourceSet->getPropertySetInfo());
|
|
|
|
Sequence< ::com::sun::star::beans::Property> aSourceProperties = xSourceInfo->getProperties();
|
|
|
|
Reference< ::com::sun::star::beans::XPropertySetInfo> xDestInfo( xDestSet->getPropertySetInfo());
|
|
|
|
Sequence< ::com::sun::star::beans::Property> aDestProperties = xDestInfo->getProperties();
|
2000-09-18 16:07:07 +00:00
|
|
|
int nDestLen = aDestProperties.getLength();
|
|
|
|
|
|
|
|
::com::sun::star::beans::Property* pSourceProps = aSourceProperties.getArray();
|
|
|
|
::com::sun::star::beans::Property* pDestProps = aDestProperties.getArray();
|
|
|
|
|
|
|
|
for (sal_Int16 i=0; i<aSourceProperties.getLength(); ++i)
|
|
|
|
{
|
|
|
|
::com::sun::star::beans::Property* pResult = (::com::sun::star::beans::Property*) bsearch(pSourceProps + i, (void*)pDestProps, nDestLen, sizeof(::com::sun::star::beans::Property),
|
|
|
|
&PropertyCompare);
|
|
|
|
if ( pResult
|
|
|
|
&& (pResult->Attributes == pSourceProps[i].Attributes)
|
|
|
|
&& ((pResult->Attributes & ::com::sun::star::beans::PropertyAttribute::READONLY) == 0)
|
|
|
|
&& (pResult->Type.equals(pSourceProps[i].Type))
|
|
|
|
)
|
|
|
|
{ // Attribute/type are the same and the prop isn't readonly
|
|
|
|
try
|
|
|
|
{
|
|
|
|
xDestSet->setPropertyValue(pResult->Name, xSourceSet->getPropertyValue(pResult->Name));
|
|
|
|
}
|
|
|
|
catch(::com::sun::star::lang::IllegalArgumentException e)
|
|
|
|
{
|
|
|
|
e;
|
|
|
|
#ifdef DBG_UTIL
|
|
|
|
::rtl::OString sMessage("cloneUsingProperties : could not transfer the value for property \"");
|
|
|
|
sMessage = sMessage + S(pResult->Name);
|
|
|
|
sMessage = sMessage + '\"';
|
|
|
|
DBG_ERROR(sMessage);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return xDestSet;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void CloneForms(const Reference< ::com::sun::star::container::XIndexContainer>& _xSource, const Reference< ::com::sun::star::container::XIndexContainer>& _xDest)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT(_xSource.is() && _xDest.is(), "CloneForms : invalid argument !");
|
|
|
|
|
|
|
|
sal_Int32 nSourceCount = _xSource->getCount();
|
|
|
|
for (sal_Int32 i=nSourceCount-1; i>=0; --i)
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdbc::XRowSet> xCurrent(*(Reference< XInterface>*)_xSource->getByIndex(i).getValue(), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!xCurrent.is())
|
|
|
|
continue;
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::io::XPersistObject> xCurrentPersist(xCurrent, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_ASSERT(xCurrentPersist.is(), "CloneForms : a form should always be a PersistObject !");
|
|
|
|
|
|
|
|
// don't use a simple clone on xCurrentPersist as this would clone all childs, too
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< XInterface> xNewObject( cloneUsingProperties(xCurrentPersist));
|
|
|
|
Reference< ::com::sun::star::sdbc::XRowSet> xNew(xNewObject, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!xNew.is())
|
|
|
|
{
|
|
|
|
DBG_ERROR("CloneForms : could not clone a form object !");
|
2000-10-20 13:18:57 +00:00
|
|
|
::comphelper::disposeComponent(xNewObject);
|
2000-09-18 16:07:07 +00:00
|
|
|
continue;
|
|
|
|
}
|
2000-11-06 06:19:53 +00:00
|
|
|
_xDest->insertByIndex(0, makeAny(xNew));
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::container::XIndexContainer> xStepIntoSource(xCurrent, UNO_QUERY);
|
|
|
|
Reference< ::com::sun::star::container::XIndexContainer> xStepIntoDest(xNew, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xStepIntoSource.is() && xStepIntoDest.is())
|
|
|
|
CloneForms(xStepIntoSource, xStepIntoDest);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
sal_Bool searchElement(const Reference< ::com::sun::star::container::XIndexAccess>& xCont, const Reference< XInterface>& xElement)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if (!xCont.is() || !xElement.is())
|
|
|
|
return sal_False;
|
|
|
|
|
|
|
|
sal_Int32 nCount = xCont->getCount();
|
2000-11-06 06:19:53 +00:00
|
|
|
Any aRet;
|
2000-09-18 16:07:07 +00:00
|
|
|
for (sal_Int32 i = 0; i < nCount; i++)
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< XInterface> xComp;
|
2000-09-18 16:07:07 +00:00
|
|
|
try
|
|
|
|
{
|
|
|
|
aRet = xCont->getByIndex(i);
|
|
|
|
if (aRet.hasValue())
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< XInterface> xIface(*(Reference< XInterface>*) aRet.getValue());
|
2000-10-20 13:18:57 +00:00
|
|
|
::comphelper::query_interface(xIface, xComp);
|
2000-11-06 06:19:53 +00:00
|
|
|
if (((XInterface *)xElement.get()) == (XInterface*)xComp.get())
|
2000-09-18 16:07:07 +00:00
|
|
|
return sal_True;
|
|
|
|
else
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::container::XIndexAccess> xCont2(xComp, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xCont2.is() && searchElement(xCont2, xElement))
|
|
|
|
return sal_True;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2000-10-31 10:59:33 +00:00
|
|
|
catch(Exception&)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return sal_False;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
sal_Int32 getElementPos(const Reference< ::com::sun::star::container::XIndexAccess>& xCont, const Reference< XInterface>& xElement)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
sal_Int32 nIndex = -1;
|
|
|
|
if (!xCont.is())
|
|
|
|
return nIndex;
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< XInterface> xToFind;
|
|
|
|
Type xRequestedElementClass( xCont->getElementType());
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
if (::comphelper::isA(xRequestedElementClass,(Reference< ::com::sun::star::form::XFormComponent>*)0))
|
|
|
|
xToFind = Reference< ::com::sun::star::form::XFormComponent>(xElement, UNO_QUERY);
|
|
|
|
else if (::comphelper::isA(xRequestedElementClass,(Reference< ::com::sun::star::form::XForm>*)0))
|
|
|
|
xToFind = Reference< ::com::sun::star::form::XForm>(xElement, UNO_QUERY);
|
|
|
|
else if (::comphelper::isA(xRequestedElementClass,(Reference< ::com::sun::star::beans::XPropertySet>*)0))
|
|
|
|
xToFind = Reference< ::com::sun::star::beans::XPropertySet>(xElement, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
DBG_ASSERT(xToFind.is(), "Unknown Element");
|
|
|
|
if (xToFind.is())
|
|
|
|
{
|
|
|
|
// Feststellen an welcher Position sich das Kind befindet
|
|
|
|
nIndex = xCont->getCount();
|
|
|
|
while (nIndex--)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< XInterface> xCurrent;
|
2000-09-18 16:07:07 +00:00
|
|
|
::cppu::extractInterface(xCurrent, xCont->getByIndex(nIndex));
|
|
|
|
if (xToFind == xCurrent)
|
|
|
|
break;
|
|
|
|
}
|
2000-10-31 10:59:33 +00:00
|
|
|
catch(Exception&)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nIndex;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
String getFormComponentAccessPath(const Reference< XInterface>& _xElement, Reference< XInterface>& _rTopLevelElement)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::form::XFormComponent> xChild(_xElement, UNO_QUERY);
|
|
|
|
Reference< ::com::sun::star::container::XIndexAccess> xParent;
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xChild.is())
|
2000-11-06 06:19:53 +00:00
|
|
|
xParent = Reference< ::com::sun::star::container::XIndexAccess>(xChild->getParent(), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// while the current content is a form
|
|
|
|
String sReturn;
|
|
|
|
String sCurrentIndex;
|
|
|
|
while (xChild.is())
|
|
|
|
{
|
|
|
|
// get the content's relative pos within it's parent container
|
|
|
|
sal_Int32 nPos = getElementPos(xParent, xChild);
|
|
|
|
|
|
|
|
// prepend this current relaive pos
|
|
|
|
sCurrentIndex = String::CreateFromInt32(nPos);
|
|
|
|
if (sReturn.Len() != 0)
|
|
|
|
{
|
|
|
|
sCurrentIndex += '\\';
|
|
|
|
sCurrentIndex += sReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
sReturn = sCurrentIndex;
|
|
|
|
|
|
|
|
// travel up
|
2000-11-06 06:19:53 +00:00
|
|
|
if (::comphelper::query_interface((Reference< XInterface >)xParent,xChild))
|
|
|
|
xParent = Reference< ::com::sun::star::container::XIndexAccess>(xChild->getParent(), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
_rTopLevelElement = xParent;
|
|
|
|
return sReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
String getFormComponentAccessPath(const Reference< XInterface>& _xElement)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< XInterface> xDummy;
|
2000-09-18 16:07:07 +00:00
|
|
|
return getFormComponentAccessPath(_xElement, xDummy);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< XInterface> getElementFromAccessPath(const Reference< ::com::sun::star::container::XIndexAccess>& _xParent, const String& _rRelativePath)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if (!_xParent.is())
|
2000-11-06 06:19:53 +00:00
|
|
|
return Reference< XInterface>();
|
|
|
|
Reference< ::com::sun::star::container::XIndexAccess> xContainer(_xParent);
|
|
|
|
Reference< XInterface> xElement( _xParent);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
String sPath(_rRelativePath);
|
|
|
|
while (sPath.Len() && xContainer.is())
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
xub_StrLen nSepPos = sPath.Search((sal_Unicode)'\\');
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
String sIndex(sPath.Copy(0, (nSepPos == STRING_NOTFOUND) ? sPath.Len() : nSepPos));
|
2000-09-18 16:07:07 +00:00
|
|
|
// DBG_ASSERT(sIndex.IsNumeric(), "getElementFromAccessPath : invalid path !");
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
sPath = sPath.Copy((nSepPos == STRING_NOTFOUND) ? sPath.Len() : nSepPos+1);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
::cppu::extractInterface(xElement, xContainer->getByIndex(sIndex.ToInt32()));
|
2000-11-06 06:19:53 +00:00
|
|
|
xContainer = Reference< ::com::sun::star::container::XIndexAccess>::query(xElement);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (sPath.Len() != 0)
|
|
|
|
// the loop terminated because an element wasn't a container, but we stil have a path -> the path is invalid
|
|
|
|
xElement = NULL;
|
|
|
|
|
|
|
|
return xElement;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------
|
|
|
|
// Vergleichen von PropertyInfo
|
|
|
|
extern "C" int
|
|
|
|
#if defined( WNT )
|
|
|
|
__cdecl
|
|
|
|
#endif
|
|
|
|
#if defined( ICC ) && defined( OS2 )
|
|
|
|
_Optlink
|
|
|
|
#endif
|
|
|
|
NameCompare(const void* pFirst, const void* pSecond)
|
|
|
|
{
|
|
|
|
return ((::rtl::OUString*)pFirst)->compareTo(*(::rtl::OUString*)pSecond);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
sal_Bool hasString(const ::rtl::OUString& aStr, const Sequence< ::rtl::OUString>& rList)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
const ::rtl::OUString* pStrList = rList.getConstArray();
|
|
|
|
::rtl::OUString* pResult = (::rtl::OUString*) bsearch(&aStr, (void*)pStrList, rList.getLength(), sizeof(::rtl::OUString),
|
|
|
|
&NameCompare);
|
|
|
|
|
|
|
|
return pResult != NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
sal_Int32 findPos(const ::rtl::OUString& aStr, const Sequence< ::rtl::OUString>& rList)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
const ::rtl::OUString* pStrList = rList.getConstArray();
|
|
|
|
::rtl::OUString* pResult = (::rtl::OUString*) bsearch(&aStr, (void*)pStrList, rList.getLength(), sizeof(::rtl::OUString),
|
|
|
|
&NameCompare);
|
|
|
|
|
|
|
|
if (pResult)
|
|
|
|
return (pResult - pStrList);
|
|
|
|
else
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void ModifyPropertyAttributes(Sequence< ::com::sun::star::beans::Property>& seqProps, const ::rtl::OUString& ustrPropName, sal_Int16 nAddAttrib, sal_Int16 nRemoveAttrib)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
sal_Int32 nLen = seqProps.getLength();
|
|
|
|
|
|
|
|
// binaere Suche
|
2000-11-06 06:19:53 +00:00
|
|
|
Type type;
|
2000-09-18 16:07:07 +00:00
|
|
|
::com::sun::star::beans::Property propSearchDummy(ustrPropName, 0, type, 0);
|
|
|
|
::com::sun::star::beans::Property* pResult = (::com::sun::star::beans::Property*) bsearch(&propSearchDummy, (void*)seqProps.getArray(), nLen, sizeof(::com::sun::star::beans::Property),
|
|
|
|
&PropertyCompare);
|
|
|
|
|
|
|
|
// gefunden ?
|
|
|
|
if (pResult)
|
|
|
|
{
|
|
|
|
pResult->Attributes |= nAddAttrib;
|
|
|
|
pResult->Attributes &= ~nRemoveAttrib;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void RemoveProperty(Sequence< ::com::sun::star::beans::Property>& seqProps, const ::rtl::OUString& ustrPropName)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
sal_Int32 nLen = seqProps.getLength();
|
|
|
|
|
|
|
|
// binaere Suche
|
2000-11-06 06:19:53 +00:00
|
|
|
Type type;
|
2000-09-18 16:07:07 +00:00
|
|
|
::com::sun::star::beans::Property propSearchDummy(ustrPropName, 0, type, 0);
|
|
|
|
const ::com::sun::star::beans::Property* pProperties = seqProps.getConstArray();
|
|
|
|
::com::sun::star::beans::Property* pResult = (::com::sun::star::beans::Property*) bsearch(&propSearchDummy, (void*)pProperties, nLen, sizeof(::com::sun::star::beans::Property),
|
|
|
|
&PropertyCompare);
|
|
|
|
|
|
|
|
// gefunden ?
|
|
|
|
if (pResult)
|
|
|
|
{
|
|
|
|
DBG_ASSERT(pResult->Name == ustrPropName, "::RemoveProperty Properties nicht sortiert");
|
2000-10-20 13:18:57 +00:00
|
|
|
::comphelper::removeElementAt(seqProps, pResult - pProperties);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::frame::XModel> getXModel(const Reference< XInterface>& xIface)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::frame::XModel> xModel(xIface, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xModel.is())
|
|
|
|
return xModel;
|
|
|
|
else
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::container::XChild> xChild(xIface, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xChild.is())
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< XInterface> xParent( xChild->getParent());
|
2000-09-18 16:07:07 +00:00
|
|
|
return getXModel(xParent);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
::rtl::OUString getLabelName(const Reference< ::com::sun::star::beans::XPropertySet>& xControlModel)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if (!xControlModel.is())
|
|
|
|
return ::rtl::OUString();
|
|
|
|
|
2000-10-20 13:18:57 +00:00
|
|
|
if (::comphelper::hasProperty(FM_PROP_CONTROLLABEL, xControlModel))
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Any aLabelModel( xControlModel->getPropertyValue(FM_PROP_CONTROLLABEL) );
|
|
|
|
if (aLabelModel.getValueTypeClass() == TypeClass_INTERFACE)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::beans::XPropertySet> xLabelSet(*(Reference< XInterface>*)aLabelModel.getValue(), UNO_QUERY);
|
2000-10-20 13:18:57 +00:00
|
|
|
if (xLabelSet.is() && ::comphelper::hasProperty(FM_PROP_LABEL, xLabelSet))
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Any aLabel( xLabelSet->getPropertyValue(FM_PROP_LABEL) );
|
|
|
|
if ((aLabel.getValueTypeClass() == TypeClass_STRING) && ::comphelper::getString(aLabel).getLength())
|
2000-10-20 13:18:57 +00:00
|
|
|
return ::comphelper::getString(aLabel);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-10-20 13:18:57 +00:00
|
|
|
return ::comphelper::getString(xControlModel->getPropertyValue(FM_PROP_CONTROLSOURCE));
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
//sal_Bool set_impl(Reflection* pRefl, void* pData, const Any& rValue)
|
2000-09-18 16:07:07 +00:00
|
|
|
//{
|
|
|
|
// sal_Bool bRes = sal_True;
|
|
|
|
// void* pConv = TypeConversion::to(pRefl, rValue);
|
|
|
|
//
|
2000-11-06 06:19:53 +00:00
|
|
|
// if (!pConv && pRefl->getTypeClass() != TypeClass_ANY)
|
|
|
|
// bRes = pRefl->getTypeClass() == TypeClass_VOID;
|
2000-09-18 16:07:07 +00:00
|
|
|
// else
|
|
|
|
// {
|
|
|
|
// switch (pRefl->getTypeClass())
|
|
|
|
// {
|
2000-11-06 06:19:53 +00:00
|
|
|
// case TypeClass_BOOLEAN:
|
2000-09-18 16:07:07 +00:00
|
|
|
// *(sal_Bool*)pData = *(sal_Bool *)pConv; break;
|
2000-11-06 06:19:53 +00:00
|
|
|
// case TypeClass_CHAR:
|
2000-09-18 16:07:07 +00:00
|
|
|
// *(char*)pData = *(char *)pConv; break;
|
2000-11-06 06:19:53 +00:00
|
|
|
// case TypeClass_STRING:
|
2000-09-18 16:07:07 +00:00
|
|
|
// *(::rtl::OUString*)pData = *(::rtl::OUString *)pConv; break;
|
2000-11-06 06:19:53 +00:00
|
|
|
// case TypeClass_FLOAT:
|
2000-09-18 16:07:07 +00:00
|
|
|
// *(float*)pData = *(float *)pConv; break;
|
2000-11-06 06:19:53 +00:00
|
|
|
// case TypeClass_DOUBLE:
|
2000-09-18 16:07:07 +00:00
|
|
|
// *(double*)pData = *(double *)pConv; break;
|
2000-11-06 06:19:53 +00:00
|
|
|
// case TypeClass_BYTE:
|
2000-09-18 16:07:07 +00:00
|
|
|
// *(BYTE*)pData = *(BYTE *)pConv; break;
|
2000-11-06 06:19:53 +00:00
|
|
|
// case TypeClass_SHORT:
|
2000-09-18 16:07:07 +00:00
|
|
|
// *(sal_Int16*)pData = *(sal_Int16 *)pConv; break;
|
2000-11-06 06:19:53 +00:00
|
|
|
// case TypeClass_LONG:
|
2000-09-18 16:07:07 +00:00
|
|
|
// *(sal_Int32*)pData = *(sal_Int32 *)pConv; break;
|
2000-11-06 06:19:53 +00:00
|
|
|
// case TypeClass_UNSIGNED_SHORT:
|
2000-09-18 16:07:07 +00:00
|
|
|
// *(sal_uInt16*)pData = *(sal_uInt16 *)pConv; break;
|
2000-11-06 06:19:53 +00:00
|
|
|
// case TypeClass_UNSIGNED_LONG:
|
2000-09-18 16:07:07 +00:00
|
|
|
// *(sal_uInt32*)pData = *(sal_uInt32 *)pConv; break;
|
2000-11-06 06:19:53 +00:00
|
|
|
// case TypeClass_ANY:
|
|
|
|
// *(Any*)pData = rValue; break;
|
2000-09-18 16:07:07 +00:00
|
|
|
// default:
|
|
|
|
// bRes = sal_False;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// return bRes;
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
sal_uInt32 findValue(const Sequence< Any>& rList, const Any& rValue)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
sal_uInt32 nLen = rList.getLength();
|
2000-11-06 06:19:53 +00:00
|
|
|
const Any* pArray = (const Any*)rList.getConstArray();
|
2000-09-18 16:07:07 +00:00
|
|
|
sal_uInt32 i;
|
|
|
|
for (i = 0; i < nLen; i++)
|
|
|
|
{
|
2000-10-20 13:18:57 +00:00
|
|
|
if (::comphelper::compare(rValue, pArray[i]))
|
2000-09-18 16:07:07 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return (i < nLen) ? i : LIST_ENTRY_NOTFOUND;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence<sal_Int16> findValueINT16(const Sequence< ::rtl::OUString>& rList, const ::rtl::OUString& rValue, sal_Bool bOnlyFirst )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if( bOnlyFirst )
|
|
|
|
{
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
// An welcher Position finde ich den Wert?
|
|
|
|
sal_Int32 nPos = -1;
|
|
|
|
const ::rtl::OUString* pTArray = (const ::rtl::OUString*)rList.getConstArray();
|
|
|
|
for (sal_uInt32 i = 0; i < rList.getLength(); i++)
|
|
|
|
{
|
|
|
|
if( rValue==pTArray[i] )
|
|
|
|
{
|
|
|
|
nPos = i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
2000-11-06 06:19:53 +00:00
|
|
|
// Sequence fuellen
|
2000-09-18 16:07:07 +00:00
|
|
|
if( nPos>-1 )
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence<sal_Int16> aRetSeq( 1 );
|
2000-09-18 16:07:07 +00:00
|
|
|
aRetSeq.getArray()[0] = (sal_Int16)nPos;
|
|
|
|
|
|
|
|
return aRetSeq;
|
|
|
|
}
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
return Sequence<sal_Int16>();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
// Wie oft kommt der Wert vor?
|
|
|
|
sal_uInt32 nCount = 0;
|
|
|
|
const ::rtl::OUString* pTArray = (const ::rtl::OUString*)rList.getConstArray();
|
|
|
|
sal_uInt32 i;
|
|
|
|
for (i = 0; i < rList.getLength(); i++)
|
|
|
|
{
|
|
|
|
if( rValue==pTArray[i] )
|
|
|
|
nCount++;
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
2000-11-06 06:19:53 +00:00
|
|
|
// Jetzt Sequence fuellen
|
|
|
|
Sequence<sal_Int16> aRetSeq( nCount );
|
2000-09-18 16:07:07 +00:00
|
|
|
sal_uInt32 j = 0;
|
|
|
|
for (i = 0; i < rList.getLength(); i++)
|
|
|
|
{
|
|
|
|
if( rValue==pTArray[i] )
|
|
|
|
{
|
|
|
|
aRetSeq.getArray()[j] = (sal_Int16)i;
|
|
|
|
j++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return aRetSeq;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence<sal_Int16> findValue(const Sequence< ::rtl::OUString>& rList, const ::rtl::OUString& rValue, sal_Bool bOnlyFirst )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if( bOnlyFirst )
|
|
|
|
{
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
// An welcher Position finde ich den Wert?
|
|
|
|
sal_Int32 nPos = -1;
|
|
|
|
const ::rtl::OUString* pTArray = (const ::rtl::OUString*)rList.getConstArray();
|
|
|
|
for (sal_uInt32 i = 0; i < rList.getLength(); ++i, ++pTArray)
|
|
|
|
{
|
|
|
|
if( rValue == *pTArray )
|
|
|
|
{
|
|
|
|
nPos = i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
2000-11-06 06:19:53 +00:00
|
|
|
// Sequence fuellen
|
2000-09-18 16:07:07 +00:00
|
|
|
if( nPos>-1 )
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence<sal_Int16> aRetSeq( 1 );
|
2000-09-18 16:07:07 +00:00
|
|
|
aRetSeq.getArray()[0] = (sal_Int16)nPos;
|
|
|
|
|
|
|
|
return aRetSeq;
|
|
|
|
}
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
return Sequence<sal_Int16>();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
// Wie oft kommt der Wert vor?
|
|
|
|
sal_uInt32 nCount = 0;
|
|
|
|
const ::rtl::OUString* pTArray = (const ::rtl::OUString*)rList.getConstArray();
|
|
|
|
sal_uInt32 i;
|
|
|
|
for (i = 0; i < rList.getLength(); i++)
|
|
|
|
{
|
|
|
|
if( rValue==pTArray[i] )
|
|
|
|
++nCount;
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
2000-11-06 06:19:53 +00:00
|
|
|
// Jetzt Sequence fuellen
|
|
|
|
Sequence<sal_Int16> aRetSeq( nCount );
|
2000-09-18 16:07:07 +00:00
|
|
|
sal_uInt32 j = 0;
|
|
|
|
for (i = 0; i < rList.getLength(); i++)
|
|
|
|
{
|
|
|
|
if( rValue==pTArray[i] )
|
|
|
|
{
|
|
|
|
aRetSeq.getArray()[j] = (sal_Int16)i;
|
|
|
|
++j;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return aRetSeq;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
sal_uInt32 findValue1(const Sequence< ::rtl::OUString>& rList, const ::rtl::OUString& rValue)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
const ::rtl::OUString* pTArray = (const ::rtl::OUString*)rList.getConstArray();
|
|
|
|
::rtl::OString aStr1 = S(rValue);
|
|
|
|
sal_uInt32 i;
|
|
|
|
for (i = 0; i < rList.getLength(); i++)
|
|
|
|
{
|
|
|
|
::rtl::OString aStr2 = S(pTArray[i]);
|
|
|
|
if( rValue==pTArray[i] )
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return (i < rList.getLength()) ? i : LIST_ENTRY_NOTFOUND;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//==================================================================
|
|
|
|
// StringConversion
|
|
|
|
//==================================================================
|
2000-11-06 06:19:53 +00:00
|
|
|
::rtl::OUString AnyToStr( const Any& aValue)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
UniString aRetStr;
|
|
|
|
|
|
|
|
switch( aValue.getValueTypeClass() )
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
case TypeClass_INTERFACE: aRetStr.AssignAscii("TYPE INTERFACE"); break;
|
|
|
|
case TypeClass_SERVICE: aRetStr.AssignAscii("TYPE SERVICE"); break;
|
|
|
|
case TypeClass_MODULE: aRetStr.AssignAscii("TYPE MODULE"); break;
|
|
|
|
case TypeClass_STRUCT: aRetStr.AssignAscii("TYPE STRUCT"); break;
|
|
|
|
case TypeClass_TYPEDEF: aRetStr.AssignAscii("TYPE TYPEDEF"); break;
|
|
|
|
case TypeClass_UNION: aRetStr.AssignAscii("TYPE UNION"); break;
|
|
|
|
case TypeClass_ENUM: aRetStr.AssignAscii("TYPE ENUM"); break;
|
|
|
|
case TypeClass_EXCEPTION: aRetStr.AssignAscii("TYPE EXCEPTION"); break;
|
|
|
|
case TypeClass_ARRAY: aRetStr.AssignAscii("TYPE ARRAY"); break;
|
|
|
|
case TypeClass_SEQUENCE: aRetStr.AssignAscii("TYPE SEQUENCE"); break;
|
|
|
|
case TypeClass_VOID: aRetStr.AssignAscii(""); break;
|
|
|
|
case TypeClass_ANY: aRetStr.AssignAscii("TYPE any"); break;
|
|
|
|
case TypeClass_UNKNOWN: aRetStr.AssignAscii("TYPE unknown"); break;
|
|
|
|
case TypeClass_BOOLEAN: aRetStr = ::comphelper::getBOOL(aValue) ? '1' : '0'; break;
|
|
|
|
case TypeClass_CHAR: aRetStr = String::CreateFromInt32(::comphelper::getINT16(aValue)); break;
|
|
|
|
case TypeClass_STRING: aRetStr = (const sal_Unicode*)::comphelper::getString(aValue); break;
|
|
|
|
// case TypeClass_FLOAT: SolarMath::DoubleToString( aRetStr, ::comphelper::getFloat(aValue), 'F', 40, '.', sal_True); break;
|
|
|
|
// case TypeClass_DOUBLE: SolarMath::DoubleToString( aRetStr, ::comphelper::getDouble(aValue), 'F', 400, '.', sal_True); break;
|
|
|
|
case TypeClass_FLOAT: aRetStr = String::CreateFromFloat( ::comphelper::getFloat(aValue));break;
|
|
|
|
case TypeClass_DOUBLE: aRetStr = String::CreateFromDouble( ::comphelper::getDouble(aValue));break;
|
2000-09-18 16:07:07 +00:00
|
|
|
// use SolarMath::DoubleToString instead of sprintf as it is more flexible
|
|
|
|
// with respect to the decimal digits (sprintf uses a default value for the number
|
|
|
|
// of dec digits and isn't able to cut trailing zeros)
|
|
|
|
// 67901 - 27.07.99 - FS
|
2000-11-06 06:19:53 +00:00
|
|
|
case TypeClass_BYTE: aRetStr = String::CreateFromInt32(::comphelper::getINT16(aValue)); break;
|
|
|
|
case TypeClass_SHORT: aRetStr = String::CreateFromInt32(::comphelper::getINT16(aValue)); break;
|
|
|
|
case TypeClass_LONG: aRetStr = String::CreateFromInt32(::comphelper::getINT32(aValue)); break;
|
|
|
|
case TypeClass_HYPER: aRetStr.AssignAscii("TYPE HYPER"); break;
|
|
|
|
case TypeClass_UNSIGNED_SHORT: aRetStr = String::CreateFromInt32(::comphelper::getINT16(aValue)); break;
|
|
|
|
case TypeClass_UNSIGNED_LONG: aRetStr = String::CreateFromInt32(::comphelper::getINT32(aValue)); break;
|
|
|
|
case TypeClass_UNSIGNED_HYPER: aRetStr.AssignAscii("TYPE UNSIGNED_HYPER"); break;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return aRetStr;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Hilfs-Funktion, um ein ::rtl::OUString in einen Any zu konvertieren
|
2000-11-06 06:19:53 +00:00
|
|
|
Any StringToAny( ::rtl::OUString _Str, TypeClass eTargetType )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
String aStr(_Str);
|
2000-11-06 06:19:53 +00:00
|
|
|
Any aRetAny;
|
2000-09-18 16:07:07 +00:00
|
|
|
switch( eTargetType )
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
case TypeClass_INTERFACE: break;
|
|
|
|
case TypeClass_SERVICE: break;
|
|
|
|
case TypeClass_MODULE: break;
|
|
|
|
case TypeClass_STRUCT: break;
|
|
|
|
case TypeClass_TYPEDEF: break;
|
|
|
|
case TypeClass_UNION: break;
|
|
|
|
case TypeClass_ENUM: break;
|
|
|
|
case TypeClass_EXCEPTION: break;
|
|
|
|
case TypeClass_ARRAY: break;
|
|
|
|
case TypeClass_SEQUENCE: break;
|
|
|
|
case TypeClass_VOID: break;
|
|
|
|
case TypeClass_ANY: break;
|
|
|
|
case TypeClass_UNKNOWN: break;
|
|
|
|
case TypeClass_BOOLEAN:
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
sal_Bool bB = (aStr.ToInt32() != 0);
|
|
|
|
aRetAny.setValue(&bB,getBooleanCppuType() );
|
|
|
|
break;
|
|
|
|
}
|
2000-11-06 06:19:53 +00:00
|
|
|
case TypeClass_CHAR:
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
sal_Char cC = (aStr.GetChar(0));
|
|
|
|
aRetAny.setValue(&cC,getCharCppuType() ); break;
|
|
|
|
}
|
2000-11-06 06:19:53 +00:00
|
|
|
case TypeClass_STRING: aRetAny <<= _Str; break;
|
|
|
|
case TypeClass_FLOAT: aRetAny <<= aStr.ToFloat(); break;
|
|
|
|
case TypeClass_DOUBLE: aRetAny <<= aStr.ToDouble(); break;
|
|
|
|
case TypeClass_BYTE: aRetAny <<= (sal_uInt8)aStr.ToInt32(); break;
|
|
|
|
case TypeClass_SHORT: aRetAny <<= (sal_Int16)aStr.ToInt32(); break;
|
|
|
|
case TypeClass_LONG: aRetAny <<= (sal_Int32)aStr.ToInt32(); break;
|
|
|
|
case TypeClass_HYPER: break;
|
|
|
|
case TypeClass_UNSIGNED_SHORT: aRetAny <<= (sal_uInt16)aStr.ToInt32(); break;
|
|
|
|
case TypeClass_UNSIGNED_LONG: aRetAny <<= (sal_uInt32)aStr.ToInt32(); break;
|
|
|
|
case TypeClass_UNSIGNED_HYPER: break;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
return aRetAny;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//========================================================================
|
|
|
|
// = CursorWrapper
|
|
|
|
//------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
CursorWrapper::CursorWrapper(const Reference< ::com::sun::star::sdbc::XRowSet>& _rxCursor, sal_Bool bUseCloned)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
ImplConstruct(Reference< ::com::sun::star::sdbc::XResultSet>(_rxCursor, UNO_QUERY), bUseCloned);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
CursorWrapper::CursorWrapper(const Reference< ::com::sun::star::sdbc::XResultSet>& _rxCursor, sal_Bool bUseCloned)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ImplConstruct(_rxCursor, bUseCloned);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void CursorWrapper::ImplConstruct(const Reference< ::com::sun::star::sdbc::XResultSet>& _rxCursor, sal_Bool bUseCloned)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if (bUseCloned)
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdb::XResultSetAccess> xAccess(_rxCursor, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
try
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
m_xMoveOperations = xAccess.is() ? xAccess->createResultSet() : Reference< ::com::sun::star::sdbc::XResultSet>();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2000-10-31 10:59:33 +00:00
|
|
|
catch(Exception&)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
m_xMoveOperations = _rxCursor;
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
m_xBookmarkOperations = Reference< ::com::sun::star::sdbcx::XRowLocate>(m_xMoveOperations, UNO_QUERY);
|
|
|
|
m_xColumnsSupplier = Reference< ::com::sun::star::sdbcx::XColumnsSupplier>(m_xMoveOperations, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if (!m_xMoveOperations.is() || !m_xBookmarkOperations.is() || !m_xColumnsSupplier.is())
|
|
|
|
{ // all or nothing !!
|
|
|
|
m_xMoveOperations = NULL;
|
|
|
|
m_xBookmarkOperations = NULL;
|
|
|
|
m_xColumnsSupplier = NULL;
|
|
|
|
}
|
2000-10-31 10:59:33 +00:00
|
|
|
else
|
|
|
|
m_xGeneric = m_xMoveOperations.get();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
const CursorWrapper& CursorWrapper::operator=(const Reference< ::com::sun::star::sdbc::XRowSet>& _rxCursor)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
m_xMoveOperations = Reference< ::com::sun::star::sdbc::XResultSet>(_rxCursor, UNO_QUERY);
|
|
|
|
m_xBookmarkOperations = Reference< ::com::sun::star::sdbcx::XRowLocate>(_rxCursor, UNO_QUERY);
|
|
|
|
m_xColumnsSupplier = Reference< ::com::sun::star::sdbcx::XColumnsSupplier>(_rxCursor, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!m_xMoveOperations.is() || !m_xBookmarkOperations.is() || !m_xColumnsSupplier.is())
|
|
|
|
{ // all or nothing !!
|
|
|
|
m_xMoveOperations = NULL;
|
|
|
|
m_xBookmarkOperations = NULL;
|
|
|
|
m_xColumnsSupplier = NULL;
|
|
|
|
}
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
//==============================================================================
|
2000-11-06 06:19:53 +00:00
|
|
|
//IndexAccessIterator::IndexAccessIterator(Reference< XInterface> xStartingPoint)
|
2000-09-18 16:07:07 +00:00
|
|
|
// :m_xStartingPoint(xStartingPoint)
|
|
|
|
// ,m_xCurrentObject(NULL)
|
|
|
|
//{
|
|
|
|
// DBG_ASSERT(m_xStartingPoint.is(), "IndexAccessIterator::IndexAccessIterator : no starting point !");
|
|
|
|
//}
|
|
|
|
//
|
|
|
|
// ------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
//Reference< XInterface> IndexAccessIterator::Next()
|
2000-09-18 16:07:07 +00:00
|
|
|
//{
|
|
|
|
// sal_Bool bCheckingStartingPoint = !m_xCurrentObject.is();
|
|
|
|
// // ist die aktuelle Node der Anfangspunkt ?
|
|
|
|
// sal_Bool bAlreadyCheckedCurrent = m_xCurrentObject.is();
|
|
|
|
// // habe ich die aktuelle Node schon mal mittels ShouldHandleElement testen ?
|
|
|
|
// if (!m_xCurrentObject.is())
|
|
|
|
// m_xCurrentObject = m_xStartingPoint;
|
|
|
|
//
|
2000-11-06 06:19:53 +00:00
|
|
|
// Reference< XInterface> xSearchLoop( m_xCurrentObject);
|
2000-09-18 16:07:07 +00:00
|
|
|
// sal_Bool bHasMoreToSearch = sal_True;
|
|
|
|
// sal_Bool bFoundSomething = sal_False;
|
|
|
|
// while (!bFoundSomething && bHasMoreToSearch)
|
|
|
|
// {
|
|
|
|
// // pre-order-traversierung
|
|
|
|
// if (!bAlreadyCheckedCurrent && ShouldHandleElement(xSearchLoop))
|
|
|
|
// {
|
|
|
|
// m_xCurrentObject = xSearchLoop;
|
|
|
|
// bFoundSomething = sal_True;
|
|
|
|
// }
|
|
|
|
// else
|
|
|
|
// {
|
|
|
|
// // zuerst absteigen, wenn moeglich
|
2000-11-06 06:19:53 +00:00
|
|
|
// Reference< ::com::sun::star::container::XIndexAccess> xContainerAccess(xSearchLoop, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
// if (xContainerAccess.is() && xContainerAccess->getCount() && ShouldStepInto(xContainerAccess))
|
|
|
|
// { // zum ersten Child
|
2000-11-06 06:19:53 +00:00
|
|
|
// Any aElement(xContainerAccess->getByIndex(0));
|
|
|
|
// xSearchLoop = *(Reference< XInterface>*)aElement.getValue();
|
2000-09-18 16:07:07 +00:00
|
|
|
// bCheckingStartingPoint = sal_False;
|
|
|
|
//
|
|
|
|
// m_arrChildIndizies.Insert(ULONG(0), m_arrChildIndizies.Count());
|
|
|
|
// }
|
|
|
|
// else
|
|
|
|
// {
|
|
|
|
// // dann nach oben und nach rechts, wenn moeglich
|
|
|
|
// while (m_arrChildIndizies.Count() > 0)
|
|
|
|
// { // (mein Stack ist nich leer, also kann ich noch nach oben gehen)
|
2000-11-06 06:19:53 +00:00
|
|
|
// Reference< ::com::sun::star::container::XChild> xChild(xSearchLoop, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
// DBG_ASSERT(xChild.is(), "IndexAccessIterator::Next : a content has no approriate interface !");
|
|
|
|
//
|
2000-11-06 06:19:53 +00:00
|
|
|
// Reference< XInterface> xParent( xChild->getParent());
|
|
|
|
// xContainerAccess = Reference< ::com::sun::star::container::XIndexAccess>(xParent, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
// DBG_ASSERT(xContainerAccess.is(), "IndexAccessIterator::Next : a content has an invalid parent !");
|
|
|
|
//
|
|
|
|
// // den Index, den SearchLoop in diesem Parent hatte, von meinem 'Stack'
|
|
|
|
// ULONG nOldSearchChildIndex = m_arrChildIndizies.GetObject(m_arrChildIndizies.Count() - 1);
|
|
|
|
// m_arrChildIndizies.Remove(m_arrChildIndizies.Count() - 1);
|
|
|
|
//
|
|
|
|
// if (nOldSearchChildIndex < xContainerAccess->getCount() - 1)
|
|
|
|
// { // auf dieser Ebene geht es noch nach rechts
|
|
|
|
// ++nOldSearchChildIndex;
|
|
|
|
// // also das naechste Child
|
2000-11-06 06:19:53 +00:00
|
|
|
// Any aElement(xContainerAccess->getByIndex(nOldSearchChildIndex));
|
|
|
|
// xSearchLoop = *(Reference< XInterface>*) aElement.getValue();
|
2000-09-18 16:07:07 +00:00
|
|
|
// bCheckingStartingPoint = sal_False;
|
|
|
|
// // und dessen Position auf den 'Stack'
|
|
|
|
// m_arrChildIndizies.Insert(ULONG(nOldSearchChildIndex), m_arrChildIndizies.Count());
|
|
|
|
//
|
|
|
|
// break;
|
|
|
|
// }
|
|
|
|
// // hierher komme ich, wenn es auf der aktuellen Ebene nicht nach rechts geht, dann mache ich eine darueber weiter
|
|
|
|
// xSearchLoop = xParent;
|
|
|
|
// bCheckingStartingPoint = sal_False;
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// if ((m_arrChildIndizies.Count() == 0) && !bCheckingStartingPoint)
|
|
|
|
// { // das ist genau dann der Fall, wenn ich keinen rechten Nachbarn fuer irgendeinen der direkten Vorfahren des
|
|
|
|
// // urspruenglichen xSearchLoop gefunden habe
|
|
|
|
// bHasMoreToSearch = sal_False;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// if (bHasMoreToSearch)
|
|
|
|
// { // ich habe in xSearchLoop jetzt ein Interface eines 'Knotens' meines 'Baumes', den ich noch abtesten kann
|
|
|
|
// if (ShouldHandleElement(xSearchLoop))
|
|
|
|
// {
|
|
|
|
// m_xCurrentObject = xSearchLoop;
|
|
|
|
// bFoundSomething = sal_True;
|
|
|
|
// }
|
|
|
|
// else
|
|
|
|
// if (bCheckingStartingPoint)
|
|
|
|
// // ich bin noch am Anfang, konnte nicht absteigen, und habe an diesem Anfang nix gefunden -> nix mehr zu tun
|
|
|
|
// bHasMoreToSearch = sal_False;
|
|
|
|
// bAlreadyCheckedCurrent = sal_True;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// if (!bFoundSomething)
|
|
|
|
// {
|
|
|
|
// DBG_ASSERT(m_arrChildIndizies.Count() == 0, "IndexAccessIterator::Next : items left on stack ! how this ?");
|
|
|
|
// Invalidate();
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// return m_xCurrentObject;
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
FmXDisposeListener::~FmXDisposeListener()
|
|
|
|
{
|
|
|
|
setAdapter(NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
void FmXDisposeListener::setAdapter(FmXDisposeMultiplexer* pAdapter)
|
|
|
|
{
|
|
|
|
if (m_pAdapter)
|
|
|
|
{
|
|
|
|
::osl::MutexGuard aGuard(m_rMutex);
|
|
|
|
m_pAdapter->release();
|
|
|
|
m_pAdapter = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pAdapter)
|
|
|
|
{
|
|
|
|
::osl::MutexGuard aGuard(m_rMutex);
|
|
|
|
m_pAdapter = pAdapter;
|
|
|
|
m_pAdapter->acquire();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
DBG_NAME(FmXDisposeMultiplexer);
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
FmXDisposeMultiplexer::FmXDisposeMultiplexer(FmXDisposeListener* _pListener, const Reference< ::com::sun::star::lang::XComponent>& _rxObject, sal_Int16 _nId)
|
2000-09-18 16:07:07 +00:00
|
|
|
:m_pListener(_pListener)
|
|
|
|
,m_xObject(_rxObject)
|
|
|
|
,m_nId(_nId)
|
|
|
|
{
|
|
|
|
DBG_CTOR(FmXDisposeMultiplexer, NULL);
|
|
|
|
m_pListener->setAdapter(this);
|
|
|
|
|
|
|
|
if (m_xObject.is())
|
|
|
|
m_xObject->addEventListener(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
FmXDisposeMultiplexer::~FmXDisposeMultiplexer()
|
|
|
|
{
|
|
|
|
DBG_DTOR(FmXDisposeMultiplexer, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
// ::com::sun::star::lang::XEventListener
|
|
|
|
//------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void FmXDisposeMultiplexer::disposing(const ::com::sun::star::lang::EventObject& _Source) throw( RuntimeException )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::lang::XEventListener> xPreventDelete(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if (m_pListener)
|
|
|
|
{
|
|
|
|
m_pListener->disposing(_Source, m_nId);
|
|
|
|
m_pListener->setAdapter(NULL);
|
|
|
|
m_pListener = NULL;
|
|
|
|
}
|
|
|
|
m_xObject = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------
|
|
|
|
void FmXDisposeMultiplexer::dispose()
|
|
|
|
{
|
|
|
|
if (m_xObject.is())
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::lang::XEventListener> xPreventDelete(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
m_xObject->removeEventListener(this);
|
|
|
|
m_xObject = NULL;
|
|
|
|
|
|
|
|
m_pListener->setAdapter(NULL);
|
|
|
|
m_pListener = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
sal_Int16 getControlTypeByObject(const Reference< ::com::sun::star::lang::XServiceInfo>& _rxObject)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
// ask for the persistent service name
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::io::XPersistObject> xPersistence(_rxObject, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_ASSERT(xPersistence.is(), "::getControlTypeByObject : argument shold be an ::com::sun::star::io::XPersistObject !");
|
|
|
|
if (!xPersistence.is())
|
|
|
|
return OBJ_FM_CONTROL;
|
|
|
|
|
|
|
|
::rtl::OUString sPersistentServiceName = xPersistence->getServiceName();
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_EDIT)) // 5.0-Name
|
|
|
|
{
|
|
|
|
// may be a simple edit field or a formatted field, dependent of the supported services
|
|
|
|
if (_rxObject->supportsService(FM_SUN_COMPONENT_FORMATTEDFIELD))
|
|
|
|
return OBJ_FM_FORMATTEDFIELD;
|
|
|
|
return OBJ_FM_EDIT;
|
|
|
|
}
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_TEXTFIELD))
|
|
|
|
return OBJ_FM_EDIT;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_COMMANDBUTTON))
|
|
|
|
return OBJ_FM_BUTTON;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_FIXEDTEXT))
|
|
|
|
return OBJ_FM_FIXEDTEXT;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_LISTBOX))
|
|
|
|
return OBJ_FM_LISTBOX;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_CHECKBOX))
|
|
|
|
return OBJ_FM_CHECKBOX;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_RADIOBUTTON))
|
|
|
|
return OBJ_FM_RADIOBUTTON;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_GROUPBOX))
|
|
|
|
return OBJ_FM_GROUPBOX;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_COMBOBOX))
|
|
|
|
return OBJ_FM_COMBOBOX;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_GRID)) // 5.0-Name
|
|
|
|
return OBJ_FM_GRID;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_GRIDCONTROL))
|
|
|
|
return OBJ_FM_GRID;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_IMAGEBUTTON))
|
|
|
|
return OBJ_FM_IMAGEBUTTON;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_FILECONTROL))
|
|
|
|
return OBJ_FM_FILECONTROL;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_DATEFIELD))
|
|
|
|
return OBJ_FM_DATEFIELD;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_TIMEFIELD))
|
|
|
|
return OBJ_FM_TIMEFIELD;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_NUMERICFIELD))
|
|
|
|
return OBJ_FM_NUMERICFIELD;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_CURRENCYFIELD))
|
|
|
|
return OBJ_FM_CURRENCYFIELD;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_PATTERNFIELD))
|
|
|
|
return OBJ_FM_PATTERNFIELD;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_HIDDEN)) // 5.0-Name
|
|
|
|
return OBJ_FM_HIDDEN;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_HIDDENCONTROL))
|
|
|
|
return OBJ_FM_HIDDEN;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_IMAGECONTROL))
|
|
|
|
return OBJ_FM_IMAGECONTROL;
|
|
|
|
if (sPersistentServiceName.equals(FM_COMPONENT_FORMATTEDFIELD))
|
|
|
|
{
|
|
|
|
DBG_ERROR("::getControlTypeByObject : suspicious persistent service name (formatted field) !");
|
|
|
|
// objects with that service name should exist as they aren't compatible with older versions
|
|
|
|
return OBJ_FM_FORMATTEDFIELD;
|
|
|
|
}
|
|
|
|
|
|
|
|
DBG_ERROR("::getControlTypeByObject : unknown object type !");
|
|
|
|
return OBJ_FM_CONTROL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
sal_Int16 getControlTypeByModelName(const ::rtl::OUString& rModel)
|
|
|
|
{
|
|
|
|
if (rModel.equals(FM_COMPONENT_EDIT)) // 5.0-Name
|
|
|
|
return OBJ_FM_EDIT;
|
|
|
|
if (rModel.equals(FM_COMPONENT_TEXTFIELD))
|
|
|
|
return OBJ_FM_EDIT;
|
|
|
|
if (rModel.equals(FM_COMPONENT_COMMANDBUTTON))
|
|
|
|
return OBJ_FM_BUTTON;
|
|
|
|
if (rModel.equals(FM_COMPONENT_FIXEDTEXT))
|
|
|
|
return OBJ_FM_FIXEDTEXT;
|
|
|
|
if (rModel.equals(FM_COMPONENT_LISTBOX))
|
|
|
|
return OBJ_FM_LISTBOX;
|
|
|
|
if (rModel.equals(FM_COMPONENT_CHECKBOX))
|
|
|
|
return OBJ_FM_CHECKBOX;
|
|
|
|
if (rModel.equals(FM_COMPONENT_RADIOBUTTON))
|
|
|
|
return OBJ_FM_RADIOBUTTON;
|
|
|
|
if (rModel.equals(FM_COMPONENT_GROUPBOX))
|
|
|
|
return OBJ_FM_GROUPBOX;
|
|
|
|
if (rModel.equals(FM_COMPONENT_COMBOBOX))
|
|
|
|
return OBJ_FM_COMBOBOX;
|
|
|
|
if (rModel.equals(FM_COMPONENT_GRID)) // 5.0-Name
|
|
|
|
return OBJ_FM_GRID;
|
|
|
|
if (rModel.equals(FM_COMPONENT_GRIDCONTROL))
|
|
|
|
return OBJ_FM_GRID;
|
|
|
|
if (rModel.equals(FM_COMPONENT_IMAGEBUTTON))
|
|
|
|
return OBJ_FM_IMAGEBUTTON;
|
|
|
|
if (rModel.equals(FM_COMPONENT_FILECONTROL))
|
|
|
|
return OBJ_FM_FILECONTROL;
|
|
|
|
if (rModel.equals(FM_COMPONENT_DATEFIELD))
|
|
|
|
return OBJ_FM_DATEFIELD;
|
|
|
|
if (rModel.equals(FM_COMPONENT_TIMEFIELD))
|
|
|
|
return OBJ_FM_TIMEFIELD;
|
|
|
|
if (rModel.equals(FM_COMPONENT_NUMERICFIELD))
|
|
|
|
return OBJ_FM_NUMERICFIELD;
|
|
|
|
if (rModel.equals(FM_COMPONENT_CURRENCYFIELD))
|
|
|
|
return OBJ_FM_CURRENCYFIELD;
|
|
|
|
if (rModel.equals(FM_COMPONENT_PATTERNFIELD))
|
|
|
|
return OBJ_FM_PATTERNFIELD;
|
|
|
|
if (rModel.equals(FM_COMPONENT_HIDDEN)) // 5.0-Name
|
|
|
|
return OBJ_FM_HIDDEN;
|
|
|
|
if (rModel.equals(FM_COMPONENT_HIDDENCONTROL))
|
|
|
|
return OBJ_FM_HIDDEN;
|
|
|
|
if (rModel.equals(FM_COMPONENT_IMAGECONTROL))
|
|
|
|
return OBJ_FM_IMAGECONTROL;
|
|
|
|
if (rModel.equals(FM_COMPONENT_FORMATTEDFIELD))
|
|
|
|
return OBJ_FM_FORMATTEDFIELD;
|
|
|
|
return OBJ_FM_CONTROL;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
::rtl::OUString getServiceNameByControlType(sal_Int16 nType)
|
|
|
|
{
|
|
|
|
switch (nType)
|
|
|
|
{
|
|
|
|
case OBJ_FM_EDIT : return FM_COMPONENT_TEXTFIELD;
|
|
|
|
case OBJ_FM_BUTTON : return FM_COMPONENT_COMMANDBUTTON;
|
|
|
|
case OBJ_FM_FIXEDTEXT : return FM_COMPONENT_FIXEDTEXT;
|
|
|
|
case OBJ_FM_LISTBOX : return FM_COMPONENT_LISTBOX;
|
|
|
|
case OBJ_FM_CHECKBOX : return FM_COMPONENT_CHECKBOX;
|
|
|
|
case OBJ_FM_RADIOBUTTON : return FM_COMPONENT_RADIOBUTTON;
|
|
|
|
case OBJ_FM_GROUPBOX : return FM_COMPONENT_GROUPBOX;
|
|
|
|
case OBJ_FM_COMBOBOX : return FM_COMPONENT_COMBOBOX;
|
|
|
|
case OBJ_FM_GRID : return FM_COMPONENT_GRIDCONTROL;
|
|
|
|
case OBJ_FM_IMAGEBUTTON : return FM_COMPONENT_IMAGEBUTTON;
|
|
|
|
case OBJ_FM_FILECONTROL : return FM_COMPONENT_FILECONTROL;
|
|
|
|
case OBJ_FM_DATEFIELD : return FM_COMPONENT_DATEFIELD;
|
|
|
|
case OBJ_FM_TIMEFIELD : return FM_COMPONENT_TIMEFIELD;
|
|
|
|
case OBJ_FM_NUMERICFIELD : return FM_COMPONENT_NUMERICFIELD;
|
|
|
|
case OBJ_FM_CURRENCYFIELD : return FM_COMPONENT_CURRENCYFIELD;
|
|
|
|
case OBJ_FM_PATTERNFIELD : return FM_COMPONENT_PATTERNFIELD;
|
|
|
|
case OBJ_FM_HIDDEN : return FM_COMPONENT_HIDDENCONTROL;
|
|
|
|
case OBJ_FM_IMAGECONTROL : return FM_COMPONENT_IMAGECONTROL;
|
|
|
|
case OBJ_FM_FORMATTEDFIELD : return FM_COMPONENT_FORMATTEDFIELD;
|
|
|
|
}
|
|
|
|
return ::rtl::OUString();
|
|
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence< ::rtl::OUString> getEventMethods(const Type& type)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
typelib_InterfaceTypeDescription *pType=0;
|
|
|
|
type.getDescription( (typelib_TypeDescription**)&pType);
|
|
|
|
|
|
|
|
if(!pType)
|
2000-11-06 06:19:53 +00:00
|
|
|
return Sequence< ::rtl::OUString>();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence< ::rtl::OUString> aNames(pType->nMembers);
|
2000-09-18 16:07:07 +00:00
|
|
|
::rtl::OUString* pNames = aNames.getArray();
|
|
|
|
for(sal_Int32 i=0;i<pType->nMembers;i++,++pNames)
|
|
|
|
{
|
|
|
|
*pNames = pType->ppMembers[i]->pTypeName;
|
|
|
|
}
|
|
|
|
|
|
|
|
typelib_typedescription_release( (typelib_TypeDescription *)pType );
|
|
|
|
return aNames;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void TransferEventScripts(const Reference< ::com::sun::star::awt::XControlModel>& xModel, const Reference< ::com::sun::star::awt::XControl>& xControl,
|
|
|
|
const Sequence< ::com::sun::star::script::ScriptEventDescriptor>& rTransferIfAvailable)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
// first check if we have a XEventAttacherManager for the model
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::container::XChild> xModelChild(xModel, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!xModelChild.is())
|
|
|
|
return; // nothing to do
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::script::XEventAttacherManager> xEventManager(xModelChild->getParent(), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!xEventManager.is())
|
|
|
|
return; // nothing to do
|
|
|
|
|
|
|
|
if (!rTransferIfAvailable.getLength())
|
|
|
|
return; // nothing to do
|
|
|
|
|
|
|
|
// check for the index of the model within it's parent
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::container::XIndexAccess> xParentIndex(xModelChild->getParent(), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!xParentIndex.is())
|
|
|
|
return; // nothing to do
|
|
|
|
sal_Int32 nIndex = getElementPos(xParentIndex, xModel);
|
|
|
|
if (nIndex<0 || nIndex>=xParentIndex->getCount())
|
|
|
|
return; // nothing to do
|
|
|
|
|
|
|
|
// then we need informations about the listeners supported by the control and the model
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence< Type> aModelListeners;
|
|
|
|
Sequence< Type> aControlListeners;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::beans::XIntrospection> xModelIntrospection(::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.beans.Introspection")), UNO_QUERY);
|
|
|
|
Reference< ::com::sun::star::beans::XIntrospection> xControlIntrospection(::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.beans.Introspection")), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if (xModelIntrospection.is() && xModel.is())
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Any aModel(makeAny(xModel));
|
2000-09-18 16:07:07 +00:00
|
|
|
aModelListeners = xModelIntrospection->inspect(aModel)->getSupportedListeners();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (xControlIntrospection.is() && xControl.is())
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Any aControl(makeAny(xControl));
|
2000-09-18 16:07:07 +00:00
|
|
|
aControlListeners = xControlIntrospection->inspect(aControl)->getSupportedListeners();
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Int32 nMaxNewLen = aModelListeners.getLength() + aControlListeners.getLength();
|
|
|
|
if (!nMaxNewLen)
|
|
|
|
return; // the model and the listener don't support any listeners (or we were unable to retrieve these infos)
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence< ::com::sun::star::script::ScriptEventDescriptor> aTransferable(nMaxNewLen);
|
2000-09-18 16:07:07 +00:00
|
|
|
::com::sun::star::script::ScriptEventDescriptor* pTransferable = aTransferable.getArray();
|
|
|
|
|
|
|
|
const ::com::sun::star::script::ScriptEventDescriptor* pCurrent = rTransferIfAvailable.getConstArray();
|
|
|
|
sal_Int32 i,j,k;
|
|
|
|
for (i=0; i<rTransferIfAvailable.getLength(); ++i, ++pCurrent)
|
|
|
|
{
|
|
|
|
// search the model/control idl classes for the event described by pCurrent
|
2000-11-06 06:19:53 +00:00
|
|
|
for ( Sequence< Type>* pCurrentArray = &aModelListeners;
|
2000-09-18 16:07:07 +00:00
|
|
|
pCurrentArray;
|
|
|
|
pCurrentArray = (pCurrentArray == &aModelListeners) ? &aControlListeners : NULL
|
|
|
|
)
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
const Type* pCurrentListeners = pCurrentArray->getConstArray();
|
2000-09-18 16:07:07 +00:00
|
|
|
for (j=0; j<pCurrentArray->getLength(); ++j, ++pCurrentListeners)
|
|
|
|
{
|
|
|
|
UniString aListener = (*pCurrentListeners).getTypeName();
|
|
|
|
sal_Int32 nTokens = aListener.GetTokenCount('.');
|
|
|
|
if (nTokens)
|
|
|
|
aListener = aListener.GetToken(nTokens - 1, '.');
|
|
|
|
|
|
|
|
if (aListener == pCurrent->ListenerType.getStr())
|
|
|
|
// the current ::com::sun::star::script::ScriptEventDescriptor doesn't match the current listeners class
|
|
|
|
continue;
|
|
|
|
|
|
|
|
// now check the methods
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence< ::rtl::OUString> aMethodsNames = getEventMethods(*pCurrentListeners);
|
2000-09-18 16:07:07 +00:00
|
|
|
const ::rtl::OUString* pMethodsNames = aMethodsNames.getConstArray();
|
|
|
|
for (k=0; k<aMethodsNames.getLength(); ++k, ++pMethodsNames)
|
|
|
|
{
|
|
|
|
if ((*pMethodsNames).compareTo(pCurrent->EventMethod) != COMPARE_EQUAL)
|
|
|
|
// the current ::com::sun::star::script::ScriptEventDescriptor doesn't match the current listeners current method
|
|
|
|
continue;
|
|
|
|
|
|
|
|
// we can transfer the script event : the model (control) supports it
|
|
|
|
*pTransferable = *pCurrent;
|
|
|
|
++pTransferable;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (k<aMethodsNames.getLength())
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Int32 nRealNewLen = pTransferable - aTransferable.getArray();
|
|
|
|
aTransferable.realloc(nRealNewLen);
|
|
|
|
|
|
|
|
xEventManager->registerScriptEvents(nIndex, aTransferable);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
sal_Int16 GridModel2ViewPos(const Reference< ::com::sun::star::container::XIndexAccess>& rColumns, sal_Int16 nModelPos)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if (rColumns.is())
|
|
|
|
{
|
|
|
|
// invalid pos ?
|
|
|
|
if (nModelPos >= rColumns->getCount())
|
|
|
|
return (sal_Int16)-1;
|
|
|
|
|
|
|
|
// the column itself shouldn't be hidden
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::beans::XPropertySet> xAskedFor( *(Reference< ::com::sun::star::beans::XPropertySet>*)rColumns->getByIndex(nModelPos).getValue());
|
2000-10-20 13:18:57 +00:00
|
|
|
if (::comphelper::getBOOL(xAskedFor->getPropertyValue(FM_PROP_HIDDEN)))
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ERROR("GridModel2ViewPos : invalid argument !");
|
|
|
|
return (sal_Int16)-1;
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Int16 nViewPos = nModelPos;
|
|
|
|
for (sal_Int16 i=0; i<nModelPos; ++i)
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::beans::XPropertySet> xCur( *(Reference< ::com::sun::star::beans::XPropertySet>*)rColumns->getByIndex(i).getValue());
|
2000-10-20 13:18:57 +00:00
|
|
|
if (::comphelper::getBOOL(xCur->getPropertyValue(FM_PROP_HIDDEN)))
|
2000-09-18 16:07:07 +00:00
|
|
|
--nViewPos;
|
|
|
|
}
|
|
|
|
return nViewPos;
|
|
|
|
}
|
|
|
|
return (sal_Int16)-1;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
sal_Int16 GridView2ModelPos(const Reference< ::com::sun::star::container::XIndexAccess>& rColumns, sal_Int16 nViewPos)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if (rColumns.is())
|
|
|
|
{
|
|
|
|
// loop through all columns
|
|
|
|
sal_Int16 i;
|
|
|
|
for (i=0; i<rColumns->getCount(); ++i)
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::beans::XPropertySet> xCur( *(Reference< ::com::sun::star::beans::XPropertySet>*)rColumns->getByIndex(i).getValue());
|
2000-10-20 13:18:57 +00:00
|
|
|
if (!::comphelper::getBOOL(xCur->getPropertyValue(FM_PROP_HIDDEN)))
|
2000-09-18 16:07:07 +00:00
|
|
|
// for every visible col : if nViewPos is greater zero, decrement it, else we
|
|
|
|
// have found the model position
|
|
|
|
if (!nViewPos)
|
|
|
|
break;
|
|
|
|
else
|
|
|
|
--nViewPos;
|
|
|
|
}
|
|
|
|
if (i<rColumns->getCount())
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
return (sal_Int16)-1;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
sal_Int16 GridViewColumnCount(const Reference< ::com::sun::star::container::XIndexAccess>& rColumns)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if (rColumns.is())
|
|
|
|
{
|
|
|
|
sal_Int16 nCount = rColumns->getCount();
|
|
|
|
// loop through all columns
|
|
|
|
for (sal_Int16 i=0; i<rColumns->getCount(); ++i)
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::beans::XPropertySet> xCur( *(Reference< ::com::sun::star::beans::XPropertySet>*)rColumns->getByIndex(i).getValue());
|
2000-10-20 13:18:57 +00:00
|
|
|
if (::comphelper::getBOOL(xCur->getPropertyValue(FM_PROP_HIDDEN)))
|
2000-09-18 16:07:07 +00:00
|
|
|
--nCount;
|
|
|
|
}
|
|
|
|
return nCount;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// dbtools
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
UniString quoteName(const UniString& rQuote, const UniString& rName)
|
|
|
|
{
|
|
|
|
UniString sReturn(rQuote);
|
|
|
|
sReturn += rName;
|
|
|
|
sReturn += rQuote;
|
|
|
|
return sReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
UniString quoteTableName(const Reference< ::com::sun::star::sdbc::XDatabaseMetaData>& _rxMeta, const UniString& rName)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
UniString sQuote = _rxMeta->getIdentifierQuoteString();
|
|
|
|
UniString sQuotedName;
|
|
|
|
UniString aTableName(rName);
|
|
|
|
|
|
|
|
if (_rxMeta->supportsCatalogsInDataManipulation())
|
|
|
|
{
|
|
|
|
sal_Unicode cSeparator = '.';
|
|
|
|
UniString sSeparator = _rxMeta->getCatalogSeparator();
|
|
|
|
if (sSeparator.Len() != 0)
|
|
|
|
cSeparator = sSeparator.GetChar(0);
|
|
|
|
|
|
|
|
if (aTableName.GetTokenCount(cSeparator) >= 2)
|
|
|
|
{
|
|
|
|
UniString aDatabaseName(aTableName.GetToken(0,cSeparator));
|
|
|
|
sQuotedName += quoteName(sQuote, aDatabaseName);
|
|
|
|
sQuotedName += cSeparator;
|
|
|
|
aTableName.Erase(0, aDatabaseName.Len() + 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (_rxMeta->supportsSchemasInDataManipulation())
|
|
|
|
{
|
|
|
|
if (aTableName.GetTokenCount('.') == 2)
|
|
|
|
{
|
|
|
|
sQuotedName += quoteName(sQuote, aTableName.GetToken(0,'.'));
|
|
|
|
sQuotedName += '.';
|
|
|
|
sQuotedName += quoteName(sQuote, aTableName.GetToken(1,'.'));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sQuotedName += quoteName(sQuote, aTableName);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sQuotedName += quoteName(sQuote, aTableName);
|
|
|
|
|
|
|
|
return sQuotedName;
|
|
|
|
}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
// FmSlotDispatch - some kind of translator between the Sfx-Slots and the UNO-dispatchers
|
|
|
|
//==============================================================================
|
|
|
|
|
|
|
|
// SMART_UNO_IMPLEMENTATION(FmSlotDispatch, UsrObject);
|
|
|
|
|
|
|
|
|
|
|
|
DBG_NAME(FmSlotDispatch);
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
FmSlotDispatch::FmSlotDispatch(const URL& rUrl, sal_Int16 nSlotId, SfxBindings& rBindings)
|
2000-09-18 16:07:07 +00:00
|
|
|
:SfxControllerItem(nSlotId, rBindings)
|
|
|
|
,m_aDisposeListeners(m_aAccessSafety)
|
|
|
|
,m_aStatusListeners(m_aAccessSafety)
|
|
|
|
,m_aUrl(rUrl)
|
|
|
|
,m_nSlot(nSlotId)
|
|
|
|
{
|
|
|
|
DBG_CTOR(FmSlotDispatch,NULL);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
FmSlotDispatch::~FmSlotDispatch()
|
|
|
|
{
|
|
|
|
|
|
|
|
DBG_DTOR(FmSlotDispatch,NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void FmSlotDispatch::dispatch(const URL& aURL, const Sequence< ::com::sun::star::beans::PropertyValue>& aArgs) throw( RuntimeException )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT(aURL.Main.compareTo(m_aUrl.Main) == COMPARE_EQUAL, "FmSlotDispatch::dispatch : invalid argument !");
|
|
|
|
DBG_ASSERT(m_aExecutor.IsSet(), "FmSlotDispatch::dispatch : no executor !");
|
|
|
|
// if we have no executor we would have disabled this feature in statusChanged-calls
|
|
|
|
|
|
|
|
m_aExecutor.Call(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void FmSlotDispatch::NotifyState(SfxItemState eState, const SfxPoolItem* pState, const Reference< ::com::sun::star::frame::XStatusListener>& rListener)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
::com::sun::star::frame::FeatureStateEvent aEvent = BuildEvent(eState, pState);
|
|
|
|
|
|
|
|
if (rListener.is())
|
|
|
|
rListener->statusChanged(aEvent);
|
|
|
|
else
|
|
|
|
NOTIFY_LISTENERS(m_aStatusListeners, ::com::sun::star::frame::XStatusListener, statusChanged, aEvent);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void SAL_CALL FmSlotDispatch::addStatusListener( const Reference< ::com::sun::star::frame::XStatusListener >& xControl, const URL& aURL ) throw(RuntimeException)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT((aURL.Main.getLength() == 0) || (aURL.Main.compareTo(m_aUrl.Main) == COMPARE_EQUAL),
|
|
|
|
"FmSlotDispatch::dispatch : invalid argument !");
|
|
|
|
m_aStatusListeners.addInterface( xControl );
|
|
|
|
|
|
|
|
// acknowledge the initial status
|
|
|
|
SfxPoolItem* pState = NULL;
|
|
|
|
SfxItemState eInitialState = GetBindings().QueryState(m_nSlot, pState);
|
|
|
|
|
|
|
|
NotifyState(eInitialState, pState, xControl);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void SAL_CALL FmSlotDispatch::removeStatusListener( const Reference< ::com::sun::star::frame::XStatusListener >& xControl, const URL& aURL ) throw(RuntimeException)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT((aURL.Main.getLength() == 0) || (aURL.Main.compareTo(m_aUrl.Main) == COMPARE_EQUAL),
|
|
|
|
"FmSlotDispatch::dispatch : invalid argument !");
|
|
|
|
m_aStatusListeners.removeInterface( xControl );
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void SAL_CALL FmSlotDispatch::dispose( ) throw(RuntimeException)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
::com::sun::star::lang::EventObject aEvt(Reference< XInterface >(*this));
|
2000-09-18 16:07:07 +00:00
|
|
|
m_aDisposeListeners.disposeAndClear(aEvt);
|
|
|
|
m_aStatusListeners.disposeAndClear(aEvt);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void SAL_CALL FmSlotDispatch::addEventListener( const Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw(RuntimeException)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
m_aDisposeListeners.addInterface( xListener );
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void SAL_CALL FmSlotDispatch::removeEventListener( const Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw(RuntimeException)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
m_aDisposeListeners.removeInterface( aListener );
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
void FmSlotDispatch::StateChanged(sal_Int16 nSID, SfxItemState eState, const SfxPoolItem* pState)
|
|
|
|
{
|
|
|
|
DBG_ASSERT(nSID == m_nSlot, "FmSlotDispatch::StateChanged : where did this come from ?");
|
|
|
|
|
|
|
|
::com::sun::star::frame::FeatureStateEvent eEvent = BuildEvent(eState, pState);
|
|
|
|
NOTIFY_LISTENERS(m_aStatusListeners, ::com::sun::star::frame::XStatusListener, statusChanged, eEvent);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
::com::sun::star::frame::FeatureStateEvent FmSlotDispatch::BuildEvent(SfxItemState eState, const SfxPoolItem* pState)
|
|
|
|
{
|
|
|
|
::com::sun::star::frame::FeatureStateEvent aReturn;
|
2000-11-06 06:19:53 +00:00
|
|
|
aReturn.Source = (Reference< XInterface >)(*this);
|
2000-09-18 16:07:07 +00:00
|
|
|
aReturn.FeatureURL = m_aUrl;
|
|
|
|
aReturn.IsEnabled = (SFX_ITEM_DISABLED != eState) && m_aExecutor.IsSet();
|
|
|
|
aReturn.Requery = sal_False;
|
|
|
|
|
|
|
|
if (pState)
|
|
|
|
{
|
|
|
|
if (pState->ISA(SfxBoolItem))
|
|
|
|
aReturn.State <<= ((SfxBoolItem*)pState)->GetValue();
|
|
|
|
else if (pState->ISA(SfxStringItem))
|
|
|
|
aReturn.State <<= ::rtl::OUString(((SfxStringItem*)pState)->GetValue());
|
|
|
|
#if DBG_UTIL
|
|
|
|
else if (!pState->ISA(SfxVoidItem))
|
|
|
|
DBG_ERROR("FmSlotDispatch::BuildEvent : don't know what to do with the ItemState !");
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
return aReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
// search in the hierarchy for a connection
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdbc::XConnection> findConnection(const Reference< XInterface>& xParent)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdbc::XConnection> xConnection(xParent, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!xConnection.is())
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::container::XChild> xChild(xParent, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xChild.is())
|
|
|
|
return findConnection(xChild->getParent());
|
|
|
|
}
|
|
|
|
return xConnection;
|
|
|
|
}
|
|
|
|
|
|
|
|
//========================================================================
|
|
|
|
//= FmXDispatchInterceptorImpl
|
|
|
|
//========================================================================
|
|
|
|
|
|
|
|
DBG_NAME(FmXDispatchInterceptorImpl);
|
|
|
|
//------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
FmXDispatchInterceptorImpl::FmXDispatchInterceptorImpl(const Reference< ::com::sun::star::frame::XDispatchProviderInterception>& _rToIntercept, FmDispatchInterceptor* _pMaster, sal_Int16 _nId)
|
2000-09-18 16:07:07 +00:00
|
|
|
: ::cppu::OComponentHelper(_pMaster && _pMaster->getInterceptorMutex() ? *_pMaster->getInterceptorMutex() : m_aFallback)
|
|
|
|
,m_xIntercepted(_rToIntercept)
|
|
|
|
,m_pMaster(_pMaster)
|
|
|
|
,m_nId(_nId)
|
|
|
|
{
|
|
|
|
DBG_CTOR(FmXDispatchInterceptorImpl,NULL);
|
|
|
|
|
|
|
|
::osl::MutexGuard aGuard(getAccessSafety());
|
2000-10-20 13:18:57 +00:00
|
|
|
::comphelper::increment(m_refCount);
|
2000-11-06 06:19:53 +00:00
|
|
|
if (m_xIntercepted.is())
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
m_xIntercepted->registerDispatchProviderInterceptor((::com::sun::star::frame::XDispatchProviderInterceptor*)this);
|
|
|
|
// this should make us the top-level dispatch-provider for the component, via a call to our
|
|
|
|
// setDispatchProvider we should have got an fallback for requests we (i.e. our master) cannot fullfill
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::lang::XComponent> xInterceptedComponent(m_xIntercepted, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xInterceptedComponent.is())
|
|
|
|
xInterceptedComponent->addEventListener((::com::sun::star::lang::XEventListener*)this);
|
|
|
|
}
|
2000-10-20 13:18:57 +00:00
|
|
|
::comphelper::decrement(m_refCount);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
FmXDispatchInterceptorImpl::~FmXDispatchInterceptorImpl()
|
|
|
|
{
|
|
|
|
if (!rBHelper.bDisposed)
|
|
|
|
dispose();
|
|
|
|
|
|
|
|
DBG_DTOR(FmXDispatchInterceptorImpl,NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Any SAL_CALL FmXDispatchInterceptorImpl::queryInterface( const Type& type) throw ( RuntimeException )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Any aOut = ::cppu::queryInterface(type,static_cast< ::com::sun::star::frame::XDispatchProviderInterceptor*>(this),
|
2000-09-18 16:07:07 +00:00
|
|
|
static_cast< ::com::sun::star::frame::XDispatchProvider*>(this),
|
|
|
|
static_cast< ::com::sun::star::lang::XEventListener*>(this));
|
|
|
|
if(aOut.hasValue())
|
|
|
|
return aOut;
|
|
|
|
return OComponentHelper::queryInterface(type);
|
|
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence< Type > SAL_CALL FmXDispatchInterceptorImpl::getTypes( ) throw(RuntimeException)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence< Type > aTypes(OComponentHelper::getTypes());
|
2000-09-18 16:07:07 +00:00
|
|
|
aTypes.realloc(2);
|
2000-11-06 06:19:53 +00:00
|
|
|
Type* pTypes = aTypes.getArray();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
pTypes[aTypes.getLength()-2] = ::getCppuType((const Reference< ::com::sun::star::frame::XDispatchProviderInterceptor>*)0);
|
|
|
|
pTypes[aTypes.getLength()-1] = ::getCppuType((const Reference< ::com::sun::star::lang::XEventListener>*)0);
|
2000-09-18 16:07:07 +00:00
|
|
|
return aTypes;
|
|
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence< sal_Int8 > SAL_CALL FmXDispatchInterceptorImpl::getImplementationId() throw(RuntimeException)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
return ::form::OImplementationIds::getImplementationId(getTypes());
|
|
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::frame::XDispatch > SAL_CALL FmXDispatchInterceptorImpl::queryDispatch( const URL& aURL, const ::rtl::OUString& aTargetFrameName, sal_Int32 nSearchFlags ) throw(RuntimeException)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
::osl::MutexGuard aGuard(getAccessSafety());
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::frame::XDispatch> xResult;
|
2000-09-18 16:07:07 +00:00
|
|
|
// ask our 'real' interceptor
|
|
|
|
if (m_pMaster)
|
|
|
|
xResult = m_pMaster->interceptedQueryDispatch(m_nId, aURL, aTargetFrameName, nSearchFlags);
|
|
|
|
|
|
|
|
// ask our slave provider
|
|
|
|
if (!xResult.is() && m_xSlaveDispatcher.is())
|
|
|
|
xResult = m_xSlaveDispatcher->queryDispatch(aURL, aTargetFrameName, nSearchFlags);
|
|
|
|
|
|
|
|
return xResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence< Reference< ::com::sun::star::frame::XDispatch > > SAL_CALL
|
|
|
|
FmXDispatchInterceptorImpl::queryDispatches( const Sequence< ::com::sun::star::frame::DispatchDescriptor >& aDescripts ) throw(RuntimeException)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
::osl::MutexGuard aGuard(getAccessSafety());
|
2000-11-06 06:19:53 +00:00
|
|
|
Sequence< Reference< ::com::sun::star::frame::XDispatch> > aReturn(aDescripts.getLength());
|
|
|
|
Reference< ::com::sun::star::frame::XDispatch>* pReturn = aReturn.getArray();
|
2000-09-18 16:07:07 +00:00
|
|
|
const ::com::sun::star::frame::DispatchDescriptor* pDescripts = aDescripts.getConstArray();
|
|
|
|
for (sal_Int16 i=0; i<aDescripts.getLength(); ++i, ++pReturn, ++pDescripts)
|
|
|
|
{
|
|
|
|
*pReturn = queryDispatch(pDescripts->FeatureURL, pDescripts->FrameName, pDescripts->SearchFlags);
|
|
|
|
}
|
|
|
|
return aReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::frame::XDispatchProvider > SAL_CALL FmXDispatchInterceptorImpl::getSlaveDispatchProvider( ) throw(RuntimeException)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
::osl::MutexGuard aGuard(getAccessSafety());
|
|
|
|
return m_xSlaveDispatcher;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void SAL_CALL FmXDispatchInterceptorImpl::setSlaveDispatchProvider(const Reference< ::com::sun::star::frame::XDispatchProvider>& xNewDispatchProvider) throw( RuntimeException )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
::osl::MutexGuard aGuard(getAccessSafety());
|
|
|
|
m_xSlaveDispatcher = xNewDispatchProvider;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::frame::XDispatchProvider> SAL_CALL FmXDispatchInterceptorImpl::getMasterDispatchProvider(void) throw( RuntimeException )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
::osl::MutexGuard aGuard(getAccessSafety());
|
|
|
|
return m_xMasterDispatcher;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void SAL_CALL FmXDispatchInterceptorImpl::setMasterDispatchProvider(const Reference< ::com::sun::star::frame::XDispatchProvider>& xNewSupplier) throw( RuntimeException )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
::osl::MutexGuard aGuard(getAccessSafety());
|
|
|
|
m_xMasterDispatcher = xNewSupplier;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void SAL_CALL FmXDispatchInterceptorImpl::disposing(const ::com::sun::star::lang::EventObject& Source) throw( RuntimeException )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if (Source.Source == m_xIntercepted)
|
|
|
|
{
|
|
|
|
ImplDetach();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
void FmXDispatchInterceptorImpl::ImplDetach()
|
|
|
|
{
|
|
|
|
::osl::MutexGuard aGuard(getAccessSafety());
|
|
|
|
|
|
|
|
/*! PB: das macht der Frame lieber selber
|
|
|
|
// remove ourself from the interceptor chain
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::frame::XDispatchProviderInterceptor> xSlave(m_xSlaveDispatcher, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xSlave.is())
|
|
|
|
xSlave->setMasterDispatchProvider(m_xMasterDispatcher);
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::frame::XDispatchProviderInterceptor> xMaster(m_xMasterDispatcher, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xMaster.is())
|
|
|
|
xMaster->setSlaveDispatchProvider(m_xSlaveDispatcher);
|
|
|
|
|
|
|
|
m_xSlaveDispatcher = m_xMasterDispatcher = NULL;
|
|
|
|
*/
|
|
|
|
|
|
|
|
// deregister ourself from the interception component
|
|
|
|
if (m_xIntercepted.is())
|
|
|
|
m_xIntercepted->releaseDispatchProviderInterceptor((::com::sun::star::frame::XDispatchProviderInterceptor*)this);
|
|
|
|
|
|
|
|
m_xIntercepted = NULL;
|
|
|
|
m_pMaster = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
void FmXDispatchInterceptorImpl::disposing()
|
|
|
|
{
|
|
|
|
// remove ourself as event listener from the interception component
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::lang::XComponent> xInterceptedComponent(m_xIntercepted, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xInterceptedComponent.is())
|
|
|
|
xInterceptedComponent->removeEventListener((::com::sun::star::lang::XEventListener*)this);
|
|
|
|
|
|
|
|
// detach from the interception component
|
|
|
|
ImplDetach();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
//==============================================================================
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
sal_Bool isLoadable(const Reference< XInterface>& xLoad)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
// determines whether a form should be loaded or not
|
|
|
|
// if there is no datasource or connection there is no reason to load a form
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::beans::XPropertySet> xSet(xLoad, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xSet.is())
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
// is there already a active connection
|
2000-11-06 06:19:53 +00:00
|
|
|
Any aConn( xSet->getPropertyValue(FM_PROP_ACTIVE_CONNECTION) );
|
|
|
|
if (aConn.getValueTypeClass() == TypeClass_INTERFACE &&
|
|
|
|
((Reference< XInterface>*)aConn.getValue())->is())
|
2000-09-18 16:07:07 +00:00
|
|
|
return sal_True;
|
2000-10-20 13:18:57 +00:00
|
|
|
else if (::comphelper::getString(xSet->getPropertyValue(FM_PROP_DATASOURCE)).len() ||
|
|
|
|
::comphelper::getString(xSet->getPropertyValue(FM_PROP_URL)).len() ||
|
2000-09-18 16:07:07 +00:00
|
|
|
::findConnection(xLoad).is())
|
|
|
|
return sal_True;
|
|
|
|
}
|
2000-10-31 10:59:33 +00:00
|
|
|
catch(Exception&)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
return sal_False;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::container::XNameAccess> getTableFields(const Reference< ::com::sun::star::sdbc::XConnection>& _rxConn, const ::rtl::OUString& _rsName)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdbcx::XTablesSupplier> xSupplyTables(_rxConn, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_ASSERT(xSupplyTables.is(), "::getTableFields : invalid connection !");
|
|
|
|
// the conn already said it would support the service sdb::Connection
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::container::XNameAccess> xTables( xSupplyTables->getTables());
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xTables.is() && xTables->hasByName(_rsName))
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdbcx::XColumnsSupplier> xTableCols(*(Reference< XInterface>*)xTables->getByName(_rsName).getValue(), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_ASSERT(xTableCols.is(), "::getTableFields : invalid table !");
|
|
|
|
// the table is expected to support the service sddb::Table, which requires an ::com::sun::star::sdbcx::XColumnsSupplier interface
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::container::XNameAccess> xFieldNames(xTableCols->getColumns(), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_ASSERT(xFieldNames.is(), "::getTableFields : TableCols->getColumns doesn't export a NameAccess !");
|
|
|
|
return xFieldNames;
|
|
|
|
}
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
return Reference< ::com::sun::star::container::XNameAccess>();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdbc::XDataSource> getDataSource(const ::rtl::OUString& _rsTitleOrPath)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT(_rsTitleOrPath.len(), "::getDataSource : invalid arg !");
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdbc::XDataSource> xReturn;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// is it a file url ?
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::container::XNameAccess> xNamingContext(::comphelper::getProcessServiceFactory()->createInstance(SRV_SDB_DATABASE_CONTEXT), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xNamingContext.is() && xNamingContext->hasByName(_rsTitleOrPath))
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
DBG_ASSERT(Reference< XNamingService>(xNamingContext, UNO_QUERY).is(), "::getDataSource : no NamingService interface on the DatabaseAccessContext !");
|
|
|
|
xReturn = Reference< ::com::sun::star::sdbc::XDataSource>(Reference< XNamingService>(xNamingContext, UNO_QUERY)->getRegisteredObject(_rsTitleOrPath), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
return xReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
void setConnection(const Reference< ::com::sun::star::sdbc::XRowSet>& _rxRowSet, const Reference< ::com::sun::star::sdbc::XConnection>& _rxConn)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::beans::XPropertySet> xRowSetProps(_rxRowSet, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xRowSetProps.is())
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Any aConn(makeAny(_rxConn));
|
2000-09-18 16:07:07 +00:00
|
|
|
xRowSetProps->setPropertyValue(FM_PROP_ACTIVE_CONNECTION, aConn);
|
|
|
|
}
|
2000-10-31 10:59:33 +00:00
|
|
|
catch(Exception&)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ERROR("::setConnection : could not set the connection !");
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// retrieve the current command of a rowset
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
::rtl::OUString getCommand(const Reference< ::com::sun::star::sdbc::XRowSet>& _rxRowSet, sal_Bool& bEscapeProcessing, Reference< ::com::sun::star::sdbc::XConnection>& xConn)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
::rtl::OUString aReturn;
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::beans::XPropertySet> xRowSetProps(_rxRowSet, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xRowSetProps.is())
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Any aConn( xRowSetProps->getPropertyValue(FM_PROP_ACTIVE_CONNECTION) );
|
|
|
|
if (aConn.getValueTypeClass() != TypeClass_INTERFACE)
|
2000-09-18 16:07:07 +00:00
|
|
|
return ::rtl::OUString();
|
|
|
|
|
|
|
|
::cppu::extractInterface(xConn, aConn);
|
|
|
|
|
|
|
|
// which escapeProcessing we use?
|
2000-10-20 13:18:57 +00:00
|
|
|
bEscapeProcessing = ::comphelper::getBOOL(xRowSetProps->getPropertyValue(FM_PROP_ESCAPE_PROCESSING));
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// get the command
|
2000-10-20 13:18:57 +00:00
|
|
|
::rtl::OUString aCommand(::comphelper::getString( xRowSetProps->getPropertyValue(FM_PROP_COMMAND) ));
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// and the command type
|
2000-10-20 13:18:57 +00:00
|
|
|
sal_Int32 nType = ::comphelper::getINT32(xRowSetProps->getPropertyValue(FM_PROP_COMMANDTYPE));
|
2000-09-18 16:07:07 +00:00
|
|
|
switch (nType)
|
|
|
|
{
|
|
|
|
case ::com::sun::star::sdb::CommandType::TABLE:
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
// Reference< ::com::sun::star::sdbc::XDatabaseMetaData> xMeta( xConn->getMetaData());
|
2000-09-18 16:07:07 +00:00
|
|
|
UniString aStmt;
|
|
|
|
aStmt.AssignAscii("SELECT * FROM ");
|
|
|
|
aStmt += quoteTableName(xConn->getMetaData(), aCommand);
|
|
|
|
aReturn = aStmt;
|
|
|
|
} break;
|
|
|
|
case ::com::sun::star::sdb::CommandType::QUERY:
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdb::XQueriesSupplier> xQueriesAccess(xConn, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xQueriesAccess.is())
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::container::XNameAccess> xQueries(xQueriesAccess->getQueries());
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xQueries->hasByName(aCommand))
|
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Any aElement(xQueries->getByName(aCommand));
|
|
|
|
Reference< ::com::sun::star::beans::XPropertySet> xQuery(*(Reference< XInterface>*)aElement.getValue(), UNO_QUERY);
|
2000-10-20 13:18:57 +00:00
|
|
|
aReturn= ::comphelper::getString(xQuery->getPropertyValue(FM_PROP_COMMAND));
|
|
|
|
bEscapeProcessing = ::comphelper::getBOOL(xQuery->getPropertyValue(FM_PROP_ESCAPE_PROCESSING));
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
} break;
|
|
|
|
default:
|
|
|
|
aReturn = aCommand;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2000-10-31 10:59:33 +00:00
|
|
|
catch(Exception&)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
return aReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdb::XSQLQueryComposer> getCurrentSettingsComposer(const Reference< ::com::sun::star::beans::XPropertySet>& _rxRowSetProps)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdb::XSQLQueryComposer> xReturn;
|
|
|
|
Reference< ::com::sun::star::sdbc::XRowSet> xRowSet(_rxRowSetProps, UNO_QUERY);
|
|
|
|
Reference< ::com::sun::star::sdbc::XConnection> xConn( ::dbtools::calcConnection(xRowSet,::comphelper::getProcessServiceFactory()));
|
2000-09-18 16:07:07 +00:00
|
|
|
try
|
|
|
|
{
|
|
|
|
if (xConn.is()) // implies xRowSet.is() implies _rxRowSetProps.is()
|
|
|
|
{
|
|
|
|
// build the statement the row set is based on (can't use the ActiveCommand property of the set
|
|
|
|
// as this reflects the status after the last execute, not the currently set properties
|
|
|
|
|
|
|
|
::rtl::OUString sStatement;
|
|
|
|
// first ensure we have all properties needed
|
2000-10-20 13:18:57 +00:00
|
|
|
if (::comphelper::hasProperty(FM_PROP_COMMAND, _rxRowSetProps) && ::comphelper::hasProperty(FM_PROP_COMMANDTYPE, _rxRowSetProps)
|
|
|
|
&& ::comphelper::hasProperty(FM_PROP_FILTER_CRITERIA, _rxRowSetProps) && ::comphelper::hasProperty(FM_PROP_SORT, _rxRowSetProps)
|
|
|
|
&& ::comphelper::hasProperty(FM_PROP_ESCAPE_PROCESSING, _rxRowSetProps) && ::comphelper::hasProperty(FM_PROP_APPLYFILTER, _rxRowSetProps))
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-10-20 13:18:57 +00:00
|
|
|
sal_Int32 nCommandType = ::comphelper::getINT32(_rxRowSetProps->getPropertyValue(FM_PROP_COMMANDTYPE));
|
|
|
|
::rtl::OUString sCommand = ::comphelper::getString(_rxRowSetProps->getPropertyValue(FM_PROP_COMMAND));
|
|
|
|
sal_Bool bEscapeProcessing = ::comphelper::getBOOL(_rxRowSetProps->getPropertyValue(FM_PROP_ESCAPE_PROCESSING));
|
2000-09-18 16:07:07 +00:00
|
|
|
switch (nCommandType)
|
|
|
|
{
|
|
|
|
case ::com::sun::star::sdb::CommandType::COMMAND:
|
|
|
|
if (!bEscapeProcessing)
|
|
|
|
{ // native sql -> no parsable statement
|
|
|
|
sStatement = ::rtl::OUString::createFromAscii("");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sStatement = sCommand;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case ::com::sun::star::sdb::CommandType::TABLE:
|
|
|
|
{
|
|
|
|
if (!sCommand.getLength())
|
|
|
|
break;
|
|
|
|
|
|
|
|
UniString sTableName = quoteTableName(xConn->getMetaData(), sCommand);
|
|
|
|
sStatement = ::rtl::OUString::createFromAscii("SELECT * FROM ");
|
|
|
|
sStatement += sTableName;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case ::com::sun::star::sdb::CommandType::QUERY:
|
|
|
|
{
|
|
|
|
// ask the connection for the query
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdb::XQueriesSupplier> xSupplyQueries(xConn, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!xSupplyQueries.is())
|
|
|
|
break;
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::container::XNameAccess> xQueries(xSupplyQueries->getQueries(), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!xQueries.is() || !xQueries->hasByName(sCommand))
|
|
|
|
break;
|
|
|
|
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::beans::XPropertySet> xQueryProps(*(Reference< XInterface>*)xQueries->getByName(sCommand).getValue(), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!xQueryProps.is())
|
|
|
|
break;
|
|
|
|
|
|
|
|
// a native query ?
|
2000-10-20 13:18:57 +00:00
|
|
|
if (!::comphelper::hasProperty(FM_PROP_ESCAPE_PROCESSING, xQueryProps))
|
2000-09-18 16:07:07 +00:00
|
|
|
break;
|
2000-10-20 13:18:57 +00:00
|
|
|
if (!::comphelper::getBOOL(xQueryProps->getPropertyValue(FM_PROP_ESCAPE_PROCESSING)))
|
2000-09-18 16:07:07 +00:00
|
|
|
break;
|
|
|
|
|
2000-10-20 13:18:57 +00:00
|
|
|
if (!::comphelper::hasProperty(FM_PROP_COMMAND, xQueryProps))
|
2000-09-18 16:07:07 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
// the command used by the query
|
2000-10-20 13:18:57 +00:00
|
|
|
sStatement = ::comphelper::getString(xQueryProps->getPropertyValue(FM_PROP_COMMAND));
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// use an additional composer to build a statement from the query filter/order props
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdb::XSQLQueryComposerFactory> xFactory(xConn, UNO_QUERY);
|
|
|
|
Reference< ::com::sun::star::sdb::XSQLQueryComposer> xLocalComposer;
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xFactory.is())
|
|
|
|
xLocalComposer = xFactory->createQueryComposer();
|
|
|
|
if (!xLocalComposer.is())
|
|
|
|
break;
|
|
|
|
|
|
|
|
xLocalComposer->setQuery(sStatement);
|
|
|
|
// the sort order
|
2000-10-20 13:18:57 +00:00
|
|
|
if (::comphelper::hasProperty(FM_PROP_SORT, xQueryProps))
|
|
|
|
xLocalComposer->setOrder(::comphelper::getString(xQueryProps->getPropertyValue(FM_PROP_SORT)));
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
sal_Bool bApplyFilter = sal_False;
|
2000-10-20 13:18:57 +00:00
|
|
|
if (::comphelper::hasProperty(FM_PROP_APPLYFILTER, xQueryProps))
|
|
|
|
bApplyFilter = ::comphelper::getBOOL(xQueryProps->getPropertyValue(FM_PROP_APPLYFILTER));
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if (bApplyFilter)
|
|
|
|
{
|
2000-10-20 13:18:57 +00:00
|
|
|
if (::comphelper::hasProperty(FM_PROP_FILTER_CRITERIA, xQueryProps))
|
|
|
|
xLocalComposer->setFilter(::comphelper::getString(xQueryProps->getPropertyValue(FM_PROP_FILTER_CRITERIA)));
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
sStatement = xLocalComposer->getComposedQuery();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
DBG_ERROR("::getCurrentSettingsComposer : no table, no query, no statement - what else ?!");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sStatement.getLength())
|
|
|
|
{
|
|
|
|
// create an composer
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdb::XSQLQueryComposerFactory> xFactory(xConn, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xFactory.is())
|
|
|
|
xReturn = xFactory->createQueryComposer();
|
|
|
|
if (xReturn.is())
|
|
|
|
{
|
|
|
|
xReturn->setQuery(sStatement);
|
|
|
|
// append filter/sort
|
2000-10-20 13:18:57 +00:00
|
|
|
xReturn->setOrder(::comphelper::getString(_rxRowSetProps->getPropertyValue(FM_PROP_SORT)));
|
|
|
|
sal_Bool bApplyFilter = ::comphelper::getBOOL(_rxRowSetProps->getPropertyValue(FM_PROP_APPLYFILTER));
|
2000-09-18 16:07:07 +00:00
|
|
|
if (bApplyFilter)
|
2000-10-20 13:18:57 +00:00
|
|
|
xReturn->setFilter(::comphelper::getString(_rxRowSetProps->getPropertyValue(FM_PROP_FILTER_CRITERIA)));
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2000-10-31 10:59:33 +00:00
|
|
|
catch(Exception&)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ERROR("::getCurrentSettingsComposer : catched an exception !");
|
|
|
|
xReturn = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return xReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2000-11-06 06:19:53 +00:00
|
|
|
sal_Bool isRowSetAlive(const Reference< XInterface>& _rxRowSet)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
sal_Bool bIsAlive = sal_False;
|
2000-11-06 06:19:53 +00:00
|
|
|
Reference< ::com::sun::star::sdbcx::XColumnsSupplier> xSupplyCols(_rxRowSet, UNO_QUERY);
|
|
|
|
Reference< ::com::sun::star::container::XIndexAccess> xCols;
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xSupplyCols.is())
|
2000-11-06 06:19:53 +00:00
|
|
|
xCols = Reference< ::com::sun::star::container::XIndexAccess>(xSupplyCols->getColumns(), UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (xCols.is() && (xCols->getCount() > 0))
|
|
|
|
bIsAlive = sal_True;
|
|
|
|
|
|
|
|
return bIsAlive;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//==============================================================================
|
2000-11-06 06:19:53 +00:00
|
|
|
DataColumn::DataColumn(const Reference< ::com::sun::star::beans::XPropertySet>& _rxIFace)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
m_xPropertySet = _rxIFace;
|
2000-11-06 06:19:53 +00:00
|
|
|
m_xColumn = Reference< ::com::sun::star::sdb::XColumn>(_rxIFace, UNO_QUERY);
|
|
|
|
m_xColumnUpdate = Reference< ::com::sun::star::sdb::XColumnUpdate>(_rxIFace, UNO_QUERY);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2000-09-22 08:45:07 +00:00
|
|
|
if (!m_xPropertySet.is() || !m_xColumn.is())
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
m_xPropertySet = NULL;
|
|
|
|
m_xColumn = NULL;
|
|
|
|
m_xColumnUpdate = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|