/* -*- 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 .
*/
case FN_INSERT_REF_FIELD:
{
SfxViewFrame& rVFrame = GetView().GetViewFrame(); if (!rVFrame.HasChildWindow(FN_INSERT_FIELD))
rVFrame.ToggleChildWindow(FN_INSERT_FIELD); // Show dialog
// Switch Fielddlg at a new TabPage
sal_uInt16 nId = SwFieldDlgWrapper::GetChildWindowId();
SwFieldDlgWrapper *pWrp = static_cast<SwFieldDlgWrapper*>(rVFrame.GetChildWindow(nId)); if (pWrp)
pWrp->ShowReferencePage();
rReq.Ignore();
} break; case FN_DELETE_COMMENT:
{ const SvxPostItIdItem* pIdItem = rReq.GetArg<SvxPostItIdItem>(SID_ATTR_POSTIT_ID); if (pIdItem && !pIdItem->GetValue().isEmpty() && GetView().GetPostItMgr())
{
sal_uInt32 nPostItId = pIdItem->GetValue().toUInt32(); if (lcl_canUserModifyAnnotation(GetView(), nPostItId))
GetView().GetPostItMgr()->Delete(nPostItId);
} elseif ( GetView().GetPostItMgr() &&
GetView().GetPostItMgr()->HasActiveSidebarWin() )
{
sw::annotation::SwAnnotationWin* pAnnotationWin
= GetView().GetPostItMgr()->GetActiveSidebarWin(); if (lcl_canUserModifyAnnotation(GetView(), pAnnotationWin))
GetView().GetPostItMgr()->DeleteActiveSidebarWin();
} break;
} case FN_DELETE_COMMENT_THREAD:
{ const SvxPostItIdItem* pIdItem = rReq.GetArg<SvxPostItIdItem>(SID_ATTR_POSTIT_ID); if (pIdItem && !pIdItem->GetValue().isEmpty() && GetView().GetPostItMgr())
{
sal_uInt32 nPostItId = pIdItem->GetValue().toUInt32(); if (lcl_canUserModifyAnnotation(GetView(), nPostItId))
GetView().GetPostItMgr()->DeleteCommentThread(nPostItId);
} elseif (GetView().GetPostItMgr() && GetView().GetPostItMgr()->HasActiveSidebarWin())
{
sw::annotation::SwAnnotationWin* pAnnotationWin
= GetView().GetPostItMgr()->GetActiveSidebarWin(); if (lcl_canUserModifyAnnotation(GetView(), pAnnotationWin))
GetView().GetPostItMgr()->DeleteActiveSidebarWin();
} break;
} case FN_RESOLVE_NOTE:
{ const SvxPostItIdItem* pIdItem = rReq.GetArg<SvxPostItIdItem>(SID_ATTR_POSTIT_ID); if (pIdItem && !pIdItem->GetValue().isEmpty() && GetView().GetPostItMgr())
{
GetView().GetPostItMgr()->ToggleResolved(pIdItem->GetValue().toUInt32());
} break;
} case FN_RESOLVE_NOTE_THREAD:
{ const SvxPostItIdItem* pIdItem = rReq.GetArg<SvxPostItIdItem>(SID_ATTR_POSTIT_ID); if (pIdItem && !pIdItem->GetValue().isEmpty() && GetView().GetPostItMgr())
{
GetView().GetPostItMgr()->ToggleResolvedForThread(pIdItem->GetValue().toUInt32());
} break;
} case FN_DELETE_ALL_NOTES: if ( GetView().GetPostItMgr() )
GetView().GetPostItMgr()->Delete(); break; case FN_FORMAT_ALL_NOTES:
{
SwPostItMgr* pPostItMgr = GetView().GetPostItMgr(); if (pPostItMgr)
pPostItMgr->ExecuteFormatAllDialog(GetView());
} break; case FN_DELETE_NOTE_AUTHOR:
{ const SfxStringItem* pNoteItem = rReq.GetArg<SfxStringItem>(nSlot); if (pNoteItem && GetView().GetPostItMgr()
&& lcl_canUserModifyAnnotation(GetView(), pNoteItem->GetValue()))
GetView().GetPostItMgr()->Delete(pNoteItem->GetValue());
} break; case FN_HIDE_NOTE: if ( GetView().GetPostItMgr() &&
GetView().GetPostItMgr()->HasActiveSidebarWin() )
{
GetView().GetPostItMgr()->HideActiveSidebarWin();
} break; case FN_HIDE_ALL_NOTES: if ( GetView().GetPostItMgr() )
GetView().GetPostItMgr()->Hide(); break; case FN_HIDE_NOTE_AUTHOR:
{ const SfxStringItem* pNoteItem = rReq.GetArg<SfxStringItem>(nSlot); if ( pNoteItem && GetView().GetPostItMgr() )
GetView().GetPostItMgr()->Hide( pNoteItem->GetValue() );
} break; case FN_REPLY:
{ const SvxPostItIdItem* pIdItem = rReq.GetArg<SvxPostItIdItem>(SID_ATTR_POSTIT_ID); if (pIdItem && !pIdItem->GetValue().isEmpty())
{
SwFieldType* pType = rSh.GetDoc()->getIDocumentFieldsAccess().GetFieldType(SwFieldIds::Postit, OUString(), false); if(pType->FindFormatForPostItId(pIdItem->GetValue().toUInt32()))
{ auto pMgr = GetView().GetPostItMgr(); auto pWin = pMgr->GetAnnotationWin(pIdItem->GetValue().toUInt32()); if(pWin)
{ if (const SvxPostItTextItem* pHtmlItem = rReq.GetArg<SvxPostItTextItem>(SID_ATTR_POSTIT_HTML))
{
SwDocShell* pDocSh = GetView().GetDocShell();
Outliner aOutliner(&pDocSh->GetPool(), OutlinerMode::TextObject);
SwPostItHelper::ImportHTML(aOutliner, pHtmlItem->GetValue()); if (std::optional<OutlinerParaObject> oPara = aOutliner.CreateParaObject())
pMgr->RegisterAnswer(oPara.value());
}
if (pRedline)
{ // In case of LOK and comment text is already provided, skip // dialog creation and just change the redline comment directly if (comphelper::LibreOfficeKit::isActive() && !sCommentText.isEmpty())
{
rSh.SetRedlineComment(sCommentText);
GetView().AttrChangedNotify(nullptr);
MaybeNotifyRedlineModification(const_cast<SwRangeRedline&>(*pRedline), pRedline->GetDoc()); break;
}
if (pActRed == pRedline)
{ // New cursor is at the beginning of the current redlines.
rSh.Pop(); // Throw old cursor away
rSh.Push();
pActRed = rSh.SelPrevRedline();
}
case FN_INSERT_FLD_DATE : case FN_INSERT_FLD_DATE_VAR:
{
nInsertType = SwFieldTypesEnum::Date;
nInsertSubType = nSlot == FN_INSERT_FLD_DATE ? 0 : 1;
bIsText = false; // use long date format for Hungarian
SwPaM* pCursorPos = rSh.GetCursor(); if( pCursorPos )
{
LanguageType nLang = pCursorPos->GetPoint()->GetNode().GetTextNode()->GetLang(pCursorPos->GetPoint()->GetContentIndex()); if (nLang == LANGUAGE_HUNGARIAN)
nInsertFormat = rSh.GetNumberFormatter()->GetFormatIndex(NF_DATE_SYSTEM_LONG, nLang);
} goto FIELD_INSERT;
} case FN_INSERT_FLD_TIME : case FN_INSERT_FLD_TIME_VAR:
nInsertType = SwFieldTypesEnum::Time;
nInsertSubType = nSlot == FN_INSERT_FLD_TIME ? 0 : 1;
bIsText = false; goto FIELD_INSERT; case FN_INSERT_FLD_PGNUMBER:
nInsertType = SwFieldTypesEnum::PageNumber;
nInsertFormat = SVX_NUM_PAGEDESC; // Like page template
bIsText = false; goto FIELD_INSERT; case FN_INSERT_FLD_PGCOUNT : case FN_INSERT_FLD_RANGE_PGCOUNT:
nInsertType = SwFieldTypesEnum::DocumentStatistics;
nInsertSubType = FN_INSERT_FLD_RANGE_PGCOUNT == nSlot ? 1 : 0;
bIsText = false;
nInsertFormat = SVX_NUM_PAGEDESC; goto FIELD_INSERT; case FN_INSERT_FLD_TOPIC :
nInsertType = SwFieldTypesEnum::DocumentInfo;
nInsertSubType = DI_SUBJECT; goto FIELD_INSERT; case FN_INSERT_FLD_TITLE :
nInsertType = SwFieldTypesEnum::DocumentInfo;
nInsertSubType = DI_TITLE; goto FIELD_INSERT; case FN_INSERT_FLD_AUTHOR :
nInsertType = SwFieldTypesEnum::DocumentInfo;
nInsertSubType = DI_CREATE|DI_SUB_AUTHOR;
FIELD_INSERT:
{ //format conversion should only be done for number formatter formats if(!nInsertFormat)
nInsertFormat = aFieldMgr.GetDefaultFormat(nInsertType, bIsText, rSh.GetNumberFormatter());
SwInsertField_Data aData(nInsertType, nInsertSubType,
OUString(), OUString(), nInsertFormat);
aFieldMgr.InsertField(aData);
rReq.Done();
} break;
case FN_INSERT_TEXT_FORMFIELD:
{
OUString aFieldType(ODF_FORMTEXT); const SfxStringItem* pFieldType = rReq.GetArg<SfxStringItem>(FN_PARAM_1); if (pFieldType)
{ // Allow overwriting the default type.
aFieldType = pFieldType->GetValue();
}
OUString aFieldCode; const SfxStringItem* pFieldCode = rReq.GetArg<SfxStringItem>(FN_PARAM_2); if (pFieldCode)
{ // Allow specifying a field code/command.
aFieldCode = pFieldCode->GetValue();
}
if (rSh.HasReadonlySel())
{ // Inform the user that the request has been ignored. auto xInfo = std::make_shared<weld::GenericDialogController>(
GetView().GetFrameWeld(), "modules/swriter/ui/inforeadonlydialog.ui", "InfoReadonlyDialog");
weld::DialogController::runAsync(xInfo, [](sal_Int32 /*nResult*/) {}); break;
}
SwPaM* pCursorPos = rSh.GetCursor(); if(pCursorPos)
{ // Insert five En Space into the text field so the field has extent
OUString aFieldResult(vEnSpaces); const SfxStringItem* pFieldResult = rReq.GetArg<SfxStringItem>(FN_PARAM_3); if (pFieldResult)
{ // Allow specifying a field result / expanded value.
aFieldResult = pFieldResult->GetValue();
}
const SfxStringItem* pWrapper = rReq.GetArg<SfxStringItem>(FN_PARAM_4); if (pWrapper)
{ // Wrap the fieldmark in the requested container instead of inserting it // directly at the cursor position.
OUString aWrapper = pWrapper->GetValue(); if (aWrapper == "Footnote")
{
rSh.InsertFootnote(OUString());
} elseif (aWrapper == "Endnote")
{ // It's important that there is no Start/EndAction() around this, so the // inner EndAction() triggers a layout update and the cursor can jump to the // created SwFootnoteFrame.
rSh.InsertFootnote(OUString(), /*bEndNote=*/true);
}
}
// Don't update the layout after inserting content and before deleting temporary // text nodes.
rSh.StartAction();
// Split node to remember where the start position is. bool bSuccess = rSh.GetDoc()->getIDocumentContentOperations().SplitNode(
*pCursorPos->GetPoint(), false); if(bSuccess)
{
SwPaM aFieldPam(*pCursorPos->GetPoint());
aFieldPam.Move(fnMoveBackward, GoInContent); if (pFieldResult)
{ // Paste HTML content.
SwTranslateHelper::PasteHTMLToPaM(rSh, pCursorPos, aFieldResult.toUtf8()); if (pCursorPos->GetPoint()->GetContentIndex() == 0)
{ // The paste created a last empty text node, remove it.
SwPaM aPam(*pCursorPos->GetPoint());
aPam.SetMark();
aPam.Move(fnMoveBackward, GoInContent);
rSh.GetDoc()->getIDocumentContentOperations().DeleteAndJoin(aPam);
}
} else
{ // Insert default placeholder.
rSh.GetDoc()->getIDocumentContentOperations().InsertString(*pCursorPos,
aFieldResult);
} // Undo the above SplitNode().
aFieldPam.SetMark();
aFieldPam.Move(fnMoveForward, GoInContent);
rSh.GetDoc()->getIDocumentContentOperations().DeleteAndJoin(aFieldPam);
*aFieldPam.GetMark() = *pCursorPos->GetPoint();
SwPaM* pCursorPos = rSh.GetCursor(); if(pCursorPos)
{ // Insert five enspaces into the text field so the field has extent bool bSuccess = rSh.GetDoc()->getIDocumentContentOperations().InsertString(*pCursorPos, vEnSpaces); if(bSuccess)
{
IDocumentMarkAccess* pMarksAccess = rSh.GetDoc()->getIDocumentMarkAccess();
SwPaM aFieldPam(pCursorPos->GetPoint()->GetNode(), pCursorPos->GetPoint()->GetContentIndex() - ODF_FORMFIELD_DEFAULT_LENGTH,
pCursorPos->GetPoint()->GetNode(), pCursorPos->GetPoint()->GetContentIndex());
sw::mark::Fieldmark* pFieldBM = pMarksAccess->makeFieldBookmark(aFieldPam, SwMarkName(), ODF_FORMDATE,
aFieldPam.Start());
// Use a default date format and language
sw::mark::Fieldmark::parameter_map_t* pParameters = pFieldBM->GetParameters();
SvNumberFormatter* pFormatter = rSh.GetDoc()->GetNumberFormatter();
sal_uInt32 nStandardFormat = pFormatter->GetStandardFormat(SvNumFormatType::DATE); const SvNumberformat* pFormat = pFormatter->GetEntry(nStandardFormat);
rSh.EndAction();
rSh.GetDoc()->GetIDocumentUndoRedo().EndUndo(SwUndoId::UPDATE_FORM_FIELDS, nullptr);
} break; case FN_DELETE_TEXT_FORMFIELDS:
{ // This deletes all fieldmarks that match the provided field type & field command prefix.
OUString aFieldType; const SfxStringItem* pFieldType = rReq.GetArg<SfxStringItem>(FN_PARAM_1); if (pFieldType)
{
aFieldType = pFieldType->GetValue();
}
OUString aFieldCommandPrefix; const SfxStringItem* pFieldCommandPrefix = rReq.GetArg<SfxStringItem>(FN_PARAM_2); if (pFieldCommandPrefix)
{
aFieldCommandPrefix = pFieldCommandPrefix->GetValue();
}
rSh.GetDoc()->GetIDocumentUndoRedo().StartUndo(SwUndoId::DELETE_FORM_FIELDS, nullptr);
rSh.StartAction();
IDocumentMarkAccess* pMarkAccess = rSh.GetDoc()->getIDocumentMarkAccess();
std::vector<sw::mark::MarkBase*> aRemovals; for (auto it = pMarkAccess->getFieldmarksBegin(); it != pMarkAccess->getFieldmarksEnd(); ++it)
{
sw::mark::Fieldmark* pFieldmark = *it;
assert(pFieldmark); if (pFieldmark->GetFieldname() != aFieldType)
{ continue;
}
if (!aFieldCommandPrefix.isEmpty())
{ auto itParam = pFieldmark->GetParameters()->find(ODF_CODE_PARAM); if (itParam == pFieldmark->GetParameters()->end())
{ continue;
}
// most printers can't print to paper edge - use arbitrary ~14pt as minimum if (nPageMargin > constTwips_5mm)
{ // reduce existing margin by the "Spacing"
nPageMargin -= constTwips_5mm;
// also reduce by the "Height" (as calculated from the font)
tools::Long nFontHeight = constTwips_5mm; // appropriate for 12pt font const OutputDevice* pOutDev = Application::GetDefaultDevice(); const SwViewShell* pViewSh
= rDoc.getIDocumentLayoutAccess().GetCurrentViewShell();
UIName sParaStyle(bHeader ? "Header" : "Footer");
SwTextFormatColl* pStyle = rDoc.FindTextFormatCollByName(sParaStyle); if (pStyle && pOutDev)
{
SwFont aFont(
&pStyle->GetAttrSet(), /*IDocumentSettingAccess=*/nullptr);
// sledgehammer approach: since the in-use-font (Latin/CTL/CKJ) // is not known, use the tallest of the three just to ensure fit.
sal_uInt16 nHeight = aFont.GetHeight(pViewSh, *pOutDev); // Latin
nPageMargin = std::max(nPageMargin, constTwips_5mm); if (bHeader)
aPageUL.SetUpper(nPageMargin); else
aPageUL.SetLower(nPageMargin);
aNewDesc.GetMaster().SetFormatAttr(aPageUL);
// force aggressively calculated font height as minimum to ensure // effective margin stays the same (instead of getting smaller)
SwFormatFrameSize aSize(rFormat.GetFrameSize());
aSize.SetHeightSizeType(SwFrameSize::Minimum); // frame size property includes both Spacing + Height
aSize.SetHeight(constTwips_5mm + nFontHeight);
rFormat.SetFormatAttr(aSize);
// in case the calculated font height isn't actually large enough, // eat into spacing first before pushing into the content area.
rFormat.SetFormatAttr(SwHeaderAndFooterEatSpacingItem(
RES_HEADER_FOOTER_EAT_SPACING, true));
}
}
// Might as well turn on margin mirroring too - if appropriate if (pDlg->GetMirrorOnEvenPages() && !bHeaderAlreadyOn && !bFooterAlreadyOn
&& !bIsSinglePage
&& (aNewDesc.ReadUseOn() & UseOnPage::Mirror) == UseOnPage::All)
{
aNewDesc.WriteUseOn(rDesc.ReadUseOn() | UseOnPage::Mirror);
}
}
constbool bCreateMirror = !bIsSinglePage && pDlg->GetMirrorOnEvenPages()
&& nMirrorPagesNeeded <= rSh.GetPageCnt(); if (bCreateMirror)
{ // Use different left/right header/footer if ((bHeader && rDesc.IsHeaderShared()) || (!bHeader && rDesc.IsFooterShared()))
{
bChangePageDesc = true; if (bHeader)
aNewDesc.ChgHeaderShare(/*Share=*/false); else
aNewDesc.ChgFooterShare(/*Share=*/false);
}
}
if (bChangePageDesc)
rSh.ChgPageDesc(nPageDescIndex, aNewDesc);
// Go to the header or footer insert position bool bInHF = false; bool bSkipMirror = true;
size_t nEvenPage = 0; if (bCreateMirror || !rSh.GetCurrFrame())
{ // Come here if Currframe can't be found, otherwise Goto*Text will crash. // Get*PageNum will also be invalid (0), so we have no idea where we are. // (Since not asking for mirror, the likelihood is that the bHeader is shared, // in which case it doesn't matter anyway, and we just hope for the best.) // Read the code in this block assuming that bCreateMirror is true.
// There are enough pages that there probably is a valid odd page. // However, that is not guaranteed: perhaps the page style switched, // or a blank page was forced, or some other complexity.
bInHF = rSh.SetCursorInHdFt(nPageDescIndex, bHeader, /*Even=*/true); if (bInHF)
{ // Remember valid EVEN page. Mirror it if also a valid ODD or FIRST page
nEvenPage = rSh.GetVirtPageNum();
assert (nEvenPage && "couldn't find page number. Use a bool instead");
}
bInHF = rSh.SetCursorInHdFt(nPageDescIndex, bHeader, /*Even=*/false); if (bInHF && nEvenPage)
{ // Even though the cursor may be on a FIRST page, // the user requested mirrored pages, and we have both ODD and EVEN, // so set page numbers on these two pages, and leave FIRST alone.
bSkipMirror = false;
} if (!bInHF)
{ // no ODD page, look for FIRST page
bInHF = rSh.SetCursorInHdFt(nPageDescIndex, bHeader, false, /*First=*/true); if (bInHF && nEvenPage)
{ // Unlikely but valid situation: EVEN and FIRST pages, but no ODD page. // In this case, the first header gets the specified page number // and the even header is mirrored, with an empty odd header, // as the user (somewhat) requested.
bSkipMirror = false;
}
}
assert((bInHF || nEvenPage) && "Impossible - why couldn't the move happen?");
assert((bInHF || nEvenPage == rSh.GetVirtPageNum()) && "Unexpected move");
} else
{ if (bHeader)
bInHF = rSh.GotoHeaderText(); else
bInHF = rSh.GotoFooterText();
assert(bInHF && "shouldn't have a problem going to text when no mirroring");
}
// Allow wizard to be re-run: delete previously wizard-inserted page number. // Now that the cursor may have moved to a different page, try delete again.
sBookmarkOddPage
= SwMarkName(sBookmarkName + OUString::number(rSh.GetVirtPageNum()));
ppMark = rIDMA.findMark(sBookmarkOddPage); if (ppMark != rIDMA.getAllMarksEnd() && *ppMark)
{
SwPaM aDeleteOldPageNum((*ppMark)->GetMarkStart(), (*ppMark)->GetMarkEnd());
rDoc.getIDocumentContentOperations().DeleteAndJoin(aDeleteOldPageNum);
}
// Insert new line if there is already text in header/footer if (pTextNode && !pTextNode->GetText().isEmpty())
{
rDoc.getIDocumentContentOperations().SplitNode(*rSh.GetCursor()->GetPoint(), false);
// Go back to start of header/footer if (bHeader)
rSh.GotoHeaderText(); else
rSh.GotoFooterText();
}
// Set alignment for the new line switch (pDlg->GetPageNumberAlignment())
{ case 0:
{
SvxAdjustItem aAdjustItem(SvxAdjust::Left, RES_PARATR_ADJUST);
rSh.SetAttrItem(aAdjustItem); break;
} case 1:
{
SvxAdjustItem aAdjustItem(SvxAdjust::Center, RES_PARATR_ADJUST);
rSh.SetAttrItem(aAdjustItem); break;
} case 2:
{
SvxAdjustItem aAdjustItem(SvxAdjust::Right, RES_PARATR_ADJUST);
rSh.SetAttrItem(aAdjustItem); break;
}
}
sal_Int32 nStartContentIndex = rSh.GetCursor()->Start()->GetContentIndex();
assert(!nStartContentIndex && "earlier split node if not empty, but not zero?");
// Mark inserted fields with a bookmark - so it can be found/removed if re-run
SwPaM aNewBookmarkPaM(*rSh.GetCursor()->Start());
aNewBookmarkPaM.SetMark();
assert(aNewBookmarkPaM.GetPointContentNode() && "only SetContent on content node");
aNewBookmarkPaM.Start()->SetContent(nStartContentIndex);
rIDMA.makeMark(aNewBookmarkPaM,
sBookmarkOddPage,
IDocumentMarkAccess::MarkType::BOOKMARK,
sw::mark::InsertMode::New);
// Mirror on the even pages if (!bSkipMirror && bCreateMirror
&& rSh.SetCursorInHdFt(nPageDescIndex, bHeader, /*Even=*/true))
{
assert(nEvenPage && "what? no even page and yet we got here?");
SwMarkName sBookmarkEvenPage(
sBookmarkName + OUString::number(rSh.GetVirtPageNum()));
ppMark = rIDMA.findMark(sBookmarkEvenPage); if (ppMark != rIDMA.getAllMarksEnd() && *ppMark)
{
SwPaM aDeleteOldPageNum((*ppMark)->GetMarkStart(), (*ppMark)->GetMarkEnd());
rDoc.getIDocumentContentOperations().DeleteAndJoin(aDeleteOldPageNum);
}
// Insert new line if there is already text in header/footer if (pTextNode && !pTextNode->GetText().isEmpty())
{
rDoc.getIDocumentContentOperations().SplitNode(
*rSh.GetCursor()->GetPoint(), false); // Go back to start of header/footer
rSh.SetCursorInHdFt(nPageDescIndex, bHeader, /*Even=*/true);
}
// mirror the adjustment
assert(pDlg->GetPageNumberAlignment() != 1 && "cannot have Center and bMirror");
SvxAdjust eAdjust = SvxAdjust::Left; if (!pDlg->GetPageNumberAlignment())
eAdjust = SvxAdjust::Right;
SvxAdjustItem aMirrorAdjustItem(eAdjust, RES_PARATR_ADJUST);
rSh.SetAttrItem(aMirrorAdjustItem);
--> --------------------
--> maximum size reached
--> --------------------
Messung V0.5
¤ Dauer der Verarbeitung: 0.24 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.