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: */