sw/inc/cmdid.h | 2 sw/inc/docary.hxx | 9 +++ sw/inc/editsh.hxx | 2 sw/inc/swcommands.h | 2 sw/sdi/_viewsh.sdi | 12 +++++ sw/sdi/swriter.sdi | 50 +++++++++++++++++++++ sw/source/core/doc/docredln.cxx | 66 ++++++++++++++--------------- sw/source/core/edit/edredln.cxx | 18 +++++++ sw/source/core/uibase/inc/redline_tmpl.hrc | 12 +++++ sw/source/core/uibase/lingu/olmenu.cxx | 10 +++- sw/source/core/uibase/uiview/view2.cxx | 10 ++++ sw/source/core/uibase/uiview/viewstat.cxx | 39 +++++++++++++++++ 12 files changed, 196 insertions(+), 36 deletions(-)
New commits: commit 4a60f9387ddd832f7c164102b76351e5e520d920 Author: LuboÅ¡ LuÅák <l.lu...@collabora.com> Date: Mon Apr 28 19:16:20 2014 +0200 allow accepting/rejecting changes in a selection (bnc#874790) Adds 'Accept Changes'/'Reject Changes' to the RMB popup if appropriate, more convenient than handling them one by one. Change-Id: I4e2670aa9fdacaaaa1b7ecca36b9c150c82e2e72 diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h index 8f49675..721b3f4b 100644 --- a/sw/inc/cmdid.h +++ b/sw/inc/cmdid.h @@ -163,6 +163,8 @@ #define FN_COPY_HYPERLINK_LOCATION (FN_EDIT2 + 40) /* copy hyperlink URL to clipboard */ #define FN_REDLINE_NEXT_CHANGE (FN_EDIT2 + 41) /* Go to the next change */ #define FN_REDLINE_PREV_CHANGE (FN_EDIT2 + 42) /* Go to the previous change */ +#define FN_REDLINE_ACCEPT_DIRECT_SELECTION (FN_EDIT2 + 43) /* accept redlines in the selection */ +#define FN_REDLINE_REJECT_DIRECT_SELECTION (FN_EDIT2 + 44) /* reject redlines in the selection */ /*-------------------------------------------------------------------- Region: Edit diff --git a/sw/inc/editsh.hxx b/sw/inc/editsh.hxx index 70c18cb..31a1b0e 100644 --- a/sw/inc/editsh.hxx +++ b/sw/inc/editsh.hxx @@ -890,6 +890,8 @@ public: const SwRangeRedline& GetRedline( sal_uInt16 nPos ) const; sal_Bool AcceptRedline( sal_uInt16 nPos ); sal_Bool RejectRedline( sal_uInt16 nPos ); + bool AcceptRedlinesInSelection(); + bool RejectRedlinesInSelection(); /** Search Redline for this Data and @return position in array. If not found, return USHRT_MAX. */ diff --git a/sw/inc/swcommands.h b/sw/inc/swcommands.h index cc9bc07..aa580e3 100644 --- a/sw/inc/swcommands.h +++ b/sw/inc/swcommands.h @@ -122,6 +122,8 @@ #define CMD_FN_HIDE_ALL_NOTES ".uno:HideAllNotes" #define CMD_FN_REDLINE_ACCEPT_DIRECT ".uno:AcceptTracedChange" #define CMD_FN_REDLINE_REJECT_DIRECT ".uno:RejectTracedChange" +#define CMD_FN_REDLINE_ACCEPT_DIRECT_SELECTION ".uno:AcceptTracedChangesInSelection" +#define CMD_FN_REDLINE_REJECT_DIRECT_SELECTION ".uno:RejectTracedChangesInSelection" #define CMD_FN_REDLINE_NEXT_CHANGE ".uno:NextTrackedChange" #define CMD_FN_REDLINE_PREV_CHANGE ".uno:PreviousTrackedChange" #define CMD_FN_REMOVE_HYPERLINK ".uno:RemoveHyperlink" diff --git a/sw/sdi/_viewsh.sdi b/sw/sdi/_viewsh.sdi index 40ec958..7c8f2ad 100644 --- a/sw/sdi/_viewsh.sdi +++ b/sw/sdi/_viewsh.sdi @@ -142,6 +142,18 @@ interface BaseTextEditView StateMethod = GetState ; DisableFlags="SW_DISABLE_ON_MAILBOX_EDITOR"; ] + FN_REDLINE_ACCEPT_DIRECT_SELECTION + [ + ExecMethod = Execute ; + StateMethod = GetState ; + DisableFlags="SW_DISABLE_ON_MAILBOX_EDITOR"; + ] + FN_REDLINE_REJECT_DIRECT_SELECTION + [ + ExecMethod = Execute ; + StateMethod = GetState ; + DisableFlags="SW_DISABLE_ON_MAILBOX_EDITOR"; + ] FN_REDLINE_NEXT_CHANGE [ ExecMethod = Execute ; diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi index 9bde88a..1ddeba3 100644 --- a/sw/sdi/swriter.sdi +++ b/sw/sdi/swriter.sdi @@ -9823,6 +9823,56 @@ SfxVoidItem RejectTracedChange FN_REDLINE_REJECT_DIRECT GroupId = GID_EDIT; ] +SfxVoidItem AcceptTracedChangeInSelection FN_REDLINE_ACCEPT_DIRECT_SELECTION +[ + /* flags: */ + AutoUpdate = FALSE, + Cachable = Cachable, + FastCall = FALSE, + HasCoreId = FALSE, + HasDialog = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + Readonly = FALSE, + + /* config: */ + AccelConfig = TRUE, + MenuConfig = TRUE, + StatusBarConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = GID_EDIT; +] + +SfxVoidItem RejectTracedChangeInSelection FN_REDLINE_REJECT_DIRECT_SELECTION +[ + /* flags: */ + AutoUpdate = FALSE, + Cachable = Cachable, + FastCall = FALSE, + HasCoreId = FALSE, + HasDialog = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Asynchron; + + Readonly = FALSE, + + /* config: */ + AccelConfig = TRUE, + MenuConfig = TRUE, + StatusBarConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = GID_EDIT; +] + SfxVoidItem NextTrackedChange FN_REDLINE_NEXT_CHANGE [ /* flags: */ diff --git a/sw/source/core/edit/edredln.cxx b/sw/source/core/edit/edredln.cxx index eaf4394..e0fad19 100644 --- a/sw/source/core/edit/edredln.cxx +++ b/sw/source/core/edit/edredln.cxx @@ -91,6 +91,24 @@ sal_Bool SwEditShell::RejectRedline( sal_uInt16 nPos ) return bRet; } +bool SwEditShell::AcceptRedlinesInSelection() +{ + SET_CURR_SHELL( this ); + StartAllAction(); + sal_Bool bRet = GetDoc()->AcceptRedline( *GetCrsr(), true ); + EndAllAction(); + return bRet; +} + +bool SwEditShell::RejectRedlinesInSelection() +{ + SET_CURR_SHELL( this ); + StartAllAction(); + sal_Bool bRet = GetDoc()->RejectRedline( *GetCrsr(), true ); + EndAllAction(); + return bRet; +} + // Set the comment at the Redline sal_Bool SwEditShell::SetRedlineComment( const OUString& rS ) { diff --git a/sw/source/core/uibase/inc/redline_tmpl.hrc b/sw/source/core/uibase/inc/redline_tmpl.hrc index 4271708..8212465 100644 --- a/sw/source/core/uibase/inc/redline_tmpl.hrc +++ b/sw/source/core/uibase/inc/redline_tmpl.hrc @@ -25,6 +25,18 @@ }; \ MenuItem \ { \ + Identifier = FN_REDLINE_ACCEPT_DIRECT_SELECTION; \ + HelpId = CMD_FN_REDLINE_ACCEPT_DIRECT_SELECTION ; \ + Text [ en-US ] = "Accept Changes" ; \ + }; \ + MenuItem \ + { \ + Identifier = FN_REDLINE_REJECT_DIRECT_SELECTION ; \ + HelpId = CMD_FN_REDLINE_REJECT_DIRECT_SELECTION ; \ + Text [ en-US ] = "Reject Changes" ; \ + }; \ + MenuItem \ + { \ Identifier = FN_REDLINE_NEXT_CHANGE; \ HelpId = CMD_FN_REDLINE_NEXT_CHANGE ; \ Text [ en-US ] = "Next Change" ; \ diff --git a/sw/source/core/uibase/lingu/olmenu.cxx b/sw/source/core/uibase/lingu/olmenu.cxx index 682df9a..8694eab 100644 --- a/sw/source/core/uibase/lingu/olmenu.cxx +++ b/sw/source/core/uibase/lingu/olmenu.cxx @@ -610,10 +610,12 @@ void SwSpellPopup::checkRedline() FN_REDLINE_ACCEPT_DIRECT, FN_REDLINE_REJECT_DIRECT, FN_REDLINE_NEXT_CHANGE, - FN_REDLINE_PREV_CHANGE + FN_REDLINE_PREV_CHANGE, + FN_REDLINE_ACCEPT_DIRECT_SELECTION, + FN_REDLINE_REJECT_DIRECT_SELECTION }; SwDoc *pDoc = m_pSh->GetDoc(); - SfxItemSet aSet(pDoc->GetAttrPool(), FN_REDLINE_ACCEPT_DIRECT, FN_REDLINE_PREV_CHANGE); + SfxItemSet aSet(pDoc->GetAttrPool(), FN_REDLINE_ACCEPT_DIRECT, FN_REDLINE_REJECT_DIRECT_SELECTION); for (size_t i = 0; i < SAL_N_ELEMENTS(pRedlineIds); ++i) { const sal_uInt16 nWhich = pRedlineIds[i]; @@ -808,7 +810,9 @@ void SwSpellPopup::Execute( sal_uInt16 nId ) } } else if (nId == FN_REDLINE_ACCEPT_DIRECT || nId == FN_REDLINE_REJECT_DIRECT - || nId == FN_REDLINE_NEXT_CHANGE || nId == FN_REDLINE_PREV_CHANGE) + || nId == FN_REDLINE_NEXT_CHANGE || nId == FN_REDLINE_PREV_CHANGE + || nId == FN_REDLINE_ACCEPT_DIRECT_SELECTION + || nId == FN_REDLINE_REJECT_DIRECT_SELECTION) { // Let SwView::Execute() handle the redline actions. SfxRequest aReq(m_pSh->GetView().GetViewFrame(), nId); diff --git a/sw/source/core/uibase/uiview/view2.cxx b/sw/source/core/uibase/uiview/view2.cxx index 2b398ad..cf2d68a 100644 --- a/sw/source/core/uibase/uiview/view2.cxx +++ b/sw/source/core/uibase/uiview/view2.cxx @@ -684,6 +684,16 @@ void SwView::Execute(SfxRequest &rReq) } break; + case FN_REDLINE_ACCEPT_DIRECT_SELECTION: + case FN_REDLINE_REJECT_DIRECT_SELECTION: + { + if (FN_REDLINE_ACCEPT_DIRECT_SELECTION == nSlot) + m_pWrtShell->AcceptRedlinesInSelection(); + else + m_pWrtShell->RejectRedlinesInSelection(); + } + break; + case FN_REDLINE_NEXT_CHANGE: { const SwRangeRedline *pCurrent = m_pWrtShell->GetCurrRedline(); diff --git a/sw/source/core/uibase/uiview/viewstat.cxx b/sw/source/core/uibase/uiview/viewstat.cxx index aded9e1..195889b 100644 --- a/sw/source/core/uibase/uiview/viewstat.cxx +++ b/sw/source/core/uibase/uiview/viewstat.cxx @@ -53,6 +53,8 @@ #include <svl/stritem.hxx> #include <unotools/moduleoptions.hxx> #include <svl/visitem.hxx> +#include <redline.hxx> +#include <docary.hxx> #include <cmdid.h> @@ -297,6 +299,43 @@ void SwView::GetState(SfxItemSet &rSet) rSet.DisableItem(nWhich); } break; + case FN_REDLINE_ACCEPT_DIRECT_SELECTION: + case FN_REDLINE_REJECT_DIRECT_SELECTION: + { + // If the selection does not contain a redline, disable + // accepting/rejecting changes. + SwDoc *pDoc = m_pWrtShell->GetDoc(); + SwPaM *pCursor = m_pWrtShell->GetCrsr(); + if (GetDocShell()->HasChangeRecordProtection()) + rSet.DisableItem(nWhich); + else if (!pCursor->HasMark()) + rSet.DisableItem(nWhich); + else + { + sal_uInt16 index = 0; + const SwRedlineTbl& table = pDoc->GetRedlineTbl(); + const SwRangeRedline* redline = table.FindAtPosition( *pCursor->Start(), index ); + if( redline != NULL && *redline->Start() == *pCursor->End()) + redline = NULL; + if( redline == NULL ) + { + for(; index < table.size(); ++index ) + { + const SwRangeRedline* tmp = table[ index ]; + if( *tmp->Start() >= *pCursor->End()) + break; + if( tmp->HasMark() && tmp->IsVisible()) + { + redline = tmp; + break; + } + } + } + if( redline == NULL ) + rSet.DisableItem(nWhich); + } + } + break; case FN_REDLINE_NEXT_CHANGE: case FN_REDLINE_PREV_CHANGE: commit 160e93607f6c2c3981823b30ee981ca23d4e1a0d Author: LuboÅ¡ LuÅák <l.lu...@collabora.com> Date: Mon Apr 28 18:03:49 2014 +0200 move function searching for a readline directly to SwRedlineTbl It's more fun to roll one's own lcl_ function hidden somewhere, huh? Change-Id: I8cad6ff7e829a58c68098bff23bd48343c3e5b6a diff --git a/sw/inc/docary.hxx b/sw/inc/docary.hxx index 3269eb0..120606a 100644 --- a/sw/inc/docary.hxx +++ b/sw/inc/docary.hxx @@ -182,6 +182,15 @@ public: sal_uInt16 FindPrevSeqNo( sal_uInt16 nSeqNo, sal_uInt16 nSttPos, sal_uInt16 nLookahead = 20 ) const; + /** + Find the redline at the given position. + + @param tableIndex position in SwRedlineTbl to start searching at, will be updated with the index of the returned + redline (or the next redline after the given position if not found) + @param next true: redline starts at position and ends after, false: redline starts before position and ends at or after + */ + const SwRangeRedline* FindAtPosition( const SwPosition& startPosition, sal_uInt16& tableIndex, bool next = true ) const; + using _SwRedlineTbl::size; using _SwRedlineTbl::operator[]; using _SwRedlineTbl::empty; diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx index 8dcf9ee..5b45838 100644 --- a/sw/source/core/doc/docredln.cxx +++ b/sw/source/core/doc/docredln.cxx @@ -2115,35 +2115,6 @@ static sal_Bool lcl_RejectRedline( SwRedlineTbl& rArr, sal_uInt16& rPos, return bRet; } -static const SwRangeRedline* lcl_FindCurrRedline( const SwPosition& rSttPos, - sal_uInt16& rPos, - bool bNext = true ) -{ - const SwRangeRedline* pFnd = 0; - const SwRedlineTbl& rArr = rSttPos.nNode.GetNode().GetDoc()->GetRedlineTbl(); - for( ; rPos < rArr.size() ; ++rPos ) - { - const SwRangeRedline* pTmp = rArr[ rPos ]; - if( pTmp->HasMark() && pTmp->IsVisible() ) - { - const SwPosition* pRStt = pTmp->Start(), - * pREnd = pRStt == pTmp->GetPoint() ? pTmp->GetMark() - : pTmp->GetPoint(); - if( bNext ? *pRStt <= rSttPos : *pRStt < rSttPos ) - { - if( bNext ? *pREnd > rSttPos : *pREnd >= rSttPos ) - { - pFnd = pTmp; - break; - } - } - else - break; - } - } - return pFnd; -} - static int lcl_AcceptRejectRedl( Fn_AcceptReject fn_AcceptReject, SwRedlineTbl& rArr, sal_Bool bCallDelete, const SwPaM& rPam) @@ -2154,7 +2125,7 @@ static int lcl_AcceptRejectRedl( Fn_AcceptReject fn_AcceptReject, const SwPosition* pStt = rPam.Start(), * pEnd = pStt == rPam.GetPoint() ? rPam.GetMark() : rPam.GetPoint(); - const SwRangeRedline* pFnd = lcl_FindCurrRedline( *pStt, n, true ); + const SwRangeRedline* pFnd = rArr.FindAtPosition( *pStt, n, true ); if( pFnd && // Is new a part of it? ( *pFnd->Start() != *pStt || *pFnd->End() > *pEnd )) { @@ -2466,7 +2437,7 @@ const SwRangeRedline* SwDoc::SelNextRedline( SwPaM& rPam ) const // If the starting position points to the last valid ContentNode, // we take the next Redline in any case. sal_uInt16 n = 0; - const SwRangeRedline* pFnd = lcl_FindCurrRedline( rSttPos, n, true ); + const SwRangeRedline* pFnd = GetRedlineTbl().FindAtPosition( rSttPos, n, true ); if( pFnd ) { const SwPosition* pEnd = pFnd->End(); @@ -2585,7 +2556,7 @@ const SwRangeRedline* SwDoc::SelPrevRedline( SwPaM& rPam ) const // If the starting position points to the last valid ContentNode, // we take the previous Redline in any case. sal_uInt16 n = 0; - const SwRangeRedline* pFnd = lcl_FindCurrRedline( rSttPos, n, false ); + const SwRangeRedline* pFnd = GetRedlineTbl().FindAtPosition( rSttPos, n, false ); if( pFnd ) { const SwPosition* pStt = pFnd->Start(); @@ -2702,7 +2673,7 @@ bool SwDoc::SetRedlineComment( const SwPaM& rPaM, const OUString& rS ) * pEnd = pStt == rPaM.GetPoint() ? rPaM.GetMark() : rPaM.GetPoint(); sal_uInt16 n = 0; - if( lcl_FindCurrRedline( *pStt, n, true ) ) + if( GetRedlineTbl().FindAtPosition( *pStt, n, true ) ) { for( ; n < mpRedlineTbl->size(); ++n ) { @@ -3042,6 +3013,35 @@ sal_uInt16 SwRedlineTbl::FindPrevSeqNo( sal_uInt16 nSeqNo, sal_uInt16 nSttPos, return nRet; } +const SwRangeRedline* SwRedlineTbl::FindAtPosition( const SwPosition& rSttPos, + sal_uInt16& rPos, + bool bNext ) const +{ + const SwRangeRedline* pFnd = 0; + for( ; rPos < size() ; ++rPos ) + { + const SwRangeRedline* pTmp = (*this)[ rPos ]; + if( pTmp->HasMark() && pTmp->IsVisible() ) + { + const SwPosition* pRStt = pTmp->Start(), + * pREnd = pRStt == pTmp->GetPoint() ? pTmp->GetMark() + : pTmp->GetPoint(); + if( bNext ? *pRStt <= rSttPos : *pRStt < rSttPos ) + { + if( bNext ? *pREnd > rSttPos : *pREnd >= rSttPos ) + { + pFnd = pTmp; + break; + } + } + else + break; + } + } + return pFnd; +} + + SwRedlineExtraData::~SwRedlineExtraData() { }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits