summaryrefslogtreecommitdiffstats
path: root/sw/source/ui/vba/vbawordbasic.cxx
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:54:39 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:54:39 +0000
commit267c6f2ac71f92999e969232431ba04678e7437e (patch)
tree358c9467650e1d0a1d7227a21dac2e3d08b622b2 /sw/source/ui/vba/vbawordbasic.cxx
parentInitial commit. (diff)
downloadlibreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz
libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sw/source/ui/vba/vbawordbasic.cxx')
-rw-r--r--sw/source/ui/vba/vbawordbasic.cxx265
1 files changed, 265 insertions, 0 deletions
diff --git a/sw/source/ui/vba/vbawordbasic.cxx b/sw/source/ui/vba/vbawordbasic.cxx
new file mode 100644
index 0000000000..f08ed4e0da
--- /dev/null
+++ b/sw/source/ui/vba/vbawordbasic.cxx
@@ -0,0 +1,265 @@
+/* -*- 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 <basic/sbx.hxx>
+#include <basic/sbxvar.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));
+}
+
+void SAL_CALL SwWordBasic::MsgBox(const OUString& sPrompt)
+{
+ SbxArrayRef pArgs = new SbxArray;
+ SbxVariable* pVar = new SbxVariable();
+ pVar->PutString(sPrompt);
+ pArgs->Put(pVar, 1);
+
+ if (!executeRunTimeLibrary(u"MsgBox", pArgs.get()))
+ SAL_WARN("sw.vba", "failed to execute runtime library function MsgBox (" << sPrompt << ")");
+}
+
+void SAL_CALL SwWordBasic::ScreenUpdating(const uno::Any& On)
+{
+ sal_Int32 nOn;
+ if (On >>= nOn)
+ mpApp->setScreenUpdating(nOn != 0);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */