/* -*- 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 .
*/ #ifndef INCLUDED_SW_INC_PAM_HXX #define INCLUDED_SW_INC_PAM_HXX
/// These all set both nNode and nContent void Assign( const SwNode& rNd, SwNodeOffset nDelta, sal_Int32 nContentOffset = 0 ); void Assign( SwNodeOffset nNodeOffset, sal_Int32 nContentOffset = 0 ); void Assign( const SwContentNode& rNode, sal_Int32 nContentOffset = 0 ); void Assign( const SwNode& rNd, sal_Int32 nContentOffset = 0 ); void Assign( const SwNodeIndex& rNdIdx, sal_Int32 nContentOffset = 0 ); /// Set nNode to rNd, and nContent to the beginning of rNd void AssignStartIndex( const SwContentNode& rNd ); /// Set nNode to rNd, and nContent to the end of rNd void AssignEndIndex( const SwContentNode& rNd ); /// Adjust node position, and resets content position to zero void Adjust( SwNodeOffset nDelta ); /// Adjust content index, only valid to call this if the position points to a SwContentNode subclass void AdjustContent( sal_Int32 nDelta ); /// Set content index, only valid to call this if the position points to a SwContentNode subclass void SetContent( sal_Int32 nContentIndex );
};
// Result of comparing positions. enumclass SwComparePosition {
Before, ///< Pos1 before Pos2.
Behind, ///< Pos1 behind Pos2.
Inside, ///< Pos1 completely contained in Pos2.
Outside, ///< Pos2 completely contained in Pos1.
Equal, ///< Pos1 is as large as Pos2.
OverlapBefore, ///< Pos1 overlaps Pos2 at the beginning.
OverlapBehind, ///< Pos1 overlaps Pos2 at the end.
CollideStart, ///< Pos1 start touches at Pos2 end.
CollideEnd ///< Pos1 end touches at Pos2 start.
};
/** * PaM is Point and Mark: a selection of the document model. * * The reason for the distinction is that the point moves around during adjusting the selection with * shift-arrow keys, while the mark remains where it is.
*/ class SAL_WARN_UNUSED SW_DLLPUBLIC SwPaM : public sw::Ring<SwPaM>
{
SwPosition m_Bound1;
SwPosition m_Bound2;
SwPosition * m_pPoint; ///< points at either m_Bound1 or m_Bound2
SwPosition * m_pMark; ///< points at either m_Bound1 or m_Bound2 bool m_bIsInFrontOfLabel;
/// this takes a second parameter, which indicates the Ring that /// the new PaM should be part of (may be null)
SwPaM(SwPaM const& rPaM, SwPaM * pRing); /// @@@ semantic: no copy assignment for super class Ring.
SwPaM& operator=( const SwPaM & );
/// Movement of cursor. bool Move( SwMoveFnCollection const & fnMove = fnMoveForward,
SwGoInDoc fnGo = GoInContent );
/// Unless this is called, the getter method of Mark will return Point. virtualvoid SetMark();
void DeleteMark()
{ if (HasMark())
{ /** clear the mark position; this helps if mark's SwContentIndex is
registered at some node, and that node is then deleted */
m_pMark->Assign( *GetPointNode().GetNodes()[SwNodeOffset(0)] );
m_pMark = m_pPoint;
}
} void Exchange()
{ if (HasMark())
std::swap(m_pPoint, m_pMark);
}
/** A PaM marks a selection if Point and Mark are distinct positions. @return true if the PaM spans a selection
*/ bool HasMark() const { return m_pPoint != m_pMark; }
/// Because sometimes the cost of the operator<= can add up
std::pair<const SwPosition *, const SwPosition *> StartEnd() const
{ if ((*m_pPoint) <= (*m_pMark)) return { m_pPoint, m_pMark }; elsereturn { m_pMark, m_pPoint }; }
std::pair<SwPosition *, SwPosition *> StartEnd()
{ if ((*m_pPoint) <= (*m_pMark)) return { m_pPoint, m_pMark }; elsereturn { m_pMark, m_pPoint }; }
/// @return current Node at Point/Mark
SwNode& GetPointNode() const { return m_pPoint->nNode.GetNode(); }
SwNode& GetMarkNode() const { return m_pMark->nNode.GetNode(); }
/// @return current ContentNode at Point/Mark
SwContentNode* GetPointContentNode() const { return m_pPoint->nNode.GetNode().GetContentNode(); }
SwContentNode* GetMarkContentNode() const { return m_pMark->nNode.GetNode().GetContentNode(); }
/** Normalizes PaM, i.e. sort point and mark.
@param bPointFirst true: If the point is behind the mark then swap. false: If the mark is behind the point then swap.
*/ void Normalize(bool bPointFirst = true);
/// @return the document (SwDoc) at which the PaM is registered
SwDoc& GetDoc() const { return m_pPoint->nNode.GetNode().GetDoc(); }
SwPosition& GetBound( bool bOne = true )
{ return bOne ? m_Bound1 : m_Bound2; } const SwPosition& GetBound( bool bOne = true ) const
{ return bOne ? m_Bound1 : m_Bound2; }
/// Get number of page which contains cursor.
sal_uInt16 GetPageNum( bool bAtPoint = true, const Point* pLayPos = nullptr );
/** Is in something protected (readonly) or selection contains
something protected. */ bool HasReadonlySel(bool bFormView, bool isReplace) const; /** Is there hidden sections in the selected area. */ bool HasHiddenSections() const;
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.