tdf#151548 vba FormFields: Add basic word::XCheckBox support
[LibreOffice.git] / sw / source / ui / vba / vbaformfield.cxx
blob50008fc9c2b7c33801d868bb950e81fd9bac827b
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <ooo/vba/word/WdFieldType.hpp>
22 #include <sal/log.hxx>
24 #include <doc.hxx>
25 #include <docsh.hxx>
27 #include "vbaformfield.hxx"
28 #include "vbaformfieldcheckbox.hxx"
29 #include "wordvbahelper.hxx"
31 using namespace ::ooo::vba;
32 using namespace ::com::sun::star;
34 /**
35 * Information about the method and properties of FormFields was gathered from
36 * https://www.codevba.com/Word/FormField.htm
38 * FormFields are inline text objects that are only found in MS Word.
39 * They cannot be created in Excel or in Calc.
41 * There are three specific kinds of FormFields: CheckBox, DropDown, and TextInput.
43 SwVbaFormField::SwVbaFormField(const uno::Reference<ooo::vba::XHelperInterface>& rParent,
44 const uno::Reference<uno::XComponentContext>& rContext,
45 const uno::Reference<frame::XModel>& xModel,
46 sw::mark::IFieldmark& rFormField)
47 : SwVbaFormField_BASE(rParent, rContext)
48 , mxModel(std::move(xModel))
49 , m_rFormField(rFormField)
53 SwVbaFormField::~SwVbaFormField() {}
55 uno::Any SAL_CALL SwVbaFormField::CheckBox()
57 return uno::Any(uno::Reference<word::XCheckBox>(
58 new SwVbaFormFieldCheckBox(mxParent, mxContext, m_rFormField)));
61 uno::Any SAL_CALL SwVbaFormField::DropDown()
63 // return uno::Any(uno::Reference<word::XDropDown>(
64 // new SwVbaFormFieldDropDown(mxParent, mxContext, m_rFormField)));
65 return uno::Any();
68 uno::Any SAL_CALL SwVbaFormField::TextInput()
70 // return uno::Any(uno::Reference<word::XTextInput>(
71 // new SwVbaFormFieldTextInput(mxParent, mxContext, m_rFormField)));
72 return uno::Any();
75 uno::Any SAL_CALL SwVbaFormField::Previous()
77 SwDoc* pDoc = word::getDocShell(mxModel)->GetDoc();
78 if (!pDoc)
79 return uno::Any();
81 const IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess();
82 if (!pMarkAccess)
83 return uno::Any();
85 sw::mark::IFieldmark* pFieldMark = pMarkAccess->getFieldmarkBefore(m_rFormField.GetMarkPos());
87 // DateFields are a LO specialty, and do not exist natively in MS documents. Ignore if added...
88 auto pDateField = dynamic_cast<sw::mark::IDateFieldmark*>(pFieldMark);
89 while (pDateField)
91 pFieldMark = pMarkAccess->getFieldmarkBefore(pDateField->GetMarkPos());
92 pDateField = dynamic_cast<sw::mark::IDateFieldmark*>(pFieldMark);
95 if (!pFieldMark)
96 return uno::Any();
98 return uno::Any(uno::Reference<word::XFormField>(
99 new SwVbaFormField(mxParent, mxContext, mxModel, *pFieldMark)));
102 uno::Any SAL_CALL SwVbaFormField::Next()
104 SwDoc* pDoc = word::getDocShell(mxModel)->GetDoc();
105 if (!pDoc)
106 return uno::Any();
108 const IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess();
109 if (!pMarkAccess)
110 return uno::Any();
112 sw::mark::IFieldmark* pFieldMark = pMarkAccess->getFieldmarkAfter(m_rFormField.GetMarkPos());
114 // DateFields are a LO specialty, and do not exist natively in MS documents. Ignore if added...
115 auto pDateField = dynamic_cast<sw::mark::IDateFieldmark*>(pFieldMark);
116 while (pDateField)
118 pFieldMark = pMarkAccess->getFieldmarkAfter(pDateField->GetMarkPos());
119 pDateField = dynamic_cast<sw::mark::IDateFieldmark*>(pFieldMark);
122 if (!pFieldMark)
123 return uno::Any();
125 return uno::Any(uno::Reference<word::XFormField>(
126 new SwVbaFormField(mxParent, mxContext, mxModel, *pFieldMark)));
129 uno::Any SAL_CALL SwVbaFormField::Range()
131 SAL_INFO("sw.vba", "SwVbaFormField::getRange stub");
132 return uno::Any();
135 OUString SwVbaFormField::getDefaultPropertyName() { return "Type"; }
137 sal_Int32 SwVbaFormField::getType()
139 IDocumentMarkAccess::MarkType aType = IDocumentMarkAccess::GetType(m_rFormField);
140 if (aType == IDocumentMarkAccess::MarkType::CHECKBOX_FIELDMARK)
141 return ooo::vba::word::WdFieldType::wdFieldFormCheckBox;
142 else if (aType == IDocumentMarkAccess::MarkType::TEXT_FIELDMARK)
143 return ooo::vba::word::WdFieldType::wdFieldFormTextInput;
144 return ooo::vba::word::WdFieldType::wdFieldFormDropDown;
147 sal_Bool SwVbaFormField::getCalculateOnExit()
149 SAL_INFO("sw.vba", "SwVbaFormField::getCalculateOnExit stub");
150 return false;
153 void SwVbaFormField::setCalculateOnExit(sal_Bool /*bSet*/)
155 SAL_INFO("sw.vba", "SwVbaFormField::setCalculateOnExit stub");
158 sal_Bool SwVbaFormField::getEnabled()
160 SAL_INFO("sw.vba", "SwVbaFormField::getEnabled stub");
161 return true;
164 void SwVbaFormField::setEnabled(sal_Bool /*bSet*/)
166 SAL_INFO("sw.vba", "SwVbaFormField::setEnabled stub");
169 OUString SwVbaFormField::getEntryMacro()
171 OUString sMacro;
172 (*m_rFormField.GetParameters())["EntryMacro"] >>= sMacro;
173 return sMacro;
176 void SwVbaFormField::setEntryMacro(const OUString& rSet)
178 (*m_rFormField.GetParameters())["EntryMacro"] <<= rSet;
181 OUString SwVbaFormField::getExitMacro()
183 OUString sMacro;
184 (*m_rFormField.GetParameters())["ExitMacro"] >>= sMacro;
185 return sMacro;
188 void SwVbaFormField::setExitMacro(const OUString& rSet)
190 (*m_rFormField.GetParameters())["ExitMacro"] <<= rSet;
193 OUString SwVbaFormField::getHelpText() { return m_rFormField.GetFieldHelptext(); }
195 void SwVbaFormField::setHelpText(const OUString& rSet) { m_rFormField.SetFieldHelptext(rSet); }
197 sal_Bool SwVbaFormField::getOwnHelp()
199 SAL_INFO("sw.vba", "SwVbaFormField::getOwnHelp stub");
200 return true;
203 void SwVbaFormField::setOwnHelp(sal_Bool /*bSet*/)
205 SAL_INFO("sw.vba", "SwVbaFormField::setOwnHelp stub");
208 OUString SwVbaFormField::getName() { return m_rFormField.GetName(); }
210 void SwVbaFormField::setName(const OUString& rSet)
212 SAL_WARN("sw.vba", "SwVbaFormField::setName[" << rSet << "] stub");
215 OUString SwVbaFormField::getResult() { return m_rFormField.GetContent(); }
217 void SwVbaFormField::setResult(const OUString& rSet)
219 if (dynamic_cast<sw::mark::ICheckboxFieldmark*>(&m_rFormField))
220 m_rFormField.ReplaceContent("false");
221 else
222 m_rFormField.ReplaceContent(rSet);
225 OUString SwVbaFormField::getStatusText()
227 SAL_INFO("sw.vba", "SwVbaFormField::getStatusText stub");
228 return OUString();
231 void SwVbaFormField::setStatusText(const OUString& rSet)
233 SAL_INFO("sw.vba", "SwVbaFormField::setStatusText[" << rSet << "] stub");
236 sal_Bool SwVbaFormField::getOwnStatus()
238 SAL_INFO("sw.vba", "SwVbaFormField::getOwnStatus stub");
239 return true;
242 void SwVbaFormField::setOwnStatus(sal_Bool /*bSet*/)
244 SAL_INFO("sw.vba", "SwVbaFormField::setOwnStatus stub");
247 OUString SwVbaFormField::getServiceImplName() { return "SwVbaFormField"; }
249 uno::Sequence<OUString> SwVbaFormField::getServiceNames()
251 static uno::Sequence<OUString> const aServiceNames{ "ooo.vba.word.FormField" };
252 return aServiceNames;
255 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */