/* -*- 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 .
*/
if( SfxItemState::SET == pSet->GetItemState(FN_NUMBER_NEWSTART) )
{ //SetNumRuleStart(true) restarts the numbering at the value //that is defined at the starting point of the numbering level //otherwise the SetNodeNumStart() value determines the start //if it's set to something different than USHRT_MAX
// Default value for restart value has to be USHRT_MAX // in order to indicate that the restart value of the list // style has to be used on restart.
sal_uInt16 nNumStart = USHRT_MAX; if( SfxItemState::SET == pSet->GetItemState(FN_NUMBER_NEWSTART_AT) )
{
nNumStart = pSet->Get(FN_NUMBER_NEWSTART_AT).GetValue();
}
rWrtSh.SetNumRuleStart(bStart, pPaM);
rWrtSh.SetNodeNumStart(nNumStart);
} elseif( SfxItemState::SET == pSet->GetItemState(FN_NUMBER_NEWSTART_AT) )
{
rWrtSh.SetNodeNumStart(pSet->Get(FN_NUMBER_NEWSTART_AT).GetValue());
rWrtSh.SetNumRuleStart(false, pPaM);
} // #i56253# if ( bUndoNeeded )
{
rWrtSh.EndUndo( SwUndoId::INSATTR );
}
}
// Update the bookmark to point to the new content.
SwPaM aPasteStart(pMark->GetMarkEnd());
aPasteStart.Move(fnMoveForward, GoInContent);
SwPaM aStartMarker(pMark->GetMarkStart(), *aPasteStart.GetPoint());
SwPaM aEndMarker(*aPasteEnd.GetPoint(), *aPasteEnd.GetPoint());
aEndMarker.GetMark()->AdjustContent(1);
pMark->SetMarkPos(*aPasteStart.GetPoint());
pMark->SetOtherMarkPos(*aPasteEnd.GetPoint());
bSortMarks = true;
// Remove markers. the start marker includes the old content as well.
rIDCO.DeleteAndJoin(aStartMarker);
rIDCO.DeleteAndJoin(aEndMarker);
}
} if (bSortMarks)
{
rIDMA.assureSortedMarkContainers();
}
// Update the bookmark to point to the new content.
SwPaM aPasteStart(pBookmark->GetMarkEnd());
aPasteStart.Move(fnMoveForward, GoInContent);
SwPaM aStartMarker(pBookmark->GetMarkStart(), *aPasteStart.GetPoint());
SwPaM aEndMarker(*aPasteEnd.GetPoint(), *aPasteEnd.GetPoint());
aEndMarker.GetMark()->AdjustContent(1);
pBookmark->SetMarkPos(*aPasteStart.GetPoint());
pBookmark->SetOtherMarkPos(*aPasteEnd.GetPoint());
// Remove markers. the start marker includes the old content as well.
rIDCO.DeleteAndJoin(aStartMarker);
rIDCO.DeleteAndJoin(aEndMarker);
rIDMA.assureSortedMarkContainers();
}
IDocumentMarkAccess* pMarkAccess = rWrtSh.GetDoc()->getIDocumentMarkAccess();
std::vector<sw::mark::MarkBase*> aRemovals; for (auto it = pMarkAccess->getBookmarksBegin(); it != pMarkAccess->getBookmarksEnd(); ++it)
{
sw::mark::Bookmark* pBookmark = *it;
assert(pBookmark);
if (!aBookmarkNamePrefix.isEmpty())
{ if (!pBookmark->GetName().toString().startsWith(aBookmarkNamePrefix))
{ continue;
}
}
aRemovals.push_back(pBookmark);
}
for (constauto& pMark : aRemovals)
{
pMarkAccess->deleteMark(pMark);
}
}
void DeleteFields(const SfxRequest& rReq, SwWrtShell& rWrtSh)
{ const SfxStringItem* pTypeName = rReq.GetArg<SfxStringItem>(FN_PARAM_1); if (!pTypeName || pTypeName->GetValue() != "SetRef")
{ // This is implemented so far only for reference marks. return;
}
if (bResize)
{ // Resize is actually some inserts, or deletes if (nId > nSeriesCount)
{
bInsert = true;
} elseif (nId < nSeriesCount)
{
bInsert = false;
} else
{ // Resize to the same size. No change needed returntrue;
}
}
// insert or delete if (bInsert)
{ // insert if (nId > nSeriesCount && !bResize) returnfalse;
int nInsertCount = bResize ? nId - nSeriesCount : 1;
// call dialog code if (bResize)
{ for (int i = 0; i < nInsertCount; i++)
{
xIDataProvider->insertDataSeries(nSeriesCount);
} returntrue;
}
xIDataProvider->insertDataSeries(nId);
} else
{ // delete 1 or more columns if (nId >= nSeriesCount) returnfalse; int nDeleteCount = bResize ? nSeriesCount - nId : 1; for (int i = 0; i < nDeleteCount; i++)
{
xDSContainer->removeDataSeries(aSeriesSeq[nId]);
}
} returntrue;
}
OUString sReplacement = aToggle.ReplacementString(); if( !sReplacement.isEmpty() )
{ if (rWrtSh.HasReadonlySel() && !rWrtSh.CursorInsideInputField())
{ // Only break if there's something to do; don't nag with the dialog otherwise
rWrtSh.InfoReadOnlyDialog(false); break;
}
OUString stringToReplace = aToggle.StringToReplace();
SwRewriter aRewriter;
aRewriter.AddRule( UndoArg1, stringToReplace );
aRewriter.AddRule( UndoArg2, SwResId(STR_YIELDS) );
aRewriter.AddRule( UndoArg3, sReplacement );
rWrtSh.StartUndo(SwUndoId::REPLACE, &aRewriter);
rWrtSh.GetCursor()->Normalize(false);
rWrtSh.ClearMark(); if( rWrtSh.IsInSelect() ) // cancel any in-progress keyboard selection as well
rWrtSh.EndSelect(); // Select exactly what was chosen for replacement
rWrtSh.GetCursor()->SetMark();
rWrtSh.GetCursor()->GetPoint()->AdjustContent(-stringToReplace.getLength());
rWrtSh.DelLeft();
rWrtSh.Insert2( sReplacement );
rWrtSh.EndUndo(SwUndoId::REPLACE, &aRewriter);
}
} break;
case SID_LANGUAGE_STATUS:
{ // get the language
OUString aNewLangText; const SfxStringItem* pItem2 = rReq.GetArg<SfxStringItem>(SID_LANGUAGE_STATUS); if (pItem2)
aNewLangText = pItem2->GetValue();
//!! Remember the view frame right now... //!! (call to GetView().GetViewFrame() will break if the //!! SwTextShell got destroyed meanwhile.)
SfxViewFrame& rViewFrame = GetView().GetViewFrame();
if (aNewLangText == "*")
{ // open the dialog "Tools/Options/Languages and Locales - General" // to set the documents default language
SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateVclDialog(GetView().GetFrameWeld(), SID_LANGUAGE_OPTIONS));
pDlg->Execute();
} else
{ //!! We have to use StartAction / EndAction bracketing in //!! order to prevent possible destruction of the SwTextShell //!! due to the selection changes coming below.
rWrtSh.StartAction(); // prevent view from jumping because of (temporary) selection changes
rWrtSh.LockView( true );
// setting the new language... if (!aNewLangText.isEmpty())
{ static constexpr OUString aSelectionLangPrefix(u"Current_"_ustr); static constexpr OUString aParagraphLangPrefix(u"Paragraph_"_ustr); static constexpr OUString aDocumentLangPrefix(u"Default_"_ustr);
sal_Int32 nPos = 0; bool bForSelection = true; bool bForParagraph = false; if (-1 != (nPos = aNewLangText.indexOf( aSelectionLangPrefix )))
{ // ... for the current selection
aNewLangText = aNewLangText.replaceAt(nPos, aSelectionLangPrefix.getLength(), u"");
bForSelection = true;
} elseif (-1 != (nPos = aNewLangText.indexOf(aParagraphLangPrefix)))
{ // ... for the current paragraph language
aNewLangText = aNewLangText.replaceAt(nPos, aParagraphLangPrefix.getLength(), u"");
bForSelection = true;
bForParagraph = true;
} elseif (-1 != (nPos = aNewLangText.indexOf(aDocumentLangPrefix)))
{ // ... as default document language
aNewLangText = aNewLangText.replaceAt(nPos, aDocumentLangPrefix.getLength(), u"");
bForSelection = false;
}
if (bForParagraph || !bForSelection)
{
rWrtSh.Push(); // save selection for later restoration
rWrtSh.ClearMark(); // fdo#67796: invalidate table crsr
}
if (bForParagraph)
SwLangHelper::SelectCurrentPara( rWrtSh );
if (!bForSelection) // document language to be changed...
{
rWrtSh.SelAll();
rWrtSh.ExtendedSelectAll();
}
// invalidate slot to get the new language displayed
rViewFrame.GetBindings().Invalidate( nSlot );
rReq.Done(); break;
}
case SID_THES:
{ // replace word/selection with text from selected sub menu entry
OUString aReplaceText; const SfxStringItem* pItem2 = rReq.GetArg(FN_PARAM_THES_WORD_REPLACE); if (pItem2)
aReplaceText = pItem2->GetValue(); if (!aReplaceText.isEmpty())
{
SwView &rView2 = rWrtSh.GetView(); constbool bSelection = rWrtSh.HasSelection(); const OUString aLookUpText = rView2.GetThesaurusLookUpText( bSelection );
rView2.InsertThesaurusSynonym( aReplaceText, aLookUpText, bSelection );
}
} break;
case SID_CHARMAP:
{
InsertSymbol( rReq );
} break; case FN_INSERT_FOOTNOTE: case FN_INSERT_ENDNOTE:
{
OUString aStr; const SfxStringItem* pFont = rReq.GetArg<SfxStringItem>(FN_PARAM_1); const SfxStringItem* pNameItem = rReq.GetArg<SfxStringItem>(nSlot); if ( pNameItem )
aStr = pNameItem->GetValue(); bool bFont = pFont && !pFont->GetValue().isEmpty();
rWrtSh.StartUndo( SwUndoId::UI_INSERT_FOOTNOTE );
rWrtSh.InsertFootnote( aStr, nSlot == FN_INSERT_ENDNOTE, !bFont ); if ( bFont )
{
rWrtSh.Left( SwCursorSkipMode::Chars, true, 1, false );
SfxItemSetFixed<RES_CHRATR_FONT, RES_CHRATR_FONT> aSet( rWrtSh.GetAttrPool() );
rWrtSh.GetCurAttr( aSet );
rWrtSh.SetAttrSet( aSet, SetAttrMode::DONTEXPAND );
rWrtSh.ResetSelect(nullptr, false, ScrollSizeMode::ScrollSizeDefault);
rWrtSh.EndSelect();
rWrtSh.GotoFootnoteText();
}
rWrtSh.EndUndo( SwUndoId::UI_INSERT_FOOTNOTE );
rReq.Done();
} break; case FN_INSERT_FOOTNOTE_DLG:
{
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
VclPtr<AbstractInsFootNoteDlg> pDlg(pFact->CreateInsFootNoteDlg(
GetView().GetFrameWeld(), rWrtSh));
pDlg->SetHelpId(GetStaticInterface()->GetSlot(nSlot)->GetCommand());
pDlg->StartExecuteAsync(
[this, pDlg] (sal_Int32 nResult)->void
{ if ( nResult == RET_OK )
{
pDlg->Apply(); const sal_uInt16 nId = pDlg->IsEndNote() ? FN_INSERT_ENDNOTE : FN_INSERT_FOOTNOTE;
SfxRequest aReq(GetView().GetViewFrame(), nId); if ( !pDlg->GetStr().isEmpty() )
aReq.AppendItem( SfxStringItem( nId, pDlg->GetStr() ) ); if ( !pDlg->GetFontName().isEmpty() )
aReq.AppendItem( SfxStringItem( FN_PARAM_1, pDlg->GetFontName() ) );
ExecuteSlot( aReq );
}
pDlg->disposeOnce();
}
);
rReq.Ignore();
} break; case FN_FORMAT_FOOTNOTE_DLG: case FN_FORMAT_CURRENT_FOOTNOTE_DLG:
{
GetView().ExecFormatFootnote(); break;
} case SID_INSERTDOC:
{
GetView().ExecuteInsertDoc( rReq, pItem ); break;
} case FN_FORMAT_RESET:
{ // Assure the folded outline button does not remain after resetting // RES_PARATTR_OUTLINELEVEL and that folded outline content that becomes unfolded due to // RES_PARATR_GRABBAG "OutlineContentVisibleAttr" being reset is shown for outlines set by // a style.
MakeAllOutlineContentTemporarilyVisible a(rWrtSh.GetDoc());
// #i78856, reset all attributes but not the language attributes // (for this build an array of all relevant attributes and // remove the languages from that)
o3tl::sorted_vector<sal_uInt16> aAttribs;
// also clear the direct formatting flag inside SwTableBox(es) if (SwFEShell* pFEShell = GetView().GetDocShell()->GetFEShell())
pFEShell->UpdateTableStyleFormatting(nullptr, true);
// tdf#160801 fix crash by delaying resetting of attributes // Calling SwWrtShell::ResetAttr() will sometimes delete the // current SwTextShell instance so call it after clearing the // direct formatting flag.
rWrtSh.ResetAttr( aAttribs );
if (pBookmarkText)
{
OUString aBookmarkText = pBookmarkText->GetValue(); // Split node to remember where the start position is. bool bSuccess = rWrtSh.GetDoc()->getIDocumentContentOperations().SplitNode(
*pCursorPos->GetPoint(), /*bChkTableStart=*/false); if (bSuccess)
{
SwPaM aBookmarkPam(*pCursorPos->GetPoint());
aBookmarkPam.Move(fnMoveBackward, GoInContent);
// Paste HTML content.
SwTranslateHelper::PasteHTMLToPaM(
rWrtSh, pCursorPos, aBookmarkText.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);
rWrtSh.GetDoc()->getIDocumentContentOperations().DeleteAndJoin(aPam);
}
break;
} case FN_UPDATE_BOOKMARKS:
{ // This updates all bookmarks in the document that match the conditions specified in // rReq.
UpdateBookmarks(rReq, rWrtSh); break;
} case FN_UPDATE_BOOKMARK:
{ // This updates the bookmark under the cursor.
UpdateBookmark(rReq, rWrtSh); break;
} case FN_DELETE_BOOKMARK:
{ // This deletes a bookmark with the specified name. if (pItem && !rWrtSh.getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_BOOKMARKS))
{
IDocumentMarkAccess* const pMarkAccess = rWrtSh.getIDocumentMarkAccess();
pMarkAccess->deleteMark(pMarkAccess->findMark(SwMarkName(static_cast<const SfxStringItem*>(pItem)->GetValue())), false);
} break;
} case FN_DELETE_BOOKMARKS:
{ // This deletes all bookmarks in the document matching a specified prefix.
DeleteBookmarks(rReq, rWrtSh); break;
} case FN_DELETE_FIELDS:
{ // This deletes all fields in the document matching a specified type & prefix.
DeleteFields(rReq, rWrtSh); break;
} case FN_UPDATE_SECTIONS:
{
UpdateSections(rReq, rWrtSh); break;
} case FN_DELETE_SECTIONS:
{ // This deletes all sections in the document matching a specified prefix. Note that the // section is deleted, but not its contents.
DeleteSections(rReq, rWrtSh); break;
} case FN_DELETE_CONTENT_CONTROL:
{
DeleteContentControl( rWrtSh ); break;
} case FN_SET_REMINDER:
{ // collect and sort navigator reminder names
IDocumentMarkAccess* const pMarkAccess = rWrtSh.getIDocumentMarkAccess();
std::vector< SwMarkName > vNavMarkNames; for(auto ppMark = pMarkAccess->getAllMarksBegin();
ppMark != pMarkAccess->getAllMarksEnd();
++ppMark)
{ if( IDocumentMarkAccess::GetType(**ppMark) == IDocumentMarkAccess::MarkType::NAVIGATOR_REMINDER )
vNavMarkNames.push_back((*ppMark)->GetName());
}
std::sort(vNavMarkNames.begin(), vNavMarkNames.end());
// we are maxed out so delete the first one // this assumes that IDocumentMarkAccess generates Names in ascending order if(vNavMarkNames.size() == MAX_MARKS)
pMarkAccess->deleteMark(pMarkAccess->findMark(vNavMarkNames[0]), false);
break;
} case FN_AUTOFORMAT_REDLINE_APPLY:
{
SvxSwAutoFormatFlags aFlags(SvxAutoCorrCfg::Get().GetAutoCorrect()->GetSwFlags()); // This must always be false for the postprocessing.
aFlags.bAFormatByInput = false;
aFlags.bWithRedlining = true;
rWrtSh.AutoFormat( &aFlags, false );
aFlags.bWithRedlining = false;
SfxViewFrame& rVFrame = GetView().GetViewFrame(); if (rVFrame.HasChildWindow(FN_REDLINE_ACCEPT))
rVFrame.ToggleChildWindow(FN_REDLINE_ACCEPT);
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); auto xRequest = std::make_shared<SfxRequest>(rReq);
rReq.Ignore(); // the 'old' request is not relevant any more
VclPtr<AbstractSwModalRedlineAcceptDlg> pDlg(pFact->CreateSwModalRedlineAcceptDlg(GetView().GetEditWin().GetFrameWeld()));
pDlg->StartExecuteAsync(
[pDlg, xRequest=std::move(xRequest)] (sal_Int32 /*nResult*/)->void
{
pDlg->disposeOnce();
xRequest->Done();
}
);
} break;
case FN_AUTOFORMAT_APPLY:
{
SvxSwAutoFormatFlags aFlags(SvxAutoCorrCfg::Get().GetAutoCorrect()->GetSwFlags()); // This must always be false for the postprocessing.
aFlags.bAFormatByInput = false;
rWrtSh.AutoFormat( &aFlags, false );
rReq.Done();
} break; case FN_AUTOFORMAT_AUTO:
{
SvxAutoCorrCfg& rACfg = SvxAutoCorrCfg::Get(); bool bSet = pItem ? static_cast<const SfxBoolItem*>(pItem)->GetValue() : !rACfg.IsAutoFormatByInput(); if( bSet != rACfg.IsAutoFormatByInput() )
{
rACfg.SetAutoFormatByInput( bSet );
rACfg.Commit();
GetView().GetViewFrame().GetBindings().Invalidate( nSlot ); if ( !pItem )
rReq.AppendItem( SfxBoolItem( GetPool().GetWhichIDFromSlotID(nSlot), bSet ) );
rReq.Done();
}
} break; case FN_AUTO_CORRECT:
{ // At first set to blank as default.
rWrtSh.AutoCorrect( *SvxAutoCorrCfg::Get().GetAutoCorrect(), ' ' );
rReq.Done();
} break; case FN_TABLE_SORT_DIALOG: case FN_SORTING_DLG:
{
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
VclPtr<AbstractSwSortDlg> pDlg(pFact->CreateSwSortingDialog(GetView().GetFrameWeld(), rWrtSh)); auto xRequest = std::make_shared<SfxRequest>(rReq);
rReq.Ignore(); // the 'old' request is not relevant any more
pDlg->StartExecuteAsync(
[pDlg, xRequest=std::move(xRequest)] (sal_Int32 nResult)->void
{ if (nResult == RET_OK)
pDlg->Apply();
pDlg->disposeOnce();
xRequest->Done();
}
);
} break; case FN_NUMBERING_OUTLINE_DLG:
{
GetView().ExecNumberingOutline(GetPool());
rReq.Done();
} break; case FN_CALCULATE:
{
rtl::Reference<SwTransferable> pTransfer = new SwTransferable( rWrtSh );
pTransfer->CalculateAndCopy();
rReq.Done();
} break; case FN_GOTO_REFERENCE:
{
SwField *pField = rWrtSh.GetCurField(); if(pField && pField->GetTypeId() == SwFieldTypesEnum::GetRef)
{
rWrtSh.StartAllAction();
rWrtSh.SwCursorShell::GotoRefMark( static_cast<SwGetRefField*>(pField)->GetSetRefName(), static_cast<SwGetRefField*>(pField)->GetSubType(), static_cast<SwGetRefField*>(pField)->GetSeqNo(), static_cast<SwGetRefField*>(pField)->GetFlags() );
rWrtSh.EndAllAction();
rReq.Done();
}
} break; case FN_EDIT_FORMULA:
{ const sal_uInt16 nId = SwInputChild::GetChildWindowId();
SfxViewFrame& rVFrame = GetView().GetViewFrame(); if(pItem)
{ //if the ChildWindow is active it has to be removed if( rVFrame.HasChildWindow( nId ) )
{
rVFrame.ToggleChildWindow( nId );
rVFrame.GetBindings().InvalidateAll( true );
}
break; case FN_TABLE_UNSET_READ_ONLY:
{
rWrtSh.UnProtectTables();
} break; case SID_EDIT_HYPERLINK:
{ if (!rWrtSh.HasSelection())
{
SfxItemSetFixed<RES_TXTATR_INETFMT, RES_TXTATR_INETFMT> aSet(GetPool());
rWrtSh.GetCurAttr(aSet); if (SfxItemState::SET > aSet.GetItemState(RES_TXTATR_INETFMT))
{ // Didn't find a hyperlink to edit yet.
// If the cursor is just before an unselected hyperlink, // the dialog will not know that it should edit that hyperlink, // so in this case, first select it so the dialog will find the hyperlink. // The dialog would leave the hyperlink selected anyway after a successful edit // (although it isn't normally selected after a cancel, but oh well). if (!rWrtSh.SelectTextAttr(RES_TXTATR_INETFMT)) break;
}
}
GetView().GetViewFrame().SetChildWindow(SID_HYPERLINK_DIALOG, true);
} break; case SID_REMOVE_HYPERLINK:
{ bool bSel = rWrtSh.HasSelection(); if(!bSel)
{
rWrtSh.StartAction();
rWrtSh.Push(); if(!rWrtSh.SelectTextAttr( RES_TXTATR_INETFMT ))
rWrtSh.SelWrd();
} //now remove the attribute
rWrtSh.ResetAttr({ RES_TXTATR_INETFMT }); if(!bSel)
{
rWrtSh.Pop(SwCursorShell::PopMode::DeleteCurrent);
rWrtSh.EndAction();
}
} break; case SID_ATTR_BRUSH_CHAR : case SID_ATTR_CHAR_SCALEWIDTH : case SID_ATTR_CHAR_ROTATED : case FN_TXTATR_INET :
{ const sal_uInt16 nWhich = GetPool().GetWhichIDFromSlotID( nSlot ); if ( pArgs && pArgs->GetItemState( nWhich ) == SfxItemState::SET )
bUseDialog = false;
[[fallthrough]];
} case SID_CHAR_DLG: case SID_CHAR_DLG_EFFECT: case SID_CHAR_DLG_POSITION:
{
sw_CharDialog(rWrtSh, bUseDialog, /*ApplyToParagraph*/false, nSlot, pArgs, &rReq);
} break; case SID_CHAR_DLG_FOR_PARAGRAPH:
{
sw_CharDialog(rWrtSh, /*UseDialog*/true, /*ApplyToParagraph*/true, nSlot, pArgs, &rReq);
} break; case SID_ATTR_LRSPACE : case SID_ATTR_ULSPACE : case SID_ATTR_BRUSH : case SID_PARA_VERTALIGN : case SID_ATTR_PARA_NUMRULE : case SID_ATTR_PARA_REGISTER : case SID_ATTR_PARA_PAGENUM : case FN_FORMAT_LINENUMBER : case FN_NUMBER_NEWSTART : case FN_NUMBER_NEWSTART_AT : case FN_FORMAT_DROPCAPS : case FN_DROP_TEXT: case SID_ATTR_PARA_LRSPACE:
{ const sal_uInt16 nWhich = GetPool().GetWhichIDFromSlotID( nSlot ); if ( pArgs && pArgs->GetItemState( nWhich ) == SfxItemState::SET )
bUseDialog = false;
[[fallthrough]];
} case SID_PARA_DLG:
{
SwPaM* pPaM = nullptr;
SfxItemSetFixed<
RES_PARATR_BEGIN, RES_FRMATR_END - 1, // FillAttribute support:
XATTR_FILL_FIRST, XATTR_FILL_LAST, // Includes SID_ATTR_TABSTOP_POS:
SID_ATTR_TABSTOP_DEFAULTS, SID_ATTR_TABSTOP_OFFSET,
SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP, // Items to hand over XPropertyList things like XColorList, // XHatchList, XGradientList, and XBitmapList to the Area // TabPage:
SID_COLOR_TABLE, SID_PATTERN_LIST,
SID_HTML_MODE, SID_HTML_MODE,
SID_ATTR_PARA_PAGENUM, SID_ATTR_PARA_PAGENUM,
FN_PARAM_1, FN_PARAM_1,
FN_NUMBER_NEWSTART, FN_NUMBER_NEWSTART_AT,
FN_DROP_TEXT, FN_DROP_CHAR_STYLE_NAME> aCoreSet( GetPool() );
// get also the list level indent values merged as LR-SPACE item, if needed.
rWrtSh.GetPaMAttr( pPaM, aCoreSet, true );
// create needed items for XPropertyList entries from the DrawModel so that // the Area TabPage can access them // Do this after GetCurAttr, this resets the ItemSet content again
SwDrawModel* pDrawModel = GetView().GetDocShell()->GetDoc()->getIDocumentDrawModelAccess().GetDrawModel();
sw_ParagraphDialogResult(&aCoreSet, rWrtSh, rReq, pPaM);
} else
sw_ParagraphDialogResult(const_cast<SfxItemSet*>(pArgs), rWrtSh, rReq, pPaM);
} elseif (pDlg)
{ auto pRequest = std::make_shared<SfxRequest>(rReq);
rReq.Ignore(); // the 'old' request is not relevant any more
auto vCursors = CopyPaMRing(*pPaM); // tdf#134439 make a copy to use at later apply
pDlg->StartExecuteAsync([pDlg, &rWrtSh, pDrawModel, pRequest=std::move(pRequest), nDefDist, vCursors=std::move(vCursors)](sal_Int32 nResult){ if (nResult == RET_OK)
{ // Apply defaults if necessary.
SfxItemSet* pSet = const_cast<SfxItemSet*>(pDlg->GetOutputItemSet());
sal_uInt16 nNewDist; const SfxUInt16Item* pDefaultsItem = pSet->GetItemIfSet(SID_ATTR_TABSTOP_DEFAULTS, false); if (pDefaultsItem && nDefDist != (nNewDist = pDefaultsItem->GetValue()) )
{
SvxTabStopItem aDefTabs( 0, 0, SvxTabAdjust::Default, RES_PARATR_TABSTOP );
MakeDefTabs( nNewDist, aDefTabs );
rWrtSh.SetDefault( aDefTabs );
pSet->ClearItem( SID_ATTR_TABSTOP_DEFAULTS );
}
sw_ParagraphDialogResult(pSet, rWrtSh, *pRequest, vCursors->front().get());
}
pDlg->disposeOnce();
});
}
} break; case FN_NUM_CONTINUE:
{
OUString sContinuedListId; const SwNumRule* pRule =
rWrtSh.SearchNumRule( true, sContinuedListId ); // #i86492# // Search also for bullet list if ( !pRule )
{
pRule = rWrtSh.SearchNumRule( false, sContinuedListId );
} if ( pRule )
{
rWrtSh.SetCurNumRule( *pRule, false, sContinuedListId );
}
} break;
case FN_SELECT_PARA:
{ if ( !rWrtSh.IsSttOfPara() )
rWrtSh.SttPara(); else
rWrtSh.EnterStdMode();
rWrtSh.EndPara( true );
} break;
case SID_DEC_INDENT: case SID_INC_INDENT: //According to the requirement, modified the behavior when user //using the indent button on the toolbar. Now if we increase/decrease indent for a //paragraph which has bullet style it will increase/decrease the bullet level.
{ //If the current paragraph has bullet call the function to //increase or decrease the bullet level. //Why could I know whether a paragraph has bullet or not by checking the below conditions? //Please refer to the "case KEY_TAB:" section in SwEditWin::KeyInput(..) : // if( rSh.GetCurNumRule() && rSh.IsSttOfPara() && // !rSh.HasReadonlySel() ) // eKeyState = KS_NumDown; //Above code demonstrates that when the cursor is at the start of a paragraph which has bullet, //press TAB will increase the bullet level. //So I copied from that ^^ if ( rWrtSh.GetNumRuleAtCurrCursorPos() && !rWrtSh.HasReadonlySel() )
{
rWrtSh.NumUpDown( SID_INC_INDENT == nSlot );
} else//execute the original processing functions
{ //below is copied of the old codes
rWrtSh.MoveLeftMargin( SID_INC_INDENT == nSlot, rReq.GetModifier() != KEY_MOD1 );
}
}
rReq.Done(); break;
case FN_DEC_INDENT_OFFSET: case FN_INC_INDENT_OFFSET:
rWrtSh.MoveLeftMargin( FN_INC_INDENT_OFFSET == nSlot, rReq.GetModifier() == KEY_MOD1 );
rReq.Done(); break;
case SID_ATTR_CHAR_COLOR2:
{
std::unique_ptr<const SvxColorItem> pRecentColor; // manage lifecycle scope if (!pItem)
{ // no color provided: use the pre-selected color shown in the toolbar/sidebar const std::optional<NamedColor> oColor
= GetView().GetDocShell()->GetRecentColor(SID_ATTR_CHAR_COLOR); if (oColor.has_value())
{ const model::ComplexColor aCol = (*oColor).getComplexColor();
pRecentColor = std::make_unique<const SvxColorItem>(
aCol.getFinalColor(), aCol, RES_CHRATR_COLOR);
pItem = pRecentColor.get();
}
}
// If there is a selection, then set the color on it // otherwise, it'll be the color for the next text to be typed if (!pApply || pApply->nColor != SID_ATTR_CHAR_COLOR_EXT)
{
rWrtSh.SetAttrItem(SvxColorItem(pColorItem->GetValue(), pColorItem->getComplexColor(), RES_CHRATR_COLOR));
}
rReq.Done();
}
} break; case SID_ATTR_CHAR_BACK_COLOR: case SID_ATTR_CHAR_COLOR_BACKGROUND: // deprecated case SID_ATTR_CHAR_COLOR_EXT:
{
Color aColor = COL_TRANSPARENT;
model::ComplexColor aComplexColor;
if (pItem)
{ auto* pColorItem = static_cast<const SvxColorItem*>(pItem);
aColor = pColorItem->GetValue();
aComplexColor = pColorItem->getComplexColor();
} elseif (nSlot == SID_ATTR_CHAR_BACK_COLOR)
{ // no color provided: use the pre-selected color shown in the toolbar/sidebar const std::optional<NamedColor> oColor
= GetView().GetDocShell()->GetRecentColor(nSlot); if (oColor.has_value())
{
aComplexColor = (*oColor).getComplexColor();
aColor = aComplexColor.getFinalColor();
}
}
// if original word has a trailing . (likely the end of a sentence) // and the replacement text hasn't, then add it to the replacement if (!aTmp.isEmpty() && !aOrig.isEmpty() &&
aOrig.endsWith(".") && /* !IsAlphaNumeric ??*/
!aTmp.endsWith("."))
{
aTmp += ".";
}
SwRewriter aRewriter;
aRewriter.AddRule(UndoArg1, rWrtSh.GetCursorDescr() // don't show the hidden control character of the comment
.replaceAll(OUStringChar(CH_TXTATR_INWORD), "") );
aRewriter.AddRule(UndoArg2, SwResId(STR_YIELDS));
// keep comments at the end of the replacement in case spelling correction is // invoked via the context menu. The spell check dialog does the correction in edlingu.cxx.
rWrtSh.ReplaceKeepComments(aTmp);
rWrtSh.EndAction();
rWrtSh.EndUndo();
rWrtSh.SetInsMode( bOldIns );
} break; case FN_TRANSFORM_DOCUMENT_STRUCTURE:
{ // get the parameter, what to transform
OUString aDataJson; const SfxStringItem* pDataJson = rReq.GetArg<SfxStringItem>(FN_PARAM_1); if (pDataJson)
{
aDataJson = pDataJson->GetValue();
aDataJson = rtl::Uri::decode(aDataJson, rtl_UriDecodeStrict, RTL_TEXTENCODING_UTF8);
}
// get the loaded content controls
uno::Reference<text::XContentControlsSupplier> xCCSupplier(
GetView().GetDocShell()->GetModel(), uno::UNO_QUERY); if (!xCCSupplier.is()) break;
uno::Reference<container::XIndexAccess> xContentControls
= xCCSupplier->getContentControls(); int iCCcount = xContentControls->getCount();
// Iterate through the JSON data loaded into a tree structure for (constauto& aItem : aTree)
{ if (aItem.first == "Transforms")
{ // Handle all transformations for (constauto& aItem2Obj : aItem.second)
{ // handle `"Transforms": { ` and `"Transforms": [` cases as well // if an element is an object `{...}`, then get the first element of the object constauto& aItem2
= aItem2Obj.first == "" ? *aItem2Obj.second.ordered_begin() : aItem2Obj;
if (aItem2.first == "DocumentProperties")
{
uno::Reference<document::XDocumentPropertiesSupplier>
xDocumentPropsSupplier(GetView().GetDocShell()->GetModel(),
uno::UNO_QUERY); if (!xDocumentPropsSupplier.is()) continue;
uno::Reference<document::XDocumentProperties2> xDocProps(
xDocumentPropsSupplier->getDocumentProperties(), uno::UNO_QUERY); if (!xDocProps.is()) continue;
for (constauto& aItem4Obj : aItem3.second)
{ // handle [{},{}...] case as well as {}...} constauto& aItem4 = aItem4Obj.first == ""
? *aItem4Obj.second.ordered_begin()
: aItem4Obj;
if (bToDelete)
xUserProps->removeProperty(aPropVec[0].Name);
xUserProps->addProperty(
aPropVec[0].Name,
beans::PropertyAttribute::REMOVABLE,
aPropVec[0].Value);
} catch(...)
{
lcl_LogWarning("FillApi DocumentProperties " "UserDefinedPropertieschart, failed " "to add property: '"
+ aPropName + "'");
}
}
}
}
}
} if (aItem2.first.starts_with("Charts"))
{
std::string aTextEnd = aItem2.first.substr(6);
std::string aValue = "";
ChartFilterType iKeyId = ChartFilterType::ERROR; // Find how the chart is identified: ByIndex, ByTitle... for (size_t i = 0; i < aIdChartTexts.size(); i++)
{ if (aTextEnd.starts_with(aIdChartTexts[i]))
{
iKeyId = static_cast<ChartFilterType>(i);
aValue = aTextEnd.substr(aIdChartTexts[i].length()); break;
}
} if (iKeyId != ChartFilterType::ERROR)
{ // A chart transformation filter can match multiple charts // In that case every matching charts will be transformed // If no chart match to the filter, then we show warning bool bChartFound = false; for (int i = 0; i < nEOcount; ++i)
{
uno::Reference<beans::XPropertySet> xShapeProps(
xEmbeddeds->getByIndex(i), uno::UNO_QUERY); if (!xShapeProps.is()) continue;
uno::Reference<frame::XModel> xDocModel;
xShapeProps->getPropertyValue(u"Model"_ustr) >>= xDocModel; if (!xDocModel.is()) continue;
uno::Reference<chart2::XChartDocument> xChartDoc(
xDocModel, uno::UNO_QUERY); if (!xChartDoc.is()) continue;
uno::Reference<chart2::data::XDataProvider> xDataProvider(
xChartDoc->getDataProvider()); if (!xDataProvider.is()) continue;
uno::Reference<chart::XChartDataArray> xDataArray(
xChartDoc->getDataProvider(), uno::UNO_QUERY); if (!xDataArray.is()) continue;
uno::Reference<chart2::XInternalDataProvider> xIDataProvider(
xChartDoc->getDataProvider(), uno::UNO_QUERY); if (!xIDataProvider.is()) continue;
uno::Reference<util::XModifiable> xModi(xDocModel,
uno::UNO_QUERY); if (!xModi.is()) continue;
switch (iKeyId)
{ case ChartFilterType::INDEX:
{ if (stoi(aValue) != i) continue;
} break; case ChartFilterType::NAME:
{
uno::Reference<container::XNamed> xNamedShape(
xEmbeddeds->getByIndex(i), uno::UNO_QUERY); if (xNamedShape.is())
{
OUString aName;
aName = xNamedShape->getName(); if (OStringToOUString(aValue, RTL_TEXTENCODING_UTF8)
!= aName) continue;
}
} break; case ChartFilterType::TITLE:
{
uno::Reference<chart2::XTitled> xTitled(
xChartDoc, uno::UNO_QUERY_THROW); if (!xTitled.is()) continue;
uno::Reference<chart2::XTitle> xTitle
= xTitled->getTitleObject(); if (!xTitle.is()) continue;
OUString aTitle; const uno::Sequence<
uno::Reference<chart2::XFormattedString>>
aFSSeq = xTitle->getText(); for (autoconst& fs : aFSSeq)
aTitle += fs->getString(); if (OStringToOUString(aValue, RTL_TEXTENCODING_UTF8)
!= aTitle) continue;
} break; case ChartFilterType::SUBTITLE:
{
uno::Reference<chart2::XDiagram> xDiagram
= xChartDoc->getFirstDiagram(); if (!xDiagram.is()) continue;
uno::Reference<chart2::XTitled> xTitled(
xDiagram, uno::UNO_QUERY_THROW); if (!xTitled.is()) continue;
uno::Reference<chart2::XTitle> xSubTitle(
xTitled->getTitleObject()); if (!xSubTitle.is()) continue;
if (aItem3.first.starts_with("setrowdesc."))
{ // set only 1 description int nValue = stoi(aItem3.first.substr(11)); if (nValue >= 0 && nValue < aRowDesc.getLength())
{
aRowdata[nValue] = OStringToOUString(
aItem3.second.get_value<std::string>(),
RTL_TEXTENCODING_UTF8);
} else
{
lcl_LogWarning("FillApi chart setrowdesc: " "invalid Index at: '"
+ aItem3.first + "'");
}
} else
{ // set an array of description at once int nIndex = 0; for (constauto& aItem4 : aItem3.second)
{ if (nIndex >= aRowDesc.getLength())
{
lcl_LogWarning("FillApi chart setrowdesc: " "too many params"); break;
}
aRowdata[nIndex] = OStringToOUString(
aItem4.second.get_value<std::string>(),
RTL_TEXTENCODING_UTF8);
nIndex++;
}
}
xDataArray->setRowDescriptions(aRowDesc);
} elseif (aItem3.first.starts_with("setcolumndesc"))
{ // set column descriptions
uno::Sequence<OUString> aColDesc
= xDataArray->getColumnDescriptions();
OUString* aColdata = aColDesc.getArray();
if (aItem3.first.starts_with("setcolumndesc."))
{ int nValue = stoi(aItem3.first.substr(14)); if (nValue >= 0 && nValue < aColDesc.getLength())
{
aColdata[nValue] = OStringToOUString(
aItem3.second.get_value<std::string>(),
RTL_TEXTENCODING_UTF8);
} else
{
lcl_LogWarning("FillApi chart setcolumndesc: " "invalid Index at: '"
+ aItem3.first + "'");
}
} else
{ int nIndex = 0; for (constauto& aItem4 : aItem3.second)
{ if (nIndex >= aColDesc.getLength())
{
lcl_LogWarning( "FillApi chart setcolumndesc:" " too many parameters"); break;
}
aColdata[nIndex] = OStringToOUString(
aItem4.second.get_value<std::string>(),
RTL_TEXTENCODING_UTF8);
nIndex++;
}
}
xDataArray->setColumnDescriptions(aColDesc);
} elseif (aItem3.first.starts_with("resize"))
{ if (aItem3.second.size() >= 2)
{ auto aItem4 = aItem3.second.begin(); int nY = aItem4->second.get_value<int>(); int nX = (++aItem4)->second.get_value<int>();
if (nX < 1 || nY < 1)
{
lcl_LogWarning( "FillApi chart resize: wrong param" " (Needed: x,y >= 1)"); continue;
} // here we need to use the new insert column thing if (!lcl_ResizeChartColumns(xChartDoc, nX)) continue;
uno::Sequence<uno::Sequence<double>> aData
= xDataArray->getData(); if (aData.getLength() != nY)
aData.realloc(nY);
for (sal_Int32 j = 0; j < nY; ++j)
{
uno::Sequence<double>* pRows = aData.getArray(); // resize row if needed if (pRows[j].getLength() != nX)
{
pRows[j].realloc(nX);
}
}
xDataArray->setData(aData);
} else
{
lcl_LogWarning( "FillApi chart resize: not enough parameters" " (x,y is needed)");
}
} elseif (aItem3.first.starts_with("data"))
{ // set table data values
uno::Sequence<uno::Sequence<double>> aData
= xDataArray->getData();
// set only 1 cell data if (aItem3.first.starts_with("datayx."))
{ int nPoint = aItem3.first.find('.', 7); int nY = stoi(aItem3.first.substr(7, nPoint - 7)); int nX = stoi(aItem3.first.substr(nPoint + 1)); bool bValidIndex = false; if (nY < aData.getLength() && nY >= 0)
{
uno::Sequence<double>* pRows = aData.getArray(); if (nX < pRows[nY].getLength() && nX >= 0)
{ double* pCols = pRows[nY].getArray();
pCols[nX]
= aItem3.second.get_value<double>();
bValidIndex = true;
}
} if (!bValidIndex)
{
lcl_LogWarning( "FillApi chart datayx: invalid Index at: '"
+ aItem3.first + "'");
}
} else
{ // set the whole data table // resize if needed int nRowsCount = aItem3.second.size(); int nColsCount = 0;
for (constauto& aItem4 : aItem3.second)
{ if (nColsCount
< static_cast<int>(aItem4.second.size()))
{
nColsCount = aItem4.second.size();
}
}
if (nColsCount > 0)
{ // here we need to use the new insert column thing if(!lcl_ResizeChartColumns(xChartDoc, nColsCount)) continue;
if (aData.getLength() != nRowsCount)
aData.realloc(nRowsCount);
// set all the rows
sal_Int32 nY = 0; for (constauto& aItem4 : aItem3.second)
{
uno::Sequence<double>* pRows
= aData.getArray(); // resize row if needed if (pRows[nY].getLength() != nColsCount)
{
pRows[nY].realloc(nColsCount);
} double* pCols = pRows[nY].getArray(); // set all values in the row
sal_Int32 nX = 0; for (constauto& aItem5 : aItem4.second)
{ if (nX >= nColsCount)
{ // This should never happen break;
}
pCols[nX]
= aItem5.second.get_value<double>();
nX++;
}
nY++;
}
}
}
xDataArray->setData(aData);
} else
{
lcl_LogWarning("FillApi chart command not recognised: '"
+ aItem3.first + "'");
}
xModi->setModified(true);
}
} if (!bChartFound)
{
lcl_LogWarning("FillApi: No chart match the filter: '"
+ aItem2.first + "'");
}
} else
{
lcl_LogWarning("FillApi chart filter type not recognised: '"
+ aItem2.first + "'");
}
}
if (aItem2.first.starts_with("ContentControls"))
{
std::string aTextEnd = aItem2.first.substr(15);
std::string aValue = "";
ContentFilterType iKeyId = ContentFilterType::ERROR; // Find how the content control is identified: ByIndex, ByAlias... for (size_t i = 0; i < aIdTexts.size(); i++)
{ if (aTextEnd.starts_with(aIdTexts[i]))
{
iKeyId = static_cast<ContentFilterType>(i);
aValue = aTextEnd.substr(aIdTexts[i].length()); break;
}
} if (iKeyId != ContentFilterType::ERROR)
{ // Check all the content controls, if they match bool bCCFound = false; for (int i = 0; i < iCCcount; ++i)
{
uno::Reference<text::XTextContent> xContentControl;
xContentControls->getByIndex(i) >>= xContentControl;
uno::Reference<beans::XPropertySet> xContentControlProps(
xContentControl, uno::UNO_QUERY); if (!xContentControlProps.is()) continue;
// Compare the loaded and the actual identifier switch (iKeyId)
{ case ContentFilterType::INDEX:
{ if (stoi(aValue) != i) continue;
} break; case ContentFilterType::ID:
{
sal_Int32 iID = -1;
xContentControlProps->getPropertyValue(UNO_NAME_ID)
>>= iID; if (stoi(aValue) != iID) continue;
} break; case ContentFilterType::ALIAS:
{
OUString aAlias;
xContentControlProps->getPropertyValue(UNO_NAME_ALIAS)
>>= aAlias; if (OStringToOUString(aValue, RTL_TEXTENCODING_UTF8)
!= aAlias) continue;
} break; case ContentFilterType::TAG:
{
OUString aTag;
xContentControlProps->getPropertyValue(UNO_NAME_TAG)
>>= aTag; if (OStringToOUString(aValue, RTL_TEXTENCODING_UTF8)
!= aTag) continue;
} break; default: continue;
}
// We have a match, this content control need to be transformed // Set all the values (of the content control) what is needed
bCCFound = true; for (constauto& aItem3 : aItem2.second)
{ if (aItem3.first == "content")
{
std::string aContent
= aItem3.second.get_value<std::string>();
uno::Reference<text::XText> xContentControlText(
xContentControl, uno::UNO_QUERY); if (!xContentControlText.is()) continue;
case SID_LANGUAGE_STATUS:
{ // the value of used script types
OUString aScriptTypesInUse( OUString::number( static_cast<int>(rSh.GetScriptType()) ) );
// get keyboard language
OUString aKeyboardLang;
SwEditWin& rEditWin = GetView().GetEditWin();
LanguageType nLang = rEditWin.GetInputLanguage(); if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM)
aKeyboardLang = SvtLanguageTable::GetLanguageString( nLang );
// get the language that is in use
OUString aCurrentLang = u"*"_ustr;
nLang = SwLangHelper::GetCurrentLanguage( rSh ); if (nLang != LANGUAGE_DONTKNOW)
{
aCurrentLang = SvtLanguageTable::GetLanguageString( nLang ); if (comphelper::LibreOfficeKit::isActive())
{ if (nLang == LANGUAGE_NONE)
{
aCurrentLang += ";-";
} else
{
aCurrentLang += ";" + LanguageTag(nLang).getBcp47(false);
}
}
}
// build sequence for status value
uno::Sequence< OUString > aSeq{ aCurrentLang,
aScriptTypesInUse,
aKeyboardLang,
SwLangHelper::GetTextForLanguageGuessing( rSh ) };
// set sequence as status value
SfxStringListItem aItem( SID_LANGUAGE_STATUS );
aItem.SetStringList( aSeq );
rSet.Put( aItem );
} break;
case SID_THES:
{ // is there a valid selection to get text from?
OUString aText; bool bValid = !rSh.HasSelection() ||
(rSh.IsSelOnePara() && !rSh.IsMultiSelection()); // prevent context menu from showing when cursor is not in or at the end of a word // (GetCurWord will return the next word if there is none at the current position...) const sal_Int16 nWordType = ::i18n::WordType::DICTIONARY_WORD; bool bWord = rSh.IsInWord( nWordType ) || rSh.IsStartWord( nWordType ) || rSh.IsEndWord( nWordType ); if (bValid && bWord)
aText = rSh.HasSelection()? rSh.GetSelText() : rSh.GetCurWord();
// disable "Thesaurus" context menu entry if there is nothing to look up
uno::Reference< linguistic2::XThesaurus > xThes( ::GetThesaurus() ); if (aText.isEmpty() ||
!xThes.is() || nLang == LANGUAGE_NONE || !xThes->hasLocale( aLocale ))
rSet.DisableItem( SID_THES ); else
{ // set word and locale to look up as status value
OUString aStatusVal = aText + "#" + aLanguageTag.getBcp47();
rSet.Put( SfxStringItem( SID_THES, aStatusVal ) );
}
} break;
case FN_NUMBER_NEWSTART : if(!rSh.GetNumRuleAtCurrCursorPos())
rSet.DisableItem(nWhich); else
rSet.Put(SfxBoolItem(FN_NUMBER_NEWSTART,
rSh.IsNumRuleStart())); break;
case SID_EDIT_HYPERLINK:
{ if (!rSh.HasReadonlySel())
{
SfxItemSetFixed<RES_TXTATR_INETFMT, RES_TXTATR_INETFMT> aSet(GetPool());
rSh.GetCurAttr(aSet); if (SfxItemState::SET <= aSet.GetItemState(RES_TXTATR_INETFMT)) break;
// is the cursor at the beginning of a hyperlink? const SwTextNode* pTextNd = rSh.GetCursor()->GetPointNode().GetTextNode(); if (pTextNd && !rSh.HasSelection())
{ const sal_Int32 nIndex = rSh.GetCursor()->Start()->GetContentIndex(); const SwTextAttr* pINetFmt
= pTextNd->GetTextAttrAt(nIndex, RES_TXTATR_INETFMT); if (pINetFmt && !pINetFmt->GetINetFormat().GetValue().isEmpty()) break;
}
}
rSet.DisableItem(nWhich);
} break; case SID_REMOVE_HYPERLINK:
{ if (!rSh.HasReadonlySel())
{
SfxItemSetFixed<RES_TXTATR_INETFMT, RES_TXTATR_INETFMT> aSet(GetPool());
rSh.GetCurAttr(aSet);
// If a hyperlink is selected, either alone or along with other text... if (SfxItemState::SET <= aSet.GetItemState(RES_TXTATR_INETFMT)
|| aSet.GetItemState(RES_TXTATR_INETFMT) == SfxItemState::INVALID)
{ break;
}
// is the cursor at the beginning of a hyperlink? const SwTextNode* pTextNd = rSh.GetCursor()->GetPointNode().GetTextNode(); if (pTextNd && !rSh.HasSelection())
{ const sal_Int32 nIndex = rSh.GetCursor()->Start()->GetContentIndex(); const SwTextAttr* pINetFmt
= pTextNd->GetTextAttrAt(nIndex, RES_TXTATR_INETFMT); if (pINetFmt && !pINetFmt->GetINetFormat().GetValue().isEmpty()) break;
}
}
rSet.DisableItem(nWhich);
} break; case SID_TRANSLITERATE_HALFWIDTH: case SID_TRANSLITERATE_FULLWIDTH: case SID_TRANSLITERATE_HIRAGANA: case SID_TRANSLITERATE_KATAKANA:
{ if(!SvtCJKOptions::IsChangeCaseMapEnabled())
{
GetView().GetViewFrame().GetBindings().SetVisibleState( nWhich, false );
rSet.DisableItem(nWhich);
} else
GetView().GetViewFrame().GetBindings().SetVisibleState( nWhich, true );
} break; case FN_READONLY_SELECTION_MODE : if(!GetView().GetDocShell()->IsReadOnly())
rSet.DisableItem( nWhich ); else
{
rSet.Put(SfxBoolItem(nWhich, rSh.GetViewOptions()->IsSelectionInReadonly()));
} break; case FN_SELECTION_MODE_DEFAULT: case FN_SELECTION_MODE_BLOCK :
rSet.Put(SfxBoolItem(nWhich, (nWhich == FN_SELECTION_MODE_DEFAULT) != rSh.IsBlockMode())); break; case SID_COPY_HYPERLINK_LOCATION: case SID_OPEN_HYPERLINK:
{
SfxItemSetFixed<RES_TXTATR_INETFMT, RES_TXTATR_INETFMT> aSet(GetPool());
rSh.GetCurAttr(aSet); if (SfxItemState::SET <= aSet.GetItemState(RES_TXTATR_INETFMT, false)) break;
// is the cursor at the beginning of a hyperlink? const SwTextNode* pTextNd = rSh.GetCursor()->GetPointNode().GetTextNode(); if (pTextNd && !rSh.HasSelection())
{ const sal_Int32 nIndex = rSh.GetCursor()->Start()->GetContentIndex(); const SwTextAttr* pINetFmt = pTextNd->GetTextAttrAt(nIndex, RES_TXTATR_INETFMT); if (pINetFmt && !pINetFmt->GetINetFormat().GetValue().isEmpty()) break;
}
SwField* pField = rSh.GetCurField(); if (pField && pField->GetTyp()->Which() == SwFieldIds::TableOfAuthorities)
{ constauto& rAuthorityField = *static_cast<const SwAuthorityField*>(pField); if (auto targetType = rAuthorityField.GetTargetType();
targetType == SwAuthorityField::TargetType::UseDisplayURL
|| targetType == SwAuthorityField::TargetType::UseTargetURL)
{ // Check if the Bibliography entry has a target URL if (rAuthorityField.GetAbsoluteURL().getLength() > 0) break;
}
}
rSet.DisableItem(nWhich);
} break; case FN_OPEN_LOCAL_URL:
{ if (GetLocalURL(rSh).isEmpty())
{
rSet.DisableItem(nWhich);
}
} break; case SID_OPEN_SMARTTAGMENU:
{
std::vector< OUString > aSmartTagTypes;
uno::Sequence< uno::Reference< container::XStringKeyMap > > aStringKeyMaps;
uno::Reference<text::XTextRange> xRange;
if ( nWhich == FN_OUTLINE_RULE_INDEX )
{
rSet.Put(SfxUInt16Item(FN_OUTLINE_RULE_INDEX, USHRT_MAX));
NBOTypeMgrBase* pOutline = NBOutlineTypeMgrFact::CreateInstance(NBOType::Outline); if ( pOutline )
{ const sal_uInt16 nIndex = pOutline->GetNBOIndexForNumRule(aSvxRule,nActNumLvl);
rSet.Put(SfxUInt16Item(FN_OUTLINE_RULE_INDEX,nIndex));
}
}
}
} break; case FN_BUL_GET_DOC_BULLETS:
{
std::set<OUString> aBulletsSet = rSh.GetUsedBullets();
std::vector<OUString> aBullets;
std::copy(aBulletsSet.begin(), aBulletsSet.end(), std::back_inserter(aBullets));
SfxStringListItem aItem(FN_BUL_GET_DOC_BULLETS);
uno::Sequence<OUString> aSeq(aBullets.data(), static_cast<sal_Int32>(aBullets.size()));
aItem.SetStringList(aSeq);
rSet.Put(aItem);
} break; case FN_NUM_CONTINUE:
{ // #i86492# // Search also for bullet list
OUString aDummy; const SwNumRule* pRule =
rSh.SearchNumRule( true, aDummy ); if ( !pRule )
{
pRule = rSh.SearchNumRule( false, aDummy );
} if ( !pRule )
rSet.DisableItem(nWhich);
} break; case SID_INSERT_RLM : case SID_INSERT_LRM :
{ bool bEnabled = SvtCTLOptions::IsCTLFontEnabled();
GetView().GetViewFrame().GetBindings().SetVisibleState( nWhich, bEnabled ); if(!bEnabled)
rSet.DisableItem(nWhich);
} break; case SID_FM_CTL_PROPERTIES:
{ bool bDisable = false;
// First get the state from the form shell
SfxItemSetFixed<SID_FM_CTL_PROPERTIES, SID_FM_CTL_PROPERTIES> aSet(GetShell().GetAttrPool());
aSet.Put(SfxBoolItem( SID_FM_CTL_PROPERTIES, true ));
GetShell().GetView().GetFormShell()->GetState( aSet );
// Enable it if we have a valid object other than what form shell knows
SwPosition aPos(*GetShell().GetCursor()->GetPoint());
sw::mark::Fieldmark* pFieldBM = GetShell().getIDocumentMarkAccess()->getInnerFieldmarkFor(aPos); if ( !pFieldBM && aPos.GetContentIndex() > 0)
{
aPos.AdjustContent(-1);
pFieldBM = GetShell().getIDocumentMarkAccess()->getInnerFieldmarkFor(aPos);
} if ( pFieldBM && (pFieldBM->GetFieldname() == ODF_FORMDROPDOWN || pFieldBM->GetFieldname() == ODF_FORMDATE) )
{
bDisable = false;
}
if(bDisable)
rSet.DisableItem(nWhich);
} break; case SID_COPY: case SID_CUT:
{ if (GetObjectShell()->isContentExtractionLocked())
rSet.DisableItem(nWhich); break;
} case FN_PROTECT_FIELDS: case FN_PROTECT_BOOKMARKS:
{
DocumentSettingId aSettingId = nWhich == FN_PROTECT_FIELDS
? DocumentSettingId::PROTECT_FIELDS
: DocumentSettingId::PROTECT_BOOKMARKS; bool bProtected = rSh.getIDocumentSettingAccess().get(aSettingId);
rSet.Put(SfxBoolItem(nWhich, bProtected));
} break; case FN_DELETE_CONTENT_CONTROL: case FN_CONTENT_CONTROL_PROPERTIES:
{ if (!GetShell().CursorInsideContentControl())
{
rSet.DisableItem(nWhich);
}
} break;
}
nWhich = aIter.NextWhich();
}
}
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.