[Libreoffice-commits] core.git: Branch 'libreoffice-4-2' - sw/inc sw/source

Luboš Luňák l.lunak at collabora.com
Wed Apr 30 01:24:01 PDT 2014


 sw/inc/docary.hxx                |    9 +++++
 sw/inc/editsh.hxx                |    2 +
 sw/source/core/doc/docredln.cxx  |   66 +++++++++++++++++++--------------------
 sw/source/core/edit/edredln.cxx  |   18 ++++++++++
 sw/source/ui/uiview/view2.cxx    |   31 +++++++++++-------
 sw/source/ui/uiview/viewstat.cxx |   37 +++++++++++++++++++--
 6 files changed, 115 insertions(+), 48 deletions(-)

New commits:
commit 68dfe73d209091455c79e1f746ca84cf8743629d
Author: Luboš Luňák <l.lunak at collabora.com>
Date:   Mon Apr 28 18:03:49 2014 +0200

    allow accepting/rejecting changes in a selection (bnc#874790)
    
    More convenient than handling them one by one.
    
    (cherry picked from commit 160e93607f6c2c3981823b30ee981ca23d4e1a0d)
    (cherry picked from commit 4a60f9387ddd832f7c164102b76351e5e520d920)
    (cherry picked from commit 94fc0b4752599601ddf9ff3c9b49da15cffb4882)
    (cherry picked from commit d46e7dabd3090697c46e24a350cc75f35c28a8f7)
    
    Change-Id: Iee02d12d595ee41cff7a31e2bda61425c9f53d6d
    Reviewed-on: https://gerrit.libreoffice.org/9198
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sw/inc/docary.hxx b/sw/inc/docary.hxx
index 4525763..0f69048 100644
--- a/sw/inc/docary.hxx
+++ b/sw/inc/docary.hxx
@@ -175,6 +175,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 SwRedline* FindAtPosition( const SwPosition& startPosition, sal_uInt16& tableIndex, bool next = true ) const;
+
     using _SwRedlineTbl::size;
     using _SwRedlineTbl::operator[];
     using _SwRedlineTbl::empty;
diff --git a/sw/inc/editsh.hxx b/sw/inc/editsh.hxx
index 9991fd0..159a9da 100644
--- a/sw/inc/editsh.hxx
+++ b/sw/inc/editsh.hxx
@@ -894,6 +894,8 @@ public:
     const SwRedline& 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.
diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx
index ee4db26..a6e6367 100644
--- a/sw/source/core/doc/docredln.cxx
+++ b/sw/source/core/doc/docredln.cxx
@@ -1914,35 +1914,6 @@ static sal_Bool lcl_RejectRedline( SwRedlineTbl& rArr, sal_uInt16& rPos,
     return bRet;
 }
 
-static const SwRedline* lcl_FindCurrRedline( const SwPosition& rSttPos,
-                                        sal_uInt16& rPos,
-                                        bool bNext = true )
-{
-    const SwRedline* pFnd = 0;
-    const SwRedlineTbl& rArr = rSttPos.nNode.GetNode().GetDoc()->GetRedlineTbl();
-    for( ; rPos < rArr.size() ; ++rPos )
-    {
-        const SwRedline* 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)
@@ -1953,7 +1924,7 @@ static int lcl_AcceptRejectRedl( Fn_AcceptReject fn_AcceptReject,
     const SwPosition* pStt = rPam.Start(),
                     * pEnd = pStt == rPam.GetPoint() ? rPam.GetMark()
                                                      : rPam.GetPoint();
-    const SwRedline* pFnd = lcl_FindCurrRedline( *pStt, n, true );
+    const SwRedline* pFnd = rArr.FindAtPosition( *pStt, n, true );
     if( pFnd &&     // Is new a part of it?
         ( *pFnd->Start() != *pStt || *pFnd->End() > *pEnd ))
     {
@@ -2257,7 +2228,7 @@ const SwRedline* SwDoc::SelNextRedline( SwPaM& rPam ) const
     // If the starting positon points to the last valid ContentNode,
     // we take the next Redline in any case.
     sal_uInt16 n = 0;
-    const SwRedline* pFnd = lcl_FindCurrRedline( rSttPos, n, true );
+    const SwRedline* pFnd = GetRedlineTbl().FindAtPosition( rSttPos, n, true );
     if( pFnd )
     {
         const SwPosition* pEnd = pFnd->End();
@@ -2374,7 +2345,7 @@ const SwRedline* SwDoc::SelPrevRedline( SwPaM& rPam ) const
     // If the starting positon points to the last valid ContentNode,
     // we take the previous Redline in any case.
     sal_uInt16 n = 0;
-    const SwRedline* pFnd = lcl_FindCurrRedline( rSttPos, n, false );
+    const SwRedline* pFnd = GetRedlineTbl().FindAtPosition( rSttPos, n, false );
     if( pFnd )
     {
         const SwPosition* pStt = pFnd->Start();
@@ -2489,7 +2460,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 )
         {
@@ -2825,6 +2796,35 @@ sal_uInt16 SwRedlineTbl::FindPrevSeqNo( sal_uInt16 nSeqNo, sal_uInt16 nSttPos,
     return nRet;
 }
 
+const SwRedline* SwRedlineTbl::FindAtPosition( const SwPosition& rSttPos,
+                                        sal_uInt16& rPos,
+                                        bool bNext ) const
+{
+    const SwRedline* pFnd = 0;
+    for( ; rPos < size() ; ++rPos )
+    {
+        const SwRedline* 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()
 {
 }
diff --git a/sw/source/core/edit/edredln.cxx b/sw/source/core/edit/edredln.cxx
index 5a55361..5d5ff4a 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/ui/uiview/view2.cxx b/sw/source/ui/uiview/view2.cxx
index 5fe1367..c75a339 100644
--- a/sw/source/ui/uiview/view2.cxx
+++ b/sw/source/ui/uiview/view2.cxx
@@ -641,22 +641,31 @@ void SwView::Execute(SfxRequest &rReq)
         case FN_REDLINE_ACCEPT_DIRECT:
         case FN_REDLINE_REJECT_DIRECT:
         {
-            // We check for a redline at the start of the selection/cursor, not the point.
-            // This ensures we work properly with FN_REDLINE_NEXT_CHANGE, which leaves the
-            // point at the *end* of the redline and the mark at the start (so GetRedline
-            // would return NULL if called on the point)
             SwDoc *pDoc = m_pWrtShell->GetDoc();
             SwPaM *pCursor = m_pWrtShell->GetCrsr();
-
-            sal_uInt16 nRedline = 0;
-            const SwRedline *pRedline = pDoc->GetRedline(*pCursor->Start(), &nRedline);
-            assert(pRedline != 0);
-            if (pRedline)
+            if( pCursor->HasMark())
             {
                 if (FN_REDLINE_ACCEPT_DIRECT == nSlot)
-                    m_pWrtShell->AcceptRedline(nRedline);
+                    m_pWrtShell->AcceptRedlinesInSelection();
                 else
-                    m_pWrtShell->RejectRedline(nRedline);
+                    m_pWrtShell->RejectRedlinesInSelection();
+            }
+            else
+            {
+                // We check for a redline at the start of the selection/cursor, not the point.
+                // This ensures we work properly with FN_REDLINE_NEXT_CHANGE, which leaves the
+                // point at the *end* of the redline and the mark at the start (so GetRedline
+                // would return NULL if called on the point)
+                sal_uInt16 nRedline = 0;
+                const SwRedline *pRedline = pDoc->GetRedline(*pCursor->Start(), &nRedline);
+                assert(pRedline != 0);
+                if (pRedline)
+                {
+                    if (FN_REDLINE_ACCEPT_DIRECT == nSlot)
+                        m_pWrtShell->AcceptRedline(nRedline);
+                    else
+                        m_pWrtShell->RejectRedline(nRedline);
+                }
             }
         }
         break;
diff --git a/sw/source/ui/uiview/viewstat.cxx b/sw/source/ui/uiview/viewstat.cxx
index bbc915c..0fdf9bf5 100644
--- a/sw/source/ui/uiview/viewstat.cxx
+++ b/sw/source/ui/uiview/viewstat.cxx
@@ -52,6 +52,8 @@
 #include <svl/stritem.hxx>
 #include <unotools/moduleoptions.hxx>
 #include <svl/visitem.hxx>
+#include <redline.hxx>
+#include <docary.hxx>
 
 #include <cmdid.h>
 
@@ -286,14 +288,41 @@ void SwView::GetState(SfxItemSet &rSet)
             case FN_REDLINE_ACCEPT_DIRECT:
             case FN_REDLINE_REJECT_DIRECT:
             {
-                // If the selection/cursor start position isn't on a redline, disable
-                // accepting/rejecting changes.
                 SwDoc *pDoc = m_pWrtShell->GetDoc();
                 SwPaM *pCursor = m_pWrtShell->GetCrsr();
-                if (0 == pDoc->GetRedline(*pCursor->Start(), 0))
-                    rSet.DisableItem(nWhich);
                 if (GetDocShell()->HasChangeRecordProtection())
                     rSet.DisableItem(nWhich);
+                else if (pCursor->HasMark())
+                { // If the selection does not contain redlines, disable accepting/rejecting changes.
+                    sal_uInt16 index = 0;
+                    const SwRedlineTbl& table = pDoc->GetRedlineTbl();
+                    const SwRedline* redline = table.FindAtPosition( *pCursor->Start(), index );
+                    if( redline != NULL && *redline->Start() == *pCursor->End())
+                        redline = NULL;
+                    if( redline == NULL )
+                    {
+                        for(; index < table.size(); ++index )
+                        {
+                            const SwRedline* tmp = table[ index ];
+                            if( *tmp->Start() >= *pCursor->End())
+                                break;
+                            if( tmp->HasMark() && tmp->IsVisible())
+                            {
+                                redline = tmp;
+                                break;
+                            }
+                        }
+                    }
+                    if( redline == NULL )
+                        rSet.DisableItem(nWhich);
+                }
+                else
+                {
+                    // If the cursor position isn't on a redline, disable
+                    // accepting/rejecting changes.
+                    if (0 == pDoc->GetRedline(*pCursor->Start(), 0))
+                        rSet.DisableItem(nWhich);
+                }
             }
             break;
 


More information about the Libreoffice-commits mailing list