[Libreoffice-commits] core.git: 3 commits - include/svtools svtools/source

David Tardon dtardon at redhat.com
Thu May 12 11:57:59 UTC 2016


 include/svtools/toolbarmenu.hxx           |    3 -
 svtools/source/control/toolbarmenu.cxx    |   86 ++++++++++--------------------
 svtools/source/control/toolbarmenuacc.cxx |    4 -
 svtools/source/control/toolbarmenuimp.hxx |    3 -
 4 files changed, 37 insertions(+), 59 deletions(-)

New commits:
commit 8a7df40a489dbf607315ad9597accfca38a05fad
Author: David Tardon <dtardon at redhat.com>
Date:   Thu May 12 12:28:00 2016 +0200

    use unique_ptr
    
    Change-Id: I49f08a066f3a5f6f3479060d8a528a7cfdfdc02c

diff --git a/include/svtools/toolbarmenu.hxx b/include/svtools/toolbarmenu.hxx
index 53ad673..a5f06e7 100644
--- a/include/svtools/toolbarmenu.hxx
+++ b/include/svtools/toolbarmenu.hxx
@@ -26,6 +26,7 @@
 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
 #include <com/sun/star/frame/XFrame.hpp>
 
+#include <memory>
 #include <vector>
 
 #include <rtl/ref.hxx>
@@ -114,7 +115,7 @@ private:
 
     Size            implCalcSize();
 
-    void            appendEntry(ToolbarMenuEntry* pEntry);
+    void            appendEntry(std::unique_ptr<ToolbarMenuEntry> pEntry);
 
     void            implPaint(vcl::RenderContext& rRenderContext, ToolbarMenuEntry* pThisOnly = nullptr, bool bHighlight = false);
 
diff --git a/svtools/source/control/toolbarmenu.cxx b/svtools/source/control/toolbarmenu.cxx
index 17befc9..4da09d7 100644
--- a/svtools/source/control/toolbarmenu.cxx
+++ b/svtools/source/control/toolbarmenu.cxx
@@ -17,12 +17,12 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
-#include <memory>
-
 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
 #include <comphelper/processfactory.hxx>
 
+#include <o3tl/make_unique.hxx>
+
 #include <vcl/dockwin.hxx>
 #include <vcl/decoview.hxx>
 #include <vcl/image.hxx>
@@ -228,10 +228,8 @@ bool ToolbarMenu_Impl::hasAccessibleListeners()
 sal_Int32 ToolbarMenu_Impl::getAccessibleChildCount() throw (RuntimeException)
 {
     sal_Int32 nCount = 0;
-    const int nEntryCount = maEntryVector.size();
-    for( int nEntry = 0; nEntry < nEntryCount; nEntry++ )
+    for( const auto& pEntry : maEntryVector )
     {
-        ToolbarMenuEntry* pEntry = maEntryVector[nEntry];
         if( pEntry )
         {
             if( pEntry->mpControl )
@@ -251,10 +249,8 @@ sal_Int32 ToolbarMenu_Impl::getAccessibleChildCount() throw (RuntimeException)
 
 Reference< XAccessible > ToolbarMenu_Impl::getAccessibleChild( sal_Int32 index ) throw (IndexOutOfBoundsException, RuntimeException)
 {
-    const int nEntryCount = maEntryVector.size();
-    for( int nEntry = 0; nEntry < nEntryCount; nEntry++ )
+    for( const auto& pEntry : maEntryVector )
     {
-        ToolbarMenuEntry* pEntry = maEntryVector[nEntry];
         if( pEntry )
         {
             const sal_Int32 nCount = pEntry->getAccessibleChildCount();
@@ -272,10 +268,8 @@ Reference< XAccessible > ToolbarMenu_Impl::getAccessibleChild( sal_Int32 index )
 
 Reference< XAccessible > ToolbarMenu_Impl::getAccessibleChild( Control* pControl, sal_Int32 childIndex ) throw (IndexOutOfBoundsException, RuntimeException)
 {
-    const int nEntryCount = maEntryVector.size();
-    for( int nEntry = 0; nEntry < nEntryCount; nEntry++ )
+    for( const auto& pEntry : maEntryVector )
     {
-        ToolbarMenuEntry* pEntry = maEntryVector[nEntry];
         if( pEntry && (pEntry->mpControl.get() == pControl) )
         {
             return pEntry->getAccessibleChild( childIndex );
@@ -291,7 +285,7 @@ void ToolbarMenu_Impl::selectAccessibleChild( sal_Int32 nChildIndex ) throw (Ind
     const int nEntryCount = maEntryVector.size();
     for( int nEntry = 0; nEntry < nEntryCount; nEntry++ )
     {
-        ToolbarMenuEntry* pEntry = maEntryVector[nEntry];
+        ToolbarMenuEntry* const pEntry = maEntryVector[nEntry].get();
         if( pEntry )
         {
             const sal_Int32 nCount = pEntry->getAccessibleChildCount();
@@ -321,7 +315,7 @@ bool ToolbarMenu_Impl::isAccessibleChildSelected( sal_Int32 nChildIndex ) throw
     const int nEntryCount = maEntryVector.size();
     for( int nEntry = 0; nEntry < nEntryCount; nEntry++ )
     {
-        ToolbarMenuEntry* pEntry = maEntryVector[nEntry];
+        ToolbarMenuEntry* const pEntry = maEntryVector[nEntry].get();
         if( pEntry )
         {
             const sal_Int32 nCount = pEntry->getAccessibleChildCount();
@@ -400,7 +394,7 @@ ToolbarMenuEntry* ToolbarMenu_Impl::implGetEntry( int nEntry ) const
     if( (nEntry < 0) || (nEntry >= (int)maEntryVector.size() ) )
         return nullptr;
 
-    return maEntryVector[nEntry];
+    return maEntryVector[nEntry].get();
 }
 
 
@@ -452,13 +446,7 @@ void ToolbarMenu::dispose()
     std::unique_ptr<ToolbarMenu_Impl> pImpl{mpImpl};
     mpImpl = nullptr;
 
-    // delete all menu entries
-    const int nEntryCount = pImpl->maEntryVector.size();
-    int nEntry;
-    for( nEntry = 0; nEntry < nEntryCount; nEntry++ )
-    {
-        delete pImpl->maEntryVector[nEntry];
-    }
+    pImpl->maEntryVector.clear();
 
     DockingWindow::dispose();
 }
@@ -594,18 +582,14 @@ Size ToolbarMenu::implCalcSize()
     long nMaxTextWidth = 0;
     long nMinMenuItemHeight = nFontHeight+2;
 
-    const int nEntryCount = mpImpl->maEntryVector.size();
-    int nEntry;
-
     const StyleSettings& rSettings = GetSettings().GetStyleSettings();
     const bool bUseImages = rSettings.GetUseImagesInMenus();
 
     // get maximum image size
     if( bUseImages )
     {
-        for( nEntry = 0; nEntry < nEntryCount; nEntry++ )
+        for( const auto& pEntry : mpImpl->maEntryVector )
         {
-            ToolbarMenuEntry* pEntry = mpImpl->maEntryVector[nEntry];
             if( pEntry && pEntry->mbHasImage )
             {
                 Size aImgSz( pEntry->maImage.GetSizePixel() );
@@ -623,10 +607,8 @@ Size ToolbarMenu::implCalcSize()
         mpImpl->mnTextPos += std::max( nExtra, 7L );
 
     // set heights, calc maximum width
-    for( nEntry = 0; nEntry < nEntryCount; nEntry++ )
+    for( const auto& pEntry : mpImpl->maEntryVector )
     {
-        ToolbarMenuEntry* pEntry = mpImpl->maEntryVector[nEntry];
-
         if( pEntry )
         {
             // Text:
@@ -677,10 +659,8 @@ Size ToolbarMenu::implCalcSize()
 
     // positionate controls
     int nY = BORDER_Y;
-    for( nEntry = 0; nEntry < nEntryCount; nEntry++ )
+    for( const auto& pEntry : mpImpl->maEntryVector )
     {
-        ToolbarMenuEntry* pEntry = mpImpl->maEntryVector[nEntry];
-
         if (pEntry)
         {
             pEntry->maSize.Width() = nMaxTextWidth;
@@ -739,25 +719,25 @@ void ToolbarMenu::LoseFocus()
 
 void ToolbarMenu::appendEntry( int nEntryId, const OUString& rStr, MenuItemBits nItemBits )
 {
-    appendEntry( new ToolbarMenuEntry( *this, nEntryId, rStr, nItemBits ) );
+    appendEntry( o3tl::make_unique<ToolbarMenuEntry>( *this, nEntryId, rStr, nItemBits ) );
 }
 
 
 void ToolbarMenu::appendEntry( int nEntryId, const OUString& rStr, const Image& rImage )
 {
-    appendEntry( new ToolbarMenuEntry( *this, nEntryId, rImage, rStr, MenuItemBits::NONE ) );
+    appendEntry( o3tl::make_unique<ToolbarMenuEntry>( *this, nEntryId, rImage, rStr, MenuItemBits::NONE ) );
 }
 
 
 void ToolbarMenu::appendEntry( int nEntryId, Control* pControl )
 {
-    appendEntry( new ToolbarMenuEntry( *this, nEntryId, pControl, MenuItemBits::NONE ) );
+    appendEntry( o3tl::make_unique<ToolbarMenuEntry>( *this, nEntryId, pControl, MenuItemBits::NONE ) );
 }
 
 
-void ToolbarMenu::appendEntry( ToolbarMenuEntry* pEntry )
+void ToolbarMenu::appendEntry( std::unique_ptr<ToolbarMenuEntry> pEntry )
 {
-    mpImpl->maEntryVector.push_back(pEntry);
+    mpImpl->maEntryVector.push_back(std::move(pEntry));
     mpImpl->maSize = implCalcSize();
     if (IsVisible())
         Invalidate();
@@ -789,14 +769,11 @@ ToolbarMenuEntry* ToolbarMenu::implGetEntry( int nEntry ) const
 
 ToolbarMenuEntry* ToolbarMenu::implSearchEntry( int nEntryId ) const
 {
-    const int nEntryCount = mpImpl->maEntryVector.size();
-    int nEntry;
-    for( nEntry = 0; nEntry < nEntryCount; nEntry++ )
+    for( const auto& p : mpImpl->maEntryVector )
     {
-        ToolbarMenuEntry* p = mpImpl->maEntryVector[nEntry];
         if( p && p->mnEntryId == nEntryId )
         {
-            return p;
+            return p.get();
         }
     }
 
@@ -814,7 +791,7 @@ void ToolbarMenu::implHighlightEntry(vcl::RenderContext& rRenderContext, int nHi
 
     for (int nEntry = 0; nEntry < nEntryCount; nEntry++)
     {
-        ToolbarMenuEntry* pEntry = mpImpl->maEntryVector[nEntry];
+        ToolbarMenuEntry* const pEntry = mpImpl->maEntryVector[nEntry].get();
         if (pEntry && (nEntry == nHighlightEntry))
         {
             // no highlights for controls only items
@@ -890,7 +867,7 @@ void ToolbarMenu::implSelectEntry( int nSelectedEntry )
 
     ToolbarMenuEntry* pEntry = nullptr;
     if( nSelectedEntry != -1 )
-        pEntry = mpImpl->maEntryVector[ nSelectedEntry ];
+        pEntry = mpImpl->maEntryVector[ nSelectedEntry ].get();
 
     if( pEntry )
         mpImpl->maSelectHdl.Call( this );
@@ -928,10 +905,9 @@ void ToolbarMenu::implHighlightAtPosition(const MouseEvent& rMEvt, bool /*bMBDow
         bool bHighlighted = false;
 
         const int nEntryCount = mpImpl->maEntryVector.size();
-        int nEntry;
-        for( nEntry = 0; nEntry < nEntryCount; nEntry++ )
+        for( int nEntry = 0; nEntry < nEntryCount; nEntry++ )
         {
-            ToolbarMenuEntry* pEntry = mpImpl->maEntryVector[nEntry];
+            ToolbarMenuEntry* pEntry = mpImpl->maEntryVector[nEntry].get();
             if( pEntry )
             {
                 long nOldY = nY;
@@ -1020,7 +996,7 @@ ToolbarMenuEntry* ToolbarMenu::implCursorUpDown( bool bUp, bool bHomeEnd )
             // if we have a currently selected entry and
             // cursor keys are used than check if this entry
             // has a control that can use those cursor keys
-            ToolbarMenuEntry* pData = mpImpl->maEntryVector[n];
+            ToolbarMenuEntry* pData = mpImpl->maEntryVector[n].get();
             if( pData && pData->mpControl && !pData->mbHasText )
             {
                 if( implCheckSubControlCursorMove( pData->mpControl, bUp, mpImpl->mnLastColumn ) )
@@ -1067,7 +1043,7 @@ ToolbarMenuEntry* ToolbarMenu::implCursorUpDown( bool bUp, bool bHomeEnd )
                     break;
         }
 
-        ToolbarMenuEntry* pData = mpImpl->maEntryVector[n];
+        ToolbarMenuEntry* pData = mpImpl->maEntryVector[n].get();
         if( pData && (pData->mnEntryId != TITLE_ID) )
         {
             implChangeHighlightEntry( n );
@@ -1228,12 +1204,8 @@ void ToolbarMenu::implPaint(vcl::RenderContext& rRenderContext, ToolbarMenuEntry
     Point aTopLeft(nOuterSpace, nOuterSpace), aTmpPos;
 
     Size aOutSz(GetOutputSizePixel());
-    const int nEntryCount = mpImpl->maEntryVector.size();
-    int nEntry;
-    for (nEntry = 0; nEntry < nEntryCount; nEntry++)
+    for (const auto& pEntry : mpImpl->maEntryVector)
     {
-        ToolbarMenuEntry* pEntry = mpImpl->maEntryVector[nEntry];
-
         Point aPos(aTopLeft);
         aPos.Y() += nBorder;
         aPos.Y() += nStartY;
@@ -1250,7 +1222,7 @@ void ToolbarMenu::implPaint(vcl::RenderContext& rRenderContext, ToolbarMenuEntry
             rRenderContext.DrawLine(aTmpPos, Point( aOutSz.Width() - 3 - 2 * nOuterSpace, aTmpPos.Y()));
             rRenderContext.SetLineColor();
         }
-        else if (!pThisOnly || (pEntry == pThisOnly))
+        else if (!pThisOnly || (pEntry.get() == pThisOnly))
         {
             const bool bTitle = pEntry->mnEntryId == TITLE_ID;
 
diff --git a/svtools/source/control/toolbarmenuacc.cxx b/svtools/source/control/toolbarmenuacc.cxx
index b6a8dd1..3cde3c6 100644
--- a/svtools/source/control/toolbarmenuacc.cxx
+++ b/svtools/source/control/toolbarmenuacc.cxx
@@ -335,7 +335,7 @@ Reference< XAccessible > SAL_CALL ToolbarMenuAcc::getAccessibleAtPoint( const aw
     const int nEntryCount = mpParent->maEntryVector.size();
     for( int nEntry = 0; (nEntry < nEntryCount) && !xRet.is(); nEntry++ )
     {
-        ToolbarMenuEntry* pEntry = mpParent->maEntryVector[nEntry];
+        ToolbarMenuEntry* pEntry = mpParent->maEntryVector[nEntry].get();
         if( pEntry && pEntry->maRect.IsInside( aVclPoint ) )
         {
             if( pEntry->mpControl )
@@ -465,7 +465,7 @@ Reference< XAccessible > SAL_CALL ToolbarMenuAcc::getSelectedAccessibleChild( sa
 
     if( (mpParent->mnHighlightedEntry != -1) && (nSelectedChildIndex == 0) )
     {
-        ToolbarMenuEntry* pEntry = mpParent->maEntryVector[ mpParent->mnHighlightedEntry ];
+        ToolbarMenuEntry* pEntry = mpParent->maEntryVector[ mpParent->mnHighlightedEntry ].get();
         if( pEntry )
         {
             if( pEntry->mpControl )
diff --git a/svtools/source/control/toolbarmenuimp.hxx b/svtools/source/control/toolbarmenuimp.hxx
index 9469bde..8576eb3 100644
--- a/svtools/source/control/toolbarmenuimp.hxx
+++ b/svtools/source/control/toolbarmenuimp.hxx
@@ -37,6 +37,7 @@
 
 #include <rtl/ref.hxx>
 
+#include <memory>
 #include <vector>
 
 #include <svtools/framestatuslistener.hxx>
@@ -48,7 +49,7 @@ class ToolbarMenu;
 class ToolbarMenuEntry;
 
 typedef ::std::vector< css::uno::Reference< css::accessibility::XAccessibleEventListener > > EventListenerVector;
-typedef std::vector< ToolbarMenuEntry * > ToolbarMenuEntryVector;
+typedef std::vector< std::unique_ptr< ToolbarMenuEntry > > ToolbarMenuEntryVector;
 
 const int SEPARATOR_HEIGHT = 4;
 const int TITLE_ID = -1;
commit 9d93b5cad049526933f251f89372c2a8dd051b3f
Author: David Tardon <dtardon at redhat.com>
Date:   Thu May 12 12:25:27 2016 +0200

    avoid crash when using the New Slide toolbar popup in Impress
    
    Change-Id: I5aeb77fa8764179699d884647e8734d413752130

diff --git a/svtools/source/control/toolbarmenu.cxx b/svtools/source/control/toolbarmenu.cxx
index 07793e5..17befc9 100644
--- a/svtools/source/control/toolbarmenu.cxx
+++ b/svtools/source/control/toolbarmenu.cxx
@@ -447,6 +447,8 @@ void ToolbarMenu::dispose()
         mpImpl->mxStatusListener.clear();
     }
 
+    mpImpl->mxAccessible.clear();
+
     std::unique_ptr<ToolbarMenu_Impl> pImpl{mpImpl};
     mpImpl = nullptr;
 
commit 2f57b2280c453fd5e02b97fa63c67d3b796d492f
Author: David Tardon <dtardon at redhat.com>
Date:   Thu May 12 12:19:44 2016 +0200

    do not try to use obj. that is already being disposed
    
    Change-Id: Ibb25e5bfc3e161be9fdac124b5a107a6d180bf1e

diff --git a/svtools/source/control/toolbarmenu.cxx b/svtools/source/control/toolbarmenu.cxx
index 67a0843..07793e5 100644
--- a/svtools/source/control/toolbarmenu.cxx
+++ b/svtools/source/control/toolbarmenu.cxx
@@ -17,6 +17,8 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
+#include <memory>
+
 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
 #include <comphelper/processfactory.hxx>
@@ -445,17 +447,17 @@ void ToolbarMenu::dispose()
         mpImpl->mxStatusListener.clear();
     }
 
+    std::unique_ptr<ToolbarMenu_Impl> pImpl{mpImpl};
+    mpImpl = nullptr;
+
     // delete all menu entries
-    const int nEntryCount = mpImpl->maEntryVector.size();
+    const int nEntryCount = pImpl->maEntryVector.size();
     int nEntry;
     for( nEntry = 0; nEntry < nEntryCount; nEntry++ )
     {
-        delete mpImpl->maEntryVector[nEntry];
+        delete pImpl->maEntryVector[nEntry];
     }
 
-    delete mpImpl;
-    mpImpl = nullptr;
-
     DockingWindow::dispose();
 }
 
@@ -717,7 +719,7 @@ void ToolbarMenu::highlightFirstEntry()
 
 void ToolbarMenu::GetFocus()
 {
-    if( mpImpl->mnHighlightedEntry == -1 )
+    if( mpImpl && mpImpl->mnHighlightedEntry == -1 )
         implChangeHighlightEntry( 0 );
 
     DockingWindow::GetFocus();


More information about the Libreoffice-commits mailing list