summaryrefslogtreecommitdiffstats
path: root/sw/source/ui/vba/vbaapplication.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/ui/vba/vbaapplication.cxx')
-rw-r--r--sw/source/ui/vba/vbaapplication.cxx774
1 files changed, 774 insertions, 0 deletions
diff --git a/sw/source/ui/vba/vbaapplication.cxx b/sw/source/ui/vba/vbaapplication.cxx
new file mode 100644
index 000000000..1cab05731
--- /dev/null
+++ b/sw/source/ui/vba/vbaapplication.cxx
@@ -0,0 +1,774 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column:100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <com/sun/star/task/XStatusIndicatorSupplier.hpp>
+#include <com/sun/star/task/XStatusIndicator.hpp>
+#include <com/sun/star/util/thePathSettings.hpp>
+
+#include "vbaapplication.hxx"
+#include "vbadocument.hxx"
+#include "vbafilterpropsfromformat.hxx"
+#include <sal/log.hxx>
+#include <osl/file.hxx>
+#include <vcl/svapp.hxx>
+#include <vbahelper/vbahelper.hxx>
+#include "vbawindow.hxx"
+#include "vbasystem.hxx"
+#include "vbaoptions.hxx"
+#include "vbaselection.hxx"
+#include "vbadocuments.hxx"
+#include "vbaaddins.hxx"
+#include "vbamailmerge.hxx"
+#include "vbadialogs.hxx"
+#include <ooo/vba/XConnectionPoint.hpp>
+#include <ooo/vba/word/WdEnableCancelKey.hpp>
+#include <ooo/vba/word/WdWindowState.hpp>
+#include <ooo/vba/word/XApplicationOutgoing.hpp>
+#include <ooo/vba/word/XBookmarks.hpp>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <editeng/acorrcfg.hxx>
+#include <swdll.hxx>
+#include <swmodule.hxx>
+#include "vbalistgalleries.hxx"
+#include <tools/urlobj.hxx>
+
+using namespace ::ooo;
+using namespace ::ooo::vba;
+using namespace ::com::sun::star;
+
+namespace {
+
+class SwVbaApplicationOutgoingConnectionPoint : public cppu::WeakImplHelper<XConnectionPoint>
+{
+private:
+ SwVbaApplication* mpApp;
+
+public:
+ SwVbaApplicationOutgoingConnectionPoint( SwVbaApplication* pApp );
+
+ // XConnectionPoint
+ sal_uInt32 SAL_CALL Advise(const uno::Reference< XSink >& Sink ) override;
+ void SAL_CALL Unadvise( sal_uInt32 Cookie ) override;
+};
+
+class SwWordBasic : public cppu::WeakImplHelper<word::XWordBasic>
+{
+private:
+ SwVbaApplication* mpApp;
+
+public:
+ SwWordBasic( SwVbaApplication* pApp );
+
+ // XWordBasic
+ virtual sal_Int32 SAL_CALL getMailMergeMainDocumentType() override;
+ virtual void SAL_CALL setMailMergeMainDocumentType( sal_Int32 _mailmergemaindocumenttype ) override;
+
+ virtual void SAL_CALL FileOpen( const OUString& Name, const uno::Any& ConfirmConversions, const uno::Any& ReadOnly, const uno::Any& AddToMru, const uno::Any& PasswordDoc, const uno::Any& PasswordDot, const uno::Any& Revert, const uno::Any& WritePasswordDoc, const uno::Any& WritePasswordDot ) override;
+ virtual void SAL_CALL FileSave() override;
+ virtual void SAL_CALL FileSaveAs( const css::uno::Any& Name,
+ const css::uno::Any& Format,
+ const css::uno::Any& LockAnnot,
+ const css::uno::Any& Password,
+ const css::uno::Any& AddToMru,
+ const css::uno::Any& WritePassword,
+ const css::uno::Any& RecommendReadOnly,
+ const css::uno::Any& EmbedFonts,
+ const css::uno::Any& NativePictureFormat,
+ const css::uno::Any& FormsData,
+ const css::uno::Any& SaveAsAOCELetter ) override;
+ virtual void SAL_CALL FileClose( const css::uno::Any& Save ) override;
+ virtual void SAL_CALL ToolsOptionsView( const css::uno::Any& DraftFont,
+ const css::uno::Any& WrapToWindow,
+ const css::uno::Any& PicturePlaceHolders,
+ const css::uno::Any& FieldCodes,
+ const css::uno::Any& BookMarks,
+ const css::uno::Any& FieldShading,
+ const css::uno::Any& StatusBar,
+ const css::uno::Any& HScroll,
+ const css::uno::Any& VScroll,
+ const css::uno::Any& StyleAreaWidth,
+ const css::uno::Any& Tabs,
+ const css::uno::Any& Spaces,
+ const css::uno::Any& Paras,
+ const css::uno::Any& Hyphens,
+ const css::uno::Any& Hidden,
+ const css::uno::Any& ShowAll,
+ const css::uno::Any& Drawings,
+ const css::uno::Any& Anchors,
+ const css::uno::Any& TextBoundaries,
+ const css::uno::Any& VRuler,
+ const css::uno::Any& Highlight ) override;
+ virtual css::uno::Any SAL_CALL WindowName( const css::uno::Any& Number ) override;
+ virtual css::uno::Any SAL_CALL ExistingBookmark( const OUString& Name ) override;
+ virtual void SAL_CALL MailMergeOpenDataSource(const OUString& Name, const css::uno::Any& Format,
+ const css::uno::Any& ConfirmConversions, const css::uno::Any& ReadOnly,
+ const css::uno::Any& LinkToSource, const css::uno::Any& AddToRecentFiles,
+ const css::uno::Any& PasswordDocument, const css::uno::Any& PasswordTemplate,
+ const css::uno::Any& Revert, const css::uno::Any& WritePasswordDocument,
+ const css::uno::Any& WritePasswordTemplate, const css::uno::Any& Connection,
+ const css::uno::Any& SQLStatement, const css::uno::Any& SQLStatement1,
+ const css::uno::Any& OpenExclusive, const css::uno::Any& SubType) override;
+ virtual css::uno::Any SAL_CALL AppMaximize( const css::uno::Any& WindowName, const css::uno::Any& State ) override;
+ virtual css::uno::Any SAL_CALL DocMaximize( const css::uno::Any& State ) override;
+ virtual void SAL_CALL AppShow( const css::uno::Any& WindowName ) override;
+ virtual css::uno::Any SAL_CALL AppCount() override;
+};
+
+}
+
+SwVbaApplication::SwVbaApplication( uno::Reference<uno::XComponentContext >& xContext ):
+ SwVbaApplication_BASE( xContext )
+{
+}
+
+SwVbaApplication::~SwVbaApplication()
+{
+}
+
+sal_uInt32
+SwVbaApplication::AddSink( const uno::Reference< XSink >& xSink )
+{
+ {
+ SolarMutexGuard aGuard;
+ SwGlobals::ensure();
+ }
+ // No harm in potentially calling this several times
+ SW_MOD()->RegisterAutomationApplicationEventsCaller( uno::Reference< XSinkCaller >(this) );
+ mvSinks.push_back(xSink);
+ return mvSinks.size();
+}
+
+void
+SwVbaApplication::RemoveSink( sal_uInt32 nNumber )
+{
+ if (nNumber < 1 || nNumber > mvSinks.size())
+ return;
+
+ mvSinks[nNumber-1] = uno::Reference< XSink >();
+}
+
+OUString SAL_CALL
+SwVbaApplication::getName()
+{
+ return "Microsoft Word";
+}
+
+uno::Reference< word::XDocument > SAL_CALL
+SwVbaApplication::getActiveDocument()
+{
+ return new SwVbaDocument( this, mxContext, getCurrentDocument() );
+}
+
+rtl::Reference<SwVbaWindow>
+SwVbaApplication::getActiveSwVbaWindow()
+{
+ // #FIXME so far can't determine Parent
+ uno::Reference< frame::XModel > xModel( getCurrentDocument(), uno::UNO_SET_THROW );
+ uno::Reference< frame::XController > xController( xModel->getCurrentController(), uno::UNO_SET_THROW );
+ return new SwVbaWindow( uno::Reference< XHelperInterface >(), mxContext, xModel, xController );
+}
+
+uno::Reference< css::uno::XComponentContext > const &
+SwVbaApplication::getContext() const
+{
+ return mxContext;
+}
+
+uno::Reference< word::XWindow > SAL_CALL
+SwVbaApplication::getActiveWindow()
+{
+ return getActiveSwVbaWindow();
+}
+
+uno::Reference<word::XSystem > SAL_CALL
+SwVbaApplication::getSystem()
+{
+ return uno::Reference< word::XSystem >( new SwVbaSystem( mxContext ) );
+}
+
+uno::Reference<word::XOptions > SAL_CALL
+SwVbaApplication::getOptions()
+{
+ return uno::Reference< word::XOptions >( new SwVbaOptions( mxContext ) );
+}
+
+uno::Any SAL_CALL
+SwVbaApplication::CommandBars( const uno::Any& aIndex )
+{
+ try
+ {
+ return VbaApplicationBase::CommandBars( aIndex );
+ }
+ catch (const uno::RuntimeException&)
+ {
+ return uno::Any();
+ }
+}
+
+uno::Reference< word::XSelection > SAL_CALL
+SwVbaApplication::getSelection()
+{
+ return new SwVbaSelection( this, mxContext, getCurrentDocument() );
+}
+
+uno::Reference< word::XWordBasic > SAL_CALL
+SwVbaApplication::getWordBasic()
+{
+ uno::Reference< word::XWordBasic > xWB( new SwWordBasic( this ) );
+ return xWB;
+}
+
+uno::Any SAL_CALL
+SwVbaApplication::Documents( const uno::Any& index )
+{
+ uno::Reference< XCollection > xCol( new SwVbaDocuments( this, mxContext ) );
+ if ( index.hasValue() )
+ return xCol->Item( index, uno::Any() );
+ return uno::Any( xCol );
+}
+
+uno::Any SAL_CALL
+SwVbaApplication::Addins( const uno::Any& index )
+{
+ static uno::Reference< XCollection > xCol( new SwVbaAddins( this, mxContext ) );
+ if ( index.hasValue() )
+ return xCol->Item( index, uno::Any() );
+ return uno::Any( xCol );
+}
+
+uno::Any SAL_CALL
+SwVbaApplication::Dialogs( const uno::Any& index )
+{
+ uno::Reference< word::XDialogs > xCol( new SwVbaDialogs( this, mxContext, getCurrentDocument() ));
+ if ( index.hasValue() )
+ return xCol->Item( index );
+ return uno::Any( xCol );
+}
+
+uno::Any SAL_CALL
+SwVbaApplication::ListGalleries( const uno::Any& index )
+{
+ uno::Reference< text::XTextDocument > xTextDoc( getCurrentDocument(), uno::UNO_QUERY_THROW );
+ uno::Reference< XCollection > xCol( new SwVbaListGalleries( this, mxContext, xTextDoc ) );
+ if ( index.hasValue() )
+ return xCol->Item( index, uno::Any() );
+ return uno::Any( xCol );
+}
+
+sal_Bool SAL_CALL SwVbaApplication::getDisplayAutoCompleteTips()
+{
+ return SvxAutoCorrCfg::Get().IsAutoTextTip();
+}
+
+void SAL_CALL SwVbaApplication::setDisplayAutoCompleteTips( sal_Bool _displayAutoCompleteTips )
+{
+ SvxAutoCorrCfg::Get().SetAutoTextTip( _displayAutoCompleteTips );
+}
+
+sal_Int32 SAL_CALL SwVbaApplication::getEnableCancelKey()
+{
+ // the default value is wdCancelInterrupt in Word
+ return word::WdEnableCancelKey::wdCancelInterrupt;
+}
+
+void SAL_CALL SwVbaApplication::setEnableCancelKey( sal_Int32/* _enableCancelKey */)
+{
+ // seems not supported in Writer
+}
+
+sal_Int32 SAL_CALL SwVbaApplication::getWindowState()
+{
+ auto xWindow = getActiveWindow();
+ if (xWindow.is())
+ {
+ uno::Any aState = xWindow->getWindowState();
+ sal_Int32 nState;
+ if (aState >>= nState)
+ return nState;
+ }
+
+ return word::WdWindowState::wdWindowStateNormal; // ?
+}
+
+void SAL_CALL SwVbaApplication::setWindowState( sal_Int32 _windowstate )
+{
+ try
+ {
+ auto xWindow = getActiveWindow();
+ if (xWindow.is())
+ {
+ uno::Any aState;
+ aState <<= _windowstate;
+ xWindow->setWindowState( aState );
+ }
+ }
+ catch (const uno::RuntimeException&)
+ {
+ }
+}
+
+sal_Int32 SAL_CALL SwVbaApplication::getWidth()
+{
+ auto pWindow = getActiveSwVbaWindow();
+ return pWindow->getWidth();
+}
+
+void SAL_CALL SwVbaApplication::setWidth( sal_Int32 _width )
+{
+ auto pWindow = getActiveSwVbaWindow();
+ pWindow->setWidth( _width );
+}
+
+sal_Int32 SAL_CALL SwVbaApplication::getHeight()
+{
+ auto pWindow = getActiveSwVbaWindow();
+ return pWindow->getHeight();
+}
+
+void SAL_CALL SwVbaApplication::setHeight( sal_Int32 _height )
+{
+ auto pWindow = getActiveSwVbaWindow();
+ pWindow->setHeight( _height );
+}
+
+sal_Int32 SAL_CALL SwVbaApplication::getLeft()
+{
+ auto pWindow = getActiveSwVbaWindow();
+ return pWindow->getLeft();
+}
+
+void SAL_CALL SwVbaApplication::setLeft( sal_Int32 _left )
+{
+ auto pWindow = getActiveSwVbaWindow();
+ pWindow->setLeft( _left );
+}
+
+sal_Int32 SAL_CALL SwVbaApplication::getTop()
+{
+ auto pWindow = getActiveSwVbaWindow();
+ return pWindow->getTop();
+}
+
+void SAL_CALL SwVbaApplication::setTop( sal_Int32 _top )
+{
+ auto pWindow = getActiveSwVbaWindow();
+ pWindow->setTop( _top );
+}
+
+OUString SAL_CALL SwVbaApplication::getStatusBar()
+{
+ return "";
+}
+
+uno::Any SAL_CALL SwVbaApplication::getCustomizationContext()
+{
+ return uno::Any(); // ???
+}
+
+void SAL_CALL SwVbaApplication::setCustomizationContext(const uno::Any& /*_customizationcontext*/)
+{
+ // ???
+}
+
+void SAL_CALL SwVbaApplication::setStatusBar( const OUString& _statusbar )
+{
+ // ScVbaAppSettings::setStatusBar() also uses the XStatusIndicator to show this, so maybe that is OK?
+ uno::Reference< frame::XModel > xModel = getCurrentDocument();
+ if (xModel.is())
+ {
+ uno::Reference< task::XStatusIndicatorSupplier > xStatusIndicatorSupplier( xModel->getCurrentController(), uno::UNO_QUERY );
+ if (xStatusIndicatorSupplier.is())
+ {
+ uno::Reference< task::XStatusIndicator > xStatusIndicator = xStatusIndicatorSupplier->getStatusIndicator();
+ if (xStatusIndicator.is())
+ xStatusIndicator->start( _statusbar, 100 );
+ }
+ }
+
+ // Yes, we intentionally use the "extensions.olebridge" tag here even if this is sw. We
+ // interpret setting the StatusBar property as a request from an Automation client to display
+ // the string in LibreOffice's debug output, and all other generic Automation support debug
+ // output (in extensions/source/ole) uses that tag. If the check for "cross-module" or mixed log
+ // areas in compilerplugins/clang/sallogareas.cxx is re-activated, this will have to be added as
+ // a special case.
+
+ SAL_INFO("extensions.olebridge", "Client debug output: " << _statusbar);
+}
+
+float SAL_CALL SwVbaApplication::CentimetersToPoints( float Centimeters )
+{
+ return VbaApplicationBase::CentimetersToPoints( Centimeters );
+}
+
+void SAL_CALL SwVbaApplication::ShowMe()
+{
+ // No idea what we should or could do
+}
+
+void SAL_CALL SwVbaApplication::Resize( sal_Int32 Width, sal_Int32 Height )
+{
+ // Have to do it like this as the Width and Height are hidden away in the ooo::vba::XWindowBase
+ // which ooo::vba::word::XApplication does not inherit from. SwVbaWindow, however, does inherit
+ // from XWindowBase. Ugh.
+ auto pWindow = getActiveSwVbaWindow();
+ pWindow->setWidth( Width );
+ pWindow->setHeight( Height );
+}
+
+void SAL_CALL SwVbaApplication::Move( sal_Int32 Left, sal_Int32 Top )
+{
+ // See comment in Resize().
+ auto pWindow = getActiveSwVbaWindow();
+ pWindow->setLeft( Left );
+ pWindow->setTop( Top );
+}
+
+// XInterfaceWithIID
+
+OUString SAL_CALL
+SwVbaApplication::getIID()
+{
+ return "{82154421-0FBF-11d4-8313-005004526AB4}";
+}
+
+// XConnectable
+
+OUString SAL_CALL
+SwVbaApplication::GetIIDForClassItselfNotCoclass()
+{
+ return "{82154423-0FBF-11D4-8313-005004526AB4}";
+}
+
+TypeAndIID SAL_CALL
+SwVbaApplication::GetConnectionPoint()
+{
+ TypeAndIID aResult =
+ { word::XApplicationOutgoing::static_type(),
+ "{82154422-0FBF-11D4-8313-005004526AB4}"
+ };
+
+ return aResult;
+}
+
+uno::Reference<XConnectionPoint> SAL_CALL
+SwVbaApplication::FindConnectionPoint()
+{
+ uno::Reference<XConnectionPoint> xCP(new SwVbaApplicationOutgoingConnectionPoint(this));
+ return xCP;
+}
+
+OUString
+SwVbaApplication::getServiceImplName()
+{
+ return "SwVbaApplication";
+}
+
+uno::Sequence< OUString >
+SwVbaApplication::getServiceNames()
+{
+ static uno::Sequence< OUString > const aServiceNames
+ {
+ "ooo.vba.word.Application"
+ };
+ return aServiceNames;
+}
+
+uno::Reference< frame::XModel >
+SwVbaApplication::getCurrentDocument()
+{
+ return getCurrentWordDoc( mxContext );
+}
+
+// XSinkCaller
+
+void SAL_CALL
+SwVbaApplication::CallSinks( const OUString& Method, uno::Sequence< uno::Any >& Arguments )
+{
+ for (auto& i : mvSinks)
+ {
+ if (i.is())
+ i->Call(Method, Arguments);
+ }
+}
+
+// SwVbaApplicationOutgoingConnectionPoint
+
+SwVbaApplicationOutgoingConnectionPoint::SwVbaApplicationOutgoingConnectionPoint( SwVbaApplication* pApp ) :
+ mpApp(pApp)
+{
+}
+
+// XConnectionPoint
+sal_uInt32 SAL_CALL
+SwVbaApplicationOutgoingConnectionPoint::Advise( const uno::Reference< XSink >& Sink )
+{
+ return mpApp->AddSink(Sink);
+}
+
+void SAL_CALL
+SwVbaApplicationOutgoingConnectionPoint::Unadvise( sal_uInt32 Cookie )
+{
+ mpApp->RemoveSink( Cookie );
+}
+
+// SwWordBasic
+
+SwWordBasic::SwWordBasic( SwVbaApplication* pApp ) :
+ mpApp(pApp)
+{
+}
+
+// XWordBasic
+sal_Int32 SAL_CALL
+SwWordBasic::getMailMergeMainDocumentType()
+{
+ return SwVbaMailMerge::get( mpApp->getParent(), mpApp->getContext() )->getMainDocumentType();
+}
+
+// XWordBasic
+void SAL_CALL
+SwWordBasic::setMailMergeMainDocumentType( sal_Int32 _mailmergemaindocumenttype )
+{
+ SwVbaMailMerge::get( mpApp->getParent(), mpApp->getContext() )->setMainDocumentType( _mailmergemaindocumenttype );
+}
+
+void SAL_CALL
+SwWordBasic::FileOpen( const OUString& Name, const uno::Any& ConfirmConversions, const uno::Any& ReadOnly, const uno::Any& AddToMru, const uno::Any& PasswordDoc, const uno::Any& PasswordDot, const uno::Any& Revert, const uno::Any& WritePasswordDoc, const uno::Any& WritePasswordDot )
+{
+ uno::Any aDocuments = mpApp->Documents( uno::Any() );
+
+ uno::Reference<word::XDocuments> rDocuments;
+
+ if (aDocuments >>= rDocuments)
+ rDocuments->Open( Name, ConfirmConversions, ReadOnly, AddToMru, PasswordDoc, PasswordDot, Revert, WritePasswordDoc, WritePasswordDot, uno::Any(), uno::Any(), uno::Any(), uno::Any(), uno::Any(), uno::Any(), uno::Any() );
+}
+
+void SAL_CALL
+SwWordBasic::FileSave()
+{
+ uno::Reference< frame::XModel > xModel( mpApp->getCurrentDocument(), uno::UNO_SET_THROW );
+ dispatchRequests(xModel,".uno:Save");
+}
+
+void SAL_CALL
+SwWordBasic::FileSaveAs( const css::uno::Any& Name,
+ const css::uno::Any& Format,
+ const css::uno::Any& /*LockAnnot*/,
+ const css::uno::Any& /*Password*/,
+ const css::uno::Any& /*AddToMru*/,
+ const css::uno::Any& /*WritePassword*/,
+ const css::uno::Any& /*RecommendReadOnly*/,
+ const css::uno::Any& /*EmbedFonts*/,
+ const css::uno::Any& /*NativePictureFormat*/,
+ const css::uno::Any& /*FormsData*/,
+ const css::uno::Any& /*SaveAsAOCELetter*/ )
+{
+ SAL_INFO("sw.vba", "WordBasic.FileSaveAs(Name:=" << Name << ",Format:=" << Format << ")");
+
+ uno::Reference< frame::XModel > xModel( mpApp->getCurrentDocument(), uno::UNO_SET_THROW );
+
+ // Based on SwVbaDocument::SaveAs2000.
+
+ OUString sFileName;
+ Name >>= sFileName;
+
+ OUString sURL;
+ osl::FileBase::getFileURLFromSystemPath( sFileName, sURL );
+
+ // Detect if there is no path then we need to use the current folder.
+ INetURLObject aURL( sURL );
+ sURL = aURL.GetMainURL( INetURLObject::DecodeMechanism::ToIUri );
+ if( sURL.isEmpty() )
+ {
+ // Need to add cur dir ( of this document ) or else the 'Work' dir
+ sURL = xModel->getURL();
+
+ if ( sURL.isEmpty() )
+ {
+ // Not path available from 'this' document. Need to add the 'document'/work directory then.
+ // Based on SwVbaOptions::getValueEvent()
+ uno::Reference< util::XPathSettings > xPathSettings = util::thePathSettings::get( comphelper::getProcessComponentContext() );
+ OUString sPathUrl;
+ xPathSettings->getPropertyValue( "Work" ) >>= sPathUrl;
+ // Path could be a multipath, Microsoft doesn't support this feature in Word currently.
+ // Only the last path is from interest.
+ // No idea if this crack is relevant for WordBasic or not.
+ sal_Int32 nIndex = sPathUrl.lastIndexOf( ';' );
+ if( nIndex != -1 )
+ {
+ sPathUrl = sPathUrl.copy( nIndex + 1 );
+ }
+
+ aURL.SetURL( sPathUrl );
+ }
+ else
+ {
+ aURL.SetURL( sURL );
+ aURL.Append( sFileName );
+ }
+ sURL = aURL.GetMainURL( INetURLObject::DecodeMechanism::ToIUri );
+
+ }
+ sal_Int32 nFileFormat = word::WdSaveFormat::wdFormatDocument;
+ Format >>= nFileFormat;
+
+ uno::Sequence aProps{ comphelper::makePropertyValue("FilterName", css::uno::Any()),
+ comphelper::makePropertyValue("FileName", sURL) };
+
+ setFilterPropsFromFormat( nFileFormat, aProps );
+
+ dispatchRequests(xModel,".uno:SaveAs",aProps);
+}
+
+void SAL_CALL
+SwWordBasic::FileClose( const css::uno::Any& Save )
+{
+ uno::Reference< frame::XModel > xModel( mpApp->getCurrentDocument(), uno::UNO_SET_THROW );
+
+ sal_Int16 nSave = 0;
+ if (Save.hasValue() && (Save >>= nSave) && (nSave == 0 || nSave == 1))
+ FileSave();
+
+ // FIXME: Here I would much prefer to call VbaDocumentBase::Close() but not sure how to get at
+ // the VbaDocumentBase of the current document. (Probably it is easy and I haven't looked hard
+ // enough.)
+ //
+ // FIXME: Error handling. If there is no current document, return some kind of error? But for
+ // now, just ignore errors. This code is written to work for a very specific customer use case
+ // anyway, not for an arbitrary sequence of COM calls to the "VBA" API.
+ dispatchRequests(xModel,".uno:CloseDoc");
+}
+
+void SAL_CALL
+SwWordBasic::ToolsOptionsView( const css::uno::Any& DraftFont,
+ const css::uno::Any& WrapToWindow,
+ const css::uno::Any& PicturePlaceHolders,
+ const css::uno::Any& FieldCodes,
+ const css::uno::Any& BookMarks,
+ const css::uno::Any& FieldShading,
+ const css::uno::Any& StatusBar,
+ const css::uno::Any& HScroll,
+ const css::uno::Any& VScroll,
+ const css::uno::Any& StyleAreaWidth,
+ const css::uno::Any& Tabs,
+ const css::uno::Any& Spaces,
+ const css::uno::Any& Paras,
+ const css::uno::Any& Hyphens,
+ const css::uno::Any& Hidden,
+ const css::uno::Any& ShowAll,
+ const css::uno::Any& Drawings,
+ const css::uno::Any& Anchors,
+ const css::uno::Any& TextBoundaries,
+ const css::uno::Any& VRuler,
+ const css::uno::Any& Highlight )
+{
+ SAL_INFO("sw.vba", "WordBasic.ToolsOptionsView("
+ "DraftFont:=" << DraftFont
+ << ", WrapToWindow:=" << WrapToWindow
+ << ", PicturePlaceHolders:=" << PicturePlaceHolders
+ << ", FieldCodes:=" << FieldCodes
+ << ", BookMarks:=" << BookMarks
+ << ", FieldShading:=" << FieldShading
+ << ", StatusBar:=" << StatusBar
+ << ", HScroll:=" << HScroll
+ << ", VScroll:=" << VScroll
+ << ", StyleAreaWidth:=" << StyleAreaWidth
+ << ", Tabs:=" << Tabs
+ << ", Spaces:=" << Spaces
+ << ", Paras:=" << Paras
+ << ", Hyphens:=" << Hyphens
+ << ", Hidden:=" << Hidden
+ << ", ShowAll:=" << ShowAll
+ << ", Drawings:=" << Drawings
+ << ", Anchors:=" << Anchors
+ << ", TextBoundaries:=" << TextBoundaries
+ << ", VRuler:=" << VRuler
+ << ", Highlight:=" << Highlight
+ << ")");
+}
+
+css::uno::Any SAL_CALL
+SwWordBasic::WindowName( const css::uno::Any& /*Number*/ )
+{
+ return css::uno::Any( mpApp->getActiveSwVbaWindow()->getCaption() );
+}
+
+css::uno::Any SAL_CALL
+SwWordBasic::ExistingBookmark( const OUString& Name )
+{
+ uno::Reference< word::XBookmarks > xBookmarks( mpApp->getActiveDocument()->Bookmarks( uno::Any() ), uno::UNO_QUERY );
+ return css::uno::Any( xBookmarks.is() && xBookmarks->Exists( Name ) );
+}
+
+void SAL_CALL
+SwWordBasic::MailMergeOpenDataSource( const OUString& Name, const css::uno::Any& Format,
+ const css::uno::Any& ConfirmConversions, const css::uno::Any& ReadOnly,
+ const css::uno::Any& LinkToSource, const css::uno::Any& AddToRecentFiles,
+ const css::uno::Any& PasswordDocument, const css::uno::Any& PasswordTemplate,
+ const css::uno::Any& Revert, const css::uno::Any& WritePasswordDocument,
+ const css::uno::Any& WritePasswordTemplate, const css::uno::Any& Connection,
+ const css::uno::Any& SQLStatement, const css::uno::Any& SQLStatement1,
+ const css::uno::Any& OpenExclusive, const css::uno::Any& SubType )
+{
+ mpApp->getActiveDocument()->getMailMerge()->OpenDataSource( Name, Format, ConfirmConversions, ReadOnly,
+ LinkToSource, AddToRecentFiles,
+ PasswordDocument, PasswordTemplate,
+ Revert, WritePasswordDocument,
+ WritePasswordTemplate, Connection,
+ SQLStatement, SQLStatement1,
+ OpenExclusive, SubType );
+}
+
+css::uno::Any SAL_CALL
+SwWordBasic::AppMaximize( const css::uno::Any& WindowName, const css::uno::Any& State )
+{
+ SAL_INFO("sw.vba", "WordBasic.AppMaximize( WindowName:=" << WindowName << ", State:=" << State);
+
+ // FIXME: Implement if necessary
+ return css::uno::Any( sal_Int32(0) );
+}
+
+css::uno::Any SAL_CALL
+SwWordBasic::DocMaximize( const css::uno::Any& State )
+{
+ SAL_INFO("sw.vba", "WordBasic.DocMaximize(State:=" << State << ")");
+
+ // FIXME: Implement if necessary
+ return css::uno::Any( sal_Int32(0) );
+}
+
+void SAL_CALL
+SwWordBasic::AppShow( const css::uno::Any& WindowName )
+{
+ SAL_INFO("sw.vba", "WordBasic.AppShow(WindowName:=" << WindowName << ")");
+
+ // FIXME: Implement if necessary
+}
+
+css::uno::Any SAL_CALL
+SwWordBasic::AppCount()
+{
+ SAL_INFO("sw.vba", "WordBasic.AppCount()");
+
+ // FIXME: Implement if necessary. Return a random number for now.
+ return css::uno::Any( sal_Int32(2) );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */