diff options
32 files changed, 3888 insertions, 0 deletions
diff --git a/sc/inc/macromgr.hxx b/sc/inc/macromgr.hxx new file mode 100644 index 000000000000..35a3b2d897fa --- /dev/null +++ b/sc/inc/macromgr.hxx @@ -0,0 +1,70 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: document.hxx,v $ + * $Revision: 1.115.36.9 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_MACROMGR_HXX +#define SC_MACROMGR_HXX + +#include <com/sun/star/container/XContainerListener.hpp> + +#include "rtl/ustring.hxx" +#include "scdllapi.h" + +#include <hash_map> +#include <memory> + +class ScDocument; +class ScFormulaCell; +class ScUserMacroDepTracker; + +class ScMacroManager +{ +public: + explicit ScMacroManager(ScDocument* pDoc); + ~ScMacroManager(); + + SC_DLLPUBLIC void InitUserFuncData(); + SC_DLLPUBLIC void SetUserFuncVolatile( const rtl::OUString& sName, bool isVolatile ); + SC_DLLPUBLIC bool GetUserFuncVolatile( const rtl::OUString& sName ); + + void AddDependentCell(const ::rtl::OUString& aModuleName, ScFormulaCell* pCell); + void RemoveDependentCell(ScFormulaCell* pCell); + void BroadcastModuleUpdate(const ::rtl::OUString& aModuleName); + +private: + typedef std::hash_map< ::rtl::OUString, bool, ::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > NameBoolMap; + NameBoolMap mhFuncToVolatile; + com::sun::star::uno::Reference< com::sun::star::container::XContainerListener > mxContainerListener; + + ::std::auto_ptr<ScUserMacroDepTracker> mpDepTracker; + ScDocument* mpDoc; +}; + +#endif + diff --git a/sc/source/filter/excel/xltoolbar.cxx b/sc/source/filter/excel/xltoolbar.cxx new file mode 100644 index 000000000000..e6303da9e0ac --- /dev/null +++ b/sc/source/filter/excel/xltoolbar.cxx @@ -0,0 +1,433 @@ +#include "xltoolbar.hxx" +#include <rtl/ustrbuf.hxx> +#include <stdarg.h> +#include <com/sun/star/ui/XUIConfigurationPersistence.hpp> +#include <com/sun/star/ui/XUIConfigurationPersistence.hpp> +#include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/lang/XSingleComponentFactory.hpp> +#include <com/sun/star/lang/XMultiComponentFactory.hpp> +#include <com/sun/star/ui/XImageManager.hpp> +#include <com/sun/star/ui/ItemType.hpp> +#include <fstream> +#include <comphelper/processfactory.hxx> +#include <vcl/graph.hxx> +#include <map> +using namespace com::sun::star; + +typedef std::map< sal_Int16, rtl::OUString > IdToString; + +class MSOExcelCommandConvertor : public MSOCommandConvertor +{ + IdToString msoToOOcmd; + IdToString tcidToOOcmd; +public: + MSOExcelCommandConvertor(); + virtual rtl::OUString MSOCommandToOOCommand( sal_Int16 msoCmd ); + virtual rtl::OUString MSOTCIDToOOCommand( sal_Int16 key ); +}; + +MSOExcelCommandConvertor::MSOExcelCommandConvertor() +{ +/* + // mso command id to ooo command string + // #FIXME and *HUNDREDS* of id's to added here + msoToOOcmd[ 0x20b ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(".uno:CloseDoc") ); + msoToOOcmd[ 0x50 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(".uno:Open") ); + + // mso tcid to ooo command string + // #FIXME and *HUNDREDS* of id's to added here + tcidToOOcmd[ 0x9d9 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(".uno:Print") ); +*/ +} + +rtl::OUString MSOExcelCommandConvertor::MSOCommandToOOCommand( sal_Int16 key ) +{ + rtl::OUString sResult; + IdToString::iterator it = msoToOOcmd.find( key ); + if ( it != msoToOOcmd.end() ) + sResult = it->second; + return sResult; +} + +rtl::OUString MSOExcelCommandConvertor::MSOTCIDToOOCommand( sal_Int16 key ) +{ + rtl::OUString sResult; + IdToString::iterator it = tcidToOOcmd.find( key ); + if ( it != tcidToOOcmd.end() ) + sResult = it->second; + return sResult; +} + + + +CTBS::CTBS() : bSignature(0), bVersion(0), reserved1(0), reserved2(0), reserved3(0), ctb(0), ctbViews(0), ictbView(0) +{ +} + +CTB::CTB() : nViews( 0 ), ectbid(0) +{ +} + +CTB::CTB(sal_uInt16 nNum ) : nViews( nNum ), ectbid(0) +{ +} + +bool CTB::Read( SvStream *pS ) +{ + OSL_TRACE("CTB::Read() stream pos 0x%x", pS->Tell() ); + nOffSet = pS->Tell(); + tb.Read( pS ); + for ( sal_uInt16 index = 0; index < nViews; ++index ) + { + TBVisualData aVisData; + aVisData.Read( pS ); + rVisualData.push_back( aVisData ); + } + *pS >> ectbid; + + for ( sal_Int16 index = 0; index < tb.getcCL(); ++index ) + { + TBC aTBC; + aTBC.Read( pS ); + rTBC.push_back( aTBC ); + } + return true; +} + +void CTB::Print( FILE* fp ) +{ + Indent a; + indent_printf( fp, "[ 0x%x ] CTB -- dump\n", nOffSet ); + indent_printf( fp, " nViews 0x%x\n", nViews); + tb.Print( fp ); + + std::vector<TBVisualData>::iterator visData_end = rVisualData.end(); + sal_Int32 counter = 0; + for ( std::vector<TBVisualData>::iterator it = rVisualData.begin(); it != visData_end; ++it ) + { + + indent_printf( fp, " TBVisualData [%d]\n", counter++ ); + Indent b; + it->Print( fp ); + } + indent_printf( fp, " ectbid 0x%x\n", ectbid); + std::vector<TBC>::iterator it_end = rTBC.end(); + counter = 0; + for ( std::vector<TBC>::iterator it = rTBC.begin(); it != it_end; ++it ) + { + indent_printf( fp, " TBC [%d]\n", counter++); + Indent c; + it->Print( fp ); + } +} + +bool CTB::IsMenuToolbar() +{ + return tb.IsMenuToolbar(); +} + +bool CTB::ImportMenuTB( CTBWrapper& rWrapper, const css::uno::Reference< css::container::XIndexContainer >& xMenuDesc, CustomToolBarImportHelper& helper ) +{ + sal_Int32 index = 0; + for ( std::vector< TBC >::iterator it = rTBC.begin(); it != rTBC.end(); ++it, ++index ) + { + if ( !it->ImportToolBarControl( rWrapper, xMenuDesc, helper, IsMenuToolbar() ) ) + return false; + } + return true; +} + +bool CTB::ImportCustomToolBar( CTBWrapper& rWrapper, CustomToolBarImportHelper& helper ) +{ + + static rtl::OUString sToolbarPrefix( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/custom_" ) ); + bool bRes = false; + try + { + if ( !tb.IsEnabled() ) + return true; // didn't fail, just ignoring + + // Create default setting + uno::Reference< container::XIndexContainer > xIndexContainer( helper.getCfgManager()->createSettings(), uno::UNO_QUERY_THROW ); + uno::Reference< container::XIndexAccess > xIndexAccess( xIndexContainer, uno::UNO_QUERY_THROW ); + uno::Reference< beans::XPropertySet > xProps( xIndexContainer, uno::UNO_QUERY_THROW ); + WString& name = tb.getName(); + // set UI name for toolbar + xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("UIName") ), uno::makeAny( name.getString() ) ); + + rtl::OUString sToolBarName = sToolbarPrefix.concat( name.getString() ); + for ( std::vector< TBC >::iterator it = rTBC.begin(); it != rTBC.end(); ++it ) + { + if ( !it->ImportToolBarControl( rWrapper, xIndexContainer, helper, IsMenuToolbar() ) ) + return false; + } + + OSL_TRACE("Name of toolbar :-/ %s", rtl::OUStringToOString( sToolBarName, RTL_TEXTENCODING_UTF8 ).getStr() ); + + helper.getCfgManager()->insertSettings( sToolBarName, xIndexAccess ); + helper.applyIcons(); +#if 1 + uno::Reference< ui::XUIConfigurationPersistence > xPersistence( helper.getCfgManager()->getImageManager(), uno::UNO_QUERY_THROW ); + xPersistence->store(); + + xPersistence.set( helper.getCfgManager(), uno::UNO_QUERY_THROW ); + xPersistence->store(); +#endif + + bRes = true; + } + catch( uno::Exception& ) + { + bRes = false; + } + return bRes; +} +bool CTBS::Read( SvStream *pS ) +{ + OSL_TRACE("CTBS::Read() stream pos 0x%x", pS->Tell() ); + nOffSet = pS->Tell(); + *pS >> bSignature >> bVersion >> reserved1 >> reserved2 >> reserved3 >> ctb >> ctbViews >> ictbView; + return true; +} + +void CTBS::Print( FILE* fp ) +{ + Indent a; + indent_printf( fp, "[ 0x%x ] CTBS -- dump\n", nOffSet ); + + indent_printf( fp, " bSignature 0x%x\n", bSignature); + indent_printf( fp, " bVersion 0x%x\n", bVersion); + + indent_printf( fp, " reserved1 0x%x\n", reserved1 ); + indent_printf( fp, " reserved2 0x%x\n", reserved2 ); + indent_printf( fp, " reserved3 0x%x\n", reserved3 ); + + indent_printf( fp, " ctb 0x%x\n", ctb ); + indent_printf( fp, " ctbViews 0x%x\n", ctbViews ); + indent_printf( fp, " ictbView 0x%x\n", ictbView ); +} + +TBC::TBC() +{ +} + +bool +TBC::Read(SvStream *pS) +{ + OSL_TRACE("TBC::Read() stream pos 0x%x", pS->Tell() ); + nOffSet = pS->Tell(); + if ( !tbch.Read( pS ) ) + return false; + sal_uInt16 tcid = tbch.getTcID(); + sal_uInt8 tct = tbch.getTct(); + if ( ( tcid != 0x0001 && tcid != 0x06CC && tcid != 0x03D8 && tcid != 0x03EC && tcid != 0x1051 ) && ( ( tct > 0 && tct < 0x0B ) || ( ( tct > 0x0B && tct < 0x10 ) || tct == 0x15 ) ) ) + { + tbcCmd.reset( new TBCCmd ); + if ( ! tbcCmd->Read( pS ) ) + return false; + } + if ( tct != 0x16 ) + { + tbcd.reset( new TBCData( tbch ) ); + if ( !tbcd->Read( pS ) ) + return false; + } + return true; +} + + +void +TBC::Print(FILE* fp) +{ + Indent a; + indent_printf( fp, "[ 0x%x ] TBC -- dump\n", nOffSet ); + tbch.Print( fp ); + if ( tbcCmd.get() ) + tbcCmd->Print( fp ); + if ( tbcd.get() ) + tbcd->Print( fp ); +} + +bool TBC::ImportToolBarControl( CTBWrapper& rWrapper, const css::uno::Reference< css::container::XIndexContainer >& toolbarcontainer, CustomToolBarImportHelper& helper, bool bIsMenuToolbar ) +{ + // how to identify built-in-command ? +// bool bBuiltin = false; + if ( tbcd.get() ) + { + std::vector< css::beans::PropertyValue > props; +/* + if ( bBuiltin ) + { + rtl::OUString sCommand = helper.MSOCommandToOOCommand( cmdId ); + if ( sCommand.getLength() > 0 ) + { + beans::PropertyValue aProp; + + aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("CommandURL") ); + aProp.Value <<= sCommand; + props.push_back( aProp ); + } + + } +*/ + bool bBeginGroup = false; + if ( ! tbcd->ImportToolBarControl( helper, props, bBeginGroup, bIsMenuToolbar ) ) + return false; + TBCMenuSpecific* pMenu = tbcd->getMenuSpecific(); + if ( pMenu ) + { + // search for CTB with the appropriate name ( it contains the + // menu items, although we cannot import ( or create ) a menu on + // a custom toolbar we can import the menu items in a separate + // toolbar ( better than nothing ) + CTB* pCustTB = rWrapper.GetCustomizationData( pMenu->Name() ); + if ( pCustTB ) + { + uno::Reference< container::XIndexContainer > xMenuDesc; + uno::Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW ); + xMenuDesc.set( xMSF->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.IndexedPropertyValues" ) ) ), uno::UNO_QUERY_THROW ); + if ( !pCustTB->ImportMenuTB( rWrapper, xMenuDesc, helper ) ) + return false; + if ( !bIsMenuToolbar ) + { + if ( !helper.createMenu( pMenu->Name(), uno::Reference< container::XIndexAccess >( xMenuDesc, uno::UNO_QUERY ), true ) ) + return false; + } + else + { + beans::PropertyValue aProp; + aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ItemDescriptorContainer") ); + aProp.Value <<= xMenuDesc; + props.push_back( aProp ); + } + } + } + + if ( bBeginGroup ) + { + // insert spacer + uno::Sequence< beans::PropertyValue > sProps( 1 ); + sProps[ 0 ].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Type") ); + sProps[ 0 ].Value = uno::makeAny( ui::ItemType::SEPARATOR_LINE ); + toolbarcontainer->insertByIndex( toolbarcontainer->getCount(), uno::makeAny( sProps ) ); + } + uno::Sequence< beans::PropertyValue > sProps( props.size() ); + beans::PropertyValue* pProp = sProps.getArray(); + + for ( std::vector< css::beans::PropertyValue >::iterator it = props.begin(); it != props.end(); ++it, ++pProp ) + *pProp = *it; + + toolbarcontainer->insertByIndex( toolbarcontainer->getCount(), uno::makeAny( sProps ) ); + } + return true; +} + +void +TBCCmd::Print(FILE* fp) +{ + Indent a; + indent_printf( fp, " TBCCmd -- dump\n" ); + indent_printf( fp, " cmdID 0x%x\n", cmdID ); + indent_printf( fp, " A ( fHideDrawing ) %s\n", A ? "true" : "false" ); + indent_printf( fp, " B ( reserved - ignored ) %s\n", A ? "true" : "false" ); + indent_printf( fp, " cmdType 0x%x\n", cmdType ); + indent_printf( fp, " C ( reserved - ignored ) %s\n", A ? "true" : "false" ); + indent_printf( fp, " reserved3 0x%x\n", reserved3 ); +} + +bool TBCCmd::Read( SvStream *pS ) +{ + OSL_TRACE("TBCCmd::Read() stream pos 0x%x", pS->Tell() ); + nOffSet = pS->Tell(); + *pS >> cmdID; + sal_uInt16 temp; + *pS >> temp; + OSL_TRACE("TBCmd temp = 0x%x", temp ); + A = (temp & 0x8000 ) == 0x8000; + B = (temp & 0x4000) == 0x4000; + cmdType = ( temp & 0x3E00 ) >> 9; + C = ( temp & 0x100 ) == 0x100; + reserved3 = ( temp & 0xFF ); + return true; +} + +CTBWrapper::CTBWrapper() +{ +} + +CTBWrapper::~CTBWrapper() +{ +} + +bool +CTBWrapper::Read( SvStream *pS) +{ + OSL_TRACE("CTBWrapper::Read() stream pos 0x%x", pS->Tell() ); + nOffSet = pS->Tell(); + if ( !ctbSet.Read( pS ) ) + return false; + for ( sal_uInt16 index = 0; index < ctbSet.ctb; ++index ) + { + CTB aCTB( ctbSet.ctbViews ); + if ( !aCTB.Read( pS ) ) + return false; + rCTB.push_back( aCTB ); + } + return true; +} + +void +CTBWrapper::Print( FILE* fp ) +{ + Indent a; + indent_printf( fp, "[ 0x%x ] CTBWrapper -- dump\n", nOffSet ); + ctbSet.Print( fp ); + std::vector<CTB>::iterator it_end = rCTB.end(); + for ( std::vector<CTB>::iterator it = rCTB.begin(); it != it_end; ++it ) + { + Indent b; + it->Print( fp ); + } +} + +CTB* CTBWrapper::GetCustomizationData( const rtl::OUString& sTBName ) +{ + CTB* pCTB = NULL; + for ( std::vector< CTB >::iterator it = rCTB.begin(); it != rCTB.end(); ++it ) + { + if ( it->GetName().equals( sTBName ) ) + { + pCTB = &(*it); + break; + } + } + return pCTB; +} + +bool CTBWrapper::ImportCustomToolBar( SfxObjectShell& rDocSh ) +{ + std::vector<CTB>::iterator it_end = rCTB.end(); + for ( std::vector<CTB>::iterator it = rCTB.begin(); it != it_end; ++it ) + { + // for each customtoolbar + uno::Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW ); + uno::Reference< ui::XModuleUIConfigurationManagerSupplier > xAppCfgSupp( xMSF->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.ModuleUIConfigurationManagerSupplier" ) ) ), uno::UNO_QUERY_THROW ); + CustomToolBarImportHelper helper( rDocSh, xAppCfgSupp->getUIConfigurationManager( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SpreadsheetDocument" ) ) ) ); + helper.setMSOCommandMap( new MSOExcelCommandConvertor() ); + // Ignore menu toolbars, excel doesn't ( afaics ) store + // menu customizations ( but you can have menus in a customtoolbar + // such menus will be dealt with when they are encountered + // as part of importing the appropriate MenuSpecific toolbar control ) + + + if ( !(*it).IsMenuToolbar() ) + { + if ( !(*it).ImportCustomToolBar( *this, helper ) ) + return false; + } + } + return true; +} + + diff --git a/sc/source/filter/excel/xltoolbar.hxx b/sc/source/filter/excel/xltoolbar.hxx new file mode 100644 index 000000000000..5152b6b398c4 --- /dev/null +++ b/sc/source/filter/excel/xltoolbar.hxx @@ -0,0 +1,95 @@ +#ifndef _XLTOOLBAR_HXX +#define _XLTOOLBAR_HXX + +#include <filter/msfilter/mstoolbar.hxx> + +namespace css = ::com::sun::star; + +class CTBWrapper; +// hmm I don't normally use these packed structures +// but.. hey always good to do something different +class TBCCmd : public TBBase +{ +public: + TBCCmd() : cmdID(0), A(0), B(0), cmdType(0), C(0), reserved3(0) {} + sal_uInt16 cmdID; + sal_uInt16 A:1; + sal_uInt16 B:1; + sal_uInt16 cmdType:5; + sal_uInt16 C:1; + sal_uInt16 reserved3:8; + bool Read( SvStream* pS ); + void Print(FILE* fp); +}; + +class TBC : public TBBase +{ + TBCHeader tbch; + boost::shared_ptr<TBCCmd> tbcCmd; // optional + boost::shared_ptr<TBCData> tbcd; +public: + TBC(); + ~TBC(){} + void Print( FILE* ); + bool Read(SvStream *pS); + bool ImportToolBarControl( CTBWrapper&, const com::sun::star::uno::Reference< com::sun::star::container::XIndexContainer >& toolbarcontainer, CustomToolBarImportHelper& helper, bool bIsMenuBar ); +}; + +class CTB : public TBBase +{ + sal_uInt16 nViews; + TB tb; + std::vector<TBVisualData> rVisualData; + sal_uInt32 ectbid; + std::vector< TBC > rTBC; + bool ImportCustomToolBar_Impl( CTBWrapper&, CustomToolBarImportHelper& ); +public: + CTB(); + CTB(sal_uInt16); + ~CTB(){} + void Print( FILE* ); + bool Read(SvStream *pS); + bool IsMenuToolbar(); + bool ImportCustomToolBar( CTBWrapper&, CustomToolBarImportHelper& ); + bool ImportMenuTB( CTBWrapper&, const css::uno::Reference< css::container::XIndexContainer >&, CustomToolBarImportHelper& ); + rtl::OUString GetName() { return tb.getName().getString(); } + + +}; + +class CTBS : public TBBase +{ +public: + sal_uInt8 bSignature; + sal_uInt8 bVersion; + sal_uInt16 reserved1; + sal_uInt16 reserved2; + sal_uInt16 reserved3; + sal_uInt16 ctb; + sal_uInt16 ctbViews; + sal_uInt16 ictbView; + CTBS(const CTBS&); + CTBS& operator = ( const CTBS&); + CTBS(); + ~CTBS(){} + void Print( FILE* ); + bool Read(SvStream *pS); +}; + +class CTBWrapper : public TBBase +{ + CTBS ctbSet; + + std::vector< CTB > rCTB; + +public: + CTBWrapper(); + ~CTBWrapper(); + bool Read(SvStream *pS); + void Print( FILE* ); + bool ImportCustomToolBar( SfxObjectShell& rDocSh ); + CTB* GetCustomizationData( const rtl::OUString& name ); +}; + + +#endif //_XLTOOLBAR_HXX diff --git a/sc/source/ui/docshell/macromgr.cxx b/sc/source/ui/docshell/macromgr.cxx new file mode 100644 index 000000000000..82c4f6950feb --- /dev/null +++ b/sc/source/ui/docshell/macromgr.cxx @@ -0,0 +1,217 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: document.hxx,v $ + * $Revision: 1.115.36.9 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + +// INCLUDE --------------------------------------------------------------- + +#include "macromgr.hxx" +#include "document.hxx" + +#include "basic/basmgr.hxx" +#include "cppuhelper/implbase1.hxx" +#include "sfx2/objsh.hxx" +#include "cell.hxx" +#include <com/sun/star/container/XContainer.hpp> + +#include <list> + +using namespace ::com::sun::star; +using ::com::sun::star::uno::RuntimeException; +using ::com::sun::star::uno::Reference; +using ::rtl::OUString; +using ::rtl::OUStringHash; +using ::std::hash_map; +using ::std::list; +using ::std::for_each; +using ::std::pair; + +// ============================================================================ + +/** + * A simple container to keep track of cells that depend on basic modules + * changes. We don't check for duplicates at insertion time; instead, we + * remove duplicates at query time. + */ +class ScUserMacroDepTracker +{ +public: + void addCell(const OUString& rModuleName, ScFormulaCell* pCell) + { + ModuleCellMap::iterator itr = maCells.find(rModuleName); + if (itr == maCells.end()) + { + pair<ModuleCellMap::iterator, bool> r = maCells.insert( + ModuleCellMap::value_type(rModuleName, list<ScFormulaCell*>())); + + if (!r.second) + // insertion failed. + return; + + itr = r.first; + } + itr->second.push_back(pCell); + } + + void removeCell(ScFormulaCell* pCell) + { + ModuleCellMap::iterator itr = maCells.begin(), itrEnd = maCells.end(); + for (; itr != itrEnd; ++itr) + itr->second.remove(pCell); + } + + void getCellsByModule(const OUString& rModuleName, list<ScFormulaCell*>& rCells) + { + ModuleCellMap::iterator itr = maCells.find(rModuleName); + if (itr == maCells.end()) + return; + + list<ScFormulaCell*>& rCellList = itr->second; + + // Remove duplicates. + rCellList.sort(); + rCellList.unique(); + // exception safe copy + list<ScFormulaCell*> temp(rCellList); + rCells.swap(temp); + } + +private: + typedef hash_map<OUString, list<ScFormulaCell*>, OUStringHash> ModuleCellMap; + ModuleCellMap maCells; +}; + + +// ============================================================================ + +ScMacroManager::ScMacroManager(ScDocument* pDoc) : + mpDepTracker(new ScUserMacroDepTracker), + mpDoc(pDoc) +{ +} + +ScMacroManager::~ScMacroManager() +{ +} + +typedef ::cppu::WeakImplHelper1< ::com::sun::star::container::XContainerListener > ContainerListenerHelper; + +class VBAProjectListener : public ContainerListenerHelper +{ + ScMacroManager* mpMacroMgr; +public: + VBAProjectListener( ScMacroManager* pMacroMgr ) : mpMacroMgr( pMacroMgr ) {} + // XEventListener + virtual void SAL_CALL disposing( const lang::EventObject& /*Source*/ ) throw(RuntimeException) {} + + // XContainerListener + virtual void SAL_CALL elementInserted( const container::ContainerEvent& /*Event*/ ) throw(RuntimeException){} + virtual void SAL_CALL elementReplaced( const container::ContainerEvent& Event ) throw(RuntimeException) + { + rtl::OUString sModuleName; + Event.Accessor >>= sModuleName; + OSL_TRACE("VBAProjectListener::elementReplaced(%s)", rtl::OUStringToOString( sModuleName, RTL_TEXTENCODING_UTF8 ).getStr() ); + mpMacroMgr->InitUserFuncData(); + mpMacroMgr->BroadcastModuleUpdate(sModuleName); + } + virtual void SAL_CALL elementRemoved( const container::ContainerEvent& /*Event*/ ) throw(RuntimeException){} + +}; + +void ScMacroManager::InitUserFuncData() +{ + // Clear hash_map + mhFuncToVolatile.clear(); + String sProjectName( RTL_CONSTASCII_USTRINGPARAM("Standard") ); + + Reference< container::XContainer > xModuleContainer; + SfxObjectShell* pShell = mpDoc->GetDocumentShell(); + if ( pShell && pShell->GetBasicManager()->GetName().Len() > 0 ) + sProjectName = pShell->GetBasicManager()->GetName(); + try + { + Reference< script::XLibraryContainer > xLibraries( pShell->GetBasicContainer(), uno::UNO_QUERY_THROW ); + xModuleContainer.set( xLibraries->getByName( sProjectName ), uno::UNO_QUERY_THROW ); + + if ( xModuleContainer.is() ) + { + // remove old listener ( if there was one ) + if ( mxContainerListener.is() ) + xModuleContainer->removeContainerListener( mxContainerListener ); + // Create listener + mxContainerListener = new VBAProjectListener( this ); + xModuleContainer->addContainerListener( mxContainerListener ); + } + } + catch( uno::Exception& ) + { + } +} + +void ScMacroManager::SetUserFuncVolatile( const OUString& sName, bool isVolatile ) +{ + mhFuncToVolatile[ sName ] = isVolatile; +} + +bool ScMacroManager::GetUserFuncVolatile( const OUString& sName ) +{ + NameBoolMap::iterator it = mhFuncToVolatile.find( sName ); + if ( it == mhFuncToVolatile.end() ) + return false; + return it->second; +} + +void ScMacroManager::AddDependentCell(const OUString& aModuleName, ScFormulaCell* pCell) +{ + mpDepTracker->addCell(aModuleName, pCell); +} + +void ScMacroManager::RemoveDependentCell(ScFormulaCell* pCell) +{ + mpDepTracker->removeCell(pCell); +} + +void ScMacroManager::BroadcastModuleUpdate(const OUString& aModuleName) +{ + list<ScFormulaCell*> aCells; + mpDepTracker->getCellsByModule(aModuleName, aCells); + list<ScFormulaCell*>::iterator itr = aCells.begin(), itrEnd = aCells.end(); + for (; itr != itrEnd; ++itr) + { + ScFormulaCell* pCell = *itr; + mpDoc->PutInFormulaTree(pCell); // for F9 recalc + + // for recalc on cell value change. If the cell is not volatile, the + // cell stops listening right away after it gets re-interpreted. + mpDoc->StartListeningArea(BCA_LISTEN_ALWAYS, pCell); + } +} + diff --git a/sc/source/ui/inc/datafdlg.hrc b/sc/source/ui/inc/datafdlg.hrc new file mode 100644 index 000000000000..e9780bb5753c --- /dev/null +++ b/sc/source/ui/inc/datafdlg.hrc @@ -0,0 +1,49 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: datafdlg.hrc,v $ + * + * $Revision: 1.00 $ + * + * last change: $Author: rt $ $Date: 2005/09/08 21:37:12 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +#include "sc.hrc" // -> RID_SCDLG_DATAFORM + +//dataform +#define BTN_DATAFORM_NEW 1001 +#define BTN_DATAFORM_DELETE 1002 +#define BTN_DATAFORM_RESTORE 1003 +#define BTN_DATAFORM_LAST 1004 +#define BTN_DATAFORM_NEXT 1005 +#define BTN_DATAFORM_CLOSE 1007 +#define WND_DATAFORM_SCROLLBAR 1008 +#define LAB_DATAFORM_RECORDNO 1009 + +#define FT_DATAFORM_FIXEDTEXT1 2001 +#define ED_DATAFORM_EDIT1 2002
\ No newline at end of file diff --git a/sc/source/ui/inc/datafdlg.hxx b/sc/source/ui/inc/datafdlg.hxx new file mode 100644 index 000000000000..25d00fe91aae --- /dev/null +++ b/sc/source/ui/inc/datafdlg.hxx @@ -0,0 +1,121 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: datafdlg.hxx,v $ + * + * $Revision: 1.00 $ + * + * last change: $Author: rt $ $Date: 2005/09/08 21:20:35 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +#ifndef SC_DATAFDLG_HXX +#define SC_DATAFDLG_HXX + + +#ifndef _SV_DIALOG_HXX //autogen +#include <vcl/dialog.hxx> +#endif + +#ifndef _SV_BUTTON_HXX //autogen +#include <vcl/imagebtn.hxx> +#endif + +#ifndef _SV_FIXED_HXX //autogen +#include <vcl/fixed.hxx> +#endif + + +#include "global.hxx" + +#include <tabvwsh.hxx> +#include <sfx2/bindings.hxx> +#include <sfx2/dispatch.hxx> + +#define MAX_DATAFORM_COLS 256 +#define MAX_DATAFORM_ROWS 32000 +#define CTRL_HEIGHT 22 +#define FIXED_WIDTH 60 +#define EDIT_WIDTH 140 +#define FIXED_LEFT 12 +#define EDIT_LEFT 78 +#define LINE_HEIGHT 30 + +//zhangyun +class ScDataFormDlg : public ModalDialog +{ +private: + + PushButton aBtnNew; + PushButton aBtnDelete; + PushButton aBtnRestore; + PushButton aBtnLast; + PushButton aBtnNext; + PushButton aBtnClose; + ScrollBar aSlider; + FixedText aFixedText; + //FixedText aFixedText1; + //Edit aEdit1; + + ScTabViewShell* pTabViewShell; + ScDocument* pDoc; + sal_uInt16 aColLength; + SCROW aCurrentRow; + SCCOL nStartCol; + SCCOL nEndCol; + SCROW nStartRow; + SCROW nEndRow; + SCTAB nTab; + BOOL bNoSelection; + + FixedText** pFixedTexts; + Edit** pEdits; + +public: + ScDataFormDlg( Window* pParent, ScTabViewShell* pTabViewShell); + ~ScDataFormDlg(); + + void FillCtrls(SCROW nCurrentRow); +private: + + void SetButtonState(); + + // Handler: + DECL_LINK( Impl_NewHdl, PushButton* ); + DECL_LINK( Impl_LastHdl, PushButton* ); + DECL_LINK( Impl_NextHdl, PushButton* ); + + DECL_LINK( Impl_RestoreHdl, PushButton* ); + DECL_LINK( Impl_DeleteHdl, PushButton* ); + DECL_LINK( Impl_CloseHdl, PushButton* ); + + DECL_LINK( Impl_ScrollHdl, ScrollBar* ); + DECL_LINK( Impl_DataModifyHdl, Edit* ); +}; +#endif // SC_DATAFDLG_HXX + + diff --git a/sc/source/ui/miscdlgs/datafdlg.cxx b/sc/source/ui/miscdlgs/datafdlg.cxx new file mode 100644 index 000000000000..beaa603f05b7 --- /dev/null +++ b/sc/source/ui/miscdlgs/datafdlg.cxx @@ -0,0 +1,422 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: datafdlg.cxx,v $ + * + * $Revision: 1.00 $ + * + * last change: $Author: kz $ $Date: 2006/07/21 14:04:33 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + +#undef SC_DLLIMPLEMENTATION + +//------------------------------------------------------------------ + +#include "datafdlg.hxx" +#include "scresid.hxx" +#include "datafdlg.hrc" +#include "viewdata.hxx" +//#include "document.hxx" +#include "docsh.hxx" +#include "refundo.hxx" +#include "undodat.hxx" + +#define HDL(hdl) LINK( this, ScDataFormDlg, hdl ) + +//zhangyun +ScDataFormDlg::ScDataFormDlg( Window* pParent, ScTabViewShell* pTabViewShellOri) : + ModalDialog ( pParent, ScResId( RID_SCDLG_DATAFORM ) ), + // + aBtnNew ( this, ScResId( BTN_DATAFORM_NEW ) ), + aBtnDelete ( this, ScResId( BTN_DATAFORM_DELETE ) ), + aBtnRestore ( this, ScResId( BTN_DATAFORM_RESTORE ) ), + aBtnLast ( this, ScResId( BTN_DATAFORM_LAST ) ), + aBtnNext ( this, ScResId( BTN_DATAFORM_NEXT ) ), + aBtnClose ( this, ScResId( BTN_DATAFORM_CLOSE ) ), + aSlider ( this, ScResId( WND_DATAFORM_SCROLLBAR ) ), + aFixedText ( this, ScResId( LAB_DATAFORM_RECORDNO ) ) +{ + pTabViewShell = pTabViewShellOri; + FreeResource(); + //read header form current document, and add new controls + DBG_ASSERT( pTabViewShell, "pTabViewShell is NULL! :-/" ); + ScViewData* pViewData = pTabViewShell->GetViewData(); + + pDoc = pViewData->GetDocument(); + if (pDoc) + { + ScRange aRange; + pViewData->GetSimpleArea( aRange ); + ScAddress aStart = aRange.aStart; + ScAddress aEnd = aRange.aEnd; + + nStartCol = aStart.Col(); + nEndCol = aEnd.Col(); + nStartRow = aStart.Row(); + nEndRow = aEnd.Row(); + + nTab = pViewData->GetTabNo(); + //if there is no selection + if ((nStartCol == nEndCol) && (nStartRow == nEndRow)) + bNoSelection = TRUE; + + if (bNoSelection) + { + //find last not blank cell in row + for (int i=1;i<=MAX_DATAFORM_COLS;i++) + { + String aColName; + nEndCol++; + pDoc->GetString( nEndCol, nStartRow, nTab, aColName ); + int nColWidth = pDoc->GetColWidth( nEndCol, nTab ); + if ( aColName.Len() == 0 && nColWidth) + { + nEndCol--; + break; + } + } + + //find first not blank cell in row + for (int i=1;i<=MAX_DATAFORM_COLS;i++) + { + String aColName; + if (nStartCol <= 0) + break; + nStartCol--; + + pDoc->GetString( nStartCol, nStartRow, nTab, aColName ); + int nColWidth = pDoc->GetColWidth( nEndCol, nTab ); + if ( aColName.Len() == 0 && nColWidth) + { + nStartCol++; + break; + } + } + + //skip leading hide column + for (int i=1;i<=MAX_DATAFORM_COLS;i++) + { + String aColName; + int nColWidth = pDoc->GetColWidth( nStartCol, nTab ); + if (nColWidth) + break; + nStartCol++; + } + + if (nEndCol < nStartCol) + nEndCol = nStartCol; + + //find last not blank cell in row + for (int i=1;i<=MAX_DATAFORM_ROWS;i++) + { + String aColName; + nEndRow++; + pDoc->GetString( nStartCol, nEndRow, nTab, aColName ); + if ( aColName.Len() == 0 ) + { + nEndRow--; + break; + } + } + + //find first not blank cell in row + for (int i=1;i<=MAX_DATAFORM_ROWS;i++) + { + String aColName; + if (nStartRow <= 0) + break; + nStartRow--; + + pDoc->GetString( nStartCol, nStartRow, nTab, aColName ); + if ( aColName.Len() == 0 ) + { + nStartRow++; + break; + } + } + + if (nEndRow < nStartRow) + nEndRow = nStartRow; + } + + aCurrentRow = nStartRow + 1; + + String aFieldName; + + int nTop = 12; + + Size nFixedSize(FIXED_WIDTH, CTRL_HEIGHT ); + Size nEditSize(EDIT_WIDTH, CTRL_HEIGHT ); + + //pFtArray = new FixedText(this); + aColLength = nEndCol - nStartCol + 1; + + //new the controls + pFixedTexts = new FixedText*[aColLength]; + pEdits = new Edit*[aColLength]; + + for(sal_uInt16 nIndex = 0; nIndex < aColLength; nIndex++) + { + pDoc->GetString( nIndex + nStartCol, nStartRow, nTab, aFieldName ); + int nColWidth = pDoc->GetColWidth( nIndex + nStartCol, nTab ); + if (nColWidth) + { + pFixedTexts[nIndex] = new FixedText(this); + pEdits[nIndex] = new Edit(this, WB_BORDER); + + pFixedTexts[nIndex]->SetSizePixel(nFixedSize); + pEdits[nIndex]->SetSizePixel(nEditSize); + pFixedTexts[nIndex]->SetPosPixel(Point(FIXED_LEFT, nTop)); + pEdits[nIndex]->SetPosPixel(Point(EDIT_LEFT, nTop)); + //pFixedTexts[nIndex]->SetText(String::CreateFromAscii("W4W-Filter Nr. ")); + pFixedTexts[nIndex]->SetText(aFieldName); + pFixedTexts[nIndex]->Show(); + pEdits[nIndex]->Show(); + + nTop += LINE_HEIGHT; + } + else + { + pFixedTexts[nIndex] = NULL; + pEdits[nIndex] = NULL; + } + pEdits[nIndex]->SetModifyHdl( HDL(Impl_DataModifyHdl) ); + } + + Size nDialogSize = this->GetSizePixel(); + if (nTop > nDialogSize.Height()) + { + nDialogSize.setHeight(nTop); + this->SetSizePixel(nDialogSize); + } + Size nScrollSize = aSlider.GetSizePixel(); + nScrollSize.setHeight(nDialogSize.Height()-20); + aSlider.SetSizePixel(nScrollSize); + } + + FillCtrls(aCurrentRow); + + aSlider.SetPageSize( 10 ); + aSlider.SetVisibleSize( 1 ); + aSlider.SetLineSize( 1 ); + aSlider.SetRange( Range( 0, nEndRow - nStartRow + 1) ); + aSlider.Show(); + + aBtnNew.SetClickHdl ( HDL(Impl_NewHdl) ); + aBtnLast.SetClickHdl ( HDL(Impl_LastHdl) ); + aBtnNext.SetClickHdl ( HDL(Impl_NextHdl) ); + + aBtnRestore.SetClickHdl ( HDL(Impl_RestoreHdl) ); + aBtnDelete.SetClickHdl ( HDL(Impl_DeleteHdl) ); + aBtnClose.SetClickHdl ( HDL(Impl_CloseHdl) ); + + aSlider.SetEndScrollHdl( HDL( Impl_ScrollHdl ) ); + + SetButtonState(); + + //end + //FreeResource(); +} + +ScDataFormDlg::~ScDataFormDlg() +{ + for(sal_uInt16 i = 0; i < aColLength; i++) + { + if (pEdits[i]) + delete pEdits[i]; + if (pFixedTexts[i]) + delete pFixedTexts[i]; + } + if (pEdits) + delete pEdits; + if (pFixedTexts) + delete pFixedTexts; +} + +void ScDataFormDlg::FillCtrls(SCROW /*nCurrentRow*/) +{ + //ScViewData* pViewData = pTabViewShell->GetViewData(); + + //pDoc = pViewData->GetDocument(); + String aFieldName; + int nRecordNum = nEndRow - nStartRow; + for(sal_uInt16 i = 0; i < aColLength; i++) + { + if (pEdits[i]) + { + if (aCurrentRow<=nEndRow) + { + pDoc->GetString( i + nStartCol, aCurrentRow, nTab, aFieldName ); + pEdits[i]->SetText(aFieldName); + } + else + pEdits[i]->SetText(String()); + } + } + char sRecordStr[256]; + if (aCurrentRow<=nEndRow) + aFixedText.SetText(String::CreateFromAscii(sRecordStr)); + else + aFixedText.SetText(String::CreateFromAscii("New Record")); + + aSlider.SetThumbPos(aCurrentRow-nStartRow-1); +} + +IMPL_LINK( ScDataFormDlg, Impl_DataModifyHdl, Edit*, pEdit) +{ + if ( pEdit->IsModified() ) + aBtnRestore.Enable( TRUE ); + return 0; +} + +IMPL_LINK( ScDataFormDlg, Impl_NewHdl, PushButton*, EMPTYARG ) +{ + ScViewData* pViewData = pTabViewShell->GetViewData(); + ScDocShell* pDocSh = pViewData->GetDocShell(); + if ( pDoc ) + { + sal_Bool bHasData = sal_False; + for(sal_uInt16 i = 0; i < aColLength; i++) + if (pEdits[i]) + if ( pEdits[i]->GetText().Len() != 0 ) + { + bHasData = sal_True; + break; + } + + if ( bHasData ) + { + pTabViewShell->DataFormPutData( aCurrentRow , nStartRow , nStartCol , nEndRow , nEndCol , pEdits , aColLength ); + aCurrentRow++; + if (aCurrentRow >= nEndRow + 2) + { + nEndRow ++ ; + aSlider.SetRange( Range( 0, nEndRow - nStartRow + 1) ); + } + SetButtonState(); + FillCtrls(aCurrentRow); + pDocSh->SetDocumentModified(); + pDocSh->PostPaintGridAll(); + } + } + return 0; +} + +IMPL_LINK( ScDataFormDlg, Impl_LastHdl, PushButton*, EMPTYARG ) +{ + if (pDoc) + { + if ( aCurrentRow > nStartRow +1 ) + aCurrentRow--; + + SetButtonState(); + FillCtrls(aCurrentRow); + } + return 0; +} + +IMPL_LINK( ScDataFormDlg, Impl_NextHdl, PushButton*, EMPTYARG ) +{ + if (pDoc) + { + if ( aCurrentRow <= nEndRow) + aCurrentRow++; + + SetButtonState(); + FillCtrls(aCurrentRow); + } + return 0; +} + +IMPL_LINK( ScDataFormDlg, Impl_RestoreHdl, PushButton*, EMPTYARG ) +{ + if (pDoc) + { + FillCtrls(aCurrentRow); + } + return 0; +} + +IMPL_LINK( ScDataFormDlg, Impl_DeleteHdl, PushButton*, EMPTYARG ) +{ + ScViewData* pViewData = pTabViewShell->GetViewData(); + ScDocShell* pDocSh = pViewData->GetDocShell(); + if (pDoc) + { + ScRange aRange(nStartCol, aCurrentRow, nTab, nEndCol, aCurrentRow, nTab); + pDoc->DeleteRow(aRange); + nEndRow--; + + SetButtonState(); + pDocSh->GetUndoManager()->Clear(); + + FillCtrls(aCurrentRow); + pDocSh->SetDocumentModified(); + pDocSh->PostPaintGridAll(); + } + return 0; +} + +IMPL_LINK( ScDataFormDlg, Impl_CloseHdl, PushButton*, EMPTYARG ) +{ + EndDialog( ); + return 0; +} + +IMPL_LINK( ScDataFormDlg, Impl_ScrollHdl, ScrollBar*, EMPTYARG ) +{ + long nOffset = aSlider.GetThumbPos(); + aCurrentRow = nStartRow + nOffset + 1; + SetButtonState(); + FillCtrls(aCurrentRow); + return 0; +} + +void ScDataFormDlg::SetButtonState() +{ + if ( aCurrentRow > nEndRow ) + { + aBtnDelete.Enable( FALSE ); + aBtnLast.Enable( TRUE ); + aBtnNext.Enable( FALSE ); + } + else + { + aBtnDelete.Enable( TRUE ); + aBtnNext.Enable( TRUE ); + } + if ( 1 == aCurrentRow ) + aBtnLast.Enable( FALSE ); + + aBtnRestore.Enable( FALSE ); + if ( pEdits ) + pEdits[0]->GrabFocus(); +} diff --git a/sc/source/ui/src/datafdlg.src b/sc/source/ui/src/datafdlg.src new file mode 100644 index 000000000000..535ec66e7438 --- /dev/null +++ b/sc/source/ui/src/datafdlg.src @@ -0,0 +1,108 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: datafdlg.src,v $ + * + * $Revision: 1.00 $ + * + * last change: $Author: hr $ $Date: 2005/09/23 15:07:30 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +#include "datafdlg.hrc" + +//zhangyun, dataform +ModalDialog RID_SCDLG_DATAFORM +{ + OutputSize = TRUE ; + SVLook = TRUE ; + Size = MAP_APPFONT ( 191 , 180 ) ; + Text [ en-US ] = "Data Form" ; + Moveable = TRUE ; + Closeable = TRUE ; + FixedText LAB_DATAFORM_RECORDNO + { + Pos = MAP_APPFONT ( 136 , 6 ) ; + Size = MAP_APPFONT ( 50 , 12 ) ; + Text [ en-US ] = "/" ; + }; + PushButton BTN_DATAFORM_NEW + { + Pos = MAP_APPFONT ( 135 , 23 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + DefButton = TRUE ; + Text [ en-US ] = "New" ; + }; + PushButton BTN_DATAFORM_DELETE + { + Pos = MAP_APPFONT ( 135 , 40 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + Text [ en-US ] = "Delete" ; + }; + PushButton BTN_DATAFORM_RESTORE + { + Pos = MAP_APPFONT ( 135 , 57 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + Text [ en-US ] = "Restore" ; + }; + PushButton BTN_DATAFORM_LAST + { + Pos = MAP_APPFONT ( 135 , 82 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + Text [ en-US ] = "Last Record" ; + }; + PushButton BTN_DATAFORM_NEXT + { + Pos = MAP_APPFONT ( 135 , 99 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + Text [ en-US ] = "Next Record" ; + }; + PushButton BTN_DATAFORM_CLOSE + { + Pos = MAP_APPFONT ( 135 , 116 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + Text [ en-US ] = "Close" ; + }; + ScrollBar WND_DATAFORM_SCROLLBAR + { + Pos = MAP_APPFONT ( 124 , 6 ) ; + Size = MAP_APPFONT ( 8 , 135 ) ; + HScroll = FALSE ; + TabStop = FALSE ; + }; +}; +//end + + + + diff --git a/sc/source/ui/vba/vbacommentshape.cxx b/sc/source/ui/vba/vbacommentshape.cxx new file mode 100644 index 000000000000..4c0d15597ce7 --- /dev/null +++ b/sc/source/ui/vba/vbacommentshape.cxx @@ -0,0 +1,46 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright IBM Corporation 2009, 2010. + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "vbacommentshape.hxx" + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaCommentShape::ScVbaCommentShape( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< drawing::XShape >& xShape, const uno::Reference< excel::XComment >& xComment, + const uno::Reference< drawing::XShapes >& xShapes, const uno::Reference< frame::XModel >& xModel, sal_Int32 nType ) : ScVbaShape( xParent, xContext, xShape, xShapes, xModel, nType ) +{ + m_xComment.set( xComment, uno::UNO_QUERY ); +} + +void SAL_CALL ScVbaCommentShape::Delete() throw (uno::RuntimeException) +{ + if ( m_xComment.is() ) + { + m_xComment->Delete(); + } +} diff --git a/sc/source/ui/vba/vbacommentshape.hxx b/sc/source/ui/vba/vbacommentshape.hxx new file mode 100644 index 000000000000..d55de4b07c18 --- /dev/null +++ b/sc/source/ui/vba/vbacommentshape.hxx @@ -0,0 +1,46 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright IBM Corporation 2009, 2010. + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_VBA_COMMENTSHAPE_HXX +#define SC_VBA_COMMENTSHAPE_HXX + +#include <ooo/vba/excel/XComment.hpp> +#include <vbahelper/vbashape.hxx> + +class ScVbaCommentShape : public ScVbaShape +{ + css::uno::Reference< ooo::vba::excel::XComment > m_xComment; + +public: + ScVbaCommentShape( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::drawing::XShape >& xShape, + const css::uno::Reference< ooo::vba::excel::XComment >& xComment, const css::uno::Reference< css::drawing::XShapes >& xShapes, const css::uno::Reference< css::frame::XModel >& xModel, sal_Int32 nType ); + + // Methods + virtual void SAL_CALL Delete() throw (css::uno::RuntimeException); +}; +#endif //SC_VBA_COMMENTSHAPE_HXX diff --git a/sc/source/ui/vba/vbafiledialog.cxx b/sc/source/ui/vba/vbafiledialog.cxx new file mode 100644 index 000000000000..36e052b13598 --- /dev/null +++ b/sc/source/ui/vba/vbafiledialog.cxx @@ -0,0 +1,186 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright IBM Corporation 2009, 2010. + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "vbafiledialog.hxx" +#include "comphelper/processfactory.hxx" +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/ui/dialogs/XFilePicker.hpp> +#include <com/sun/star/ui/dialogs/XFilePicker2.hpp> +#include <com/sun/star/ui/dialogs/TemplateDescription.hpp> +#include "tools/urlobj.hxx" + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + + +ScVbaFileDialog::ScVbaFileDialog( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext > &xContext, const css::uno::Reference< css::frame::XModel >& xModel ) +: ScVbaFileDialog_BASE( xParent, xContext, xModel ) +{ + m_pFileDialogSelectedItems = new VbaFileDialogSelectedItems(xParent, xContext, (com::sun::star::container::XIndexAccess *)&m_FileDialogSelectedObj); +} + +ScVbaFileDialog::~ScVbaFileDialog() +{ + if (m_pFileDialogSelectedItems != NULL) + { + delete m_pFileDialogSelectedItems; + } +} + +rtl::OUString& +ScVbaFileDialog::getServiceImplName() +{ + static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaFileDialog") ); + return sImplName; +} + +css::uno::Sequence<rtl::OUString> +ScVbaFileDialog::getServiceNames() +{ + static Sequence< rtl::OUString > aServiceNames; + if ( aServiceNames.getLength() == 0 ) + { + aServiceNames.realloc( 1 ); + aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.FileDialog" ) ); + } + return aServiceNames; + +} + +css::uno::Reference< ov::XFileDialogSelectedItems > SAL_CALL +ScVbaFileDialog::getSelectedItems() throw (css::uno::RuntimeException) +{ + css::uno::Reference< ov::XFileDialogSelectedItems > xFileDlgSlc = (ov::XFileDialogSelectedItems *)m_pFileDialogSelectedItems; + return xFileDlgSlc; +} + +::sal_Int32 SAL_CALL +ScVbaFileDialog::Show( ) throw (::com::sun::star::uno::RuntimeException) +{ + // Returns an Integer indicating if user pressed "Open" button(-1) or "Cancel" button(0). + sal_Int32 nResult = -1; + try + { + m_sSelectedItems.realloc(0); + + const ::rtl::OUString sServiceName = ::rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.FilePicker" ); + + Reference< lang::XMultiServiceFactory > xMSF( comphelper::getProcessServiceFactory(), uno::UNO_QUERY ); + // Set the type of File Picker Dialog: TemplateDescription::FILEOPEN_SIMPLE. + Sequence< uno::Any > aDialogType( 1 ); + aDialogType[0] <<= ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE; + Reference < ui::dialogs::XFilePicker > xFilePicker( xMSF->createInstanceWithArguments( sServiceName, aDialogType ), UNO_QUERY ); + Reference < ui::dialogs::XFilePicker2 > xFilePicker2( xFilePicker, UNO_QUERY ); + if ( xFilePicker.is() ) + { + xFilePicker->setMultiSelectionMode(sal_True); + if ( xFilePicker->execute() ) + { + sal_Bool bUseXFilePicker2 = sal_False; + Reference< lang::XServiceInfo > xServiceInfo( xFilePicker, UNO_QUERY ); + if (xServiceInfo.is()) + { + rtl::OUString sImplName = xServiceInfo->getImplementationName(); + if (sImplName.equalsAscii("com.sun.star.comp.fpicker.VistaFileDialog") || + sImplName.equalsAscii("com.sun.star.ui.dialogs.SalGtkFilePicker")) + { + bUseXFilePicker2 = sal_True; + } + } + if ( bUseXFilePicker2 && xFilePicker2.is() ) + { + // On Linux, XFilePicker->getFiles() always return one selected file although we select + // more than one file, also on Vista XFilePicker->getFiles() does not work well too, + // so we call XFilePicker2->getSelectedFiles() to get selected files. + m_sSelectedItems = xFilePicker2->getSelectedFiles(); + } + else + { + // If only one file is selected, the first entry of the sequence contains the complete path/filename in + // URL format. If multiple files are selected, the first entry of the sequence contains the path in URL + // format, and the other entries contains the names of the selected files without path information. + Sequence< rtl::OUString > aSelectedFiles = xFilePicker->getFiles(); + sal_Int32 iFileCount = aSelectedFiles.getLength(); + if ( iFileCount > 1 ) + { + m_sSelectedItems.realloc( iFileCount - 1 ); + INetURLObject aPath( aSelectedFiles[0] ); + aPath.setFinalSlash(); + for ( sal_Int32 i = 1; i < iFileCount; i++ ) + { + if ( aSelectedFiles[i].indexOf ('/') > 0 || aSelectedFiles[i].indexOf ('\\') > 0 ) + { + m_sSelectedItems[i - 1] = aSelectedFiles[i]; + } + else + { + if ( i == 1 ) + aPath.Append( aSelectedFiles[i] ); + else + aPath.setName( aSelectedFiles[i] ); + m_sSelectedItems[i - 1] = aPath.GetMainURL(INetURLObject::NO_DECODE); + } + } + } + else if ( iFileCount == 1 ) + { + m_sSelectedItems = aSelectedFiles; + } + } + + sal_Int32 iFileCount = m_sSelectedItems.getLength(); + rtl::OUString aTemp; + for ( sal_Int32 i = 0; i < iFileCount; i++ ) + { + INetURLObject aObj( m_sSelectedItems[i] ); + if ( aObj.GetProtocol() == INET_PROT_FILE ) + { + aTemp = aObj.PathToFileName(); + m_sSelectedItems[i] = aTemp.getLength() > 0 ? aTemp : m_sSelectedItems[i]; + } + } + } + else + { + nResult = 0; + } + } + + m_FileDialogSelectedObj.SetSelectedFile(m_sSelectedItems); + } + catch( const uno::Exception& ) + { + return 0; + } + + return nResult; +} + + + diff --git a/sc/source/ui/vba/vbafiledialog.hxx b/sc/source/ui/vba/vbafiledialog.hxx new file mode 100644 index 000000000000..4ef7d9932bcc --- /dev/null +++ b/sc/source/ui/vba/vbafiledialog.hxx @@ -0,0 +1,60 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright IBM Corporation 2009, 2010. + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _vbafiledialog_hxx_ +#define _vbafiledialog_hxx_ + +#include <cppuhelper/implbase1.hxx> +#include <vbahelper/vbadialogsbase.hxx> +#include <ooo/vba/XFileDialog.hpp> +#include "vbafiledialogselecteditems.hxx" + + +typedef cppu::ImplInheritanceHelper1< VbaDialogsBase, ov::XFileDialog > ScVbaFileDialog_BASE; + +class ScVbaFileDialog : public ScVbaFileDialog_BASE +{ +public: + + ScVbaFileDialog( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext > &xContext, const css::uno::Reference< css::frame::XModel >& xModel ) ; + virtual ~ScVbaFileDialog() ; + + // XHelperInterface + virtual rtl::OUString& getServiceImplName(); + virtual css::uno::Sequence<rtl::OUString> getServiceNames(); + //XFileDialog + virtual css::uno::Reference< ov::XFileDialogSelectedItems > SAL_CALL getSelectedItems() throw (css::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL Show( ) throw (::com::sun::star::uno::RuntimeException) ; + +private: + css::uno::Sequence < rtl::OUString > m_sSelectedItems; + VbaFileDialogSelectedItems *m_pFileDialogSelectedItems; + VbaFileDialogSelectedObj m_FileDialogSelectedObj; +}; + +#endif
\ No newline at end of file diff --git a/sc/source/ui/vba/vbafiledialogselecteditems.cxx b/sc/source/ui/vba/vbafiledialogselecteditems.cxx new file mode 100644 index 000000000000..29cfd52017ab --- /dev/null +++ b/sc/source/ui/vba/vbafiledialogselecteditems.cxx @@ -0,0 +1,157 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright IBM Corporation 2009, 2010. + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "vbafiledialogselecteditems.hxx" + +using namespace ::com::sun::star; + +VbaFileDialogSelectedItems::VbaFileDialogSelectedItems( const css::uno::Reference< ov::XHelperInterface >& xParent, + const css::uno::Reference< css::uno::XComponentContext >& xContext, + const css::uno::Reference< css::container::XIndexAccess >& xIndexAccess + ) + : FileDialogSelectedItems_BASE( xParent, xContext, xIndexAccess ) +{ +} + + +rtl::OUString& VbaFileDialogSelectedItems::getServiceImplName() +{ + static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("VbaFileDialogSelectedItems") ); + return sImplName; + +} +css::uno::Sequence<rtl::OUString> VbaFileDialogSelectedItems::getServiceNames() +{ + static uno::Sequence< rtl::OUString > aServiceNames; + if ( aServiceNames.getLength() == 0 ) + { + aServiceNames.realloc( 1 ); + aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.FileDialogSelectedItems" ) ); + } + return aServiceNames; + +} + +css::uno::Any VbaFileDialogSelectedItems::createCollectionObject( const css::uno::Any& aSource ) +{ + css::uno::Any aRet; + aRet = aSource; + return aRet; +} + + +css::uno::Type SAL_CALL +VbaFileDialogSelectedItems::getElementType() throw (css::uno::RuntimeException) +{ + return ooo::vba::XFileDialogSelectedItems::static_type(0); +} + +css::uno::Reference< css::container::XEnumeration > SAL_CALL +VbaFileDialogSelectedItems::createEnumeration() throw (css::uno::RuntimeException) +{ + css::uno::Reference< css::container::XEnumeration > xEnumRet(m_xIndexAccess, css::uno::UNO_QUERY); + return xEnumRet; +} + + +//VbaFileDialogSelectedObj +////////////////////////////////////////////////////////////////////////// + +VbaFileDialogSelectedObj::VbaFileDialogSelectedObj() +{ + m_nIndex = 0; +} + + +sal_Bool +VbaFileDialogSelectedObj::SetSelectedFile(css::uno::Sequence<rtl::OUString> &sFList) +{ + m_sFileList = sFList; + return sal_True; +} + +sal_Int32 SAL_CALL +VbaFileDialogSelectedObj::getCount() throw(::com::sun::star::uno::RuntimeException) +{ + sal_Int32 nListCnt = m_sFileList.getLength(); + return nListCnt; +} + +::com::sun::star::uno::Any SAL_CALL VbaFileDialogSelectedObj::getByIndex( sal_Int32 nIndex ) +throw(::com::sun::star::lang::IndexOutOfBoundsException, + ::com::sun::star::lang::WrappedTargetException, + ::com::sun::star::uno::RuntimeException) +{ + css::uno::Any aRet; + + if ( nIndex >= getCount() ) + { + throw css::lang::IndexOutOfBoundsException(); + } + + return uno::makeAny(m_sFileList[nIndex]); +} + +::com::sun::star::uno::Type SAL_CALL +VbaFileDialogSelectedObj::getElementType() +throw(::com::sun::star::uno::RuntimeException) +{ + return getCppuType((uno::Reference<com::sun::star::container::XIndexAccess>*)0); +} + +sal_Bool SAL_CALL VbaFileDialogSelectedObj::hasElements() +throw(::com::sun::star::uno::RuntimeException) +{ + return ( getCount() != 0 ); +} + +::sal_Bool SAL_CALL +VbaFileDialogSelectedObj::hasMoreElements( ) +throw (uno::RuntimeException) +{ + if (getCount() > m_nIndex) + { + return sal_True; + } + return sal_False; +} + +uno::Any SAL_CALL +VbaFileDialogSelectedObj::nextElement( ) +throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) +{ + if (!hasMoreElements()) + { + throw container::NoSuchElementException(); + } + + return uno::makeAny(m_sFileList[m_nIndex++]); +} + + + diff --git a/sc/source/ui/vba/vbafiledialogselecteditems.hxx b/sc/source/ui/vba/vbafiledialogselecteditems.hxx new file mode 100644 index 000000000000..272e00ef2d30 --- /dev/null +++ b/sc/source/ui/vba/vbafiledialogselecteditems.hxx @@ -0,0 +1,87 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright IBM Corporation 2009, 2010. + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _vbafiledialogselecteditems_hxx_ +#define _vbafiledialogselecteditems_hxx_ + +#include <ooo/vba/XFileDialogSelectedItems.hpp> +#include <vbahelper/vbacollectionimpl.hxx> +#include <cppuhelper/implbase1.hxx> +#include <com/sun/star/container/XIndexAccess.hpp> + +typedef CollTestImplHelper< ov::XFileDialogSelectedItems > FileDialogSelectedItems_BASE; + + +class VbaFileDialogSelectedItems : public FileDialogSelectedItems_BASE +{ +public: + VbaFileDialogSelectedItems( const css::uno::Reference< ov::XHelperInterface >& xParent, + const css::uno::Reference< css::uno::XComponentContext >& xContext, + const css::uno::Reference< css::container::XIndexAccess >& xIndexAccess ); + + virtual css::uno::Any createCollectionObject( const css::uno::Any& aSource ); + virtual css::uno::Type SAL_CALL getElementType() throw (css::uno::RuntimeException); + virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() throw (css::uno::RuntimeException); + +protected: + virtual rtl::OUString& getServiceImplName(); + virtual css::uno::Sequence<rtl::OUString> getServiceNames(); +private: +}; + + +class VbaFileDialogSelectedObj : public cppu::WeakImplHelper2<css::container::XIndexAccess, css::container::XEnumeration> +{ +public: + VbaFileDialogSelectedObj(); + sal_Bool SetSelectedFile(css::uno::Sequence<rtl::OUString> &sFList); + //XIndexAccess + virtual sal_Int32 SAL_CALL getCount() throw(::com::sun::star::uno::RuntimeException); + + virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( sal_Int32 nIndex ) + throw(::com::sun::star::lang::IndexOutOfBoundsException, + ::com::sun::star::lang::WrappedTargetException, + ::com::sun::star::uno::RuntimeException); + + // XElementAccess + virtual ::com::sun::star::uno::Type SAL_CALL getElementType() + throw(::com::sun::star::uno::RuntimeException); + + virtual sal_Bool SAL_CALL hasElements() throw(::com::sun::star::uno::RuntimeException); + + //XEnumeration + virtual ::sal_Bool SAL_CALL hasMoreElements( ) throw (css::uno::RuntimeException); + virtual css::uno::Any SAL_CALL nextElement( ) throw (css::container::NoSuchElementException, css::lang::WrappedTargetException, css::uno::RuntimeException); + +protected: +private: + css::uno::Sequence<rtl::OUString> m_sFileList; + sal_Int32 m_nIndex; +}; + +#endif diff --git a/sc/source/ui/vba/vbafilesearch.cxx b/sc/source/ui/vba/vbafilesearch.cxx new file mode 100644 index 000000000000..9711a5316e4a --- /dev/null +++ b/sc/source/ui/vba/vbafilesearch.cxx @@ -0,0 +1,242 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright IBM Corporation 2009, 2010. + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "vbafilesearch.hxx" +#include "vbaapplication.hxx" +#include "vbafoundfiles.hxx" +#include <comphelper/processfactory.hxx> +#include <tools/urlobj.hxx> +#include <tools/wldcrd.hxx> +#include <com/sun/star/ucb/XSimpleFileAccess3.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/uno/Sequence.hxx> +#include <vector> +#include "unotools/viewoptions.hxx" +#include <osl/file.hxx> + +using namespace ::ooo::vba; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::ucb; +using namespace ::com::sun::star::lang; +using namespace comphelper; + +static Reference< XSimpleFileAccess3 > getFileAccess( void ) +{ + static Reference< XSimpleFileAccess3 > xSFI; + if( !xSFI.is() ) + { + Reference< XMultiServiceFactory > xSMgr = getProcessServiceFactory(); + if( xSMgr.is() ) + { + xSFI = Reference< XSimpleFileAccess3 >( xSMgr->createInstance + ( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY ); + } + } + return xSFI; +} + +ScVbaFileSearch::ScVbaFileSearch( ScVbaApplication* pApp, const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext ) + : ScVbaFileSearchImpl_BASE( xParent, xContext ), m_pApplication( pApp ) +{ + NewSearch(); +} + +ScVbaFileSearch::~ScVbaFileSearch() +{ +} + +::rtl::OUString SAL_CALL ScVbaFileSearch::getFileName() throw (css::uno::RuntimeException) +{ + return m_sFileName; +} + +void SAL_CALL ScVbaFileSearch::setFileName(const ::rtl::OUString& _fileName ) throw (css::uno::RuntimeException) +{ + m_sFileName = _fileName; +} + +::rtl::OUString SAL_CALL ScVbaFileSearch::getLookIn() throw (css::uno::RuntimeException) +{ + return m_sLookIn; +} + +void SAL_CALL ScVbaFileSearch::setLookIn( const ::rtl::OUString& _lookIn ) throw (css::uno::RuntimeException) +{ + m_sLookIn = _lookIn; +} + +sal_Bool SAL_CALL ScVbaFileSearch::getSearchSubFolders() throw (css::uno::RuntimeException) +{ + return m_bSearchSubFolders; +} + +void SAL_CALL ScVbaFileSearch::setSearchSubFolders( sal_Bool _searchSubFolders ) throw (css::uno::RuntimeException) +{ + m_bSearchSubFolders = _searchSubFolders; +} + +sal_Bool SAL_CALL ScVbaFileSearch::getMatchTextExactly() throw (css::uno::RuntimeException) +{ + return m_bMatchTextExactly; +} + +void SAL_CALL ScVbaFileSearch::setMatchTextExactly( sal_Bool _matchTextExactly ) throw (css::uno::RuntimeException) +{ + m_bMatchTextExactly = _matchTextExactly; +} + +static bool IsWildCard( const ::rtl::OUString& fileName ) +{ + static sal_Char cWild1 = '*'; + static sal_Char cWild2 = '?'; + + return ( ( fileName.indexOf( cWild1 ) >= 0 ) + || ( fileName.indexOf( cWild2 ) >= 0 ) ); +} + +static void SearchWildCard(const WildCard& wildCard, const ::rtl::OUString& aDir, bool bSearchSubFolders, css::uno::Sequence< rtl::OUString >& aSearchedFiles) +{ + Reference< XSimpleFileAccess3 > xSFI = getFileAccess(); + Sequence< rtl::OUString > aDirSeq; + try + { + if ( xSFI.is() ) + { + aDirSeq = xSFI->getFolderContents( aDir, bSearchSubFolders ); + } + } + catch( css::uno::Exception& ) + { + } + sal_Int32 nLength = aDirSeq.getLength(); + for ( sal_Int32 i = 0; i < nLength; i++ ) + { + rtl::OUString aURLStr = aDirSeq[i]; + if ( xSFI->isFolder( aURLStr ) ) + { + if ( bSearchSubFolders ) + { + SearchWildCard( wildCard, aURLStr, true, aSearchedFiles ); + } + } + else + { + INetURLObject aFileURL( aURLStr ); + rtl::OUString aFileName = aFileURL.GetLastName( INetURLObject::DECODE_UNAMBIGUOUS ); + if ( wildCard.Matches( aFileName.toAsciiLowerCase() ) ) + { + sal_Int32 nFilesLength = aSearchedFiles.getLength(); + aSearchedFiles.realloc( nFilesLength + 1 ); + rtl::OUString sSystemPath; + ::osl::File::getSystemPathFromFileURL( aURLStr, sSystemPath ); + aSearchedFiles[nFilesLength] = sSystemPath; + } + } + } +} + +sal_Int32 SAL_CALL ScVbaFileSearch::Execute( ) throw (css::uno::RuntimeException) +{ + m_aSearchedFiles.realloc(0); + Reference< XSimpleFileAccess3 > xSFI = getFileAccess(); + if ( !xSFI.is() || !xSFI->isFolder( m_sLookIn ) ) + { + return 0; + } + + if ( m_sFileName == ::rtl::OUString::createFromAscii( "" ) ) + { + return 1; + } + + ::rtl::OUString aTempFileName = m_sFileName.toAsciiLowerCase(); + if ( IsWildCard( aTempFileName ) ) + { + bool bEndWithAsterisk = aTempFileName.endsWithAsciiL("*", 1); + bool bStartWithAsterisk = (aTempFileName.indexOf(::rtl::OUString::createFromAscii("*")) == 0); + if ( !bEndWithAsterisk && !bStartWithAsterisk ) + { + aTempFileName = ::rtl::OUString::createFromAscii("*") + aTempFileName + ::rtl::OUString::createFromAscii("*"); + } + } + else + { + aTempFileName = ::rtl::OUString::createFromAscii("*") + aTempFileName + ::rtl::OUString::createFromAscii("*"); + } + WildCard wildCard( aTempFileName ); + SearchWildCard( wildCard, m_sLookIn, m_bSearchSubFolders, m_aSearchedFiles ); + + return m_aSearchedFiles.getLength(); +} + +//liuchen 2009-11-5 set ScVbaApplication::getDefaultFilePath( ) as the InitPath for FileSearch + ::rtl::OUString ScVbaFileSearch::getInitPath() throw (css::uno::RuntimeException) +{ + String aPath; + + if (m_pApplication != NULL) + { + aPath = m_pApplication->getDefaultFilePath(); + } + + return aPath; +} + +void SAL_CALL ScVbaFileSearch::NewSearch( ) throw (css::uno::RuntimeException) +{ + m_sFileName = ::rtl::OUString::createFromAscii( "" ); + m_sLookIn = getInitPath(); + m_bSearchSubFolders = false; + m_bMatchTextExactly = false; + m_aSearchedFiles.realloc(0); +} + +Reference< XFoundFiles > SAL_CALL ScVbaFileSearch::getFoundFiles() throw (css::uno::RuntimeException) +{ + css::uno::Reference< ov::XFoundFiles > xFoundFiles = new VbaFoundFiles( + mxParent, mxContext, (css::container::XIndexAccess *) new VbaFoundFilesEnum(m_aSearchedFiles) ); + return xFoundFiles; +} + +rtl::OUString& ScVbaFileSearch::getServiceImplName() +{ + static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("VbaFileSearch") ); + return sImplName; +} + +css::uno::Sequence< rtl::OUString > ScVbaFileSearch::getServiceNames() +{ + static css::uno::Sequence< rtl::OUString > aServiceNames; + if ( aServiceNames.getLength() == 0 ) + { + aServiceNames.realloc( 1 ); + aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.FileSearch") ); + } + return aServiceNames; +} diff --git a/sc/source/ui/vba/vbafilesearch.hxx b/sc/source/ui/vba/vbafilesearch.hxx new file mode 100644 index 000000000000..e82f14a94699 --- /dev/null +++ b/sc/source/ui/vba/vbafilesearch.hxx @@ -0,0 +1,77 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright IBM Corporation 2009, 2010. + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_VBA_FILESEARCH_HXX +#define SC_VBA_FILESEARCH_HXX + +#include <ooo/vba/XFileSearch.hpp> +#include <cppuhelper/implbase1.hxx> +#include <vbahelper/vbahelperinterface.hxx> + +namespace css = ::com::sun::star; + +typedef InheritedHelperInterfaceImpl1< ooo::vba::XFileSearch > ScVbaFileSearchImpl_BASE; + +class ScVbaApplication; + +class ScVbaFileSearch : public ScVbaFileSearchImpl_BASE +{ +private: + rtl::OUString m_sFileName; + rtl::OUString m_sLookIn; + sal_Bool m_bSearchSubFolders; + sal_Bool m_bMatchTextExactly; + ScVbaApplication* m_pApplication; + css::uno::Sequence< rtl::OUString > m_aSearchedFiles; + + ::rtl::OUString getInitPath() throw (css::uno::RuntimeException); + +public: + ScVbaFileSearch( ScVbaApplication* pApp, const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext ); + virtual ~ScVbaFileSearch(); + + // Attributes + virtual ::rtl::OUString SAL_CALL getFileName() throw (css::uno::RuntimeException); + virtual void SAL_CALL setFileName(const ::rtl::OUString& _fileName ) throw (css::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getLookIn() throw (css::uno::RuntimeException); + virtual void SAL_CALL setLookIn(const ::rtl::OUString& _lookIn ) throw (css::uno::RuntimeException); + virtual sal_Bool SAL_CALL getSearchSubFolders() throw (css::uno::RuntimeException); + virtual void SAL_CALL setSearchSubFolders( sal_Bool _searchSubFolders ) throw (css::uno::RuntimeException); + virtual sal_Bool SAL_CALL getMatchTextExactly() throw (css::uno::RuntimeException); + virtual void SAL_CALL setMatchTextExactly( sal_Bool _matchTextExactly ) throw (css::uno::RuntimeException); + virtual css::uno::Reference< ::ooo::vba::XFoundFiles > SAL_CALL getFoundFiles() throw (css::uno::RuntimeException); + + virtual sal_Int32 SAL_CALL Execute( ) throw (css::uno::RuntimeException); + virtual void SAL_CALL NewSearch( ) throw (css::uno::RuntimeException); + + // XHelperInterface + virtual rtl::OUString& getServiceImplName(); + virtual css::uno::Sequence< rtl::OUString > getServiceNames(); +}; + +#endif /* SC_VBA_FILESEARCH_HXX */ diff --git a/sc/source/ui/vba/vbafoundfiles.cxx b/sc/source/ui/vba/vbafoundfiles.cxx new file mode 100644 index 000000000000..78e61e8b8601 --- /dev/null +++ b/sc/source/ui/vba/vbafoundfiles.cxx @@ -0,0 +1,143 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright IBM Corporation 2009, 2010. + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "vbafoundfiles.hxx" + +////////////////////////////////VbaFoundFilesEnum////////////////////////////////////////// +VbaFoundFilesEnum::VbaFoundFilesEnum() : m_nIndex(0) +{ + +} + +VbaFoundFilesEnum::VbaFoundFilesEnum( css::uno::Sequence<rtl::OUString>& sFileList ) : m_nIndex(0), m_sFileList(sFileList) +{ + +} + +VbaFoundFilesEnum::~VbaFoundFilesEnum() +{ + +} + +void VbaFoundFilesEnum::SetFileList( css::uno::Sequence<rtl::OUString>& sFileList ) +{ + m_nIndex = 0; + m_sFileList = sFileList; +} + +sal_Int32 SAL_CALL VbaFoundFilesEnum::getCount() throw (css::uno::RuntimeException) +{ + return m_sFileList.getLength(); +} + +css::uno::Any SAL_CALL VbaFoundFilesEnum::getByIndex( sal_Int32 nIndex ) + throw (css::lang::IndexOutOfBoundsException, css::lang::WrappedTargetException, css::uno::RuntimeException) +{ + if ( nIndex >= getCount() ) + { + throw css::lang::IndexOutOfBoundsException(); + } + + return css::uno::makeAny( m_sFileList[nIndex] ); +} + +css::uno::Type SAL_CALL VbaFoundFilesEnum::getElementType() throw (css::uno::RuntimeException) +{ + return getCppuType((css::uno::Reference< css::container::XIndexAccess >*)0); +} + +sal_Bool SAL_CALL VbaFoundFilesEnum::hasElements() throw (css::uno::RuntimeException) +{ + return ( getCount() != 0 ); +} + +sal_Bool SAL_CALL VbaFoundFilesEnum::hasMoreElements() throw (css::uno::RuntimeException) +{ + if ( getCount() > m_nIndex ) + { + return sal_True; + } + return sal_False; +} + +css::uno::Any SAL_CALL VbaFoundFilesEnum::nextElement() throw (css::container::NoSuchElementException, css::lang::WrappedTargetException, css::uno::RuntimeException) +{ + if ( !hasMoreElements() ) + { + throw css::container::NoSuchElementException(); + } + + return css::uno::makeAny( m_sFileList[m_nIndex++] ); +} + +////////////////////////////////VbaFoundFiles////////////////////////////////////////// +VbaFoundFiles::VbaFoundFiles( const css::uno::Reference< ov::XHelperInterface >& xParent, + const css::uno::Reference< css::uno::XComponentContext >& xContext, + const css::uno::Reference< css::container::XIndexAccess >& xIndexAccess + ) : VbaFoundFilesImpl_BASE( xParent, xContext, xIndexAccess ) +{ + +} + +VbaFoundFiles::~VbaFoundFiles() +{ + +} + +css::uno::Reference< css::container::XEnumeration > VbaFoundFiles::createEnumeration() throw (css::uno::RuntimeException) +{ + css::uno::Reference< css::container::XEnumeration > xEnumRet( m_xIndexAccess, css::uno::UNO_QUERY ); + return xEnumRet; +} + +css::uno::Any VbaFoundFiles::createCollectionObject( const css::uno::Any& aSource ) +{ + return aSource; +} + +css::uno::Type VbaFoundFiles::getElementType() throw (css::uno::RuntimeException) +{ + return ov::XFoundFiles::static_type(0); +} + +rtl::OUString& VbaFoundFiles::getServiceImplName() +{ + static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("VbaFoundFiles") ); + return sImplName; +} + +css::uno::Sequence< rtl::OUString > VbaFoundFiles::getServiceNames() +{ + static css::uno::Sequence< rtl::OUString > aServiceNames; + if ( aServiceNames.getLength() == 0 ) + { + aServiceNames.realloc( 1 ); + aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.FoundFiles") ); + } + return aServiceNames; +} diff --git a/sc/source/ui/vba/vbafoundfiles.hxx b/sc/source/ui/vba/vbafoundfiles.hxx new file mode 100644 index 000000000000..b02d3bb91526 --- /dev/null +++ b/sc/source/ui/vba/vbafoundfiles.hxx @@ -0,0 +1,88 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright IBM Corporation 2009, 2010. + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_VBA_FOUNDFILES_HXX +#define SC_VBA_FOUNDFILES_HXX + +#include <cppuhelper/implbase2.hxx> +#include <com/sun/star/container/XIndexAccess.hpp> +#include <ooo/vba/XFoundFiles.hpp> +#include <vbahelper/vbacollectionimpl.hxx> + +namespace css = ::com::sun::star; + +typedef CollTestImplHelper< ooo::vba::XFoundFiles > VbaFoundFilesImpl_BASE; + +class VbaFoundFilesEnum : public cppu::WeakImplHelper2< css::container::XIndexAccess, css::container::XEnumeration > +{ +private: + sal_Int32 m_nIndex; + css::uno::Sequence< rtl::OUString > m_sFileList; + +public: + VbaFoundFilesEnum(); + VbaFoundFilesEnum( css::uno::Sequence< rtl::OUString >& sFileList ); + ~VbaFoundFilesEnum(); + + void SetFileList( css::uno::Sequence< rtl::OUString >& sFileList ); + + // XIndexAccess + virtual sal_Int32 SAL_CALL getCount() throw (css::uno::RuntimeException); + virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 nIndex ) throw (css::lang::IndexOutOfBoundsException, css::lang::WrappedTargetException, css::uno::RuntimeException); + + // XElementAccess + virtual css::uno::Type SAL_CALL getElementType() throw (css::uno::RuntimeException); + virtual sal_Bool SAL_CALL hasElements() throw (css::uno::RuntimeException); + + // XEnumeration + virtual sal_Bool SAL_CALL hasMoreElements() throw (css::uno::RuntimeException); + virtual css::uno::Any SAL_CALL nextElement() throw (css::container::NoSuchElementException, css::lang::WrappedTargetException, css::uno::RuntimeException); +}; + +class VbaFoundFiles : public VbaFoundFilesImpl_BASE +{ +private: + +public: + VbaFoundFiles( const css::uno::Reference< ov::XHelperInterface >& xParent, + const css::uno::Reference< css::uno::XComponentContext >& xContext, + const css::uno::Reference< css::container::XIndexAccess >& xIndexAccess ); + virtual ~VbaFoundFiles(); + + virtual css::uno::Any createCollectionObject( const css::uno::Any& aSource ); + + // XEnumerationAccess + virtual css::uno::Type SAL_CALL getElementType() throw (css::uno::RuntimeException); + virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() throw (css::uno::RuntimeException); + + // XHelperInterface + virtual rtl::OUString& getServiceImplName(); + virtual css::uno::Sequence< rtl::OUString > getServiceNames(); +}; + +#endif /* SC_VBA_FOUNDFILES_HXX */ diff --git a/sc/source/ui/vba/vbamenu.cxx b/sc/source/ui/vba/vbamenu.cxx new file mode 100644 index 000000000000..b5eac3e87d2f --- /dev/null +++ b/sc/source/ui/vba/vbamenu.cxx @@ -0,0 +1,91 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#include "vbamenu.hxx" +#include "vbamenuitems.hxx" + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaMenu::ScVbaMenu( const uno::Reference< ov::XHelperInterface > xParent, const uno::Reference< uno::XComponentContext > xContext, const uno::Reference< XCommandBarControl >& xCommandBarControl ) throw( uno::RuntimeException ) : Menu_BASE( xParent, xContext ), m_xCommandBarControl( xCommandBarControl ) +{ +} + +::rtl::OUString SAL_CALL +ScVbaMenu::getCaption() throw ( uno::RuntimeException ) +{ + return m_xCommandBarControl->getCaption(); +} + +void SAL_CALL +ScVbaMenu::setCaption( const ::rtl::OUString& _caption ) throw (uno::RuntimeException) +{ + m_xCommandBarControl->setCaption( _caption ); +} + +void SAL_CALL +ScVbaMenu::Delete( ) throw (script::BasicErrorException, uno::RuntimeException) +{ + m_xCommandBarControl->Delete(); +} + +uno::Any SAL_CALL +ScVbaMenu::MenuItems( const uno::Any& aIndex ) throw (script::BasicErrorException, uno::RuntimeException) +{ + uno::Reference< XCommandBarControls > xCommandBarControls( m_xCommandBarControl->Controls( uno::Any() ), uno::UNO_QUERY_THROW ); + uno::Reference< excel::XMenuItems > xMenuItems( new ScVbaMenuItems( this, mxContext, xCommandBarControls ) ); + if( aIndex.hasValue() ) + { + return xMenuItems->Item( aIndex, uno::Any() ); + } + return uno::makeAny( xMenuItems ); +} + +rtl::OUString& +ScVbaMenu::getServiceImplName() +{ + static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaMenu") ); + return sImplName; +} +uno::Sequence<rtl::OUString> +ScVbaMenu::getServiceNames() +{ + static uno::Sequence< rtl::OUString > aServiceNames; + if ( aServiceNames.getLength() == 0 ) + { + aServiceNames.realloc( 1 ); + aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.Menu" ) ); + } + return aServiceNames; +} diff --git a/sc/source/ui/vba/vbamenu.hxx b/sc/source/ui/vba/vbamenu.hxx new file mode 100644 index 000000000000..3133f482bc22 --- /dev/null +++ b/sc/source/ui/vba/vbamenu.hxx @@ -0,0 +1,62 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#ifndef SC_VBA_MENU_HXX +#define SC_VBA_MENU_HXX + +#include <ooo/vba/excel/XMenu.hpp> +#include <ooo/vba/XCommandBarControl.hpp> +#include <vbahelper/vbahelperinterface.hxx> + +typedef InheritedHelperInterfaceImpl1< ov::excel::XMenu > Menu_BASE; + +class ScVbaMenu : public Menu_BASE +{ +private: + css::uno::Reference< ov::XCommandBarControl > m_xCommandBarControl; + +public: + ScVbaMenu( const css::uno::Reference< ov::XHelperInterface > xParent, const css::uno::Reference< css::uno::XComponentContext > xContext, const css::uno::Reference< ov::XCommandBarControl >& xCommandBarControl ) throw( css::uno::RuntimeException ); + + virtual ::rtl::OUString SAL_CALL getCaption() throw (css::uno::RuntimeException); + virtual void SAL_CALL setCaption( const ::rtl::OUString& _caption ) throw (css::uno::RuntimeException); + + virtual void SAL_CALL Delete( ) throw (css::script::BasicErrorException, css::uno::RuntimeException); + virtual css::uno::Any SAL_CALL MenuItems( const css::uno::Any& aIndex ) throw (css::script::BasicErrorException, css::uno::RuntimeException); + + // XHelperInterface + virtual rtl::OUString& getServiceImplName(); + virtual css::uno::Sequence<rtl::OUString> getServiceNames(); +}; +#endif//SC_VBA_MENU_HXX diff --git a/sc/source/ui/vba/vbamenubar.cxx b/sc/source/ui/vba/vbamenubar.cxx new file mode 100644 index 000000000000..263b99e4f8bd --- /dev/null +++ b/sc/source/ui/vba/vbamenubar.cxx @@ -0,0 +1,74 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#include "vbamenubar.hxx" +#include "vbamenus.hxx" +#include <ooo/vba/XCommandBarControls.hpp> + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaMenuBar::ScVbaMenuBar( const uno::Reference< ov::XHelperInterface > xParent, const uno::Reference< uno::XComponentContext > xContext, const uno::Reference< XCommandBar >& xCommandBar ) throw( uno::RuntimeException ) : MenuBar_BASE( xParent, xContext ), m_xCommandBar( xCommandBar ) +{ +} + +uno::Any SAL_CALL +ScVbaMenuBar::Menus( const uno::Any& aIndex ) throw (script::BasicErrorException, uno::RuntimeException) +{ + uno::Reference< XCommandBarControls > xCommandBarControls( m_xCommandBar->Controls( uno::Any() ), uno::UNO_QUERY_THROW ); + uno::Reference< excel::XMenus > xMenus( new ScVbaMenus( this, mxContext, xCommandBarControls ) ); + if( aIndex.hasValue() ) + { + return xMenus->Item( aIndex, uno::Any() ); + } + return uno::makeAny( xMenus ); +} + +rtl::OUString& +ScVbaMenuBar::getServiceImplName() +{ + static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaMenuBar") ); + return sImplName; +} +uno::Sequence<rtl::OUString> +ScVbaMenuBar::getServiceNames() +{ + static uno::Sequence< rtl::OUString > aServiceNames; + if ( aServiceNames.getLength() == 0 ) + { + aServiceNames.realloc( 1 ); + aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.MenuBar" ) ); + } + return aServiceNames; +} diff --git a/sc/source/ui/vba/vbamenubar.hxx b/sc/source/ui/vba/vbamenubar.hxx new file mode 100644 index 000000000000..732cec86365c --- /dev/null +++ b/sc/source/ui/vba/vbamenubar.hxx @@ -0,0 +1,58 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#ifndef SC_VBA_MENUBAR_HXX +#define SC_VBA_MENUBAR_HXX + +#include <ooo/vba/excel/XMenuBar.hpp> +#include <ooo/vba/XCommandBar.hpp> +#include <vbahelper/vbahelperinterface.hxx> + +typedef InheritedHelperInterfaceImpl1< ov::excel::XMenuBar > MenuBar_BASE; + +class ScVbaMenuBar : public MenuBar_BASE +{ +private: + css::uno::Reference< ov::XCommandBar > m_xCommandBar; + +public: + ScVbaMenuBar( const css::uno::Reference< ov::XHelperInterface > xParent, const css::uno::Reference< css::uno::XComponentContext > xContext, const css::uno::Reference< ov::XCommandBar >& xCommandBar ) throw( css::uno::RuntimeException ); + + virtual css::uno::Any SAL_CALL Menus( const css::uno::Any& aIndex ) throw (css::script::BasicErrorException, css::uno::RuntimeException); + + // XHelperInterface + virtual rtl::OUString& getServiceImplName(); + virtual css::uno::Sequence<rtl::OUString> getServiceNames(); +}; +#endif//SC_VBA_MENUBAR_HXX diff --git a/sc/source/ui/vba/vbamenubars.cxx b/sc/source/ui/vba/vbamenubars.cxx new file mode 100644 index 000000000000..1894e225f3f9 --- /dev/null +++ b/sc/source/ui/vba/vbamenubars.cxx @@ -0,0 +1,146 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#include "vbamenubars.hxx" +#include "vbamenubar.hxx" +#include <ooo/vba/excel/XlSheetType.hpp> + +using namespace com::sun::star; +using namespace ooo::vba; + + +typedef ::cppu::WeakImplHelper1< container::XEnumeration > MenuBarEnumeration_BASE; + +class MenuBarEnumeration : public MenuBarEnumeration_BASE +{ + uno::Reference< XHelperInterface > m_xParent; + uno::Reference< uno::XComponentContext > m_xContext; + uno::Reference< container::XEnumeration > m_xEnumeration; +public: + MenuBarEnumeration( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< container::XEnumeration >& xEnumeration) throw ( uno::RuntimeException ) : m_xParent( xParent ), m_xContext( xContext ), m_xEnumeration( xEnumeration ) + { + } + virtual sal_Bool SAL_CALL hasMoreElements() throw ( uno::RuntimeException ) + { + return m_xEnumeration->hasMoreElements(); + } + virtual uno::Any SAL_CALL nextElement() throw ( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException ) + { + // FIXME: should be add menubar + if( hasMoreElements() ) + { + uno::Reference< XCommandBar > xCommandBar( m_xEnumeration->nextElement(), uno::UNO_QUERY_THROW ); + uno::Reference< excel::XMenuBar > xMenuBar( new ScVbaMenuBar( m_xParent, m_xContext, xCommandBar ) ); + return uno::makeAny( xMenuBar ); + } + else + throw container::NoSuchElementException(); + return uno::Any(); + } +}; + +ScVbaMenuBars::ScVbaMenuBars( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< XCommandBars >& xCommandBars ) throw ( uno::RuntimeException ) : MenuBars_BASE( xParent, xContext, uno::Reference< container::XIndexAccess>() ), m_xCommandBars( xCommandBars ) +{ +} + +ScVbaMenuBars::~ScVbaMenuBars() +{ +} + +// XEnumerationAccess +uno::Type SAL_CALL +ScVbaMenuBars::getElementType() throw ( uno::RuntimeException ) +{ + return excel::XMenuBar::static_type( 0 ); +} + +uno::Reference< container::XEnumeration > +ScVbaMenuBars::createEnumeration() throw ( uno::RuntimeException ) +{ + uno::Reference< container::XEnumerationAccess > xEnumAccess( m_xCommandBars, uno::UNO_QUERY_THROW ); + return uno::Reference< container::XEnumeration >( new MenuBarEnumeration( this, mxContext, xEnumAccess->createEnumeration() ) ); +} + +uno::Any +ScVbaMenuBars::createCollectionObject( const uno::Any& aSource ) +{ + // make no sense + return aSource; +} + +sal_Int32 SAL_CALL +ScVbaMenuBars::getCount() throw(css::uno::RuntimeException) +{ + return m_xCommandBars->getCount(); +} + +// ScVbaCollectionBaseImpl +uno::Any SAL_CALL +ScVbaMenuBars::Item( const uno::Any& aIndex, const uno::Any& /*aIndex2*/ ) throw( uno::RuntimeException ) +{ + sal_Int16 nIndex = 0; + aIndex >>= nIndex; + if( nIndex == excel::XlSheetType::xlWorksheet ) + { + uno::Any aSource; + aSource <<= rtl::OUString::createFromAscii( "Worksheet Menu Bar" ); + uno::Reference< XCommandBar > xCommandBar( m_xCommandBars->Item( aSource, uno::Any() ), uno::UNO_QUERY_THROW ); + uno::Reference< excel::XMenuBar > xMenuBar( new ScVbaMenuBar( this, mxContext, xCommandBar ) ); + return uno::makeAny( xMenuBar ); + } + + throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Not implemented") ), uno::Reference< uno::XInterface >() ); + + return uno::Any(); +} + +// XHelperInterface +rtl::OUString& +ScVbaMenuBars::getServiceImplName() +{ + static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaMenuBars") ); + return sImplName; +} +uno::Sequence<rtl::OUString> +ScVbaMenuBars::getServiceNames() +{ + static uno::Sequence< rtl::OUString > aServiceNames; + if ( aServiceNames.getLength() == 0 ) + { + aServiceNames.realloc( 1 ); + aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.MenuBars" ) ); + } + return aServiceNames; +} + diff --git a/sc/source/ui/vba/vbamenubars.hxx b/sc/source/ui/vba/vbamenubars.hxx new file mode 100644 index 000000000000..0d8ea58fd012 --- /dev/null +++ b/sc/source/ui/vba/vbamenubars.hxx @@ -0,0 +1,69 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#ifndef SC_VBA_MENUBARS_HXX +#define SC_VBA_MENUBARS_HXX + +#include <ooo/vba/excel/XMenuBars.hpp> +#include <ooo/vba/excel/XMenuBar.hpp> +#include <ooo/vba/XCommandBars.hpp> +#include <com/sun/star/container/XNameAccess.hpp> +#include <cppuhelper/implbase1.hxx> +#include <vbahelper/vbahelperinterface.hxx> +#include <vbahelper/vbacollectionimpl.hxx> + +typedef CollTestImplHelper< ov::excel::XMenuBars > MenuBars_BASE; + +class ScVbaMenuBars : public MenuBars_BASE +{ +private: + css::uno::Reference< ov::XCommandBars > m_xCommandBars; + +public: + ScVbaMenuBars( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< ov::XCommandBars >& xCommandBars ) throw (css::uno::RuntimeException); + virtual ~ScVbaMenuBars(); + + // XEnumerationAccess + virtual css::uno::Type SAL_CALL getElementType() throw (css::uno::RuntimeException); + virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() throw (css::uno::RuntimeException); + virtual css::uno::Any createCollectionObject( const css::uno::Any& aSource ); + + virtual sal_Int32 SAL_CALL getCount() throw(css::uno::RuntimeException); + virtual css::uno::Any SAL_CALL Item( const css::uno::Any& aIndex, const css::uno::Any& /*aIndex2*/ ) throw( css::uno::RuntimeException); + // XHelperInterface + virtual rtl::OUString& getServiceImplName(); + virtual css::uno::Sequence<rtl::OUString> getServiceNames(); +}; + +#endif//SC_VBA_MENUBARS_HXX diff --git a/sc/source/ui/vba/vbamenuitem.cxx b/sc/source/ui/vba/vbamenuitem.cxx new file mode 100644 index 000000000000..c7d4a609c45b --- /dev/null +++ b/sc/source/ui/vba/vbamenuitem.cxx @@ -0,0 +1,90 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#include "vbamenuitem.hxx" + +using namespace com::sun::star; +using namespace ooo::vba; + +ScVbaMenuItem::ScVbaMenuItem( const uno::Reference< ov::XHelperInterface > xParent, const uno::Reference< uno::XComponentContext > xContext, const uno::Reference< XCommandBarControl >& xCommandBarControl ) throw( uno::RuntimeException ) : MenuItem_BASE( xParent, xContext ), m_xCommandBarControl( xCommandBarControl ) +{ +} + +::rtl::OUString SAL_CALL +ScVbaMenuItem::getCaption() throw ( uno::RuntimeException ) +{ + return m_xCommandBarControl->getCaption(); +} + +void SAL_CALL +ScVbaMenuItem::setCaption( const ::rtl::OUString& _caption ) throw (uno::RuntimeException) +{ + m_xCommandBarControl->setCaption( _caption ); +} + +::rtl::OUString SAL_CALL +ScVbaMenuItem::getOnAction() throw ( uno::RuntimeException ) +{ + return m_xCommandBarControl->getOnAction(); +} + +void SAL_CALL +ScVbaMenuItem::setOnAction( const ::rtl::OUString& _onaction ) throw (uno::RuntimeException) +{ + m_xCommandBarControl->setOnAction( _onaction ); +} + +void SAL_CALL +ScVbaMenuItem::Delete( ) throw (script::BasicErrorException, uno::RuntimeException) +{ + m_xCommandBarControl->Delete(); +} + +rtl::OUString& +ScVbaMenuItem::getServiceImplName() +{ + static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaMenuItem") ); + return sImplName; +} +uno::Sequence<rtl::OUString> +ScVbaMenuItem::getServiceNames() +{ + static uno::Sequence< rtl::OUString > aServiceNames; + if ( aServiceNames.getLength() == 0 ) + { + aServiceNames.realloc( 1 ); + aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.MenuItem" ) ); + } + return aServiceNames; +} diff --git a/sc/source/ui/vba/vbamenuitem.hxx b/sc/source/ui/vba/vbamenuitem.hxx new file mode 100644 index 000000000000..5409a90b3e18 --- /dev/null +++ b/sc/source/ui/vba/vbamenuitem.hxx @@ -0,0 +1,63 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#ifndef SC_VBA_MENUITEM_HXX +#define SC_VBA_MENUITEM_HXX + +#include <ooo/vba/excel/XMenuItem.hpp> +#include <ooo/vba/XCommandBarControl.hpp> +#include <vbahelper/vbahelperinterface.hxx> + +typedef InheritedHelperInterfaceImpl1< ov::excel::XMenuItem > MenuItem_BASE; + +class ScVbaMenuItem : public MenuItem_BASE +{ +private: + css::uno::Reference< ov::XCommandBarControl > m_xCommandBarControl; + +public: + ScVbaMenuItem( const css::uno::Reference< ov::XHelperInterface > xParent, const css::uno::Reference< css::uno::XComponentContext > xContext, const css::uno::Reference< ov::XCommandBarControl >& xCommandBarControl ) throw( css::uno::RuntimeException ); + + virtual ::rtl::OUString SAL_CALL getCaption() throw (css::uno::RuntimeException); + virtual void SAL_CALL setCaption( const ::rtl::OUString& _caption ) throw (css::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getOnAction() throw (css::uno::RuntimeException); + virtual void SAL_CALL setOnAction( const ::rtl::OUString& _onaction ) throw (css::uno::RuntimeException); + + virtual void SAL_CALL Delete( ) throw (css::script::BasicErrorException, css::uno::RuntimeException); + + // XHelperInterface + virtual rtl::OUString& getServiceImplName(); + virtual css::uno::Sequence<rtl::OUString> getServiceNames(); +}; +#endif//SC_VBA_MENUITEM_HXX diff --git a/sc/source/ui/vba/vbamenuitems.cxx b/sc/source/ui/vba/vbamenuitems.cxx new file mode 100644 index 000000000000..f991286d4985 --- /dev/null +++ b/sc/source/ui/vba/vbamenuitems.cxx @@ -0,0 +1,159 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#include "vbamenuitems.hxx" +#include "vbamenuitem.hxx" +#include "vbamenu.hxx" +#include <ooo/vba/office/MsoControlType.hpp> + +using namespace com::sun::star; +using namespace ooo::vba; + + +typedef ::cppu::WeakImplHelper1< container::XEnumeration > MenuEnumeration_BASE; + +class MenuEnumeration : public MenuEnumeration_BASE +{ + uno::Reference< XHelperInterface > m_xParent; + uno::Reference< uno::XComponentContext > m_xContext; + uno::Reference< container::XEnumeration > m_xEnumeration; +public: + MenuEnumeration( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< container::XEnumeration >& xEnumeration) throw ( uno::RuntimeException ) : m_xParent( xParent ), m_xContext( xContext ), m_xEnumeration( xEnumeration ) + { + } + virtual sal_Bool SAL_CALL hasMoreElements() throw ( uno::RuntimeException ) + { + return m_xEnumeration->hasMoreElements(); + } + virtual uno::Any SAL_CALL nextElement() throw ( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException ) + { + // FIXME: should be add menu + if( hasMoreElements() ) + { + uno::Reference< XCommandBarControl > xCommandBarControl( m_xEnumeration->nextElement(), uno::UNO_QUERY_THROW ); + if( xCommandBarControl->getType() == office::MsoControlType::msoControlPopup ) + { + uno::Reference< excel::XMenu > xMenu( new ScVbaMenu( m_xParent, m_xContext, xCommandBarControl ) ); + return uno::makeAny( xMenu ); + } + else if( xCommandBarControl->getType() == office::MsoControlType::msoControlButton ) + { + uno::Reference< excel::XMenuItem > xMenuItem( new ScVbaMenuItem( m_xParent, m_xContext, xCommandBarControl ) ); + return uno::makeAny( xMenuItem ); + } + nextElement(); + } + else + throw container::NoSuchElementException(); + return uno::Any(); + } +}; + +ScVbaMenuItems::ScVbaMenuItems( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< XCommandBarControls >& xCommandBarControls ) throw ( uno::RuntimeException ) : MenuItems_BASE( xParent, xContext, uno::Reference< container::XIndexAccess>() ), m_xCommandBarControls( xCommandBarControls ) +{ +} + +// XEnumerationAccess +uno::Type SAL_CALL +ScVbaMenuItems::getElementType() throw ( uno::RuntimeException ) +{ + return excel::XMenuItem::static_type( 0 ); +} + +uno::Reference< container::XEnumeration > +ScVbaMenuItems::createEnumeration() throw ( uno::RuntimeException ) +{ + uno::Reference< container::XEnumerationAccess > xEnumAccess( m_xCommandBarControls, uno::UNO_QUERY_THROW ); + return uno::Reference< container::XEnumeration >( new MenuEnumeration( this, mxContext, xEnumAccess->createEnumeration() ) ); +} + +uno::Any +ScVbaMenuItems::createCollectionObject( const uno::Any& aSource ) +{ + // make no sense + return aSource; +} + +sal_Int32 SAL_CALL +ScVbaMenuItems::getCount() throw(css::uno::RuntimeException) +{ + // FIXME: should check if it is a popup menu + return m_xCommandBarControls->getCount(); +} + +// ScVbaCollectionBaseImpl +uno::Any SAL_CALL +ScVbaMenuItems::Item( const uno::Any& aIndex, const uno::Any& /*aIndex2*/ ) throw( uno::RuntimeException ) +{ + uno::Reference< XCommandBarControl > xCommandBarControl( m_xCommandBarControls->Item( aIndex, uno::Any() ), uno::UNO_QUERY_THROW ); + if( xCommandBarControl->getType() == office::MsoControlType::msoControlPopup ) + return uno::makeAny( uno::Reference< excel::XMenu > ( new ScVbaMenu( this, mxContext, xCommandBarControl ) ) ); + else if( xCommandBarControl->getType() == office::MsoControlType::msoControlButton ) + return uno::makeAny( uno::Reference< excel::XMenuItem > ( new ScVbaMenuItem( this, mxContext, xCommandBarControl ) ) ); + throw uno::RuntimeException(); +} + +uno::Reference< excel::XMenuItem > SAL_CALL ScVbaMenuItems::Add( const rtl::OUString& Caption, const css::uno::Any& OnAction, const css::uno::Any& /*ShortcutKey*/, const css::uno::Any& Before, const css::uno::Any& Restore, const css::uno::Any& /*StatusBar*/, const css::uno::Any& /*HelpFile*/, const css::uno::Any& /*HelpContextID*/ ) throw (css::script::BasicErrorException, css::uno::RuntimeException) +{ + sal_Int32 nType = office::MsoControlType::msoControlButton; + uno::Reference< XCommandBarControl > xCommandBarControl = m_xCommandBarControls->Add( uno::makeAny( nType ), uno::Any(), uno::Any(), Before, Restore ); + xCommandBarControl->setCaption( Caption ); + if( OnAction.hasValue() ) + { + rtl::OUString sAction; + OnAction >>= sAction; + xCommandBarControl->setOnAction( sAction ); + } + return uno::Reference< excel::XMenuItem >( new ScVbaMenuItem( this, mxContext, xCommandBarControl ) ); +} + +// XHelperInterface +rtl::OUString& +ScVbaMenuItems::getServiceImplName() +{ + static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaMenuItems") ); + return sImplName; +} +uno::Sequence<rtl::OUString> +ScVbaMenuItems::getServiceNames() +{ + static uno::Sequence< rtl::OUString > aServiceNames; + if ( aServiceNames.getLength() == 0 ) + { + aServiceNames.realloc( 1 ); + aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.MenuItems" ) ); + } + return aServiceNames; +} + diff --git a/sc/source/ui/vba/vbamenuitems.hxx b/sc/source/ui/vba/vbamenuitems.hxx new file mode 100644 index 000000000000..ef58812b44a1 --- /dev/null +++ b/sc/source/ui/vba/vbamenuitems.hxx @@ -0,0 +1,68 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#ifndef SC_VBA_MENUITEMS_HXX +#define SC_VBA_MENUITEMS_HXX + +#include <ooo/vba/excel/XMenuItems.hpp> +#include <ooo/vba/excel/XMenuItem.hpp> +#include <ooo/vba/XCommandBarControls.hpp> +#include <vbahelper/vbahelperinterface.hxx> +#include <vbahelper/vbacollectionimpl.hxx> + +typedef CollTestImplHelper< ov::excel::XMenuItems > MenuItems_BASE; + +class ScVbaMenuItems : public MenuItems_BASE +{ +private: + css::uno::Reference< ov::XCommandBarControls > m_xCommandBarControls; + +public: + ScVbaMenuItems( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< ov::XCommandBarControls >& xCommandBarControls ) throw( css::uno::RuntimeException ); + + // XEnumerationAccess + virtual css::uno::Type SAL_CALL getElementType() throw (css::uno::RuntimeException); + virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() throw (css::uno::RuntimeException); + virtual css::uno::Any createCollectionObject( const css::uno::Any& aSource ); + + // Methods + virtual sal_Int32 SAL_CALL getCount() throw(css::uno::RuntimeException); + virtual css::uno::Any SAL_CALL Item( const css::uno::Any& Index, const css::uno::Any& /*Index2*/ ) throw (css::uno::RuntimeException); + virtual css::uno::Reference< ov::excel::XMenuItem > SAL_CALL Add( const rtl::OUString& Caption, const css::uno::Any& OnAction, const css::uno::Any& ShortcutKey, const css::uno::Any& Before, const css::uno::Any& Restore, const css::uno::Any& StatusBar, const css::uno::Any& HelpFile, const css::uno::Any& HelpContextID ) throw (css::script::BasicErrorException, css::uno::RuntimeException); + // XHelperInterface + virtual rtl::OUString& getServiceImplName(); + virtual css::uno::Sequence<rtl::OUString> getServiceNames(); +}; + +#endif//SC_VBA_MENUITEMS_HXX diff --git a/sc/source/ui/vba/vbamenus.cxx b/sc/source/ui/vba/vbamenus.cxx new file mode 100644 index 000000000000..db4893dfac3e --- /dev/null +++ b/sc/source/ui/vba/vbamenus.cxx @@ -0,0 +1,145 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#include "vbamenus.hxx" +#include "vbamenu.hxx" +#include <ooo/vba/office/MsoControlType.hpp> + +using namespace com::sun::star; +using namespace ooo::vba; + + +typedef ::cppu::WeakImplHelper1< container::XEnumeration > MenuEnumeration_BASE; + +class MenuEnumeration : public MenuEnumeration_BASE +{ + uno::Reference< XHelperInterface > m_xParent; + uno::Reference< uno::XComponentContext > m_xContext; + uno::Reference< container::XEnumeration > m_xEnumeration; +public: + MenuEnumeration( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< container::XEnumeration >& xEnumeration) throw ( uno::RuntimeException ) : m_xParent( xParent ), m_xContext( xContext ), m_xEnumeration( xEnumeration ) + { + } + virtual sal_Bool SAL_CALL hasMoreElements() throw ( uno::RuntimeException ) + { + return m_xEnumeration->hasMoreElements(); + } + virtual uno::Any SAL_CALL nextElement() throw ( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException ) + { + // FIXME: should be add menu + if( hasMoreElements() ) + { + uno::Reference< XCommandBarControl > xCommandBarControl( m_xEnumeration->nextElement(), uno::UNO_QUERY_THROW ); + if( xCommandBarControl->getType() == office::MsoControlType::msoControlPopup ) + { + uno::Reference< excel::XMenu > xMenu( new ScVbaMenu( m_xParent, m_xContext, xCommandBarControl ) ); + return uno::makeAny( xMenu ); + } + nextElement(); + } + else + throw container::NoSuchElementException(); + return uno::Any(); + } +}; + +ScVbaMenus::ScVbaMenus( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< XCommandBarControls >& xCommandBarControls ) throw ( uno::RuntimeException ) : Menus_BASE( xParent, xContext, uno::Reference< container::XIndexAccess>() ), m_xCommandBarControls( xCommandBarControls ) +{ +} + +// XEnumerationAccess +uno::Type SAL_CALL +ScVbaMenus::getElementType() throw ( uno::RuntimeException ) +{ + return excel::XMenu::static_type( 0 ); +} + +uno::Reference< container::XEnumeration > +ScVbaMenus::createEnumeration() throw ( uno::RuntimeException ) +{ + uno::Reference< container::XEnumerationAccess > xEnumAccess( m_xCommandBarControls, uno::UNO_QUERY_THROW ); + return uno::Reference< container::XEnumeration >( new MenuEnumeration( this, mxContext, xEnumAccess->createEnumeration() ) ); +} + +uno::Any +ScVbaMenus::createCollectionObject( const uno::Any& aSource ) +{ + // make no sense + return aSource; +} + +sal_Int32 SAL_CALL +ScVbaMenus::getCount() throw(css::uno::RuntimeException) +{ + // FIXME: should check if it is a popup menu + return m_xCommandBarControls->getCount(); +} + +// ScVbaCollectionBaseImpl +uno::Any SAL_CALL +ScVbaMenus::Item( const uno::Any& aIndex, const uno::Any& /*aIndex2*/ ) throw( uno::RuntimeException ) +{ + uno::Reference< XCommandBarControl > xCommandBarControl( m_xCommandBarControls->Item( aIndex, uno::Any() ), uno::UNO_QUERY_THROW ); + if( xCommandBarControl->getType() != office::MsoControlType::msoControlPopup ) + throw uno::RuntimeException(); + return uno::makeAny( uno::Reference< excel::XMenu > ( new ScVbaMenu( this, mxContext, xCommandBarControl ) ) ); +} + +uno::Reference< excel::XMenu > SAL_CALL ScVbaMenus::Add( const rtl::OUString& Caption, const css::uno::Any& Before, const css::uno::Any& Restore ) throw (css::script::BasicErrorException, css::uno::RuntimeException) +{ + sal_Int32 nType = office::MsoControlType::msoControlPopup; + uno::Reference< XCommandBarControl > xCommandBarControl = m_xCommandBarControls->Add( uno::makeAny( nType ), uno::Any(), uno::Any(), Before, Restore ); + xCommandBarControl->setCaption( Caption ); + return uno::Reference< excel::XMenu >( new ScVbaMenu( this, mxContext, xCommandBarControl ) ); +} + +// XHelperInterface +rtl::OUString& +ScVbaMenus::getServiceImplName() +{ + static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaMenus") ); + return sImplName; +} +uno::Sequence<rtl::OUString> +ScVbaMenus::getServiceNames() +{ + static uno::Sequence< rtl::OUString > aServiceNames; + if ( aServiceNames.getLength() == 0 ) + { + aServiceNames.realloc( 1 ); + aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.Menus" ) ); + } + return aServiceNames; +} + diff --git a/sc/source/ui/vba/vbamenus.hxx b/sc/source/ui/vba/vbamenus.hxx new file mode 100644 index 000000000000..94bbf92b78ec --- /dev/null +++ b/sc/source/ui/vba/vbamenus.hxx @@ -0,0 +1,68 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ +#ifndef SC_VBA_MENUS_HXX +#define SC_VBA_MENUS_HXX + +#include <ooo/vba/excel/XMenus.hpp> +#include <ooo/vba/excel/XMenu.hpp> +#include <ooo/vba/XCommandBarControls.hpp> +#include <vbahelper/vbahelperinterface.hxx> +#include <vbahelper/vbacollectionimpl.hxx> + +typedef CollTestImplHelper< ov::excel::XMenus > Menus_BASE; + +class ScVbaMenus : public Menus_BASE +{ +private: + css::uno::Reference< ov::XCommandBarControls > m_xCommandBarControls; + +public: + ScVbaMenus( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< ov::XCommandBarControls >& xCommandBarControls ) throw( css::uno::RuntimeException ); + + // XEnumerationAccess + virtual css::uno::Type SAL_CALL getElementType() throw (css::uno::RuntimeException); + virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() throw (css::uno::RuntimeException); + virtual css::uno::Any createCollectionObject( const css::uno::Any& aSource ); + + // Methods + virtual sal_Int32 SAL_CALL getCount() throw(css::uno::RuntimeException); + virtual css::uno::Any SAL_CALL Item( const css::uno::Any& Index, const css::uno::Any& /*Index2*/ ) throw (css::uno::RuntimeException); + virtual css::uno::Reference< ov::excel::XMenu > SAL_CALL Add( const rtl::OUString& Caption, const css::uno::Any& Before, const css::uno::Any& Restore ) throw (css::script::BasicErrorException, css::uno::RuntimeException); + // XHelperInterface + virtual rtl::OUString& getServiceImplName(); + virtual css::uno::Sequence<rtl::OUString> getServiceNames(); +}; + +#endif//SC_VBA_MENUS_HXX diff --git a/sc/source/ui/vba/vbaquerytable.cxx b/sc/source/ui/vba/vbaquerytable.cxx new file mode 100644 index 000000000000..9c60c17c6556 --- /dev/null +++ b/sc/source/ui/vba/vbaquerytable.cxx @@ -0,0 +1,89 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright IBM Corporation 2009, 2010. + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "vbaquerytable.hxx" +#include "document.hxx" +#include "docsh.hxx" +#include "sfx2/lnkbase.hxx" +#include "sfx2/linkmgr.hxx" +#include "arealink.hxx" +#include "vbarange.hxx" + +using namespace com::sun::star; + + +ScVbaQueryTable::ScVbaQueryTable(const css::uno::Reference< ov::XHelperInterface >& xParent, + const css::uno::Reference< css::uno::XComponentContext > & xContext, + ScDocument *pDocument , + ScVbaRange *pParent + ) +//:QueryTable_Base(xParent, xContext) +{ + m_pDocument = pDocument; + m_pParent = pParent; +} + +ScVbaQueryTable::~ScVbaQueryTable() +{ + +} + +::sal_Bool SAL_CALL +ScVbaQueryTable::Refresh( const ::com::sun::star::uno::Any& aBackgroundQuery ) throw (::com::sun::star::uno::RuntimeException) +{ + + //Get parent Info + sal_Int32 nRow = m_pParent->getRow(); + sal_Int32 nClm = m_pParent->getColumn(); + sal_Int16 nTab = m_pParent->getWorksheet()->getIndex() - 1; //The vba index begin from 1. + ScAddress crrRngAddr(nClm, nRow, nTab); + + //Get link info + sfx2::LinkManager *pLinkMng = m_pDocument->GetLinkManager(); + const ::sfx2::SvBaseLinks &rLinks = pLinkMng->GetLinks(); + USHORT nCount = rLinks.Count(); + + for (USHORT i=0; i<nCount; i++) + { + ::sfx2::SvBaseLink* pBase = *rLinks[i]; + if (pBase->ISA(ScAreaLink)) + { + + ScAreaLink *pAreaLink = (ScAreaLink *)pBase; + const ScRange &destRange = pAreaLink->GetDestArea(); + if (destRange.In(crrRngAddr)) + { + pBase->Update(); + } + } + } + + return sal_True; +} + + diff --git a/sc/source/ui/vba/vbaquerytable.hxx b/sc/source/ui/vba/vbaquerytable.hxx new file mode 100644 index 000000000000..bf3ef4da4aa7 --- /dev/null +++ b/sc/source/ui/vba/vbaquerytable.hxx @@ -0,0 +1,59 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright IBM Corporation 2009, 2010. + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_VBA_QUERYTABLE_HXX +#define SC_VBA_QUERYTABLE_HXX + + +#include <ooo/vba/excel/XQueryTable.hpp> +#include "vbahelper/vbahelperinterface.hxx" + +using namespace ::ooo::vba; +typedef ::cppu::WeakImplHelper1<excel::XQueryTable> QueryTable_Base; + +class ScDocument; +class ScVbaRange; + +class ScVbaQueryTable : public QueryTable_Base +{ +private: + ScDocument *m_pDocument; + ScVbaRange *m_pParent; +public: + ScVbaQueryTable(const css::uno::Reference< ov::XHelperInterface >& xParent, + const css::uno::Reference< css::uno::XComponentContext > & xContext, + ScDocument *pDocument = NULL, + ScVbaRange *pParent = NULL + ); + ~ScVbaQueryTable(); + virtual ::sal_Bool SAL_CALL Refresh( const ::com::sun::star::uno::Any& aBackgroundQuery ) + throw (::com::sun::star::uno::RuntimeException); + +}; + +#endif |