summaryrefslogtreecommitdiffstats
path: root/sw/source/ui/index/cntex.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/index/cntex.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/index/cntex.cxx')
-rw-r--r--sw/source/ui/index/cntex.cxx395
1 files changed, 395 insertions, 0 deletions
diff --git a/sw/source/ui/index/cntex.cxx b/sw/source/ui/index/cntex.cxx
new file mode 100644
index 0000000000..d2e6b751cf
--- /dev/null
+++ b/sw/source/ui/index/cntex.cxx
@@ -0,0 +1,395 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * 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 <com/sun/star/text/XDocumentIndexesSupplier.hpp>
+#include <com/sun/star/text/XTextSectionsSupplier.hpp>
+#include <com/sun/star/text/XDependentTextField.hpp>
+#include <com/sun/star/text/XDocumentIndex.hpp>
+#include <com/sun/star/text/ChapterFormat.hpp>
+#include <com/sun/star/text/XTextSection.hpp>
+#include <com/sun/star/beans/PropertyValues.hpp>
+#include <com/sun/star/ucb/XCommandEnvironment.hpp>
+#include <comphelper/string.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <tools/UnitConversion.hxx>
+#include <comphelper/diagnose_ex.hxx>
+#include <wrtsh.hxx>
+#include <view.hxx>
+#include <cnttab.hxx>
+#include <unoprnms.hxx>
+#include <unotools.hxx>
+#include <unotxdoc.hxx>
+#include <docsh.hxx>
+
+#include <SwStyleNameMapper.hxx>
+#include <swuicnttab.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::text;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::ucb;
+using namespace ::com::sun::star::uno;
+using namespace com::sun::star::ui::dialogs;
+
+static void lcl_SetProp( uno::Reference< XPropertySetInfo > const & xInfo,
+ uno::Reference< XPropertySet > const & xProps,
+ OUString const & aPropName, const OUString& rValue)
+{
+ if(xInfo->hasPropertyByName(aPropName))
+ {
+ uno::Any aValue;
+ aValue <<= rValue;
+ xProps->setPropertyValue(aPropName, aValue);
+ }
+}
+
+static void lcl_SetProp( uno::Reference< XPropertySetInfo > const & xInfo,
+ uno::Reference< XPropertySet > const & xProps,
+ OUString const & aPropName, sal_Int16 nValue )
+{
+ if(xInfo->hasPropertyByName(aPropName))
+ {
+ uno::Any aValue;
+ aValue <<= nValue;
+ xProps->setPropertyValue(aPropName, aValue);
+ }
+}
+
+static void lcl_SetBOOLProp(
+ uno::Reference< beans::XPropertySetInfo > const & xInfo,
+ uno::Reference< beans::XPropertySet > const & xProps,
+ OUString const & aPropName, bool bValue )
+{
+ if(xInfo->hasPropertyByName(aPropName))
+ {
+ xProps->setPropertyValue(aPropName, Any(bValue));
+ }
+}
+
+IMPL_LINK_NOARG(SwMultiTOXTabDialog, CreateExample_Hdl, SwOneExampleFrame&, void)
+{
+ try
+ {
+ uno::Reference< frame::XModel > & xModel = m_xExampleFrame->GetModel();
+ auto pDoc = comphelper::getFromUnoTunnel<SwXTextDocument>(xModel);
+
+ if( pDoc )
+ pDoc->GetDocShell()->LoadStyles_( *m_rWrtShell.GetView().GetDocShell(), true );
+
+ uno::Reference< text::XTextSectionsSupplier > xSectionSupplier(
+ xModel, uno::UNO_QUERY);
+ uno::Reference< container::XNameAccess > xSections =
+ xSectionSupplier->getTextSections();
+
+ for(int i = 0; i < 7; ++i )
+ {
+ OUString sTmp = "IndexSection_" + OUString::number(i);
+ uno::Any aSection = xSections->getByName( sTmp );
+ aSection >>= m_vTypeData[i].m_oIndexSections->xContainerSection;
+ }
+ uno::Reference< text::XDocumentIndexesSupplier > xIdxSupp(xModel, uno::UNO_QUERY);
+ uno::Reference< container::XIndexAccess > xIdxs = xIdxSupp->getDocumentIndexes();
+ int n = xIdxs->getCount();
+ while(n)
+ {
+ n--;
+ uno::Any aIdx = xIdxs->getByIndex(n);
+ uno::Reference< text::XDocumentIndex > xIdx;
+ aIdx >>= xIdx;
+ xIdx->dispose();
+ }
+ CreateOrUpdateExample(m_eCurrentTOXType.eType);
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sw", "::CreateExample()");
+ }
+}
+
+void SwMultiTOXTabDialog::CreateOrUpdateExample(
+ TOXTypes nTOXIndex, sal_uInt16 nPage, sal_uInt16 nCurrentLevel)
+{
+ if(!m_xExampleFrame || !m_xExampleFrame->IsInitialized())
+ return;
+
+ try
+ {
+ static const char* IndexServiceNames[] =
+ {
+ "com.sun.star.text.DocumentIndex",
+ "com.sun.star.text.UserIndex",
+ "com.sun.star.text.ContentIndex",
+ "com.sun.star.text.IllustrationsIndex",
+ "com.sun.star.text.ObjectIndex",
+ "com.sun.star.text.TableIndex",
+ "com.sun.star.text.Bibliography"
+ };
+
+ OSL_ENSURE(m_vTypeData[nTOXIndex].m_oIndexSections &&
+ m_vTypeData[nTOXIndex].m_oIndexSections->xContainerSection.is(),
+ "Section not created");
+ uno::Reference< frame::XModel > & xModel = m_xExampleFrame->GetModel();
+ bool bInitialCreate = true;
+ if(!m_vTypeData[nTOXIndex].m_oIndexSections->xDocumentIndex.is())
+ {
+ bInitialCreate = true;
+ if(!m_vTypeData[nTOXIndex].m_oIndexSections->xContainerSection.is())
+ throw uno::RuntimeException();
+ uno::Reference< text::XTextRange > xAnchor = m_vTypeData[nTOXIndex].m_oIndexSections->xContainerSection->getAnchor();
+ xAnchor = xAnchor->getStart();
+ uno::Reference< text::XTextCursor > xCursor = xAnchor->getText()->createTextCursorByRange(xAnchor);
+
+ uno::Reference< lang::XMultiServiceFactory > xFact(xModel, uno::UNO_QUERY);
+
+ OUString sIndexTypeName(OUString::createFromAscii( IndexServiceNames[
+ nTOXIndex <= TOX_AUTHORITIES ? nTOXIndex : TOX_USER] ));
+ m_vTypeData[nTOXIndex].m_oIndexSections->xDocumentIndex.set(xFact->createInstance(sIndexTypeName), uno::UNO_QUERY);
+ uno::Reference< text::XTextContent > xContent = m_vTypeData[nTOXIndex].m_oIndexSections->xDocumentIndex;
+ xCursor->getText()->insertTextContent(xCursor, xContent, false);
+ }
+ for(sal_uInt16 i = 0 ; i <= TOX_AUTHORITIES; i++)
+ {
+ uno::Reference< beans::XPropertySet > xSectPr(m_vTypeData[i].m_oIndexSections->xContainerSection, uno::UNO_QUERY);
+ if(xSectPr.is())
+ {
+ xSectPr->setPropertyValue(UNO_NAME_IS_VISIBLE, Any(i == nTOXIndex));
+ }
+ }
+ // set properties
+ uno::Reference< beans::XPropertySet > xIdxProps(m_vTypeData[nTOXIndex].m_oIndexSections->xDocumentIndex, uno::UNO_QUERY);
+ uno::Reference< beans::XPropertySetInfo > xInfo = xIdxProps->getPropertySetInfo();
+ SwTOXDescription& rDesc = GetTOXDescription(m_eCurrentTOXType);
+ SwTOIOptions nIdxOptions = rDesc.GetIndexOptions();
+ if(bInitialCreate || !nPage || nPage == TOX_PAGE_SELECT)
+ {
+ //title
+ if(rDesc.GetTitle())
+ lcl_SetProp(xInfo, xIdxProps, UNO_NAME_TITLE, *rDesc.GetTitle());
+
+ //stylenames
+ SwTOXElement nContentOptions = rDesc.GetContentOptions();
+ if(xInfo->hasPropertyByName(UNO_NAME_LEVEL_PARAGRAPH_STYLES))
+ {
+ bool bOn( nContentOptions&SwTOXElement::Template );
+ uno::Any aStyleNames(xIdxProps->getPropertyValue(UNO_NAME_LEVEL_PARAGRAPH_STYLES));
+ uno::Reference< container::XIndexReplace > xAcc;
+ aStyleNames >>= xAcc;
+
+ for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
+ {
+ OUString sLevel;
+ if(bOn)
+ sLevel = rDesc.GetStyleNames(i);
+ const sal_Int32 nStyles =
+ comphelper::string::getTokenCount(sLevel, TOX_STYLE_DELIMITER);
+ uno::Sequence<OUString> aStyles(nStyles);
+ OUString* pArr = aStyles.getArray();
+ sal_Int32 nPos {0};
+ for(sal_Int32 nStyle = 0; nStyle < nStyles; ++nStyle)
+ pArr[nStyle] = sLevel.getToken(0, TOX_STYLE_DELIMITER, nPos);
+ uno::Any aAny(&aStyles, cppu::UnoType<uno::Sequence<OUString>>::get());
+ xAcc->replaceByIndex(i, aAny);
+ }
+ }
+ lcl_SetProp(xInfo, xIdxProps, UNO_NAME_LEVEL, static_cast<sal_Int16>(rDesc.GetLevel()));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_MARKS, bool(nContentOptions & SwTOXElement::Mark ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_OUTLINE, bool(nContentOptions & SwTOXElement::OutlineLevel));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_EMBEDDED_OBJECTS,bool(nContentOptions & SwTOXElement::Ole ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_TABLES , bool(nContentOptions & SwTOXElement::Table ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_GRAPHIC_OBJECTS, bool(nContentOptions & SwTOXElement::Graphic ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_TEXT_FRAMES, bool(nContentOptions & SwTOXElement::Frame ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_LABELS, bool(nContentOptions & SwTOXElement::Sequence ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_HIDE_TAB_LEADER_AND_PAGE_NUMBERS, bool(nContentOptions & SwTOXElement::TableLeader ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_TAB_IN_TOC, bool(nContentOptions & SwTOXElement::TableInToc ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_TOC_NEWLINE, bool(nContentOptions & SwTOXElement::Newline));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_TOC_PARAGRAPH_OUTLINE_LEVEL, bool(nContentOptions & SwTOXElement::ParagraphOutlineLevel));
+
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_CHAPTER, rDesc.IsFromChapter());
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_IS_PROTECTED, rDesc.IsReadonly());
+
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_COMBINED_ENTRIES, bool(nIdxOptions & SwTOIOptions::SameEntry ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_P_P, bool(nIdxOptions & SwTOIOptions::FF ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_IS_CASE_SENSITIVE, bool(nIdxOptions & SwTOIOptions::CaseSensitive ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_KEY_AS_ENTRY, bool(nIdxOptions & SwTOIOptions::KeyAsEntry ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_ALPHABETICAL_SEPARATORS, bool(nIdxOptions & SwTOIOptions::AlphaDelimiter));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_DASH, bool(nIdxOptions & SwTOIOptions::Dash ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_UPPER_CASE, bool(nIdxOptions & SwTOIOptions::InitialCaps ));
+
+ OUString aTmpName( SwStyleNameMapper::GetSpecialExtraProgName( rDesc.GetSequenceName() ) );
+ lcl_SetProp(xInfo, xIdxProps, UNO_NAME_LABEL_CATEGORY, aTmpName );
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_LABELS, !rDesc.IsCreateFromObjectNames());
+
+ sal_Int16 nSet = text::ChapterFormat::NAME_NUMBER;
+ switch (rDesc.GetCaptionDisplay())
+ {
+ case CAPTION_COMPLETE: nSet = text::ChapterFormat::NAME_NUMBER;break;
+ case CAPTION_NUMBER : nSet = text::ChapterFormat::NUMBER; break;
+ case CAPTION_TEXT : nSet = text::ChapterFormat::NAME; break;
+ }
+ lcl_SetProp(xInfo, xIdxProps, UNO_NAME_LABEL_DISPLAY_TYPE, nSet);
+
+ SwTOOElements nOLEOptions = rDesc.GetOLEOptions();
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_STAR_MATH, bool(SwTOOElements::Math &nOLEOptions ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_STAR_CHART, bool(SwTOOElements::Chart &nOLEOptions ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_STAR_CALC, bool(SwTOOElements::Calc &nOLEOptions ));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_STAR_DRAW, bool(SwTOOElements::DrawImpress&nOLEOptions));
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_OTHER_EMBEDDED_OBJECTS, bool(SwTOOElements::Other & nOLEOptions));
+ }
+ const SwForm* pForm = GetForm(m_eCurrentTOXType);
+ if(bInitialCreate || !nPage || nPage == TOX_PAGE_ENTRY)
+ {
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_IS_COMMA_SEPARATED, pForm->IsCommaSeparated());
+ lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_ALPHABETICAL_SEPARATORS, bool(nIdxOptions&SwTOIOptions::AlphaDelimiter));
+ const bool bUseCurrent = nCurrentLevel < pForm->GetFormMax();
+ const sal_uInt16 nStartLevel = bUseCurrent ? nCurrentLevel : 0;
+ const sal_uInt16 nEndLevel = bUseCurrent ? nCurrentLevel : pForm->GetFormMax() - 1;
+ if(xInfo->hasPropertyByName(UNO_NAME_LEVEL_FORMAT))
+ {
+ for(sal_uInt16 nCurrLevel = nStartLevel; nCurrLevel <= nEndLevel; nCurrLevel++)
+ {
+ OUString sTokenType;
+ uno::Sequence< beans::PropertyValues> aSequPropVals(10);
+ tools::Long nTokenIndex = 0;
+ tools::Long nParamCount = 2;
+
+ // #i24377#
+ SwFormTokens aPattern = pForm->GetPattern(nCurrLevel);
+
+ for(const auto& aToken : aPattern)
+ {
+ if( aSequPropVals.getLength() <= nTokenIndex)
+ aSequPropVals.realloc(nTokenIndex + 10);
+
+ switch(aToken.eTokenType)
+ {
+ case TOKEN_ENTRY_NO :
+ sTokenType = "TokenEntryNumber";
+ // numbering for content index
+ break;
+ case TOKEN_ENTRY_TEXT :
+ case TOKEN_ENTRY :
+ sTokenType = "TokenEntryText";
+ break;
+ case TOKEN_TAB_STOP :
+ nParamCount += 3;
+ sTokenType = "TokenTabStop";
+ break;
+ case TOKEN_TEXT :
+ sTokenType = "TokenText";
+ nParamCount += 1;
+ break;
+ case TOKEN_PAGE_NUMS :
+ sTokenType = "TokenPageNumber";
+ break;
+ case TOKEN_CHAPTER_INFO :
+ sTokenType = "TokenChapterInfo";
+ break;
+ case TOKEN_LINK_START :
+ sTokenType = "TokenHyperlinkStart";
+ break;
+ case TOKEN_LINK_END :
+ sTokenType = "TokenHyperlinkEnd";
+ break;
+ case TOKEN_AUTHORITY :
+ {
+ sTokenType = "TokenBibliographyDataField";
+ }
+ break;
+ default:; //prevent warning
+ }
+ beans::PropertyValues aPropVals(nParamCount);
+ beans::PropertyValue* pPropValArr = aPropVals.getArray();
+ pPropValArr[0].Name = "TokenType";
+ pPropValArr[0].Value <<= sTokenType;
+ pPropValArr[1].Name = "CharacterStyleName";
+ pPropValArr[1].Value <<= aToken.sCharStyleName;
+ if(TOKEN_TAB_STOP == aToken.eTokenType)
+ {
+ pPropValArr[2].Name = "TabStopRightAligned";
+ pPropValArr[2].Value <<= SvxTabAdjust::End == aToken.eTabAlign;
+ pPropValArr[3].Name = "TabStopFillCharacter";
+ pPropValArr[3].Value <<= OUString(aToken.cTabFillChar);
+ pPropValArr[4].Name = "TabStopPosition";
+ SwTwips nTempPos = aToken.nTabStopPosition >= 0 ?
+ aToken.nTabStopPosition : 0;
+ nTempPos = convertTwipToMm100(nTempPos);
+ pPropValArr[4].Value <<= static_cast<sal_Int32>(nTempPos);
+ }
+ else if(TOKEN_TEXT == aToken.eTokenType)
+ {
+ pPropValArr[2].Name = "Text";
+ pPropValArr[2].Value <<= aToken.sText;
+ }
+ beans::PropertyValues* pValues = aSequPropVals.getArray();
+ pValues[nTokenIndex] = aPropVals;
+ nTokenIndex++;
+ }
+ aSequPropVals.realloc(nTokenIndex);
+
+ uno::Any aFormatAccess = xIdxProps->getPropertyValue(UNO_NAME_LEVEL_FORMAT);
+ OSL_ENSURE(aFormatAccess.getValueType() == cppu::UnoType<container::XIndexReplace>::get(),
+ "wrong property type");
+
+ uno::Reference< container::XIndexReplace > xFormatAccess;
+ aFormatAccess >>= xFormatAccess;
+ uno::Any aLevelProp(&aSequPropVals, cppu::UnoType<uno::Sequence<beans::PropertyValues>>::get());
+ xFormatAccess->replaceByIndex(nCurrLevel, aLevelProp);
+ }
+ }
+ }
+ if(bInitialCreate || !nPage || nPage == TOX_PAGE_STYLES)
+ {
+ lcl_SetProp(xInfo, xIdxProps, "ParaStyleHeading", pForm->GetTemplate(0));
+ sal_uInt16 nOffset = 0;
+ sal_uInt16 nEndLevel = 2;
+ switch(m_eCurrentTOXType.eType)
+ {
+ case TOX_INDEX:
+ {
+ nOffset = 1;
+ nEndLevel = 4;
+ lcl_SetProp(xInfo, xIdxProps, "ParaStyleSeparator", pForm->GetTemplate(1));
+ }
+ break;
+ case TOX_CONTENT :
+ nEndLevel = 11;
+ break;
+ default:; //prevent warning
+ }
+ for(sal_uInt16 i = 1; i < nEndLevel; i++)
+ {
+ lcl_SetProp(xInfo,
+ xIdxProps,
+ "ParaStyleLevel" + OUString::number( i ),
+ pForm->GetTemplate(i + nOffset));
+ }
+ }
+ m_vTypeData[nTOXIndex].m_oIndexSections->xDocumentIndex->update();
+
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sw", "::CreateExample()");
+ }
+ m_xExampleFrame->Invalidate();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */