diff options
Diffstat (limited to 'sw')
-rw-r--r-- | sw/qa/uibase/uno/uno.cxx | 35 | ||||
-rw-r--r-- | sw/source/uibase/uno/loktxdoc.cxx | 62 |
2 files changed, 95 insertions, 2 deletions
diff --git a/sw/qa/uibase/uno/uno.cxx b/sw/qa/uibase/uno/uno.cxx index d2be66457b81..7a1b731634bd 100644 --- a/sw/qa/uibase/uno/uno.cxx +++ b/sw/qa/uibase/uno/uno.cxx @@ -475,6 +475,41 @@ CPPUNIT_TEST_FIXTURE(SwUibaseUnoTest, testGetBookmark) CPPUNIT_ASSERT_EQUAL(std::string("ZOTERO_BREF_1"), aBookmark.get<std::string>("name")); } +CPPUNIT_TEST_FIXTURE(SwUibaseUnoTest, testGetField) +{ + // Given a document with a refmark: + createSwDoc(); + uno::Sequence<css::beans::PropertyValue> aArgs = { + comphelper::makePropertyValue("TypeName", uno::Any(OUString("SetRef"))), + comphelper::makePropertyValue("Name", + uno::Any(OUString("ZOTERO_ITEM CSL_CITATION {} refmark"))), + comphelper::makePropertyValue("Content", uno::Any(OUString("content"))), + }; + dispatchCommand(mxComponent, ".uno:InsertField", aArgs); + + // When in the refmark with the cursor and getting the command value for .uno:Field: + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->SttEndDoc(/*bStt=*/false); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + tools::JsonWriter aJsonWriter; + std::string_view aCommand(".uno:Field?typeName=SetRef&namePrefix=ZOTERO_ITEM%20CSL_CITATION"); + auto pXTextDocument = dynamic_cast<SwXTextDocument*>(mxComponent.get()); + pXTextDocument->getCommandValues(aJsonWriter, aCommand); + + // Then make sure we find the inserted refmark: + std::unique_ptr<char[], o3tl::free_delete> pJSON(aJsonWriter.extractData()); + std::stringstream aStream(pJSON.get()); + boost::property_tree::ptree aTree; + boost::property_tree::read_json(aStream, aTree); + boost::property_tree::ptree aBookmark = aTree.get_child("setRef"); + // Without the accompanying fix in place, this test would have failed with: + // - No such node (setRef) + // i.e. the returned JSON was an empty object. + CPPUNIT_ASSERT_EQUAL(std::string("ZOTERO_ITEM CSL_CITATION {} refmark"), + aBookmark.get<std::string>("name")); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/uno/loktxdoc.cxx b/sw/source/uibase/uno/loktxdoc.cxx index 44b72d4f1eae..6742c819c899 100644 --- a/sw/source/uibase/uno/loktxdoc.cxx +++ b/sw/source/uibase/uno/loktxdoc.cxx @@ -326,6 +326,58 @@ void GetFields(tools::JsonWriter& rJsonWriter, SwDocShell* pDocShell, } } +/// Implements getCommandValues(".uno:Field"). +/// +/// Parameters: +/// +/// - typeName: field type condition to not return all fields +/// - namePrefix: field name prefix to not return all fields +void GetField(tools::JsonWriter& rJsonWriter, SwDocShell* pDocShell, + const std::map<OUString, OUString>& rArguments) +{ + OUString aTypeName; + { + auto it = rArguments.find("typeName"); + if (it != rArguments.end()) + { + aTypeName = it->second; + } + } + // See SwFieldTypeFromString(). + if (aTypeName != "SetRef") + { + return; + } + + OUString aNamePrefix; + { + auto it = rArguments.find("namePrefix"); + if (it != rArguments.end()) + { + aNamePrefix = it->second; + } + } + + SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); + SwPosition& rCursor = *pWrtShell->GetCursor()->GetPoint(); + SwTextNode* pTextNode = rCursor.GetNode().GetTextNode(); + std::vector<SwTextAttr*> aAttrs + = pTextNode->GetTextAttrsAt(rCursor.GetContentIndex(), RES_TXTATR_REFMARK); + tools::ScopedJsonWriterNode aRefmark = rJsonWriter.startNode("setRef"); + if (aAttrs.empty()) + { + return; + } + + const SwFormatRefMark& rRefmark = aAttrs[0]->GetRefMark(); + if (!rRefmark.GetRefName().startsWith(aNamePrefix)) + { + return; + } + + rJsonWriter.put("name", rRefmark.GetRefName()); +} + /// Implements getCommandValues(".uno:Sections"). /// /// Parameters: @@ -361,8 +413,9 @@ void GetSections(tools::JsonWriter& rJsonWriter, SwDocShell* pDocShell, bool SwXTextDocument::supportsCommand(std::u16string_view rCommand) { static const std::initializer_list<std::u16string_view> vForward - = { u"TextFormFields", u"TextFormField", u"SetDocumentProperties", u"Bookmarks", u"Fields", - u"Sections", u"Bookmark" }; + = { u"TextFormFields", u"TextFormField", u"SetDocumentProperties", + u"Bookmarks", u"Fields", u"Sections", + u"Bookmark", u"Field" }; return std::find(vForward.begin(), vForward.end(), rCommand) != vForward.end(); } @@ -378,6 +431,7 @@ void SwXTextDocument::getCommandValues(tools::JsonWriter& rJsonWriter, std::stri static constexpr OStringLiteral aFields(".uno:Fields"); static constexpr OStringLiteral aSections(".uno:Sections"); static constexpr OStringLiteral aBookmark(".uno:Bookmark"); + static constexpr OStringLiteral aField(".uno:Field"); INetURLObject aParser(OUString::fromUtf8(rCommand)); OUString aArguments = aParser.GetParam(); @@ -429,6 +483,10 @@ void SwXTextDocument::getCommandValues(tools::JsonWriter& rJsonWriter, std::stri { GetBookmark(rJsonWriter, m_pDocShell, aMap); } + else if (o3tl::starts_with(rCommand, aField)) + { + GetField(rJsonWriter, m_pDocShell, aMap); + } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |