summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <Michael.Stahl@cib.de>2018-10-24 12:09:40 +0200
committerMichael Stahl <Michael.Stahl@cib.de>2018-11-10 19:47:00 +0100
commite7ca17bb9a7490c3f763e239486a580376533edb (patch)
treeda446700e0ee34bff10ff860953867b08fee742b
parent3466611d51c4dae1d60cac098315b32d1088f15e (diff)
sw_redlinehide_3: adapt SwContentTree/SwOutlineContent to gaps
The SwOutlineContent::GetPos() returns the outline position in the document model / IDocumentOutlineNodesAccess; rename it to make that more clear. Also it's already possible to have gaps in the list entries by setting the outline level so that inner levels are filtered; the SwContentTree::ExecCommand() doesn't appear to handle this properly, it needs some tweaks to skip over the outline nodes that don't have list entries. The GetYPos() does not contain the outline index, it contains the list entry index. Change-Id: Ifae0b9648ce61bb9aa470172ef989b2532370138
-rw-r--r--sw/source/uibase/inc/content.hxx2
-rw-r--r--sw/source/uibase/inc/swcont.hxx9
-rw-r--r--sw/source/uibase/utlui/content.cxx73
3 files changed, 47 insertions, 37 deletions
diff --git a/sw/source/uibase/inc/content.hxx b/sw/source/uibase/inc/content.hxx
index ba47cb1f116d..83c73f7b84b2 100644
--- a/sw/source/uibase/inc/content.hxx
+++ b/sw/source/uibase/inc/content.hxx
@@ -49,7 +49,7 @@ class SwOutlineContent : public SwContent
SwContent(pCnt, rName, nYPos),
nOutlinePos(nArrPos), nOutlineLevel(nLevel), bIsMoveable(bMove) {}
- sal_uInt16 GetPos() const {return nOutlinePos;}
+ SwOutlineNodes::size_type GetOutlinePos() const {return nOutlinePos;}
sal_uInt8 GetOutlineLevel() const {return nOutlineLevel;}
bool IsMoveable() const {return bIsMoveable;};
};
diff --git a/sw/source/uibase/inc/swcont.hxx b/sw/source/uibase/inc/swcont.hxx
index 54d80fc7ccbe..3d0aaf69a113 100644
--- a/sw/source/uibase/inc/swcont.hxx
+++ b/sw/source/uibase/inc/swcont.hxx
@@ -72,10 +72,9 @@ class SwContent : public SwTypeNumber
const SwContentType* pParent;
OUString const sContentName;
long const nYPosition;
- // most subclasses appear to use this for a tools/gen.hxx-style
- // geometric Y position, while SwOutlineContent wants to store a
- // SwOutlineNodes::size_type value (where all such values used in
- // practice hopefully fit into 'long')
+ // some subclasses appear to use this for a tools/gen.hxx-style
+ // geometric Y position, while e.g. SwOutlineContent wants to store
+ // the index in its subtree
bool bInvisible;
public:
SwContent(const SwContentType* pCnt, const OUString& rName, long nYPos );
@@ -96,8 +95,6 @@ public:
return ListBox::NaturalSortCompare(sContentName, rCont.sContentName) < 0;
}
- long GetYPos() const {return nYPosition;}
-
bool IsInvisible() const {return bInvisible;}
void SetInvisible(){ bInvisible = true;}
};
diff --git a/sw/source/uibase/utlui/content.cxx b/sw/source/uibase/utlui/content.cxx
index b10c0da061b5..d09df398c9d0 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -1125,10 +1125,9 @@ static void* lcl_GetOutlineKey( SwContentTree* pTree, SwOutlineContent const * p
if( pTree && pContent )
{
SwWrtShell* pShell = pTree->GetWrtShell();
- long nPos = pContent->GetYPos();
+ auto const nPos = pContent->GetOutlinePos();
key = static_cast<void*>(pShell->getIDocumentOutlineNodesAccess()->getOutlineNode( nPos ));
-
}
return key;
}
@@ -1482,8 +1481,8 @@ bool SwContentTree::Expand( SvTreeListEntry* pParent )
{
if(pChild->HasChildren())
{
- assert(dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pChild->GetUserData())));
- long nPos = static_cast<SwContent*>(pChild->GetUserData())->GetYPos();
+ assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pChild->GetUserData())));
+ auto const nPos = static_cast<SwOutlineContent*>(pChild->GetUserData())->GetOutlinePos();
void* key = static_cast<void*>(pShell->getIDocumentOutlineNodesAccess()->getOutlineNode( nPos ));
aCurrOutLineNodeMap.emplace( key, false );
std::map<void*, bool>::iterator iter = mOutLineNodeMap.find( key );
@@ -1503,8 +1502,8 @@ bool SwContentTree::Expand( SvTreeListEntry* pParent )
else if( lcl_IsContent(pParent) )
{
SwWrtShell* pShell = GetWrtShell();
- assert(dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pParent->GetUserData())));
- long nPos = static_cast<SwContent*>(pParent->GetUserData())->GetYPos();
+ assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pParent->GetUserData())));
+ auto const nPos = static_cast<SwOutlineContent*>(pParent->GetUserData())->GetOutlinePos();
void* key = static_cast<void*>(pShell->getIDocumentOutlineNodesAccess()->getOutlineNode( nPos ));
mOutLineNodeMap[key] = true;
}
@@ -1535,8 +1534,8 @@ bool SwContentTree::Collapse( SvTreeListEntry* pParent )
else if( lcl_IsContent(pParent) )
{
SwWrtShell* pShell = GetWrtShell();
- assert(dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pParent->GetUserData())));
- long nPos = static_cast<SwContent*>(pParent->GetUserData())->GetYPos();
+ assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pParent->GetUserData())));
+ auto const nPos = static_cast<SwOutlineContent*>(pParent->GetUserData())->GetOutlinePos();
void* key = static_cast<void*>(pShell->getIDocumentOutlineNodesAccess()->getOutlineNode( nPos ));
mOutLineNodeMap[key] = false;
}
@@ -1774,7 +1773,7 @@ void SwContentTree::Display( bool bActive )
while( nullptr != (pEntry = Next(pEntry)) )
{
assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData())));
- if(static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetPos() == nActPos)
+ if (static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos() == nActPos)
{
MakeVisible(pEntry);
Select(pEntry);
@@ -1849,7 +1848,7 @@ bool SwContentTree::FillTransferData( TransferDataContainer& rTransfer,
{
case ContentTypeId::OUTLINE:
{
- const SwOutlineNodes::size_type nPos = static_cast<SwOutlineContent*>(pCnt)->GetPos();
+ const SwOutlineNodes::size_type nPos = static_cast<SwOutlineContent*>(pCnt)->GetOutlinePos();
OSL_ENSURE(nPos < pWrtShell->getIDocumentOutlineNodesAccess()->getOutlineNodesCount(),
"outlinecnt changed");
@@ -2105,7 +2104,7 @@ bool SwContentTree::HasContentChanged()
while( nullptr != (pFirstEntry = Next(pFirstEntry)) )
{
assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pFirstEntry->GetUserData())));
- if(static_cast<SwOutlineContent*>(pFirstEntry->GetUserData())->GetPos() == nActPos)
+ if (static_cast<SwOutlineContent*>(pFirstEntry->GetUserData())->GetOutlinePos() == nActPos)
{
if(FirstSelected() != pFirstEntry)
{
@@ -2411,8 +2410,9 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren)
}
bool bStartedAction = false;
- for (auto pCurrentEntry : selected)
+ for (auto const pCurrentEntry : selected)
{
+ assert(pCurrentEntry && lcl_IsContent(pCurrentEntry));
if (pCurrentEntry && lcl_IsContent(pCurrentEntry))
{
assert(dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pCurrentEntry->GetUserData())));
@@ -2420,7 +2420,7 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren)
static_cast<SwContent*>(pCurrentEntry->GetUserData())->GetParent()->GetType()
== ContentTypeId::OUTLINE)
{
- nActPos = static_cast<SwOutlineContent*>(pCurrentEntry->GetUserData())->GetPos();
+ nActPos = static_cast<SwOutlineContent*>(pCurrentEntry->GetUserData())->GetOutlinePos();
}
}
if (nActPos == SwOutlineNodes::npos || (bUpDown && !pShell->IsOutlineMovable(nActPos)))
@@ -2439,9 +2439,10 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren)
pShell->MakeOutlineSel(nActPos, nActPos, bOutlineWithChildren);
if (bUpDown)
{
+ sal_uLong const nEntryAbsPos(GetModel()->GetAbsPos(pCurrentEntry));
SwOutlineNodes::difference_type nDir = bUp ? -1 : 1;
if (!bOutlineWithChildren && ((nDir == -1 && nActPos > 0) ||
- (nDir == 1 && nActPos < GetEntryCount() - 2)))
+ (nDir == 1 && nEntryAbsPos < GetEntryCount() - 2)))
{
pShell->MoveOutlinePara( nDir );
// Set cursor back to the current position
@@ -2460,8 +2461,8 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren)
assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData())));
if (nActLevel >= static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlineLevel())
break;
+ nActEndPos = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos();
pEntry = Next(pEntry);
- nActEndPos++;
}
if (nDir == 1)
{
@@ -2470,7 +2471,7 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren)
{
// pEntry now points to the entry following the last
// selected entry.
- SwOutlineNodes::size_type nDest = nActEndPos + 1;
+ SwOutlineNodes::size_type nDest = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos();
// here needs to found the next entry after next.
// The selection must be inserted in front of that.
while (pEntry)
@@ -2478,12 +2479,17 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren)
pEntry = Next(pEntry);
assert(pEntry == nullptr || !lcl_IsContent(pEntry) || dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData())));
// nDest++ may only executed if pEntry != 0
- if (pEntry && nDest++ &&
- (!lcl_IsContent(pEntry)
- || nActLevel >= static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlineLevel()))
+ if (pEntry)
{
- nDest--;
- break;
+ if (!lcl_IsContent(pEntry) ||
+ nActLevel >= static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlineLevel())
+ {
+ break;
+ }
+ else
+ {
+ nDest = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos();
+ }
}
}
nDir = nDest - nActEndPos;
@@ -2499,9 +2505,16 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren)
pEntry = pCurrentEntry;
while (pEntry && nDest)
{
- nDest--;
pEntry = Prev(pEntry);
assert(pEntry == nullptr || !lcl_IsContent(pEntry) || dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData())));
+ if (pEntry && lcl_IsContent(pEntry))
+ {
+ nDest = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos();
+ }
+ else
+ {
+ nDest = 0; // presumably?
+ }
if (pEntry &&
(!lcl_IsContent(pEntry)
|| nActLevel >= static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlineLevel()))
@@ -2544,7 +2557,7 @@ void SwContentTree::ExecCommand(const OUString& rCmd, bool bOutlineWithChildren)
while (nullptr != (pFirst = Next(pFirst)) && lcl_IsContent(pFirst))
{
assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pFirst->GetUserData())));
- if (static_cast<SwOutlineContent*>(pFirst->GetUserData())->GetPos() == nCurrPos)
+ if (static_cast<SwOutlineContent*>(pFirst->GetUserData())->GetOutlinePos() == nCurrPos)
{
Select(pFirst);
MakeVisible(pFirst);
@@ -2645,13 +2658,13 @@ TriState SwContentTree::NotifyMoving( SvTreeListEntry* pTarget,
{
SwOutlineNodes::size_type nTargetPos = 0;
assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData())));
- SwOutlineNodes::size_type nSourcePos = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetPos();
+ SwOutlineNodes::size_type nSourcePos = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos();
if(!lcl_IsContent(pTarget))
nTargetPos = SwOutlineNodes::npos;
else
{
assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pTarget->GetUserData())));
- nTargetPos = static_cast<SwOutlineContent*>(pTarget->GetUserData())->GetPos();
+ nTargetPos = static_cast<SwOutlineContent*>(pTarget->GetUserData())->GetOutlinePos();
}
if( MAXLEVEL > m_nOutlineLevel && // Not all layers are displayed.
nTargetPos != SwOutlineNodes::npos)
@@ -2660,7 +2673,7 @@ TriState SwContentTree::NotifyMoving( SvTreeListEntry* pTarget,
if(pNext)
{
assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pNext->GetUserData())));
- nTargetPos = static_cast<SwOutlineContent*>(pNext->GetUserData())->GetPos() -1;
+ nTargetPos = static_cast<SwOutlineContent*>(pNext->GetUserData())->GetOutlinePos() - 1;
}
else
nTargetPos = static_cast<sal_uInt16>(GetWrtShell()->getIDocumentOutlineNodesAccess()->getOutlineNodesCount())- 1;
@@ -2689,13 +2702,13 @@ TriState SwContentTree::NotifyCopying( SvTreeListEntry* pTarget,
{
SwOutlineNodes::size_type nTargetPos = 0;
assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData())));
- SwOutlineNodes::size_type nSourcePos = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetPos();
+ SwOutlineNodes::size_type nSourcePos = static_cast<SwOutlineContent*>(pEntry->GetUserData())->GetOutlinePos();
if(!lcl_IsContent(pTarget))
nTargetPos = SwOutlineNodes::npos;
else
{
assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pTarget->GetUserData())));
- nTargetPos = static_cast<SwOutlineContent*>(pTarget->GetUserData())->GetPos();
+ nTargetPos = static_cast<SwOutlineContent*>(pTarget->GetUserData())->GetOutlinePos();
}
if( MAXLEVEL > m_nOutlineLevel && // Not all layers are displayed.
@@ -2705,7 +2718,7 @@ TriState SwContentTree::NotifyCopying( SvTreeListEntry* pTarget,
if(pNext)
{
assert(dynamic_cast<SwOutlineContent*>(static_cast<SwTypeNumber*>(pNext->GetUserData())));
- nTargetPos = static_cast<SwOutlineContent*>(pNext->GetUserData())->GetPos() - 1;
+ nTargetPos = static_cast<SwOutlineContent*>(pNext->GetUserData())->GetOutlinePos() - 1;
}
else
nTargetPos = static_cast<sal_uInt16>(GetWrtShell()->getIDocumentOutlineNodesAccess()->getOutlineNodesCount()) - 1;
@@ -3438,7 +3451,7 @@ void SwContentTree::GotoContent(SwContent* pCnt)
{
case ContentTypeId::OUTLINE :
{
- m_pActiveShell->GotoOutline(static_cast<SwOutlineContent*>(pCnt)->GetPos());
+ m_pActiveShell->GotoOutline(static_cast<SwOutlineContent*>(pCnt)->GetOutlinePos());
}
break;
case ContentTypeId::TABLE :