--- /dev/null	
+++ sc/source/ui/vba/vbawindow.cxx	
@@ -0,0 +1,308 @@
+#include "vbawindow.hxx"
+#include "vbaworksheets.hxx"
+#include "vbaworksheet.hxx"
+#include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
+#include <com/sun/star/sheet/XSpreadsheet.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+
+#include <docsh.hxx>
+#include <tabvwsh.hxx>
+#include <docuno.hxx>
+#include <sc.hrc>
+#include <hash_map>
+
+using namespace ::com::sun::star;
+using namespace ::org::openoffice;
+
+typedef  std::hash_map< rtl::OUString,
+SCTAB, ::rtl::OUStringHash,
+::std::equal_to< ::rtl::OUString > > NameIndexHash;
+
+typedef std::vector < uno::Reference< sheet::XSpreadsheet > > Sheets;
+
+typedef ::cppu::WeakImplHelper1< container::XEnumeration
+
+> Enumeration_BASE;
+
+typedef ::cppu::WeakImplHelper3< container::XEnumerationAccess 
+	, com::sun::star::container::XIndexAccess
+	, com::sun::star::container::XNameAccess
+	> SelectedSheets_BASE;
+
+
+class SelectedSheetsEnum : public Enumeration_BASE
+{
+public:
+	uno::Reference< uno::XComponentContext > m_xContext;
+	uno::Reference< frame::XModel > m_xModel;
+	Sheets m_sheets;
+	Sheets::const_iterator m_it;
+
+	SelectedSheetsEnum( const uno::Reference< uno::XComponentContext >& xContext, const Sheets& sheets, const uno::Reference< frame::XModel >& xModel ) throw ( uno::RuntimeException ) :  m_xContext( xContext ), m_sheets( sheets ), m_xModel( xModel )
+	{
+		m_it = m_sheets.begin();
+	}
+	// XEnumeration
+	virtual ::sal_Bool SAL_CALL hasMoreElements(  ) throw (uno::RuntimeException) 
+	{ 
+		return m_it != m_sheets.end();
+	}
+	virtual uno::Any SAL_CALL nextElement(  ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) 
+	{ 
+		if ( !hasMoreElements() )
+		{
+			throw container::NoSuchElementException();
+		}
+		return uno::makeAny( uno::Reference< vba::XWorksheet > ( new ScVbaWorksheet( m_xContext, *(m_it++), m_xModel ) ) );
+	}
+
+
+};
+
+class SelectedSheetsEnumAccess : public SelectedSheets_BASE
+{
+	uno::Reference< uno::XComponentContext > m_xContext;
+	NameIndexHash namesToIndices;
+	Sheets sheets;
+	uno::Reference< frame::XModel > m_xModel; 
+public:
+	SelectedSheetsEnumAccess( const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< frame::XModel >& xModel ):m_xContext( xContext ), m_xModel( xModel )
+	{
+		ScModelObj* pModel = static_cast< ScModelObj* >( m_xModel.get() );
+		if ( !pModel )
+			throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Cannot obtain current document" ) ), uno::Reference< uno::XInterface >() );
+		ScDocShell* pDocShell = (ScDocShell*)pModel->GetEmbeddedObject();
+		if ( !pDocShell )
+			throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Cannot obtain docshell" ) ), uno::Reference< uno::XInterface >() );
+		ScTabViewShell* pViewShell = getBestViewShell( m_xModel );
+		if ( !pViewShell )
+			throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Cannot obtain view shell" ) ), uno::Reference< uno::XInterface >() );
+			
+		SCTAB nTabCount = pDocShell->GetDocument()->GetTableCount();
+		uno::Sequence<sal_Int32> aSheets( nTabCount );
+		sal_Int32 nIndex = 0;
+		const ScMarkData& rMarkData = pViewShell->GetViewData()->GetMarkData();
+		sheets.reserve( nTabCount );
+		uno::Reference <sheet::XSpreadsheetDocument> xSpreadSheet( m_xModel, uno::UNO_QUERY_THROW );
+		uno::Reference <container::XIndexAccess> xIndex( xSpreadSheet->getSheets(), uno::UNO_QUERY_THROW );
+		for ( SCTAB nTab=0; nTab<nTabCount; nTab++ )
+		{
+			if ( rMarkData.GetTableSelect(nTab) )
+			{
+				uno::Reference< sheet::XSpreadsheet > xSheet( xIndex->getByIndex( nTab ), uno::UNO_QUERY_THROW );
+				uno::Reference< container::XNamed > xNamed( xSheet, uno::UNO_QUERY_THROW );
+				sheets.push_back( xSheet );
+				namesToIndices[ xNamed->getName() ] = nIndex++;
+			}
+		}
+
+	}
+	
+	//XEnumerationAccess
+	virtual uno::Reference< container::XEnumeration > SAL_CALL createEnumeration(  ) throw (uno::RuntimeException)
+	{
+		return new SelectedSheetsEnum( m_xContext, sheets, m_xModel  ); 
+	}
+	// XIndexAccess
+	virtual ::sal_Int32 SAL_CALL getCount(  ) throw (uno::RuntimeException) 
+	{ 
+		return sheets.size();
+	}
+	virtual uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) throw ( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException) 
+	{ 
+		if ( Index < 0 
+			|| Index >= sheets.size() ) 
+			throw lang::IndexOutOfBoundsException();
+		
+		return uno::makeAny( sheets[ Index ] );
+	}
+
+	//XElementAccess
+	virtual uno::Type SAL_CALL getElementType(  ) throw (uno::RuntimeException)
+	{ 
+		return vba::XWorksheet::static_type(0); 
+	}
+
+	virtual ::sal_Bool SAL_CALL hasElements(  ) throw (uno::RuntimeException) 
+	{ 
+		return (sheets.size() > 0);
+	}
+
+	//XNameAccess
+	virtual uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) 
+	{ 
+		NameIndexHash::const_iterator it = namesToIndices.find( aName );
+		if ( it == namesToIndices.end() )
+			throw container::NoSuchElementException();
+		return uno::makeAny( sheets[ it->second ] );
+		
+	}
+
+	virtual uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames(  ) throw (uno::RuntimeException) 
+	{ 
+		uno::Sequence< ::rtl::OUString > names( namesToIndices.size() );
+		::rtl::OUString* pString = names.getArray();
+		NameIndexHash::const_iterator it = namesToIndices.begin();
+		NameIndexHash::const_iterator it_end = namesToIndices.end();
+		for ( ; it != it_end; ++it, ++pString )
+			*pString = it->first;	
+		return names;	
+	}
+
+	virtual ::sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw (uno::RuntimeException) 
+	{ 
+		NameIndexHash::const_iterator it = namesToIndices.find( aName );
+		return (it != namesToIndices.end());
+	}
+
+
+};
+
+
+void  
+ScVbaWindow::Scroll( const uno::Any& Down, const uno::Any& Up, const uno::Any& ToRight, const uno::Any& ToLeft, bool bLargeScroll ) throw (uno::RuntimeException)
+{
+	sal_Int16 down = 0;	
+	sal_Int16 up = 0;	
+	sal_Int16 toRight = 0;	
+	sal_Int16 toLeft = 0;	
+	Down >>= down;
+	Up >>= up;
+	ToRight >>= toRight;
+	ToLeft >>= toLeft;
+	uno::Sequence< beans::PropertyValue > args1(2);
+	args1[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "By" ) );
+	args1[1].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Sel" ) );
+	args1[1].Value <<= false;
+	
+	sal_Int16 totalUp = up - down;
+	sal_Int16 totalLeft = toLeft - toRight;
+	
+	if ( totalUp != 0 )
+	{
+		args1[0].Value <<= totalUp;
+		rtl::OUString url = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GoUp"));
+		if ( bLargeScroll )
+			url = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GoUpBlock"));
+		dispatchRequests( m_xModel, url, args1 );
+	}
+	
+	if ( totalLeft != 0 )
+	{
+		args1[0].Value <<= totalLeft;
+		rtl::OUString url = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GoLeft"));
+		if ( bLargeScroll )
+			url = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "slot:")) + rtl::OUString::valueOf( (sal_Int32)SID_CURSORPAGELEFT_ );
+		dispatchRequests( m_xModel, url, args1 );
+	}
+
+}
+void SAL_CALL 
+ScVbaWindow::SmallScroll( const uno::Any& Down, const uno::Any& Up, const uno::Any& ToRight, const uno::Any& ToLeft ) throw (uno::RuntimeException)
+{
+	Scroll( Down, Up, ToRight, ToLeft );
+}
+void SAL_CALL 
+ScVbaWindow::LargeScroll( const uno::Any& Down, const uno::Any& Up, const uno::Any& ToRight, const uno::Any& ToLeft ) throw (uno::RuntimeException)
+{
+	Scroll( Down, Up, ToRight, ToLeft, true );
+}
+
+uno::Any SAL_CALL 
+ScVbaWindow::SelectedSheets( const uno::Any& aIndex ) throw (uno::RuntimeException)
+{
+	uno::Reference< container::XEnumerationAccess > xEnumAccess( new SelectedSheetsEnumAccess( m_xContext, m_xModel  ) );
+	return uno::makeAny( uno::Reference< vba::XWorksheets > ( new ScVbaWorksheets( m_xContext, xEnumAccess, m_xModel ) ) ); 	
+}
+
+void SAL_CALL 
+ScVbaWindow::ScrollWorkbookTabs( const uno::Any& Sheets, const uno::Any& Position ) throw (uno::RuntimeException)
+{
+	sal_Int32 nSheets = 0;
+	sal_Int32 nPosition = 0;
+	sal_Bool bSheets = ( Sheets >>= nSheets );
+	sal_Bool bPosition = ( Position >>= nPosition );
+// #TODO #FIXME need some implementation to scroll through the tabs
+// but where is this done?
+	if ( bSheets || bPosition ) // at least one param specified
+		if ( bSheets )
+			;// use sheets
+		else if ( bPosition )
+			; //use position
+
+}
+uno::Reference< beans::XPropertySet >
+getPropsFromModel( const uno::Reference< frame::XModel >& xModel )
+{
+	uno::Reference< frame::XController > xController = xModel->getCurrentController();
+	if ( !xController.is() )
+		throw uno::RuntimeException( rtl::OUString(
+			RTL_CONSTASCII_USTRINGPARAM ("No controller for model") ), uno::Reference< uno::XInterface >() );	
+	return uno::Reference< beans::XPropertySet >(  xController->getFrame(), uno::UNO_QUERY );
+}
+
+
+uno::Any SAL_CALL 
+ScVbaWindow::getCaption() throw (uno::RuntimeException)
+{
+	static rtl::OUString sCrud(RTL_CONSTASCII_USTRINGPARAM(" - OpenOffice.org Calc" ) );
+	static sal_Int32 nCrudLen = sCrud.getLength();
+
+	uno::Reference< beans::XPropertySet > xProps = getPropsFromModel( m_xModel );
+	rtl::OUString sTitle;
+	xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ("Title") ) ) >>= sTitle;	
+	sal_Int32 nCrudIndex = sTitle.indexOf( sCrud );	
+	// adjust title ( by removing crud )
+	// sCrud string present
+	if ( nCrudIndex != -1 )
+	{
+		// and ends with sCrud
+		if ( ( nCrudLen + nCrudIndex ) == sTitle.getLength() )
+		{
+			sTitle = sTitle.copy( 0, nCrudIndex );
+			ScVbaWorkbook workbook( m_xContext, m_xModel );
+			rtl::OUString sName = workbook.getName();
+			// rather bizare hack to make sure the name behavior
+			// is like XL
+			// if the adjusted title == workbook name, use name
+			// if the adjusted title != workbook name but ...
+			// 	name == title + extension ( .csv, ,odt, .xls )
+			//	etc. then also use the name
+
+			if ( !sTitle.equals( sName ) )
+			{
+				static rtl::OUString sDot( RTL_CONSTASCII_USTRINGPARAM(".") );
+				// starts with title
+				sal_Int32 nTitleIndex = -1;
+				if ( sName.indexOf( sTitle ) == 0 )
+					// extention starts immediately after
+					if ( sName.match( sDot, sTitle.getLength() ) )
+						sTitle = sName;
+			}
+		}
+	}			
+	return uno::makeAny( sTitle );
+}
+
+void SAL_CALL 
+ScVbaWindow::setCaption( const uno::Any& _caption ) throw (uno::RuntimeException)
+{
+	
+	uno::Reference< beans::XPropertySet > xProps = getPropsFromModel( m_xModel );
+	xProps->setPropertyValue( rtl::OUString(
+		RTL_CONSTASCII_USTRINGPARAM ("Title") ) , _caption );	
+}
+
+void
+ScVbaWindow::Activate() throw (css::uno::RuntimeException)
+{
+	ScVbaWorkbook workbook( m_xContext, m_xModel );
+	workbook.Activate();
+}
+
+void
+ScVbaWindow::Close( const uno::Any& SaveChanges, const uno::Any& FileName, const uno::Any& RouteWorkBook ) throw (uno::RuntimeException)
+{
+	ScVbaWorkbook workbook( m_xContext, m_xModel );
+	workbook.Close(SaveChanges, FileName, RouteWorkBook );
+}
