diff --git a/basic/inc/basic/basmgr.hxx b/basic/inc/basic/basmgr.hxx index da63da89ea81..d8cc5498dfd5 100644 --- a/basic/inc/basic/basmgr.hxx +++ b/basic/inc/basic/basmgr.hxx @@ -237,6 +237,13 @@ public: */ bool LegacyPsswdBinaryLimitExceeded( ::com::sun::star::uno::Sequence< rtl::OUString >& _out_rModuleNames ); + /// determines whether the Basic Manager has a given macro, given by fully qualified name + bool HasMacro( String const& i_fullyQualifiedName ) const; + /// executes a given macro + ErrCode ExecuteMacro( String const& i_fullyQualifiedName, SbxArray* i_arguments, SbxValue* i_retValue ); + /// executes a given macro + ErrCode ExecuteMacro( String const& i_fullyQualifiedName, String const& i_commaSeparatedArgs, SbxValue* i_retValue ); + private: sal_Bool IsReference( sal_uInt16 nLib ); diff --git a/basic/source/app/appedit.cxx b/basic/source/app/appedit.cxx index e51fd41ea3af..9aa06ffad38e 100644 --- a/basic/source/app/appedit.cxx +++ b/basic/source/app/appedit.cxx @@ -201,8 +201,8 @@ long AppEdit::InitMenu( Menu* pMenu ) if( pDataEdit ) { - sal_uInt16 UndoCount = ((TextEdit*)pDataEdit)->aEdit.pTextEngine->GetUndoManager().GetUndoActionCount(); - sal_uInt16 RedoCount = ((TextEdit*)pDataEdit)->aEdit.pTextEngine->GetUndoManager().GetRedoActionCount(); + size_t UndoCount = ((TextEdit*)pDataEdit)->aEdit.pTextEngine->GetUndoManager().GetUndoActionCount(); + size_t RedoCount = ((TextEdit*)pDataEdit)->aEdit.pTextEngine->GetUndoManager().GetRedoActionCount(); pMenu->EnableItem( RID_EDITUNDO, UndoCount > 0 ); pMenu->EnableItem( RID_EDITREDO, RedoCount > 0 ); diff --git a/basic/source/basmgr/basmgr.cxx b/basic/source/basmgr/basmgr.cxx index d1f68fed511b..bb686c765f4c 100644 --- a/basic/source/basmgr/basmgr.cxx +++ b/basic/source/basmgr/basmgr.cxx @@ -42,6 +42,8 @@ #include #include #include +#include +#include #include #include @@ -1868,6 +1870,116 @@ bool BasicManager::LegacyPsswdBinaryLimitExceeded( ::com::sun::star::uno::Sequen return false; } + +namespace +{ + SbMethod* lcl_queryMacro( BasicManager* i_manager, String const& i_fullyQualifiedName ) + { + sal_uInt16 nLast = 0; + String sMacro = i_fullyQualifiedName; + String sLibName = sMacro.GetToken( 0, '.', nLast ); + String sModule = sMacro.GetToken( 0, '.', nLast ); + sMacro.Erase( 0, nLast ); + + IntlWrapper aIntlWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() ); + const CollatorWrapper* pCollator = aIntlWrapper.getCollator(); + sal_uInt16 nLibCount = i_manager->GetLibCount(); + for ( sal_uInt16 nLib = 0; nLib < nLibCount; ++nLib ) + { + if ( COMPARE_EQUAL == pCollator->compareString( i_manager->GetLibName( nLib ), sLibName ) ) + { + StarBASIC* pLib = i_manager->GetLib( nLib ); + if( !pLib ) + { + i_manager->LoadLib( nLib ); + pLib = i_manager->GetLib( nLib ); + } + + if( pLib ) + { + sal_uInt16 nModCount = pLib->GetModules()->Count(); + for( sal_uInt16 nMod = 0; nMod < nModCount; ++nMod ) + { + SbModule* pMod = (SbModule*)pLib->GetModules()->Get( nMod ); + if ( pMod && COMPARE_EQUAL == pCollator->compareString( pMod->GetName(), sModule ) ) + { + SbMethod* pMethod = (SbMethod*)pMod->Find( sMacro, SbxCLASS_METHOD ); + if( pMethod ) + return pMethod; + } + } + } + } + } + return 0; + } +} + +bool BasicManager::HasMacro( String const& i_fullyQualifiedName ) const +{ + return ( NULL != lcl_queryMacro( const_cast< BasicManager* >( this ), i_fullyQualifiedName ) ); +} + +ErrCode BasicManager::ExecuteMacro( String const& i_fullyQualifiedName, SbxArray* i_arguments, SbxValue* i_retValue ) +{ + SbMethod* pMethod = lcl_queryMacro( this, i_fullyQualifiedName ); + ErrCode nError = 0; + if ( pMethod ) + { + if ( i_arguments ) + pMethod->SetParameters( i_arguments ); + nError = pMethod->Call( i_retValue ); + } + else + nError = ERRCODE_BASIC_PROC_UNDEFINED; + return nError; +} + +ErrCode BasicManager::ExecuteMacro( String const& i_fullyQualifiedName, String const& i_commaSeparatedArgs, SbxValue* i_retValue ) +{ + SbMethod* pMethod = lcl_queryMacro( this, i_fullyQualifiedName ); + if ( !pMethod ) + return ERRCODE_BASIC_PROC_UNDEFINED; + + // arguments must be quoted + String sQuotedArgs; + String sArgs( i_commaSeparatedArgs ); + if ( sArgs.Len()<2 || sArgs.GetBuffer()[1] == '\"') + // no args or already quoted args + sQuotedArgs = sArgs; + else + { + // quote parameters + sArgs.Erase( 0, 1 ); + sArgs.Erase( sArgs.Len()-1, 1 ); + + sQuotedArgs = '('; + + sal_uInt16 nCount = sArgs.GetTokenCount(','); + for ( sal_uInt16 n=0; nGetName(); + sCall += sQuotedArgs; + sCall += ']'; + + SbxVariable* pRet = pMethod->GetParent()->Execute( sCall ); + if ( pRet ) + *i_retValue = *pRet; + return SbxBase::GetError(); +} + //===================================================================== class ModuleInfo_Impl : public ModuleInfoHelper diff --git a/connectivity/inc/connectivity/PColumn.hxx b/connectivity/inc/connectivity/PColumn.hxx index 547cc8fb9970..1e9dc8b560f1 100644 --- a/connectivity/inc/connectivity/PColumn.hxx +++ b/connectivity/inc/connectivity/PColumn.hxx @@ -125,15 +125,27 @@ namespace connectivity class OOO_DLLPUBLIC_DBTOOLS OOrderColumn : public OOrderColumn_BASE, public OOrderColumn_PROP { - sal_Bool m_bAscending; - sal_Bool m_bOrder; + const sal_Bool m_bAscending; + const ::rtl::OUString m_sTableName; + protected: virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const; virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); virtual ~OOrderColumn(); public: - OOrderColumn(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn,sal_Bool _bCase,sal_Bool _bAscending); + OOrderColumn( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn, + const ::rtl::OUString& i_rOriginatingTableName, + sal_Bool _bCase, + sal_Bool _bAscending + ); + + OOrderColumn( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn, + sal_Bool _bCase, + sal_Bool _bAscending + ); virtual void construct(); diff --git a/connectivity/inc/connectivity/dbconversion.hxx b/connectivity/inc/connectivity/dbconversion.hxx index 6a54a3e92d2d..75c491e505e6 100644 --- a/connectivity/inc/connectivity/dbconversion.hxx +++ b/connectivity/inc/connectivity/dbconversion.hxx @@ -98,17 +98,18 @@ namespace dbtools const double& rValue, sal_Int16 nKeyType) throw(::com::sun::star::lang::IllegalArgumentException); - static double getValue(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn>& xVariant, const ::com::sun::star::util::Date& rNullDate, - sal_Int16 nKeyType); + static double getValue( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn>& xVariant, const ::com::sun::star::util::Date& rNullDate ); // get the columnvalue as string with a default format given by the column or a default format // for the type - static ::rtl::OUString getValue(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn, + static ::rtl::OUString getFormattedValue( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter>& xFormatter, const ::com::sun::star::lang::Locale& _rLocale, const ::com::sun::star::util::Date& rNullDate); - static ::rtl::OUString getValue(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn>& _xColumn, + static ::rtl::OUString getFormattedValue( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn>& _xColumn, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter>& xFormatter, const ::com::sun::star::util::Date& rNullDate, sal_Int32 nKey, diff --git a/connectivity/inc/connectivity/virtualdbtools.hxx b/connectivity/inc/connectivity/virtualdbtools.hxx index 70b17dcb37c9..1ad4c1d7d77d 100644 --- a/connectivity/inc/connectivity/virtualdbtools.hxx +++ b/connectivity/inc/connectivity/virtualdbtools.hxx @@ -256,17 +256,16 @@ namespace connectivity virtual double getValue( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn>& _rxVariant, - const ::com::sun::star::util::Date& rNullDate, - sal_Int16 nKeyType) const = 0; + const ::com::sun::star::util::Date& rNullDate ) const = 0; - virtual ::rtl::OUString getValue( + virtual ::rtl::OUString getFormattedValue( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxColumn, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter, const ::com::sun::star::util::Date& _rNullDate, sal_Int32 _nKey, sal_Int16 _nKeyType) const = 0; - virtual ::rtl::OUString getValue( + virtual ::rtl::OUString getFormattedValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxColumn, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter>& _rxFormatter, const ::com::sun::star::lang::Locale& _rLocale, diff --git a/connectivity/prj/build.lst b/connectivity/prj/build.lst index 6d70bc71c97c..8d16197961fa 100644 --- a/connectivity/prj/build.lst +++ b/connectivity/prj/build.lst @@ -28,5 +28,5 @@ cn connectivity\source\parse nmake - all cn_parse cn_ cn connectivity\source\simpledbt nmake - all cn_simpledbt cn_cmtools cn_inc NULL cn connectivity\source\dbtools nmake - all cn_dbtools cn_simpledbt cn_cmtools cn_parse cn_res cn_sdbcx cn_inc cn_res NULL cn connectivity\qa\connectivity\tools nmake - all cn_qa_tools cn_inc NULL +cn connectivity\qa nmake - all cn_qa cn_inc NULL cn connectivity\util nmake - all cn_util cn_ado cn_mozab cn_kab cn_evoab2 cn_calc cn_odbc cn_mysql cn_jdbc cn_adabas cn_flat cn_dbase cn_hsqldb cn_macab NULL - diff --git a/connectivity/qa/drivers/dbase/DBaseDriverTest.java b/connectivity/qa/complex/connectivity/DBaseDriverTest.java similarity index 75% rename from connectivity/qa/drivers/dbase/DBaseDriverTest.java rename to connectivity/qa/complex/connectivity/DBaseDriverTest.java index 2e2920b4145b..5b9e456ab367 100644 --- a/connectivity/qa/drivers/dbase/DBaseDriverTest.java +++ b/connectivity/qa/complex/connectivity/DBaseDriverTest.java @@ -24,36 +24,18 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package qa.drivers.dbase; +package complex.connectivity; -import com.sun.star.sdbc.*; +import complex.connectivity.dbase.DBaseDateFunctions; +import complex.connectivity.dbase.DBaseStringFunctions; +import complex.connectivity.dbase.DBaseSqlTests; +import complex.connectivity.dbase.DBaseNumericFunctions; import com.sun.star.lang.XMultiServiceFactory; import complexlib.ComplexTestCase; -import java.util.*; -import java.io.*; import share.LogWriter; -//import complex.connectivity.DBaseStringFunctions; -public class DBaseDriverTest extends ComplexTestCase +public class DBaseDriverTest extends ComplexTestCase implements TestCase { - - private static Properties props = new Properties(); - private XDriver m_xDiver; - private String where = "FROM \"biblio\" \"biblio\" where \"Identifier\" = 'BOR00'"; - - static - { - try - { - String propsFile = "test.properties"; - props.load(new FileInputStream(propsFile)); - } - catch (Exception ex) - { - throw new RuntimeException(ex); - } - } - public String[] getTestMethodNames() { return new String[] @@ -62,19 +44,21 @@ public class DBaseDriverTest extends ComplexTestCase }; } + @Override public String getTestObjectName() { return "DBaseDriverTest"; } - public void assure2(String s, boolean b) + @Override + public void assure( final String i_message, final boolean i_condition ) { - assure(s, b); + super.assure( i_message, i_condition ); } public LogWriter getLog() { - return log; + return ComplexTestCase.log; } public void Functions() throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException diff --git a/connectivity/qa/complex/connectivity/FlatFileAccess.java b/connectivity/qa/complex/connectivity/FlatFileAccess.java new file mode 100755 index 000000000000..3f0481684827 --- /dev/null +++ b/connectivity/qa/complex/connectivity/FlatFileAccess.java @@ -0,0 +1,237 @@ +package complex.connectivity; + +import com.sun.star.beans.XPropertySet; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdb.CommandType; +import com.sun.star.sdbc.SQLException; +import com.sun.star.util.Date; +import complexlib.ComplexTestCase; +import connectivity.tools.CsvDatabase; +import connectivity.tools.RowSet; +import java.io.File; +import java.io.FileOutputStream; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; + +public class FlatFileAccess extends ComplexTestCase +{ + public FlatFileAccess() + { + super(); + } + + @Override + public String[] getTestMethodNames() + { + return new String[] { + "testBasicAccess", + "testCalendarFunctions", + "testSortingByFunction" + }; + } + + @Override + public String getTestObjectName() + { + return "FlatFileAccess"; + } + + public void before() throws Exception + { + m_database = new CsvDatabase( (XMultiServiceFactory)param.getMSF() ); + + // proper settings + final XPropertySet dataSourceSettings = m_database.getDataSource().geSettings(); + dataSourceSettings.setPropertyValue( "Extension", "csv" ); + dataSourceSettings.setPropertyValue( "HeaderLine", Boolean.TRUE ); + dataSourceSettings.setPropertyValue( "FieldDelimiter", " " ); + m_database.store(); + + // write the table(s) for our test + final String tableLocation = m_database.getTableFileLocation().getAbsolutePath(); + final PrintWriter tableWriter = new PrintWriter( new FileOutputStream( tableLocation + File.separatorChar + "dates.csv", false ) ); + tableWriter.println( "ID date" ); + tableWriter.println( "1 2013-01-01" ); + tableWriter.println( "2 2012-02-02" ); + tableWriter.println( "3 2011-03-03" ); + tableWriter.close(); + } + + public void after() + { + } + + private class EqualityDate extends Date + { + EqualityDate( short i_day, short i_month, short i_year ) + { + super( i_day, i_month, i_year ); + } + + EqualityDate( Date i_date ) + { + super( i_date.Day, i_date.Month, i_date.Year ); + } + + @Override + public boolean equals( Object i_compare ) + { + if ( !( i_compare instanceof Date ) ) + return false; + return Day == ((Date)i_compare).Day + && Month == ((Date)i_compare).Month + && Year == ((Date)i_compare).Year; + } + } + + /** + * ensures simple SELECTs from our table(s) work, and deliver the expected results + */ + public void testBasicAccess() + { + testRowSetResults( + "SELECT * FROM \"dates\"", + new RowSetIntGetter(1), + new Integer[] { 1, 2, 3 }, + "simple select", "wrong IDs" + ); + + testRowSetResults( + "SELECT * FROM \"dates\"", + new RowSetDateGetter( 2 ), + new EqualityDate[] { new EqualityDate( (short)1, (short)1, (short)2013 ), + new EqualityDate( (short)2, (short)2, (short)2012 ), + new EqualityDate( (short)3, (short)3, (short)2011 ) + }, + "simple select", "wrong dates" + ); + testRowSetResults( + "SELECT \"date\", \"ID\" FROM \"dates\" ORDER BY \"ID\" DESC", + new RowSetIntGetter( 2 ), + new Integer[] { 3, 2, 1 }, + "explicit column selection, sorted by IDs", "wrong IDs" + ); + testRowSetResults( + "SELECT * FROM \"dates\" ORDER BY \"date\"", + new RowSetIntGetter( 1 ), + new Integer[] { 3, 2, 1 }, + "sorted by date", "wrong IDs" + ); + } + + /** + * ensures the basic functionality for selecting calendar functions from a CSV table - this is a prerequisite for + * later tests. + */ + public void testCalendarFunctions() + { + // simple check for proper results of the calendar functions (DATE/MONTH) + // The * at the first position is crucial here - there was code which wrongly calculated + // column positions of function columns when * was present in the statement + testRowSetResults( + "SELECT \"dates\".*, YEAR( \"date\" ) FROM \"dates\"", + new RowSetIntGetter( 3 ), + new Integer[] { 2013, 2012, 2011 }, + "YEAR function", "wrong calculated years" + ); + testRowSetResults( + "SELECT \"dates\".*, MONTH( \"date\" ) FROM \"dates\"", + new RowSetIntGetter( 3 ), + new Integer[] { 1, 2, 3 }, + "MONTH function", "wrong calculated months" + ); + } + + /** + * ensures that sorting by a function column works + */ + public void testSortingByFunction() + { + // most simple case: select a function, and sort by it + testRowSetResults( + "SELECT YEAR( \"date\" ) AS \"year\" FROM \"dates\" ORDER BY \"year\"", + new RowSetIntGetter(1), + new Integer[] { 2011, 2012, 2013 }, + "single YEAR selection, sorted by years", "wrong calculated years" + ); + // somewhat more "difficult" (this used to crash): Select all columns, plus a function, so the calculated + // column has a position greater than column count + testRowSetResults( + "SELECT \"dates\".*, YEAR( \"date\" ) AS \"year\" FROM \"dates\" ORDER BY \"year\" DESC", + new RowSetIntGetter(3), + new Integer[] { 2013, 2012, 2011 }, + "extended YEAR selection, sorted by years", "wrong calculated years" + ); + } + + private interface RowSetValueGetter + { + public Object getValue( final RowSet i_rowSet ) throws SQLException; + } + + private abstract class RowSetColumnValueGetter implements RowSetValueGetter + { + RowSetColumnValueGetter( final int i_columnIndex ) + { + m_columnIndex = i_columnIndex; + } + + protected final int m_columnIndex; + } + + private class RowSetIntGetter extends RowSetColumnValueGetter + { + RowSetIntGetter( final int i_columnIndex ) + { + super( i_columnIndex ); + } + + public Object getValue( final RowSet i_rowSet ) throws SQLException + { + return i_rowSet.getInt( m_columnIndex ); + } + } + + private class RowSetDateGetter extends RowSetColumnValueGetter + { + RowSetDateGetter( final int i_columnIndex ) + { + super( i_columnIndex ); + } + + public Object getValue( final RowSet i_rowSet ) throws SQLException + { + return i_rowSet.getDate( m_columnIndex ); + } + } + + private void testRowSetResults( String i_command, RowSetValueGetter i_getter, + T[] i_expectedValues, String i_context, String i_failureDesc ) + { + RowSet rowSet = null; + try + { + rowSet = m_database.createRowSet( CommandType.COMMAND, i_command ); + rowSet.execute(); + + List< T > values = new ArrayList< T >(); + while ( rowSet.next() ) + { + values.add( (T)i_getter.getValue( rowSet ) ); + } + assureEquals( i_context + ": " + i_failureDesc, i_expectedValues, values.toArray(), true ); + } + catch( final SQLException e ) + { + failed( i_context + ": caught an exception: " + e.toString(), false ); + } + finally + { + if ( rowSet != null ) + rowSet.dispose(); + } + } + + private CsvDatabase m_database = null; +} diff --git a/connectivity/qa/drivers/hsqldb/DriverTest.java b/connectivity/qa/complex/connectivity/HsqlDriverTest.java similarity index 82% rename from connectivity/qa/drivers/hsqldb/DriverTest.java rename to connectivity/qa/complex/connectivity/HsqlDriverTest.java index d343a1309a05..28ad862c4a76 100644 --- a/connectivity/qa/drivers/hsqldb/DriverTest.java +++ b/connectivity/qa/complex/connectivity/HsqlDriverTest.java @@ -24,63 +24,50 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package qa.drivers.hsqldb; +package complex.connectivity; -import com.sun.star.awt.XWindow; +import complex.connectivity.hsqldb.TestCacheSize; import com.sun.star.frame.XModel; -import com.sun.star.text.XTextDocument; -import com.sun.star.uno.UnoRuntime; -import com.sun.star.util.XCloseable; -import com.sun.star.sdbc.*; -import com.sun.star.beans.PropertyValue; -import com.sun.star.container.XNameAccess; -import com.sun.star.sdbc.XDataSource; import com.sun.star.frame.XStorable; import com.sun.star.lang.*; import com.sun.star.document.XDocumentSubStorageSupplier; import complexlib.ComplexTestCase; -import java.io.PrintWriter; -import util.utils; -import java.util.*; -import java.io.*; -import org.hsqldb.jdbcDriver; -import qa.drivers.hsqldb.DatabaseMetaData; import org.hsqldb.lib.StopWatch; -import com.sun.star.sdbc.*; -import com.sun.star.container.XNameAccess; import com.sun.star.uno.UnoRuntime; -import com.sun.star.beans.PropertyValue; import com.sun.star.beans.PropertyState; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.embed.XStorage; +import com.sun.star.sdbc.XDataSource; +import com.sun.star.sdbc.XDriver; +import connectivity.tools.HsqlDatabase; -public class DriverTest extends ComplexTestCase { +public class HsqlDriverTest extends ComplexTestCase { public String[] getTestMethodNames() { return new String[] { "test" }; } + @Override public String getTestObjectName() { return "DriverTest"; } public void assurePublic(String sMessage,boolean check){ - addResult(sMessage,check); + super.assure(sMessage,check); } public void test(){ - mThreadTimeOut = 10000000; XDataSource ds = null; System.gc(); try { - XNameAccess xNameAccess = (XNameAccess)UnoRuntime.queryInterface(XNameAccess.class,((XMultiServiceFactory)param.getMSF()).createInstance("com.sun.star.sdb.DatabaseContext")); - ds = (XDataSource)UnoRuntime.queryInterface(XDataSource.class,xNameAccess.getByName("file:///g:/test.odb")); + HsqlDatabase database = new HsqlDatabase( (XMultiServiceFactory)param.getMSF() ); + ds = database.getDataSource().getXDataSource(); } catch(Exception ex) { - throw new RuntimeException("factory: unable to construct data source" ); + throw new RuntimeException("factory: unable to construct data source" ); } try{ @@ -141,7 +128,6 @@ public class DriverTest extends ComplexTestCase { }catch(Exception e){} } public void test2(){ - mThreadTimeOut = 10000000; System.gc(); com.sun.star.beans.PropertyValue[] info = null; @@ -149,7 +135,7 @@ public class DriverTest extends ComplexTestCase { try{ info = new com.sun.star.beans.PropertyValue[]{ new com.sun.star.beans.PropertyValue("JavaDriverClass",0,"org.hsqldb.jdbcDriver",PropertyState.DIRECT_VALUE) - ,new com.sun.star.beans.PropertyValue("ParameterNameSubstitution",0,new Boolean(false),PropertyState.DIRECT_VALUE) + ,new com.sun.star.beans.PropertyValue("ParameterNameSubstitution",0, false,PropertyState.DIRECT_VALUE) }; drv = (XDriver)UnoRuntime.queryInterface(XDriver.class,((XMultiServiceFactory)param.getMSF()).createInstance("com.sun.star.comp.sdbc.JDBCDriver")); TestCacheSize test = new TestCacheSize(((XMultiServiceFactory)param.getMSF()),info,drv); diff --git a/connectivity/qa/drivers/jdbc/LongVarCharTest.java b/connectivity/qa/complex/connectivity/JdbcLongVarCharTest.java similarity index 98% rename from connectivity/qa/drivers/jdbc/LongVarCharTest.java rename to connectivity/qa/complex/connectivity/JdbcLongVarCharTest.java index a5797b223b61..63a3e8f241bc 100644 --- a/connectivity/qa/drivers/jdbc/LongVarCharTest.java +++ b/connectivity/qa/complex/connectivity/JdbcLongVarCharTest.java @@ -40,7 +40,7 @@ import com.sun.star.sdbc.XRow; import com.sun.star.uno.UnoRuntime; import complexlib.ComplexTestCase; -public class LongVarCharTest extends ComplexTestCase +public class JdbcLongVarCharTest extends ComplexTestCase { public String[] getTestMethodNames() @@ -51,6 +51,7 @@ public class LongVarCharTest extends ComplexTestCase }; } + @Override public String getTestObjectName() { return "LongVarCharTest"; diff --git a/connectivity/qa/complex/connectivity/SubTestCase.java b/connectivity/qa/complex/connectivity/SubTestCase.java new file mode 100755 index 000000000000..1c2e685c5943 --- /dev/null +++ b/connectivity/qa/complex/connectivity/SubTestCase.java @@ -0,0 +1,23 @@ +package complex.connectivity; + +import share.LogWriter; + +public class SubTestCase implements TestCase +{ + protected SubTestCase( final TestCase i_parentTestCase ) + { + m_parentTestCase = i_parentTestCase; + } + + public void assure( String i_message, boolean i_condition ) + { + m_parentTestCase.assure( i_message, i_condition ); + } + + public LogWriter getLog() + { + return m_parentTestCase.getLog(); + } + + private final TestCase m_parentTestCase; +} diff --git a/sfx2/inc/sfxbasic.hxx b/connectivity/qa/complex/connectivity/TestCase.java old mode 100644 new mode 100755 similarity index 76% rename from sfx2/inc/sfxbasic.hxx rename to connectivity/qa/complex/connectivity/TestCase.java index ff5f097500a5..bae5fcdcb4c4 --- a/sfx2/inc/sfxbasic.hxx +++ b/connectivity/qa/complex/connectivity/TestCase.java @@ -24,19 +24,12 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef _SFXBASIC_HXX -#define _SFXBASIC_HXX +package complex.connectivity; -class BasicManager; -class SbMethod; - -//------------------------------------------------------------------ - -SbMethod* SfxQueryMacro( BasicManager* pMgr, const String& rMacro ); - -ErrCode SfxCallMacro( BasicManager* pMgr, const String& rMacro, - SbxArray *pArgs = 0, SbxValue *pRet = 0 ); - - -#endif +import share.LogWriter; +public interface TestCase +{ + public void assure( final String i_message, final boolean i_condition ); + public LogWriter getLog(); +} diff --git a/connectivity/qa/drivers/dbase/DBaseDateFunctions.java b/connectivity/qa/complex/connectivity/dbase/DBaseDateFunctions.java similarity index 92% rename from connectivity/qa/drivers/dbase/DBaseDateFunctions.java rename to connectivity/qa/complex/connectivity/dbase/DBaseDateFunctions.java index b48ae2158359..9cfc6aaaf590 100644 --- a/connectivity/qa/drivers/dbase/DBaseDateFunctions.java +++ b/connectivity/qa/complex/connectivity/dbase/DBaseDateFunctions.java @@ -24,30 +24,26 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package qa.drivers.dbase; +package complex.connectivity.dbase; import com.sun.star.uno.UnoRuntime; import com.sun.star.sdbc.*; import com.sun.star.beans.XPropertySet; import com.sun.star.lang.XMultiServiceFactory; +import complex.connectivity.TestCase; +import complex.connectivity.SubTestCase; -public class DBaseDateFunctions +public class DBaseDateFunctions extends SubTestCase { private final String where = "FROM \"biblio\" \"biblio\" where \"Identifier\" = 'BOR00'"; private final XMultiServiceFactory m_xORB; - private final DBaseDriverTest testcase; - public DBaseDateFunctions(final XMultiServiceFactory _xORB, final DBaseDriverTest _testcase) + public DBaseDateFunctions(final XMultiServiceFactory _xORB, final TestCase i_testCase) { + super( i_testCase ); m_xORB = _xORB; - testcase = _testcase; - } - - private void assure(final String s, final boolean b) - { - testcase.assure2(s, b); } public void testFunctions() throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException @@ -55,7 +51,7 @@ public class DBaseDateFunctions final XRowSet xRowRes = (XRowSet) UnoRuntime.queryInterface(XRowSet.class, m_xORB.createInstance("com.sun.star.sdb.RowSet")); - testcase.getLog().println("starting DateTime function test!"); + getLog().println("starting DateTime function test!"); // set the properties needed to connect to a database final XPropertySet xProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowRes); xProp.setPropertyValue("DataSourceName", "Bibliography"); @@ -289,21 +285,21 @@ public class DBaseDateFunctions { final XRow row = execute(xRowRes, "CURDATE() "); final com.sun.star.util.Date aDate = row.getDate(1); - testcase.getLog().println("CURDATE() is '" + aDate.Year + "-" + aDate.Month + "-" + aDate.Day + "'"); + getLog().println("CURDATE() is '" + aDate.Year + "-" + aDate.Month + "-" + aDate.Day + "'"); } private void curtime(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException { final XRow row = execute(xRowRes, "CURTIME() "); final com.sun.star.util.Time aTime = row.getTime(1); - testcase.getLog().println("CURTIME() is '" + aTime.Hours + ":" + aTime.Minutes + ":" + aTime.Seconds + "'"); + getLog().println("CURTIME() is '" + aTime.Hours + ":" + aTime.Minutes + ":" + aTime.Seconds + "'"); } private void now(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException { final XRow row = execute(xRowRes, "NOW() "); final com.sun.star.util.DateTime aTime = row.getTimestamp(1); - testcase.getLog().println("NOW() is '" + aTime.Year + "-" + aTime.Month + "-" + aTime.Day + "'"); - testcase.getLog().println("'" + aTime.Hours + ":" + aTime.Minutes + ":" + aTime.Seconds + "'"); + getLog().println("NOW() is '" + aTime.Year + "-" + aTime.Month + "-" + aTime.Day + "'"); + getLog().println("'" + aTime.Hours + ":" + aTime.Minutes + ":" + aTime.Seconds + "'"); } } diff --git a/connectivity/qa/drivers/dbase/DBaseNumericFunctions.java b/connectivity/qa/complex/connectivity/dbase/DBaseNumericFunctions.java similarity index 97% rename from connectivity/qa/drivers/dbase/DBaseNumericFunctions.java rename to connectivity/qa/complex/connectivity/dbase/DBaseNumericFunctions.java index b3c8ff014a2f..f5aec94a3c23 100644 --- a/connectivity/qa/drivers/dbase/DBaseNumericFunctions.java +++ b/connectivity/qa/complex/connectivity/dbase/DBaseNumericFunctions.java @@ -24,30 +24,25 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package qa.drivers.dbase; +package complex.connectivity.dbase; import com.sun.star.uno.UnoRuntime; import com.sun.star.sdbc.*; import com.sun.star.beans.XPropertySet; import com.sun.star.lang.XMultiServiceFactory; +import complex.connectivity.SubTestCase; +import complex.connectivity.TestCase; -public class DBaseNumericFunctions +public class DBaseNumericFunctions extends SubTestCase { - private final String where = "FROM \"biblio\" \"biblio\" where \"Identifier\" = 'BOR00'"; private final XMultiServiceFactory m_xORB; - private final DBaseDriverTest testcase; - public DBaseNumericFunctions(final XMultiServiceFactory _xORB, final DBaseDriverTest _testcase) + public DBaseNumericFunctions(final XMultiServiceFactory _xORB, final TestCase i_testCase) { + super( i_testCase ); m_xORB = _xORB; - testcase = _testcase; - } - - private void assure(final String s, final boolean b) - { - testcase.assure2(s, b); } public void testFunctions() throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException @@ -55,7 +50,7 @@ public class DBaseNumericFunctions final XRowSet xRowRes = (XRowSet) UnoRuntime.queryInterface(XRowSet.class, m_xORB.createInstance("com.sun.star.sdb.RowSet")); - testcase.getLog().println("starting Numeric function test"); + getLog().println("starting Numeric function test"); // set the properties needed to connect to a database final XPropertySet xProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowRes); xProp.setPropertyValue("DataSourceName", "Bibliography"); diff --git a/connectivity/qa/drivers/dbase/DBaseSqlTests.java b/connectivity/qa/complex/connectivity/dbase/DBaseSqlTests.java similarity index 91% rename from connectivity/qa/drivers/dbase/DBaseSqlTests.java rename to connectivity/qa/complex/connectivity/dbase/DBaseSqlTests.java index c393c5a48356..1265e05e7bef 100755 --- a/connectivity/qa/drivers/dbase/DBaseSqlTests.java +++ b/connectivity/qa/complex/connectivity/dbase/DBaseSqlTests.java @@ -24,27 +24,23 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package qa.drivers.dbase; +package complex.connectivity.dbase; import com.sun.star.uno.UnoRuntime; import com.sun.star.sdbc.*; import com.sun.star.beans.XPropertySet; import com.sun.star.lang.XMultiServiceFactory; +import complex.connectivity.TestCase; +import complex.connectivity.SubTestCase; -public class DBaseSqlTests +public class DBaseSqlTests extends SubTestCase { private final XMultiServiceFactory m_xORB; - private final DBaseDriverTest testcase; - public DBaseSqlTests(final XMultiServiceFactory _xORB,final DBaseDriverTest _testcase) + public DBaseSqlTests(final XMultiServiceFactory _xORB,final TestCase i_testCase) { + super( i_testCase ); m_xORB = _xORB; - testcase = _testcase; - } - - private void assure(final String s,final boolean b) - { - testcase.assure2(s, b); } public void testFunctions() throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException @@ -52,7 +48,7 @@ public class DBaseSqlTests final XRowSet xRowRes = (XRowSet) UnoRuntime.queryInterface(XRowSet.class, m_xORB.createInstance("com.sun.star.sdb.RowSet")); - testcase.getLog().println("starting SQL test"); + getLog().println("starting SQL test"); // set the properties needed to connect to a database final XPropertySet xProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowRes); xProp.setPropertyValue("DataSourceName", "Bibliography"); @@ -88,7 +84,7 @@ public class DBaseSqlTests } catch(SQLException e) { - testcase.getLog().println(sql + " Error: " + e.getMessage()); + getLog().println(sql + " Error: " + e.getMessage()); } } diff --git a/connectivity/qa/drivers/dbase/DBaseStringFunctions.java b/connectivity/qa/complex/connectivity/dbase/DBaseStringFunctions.java similarity index 97% rename from connectivity/qa/drivers/dbase/DBaseStringFunctions.java rename to connectivity/qa/complex/connectivity/dbase/DBaseStringFunctions.java index 1d4ccf0a9b26..30b94484d53d 100644 --- a/connectivity/qa/drivers/dbase/DBaseStringFunctions.java +++ b/connectivity/qa/complex/connectivity/dbase/DBaseStringFunctions.java @@ -24,28 +24,24 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package qa.drivers.dbase; +package complex.connectivity.dbase; import com.sun.star.uno.UnoRuntime; import com.sun.star.sdbc.*; import com.sun.star.beans.XPropertySet; import com.sun.star.lang.XMultiServiceFactory; +import complex.connectivity.SubTestCase; +import complex.connectivity.TestCase; -public class DBaseStringFunctions +public class DBaseStringFunctions extends SubTestCase { private String where = "FROM \"biblio\" \"biblio\" where \"Identifier\" = 'BOR00'"; private final XMultiServiceFactory m_xORB; - private final DBaseDriverTest testcase; - public DBaseStringFunctions(final XMultiServiceFactory _xORB,final DBaseDriverTest _testcase) + public DBaseStringFunctions(final XMultiServiceFactory _xORB,final TestCase i_testCase) { + super( i_testCase ); m_xORB = _xORB; - testcase = _testcase; - } - - private void assure(final String s,final boolean b) - { - testcase.assure2(s, b); } public void testFunctions() throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException @@ -53,7 +49,7 @@ public class DBaseStringFunctions final XRowSet xRowRes = (XRowSet) UnoRuntime.queryInterface(XRowSet.class, m_xORB.createInstance("com.sun.star.sdb.RowSet")); - testcase.getLog().println("starting String function test"); + getLog().println("starting String function test"); // set the properties needed to connect to a database final XPropertySet xProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowRes); xProp.setPropertyValue("DataSourceName", "Bibliography"); diff --git a/connectivity/qa/drivers/hsqldb/DatabaseMetaData.java b/connectivity/qa/complex/connectivity/hsqldb/DatabaseMetaData.java similarity index 95% rename from connectivity/qa/drivers/hsqldb/DatabaseMetaData.java rename to connectivity/qa/complex/connectivity/hsqldb/DatabaseMetaData.java index ddc45a4e0ca1..a20bb992b4e3 100644 --- a/connectivity/qa/drivers/hsqldb/DatabaseMetaData.java +++ b/connectivity/qa/complex/connectivity/hsqldb/DatabaseMetaData.java @@ -8,21 +8,19 @@ * * @author oj93728 */ -package qa.drivers.hsqldb; +package complex.connectivity.hsqldb; +import complex.connectivity.HsqlDriverTest; import java.sql.*; -import com.sun.star.uno.UnoRuntime; -import complexlib.ComplexTestCase; import java.lang.reflect.Method; -import qa.drivers.hsqldb.DriverTest; public class DatabaseMetaData { private java.sql.DatabaseMetaData m_xMD; - private DriverTest m_TestCase; + private HsqlDriverTest m_TestCase; /** Creates a new instance of DatabaseMetaData */ - public DatabaseMetaData(DriverTest _testCase,java.sql.DatabaseMetaData _xmd) { + public DatabaseMetaData(HsqlDriverTest _testCase,java.sql.DatabaseMetaData _xmd) { m_TestCase = _testCase; m_xMD = _xmd; } diff --git a/connectivity/qa/drivers/hsqldb/TestCacheSize.java b/connectivity/qa/complex/connectivity/hsqldb/TestCacheSize.java similarity index 97% rename from connectivity/qa/drivers/hsqldb/TestCacheSize.java rename to connectivity/qa/complex/connectivity/hsqldb/TestCacheSize.java index 4701905772b8..6c4db8bdeee7 100644 --- a/connectivity/qa/drivers/hsqldb/TestCacheSize.java +++ b/connectivity/qa/complex/connectivity/hsqldb/TestCacheSize.java @@ -29,24 +29,16 @@ */ -package qa.drivers.hsqldb; +package complex.connectivity.hsqldb; -import java.io.*; import org.hsqldb.lib.StopWatch; -import org.hsqldb.lib.FileAccess; import java.util.Random; import com.sun.star.lang.*; import com.sun.star.uno.UnoRuntime; -import com.sun.star.beans.PropertyValue; -import com.sun.star.beans.PropertyState; -import com.sun.star.container.XNameAccess; import com.sun.star.sdbc.*; -import com.sun.star.document.XDocumentSubStorageSupplier; -import com.sun.star.embed.XStorage; -import com.sun.star.frame.XStorable; /** * Test large cached tables by setting up a cached table of 100000 records @@ -123,17 +115,17 @@ public class TestCacheSize { XDriver drv; com.sun.star.beans.PropertyValue[] info; - TestCacheSize(XMultiServiceFactory _xmulti,com.sun.star.beans.PropertyValue[] _info,XDriver _drv){ + public TestCacheSize(XMultiServiceFactory _xmulti,com.sun.star.beans.PropertyValue[] _info,XDriver _drv){ servicefactory = _xmulti; drv = _drv; info = _info; } - void setURL(String _url){ + public void setURL(String _url){ url = _url; } - protected void setUp() { + public void setUp() { user = "sa"; password = ""; @@ -406,9 +398,9 @@ public class TestCacheSize { + (i * 1000 / (sw.elapsedTime() + 1))); } - protected void tearDown() {} + public void tearDown() {} - protected void checkResults() { + public void checkResults() { try { StopWatch sw = new StopWatch(); diff --git a/connectivity/qa/connectivity/tools/AbstractDatabase.java b/connectivity/qa/connectivity/tools/AbstractDatabase.java index b47c7c7961da..65f550be5abf 100755 --- a/connectivity/qa/connectivity/tools/AbstractDatabase.java +++ b/connectivity/qa/connectivity/tools/AbstractDatabase.java @@ -47,18 +47,6 @@ import java.io.File; */ public abstract class AbstractDatabase implements DatabaseAccess { - // the service factory - - protected final XMultiServiceFactory m_orb; - // the URL of the temporary file used for the database document - protected String m_databaseDocumentFile; - // the database document - protected XOfficeDatabaseDocument m_databaseDocument; - // the data source belonging to the database document - protected DataSource m_dataSource; - // the default connection - protected Connection m_connection; - public AbstractDatabase(final XMultiServiceFactory orb) throws Exception { m_orb = orb; @@ -75,7 +63,6 @@ public abstract class AbstractDatabase implements DatabaseAccess * * Multiple calls to this method return the same connection. The DbaseDatabase object keeps * the ownership of the connection, so you don't need to (and should not) dispose/close it. - * */ public Connection defaultConnection() throws SQLException { @@ -219,4 +206,15 @@ public abstract class AbstractDatabase implements DatabaseAccess closeAndDelete(); super.finalize(); } + + // the service factory + protected final XMultiServiceFactory m_orb; + // the URL of the temporary file used for the database document + protected String m_databaseDocumentFile; + // the database document + protected XOfficeDatabaseDocument m_databaseDocument; + // the data source belonging to the database document + protected DataSource m_dataSource; + // the default connection + protected Connection m_connection; } diff --git a/connectivity/qa/connectivity/tools/CsvDatabase.java b/connectivity/qa/connectivity/tools/CsvDatabase.java new file mode 100755 index 000000000000..f9f16a718205 --- /dev/null +++ b/connectivity/qa/connectivity/tools/CsvDatabase.java @@ -0,0 +1,18 @@ +package connectivity.tools; + +import com.sun.star.lang.XMultiServiceFactory; + +public class CsvDatabase extends FlatFileDatabase +{ + // -------------------------------------------------------------------------------------------------------- + public CsvDatabase( final XMultiServiceFactory i_orb ) throws Exception + { + super( i_orb, "flat" ); + } + + // -------------------------------------------------------------------------------------------------------- + protected CsvDatabase( final XMultiServiceFactory i_orb, final String i_existingDocumentURL ) throws Exception + { + super( i_orb, i_existingDocumentURL, "flat" ); + } +} diff --git a/connectivity/qa/connectivity/tools/DataSource.java b/connectivity/qa/connectivity/tools/DataSource.java index 221ada3cb487..5c06f7d69622 100644 --- a/connectivity/qa/connectivity/tools/DataSource.java +++ b/connectivity/qa/connectivity/tools/DataSource.java @@ -69,6 +69,14 @@ public class DataSource return m_dataSource; } + /** + * retrieves the data source's settings + */ + public XPropertySet geSettings() + { + return UnoRuntime.queryInterface( XPropertySet.class, impl_getPropertyValue( "Settings" ) ); + } + /** creates a query with a given name and SQL command */ public void createQuery(final String _name, final String _sqlCommand) throws ElementExistException, WrappedTargetException, com.sun.star.lang.IllegalArgumentException @@ -121,6 +129,26 @@ public class DataSource return suppQueries.getQueryDefinitions(); } + /** + * retrieves a property value from the data source + * @param i_propertyName + * the name of the property whose value is to be returned. + */ + private Object impl_getPropertyValue( final String i_propertyName ) + { + Object propertyValue = null; + try + { + final XPropertySet dataSourceProps = UnoRuntime.queryInterface( XPropertySet.class, m_dataSource ); + propertyValue = dataSourceProps.getPropertyValue( i_propertyName ); + } + catch (Exception ex) + { + Logger.getLogger(DataSource.class.getName()).log(Level.SEVERE, null, ex); + } + return propertyValue; + } + /** returns the name of the data source * * If a data source is registered at the database context, the name is the registration @@ -130,16 +158,6 @@ public class DataSource */ public String getName() { - String name = null; - try - { - final XPropertySet dataSourceProps = UnoRuntime.queryInterface( XPropertySet.class, m_dataSource ); - name = (String) dataSourceProps.getPropertyValue("Name"); - } - catch (Exception ex) - { - Logger.getLogger(DataSource.class.getName()).log(Level.SEVERE, null, ex); - } - return name; + return (String)impl_getPropertyValue( "Name" ); } }; diff --git a/connectivity/qa/connectivity/tools/DbaseDatabase.java b/connectivity/qa/connectivity/tools/DbaseDatabase.java index ae40be4222aa..19a44132adf4 100755 --- a/connectivity/qa/connectivity/tools/DbaseDatabase.java +++ b/connectivity/qa/connectivity/tools/DbaseDatabase.java @@ -1,98 +1,18 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ package connectivity.tools; -import com.sun.star.beans.PropertyValue; -import com.sun.star.beans.XPropertySet; -import com.sun.star.frame.XStorable; import com.sun.star.lang.XMultiServiceFactory; -import com.sun.star.sdb.XOfficeDatabaseDocument; -import com.sun.star.sdbc.SQLException; -import com.sun.star.uno.UnoRuntime; -import helper.URLHelper; -import java.io.File; - -/** - * - * @author Ocke - */ -public class DbaseDatabase extends AbstractDatabase +public class DbaseDatabase extends FlatFileDatabase { // -------------------------------------------------------------------------------------------------------- - - public DbaseDatabase(final XMultiServiceFactory orb) throws Exception + public DbaseDatabase( final XMultiServiceFactory i_orb ) throws Exception { - super(orb); - createDBDocument(); + super( i_orb, "dbase" ); } // -------------------------------------------------------------------------------------------------------- - public DbaseDatabase(final XMultiServiceFactory orb, final String _existingDocumentURL) throws Exception + protected DbaseDatabase( final XMultiServiceFactory i_orb, final String i_existingDocumentURL ) throws Exception { - super(orb, _existingDocumentURL); - } - - /** creates an empty database document in a temporary location - */ - private void createDBDocument() throws Exception - { - final File documentFile = File.createTempFile("dbase", ".odb"); - if ( documentFile.exists() ) - documentFile.delete(); - final File subPath = new File(documentFile.getParent() + File.separator + documentFile.getName().replaceAll(".odb", "") + File.separator ); - subPath.mkdir(); - //subPath.deleteOnExit(); - m_databaseDocumentFile = URLHelper.getFileURLFromSystemPath(documentFile); - final String path = URLHelper.getFileURLFromSystemPath(subPath.getPath()); - - m_databaseDocument = (XOfficeDatabaseDocument) UnoRuntime.queryInterface( - XOfficeDatabaseDocument.class, m_orb.createInstance("com.sun.star.sdb.OfficeDatabaseDocument")); - m_dataSource = new DataSource(m_orb, m_databaseDocument.getDataSource()); - - final XPropertySet dsProperties = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, m_databaseDocument.getDataSource()); - dsProperties.setPropertyValue("URL", "sdbc:dbase:" + path); - - final XStorable storable = (XStorable) UnoRuntime.queryInterface(XStorable.class, m_databaseDocument); - storable.storeAsURL(m_databaseDocumentFile, new PropertyValue[] - { - }); - } - - /** drops the table with a given name - - @param _name - the name of the table to drop - @param _ifExists - TRUE if it should be dropped only when it exists. - */ - public void dropTable(final String _name,final boolean _ifExists) throws SQLException - { - String dropStatement = "DROP TABLE \"" + _name; - executeSQL(dropStatement); + super( i_orb, i_existingDocumentURL, "dbase" ); } } diff --git a/connectivity/qa/connectivity/tools/FlatFileDatabase.java b/connectivity/qa/connectivity/tools/FlatFileDatabase.java new file mode 100755 index 000000000000..5385f1e119f6 --- /dev/null +++ b/connectivity/qa/connectivity/tools/FlatFileDatabase.java @@ -0,0 +1,116 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package connectivity.tools; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.frame.XStorable; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdb.XOfficeDatabaseDocument; +import com.sun.star.sdbc.SQLException; +import com.sun.star.uno.UnoRuntime; + +import helper.URLHelper; +import java.io.File; + +class FlatFileDatabase extends AbstractDatabase +{ + // -------------------------------------------------------------------------------------------------------- + protected FlatFileDatabase( final XMultiServiceFactory i_orb, final String i_urlSubScheme ) throws Exception + { + super(i_orb); + m_urlSubScheme = i_urlSubScheme; + createDBDocument(); + } + + // -------------------------------------------------------------------------------------------------------- + protected FlatFileDatabase(final XMultiServiceFactory i_orb, final String i_existingDocumentURL, + final String i_urlSubScheme ) throws Exception + { + super( i_orb, i_existingDocumentURL ); + m_urlSubScheme = i_urlSubScheme; + + final XPropertySet dsProperties = UnoRuntime.queryInterface(XPropertySet.class, m_databaseDocument.getDataSource()); + final String url = (String)dsProperties.getPropertyValue( "URL" ); + final String expectedURLPrefix = "sdbc:" + m_urlSubScheme + ":"; + if ( !url.startsWith( expectedURLPrefix ) ) + throw new IllegalArgumentException( i_existingDocumentURL + " is of wrong type" ); + + final String location = url.substring( expectedURLPrefix.length() ); + m_tableFileLocation = new File( location ); + if ( m_tableFileLocation.isDirectory() ) + throw new IllegalArgumentException( "unsupported table file location (must be a folder)" ); + } + + /** + * returns a {@link File} which represents the folder where the database's table files reside. + */ + public File getTableFileLocation() + { + return m_tableFileLocation; + } + + /** creates an empty database document in a temporary location + */ + private void createDBDocument() throws Exception + { + final File documentFile = File.createTempFile( m_urlSubScheme, ".odb" ); + if ( documentFile.exists() ) + documentFile.delete(); + m_tableFileLocation = new File(documentFile.getParent() + File.separator + documentFile.getName().replace(".odb", "") + File.separator ); + m_tableFileLocation.mkdir(); + //subPath.deleteOnExit(); + m_databaseDocumentFile = URLHelper.getFileURLFromSystemPath(documentFile); + final String path = URLHelper.getFileURLFromSystemPath( m_tableFileLocation.getPath() ); + + m_databaseDocument = UnoRuntime.queryInterface( XOfficeDatabaseDocument.class, + m_orb.createInstance("com.sun.star.sdb.OfficeDatabaseDocument")); + m_dataSource = new DataSource(m_orb, m_databaseDocument.getDataSource()); + + final XPropertySet dsProperties = UnoRuntime.queryInterface(XPropertySet.class, m_databaseDocument.getDataSource()); + dsProperties.setPropertyValue("URL", "sdbc:" + m_urlSubScheme + ":" + path); + + final XStorable storable = UnoRuntime.queryInterface( XStorable.class, m_databaseDocument ); + storable.storeAsURL( m_databaseDocumentFile, new PropertyValue[] { } ); + } + + /** drops the table with a given name + + @param _name + the name of the table to drop + @param _ifExists + TRUE if it should be dropped only when it exists. + */ + public void dropTable(final String _name,final boolean _ifExists) throws SQLException + { + String dropStatement = "DROP TABLE \"" + _name; + executeSQL(dropStatement); + } + + final String m_urlSubScheme; + File m_tableFileLocation = null; +} diff --git a/connectivity/qa/connectivity/tools/RowSet.java b/connectivity/qa/connectivity/tools/RowSet.java index a26456dcc746..31d0f237a1dd 100644 --- a/connectivity/qa/connectivity/tools/RowSet.java +++ b/connectivity/qa/connectivity/tools/RowSet.java @@ -31,6 +31,7 @@ import com.sun.star.beans.XPropertySet; import com.sun.star.container.XIndexAccess; import com.sun.star.container.XNameAccess; import com.sun.star.io.XInputStream; +import com.sun.star.lang.XComponent; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.sdbc.SQLException; import com.sun.star.sdbc.XArray; @@ -48,7 +49,6 @@ import com.sun.star.util.Time; public class RowSet implements XRowSet, XRow { - private XMultiServiceFactory m_orb; private XRowSet m_rowSet; private XRow m_row; private XPropertySet m_rowSetProps; @@ -57,14 +57,13 @@ public class RowSet implements XRowSet, XRow { try { - m_rowSetProps = (XPropertySet)UnoRuntime.queryInterface( - XPropertySet.class, _orb.createInstance("com.sun.star.sdb.RowSet") ); + m_rowSetProps = UnoRuntime.queryInterface( XPropertySet.class, _orb.createInstance( "com.sun.star.sdb.RowSet" ) ); m_rowSetProps.setPropertyValue( "DataSourceName", _dataSource ); m_rowSetProps.setPropertyValue( "CommandType", new Integer( _commandType ) ); m_rowSetProps.setPropertyValue( "Command", _command ); - m_rowSet = (XRowSet)UnoRuntime.queryInterface( XRowSet.class, m_rowSetProps ); - m_row = (XRow)UnoRuntime.queryInterface( XRow.class, m_rowSetProps ); + m_rowSet = UnoRuntime.queryInterface( XRowSet.class, m_rowSetProps ); + m_row = UnoRuntime.queryInterface( XRow.class, m_rowSetProps ); } catch ( Exception e ) { @@ -289,4 +288,12 @@ public class RowSet implements XRowSet, XRow { return m_row.getArray(i); } + + public void dispose() + { + if ( m_rowSet == null ) + return; + XComponent rowSetComp = UnoRuntime.queryInterface( XComponent.class, m_rowSet ); + rowSetComp.dispose(); + } }; diff --git a/connectivity/qa/connectivity/tools/makefile.mk b/connectivity/qa/connectivity/tools/makefile.mk index 07490532a1b1..d77da7f1b945 100644 --- a/connectivity/qa/connectivity/tools/makefile.mk +++ b/connectivity/qa/connectivity/tools/makefile.mk @@ -42,15 +42,11 @@ all: JARFILES = ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunnerLight.jar JAVAFILES := $(shell @$(FIND) . -name "*.java") -JAVACLASSFILES := $(foreach,i,$(JAVAFILES) $(CLASSDIR)/$(PACKAGE)/$(i:d)$(i:b).class) #----- make a jar from compiled files ------------------------------ -MAXLINELENGTH = 100000 - -JARCLASSDIRS = $(PACKAGE) -JARTARGET = $(TARGET).jar -JARCOMPRESS = TRUE +JARCLASSDIRS = $(PACKAGE) +JARTARGET = $(TARGET).jar # --- Targets ------------------------------------------------------ diff --git a/connectivity/qa/drivers/dbase/.nbattrs b/connectivity/qa/drivers/dbase/.nbattrs deleted file mode 100644 index 1ea7ed0bd8e6..000000000000 --- a/connectivity/qa/drivers/dbase/.nbattrs +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/connectivity/qa/drivers/dbase/makefile.mk b/connectivity/qa/drivers/dbase/makefile.mk deleted file mode 100644 index d71670d67458..000000000000 --- a/connectivity/qa/drivers/dbase/makefile.mk +++ /dev/null @@ -1,64 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -PRJ = ..$/..$/.. -TARGET = DBaseDriverTest -PRJNAME = connectivity -PACKAGE = qa$/drivers$/dbase - -# --- Settings ----------------------------------------------------- -.INCLUDE: settings.mk - - -#----- compile .java files ----------------------------------------- - -JARFILES = ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar -JAVAFILES =\ - DBaseDateFunctions.java\ - DBaseDriverTest.java\ - DBaseNumericFunctions.java\ - DBaseStringFunctions.java\ - DBaseSqlTests.java - -JAVACLASSFILES = $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) - -#----- make a jar from compiled files ------------------------------ - -MAXLINELENGTH = 100000 - -JARCLASSDIRS = $(PACKAGE) -JARTARGET = $(TARGET).jar -JARCOMPRESS = TRUE - -# --- Targets ------------------------------------------------------ - -.INCLUDE : target.mk - - -run: $(CLASSDIR)$/$(JARTARGET) - java -cp "$(CLASSPATH)$(PATH_SEPERATOR)$(SOLARBINDIR)$/OOoRunner.jar" org.openoffice.Runner -TestBase java_complex -o qa.drivers.dbase.$(TARGET) - diff --git a/connectivity/qa/drivers/dbase/test.properties b/connectivity/qa/drivers/dbase/test.properties deleted file mode 100644 index c26879f480f3..000000000000 --- a/connectivity/qa/drivers/dbase/test.properties +++ /dev/null @@ -1,5 +0,0 @@ -# x-no-translate -Driver=org.openoffice.comp.drivers.MySQL.Driver -user=testuser -password= -URL=sdbc:mysql:odbc:MYSQL fs-11110 TESTUSER diff --git a/connectivity/qa/drivers/jdbc/makefile.mk b/connectivity/qa/makefile.mk similarity index 60% rename from connectivity/qa/drivers/jdbc/makefile.mk rename to connectivity/qa/makefile.mk index e9f03ce1be3c..ee41cab63554 100644 --- a/connectivity/qa/drivers/jdbc/makefile.mk +++ b/connectivity/qa/makefile.mk @@ -25,42 +25,48 @@ # #************************************************************************* -PRJ = ..$/..$/.. -TARGET = LongVarCharTest +PRJ = .. +TARGET = ConnectivityComplexTests PRJNAME = connectivity -PACKAGE = complex$/connectivity +PACKAGE = complex/connectivity # --- Settings ----------------------------------------------------- .INCLUDE: settings.mk - #----- compile .java files ----------------------------------------- -JARFILES = ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar -JAVAFILES =\ - LongVarCharTest.java - -JAVACLASSFILES = $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) +JARFILES = ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar hsqldb.jar +JAVAFILES := $(shell @$(FIND) complex -name "*.java") #----- make a jar from compiled files ------------------------------ -MAXLINELENGTH = 100000 +JARCLASSDIRS = $(PACKAGE) +JARTARGET = $(TARGET).jar -JARCLASSDIRS = $(PACKAGE) -JARTARGET = $(TARGET).jar -JARCOMPRESS = TRUE +# --- Runner Settings ---------------------------------------------- + +# classpath and argument list +RUNNER_CLASSPATH = -cp "$(CLASSPATH)$(PATH_SEPERATOR)$(SOLARBINDIR)$/OOoRunner.jar" +RUNNER_ARGS = org.openoffice.Runner -TestBase java_complex # --- Targets ------------------------------------------------------ .IF "$(depend)" == "" ALL : ALLTAR + @echo ----------------------------------------------------- + @echo - do a 'dmake show_targets' to show available targets + @echo ----------------------------------------------------- .ELSE ALL: ALLDEP .ENDIF .INCLUDE : target.mk +show_targets: + +@$(AUGMENT_LIBRARY_PATH) java $(RUNNER_CLASSPATH) complexlib.ShowTargets $(foreach,i,$(JAVAFILES) $(i:s/.\$///:s/.java//)) -run: - java -cp $(CLASSPATH)$(PATH_SEPERATOR)$(SOLARBINDIR)$/OOoRunner.jar org.openoffice.Runner -TestBase java_complex -o complex.connectivity.$(TARGET) +run: $(CLASSDIR)$/$(JARTARGET) + +$(AUGMENT_LIBRARY_PATH) java $(RUNNER_CLASSPATH) $(RUNNER_ARGS) -sce scenarios.sce +run_%: $(CLASSDIR)$/$(JARTARGET) + +$(AUGMENT_LIBRARY_PATH) java $(RUNNER_CLASSPATH) $(RUNNER_ARGS) -o complex.$(PRJNAME).$(@:s/run_//) diff --git a/connectivity/qa/scenarios.sce b/connectivity/qa/scenarios.sce new file mode 100644 index 000000000000..c085f11bd7d8 --- /dev/null +++ b/connectivity/qa/scenarios.sce @@ -0,0 +1,4 @@ +-o complex.connectivity.DBaseDriverTest +-o complex.connectivity.HsqlDriverTest +#-o complex.connectivity.JdbcLongVarCharTest +-o complex.connectivity.FlatFileAccess diff --git a/connectivity/source/commontools/DateConversion.cxx b/connectivity/source/commontools/DateConversion.cxx index 9f5be37f208f..a701b3b01570 100644 --- a/connectivity/source/commontools/DateConversion.cxx +++ b/connectivity/source/commontools/DateConversion.cxx @@ -43,6 +43,7 @@ #include "diagnose_ex.h" #include #include +#include using namespace ::connectivity; @@ -365,56 +366,59 @@ void DBTypeConversion::setValue(const Reference& xVariant, } //------------------------------------------------------------------------------ -double DBTypeConversion::getValue(const Reference& xVariant, - const Date& rNullDate, - sal_Int16 nKeyType) +double DBTypeConversion::getValue( const Reference< XColumn >& i_column, const Date& i_relativeToNullDate ) { try { - switch (nKeyType & ~NumberFormat::DEFINED) + const Reference< XPropertySet > xProp( i_column, UNO_QUERY_THROW ); + + const sal_Int32 nColumnType = ::comphelper::getINT32( xProp->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_TYPE ) ) ); + switch ( nColumnType ) { - case NumberFormat::DATE: - return toDouble( xVariant->getDate(), rNullDate); - case NumberFormat::DATETIME: - return toDouble(xVariant->getTimestamp(),rNullDate); - case NumberFormat::TIME: - return toDouble(xVariant->getTime()); - default: + case DataType::DATE: + return toDouble( i_column->getDate(), i_relativeToNullDate ); + + case DataType::TIME: + return toDouble( i_column->getTime() ); + + case DataType::TIMESTAMP: + return toDouble( i_column->getTimestamp(), i_relativeToNullDate ); + + default: { - Reference xProp(xVariant,UNO_QUERY); - if ( xProp.is() - && xProp->getPropertySetInfo()->hasPropertyByName(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISSIGNED)) - && !::comphelper::getBOOL(xProp->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISSIGNED))) ) + sal_Bool bIsSigned = sal_True; + OSL_VERIFY( xProp->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_ISSIGNED ) ) >>= bIsSigned ); + if ( !bIsSigned ) { - switch (::comphelper::getINT32(xProp->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)))) + switch ( nColumnType) { case DataType::TINYINT: - return static_cast(static_cast(xVariant->getByte())); + return static_cast(static_cast(i_column->getByte())); case DataType::SMALLINT: - return static_cast(static_cast(xVariant->getShort())); + return static_cast(static_cast(i_column->getShort())); case DataType::INTEGER: - return static_cast(static_cast(xVariant->getInt())); + return static_cast(static_cast(i_column->getInt())); case DataType::BIGINT: - return static_cast(static_cast(xVariant->getLong())); + return static_cast(static_cast(i_column->getLong())); } } - - return xVariant->getDouble(); } + return i_column->getDouble(); } } - catch(const Exception& ) + catch( const Exception& ) { + DBG_UNHANDLED_EXCEPTION(); return 0.0; } } //------------------------------------------------------------------------------ -::rtl::OUString DBTypeConversion::getValue(const Reference< XPropertySet>& _xColumn, +::rtl::OUString DBTypeConversion::getFormattedValue(const Reference< XPropertySet>& _xColumn, const Reference& _xFormatter, const ::com::sun::star::lang::Locale& _rLocale, const Date& _rNullDate) { - OSL_ENSURE(_xColumn.is() && _xFormatter.is(), "DBTypeConversion::getValue: invalid arg !"); + OSL_ENSURE(_xColumn.is() && _xFormatter.is(), "DBTypeConversion::getFormattedValue: invalid arg !"); if (!_xColumn.is() || !_xFormatter.is()) return ::rtl::OUString(); @@ -425,7 +429,7 @@ double DBTypeConversion::getValue(const Reference& xVariant, } catch (const Exception& ) { - OSL_ENSURE(false, "DBTypeConversion::getValue: caught an exception while asking for the format key!"); + OSL_ENSURE(false, "DBTypeConversion::getFormattedValue: caught an exception while asking for the format key!"); } if (!nKey) @@ -441,11 +445,11 @@ double DBTypeConversion::getValue(const Reference& xVariant, sal_Int16 nKeyType = getNumberFormatType(_xFormatter, nKey) & ~NumberFormat::DEFINED; - return DBTypeConversion::getValue(Reference< XColumn > (_xColumn, UNO_QUERY), _xFormatter, _rNullDate, nKey, nKeyType); + return DBTypeConversion::getFormattedValue(Reference< XColumn > (_xColumn, UNO_QUERY), _xFormatter, _rNullDate, nKey, nKeyType); } //------------------------------------------------------------------------------ -::rtl::OUString DBTypeConversion::getValue(const Reference& xVariant, +::rtl::OUString DBTypeConversion::getFormattedValue(const Reference& xVariant, const Reference& xFormatter, const Date& rNullDate, sal_Int32 nKey, @@ -462,23 +466,20 @@ double DBTypeConversion::getValue(const Reference& xVariant, case NumberFormat::DATETIME: { // get a value which represents the given date, relative to the given null date - double fValue = getValue(xVariant, rNullDate, nKeyType); + double fValue = getValue( xVariant, rNullDate ); if ( !xVariant->wasNull() ) { // get the null date of the formatter Date aFormatterNullDate( rNullDate ); try { - Reference< XPropertySet > xFormatterSettings; - Reference< XNumberFormatsSupplier > xSupplier( xFormatter->getNumberFormatsSupplier( ) ); - if ( xSupplier.is() ) - xFormatterSettings = xSupplier->getNumberFormatSettings(); - if ( xFormatterSettings.is() ) - xFormatterSettings->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "NullDate" ) ) ) >>= aFormatterNullDate; + Reference< XNumberFormatsSupplier > xSupplier( xFormatter->getNumberFormatsSupplier(), UNO_SET_THROW ); + Reference< XPropertySet > xFormatterSettings( xSupplier->getNumberFormatSettings(), UNO_SET_THROW ); + OSL_VERIFY( xFormatterSettings->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "NullDate" ) ) ) >>= aFormatterNullDate ); } catch( const Exception& ) { - OSL_ENSURE( sal_False, "DBTypeConversion::getValue: caught an exception while retrieving the formatter's NullDate!" ); + DBG_UNHANDLED_EXCEPTION(); } // get a value which represents the given date, relative to the null date of the formatter fValue -= toDays( rNullDate, aFormatterNullDate ); diff --git a/connectivity/source/commontools/TSkipDeletedSet.cxx b/connectivity/source/commontools/TSkipDeletedSet.cxx index 2d144ab72941..ccef25db11e3 100644 --- a/connectivity/source/commontools/TSkipDeletedSet.cxx +++ b/connectivity/source/commontools/TSkipDeletedSet.cxx @@ -154,10 +154,15 @@ sal_Bool OSkipDeletedSet::skipDeleted(IResultSetHelper::Movement _eCursorPositio bDone = sal_False; } - if(bDataFound && bDone ) + if(bDataFound && bDone) { const sal_Int32 nDriverPos = m_pHelper->getDriverPos(); - if ( ::std::find(m_aBookmarksPositions.begin(),m_aBookmarksPositions.end(),nDriverPos) == m_aBookmarksPositions.end() ) + if ( m_bDeletedVisible ) + { + if ( nDriverPos > (sal_Int32)m_aBookmarksPositions.size() ) + m_aBookmarksPositions.push_back(nDriverPos); + } + else if ( ::std::find(m_aBookmarksPositions.begin(),m_aBookmarksPositions.end(),nDriverPos) == m_aBookmarksPositions.end() ) m_aBookmarksPositions.push_back(nDriverPos); /*sal_Int32 nDriverPos = m_pHelper->getDriverPos(); if(m_aBookmarks.find(nDriverPos) == m_aBookmarks.end()) diff --git a/connectivity/source/commontools/dbtools.cxx b/connectivity/source/commontools/dbtools.cxx index 05bcf997268f..a216864fd172 100644 --- a/connectivity/source/commontools/dbtools.cxx +++ b/connectivity/source/commontools/dbtools.cxx @@ -261,7 +261,7 @@ Reference< XDataSource> getDataSource_allowException( const ::rtl::OUString& _rsTitleOrPath, const Reference< XMultiServiceFactory >& _rxFactory ) { - OSL_ENSURE( _rsTitleOrPath.getLength(), "getDataSource_allowException: invalid arg !" ); + ENSURE_OR_RETURN( _rsTitleOrPath.getLength(), "getDataSource_allowException: invalid arg !", NULL ); Reference< XNameAccess> xDatabaseContext( _rxFactory->createInstance( @@ -281,8 +281,9 @@ Reference< XDataSource > getDataSource( { xDS = getDataSource_allowException( _rsTitleOrPath, _rxFactory ); } - catch(Exception) + catch( const Exception& ) { + DBG_UNHANDLED_EXCEPTION(); } return xDS; diff --git a/connectivity/source/commontools/formattedcolumnvalue.cxx b/connectivity/source/commontools/formattedcolumnvalue.cxx index d63c83524389..98a6e3c2ece9 100644 --- a/connectivity/source/commontools/formattedcolumnvalue.cxx +++ b/connectivity/source/commontools/formattedcolumnvalue.cxx @@ -328,7 +328,7 @@ namespace dbtools { if ( m_pData->m_bNumericField ) { - sStringValue = DBTypeConversion::getValue( + sStringValue = DBTypeConversion::getFormattedValue( m_pData->m_xColumn, m_pData->m_xFormatter, m_pData->m_aNullDate, m_pData->m_nFormatKey, m_pData->m_nKeyType ); } diff --git a/connectivity/source/drivers/ado/ACatalog.cxx b/connectivity/source/drivers/ado/ACatalog.cxx index d73ac4746fa3..4db595636eb4 100644 --- a/connectivity/source/drivers/ado/ACatalog.cxx +++ b/connectivity/source/drivers/ado/ACatalog.cxx @@ -81,7 +81,7 @@ void OCatalog::refreshTables() if(m_pTables) m_pTables->reFill(aVector); else - m_pTables = new OTables(this,m_aMutex,aVector,aTables,m_pConnection->getMetaData()->storesMixedCaseQuotedIdentifiers()); + m_pTables = new OTables(this,m_aMutex,aVector,aTables,m_pConnection->getMetaData()->supportsMixedCaseQuotedIdentifiers()); } // ------------------------------------------------------------------------- void OCatalog::refreshViews() @@ -94,7 +94,7 @@ void OCatalog::refreshViews() if(m_pViews) m_pViews->reFill(aVector); else - m_pViews = new OViews(this,m_aMutex,aVector,aViews,m_pConnection->getMetaData()->storesMixedCaseQuotedIdentifiers()); + m_pViews = new OViews(this,m_aMutex,aVector,aViews,m_pConnection->getMetaData()->supportsMixedCaseQuotedIdentifiers()); } // ------------------------------------------------------------------------- void OCatalog::refreshGroups() @@ -107,7 +107,7 @@ void OCatalog::refreshGroups() if(m_pGroups) m_pGroups->reFill(aVector); else - m_pGroups = new OGroups(this,m_aMutex,aVector,aGroups,m_pConnection->getMetaData()->storesMixedCaseQuotedIdentifiers()); + m_pGroups = new OGroups(this,m_aMutex,aVector,aGroups,m_pConnection->getMetaData()->supportsMixedCaseQuotedIdentifiers()); } // ------------------------------------------------------------------------- void OCatalog::refreshUsers() @@ -120,7 +120,7 @@ void OCatalog::refreshUsers() if(m_pUsers) m_pUsers->reFill(aVector); else - m_pUsers = new OUsers(this,m_aMutex,aVector,aUsers,m_pConnection->getMetaData()->storesMixedCaseQuotedIdentifiers()); + m_pUsers = new OUsers(this,m_aMutex,aVector,aUsers,m_pConnection->getMetaData()->supportsMixedCaseQuotedIdentifiers()); } // ------------------------------------------------------------------------- diff --git a/connectivity/source/drivers/ado/AColumns.cxx b/connectivity/source/drivers/ado/AColumns.cxx index b2e383f53e0d..60140e9be93e 100644 --- a/connectivity/source/drivers/ado/AColumns.cxx +++ b/connectivity/source/drivers/ado/AColumns.cxx @@ -72,8 +72,14 @@ Reference< XPropertySet > OColumns::createDescriptor() sdbcx::ObjectType OColumns::appendObject( const ::rtl::OUString&, const Reference< XPropertySet >& descriptor ) { OAdoColumn* pColumn = NULL; + Reference< XPropertySet > xColumn; if ( !getImplementation( pColumn, descriptor ) || pColumn == NULL ) - m_pConnection->throwGenericSQLException( STR_INVALID_COLUMN_DESCRIPTOR_ERROR,static_cast(this) ); + { + // m_pConnection->throwGenericSQLException( STR_INVALID_COLUMN_DESCRIPTOR_ERROR,static_cast(this) ); + pColumn = new OAdoColumn(isCaseSensitive(),m_pConnection); + xColumn = pColumn; + ::comphelper::copyProperties(descriptor,xColumn); + } WpADOColumn aColumn = pColumn->getColumnImpl(); diff --git a/connectivity/source/drivers/ado/ADriver.cxx b/connectivity/source/drivers/ado/ADriver.cxx index 20eb6910f849..5b89623c28d8 100644 --- a/connectivity/source/drivers/ado/ADriver.cxx +++ b/connectivity/source/drivers/ado/ADriver.cxx @@ -163,6 +163,37 @@ void ODriver::impl_checkURL_throw(const ::rtl::OUString& _sUrl) Sequence< DriverPropertyInfo > SAL_CALL ODriver::getPropertyInfo( const ::rtl::OUString& url, const Sequence< PropertyValue >& /*info*/ ) throw(SQLException, RuntimeException) { impl_checkURL_throw(url); + if ( acceptsURL(url) ) + { + ::std::vector< DriverPropertyInfo > aDriverInfo; + + Sequence< ::rtl::OUString > aBooleanValues(2); + aBooleanValues[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "false" ) ); + aBooleanValues[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "true" ) ); + + aDriverInfo.push_back(DriverPropertyInfo( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IgnoreDriverPrivileges")) + ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Ignore the privileges from the database driver.")) + ,sal_False + ,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "false" ) ) + ,aBooleanValues) + ); + aDriverInfo.push_back(DriverPropertyInfo( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("EscapeDateTime")) + ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Escape date time format.")) + ,sal_False + ,::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "true" ) ) + ,aBooleanValues) + ); + aDriverInfo.push_back(DriverPropertyInfo( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TypeInfoSettings")) + ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Defines how the type info of the database metadata should be manipulated.")) + ,sal_False + ,::rtl::OUString( ) + ,Sequence< ::rtl::OUString > ()) + ); + return Sequence< DriverPropertyInfo >(&aDriverInfo[0],aDriverInfo.size()); + } return Sequence< DriverPropertyInfo >(); } // -------------------------------------------------------------------------------- diff --git a/connectivity/source/drivers/ado/ado.xcu b/connectivity/source/drivers/ado/ado.xcu index 50c29cf7ba2e..e95e1a676c12 100755 --- a/connectivity/source/drivers/ado/ado.xcu +++ b/connectivity/source/drivers/ado/ado.xcu @@ -164,6 +164,11 @@ false + + + Column(2) = 16,Column(3) = 1 + + diff --git a/connectivity/source/drivers/ado/adoimp.cxx b/connectivity/source/drivers/ado/adoimp.cxx index 1bc136a35662..b59f41a597fa 100644 --- a/connectivity/source/drivers/ado/adoimp.cxx +++ b/connectivity/source/drivers/ado/adoimp.cxx @@ -105,7 +105,7 @@ sal_Int32 ADOS::MapADOType2Jdbc(DataTypeEnum eType) case adDBTime: nType = DataType::TIME; break; case adDate: case adDBTimeStamp: nType = DataType::TIMESTAMP; break; - case adBoolean: nType = DataType::BIT; break; + case adBoolean: nType = DataType::BOOLEAN; break; // case adArray: nType = DataType::ARRAY; break; case adBinary: nType = DataType::BINARY; break; case adGUID: nType = DataType::OBJECT; break; @@ -151,6 +151,7 @@ DataTypeEnum ADOS::MapJdbc2ADOType(sal_Int32 _nType,sal_Int32 _nJetEngine) case DataType::DATE: return isJetEngine(_nJetEngine) ? adDate : adDBDate; break; case DataType::TIME: return adDBTime; break; case DataType::TIMESTAMP: return isJetEngine(_nJetEngine) ? adDate : adDBTimeStamp; break; + case DataType::BOOLEAN: case DataType::BIT: return adBoolean; break; case DataType::BINARY: return adBinary; break; case DataType::VARCHAR: return adVarWChar; break; diff --git a/connectivity/source/drivers/calc/CTable.cxx b/connectivity/source/drivers/calc/CTable.cxx index 3c9017e1c792..ef150f126060 100644 --- a/connectivity/source/drivers/calc/CTable.cxx +++ b/connectivity/source/drivers/calc/CTable.cxx @@ -470,8 +470,8 @@ void OCalcTable::fillColumns() String aStrFieldName; aStrFieldName.AssignAscii("Column"); ::rtl::OUString aTypeName; - ::comphelper::UStringMixEqual aCase(m_pConnection->getMetaData()->storesMixedCaseQuotedIdentifiers()); - const sal_Bool bStoresMixedCaseQuotedIdentifiers = getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(); + ::comphelper::UStringMixEqual aCase(m_pConnection->getMetaData()->supportsMixedCaseQuotedIdentifiers()); + const sal_Bool bStoresMixedCaseQuotedIdentifiers = getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(); for (sal_Int32 i = 0; i < m_nDataCols; i++) { diff --git a/connectivity/source/drivers/dbase/DIndex.cxx b/connectivity/source/drivers/dbase/DIndex.cxx index ccbc6c46966f..cd11204b3570 100644 --- a/connectivity/source/drivers/dbase/DIndex.cxx +++ b/connectivity/source/drivers/dbase/DIndex.cxx @@ -67,7 +67,7 @@ using namespace com::sun::star::lang; IMPLEMENT_SERVICE_INFO(ODbaseIndex,"com.sun.star.sdbcx.driver.dbase.Index","com.sun.star.sdbcx.Index"); // ------------------------------------------------------------------------- -ODbaseIndex::ODbaseIndex(ODbaseTable* _pTable) : OIndex(sal_True/*_pTable->getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers()*/) +ODbaseIndex::ODbaseIndex(ODbaseTable* _pTable) : OIndex(sal_True/*_pTable->getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers()*/) ,m_pFileStream(NULL) ,m_nCurNode(NODE_NOTFOUND) ,m_pTable(_pTable) @@ -80,7 +80,7 @@ ODbaseIndex::ODbaseIndex(ODbaseTable* _pTable) : OIndex(sal_True/*_pTable->getCo ODbaseIndex::ODbaseIndex( ODbaseTable* _pTable, const NDXHeader& _rHeader, const ::rtl::OUString& _rName) - :OIndex(_rName,::rtl::OUString(),_rHeader.db_unique,sal_False,sal_False,sal_True) // _pTable->getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers() + :OIndex(_rName,::rtl::OUString(),_rHeader.db_unique,sal_False,sal_False,sal_True) // _pTable->getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers() ,m_pFileStream(NULL) ,m_aHeader(_rHeader) ,m_nCurNode(NODE_NOTFOUND) diff --git a/connectivity/source/drivers/dbase/DIndexColumns.cxx b/connectivity/source/drivers/dbase/DIndexColumns.cxx index 59682a38d8af..1ea40b7bc03f 100644 --- a/connectivity/source/drivers/dbase/DIndexColumns.cxx +++ b/connectivity/source/drivers/dbase/DIndexColumns.cxx @@ -69,7 +69,7 @@ sdbcx::ObjectType ODbaseIndexColumns::createObject(const ::rtl::OUString& _rName ,sal_False ,sal_False ,sal_False - ,pTable->getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers()); + ,pTable->getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers()); return xRet; } @@ -82,7 +82,7 @@ void ODbaseIndexColumns::impl_refresh() throw(RuntimeException) // ------------------------------------------------------------------------- Reference< XPropertySet > ODbaseIndexColumns::createDescriptor() { - return new sdbcx::OIndexColumn(m_pIndex->getTable()->getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers()); + return new sdbcx::OIndexColumn(m_pIndex->getTable()->getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers()); } // ------------------------------------------------------------------------- sdbcx::ObjectType ODbaseIndexColumns::appendObject( const ::rtl::OUString& /*_rForName*/, const Reference< XPropertySet >& descriptor ) diff --git a/connectivity/source/drivers/dbase/DTable.cxx b/connectivity/source/drivers/dbase/DTable.cxx index 2c1438debbef..a0844b93b0b7 100644 --- a/connectivity/source/drivers/dbase/DTable.cxx +++ b/connectivity/source/drivers/dbase/DTable.cxx @@ -340,7 +340,7 @@ void ODbaseTable::fillColumns() aStrFieldName.AssignAscii("Column"); ::rtl::OUString aTypeName; static const ::rtl::OUString sVARCHAR(RTL_CONSTASCII_USTRINGPARAM("VARCHAR")); - const sal_Bool bCase = getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(); + const sal_Bool bCase = getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(); const bool bFoxPro = m_aHeader.db_typ == VisualFoxPro || m_aHeader.db_typ == VisualFoxProAuto || m_aHeader.db_typ == FoxProMemo; sal_Int32 i = 0; @@ -2208,7 +2208,7 @@ void ODbaseTable::alterColumn(sal_Int32 index, if(xOldColumn.is()) xCopyColumn = xOldColumn->createDataDescriptor(); else - xCopyColumn = new OColumn(getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers()); + xCopyColumn = new OColumn(getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers()); ::comphelper::copyProperties(descriptor,xCopyColumn); @@ -2233,7 +2233,7 @@ void ODbaseTable::alterColumn(sal_Int32 index, if(xColumn.is()) xCpy = xColumn->createDataDescriptor(); else - xCpy = new OColumn(getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers()); + xCpy = new OColumn(getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers()); ::comphelper::copyProperties(xProp,xCpy); xAppend->appendByDescriptor(xCpy); } @@ -2249,7 +2249,7 @@ void ODbaseTable::alterColumn(sal_Int32 index, if(xColumn.is()) xCpy = xColumn->createDataDescriptor(); else - xCpy = new OColumn(getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers()); + xCpy = new OColumn(getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers()); ::comphelper::copyProperties(xProp,xCpy); xAppend->appendByDescriptor(xCpy); } @@ -2390,7 +2390,7 @@ void ODbaseTable::addColumn(const Reference< XPropertySet >& _xNewColumn) pNewTable->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME),makeAny(::rtl::OUString(sTempName))); { Reference xAppend(pNewTable->getColumns(),UNO_QUERY); - sal_Bool bCase = getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(); + sal_Bool bCase = getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(); // copy the structure for(sal_Int32 i=0;i < m_pColumns->getCount();++i) { @@ -2463,7 +2463,7 @@ void ODbaseTable::dropColumn(sal_Int32 _nPos) pNewTable->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME),makeAny(::rtl::OUString(sTempName))); { Reference xAppend(pNewTable->getColumns(),UNO_QUERY); - sal_Bool bCase = getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(); + sal_Bool bCase = getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(); // copy the structure for(sal_Int32 i=0;i < m_pColumns->getCount();++i) { diff --git a/connectivity/source/drivers/evoab/LFolderList.cxx b/connectivity/source/drivers/evoab/LFolderList.cxx index c9bca3d2d207..02d3fb284312 100644 --- a/connectivity/source/drivers/evoab/LFolderList.cxx +++ b/connectivity/source/drivers/evoab/LFolderList.cxx @@ -107,7 +107,7 @@ void OEvoabFolderList::fillColumns(const ::com::sun::star::lang::Locale& _aLocal m_aPrecisions.reserve(nFieldCount); m_aScales.reserve(nFieldCount); - sal_Bool bCase = getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(); + sal_Bool bCase = getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(); CharClass aCharClass(pConnection->getDriver()->getFactory(),_aLocale); // read description sal_Unicode cDecimalDelimiter = pConnection->getDecimalDelimiter(); diff --git a/connectivity/source/drivers/evoab/LTable.cxx b/connectivity/source/drivers/evoab/LTable.cxx index c77924d2a8ca..c1a41e91acf2 100644 --- a/connectivity/source/drivers/evoab/LTable.cxx +++ b/connectivity/source/drivers/evoab/LTable.cxx @@ -119,7 +119,7 @@ void OEvoabTable::fillColumns(const ::com::sun::star::lang::Locale& _aLocale) m_aPrecisions.reserve(nFieldCount); m_aScales.reserve(nFieldCount); - sal_Bool bCase = getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(); + sal_Bool bCase = getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(); CharClass aCharClass(pConnection->getDriver()->getFactory(),_aLocale); // read description sal_Unicode cDecimalDelimiter = pConnection->getDecimalDelimiter(); @@ -674,7 +674,7 @@ sal_Bool OEvoabTable::setColumnAliases() aColumnFinalName = aColumnReadName; sColumnFinalName = aColumnFinalName; - sal_Bool bCase = getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(); + sal_Bool bCase = getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(); ::rtl::OUString aTypeName; aTypeName = ::rtl::OUString::createFromAscii("VARCHAR"); sdbcx::OColumn* pColumn = new sdbcx::OColumn(sColumnFinalName,aTypeName,::rtl::OUString(), diff --git a/connectivity/source/drivers/file/FColumns.cxx b/connectivity/source/drivers/file/FColumns.cxx index 3c3929a80c50..e92855db23fa 100644 --- a/connectivity/source/drivers/file/FColumns.cxx +++ b/connectivity/source/drivers/file/FColumns.cxx @@ -72,7 +72,7 @@ sdbcx::ObjectType OColumns::createObject(const ::rtl::OUString& _rName) sal_False, sal_False, sal_False, - m_pTable->getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers()); + m_pTable->getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers()); xRet = pRet; break; } diff --git a/connectivity/source/drivers/file/FResultSet.cxx b/connectivity/source/drivers/file/FResultSet.cxx index aebd6f4af3bf..b9b7180eb65e 100644 --- a/connectivity/source/drivers/file/FResultSet.cxx +++ b/connectivity/source/drivers/file/FResultSet.cxx @@ -138,7 +138,7 @@ OResultSet::OResultSet(OStatement_Base* pStmt,OSQLParseTreeIterator& _aSQLIte m_nResultSetConcurrency = isCount() ? ResultSetConcurrency::READ_ONLY : ResultSetConcurrency::UPDATABLE; construct(); - m_aSkipDeletedSet.SetDeleted(m_bShowDeleted); + m_aSkipDeletedSet.SetDeletedVisible(m_bShowDeleted); osl_decrementInterlockedCount( &m_refCount ); } @@ -1692,7 +1692,7 @@ void OResultSet::setBoundedColumns(const OValueRefRow& _rRow, ::std::vector& _rColMapping) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OResultSet::setBoundedColumns" ); - ::comphelper::UStringMixEqual aCase(_xMetaData->storesMixedCaseQuotedIdentifiers()); + ::comphelper::UStringMixEqual aCase(_xMetaData->supportsMixedCaseQuotedIdentifiers()); Reference xTableColumn; ::rtl::OUString sTableColumnName, sSelectColumnRealName; diff --git a/connectivity/source/drivers/file/FTable.cxx b/connectivity/source/drivers/file/FTable.cxx index 46f855e3d208..4d10d97b24b5 100644 --- a/connectivity/source/drivers/file/FTable.cxx +++ b/connectivity/source/drivers/file/FTable.cxx @@ -50,7 +50,7 @@ using namespace ::com::sun::star::container; DBG_NAME( file_OFileTable ) OFileTable::OFileTable(sdbcx::OCollection* _pTables,OConnection* _pConnection) -: OTable_TYPEDEF(_pTables,_pConnection->getMetaData()->storesMixedCaseQuotedIdentifiers()) +: OTable_TYPEDEF(_pTables,_pConnection->getMetaData()->supportsMixedCaseQuotedIdentifiers()) ,m_pConnection(_pConnection) ,m_pFileStream(NULL) ,m_nFilePos(0) @@ -72,7 +72,7 @@ OFileTable::OFileTable( sdbcx::OCollection* _pTables,OConnection* _pConnection, const ::rtl::OUString& _Description , const ::rtl::OUString& _SchemaName, const ::rtl::OUString& _CatalogName - ) : OTable_TYPEDEF(_pTables,_pConnection->getMetaData()->storesMixedCaseQuotedIdentifiers(), + ) : OTable_TYPEDEF(_pTables,_pConnection->getMetaData()->supportsMixedCaseQuotedIdentifiers(), _Name, _Type, _Description, diff --git a/connectivity/source/drivers/flat/EConnection.cxx b/connectivity/source/drivers/flat/EConnection.cxx index c9cec7b5ee10..428f813c2674 100644 --- a/connectivity/source/drivers/flat/EConnection.cxx +++ b/connectivity/source/drivers/flat/EConnection.cxx @@ -56,6 +56,7 @@ using namespace ::com::sun::star::lang; // -------------------------------------------------------------------------------- OFlatConnection::OFlatConnection(ODriver* _pDriver) : OConnection(_pDriver) + ,m_nMaxRowsToScan(50) ,m_bHeaderLine(sal_True) ,m_cFieldDelimiter(';') ,m_cStringDelimiter('"') @@ -108,10 +109,15 @@ void OFlatConnection::construct(const ::rtl::OUString& url,const Sequence< Prope OSL_VERIFY( pBegin->Value >>= aVal ); m_cThousandDelimiter = aVal.toChar(); } + else if ( !pBegin->Name.compareToAscii("MaxRowScan") ) + { + pBegin->Value >>= m_nMaxRowsToScan; + } } osl_decrementInterlockedCount( &m_refCount ); OConnection::construct(url,info); + m_bShowDeleted = sal_True; // we do not supported rows for this type } // -------------------------------------------------------------------------------- Reference< XDatabaseMetaData > SAL_CALL OFlatConnection::getMetaData( ) throw(SQLException, RuntimeException) diff --git a/connectivity/source/drivers/flat/ETable.cxx b/connectivity/source/drivers/flat/ETable.cxx index 1d1423ab72f6..4c531f7fecc3 100644 --- a/connectivity/source/drivers/flat/ETable.cxx +++ b/connectivity/source/drivers/flat/ETable.cxx @@ -113,11 +113,11 @@ void OFlatTable::fillColumns(const ::com::sun::star::lang::Locale& _aLocale) m_aScales.clear(); // reserve some space m_aColumns->get().reserve(nFieldCount+1); - m_aTypes.reserve(nFieldCount+1); - m_aPrecisions.reserve(nFieldCount+1); - m_aScales.reserve(nFieldCount+1); + m_aTypes.assign(nFieldCount+1,DataType::SQLNULL); + m_aPrecisions.assign(nFieldCount+1,-1); + m_aScales.assign(nFieldCount+1,-1); - const sal_Bool bCase = m_pConnection->getMetaData()->storesMixedCaseQuotedIdentifiers(); + const sal_Bool bCase = m_pConnection->getMetaData()->supportsMixedCaseQuotedIdentifiers(); CharClass aCharClass(pConnection->getDriver()->getFactory(),_aLocale); // read description const sal_Unicode cDecimalDelimiter = pConnection->getDecimalDelimiter(); @@ -125,106 +125,186 @@ void OFlatTable::fillColumns(const ::com::sun::star::lang::Locale& _aLocale) String aColumnName; ::rtl::OUString aTypeName; ::comphelper::UStringMixEqual aCase(bCase); - xub_StrLen nStartPosHeaderLine = 0; // use for eficient way to get the tokens - xub_StrLen nStartPosFirstLine = 0; // use for eficient way to get the tokens - xub_StrLen nStartPosFirstLine2 = 0; + ::std::vector aColumnNames,m_aTypeNames; + m_aTypeNames.resize(nFieldCount); + const sal_Int32 nMaxRowsToScan = pConnection->getMaxRowsToScan(); + sal_Int32 nRowCount = 0; + do + { + xub_StrLen nStartPosHeaderLine = 0; // use for eficient way to get the tokens + xub_StrLen nStartPosFirstLine = 0; // use for eficient way to get the tokens + xub_StrLen nStartPosFirstLine2 = 0; + for (xub_StrLen i = 0; i < nFieldCount; i++) + { + if ( nRowCount == 0) + { + if ( bHasHeaderLine ) + { + aHeaderLine.GetTokenSpecial(aColumnName,nStartPosHeaderLine,m_cFieldDelimiter,m_cStringDelimiter); + if ( !aColumnName.Len() ) + { + aColumnName = 'C'; + aColumnName += String::CreateFromInt32(i+1); + } + } + else + { + // no column name so ... + aColumnName = 'C'; + aColumnName += String::CreateFromInt32(i+1); + } + aColumnNames.push_back(aColumnName); + } + impl_fillColumnInfo_nothrow(aFirstLine,nStartPosFirstLine,nStartPosFirstLine2,m_aTypes[i],m_aPrecisions[i],m_aScales[i],m_aTypeNames[i],cDecimalDelimiter,cThousandDelimiter,aCharClass); + } + ++nRowCount; + } + while(nRowCount < nMaxRowsToScan && m_pFileStream->ReadByteStringLine(aFirstLine,nEncoding)); + for (xub_StrLen i = 0; i < nFieldCount; i++) { - if ( bHasHeaderLine ) + // check if the columname already exists + String aAlias(aColumnNames[i]); + OSQLColumns::Vector::const_iterator aFind = connectivity::find(m_aColumns->get().begin(),m_aColumns->get().end(),aAlias,aCase); + sal_Int32 nExprCnt = 0; + while(aFind != m_aColumns->get().end()) { - aHeaderLine.GetTokenSpecial(aColumnName,nStartPosHeaderLine,m_cFieldDelimiter,m_cStringDelimiter); - if ( !aColumnName.Len() ) + (aAlias = aColumnNames[i]) += String::CreateFromInt32(++nExprCnt); + aFind = connectivity::find(m_aColumns->get().begin(),m_aColumns->get().end(),aAlias,aCase); + } + + sdbcx::OColumn* pColumn = new sdbcx::OColumn(aAlias,m_aTypeNames[i],::rtl::OUString(),::rtl::OUString(), + ColumnValue::NULLABLE, + m_aPrecisions[i], + m_aScales[i], + m_aTypes[i], + sal_False, + sal_False, + sal_False, + bCase); + Reference< XPropertySet> xCol = pColumn; + m_aColumns->get().push_back(xCol); + } + m_pFileStream->Seek(m_nStartRowFilePos); +} +void OFlatTable::impl_fillColumnInfo_nothrow(QuotedTokenizedString& aFirstLine,xub_StrLen& nStartPosFirstLine,xub_StrLen& nStartPosFirstLine2 + ,sal_Int32& io_nType,sal_Int32& io_nPrecisions,sal_Int32& io_nScales,String& o_sTypeName + ,const sal_Unicode cDecimalDelimiter,const sal_Unicode cThousandDelimiter,const CharClass& aCharClass) +{ + if ( io_nType != DataType::VARCHAR ) + { + BOOL bNumeric = io_nType == DataType::SQLNULL || io_nType == DataType::DOUBLE || io_nType == DataType::DECIMAL || io_nType == DataType::INTEGER; + ULONG nIndex = 0; + + if ( bNumeric ) + { + // first without fielddelimiter + String aField; + aFirstLine.GetTokenSpecial(aField,nStartPosFirstLine,m_cFieldDelimiter,'\0'); + if (aField.Len() == 0 || + (m_cStringDelimiter && m_cStringDelimiter == aField.GetChar(0))) { - aColumnName = 'C'; - aColumnName += String::CreateFromInt32(i+1); - } - } - else - { - // no column name so ... - aColumnName = 'C'; - aColumnName += String::CreateFromInt32(i+1); - } - sal_Int32 eType; - sal_uInt16 nPrecision = 0; - sal_uInt16 nScale = 0; - - sal_Bool bNumeric = sal_False; - sal_uIntPtr nIndex = 0; - - // first without fielddelimiter - String aField; - aFirstLine.GetTokenSpecial(aField,nStartPosFirstLine,m_cFieldDelimiter,'\0'); - if (aField.Len() == 0 || - (m_cStringDelimiter && m_cStringDelimiter == aField.GetChar(0))) - { - bNumeric = sal_False; - if ( m_cStringDelimiter != '\0' ) - aFirstLine.GetTokenSpecial(aField,nStartPosFirstLine2,m_cFieldDelimiter,m_cStringDelimiter); - else - nStartPosFirstLine2 = nStartPosFirstLine; - } - else - { - String aField2; - if ( m_cStringDelimiter != '\0' ) - aFirstLine.GetTokenSpecial(aField2,nStartPosFirstLine2,m_cFieldDelimiter,m_cStringDelimiter); - else - aField2 = aField; - - if (aField2.Len() == 0) - { - bNumeric = sal_False; + bNumeric = FALSE; + if ( m_cStringDelimiter != '\0' ) + aFirstLine.GetTokenSpecial(aField,nStartPosFirstLine2,m_cFieldDelimiter,m_cStringDelimiter); + else + nStartPosFirstLine2 = nStartPosFirstLine; } else { - bNumeric = sal_True; - xub_StrLen nDot = 0; - xub_StrLen nDecimalDelCount = 0; - for (xub_StrLen j = 0; j < aField2.Len(); j++) + String aField2; + if ( m_cStringDelimiter != '\0' ) + aFirstLine.GetTokenSpecial(aField2,nStartPosFirstLine2,m_cFieldDelimiter,m_cStringDelimiter); + else + aField2 = aField; + + if (aField2.Len() == 0) { - const sal_Unicode c = aField2.GetChar(j); - // nur Ziffern und Dezimalpunkt und Tausender-Trennzeichen? - if ( ( !cDecimalDelimiter || c != cDecimalDelimiter ) && - ( !cThousandDelimiter || c != cThousandDelimiter ) && - !aCharClass.isDigit(aField2,j) && - ( j != 0 || (c != '+' && c != '-' ) ) ) - { - bNumeric = sal_False; - break; - } - if (cDecimalDelimiter && c == cDecimalDelimiter) - { - nPrecision = 15; // we have an decimal value - nScale = 2; - ++nDecimalDelCount; - } // if (cDecimalDelimiter && c == cDecimalDelimiter) - if ( c == '.' ) - ++nDot; + bNumeric = FALSE; } - - if (nDecimalDelCount > 1 || nDot > 1 ) // if there is more than one dot it isn't a number - bNumeric = sal_False; - if (bNumeric && cThousandDelimiter) + else { - // Ist der Trenner richtig angegeben? - const String aValue = aField2.GetToken(0,cDecimalDelimiter); - for (sal_Int32 j = aValue.Len() - 4; j >= 0; j -= 4) + bNumeric = TRUE; + xub_StrLen nDot = 0; + xub_StrLen nDecimalDelCount = 0; + xub_StrLen nSpaceCount = 0; + for (xub_StrLen j = 0; j < aField2.Len(); j++) { - const sal_Unicode c = aValue.GetChar(static_cast(j)); - // nur Ziffern und Dezimalpunkt und Tausender-Trennzeichen? - if (c == cThousandDelimiter && j) - continue; - else + const sal_Unicode c = aField2.GetChar(j); + if ( j == nSpaceCount && m_cFieldDelimiter != 32 && c == 32 ) { - bNumeric = sal_False; + ++nSpaceCount; + continue; + } + // nur Ziffern und Dezimalpunkt und Tausender-Trennzeichen? + if ( ( !cDecimalDelimiter || c != cDecimalDelimiter ) && + ( !cThousandDelimiter || c != cThousandDelimiter ) && + !aCharClass.isDigit(aField2,j) && + ( j != 0 || (c != '+' && c != '-' ) ) ) + { + bNumeric = FALSE; break; } + if (cDecimalDelimiter && c == cDecimalDelimiter) + { + io_nPrecisions = 15; // we have an decimal value + io_nScales = 2; + ++nDecimalDelCount; + } // if (cDecimalDelimiter && c == cDecimalDelimiter) + if ( c == '.' ) + ++nDot; + } + + if (nDecimalDelCount > 1 || nDot > 1 ) // if there is more than one dot it isn't a number + bNumeric = FALSE; + if (bNumeric && cThousandDelimiter) + { + // Ist der Trenner richtig angegeben? + const String aValue = aField2.GetToken(0,cDecimalDelimiter); + for (sal_Int32 j = aValue.Len() - 4; j >= 0; j -= 4) + { + const sal_Unicode c = aValue.GetChar(static_cast(j)); + // nur Ziffern und Dezimalpunkt und Tausender-Trennzeichen? + if (c == cThousandDelimiter && j) + continue; + else + { + bNumeric = FALSE; + break; + } + } + } + + // jetzt koennte es noch ein Datumsfeld sein + if (!bNumeric) + { + try + { + nIndex = m_xNumberFormatter->detectNumberFormat(::com::sun::star::util::NumberFormat::ALL,aField2); + } + catch(Exception&) + { + } } } - - // jetzt koennte es noch ein Datumsfeld sein - if (!bNumeric) + } + } + else if ( io_nType == DataType::DATE || io_nType == DataType::TIMESTAMP || io_nType == DataType::TIME) + { + String aField; + aFirstLine.GetTokenSpecial(aField,nStartPosFirstLine,m_cFieldDelimiter,'\0'); + if (aField.Len() == 0 || + (m_cStringDelimiter && m_cStringDelimiter == aField.GetChar(0))) + { + } + else + { + String aField2; + if ( m_cStringDelimiter != '\0' ) + aFirstLine.GetTokenSpecial(aField2,nStartPosFirstLine2,m_cFieldDelimiter,m_cStringDelimiter); + else + aField2 = aField; + if (aField2.Len() ) { try { @@ -242,87 +322,83 @@ void OFlatTable::fillColumns(const ::com::sun::star::lang::Locale& _aLocale) { if (cDecimalDelimiter) { - if(nPrecision) + if(io_nPrecisions) { - eType = DataType::DECIMAL; + io_nType = DataType::DECIMAL; static const ::rtl::OUString s_sDECIMAL(RTL_CONSTASCII_USTRINGPARAM("DECIMAL")); - aTypeName = s_sDECIMAL; + o_sTypeName = s_sDECIMAL; } else { - eType = DataType::DOUBLE; + io_nType = DataType::DOUBLE; static const ::rtl::OUString s_sDOUBLE(RTL_CONSTASCII_USTRINGPARAM("DOUBLE")); - aTypeName = s_sDOUBLE; + o_sTypeName = s_sDOUBLE; } } else - eType = DataType::INTEGER; + { + io_nType = DataType::INTEGER; + io_nPrecisions = 0; + io_nScales = 0; + } nFlags = ColumnSearch::BASIC; } else { - switch (comphelper::getNumberFormatType(m_xNumberFormatter,nIndex)) { case NUMBERFORMAT_DATE: - eType = DataType::DATE; + io_nType = DataType::DATE; { static const ::rtl::OUString s_sDATE(RTL_CONSTASCII_USTRINGPARAM("DATE")); - aTypeName = s_sDATE; + o_sTypeName = s_sDATE; } break; case NUMBERFORMAT_DATETIME: - eType = DataType::TIMESTAMP; + io_nType = DataType::TIMESTAMP; { static const ::rtl::OUString s_sTIMESTAMP(RTL_CONSTASCII_USTRINGPARAM("TIMESTAMP")); - aTypeName = s_sTIMESTAMP; + o_sTypeName = s_sTIMESTAMP; } break; case NUMBERFORMAT_TIME: - eType = DataType::TIME; + io_nType = DataType::TIME; { static const ::rtl::OUString s_sTIME(RTL_CONSTASCII_USTRINGPARAM("TIME")); - aTypeName = s_sTIME; + o_sTypeName = s_sTIME; } break; default: - eType = DataType::VARCHAR; - nPrecision = 0; // nyi: Daten koennen aber laenger sein! - nScale = 0; + io_nType = DataType::VARCHAR; + io_nPrecisions = 0; // nyi: Daten koennen aber laenger sein! + io_nScales = 0; { static const ::rtl::OUString s_sVARCHAR(RTL_CONSTASCII_USTRINGPARAM("VARCHAR")); - aTypeName = s_sVARCHAR; + o_sTypeName = s_sVARCHAR; } }; nFlags |= ColumnSearch::CHAR; } - - // check if the columname already exists - String aAlias(aColumnName); - OSQLColumns::Vector::const_iterator aFind = connectivity::find(m_aColumns->get().begin(),m_aColumns->get().end(),aAlias,aCase); - sal_Int32 nExprCnt = 0; - while(aFind != m_aColumns->get().end()) - { - (aAlias = aColumnName) += String::CreateFromInt32(++nExprCnt); - aFind = connectivity::find(m_aColumns->get().begin(),m_aColumns->get().end(),aAlias,aCase); - } - - sdbcx::OColumn* pColumn = new sdbcx::OColumn(aAlias,aTypeName,::rtl::OUString(),::rtl::OUString(), - ColumnValue::NULLABLE, - nPrecision, - nScale, - eType, - sal_False, - sal_False, - sal_False, - bCase); - Reference< XPropertySet> xCol = pColumn; - m_aColumns->get().push_back(xCol); - m_aTypes.push_back(eType); - m_aPrecisions.push_back(nPrecision); - m_aScales.push_back(nScale); } - m_pFileStream->Seek(m_nStartRowFilePos); + else + { + String aField; + aFirstLine.GetTokenSpecial(aField,nStartPosFirstLine,m_cFieldDelimiter,'\0'); + if (aField.Len() == 0 || + (m_cStringDelimiter && m_cStringDelimiter == aField.GetChar(0))) + { + if ( m_cStringDelimiter != '\0' ) + aFirstLine.GetTokenSpecial(aField,nStartPosFirstLine2,m_cFieldDelimiter,m_cStringDelimiter); + else + nStartPosFirstLine2 = nStartPosFirstLine; + } + else + { + String aField2; + if ( m_cStringDelimiter != '\0' ) + aFirstLine.GetTokenSpecial(aField2,nStartPosFirstLine2,m_cFieldDelimiter,m_cStringDelimiter); + } + } } // ------------------------------------------------------------------------- OFlatTable::OFlatTable(sdbcx::OCollection* _pTables,OFlatConnection* _pConnection, diff --git a/connectivity/source/drivers/flat/flat.xcu b/connectivity/source/drivers/flat/flat.xcu index d00d1f98c38c..a54394e853e8 100755 --- a/connectivity/source/drivers/flat/flat.xcu +++ b/connectivity/source/drivers/flat/flat.xcu @@ -75,8 +75,18 @@ false + + + 100 + + + + + true + + true diff --git a/connectivity/source/drivers/mozab/MResultSet.cxx b/connectivity/source/drivers/mozab/MResultSet.cxx index c7c85770419e..da55b60079b3 100644 --- a/connectivity/source/drivers/mozab/MResultSet.cxx +++ b/connectivity/source/drivers/mozab/MResultSet.cxx @@ -897,8 +897,8 @@ void OResultSet::analyseWhereClause( const OSQLParseNode* parseT OSQLParseNode *pOptEscape; const OSQLParseNode* pPart2 = parseTree->getChild(1); pColumn = parseTree->getChild(0); // Match Item - pAtom = pPart2->getChild(parseTree->count()-2); // Match String - pOptEscape = pPart2->getChild(parseTree->count()-1); // Opt Escape Rule + pAtom = pPart2->getChild(pPart2->count()-2); // Match String + pOptEscape = pPart2->getChild(pPart2->count()-1); // Opt Escape Rule const bool bNot = SQL_ISTOKEN(pPart2->getChild(0), NOT); if (!(pAtom->getNodeType() == SQL_NODE_STRING || @@ -1374,7 +1374,7 @@ void OResultSet::setBoundedColumns(const OValueRow& _rRow, const Reference& _xMetaData, ::std::vector& _rColMapping) { - ::comphelper::UStringMixEqual aCase(_xMetaData->storesMixedCaseQuotedIdentifiers()); + ::comphelper::UStringMixEqual aCase(_xMetaData->supportsMixedCaseQuotedIdentifiers()); Reference xTableColumn; ::rtl::OUString sTableColumnName, sSelectColumnRealName; diff --git a/connectivity/source/inc/TSkipDeletedSet.hxx b/connectivity/source/inc/TSkipDeletedSet.hxx index bcd3fc23f1a6..c5d5d5b71dd6 100644 --- a/connectivity/source/inc/TSkipDeletedSet.hxx +++ b/connectivity/source/inc/TSkipDeletedSet.hxx @@ -98,7 +98,7 @@ namespace connectivity @return the last position */ inline sal_Int32 getLastPosition() const { return m_aBookmarksPositions.size(); } - inline void SetDeleted(bool _bDeletedVisible) { m_bDeletedVisible = _bDeletedVisible; } + inline void SetDeletedVisible(bool _bDeletedVisible) { m_bDeletedVisible = _bDeletedVisible; } }; } #endif // CONNECTIVITY_SKIPDELETEDSSET_HXX diff --git a/connectivity/source/inc/dbase/DIndexColumns.hxx b/connectivity/source/inc/dbase/DIndexColumns.hxx index be4f2577237e..6ccdb07c12f9 100644 --- a/connectivity/source/inc/dbase/DIndexColumns.hxx +++ b/connectivity/source/inc/dbase/DIndexColumns.hxx @@ -48,7 +48,7 @@ namespace connectivity ODbaseIndexColumns( ODbaseIndex* _pIndex, ::osl::Mutex& _rMutex, const TStringVector &_rVector) - : sdbcx::OCollection(*_pIndex,_pIndex->getTable()->getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(),_rMutex,_rVector) + : sdbcx::OCollection(*_pIndex,_pIndex->getTable()->getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(),_rMutex,_rVector) , m_pIndex(_pIndex) {} diff --git a/connectivity/source/inc/dbase/DIndexes.hxx b/connectivity/source/inc/dbase/DIndexes.hxx index e07e0cb90cb3..7988bd0a2727 100644 --- a/connectivity/source/inc/dbase/DIndexes.hxx +++ b/connectivity/source/inc/dbase/DIndexes.hxx @@ -50,7 +50,7 @@ namespace connectivity virtual void dropObject(sal_Int32 _nPos,const ::rtl::OUString _sElementName); public: ODbaseIndexes(ODbaseTable* _pTable, ::osl::Mutex& _rMutex, - const TStringVector &_rVector) : ODbaseIndexes_BASE(*_pTable,_pTable->getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(),_rMutex,_rVector) + const TStringVector &_rVector) : ODbaseIndexes_BASE(*_pTable,_pTable->getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(),_rMutex,_rVector) , m_pTable(_pTable) {} diff --git a/connectivity/source/inc/file/FColumns.hxx b/connectivity/source/inc/file/FColumns.hxx index 119ad228ad55..81214fbe603a 100644 --- a/connectivity/source/inc/file/FColumns.hxx +++ b/connectivity/source/inc/file/FColumns.hxx @@ -49,7 +49,7 @@ namespace connectivity OColumns( OFileTable* _pTable, ::osl::Mutex& _rMutex, const TStringVector &_rVector - ) : sdbcx::OCollection(*_pTable,_pTable->getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(),_rMutex,_rVector) + ) : sdbcx::OCollection(*_pTable,_pTable->getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(),_rMutex,_rVector) ,m_pTable(_pTable) {} }; diff --git a/connectivity/source/inc/file/FTables.hxx b/connectivity/source/inc/file/FTables.hxx index 4a15985c248b..e5247652e895 100644 --- a/connectivity/source/inc/file/FTables.hxx +++ b/connectivity/source/inc/file/FTables.hxx @@ -46,7 +46,7 @@ namespace connectivity virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException); public: OTables(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _rMetaData,::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex, - const TStringVector &_rVector) : sdbcx::OCollection(_rParent,_rMetaData->storesMixedCaseQuotedIdentifiers(),_rMutex,_rVector) + const TStringVector &_rVector) : sdbcx::OCollection(_rParent,_rMetaData->supportsMixedCaseQuotedIdentifiers(),_rMutex,_rVector) ,m_xMetaData(_rMetaData) {} diff --git a/connectivity/source/inc/flat/EConnection.hxx b/connectivity/source/inc/flat/EConnection.hxx index 3b4fb7e558d6..becd4670f994 100644 --- a/connectivity/source/inc/flat/EConnection.hxx +++ b/connectivity/source/inc/flat/EConnection.hxx @@ -38,6 +38,7 @@ namespace connectivity class OFlatConnection : public file::OConnection { private: + sal_Int32 m_nMaxRowsToScan; sal_Bool m_bHeaderLine; // column names in first row sal_Unicode m_cFieldDelimiter; // look at the name sal_Unicode m_cStringDelimiter; // delimiter for strings m_cStringDelimiter blabla m_cStringDelimiter @@ -55,6 +56,7 @@ namespace connectivity inline sal_Unicode getStringDelimiter() const { return m_cStringDelimiter; } inline sal_Unicode getDecimalDelimiter() const { return m_cDecimalDelimiter; } inline sal_Unicode getThousandDelimiter() const { return m_cThousandDelimiter;} + inline sal_Int32 getMaxRowsToScan() const { return m_nMaxRowsToScan;} // XServiceInfo DECLARE_SERVICE_INFO(); diff --git a/connectivity/source/inc/flat/ETable.hxx b/connectivity/source/inc/flat/ETable.hxx index 1d3aa9302c3d..cdbb902e9458 100644 --- a/connectivity/source/inc/flat/ETable.hxx +++ b/connectivity/source/inc/flat/ETable.hxx @@ -33,6 +33,7 @@ #include "connectivity/CommonTools.hxx" #include #include "file/quotedstring.hxx" +#include namespace connectivity { @@ -67,6 +68,9 @@ namespace connectivity void fillColumns(const ::com::sun::star::lang::Locale& _aLocale); sal_Bool CreateFile(const INetURLObject& aFile, sal_Bool& bCreateMemo); sal_Bool readLine(sal_Int32& _rnCurrentPos); + void impl_fillColumnInfo_nothrow(QuotedTokenizedString& aFirstLine,xub_StrLen& nStartPosFirstLine,xub_StrLen& nStartPosFirstLine2 + ,sal_Int32& io_nType,sal_Int32& io_nPrecisions,sal_Int32& io_nScales,String& o_sTypeName + ,const sal_Unicode cDecimalDelimiter,const sal_Unicode cThousandDelimiter,const CharClass& aCharClass); public: virtual void refreshColumns(); diff --git a/connectivity/source/parse/PColumn.cxx b/connectivity/source/parse/PColumn.cxx index 43e38f5a1674..10f4b5b4bdcf 100644 --- a/connectivity/source/parse/PColumn.cxx +++ b/connectivity/source/parse/PColumn.cxx @@ -28,12 +28,12 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_connectivity.hxx" -#ifndef _CONNECTIVITY_SDBCX_COLUMN_HXX_ #include "connectivity/PColumn.hxx" -#endif #include "connectivity/dbtools.hxx" #include "TConnection.hxx" + #include +#include using namespace ::comphelper; using namespace connectivity; @@ -153,7 +153,7 @@ OParseColumn* OParseColumn::createColumnForResultSet( const Reference< XResultSe _rxResMetaData->getColumnType( _nColumnPos ), _rxResMetaData->isAutoIncrement( _nColumnPos ), _rxResMetaData->isCurrency( _nColumnPos ), - _rxDBMetaData->storesMixedCaseQuotedIdentifiers() + _rxDBMetaData->supportsMixedCaseQuotedIdentifiers() ); pColumn->setTableName( ::dbtools::composeTableName( _rxDBMetaData, _rxResMetaData->getCatalogName( _nColumnPos ), @@ -191,38 +191,85 @@ void OParseColumn::construct() // ----------------------------------------------------------------------------- ::cppu::IPropertyArrayHelper & SAL_CALL OParseColumn::getInfoHelper() { - OSL_ENSURE( !isNew(), "OParseColumn::OOrderColumn: a *new* OrderColumn?" ); + OSL_ENSURE( !isNew(), "OParseColumn::getInfoHelper: a *new* ParseColumn?" ); return *OParseColumn_PROP::getArrayHelper(); } + // ----------------------------------------------------------------------------- -OOrderColumn::OOrderColumn( const Reference& _xColumn - ,sal_Bool _bCase - ,sal_Bool _bAscending) - : connectivity::sdbcx::OColumn( getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))) - , getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME))) - , getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE))) - , getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION))) - , getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE))) - , getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION))) - , getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE))) - , getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))) - , getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT))) - , sal_False - , getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY))) - , _bCase - ) - , m_bAscending(_bAscending) +namespace +{ + ::rtl::OUString lcl_getColumnTableName( const Reference< XPropertySet >& i_parseColumn ) + { + ::rtl::OUString sColumnTableName; + try + { + OSL_VERIFY( i_parseColumn->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_TABLENAME ) ) >>= sColumnTableName ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return sColumnTableName; + } +} + +// ----------------------------------------------------------------------------- +OOrderColumn::OOrderColumn( const Reference& _xColumn, const ::rtl::OUString& i_rOriginatingTableName, + sal_Bool _bCase, sal_Bool _bAscending ) + : connectivity::sdbcx::OColumn( + getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))), + getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME))), + getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE))), + getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION))), + getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE))), + getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION))), + getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE))), + getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))), + getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT))), + sal_False, + getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY))), + _bCase + ) + ,m_bAscending(_bAscending) + ,m_sTableName( i_rOriginatingTableName ) { construct(); } + +// ----------------------------------------------------------------------------- +OOrderColumn::OOrderColumn( const Reference& _xColumn, sal_Bool _bCase, sal_Bool _bAscending ) + : connectivity::sdbcx::OColumn( + getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))), + getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME))), + getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE))), + getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION))), + getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE))), + getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION))), + getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE))), + getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))), + getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT))), + sal_False, + getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY))), + _bCase + ) + ,m_bAscending(_bAscending) + ,m_sTableName( lcl_getColumnTableName( _xColumn ) ) +{ + construct(); +} + // ------------------------------------------------------------------------- OOrderColumn::~OOrderColumn() { } + // ------------------------------------------------------------------------- void OOrderColumn::construct() { - registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISASCENDING),PROPERTY_ID_ISASCENDING,0,&m_bAscending, ::getCppuType(reinterpret_cast< sal_Bool*>(NULL))); + registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISASCENDING), PROPERTY_ID_ISASCENDING, + PropertyAttribute::READONLY, const_cast< sal_Bool* >( &m_bAscending ), ::getCppuType( reinterpret_cast< sal_Bool* >( NULL ) ) ); + registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TABLENAME), PROPERTY_ID_TABLENAME, + PropertyAttribute::READONLY, const_cast< ::rtl::OUString* >( &m_sTableName ), ::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL))); } // ----------------------------------------------------------------------------- ::cppu::IPropertyArrayHelper* OOrderColumn::createArrayHelper() const @@ -232,17 +279,14 @@ void OOrderColumn::construct() // ----------------------------------------------------------------------------- ::cppu::IPropertyArrayHelper & SAL_CALL OOrderColumn::getInfoHelper() { - OSL_ENSURE( !isNew(), "OOrderColumn::OOrderColumn: a *new* OrderColumn?" ); + OSL_ENSURE( !isNew(), "OOrderColumn::getInfoHelper: a *new* OrderColumn?" ); return *OOrderColumn_PROP::getArrayHelper(); } // ----------------------------------------------------------------------------- ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL OOrderColumn::getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException) { ::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(1); - if ( m_bOrder ) - aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdb.OrderColumn"); - else - aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdb.GroupColumn"); + aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdb.OrderColumn"); return aSupported; } diff --git a/connectivity/source/parse/sqliterator.cxx b/connectivity/source/parse/sqliterator.cxx index e1d805e9a1e5..34ba49566383 100644 --- a/connectivity/source/parse/sqliterator.cxx +++ b/connectivity/source/parse/sqliterator.cxx @@ -93,7 +93,7 @@ namespace connectivity OSL_PRECOND( m_xConnection.is(), "OSQLParseTreeIteratorImpl::OSQLParseTreeIteratorImpl: invalid connection!" ); m_xDatabaseMetaData = m_xConnection->getMetaData(); - m_bIsCaseSensitive = m_xDatabaseMetaData.is() && m_xDatabaseMetaData->storesMixedCaseQuotedIdentifiers(); + m_bIsCaseSensitive = m_xDatabaseMetaData.is() && m_xDatabaseMetaData->supportsMixedCaseQuotedIdentifiers(); m_pTables.reset( new OSQLTables( m_bIsCaseSensitive ) ); m_pSubTables.reset( new OSQLTables( m_bIsCaseSensitive ) ); @@ -1910,12 +1910,12 @@ void OSQLParseTreeIterator::setOrderByColumnName(const ::rtl::OUString & rColumn RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::setOrderByColumnName" ); Reference xColumn = findColumn( rColumnName, rTableRange, false ); if ( xColumn.is() ) - m_aOrderColumns->get().push_back(new OOrderColumn(xColumn,isCaseSensitive(),bAscending)); + m_aOrderColumns->get().push_back(new OOrderColumn( xColumn, rTableRange, isCaseSensitive(), bAscending ) ); else { sal_Int32 nId = rColumnName.toInt32(); if ( nId > 0 && nId < static_cast(m_aSelectColumns->get().size()) ) - m_aOrderColumns->get().push_back(new OOrderColumn((m_aSelectColumns->get())[nId-1],isCaseSensitive(),bAscending)); + m_aOrderColumns->get().push_back( new OOrderColumn( ( m_aSelectColumns->get() )[nId-1], isCaseSensitive(), bAscending ) ); } #ifdef SQL_TEST_PARSETREEITERATOR diff --git a/connectivity/source/simpledbt/staticdbtools_s.cxx b/connectivity/source/simpledbt/staticdbtools_s.cxx index 17d052a35b6b..36f9478a3312 100644 --- a/connectivity/source/simpledbt/staticdbtools_s.cxx +++ b/connectivity/source/simpledbt/staticdbtools_s.cxx @@ -29,7 +29,7 @@ #include "precompiled_connectivity.hxx" #include #include "staticdbtools_s.hxx" -#include +#include "connectivity/dbconversion.hxx" #include #include @@ -61,23 +61,23 @@ namespace connectivity } //---------------------------------------------------------------- - double ODataAccessStaticTools::getValue(const Reference< XColumn>& _rxVariant, const Date& rNullDate, sal_Int16 nKeyType) const + double ODataAccessStaticTools::getValue(const Reference< XColumn>& _rxVariant, const Date& rNullDate ) const { - return ::dbtools::DBTypeConversion::getValue(_rxVariant, rNullDate, nKeyType); + return ::dbtools::DBTypeConversion::getValue( _rxVariant, rNullDate ); } //---------------------------------------------------------------- - ::rtl::OUString ODataAccessStaticTools::getValue(const Reference< XColumn >& _rxColumn, const Reference< XNumberFormatter >& _rxFormatter, + ::rtl::OUString ODataAccessStaticTools::getFormattedValue(const Reference< XColumn >& _rxColumn, const Reference< XNumberFormatter >& _rxFormatter, const Date& _rNullDate, sal_Int32 _nKey, sal_Int16 _nKeyType) const { - return ::dbtools::DBTypeConversion::getValue(_rxColumn, _rxFormatter, _rNullDate, _nKey, _nKeyType); + return ::dbtools::DBTypeConversion::getFormattedValue(_rxColumn, _rxFormatter, _rNullDate, _nKey, _nKeyType); } //---------------------------------------------------------------- - ::rtl::OUString ODataAccessStaticTools::getValue( const Reference< XPropertySet>& _rxColumn, const Reference< XNumberFormatter>& _rxFormatter, + ::rtl::OUString ODataAccessStaticTools::getFormattedValue( const Reference< XPropertySet>& _rxColumn, const Reference< XNumberFormatter>& _rxFormatter, const Locale& _rLocale, const Date& _rNullDate ) const { - return ::dbtools::DBTypeConversion::getValue( _rxColumn, _rxFormatter, _rLocale, _rNullDate ); + return ::dbtools::DBTypeConversion::getFormattedValue( _rxColumn, _rxFormatter, _rLocale, _rNullDate ); } //---------------------------------------------------------------- diff --git a/connectivity/source/simpledbt/staticdbtools_s.hxx b/connectivity/source/simpledbt/staticdbtools_s.hxx index 6746ad7a0918..4836f6bf3d12 100644 --- a/connectivity/source/simpledbt/staticdbtools_s.hxx +++ b/connectivity/source/simpledbt/staticdbtools_s.hxx @@ -54,11 +54,10 @@ namespace connectivity // ------------------------------------------------ virtual double getValue( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn>& _rxVariant, - const ::com::sun::star::util::Date& rNullDate, - sal_Int16 nKeyType) const; + const ::com::sun::star::util::Date& rNullDate ) const; // ------------------------------------------------ - virtual ::rtl::OUString getValue( + virtual ::rtl::OUString getFormattedValue( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxColumn, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter, const ::com::sun::star::util::Date& _rNullDate, @@ -66,7 +65,7 @@ namespace connectivity sal_Int16 _nKeyType) const; // ------------------------------------------------ - virtual ::rtl::OUString getValue( + virtual ::rtl::OUString getFormattedValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxColumn, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter>& _rxFormatter, const ::com::sun::star::lang::Locale& _rLocale, diff --git a/desktop/source/deployment/gui/dp_gui_updatedialog.cxx b/desktop/source/deployment/gui/dp_gui_updatedialog.cxx index 154736e1e056..6476667a19d8 100755 --- a/desktop/source/deployment/gui/dp_gui_updatedialog.cxx +++ b/desktop/source/deployment/gui/dp_gui_updatedialog.cxx @@ -43,7 +43,6 @@ #include "com/sun/star/awt/WindowAttribute.hpp" #include "com/sun/star/awt/WindowClass.hpp" #include "com/sun/star/awt/WindowDescriptor.hpp" -#include "com/sun/star/awt/XThrobber.hpp" #include "com/sun/star/awt/XToolkit.hpp" #include "com/sun/star/awt/XWindow.hpp" #include "com/sun/star/awt/XWindowPeer.hpp" @@ -570,6 +569,7 @@ UpdateDialog::UpdateDialog( ModalDialog(parent,DpGuiResId(RID_DLG_UPDATE)), m_context(context), m_checking(this, DpGuiResId(RID_DLG_UPDATE_CHECKING)), + m_throbber(this, DpGuiResId(RID_DLG_UPDATE_THROBBER)), m_update(this, DpGuiResId(RID_DLG_UPDATE_UPDATE)), m_updates( *this, DpGuiResId(RID_DLG_UPDATE_UPDATES), @@ -630,23 +630,6 @@ UpdateDialog::UpdateDialog( } catch (uno::Exception & e) { throw uno::RuntimeException(e.Message, e.Context); } - Control c(this, DpGuiResId(RID_DLG_UPDATE_THROBBER)); - Point pos(c.GetPosPixel()); - Size size(c.GetSizePixel()); - try { - m_throbber = uno::Reference< awt::XThrobber >( - toolkit->createWindow( - awt::WindowDescriptor( - awt::WindowClass_SIMPLE, - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Throbber")), - GetComponentInterface(), 0, - awt::Rectangle( - pos.X(), pos.Y(), size.Width(), size.Height()), - awt::WindowAttribute::SHOW)), - uno::UNO_QUERY_THROW); - } catch (lang::IllegalArgumentException & e) { - throw uno::RuntimeException(e.Message, e.Context); - } m_updates.SetSelectHdl(LINK(this, UpdateDialog, selectionHandler)); m_all.SetToggleHdl(LINK(this, UpdateDialog, allHandler)); m_ok.SetClickHdl(LINK(this, UpdateDialog, okHandler)); @@ -681,7 +664,7 @@ sal_Bool UpdateDialog::Close() { } short UpdateDialog::Execute() { - m_throbber->start(); + m_throbber.start(); m_thread->launch(); return ModalDialog::Execute(); } @@ -880,9 +863,8 @@ void UpdateDialog::addSpecificError( UpdateDialog::SpecificError & data ) void UpdateDialog::checkingDone() { m_checking.Hide(); - m_throbber->stop(); - uno::Reference< awt::XWindow >( - m_throbber, uno::UNO_QUERY_THROW)->setVisible(false); + m_throbber.stop(); + m_throbber.Hide(); if (m_updates.getItemCount() == 0) { clearDescription(); diff --git a/desktop/source/deployment/gui/dp_gui_updatedialog.hxx b/desktop/source/deployment/gui/dp_gui_updatedialog.hxx index fefddd0e4ddc..a3cc76faaee8 100755 --- a/desktop/source/deployment/gui/dp_gui_updatedialog.hxx +++ b/desktop/source/deployment/gui/dp_gui_updatedialog.hxx @@ -46,6 +46,7 @@ #include "vcl/dialog.hxx" #include "vcl/fixed.hxx" #include +#include #include "descedit.hxx" #include "dp_gui_updatedata.hxx" @@ -59,7 +60,6 @@ class ResId; class Window; namespace com { namespace sun { namespace star { - namespace awt { class XThrobber; } namespace deployment { class XExtensionManager; class XPackage; } namespace uno { class XComponentContext; } @@ -184,7 +184,7 @@ private: com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > m_context; FixedText m_checking; - com::sun::star::uno::Reference< com::sun::star::awt::XThrobber > m_throbber; + Throbber m_throbber; FixedText m_update; UpdateDialog::CheckListBox m_updates; CheckBox m_all; diff --git a/desktop/source/deployment/gui/dp_gui_updatedialog.src b/desktop/source/deployment/gui/dp_gui_updatedialog.src index 4da431733e31..90b764d811b2 100755 --- a/desktop/source/deployment/gui/dp_gui_updatedialog.src +++ b/desktop/source/deployment/gui/dp_gui_updatedialog.src @@ -60,11 +60,11 @@ ModalDialog RID_DLG_UPDATE { Right = TRUE; NoLabel = TRUE; }; - Control RID_DLG_UPDATE_THROBBER { + FixedImage RID_DLG_UPDATE_THROBBER { Pos = MAP_APPFONT( RSC_SP_DLG_INNERBORDER_LEFT + LOCAL_WIDTH - RSC_CD_FIXEDTEXT_HEIGHT, RSC_SP_DLG_INNERBORDER_TOP); - Size = MAP_APPFONT(RSC_CD_FIXEDTEXT_HEIGHT, RSC_CD_FIXEDTEXT_HEIGHT); + Size = MAP_APPFONT(RSC_CD_FIXEDTEXT_HEIGHT, RSC_CD_FIXEDTEXT_HEIGHT + 1); }; FixedText RID_DLG_UPDATE_UPDATE { Disable = TRUE; diff --git a/desktop/source/migration/pages.cxx b/desktop/source/migration/pages.cxx index c8164d498e41..eefb529d0ca7 100644 --- a/desktop/source/migration/pages.cxx +++ b/desktop/source/migration/pages.cxx @@ -339,14 +339,13 @@ void MigrationThread::onTerminated() MigrationPage::MigrationPage( svt::OWizardMachine* parent, - const ResId& resid, - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XThrobber > xThrobber) + const ResId& resid, Throbber& i_throbber ) : OWizardPage(parent, resid) , m_ftHead(this, WizardResId(FT_MIGRATION_HEADER)) , m_ftBody(this, WizardResId(FT_MIGRATION_BODY)) , m_cbMigration(this, WizardResId(CB_MIGRATION)) + , m_rThrobber(i_throbber) , m_bMigrationDone(sal_False) - , m_xThrobber(xThrobber) { FreeResource(); _setBold(m_ftHead); @@ -366,9 +365,8 @@ sal_Bool MigrationPage::commitPage( svt::WizardTypes::CommitPageReason _eReason if ( pWizard ) pWizard->DisableButtonsWhileMigration(); - uno::Reference< awt::XWindow > xWin( m_xThrobber, uno::UNO_QUERY ); - xWin->setVisible( true ); - m_xThrobber->start(); + m_rThrobber.Show(); + m_rThrobber.start(); MigrationThread* pMigThread = new MigrationThread(); pMigThread->create(); @@ -377,10 +375,10 @@ sal_Bool MigrationPage::commitPage( svt::WizardTypes::CommitPageReason _eReason Application::Reschedule(); } - m_xThrobber->stop(); + m_rThrobber.stop(); GetParent()->LeaveWait(); // Next state will enable buttons - so no EnableButtons necessary! - xWin->setVisible( false ); + m_rThrobber.Hide(); pMigThread->join(); delete pMigThread; m_bMigrationDone = sal_True; diff --git a/desktop/source/migration/pages.hxx b/desktop/source/migration/pages.hxx index 4981f68bbaa0..47eae23ff58c 100644 --- a/desktop/source/migration/pages.hxx +++ b/desktop/source/migration/pages.hxx @@ -29,17 +29,15 @@ #define _PAGES_HXX_ #include -#include #include #include #include +#include #include #include #include #include -#include - namespace desktop { class WelcomePage : public svt::OWizardPage @@ -120,11 +118,11 @@ class MigrationPage : public svt::OWizardPage private: FixedText m_ftHead; FixedText m_ftBody; - CheckBox m_cbMigration; + CheckBox m_cbMigration; + Throbber& m_rThrobber; sal_Bool m_bMigrationDone; - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XThrobber > m_xThrobber; public: - MigrationPage( svt::OWizardMachine* parent, const ResId& resid, ::com::sun::star::uno::Reference< ::com::sun::star::awt::XThrobber > xThrobber ); + MigrationPage( svt::OWizardMachine* parent, const ResId& resid, Throbber& i_throbber ); virtual sal_Bool commitPage( svt::WizardTypes::CommitPageReason _eReason ); protected: diff --git a/desktop/source/migration/wizard.cxx b/desktop/source/migration/wizard.cxx index 3a4a0069967f..3489d7186b4f 100644 --- a/desktop/source/migration/wizard.cxx +++ b/desktop/source/migration/wizard.cxx @@ -87,16 +87,6 @@ const FirstStartWizard::WizardState FirstStartWizard::STATE_USER = 3; const FirstStartWizard::WizardState FirstStartWizard::STATE_UPDATE_CHECK = 4; const FirstStartWizard::WizardState FirstStartWizard::STATE_REGISTRATION = 5; -static uno::Reference< uno::XComponentContext > getComponentContext( const uno::Reference< lang::XMultiServiceFactory >& rFactory ) -{ - uno::Reference< uno::XComponentContext > rContext; - uno::Reference< beans::XPropertySet > rPropSet( rFactory, uno::UNO_QUERY ); - uno::Any a = rPropSet->getPropertyValue( - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) ); - a >>= rContext; - return rContext; -} - static sal_Int32 getBuildId() { ::rtl::OUString aDefault; @@ -139,54 +129,14 @@ FirstStartWizard::FirstStartWizard( Window* pParent, sal_Bool bLicenseNeedsAccep ,m_bLicenseNeedsAcceptance( bLicenseNeedsAcceptance ) ,m_bLicenseWasAccepted(sal_False) ,m_bAutomaticUpdChk(sal_True) + ,m_aThrobber(this, WizardResId(CTRL_THROBBER)) ,m_aLicensePath( rLicensePath ) { + FreeResource(); // --- - // FreeResource(); // enableState(STATE_USER, sal_False); // enableState(STATE_REGISTRATION, sal_False); - try - { - Point pos(5, 210 ); - Size size(11, 11 ); - - pos = LogicToPixel( pos, MAP_APPFONT ); - size = LogicToPixel( size, MAP_APPFONT ); - - uno::Reference< lang::XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory(); - uno::Reference< awt::XToolkit > xToolkit( - uno::Reference< lang::XMultiComponentFactory >( - xFactory, uno::UNO_QUERY_THROW)-> - createInstanceWithContext( - rtl::OUString( - RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.Toolkit")), - getComponentContext(xFactory)), - uno::UNO_QUERY_THROW); - - m_xThrobber = uno::Reference< awt::XThrobber >( - xToolkit->createWindow( - awt::WindowDescriptor( - awt::WindowClass_SIMPLE, - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Throbber")), - GetComponentInterface(), 0, - awt::Rectangle( - pos.X(), pos.Y(), size.Width(), size.Height()), - awt::WindowAttribute::SHOW)), - uno::UNO_QUERY_THROW); - } - catch (uno::RuntimeException &) - { - throw; - } - catch (Exception& ) - { - } - - uno::Reference< awt::XWindow > xThrobberWin( m_xThrobber, uno::UNO_QUERY ); - if ( xThrobberWin.is() ) - xThrobberWin->setVisible( false ); - Size aTPSize(TP_WIDTH, TP_HEIGHT); SetPageSizePixel(LogicToPixel(aTPSize, MAP_APPFONT)); @@ -352,7 +302,7 @@ TabPage* FirstStartWizard::createPage(WizardState _nState) pTabPage = new LicensePage(this, WizardResId(TP_LICENSE), m_aLicensePath); break; case STATE_MIGRATION: - pTabPage = new MigrationPage(this, WizardResId(TP_MIGRATION), m_xThrobber ); + pTabPage = new MigrationPage(this, WizardResId(TP_MIGRATION), m_aThrobber); break; case STATE_USER: pTabPage = new UserPage(this, WizardResId(TP_USER)); diff --git a/desktop/source/migration/wizard.hrc b/desktop/source/migration/wizard.hrc index fdad97a8174b..8f35488c58b3 100644 --- a/desktop/source/migration/wizard.hrc +++ b/desktop/source/migration/wizard.hrc @@ -79,6 +79,7 @@ #define ED_USER_FATHER 18 #define ED_USER_INITIALS 19 #define TR_WAITING 20 +#define CTRL_THROBBER 21 // global strings #define STR_STATE_WELCOME RID_FIRSTSTSTART_START+100 diff --git a/desktop/source/migration/wizard.hxx b/desktop/source/migration/wizard.hxx index 7e97f7d8e30e..96bd74dcd859 100644 --- a/desktop/source/migration/wizard.hxx +++ b/desktop/source/migration/wizard.hxx @@ -30,9 +30,8 @@ #include #include -#include +#include #include -#include namespace desktop { @@ -76,7 +75,7 @@ private: sal_Bool m_bLicenseWasAccepted; sal_Bool m_bAutomaticUpdChk; Link m_lnkCancel; - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XThrobber > m_xThrobber; + Throbber m_aThrobber; rtl::OUString m_aLicensePath; diff --git a/desktop/source/migration/wizard.src b/desktop/source/migration/wizard.src index e690e130c74f..78bd3a0e8197 100644 --- a/desktop/source/migration/wizard.src +++ b/desktop/source/migration/wizard.src @@ -42,6 +42,13 @@ ModalDialog DLG_FIRSTSTART_WIZARD Closeable = TRUE ; Hide = TRUE; HelpID = HID_FIRSTSTART_DIALOG; + + FixedImage CTRL_THROBBER + { + Pos = MAP_APPFONT( 5, 210 ); + Size = MAP_APPFONT( 11, 11 ); + Hide = TRUE; + }; }; String STR_STATE_WELCOME diff --git a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx index ed446afe4a12..b845ed189aad 100644 --- a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx @@ -1379,6 +1379,7 @@ namespace drawinglayer { // need to handle PolyPolygonHatchPrimitive2D here to support XPATHFILL_SEQ_BEGIN/XPATHFILL_SEQ_END const primitive2d::PolyPolygonHatchPrimitive2D& rHatchCandidate = static_cast< const primitive2d::PolyPolygonHatchPrimitive2D& >(rCandidate); + const attribute::FillHatchAttribute& rFillHatchAttribute = rHatchCandidate.getFillHatch(); basegfx::B2DPolyPolygon aLocalPolyPolygon(rHatchCandidate.getB2DPolyPolygon()); // #i112245# Metafiles use tools Polygon and are not able to have more than 65535 points @@ -1386,8 +1387,20 @@ namespace drawinglayer while(fillPolyPolygonNeededToBeSplit(aLocalPolyPolygon)) ; + if(rFillHatchAttribute.isFillBackground()) + { + // with fixing #i111954# (see below) the possible background + // fill of a hatched object was lost.Generate a background fill + // primitive and render it + const primitive2d::Primitive2DReference xBackground( + new primitive2d::PolyPolygonColorPrimitive2D( + aLocalPolyPolygon, + rHatchCandidate.getBackgroundColor())); + + process(primitive2d::Primitive2DSequence(&xBackground, 1)); + } + SvtGraphicFill* pSvtGraphicFill = 0; - const attribute::FillHatchAttribute& rFillHatchAttribute = rHatchCandidate.getFillHatch(); aLocalPolyPolygon.transform(maCurrentTransformation); if(!mnSvtGraphicFillCount && aLocalPolyPolygon.count()) diff --git a/editeng/inc/editeng/editeng.hxx b/editeng/inc/editeng/editeng.hxx index bd90849271e6..d046b77d98b3 100755 --- a/editeng/inc/editeng/editeng.hxx +++ b/editeng/inc/editeng/editeng.hxx @@ -33,7 +33,6 @@ class EditView; class OutputDevice; class EditUndo; class SvxFont; -class SfxUndoManager; class SfxItemPool; class SfxStyleSheet; class String; @@ -83,6 +82,9 @@ namespace svx{ struct SpellPortion; typedef std::vector SpellPortions; } +namespace svl{ +class IUndoManager; +} namespace basegfx { class B2DPolyPolygon; } #include @@ -268,10 +270,11 @@ public: void ShowParagraph( sal_uInt16 nParagraph, sal_Bool bShow = sal_True ); sal_Bool IsParagraphVisible( sal_uInt16 nParagraph ); - SfxUndoManager& GetUndoManager(); + ::svl::IUndoManager& + GetUndoManager(); void UndoActionStart( sal_uInt16 nId ); void UndoActionEnd( sal_uInt16 nId ); - sal_Bool IsInUndo(); + sal_Bool IsInUndo(); void EnableUndo( sal_Bool bEnable ); sal_Bool IsUndoEnabled(); diff --git a/editeng/inc/editeng/editund2.hxx b/editeng/inc/editeng/editund2.hxx index b42ab9f9cf9d..52986e6ee1e4 100644 --- a/editeng/inc/editeng/editund2.hxx +++ b/editeng/inc/editeng/editund2.hxx @@ -33,7 +33,7 @@ class ImpEditEngine; -class EDITENG_DLLPUBLIC EditUndoManager : public SfxUndoManager +class EDITENG_DLLPRIVATE EditUndoManager : public SfxUndoManager { using SfxUndoManager::Undo; using SfxUndoManager::Redo; @@ -43,8 +43,8 @@ private: public: EditUndoManager( ImpEditEngine* pImpEE ); - virtual sal_Bool Undo( sal_uInt16 nCount=1 ); - virtual sal_Bool Redo( sal_uInt16 nCount=1 ); + virtual sal_Bool Undo(); + virtual sal_Bool Redo(); }; // ----------------------------------------------------------------------- diff --git a/editeng/inc/editeng/outliner.hxx b/editeng/inc/editeng/outliner.hxx index 3995b0ce29f4..a14d688864eb 100644 --- a/editeng/inc/editeng/outliner.hxx +++ b/editeng/inc/editeng/outliner.hxx @@ -74,10 +74,15 @@ class SfxItemSet; class SvxNumBulletItem; class SvxNumberFormat; class SvxLRSpaceItem; -class SfxUndoManager; class EditEngine; class SvKeyValueIterator; class SvxForbiddenCharactersTable; + +namespace svl +{ + class IUndoManager; +} + #include #include @@ -938,7 +943,8 @@ public: // nFormat muss ein Wert aus dem enum EETextFormat sein (wg.CLOOKS) sal_uLong Read( SvStream& rInput, const String& rBaseURL, sal_uInt16, SvKeyValueIterator* pHTTPHeaderAttrs = NULL ); - SfxUndoManager& GetUndoManager(); + ::svl::IUndoManager& + GetUndoManager(); void QuickSetAttribs( const SfxItemSet& rSet, const ESelection& rSel ); void QuickInsertField( const SvxFieldItem& rFld, const ESelection& rSel ); diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx index a8c049ddc636..812625b69771 100644 --- a/editeng/source/editeng/editeng.cxx +++ b/editeng/source/editeng/editeng.cxx @@ -145,7 +145,7 @@ sal_Bool EditEngine::IsInUndo() return pImpEditEngine->IsInUndo(); } -SfxUndoManager& EditEngine::GetUndoManager() +::svl::IUndoManager& EditEngine::GetUndoManager() { DBG_CHKTHIS( EditEngine, 0 ); return pImpEditEngine->GetUndoManager(); diff --git a/editeng/source/editeng/editundo.cxx b/editeng/source/editeng/editundo.cxx index effe21f7a4f0..4b173f39082d 100644 --- a/editeng/source/editeng/editundo.cxx +++ b/editeng/source/editeng/editundo.cxx @@ -74,7 +74,7 @@ EditUndoManager::EditUndoManager( ImpEditEngine* p ) pImpEE = p; } -sal_Bool __EXPORT EditUndoManager::Undo( sal_uInt16 nCount ) +sal_Bool __EXPORT EditUndoManager::Undo() { if ( GetUndoActionCount() == 0 ) return sal_False; @@ -95,7 +95,7 @@ sal_Bool __EXPORT EditUndoManager::Undo( sal_uInt16 nCount ) pImpEE->GetActiveView()->GetImpEditView()->DrawSelection(); // alte Selektion entfernen pImpEE->SetUndoMode( sal_True ); - sal_Bool bDone = SfxUndoManager::Undo( nCount ); + sal_Bool bDone = SfxUndoManager::Undo(); pImpEE->SetUndoMode( sal_False ); EditSelection aNewSel( pImpEE->GetActiveView()->GetImpEditView()->GetEditSelection() ); @@ -109,7 +109,7 @@ sal_Bool __EXPORT EditUndoManager::Undo( sal_uInt16 nCount ) return bDone; } -sal_Bool __EXPORT EditUndoManager::Redo( sal_uInt16 nCount ) +sal_Bool __EXPORT EditUndoManager::Redo() { if ( GetRedoActionCount() == 0 ) return sal_False; @@ -130,7 +130,7 @@ sal_Bool __EXPORT EditUndoManager::Redo( sal_uInt16 nCount ) pImpEE->GetActiveView()->GetImpEditView()->DrawSelection(); // alte Selektion entfernen pImpEE->SetUndoMode( sal_True ); - sal_Bool bDone = SfxUndoManager::Redo( nCount ); + sal_Bool bDone = SfxUndoManager::Redo(); pImpEE->SetUndoMode( sal_False ); EditSelection aNewSel( pImpEE->GetActiveView()->GetImpEditView()->GetEditSelection() ); diff --git a/editeng/source/editeng/impedit5.cxx b/editeng/source/editeng/impedit5.cxx index 40aa2dfeb87d..9ee95bc019a1 100644 --- a/editeng/source/editeng/impedit5.cxx +++ b/editeng/source/editeng/impedit5.cxx @@ -310,7 +310,7 @@ sal_Bool ImpEditEngine::Undo( EditView* pView ) if ( HasUndoManager() && GetUndoManager().GetUndoActionCount() ) { SetActiveView( pView ); - GetUndoManager().Undo( 1 ); + GetUndoManager().Undo(); return sal_True; } return sal_False; @@ -321,7 +321,7 @@ sal_Bool ImpEditEngine::Redo( EditView* pView ) if ( HasUndoManager() && GetUndoManager().GetRedoActionCount() ) { SetActiveView( pView ); - GetUndoManager().Redo( 0 ); + GetUndoManager().Redo(); return sal_True; } return sal_False; diff --git a/editeng/source/outliner/outliner.cxx b/editeng/source/outliner/outliner.cxx index 2c2ba69dce94..9d749b20e6f1 100644 --- a/editeng/source/outliner/outliner.cxx +++ b/editeng/source/outliner/outliner.cxx @@ -1227,7 +1227,7 @@ void Outliner::ImpFilterIndents( sal_uLong nFirstPara, sal_uLong nLastPara ) pEditEngine->SetUpdateMode( bUpdate ); } -SfxUndoManager& Outliner::GetUndoManager() +::svl::IUndoManager& Outliner::GetUndoManager() { DBG_CHKTHIS(Outliner,0); return pEditEngine->GetUndoManager(); diff --git a/embeddedobj/source/commonembedding/embedobj.cxx b/embeddedobj/source/commonembedding/embedobj.cxx index 2a56a0acb52a..a459c0ad9bd3 100644 --- a/embeddedobj/source/commonembedding/embedobj.cxx +++ b/embeddedobj/source/commonembedding/embedobj.cxx @@ -235,7 +235,10 @@ void OCommonEmbeddedObject::SwitchStateTo_Impl( sal_Int32 nNextState ) if ( nNextState == embed::EmbedStates::INPLACE_ACTIVE ) { if ( !m_xClientSite.is() ) - throw embed::WrongStateException(); //TODO: client site is not set! + throw embed::WrongStateException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "client site not set, yet" ) ), + *this + ); uno::Reference< embed::XInplaceClient > xInplaceClient( m_xClientSite, uno::UNO_QUERY ); if ( xInplaceClient.is() && xInplaceClient->canInplaceActivate() ) diff --git a/framework/Library_fwe.mk b/framework/Library_fwe.mk index 013fe5bbf56c..86abf25f4f95 100644 --- a/framework/Library_fwe.mk +++ b/framework/Library_fwe.mk @@ -77,6 +77,8 @@ $(eval $(call gb_Library_add_exception_objects,fwe,\ framework/source/fwe/helper/imageproducer \ framework/source/fwe/helper/propertysetcontainer \ framework/source/fwe/helper/titlehelper \ + framework/source/fwe/helper/documentundoguard \ + framework/source/fwe/helper/undomanagerhelper \ framework/source/fwe/helper/uiconfigelementwrapperbase \ framework/source/fwe/helper/uielementwrapperbase \ framework/source/fwe/interaction/preventduplicateinteraction \ diff --git a/framework/Package_inc.mk b/framework/Package_inc.mk index adefc3ccbd56..9db346cf1acf 100644 --- a/framework/Package_inc.mk +++ b/framework/Package_inc.mk @@ -34,6 +34,10 @@ $(eval $(call gb_Package_add_file,framework_inc,inc/framework/bmkmenu.hxx,framew $(eval $(call gb_Package_add_file,framework_inc,inc/framework/configimporter.hxx,framework/configimporter.hxx)) $(eval $(call gb_Package_add_file,framework_inc,inc/framework/eventsconfiguration.hxx,framework/eventsconfiguration.hxx)) $(eval $(call gb_Package_add_file,framework_inc,inc/framework/framelistanalyzer.hxx,framework/framelistanalyzer.hxx)) +$(eval $(call gb_Package_add_file,framework_inc,inc/framework/documentundoguard.hxx,framework/documentundoguard.hxx)) +$(eval $(call gb_Package_add_file,framework_inc,inc/framework/undomanagerhelper.hxx,framework/undomanagerhelper.hxx)) +$(eval $(call gb_Package_add_file,framework_inc,inc/framework/imutex.hxx,framework/imutex.hxx)) +$(eval $(call gb_Package_add_file,framework_inc,inc/framework/iguard.hxx,framework/iguard.hxx)) $(eval $(call gb_Package_add_file,framework_inc,inc/framework/imageproducer.hxx,framework/imageproducer.hxx)) $(eval $(call gb_Package_add_file,framework_inc,inc/framework/imagesconfiguration.hxx,framework/imagesconfiguration.hxx)) $(eval $(call gb_Package_add_file,framework_inc,inc/framework/interaction.hxx,framework/interaction.hxx)) diff --git a/framework/inc/framework/documentundoguard.hxx b/framework/inc/framework/documentundoguard.hxx new file mode 100755 index 000000000000..da2976e895e1 --- /dev/null +++ b/framework/inc/framework/documentundoguard.hxx @@ -0,0 +1,70 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef FRAMEWORK_DOCUMENTUNDOGUARD_HXX +#define FRAMEWORK_DOCUMENTUNDOGUARD_HXX + +#include "framework/fwedllapi.h" + +/** === begin UNO includes === **/ +#include +/** === end UNO includes === **/ + +#include + +//...................................................................................................................... +namespace framework +{ +//...................................................................................................................... + + //================================================================================================================== + //= DocumentUndoGuard + //================================================================================================================== + struct DocumentUndoGuard_Data; + /** a helper class guarding the Undo manager of a document + + This class guards, within a given scope, the Undo Manager of a document (or another component supporting + the XUndoManagerSupplier interface). When entering the scope (i.e. when the DocumentUndoGuard + instances is constructed), the current state of the undo contexts of the undo manager is examined. + Upon leaving the scope (i.e. when the DocumentUndoGuard is destructed), the guard will execute + as many calls to XUndoManager::leaveUndoContext as are + necessary to restore the manager's initial state. + */ + class FWE_DLLPUBLIC DocumentUndoGuard + { + public: + DocumentUndoGuard( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& i_undoSupplierComponent ); + ~DocumentUndoGuard(); + + private: + ::boost::scoped_ptr< DocumentUndoGuard_Data > m_pData; + }; + +//...................................................................................................................... +} // namespace framework +//...................................................................................................................... + +#endif // FRAMEWORK_DOCUMENTUNDOGUARD_HXX diff --git a/framework/inc/framework/iguard.hxx b/framework/inc/framework/iguard.hxx new file mode 100755 index 000000000000..7c00858b208d --- /dev/null +++ b/framework/inc/framework/iguard.hxx @@ -0,0 +1,69 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef __FRAMEWORK_THREADHELP_IGUARD_H_ +#define __FRAMEWORK_THREADHELP_IGUARD_H_ + +//_________________________________________________________________________________________________________________ +// includes +//_________________________________________________________________________________________________________________ + +#include + +//_________________________________________________________________________________________________________________ +// namespace +//_________________________________________________________________________________________________________________ + +namespace framework{ + +//_________________________________________________________________________________________________________________ +// declarations +//_________________________________________________________________________________________________________________ + +/*-************************************************************************************************************//** + @descr interface for guarding a lock +*//*-*************************************************************************************************************/ +class SAL_NO_VTABLE IGuard +{ + //------------------------------------------------------------------------------------------------------------- + // public methods + //------------------------------------------------------------------------------------------------------------- + public: + + /** clears the lock. If the guard does not currently hold the lock, nothing happens. + */ + virtual void clear() = 0; + + /** attempts to re-establishes the lock, blocking until the attempt is successful. + */ + virtual void reset() = 0; + +}; // class IGuard + +} // namespace framework + +#endif // #ifndef __FRAMEWORK_THREADHELP_IGUARD_H_ diff --git a/framework/inc/threadhelp/imutex.h b/framework/inc/framework/imutex.hxx similarity index 98% rename from framework/inc/threadhelp/imutex.h rename to framework/inc/framework/imutex.hxx index 70784c312b87..5466edc4cf76 100644 --- a/framework/inc/threadhelp/imutex.h +++ b/framework/inc/framework/imutex.hxx @@ -32,6 +32,8 @@ // includes //_________________________________________________________________________________________________________________ +#include + //_________________________________________________________________________________________________________________ // namespace //_________________________________________________________________________________________________________________ @@ -45,7 +47,7 @@ namespace framework{ /*-************************************************************************************************************//** @descr We need this interface to support using of different mutex implementations in a generic way. *//*-*************************************************************************************************************/ -class IMutex +class SAL_NO_VTABLE IMutex { //------------------------------------------------------------------------------------------------------------- // public methods diff --git a/framework/inc/framework/undomanagerhelper.hxx b/framework/inc/framework/undomanagerhelper.hxx new file mode 100755 index 000000000000..9cd7266b33c8 --- /dev/null +++ b/framework/inc/framework/undomanagerhelper.hxx @@ -0,0 +1,160 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef FRAMEWORK_UNDOMANAGERHELPER_HXX +#define FRAMEWORK_UNDOMANAGERHELPER_HXX + +#include "framework/fwedllapi.h" +#include "framework/iguard.hxx" +#include "framework/imutex.hxx" + +/** === begin UNO includes === **/ +#include +#include +/** === end UNO includes === **/ + +#include + +namespace svl +{ + class IUndoManager; +} + +//...................................................................................................................... +namespace framework +{ +//...................................................................................................................... + + //================================================================================================================== + //= IMutexGuard + //================================================================================================================== + class SAL_NO_VTABLE IMutexGuard : public IGuard + { + public: + /** returns the mutex guarded by the instance. + + Even if the guard currently has not a lock on the mutex, this method must succeed. + */ + virtual IMutex& getGuardedMutex() = 0; + }; + + //================================================================================================================== + //= IUndoManagerImplementation + //================================================================================================================== + class SAL_NO_VTABLE IUndoManagerImplementation + { + public: + /** returns the IUndoManager interface to the actual Undo stack + + @throws com::sun::star::lang::DisposedException + when the instance is already disposed, and no IUndoManager can be provided + + @throws com::sun::star::lang::NotInitializedException + when the instance is not initialized, yet, and no IUndoManager can be provided + */ + virtual ::svl::IUndoManager& getImplUndoManager() = 0; + + /** provides access to an UNO interface for the XUndoManager implementation. Used when throwing exceptions. + */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::document::XUndoManager > + getThis() = 0; + }; + + //================================================================================================================== + //= UndoManagerHelper + //================================================================================================================== + class UndoManagerHelper_Impl; + /** helper class for implementing an XUndoManager + + Several of the methods of the class take an IMutexGuard instance. It is assumed that this guard has a lock on + its mutext at the moment the method is entered. The lock will be released before any notifications to the + registered XUndoManagerListeners happen. + + The following locking strategy is used for this mutex: +
  • Any notifications to the registered XUndoManagerListeners are after the guard has been cleared. i.e. + without the mutex being locked.

    +
  • Any calls into the IUndoManager implementation is made without the mutex being locked. + Note that this implies that the IUndoManager implementation must be thread-safe in itself + (which is true for the default implementation, SfxUndoManager).
  • +
  • An exception to the previous item are the IUndoManager::Undo and + IUndoManager::Redo methods: They're called with the given external mutex being + locked.
  • +
+ + The reason for the exception for IUndoManager::Undo and IUndoManager::Redo is that those are expected to + modify the actual document which the UndoManager works for. And as long as our documents are not thread-safe, + and as long as we do not re-fit all existing SfxUndoImplementations to not expect + the dreaded SolarMutex being locked when they're called, the above behavior is a compromise between "how it should + be" and "how it can realistically be". + */ + class FWE_DLLPUBLIC UndoManagerHelper + { + public: + UndoManagerHelper( IUndoManagerImplementation& i_undoManagerImpl ); + ~UndoManagerHelper(); + + // life time control + void disposing(); + + // XUndoManager equivalents + void enterUndoContext( const ::rtl::OUString& i_title, IMutexGuard& i_instanceLock ); + void enterHiddenUndoContext( IMutexGuard& i_instanceLock ); + void leaveUndoContext( IMutexGuard& i_instanceLock ); + void addUndoAction( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XUndoAction >& i_action, IMutexGuard& i_instanceLock ); + void undo( IMutexGuard& i_instanceLock ); + void redo( IMutexGuard& i_instanceLock ); + ::sal_Bool isUndoPossible() const; + ::sal_Bool isRedoPossible() const; + ::rtl::OUString getCurrentUndoActionTitle() const; + ::rtl::OUString getCurrentRedoActionTitle() const; + ::com::sun::star::uno::Sequence< ::rtl::OUString > + getAllUndoActionTitles() const; + ::com::sun::star::uno::Sequence< ::rtl::OUString > + getAllRedoActionTitles() const; + void clear( IMutexGuard& i_instanceLock ); + void clearRedo( IMutexGuard& i_instanceLock ); + void reset( IMutexGuard& i_instanceLock ); + void addUndoManagerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XUndoManagerListener >& i_listener ); + void removeUndoManagerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XUndoManagerListener >& i_listener ); + + // XLockable, base of XUndoManager, equivalents + void lock(); + void unlock(); + ::sal_Bool isLocked(); + + // XModifyBroadcaster equivalents + void addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& i_listener ); + void removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& i_listener ); + + private: + ::boost::scoped_ptr< UndoManagerHelper_Impl > m_pImpl; + }; + +//...................................................................................................................... +} // namespace framework +//...................................................................................................................... + +#endif // FRAMEWORK_UNDOMANAGERHELPER_HXX diff --git a/framework/inc/threadhelp/lockhelper.hxx b/framework/inc/threadhelp/lockhelper.hxx index d6ebae6d4b9c..0210ad975c29 100644 --- a/framework/inc/threadhelp/lockhelper.hxx +++ b/framework/inc/threadhelp/lockhelper.hxx @@ -33,7 +33,7 @@ //_________________________________________________________________________________________________________________ #include -#include +#include #include #include diff --git a/framework/inc/threadhelp/resetableguard.hxx b/framework/inc/threadhelp/resetableguard.hxx index 58830189e052..3b88294a80e3 100644 --- a/framework/inc/threadhelp/resetableguard.hxx +++ b/framework/inc/threadhelp/resetableguard.hxx @@ -33,7 +33,7 @@ //_________________________________________________________________________________________________________________ #include -#include +#include //#ifndef __FRAMEWORK_THREADHELP_THREADHELPBASE_HXX_ //#include diff --git a/framework/source/fwe/helper/documentundoguard.cxx b/framework/source/fwe/helper/documentundoguard.cxx new file mode 100755 index 000000000000..91265cf45170 --- /dev/null +++ b/framework/source/fwe/helper/documentundoguard.cxx @@ -0,0 +1,271 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "precompiled_framework.hxx" + +#include "framework/documentundoguard.hxx" + +/** === begin UNO includes === **/ +#include +/** === end UNO includes === **/ + +#include +#include +#include + +//...................................................................................................................... +namespace framework +{ +//...................................................................................................................... + + /** === begin UNO using === **/ + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Any; + using ::com::sun::star::uno::makeAny; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::uno::Type; + using ::com::sun::star::document::XUndoManagerSupplier; + using ::com::sun::star::document::XUndoManager; + using ::com::sun::star::document::XUndoManagerListener; + using ::com::sun::star::document::UndoManagerEvent; + using ::com::sun::star::lang::EventObject; + /** === end UNO using === **/ + + //================================================================================================================== + //= UndoManagerContextListener + //================================================================================================================== + typedef ::cppu::WeakImplHelper1 < XUndoManagerListener + > UndoManagerContextListener_Base; + class UndoManagerContextListener : public UndoManagerContextListener_Base + { + public: + UndoManagerContextListener( const Reference< XUndoManager >& i_undoManager ) + :m_xUndoManager( i_undoManager, UNO_QUERY_THROW ) + ,m_nRelativeContextDepth( 0 ) + ,m_documentDisposed( false ) + { + osl_incrementInterlockedCount( &m_refCount ); + { + m_xUndoManager->addUndoManagerListener( this ); + } + osl_decrementInterlockedCount( &m_refCount ); + } + + UndoManagerContextListener() + { + } + + void finish() + { + OSL_ENSURE( m_nRelativeContextDepth >= 0, "UndoManagerContextListener: more contexts left than entered?" ); + + if ( m_documentDisposed ) + return; + + // work with a copy of m_nRelativeContextDepth, to be independent from possible bugs in the + // listener notifications (where it would be decremented with every leaveUndoContext) + sal_Int32 nDepth = m_nRelativeContextDepth; + while ( nDepth-- > 0 ) + { + m_xUndoManager->leaveUndoContext(); + } + m_xUndoManager->removeUndoManagerListener( this ); + } + + // XUndoManagerListener + virtual void SAL_CALL undoActionAdded( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL actionUndone( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL actionRedone( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL allActionsCleared( const EventObject& i_event ) throw (RuntimeException); + virtual void SAL_CALL redoActionsCleared( const EventObject& i_event ) throw (RuntimeException); + virtual void SAL_CALL resetAll( const EventObject& i_event ) throw (RuntimeException); + virtual void SAL_CALL enteredContext( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL enteredHiddenContext( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL leftContext( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL leftHiddenContext( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL cancelledContext( const UndoManagerEvent& i_event ) throw (RuntimeException); + + // XEventListener + virtual void SAL_CALL disposing( const EventObject& i_event ) throw (RuntimeException); + + private: + Reference< XUndoManager > const m_xUndoManager; + oslInterlockedCount m_nRelativeContextDepth; + bool m_documentDisposed; + }; + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::undoActionAdded( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + // not interested in + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::actionUndone( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + // not interested in + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::actionRedone( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + // not interested in + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::allActionsCleared( const EventObject& i_event ) throw (RuntimeException) + { + (void)i_event; + // not interested in + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::redoActionsCleared( const EventObject& i_event ) throw (RuntimeException) + { + (void)i_event; + // not interested in + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::resetAll( const EventObject& i_event ) throw (RuntimeException) + { + (void)i_event; + m_nRelativeContextDepth = 0; + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::enteredContext( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + osl_incrementInterlockedCount( &m_nRelativeContextDepth ); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::enteredHiddenContext( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + osl_incrementInterlockedCount( &m_nRelativeContextDepth ); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::leftContext( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + osl_decrementInterlockedCount( &m_nRelativeContextDepth ); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::leftHiddenContext( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + osl_decrementInterlockedCount( &m_nRelativeContextDepth ); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::cancelledContext( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + osl_decrementInterlockedCount( &m_nRelativeContextDepth ); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::disposing( const EventObject& i_event ) throw (RuntimeException) + { + (void)i_event; + m_documentDisposed = true; + } + + //================================================================================================================== + //= DocumentUndoGuard_Data + //================================================================================================================== + struct DocumentUndoGuard_Data + { + Reference< XUndoManager > xUndoManager; + ::rtl::Reference< UndoManagerContextListener > pContextListener; + }; + + namespace + { + //-------------------------------------------------------------------------------------------------------------- + void lcl_init( DocumentUndoGuard_Data& i_data, const Reference< XInterface >& i_undoSupplierComponent ) + { + try + { + Reference< XUndoManagerSupplier > xUndoSupplier( i_undoSupplierComponent, UNO_QUERY ); + if ( xUndoSupplier.is() ) + i_data.xUndoManager.set( xUndoSupplier->getUndoManager(), UNO_QUERY_THROW ); + + if ( i_data.xUndoManager.is() ) + i_data.pContextListener.set( new UndoManagerContextListener( i_data.xUndoManager ) ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + + //-------------------------------------------------------------------------------------------------------------- + void lcl_restore( DocumentUndoGuard_Data& i_data ) + { + try + { + if ( i_data.pContextListener.is() ) + i_data.pContextListener->finish(); + i_data.pContextListener.clear(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + } + + //================================================================================================================== + //= DocumentUndoGuard + //================================================================================================================== + //------------------------------------------------------------------------------------------------------------------ + DocumentUndoGuard::DocumentUndoGuard( const Reference< XInterface >& i_undoSupplierComponent ) + :m_pData( new DocumentUndoGuard_Data ) + { + lcl_init( *m_pData, i_undoSupplierComponent ); + } + + DocumentUndoGuard::~DocumentUndoGuard() + { + lcl_restore( *m_pData ); + } + +//...................................................................................................................... +} // namespace framework +//...................................................................................................................... diff --git a/framework/source/fwe/helper/undomanagerhelper.cxx b/framework/source/fwe/helper/undomanagerhelper.cxx new file mode 100755 index 000000000000..a37451339234 --- /dev/null +++ b/framework/source/fwe/helper/undomanagerhelper.cxx @@ -0,0 +1,1165 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "precompiled_framework.hxx" + +#include "framework/undomanagerhelper.hxx" + +/** === begin UNO includes === **/ +#include +/** === end UNO includes === **/ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +//...................................................................................................................... +namespace framework +{ +//...................................................................................................................... + + /** === begin UNO using === **/ + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::UNO_SET_THROW; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Any; + using ::com::sun::star::uno::makeAny; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::uno::Type; + using ::com::sun::star::document::XUndoManagerListener; + using ::com::sun::star::document::UndoManagerEvent; + using ::com::sun::star::document::EmptyUndoStackException; + using ::com::sun::star::document::UndoContextNotClosedException; + using ::com::sun::star::document::UndoFailedException; + using ::com::sun::star::util::NotLockedException; + using ::com::sun::star::lang::EventObject; + using ::com::sun::star::document::XUndoAction; + using ::com::sun::star::lang::XComponent; + using ::com::sun::star::document::XUndoManager; + using ::com::sun::star::util::InvalidStateException; + using ::com::sun::star::lang::IllegalArgumentException; + using ::com::sun::star::util::XModifyListener; + /** === end UNO using === **/ + using ::svl::IUndoManager; + + //================================================================================================================== + //= UndoActionWrapper + //================================================================================================================== + class UndoActionWrapper : public SfxUndoAction + { + public: + UndoActionWrapper( + Reference< XUndoAction > const& i_undoAction + ); + virtual ~UndoActionWrapper(); + + virtual String GetComment() const; + virtual void Undo(); + virtual void Redo(); + virtual BOOL CanRepeat(SfxRepeatTarget&) const; + + private: + const Reference< XUndoAction > m_xUndoAction; + }; + + //------------------------------------------------------------------------------------------------------------------ + UndoActionWrapper::UndoActionWrapper( Reference< XUndoAction > const& i_undoAction ) + :SfxUndoAction() + ,m_xUndoAction( i_undoAction ) + { + ENSURE_OR_THROW( m_xUndoAction.is(), "illegal undo action" ); + } + + //------------------------------------------------------------------------------------------------------------------ + UndoActionWrapper::~UndoActionWrapper() + { + try + { + Reference< XComponent > xComponent( m_xUndoAction, UNO_QUERY ); + if ( xComponent.is() ) + xComponent->dispose(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + + //------------------------------------------------------------------------------------------------------------------ + String UndoActionWrapper::GetComment() const + { + String sComment; + try + { + sComment = m_xUndoAction->getTitle(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return sComment; + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoActionWrapper::Undo() + { + m_xUndoAction->undo(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoActionWrapper::Redo() + { + m_xUndoAction->redo(); + } + + //------------------------------------------------------------------------------------------------------------------ + BOOL UndoActionWrapper::CanRepeat(SfxRepeatTarget&) const + { + return FALSE; + } + + //================================================================================================================== + //= UndoManagerRequest + //================================================================================================================== + class UndoManagerRequest : public ::comphelper::AnyEvent + { + public: + UndoManagerRequest( ::boost::function0< void > const& i_request ) + :m_request( i_request ) + ,m_caughtException() + ,m_finishCondition() + { + m_finishCondition.reset(); + } + + void execute() + { + try + { + m_request(); + } + catch( const Exception& ) + { + m_caughtException = ::cppu::getCaughtException(); + } + m_finishCondition.set(); + } + + void wait() + { + m_finishCondition.wait(); + if ( m_caughtException.hasValue() ) + ::cppu::throwException( m_caughtException ); + } + + void cancel( const Reference< XInterface >& i_context ) + { + m_caughtException <<= RuntimeException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Concurrency error: an ealier operation on the stack failed." ) ), + i_context + ); + m_finishCondition.set(); + } + + protected: + ~UndoManagerRequest() + { + } + + private: + ::boost::function0< void > m_request; + Any m_caughtException; + ::osl::Condition m_finishCondition; + }; + + //------------------------------------------------------------------------------------------------------------------ + + //================================================================================================================== + //= UndoManagerHelper_Impl + //================================================================================================================== + class UndoManagerHelper_Impl : public SfxUndoListener + { + private: + ::osl::Mutex m_aMutex; + ::osl::Mutex m_aQueueMutex; + bool m_disposed; + bool m_bAPIActionRunning; + bool m_bProcessingEvents; + ::cppu::OInterfaceContainerHelper m_aUndoListeners; + ::cppu::OInterfaceContainerHelper m_aModifyListeners; + IUndoManagerImplementation& m_rUndoManagerImplementation; + UndoManagerHelper& m_rAntiImpl; + ::std::stack< bool > m_aContextVisibilities; +#if OSL_DEBUG_LEVEL > 0 + ::std::stack< bool > m_aContextAPIFlags; +#endif + ::std::queue< ::rtl::Reference< UndoManagerRequest > > + m_aEventQueue; + + public: + ::osl::Mutex& getMutex() { return m_aMutex; } + + public: + UndoManagerHelper_Impl( UndoManagerHelper& i_antiImpl, IUndoManagerImplementation& i_undoManagerImpl ) + :m_aMutex() + ,m_aQueueMutex() + ,m_disposed( false ) + ,m_bAPIActionRunning( false ) + ,m_bProcessingEvents( false ) + ,m_aUndoListeners( m_aMutex ) + ,m_aModifyListeners( m_aMutex ) + ,m_rUndoManagerImplementation( i_undoManagerImpl ) + ,m_rAntiImpl( i_antiImpl ) + { + getUndoManager().AddUndoListener( *this ); + } + + virtual ~UndoManagerHelper_Impl() + { + } + + //.............................................................................................................. + IUndoManager& getUndoManager() const + { + return m_rUndoManagerImplementation.getImplUndoManager(); + } + + //.............................................................................................................. + Reference< XUndoManager > getXUndoManager() const + { + return m_rUndoManagerImplementation.getThis(); + } + + // SfxUndoListener + virtual void actionUndone( const String& i_actionComment ); + virtual void actionRedone( const String& i_actionComment ); + virtual void undoActionAdded( const String& i_actionComment ); + virtual void cleared(); + virtual void clearedRedo(); + virtual void resetAll(); + virtual void listActionEntered( const String& i_comment ); + virtual void listActionLeft( const String& i_comment ); + virtual void listActionLeftAndMerged(); + virtual void listActionCancelled(); + virtual void undoManagerDying(); + + // public operations + void disposing(); + + void enterUndoContext( const ::rtl::OUString& i_title, const bool i_hidden, IMutexGuard& i_instanceLock ); + void leaveUndoContext( IMutexGuard& i_instanceLock ); + void addUndoAction( const Reference< XUndoAction >& i_action, IMutexGuard& i_instanceLock ); + void undo( IMutexGuard& i_instanceLock ); + void redo( IMutexGuard& i_instanceLock ); + void clear( IMutexGuard& i_instanceLock ); + void clearRedo( IMutexGuard& i_instanceLock ); + void reset( IMutexGuard& i_instanceLock ); + + void addUndoManagerListener( const Reference< XUndoManagerListener >& i_listener ) + { + m_aUndoListeners.addInterface( i_listener ); + } + + void removeUndoManagerListener( const Reference< XUndoManagerListener >& i_listener ) + { + m_aUndoListeners.removeInterface( i_listener ); + } + + void addModifyListener( const Reference< XModifyListener >& i_listener ) + { + m_aModifyListeners.addInterface( i_listener ); + } + + void removeModifyListener( const Reference< XModifyListener >& i_listener ) + { + m_aModifyListeners.removeInterface( i_listener ); + } + + UndoManagerEvent + buildEvent( ::rtl::OUString const& i_title ) const; + + void impl_notifyModified(); + void notify( ::rtl::OUString const& i_title, + void ( SAL_CALL XUndoManagerListener::*i_notificationMethod )( const UndoManagerEvent& ) + ); + void notify( void ( SAL_CALL XUndoManagerListener::*i_notificationMethod )( const UndoManagerEvent& ) ) + { + notify( ::rtl::OUString(), i_notificationMethod ); + } + + void notify( void ( SAL_CALL XUndoManagerListener::*i_notificationMethod )( const EventObject& ) ); + + private: + /// adds a function to be called to the request processor's queue + void impl_processRequest( ::boost::function0< void > const& i_request, IMutexGuard& i_instanceLock ); + + /// impl-versions of the XUndoManager API. + void impl_enterUndoContext( const ::rtl::OUString& i_title, const bool i_hidden ); + void impl_leaveUndoContext(); + void impl_addUndoAction( const Reference< XUndoAction >& i_action ); + void impl_doUndoRedo( IMutexGuard& i_externalLock, const bool i_undo ); + void impl_clear(); + void impl_clearRedo(); + void impl_reset(); + }; + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::disposing() + { + EventObject aEvent; + aEvent.Source = getXUndoManager(); + m_aUndoListeners.disposeAndClear( aEvent ); + m_aModifyListeners.disposeAndClear( aEvent ); + + ::osl::MutexGuard aGuard( m_aMutex ); + + getUndoManager().RemoveUndoListener( *this ); + + m_disposed = true; + } + + //------------------------------------------------------------------------------------------------------------------ + UndoManagerEvent UndoManagerHelper_Impl::buildEvent( ::rtl::OUString const& i_title ) const + { + UndoManagerEvent aEvent; + aEvent.Source = getXUndoManager(); + aEvent.UndoActionTitle = i_title; + aEvent.UndoContextDepth = getUndoManager().GetListActionDepth(); + return aEvent; + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_notifyModified() + { + const EventObject aEvent( getXUndoManager() ); + m_aModifyListeners.notifyEach( &XModifyListener::modified, aEvent ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::notify( ::rtl::OUString const& i_title, + void ( SAL_CALL XUndoManagerListener::*i_notificationMethod )( const UndoManagerEvent& ) ) + { + const UndoManagerEvent aEvent( buildEvent( i_title ) ); + + // TODO: this notification method here is used by UndoManagerHelper_Impl, to multiplex the notifications we + // receive from the IUndoManager. Those notitications are sent with a locked SolarMutex, which means + // we're doing the multiplexing here with a locked SM, too. Which is Bad (TM). + // Fixing this properly would require outsourcing all the notifications into an own thread - which might lead + // to problems of its own, since clients might expect synchronous notifications. + + m_aUndoListeners.notifyEach( i_notificationMethod, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::notify( void ( SAL_CALL XUndoManagerListener::*i_notificationMethod )( const EventObject& ) ) + { + const EventObject aEvent( getXUndoManager() ); + + // TODO: the same comment as in the other notify, regarding SM locking applies here ... + + m_aUndoListeners.notifyEach( i_notificationMethod, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::enterUndoContext( const ::rtl::OUString& i_title, const bool i_hidden, IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_enterUndoContext, + this, + ::boost::cref( i_title ), + i_hidden + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::leaveUndoContext( IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_leaveUndoContext, + this + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::addUndoAction( const Reference< XUndoAction >& i_action, IMutexGuard& i_instanceLock ) + { + if ( !i_action.is() ) + throw IllegalArgumentException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "illegal undo action object" ) ), + getXUndoManager(), + 1 + ); + + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_addUndoAction, + this, + ::boost::ref( i_action ) + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::clear( IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_clear, + this + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::clearRedo( IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_clearRedo, + this + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::reset( IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_reset, + this + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_processRequest( ::boost::function0< void > const& i_request, IMutexGuard& i_instanceLock ) + { + // create the request, and add it to our queue + ::rtl::Reference< UndoManagerRequest > pRequest( new UndoManagerRequest( i_request ) ); + { + ::osl::MutexGuard aQueueGuard( m_aQueueMutex ); + m_aEventQueue.push( pRequest ); + } + + i_instanceLock.clear(); + + if ( m_bProcessingEvents ) + { + // another thread is processing the event queue currently => it will also process the event which we just added + pRequest->wait(); + return; + } + + m_bProcessingEvents = true; + do + { + pRequest.clear(); + { + ::osl::MutexGuard aQueueGuard( m_aQueueMutex ); + if ( m_aEventQueue.empty() ) + { + // reset the flag before releasing the queue mutex, otherwise it's possible that another thread + // could add an event after we release the mutex, but before we reset the flag. If then this other + // thread checks the flag before be reset it, this thread's event would starve. + m_bProcessingEvents = false; + return; + } + pRequest = m_aEventQueue.front(); + m_aEventQueue.pop(); + } + try + { + pRequest->execute(); + pRequest->wait(); + } + catch( ... ) + { + { + // no chance to process further requests, if the current one failed + // => discard them + ::osl::MutexGuard aQueueGuard( m_aQueueMutex ); + while ( !m_aEventQueue.empty() ) + { + pRequest = m_aEventQueue.front(); + m_aEventQueue.pop(); + pRequest->cancel( getXUndoManager() ); + } + m_bProcessingEvents = false; + } + // re-throw the error + throw; + } + } + while ( true ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_enterUndoContext( const ::rtl::OUString& i_title, const bool i_hidden ) + { + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + if ( !rUndoManager.IsUndoEnabled() ) + // ignore this request if the manager is locked + return; + + if ( i_hidden && ( rUndoManager.GetUndoActionCount( IUndoManager::CurrentLevel ) == 0 ) ) + throw EmptyUndoStackException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "can't enter a hidden context without a previous Undo action" ) ), + m_rUndoManagerImplementation.getThis() + ); + + { + ::comphelper::FlagGuard aNotificationGuard( m_bAPIActionRunning ); + rUndoManager.EnterListAction( i_title, ::rtl::OUString() ); + } + + m_aContextVisibilities.push( i_hidden ); + + const UndoManagerEvent aEvent( buildEvent( i_title ) ); + aGuard.clear(); + // <--- SYNCHRONIZED + + m_aUndoListeners.notifyEach( i_hidden ? &XUndoManagerListener::enteredHiddenContext : &XUndoManagerListener::enteredContext, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_leaveUndoContext() + { + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + if ( !rUndoManager.IsUndoEnabled() ) + // ignore this request if the manager is locked + return; + + if ( !rUndoManager.IsInListAction() ) + throw InvalidStateException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "no active undo context" ) ), + getXUndoManager() + ); + + size_t nContextElements = 0; + + const bool isHiddenContext = m_aContextVisibilities.top();; + m_aContextVisibilities.pop(); + + const bool bHadRedoActions = ( rUndoManager.GetRedoActionCount( IUndoManager::TopLevel ) > 0 ); + { + ::comphelper::FlagGuard aNotificationGuard( m_bAPIActionRunning ); + if ( isHiddenContext ) + nContextElements = rUndoManager.LeaveAndMergeListAction(); + else + nContextElements = rUndoManager.LeaveListAction(); + } + const bool bHasRedoActions = ( rUndoManager.GetRedoActionCount( IUndoManager::TopLevel ) > 0 ); + + // prepare notification + void ( SAL_CALL XUndoManagerListener::*notificationMethod )( const UndoManagerEvent& ) = NULL; + + UndoManagerEvent aContextEvent( buildEvent( ::rtl::OUString() ) ); + const EventObject aClearedEvent( getXUndoManager() ); + if ( nContextElements == 0 ) + { + notificationMethod = &XUndoManagerListener::cancelledContext; + } + else if ( isHiddenContext ) + { + notificationMethod = &XUndoManagerListener::leftHiddenContext; + } + else + { + aContextEvent.UndoActionTitle = rUndoManager.GetUndoActionComment( 0, IUndoManager::CurrentLevel ); + notificationMethod = &XUndoManagerListener::leftContext; + } + + aGuard.clear(); + // <--- SYNCHRONIZED + + if ( bHadRedoActions && !bHasRedoActions ) + m_aUndoListeners.notifyEach( &XUndoManagerListener::redoActionsCleared, aClearedEvent ); + m_aUndoListeners.notifyEach( notificationMethod, aContextEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_doUndoRedo( IMutexGuard& i_externalLock, const bool i_undo ) + { + ::osl::Guard< ::framework::IMutex > aExternalGuard( i_externalLock.getGuardedMutex() ); + // note that this assumes that the mutex has been released in the thread which added the + // Undo/Redo request, so we can successfully acquire it + + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + if ( rUndoManager.IsInListAction() ) + throw UndoContextNotClosedException( ::rtl::OUString(), getXUndoManager() ); + + const size_t nElements = i_undo + ? rUndoManager.GetUndoActionCount( IUndoManager::TopLevel ) + : rUndoManager.GetRedoActionCount( IUndoManager::TopLevel ); + if ( nElements == 0 ) + throw EmptyUndoStackException( ::rtl::OUString::createFromAscii( "stack is empty" ), getXUndoManager() ); + + aGuard.clear(); + // <--- SYNCHRONIZED + + try + { + if ( i_undo ) + rUndoManager.Undo(); + else + rUndoManager.Redo(); + } + catch( const RuntimeException& ) { /* allowed to leave here */ throw; } + catch( const UndoFailedException& ) { /* allowed to leave here */ throw; } + catch( const Exception& ) + { + // not allowed to leave + const Any aError( ::cppu::getCaughtException() ); + throw UndoFailedException( ::rtl::OUString(), getXUndoManager(), aError ); + } + + // note that in opposite to all of the other methods, we do *not* have our mutex locked when calling + // into the IUndoManager implementation. This ensures that an actual XUndoAction::undo/redo is also + // called without our mutex being locked. + // As a consequence, we do not set m_bAPIActionRunning here. Instead, our actionUndone/actionRedone methods + // *always* multiplex the event to our XUndoManagerListeners, not only when m_bAPIActionRunning is FALSE (This + // again is different from all other SfxUndoListener methods). + // So, we do not need to do this notification here ourself. + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_addUndoAction( const Reference< XUndoAction >& i_action ) + { + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + if ( !rUndoManager.IsUndoEnabled() ) + // ignore the request if the manager is locked + return; + + const UndoManagerEvent aEventAdd( buildEvent( i_action->getTitle() ) ); + const EventObject aEventClear( getXUndoManager() ); + + const bool bHadRedoActions = ( rUndoManager.GetRedoActionCount( IUndoManager::CurrentLevel ) > 0 ); + { + ::comphelper::FlagGuard aNotificationGuard( m_bAPIActionRunning ); + rUndoManager.AddUndoAction( new UndoActionWrapper( i_action ) ); + } + const bool bHasRedoActions = ( rUndoManager.GetRedoActionCount( IUndoManager::CurrentLevel ) > 0 ); + + aGuard.clear(); + // <--- SYNCHRONIZED + + m_aUndoListeners.notifyEach( &XUndoManagerListener::undoActionAdded, aEventAdd ); + if ( bHadRedoActions && !bHasRedoActions ) + m_aUndoListeners.notifyEach( &XUndoManagerListener::redoActionsCleared, aEventClear ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_clear() + { + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + if ( rUndoManager.IsInListAction() ) + throw UndoContextNotClosedException( ::rtl::OUString(), getXUndoManager() ); + + { + ::comphelper::FlagGuard aNotificationGuard( m_bAPIActionRunning ); + rUndoManager.Clear(); + } + + const EventObject aEvent( getXUndoManager() ); + aGuard.clear(); + // <--- SYNCHRONIZED + + m_aUndoListeners.notifyEach( &XUndoManagerListener::allActionsCleared, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_clearRedo() + { + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + if ( rUndoManager.IsInListAction() ) + throw UndoContextNotClosedException( ::rtl::OUString(), getXUndoManager() ); + + { + ::comphelper::FlagGuard aNotificationGuard( m_bAPIActionRunning ); + rUndoManager.ClearRedo(); + } + + const EventObject aEvent( getXUndoManager() ); + aGuard.clear(); + // <--- SYNCHRONIZED + + m_aUndoListeners.notifyEach( &XUndoManagerListener::redoActionsCleared, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_reset() + { + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + { + ::comphelper::FlagGuard aNotificationGuard( m_bAPIActionRunning ); + rUndoManager.Reset(); + } + + const EventObject aEvent( getXUndoManager() ); + aGuard.clear(); + // <--- SYNCHRONIZED + + m_aUndoListeners.notifyEach( &XUndoManagerListener::resetAll, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::actionUndone( const String& i_actionComment ) + { + UndoManagerEvent aEvent; + aEvent.Source = getXUndoManager(); + aEvent.UndoActionTitle = i_actionComment; + aEvent.UndoContextDepth = 0; // Undo can happen on level 0 only + m_aUndoListeners.notifyEach( &XUndoManagerListener::actionUndone, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::actionRedone( const String& i_actionComment ) + { + UndoManagerEvent aEvent; + aEvent.Source = getXUndoManager(); + aEvent.UndoActionTitle = i_actionComment; + aEvent.UndoContextDepth = 0; // Redo can happen on level 0 only + m_aUndoListeners.notifyEach( &XUndoManagerListener::actionRedone, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::undoActionAdded( const String& i_actionComment ) + { + if ( m_bAPIActionRunning ) + return; + + notify( i_actionComment, &XUndoManagerListener::undoActionAdded ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::cleared() + { + if ( m_bAPIActionRunning ) + return; + + notify( &XUndoManagerListener::allActionsCleared ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::clearedRedo() + { + if ( m_bAPIActionRunning ) + return; + + notify( &XUndoManagerListener::redoActionsCleared ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::resetAll() + { + if ( m_bAPIActionRunning ) + return; + + notify( &XUndoManagerListener::resetAll ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::listActionEntered( const String& i_comment ) + { +#if OSL_DEBUG_LEVEL > 0 + m_aContextAPIFlags.push( m_bAPIActionRunning ); +#endif + + if ( m_bAPIActionRunning ) + return; + + notify( i_comment, &XUndoManagerListener::enteredContext ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::listActionLeft( const String& i_comment ) + { +#if OSL_DEBUG_LEVEL > 0 + const bool bCurrentContextIsAPIContext = m_aContextAPIFlags.top(); + m_aContextAPIFlags.pop(); + OSL_ENSURE( bCurrentContextIsAPIContext == m_bAPIActionRunning, "UndoManagerHelper_Impl::listActionLeft: API and non-API contexts interwoven!" ); +#endif + + if ( m_bAPIActionRunning ) + return; + + notify( i_comment, &XUndoManagerListener::leftContext ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::listActionLeftAndMerged() + { +#if OSL_DEBUG_LEVEL > 0 + const bool bCurrentContextIsAPIContext = m_aContextAPIFlags.top(); + m_aContextAPIFlags.pop(); + OSL_ENSURE( bCurrentContextIsAPIContext == m_bAPIActionRunning, "UndoManagerHelper_Impl::listActionLeftAndMerged: API and non-API contexts interwoven!" ); +#endif + + if ( m_bAPIActionRunning ) + return; + + notify( &XUndoManagerListener::leftHiddenContext ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::listActionCancelled() + { +#if OSL_DEBUG_LEVEL > 0 + const bool bCurrentContextIsAPIContext = m_aContextAPIFlags.top(); + m_aContextAPIFlags.pop(); + OSL_ENSURE( bCurrentContextIsAPIContext == m_bAPIActionRunning, "UndoManagerHelper_Impl::listActionCancelled: API and non-API contexts interwoven!" ); +#endif + + if ( m_bAPIActionRunning ) + return; + + notify( &XUndoManagerListener::cancelledContext ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::undoManagerDying() + { + // TODO: do we need to care? Or is this the responsibility of our owner? + } + + //================================================================================================================== + //= UndoManagerHelper + //================================================================================================================== + //------------------------------------------------------------------------------------------------------------------ + UndoManagerHelper::UndoManagerHelper( IUndoManagerImplementation& i_undoManagerImpl ) + :m_pImpl( new UndoManagerHelper_Impl( *this, i_undoManagerImpl ) ) + { + } + + //------------------------------------------------------------------------------------------------------------------ + UndoManagerHelper::~UndoManagerHelper() + { + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::disposing() + { + m_pImpl->disposing(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::enterUndoContext( const ::rtl::OUString& i_title, IMutexGuard& i_instanceLock ) + { + m_pImpl->enterUndoContext( i_title, false, i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::enterHiddenUndoContext( IMutexGuard& i_instanceLock ) + { + m_pImpl->enterUndoContext( ::rtl::OUString(), true, i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::leaveUndoContext( IMutexGuard& i_instanceLock ) + { + m_pImpl->leaveUndoContext( i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::undo( IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_doUndoRedo, + this, + ::boost::ref( i_instanceLock ), + true + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::redo( IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_doUndoRedo, + this, + ::boost::ref( i_instanceLock ), + false + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::addUndoAction( const Reference< XUndoAction >& i_action, IMutexGuard& i_instanceLock ) + { + m_pImpl->addUndoAction( i_action, i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::undo( IMutexGuard& i_instanceLock ) + { + m_pImpl->undo( i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::redo( IMutexGuard& i_instanceLock ) + { + m_pImpl->redo( i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + ::sal_Bool UndoManagerHelper::isUndoPossible() const + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( m_pImpl->getMutex() ); + IUndoManager& rUndoManager = m_pImpl->getUndoManager(); + if ( rUndoManager.IsInListAction() ) + return sal_False; + return rUndoManager.GetUndoActionCount( IUndoManager::TopLevel ) > 0; + // <--- SYNCHRONIZED + } + + //------------------------------------------------------------------------------------------------------------------ + ::sal_Bool UndoManagerHelper::isRedoPossible() const + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( m_pImpl->getMutex() ); + const IUndoManager& rUndoManager = m_pImpl->getUndoManager(); + if ( rUndoManager.IsInListAction() ) + return sal_False; + return rUndoManager.GetRedoActionCount( IUndoManager::TopLevel ) > 0; + // <--- SYNCHRONIZED + } + + //------------------------------------------------------------------------------------------------------------------ + namespace + { + //.............................................................................................................. + ::rtl::OUString lcl_getCurrentActionTitle( UndoManagerHelper_Impl& i_impl, const bool i_undo ) + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( i_impl.getMutex() ); + + const IUndoManager& rUndoManager = i_impl.getUndoManager(); + const size_t nActionCount = i_undo + ? rUndoManager.GetUndoActionCount( IUndoManager::TopLevel ) + : rUndoManager.GetRedoActionCount( IUndoManager::TopLevel ); + if ( nActionCount == 0 ) + throw EmptyUndoStackException( + i_undo ? ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "no action on the undo stack" ) ) + : ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "no action on the redo stack" ) ), + i_impl.getXUndoManager() + ); + return i_undo + ? rUndoManager.GetUndoActionComment( 0, IUndoManager::TopLevel ) + : rUndoManager.GetRedoActionComment( 0, IUndoManager::TopLevel ); + // <--- SYNCHRONIZED + } + + //.............................................................................................................. + Sequence< ::rtl::OUString > lcl_getAllActionTitles( UndoManagerHelper_Impl& i_impl, const bool i_undo ) + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( i_impl.getMutex() ); + + const IUndoManager& rUndoManager = i_impl.getUndoManager(); + const size_t nCount = i_undo + ? rUndoManager.GetUndoActionCount( IUndoManager::TopLevel ) + : rUndoManager.GetRedoActionCount( IUndoManager::TopLevel ); + + Sequence< ::rtl::OUString > aTitles( nCount ); + for ( size_t i=0; i UndoManagerHelper::getAllUndoActionTitles() const + { + return lcl_getAllActionTitles( *m_pImpl, true ); + } + + //------------------------------------------------------------------------------------------------------------------ + Sequence< ::rtl::OUString > UndoManagerHelper::getAllRedoActionTitles() const + { + return lcl_getAllActionTitles( *m_pImpl, false ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::clear( IMutexGuard& i_instanceLock ) + { + m_pImpl->clear( i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::clearRedo( IMutexGuard& i_instanceLock ) + { + m_pImpl->clearRedo( i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::reset( IMutexGuard& i_instanceLock ) + { + m_pImpl->reset( i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::lock() + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( m_pImpl->getMutex() ); + + IUndoManager& rUndoManager = m_pImpl->getUndoManager(); + rUndoManager.EnableUndo( false ); + // <--- SYNCHRONIZED + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::unlock() + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( m_pImpl->getMutex() ); + + IUndoManager& rUndoManager = m_pImpl->getUndoManager(); + if ( rUndoManager.IsUndoEnabled() ) + throw NotLockedException( ::rtl::OUString::createFromAscii( "Undo manager is not locked" ), m_pImpl->getXUndoManager() ); + rUndoManager.EnableUndo( true ); + // <--- SYNCHRONIZED + } + + //------------------------------------------------------------------------------------------------------------------ + ::sal_Bool UndoManagerHelper::isLocked() + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( m_pImpl->getMutex() ); + + IUndoManager& rUndoManager = m_pImpl->getUndoManager(); + return !rUndoManager.IsUndoEnabled(); + // <--- SYNCHRONIZED + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::addUndoManagerListener( const Reference< XUndoManagerListener >& i_listener ) + { + if ( i_listener.is() ) + m_pImpl->addUndoManagerListener( i_listener ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::removeUndoManagerListener( const Reference< XUndoManagerListener >& i_listener ) + { + if ( i_listener.is() ) + m_pImpl->removeUndoManagerListener( i_listener ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::addModifyListener( const Reference< XModifyListener >& i_listener ) + { + if ( i_listener.is() ) + m_pImpl->addModifyListener( i_listener ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::removeModifyListener( const Reference< XModifyListener >& i_listener ) + { + if ( i_listener.is() ) + m_pImpl->removeModifyListener( i_listener ); + } + +//...................................................................................................................... +} // namespace framework +//...................................................................................................................... diff --git a/linguistic/source/misc2.cxx b/linguistic/source/misc2.cxx index dde8768ac283..dbfbd19f3f55 100644 --- a/linguistic/source/misc2.cxx +++ b/linguistic/source/misc2.cxx @@ -249,7 +249,10 @@ String GetWritableDictionaryURL( const String &rDicName ) aURLObj.Append( rDicName, INetURLObject::ENCODE_ALL ); DBG_ASSERT(!aURLObj.HasError(), "lng : invalid URL"); - return aURLObj.GetMainURL( INetURLObject::DECODE_TO_IURI ); + // NO_DECODE preserves the escape sequences that might be included in aDirName + // depending on the characters used in the path string. (Needed when comparing + // the dictionary URL with GetDictionaryWriteablePath in DicList::createDictionary.) + return aURLObj.GetMainURL( INetURLObject::NO_DECODE ); } diff --git a/officecfg/registry/data/org/openoffice/Office/UI/MathCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/MathCommands.xcu old mode 100644 new mode 100755 index 4ed9be5a3d27..07a717f31442 --- a/officecfg/registry/data/org/openoffice/Office/UI/MathCommands.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/MathCommands.xcu @@ -42,9 +42,6 @@ ~Import Formula... - - 1 -
@@ -111,7 +108,7 @@ - 1 + Zoom 100% 1 @@ -119,7 +116,7 @@ - 2 + Zoom 200% diff --git a/officecfg/registry/schema/org/openoffice/Office/Math.xcs b/officecfg/registry/schema/org/openoffice/Office/Math.xcs old mode 100644 new mode 100755 index 31f6e00a230a..13a566dc6746 --- a/officecfg/registry/schema/org/openoffice/Office/Math.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Math.xcs @@ -316,6 +316,20 @@ 100 + + + Contains settings related to load and save operations. + + + + + TL + When set only symbols used in the current formula will be saved. Otherwise all user defined symbols will be saved in each formula. + + + true + + Contains miscellaneous settings. diff --git a/officecfg/registry/schema/org/openoffice/Office/Scripting.xcs b/officecfg/registry/schema/org/openoffice/Office/Scripting.xcs index b77cb00f8cac..90acb2a110bf 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Scripting.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Scripting.xcs @@ -48,28 +48,5 @@ Lists the registered Scripting Framework runtimes. - - - Specifies display settings for assignment dialogs - - - - Show Basic scripts in assignment dialogs - - false - - - - Show Scripting Framework scripts in assignment dialogs - - true - - - - Use New Tools Configure dialog - - true - - diff --git a/scripting/source/dlgprov/DialogModelProvider.cxx b/scripting/source/dlgprov/DialogModelProvider.cxx new file mode 100644 index 000000000000..fe8da6e511d7 --- /dev/null +++ b/scripting/source/dlgprov/DialogModelProvider.cxx @@ -0,0 +1,196 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_scripting.hxx" + +#include "DialogModelProvider.hxx" +#include "dlgprov.hxx" +#include +#include + + +// component helper namespace +namespace comp_DialogModelProvider { + +namespace css = ::com::sun::star; +using namespace ::com::sun::star; +using namespace awt; +using namespace lang; +using namespace uno; +using namespace script; +using namespace beans; + + +// component and service helper functions: +::rtl::OUString SAL_CALL _getImplementationName(); +css::uno::Sequence< ::rtl::OUString > SAL_CALL _getSupportedServiceNames(); +css::uno::Reference< css::uno::XInterface > SAL_CALL _create( css::uno::Reference< css::uno::XComponentContext > const & context ); + +} // closing component helper namespace + + + +/// anonymous implementation namespace +namespace dlgprov { + +namespace css = ::com::sun::star; +using namespace ::com::sun::star; +using namespace awt; +using namespace lang; +using namespace uno; +using namespace script; +using namespace beans; + + +DialogModelProvider::DialogModelProvider(Reference< XComponentContext > const & context) : + m_xContext(context) +{} + +// lang::XInitialization: +void SAL_CALL DialogModelProvider::initialize(const css::uno::Sequence< uno::Any > & aArguments) throw (css::uno::RuntimeException, css::uno::Exception) +{ + if ( aArguments.getLength() == 1 ) + { + ::rtl::OUString sURL; + if ( !( aArguments[ 0 ] >>= sURL )) + throw css::lang::IllegalArgumentException(); + // Try any other URL with SimpleFileAccess + Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager(), UNO_QUERY_THROW ); + Reference< ucb::XSimpleFileAccess > xSFI = + Reference< ucb::XSimpleFileAccess >( xSMgr->createInstanceWithContext + ( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), m_xContext ), UNO_QUERY ); + + try + { + Reference< io::XInputStream > xInput = xSFI->openFileRead( sURL ); + Reference< resource::XStringResourceManager > xStringResourceManager; + if ( xInput.is() ) + { + xStringResourceManager = dlgprov::lcl_getStringResourceManager(m_xContext,sURL); + Any aDialogSourceURLAny; + aDialogSourceURLAny <<= sURL; + + m_xDialogModel.set( dlgprov::lcl_createDialogModel( m_xContext,xInput , xStringResourceManager, aDialogSourceURLAny ), UNO_QUERY_THROW); + m_xDialogModelProp.set(m_xDialogModel, UNO_QUERY_THROW); + } + } + catch( Exception& ) + {} + //m_sURL = sURL; + } +} + +// container::XElementAccess: +uno::Type SAL_CALL DialogModelProvider::getElementType() throw (css::uno::RuntimeException) +{ + return m_xDialogModel->getElementType(); +} + +::sal_Bool SAL_CALL DialogModelProvider::hasElements() throw (css::uno::RuntimeException) +{ + return m_xDialogModel->hasElements(); +} + +// container::XNameAccess: +uno::Any SAL_CALL DialogModelProvider::getByName(const ::rtl::OUString & aName) throw (css::uno::RuntimeException, css::container::NoSuchElementException, css::lang::WrappedTargetException) +{ + return m_xDialogModel->getByName(aName); +} + +css::uno::Sequence< ::rtl::OUString > SAL_CALL DialogModelProvider::getElementNames() throw (css::uno::RuntimeException) +{ + return m_xDialogModel->getElementNames(); +} + +::sal_Bool SAL_CALL DialogModelProvider::hasByName(const ::rtl::OUString & aName) throw (css::uno::RuntimeException) +{ + return m_xDialogModel->hasByName(aName); +} + +// container::XNameReplace: +void SAL_CALL DialogModelProvider::replaceByName(const ::rtl::OUString & aName, const uno::Any & aElement) throw (css::uno::RuntimeException, css::lang::IllegalArgumentException, css::container::NoSuchElementException, css::lang::WrappedTargetException) +{ + m_xDialogModel->replaceByName(aName,aElement); +} + +// container::XNameContainer: +void SAL_CALL DialogModelProvider::insertByName(const ::rtl::OUString & aName, const uno::Any & aElement) throw (css::uno::RuntimeException, css::lang::IllegalArgumentException, css::container::ElementExistException, css::lang::WrappedTargetException) +{ + m_xDialogModel->insertByName(aName,aElement); +} + +void SAL_CALL DialogModelProvider::removeByName(const ::rtl::OUString & aName) throw (css::uno::RuntimeException, css::container::NoSuchElementException, css::lang::WrappedTargetException) +{ + m_xDialogModel->removeByName(aName); +} +uno::Reference< beans::XPropertySetInfo > SAL_CALL DialogModelProvider::getPropertySetInfo( ) throw (uno::RuntimeException) +{ + return m_xDialogModelProp->getPropertySetInfo(); +} +void SAL_CALL DialogModelProvider::setPropertyValue( const ::rtl::OUString&, const uno::Any& ) throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) +{ +} +uno::Any SAL_CALL DialogModelProvider::getPropertyValue( const ::rtl::OUString& PropertyName ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) +{ + return m_xDialogModelProp->getPropertyValue(PropertyName); +} +void SAL_CALL DialogModelProvider::addPropertyChangeListener( const ::rtl::OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) +{ +} +void SAL_CALL DialogModelProvider::removePropertyChangeListener( const ::rtl::OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) +{ +} +void SAL_CALL DialogModelProvider::addVetoableChangeListener( const ::rtl::OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) +{ +} +void SAL_CALL DialogModelProvider::removeVetoableChangeListener( const ::rtl::OUString& ,const uno::Reference< beans::XVetoableChangeListener >& ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) +{ +} + +// com.sun.star.uno.XServiceInfo: +::rtl::OUString SAL_CALL DialogModelProvider::getImplementationName() throw (css::uno::RuntimeException) +{ + return comp_DialogModelProvider::_getImplementationName(); +} + +::sal_Bool SAL_CALL DialogModelProvider::supportsService(::rtl::OUString const & serviceName) throw (css::uno::RuntimeException) +{ + css::uno::Sequence< ::rtl::OUString > serviceNames = comp_DialogModelProvider::_getSupportedServiceNames(); + for (::sal_Int32 i = 0; i < serviceNames.getLength(); ++i) { + if (serviceNames[i] == serviceName) + return sal_True; + } + return sal_False; +} + +css::uno::Sequence< ::rtl::OUString > SAL_CALL DialogModelProvider::getSupportedServiceNames() throw (css::uno::RuntimeException) +{ + return comp_DialogModelProvider::_getSupportedServiceNames(); +} + +} // closing anonymous implementation namespace + diff --git a/scripting/source/dlgprov/DialogModelProvider.hxx b/scripting/source/dlgprov/DialogModelProvider.hxx new file mode 100644 index 000000000000..bc74dfe661dd --- /dev/null +++ b/scripting/source/dlgprov/DialogModelProvider.hxx @@ -0,0 +1,92 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#include "sal/config.h" +#include "cppuhelper/factory.hxx" +#include "cppuhelper/implbase4.hxx" +#include "com/sun/star/lang/XInitialization.hpp" +#include "com/sun/star/container/XNameContainer.hpp" +#include "com/sun/star/lang/XServiceInfo.hpp" +#include "com/sun/star/beans/XPropertySet.hpp" + +/// anonymous implementation namespace +namespace dlgprov{ + +namespace css = ::com::sun::star; + +class DialogModelProvider: + public ::cppu::WeakImplHelper4< + css::lang::XInitialization, + css::container::XNameContainer, + css::beans::XPropertySet, + css::lang::XServiceInfo> +{ +public: + explicit DialogModelProvider(css::uno::Reference< css::uno::XComponentContext > const & context); +private: + // ::com::sun::star::lang::XInitialization: + virtual void SAL_CALL initialize(const css::uno::Sequence< ::com::sun::star::uno::Any > & aArguments) throw (css::uno::RuntimeException, css::uno::Exception); + + // ::com::sun::star::container::XElementAccess: + virtual ::com::sun::star::uno::Type SAL_CALL getElementType() throw (css::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL hasElements() throw (css::uno::RuntimeException); + + // ::com::sun::star::container::XNameAccess: + virtual ::com::sun::star::uno::Any SAL_CALL getByName(const ::rtl::OUString & aName) throw (css::uno::RuntimeException, css::container::NoSuchElementException, css::lang::WrappedTargetException); + virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames() throw (css::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL hasByName(const ::rtl::OUString & aName) throw (css::uno::RuntimeException); + + // ::com::sun::star::container::XNameReplace: + virtual void SAL_CALL replaceByName(const ::rtl::OUString & aName, const ::com::sun::star::uno::Any & aElement) throw (css::uno::RuntimeException, css::lang::IllegalArgumentException, css::container::NoSuchElementException, css::lang::WrappedTargetException); + + // ::com::sun::star::container::XNameContainer: + virtual void SAL_CALL insertByName(const ::rtl::OUString & aName, const ::com::sun::star::uno::Any & aElement) throw (css::uno::RuntimeException, css::lang::IllegalArgumentException, css::container::ElementExistException, css::lang::WrappedTargetException); + virtual void SAL_CALL removeByName(const ::rtl::OUString & Name) throw (css::uno::RuntimeException, css::container::NoSuchElementException, css::lang::WrappedTargetException); + + // ::com::sun::star::lang::XServiceInfo: + virtual ::rtl::OUString SAL_CALL getImplementationName() throw (css::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL supportsService(const ::rtl::OUString & ServiceName) throw (css::uno::RuntimeException); + virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw (css::uno::RuntimeException); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + +private: + DialogModelProvider(const DialogModelProvider &); // not defined + DialogModelProvider& operator=(const DialogModelProvider &); // not defined + + // destructor is private and will be called indirectly by the release call virtual ~DialogModelProvider() {} + + css::uno::Reference< css::uno::XComponentContext > m_xContext; + css::uno::Reference< css::container::XNameContainer> m_xDialogModel; + css::uno::Reference< css::beans::XPropertySet> m_xDialogModelProp; +}; +} // closing anonymous implementation namespace diff --git a/scripting/source/dlgprov/dlgprov.cxx b/scripting/source/dlgprov/dlgprov.cxx index ffa128381d39..8a577ab03e1c 100644 --- a/scripting/source/dlgprov/dlgprov.cxx +++ b/scripting/source/dlgprov/dlgprov.cxx @@ -28,6 +28,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_scripting.hxx" +#include "DialogModelProvider.hxx" #include "dlgprov.hxx" #include "dlgevtatt.hxx" #include @@ -60,20 +61,103 @@ #include using namespace ::com::sun::star; -using namespace ::com::sun::star::awt; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::script; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::document; +using namespace awt; +using namespace lang; +using namespace uno; +using namespace script; +using namespace beans; +using namespace document; using namespace ::sf_misc; +// component helper namespace +namespace comp_DialogModelProvider +{ + + ::rtl::OUString SAL_CALL _getImplementationName() + { + return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DialogModelProvider")); + } + + uno::Sequence< ::rtl::OUString > SAL_CALL _getSupportedServiceNames() + { + uno::Sequence< ::rtl::OUString > s(1); + s[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.UnoControlDialogModelProvider")); + return s; + } + + uno::Reference< uno::XInterface > SAL_CALL _create(const uno::Reference< uno::XComponentContext > & context) SAL_THROW((uno::Exception)) + { + return static_cast< ::cppu::OWeakObject * >(new dlgprov::DialogModelProvider(context)); + } +} // closing component helper namespace //......................................................................... namespace dlgprov { //......................................................................... static ::rtl::OUString aResourceResolverPropName = ::rtl::OUString::createFromAscii( "ResourceResolver" ); + + Reference< resource::XStringResourceManager > lcl_getStringResourceManager(const Reference< XComponentContext >& i_xContext,const ::rtl::OUString& i_sURL) + { + INetURLObject aInetObj( i_sURL ); + ::rtl::OUString aDlgName = aInetObj.GetBase(); + aInetObj.removeSegment(); + ::rtl::OUString aDlgLocation = aInetObj.GetMainURL( INetURLObject::NO_DECODE ); + bool bReadOnly = true; + ::com::sun::star::lang::Locale aLocale = Application::GetSettings().GetUILocale(); + ::rtl::OUString aComment; + + Sequence aArgs( 6 ); + aArgs[0] <<= aDlgLocation; + aArgs[1] <<= bReadOnly; + aArgs[2] <<= aLocale; + aArgs[3] <<= aDlgName; + aArgs[4] <<= aComment; + + Reference< task::XInteractionHandler > xDummyHandler; + aArgs[5] <<= xDummyHandler; + Reference< XMultiComponentFactory > xSMgr_( i_xContext->getServiceManager(), UNO_QUERY_THROW ); + // TODO: Ctor + Reference< resource::XStringResourceManager > xStringResourceManager( xSMgr_->createInstanceWithContext + ( ::rtl::OUString::createFromAscii( "com.sun.star.resource.StringResourceWithLocation" ), + i_xContext ), UNO_QUERY ); + if( xStringResourceManager.is() ) + { + Reference< XInitialization > xInit( xStringResourceManager, UNO_QUERY ); + if( xInit.is() ) + xInit->initialize( aArgs ); + } + return xStringResourceManager; + } + Reference< container::XNameContainer > lcl_createControlModel(const Reference< XComponentContext >& i_xContext) + { + Reference< XMultiComponentFactory > xSMgr_( i_xContext->getServiceManager(), UNO_QUERY_THROW ); + Reference< container::XNameContainer > xControlModel( xSMgr_->createInstanceWithContext( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialogModel" ) ), i_xContext ), UNO_QUERY_THROW ); + return xControlModel; + } + Reference< container::XNameContainer > lcl_createDialogModel( const Reference< XComponentContext >& i_xContext, + const Reference< io::XInputStream >& xInput, + const Reference< resource::XStringResourceManager >& xStringResourceManager, + const Any &aDialogSourceURL) throw ( Exception ) + { + Reference< container::XNameContainer > xDialogModel( lcl_createControlModel(i_xContext) ); + + ::rtl::OUString aDlgSrcUrlPropName( RTL_CONSTASCII_USTRINGPARAM( "DialogSourceURL" ) ); + Reference< beans::XPropertySet > xDlgPropSet( xDialogModel, UNO_QUERY ); + xDlgPropSet->setPropertyValue( aDlgSrcUrlPropName, aDialogSourceURL ); + + ::xmlscript::importDialogModel( xInput, xDialogModel, i_xContext ); + // Set resource property + if( xStringResourceManager.is() ) + { + Reference< beans::XPropertySet > xDlgPSet( xDialogModel, UNO_QUERY ); + Any aStringResourceManagerAny; + aStringResourceManagerAny <<= xStringResourceManager; + xDlgPSet->setPropertyValue( aResourceResolverPropName, aStringResourceManagerAny ); + } + + return xDialogModel; + } // ============================================================================= // component operations // ============================================================================= @@ -173,9 +257,7 @@ static ::rtl::OUString aResourceResolverPropName = ::rtl::OUString::createFromAs Reference< container::XNameContainer > DialogProviderImpl::createControlModel() throw ( Exception ) { - Reference< XMultiComponentFactory > xSMgr_( m_xContext->getServiceManager(), UNO_QUERY_THROW ); - Reference< container::XNameContainer > xControlModel( xSMgr_->createInstanceWithContext( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialogModel" ) ), m_xContext ), UNO_QUERY_THROW ); - return xControlModel; + return lcl_createControlModel(m_xContext); } Reference< container::XNameContainer > DialogProviderImpl::createDialogModel( @@ -183,23 +265,9 @@ static ::rtl::OUString aResourceResolverPropName = ::rtl::OUString::createFromAs const Reference< resource::XStringResourceManager >& xStringResourceManager, const Any &aDialogSourceURL) throw ( Exception ) { - Reference< container::XNameContainer > xDialogModel( createControlModel() ); - ::rtl::OUString aDlgSrcUrlPropName( RTL_CONSTASCII_USTRINGPARAM( "DialogSourceURL" ) ); - Reference< beans::XPropertySet > xDlgPropSet( xDialogModel, UNO_QUERY ); - xDlgPropSet->setPropertyValue( aDlgSrcUrlPropName, aDialogSourceURL ); - ::xmlscript::importDialogModel( xInput, xDialogModel, m_xContext ); - // Set resource property - if( xStringResourceManager.is() ) - { - Reference< beans::XPropertySet > xDlgPSet( xDialogModel, UNO_QUERY ); - Any aStringResourceManagerAny; - aStringResourceManagerAny <<= xStringResourceManager; - xDlgPSet->setPropertyValue( aResourceResolverPropName, aStringResourceManagerAny ); - } - - return xDialogModel; + return lcl_createDialogModel(m_xContext,xInput,xStringResourceManager,aDialogSourceURL); } Reference< XControlModel > DialogProviderImpl::createDialogModelForBasic() throw ( Exception ) @@ -280,8 +348,8 @@ static ::rtl::OUString aResourceResolverPropName = ::rtl::OUString::createFromAs bSingleDialog = true; // Try any other URL with SimpleFileAccess - Reference< ::com::sun::star::ucb::XSimpleFileAccess > xSFI = - Reference< ::com::sun::star::ucb::XSimpleFileAccess >( xSMgr->createInstanceWithContext + Reference< ucb::XSimpleFileAccess > xSFI = + Reference< ucb::XSimpleFileAccess >( xSMgr->createInstanceWithContext ( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), m_xContext ), UNO_QUERY ); try @@ -412,34 +480,7 @@ static ::rtl::OUString aResourceResolverPropName = ::rtl::OUString::createFromAs Reference< resource::XStringResourceManager > xStringResourceManager; if( bSingleDialog ) { - INetURLObject aInetObj( aURL ); - ::rtl::OUString aDlgName = aInetObj.GetBase(); - aInetObj.removeSegment(); - ::rtl::OUString aDlgLocation = aInetObj.GetMainURL( INetURLObject::NO_DECODE ); - bool bReadOnly = true; - ::com::sun ::star::lang::Locale aLocale = Application::GetSettings().GetUILocale(); - ::rtl::OUString aComment; - - Sequence aArgs( 6 ); - aArgs[0] <<= aDlgLocation; - aArgs[1] <<= bReadOnly; - aArgs[2] <<= aLocale; - aArgs[3] <<= aDlgName; - aArgs[4] <<= aComment; - - Reference< task::XInteractionHandler > xDummyHandler; - aArgs[5] <<= xDummyHandler; - Reference< XMultiComponentFactory > xSMgr_( m_xContext->getServiceManager(), UNO_QUERY_THROW ); - // TODO: Ctor - xStringResourceManager = Reference< resource::XStringResourceManager >( xSMgr_->createInstanceWithContext - ( ::rtl::OUString::createFromAscii( "com.sun.star.resource.StringResourceWithLocation" ), - m_xContext ), UNO_QUERY ); - if( xStringResourceManager.is() ) - { - Reference< XInitialization > xInit( xStringResourceManager, UNO_QUERY ); - if( xInit.is() ) - xInit->initialize( aArgs ); - } + xStringResourceManager = lcl_getStringResourceManager(m_xContext,aURL); } else if( xDialogLib.is() ) { @@ -794,7 +835,7 @@ static ::rtl::OUString aResourceResolverPropName = ::rtl::OUString::createFromAs Reference< XWindow > DialogProviderImpl::createContainerWindow( const ::rtl::OUString& URL, const ::rtl::OUString& WindowType, const Reference< XWindowPeer >& xParent, const Reference< XInterface >& xHandler ) - throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) + throw (lang::IllegalArgumentException, RuntimeException) { (void)WindowType; // for future use if( !xParent.is() ) @@ -824,11 +865,8 @@ static ::rtl::OUString aResourceResolverPropName = ::rtl::OUString::createFromAs static struct ::cppu::ImplementationEntry s_component_entries [] = { - { - create_DialogProviderImpl, getImplementationName_DialogProviderImpl, - getSupportedServiceNames_DialogProviderImpl, ::cppu::createSingleComponentFactory, - 0, 0 - }, + {create_DialogProviderImpl, getImplementationName_DialogProviderImpl,getSupportedServiceNames_DialogProviderImpl, ::cppu::createSingleComponentFactory,0, 0}, + { &comp_DialogModelProvider::_create,&comp_DialogModelProvider::_getImplementationName,&comp_DialogModelProvider::_getSupportedServiceNames,&::cppu::createSingleComponentFactory, 0, 0 }, { 0, 0, 0, 0, 0, 0 } }; diff --git a/scripting/source/dlgprov/dlgprov.hxx b/scripting/source/dlgprov/dlgprov.hxx index bc15831d2ff1..cbe3727b045e 100644 --- a/scripting/source/dlgprov/dlgprov.hxx +++ b/scripting/source/dlgprov/dlgprov.hxx @@ -61,6 +61,13 @@ namespace dlgprov // ============================================================================= // class DialogProviderImpl // ============================================================================= + ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > lcl_createControlModel(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& i_xContext); + ::com::sun::star::uno::Reference< ::com::sun::star::resource::XStringResourceManager > lcl_getStringResourceManager(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& i_xContext,const ::rtl::OUString& i_sURL); + ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > lcl_createDialogModel( + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& i_xContext, + const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xInput, + const ::com::sun::star::uno::Reference< ::com::sun::star::resource::XStringResourceManager >& xStringResourceManager, + const ::com::sun::star::uno::Any &aDialogSourceURL) throw ( ::com::sun::star::uno::Exception ); typedef ::cppu::WeakImplHelper4< ::com::sun::star::lang::XServiceInfo, diff --git a/scripting/source/dlgprov/makefile.mk b/scripting/source/dlgprov/makefile.mk index 111dca58edc2..c3a99aa81aff 100644 --- a/scripting/source/dlgprov/makefile.mk +++ b/scripting/source/dlgprov/makefile.mk @@ -41,6 +41,7 @@ DLLPRE = SLOFILES= \ $(SLO)$/dlgprov.obj \ + $(SLO)$/DialogModelProvider.obj \ $(SLO)$/dlgevtatt.obj SHL1TARGET= $(TARGET)$(DLLPOSTFIX).uno diff --git a/scripting/source/inc/util/util.hxx b/scripting/source/inc/util/util.hxx index 27e5c19ccc91..a07d66452e0d 100644 --- a/scripting/source/inc/util/util.hxx +++ b/scripting/source/inc/util/util.hxx @@ -29,21 +29,6 @@ #ifndef _COM_SUN_STAR_SCRIPTING_UTIL_UTIL_HXX_ #define _COM_SUN_STAR_SCRIPTING_UTIL_UTIL_HXX_ -#include -#include - #define OUSTR(x) ::rtl::OUString( ::rtl::OUString::createFromAscii(x) ) -namespace scripting_util -{ - inline void validateXRef(::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xRef, const sal_Char* Msg) throw (::com::sun::star::uno::RuntimeException) - { - OSL_ENSURE( xRef.is(), Msg ); - - if(!xRef.is()) - { - throw ::com::sun::star::uno::RuntimeException(OUSTR(Msg), ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >()); - } - } -} #endif //_COM_SUN_STAR_SCRIPTING_UTIL_UTIL_HXX_ diff --git a/scripting/source/protocolhandler/makefile.mk b/scripting/source/protocolhandler/makefile.mk index ec69c00b209d..5a2e92bbbac3 100644 --- a/scripting/source/protocolhandler/makefile.mk +++ b/scripting/source/protocolhandler/makefile.mk @@ -45,6 +45,7 @@ SHL1TARGET= $(TARGET)$(DLLPOSTFIX) SHL1STDLIBS= \ $(SFXLIB) \ + $(FWELIB) \ $(CPPULIB) \ $(CPPUHELPERLIB) \ $(VCLLIB) \ diff --git a/scripting/source/protocolhandler/scripthandler.cxx b/scripting/source/protocolhandler/scripthandler.cxx index 52b626dc5884..b1268ada4998 100644 --- a/scripting/source/protocolhandler/scripthandler.cxx +++ b/scripting/source/protocolhandler/scripthandler.cxx @@ -49,10 +49,12 @@ #include #include #include +#include #include #include #include +#include #include "com/sun/star/uno/XComponentContext.hpp" #include "com/sun/star/uri/XUriReference.hpp" @@ -69,7 +71,6 @@ using namespace ::com::sun::star::lang; using namespace ::com::sun::star::script; using namespace ::com::sun::star::script::provider; using namespace ::com::sun::star::document; -using namespace ::scripting_util; namespace scripting_protocolhandler { @@ -97,8 +98,7 @@ void SAL_CALL ScriptProtocolHandler::initialize( throw RuntimeException( temp, Reference< XInterface >() ); } - validateXRef( m_xFactory, - "ScriptProtocolHandler::initialize: No Service Manager available" ); + ENSURE_OR_THROW( m_xFactory.is(), "ScriptProtocolHandler::initialize: No Service Manager available" ); m_bInitialised = true; } @@ -162,7 +162,7 @@ void SAL_CALL ScriptProtocolHandler::dispatchWithNotification( { try { - bool bIsDocumentScript = ( aURL.Complete.indexOf( ::rtl::OUString::createFromAscii( "document" ) ) !=-1 ); + bool bIsDocumentScript = ( aURL.Complete.indexOfAsciiL( RTL_CONSTASCII_STRINGPARAM( "document" ) ) !=-1 ); // TODO: isn't this somewhat strange? This should be a test for a location=document parameter, shouldn't it? if ( bIsDocumentScript ) @@ -182,7 +182,7 @@ void SAL_CALL ScriptProtocolHandler::dispatchWithNotification( Reference< provider::XScript > xFunc = m_xScriptProvider->getScript( aURL.Complete ); - validateXRef( xFunc, + ENSURE_OR_THROW( xFunc.is(), "ScriptProtocolHandler::dispatchWithNotification: validate xFunc - unable to obtain XScript interface" ); @@ -207,6 +207,11 @@ void SAL_CALL ScriptProtocolHandler::dispatchWithNotification( } } + // attempt to protect the document against the script tampering with its Undo Context + ::std::auto_ptr< ::framework::DocumentUndoGuard > pUndoGuard; + if ( bIsDocumentScript ) + pUndoGuard.reset( new ::framework::DocumentUndoGuard( m_xScriptInvocation ) ); + bSuccess = sal_False; while ( !bSuccess ) { @@ -248,16 +253,6 @@ void SAL_CALL ScriptProtocolHandler::dispatchWithNotification( bCaughtException = sal_True; } -#ifdef _DEBUG - catch ( ... ) - { - ::rtl::OUString reason = ::rtl::OUString::createFromAscii( - "ScriptProtocolHandler::dispatch: caught unknown exception" ); - - invokeResult <<= reason; - } -#endif - } else { @@ -358,13 +353,11 @@ ScriptProtocolHandler::getScriptInvocation() return m_xScriptInvocation.is(); } -void -ScriptProtocolHandler::createScriptProvider() +void ScriptProtocolHandler::createScriptProvider() { if ( m_xScriptProvider.is() ) - { return; - } + try { // first, ask the component supporting the XScriptInvocationContext interface @@ -397,6 +390,7 @@ ScriptProtocolHandler::createScriptProvider() m_xScriptProvider = xSPS->getScriptProvider(); } + // if nothing of this is successful, use the master script provider if ( !m_xScriptProvider.is() ) { Reference< XPropertySet > xProps( m_xFactory, UNO_QUERY_THROW ); @@ -430,15 +424,6 @@ ScriptProtocolHandler::createScriptProvider() ::rtl::OUString temp = OUSTR( "ScriptProtocolHandler::createScriptProvider: " ); throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() ); } -#ifdef _DEBUG - catch ( ... ) - { - throw RuntimeException( - OUSTR( "ScriptProtocolHandler::createScriptProvider: UnknownException: " ), - Reference< XInterface > () ); - } -#endif - } ScriptProtocolHandler::ScriptProtocolHandler( diff --git a/scripting/source/provider/ActiveMSPList.cxx b/scripting/source/provider/ActiveMSPList.cxx index 3c6206d8d051..bbabbb21405c 100644 --- a/scripting/source/provider/ActiveMSPList.cxx +++ b/scripting/source/provider/ActiveMSPList.cxx @@ -49,7 +49,6 @@ using namespace com::sun::star; using namespace com::sun::star::uno; using namespace com::sun::star::script; -using namespace ::scripting_util; using namespace ::sf_misc; namespace func_provider diff --git a/scripting/source/provider/MasterScriptProvider.cxx b/scripting/source/provider/MasterScriptProvider.cxx index 94ea78f80c73..33d371e3d51b 100755 --- a/scripting/source/provider/MasterScriptProvider.cxx +++ b/scripting/source/provider/MasterScriptProvider.cxx @@ -33,6 +33,8 @@ #include #include #include +#include + #include #include #include @@ -60,7 +62,6 @@ using namespace ::com::sun::star::uno; using namespace ::com::sun::star::script; using namespace ::com::sun::star::document; using namespace ::sf_misc; -using namespace ::scripting_util; namespace func_provider { @@ -95,10 +96,9 @@ MasterScriptProvider::MasterScriptProvider( const Reference< XComponentContext > m_xContext( xContext ), m_bIsValid( false ), m_bInitialised( false ), m_bIsPkgMSP( false ), m_pPCache( 0 ) { - validateXRef( m_xContext, "MasterScriptProvider::MasterScriptProvider: No context available\n" ); + ENSURE_OR_THROW( m_xContext.is(), "MasterScriptProvider::MasterScriptProvider: No context available\n" ); m_xMgr = m_xContext->getServiceManager(); - validateXRef( m_xMgr, - "MasterScriptProvider::MasterScriptProvider: No service manager available\n" ); + ENSURE_OR_THROW( m_xMgr.is(), "MasterScriptProvider::MasterScriptProvider: No service manager available\n" ); m_bIsValid = true; } diff --git a/scripting/source/provider/ProviderCache.cxx b/scripting/source/provider/ProviderCache.cxx index 5d3350f635e3..bea38a67a8f1 100644 --- a/scripting/source/provider/ProviderCache.cxx +++ b/scripting/source/provider/ProviderCache.cxx @@ -29,6 +29,7 @@ #include "precompiled_scripting.hxx" #include #include +#include #include #include @@ -39,7 +40,6 @@ using namespace com::sun::star; using namespace com::sun::star::uno; using namespace com::sun::star::script; -using namespace ::scripting_util; namespace func_provider { @@ -51,7 +51,7 @@ ProviderCache::ProviderCache( const Reference< XComponentContext >& xContext, co // will use createContentEnumeration m_xMgr = m_xContext->getServiceManager(); - validateXRef( m_xMgr, "ProviderCache::ProviderCache() failed to obtain ServiceManager" ); + ENSURE_OR_THROW( m_xMgr.is(), "ProviderCache::ProviderCache() failed to obtain ServiceManager" ); populateCache(); } @@ -64,7 +64,7 @@ ProviderCache::ProviderCache( const Reference< XComponentContext >& xContext, co // will use createContentEnumeration m_xMgr = m_xContext->getServiceManager(); - validateXRef( m_xMgr, "ProviderCache::ProviderCache() failed to obtain ServiceManager" ); + ENSURE_OR_THROW( m_xMgr.is(), "ProviderCache::ProviderCache() failed to obtain ServiceManager" ); populateCache(); } @@ -163,14 +163,8 @@ ProviderCache::populateCache() throw ( RuntimeException ) while ( xEnum->hasMoreElements() ) { - Reference< lang::XSingleComponentFactory > factory; - if ( sal_False == ( xEnum->nextElement() >>= factory ) ) - { - throw new RuntimeException( ::rtl::OUString::createFromAscii( " error extracting XSingleComponentFactory from Content enumeration. " ), Reference< XInterface >() ); - } - validateXRef( factory, "ProviderCache::populateCache() invalid factory" ); + Reference< lang::XSingleComponentFactory > factory( xEnum->nextElement(), UNO_QUERY_THROW ); Reference< lang::XServiceInfo > xServiceInfo( factory, UNO_QUERY_THROW ); - validateXRef( xServiceInfo, "ProviderCache::populateCache() failed to get XServiceInfo from factory" ); Sequence< ::rtl::OUString > serviceNames = xServiceInfo->getSupportedServiceNames(); @@ -207,9 +201,8 @@ ProviderCache::createProvider( ProviderDetails& details ) throw ( RuntimeExcepti { try { - details.provider = Reference< provider::XScriptProvider >( + details.provider.set( details.factory->createInstanceWithArgumentsAndContext( m_Sctx, m_xContext ), UNO_QUERY_THROW ); - validateXRef( details.provider, "ProviderCache::createProvider, failed to create provider"); } catch ( RuntimeException& e ) { diff --git a/scripting/source/provider/ScriptImpl.cxx b/scripting/source/provider/ScriptImpl.cxx index f5b93a802138..08d548e3461c 100644 --- a/scripting/source/provider/ScriptImpl.cxx +++ b/scripting/source/provider/ScriptImpl.cxx @@ -46,15 +46,11 @@ ScriptImpl::ScriptImpl( const Reference< runtime::XScriptInvocation > & runtimeMgr, const ::rtl::OUString& scriptURI ) throw ( RuntimeException ) : - m_XScriptingContext( scriptingContext ), - m_RunTimeManager( runtimeMgr ), + m_XScriptingContext( scriptingContext, UNO_SET_THROW ), + m_RunTimeManager( runtimeMgr, UNO_SET_THROW ), m_ScriptURI( scriptURI ) { OSL_TRACE( "\n" ); - validateXRef( m_XScriptingContext, - "ScriptImpl::ScriptImpl: No XScriptingContext\n" ); - validateXRef( m_RunTimeManager, - "ScriptImpl::ScriptImpl: No XScriptInvocation\n" ); } //************************************************************************* diff --git a/scripting/source/provider/ScriptingContext.cxx b/scripting/source/provider/ScriptingContext.cxx index 08a27a19562f..0394bd3653d1 100755 --- a/scripting/source/provider/ScriptingContext.cxx +++ b/scripting/source/provider/ScriptingContext.cxx @@ -55,13 +55,10 @@ namespace func_provider //************************************************************************* ScriptingContext::ScriptingContext( const Reference< XComponentContext > & xContext ) : //ScriptingContextImpl_BASE( GetMutex()), OPropertyContainer( GetBroadcastHelper() ), - m_xContext( xContext ) + m_xContext( xContext, UNO_SET_THROW ) { OSL_TRACE( "< ScriptingContext ctor called >\n" ); - validateXRef( m_xContext, - "ScriptingContext::ScriptingContext: No context available\n" ); - Any nullAny; scripting_constants::ScriptingConstantsPool& scriptingConstantsPool = diff --git a/scripting/source/runtimemgr/ScriptNameResolverImpl.cxx b/scripting/source/runtimemgr/ScriptNameResolverImpl.cxx index 48b960c6c9aa..8dafab0e8d4c 100644 --- a/scripting/source/runtimemgr/ScriptNameResolverImpl.cxx +++ b/scripting/source/runtimemgr/ScriptNameResolverImpl.cxx @@ -70,13 +70,11 @@ static ::std::vector< sal_Int32 >* m_pSearchIDs = NULL; //************************************************************************* ScriptNameResolverImpl::ScriptNameResolverImpl( const Reference< XComponentContext > & xContext ) : - m_xContext( xContext ) + m_xContext( xContext, UNO_SET_THROW ) { OSL_TRACE( "< ScriptNameResolverImpl ctor called >\n" ); validateXRef( m_xContext, "ScriptNameResolverImpl::ScriptNameResolverImpl: invalid context" ); - m_xMultiComFac = m_xContext->getServiceManager(); - - validateXRef( m_xMultiComFac, "ScriptNameResolverImpl::ScriptNameResolverImpl: invalid XMultiComponentFactory " ); + m_xMultiComFac.set( m_xContext->getServiceManager(), UNO_SET_THROW ); if( !m_pSearchIDs ) { @@ -220,11 +218,13 @@ throw ( lang::IllegalArgumentException, script::CannotConvertException, RuntimeE OUString temp = OUSTR( "ScriptNameResolverImpl::resolve: " ); throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() ); } - Reference< XInterface > xInterface = m_xMultiComFac->createInstanceWithContext( - ::rtl::OUString::createFromAscii( - "com.sun.star.ucb.SimpleFileAccess" ), m_xContext ); - validateXRef( xInterface, - "ScriptProvider::initialise: cannot get SimpleFileAccess Service\n" ); + Reference< XInterface > xInterface( + m_xMultiComFac->createInstanceWithContext( + ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), + m_xContext + ), + UNO_SET_THROW + ); Reference < ucb::XSimpleFileAccess > xSimpleFileAccess = Reference < ucb::XSimpleFileAccess > ( xInterface, UNO_QUERY_THROW ); @@ -236,15 +236,8 @@ throw ( lang::IllegalArgumentException, script::CannotConvertException, RuntimeE try { // need to get the ScriptStorageManager - Any a = m_xContext->getValueByName( - scriptingConstantsPool.SCRIPTSTORAGEMANAGER_SERVICE ); - if ( sal_False == ( a >>= xScriptStorageMgr ) ) - { - OUString temp = OUSTR( "ScriptNameResolverImpl::resolve: failed to get ScriptStorageManager" ); - throw RuntimeException( temp, Reference< XInterface >() ); - // need to throw - } - validateXRef( xScriptStorageMgr, "Cannot get ScriptStorageManager" ); + xScriptStorageMgr.set( m_xContext->getValueByName( + scriptingConstantsPool.SCRIPTSTORAGEMANAGER_SERVICE ), UNO_QUERY_THROW ); filesysScriptStorageID = xScriptStorageMgr->createScriptStorageWithURI( xSimpleFileAccess, filesysURL ); @@ -364,20 +357,12 @@ throw ( lang::IllegalArgumentException, script::CannotConvertException, RuntimeE if( filesysScriptStorageID > 2 ) { // get the filesys storage and dispose of it - Reference< XInterface > xScriptStorage = - xScriptStorageMgr->getScriptStorage( filesysScriptStorageID ); - validateXRef( xScriptStorage, - "ScriptNameResolverImpl::getStorageInstance: cannot get Script Storage service" ); + Reference< XInterface > xScriptStorage( xScriptStorageMgr->getScriptStorage( filesysScriptStorageID ), UNO_SET_THROW ); Reference< storage::XScriptInfoAccess > xScriptInfoAccess = Reference< storage::XScriptInfoAccess > ( xScriptStorage, UNO_QUERY_THROW ); - validateXRef( xScriptInfoAccess, - "ScriptNameResolverImpl::resolveURIFromStorageID: cannot get XScriptInfoAccess" ); Sequence< Reference< storage::XScriptInfo > > results = xScriptInfoAccess->getAllImplementations( ); - Reference < lang::XEventListener > xEL_ScriptStorageMgr = - Reference< lang::XEventListener > - ( xScriptStorageMgr ,UNO_QUERY_THROW ); - validateXRef( xEL_ScriptStorageMgr, "ScriptNameResolverImpl::resolve: can't get ScriptStorageManager XEventListener interface when trying to dispose of filesystem storage" ); + Reference < lang::XEventListener > xEL_ScriptStorageMgr(( xScriptStorageMgr ,UNO_QUERY_THROW ); lang::EventObject event( results[ 0 ] ); xEL_ScriptStorageMgr->disposing( event ); } @@ -447,9 +432,7 @@ SAL_THROW ( ( lang::IllegalArgumentException, css::security::AccessControlExcept throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() ); } } - Reference< storage::XScriptInfoAccess > storage = getStorageInstance( sid, permissionURI ); - validateXRef( storage, - "ScriptNameResolverImpl::resolveURIFromStorageID: cannot get XScriptInfoAccess" ); + Reference< storage::XScriptInfoAccess > storage( getStorageInstance( sid, permissionURI ), UNO_SET_THROW ); Sequence< Reference< storage::XScriptInfo > > results = storage->getImplementations( scriptURI ); @@ -516,22 +499,10 @@ const ::rtl::OUString & permissionURI ) SAL_THROW ( ( RuntimeException, css::sec Reference< storage::XScriptInfoAccess > xScriptInfoAccess; try { - Reference< XInterface > xInterface; - - Any a = m_xContext->getValueByName( - OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) ); - if ( sal_False == ( a >>= xInterface ) ) - { - throw RuntimeException( - OUSTR( "ScriptNameResolverImpl::getStorageInstance: could not obtain ScriptStorageManager singleton" ), - Reference< XInterface >() ); - } - validateXRef( xInterface, - "ScriptNameResolverImpl::getStorageInstance: cannot get Storage service" ); + Reference< XInterface > xInterface( m_xContext->getValueByName( + OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) ), UNO_QUERY_THROW ); // check that we have permissions for this storage Reference< dcsssf::security::XScriptSecurity > xScriptSecurity( xInterface, UNO_QUERY_THROW ); - validateXRef( xScriptSecurity, - "ScriptNameResolverImpl::getStorageInstance: cannot get Script Security service" ); scripting_constants::ScriptingConstantsPool& scriptingConstantsPool = scripting_constants::ScriptingConstantsPool::instance(); // if we dealing with a document storage (ie. not user or share @@ -546,14 +517,8 @@ const ::rtl::OUString & permissionURI ) SAL_THROW ( ( RuntimeException, css::sec OSL_TRACE( "ScriptNameResolverImpl::getStorageInstance: got execute permission for ID=%d", sid ); } Reference< storage::XScriptStorageManager > xScriptStorageManager( xInterface, UNO_QUERY_THROW ); - validateXRef( xScriptStorageManager, - "ScriptNameResolverImpl::getStorageInstance: cannot get Script Storage Manager service" ); - Reference< XInterface > xScriptStorage = - xScriptStorageManager->getScriptStorage( sid ); - validateXRef( xScriptStorage, - "ScriptNameResolverImpl::getStorageInstance: cannot get Script Storage service" ); - xScriptInfoAccess = Reference< - storage::XScriptInfoAccess > ( xScriptStorage, UNO_QUERY_THROW ); + Reference< XInterface > xScriptStorage( ScriptStorageManager->getScriptStorage( sid ), UNO_SET_THROW ); + xScriptInfoAccess.set( xScriptStorage, UNO_QUERY_THROW ); } catch ( lang::IllegalArgumentException & e ) { diff --git a/scripting/source/runtimemgr/ScriptRuntimeManager.cxx b/scripting/source/runtimemgr/ScriptRuntimeManager.cxx index 4780d58acc88..79a44bebce7d 100755 --- a/scripting/source/runtimemgr/ScriptRuntimeManager.cxx +++ b/scripting/source/runtimemgr/ScriptRuntimeManager.cxx @@ -37,6 +37,7 @@ #include #include +#include #include #include @@ -68,14 +69,10 @@ static Sequence< OUString > s_serviceNames = Sequence< OUString >( &s_serviceNam // ScriptRuntimeManager Constructor ScriptRuntimeManager::ScriptRuntimeManager( const Reference< XComponentContext > & xContext ) : - m_xContext( xContext ) + m_xContext( xContext, UNO_SET_THROW ) { OSL_TRACE( "< ScriptRuntimeManager ctor called >\n" ); - validateXRef( m_xContext, - "ScriptRuntimeManager::ScriptRuntimeManager: invalid context" ); - m_xMgr = m_xContext->getServiceManager(); - validateXRef( m_xMgr, - "ScriptRuntimeManager::ScriptRuntimeManager: cannot get ServiceManager" ); + m_xMgr.set( m_xContext->getServiceManager(), UNO_SET_THROW ); s_moduleCount.modCnt.acquire( &s_moduleCount.modCnt ); // test //scripting_securitymgr::ScriptSecurityManager ssm(xContext); @@ -106,22 +103,12 @@ throw( RuntimeException ) Reference< storage::XScriptInfo > sinfo = Reference< storage::XScriptInfo >( scriptInfo, UNO_QUERY_THROW ); - OUStringBuffer *buf = new OUStringBuffer(80); - buf->appendAscii("/singletons/drafts.com.sun.star.script.framework.runtime.theScriptRuntimeFor"); - buf->append(sinfo->getLanguage()); + OUStringBuffer* buf( 80 ); + buf.appendAscii("/singletons/drafts.com.sun.star.script.framework.runtime.theScriptRuntimeFor"); + buf.append(sinfo->getLanguage()); - Any a = m_xContext->getValueByName(buf->makeStringAndClear()); - - if ( sal_False == ( a >>= xInterface ) ) - { - throw RuntimeException( - sinfo->getLanguage().concat( OUSTR( " runtime support is not installed for this language" ) ), - Reference< XInterface >() ); - } - validateXRef( xInterface, - "ScriptRuntimeManager::GetScriptRuntime: cannot get appropriate ScriptRuntime Service" - ); - xScriptInvocation = Reference< runtime::XScriptInvocation >( xInterface, UNO_QUERY_THROW ); + xInterface.set( m_xContext->getValueByName( buf.makeStringAndClear() ), UNO_QUERY_THROW ); + xScriptInvocation.set( xInterface, UNO_QUERY_THROW ); } catch ( Exception & e ) { @@ -143,13 +130,14 @@ throw( RuntimeException ) try { - Reference< XInterface > xInterface = m_xMgr->createInstanceWithContext( - OUString::createFromAscii( - "drafts.com.sun.star.script.framework.runtime.DefaultScriptNameResolver" ), - m_xContext ); - validateXRef( xInterface, - "ScriptRuntimeManager::GetScriptRuntime: cannot get instance of DefaultScriptNameResolver" ); - xScriptNameResolver = Reference< runtime::XScriptNameResolver >( xInterface, UNO_QUERY_THROW ); + Reference< XInterface > xInterface( + m_xMgr->createInstanceWithContext( + OUString::createFromAscii("drafts.com.sun.star.script.framework.runtime.DefaultScriptNameResolver" ), + m_xContext + ), + UNO_SET_THROW + ); + xScriptNameResolver.set( xInterface, UNO_QUERY_THROW ); } catch ( Exception & e ) { @@ -182,9 +170,8 @@ Any SAL_CALL ScriptRuntimeManager::invoke( try { - Reference< storage::XScriptInfo > resolvedScript = resolve( scriptURI, - resolvedCtx ); - validateXRef( resolvedScript, "ScriptRuntimeManager::invoke: No resolvedURI" ); + Reference< storage::XScriptInfo > resolvedScript = resolve( scriptURI, resolvedCtx ); + ENSURE_OR_THROW( resolvedScript.is(), "ScriptRuntimeManager::invoke: No resolvedURI" ); Reference< beans::XPropertySet > xPropSetResolvedCtx; if ( sal_False == ( resolvedCtx >>= xPropSetResolvedCtx ) ) @@ -216,7 +203,7 @@ Any SAL_CALL ScriptRuntimeManager::invoke( Reference< runtime::XScriptInvocation > xScriptInvocation = getScriptRuntime( resolvedScript ); - validateXRef( xScriptInvocation, + ENSURE_OR_THROW( xScriptInvocation.is(), "ScriptRuntimeManager::invoke: cannot get instance of language specific runtime." ); // the scriptURI is currently passed to the language-dept runtime but @@ -232,13 +219,7 @@ Any SAL_CALL ScriptRuntimeManager::invoke( { Any a = m_xContext->getValueByName( scriptingConstantsPool.SCRIPTSTORAGEMANAGER_SERVICE ); - Reference < lang::XEventListener > xEL_ScriptStorageManager; - if ( sal_False == ( a >>= xEL_ScriptStorageManager ) ) - { - throw RuntimeException( OUSTR( "ScriptRuntimeManager::invoke: can't get ScriptStorageManager XEventListener interface when trying to dispose of filesystem storage" ), - Reference< XInterface > () ); - } - validateXRef( xEL_ScriptStorageManager, "Cannot get XEventListener from ScriptStorageManager" ); + Reference < lang::XEventListener > xEL_ScriptStorageManager( a, UNO_QUERY_THROW ); lang::EventObject event(resolvedScript); xEL_ScriptStorageManager->disposing( event ); } @@ -310,7 +291,7 @@ throw( lang::IllegalArgumentException, script::CannotConvertException, RuntimeEx Reference< storage::XScriptInfo > resolvedURI; Reference< runtime::XScriptNameResolver > xScriptNameResolver = getScriptNameResolver(); - validateXRef( xScriptNameResolver, + ENSURE_OR_THROW( xScriptNameResolver.is(), "ScriptRuntimeManager::resolve: No ScriptNameResolver" ); try diff --git a/scripting/source/runtimemgr/StorageBridge.cxx b/scripting/source/runtimemgr/StorageBridge.cxx index d1915afba9e5..1e15cf808870 100644 --- a/scripting/source/runtimemgr/StorageBridge.cxx +++ b/scripting/source/runtimemgr/StorageBridge.cxx @@ -54,9 +54,8 @@ const int STORAGEPROXY = 0; //************************************************************************* // StorageBridge Constructor StorageBridge::StorageBridge( const Reference< XComponentContext >& xContext, - sal_Int32 sid ) : m_xContext( xContext ), m_sid( sid ) + sal_Int32 sid ) : m_xContext( xContext, UNO_SET_THROW ), m_sid( sid ) { - validateXRef( m_xContext, "StorageBridge::StorageBridge: invalid context" ); try { initStorage(); @@ -74,31 +73,12 @@ StorageBridge::initStorage() throw ( ::com::sun::star::uno::RuntimeException ) { try { - Reference< lang::XMultiComponentFactory > xMultiComFac = - m_xContext->getServiceManager(); - validateXRef( xMultiComFac, - "StorageBridge::StorageBridge: cannot get multicomponentfactory from multiservice factory" ); - Reference< XInterface > temp; - - Any a = m_xContext->getValueByName( - OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) ); - if ( sal_False == ( a >>= temp ) ) - { - throw RuntimeException( - OUSTR( "StorageBridge::StorageBridge: could not obtain ScriptStorageManager singleton" ), - Reference< XInterface >() ); - } - validateXRef( temp, - "StorageBridge::StorageBridge: cannot get Storage service" ); + Reference< lang::XMultiComponentFactory > xMultiComFac( m_xContext->getServiceManager(), UNO_SET_THROW ); + Reference< XInterface > temp( m_xContext->getValueByName( + OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) ), UNO_QUERY_THROW ); Reference< storage::XScriptStorageManager > xScriptStorageManager( temp, UNO_QUERY_THROW ); - validateXRef( xScriptStorageManager, - "StorageBridge::StorageBridge: cannot get Script Storage Manager service" ); - Reference< XInterface > xScriptStorage = - xScriptStorageManager->getScriptStorage( m_sid ); - validateXRef( xScriptStorage, - "StorageBridge::StorageBridge: cannot get Script Storage service" ); - m_xScriptInfoAccess = - Reference< storage::XScriptInfoAccess > ( xScriptStorage, UNO_QUERY_THROW ); + Reference< XInterface > xScriptStorage( xScriptStorageManager->getScriptStorage( m_sid ), UNO_SET_THROW ); + m_xScriptInfoAccess.set( xScriptStorage, UNO_QUERY_THROW ); } catch ( RuntimeException & re ) { diff --git a/scripting/source/storage/ScriptMetadataImporter.cxx b/scripting/source/storage/ScriptMetadataImporter.cxx index 64dd87b2546b..96faf6e9c1f4 100644 --- a/scripting/source/storage/ScriptMetadataImporter.cxx +++ b/scripting/source/storage/ScriptMetadataImporter.cxx @@ -38,7 +38,7 @@ #include #include - +#include #include @@ -82,31 +82,14 @@ void ScriptMetadataImporter::parseMetaData( ms_parcelURI = parcelURI; //Get the parser service - validateXRef( m_xContext, + ENSURE_OR_THROW( m_xContext.is(), "ScriptMetadataImporter::parseMetaData: No context available" ); - Reference< lang::XMultiComponentFactory > xMgr = - m_xContext->getServiceManager(); + Reference< lang::XMultiComponentFactory > xMgr( m_xContext->getServiceManager(), UNO_SET_THROW ); - validateXRef( xMgr, - "ScriptMetadataImporter::parseMetaData: No service manager available" ); - - Reference< XInterface > xInterface = xMgr->createInstanceWithContext( - OUString::createFromAscii( "com.sun.star.xml.sax.Parser" ), m_xContext ); - - validateXRef( xInterface, "ScriptMetadataImporter::parseMetaData: cannot get SAX Parser" ); - Reference< xml::sax::XParser > xParser; - try - { - xParser.set( xInterface ,UNO_QUERY_THROW ); - } - catch (RuntimeException & re ) - { - OUString msg = OUString::createFromAscii( - "ScriptMetadata:Importer::parserMetaData cannot get XParser" ); - msg.concat( re.Message ); - throw RuntimeException( msg, Reference< XInterface > () ); - } + Reference< xml::sax::XParser > xParser( + xMgr->createInstanceWithContext( OUString::createFromAscii( "com.sun.star.xml.sax.Parser" ), m_xContext ), + UNO_QUERY_THROW ); // xxx todo: error handler, entity resolver omitted // This class is the document handler for the parser diff --git a/scripting/source/storage/ScriptSecurityManager.cxx b/scripting/source/storage/ScriptSecurityManager.cxx index 3fde4e466974..fbe6f41b4663 100755 --- a/scripting/source/storage/ScriptSecurityManager.cxx +++ b/scripting/source/storage/ScriptSecurityManager.cxx @@ -47,7 +47,7 @@ #include "ScriptSecurityManager.hxx" #include #include - +#include using namespace ::rtl; using namespace ::osl; @@ -85,28 +85,15 @@ static const int ADD_TO_PATH = 2; // ScriptSecurityManager Constructor ScriptSecurityManager::ScriptSecurityManager( const Reference< XComponentContext > & xContext ) throw ( RuntimeException ) - : m_xContext( xContext) + : m_xContext( xContext, UNO_SET_THROW ) { OSL_TRACE( "< ScriptSecurityManager ctor called >\n" ); - validateXRef( m_xContext, - "ScriptSecurityManager::ScriptSecurityManager: invalid context" ); // get the service manager from the context - Reference< lang::XMultiComponentFactory > xMgr = m_xContext->getServiceManager(); - validateXRef( xMgr, - "ScriptSecurityManager::ScriptSecurityManager: cannot get ServiceManager" ); + Reference< lang::XMultiComponentFactory > xMgr( m_xContext->getServiceManager(), UNO_SET_THROW ); // create an instance of the ConfigurationProvider - Reference< XInterface > xInterface = xMgr->createInstanceWithContext( - s_configProv, m_xContext ); - validateXRef( xInterface, - "ScriptSecurityManager::ScriptSecurityManager: cannot get ConfigurationProvider" ); - // create an instance of the ConfigurationAccess for accessing the - // scripting security settings - m_xConfigProvFactory = Reference < lang::XMultiServiceFactory > ( xInterface, UNO_QUERY ); - validateXRef( m_xConfigProvFactory, - "ScriptSecurityManager::ScriptSecurityManager: cannot get XMultiServiceFactory interface from ConfigurationProvider" ); - + m_xConfigProvFactory.set( xMgr->createInstanceWithContext( s_configProv, m_xContext ), UNO_QUERY_THROW ); } void ScriptSecurityManager::addScriptStorage( rtl::OUString scriptStorageURL, @@ -131,35 +118,6 @@ throw ( RuntimeException ) //need to check if storage has any scripts try { - /* need to replace this with something better, now logical names are - * gone - - Reference< XInterface > xInterface; - Any a = m_xContext->getValueByName( - OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) ); - if ( sal_False == ( a >>= xInterface ) ) - { - throw RuntimeException( - OUSTR( "ScriptSecurityManager::addScriptStorage: could not obtain ScriptStorageManager singleton" ), - Reference< XInterface >() ); - } - validateXRef( xInterface, - "ScriptSecurityManager::addScriptStorage: cannot get Storage service" ); - Reference< storage::XScriptStorageManager > xScriptStorageManager( - xInterface, UNO_QUERY_THROW ); - Reference< XInterface > xScriptStorage = - xScriptStorageManager->getScriptStorage( storageID ); - validateXRef( xScriptStorage, - "ScriptNameResolverImpl::getStorageInstance: cannot get Script Storage service" ); - Reference< storage::XScriptInfoAccess > xScriptInfoAccess = - Reference< storage::XScriptInfoAccess > ( xScriptStorage, - UNO_QUERY_THROW ); - Sequence< ::rtl::OUString > logicalNames = xScriptInfoAccess->getScriptLogicalNames(); - if( !logicalNames.getLength() ) // we have no logical names - { - return; - } */ - // we have some scripts so read config & decide on that basis // Setup flags: m_runMacroSetting, m_warning, m_confirmationRequired, readConfiguration(); @@ -317,17 +275,12 @@ throw ( RuntimeException ) short result; try { - Reference< lang::XMultiComponentFactory > xMgr = m_xContext->getServiceManager(); - validateXRef( xMgr, - "ScriptSecurityManager::executeDialog: cannot get ServiceManager" ); - Reference< XInterface > xInterface = - xMgr->createInstanceWithArgumentsAndContext( s_securityDialog, - aArgs, m_xContext ); - validateXRef( xInterface, "ScriptSecurityManager::executeDialog: Can't create SecurityDialog" ); - Reference< awt::XDialog > xDialog( xInterface, UNO_QUERY_THROW ); + Reference< lang::XMultiComponentFactory > xMgr( m_xContext->getServiceManager(), UNO_SET_THROW ); + Reference< awt::XDialog > xDialog( + xMgr->createInstanceWithArgumentsAndContext( s_securityDialog, aArgs, m_xContext ), + UNO_QUERY_THROW ); result = xDialog->execute(); - Reference< lang::XComponent > xComponent( xInterface, UNO_QUERY_THROW ); - validateXRef( xInterface, "ScriptSecurityManager::executeDialog: Can't get XComponent to dispose dialog" ); + Reference< lang::XComponent > xComponent( xDialog, UNO_QUERY_THROW ); xComponent->dispose(); } catch ( RuntimeException & rte ) @@ -410,31 +363,20 @@ void ScriptSecurityManager::removePermissionSettings ( ::rtl::OUString & scriptS void ScriptSecurityManager::readConfiguration() throw ( RuntimeException) { - Reference< XInterface > xInterface; try { - beans::PropertyValue configPath; - configPath.Name = ::rtl::OUString::createFromAscii( "nodepath" ); - configPath.Value <<= ::rtl::OUString::createFromAscii( "org.openoffice.Office.Common/Security/Scripting" ); - Sequence < Any > aargs( 1 ); - aargs[ 0 ] <<= configPath; - validateXRef( m_xConfigProvFactory, - "ScriptSecurityManager::readConfiguration: ConfigProviderFactory no longer valid!" ); - xInterface = m_xConfigProvFactory->createInstanceWithArguments( s_configAccess, - aargs ); - validateXRef( xInterface, - "ScriptSecurityManager::readConfiguration: cannot get ConfigurationAccess" ); - // get the XPropertySet interface from the ConfigurationAccess service - Reference < beans::XPropertySet > xPropSet( xInterface, UNO_QUERY ); - Any value; + beans::PropertyValue configPath; + configPath.Name = ::rtl::OUString::createFromAscii( "nodepath" ); + configPath.Value <<= ::rtl::OUString::createFromAscii( "org.openoffice.Office.Common/Security/Scripting" ); + Sequence < Any > aargs( 1 ); + aargs[ 0 ] <<= configPath; + ENSURE_OR_THROW( m_xConfigProvFactory.is(), + "ScriptSecurityManager::readConfiguration: ConfigProviderFactory no longer valid!" ); + // get the XPropertySet interface from the ConfigurationAccess service + Reference < beans::XPropertySet > xPropSet( m_xConfigProvFactory->createInstanceWithArguments( s_configAccess, aargs ), UNO_QUERY_THROW ); - value=xPropSet->getPropertyValue( OUSTR( "Confirmation" ) ); - if ( sal_False == ( value >>= m_confirmationRequired ) ) - { - throw RuntimeException( - OUSTR( "ScriptSecurityManager:readConfiguration: can't get Confirmation setting" ), - Reference< XInterface > () ); - } + m_confirmationRequired = sal_True; + OSL_VERIFY( xPropSet->getPropertyValue( OUSTR( "Confirmation" ) ) >>= m_confirmationRequired ); if ( m_confirmationRequired == sal_True ) { OSL_TRACE( "ScriptSecurityManager:readConfiguration: confirmation is true" ); @@ -443,13 +385,10 @@ void ScriptSecurityManager::readConfiguration() { OSL_TRACE( "ScriptSecurityManager:readConfiguration: confirmation is false" ); } - value=xPropSet->getPropertyValue( OUSTR( "Warning" ) ); - if ( sal_False == ( value >>= m_warning ) ) - { - throw RuntimeException( - OUSTR( "ScriptSecurityManager:readConfiguration: can't get Warning setting" ), - Reference< XInterface > () ); - } + + m_warning = true; + OSL_VERIFY( xPropSet->getPropertyValue( OUSTR( "Warning" ) ) >>= m_warning ); + if ( m_warning == sal_True ) { OSL_TRACE( "ScriptSecurityManager:readConfiguration: warning is true" ); @@ -458,21 +397,13 @@ void ScriptSecurityManager::readConfiguration() { OSL_TRACE( "ScriptSecurityManager:readConfiguration: warning is false" ); } - value=xPropSet->getPropertyValue( OUSTR( "OfficeBasic" ) ); - if ( sal_False == ( value >>= m_runMacroSetting ) ) - { - throw RuntimeException( - OUSTR( "ScriptSecurityManager:readConfiguration: can't get OfficeBasic setting" ), - Reference< XInterface > () ); - } + + m_runMacroSetting = sal_True; + OSL_VERIFY( xPropSet->getPropertyValue( OUSTR( "OfficeBasic" ) ) >>= m_runMacroSetting ); OSL_TRACE( "ScriptSecurityManager:readConfiguration: OfficeBasic = %d", m_runMacroSetting ); - value=xPropSet->getPropertyValue( OUSTR( "SecureURL" ) ); - if ( sal_False == ( value >>= m_secureURL ) ) - { - throw RuntimeException( - OUSTR( "ScriptSecurityManager:readConfiguration: can't get SecureURL setting" ), - Reference< XInterface > () ); - } + + m_secureURL = ::rtl::OUString(); + OSL_VERIFY( xPropSet->getPropertyValue( OUSTR( "SecureURL" ) ) >>= m_secureURL ); } catch ( beans::UnknownPropertyException & upe ) { @@ -508,18 +439,14 @@ void ScriptSecurityManager::readConfiguration() int length = m_secureURL.getLength(); // PathSubstitution needed to interpret variables found in config - Reference< lang::XMultiComponentFactory > xMgr = m_xContext->getServiceManager(); - validateXRef( xMgr, - "ScriptSecurityManager::readConfiguration: cannot get XMultiComponentFactory" ); - xInterface = xMgr->createInstanceWithContext( - ::rtl::OUString::createFromAscii( - "com.sun.star.util.PathSubstitution"), m_xContext); - validateXRef( xInterface, - "ScriptSecurityManager::readConfiguration: cannot get ConfigurationProvider" ); + Reference< lang::XMultiComponentFactory > xMgr( m_xContext->getServiceManager(), UNO_SET_THROW ); + Reference< XInterface > xInterface = ); Reference< util::XStringSubstitution > xStringSubstitution( - xInterface, UNO_QUERY); - validateXRef( xStringSubstitution, - "ScriptSecurityManager::readConfiguration: cannot get ConfigurationProvider" ); + xMgr->createInstanceWithContext( + ::rtl::OUString::createFromAscii( "com.sun.star.util.PathSubstitution" ), m_xContext + ), + UNO_QUERY_THROW + ); for( int i = 0; i < length; i++ ) { OSL_TRACE( "ScriptSecurityManager:readConfiguration path = %s", @@ -552,16 +479,9 @@ throw ( RuntimeException ) configPath.Value <<= ::rtl::OUString::createFromAscii( "org.openoffice.Office.Common/Security/Scripting" ); Sequence < Any > aargs( 1 ); aargs[ 0 ] <<= configPath; - Reference< XInterface > xInterface = m_xConfigProvFactory->createInstanceWithArguments( s_configUpdate, - aargs ); - validateXRef( xInterface, - "ScriptSecurityManager::addToSecurePaths: ScriptSecurityManager: cannot get ConfigurationUpdateAccess" ); - Reference < container::XNameReplace > xNameReplace( xInterface, UNO_QUERY ); - validateXRef( xNameReplace, - "ScriptSecurityManager::addToSecurePaths: ScriptSecurityManager: cannot get XNameReplace" ); - Reference < util::XChangesBatch > xChangesBatch( xInterface, UNO_QUERY ); - validateXRef( xChangesBatch, - "ScriptSecurityManager::addToSecurePaths: cannot get XChangesBatch" ); + Reference < container::XNameReplace > xNameReplace( + m_xConfigProvFactory->createInstanceWithArguments( s_configUpdate, aargs ), UNO_QUERY_THROW ); + Reference < util::XChangesBatch > xChangesBatch( xNameReplace, UNO_QUERY_THROW ); OSL_TRACE( "--->ScriptSecurityManager::addToSecurePaths: after if stuff" ); Reference < beans::XPropertySet > xPropSet( xInterface, UNO_QUERY ); diff --git a/scripting/source/storage/ScriptStorage.cxx b/scripting/source/storage/ScriptStorage.cxx index 7315e9d35dd5..e4ea5f231f47 100644 --- a/scripting/source/storage/ScriptStorage.cxx +++ b/scripting/source/storage/ScriptStorage.cxx @@ -84,16 +84,11 @@ const sal_uInt16 NUMBER_STORAGE_INITIALIZE_ARGS = 3; ScriptStorage::ScriptStorage( const Reference < XComponentContext > & xContext ) throw ( RuntimeException ) - : m_xContext( xContext ), m_bInitialised( false ) + : m_xContext( xContext, UNO_SET_THROW ), m_bInitialised( false ) { OSL_TRACE( "< ScriptStorage ctor called >\n" ); - validateXRef( m_xContext, - "ScriptStorage::ScriptStorage : cannot get component context" ); - - m_xMgr = m_xContext->getServiceManager(); - validateXRef( m_xMgr, - "ScriptStorage::ScriptStorage : cannot get service manager" ); + m_xMgr.set( m_xContext->getServiceManager(), UNO_SET_THROW ); if( !mh_scriptLangs ) { @@ -101,47 +96,30 @@ throw ( RuntimeException ) if( !mh_scriptLangs ) { mh_scriptLangs = new ScriptLanguages_hash(); - Reference< XInterface > xInterface = - m_xMgr->createInstanceWithContext( - OUString::createFromAscii( - "com.sun.star.configuration.ConfigurationProvider" ) - , m_xContext ); - validateXRef( xInterface, - "ScriptStorage::ScriptStorage: cannot get ConfigurationProvider" ); + Reference< lang::XMultiServiceFactory > xConfigProvFactory( + m_xMgr->createInstanceWithContext( OUString::createFromAscii( "com.sun.star.configuration.ConfigurationProvider" ), m_xContext ), + UNO_QUERY_THROW ); // create an instance of the ConfigurationAccess for accessing the // scripting runtime settings - Reference< lang::XMultiServiceFactory > xConfigProvFactory = - Reference < lang::XMultiServiceFactory > - ( xInterface, UNO_QUERY_THROW ); - validateXRef( xConfigProvFactory, - "ScriptStorage::ScriptStorage: cannot get XMultiServiceFactory interface from ConfigurationProvider" ); beans::PropertyValue configPath; configPath.Name = ::rtl::OUString::createFromAscii( "nodepath" ); configPath.Value <<= ::rtl::OUString::createFromAscii( "org.openoffice.Office.Scripting/ScriptRuntimes" ); Sequence < Any > aargs( 1 ); aargs[ 0 ] <<= configPath; - xInterface = xConfigProvFactory->createInstanceWithArguments( - OUString::createFromAscii( - "com.sun.star.configuration.ConfigurationAccess"), - aargs ); - validateXRef( xInterface, - "ScriptStorage::ScriptStorage: cannot get ConfigurationAccess" ); - Reference< container::XNameAccess > xNameAccess = - Reference < container::XNameAccess > ( xInterface, - UNO_QUERY_THROW ); - validateXRef( xNameAccess, - "ScriptStorage::ScriptStorage: cannot get ConfigurationAccess" ); + Reference< container::XNameAccess > xNameAccess( + xConfigProvFactory->createInstanceWithArguments( + OUString::createFromAscii( "com.sun.star.configuration.ConfigurationAccess" ), + aargs + ), + UNO_QUERY_THROW ); + Sequence< OUString > names = xNameAccess->getElementNames(); for( int i = 0 ; i < names.getLength() ; i++ ) { OSL_TRACE( "Getting propertyset for Lang=%s", ::rtl::OUStringToOString( names[i], RTL_TEXTENCODING_ASCII_US ).pData->buffer ); - Reference< beans::XPropertySet > xPropSet = - Reference< beans::XPropertySet >( xNameAccess->getByName(names[i]), - UNO_QUERY_THROW ); - validateXRef( xPropSet, - "ScriptStorage::ScriptStorage: cannot get XPropertySet for name" ); + Reference< beans::XPropertySet > xPropSet( xNameAccess->getByName( names[i] ), UNO_QUERY_THROW ); Any aProp = xPropSet->getPropertyValue( OUString::createFromAscii( "SupportedFileExtensions") ); Sequence< OUString > extns; @@ -285,9 +263,7 @@ throw ( RuntimeException, Exception ) OUString xStringUri(m_stringUri); ScriptMetadataImporter* SMI = new ScriptMetadataImporter( m_xContext ); - Reference< xml::sax::XExtendedDocumentHandler > xSMI( SMI ); - - validateXRef( xSMI, "ScriptStorage::create: failed to obtain valid XExtendedDocumentHandler" ); + Reference< xml::sax::XExtendedDocumentHandler > xSMI( SMI, UNO_SET_THROW ); xStringUri = xStringUri.concat( ::rtl::OUString::createFromAscii( SCRIPT_DIR ) ); @@ -587,15 +563,14 @@ throw ( RuntimeException ) "/parcel.xml" ) ), RTL_TEXTENCODING_ASCII_US ).pData->buffer ); - Reference< XInterface > xInterface = + xHandler.set( m_xMgr->createInstanceWithContext( - OUString::createFromAscii( "com.sun.star.xml.sax.Writer" ), - m_xContext ); - validateXRef( xInterface, "ScriptStorage::save: cannot get sax.Writer" ); - xHandler = Reference( - xInterface, UNO_QUERY_THROW ); - xSource = Reference< io::XActiveDataSource >( - xHandler, UNO_QUERY_THROW ); + OUString::createFromAscii( "com.sun.star.xml.sax.Writer" ), + m_xContext + ), + UNO_QUERY_THROW + ); + xSource.set( xHandler, UNO_QUERY_THROW ); xSource->setOutputStream( xOS ); writeMetadataHeader( xHandler ); diff --git a/scripting/source/storage/ScriptStorageManager.cxx b/scripting/source/storage/ScriptStorageManager.cxx index 77ca5a45dd15..424f2752bc47 100644 --- a/scripting/source/storage/ScriptStorageManager.cxx +++ b/scripting/source/storage/ScriptStorageManager.cxx @@ -45,6 +45,7 @@ #include "ScriptStorageManager.hxx" #include #include +#include using namespace ::rtl; using namespace ::com::sun::star; @@ -70,32 +71,19 @@ static Sequence< OUString > s_serviceNames = Sequence< OUString >( &s_serviceNam // ScriptStorageManager Constructor ScriptStorageManager::ScriptStorageManager( const Reference< XComponentContext > & xContext ) SAL_THROW ( ( RuntimeException ) ) - : m_xContext( xContext ), m_count( 0 ), m_securityMgr( xContext ) + : m_xContext( xContext, UNO_SET_THROW ), m_count( 0 ), m_securityMgr( xContext ) { OSL_TRACE( "< ScriptStorageManager ctor called >\n" ); //s_moduleCount.modCnt.acquire( &s_moduleCount.modCnt ); - validateXRef( m_xContext, - "ScriptStorageManager::ScriptStorageManager : cannot get component context" ); - - m_xMgr = m_xContext->getServiceManager(); - validateXRef( m_xMgr, - "ScriptStorageManager::ScriptStorageManager : cannot get service manager" ); + m_xMgr.set( m_xContext->getServiceManager(), UNO_SET_THROW ); try { // obtain the macro expander singleton to use in determining the // location of the application script storage - Any aAny = m_xContext->getValueByName( OUString::createFromAscii( - "/singletons/com.sun.star.util.theMacroExpander" ) ); - Reference< util::XMacroExpander > xME; - if ( sal_False == ( aAny >>= xME ) ) - { - throw RuntimeException( - OUSTR( "ScriptStorageManager::ScriptStorageManager: can't get XMacroExpander" ), - Reference< XInterface >() ); - } - validateXRef( xME, "ScriptStorageManager constructor: can't get MacroExpander" ); + Reference< util::XMacroExpander > xME( m_xContext->getValueByName( OUString::createFromAscii( + "/singletons/com.sun.star.util.theMacroExpander" ) ), UNO_QUERY_THROW ); OUString base = OUString::createFromAscii( SAL_CONFIGFILE( "${$BRAND_BASE_DIR/program/bootstrap" ) ); @@ -126,12 +114,13 @@ SAL_THROW ( ( RuntimeException ) ) { try { - Reference< XInterface > xInterface = + Reference< ucb::XSimpleFileAccess > xSFA( m_xMgr->createInstanceWithContext( - OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), m_xContext ); - validateXRef( xInterface, - "ScriptStorageManager constructor: can't get SimpleFileAccess XInterface" ); - Reference< ucb::XSimpleFileAccess > xSFA( xInterface, UNO_QUERY_THROW ); + OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), + m_xContext + ), + UNO_QUERY_THROW + ); setupAnyStorage( xSFA, xME->expandMacros( storageStr ), appStr ); } @@ -168,13 +157,14 @@ SAL_THROW ( ( RuntimeException ) ) ::rtl::OUStringToOString( storageStr, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); - Reference< XInterface > xInterface = + Reference< XInterface > xInterface( m_xMgr->createInstanceWithArgumentsAndContext( - OUString::createFromAscii( - "drafts.com.sun.star.script.framework.storage.ScriptStorage" ), - aArgs, m_xContext ); - - validateXRef( xInterface, "ScriptStorageManager:: setupAnyStorage: Can't create ScriptStorage for share" ); + OUString::createFromAscii( "drafts.com.sun.star.script.framework.storage.ScriptStorage" ), + aArgs, + m_xContext + ), + UNO_QUERY_THROW + ); // and place it in the hash_map. Increment the counter m_ScriptStorageMap[ m_count++ ] = xInterface; @@ -215,8 +205,7 @@ ScriptStorageManager::createScriptStorage( throw ( RuntimeException ) { OSL_TRACE( "** ==> ScriptStorageManager in createScriptingStorage\n" ); - validateXRef( xSFA, - "ScriptStorageManager::createScriptStorage: XSimpleFileAccess is not valid" ); + ENSURE_OR_THROW( xSFA.is(), "ScriptStorageManager::createScriptStorage: XSimpleFileAccess is not valid" ); return setupAnyStorage( xSFA, ::rtl::OUString::createFromAscii( "" ), ::rtl::OUString::createFromAscii( "" ) ); @@ -229,7 +218,7 @@ ScriptStorageManager::createScriptStorageWithURI( throw ( RuntimeException ) { OSL_TRACE( "** ==> ScriptStorageManager in createScriptingStorageWithURI\n" ); - validateXRef( xSFA, "ScriptStorageManager::createScriptStorage: XSimpleFileAccess is not valid" ); + ENSURE_OR_THROW( xSFA.is(), "ScriptStorageManager::createScriptStorage: XSimpleFileAccess is not valid" ); // related to issue 11866 // warning dialog gets launched when adding binding to script in doc @@ -313,7 +302,7 @@ throw( RuntimeException ) OUSTR( "ScriptStorageManager::getScriptStorage: invalid storage ID" ), Reference< XInterface >() ); } - validateXRef( itr->second, + ENSURE_OR_THROW( itr->second.is(), "ScriptStorageManager::getScriptStorage: Cannot get ScriptStorage from ScriptStorageHash" ); return itr->second; } diff --git a/sfx2/Library_sfx.mk b/sfx2/Library_sfx.mk index 3c3ebe85294e..fb4d1a51857e 100755 --- a/sfx2/Library_sfx.mk +++ b/sfx2/Library_sfx.mk @@ -137,7 +137,6 @@ $(eval $(call gb_Library_add_exception_objects,sfx,\ sfx2/source/control/bindings \ sfx2/source/control/ctrlitem \ sfx2/source/control/dispatch \ - sfx2/source/control/macrconf \ sfx2/source/control/macro \ sfx2/source/control/minfitem \ sfx2/source/control/msg \ @@ -215,6 +214,7 @@ $(eval $(call gb_Library_add_exception_objects,sfx,\ sfx2/source/doc/plugin \ sfx2/source/doc/printhelper \ sfx2/source/doc/querytemplate \ + sfx2/source/doc/docundomanager \ sfx2/source/doc/sfxbasemodel \ sfx2/source/doc/sfxmodelfactory \ sfx2/source/doc/syspath \ diff --git a/sfx2/Package_inc.mk b/sfx2/Package_inc.mk index 6ad8b0209c4e..85ce4143323c 100644 --- a/sfx2/Package_inc.mk +++ b/sfx2/Package_inc.mk @@ -81,7 +81,6 @@ $(eval $(call gb_Package_add_file,sfx2_inc,inc/sfx2/layout.hxx,sfx2/layout.hxx)) $(eval $(call gb_Package_add_file,sfx2_inc,inc/sfx2/linkmgr.hxx,sfx2/linkmgr.hxx)) $(eval $(call gb_Package_add_file,sfx2_inc,inc/sfx2/linksrc.hxx,sfx2/linksrc.hxx)) $(eval $(call gb_Package_add_file,sfx2_inc,inc/sfx2/lnkbase.hxx,sfx2/lnkbase.hxx)) -$(eval $(call gb_Package_add_file,sfx2_inc,inc/sfx2/macrconf.hxx,sfx2/macrconf.hxx)) $(eval $(call gb_Package_add_file,sfx2_inc,inc/sfx2/mailmodelapi.hxx,sfx2/mailmodelapi.hxx)) $(eval $(call gb_Package_add_file,sfx2_inc,inc/sfx2/mgetempl.hxx,sfx2/mgetempl.hxx)) $(eval $(call gb_Package_add_file,sfx2_inc,inc/sfx2/mieclip.hxx,sfx2/mieclip.hxx)) diff --git a/sfx2/inc/sfx2/app.hxx b/sfx2/inc/sfx2/app.hxx index 804a43b35d7f..d27d9d6f1ba4 100644 --- a/sfx2/inc/sfx2/app.hxx +++ b/sfx2/inc/sfx2/app.hxx @@ -31,6 +31,7 @@ #include "sfx2/dllapi.h" #include "sal/types.h" #include +#include #include #include #include @@ -98,6 +99,8 @@ struct SfxStbCtrlFactory; struct SfxTbxCtrlFactory; class SimpleResMgr; class ModalDialog; +class SbxArray; +class SbxValue; namespace sfx2 { @@ -218,28 +221,26 @@ public: // members SfxFilterMatcher& GetFilterMatcher(); - SfxMacroConfig* GetMacroConfig() const; SfxProgress* GetProgress() const; const String& GetLastSaveDirectory() const; - sal_uInt16 GetFreeIndex(); + sal_uInt16 GetFreeIndex(); void ReleaseIndex(sal_uInt16 i); - SfxEventConfiguration* GetEventConfig() const; // Basic/Scripting static sal_Bool IsXScriptURL( const String& rScriptURL ); static ::rtl::OUString ChooseScript(); static void MacroOrganizer( sal_Int16 nTabId ); + static ErrCode CallBasic( const String&, BasicManager*, SbxArray *pArgs, SbxValue *pRet ); + static ErrCode CallAppBasic( const String& i_macroName, SbxArray* i_args = NULL, SbxValue* i_ret = NULL ) + { return CallBasic( i_macroName, SfxApplication::GetOrCreate()->GetBasicManager(), i_args, i_ret ); } BasicManager* GetBasicManager(); com::sun::star::uno::Reference< com::sun::star::script::XLibraryContainer > GetDialogContainer(); com::sun::star::uno::Reference< com::sun::star::script::XLibraryContainer > GetBasicContainer(); StarBASIC* GetBasic(); - sal_uInt16 SaveBasicManager() const; - sal_uInt16 SaveBasicAndDialogContainer() const; - void EnterBasicCall(); - bool IsInBasicCall() const; - void LeaveBasicCall(); + sal_uInt16 SaveBasicManager() const; + sal_uInt16 SaveBasicAndDialogContainer() const; void RegisterBasicConstants( const char *pPrefix, const SfxConstant *pConsts, sal_uInt16 nCount ); @@ -293,8 +294,6 @@ public: SAL_DLLPRIVATE void MiscState_Impl(SfxItemSet &); SAL_DLLPRIVATE void PropExec_Impl(SfxRequest &); SAL_DLLPRIVATE void PropState_Impl(SfxItemSet &); - SAL_DLLPRIVATE void MacroExec_Impl(SfxRequest &); - SAL_DLLPRIVATE void MacroState_Impl(SfxItemSet &); SAL_DLLPRIVATE void INetExecute_Impl(SfxRequest &); SAL_DLLPRIVATE void INetState_Impl(SfxItemSet &); SAL_DLLPRIVATE void OfaExec_Impl(SfxRequest &); @@ -303,7 +302,6 @@ public: SAL_DLLPRIVATE void SetProgress_Impl(SfxProgress *); SAL_DLLPRIVATE const String& GetLastDir_Impl() const; SAL_DLLPRIVATE void SetLastDir_Impl( const String & ); - SAL_DLLPRIVATE void PlayMacro_Impl( SfxRequest &rReq, StarBASIC *pBas ); SAL_DLLPRIVATE void EnterAsynchronCall_Impl(); SAL_DLLPRIVATE bool IsInAsynchronCall_Impl() const; diff --git a/sfx2/inc/sfx2/dispatch.hxx b/sfx2/inc/sfx2/dispatch.hxx index 4a027bba78c8..945d04b71f99 100644 --- a/sfx2/inc/sfx2/dispatch.hxx +++ b/sfx2/inc/sfx2/dispatch.hxx @@ -211,11 +211,8 @@ public: Window *pWin, const Point *pPosPixel, const SfxPoolItem *pArg1, ... ); - void EnterAction( const String& rName ); - void LeaveAction(); - - sal_Bool IsAppDispatcher() const; - sal_Bool IsFlushed() const; + sal_Bool IsAppDispatcher() const; + sal_Bool IsFlushed() const; void Flush(); void Lock( sal_Bool bLock ); sal_Bool IsLocked( sal_uInt16 nSID = 0 ) const; diff --git a/sfx2/inc/sfx2/evntconf.hxx b/sfx2/inc/sfx2/evntconf.hxx index 0606209777d1..791b63da930a 100644 --- a/sfx2/inc/sfx2/evntconf.hxx +++ b/sfx2/inc/sfx2/evntconf.hxx @@ -45,10 +45,6 @@ #define ITEMID_MACRO SID_ATTR_MACROITEM #include -class SfxMacroInfo; -class SfxMacroInfoArr_Impl; -class SfxEventConfigItem_Impl; -class SfxEventInfoArr_Impl; class SfxObjectShell; class SvxMacroTableDtor; diff --git a/sfx2/inc/sfx2/macrconf.hxx b/sfx2/inc/sfx2/macrconf.hxx deleted file mode 100644 index 6b50ddf3497a..000000000000 --- a/sfx2/inc/sfx2/macrconf.hxx +++ /dev/null @@ -1,155 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#ifndef _SFX_MACROCONF_HXX -#define _SFX_MACROCONF_HXX - -#include "sal/config.h" -#include "sfx2/dllapi.h" -#include "sal/types.h" -#include -#define _SVSTDARR_USHORTS -#include // SvUShorts -#include - -class SfxMacroInfo; -class SfxSlot; -class SfxMacroInfoItem; -class SfxObjectShell; -class BasicManager; -struct SfxMacroConfig_Impl; -class SbMethod; -class SbxValue; -class SbxObject; -class SbxArray; -class SvStream; -class SvxMacro; - -typedef SfxMacroInfo* SfxMacroInfoPtr; -//#if 0 // _SOLAR__PRIVATE -SV_DECL_PTRARR(SfxMacroInfoArr_Impl, SfxMacroInfoPtr, 5, 5) -//#else -//class SfxMacroInfoArr_Impl; -//#endif - -class SFX2_DLLPUBLIC SfxMacroInfo -{ -friend class SfxMacroConfig; -friend class SfxEventConfiguration; -friend SvStream& operator >> (SvStream& rStream, SfxMacroInfo& rInfo); -friend SvStream& operator << (SvStream& rStream, const SfxMacroInfo& rInfo); - - String* pHelpText; - sal_uInt16 nRefCnt; - sal_Bool bAppBasic; - String aLibName; - String aModuleName; - String aMethodName; - sal_uInt16 nSlotId; - SfxSlot* pSlot; - -public: - SfxMacroInfo( const String& rURL ); - SfxMacroInfo( bool _bAppBasic = true ); - SfxMacroInfo( bool _bAppBasic, const String& rQualifiedName ); - SfxMacroInfo(SfxMacroInfo& rOther); - SfxMacroInfo(bool _bAppBasic, const String& rLibName, - const String& rModuleName, const String& rMethodName); - ~SfxMacroInfo(); - sal_Bool operator==(const SfxMacroInfo& rOther) const; - int Load (SvStream&); - int Store (SvStream&); - String GetMacroName() const; - String GetQualifiedName() const; - String GetFullQualifiedName() const; - BasicManager* GetBasicManager() const; - String GetBasicName() const; - String GetHelpText() const; - sal_Bool IsAppMacro() const - { return bAppBasic; } - const String& GetModuleName() const - { return aModuleName; } - const String& GetLibName() const - { return aLibName; } - const String& GetMethodName() const - { return aMethodName; } - sal_uInt16 GetSlotId() const - { return nSlotId; } - SfxSlot* GetSlot() const - { return pSlot; } - - sal_Bool Compare( const SvxMacro& ) const; - void SetHelpText( const String& rText ); - String GetURL() const; -}; - -//ASDBG obsolete >= 582 -//ASDBG class ::com::sun::star::uno::Reference< ::com::sun::star::script::XEngine > ; -//ASDBG class ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > ; - -class SFX2_DLLPUBLIC SfxMacroConfig -{ -friend class SfxEventConfiguration; - - SAL_DLLPRIVATE static SfxMacroConfig* pMacroConfig; - - SfxMacroConfig_Impl* pImp; - SvUShorts aIdArray; - -public: - SfxMacroConfig(); - ~SfxMacroConfig(); - - static SfxMacroConfig* GetOrCreate(); - - static String RequestHelp( sal_uInt16 nId ); - static sal_Bool IsMacroSlot( sal_uInt16 nId ); - static sal_Bool IsBasic( SbxObject*, const String&, BasicManager* ); - static ErrCode Call( SbxObject*, const String&, BasicManager*, - SbxArray *pArgs=NULL, SbxValue *pRet=NULL ); -//ASDBG obsolete >= 582 -//ASDBG static void CallStarScript( const ::com::sun::star::uno::Reference< ::com::sun::star::script::XEngine > & rxEngine, const String & rCode, -//ASDBG const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & rSource, void *pArgs, void *pRet ); - static SbMethod* GetMethod_Impl( const String&, BasicManager* ); - - sal_uInt16 GetSlotId(SfxMacroInfoPtr); - void ReleaseSlotId(sal_uInt16 nId); - void RegisterSlotId(sal_uInt16 nId); - SfxMacroInfo* GetMacroInfo(sal_uInt16 nId) const; - sal_Bool ExecuteMacro(sal_uInt16 nId, const String& rArgs ) const; - sal_Bool ExecuteMacro( SfxObjectShell*, const SvxMacro*, const String& ) const; - sal_Bool CheckMacro(sal_uInt16 nId) const; - sal_Bool CheckMacro( SfxObjectShell*, const SvxMacro* ) const; - -//#if 0 // _SOLAR__PRIVATE - SAL_DLLPRIVATE static void Release_Impl(); - SAL_DLLPRIVATE const SfxMacroInfo* GetMacroInfo_Impl( const SvxMacro *pMacro ) const; - DECL_DLLPRIVATE_LINK( CallbackHdl_Impl, SfxMacroConfig*); - DECL_DLLPRIVATE_LINK( EventHdl_Impl, SfxMacroInfo*); -//#endif -}; - -#endif diff --git a/sfx2/inc/sfx2/objsh.hxx b/sfx2/inc/sfx2/objsh.hxx index 4a0dbfaf12f9..05ae3365d6b1 100644 --- a/sfx2/inc/sfx2/objsh.hxx +++ b/sfx2/inc/sfx2/objsh.hxx @@ -73,7 +73,6 @@ class BasicManager; class SfxMedium; class SfxObjectFactory; class SfxDocumentInfoDialog; -class SfxEventConfigItem_Impl; class SfxStyleSheetBasePool; class INote; class SfxStyleSheetPool; @@ -190,12 +189,6 @@ in fremde Objekte integriert werden k"onnen. ----------------------------------------------------------------------*/ -enum SfxTitleQuery -{ - SFX_TITLE_QUERY_SAVE_NAME_PROPOSAL -}; - - class SfxToolBoxConfig; struct TransferableObjectDescriptor; @@ -363,36 +356,11 @@ public: sal_uInt16 GetScriptingSignatureState(); void SignScriptingContent(); - virtual String QueryTitle( SfxTitleQuery ) const; virtual SfxDocumentInfoDialog* CreateDocumentInfoDialog( Window *pParent, const SfxItemSet& ); - sal_Bool IsBasic( const String & rCode, SbxObject * pVCtrl = NULL ); ErrCode CallBasic( const String& rMacro, const String& rBasicName, - SbxObject* pVCtrl, SbxArray* pArgs = 0, SbxValue* pRet = 0 ); - ErrCode Call( const String & rCode, sal_Bool bIsBasicReturn, SbxObject * pVCtrl = NULL ); - - ErrCode CallScript( - const String & rScriptType, const String & rCode, const void* pArgs = NULL, void* pRet = NULL ); - - /** calls a StarBasic script without magic - @param _rMacroName - specifies the name of the method to execute - @param _rLocation - specifies the location of the script to execute. Allowed values are "application" and "document". - @param _pArguments - This is a pointer to a Sequence< Any >. All elements of the Sequence are wrapped into Basic objects - and passed as arguments to the method specified by _rMacroName - @param _pReturn - If not , the Any pointed to by this argument contains the return value of the (synchronous) call - to the StarBasic macro - */ - ErrCode CallStarBasicScript( - const String& _rMacroName, - const String& _rLocation, - const void* _pArguments = NULL, - void* _pReturn = NULL - ); + SbxArray* pArgs = 0, SbxValue* pRet = 0 ); ErrCode CallXScript( const String& rScriptURL, @@ -787,7 +755,6 @@ public: SAL_DLLPRIVATE SfxObjectShell* GetParentShellByModel_Impl(); // configuration items - SAL_DLLPRIVATE SfxEventConfigItem_Impl* GetEventConfig_Impl( sal_Bool bForce=sal_False ); SAL_DLLPRIVATE SfxToolBoxConfig* GetToolBoxConfig_Impl(); SAL_DLLPRIVATE sal_uInt16 ImplGetSignatureState( sal_Bool bScriptingContent = sal_False ); diff --git a/sfx2/inc/sfx2/sfx.hrc b/sfx2/inc/sfx2/sfx.hrc old mode 100644 new mode 100755 index 44c00cc93018..dfc2dec2f5ff --- a/sfx2/inc/sfx2/sfx.hrc +++ b/sfx2/inc/sfx2/sfx.hrc @@ -222,7 +222,6 @@ #define RID_BUILDVERSION (RID_SFX_START+5) #define RID_DOCALREADYLOADED_DLG (RID_SFX_START+1) -#define RID_CANTLOADDOC_DLG (RID_SFX_START+2) #define TP_DOCINFODESC (RID_SFX_START+3) #define TP_DOCINFODOC (RID_SFX_START+4) @@ -313,16 +312,8 @@ // ------------------------------------------------------------------------ -#define BMP_COLS 21 -#define BMP_SFX_SMALL 1 -#define BMP_SFX_LARGE 2 - #define RID_SFX_GLOBALS 1000 -#define BMP_SFX_COLOR (RID_SFX_GLOBALS + 1) -#define BMP_SFX_MONO (RID_SFX_GLOBALS + 2) -#define SFX_MSG_RES (RID_SFX_GLOBALS + 3) - // ========================================================================= #define RID_OPTIONS_START (SID_LIB_START + 2000) @@ -330,24 +321,6 @@ // ResId's ------------------------------------------------------------------ -#define RID_SFXLANG_BEGIN (RID_OPTIONS_START + 0) -#define RID_SFXLANG_NO (RID_SFXLANG_BEGIN + 0) -#define RID_SFXLANG_GERMAN (RID_SFXLANG_BEGIN + 1) -#define RID_SFXLANG_SWISS_GERMAN (RID_SFXLANG_BEGIN + 2) -#define RID_SFXLANG_US_ENGLISH (RID_SFXLANG_BEGIN + 3) -#define RID_SFXLANG_UK_ENGLISH (RID_SFXLANG_BEGIN + 4) -#define RID_SFXLANG_FRENCH (RID_SFXLANG_BEGIN + 5) -#define RID_SFXLANG_ITALIAN (RID_SFXLANG_BEGIN + 6) -#define RID_SFXLANG_CAST_SPANISH (RID_SFXLANG_BEGIN + 7) -#define RID_SFXLANG_PORTUGUESE (RID_SFXLANG_BEGIN + 8) -#define RID_SFXLANG_DANISH (RID_SFXLANG_BEGIN + 9) -#define RID_SFXLANG_DUTCH (RID_SFXLANG_BEGIN + 10) -#define RID_SFXLANG_SWEDISH (RID_SFXLANG_BEGIN + 11) -#define RID_SFXLANG_FINNISH (RID_SFXLANG_BEGIN + 12) -#define RID_SFXLANG_NORWEG_BOKMAL (RID_SFXLANG_BEGIN + 13) -#define RID_SFXLANG_NORWEG_NYNORSK (RID_SFXLANG_BEGIN + 14) -#define RID_SFXLANG_ALL (RID_SFXLANG_BEGIN + 15) - #define RID_SFXPAGE_SAVE (RID_OPTIONS_START + 0) #define RID_SFXPAGE_GENERAL (RID_OPTIONS_START + 1) #define RID_SFXPAGE_SPELL (RID_OPTIONS_START + 2) @@ -356,10 +329,7 @@ #define RID_SFXQB_DELDICT (RID_OPTIONS_START + 5) #define RID_SFXPAGE_PATH (RID_OPTIONS_START + 6) #define RID_SFXPAGE_LINGU (RID_OPTIONS_START + 7) -#define RID_SFXPAGE_INET (RID_OPTIONS_START + 8) -#define RID_SFXQB_DEL_IGNORELIST (RID_OPTIONS_START + 9) #define RID_SFXQB_SET_LANGUAGE (RID_OPTIONS_START + 10) -#define RID_ITEMLIST_LINGU (RID_OPTIONS_START + 11) #define RID_SFXPAGE_PRINTOPTIONS (RID_OPTIONS_START + 12) #define RID_STR_NEW_TASK (RID_SFX_DOC_START+ 76) diff --git a/sfx2/inc/sfx2/sfxbasemodel.hxx b/sfx2/inc/sfx2/sfxbasemodel.hxx index d0978ebc1e5f..017486d251de 100644 --- a/sfx2/inc/sfx2/sfxbasemodel.hxx +++ b/sfx2/inc/sfx2/sfxbasemodel.hxx @@ -44,6 +44,7 @@ #include #include #include +#include #include @@ -97,9 +98,9 @@ #include //________________________________________________________________________________________________________ -#if ! defined(INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_31) -#define INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_31 -#define COMPHELPER_IMPLBASE_INTERFACE_NUMBER 31 +#if ! defined(INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_32) +#define INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_32 +#define COMPHELPER_IMPLBASE_INTERFACE_NUMBER 32 #include #endif @@ -238,11 +239,12 @@ namespace sfx { namespace intern { SfxListener */ -typedef ::comphelper::WeakImplHelper31 < XCHILD +typedef ::comphelper::WeakImplHelper32 < XCHILD , XDOCUMENTINFOSUPPLIER , ::com::sun::star::document::XDocumentPropertiesSupplier , ::com::sun::star::rdf::XDocumentMetadataAccess , ::com::sun::star::document::XDocumentRecovery + , ::com::sun::star::document::XUndoManagerSupplier , XEVENTBROADCASTER , XDOCUMENTEVENTBROADCASTER , XEVENTLISTENER @@ -1320,6 +1322,9 @@ public: ::com::sun::star::io::IOException, ::com::sun::star::lang::WrappedTargetException ); + // css.document.XUndoManagerSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::document::XUndoManager > SAL_CALL getUndoManager( ) throw (::com::sun::star::uno::RuntimeException); + //____________________________________________________________________________________________________ // ::com::sun::star::rdf::XNode: @@ -1484,22 +1489,11 @@ public: SfxObjectShell* GetObjectShell() const ; SAL_DLLPRIVATE SfxObjectShell* impl_getObjectShell() const ; - /**___________________________________________________________________________________________________ - @short - - @descr - - - @seealso - - - @param - - - @return - - - @onerror - - */ - SAL_DLLPRIVATE sal_Bool impl_isDisposed() const ; sal_Bool IsInitialized() const; + sal_Bool IsDisposed() const { return impl_isDisposed(); } void MethodEntryCheck( const bool i_mustBeInitialized ) const; + ::osl::Mutex& getMutex() const { return m_aMutex; } ::com::sun::star::uno::Reference < ::com::sun::star::container::XIndexAccess > SAL_CALL getViewData() throw (::com::sun::star::uno::RuntimeException); void SAL_CALL setViewData( const ::com::sun::star::uno::Reference < ::com::sun::star::container::XIndexAccess >& aData ) throw (::com::sun::star::uno::RuntimeException); @@ -1575,6 +1569,44 @@ private: } ; // class SfxBaseModel +/** base class for sub components of an SfxBaseModel, which share their ref count and lifetime with the SfxBaseModel +*/ +class SFX2_DLLPUBLIC SfxModelSubComponent +{ +public: + /** checks whether the instance is alive, i.e. properly initialized, and not yet disposed + */ + void MethodEntryCheck() + { + m_rModel.MethodEntryCheck( true ); + } + + // called when the SfxBaseModel which the component is superordinate of is being disposed + virtual void disposing(); + +protected: + SfxModelSubComponent( SfxBaseModel& i_model ) + :m_rModel( i_model ) + { + } + virtual ~SfxModelSubComponent(); + + // helpers for implementing XInterface - delegates ref counting to the SfxBaseModel + void acquire() { m_rModel.acquire(); } + void release() { m_rModel.release(); } + + bool isDisposed() const { return m_rModel.IsDisposed(); } + +protected: + const SfxBaseModel& getBaseModel() const { return m_rModel; } + SfxBaseModel& getBaseModel() { return m_rModel; } + + ::osl::Mutex& getMutex() { return m_rModel.getMutex(); } + +private: + SfxBaseModel& m_rModel; +}; + class SFX2_DLLPUBLIC SfxModelGuard { public: @@ -1591,17 +1623,27 @@ public: { i_rModel.MethodEntryCheck( i_eState != E_INITIALIZING ); } + SfxModelGuard( SfxModelSubComponent& i_rSubComponent ) + :m_aGuard( Application::GetSolarMutex() ) + { + i_rSubComponent.MethodEntryCheck(); + } ~SfxModelGuard() { } + void reset() + { + m_aGuard.reset(); + } + void clear() { m_aGuard.clear(); } private: - ::vos::OClearableGuard m_aGuard; + ::osl::ResettableGuard< ::vos::IMutex > m_aGuard; }; #undef css diff --git a/sfx2/inc/sfx2/sfxcommands.h b/sfx2/inc/sfx2/sfxcommands.h old mode 100644 new mode 100755 index bdf27baac7b3..035f2f187bb8 --- a/sfx2/inc/sfx2/sfxcommands.h +++ b/sfx2/inc/sfx2/sfxcommands.h @@ -1,345 +1,342 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#ifndef SFX2_SFXCOMMANDS_HRC -#define SFX2_SFXCOMMANDS_HRC - -#define CMD_SID_VIEWSHELL0 ".uno:_SwitchViewShell0" -#define CMD_SID_VIEWSHELL1 ".uno:_SwitchViewShell1" -#define CMD_SID_VIEWSHELL2 ".uno:_SwitchViewShell2" -#define CMD_SID_VIEWSHELL3 ".uno:_SwitchViewShell3" -#define CMD_SID_VIEWSHELL4 ".uno:_SwitchViewShell4" -#define CMD_SID_ABOUT ".uno:About" -#define CMD_SID_ACTIVATE ".uno:Activate" -#define CMD_SID_HELPBALLOONS ".uno:ActiveHelp" -#define CMD_SID_STYLE_FAMILY ".uno:ActualStyleFamily" -#define CMD_SID_NEWDOC ".uno:NewDoc" -#define CMD_SID_CREATELINK ".uno:AddBookmark" -#define CMD_SID_NEWDOCDIRECT ".uno:AddDirect" -#define CMD_SID_TEMPLATE_ADDRESSBOKSOURCE ".uno:AddressBookSource" -#define CMD_SID_BASICIDE_ADDWATCH ".uno:AddWatch" -#define CMD_SID_DOCINFO_AUTHOR ".uno:Author" -#define CMD_SID_AUTOHIDE ".uno:AutoHide" -#define CMD_SID_AUTOPILOTMENU ".uno:AutoPilotMenu" -#define CMD_SID_GALLERY_BG_BRUSH ".uno:BackgroundImage" -#define CMD_SID_BACKSPACE ".uno:Backspace" -#define CMD_SID_BASICBREAK ".uno:BasicBreak" -#define CMD_SID_BASICIDE_APPEAR ".uno:BasicIDEAppear" -#define CMD_SID_BASICSTEPINTO ".uno:BasicStepInto" -#define CMD_SID_BASICSTEPOUT ".uno:BasicStepOut" -#define CMD_SID_BASICSTEPOVER ".uno:BasicStepOver" -#define CMD_SID_BASICSTOP ".uno:BasicStop" -#define CMD_SID_BROWSER ".uno:Beamer" -#define CMD_SID_BASICIDE_BRKPNTSCHANGED ".uno:BreakPointsChanged" -#define CMD_SID_BROWSE_BACKWARD ".uno:BrowseBackward" -#define CMD_SID_BROWSE_FORWARD ".uno:BrowseForward" -#define CMD_SID_BROWSER_MODE ".uno:BrowseView" -#define CMD_SID_BUILD_VERSION ".uno:BuildVersion" -#define CMD_SID_CAPTION ".uno:Caption" -#define CMD_SID_STYLE_FAMILY1 ".uno:CharStyle" -#define CMD_SID_CHECK_KEY ".uno:CheckKey" -#define CMD_SID_BASICIDE_CHOOSEMACRO ".uno:ChooseMacro" -#define CMD_SID_CLEARHISTORY ".uno:ClearHistory" -#define CMD_SID_CLOSEWINS ".uno:CloseWins" -#define CMD_SID_CLOSEDOCS ".uno:CloseDocs" -#define CMD_SID_CLOSEDOC ".uno:CloseDoc" -#define CMD_SID_CLOSEWIN ".uno:CloseWin" -#define CMD_SID_CLOSING ".uno:Closing" -#define CMD_SID_DOCINFO_COMMENTS ".uno:Comments" -#define CMD_SID_OFFICE_COMMERCIAL_USE ".uno:CommercialUse" -#define CMD_SID_DOCUMENT_COMPARE ".uno:CompareDocuments" -#define CMD_SID_BASICCOMPILE ".uno:CompileBasic" -#define CMD_SID_CONFIG ".uno:ConfigureDialog" -#define CMD_SID_CONTEXT ".uno:Context" -#define CMD_SID_COPY ".uno:Copy" -#define CMD_SID_CRASH ".uno:Crash" -#define CMD_SID_BASICIDE_CREATEMACRO ".uno:CreateMacro" -#define CMD_SID_CURRENT_URL ".uno:CurrentURL" -#define CMD_SID_CURSORENDOFSCREEN ".uno:CursorEndOfScreen" -#define CMD_SID_CURSORTOPOFSCREEN ".uno:CursorTopOfScreen" -#define CMD_SID_OFFICE_CUSTOMERNUMBER ".uno:CustomerNumber" -#define CMD_SID_CUT ".uno:Cut" -#define CMD_SID_DEFAULTFILEPATH ".uno:DefaultFilePath" -#define CMD_SID_DEFAULTFILENAME ".uno:DefaultFileName" -#define CMD_SID_DELETE ".uno:Delete" -#define CMD_SID_BASICIDE_DELETECURRENT ".uno:DeleteCurrent" -#define CMD_SID_STYLE_DELETE ".uno:DeleteStyle" -#define CMD_SID_STYLE_DESIGNER ".uno:DesignerDialog" -#define CMD_SID_STYLE_DRAGHIERARCHIE ".uno:DragHierarchy" -#define CMD_SID_EDITDOC ".uno:EditDoc" -#define CMD_SID_BASICIDE_EDITMACRO ".uno:EditMacro" -#define CMD_SID_STYLE_EDIT ".uno:EditStyle" -#define CMD_FID_SEARCH_NOW ".uno:ExecuteSearch" -#define CMD_SID_EXTENDEDHELP ".uno:ExtendedHelp" -#define CMD_SID_FILE_NAME ".uno:FileName" -#define CMD_SID_FOCUSURLBOX ".uno:FocusUrlBox" -#define CMD_SID_FORMATMENU ".uno:FormatMenu" -#define CMD_SID_STYLE_FAMILY3 ".uno:FrameStyle" -#define CMD_SID_FRAMETITLE ".uno:FrameTitle" -#define CMD_SID_PROGFILENAME ".uno:FullName" -#define CMD_SID_DOCFULLNAME ".uno:FullName" -#define CMD_SID_WIN_FULLSCREEN ".uno:FullScreen" -#define CMD_SID_FILLFRAME ".uno:GetFrameWindow" -#define CMD_SID_CURSORDOWN ".uno:GoDown" -#define CMD_SID_CURSORPAGEDOWN ".uno:GoDownBlock" -#define CMD_SID_CURSORPAGEDOWN_SEL ".uno:GoDownBlockSel" -#define CMD_SID_CURSORDOWN_SEL ".uno:GoDownSel" -#define CMD_SID_CURSORLEFT ".uno:GoLeft" -#define CMD_SID_CURSORPAGELEFT ".uno:GoLeftBlock" -#define CMD_SID_CURSORPAGELEFT_SEL ".uno:GoLeftBlockSel" -#define CMD_SID_CURSORLEFT_SEL ".uno:GoLeftSel" -#define CMD_SID_CURSORRIGHT ".uno:GoRight" -#define CMD_SID_CURSORRIGHT_SEL ".uno:GoRightSel" -#define CMD_SID_CURSORENDOFFILE ".uno:GoToEndOfData" -#define CMD_SID_CURSORENDOFFILE_SEL ".uno:GoToEndOfDataSel" -#define CMD_SID_CURSOREND ".uno:GoToEndOfRow" -#define CMD_SID_CURSOREND_SEL ".uno:GoToEndOfRowSel" -#define CMD_SID_CURSORTOPOFFILE ".uno:GoToStart" -#define CMD_SID_CURSORHOME ".uno:GoToStartOfRow" -#define CMD_SID_CURSORHOME_SEL ".uno:GoToStartOfRowSel" -#define CMD_SID_CURSORTOPOFFILE_SEL ".uno:GoToStartSel" -#define CMD_SID_CURSORUP ".uno:GoUp" -#define CMD_SID_CURSORPAGEUP ".uno:GoUpBlock" -#define CMD_SID_CURSORPAGEUP_SEL ".uno:GoUpBlockSel" -#define CMD_SID_CURSORUP_SEL ".uno:GoUpSel" -#define CMD_SID_HELP_ANNOTATE ".uno:HelpAnnotate" -#define CMD_SID_HELP_BOOKMARK ".uno:HelpBookmark" -#define CMD_SID_HELP_HELPFILEBOX ".uno:HelpChooseFile" -#define CMD_SID_HELP_DOWNLOAD ".uno:HelpDownload" -#define CMD_SID_HELP_PI ".uno:HelperDialog" -#define CMD_SID_HELPINDEX ".uno:HelpIndex" -#define CMD_SID_HELPMENU ".uno:HelpMenu" -#define CMD_SID_HELPONHELP ".uno:HelpOnHelp" -#define CMD_SID_HELP_SEARCH ".uno:HelpSearch" -#define CMD_SID_HELPTIPS ".uno:HelpTip" -#define CMD_SID_HELP_ZOOMIN ".uno:HelpZoomIn" -#define CMD_SID_HELP_ZOOMOUT ".uno:HelpZoomOut" -#define CMD_SID_BASICIDE_HIDECURPAGE ".uno:HideCurPage" -#define CMD_SID_HYPERLINK_DIALOG ".uno:HyperlinkDialog" -#define CMD_SID_INSERTDOC ".uno:InsertDoc" -#define CMD_SID_HYPERLINK_INSERT ".uno:InsertHyperlink" -#define CMD_SID_INSERT_FLOATINGFRAME ".uno:InsertObjectFloatingFrame" -#define CMD_SID_INTERNET_ONLINE ".uno:InternetOnline" -#define CMD_SID_INTERNET_SEARCH ".uno:InternetSearch" -#define CMD_SID_DOC_LOADING ".uno:IsLoading" -#define CMD_SID_IMG_LOADING ".uno:IsLoadingImages" -#define CMD_SID_PRINTOUT ".uno:IsPrinting" -#define CMD_SID_JUMPTOMARK ".uno:JumpToMark" -#define CMD_SID_DOCINFO_KEYWORDS ".uno:Keywords" -#define CMD_SID_BASICIDE_LIBLOADED ".uno:LibLoaded" -#define CMD_SID_BASICIDE_LIBREMOVED ".uno:LibRemoved" -#define CMD_SID_BASICIDE_LIBSELECTED ".uno:LibSelect" -#define CMD_SID_BASICIDE_LIBSELECTOR ".uno:LibSelector" -#define CMD_SID_OFFICE_PLK ".uno:LicenceKey" -#define CMD_SID_CONFIGACCEL ".uno:LoadAccel" -#define CMD_SID_BASICLOAD ".uno:LoadBasic" -#define CMD_SID_LOADCONFIG ".uno:LoadConfiguration" -#define CMD_SID_CONFIGEVENT ".uno:LoadEvents" -#define CMD_SID_CONFIGMENU ".uno:LoadMenu" -#define CMD_SID_CONFIGSTATUSBAR ".uno:LoadStatusBar" -#define CMD_SID_TOOLBOXOPTIONS ".uno:LoadToolBox" -#define CMD_SID_LOGOUT ".uno:Logout" -#define CMD_SID_SCRIPTORGANIZER ".uno:ScriptOrganizer" -#define CMD_SID_MACROORGANIZER ".uno:MacroOrganizer" -#define CMD_SID_RUNMACRO ".uno:RunMacro" -#define CMD_SID_BASICCHOOSER ".uno:MacroDialog" -#define CMD_SID_MAIL_NOTIFY ".uno:MailReceipt" -#define CMD_SID_MAIL_CHILDWIN ".uno:MailWindow" -#define CMD_SID_BASICIDE_MATCHGROUP ".uno:MatchGroup" -#define CMD_SID_TOGGLE_MENUBAR ".uno:MenuBarVisible" -#define CMD_SID_DOCUMENT_MERGE ".uno:MergeDocuments" -#define CMD_SID_ATTR_METRIC ".uno:MetricUnit" -#define CMD_SID_MODIFIED ".uno:Modified" -#define CMD_SID_DOC_MODIFIED ".uno:ModifiedStatus" -#define CMD_SID_BASICIDE_MODULEDLG ".uno:ModuleDialog" -#define CMD_SID_BASICIDE_NAMECHANGEDONTAB ".uno:NameChangedOnTab" -#define CMD_SID_NAVIGATOR ".uno:Navigator" -#define CMD_SID_RESTORE_EDITING_VIEW ".uno:RestoreEditingView" -#define CMD_SID_BASICIDE_NEWDIALOG ".uno:NewDialog" -#define CMD_SID_BASICIDE_NEWMODULE ".uno:NewModule" -#define CMD_SID_CREATE_BASICOBJECT ".uno:NewObject" -#define CMD_SID_STYLE_NEW ".uno:NewStyle" -#define CMD_SID_NEWWINDOW ".uno:NewWindow" -#define CMD_SID_BASICIDE_OBJCAT ".uno:ObjectCatalog" -#define CMD_SID_OBJECT ".uno:ObjectMenue" -#define CMD_SID_OLD_PALK ".uno:OldPALK" -#define CMD_SID_OPENDOC ".uno:Open" -#define CMD_SID_WEBHTML ".uno:WebHtml" -#define CMD_SID_OPENHYPERLINK ".uno:OpenHyperlink" -#define CMD_SID_DOCINFO_TITLE ".uno:DocInfoTitle" -#define CMD_SID_OPENTEMPLATE ".uno:OpenTemplate" -#define CMD_SID_OPENURL ".uno:OpenUrl" -#define CMD_SID_OPTIONS ".uno:Options" -#define CMD_SID_ORGANIZER ".uno:Organizer" -#define CMD_SID_STYLE_FAMILY4 ".uno:PageStyle" -#define CMD_SID_STYLE_FAMILY2 ".uno:ParaStyle" -#define CMD_SID_PARTWIN ".uno:PartWindow" -#define CMD_SID_PASTE ".uno:Paste" -#define CMD_SID_CLIPBOARD_FORMAT_ITEMS ".uno:ClipboardFormatItems" -#define CMD_SID_PASTE_SPECIAL ".uno:PasteSpecial" -#define CMD_SID_DOCPATH ".uno:DocPath" -#define CMD_SID_PICKLIST ".uno:PickList" -#define CMD_SID_PLAYMACRO ".uno:PlayMacro" -#define CMD_SID_PLUGINS_ACTIVE ".uno:PlugInsActive" -#define CMD_SID_PRINTDOC ".uno:Print" -#define CMD_SID_PRINTDOCDIRECT ".uno:PrintDefault" -#define CMD_SID_PRINTER_NAME ".uno:Printer" -#define CMD_SID_SETUPPRINTER ".uno:PrinterSetup" -#define CMD_SID_PRINTPREVIEW ".uno:PrintPreview" -#define CMD_SID_OFFICE_PRIVATE_USE ".uno:PrivateUse" -#define CMD_SID_DOCINFO ".uno:SetDocumentProperties" -#define CMD_SID_QUITAPP ".uno:Quit" -#define CMD_SID_DOC_READONLY ".uno:ReadOnly" -#define CMD_SID_RECORDMACRO ".uno:MacroRecorder" -#define CMD_SID_STOP_RECORDING ".uno:StopRecording" -#define CMD_SID_RECORDING_FLOATWINDOW ".uno:MacroRecordingFloat" -#define CMD_SID_REDO ".uno:Redo" -#define CMD_SID_DELETE_BASICOBJECT ".uno:ReleaseObject" -#define CMD_SID_RELOAD ".uno:Reload" -#define CMD_SID_BASICIDE_REMOVEWATCH ".uno:RemoveWatch" -#define CMD_SID_BASICIDE_RENAMECURRENT ".uno:RenameCurrent" -#define CMD_SID_REPAINT ".uno:Repaint" -#define CMD_SID_REPEAT ".uno:RepeatAction" -#define CMD_SID_RUBY_DIALOG ".uno:RubyDialog" -#define CMD_SID_BASICRUN ".uno:RunBasic" -#define CMD_SID_STARTSW ".uno:RunStarWriter" -#define CMD_SID_SAVEDOC ".uno:Save" -#define CMD_SID_SAVEDOCS ".uno:SaveAll" -#define CMD_SID_SAVEASDOC ".uno:SaveAs" -#define CMD_SID_DOCTEMPLATE ".uno:SaveAsTemplate" -#define CMD_SID_BASICSAVEAS ".uno:SaveBasicAs" -#define CMD_SID_EXPORT_DIALOG ".uno:ExportDialog" -#define CMD_SID_IMPORT_DIALOG ".uno:ImportDialog" -#define CMD_SID_SAVECONFIG ".uno:SaveConfiguration" -#define CMD_SID_DOC_SAVED ".uno:Saved" -#define CMD_SID_BASICIDE_SBXDELETED ".uno:SbxDeleted" -#define CMD_SID_BASICIDE_SBXINSERTED ".uno:SbxInserted" -#define CMD_SID_BASICIDE_SBXRENAMED ".uno:SbxRenamed" -#define CMD_SID_MAIL_SCROLLBODY_PAGEDOWN ".uno:ScrollBodyPageDown" -#define CMD_SID_SEARCH_DLG ".uno:SearchDialog" -#define CMD_SID_SEARCH_OPTIONS ".uno:SearchOptions" -#define CMD_SID_SEARCH_ITEM ".uno:SearchProperties" -#define CMD_SID_SELECTALL ".uno:SelectAll" -#define CMD_FN_FAX ".uno:SendFax" -#define CMD_SID_MAIL_SENDDOC ".uno:SendMail" -#define CMD_SID_MAIL_SENDDOCASPDF ".uno:SendMailDocAsPDF" -#define CMD_SID_MAIL_SENDDOCASFORMAT ".uno:SendMailDocAsFormat" -#define CMD_SID_MAIL_SENDDOCASMS ".uno:SendMailDocAsMS" -#define CMD_SID_MAIL_SENDDOCASOOO ".uno:SendMailDocAsOOo" -#define CMD_SID_SETOPTIONS ".uno:SetOptions" -#define CMD_SID_OFFICE_PALK ".uno:SetPALK" -#define CMD_SID_SHOW_BROWSER ".uno:ShowBrowser" -#define CMD_SID_SHOWPOPUPS ".uno:ShowPopups" -#define CMD_SID_BASICIDE_SHOWSBX ".uno:ShowSbx" -#define CMD_SID_SOURCEVIEW ".uno:SourceView" -#define CMD_SID_ONLINE_REGISTRATION_DLG ".uno:StartRegistrationDialog" -#define CMD_SID_STATUSBARTEXT ".uno:StatusBar" -#define CMD_SID_TOGGLESTATUSBAR ".uno:StatusBarVisible" -#define CMD_SID_BASICIDE_STAT_DATE ".uno:StatusGetDate" -#define CMD_SID_BASICIDE_STAT_POS ".uno:StatusGetPosition" -#define CMD_SID_BASICIDE_STAT_TITLE ".uno:StatusGetTitle" -#define CMD_SID_BASICIDE_STOREALLMODULESOURCES ".uno:StoreAllModuleSources" -#define CMD_SID_BASICIDE_STOREMODULESOURCE ".uno:StoreModuleSource" -#define CMD_SID_STYLE_APPLY ".uno:StyleApplyState" -#define CMD_SID_STYLE_CATALOG ".uno:StyleCatalog" -#define CMD_SID_STYLE_NEW_BY_EXAMPLE ".uno:StyleNewByExample" -#define CMD_SID_STYLE_UPDATE_BY_EXAMPLE ".uno:StyleUpdateByExample" -#define CMD_SID_STYLE_WATERCAN ".uno:StyleWatercanMode" -#define CMD_SID_VIEWSHELL ".uno:SwitchViewShell" -#define CMD_SID_TASKBAR ".uno:TaskBarVisible" -#define CMD_SID_STYLE_FAMILY5 ".uno:ListStyle" -#define CMD_SID_TIPWINDOW ".uno:TipsDialog" -#define CMD_SID_DOCTITLE ".uno:Title" -#define CMD_SID_TITLE ".uno:Title" -#define CMD_SID_BASICIDE_TOGGLEBRKPNT ".uno:ToggleBreakPoint" -#define CMD_SID_BASICIDE_SHOWWINDOW ".uno:BasicIDEShowWindow" -#define CMD_SID_EDITMACRO ".uno:ToolsMacroEdit" -#define CMD_SID_UNDO ".uno:Undo" -#define CMD_SID_FORMATPAINTBRUSH ".uno:FormatPaintbrush" -#define CMD_SID_ATTR_UNDO_COUNT ".uno:UndoCount" -#define CMD_SID_BASICIDE_UPDATEALLMODULESOURCES ".uno:UpdateAllModuleSources" -#define CMD_SID_BASICIDE_UPDATEMODULESOURCE ".uno:UpdateModuleSource" -#define CMD_SID_BASICIDE_MANAGEBRKPNTS ".uno:ManageBreakPoints" -#define CMD_SID_BASICIDE_TOGGLEBRKPNTENABLED ".uno:ToggleBreakPointEnabled" -#define CMD_SID_UPDATE_VERSION ".uno:UpdateVersion" -#define CMD_SID_VERSION ".uno:VersionDialog" -#define CMD_SID_SIGNATURE ".uno:Signature" -#define CMD_SID_MACRO_SIGNATURE ".uno:MacroSignature" -#define CMD_SID_VERSION_VISIBLE ".uno:VersionVisible" -#define CMD_SID_VIEW_DATA_SOURCE_BROWSER ".uno:ViewDataSourceBrowser" -#define CMD_SID_WIN_VISIBLE ".uno:WinVisible" -#define CMD_SID_MDIWINDOWLIST ".uno:WindowList" -#define CMD_SID_ZOOM_IN ".uno:ZoomMinus" -#define CMD_SID_ZOOM ".uno:Zooming" -#define CMD_SID_ZOOM_NEXT ".uno:ZoomNext" -#define CMD_SID_ZOOM_OUT ".uno:ZoomPlus" -#define CMD_SID_ZOOM_PREV ".uno:ZoomPrevious" -#define CMD_SID_ZOOM_TOOLBOX ".uno:ZoomToolBox" -#define CMD_SID_EXPORTDOC ".uno:ExportTo" -#define CMD_SID_EXPORTDOCASPDF ".uno:ExportToPDF" -#define CMD_SID_DIRECTEXPORTDOCASPDF ".uno:ExportDirectToPDF" -#define CMD_SID_IMAGE_ORIENTATION ".uno:ImageOrientation" -#define CMD_SID_SAVE_VERSION_ON_CLOSE ".uno:SaveVersionOnClose" -#define CMD_SID_ADDONS ".uno:Addons" -#define CMD_SID_SHOW_IME_STATUS_WINDOW ".uno:ShowImeStatusWindow" -#define CMD_SID_UPDATE_CONFIG ".uno:UpdateConfiguration" -#define CMD_SID_HELP_SUPPORTPAGE ".uno:HelpSupport" -#define CMD_SID_HELP_TUTORIALS ".uno:HelpTutorials" -#define CMD_SID_ADDONHELP ".uno:AddonHelp" -#define CMD_SID_FORMATMENUSTATE ".uno:FormatMenuState" -#define CMD_SID_INET_DLG ".uno:InternetDialog" -#define CMD_SID_ONLINE_REGISTRATION ".uno:OnlineRegistrationDlg" -#define CMD_SID_OFFICE_CHECK_PLZ ".uno:CheckPLZ" -#define CMD_SID_ADDRESS_DATA_SOURCE ".uno:AutoPilotAddressDataSource" -#define CMD_FN_BUSINESS_CARD ".uno:InsertBusinessCard" -#define CMD_FN_LABEL ".uno:InsertLabels" -#define CMD_FN_XFORMS_INIT ".uno:NewXForms" -#define CMD_SID_SD_AUTOPILOT ".uno:AutoPilotPresentations" -#define CMD_SID_NEWSD ".uno:NewPresentation" -#define CMD_SID_COMP_BIBLIOGRAPHY ".uno:BibliographyComponent" -#define CMD_SID_MINIMIZED ".uno:Minimized" -#define CMD_SID_AUTO_CORRECT_DLG ".uno:AutoCorrectDlg" -#define CMD_SID_OPTIONS_TREEDIALOG ".uno:OptionsTreeDialog" -#define CMD_SID_TERMINATE_INPLACEACTIVATION ".uno:TerminateInplaceActivation" -#define CMD_SID_RECENTFILELIST ".uno:RecentFileList" -#define CMD_SID_AVAILABLE_TOOLBARS ".uno:AvailableToolbars" -#define CMD_SID_AVMEDIA_PLAYER ".uno:AVMediaPlayer" -#define CMD_SID_INSERT_AVMEDIA ".uno:InsertAVMedia" -#define CMD_SID_MORE_DICTIONARIES ".uno:MoreDictionaries" -#define CMD_SID_ACTIVATE_STYLE_APPLY ".uno:ActivateStyleApply" -#define CMD_SID_DOCKWIN_0 ".uno:DockingWindow0" -#define CMD_SID_DOCKWIN_1 ".uno:DockingWindow1" -#define CMD_SID_DOCKWIN_2 ".uno:DockingWindow2" -#define CMD_SID_DOCKWIN_3 ".uno:DockingWindow3" -#define CMD_SID_DOCKWIN_4 ".uno:DockingWindow4" -#define CMD_SID_DOCKWIN_5 ".uno:DockingWindow5" -#define CMD_SID_DOCKWIN_6 ".uno:DockingWindow6" -#define CMD_SID_DOCKWIN_7 ".uno:DockingWindow7" -#define CMD_SID_DOCKWIN_8 ".uno:DockingWindow8" -#define CMD_SID_DOCKWIN_9 ".uno:DockingWindow9" -#define CMD_SID_PASTE_UNFORMATTED ".uno:PasteUnformatted" - -#endif +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef SFX2_SFXCOMMANDS_HRC +#define SFX2_SFXCOMMANDS_HRC + +#define CMD_SID_VIEWSHELL0 ".uno:_SwitchViewShell0" +#define CMD_SID_VIEWSHELL1 ".uno:_SwitchViewShell1" +#define CMD_SID_VIEWSHELL2 ".uno:_SwitchViewShell2" +#define CMD_SID_VIEWSHELL3 ".uno:_SwitchViewShell3" +#define CMD_SID_VIEWSHELL4 ".uno:_SwitchViewShell4" +#define CMD_SID_ABOUT ".uno:About" +#define CMD_SID_ACTIVATE ".uno:Activate" +#define CMD_SID_HELPBALLOONS ".uno:ActiveHelp" +#define CMD_SID_STYLE_FAMILY ".uno:ActualStyleFamily" +#define CMD_SID_NEWDOC ".uno:NewDoc" +#define CMD_SID_CREATELINK ".uno:AddBookmark" +#define CMD_SID_NEWDOCDIRECT ".uno:AddDirect" +#define CMD_SID_TEMPLATE_ADDRESSBOKSOURCE ".uno:AddressBookSource" +#define CMD_SID_BASICIDE_ADDWATCH ".uno:AddWatch" +#define CMD_SID_DOCINFO_AUTHOR ".uno:Author" +#define CMD_SID_AUTOHIDE ".uno:AutoHide" +#define CMD_SID_AUTOPILOTMENU ".uno:AutoPilotMenu" +#define CMD_SID_GALLERY_BG_BRUSH ".uno:BackgroundImage" +#define CMD_SID_BACKSPACE ".uno:Backspace" +#define CMD_SID_BASICBREAK ".uno:BasicBreak" +#define CMD_SID_BASICIDE_APPEAR ".uno:BasicIDEAppear" +#define CMD_SID_BASICSTEPINTO ".uno:BasicStepInto" +#define CMD_SID_BASICSTEPOUT ".uno:BasicStepOut" +#define CMD_SID_BASICSTEPOVER ".uno:BasicStepOver" +#define CMD_SID_BASICSTOP ".uno:BasicStop" +#define CMD_SID_BROWSER ".uno:Beamer" +#define CMD_SID_BASICIDE_BRKPNTSCHANGED ".uno:BreakPointsChanged" +#define CMD_SID_BROWSE_BACKWARD ".uno:BrowseBackward" +#define CMD_SID_BROWSE_FORWARD ".uno:BrowseForward" +#define CMD_SID_BROWSER_MODE ".uno:BrowseView" +#define CMD_SID_BUILD_VERSION ".uno:BuildVersion" +#define CMD_SID_CAPTION ".uno:Caption" +#define CMD_SID_STYLE_FAMILY1 ".uno:CharStyle" +#define CMD_SID_CHECK_KEY ".uno:CheckKey" +#define CMD_SID_BASICIDE_CHOOSEMACRO ".uno:ChooseMacro" +#define CMD_SID_CLEARHISTORY ".uno:ClearHistory" +#define CMD_SID_CLOSEWINS ".uno:CloseWins" +#define CMD_SID_CLOSEDOCS ".uno:CloseDocs" +#define CMD_SID_CLOSEDOC ".uno:CloseDoc" +#define CMD_SID_CLOSEWIN ".uno:CloseWin" +#define CMD_SID_CLOSING ".uno:Closing" +#define CMD_SID_DOCINFO_COMMENTS ".uno:Comments" +#define CMD_SID_OFFICE_COMMERCIAL_USE ".uno:CommercialUse" +#define CMD_SID_DOCUMENT_COMPARE ".uno:CompareDocuments" +#define CMD_SID_BASICCOMPILE ".uno:CompileBasic" +#define CMD_SID_CONFIG ".uno:ConfigureDialog" +#define CMD_SID_CONTEXT ".uno:Context" +#define CMD_SID_COPY ".uno:Copy" +#define CMD_SID_CRASH ".uno:Crash" +#define CMD_SID_BASICIDE_CREATEMACRO ".uno:CreateMacro" +#define CMD_SID_CURRENT_URL ".uno:CurrentURL" +#define CMD_SID_CURSORENDOFSCREEN ".uno:CursorEndOfScreen" +#define CMD_SID_CURSORTOPOFSCREEN ".uno:CursorTopOfScreen" +#define CMD_SID_OFFICE_CUSTOMERNUMBER ".uno:CustomerNumber" +#define CMD_SID_CUT ".uno:Cut" +#define CMD_SID_DEFAULTFILEPATH ".uno:DefaultFilePath" +#define CMD_SID_DEFAULTFILENAME ".uno:DefaultFileName" +#define CMD_SID_DELETE ".uno:Delete" +#define CMD_SID_BASICIDE_DELETECURRENT ".uno:DeleteCurrent" +#define CMD_SID_STYLE_DELETE ".uno:DeleteStyle" +#define CMD_SID_STYLE_DESIGNER ".uno:DesignerDialog" +#define CMD_SID_STYLE_DRAGHIERARCHIE ".uno:DragHierarchy" +#define CMD_SID_EDITDOC ".uno:EditDoc" +#define CMD_SID_BASICIDE_EDITMACRO ".uno:EditMacro" +#define CMD_SID_STYLE_EDIT ".uno:EditStyle" +#define CMD_FID_SEARCH_NOW ".uno:ExecuteSearch" +#define CMD_SID_EXTENDEDHELP ".uno:ExtendedHelp" +#define CMD_SID_FILE_NAME ".uno:FileName" +#define CMD_SID_FOCUSURLBOX ".uno:FocusUrlBox" +#define CMD_SID_FORMATMENU ".uno:FormatMenu" +#define CMD_SID_STYLE_FAMILY3 ".uno:FrameStyle" +#define CMD_SID_FRAMETITLE ".uno:FrameTitle" +#define CMD_SID_PROGFILENAME ".uno:FullName" +#define CMD_SID_DOCFULLNAME ".uno:FullName" +#define CMD_SID_WIN_FULLSCREEN ".uno:FullScreen" +#define CMD_SID_FILLFRAME ".uno:GetFrameWindow" +#define CMD_SID_CURSORDOWN ".uno:GoDown" +#define CMD_SID_CURSORPAGEDOWN ".uno:GoDownBlock" +#define CMD_SID_CURSORPAGEDOWN_SEL ".uno:GoDownBlockSel" +#define CMD_SID_CURSORDOWN_SEL ".uno:GoDownSel" +#define CMD_SID_CURSORLEFT ".uno:GoLeft" +#define CMD_SID_CURSORPAGELEFT ".uno:GoLeftBlock" +#define CMD_SID_CURSORPAGELEFT_SEL ".uno:GoLeftBlockSel" +#define CMD_SID_CURSORLEFT_SEL ".uno:GoLeftSel" +#define CMD_SID_CURSORRIGHT ".uno:GoRight" +#define CMD_SID_CURSORRIGHT_SEL ".uno:GoRightSel" +#define CMD_SID_CURSORENDOFFILE ".uno:GoToEndOfData" +#define CMD_SID_CURSORENDOFFILE_SEL ".uno:GoToEndOfDataSel" +#define CMD_SID_CURSOREND ".uno:GoToEndOfRow" +#define CMD_SID_CURSOREND_SEL ".uno:GoToEndOfRowSel" +#define CMD_SID_CURSORTOPOFFILE ".uno:GoToStart" +#define CMD_SID_CURSORHOME ".uno:GoToStartOfRow" +#define CMD_SID_CURSORHOME_SEL ".uno:GoToStartOfRowSel" +#define CMD_SID_CURSORTOPOFFILE_SEL ".uno:GoToStartSel" +#define CMD_SID_CURSORUP ".uno:GoUp" +#define CMD_SID_CURSORPAGEUP ".uno:GoUpBlock" +#define CMD_SID_CURSORPAGEUP_SEL ".uno:GoUpBlockSel" +#define CMD_SID_CURSORUP_SEL ".uno:GoUpSel" +#define CMD_SID_HELP_ANNOTATE ".uno:HelpAnnotate" +#define CMD_SID_HELP_BOOKMARK ".uno:HelpBookmark" +#define CMD_SID_HELP_HELPFILEBOX ".uno:HelpChooseFile" +#define CMD_SID_HELP_DOWNLOAD ".uno:HelpDownload" +#define CMD_SID_HELP_PI ".uno:HelperDialog" +#define CMD_SID_HELPINDEX ".uno:HelpIndex" +#define CMD_SID_HELPMENU ".uno:HelpMenu" +#define CMD_SID_HELPONHELP ".uno:HelpOnHelp" +#define CMD_SID_HELP_SEARCH ".uno:HelpSearch" +#define CMD_SID_HELPTIPS ".uno:HelpTip" +#define CMD_SID_HELP_ZOOMIN ".uno:HelpZoomIn" +#define CMD_SID_HELP_ZOOMOUT ".uno:HelpZoomOut" +#define CMD_SID_BASICIDE_HIDECURPAGE ".uno:HideCurPage" +#define CMD_SID_HYPERLINK_DIALOG ".uno:HyperlinkDialog" +#define CMD_SID_INSERTDOC ".uno:InsertDoc" +#define CMD_SID_HYPERLINK_INSERT ".uno:InsertHyperlink" +#define CMD_SID_INSERT_FLOATINGFRAME ".uno:InsertObjectFloatingFrame" +#define CMD_SID_INTERNET_ONLINE ".uno:InternetOnline" +#define CMD_SID_INTERNET_SEARCH ".uno:InternetSearch" +#define CMD_SID_DOC_LOADING ".uno:IsLoading" +#define CMD_SID_IMG_LOADING ".uno:IsLoadingImages" +#define CMD_SID_PRINTOUT ".uno:IsPrinting" +#define CMD_SID_JUMPTOMARK ".uno:JumpToMark" +#define CMD_SID_DOCINFO_KEYWORDS ".uno:Keywords" +#define CMD_SID_BASICIDE_LIBLOADED ".uno:LibLoaded" +#define CMD_SID_BASICIDE_LIBREMOVED ".uno:LibRemoved" +#define CMD_SID_BASICIDE_LIBSELECTED ".uno:LibSelect" +#define CMD_SID_BASICIDE_LIBSELECTOR ".uno:LibSelector" +#define CMD_SID_OFFICE_PLK ".uno:LicenceKey" +#define CMD_SID_CONFIGACCEL ".uno:LoadAccel" +#define CMD_SID_BASICLOAD ".uno:LoadBasic" +#define CMD_SID_LOADCONFIG ".uno:LoadConfiguration" +#define CMD_SID_CONFIGEVENT ".uno:LoadEvents" +#define CMD_SID_CONFIGMENU ".uno:LoadMenu" +#define CMD_SID_CONFIGSTATUSBAR ".uno:LoadStatusBar" +#define CMD_SID_TOOLBOXOPTIONS ".uno:LoadToolBox" +#define CMD_SID_LOGOUT ".uno:Logout" +#define CMD_SID_SCRIPTORGANIZER ".uno:ScriptOrganizer" +#define CMD_SID_MACROORGANIZER ".uno:MacroOrganizer" +#define CMD_SID_RUNMACRO ".uno:RunMacro" +#define CMD_SID_BASICCHOOSER ".uno:MacroDialog" +#define CMD_SID_MAIL_NOTIFY ".uno:MailReceipt" +#define CMD_SID_MAIL_CHILDWIN ".uno:MailWindow" +#define CMD_SID_BASICIDE_MATCHGROUP ".uno:MatchGroup" +#define CMD_SID_TOGGLE_MENUBAR ".uno:MenuBarVisible" +#define CMD_SID_DOCUMENT_MERGE ".uno:MergeDocuments" +#define CMD_SID_ATTR_METRIC ".uno:MetricUnit" +#define CMD_SID_MODIFIED ".uno:Modified" +#define CMD_SID_DOC_MODIFIED ".uno:ModifiedStatus" +#define CMD_SID_BASICIDE_MODULEDLG ".uno:ModuleDialog" +#define CMD_SID_BASICIDE_NAMECHANGEDONTAB ".uno:NameChangedOnTab" +#define CMD_SID_NAVIGATOR ".uno:Navigator" +#define CMD_SID_RESTORE_EDITING_VIEW ".uno:RestoreEditingView" +#define CMD_SID_BASICIDE_NEWDIALOG ".uno:NewDialog" +#define CMD_SID_BASICIDE_NEWMODULE ".uno:NewModule" +#define CMD_SID_CREATE_BASICOBJECT ".uno:NewObject" +#define CMD_SID_STYLE_NEW ".uno:NewStyle" +#define CMD_SID_NEWWINDOW ".uno:NewWindow" +#define CMD_SID_BASICIDE_OBJCAT ".uno:ObjectCatalog" +#define CMD_SID_OBJECT ".uno:ObjectMenue" +#define CMD_SID_OLD_PALK ".uno:OldPALK" +#define CMD_SID_OPENDOC ".uno:Open" +#define CMD_SID_WEBHTML ".uno:WebHtml" +#define CMD_SID_OPENHYPERLINK ".uno:OpenHyperlink" +#define CMD_SID_DOCINFO_TITLE ".uno:DocInfoTitle" +#define CMD_SID_OPENTEMPLATE ".uno:OpenTemplate" +#define CMD_SID_OPENURL ".uno:OpenUrl" +#define CMD_SID_OPTIONS ".uno:Options" +#define CMD_SID_ORGANIZER ".uno:Organizer" +#define CMD_SID_STYLE_FAMILY4 ".uno:PageStyle" +#define CMD_SID_STYLE_FAMILY2 ".uno:ParaStyle" +#define CMD_SID_PARTWIN ".uno:PartWindow" +#define CMD_SID_PASTE ".uno:Paste" +#define CMD_SID_CLIPBOARD_FORMAT_ITEMS ".uno:ClipboardFormatItems" +#define CMD_SID_PASTE_SPECIAL ".uno:PasteSpecial" +#define CMD_SID_DOCPATH ".uno:DocPath" +#define CMD_SID_PICKLIST ".uno:PickList" +#define CMD_SID_PLUGINS_ACTIVE ".uno:PlugInsActive" +#define CMD_SID_PRINTDOC ".uno:Print" +#define CMD_SID_PRINTDOCDIRECT ".uno:PrintDefault" +#define CMD_SID_PRINTER_NAME ".uno:Printer" +#define CMD_SID_SETUPPRINTER ".uno:PrinterSetup" +#define CMD_SID_PRINTPREVIEW ".uno:PrintPreview" +#define CMD_SID_OFFICE_PRIVATE_USE ".uno:PrivateUse" +#define CMD_SID_DOCINFO ".uno:SetDocumentProperties" +#define CMD_SID_QUITAPP ".uno:Quit" +#define CMD_SID_DOC_READONLY ".uno:ReadOnly" +#define CMD_SID_RECORDMACRO ".uno:MacroRecorder" +#define CMD_SID_STOP_RECORDING ".uno:StopRecording" +#define CMD_SID_RECORDING_FLOATWINDOW ".uno:MacroRecordingFloat" +#define CMD_SID_REDO ".uno:Redo" +#define CMD_SID_DELETE_BASICOBJECT ".uno:ReleaseObject" +#define CMD_SID_RELOAD ".uno:Reload" +#define CMD_SID_BASICIDE_REMOVEWATCH ".uno:RemoveWatch" +#define CMD_SID_BASICIDE_RENAMECURRENT ".uno:RenameCurrent" +#define CMD_SID_REPAINT ".uno:Repaint" +#define CMD_SID_REPEAT ".uno:RepeatAction" +#define CMD_SID_RUBY_DIALOG ".uno:RubyDialog" +#define CMD_SID_BASICRUN ".uno:RunBasic" +#define CMD_SID_SAVEDOC ".uno:Save" +#define CMD_SID_SAVEDOCS ".uno:SaveAll" +#define CMD_SID_SAVEASDOC ".uno:SaveAs" +#define CMD_SID_DOCTEMPLATE ".uno:SaveAsTemplate" +#define CMD_SID_BASICSAVEAS ".uno:SaveBasicAs" +#define CMD_SID_EXPORT_DIALOG ".uno:ExportDialog" +#define CMD_SID_IMPORT_DIALOG ".uno:ImportDialog" +#define CMD_SID_SAVECONFIG ".uno:SaveConfiguration" +#define CMD_SID_DOC_SAVED ".uno:Saved" +#define CMD_SID_BASICIDE_SBXDELETED ".uno:SbxDeleted" +#define CMD_SID_BASICIDE_SBXINSERTED ".uno:SbxInserted" +#define CMD_SID_BASICIDE_SBXRENAMED ".uno:SbxRenamed" +#define CMD_SID_MAIL_SCROLLBODY_PAGEDOWN ".uno:ScrollBodyPageDown" +#define CMD_SID_SEARCH_DLG ".uno:SearchDialog" +#define CMD_SID_SEARCH_OPTIONS ".uno:SearchOptions" +#define CMD_SID_SEARCH_ITEM ".uno:SearchProperties" +#define CMD_SID_SELECTALL ".uno:SelectAll" +#define CMD_FN_FAX ".uno:SendFax" +#define CMD_SID_MAIL_SENDDOC ".uno:SendMail" +#define CMD_SID_MAIL_SENDDOCASPDF ".uno:SendMailDocAsPDF" +#define CMD_SID_MAIL_SENDDOCASFORMAT ".uno:SendMailDocAsFormat" +#define CMD_SID_MAIL_SENDDOCASMS ".uno:SendMailDocAsMS" +#define CMD_SID_MAIL_SENDDOCASOOO ".uno:SendMailDocAsOOo" +#define CMD_SID_SETOPTIONS ".uno:SetOptions" +#define CMD_SID_OFFICE_PALK ".uno:SetPALK" +#define CMD_SID_SHOW_BROWSER ".uno:ShowBrowser" +#define CMD_SID_SHOWPOPUPS ".uno:ShowPopups" +#define CMD_SID_BASICIDE_SHOWSBX ".uno:ShowSbx" +#define CMD_SID_SOURCEVIEW ".uno:SourceView" +#define CMD_SID_ONLINE_REGISTRATION_DLG ".uno:StartRegistrationDialog" +#define CMD_SID_STATUSBARTEXT ".uno:StatusBar" +#define CMD_SID_TOGGLESTATUSBAR ".uno:StatusBarVisible" +#define CMD_SID_BASICIDE_STAT_DATE ".uno:StatusGetDate" +#define CMD_SID_BASICIDE_STAT_POS ".uno:StatusGetPosition" +#define CMD_SID_BASICIDE_STAT_TITLE ".uno:StatusGetTitle" +#define CMD_SID_BASICIDE_STOREALLMODULESOURCES ".uno:StoreAllModuleSources" +#define CMD_SID_BASICIDE_STOREMODULESOURCE ".uno:StoreModuleSource" +#define CMD_SID_STYLE_APPLY ".uno:StyleApplyState" +#define CMD_SID_STYLE_CATALOG ".uno:StyleCatalog" +#define CMD_SID_STYLE_NEW_BY_EXAMPLE ".uno:StyleNewByExample" +#define CMD_SID_STYLE_UPDATE_BY_EXAMPLE ".uno:StyleUpdateByExample" +#define CMD_SID_STYLE_WATERCAN ".uno:StyleWatercanMode" +#define CMD_SID_VIEWSHELL ".uno:SwitchViewShell" +#define CMD_SID_TASKBAR ".uno:TaskBarVisible" +#define CMD_SID_STYLE_FAMILY5 ".uno:ListStyle" +#define CMD_SID_TIPWINDOW ".uno:TipsDialog" +#define CMD_SID_DOCTITLE ".uno:Title" +#define CMD_SID_TITLE ".uno:Title" +#define CMD_SID_BASICIDE_TOGGLEBRKPNT ".uno:ToggleBreakPoint" +#define CMD_SID_BASICIDE_SHOWWINDOW ".uno:BasicIDEShowWindow" +#define CMD_SID_UNDO ".uno:Undo" +#define CMD_SID_FORMATPAINTBRUSH ".uno:FormatPaintbrush" +#define CMD_SID_ATTR_UNDO_COUNT ".uno:UndoCount" +#define CMD_SID_BASICIDE_UPDATEALLMODULESOURCES ".uno:UpdateAllModuleSources" +#define CMD_SID_BASICIDE_UPDATEMODULESOURCE ".uno:UpdateModuleSource" +#define CMD_SID_BASICIDE_MANAGEBRKPNTS ".uno:ManageBreakPoints" +#define CMD_SID_BASICIDE_TOGGLEBRKPNTENABLED ".uno:ToggleBreakPointEnabled" +#define CMD_SID_UPDATE_VERSION ".uno:UpdateVersion" +#define CMD_SID_VERSION ".uno:VersionDialog" +#define CMD_SID_SIGNATURE ".uno:Signature" +#define CMD_SID_MACRO_SIGNATURE ".uno:MacroSignature" +#define CMD_SID_VERSION_VISIBLE ".uno:VersionVisible" +#define CMD_SID_VIEW_DATA_SOURCE_BROWSER ".uno:ViewDataSourceBrowser" +#define CMD_SID_WIN_VISIBLE ".uno:WinVisible" +#define CMD_SID_MDIWINDOWLIST ".uno:WindowList" +#define CMD_SID_ZOOM_IN ".uno:ZoomMinus" +#define CMD_SID_ZOOM ".uno:Zooming" +#define CMD_SID_ZOOM_NEXT ".uno:ZoomNext" +#define CMD_SID_ZOOM_OUT ".uno:ZoomPlus" +#define CMD_SID_ZOOM_PREV ".uno:ZoomPrevious" +#define CMD_SID_ZOOM_TOOLBOX ".uno:ZoomToolBox" +#define CMD_SID_EXPORTDOC ".uno:ExportTo" +#define CMD_SID_EXPORTDOCASPDF ".uno:ExportToPDF" +#define CMD_SID_DIRECTEXPORTDOCASPDF ".uno:ExportDirectToPDF" +#define CMD_SID_IMAGE_ORIENTATION ".uno:ImageOrientation" +#define CMD_SID_SAVE_VERSION_ON_CLOSE ".uno:SaveVersionOnClose" +#define CMD_SID_ADDONS ".uno:Addons" +#define CMD_SID_SHOW_IME_STATUS_WINDOW ".uno:ShowImeStatusWindow" +#define CMD_SID_UPDATE_CONFIG ".uno:UpdateConfiguration" +#define CMD_SID_HELP_SUPPORTPAGE ".uno:HelpSupport" +#define CMD_SID_HELP_TUTORIALS ".uno:HelpTutorials" +#define CMD_SID_ADDONHELP ".uno:AddonHelp" +#define CMD_SID_FORMATMENUSTATE ".uno:FormatMenuState" +#define CMD_SID_INET_DLG ".uno:InternetDialog" +#define CMD_SID_ONLINE_REGISTRATION ".uno:OnlineRegistrationDlg" +#define CMD_SID_OFFICE_CHECK_PLZ ".uno:CheckPLZ" +#define CMD_SID_ADDRESS_DATA_SOURCE ".uno:AutoPilotAddressDataSource" +#define CMD_FN_BUSINESS_CARD ".uno:InsertBusinessCard" +#define CMD_FN_LABEL ".uno:InsertLabels" +#define CMD_FN_XFORMS_INIT ".uno:NewXForms" +#define CMD_SID_SD_AUTOPILOT ".uno:AutoPilotPresentations" +#define CMD_SID_NEWSD ".uno:NewPresentation" +#define CMD_SID_COMP_BIBLIOGRAPHY ".uno:BibliographyComponent" +#define CMD_SID_MINIMIZED ".uno:Minimized" +#define CMD_SID_AUTO_CORRECT_DLG ".uno:AutoCorrectDlg" +#define CMD_SID_OPTIONS_TREEDIALOG ".uno:OptionsTreeDialog" +#define CMD_SID_TERMINATE_INPLACEACTIVATION ".uno:TerminateInplaceActivation" +#define CMD_SID_RECENTFILELIST ".uno:RecentFileList" +#define CMD_SID_AVAILABLE_TOOLBARS ".uno:AvailableToolbars" +#define CMD_SID_AVMEDIA_PLAYER ".uno:AVMediaPlayer" +#define CMD_SID_INSERT_AVMEDIA ".uno:InsertAVMedia" +#define CMD_SID_MORE_DICTIONARIES ".uno:MoreDictionaries" +#define CMD_SID_ACTIVATE_STYLE_APPLY ".uno:ActivateStyleApply" +#define CMD_SID_DOCKWIN_0 ".uno:DockingWindow0" +#define CMD_SID_DOCKWIN_1 ".uno:DockingWindow1" +#define CMD_SID_DOCKWIN_2 ".uno:DockingWindow2" +#define CMD_SID_DOCKWIN_3 ".uno:DockingWindow3" +#define CMD_SID_DOCKWIN_4 ".uno:DockingWindow4" +#define CMD_SID_DOCKWIN_5 ".uno:DockingWindow5" +#define CMD_SID_DOCKWIN_6 ".uno:DockingWindow6" +#define CMD_SID_DOCKWIN_7 ".uno:DockingWindow7" +#define CMD_SID_DOCKWIN_8 ".uno:DockingWindow8" +#define CMD_SID_DOCKWIN_9 ".uno:DockingWindow9" +#define CMD_SID_PASTE_UNFORMATTED ".uno:PasteUnformatted" + +#endif diff --git a/sfx2/inc/sfx2/sfxsids.hrc b/sfx2/inc/sfx2/sfxsids.hrc index 561a41b04387..17d47097fb46 100644 --- a/sfx2/inc/sfx2/sfxsids.hrc +++ b/sfx2/inc/sfx2/sfxsids.hrc @@ -522,41 +522,29 @@ #define SID_CURSORTOPOFSCREEN (SID_SFX_START + 744) #define SID_CURSORHOME (SID_SFX_START + 745) #define SID_CURSOREND (SID_SFX_START + 746) -#define SID_SCROLLDOWN (SID_SFX_START + 751) -#define SID_SCROLLUP (SID_SFX_START + 752) #define SID_FORMATMENU (SID_SFX_START + 780) #define SID_OBJECTMENU0 SID_FORMATMENU #define SID_OBJECTMENU1 (SID_SFX_START + 781) #define SID_OBJECTMENU2 (SID_SFX_START + 782) #define SID_OBJECTMENU3 (SID_SFX_START + 783) #define SID_OBJECTMENU_LAST SID_OBJECTMENU3 -#define SID_EDITMENU (SID_SFX_START + 790) #define SID_FORMATMENUSTATE (SID_SFX_START + 791) // default-ids for macros #define SID_RECORDING_FLOATWINDOW (SID_SFX_START + 800) #define SID_RECORDMACRO (SID_SFX_START + 1669) -#define SID_PLAYMACRO (SID_SFX_START + 801) -#define SID_EDITMACRO (SID_SFX_START + 802) -#define SID_MACROLIBMANAGER (SID_SFX_START + 803) -#define SID_LOADMACROLIB (SID_SFX_START + 804) -#define SID_RELEASEMACROLIB (SID_SFX_START + 805) -#define SID_BASICNAME (SID_SFX_START + 806) -#define SID_LIBNAME (SID_SFX_START + 807) -#define SID_MODULENAME (SID_SFX_START + 808) -#define SID_STATEMENT (SID_SFX_START + 810) + // FREE: SID_SFX_START + 801 + // FREE: SID_SFX_START + 802 + // FREE: SID_SFX_START + 803 + // FREE: SID_SFX_START + 804 + // FREE: SID_SFX_START + 805 + // FREE: SID_SFX_START + 806 + // FREE: SID_SFX_START + 807 + // FREE: SID_SFX_START + 808 + // FREE: SID_SFX_START + 809 + // FREE: SID_SFX_START + 810 #define SID_ASYNCHRON (SID_SFX_START + 811) -#define SID_START_APP (SID_SFX_START + 820) -#define SID_START_BEGIN (SID_SFX_START + 821) -#define SID_STARTSW SID_START_BEGIN -#define SID_STARTSC (SID_START_BEGIN + 1) -#define SID_STARTSD (SID_START_BEGIN + 2) -#define SID_STARTSIM (SID_START_BEGIN + 3) -#define SID_STARTSCH (SID_START_BEGIN + 4) -#define SID_STARTSMA (SID_START_BEGIN + 5) -#define SID_START_END SID_STARTSMA - // default-ids for configuration #define SID_RESTOREMENU (SID_SFX_START + 901) #define SID_RESTOREACCELS (SID_SFX_START + 902) @@ -622,11 +610,9 @@ #define SID_OBJECTRESIZE (SID_SFX_START + 1000) #define SID_INSERT_TEXT (SID_SFX_START + 1001) -#define SID_MACRO_START (SID_SFX_START + 1002) -#define SID_MACRO_END (SID_SFX_START + 1100) -#define SID_EVENTCONFIG (SID_MACRO_END + 1) -#define SID_VERB_START (SID_MACRO_END + 2) -#define SID_VERB_END (SID_MACRO_END + 21) +#define SID_EVENTCONFIG (SID_SFX_START + 1101) +#define SID_VERB_START (SID_SFX_START + 1100) +#define SID_VERB_END (SID_SFX_START + 1121) #define SID_BROWSER_TASK (SID_MACRO_END + 22) diff --git a/sfx2/inc/sfx2/shell.hxx b/sfx2/inc/sfx2/shell.hxx index ceec7c05c719..40c2a7fc42fc 100644 --- a/sfx2/inc/sfx2/shell.hxx +++ b/sfx2/inc/sfx2/shell.hxx @@ -65,12 +65,16 @@ class SfxShellSubObject; class SfxDispatcher; class SfxViewFrame; class SfxSlot; -class SfxUndoManager; class SfxRepeatTarget; class SbxVariable; class SbxBase; class SfxBindings; +namespace svl +{ + class IUndoManager; +} + //==================================================================== enum SfxInterfaceId @@ -162,7 +166,7 @@ class SFX2_DLLPUBLIC SfxShell: public SfxBroadcaster SfxShell_Impl* pImp; SfxItemPool* pPool; - SfxUndoManager* pUndoMgr; + ::svl::IUndoManager* pUndoMgr; private: SfxShell( const SfxShell & ); // n.i. @@ -212,8 +216,9 @@ public: inline SfxItemPool& GetPool() const; inline void SetPool( SfxItemPool *pNewPool ) ; - virtual SfxUndoManager* GetUndoManager(); - void SetUndoManager( SfxUndoManager *pNewUndoMgr ); + virtual ::svl::IUndoManager* + GetUndoManager(); + void SetUndoManager( ::svl::IUndoManager *pNewUndoMgr ); SfxRepeatTarget* GetRepeatTarget() const; void SetRepeatTarget( SfxRepeatTarget *pTarget ); diff --git a/sfx2/inc/sfx2/viewsh.hxx b/sfx2/inc/sfx2/viewsh.hxx index 042974d87123..6e613cce0176 100644 --- a/sfx2/inc/sfx2/viewsh.hxx +++ b/sfx2/inc/sfx2/viewsh.hxx @@ -214,6 +214,7 @@ public: virtual String GetSelectionText( sal_Bool bCompleteWords = sal_False ); virtual sal_Bool HasSelection( sal_Bool bText = sal_True ) const; virtual SdrView* GetDrawView() const; + void SetSubShell( SfxShell *pShell ); SfxShell* GetSubShell() const { return pSubShell; } void AddSubShell( SfxShell& rShell ); diff --git a/sfx2/prj/build.lst b/sfx2/prj/build.lst index 76f87fa844c8..dc0b094ac4fb 100644 --- a/sfx2/prj/build.lst +++ b/sfx2/prj/build.lst @@ -1,12 +1,5 @@ -sf sfx2 : l10n idl basic xmlscript framework readlicense_oo shell setup_native sax SYSTRAY_GTK:libegg LIBXML2:libxml2 LIBXSLT:libxslt NULL -sf sfx2 usr1 - all sf_mkout NULL -sf sfx2\prj nmake - all sf_prj NULL -sf sfx2\qa\cppunit nmake - all sf_qa_cppunit NULL -sf sfx2\qa\unoapi nmake - all sf_qa_unoapi NULL - -# fails on unxsoli4 -# sf sfx2\qa\complex\standalonedocumentinfo nmake - all sf_qa_complex_standalonedocumentinfo sf_util NULL - -# sf sfx2\qa\complex\framework nmake - all sf_qa_complex_framework sf_qa_complex_framework_dochelper NULL -# sf sfx2\qa\complex\docinfo nmake - all sf_qa_complex_docinfo sf_util NULL - +sf sfx2 : l10n idl basic xmlscript framework readlicense_oo shell setup_native sax SYSTRAY_GTK:libegg LIBXML2:libxml2 LIBXSLT:libxslt test NULL +sf sfx2 usr1 - all sf_mkout NULL +sf sfx2\prj nmake - all sf_prj NULL +sf sfx2\qa\cppunit nmake - all sf_qa_cppunit NULL +sf sfx2\qa\unoapi nmake - all sf_qa_unoapi NULL diff --git a/sfx2/qa/complex/docinfo/DocumentProperties.java b/sfx2/qa/complex/sfx2/DocumentInfo.java similarity index 95% rename from sfx2/qa/complex/docinfo/DocumentProperties.java rename to sfx2/qa/complex/sfx2/DocumentInfo.java index 0c4eb44c4a35..ca7ae8b1dda0 100644 --- a/sfx2/qa/complex/docinfo/DocumentProperties.java +++ b/sfx2/qa/complex/sfx2/DocumentInfo.java @@ -24,9 +24,9 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.docinfo; +package complex.sfx2; -import com.sun.star.beans.*; +import com.sun.star.beans.PropertyAttribute; import com.sun.star.beans.Property; import com.sun.star.beans.PropertyValue; import com.sun.star.beans.XPropertyContainer; @@ -49,22 +49,17 @@ import util.WriterTools; import org.junit.After; import org.junit.AfterClass; -// import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.openoffice.test.OfficeConnection; import static org.junit.Assert.*; -public class DocumentProperties +public class DocumentInfo { - XMultiServiceFactory m_xMSF = null; XTextDocument xTextDoc = null; XTextDocument xTextDocSecond = null; -// public String[] getTestMethodNames() { -// return new String[] {"checkDocInfo", "cleanup"}; -// } @Test public void checkDocInfo() { m_xMSF = getMSF(); @@ -349,14 +344,18 @@ public class DocumentProperties // setup and close connections @BeforeClass public static void setUpConnection() throws Exception { - System.out.println("setUpConnection()"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "starting class: " + DocumentInfo.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.setUp(); } @AfterClass public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception { - System.out.println("tearDownConnection()"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + DocumentInfo.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.tearDown(); } private static final OfficeConnection connection = new OfficeConnection(); diff --git a/sfx2/qa/complex/framework/DocumentMetadataAccessTest.java b/sfx2/qa/complex/sfx2/DocumentMetadataAccess.java similarity index 87% rename from sfx2/qa/complex/framework/DocumentMetadataAccessTest.java rename to sfx2/qa/complex/sfx2/DocumentMetadataAccess.java index 3f61cb21b3dd..d145b9028473 100644 --- a/sfx2/qa/complex/framework/DocumentMetadataAccessTest.java +++ b/sfx2/qa/complex/sfx2/DocumentMetadataAccess.java @@ -25,9 +25,27 @@ * ************************************************************************/ -package complex.framework; +package complex.sfx2; // import complexlib.ComplexTestCase; +import com.sun.star.beans.Pair; +import com.sun.star.rdf.Literal; +import com.sun.star.rdf.XLiteral; +import com.sun.star.rdf.XNamedGraph; +import com.sun.star.rdf.BlankNode; +import com.sun.star.rdf.XQuerySelectResult; +import com.sun.star.rdf.XNode; +import com.sun.star.rdf.XDocumentRepository; +import com.sun.star.rdf.XMetadatable; +import com.sun.star.rdf.Statement; +import com.sun.star.rdf.FileFormat; +import com.sun.star.rdf.URIs; +import com.sun.star.rdf.URI; +import com.sun.star.rdf.XDocumentMetadataAccess; +import com.sun.star.rdf.XRepositorySupplier; +import com.sun.star.rdf.XRepository; +import com.sun.star.rdf.XBlankNode; +import com.sun.star.rdf.XURI; import helper.StreamSimulator; import com.sun.star.uno.UnoRuntime; @@ -41,7 +59,6 @@ import com.sun.star.lang.WrappedTargetException; import com.sun.star.lang.WrappedTargetRuntimeException; import com.sun.star.beans.XPropertySet; import com.sun.star.beans.PropertyValue; -import com.sun.star.beans.Pair; import com.sun.star.beans.StringPair; import com.sun.star.container.XEnumerationAccess; import com.sun.star.container.XEnumeration; @@ -51,7 +68,7 @@ import com.sun.star.frame.XStorable; import com.sun.star.text.XTextDocument; import com.sun.star.text.XTextRange; import com.sun.star.text.XText; -import com.sun.star.rdf.*; +import complex.sfx2.tools.TestDocument; import lib.TestParameters; @@ -73,7 +90,7 @@ import static org.junit.Assert.*; * * @author mst */ -public class DocumentMetadataAccessTest +public class DocumentMetadataAccess { XMultiServiceFactory xMSF; XComponentContext xContext; @@ -196,22 +213,22 @@ public class DocumentMetadataAccessTest PropertyValue[] loadProps = new PropertyValue[1]; loadProps[0] = new PropertyValue(); loadProps[0].Name = "Hidden"; - loadProps[0].Value = new Boolean(true); + loadProps[0].Value = true; xComp = util.DesktopTools.openNewDoc(xMSF, "swriter", loadProps); XTextDocument xText = UnoRuntime.queryInterface(XTextDocument.class, xComp); - XRepositorySupplier xRS = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); - assertNotNull("xRS null", xRS); - XDocumentMetadataAccess xDMA = UnoRuntime.queryInterface(XDocumentMetadataAccess.class, xRS); - assertNotNull("xDMA null", xDMA); - xRep = xRS.getRDFRepository(); + XRepositorySupplier xRepoSupplier = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); + assertNotNull("xRS null", xRepoSupplier); + XDocumentMetadataAccess xDocMDAccess = UnoRuntime.queryInterface(XDocumentMetadataAccess.class, xRepoSupplier); + assertNotNull("xDMA null", xDocMDAccess); + xRep = xRepoSupplier.getRDFRepository(); assertNotNull("xRep null", xRep); System.out.println("...done"); System.out.println("Checking that new repository is initialized..."); - XURI xBaseURI = (XURI) xDMA; + XURI xBaseURI = (XURI) xDocMDAccess; String baseURI = xBaseURI.getStringValue(); assertNotNull("new: baseURI", xBaseURI ); assertTrue("new: baseURI", !xBaseURI.getStringValue().equals("")); @@ -235,79 +252,79 @@ public class DocumentMetadataAccessTest XMetadatable xM = (XMetadatable) xTR; try { - xDMA.getElementByURI(null); + xDocMDAccess.getElementByURI(null); fail("getElementByURI: null allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.getMetadataGraphsWithType(null); + xDocMDAccess.getMetadataGraphsWithType(null); fail("getMetadataGraphsWithType: null URI allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("", new XURI[0]); + xDocMDAccess.addMetadataFile("", new XURI[0]); fail("addMetadataFile: empty filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("/foo", new XURI[0]); + xDocMDAccess.addMetadataFile("/foo", new XURI[0]); fail("addMetadataFile: absolute filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("fo\"o", new XURI[0]); + xDocMDAccess.addMetadataFile("fo\"o", new XURI[0]); fail("addMetadataFile: invalid filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("../foo", new XURI[0]); + xDocMDAccess.addMetadataFile("../foo", new XURI[0]); fail("addMetadataFile: filename with .. allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("foo/../../bar", new XURI[0]); + xDocMDAccess.addMetadataFile("foo/../../bar", new XURI[0]); fail("addMetadataFile: filename with nest .. allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("foo/././bar", new XURI[0]); + xDocMDAccess.addMetadataFile("foo/././bar", new XURI[0]); fail("addMetadataFile: filename with nest . allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("content.xml", new XURI[0]); + xDocMDAccess.addMetadataFile("content.xml", new XURI[0]); fail("addMetadataFile: content.xml allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("styles.xml", new XURI[0]); + xDocMDAccess.addMetadataFile("styles.xml", new XURI[0]); fail("addMetadataFile: styles.xml allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("meta.xml", new XURI[0]); + xDocMDAccess.addMetadataFile("meta.xml", new XURI[0]); fail("addMetadataFile: meta.xml allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("settings.xml", new XURI[0]); + xDocMDAccess.addMetadataFile("settings.xml", new XURI[0]); fail("addMetadataFile: settings.xml allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.importMetadataFile(FileFormat.RDF_XML, null, "foo", + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, null, "foo", foo, new XURI[0]); fail("importMetadataFile: null stream allowed"); } catch (IllegalArgumentException e) { @@ -317,7 +334,7 @@ public class DocumentMetadataAccessTest final String sEmptyRDF = TestDocument.getUrl("empty.rdf"); try { XInputStream xFooIn = new StreamSimulator(sEmptyRDF, true, param); - xDMA.importMetadataFile(FileFormat.RDF_XML, xFooIn, "", + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "", foo, new XURI[0]); fail("importMetadataFile: empty filename allowed"); } catch (IllegalArgumentException e) { @@ -326,7 +343,7 @@ public class DocumentMetadataAccessTest try { XInputStream xFooIn = new StreamSimulator(sEmptyRDF, true, param); - xDMA.importMetadataFile(FileFormat.RDF_XML, xFooIn, "meta.xml", + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "meta.xml", foo, new XURI[0]); fail("importMetadataFile: meta.xml filename allowed"); } catch (IllegalArgumentException e) { @@ -335,7 +352,7 @@ public class DocumentMetadataAccessTest try { XInputStream xFooIn = new StreamSimulator(sEmptyRDF, true, param); - xDMA.importMetadataFile(FileFormat.RDF_XML, + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "foo", null, new XURI[0]); fail("importMetadataFile: null base URI allowed"); } catch (IllegalArgumentException e) { @@ -344,62 +361,62 @@ public class DocumentMetadataAccessTest try { XInputStream xFooIn = new StreamSimulator(sEmptyRDF, true, param); - xDMA.importMetadataFile(FileFormat.RDF_XML, + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "foo", rdf_type, new XURI[0]); fail("importMetadataFile: non-absolute base URI allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.removeMetadataFile(null); + xDocMDAccess.removeMetadataFile(null); fail("removeMetadataFile: null URI allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addContentOrStylesFile(""); + xDocMDAccess.addContentOrStylesFile(""); fail("addContentOrStylesFile: empty filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addContentOrStylesFile("/content.xml"); + xDocMDAccess.addContentOrStylesFile("/content.xml"); fail("addContentOrStylesFile: absolute filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addContentOrStylesFile("foo.rdf"); + xDocMDAccess.addContentOrStylesFile("foo.rdf"); fail("addContentOrStylesFile: invalid filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.removeContentOrStylesFile(""); + xDocMDAccess.removeContentOrStylesFile(""); fail("removeContentOrStylesFile: empty filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.loadMetadataFromStorage(null, foo, null); + xDocMDAccess.loadMetadataFromStorage(null, foo, null); fail("loadMetadataFromStorage: null storage allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.storeMetadataToStorage(null/*, base*/); + xDocMDAccess.storeMetadataToStorage(null/*, base*/); fail("storeMetadataToStorage: null storage allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.loadMetadataFromMedium(new PropertyValue[0]); + xDocMDAccess.loadMetadataFromMedium(new PropertyValue[0]); fail("loadMetadataFromMedium: empty medium allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.storeMetadataToMedium(new PropertyValue[0]); + xDocMDAccess.storeMetadataToMedium(new PropertyValue[0]); fail("storeMetadataToMedium: empty medium allowed"); } catch (IllegalArgumentException e) { // ignore @@ -409,26 +426,26 @@ public class DocumentMetadataAccessTest System.out.println("Checking file addition/removal..."); - xDMA.removeContentOrStylesFile(contentPath); + xDocMDAccess.removeContentOrStylesFile(contentPath); xStmtsEnum = xManifest.getStatements(null, null, null); assertTrue("removeContentOrStylesFile (content)", eq(xStmtsEnum, new Statement[] { manifestStmts[0], manifestStmts[2], manifestStmts[4] })); - xDMA.addContentOrStylesFile(contentPath); + xDocMDAccess.addContentOrStylesFile(contentPath); xStmtsEnum = xManifest.getStatements(null, null, null); assertTrue("addContentOrStylesFile (content)", eq(xStmtsEnum, manifestStmts)); - xDMA.removeContentOrStylesFile(stylesPath); + xDocMDAccess.removeContentOrStylesFile(stylesPath); xStmtsEnum = xManifest.getStatements(null, null, null); assertTrue("removeContentOrStylesFile (styles)", eq(xStmtsEnum, new Statement[] { manifestStmts[0], manifestStmts[1], manifestStmts[3] })); - xDMA.addContentOrStylesFile(stylesPath); + xDocMDAccess.addContentOrStylesFile(stylesPath); xStmtsEnum = xManifest.getStatements(null, null, null); assertTrue("addContentOrStylesFile (styles)", eq(xStmtsEnum, manifestStmts)); @@ -441,19 +458,19 @@ public class DocumentMetadataAccessTest new Statement(xFoo, rdf_type, pkg_MetadataFile, manifest); Statement xM_FooTypeBar = new Statement(xFoo, rdf_type, bar, manifest); - xDMA.addMetadataFile(fooPath, new XURI[] { bar }); + xDocMDAccess.addMetadataFile(fooPath, new XURI[] { bar }); xStmtsEnum = xManifest.getStatements(null, null, null); assertTrue("addMetadataFile", eq(xStmtsEnum, merge(manifestStmts, new Statement[] { xM_BaseHaspartFoo, xM_FooTypeMetadata, xM_FooTypeBar }))); - XURI[] graphsBar = xDMA.getMetadataGraphsWithType(bar); + XURI[] graphsBar = xDocMDAccess.getMetadataGraphsWithType(bar); assertTrue("getMetadataGraphsWithType", graphsBar.length == 1 && eq(graphsBar[0], xFoo)); - xDMA.removeMetadataFile(xFoo); + xDocMDAccess.removeMetadataFile(xFoo); xStmtsEnum = xManifest.getStatements(null, null, null); assertTrue("removeMetadataFile", eq(xStmtsEnum, manifestStmts)); @@ -468,7 +485,7 @@ public class DocumentMetadataAccessTest XURI uri; XMetadatable xMeta; - xMeta = xDMA.getElementByURI(xMeta1); + xMeta = xDocMDAccess.getElementByURI(xMeta1); assertTrue("getElementByURI: null", null != xMeta); String XmlId = xMeta.getMetadataReference().Second; String XmlId1 = xMeta1.getMetadataReference().Second; @@ -483,7 +500,7 @@ public class DocumentMetadataAccessTest fooBarPath); Statement[] metadataStmts = getMetadataFileStmts(xBaseURI, fooBarPath); - xDMA.addMetadataFile(fooBarPath, new XURI[0]); + xDocMDAccess.addMetadataFile(fooBarPath, new XURI[0]); xStmtsEnum = xRep.getStatements(null, null, null); assertTrue("addMetadataFile", eq(xStmtsEnum, merge(manifestStmts, metadataStmts ))); @@ -520,15 +537,15 @@ public class DocumentMetadataAccessTest xStmtsEnum = xRep.getStatements(null, null, null); XURI[] graphs = xRep.getGraphNames(); - xDMA.storeMetadataToMedium(args); + xDocMDAccess.storeMetadataToMedium(args); // this should re-init - xDMA.loadMetadataFromMedium(argsEmptyNoContent); - xRep = xRS.getRDFRepository(); + xDocMDAccess.loadMetadataFromMedium(argsEmptyNoContent); + xRep = xRepoSupplier.getRDFRepository(); assertTrue("xRep null", null != xRep); assertTrue("baseURI still tdoc?", - !baseURI.equals(xDMA.getStringValue())); - Statement[] manifestStmts2 = getManifestStmts((XURI) xDMA); + !baseURI.equals(xDocMDAccess.getStringValue())); + Statement[] manifestStmts2 = getManifestStmts((XURI) xDocMDAccess); xStmtsEnum = xRep.getStatements(null, null, null); // there is no content or styles file in here, so we have just // the package stmt @@ -536,29 +553,29 @@ public class DocumentMetadataAccessTest eq(xStmtsEnum, new Statement[] { manifestStmts2[0] })); // this should re-init - xDMA.loadMetadataFromMedium(argsEmpty); - xRep = xRS.getRDFRepository(); + xDocMDAccess.loadMetadataFromMedium(argsEmpty); + xRep = xRepoSupplier.getRDFRepository(); assertTrue("xRep null", null != xRep); assertTrue("baseURI still tdoc?", - !baseURI.equals(xDMA.getStringValue())); - Statement[] manifestStmts3 = getManifestStmts((XURI) xDMA); + !baseURI.equals(xDocMDAccess.getStringValue())); + Statement[] manifestStmts3 = getManifestStmts((XURI) xDocMDAccess); xStmtsEnum = xRep.getStatements(null, null, null); assertTrue("loadMetadataFromMedium (no metadata)", eq(xStmtsEnum, manifestStmts3)); - xDMA.loadMetadataFromMedium(args); - xRep = xRS.getRDFRepository(); + xDocMDAccess.loadMetadataFromMedium(args); + xRep = xRepoSupplier.getRDFRepository(); assertTrue("xRep null", null != xRep); - Statement[] manifestStmts4 = getManifestStmts((XURI) xDMA); - Statement[] metadataStmts4 = getMetadataFileStmts((XURI) xDMA, + Statement[] manifestStmts4 = getManifestStmts((XURI) xDocMDAccess); + Statement[] metadataStmts4 = getMetadataFileStmts((XURI) xDocMDAccess, fooBarPath); xStmtsEnum = xRep.getStatements(null, null, null); assertTrue("some graph(s) not reloaded", graphs.length == xRep.getGraphNames().length); - XURI xFoobar4 = URI.createNS(xContext, xDMA.getStringValue(), + XURI xFoobar4 = URI.createNS(xContext, xDocMDAccess.getStringValue(), fooBarPath); Statement xFoobar_FooBarFoo4 = new Statement(foo, bar, foo, xFoobar4); @@ -572,7 +589,7 @@ public class DocumentMetadataAccessTest String f = tempDir + "TESTPARA.odt"; - XStorable xStor = UnoRuntime.queryInterface(XStorable.class, xRS); + XStorable xStor = UnoRuntime.queryInterface(XStorable.class, xRepoSupplier); xStor.storeToURL(f, new PropertyValue[0]); @@ -656,17 +673,17 @@ public class DocumentMetadataAccessTest PropertyValue[] loadProps = new PropertyValue[1]; loadProps[0] = new PropertyValue(); loadProps[0].Name = "Hidden"; - loadProps[0].Value = new Boolean(true); + loadProps[0].Value = true; xComp = util.DesktopTools.loadDoc(xMSF, file, loadProps); - XRepositorySupplier xRS = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); - assertTrue("xRS null", null != xRS); + XRepositorySupplier xRepoSupplier = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); + assertTrue("xRS null", null != xRepoSupplier); - XDocumentRepository xRep = UnoRuntime.queryInterface(XDocumentRepository.class, xRS.getRDFRepository()); - assertTrue("xRep null", null != xRep); + XDocumentRepository xDocRepository = UnoRuntime.queryInterface(XDocumentRepository.class, xRepoSupplier.getRDFRepository()); + assertTrue("xRep null", null != xDocRepository); XTextDocument xTextDoc = UnoRuntime.queryInterface(XTextDocument.class, xComp); @@ -684,7 +701,7 @@ public class DocumentMetadataAccessTest Statement x_FooBarLit1 = new Statement(foo, bar, mkLit("1"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 1", !result.Second && eq(result.First, new Statement[] { @@ -693,7 +710,7 @@ public class DocumentMetadataAccessTest Statement x_FooBarLit2 = new Statement(foo, bar, mkLit("2"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 2", !result.Second && eq(result.First, new Statement[] { @@ -703,7 +720,7 @@ public class DocumentMetadataAccessTest Statement x_BlankBarLit3 = new Statement(blank1, bar, mkLit("3"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 3", !result.Second && eq(result.First, new Statement[] { @@ -714,7 +731,7 @@ public class DocumentMetadataAccessTest Statement x_BlankBarLit4 = new Statement(blank2, bar, mkLit("4"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 4", !result.Second && eq(result.First, new Statement[] { @@ -725,7 +742,7 @@ public class DocumentMetadataAccessTest Statement x_BlankBarLit5 = new Statement(blank1, bar, mkLit("5"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 5", !result.Second && eq(result.First, new Statement[] { @@ -741,7 +758,7 @@ public class DocumentMetadataAccessTest Statement x_FooBarLit6 = new Statement(foo, bar, mkLit("6"), null); Statement x_FooBazLit6 = new Statement(foo, baz, mkLit("6"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 6", !result.Second && eq(result.First, new Statement[] { @@ -752,7 +769,7 @@ public class DocumentMetadataAccessTest Statement x_FooBazLit7 = new Statement(foo, baz, mkLit("7"), null); Statement x_FooFooLit7 = new Statement(foo, foo, mkLit("7"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 7", !result.Second && eq(result.First, new Statement[] { @@ -765,7 +782,7 @@ public class DocumentMetadataAccessTest Statement x_FooBarLittype = new Statement(foo, bar, lit_type, null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 8", result.Second && eq(result.First, new Statement[] { @@ -773,7 +790,7 @@ public class DocumentMetadataAccessTest })); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 9", result.Second && eq(result.First, new Statement[] { @@ -781,7 +798,7 @@ public class DocumentMetadataAccessTest })); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 10", result.Second && eq(result.First, new Statement[] { @@ -791,7 +808,7 @@ public class DocumentMetadataAccessTest Statement x_FooBarLit11 = new Statement(foo, bar, mkLit("11", bar), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 11", !result.Second && eq(result.First, new Statement[] { @@ -802,7 +819,7 @@ public class DocumentMetadataAccessTest Statement x_FileBarLit12 = new Statement(xFile, bar, mkLit("12"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 12", !result.Second && eq(result.First, new Statement[] { @@ -810,7 +827,7 @@ public class DocumentMetadataAccessTest })); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 13", result.Second && eq(result.First, new Statement[] { @@ -820,7 +837,7 @@ public class DocumentMetadataAccessTest Statement x_FooLabelLit14 = new Statement(foo, rdfs_label, mkLit("14"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 14", result.Second && eq(result.First, new Statement[] { @@ -828,33 +845,33 @@ public class DocumentMetadataAccessTest })); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 15", eq(result.First, new Statement[] { } )); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 16", eq(result.First, new Statement[] { } )); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 17", eq(result.First, new Statement[] { } )); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 18", eq(result.First, new Statement[] { } )); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 19", eq(result.First, new Statement[] { } )); xPara = UnoRuntime.queryInterface( XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 20", eq(result.First, new Statement[] { } )); xPara = UnoRuntime.queryInterface( XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 21", eq(result.First, new Statement[] { } )); System.out.println("...done"); @@ -889,7 +906,7 @@ public class DocumentMetadataAccessTest public void report(Exception e) { System.out.println("Exception occurred:"); - e.printStackTrace(); + e.printStackTrace(System.out); report2(e); fail(); } @@ -1275,14 +1292,18 @@ public class DocumentMetadataAccessTest // setup and close connections @BeforeClass public static void setUpConnection() throws Exception { - System.out.println("setUpConnection()"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "starting class: " + DocumentMetadataAccess.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.setUp(); } @AfterClass public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception { - System.out.println("tearDownConnection() DocumentMetadataAccessTest"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + DocumentMetadataAccess.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.tearDown(); } diff --git a/sfx2/qa/complex/framework/DocumentPropertiesTest.java b/sfx2/qa/complex/sfx2/DocumentProperties.java similarity index 95% rename from sfx2/qa/complex/framework/DocumentPropertiesTest.java rename to sfx2/qa/complex/sfx2/DocumentProperties.java index 20a0746c8322..01ccaa21619b 100644 --- a/sfx2/qa/complex/framework/DocumentPropertiesTest.java +++ b/sfx2/qa/complex/sfx2/DocumentProperties.java @@ -25,9 +25,10 @@ * ************************************************************************/ -package complex.framework; +package complex.sfx2; +import complex.sfx2.tools.TestDocument; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; import com.sun.star.lang.XInitialization; @@ -53,7 +54,6 @@ import com.sun.star.document.XDocumentProperties; import org.junit.After; import org.junit.AfterClass; -import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.openoffice.test.OfficeConnection; @@ -66,12 +66,8 @@ import static org.junit.Assert.*; * * @author mst */ -public class DocumentPropertiesTest +public class DocumentProperties { -// public String[] getTestMethodNames () { -// return new String[] { "check", "cleanup" }; -// } - @After public void cleanup() { // nothing to do } @@ -80,7 +76,7 @@ public class DocumentPropertiesTest class Listener implements XModifyListener { private boolean m_Called; - public Listener() { + Listener() { m_Called = false; } @@ -235,8 +231,7 @@ public class DocumentPropertiesTest new NamedValue("PageCount", new Integer(1)))); XPropertyContainer udpc = xDP.getUserDefinedProperties(); - XPropertySet udps = (XPropertySet) UnoRuntime.queryInterface( - XPropertySet.class, udpc); + XPropertySet udps = UnoRuntime.queryInterface( XPropertySet.class, udpc ); assertTrue("UserDefined 1", "Dies ist ein wichtiger Hinweis" .equals(udps.getPropertyValue("Hinweis"))); assertTrue("UserDefined 2", ("Kann Spuren von N" @@ -366,8 +361,7 @@ public class DocumentPropertiesTest dur.Seconds = 555; dur.MilliSeconds = 444; - udpc.addProperty("Frobnicate", PropertyAttribute.REMOVEABLE, - new Boolean(b)); + udpc.addProperty("Frobnicate", PropertyAttribute.REMOVEABLE, b); udpc.addProperty("FrobDuration", PropertyAttribute.REMOVEABLE, dur); udpc.addProperty("FrobDuration2", PropertyAttribute.REMOVEABLE, t); udpc.addProperty("FrobEndDate", PropertyAttribute.REMOVEABLE, date); @@ -433,8 +427,7 @@ public class DocumentPropertiesTest System.out.println("Checking user-defined meta-data from stored file..."); udpc = xDP.getUserDefinedProperties(); - udps = (XPropertySet) UnoRuntime.queryInterface( - XPropertySet.class, udpc); + udps = UnoRuntime.queryInterface( XPropertySet.class, udpc ); assertTrue("UserDefined bool", new Boolean(b).equals( udps.getPropertyValue("Frobnicate"))); @@ -467,8 +460,7 @@ public class DocumentPropertiesTest System.out.println("Checking notification listener interface..."); Listener listener = new Listener(); - XModifyBroadcaster xMB = (XModifyBroadcaster) - UnoRuntime.queryInterface(XModifyBroadcaster.class, xDP); + XModifyBroadcaster xMB = UnoRuntime.queryInterface( XModifyBroadcaster.class, xDP ); xMB.addModifyListener(listener); xDP.setAuthor("not me"); assertTrue("Listener Author", listener.reset()); @@ -542,20 +534,24 @@ public class DocumentPropertiesTest private XMultiServiceFactory getMSF() { - final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager()); + final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface( XMultiServiceFactory.class, connection.getComponentContext().getServiceManager() ); return xMSF1; } // setup and close connections @BeforeClass public static void setUpConnection() throws Exception { - System.out.println("setUpConnection()"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "starting class: " + DocumentProperties.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.setUp(); } @AfterClass public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception { - System.out.println("tearDownConnection() DocumentPropertiesTest"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + DocumentProperties.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.tearDown(); } diff --git a/sfx2/qa/complex/framework/CheckGlobalEventBroadcaster_writer1.java b/sfx2/qa/complex/sfx2/GlobalEventBroadcaster.java similarity index 96% rename from sfx2/qa/complex/framework/CheckGlobalEventBroadcaster_writer1.java rename to sfx2/qa/complex/sfx2/GlobalEventBroadcaster.java index c6dc073095b1..41bd66ccb5b9 100644 --- a/sfx2/qa/complex/framework/CheckGlobalEventBroadcaster_writer1.java +++ b/sfx2/qa/complex/sfx2/GlobalEventBroadcaster.java @@ -24,7 +24,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.framework; +package complex.sfx2; import com.sun.star.awt.XWindow; import com.sun.star.document.XEventBroadcaster; @@ -33,7 +33,7 @@ import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.sheet.XSpreadsheetDocument; import com.sun.star.text.XTextDocument; import com.sun.star.uno.UnoRuntime; -import complex.framework.DocHelper.WriterHelper; +import complex.sfx2.tools.WriterHelper; import java.util.ArrayList; @@ -53,7 +53,7 @@ import static org.junit.Assert.*; * it will add an XEventListener and verify the Events * raised when opening/changing and closing Office Documents */ -public class CheckGlobalEventBroadcaster_writer1 { +public class GlobalEventBroadcaster { XMultiServiceFactory m_xMSF = null; XEventBroadcaster m_xEventBroadcaster = null; ArrayList notifyEvents = new ArrayList(); @@ -61,12 +61,6 @@ public class CheckGlobalEventBroadcaster_writer1 { XSpreadsheetDocument xSheetDoc; XEventListener m_xEventListener = new EventListenerImpl(); -// public String[] getTestMethodNames() { -// return new String[] { -// "initialize", "checkWriter", "cleanup" -// }; -// } - @Before public void initialize() { m_xMSF = getMSF(); System.out.println("check wether there is a valid MultiServiceFactory"); @@ -79,7 +73,6 @@ public class CheckGlobalEventBroadcaster_writer1 { "Create an instance of com.sun.star.frame.GlobalEventBroadcaster"); Object GlobalEventBroadcaster = null; - Object dispatcher = null; try { GlobalEventBroadcaster = m_xMSF.createInstance( @@ -116,7 +109,6 @@ public class CheckGlobalEventBroadcaster_writer1 { WriterHelper wHelper = new WriterHelper(m_xMSF); String[] expected; - boolean locRes = true; System.out.println("opening an empty writer doc"); notifyEvents.clear(); { diff --git a/sfx2/qa/complex/standalonedocumentinfo/StandaloneDocumentInfoUnitTest.java b/sfx2/qa/complex/sfx2/StandaloneDocumentInfo.java similarity index 78% rename from sfx2/qa/complex/standalonedocumentinfo/StandaloneDocumentInfoUnitTest.java rename to sfx2/qa/complex/sfx2/StandaloneDocumentInfo.java index 29fcaba8cb7a..1e9cbb1f4738 100644 --- a/sfx2/qa/complex/standalonedocumentinfo/StandaloneDocumentInfoUnitTest.java +++ b/sfx2/qa/complex/sfx2/StandaloneDocumentInfo.java @@ -24,10 +24,12 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.standalonedocumentinfo; +package complex.sfx2; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.uno.UnoRuntime; +import complex.sfx2.standalonedocinfo.StandaloneDocumentInfoTest; +import complex.sfx2.standalonedocinfo.Test01; import org.junit.After; import org.junit.AfterClass; @@ -40,18 +42,9 @@ import static org.junit.Assert.*; /* Document here */ -public class StandaloneDocumentInfoUnitTest { +public class StandaloneDocumentInfo { private XMultiServiceFactory m_xMSF = null; -// public String[] getTestMethodNames() { -// return new String[] { -// "ExecuteTest01"}; -// } - -// public String[] getTestObjectNames() { -// return new String[] {"StandaloneDocumentInfoUnitTest"}; -// } - @Before public void before() { try { m_xMSF = getMSF(); @@ -82,15 +75,20 @@ public class StandaloneDocumentInfoUnitTest { } // setup and close connections - @BeforeClass public static void setUpConnection() throws Exception { - System.out.println("setUpConnection()"); + @BeforeClass public static void setUpConnection() throws Exception + { + System.out.println( "------------------------------------------------------------" ); + System.out.println( "starting class: " + StandaloneDocumentInfo.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.setUp(); } @AfterClass public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception { - System.out.println("tearDownConnection()"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + StandaloneDocumentInfo.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.tearDown(); } diff --git a/sfx2/qa/complex/sfx2/UndoManager.java b/sfx2/qa/complex/sfx2/UndoManager.java new file mode 100755 index 000000000000..ab1b9de910b8 --- /dev/null +++ b/sfx2/qa/complex/sfx2/UndoManager.java @@ -0,0 +1,1464 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package complex.sfx2; + +import com.sun.star.accessibility.XAccessible; +import com.sun.star.accessibility.XAccessibleAction; +import com.sun.star.awt.Point; +import com.sun.star.awt.Size; +import com.sun.star.awt.XControl; +import com.sun.star.awt.XControlModel; +import com.sun.star.beans.NamedValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.NoSuchElementException; +import com.sun.star.container.XChild; +import com.sun.star.container.XIndexContainer; +import com.sun.star.container.XNameContainer; +import com.sun.star.container.XNameReplace; +import com.sun.star.container.XSet; +import com.sun.star.document.EmptyUndoStackException; +import com.sun.star.document.UndoContextNotClosedException; +import com.sun.star.document.UndoFailedException; +import com.sun.star.document.UndoManagerEvent; +import com.sun.star.document.XEmbeddedScripts; +import com.sun.star.document.XEventsSupplier; +import com.sun.star.document.XUndoAction; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.IndexOutOfBoundsException; +import com.sun.star.lang.XEventListener; +import java.lang.reflect.InvocationTargetException; +import org.openoffice.test.tools.OfficeDocument; +import com.sun.star.document.XUndoManagerSupplier; +import com.sun.star.document.XUndoManager; +import com.sun.star.document.XUndoManagerListener; +import com.sun.star.drawing.XControlShape; +import com.sun.star.drawing.XDrawPage; +import com.sun.star.drawing.XDrawPageSupplier; +import com.sun.star.drawing.XShapes; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.lang.XSingleComponentFactory; +import com.sun.star.lang.XTypeProvider; +import com.sun.star.script.ScriptEventDescriptor; +import com.sun.star.script.XEventAttacherManager; +import com.sun.star.script.XLibraryContainer; +import com.sun.star.task.XJob; +import com.sun.star.uno.Type; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import com.sun.star.util.InvalidStateException; +import com.sun.star.util.NotLockedException; +import com.sun.star.view.XControlAccess; +import complex.sfx2.undo.CalcDocumentTest; +import complex.sfx2.undo.ChartDocumentTest; +import complex.sfx2.undo.DocumentTest; +import complex.sfx2.undo.DrawDocumentTest; +import complex.sfx2.undo.ImpressDocumentTest; +import complex.sfx2.undo.WriterDocumentTest; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Stack; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; +import org.openoffice.test.OfficeConnection; +import org.openoffice.test.tools.DocumentType; +import org.openoffice.test.tools.SpreadsheetDocument; + +/** + * Unit test for the UndoManager API + * + * @author frank.schoenheit@oracle.com + */ +public class UndoManager +{ + // ----------------------------------------------------------------------------------------------------------------- + @Before + public void beforeTest() throws com.sun.star.uno.Exception + { + m_currentTestCase = null; + m_currentDocument = null; + m_undoListener = null; + + // at our service factory, insert a new factory for our CallbackComponent + // this will allow the Basic code in our test documents to call back into this test case + // here, by just instantiating this service + final XSet globalFactory = UnoRuntime.queryInterface( XSet.class, getORB() ); + m_callbackFactory = new CallbackComponentFactory(); + globalFactory.insert( m_callbackFactory ); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkWriterUndo() throws Exception + { + m_currentTestCase = new WriterDocumentTest( getORB() ); + impl_checkUndo(); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkCalcUndo() throws Exception + { + m_currentTestCase = new CalcDocumentTest( getORB() ); + impl_checkUndo(); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkDrawUndo() throws Exception + { + m_currentTestCase = new DrawDocumentTest( getORB() ); + impl_checkUndo(); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkImpressUndo() throws Exception + { + m_currentTestCase = new ImpressDocumentTest( getORB() ); + impl_checkUndo(); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkChartUndo() throws Exception + { + m_currentTestCase = new ChartDocumentTest( getORB() ); + impl_checkUndo(); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkBrokenScripts() throws com.sun.star.uno.Exception, InterruptedException + { + System.out.println( "testing: broken scripts" ); + + m_currentDocument = OfficeDocument.blankDocument( getORB(), DocumentType.CALC ); + m_undoListener = new UndoListener(); + getUndoManager().addUndoManagerListener( m_undoListener ); + + impl_setupBrokenBasicScript(); + final String scriptURI = "vnd.sun.star.script:default.callbacks.brokenScript?language=Basic&location=document"; + + // ............................................................................................................. + // scenario 1: Pressing a button which is bound to execute the script + // (This is one of the many cases where SfxObjectShell::CallXScript is invoked) + + // set up the button + final XPropertySet buttonModel = impl_setupButton(); + buttonModel.setPropertyValue( "Label", "exec broken script" ); + impl_assignScript( buttonModel, "XActionListener", "actionPerformed", + scriptURI ); + + // switch the doc's view to form alive mode (so the button will actually work) + m_currentDocument.getCurrentView().dispatch( ".uno:SwitchControlDesignMode" ); + + // click the button + m_callbackCalled = false; + impl_clickButton( buttonModel ); + // the macro is executed asynchronously by the button, so wait at most 2 seconds for the callback to be + // triggered + impl_waitFor( m_callbackCondition, 2000 ); + // check the callback has actually been called + assertTrue( "clicking the test button did not work as expected - basic script not called", m_callbackCalled ); + + // again, since the script is executed asynchronously, we might arrive here while its execution + // is not completely finished. Give OOo another (at most) 2 seconds to finish it. + m_undoListener.waitForAllContextsClosed( 20000 ); + // assure that the Undo Context Depth of the doc is still "0": The Basic script entered such a + // context, and didn't close it (thus it is broken), but the application framework should have + // auto-closed the context after the macro finished. + assertEquals( "undo context was not auto-closed as expected", 0, m_undoListener.getCurrentUndoContextDepth() ); + + // ............................................................................................................. + // scenario 2: dispatching the script URL. Technically, this is equivalent to configuring the + // script into a menu or toolbar, and selecting the respective menu/toolbar item + m_callbackCalled = false; + m_currentDocument.getCurrentView().dispatch( scriptURI ); + assertTrue( "dispatching the Script URL did not work as expected - basic script not called", m_callbackCalled ); + // same as above: The script didn't close the context, but the OOo framework should have + assertEquals( "undo context was not auto-closed as expected", 0, m_undoListener.getCurrentUndoContextDepth() ); + + // ............................................................................................................. + // scenario 3: assigning the script to some document event, and triggering this event + final XEventsSupplier eventSupplier = UnoRuntime.queryInterface( XEventsSupplier.class, m_currentDocument.getDocument() ); + final XNameReplace events = UnoRuntime.queryInterface( XNameReplace.class, eventSupplier.getEvents() ); + final NamedValue[] scriptDescriptor = new NamedValue[] { + new NamedValue( "EventType", "Script" ), + new NamedValue( "Script", scriptURI ) + }; + events.replaceByName( "OnViewCreated", scriptDescriptor ); + + // The below doesn't work: event notification is broken in m96, see http://www.openoffice.org/issues/show_bug.cgi?id=116313 +/* m_callbackCalled = false; + m_currentDocument.getCurrentView().dispatch( ".uno:NewWindow" ); + assertTrue( "triggering an event did not work as expected - basic script not called", m_callbackCalled ); + // same as above: The script didn't close the context, but the OOo framework should have + assertEquals( "undo context was not auto-closed as expected", 0, m_undoListener.getCurrentUndoContextDepth() ); + */ + + // ............................................................................................................. + // scenario 4: let the script enter an Undo context, but not close it, as usual. + // Additionally, let the script close the document - the OOo framework code which cares for + // auto-closing of Undo contexts should survive this, ideally ... + m_closeAfterCallback = true; + m_callbackCalled = false; + m_currentDocument.getCurrentView().dispatch( scriptURI ); + assertTrue( m_callbackCalled ); + assertTrue( "The Basic script should have closed the document.", m_undoListener.isDisposed() ); + m_currentDocument = null; + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkSerialization() throws com.sun.star.uno.Exception, InterruptedException + { + System.out.println( "testing: request serialization" ); + + m_currentDocument = OfficeDocument.blankDocument( getORB(), DocumentType.CALC ); + final XUndoManager undoManager = getUndoManager(); + + final int threadCount = 10; + final int actionsPerThread = 10; + final int actionCount = threadCount * actionsPerThread; + + // add some actions to the UndoManager, each knowing its position on the stack + final Object lock = new Object(); + final Integer actionsUndone[] = new Integer[] { 0 }; + for ( int i=actionCount; i>0; ) + undoManager.addUndoAction( new CountingUndoAction( --i, lock, actionsUndone ) ); + + // some concurrent threads which undo the actions + Thread[] threads = new Thread[threadCount]; + for ( int i=0; i + m_activeUndoContexts = new Stack(); + private String m_mostRecentlyAddedAction = null; + private String m_mostRecentlyUndone = null; + private final Object m_allContextsClosedCondition = new Object(); + }; + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_checkUndo() throws Exception + { + System.out.println( "testing: " + m_currentTestCase.getDocumentDescription() ); + m_currentDocument = m_currentTestCase.getDocument(); + m_currentTestCase.initializeDocument(); + m_currentTestCase.verifyInitialDocumentState(); + + final XUndoManager undoManager = getUndoManager(); + undoManager.clear(); + assertFalse( "clearing the Undo manager should result in the impossibility to undo anything", undoManager.isUndoPossible() ); + assertFalse( "clearing the Undo manager should result in the impossibility to redo anything", undoManager.isRedoPossible() ); + + m_undoListener = new UndoListener(); + undoManager.addUndoManagerListener( m_undoListener ); + + impl_testSingleModification( undoManager ); + impl_testMultipleModifications( undoManager ); + impl_testCustomUndoActions( undoManager ); + impl_testLocking( undoManager ); + impl_testNestedContexts( undoManager ); + impl_testErrorHandling( undoManager ); + impl_testContextHandling( undoManager ); + impl_testStackHandling( undoManager ); + impl_testClearance( undoManager ); + impl_testHiddenContexts( undoManager ); + + // close the document, ensure the Undo manager listener gets notified + m_currentTestCase.closeDocument(); + m_currentTestCase = null; + m_currentDocument = null; + assertTrue( "document is closed, but the UndoManagerListener has not been notified of the disposal", m_undoListener.isDisposed() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testSingleModification( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + m_currentTestCase.doSingleModification(); + m_currentTestCase.verifySingleModificationDocumentState(); + + // undo the modification, ensure the listener got the proper notifications + assertEquals( "We did not yet do a undo!", 0, m_undoListener.getUndoActionCount() ); + i_undoManager.undo(); + assertEquals( "A simple undo does not result in the proper Undo count.", + 1, m_undoListener.getUndoActionCount() ); + + // verify the document is in its initial state, again + m_currentTestCase.verifyInitialDocumentState(); + + // redo the modification, ensure the listener got the proper notifications + assertEquals( "did not yet do a redo!", 0, m_undoListener.getRedoActionCount() ); + i_undoManager.redo(); + assertEquals( "did a redo, but got no notification of it!", 1, m_undoListener.getRedoActionCount() ); + // ensure the document is in the proper state, again + m_currentTestCase.verifySingleModificationDocumentState(); + + // now do an Undo via the UI (aka the dispatch API), and see if this works, and notifies the listener as + // expected + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Undo" ); + m_currentTestCase.verifyInitialDocumentState(); + assertEquals( "UI-Undo does not notify the listener", 2, m_undoListener.getUndoActionCount() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testMultipleModifications( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + m_undoListener.reset(); + assertEquals( "unexpected initial undo context depth", 0, m_undoListener.getCurrentUndoContextDepth() ); + i_undoManager.enterUndoContext( "Batch Changes" ); + assertEquals( "unexpected undo context depth after entering a context", + 1, m_undoListener.getCurrentUndoContextDepth() ); + assertEquals( "entering an Undo context has not been notified properly", + "Batch Changes", m_undoListener.getCurrentUndoContextTitle() ); + + final int modifications = m_currentTestCase.doMultipleModifications(); + assertEquals( "unexpected number of undo actions while doing batch changes to the document", + modifications, m_undoListener.getUndoActionsAdded() ); + assertEquals( "seems the document operations touched the undo context depth", + 1, m_undoListener.getCurrentUndoContextDepth() ); + + i_undoManager.leaveUndoContext(); + assertEquals( "unexpected undo context depth after leaving the last context", + 0, m_undoListener.getCurrentUndoContextDepth() ); + assertEquals( "no Undo done, yet - still the listener has been notified of an Undo action", + 0, m_undoListener.getUndoActionCount() ); + + i_undoManager.undo(); + assertEquals( "Just did an undo - the listener should have been notified", 1, m_undoListener.getUndoActionCount() ); + m_currentTestCase.verifyInitialDocumentState(); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testCustomUndoActions( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.clear(); + m_undoListener.reset(); + assertFalse( "undo stack not empty after clearing the undo manager", i_undoManager.isUndoPossible() ); + assertFalse( "redo stack not empty after clearing the undo manager", i_undoManager.isRedoPossible() ); + assertArrayEquals( ">0 descriptions for an empty undo stack?", + new String[0], i_undoManager.getAllUndoActionTitles() ); + assertArrayEquals( ">0 descriptions for an empty redo stack?", + new String[0], i_undoManager.getAllRedoActionTitles() ); + + // add two actions, one directly, one within a context + final CustomUndoAction action1 = new CustomUndoAction( "UndoAction1" ); + i_undoManager.addUndoAction( action1 ); + assertEquals( "Adding an undo action not observed by the listener", 1, m_undoListener.getUndoActionsAdded() ); + assertEquals( "Adding an undo action did not notify the proper title", + action1.getTitle(), m_undoListener.getMostRecentlyAddedActionTitle() ); + final String contextTitle = "Undo Context"; + i_undoManager.enterUndoContext( contextTitle ); + final CustomUndoAction action2 = new CustomUndoAction( "UndoAction2" ); + i_undoManager.addUndoAction( action2 ); + assertEquals( "Adding an undo action not observed by the listener", + 2, m_undoListener.getUndoActionsAdded() ); + assertEquals( "Adding an undo action did not notify the proper title", + action2.getTitle(), m_undoListener.getMostRecentlyAddedActionTitle() ); + i_undoManager.leaveUndoContext(); + + // see if the manager has proper descriptions + assertArrayEquals( "unexpected Redo descriptions after adding two actions", + new String[0], i_undoManager.getAllRedoActionTitles() ); + assertArrayEquals( "unexpected Undo descriptions after adding two actions", + new String[]{contextTitle, action1.getTitle()}, i_undoManager.getAllUndoActionTitles() ); + + // undo one action + i_undoManager.undo(); + assertEquals( "improper action title notified during programmatic Undo", + contextTitle, m_undoListener.getMostRecentlyUndoneTitle() ); + assertTrue( "nested custom undo action has not been undone as expected", action2.undoCalled() ); + assertFalse( "nested custom undo action has not been undone as expected", action1.undoCalled() ); + assertArrayEquals( "unexpected Redo descriptions after undoing a nested custom action", + new String[]{contextTitle}, i_undoManager.getAllRedoActionTitles() ); + assertArrayEquals( "unexpected Undo descriptions after undoing a nested custom action", + new String[]{action1.getTitle()}, i_undoManager.getAllUndoActionTitles() ); + + // undo the second action, via UI dispatches + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Undo" ); + assertEquals( "improper action title notified during UI Undo", action1.getTitle(), m_undoListener.getMostRecentlyUndoneTitle() ); + assertTrue( "nested custom undo action has not been undone as expected", action1.undoCalled() ); + assertArrayEquals( "unexpected Redo descriptions after undoing the second custom action", + new String[]{action1.getTitle(), contextTitle}, i_undoManager.getAllRedoActionTitles() ); + assertArrayEquals( "unexpected Undo descriptions after undoing the second custom action", + new String[0], i_undoManager.getAllUndoActionTitles() ); + + // check the actions are disposed when the stacks are cleared + i_undoManager.clear(); + assertTrue( action1.disposed() && action2.disposed() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testLocking( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + + // implicit Undo actions, triggered by changes to the document + assertFalse( "unexpected initial locking state", i_undoManager.isLocked() ); + i_undoManager.lock(); + assertTrue( "just locked the manager, why does it lie?", i_undoManager.isLocked() ); + m_currentTestCase.doSingleModification(); + assertEquals( "when the Undo manager is locked, no implicit additions should happen", + 0, m_undoListener.getUndoActionsAdded() ); + i_undoManager.unlock(); + assertEquals( "unlock is not expected to add collected actions - they should be discarded", + 0, m_undoListener.getUndoActionsAdded() ); + assertFalse( "just unlocked the manager, why does it lie?", i_undoManager.isLocked() ); + + // explicit Undo actions + i_undoManager.lock(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.unlock(); + assertEquals( "explicit Undo actions are expected to be ignored when the manager is locked", + 0, m_undoListener.getUndoActionsAdded() ); + + // Undo contexts while being locked + i_undoManager.lock(); + i_undoManager.enterUndoContext( "Dummy Context" ); + i_undoManager.enterHiddenUndoContext(); + assertEquals( "entering Undo contexts should be ignored when the manager is locked", 0, m_undoListener.getCurrentUndoContextDepth() ); + i_undoManager.leaveUndoContext(); + i_undoManager.leaveUndoContext(); + i_undoManager.unlock(); + + // |unlock| error handling + assertFalse( "internal error: manager should not be locked at this point in time", i_undoManager.isLocked() ); + boolean caughtExpected = false; + try { i_undoManager.unlock(); } catch ( final NotLockedException e ) { caughtExpected = true; } + assertTrue( "unlocking the manager when it is not locked should throw", caughtExpected ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testContextHandling( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + // ............................................................................................................. + // part I: non-empty contexts + i_undoManager.reset(); + m_undoListener.reset(); + + // put one action on the undo and one on the redo stack, as precondition for the following tests + final XUndoAction undoAction1 = new CustomUndoAction( "Undo Action 1" ); + i_undoManager.addUndoAction( undoAction1 ); + final XUndoAction undoAction2 = new CustomUndoAction( "Undo Action 2" ); + i_undoManager.addUndoAction( undoAction2 ); + i_undoManager.undo(); + assertTrue( "precondition for context handling tests not met (1)", i_undoManager.isUndoPossible() ); + assertTrue( "precondition for context handling tests not met (2)", i_undoManager.isRedoPossible() ); + assertArrayEquals( new String[] { undoAction1.getTitle() }, i_undoManager.getAllUndoActionTitles() ); + assertArrayEquals( new String[] { undoAction2.getTitle() }, i_undoManager.getAllRedoActionTitles() ); + + final String[] expectedRedoActionComments = new String[] { undoAction2.getTitle() }; + assertArrayEquals( expectedRedoActionComments, i_undoManager.getAllRedoActionTitles() ); + + // enter a context + i_undoManager.enterUndoContext( "Undo Context" ); + // this should not (yet) touch the redo stack + assertArrayEquals( expectedRedoActionComments, i_undoManager.getAllRedoActionTitles() ); + assertEquals( "unexpected undo context depth after entering a context", 1, m_undoListener.getCurrentUndoContextDepth() ); + // add a single action + XUndoAction undoAction3 = new CustomUndoAction( "Undo Action 3" ); + i_undoManager.addUndoAction( undoAction3 ); + // still, the redo stack should be untouched - added at a lower level does not affect it at all + assertArrayEquals( expectedRedoActionComments, i_undoManager.getAllRedoActionTitles() ); + + // while the context is open, its title should already contribute to the stack, ... + assertEquals( "Undo Context", i_undoManager.getCurrentUndoActionTitle() ); + // ... getAllUndo/RedoActionTitles should operate on the top level, not on the level defined by the open + // context, ... + assertArrayEquals( new String[] { "Undo Context", undoAction1.getTitle() }, + i_undoManager.getAllUndoActionTitles() ); + // ... but Undo and Redo should be impossible as long as the context is open + assertFalse( i_undoManager.isUndoPossible() ); + assertFalse( i_undoManager.isRedoPossible() ); + + // leave the context, check the listener has been notified properly, and the notified context depth is correct + i_undoManager.leaveUndoContext(); + assertTrue( m_undoListener.wasContextLeft() ); + assertFalse( m_undoListener.wasHiddenContextLeft() ); + assertFalse( m_undoListener.hasContextBeenCancelled() ); + assertEquals( "unexpected undo context depth leaving a non-empty context", 0, m_undoListener.getCurrentUndoContextDepth() ); + // leaving a non-empty context should have cleare the redo stack + assertArrayEquals( new String[0], i_undoManager.getAllRedoActionTitles() ); + assertTrue( m_undoListener.wasRedoStackCleared() ); + + // ............................................................................................................. + // part II: empty contexts + i_undoManager.reset(); + m_undoListener.reset(); + + // enter a context, leave it immediately without adding an action to it + i_undoManager.enterUndoContext( "Undo Context" ); + i_undoManager.leaveUndoContext(); + assertFalse( m_undoListener.wasContextLeft() ); + assertFalse( m_undoListener.wasHiddenContextLeft() ); + assertTrue( m_undoListener.hasContextBeenCancelled() ); + assertFalse( "leaving an empty context should silently remove it, and not contribute to the stack", + i_undoManager.isUndoPossible() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testNestedContexts( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + i_undoManager.enterUndoContext( "context 1" ); + i_undoManager.enterUndoContext( "context 1.1" ); + final CustomUndoAction action1 = new CustomUndoAction( "action 1.1.1" ); + i_undoManager.addUndoAction( action1 ); + i_undoManager.enterUndoContext( "context 1.1.2" ); + final CustomUndoAction action2 = new CustomUndoAction( "action 1.1.2.1" ); + i_undoManager.addUndoAction( action2 ); + i_undoManager.leaveUndoContext(); + final CustomUndoAction action3 = new CustomUndoAction( "action 1.1.3" ); + i_undoManager.addUndoAction( action3 ); + i_undoManager.leaveUndoContext(); + i_undoManager.leaveUndoContext(); + final CustomUndoAction action4 = new CustomUndoAction( "action 1.2" ); + i_undoManager.addUndoAction( action4 ); + + i_undoManager.undo(); + assertEquals( "undoing a single action notifies a wrong title", action4.getTitle(), m_undoListener.getMostRecentlyUndoneTitle() ); + assertTrue( "custom Undo not called", action4.undoCalled() ); + assertFalse( "too many custom Undos called", action1.undoCalled() || action2.undoCalled() || action3.undoCalled() ); + i_undoManager.undo(); + assertTrue( "nested actions not properly undone", action1.undoCalled() && action2.undoCalled() && action3.undoCalled() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testErrorHandling( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + + // try retrieving the comments for the current Undo/Redo - this should fail + boolean caughtExpected = false; + try { i_undoManager.getCurrentUndoActionTitle(); } + catch( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "trying the title of the current Undo action is expected to fail for an empty stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.getCurrentRedoActionTitle(); } + catch( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "trying the title of the current Redo action is expected to fail for an empty stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.undo(); } catch ( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "undo should throw if no Undo action is on the stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.redo(); } catch ( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "redo should throw if no Redo action is on the stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.leaveUndoContext(); } catch ( final InvalidStateException e ) { caughtExpected = true; } + assertTrue( "leaveUndoContext should throw if no context is currently open", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.addUndoAction( null ); } catch ( com.sun.star.lang.IllegalArgumentException e ) { caughtExpected = true; } + assertTrue( "adding a NULL action should be rejected", caughtExpected ); + + i_undoManager.reset(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.undo(); + i_undoManager.enterUndoContext( "Undo Context" ); + // those methods should fail when a context is open: + final String[] methodNames = new String[] { "undo", "redo", "clear", "clearRedo" }; + for ( int i=0; i