[Libreoffice-commits] core.git: sw/inc sw/source

Daniel Sikeler d.sikeler94 at gmail.com
Tue Dec 2 05:46:27 PST 2014


 sw/inc/editsh.hxx                   |   13 --
 sw/source/core/edit/edattr.cxx      |  214 +++++++++++-------------------------
 sw/source/uibase/shells/txtattr.cxx |   46 ++++---
 3 files changed, 99 insertions(+), 174 deletions(-)

New commits:
commit a143d7d14db9b12064391879822120260eda2702
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Wed Nov 5 13:06:46 2014 +0000

    De-/Increase fontsize when multi-sized text
    
    I did the changes proposed in https://gerrit.libreoffice.org/#/c/11857/
    I also tested it with a mixture of CJK and CTL text
    
    Change-Id: Ic75f557b8c0a68f43abbd8c28b2222945e9361b7
    Reviewed-on: https://gerrit.libreoffice.org/13152
    Reviewed-by: Michael Stahl <mstahl at redhat.com>
    Tested-by: Michael Stahl <mstahl at redhat.com>

diff --git a/sw/inc/editsh.hxx b/sw/inc/editsh.hxx
index b59cc50..a8b4d70 100644
--- a/sw/inc/editsh.hxx
+++ b/sw/inc/editsh.hxx
@@ -235,16 +235,11 @@ public:
     void SetAttrItem( const SfxPoolItem&, sal_uInt16 nFlags = 0 );
     void SetAttrSet( const SfxItemSet&, sal_uInt16 nFlags = 0, SwPaM* pCrsr = NULL );
 
-    /** Get all items of one type in the current selection.
+    /** Get RES_CHRATR_* items of one type in the current selection.
      * @param nWhich WhichId of the collected items.
-     * @return Vector with the items.*/
-    std::vector<const SfxPoolItem*> GetCurItem( sal_uInt16 nWhich );
-
-    /** Splits the current SwPaM in smaller ones.
-     * The borders of an itemtype are used as separator. The SwPaMs must be deleted after use.
-     * @param nWhich WhichId of the item to separate at.
-     * @return Vector with the smaller SwPaMs*/
-    std::vector<SwPaM*> GetSplitPaM( sal_uInt16 nWhich );
+     * If parts of the selection have different scripttypes, the items with corresponding WhichIds are also collected.
+     * @return a vector of pairs. The pair contains a SfxPoolItem and a SwPaM, in which the item is valid and can be changed. */
+    std::vector<std::pair< const SfxPoolItem*, std::unique_ptr<SwPaM>>> GetItemWithPaM( sal_uInt16 nWhich );
 
     /**
      * Get the paragraph format attribute(s) of the current selection.
diff --git a/sw/source/core/edit/edattr.cxx b/sw/source/core/edit/edattr.cxx
index 3832048..bc4651b 100644
--- a/sw/source/core/edit/edattr.cxx
+++ b/sw/source/core/edit/edattr.cxx
@@ -21,7 +21,6 @@
 #include <editeng/tstpitem.hxx>
 #include <editeng/lrspitem.hxx>
 #include <editeng/scripttypeitem.hxx>
-#include <editeng/fhgtitem.hxx>
 #include <com/sun/star/i18n/ScriptType.hpp>
 #include <txatbase.hxx>
 #include <txtftn.hxx>
@@ -283,178 +282,107 @@ SwTxtFmtColl* SwEditShell::GetPaMTxtFmtColl( SwPaM* pPaM ) const
     return NULL;
 }
 
-std::vector<const SfxPoolItem*> SwEditShell::GetCurItem( sal_uInt16 nWhich )
+std::vector<std::pair< const SfxPoolItem*, std::unique_ptr<SwPaM> >> SwEditShell::GetItemWithPaM( sal_uInt16 nWhich )
 {
-    std::vector<const SfxPoolItem*> vItem;
+    std::vector<std::pair< const SfxPoolItem*, std::unique_ptr<SwPaM> >> vItem;
     SwPaM* pPaM = GetCrsr();
     SwPaM* pStartPaM = pPaM;
     do { // for all the point and mark (selections)
 
         // get the start and the end node of the current selection
-        sal_uLong nSttNd = pPaM->GetMark()->nNode.GetIndex(),
-              nEndNd = pPaM->GetPoint()->nNode.GetIndex();
-        sal_Int32 nSttCnt = pPaM->GetMark()->nContent.GetIndex();
-        sal_Int32 nEndCnt = pPaM->GetPoint()->nContent.GetIndex();
+        sal_uLong nSttNd = pPaM->Start()->nNode.GetIndex(),
+              nEndNd = pPaM->End()->nNode.GetIndex();
+        sal_Int32 nSttCnt = pPaM->Start()->nContent.GetIndex();
+        sal_Int32 nEndCnt = pPaM->End()->nContent.GetIndex();
 
-        // reverse start and end if there number aren't sorted correctly
-        if( nSttNd > nEndNd || ( nSttNd == nEndNd && nSttCnt > nEndCnt ))
-        {
-            std::swap(nSttNd, nEndNd);
-            std::swap(nSttCnt, nEndCnt);
-        }
+        SwPaM* pNewPaM = 0;
+        const SfxPoolItem* pItem = 0;
 
         // for all the nodes in the current selection
         for( sal_uLong n = nSttNd; n <= nEndNd; ++n )
         {
             SwNode* pNd = GetDoc()->GetNodes()[ n ];
-            switch( pNd->GetNodeType() )
+            if( pNd->IsTxtNode() )
             {
-            case ND_TEXTNODE:
+                SwTxtNode* pTxtNd = static_cast< SwTxtNode* >( pNd );
+                const sal_Int32 nStt = (n == nSttNd) ? nSttCnt : 0;
+                const sal_Int32 nEnd = (n == nEndNd)
+                    ? nEndCnt : pTxtNd->GetTxt().getLength();
+                const SwScriptInfo* pScriptInfo = SwScriptInfo::GetScriptInfo( *pTxtNd );
+                sal_uInt8 nScript = pScriptInfo ? pScriptInfo->ScriptType( nStt ) : css::i18n::ScriptType::WEAK;
+                nWhich = GetWhichOfScript( nWhich, nScript );
+
+                // item from attribute set
+                if( pTxtNd->HasSwAttrSet() )
                 {
-                    SwTxtNode* pTxtNd = static_cast<SwTxtNode*>(pNd);
-                    const sal_Int32 nStt = (n == nSttNd) ? nSttCnt : 0;
-                    const sal_Int32 nEnd = (n == nEndNd)
-                        ? nEndCnt : pTxtNd->GetTxt().getLength();
+                    pNewPaM = new SwPaM(*pNd, nStt, *pNd, nEnd);
+                    pItem = pTxtNd->GetSwAttrSet().GetItem( nWhich );
+                    vItem.push_back( std::make_pair( pItem, std::unique_ptr<SwPaM>(pNewPaM) ) );
+                }
 
-                    // item from attribute set or default item
-                    if ( pTxtNd->HasSwAttrSet() )
-                    {
-                        const SwAttrSet aSet = pTxtNd->GetSwAttrSet();
-                        vItem.push_back( &(aSet.GetSize()) );
-                    }
-                    // items with limited range
-                    if ( pTxtNd->HasHints() )
+                if( !pTxtNd->HasHints() )
+                    continue;
+
+                // items with limited range
+                const size_t nSize = pTxtNd->GetpSwpHints()->Count();
+                for( size_t m = 0; m < nSize; m++ )
+                {
+                    const SwTxtAttr* pHt = (*pTxtNd->GetpSwpHints())[m];
+                    if( pHt->Which() == RES_TXTATR_AUTOFMT ||
+                        pHt->Which() == RES_TXTATR_CHARFMT ||
+                        pHt->Which() == RES_TXTATR_INETFMT )
                     {
-                        const size_t nSize = pTxtNd->GetpSwpHints()->Count();
-                        for (size_t m = 0; m < nSize; m++)
+                        const sal_Int32 nAttrStart = pHt->GetStart();
+                        const sal_Int32* pAttrEnd = pHt->End();
+
+                        // Ignore items not in selection
+                        if( nAttrStart > nEnd )
+                            break;
+                        if( *pAttrEnd <= nStt )
+                            continue;
+
+                        nScript = pScriptInfo ? pScriptInfo->ScriptType( nStt ) : css::i18n::ScriptType::WEAK;
+                        nWhich = GetWhichOfScript( nWhich, nScript );
+                        const SfxItemSet* pAutoSet = CharFmt::GetItemSet( pHt->GetAttr() );
+                        if( pAutoSet )
                         {
-                            const SwTxtAttr* pHt = (*pTxtNd->GetpSwpHints())[m];
-                            if ( pHt->Which() == RES_TXTATR_AUTOFMT )
+                            SfxItemIter aItemIter( *pAutoSet );
+                            pItem = aItemIter.GetCurItem();
+                            while( pItem )
                             {
-                                const sal_Int32 nAttrStart = pHt->GetStart();
-                                const sal_Int32* pAttrEnd = pHt->End();
-
-                                // Ignore items not in selection
-                                if ( nAttrStart > nEnd )
-                                    break;
-                                if ( !pAttrEnd || *pAttrEnd <= nStt )
-                                    continue;
-
-                                boost::scoped_ptr< SfxItemIter > pItemIter;
-                                const SfxPoolItem* pItem = 0;
-                                const SfxItemSet* pAutoSet =
-                                    CharFmt::GetItemSet ( pHt->GetAttr() );
-                                if ( pAutoSet )
+                                if( pItem->Which() == nWhich )
                                 {
-                                    pItemIter.reset( new SfxItemIter( *pAutoSet ));
-                                    pItem = pItemIter->GetCurItem();
-                                    while ( pItem )
-                                    {
-                                        if ( pItem->Which() == nWhich )
-                                        {
-                                            vItem.push_back( pItem );
-                                            break;
-                                        }
-                                        pItem = pItemIter->NextItem();
-                                    }
+                                    sal_Int32 nStart = 0, nStop = 0;
+                                    if( nAttrStart < nStt ) //Attribut starts before selection
+                                        nStart = nStt;
+                                    else
+                                        nStart = nAttrStart;
+                                    if( *pAttrEnd > nEnd ) //Attribut ends after selection
+                                        nStop = nEnd;
+                                    else
+                                        nStop = *pAttrEnd;
+                                    pNewPaM = new SwPaM(*pNd, nStart, *pNd, nStop);
+                                    vItem.push_back( std::make_pair( pItem, std::unique_ptr<SwPaM>(pNewPaM) ) );
+                                    break;
                                 }
+                                pItem = aItemIter.NextItem();
+                            }
+                            // default item
+                            if( !pItem && !pTxtNd->HasSwAttrSet() )
+                            {
+                                pNewPaM = new SwPaM(*pNd, nStt, *pNd, nEnd);
+                                pItem = pAutoSet->GetPool()->GetPoolDefaultItem( nWhich );
+                                vItem.push_back( std::make_pair( pItem,  std::unique_ptr<SwPaM>(pNewPaM)) );
                             }
                         }
                     }
                 }
-                break;
-            case ND_GRFNODE:
-            case ND_OLENODE:
-                break;
-
-            default:
-                pNd = 0;
             }
         }
     } while ( ( pPaM = static_cast<SwPaM*>(pPaM->GetNext()) ) != pStartPaM );
     return vItem;
 }
 
-std::vector<SwPaM*> SwEditShell::GetSplitPaM( sal_uInt16 nWhich)
-{
-    std::vector<SwPaM*> vPaMs;
-    SwPaM* pPaM = GetCrsr();
-    SwPaM* pStartPaM = pPaM;
-    do { // for all the point and mark (selections)
-
-        // get the start and the end node of the current selection
-        sal_uLong nSttNd = pPaM->GetMark()->nNode.GetIndex(),
-              nEndNd = pPaM->GetPoint()->nNode.GetIndex();
-        sal_Int32 nSttCnt = pPaM->GetMark()->nContent.GetIndex();
-        sal_Int32 nEndCnt = pPaM->GetPoint()->nContent.GetIndex();
-
-        // reverse start and end if there number aren't sorted correctly
-        if( nSttNd > nEndNd || ( nSttNd == nEndNd && nSttCnt > nEndCnt ))
-        {
-            std::swap(nSttNd, nEndNd);
-            std::swap(nSttCnt, nEndCnt);
-        }
-
-        // for all the nodes in the current selection
-        for( sal_uLong n = nSttNd; n <= nEndNd; ++n )
-        {
-            SwNode* pNd = GetDoc()->GetNodes()[ n ];
-            switch( pNd->GetNodeType() )
-            {
-            case ND_TEXTNODE:
-                {
-                    SwTxtNode* pTxtNd = static_cast<SwTxtNode*>(pNd);
-                    const sal_Int32 nStt = (n == nSttNd) ? nSttCnt : 0;
-                    const sal_Int32 nEnd = (n == nEndNd)
-                        ? nEndCnt : pTxtNd->GetTxt().getLength();
-                    if ( pTxtNd->HasSwAttrSet() )
-                    {
-                        SwPaM* pNewPaM = new SwPaM(*pNd, nStt, *pNd, nEnd);
-                        vPaMs.push_back( pNewPaM );
-                    }
-                    if ( pTxtNd->HasHints() )
-                    {
-                        const size_t nSize = pTxtNd->GetpSwpHints()->Count();
-                        for (size_t m = 0; m < nSize; m++)
-                        {
-                            const SwTxtAttr* pHt = (*pTxtNd->GetpSwpHints())[m];
-                            const SfxItemSet* pAutoSet =
-                                      CharFmt::GetItemSet ( pHt->GetAttr() );
-                            if (isTXTATR_NOEND(pHt->Which()) || !pAutoSet || !pAutoSet->HasItem(nWhich))
-                                continue;
-                            const sal_Int32 nAttrStart = pHt->GetStart();
-                            const sal_Int32* pAttrEnd = pHt->End();
-                            if ( nAttrStart > nEnd )
-                                break;
-                            if ( !pAttrEnd || *pAttrEnd <= nStt )
-                                continue;
-                            sal_Int32 nStart = 0, nStop = 0;
-                            if ( nAttrStart < nStt ) //Attribut starts before selection
-                                nStart = nStt;
-                            else
-                                nStart = nAttrStart;
-                            if ( *pAttrEnd > nEnd ) //Attribut ends after selection
-                                nStop = nEnd;
-                            else
-                                nStop = *pAttrEnd;
-                            SwPaM* pNewPaM = new SwPaM(*pNd, nStart, *pNd, nStop);
-                            vPaMs.push_back( pNewPaM );
-                        }
-                    }
-                }
-                break;
-            case ND_GRFNODE:
-            case ND_OLENODE:
-                break;
-
-            default:
-                pNd = 0;
-            }
-        }
-    } while ( ( pPaM = static_cast<SwPaM*>(pPaM->GetNext()) ) != pStartPaM );
-    return vPaMs;
-}
-
 bool SwEditShell::GetCurFtn( SwFmtFtn* pFillFtn )
 {
     // The cursor must be positioned on the current footnotes anchor:
diff --git a/sw/source/uibase/shells/txtattr.cxx b/sw/source/uibase/shells/txtattr.cxx
index 0fb0e58..4588b2e 100644
--- a/sw/source/uibase/shells/txtattr.cxx
+++ b/sw/source/uibase/shells/txtattr.cxx
@@ -225,29 +225,25 @@ void SwTextShell::ExecCharAttrArgs(SfxRequest &rReq)
             sal_uInt16 nScriptTypes = rWrtSh.GetScriptType();
             const SvxFontHeightItem* pSize( static_cast<const SvxFontHeightItem*>(
                                         aSetItem.GetItemOfScript( nScriptTypes ) ) );
-            std::vector<SwPaM*> vPaM;
-            std::vector<const SfxPoolItem*> vItem;
+            std::vector<std::pair< const SfxPoolItem*, std::unique_ptr<SwPaM> >> vItems;
             if ( pSize ) // selected text has one size
             {
-                vItem.push_back( pSize );
                 // must create new one, otherwise document is without pam
                 SwPaM* pPaM = rWrtSh.GetCrsr();
-                vPaM.push_back( new SwPaM( *(pPaM->GetMark()), *(pPaM->GetPoint()) ) );
+                vItems.push_back( std::make_pair( pSize, std::unique_ptr<SwPaM>(new SwPaM( *(pPaM->GetMark()), *(pPaM->GetPoint()))) ) );
             }
             else
-            {
-                vPaM = rWrtSh.GetSplitPaM( RES_CHRATR_FONTSIZE );
-                vItem = rWrtSh.GetCurItem ( RES_CHRATR_FONTSIZE );
-            }
-            std::vector<SwPaM*>::iterator iPaM = vPaM.begin();
-            std::vector<const SfxPoolItem*>::const_iterator iItem = vItem.begin();
+                vItems = rWrtSh.GetItemWithPaM( RES_CHRATR_FONTSIZE );
+
             rWrtSh.StartUndo( UNDO_INSATTR, NULL);
-            for ( ; iPaM != vPaM.end() && iItem != vItem.end(); ++iPaM, ++iItem )
+            for( std::pair< const SfxPoolItem*, std::unique_ptr<SwPaM> >& iPair : vItems )
             {
-                rWrtSh.GetPaMAttr( *iPaM, aSetItem.GetItemSet() );
+                std::unique_ptr<SwPaM> pPaM = std::move(iPair.second);
+                const SfxPoolItem* pItem = iPair.first;
+                rWrtSh.GetPaMAttr( pPaM.get(), aSetItem.GetItemSet() );
                 aAttrSet.SetRanges( aSetItem.GetItemSet().GetRanges() );
 
-                pSize = static_cast<const SvxFontHeightItem*>( *iItem );
+                pSize = static_cast<const SvxFontHeightItem*>( pItem );
                 if (pSize)
                 {
                     SvxFontHeightItem aSize(*pSize);
@@ -265,9 +261,8 @@ void SwTextShell::ExecCharAttrArgs(SfxRequest &rReq)
                     if( pColl )
                         pColl->SetFmtAttr( aAttrSet );
                     else
-                        rWrtSh.SetAttrSet( aAttrSet, 0, *iPaM );
+                        rWrtSh.SetAttrSet( aAttrSet, 0, pPaM.get() );
                 }
-                delete *iPaM;
             }
             rWrtSh.EndUndo( UNDO_INSATTR, NULL);
             rReq.Done();
@@ -627,21 +622,28 @@ void SwTextShell::GetAttrState(SfxItemSet &rSet)
                 const SvxFontHeightItem* pSize( static_cast<const SvxFontHeightItem*>(
                                             aSetItem.GetItemOfScript( rSh.GetScriptType() ) ) );
 
-                std::vector<const SfxPoolItem*> vFontHeight;
                 if( pSize ) // selection is of one size
-                    vFontHeight.push_back( pSize );
-                else
-                    vFontHeight = rSh.GetCurItem( RES_CHRATR_FONTSIZE );
-
-                for ( const SfxPoolItem* pIt : vFontHeight )
                 {
-                    pSize = static_cast<const SvxFontHeightItem*>(pIt);
                     sal_uInt32 nSize = pSize->GetHeight();
                     if( nSize == nFontMaxSz )
                         rSet.DisableItem( FN_GROW_FONT_SIZE );
                     else if( nSize == nFontInc )
                         rSet.DisableItem( FN_SHRINK_FONT_SIZE );
                 }
+                else
+                {
+                    std::vector<std::pair< const SfxPoolItem*, std::unique_ptr<SwPaM> >>
+                        vFontHeight = rSh.GetItemWithPaM( RES_CHRATR_FONTSIZE );
+                    for ( std::pair< const SfxPoolItem*, std::unique_ptr<SwPaM>>& pIt : vFontHeight )
+                    {
+                        pSize = static_cast<const SvxFontHeightItem*>( pIt.first );
+                        sal_uInt32 nSize = pSize->GetHeight();
+                        if( nSize == nFontMaxSz )
+                            rSet.DisableItem( FN_GROW_FONT_SIZE );
+                        else if( nSize == nFontInc )
+                            rSet.DisableItem( FN_SHRINK_FONT_SIZE );
+                    }
+                }
                 nSlot = 0;
             }
             break;


More information about the Libreoffice-commits mailing list