Impressum wrtsh1.cxx
Interaktion und PortierbarkeitC
/* -*- 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 .
*/
staticbool lcl_IsAllowed(const SwWrtShell* rSh)
{ if (rSh->GetViewOptions()->IsShowOutlineContentVisibilityButton() && rSh->IsEndPara())
{
SwTextNode* pTextNode = rSh->GetCursor()->GetPointNode().GetTextNode(); if (pTextNode && pTextNode->IsOutline())
{ // disallow if this is an outline node having folded content if (!pTextNode->GetAttrOutlineContentVisible()) returnfalse;
}
} returntrue;
}
if( bHasSel || ( !m_bIns && IsInHiddenRange(/*bSelect=*/true) ) )
{ // Only here parenthesizing, because the normal // insert is already in parentheses at Editshell.
StartAllAction();
StartUndo(SwUndoId::REPLACE, &aRewriter);
bStarted = true;
Push(); // let's interpret a selection within the same node as "replace"
bDeleted = DelRight(GetCursor()->GetPoint()->GetNode() == GetCursor()->GetMark()->GetNode());
Pop(SwCursorShell::PopMode::DeleteCurrent); // Restore selection (if tracking changes)
NormalizePam(false); // tdf#127635 put point at the end of deletion
ClearMark();
}
// Check whether node is content control
SwTextContentControl* pTextContentControl = CursorInsideContentControl(); if (pTextContentControl)
{
std::shared_ptr<SwContentControl> pContentControl =
pTextContentControl->GetContentControl().GetContentControl(); if (pContentControl)
{ // Set showingPlcHdr to false as node has been edited
pContentControl->SetShowingPlaceHolder(false);
}
}
if( bStarted )
{
EndUndo();
EndAllAction();
}
}
// Maximum height limit not possible, because the maximum height // of the current frame can not be obtained.
if ( HasSelection() )
DelRight(); // Inserted graphics in its own paragraph, // if at the end of a non-empty paragraph. //For i120928,avoid to split node
EnterSelFrameMode();
bool bSetGrfSize = true; bool bOwnMgr = false;
if ( !pFrameMgr )
{
bOwnMgr = true;
pFrameMgr = new SwFlyFrameAttrMgr( true, this, Frmmgr_Type::GRF, nullptr );
// CAUTION // GetAttrSet makes an adjustment // While pasting is a SwFrameSize present // because of the DEF-Framesize // These must be removed explicitly for the optimal size.
pFrameMgr->DelAttr(RES_FRM_SIZE);
if (nAnchorType != RndStdIds::FLY_AT_PARA) // Something other than at-para was requested.
pFrameMgr->SetAnchor(nAnchorType);
} else
{
Size aSz( pFrameMgr->GetSize() ); if ( !aSz.Width() || !aSz.Height() )
{
aSz.setWidth(o3tl::toTwips(1, o3tl::Length::cm));
aSz.setHeight(o3tl::toTwips(1, o3tl::Length::cm));
pFrameMgr->SetSize( aSz );
} elseif ( aSz.Width() != DFLT_WIDTH && aSz.Height() != DFLT_HEIGHT )
bSetGrfSize = false;
// during change tracking, insert the image anchored as character // (to create an SwRangeRedline on its anchor point) if ( IsRedlineOn() && nAnchorType != RndStdIds::FLY_AS_CHAR )
pFrameMgr->SetAnchor( RndStdIds::FLY_AS_CHAR );
// Insert the graphic
SwFEShell::Insert(rPath, rFilter, &rGrf, &pFrameMgr->GetAttrSet()); if ( bOwnMgr )
pFrameMgr->UpdateAttrMgr();
if (nPreferredDPI > 0)
{ auto nWidth = o3tl::toTwips(aSizePixel.Width() / double(nPreferredDPI), o3tl::Length::in); auto nHeight = o3tl::toTwips(aSizePixel.Height() / double(nPreferredDPI), o3tl::Length::in);
aGrfSize = Size(nWidth, nHeight);
} else
{
GetGrfSize(aGrfSize);
}
// Add the margin attributes to GrfSize, // because these counts at the margin additionally
aGrfSize.AdjustWidth(pFrameMgr->CalcWidthBorder() );
aGrfSize.AdjustHeight(pFrameMgr->CalcHeightBorder() );
//#50270# We don't need to handle error, this is handled by the //DoVerb in the SfxViewShell
pClient->DoVerb(embed::EmbedVerbs::MS_OLEVERB_SHOW);
// TODO/LATER: set document name - should be done in Client
}
}
} else
{ if( HasSelection() )
DelRight();
InsertOleObject( xRef );
}
}
// Insert object into the Core. // From ClipBoard or Insert
bool SwWrtShell::InsertOleObject( const svt::EmbeddedObjectRef& xRef, SwFlyFrameFormat **pFlyFrameFormat )
{ //tdf#125100 Ensure that ole object is initially shown as pictogram
comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = mxDoc->GetDocShell()->getEmbeddedObjectContainer(); bool bSaveUserAllowsLinkUpdate = rEmbeddedObjectContainer.getUserAllowsLinkUpdate();
rEmbeddedObjectContainer.setUserAllowsLinkUpdate(true);
ResetCursorStack();
StartAllAction();
StartUndo(SwUndoId::INSERT);
//Some differences between StarMath and any other objects: //1. Selections should be deleted. For StarMath the Text should be // passed to the Object //2. If the cursor is at the end of a non empty paragraph a paragraph // break should be inserted. StarMath objects are character bound and // no break should be inserted. //3. If an selection is passed to a StarMath object, this object should // not be activated. false should be returned then. bool bStarMath = true; bool bActivate = true;
// set parent to get correct VisArea(in case of object needing parent printer)
uno::Reference < container::XChild > xChild( xRef.GetObject(), uno::UNO_QUERY ); if ( xChild.is() )
xChild->setParent( mxDoc->GetDocShell()->GetModel() );
// The current selected OLE object will be loaded with the // verb into the server. void SwWrtShell::LaunchOLEObj(sal_Int32 nVerb)
{ if ( GetCntType() != CNT_OLE ||
GetView().GetViewFrame().GetFrame().IsInPlace() ) return;
svt::EmbeddedObjectRef& xRef = GetOLEObject();
OSL_ENSURE( xRef.is(), "OLE not found" );
// LOK: we don't want to handle any other embedded objects than // charts, there are too many problems with eg. embedded spreadsheets // (like it creates a separate view for the calc sheet) if (comphelper::LibreOfficeKit::isActive())
{ constauto classId = xRef->getClassID(); if (!SotExchange::IsChart(classId) && !SotExchange::IsMath(classId)) return;
}
SfxInPlaceClient* pCli = GetView().FindIPClient( xRef.GetObject(), &GetView().GetEditWin() ); if ( !pCli )
pCli = new SwOleClient( &GetView(), &GetView().GetEditWin(), xRef );
void SwWrtShell::CalcAndSetScale( svt::EmbeddedObjectRef& xObj, const SwRect *pFlyPrtRect, const SwRect *pFlyFrameRect, constbool bNoTextFramePrtAreaChanged )
{ // Setting the scale of the client. This arises from the difference // between the VisArea of the object and the ObjArea.
OSL_ENSURE( xObj.is(), "ObjectRef not valid" );
sal_Int64 nAspect = xObj.GetViewAspect(); if ( nAspect == embed::Aspects::MSOLE_ICON ) return; // the replacement image is completely controlled by container in this case
sal_Int64 nMisc = 0; bool bLinkingChart = false;
try
{
nMisc = xObj->getStatus( nAspect );
// This can surely only be a non-active object, if desired they // get the new size set as VisArea (StarChart). if( embed::EmbedMisc::MS_EMBED_RECOMPOSEONRESIZE & nMisc )
{ // TODO/MBA: testing
SwRect aRect( pFlyPrtRect ? *pFlyPrtRect
: GetAnyCurRect( CurRectType::FlyEmbeddedPrt, nullptr, xObj.GetObject() )); if( !aRect.IsEmpty() )
{ // TODO/LEAN: getMapUnit can switch object to running state // xObj.TryRunningState();
// Action 'setVisualAreaSize' doesn't have to turn on the // modified state of the document, either. bool bModified = false;
uno::Reference<util::XModifiable> xModifiable(xObj->getComponent(), uno::UNO_QUERY); if (xModifiable.is())
bModified = xModifiable->isModified();
xObj->setVisualAreaSize( nAspect, aSz );
xModifiable.set(xObj->getComponent(), uno::UNO_QUERY); if (xModifiable.is() && xModifiable->isModified() && !bModified)
xModifiable->setModified(bModified);
// #i48419# - action 'UpdateReplacement' doesn't // have to change the modified state of the document. // This is only a workaround for the defect, that this action // modifies a document after load, because unnecessarily the // replacement graphic is updated, in spite of the fact that // nothing has been changed. // If the replacement graphic changes by this action, the document // will be already modified via other mechanisms.
{ bool bResetEnableSetModified(false); if ( GetDoc()->GetDocShell()->IsEnableSetModified() )
{
GetDoc()->GetDocShell()->EnableSetModified( false );
bResetEnableSetModified = true;
}
//#i79576# don't destroy chart replacement images on load //#i79578# don't request a new replacement image for charts to often //a chart sends a modified call to the framework if it was changed //thus the replacement update is already handled elsewhere if ( !SotExchange::IsChart( xObj->getClassID() ) )
xObj.UpdateReplacement();
if ( bResetEnableSetModified )
{
GetDoc()->GetDocShell()->EnableSetModified();
}
}
}
// TODO/LATER: this is only a workaround,
uno::Reference< chart2::XChartDocument > xChartDocument( xObj->getComponent(), uno::UNO_QUERY );
bLinkingChart = ( xChartDocument.is() && !xChartDocument->hasInternalDataProvider() );
}
} catch (const uno::Exception&)
{ // TODO/LATER: handle the error return;
}
SfxInPlaceClient* pCli = GetView().FindIPClient( xObj.GetObject(), &GetView().GetEditWin() ); if ( !pCli )
{ if ( (embed::EmbedMisc::EMBED_ACTIVATEIMMEDIATELY & nMisc)
|| bLinkingChart // --> OD #i117189# - refine condition for non-resizable objects // non-resizable objects need to be set the size back by this method
|| ( bNoTextFramePrtAreaChanged && nMisc & embed::EmbedMisc::EMBED_NEVERRESIZE ) )
{
pCli = new SwOleClient( &GetView(), &GetView().GetEditWin(), xObj );
} else return;
}
// TODO/LEAN: getMapUnit can switch object to running state // xObj.TryRunningState();
awt::Size aSize; try
{
aSize = xObj->getVisualAreaSize( nAspect );
} catch (const embed::NoVisualAreaSizeException&)
{
OSL_FAIL("Can't get visual area size!" ); // the scaling will not be done
} catch (const uno::Exception&)
{ // TODO/LATER: handle the error
OSL_FAIL("Can't get visual area size!" ); return;
}
// As long as there comes no reasonable size from the object, // nothing can be scaled. if( _aVisArea.Width() && _aVisArea.Height() )
{ const MapMode aTmp( MapUnit::MapTwip );
MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
_aVisArea = OutputDevice::LogicToLogic(_aVisArea, MapMode(aUnit), aTmp);
Size aObjArea; if ( pFlyPrtRect )
aObjArea = pFlyPrtRect->SSize(); else
aObjArea = GetAnyCurRect( CurRectType::FlyEmbeddedPrt, nullptr, xObj.GetObject() ).SSize();
// differ the aObjArea and _aVisArea by 1 Pixel then set new VisArea
tools::Long nX, nY;
SwSelPaintRects::Get1PixelInLogic( *this, &nX, &nY ); if( !( _aVisArea.Width() - nX <= aObjArea.Width() &&
_aVisArea.Width() + nX >= aObjArea.Width() &&
_aVisArea.Height()- nY <= aObjArea.Height()&&
_aVisArea.Height()+ nY >= aObjArea.Height() ))
{ if ( nMisc & embed::EmbedMisc::EMBED_NEVERRESIZE )
{ // the object must not be scaled, // the size stored in object must be used for restoring
bUseObjectSize = true;
} else
{
aScaleWidth = Fraction( aObjArea.Width(), _aVisArea.Width() );
aScaleHeight = Fraction( aObjArea.Height(), _aVisArea.Height());
}
}
}
// Now is the favorable time to set the ObjArea. // The Scaling must be considered.
SwRect aArea; if ( pFlyPrtRect )
{
aArea = *pFlyPrtRect;
aArea += pFlyFrameRect->Pos();
} else
{
aArea = GetAnyCurRect( CurRectType::FlyEmbeddedPrt, nullptr, xObj.GetObject() );
aArea.Pos() += GetAnyCurRect( CurRectType::FlyEmbedded, nullptr, xObj.GetObject() ).Pos();
}
if ( bUseObjectSize )
{ // --> this moves non-resizable object so that when adding borders the baseline remains the same const SwFlyFrameFormat *pFlyFrameFormat = dynamic_cast< const SwFlyFrameFormat * >( GetFlyFrameFormat() );
OSL_ENSURE( pFlyFrameFormat, "Could not find fly frame." ); if ( pFlyFrameFormat )
{ const Point &rPoint = pFlyFrameFormat->GetLastFlyFramePrtRectPos();
SwRect aRect( pFlyPrtRect ? *pFlyPrtRect
: GetAnyCurRect( CurRectType::FlyEmbeddedPrt, nullptr, xObj.GetObject() ));
aArea += rPoint - aRect.Pos(); // adjust area by diff of printing area position in order to keep baseline alignment correct.
}
aArea.Width ( _aVisArea.Width() );
aArea.Height( _aVisArea.Height() );
RequestObjectResize( aArea, xObj.GetObject() );
} else
{ double nWidth(pCli->GetScaleWidth()); double nHeight(pCli->GetScaleHeight()); if (nWidth && nHeight)
{
aArea.Width ( aArea.Width() / nWidth );
aArea.Height( aArea.Height() / nHeight );
}
}
if ( !IsCursorInTable() )
{ if(HasSelection())
DelRight();
SwFEShell::SplitNode(); // delete the numbered attribute of the last line if the last line is empty
GetDoc()->ClearLineNumAttrs( *GetCursor()->GetPoint() );
}
{
SwPaM aLocalPam(rPaM, nullptr);
aLocalPam.Normalize(); // point is at start now auto& contentOperations = SwViewShell::getIDocumentContentOperations();
// To copy the formatting of the start of the range, insert the start string in two // phases: insert it after the first selected character; and then move it back
SwPosition posStart = *aLocalPam.GetPoint();
aLocalPam.GetPoint()->AdjustContent(+1);
contentOperations.InsertString(aLocalPam, sStartStr); // Now aLocalPam's point is *after* the inserted string
SwPaM insertedPaM(*aLocalPam.GetPoint());
insertedPaM.SetMark();
insertedPaM.GetPoint()->AdjustContent(-sStartStr.getLength());
contentOperations.CopyRange(insertedPaM, posStart, SwCopyFlags::CopyAll);
contentOperations.DeleteRange(insertedPaM);
// No such problems with end string
aLocalPam.Exchange(); // point is at end now
contentOperations.InsertString(aLocalPam, sEndStr);
}
rPaM.Start()->AdjustContent(-sStartStr.getLength()); // now the selection includes insertion
}
void SwWrtShell::InsertContentControl(SwContentControlType eType)
{ if (!lcl_IsAllowed(this))
{ return;
}
ResetCursorStack(); if (!CanInsert())
{ return;
}
auto pContentControl = std::make_shared<SwContentControl>(nullptr);
// Make Random ID... check if it is unique // warning: possible infinite loop if there would be billions of content controls.
SwContentControlManager& pManager = GetDoc()->GetContentControlManager();
size_t nCCCount = pManager.GetCount();
sal_Int32 nIdToCheck;
nIdToCheck
= comphelper::rng::uniform_uint_distribution(1, std::numeric_limits<sal_Int32>::max());
size_t nIdx = 0; while (nIdx < nCCCount)
{
sal_Int32 nID
= pManager.UnsortedGet(nIdx)->GetContentControl().GetContentControl()->GetId(); if (nID == nIdToCheck)
{
nIdToCheck = comphelper::rng::uniform_uint_distribution(
1, std::numeric_limits<sal_Int32>::max());
nIdx = 0;
} else
nIdx++;
}
pContentControl->SetId(nIdToCheck);
OUString aPlaceholder; switch (eType)
{ case SwContentControlType::RICH_TEXT: case SwContentControlType::PLAIN_TEXT:
{
pContentControl->SetShowingPlaceHolder(true); if (eType == SwContentControlType::PLAIN_TEXT)
{
pContentControl->SetPlainText(true);
} if (!HasSelection())
{
aPlaceholder = SwResId(STR_CONTENT_CONTROL_PLACEHOLDER);
} break;
} case SwContentControlType::CHECKBOX:
{
pContentControl->SetCheckbox(true); // Ballot Box with X
pContentControl->SetCheckedState(u"\u2612"_ustr); // Ballot Box
pContentControl->SetUncheckedState(u"\u2610"_ustr);
aPlaceholder = u"\u2610"_ustr; break;
} case SwContentControlType::COMBO_BOX: case SwContentControlType::DROP_DOWN_LIST:
{ if (eType == SwContentControlType::COMBO_BOX)
{
pContentControl->SetComboBox(true);
} elseif (eType == SwContentControlType::DROP_DOWN_LIST)
{
pContentControl->SetDropDown(true);
}
pContentControl->SetShowingPlaceHolder(true); if (!HasSelection())
{
aPlaceholder = SwResId(STR_DROPDOWN_CONTENT_CONTROL_PLACEHOLDER);
}
SwContentControlListItem aListItem;
aListItem.m_aValue = aPlaceholder;
pContentControl->SetListItems({ std::move(aListItem) }); break;
} case SwContentControlType::PICTURE:
{ // Set up the picture content control.
pContentControl->SetShowingPlaceHolder(true);
pContentControl->SetPicture(true);
// determine end node of folded outline content
SwNode* pEndNd = &rNodes.GetEndOfContent(); if (rOutlineNodes.size() > nPos + 1)
pEndNd = rOutlineNodes[nPos + 1];
if (pThis->GetViewOptions()->IsTreatSubOutlineLevelsAsContent())
{ // get the next outline node after the folded outline content (iPos) // it is the next outline node with the same level or less int nLevel = pSttNd->GetTextNode()->GetAttrOutlineLevel();
SwOutlineNodes::size_type iPos = nPos; while (++iPos < rOutlineNodes.size() &&
rOutlineNodes[iPos]->GetTextNode()->GetAttrOutlineLevel() > nLevel);
// get the correct end node // the outline node may be in frames, headers, footers special section of doc model
SwNode* pStartOfSectionNodeSttNd = pSttNd->StartOfSectionNode(); while (pStartOfSectionNodeSttNd->StartOfSectionNode()
!= pStartOfSectionNodeSttNd->StartOfSectionNode()->StartOfSectionNode())
{
pStartOfSectionNodeSttNd = pStartOfSectionNodeSttNd->StartOfSectionNode();
}
pEndNd = pStartOfSectionNodeSttNd->EndOfSectionNode();
if (iPos < rOutlineNodes.size())
{
SwNode* pStartOfSectionNode = rOutlineNodes[iPos]->StartOfSectionNode(); while (pStartOfSectionNode->StartOfSectionNode()
!= pStartOfSectionNode->StartOfSectionNode()->StartOfSectionNode())
{
pStartOfSectionNode = pStartOfSectionNode->StartOfSectionNode();
} if (pStartOfSectionNodeSttNd == pStartOfSectionNode)
pEndNd = rOutlineNodes[iPos];
}
}
// table, text box, header, footer if (pSttNd->GetTableBox() || pSttNd->GetIndex() < rNodes.GetEndOfExtras().GetIndex())
{ // insert before section end node if (pSttNd->EndOfSectionIndex() < pEndNd->GetIndex())
{
SwNodeIndex aIdx(*pSttNd->EndOfSectionNode()); while (aIdx.GetNode().IsEndNode())
--aIdx;
++aIdx;
pEndNd = &aIdx.GetNode();
}
} // if pSttNd isn't in table but pEndNd is then insert after table elseif (pEndNd->GetTableBox())
{
pEndNd = pEndNd->FindTableNode();
SwNodeIndex aIdx(*pEndNd, -1); // account for nested tables while (aIdx.GetNode().GetTableBox())
{
pEndNd = aIdx.GetNode().FindTableNode();
aIdx.Assign(*pEndNd, -1);
}
aIdx.Assign(*pEndNd->EndOfSectionNode(), +1);
pEndNd = &aIdx.GetNode();
} // end node determined
// now insert the new outline node
SwDoc* pDoc = pThis->GetDoc();
// insert at end of tablebox doesn't work correct without
MakeAllOutlineContentTemporarilyVisible a(pDoc);
// if the outline level is not set in style then it is set in direct formatting if (!pTextNode->GetTextColl()->GetAttrOutlineLevel())
pNd->SetAttrOutlineLevel(pTextNode->GetAttrOutlineLevel());
if (!bHandled)
SwFEShell::SplitNode( bAutoFormat );
EndUndo(SwUndoId::SPLITNODE);
}
// Turn on numbering // Parameter: Optional specification of a name for the named list; // this indicates a position if it is possible to convert them // into a number and less than nMaxRules.
// To test the CharFormats at the numbering // external void SetNumChrFormat( SwWrtShell*, SwNumRules& );
// -> #i40041# // Preconditions (as far as OD has figured out): // - <SwEditShell::HasNumber()> is false, if <bNum> is true // - <SwEditShell::HasBullet()> is false, if <bNum> is false // Behavior of method is determined by the current situation at the current // cursor position in the document. void SwWrtShell::NumOrBulletOn(bool bNum)
{
StartUndo(SwUndoId::NUMORNONUM);
// - activate outline rule respectively turning on outline rule for // current text node. But, only for turning on a numbering (<bNum> == true). // - overwrite found numbering rule at current cursor position, if // no numbering rule can be retrieved from the paragraph style. bool bContinueFoundNumRule( false ); bool bActivateOutlineRule( false ); int nActivateOutlineLvl( MAXLEVEL ); // only relevant, if <bActivateOutlineRule> == true
SwTextFormatColl * pColl = GetCurTextFormatColl(); if ( pColl )
{ // retrieve numbering rule at paragraph // style, which is found at current cursor position in the document.
SwNumRule* pCollRule = mxDoc->FindNumRulePtr(pColl->GetNumRule().GetValue()); // #125993# - The outline numbering rule isn't allowed // to be derived from a parent paragraph style to a derived one. // Thus check, if the found outline numbering rule is directly // set at the paragraph style <pColl>. If not, set <pCollRule> to NULL if ( pCollRule && pCollRule == GetDoc()->GetOutlineNumRule() )
{ const SwNumRule* pDirectCollRule =
mxDoc->FindNumRulePtr(pColl->GetNumRule( false ).GetValue()); if ( !pDirectCollRule )
{
pCollRule = nullptr;
}
}
if ( !pCollRule )
{
pNumRule = pCollRule;
} // no activation or continuation of outline numbering in Writer/Web document elseif ( bNum &&
!dynamic_cast<SwWebDocShell*>(GetDoc()->GetDocShell()) &&
pCollRule == GetDoc()->GetOutlineNumRule() )
{ if ( pNumRule == pCollRule )
{ // check, if text node at current cursor positioned is counted. // If not, let it been counted. Then it has to be checked, // of the outline numbering has to be activated or continued.
SwTextNode const*const pTextNode = sw::GetParaPropsNode(
*GetLayout(), GetCursor()->GetPoint()->GetNode()); if ( pTextNode && !pTextNode->IsCountedInList() )
{ // check, if numbering of the outline level of the paragraph // style is active. If not, activate this outline level.
nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();
OSL_ENSURE( pColl->IsAssignedToListLevelOfOutlineStyle(), " - paragraph style with outline rule, but no outline level" ); if ( pColl->IsAssignedToListLevelOfOutlineStyle() &&
pCollRule->Get( o3tl::narrowing<sal_uInt16>(nActivateOutlineLvl) ).GetNumberingType()
== SVX_NUM_NUMBER_NONE )
{ // activate outline numbering
bActivateOutlineRule = true;
} else
{ // turning on outline numbering at current cursor position
bContinueFoundNumRule = true;
}
} else
{ // #i101234# // activate outline numbering, because from the precondition // it's known, that <SwEdit::HasNumber()> == false
bActivateOutlineRule = true;
nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();
}
} elseif ( !pNumRule )
{ // #i101234# // Check, if corresponding list level of the outline numbering // has already a numbering format set.
nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel(); if ( pCollRule->Get( o3tl::narrowing<sal_uInt16>(nActivateOutlineLvl) ).GetNumberingType()
== SVX_NUM_NUMBER_NONE )
{ // activate outline numbering, because from the precondition // it's known, that <SwEdit::HasNumber()> == false
bActivateOutlineRule = true;
} else
{ // turning on outline numbering at current cursor position
bContinueFoundNumRule = true;
}
} else
{ // check, if numbering of the outline level of the paragraph // style is active. If not, activate this outline level.
nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();
OSL_ENSURE( pColl->IsAssignedToListLevelOfOutlineStyle(), " - paragraph style with outline rule, but no outline level" ); if ( pColl->IsAssignedToListLevelOfOutlineStyle() &&
pCollRule->Get( o3tl::narrowing<sal_uInt16>(nActivateOutlineLvl) ).GetNumberingType()
== SVX_NUM_NUMBER_NONE )
{ // activate outline numbering
bActivateOutlineRule = true;
} else
{ // turning on outline numbering at current cursor position
bContinueFoundNumRule = true;
}
}
pNumRule = pCollRule;
}
}
// Only automatic numbering/bullet rules should be changed. // Note: The outline numbering rule is also an automatic one. It's only // changed, if it has to be activated. if ( pNumRule )
{ if ( !pNumRule->IsAutoRule() )
{
pNumRule = nullptr;
} elseif ( pNumRule == GetDoc()->GetOutlineNumRule() &&
!bActivateOutlineRule && !bContinueFoundNumRule )
{
pNumRule = nullptr;
}
}
// Search for a previous numbering/bullet rule to continue it.
OUString sContinuedListId; if ( !pNumRule )
{
pNumRule = GetDoc()->SearchNumRule( *GetCursor()->GetPoint(), false, bNum, false, 0,
sContinuedListId, GetLayout() );
bContinueFoundNumRule = pNumRule != nullptr;
}
if (pNumRule)
{
SwNumRule aNumRule(*pNumRule);
// do not change found numbering/bullet rule, if it should only be continued. if ( !bContinueFoundNumRule )
{
SwTextNode const*const pTextNode = sw::GetParaPropsNode(
*GetLayout(), GetCursor()->GetPoint()->GetNode());
if (pTextNode)
{ // use above retrieve outline level, if outline numbering has to be activated. int nLevel = bActivateOutlineRule
? nActivateOutlineLvl
: pTextNode->GetActualListLevel();
// #i38904# Default alignment for // numbering/bullet should be rtl in rtl paragraph: if ( bRightToLeft )
{
aFormat.SetNumAdjust( SvxAdjust::Right );
}
const SwTwips nTextNodeIndent = pTextNode->GetAdditionalIndentForStartingNewList(); if ( ( nTextNodeIndent + nWidthOfTabs ) != 0 )
{ // #i111172#/fdo#85666 // If text node is already inside a list, assure that the indents // are the same. Thus, adjust the indent change value by subtracting // indents of to be applied list style.
SwTwips nIndentChange = nTextNodeIndent + nWidthOfTabs; if ( pTextNode->GetNumRule() )
{ int nLevel = pTextNode->GetActualListLevel();
if (nLevel < 0)
nLevel = 0;
if (nLevel >= MAXLEVEL)
nLevel = MAXLEVEL - 1;
const SwNumFormat& aFormat( aNumRule.Get( nLevel ) ); if ( aFormat.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
{
nIndentChange -= aFormat.GetIndentAt() + aFormat.GetFirstLineIndent();
}
}
aNumRule.ChangeIndent( nIndentChange );
}
} // reset indent attribute on applying list style // start new list
SetCurNumRule( aNumRule, true, OUString(), true );
}
SelectionType SwWrtShell::GetSelectionType() const
{ // ContentType cannot be determined within a Start-/EndAction. // Because there is no invalid value TEXT will be returned. // The value does not matter, it may be updated in EndAction anyway.
if (ActionPend()) return IsSelFrameMode() ? SelectionType::Frame : SelectionType::Text;
¤ 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.0.26Bemerkung:
Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können
¤
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.