sw/Library_vbaswobj.mk              |    1 
 sw/source/ui/vba/vbaapplication.cxx |  315 ------------------------------------
 sw/source/ui/vba/vbawordbasic.cxx   |  245 ++++++++++++++++++++++++++++
 sw/source/ui/vba/vbawordbasic.hxx   |   81 +++++++++
 4 files changed, 332 insertions(+), 310 deletions(-)

New commits:
commit df91cad99056f78496a611bcd9e5227503088adc
Author:     Justin Luth <justin.l...@collabora.com>
AuthorDate: Thu Oct 13 21:21:08 2022 -0400
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Thu Oct 20 15:23:11 2022 +0200

    sw vba: move SwWordBasic to its own file
    
    We had implemented Application.WordBasic.*,
    but it can also run as a global WordBasic.*.
    
    This patch just separates it from vbaapplication.
    It was just a copy/paste, and then I ran
    opt/lo/bin/clang-format -i on the new files
    and did some minor cleanup.
    
    I just guessed at the includes I needed,
    and then commented the remaining ones out
    one by one to verifiy they were needed to compile.
    Not very scientific, but I don't know any other way.
    (running \bin\find-unneedded-includes afterwards
     didn't show anything - perhaps that would have helped.)
    
    A followup patch will add the VBAGlobal connection.
    
    For a clean backport, I first ran 1,$s/makeAny(/Any(/g
    in order to accomplish what was done with
    commit ca734f7cfa55814a85d5940e5f64d7c53638f6a7
    Author: Stephan Bergmann on Tue May 3 16:22:03 2022 +0200
        Just use Any ctor instead of makeAny in sw
        Change-Id: I2c9023ba8d07314d23ae7a65e670e8748c5e9322
    
    Change-Id: Id29ee582a5ed6186150bb41a1ab98d6c466676e7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141354
    Reviewed-by: Justin Luth <jl...@mail.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sw/Library_vbaswobj.mk b/sw/Library_vbaswobj.mk
index 8867fcf5ede4..bcebe38b912a 100644
--- a/sw/Library_vbaswobj.mk
+++ b/sw/Library_vbaswobj.mk
@@ -130,6 +130,7 @@ $(eval $(call gb_Library_add_exception_objects,vbaswobj,\
     sw/source/ui/vba/vbatableofcontents \
     sw/source/ui/vba/vbatablesofcontents \
     sw/source/ui/vba/vbavariable \
+    sw/source/ui/vba/vbawordbasic \
     sw/source/ui/vba/vbadocuments \
     sw/source/ui/vba/vbaparagraphformat \
     sw/source/ui/vba/vbaborders \
diff --git a/sw/source/ui/vba/vbaapplication.cxx 
b/sw/source/ui/vba/vbaapplication.cxx
index 7aa61e93cef2..a9e4231f3eec 100644
--- a/sw/source/ui/vba/vbaapplication.cxx
+++ b/sw/source/ui/vba/vbaapplication.cxx
@@ -36,6 +36,7 @@
 #include "vbaaddins.hxx"
 #include "vbamailmerge.hxx"
 #include "vbadialogs.hxx"
+#include "vbawordbasic.hxx"
 #include <ooo/vba/XConnectionPoint.hpp>
 #include <ooo/vba/word/WdEnableCancelKey.hpp>
 #include <ooo/vba/word/WdWindowState.hpp>
@@ -68,69 +69,6 @@ public:
     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 ):
@@ -241,7 +179,7 @@ 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::makeAny( xCol );
+    return uno::Any( xCol );
 }
 
 uno::Any SAL_CALL
@@ -250,7 +188,7 @@ 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::makeAny( xCol );
+    return uno::Any( xCol );
 }
 
 uno::Any SAL_CALL
@@ -259,7 +197,7 @@ 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::makeAny( xCol );
+    return uno::Any( xCol );
 }
 
 uno::Any SAL_CALL
@@ -269,7 +207,7 @@ SwVbaApplication::ListGalleries( const uno::Any& index )
     uno::Reference< XCollection > xCol( new SwVbaListGalleries( this, 
mxContext, xTextDoc ) );
     if ( index.hasValue() )
         return xCol->Item( index, uno::Any() );
-    return uno::makeAny( xCol );
+    return uno::Any( xCol );
 }
 
 sal_Bool SAL_CALL SwVbaApplication::getDisplayAutoCompleteTips()
@@ -528,247 +466,4 @@ 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::makeAny( 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::makeAny( 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::makeAny( 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::makeAny( 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::makeAny( sal_Int32(2) );
-}
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/ui/vba/vbawordbasic.cxx 
b/sw/source/ui/vba/vbawordbasic.cxx
new file mode 100644
index 000000000000..c5fe14289832
--- /dev/null
+++ b/sw/source/ui/vba/vbawordbasic.cxx
@@ -0,0 +1,245 @@
+/* -*- 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 "vbaapplication.hxx"
+#include "vbafilterpropsfromformat.hxx"
+#include "vbamailmerge.hxx"
+#include "vbawordbasic.hxx"
+
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <osl/file.hxx>
+#include <sal/log.hxx>
+#include <tools/urlobj.hxx>
+
+#include <com/sun/star/text/XTextDocument.hpp>
+#include <com/sun/star/util/thePathSettings.hpp>
+#include <ooo/vba/word/XBookmarks.hpp>
+#include <ooo/vba/word/XDocuments.hpp>
+
+using namespace ::ooo::vba;
+using namespace ::com::sun::star;
+
+SwWordBasic::SwWordBasic(SwVbaApplication* pApp)
+    : mpApp(pApp)
+{
+}
+
+sal_Int32 SAL_CALL SwWordBasic::getMailMergeMainDocumentType()
+{
+    return SwVbaMailMerge::get(mpApp->getParent(), 
mpApp->getContext())->getMainDocumentType();
+}
+
+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: */
diff --git a/sw/source/ui/vba/vbawordbasic.hxx 
b/sw/source/ui/vba/vbawordbasic.hxx
new file mode 100644
index 000000000000..5933f104eb49
--- /dev/null
+++ b/sw/source/ui/vba/vbawordbasic.hxx
@@ -0,0 +1,81 @@
+/* -*- 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 .
+ */
+#ifndef INCLUDED_SW_SOURCE_UI_VBA_VBAWORDBASIC_HXX
+#define INCLUDED_SW_SOURCE_UI_VBA_VBAWORDBASIC_HXX
+
+class SwVbaApplication;
+
+class SwWordBasic : public cppu::WeakImplHelper<ooo::vba::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 css::uno::Any& 
ConfirmConversions,
+                                   const css::uno::Any& ReadOnly, const 
css::uno::Any& AddToMru,
+                                   const css::uno::Any& PasswordDoc,
+                                   const css::uno::Any& PasswordDot, const 
css::uno::Any& Revert,
+                                   const css::uno::Any& WritePasswordDoc,
+                                   const css::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;
+};
+
+#endif // INCLUDED_SW_SOURCE_UI_VBA_VBAWORDBASIC_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to