diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2018-10-24 12:09:40 +0200 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2018-11-10 19:47:00 +0100 |
commit | e7ca17bb9a7490c3f763e239486a580376533edb (patch) | |
tree | da446700e0ee34bff10ff860953867b08fee742b | |
parent | 3466611d51c4dae1d60cac098315b32d1088f15e (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.hxx | 2 | ||||
-rw-r--r-- | sw/source/uibase/inc/swcont.hxx | 9 | ||||
-rw-r--r-- | sw/source/uibase/utlui/content.cxx | 73 |
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 : |