Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/3398

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/98/3398/1

Convert SmFontPickList from SfxPtrArr to std::vector

- removing SmPickList in the process, since it's only used
  as a base class for SmFontPickList
- and remove dynamic allocation, since we're always making our
  own copy, just store the data inline in the vector

Change-Id: Idedff240456788c473ac49bdaa3f6d27a217e3d6
---
M starmath/inc/utility.hxx
M starmath/source/utility.cxx
2 files changed, 71 insertions(+), 197 deletions(-)



diff --git a/starmath/inc/utility.hxx b/starmath/inc/utility.hxx
index 0f4a748..01a41cd 100644
--- a/starmath/inc/utility.hxx
+++ b/starmath/inc/utility.hxx
@@ -19,12 +19,12 @@
 #ifndef UTILITY_HXX
 #define UTILITY_HXX
 
-#include <sfx2/minarray.hxx>
 #include <vcl/font.hxx>
 #include <vcl/fixed.hxx>
 #include <vcl/combobox.hxx>
 #include <vcl/lstbox.hxx>
 #include <tools/fract.hxx>
+#include <deque>
 
 
 inline long SmPtsTo100th_mm(long nNumPts)
@@ -114,114 +114,38 @@
 
 ////////////////////////////////////////////////////////////
 //
-// SmPickList
-//
-
-class SmPickList : public SfxPtrArr
-{
-protected:
-    sal_uInt16  nSize;
-
-    virtual void   *CreateItem(const void *pItem) = 0;
-    virtual void    DestroyItem(void *pItem) = 0;
-
-    virtual bool    CompareItem(const void *pFirstItem, const void *pSecondItem) const = 0;
-
-    virtual OUString GetStringItem(void *pItem) = 0;
-
-    void       *GetPtr(sal_uInt16 nPos) const { return SfxPtrArr::GetObject(nPos); }
-    void      *&GetPtr(sal_uInt16 nPos) { return SfxPtrArr::GetObject(nPos); }
-    void        InsertPtr(sal_uInt16 nPos, void *pItem) { SfxPtrArr::Insert(nPos, pItem); }
-    void        RemovePtr(sal_uInt16 nPos, sal_uInt16 nCount = 1) { SfxPtrArr::Remove(nPos, 
nCount); }
-
-public:
-    SmPickList(sal_uInt16 nInitSize = 0, sal_uInt16 nMaxSize = 5);
-    virtual ~SmPickList();
-
-    SmPickList&   operator = (const SmPickList& rList);
-
-    void       *Get(sal_uInt16 nPos = 0) const { return GetPtr(nPos); }
-    using   SfxPtrArr::Insert;
-    void        Insert(const void* pItem);
-    void        Update(const void* pItem, const void *pNewItem);
-    using   SfxPtrArr::Remove;
-    void        Remove(const void* pItem);
-
-    using   SfxPtrArr::operator [];
-    void       *operator [] (sal_uInt16 nPos) const { return GetPtr(nPos); }
-
-    sal_uInt16      GetSize() const { return nSize; }
-    sal_uInt16      Count() const { return SfxPtrArr::Count(); }
-
-    void        Clear();
-};
-
-
-////////////////////////////////////////////////////////////
-//
 // SmFontPickList
 //
 
 class SmFontDialog;
 
-class SmFontPickList : public SmPickList
+class SmFontPickList
 {
 protected:
-    virtual void   *CreateItem(const void *pItem);
-    virtual void    DestroyItem(void *pItem);
+    sal_uInt16 nMaxItems;
+    std::deque<Font> aFontVec;
 
-    virtual bool    CompareItem(const void *pFirstItem, const void *pSecondItem) const;
-
-    virtual OUString GetStringItem(void *pItem);
+    bool     CompareItem(const Font & rFirstFont, const Font & rSecondFont) const;
+    OUString GetStringItem(const Font &rItem);
 
 public:
-    SmFontPickList()
-        : SmPickList(0, 5) {}
-    SmFontPickList(sal_uInt16 nInitSize, sal_uInt16 nMaxSize)
-        : SmPickList(nInitSize, nMaxSize) {}
-    SmFontPickList(const SmPickList& rOrig )
-        : SmPickList(rOrig) {}
+    SmFontPickList(sal_uInt16 nMax = 5) : nMaxItems(nMax) {}
     virtual ~SmFontPickList() { Clear(); }
 
-    using   SfxPtrArr::Insert;
     virtual void    Insert(const Font &rFont);
-    using   SmPickList::Update;
     virtual void    Update(const Font &rFont, const Font &rNewFont);
-    using   SfxPtrArr::Remove;
     virtual void    Remove(const Font &rFont);
 
-    using   SmPickList::Contains;
-    inline bool     Contains(const Font &rFont) const;
-    inline Font     Get(sal_uInt16 nPos = 0) const;
+    void     Clear();
+    bool     Contains(const Font &rFont) const;
+    Font     Get(sal_uInt16 nPos = 0) const;
 
-    inline SmFontPickList&  operator = (const SmFontPickList& rList);
-    using   SfxPtrArr::operator [];
-    inline Font             operator [] (sal_uInt16 nPos) const;
+    SmFontPickList&  operator = (const SmFontPickList& rList);
+    Font             operator [] (sal_uInt16 nPos) const;
 
     void            ReadFrom(const SmFontDialog& rDialog);
     void            WriteTo(SmFontDialog& rDialog) const;
 };
-
-inline SmFontPickList& SmFontPickList::operator = (const SmFontPickList& rList)
-{
-    *(SmPickList *)this = *(SmPickList *)&rList; return *this;
-}
-
-inline Font SmFontPickList::operator [] (sal_uInt16 nPos) const
-{
-    return *((Font *)SmPickList::operator[](nPos));
-}
-
-inline Font SmFontPickList::Get(sal_uInt16 nPos) const
-{
-    return nPos < Count() ? *((Font *)SmPickList::Get(nPos)) : Font();
-}
-
-inline bool SmFontPickList::Contains(const Font &rFont) const
-{
-    return SmPickList::Contains((void *)&rFont);
-}
-
 
 ////////////////////////////////////////////////////////////
 //
@@ -234,15 +158,13 @@
     DECL_LINK(SelectHdl, ListBox *);
 
 public:
-    SmFontPickListBox(Window* pParent, const ResId& rResId, sal_uInt16 nMax = 4);
+    SmFontPickListBox(Window* pParent, const ResId& rResId);
 
     SmFontPickListBox& operator = (const SmFontPickList& rList);
 
-    using   SfxPtrArr::Insert;
     virtual void    Insert(const Font &rFont);
     using   Window::Update;
     virtual void    Update(const Font &rFont, const Font &rNewFont);
-    using   SfxPtrArr::Remove;
     virtual void    Remove(const Font &rFont);
 };
 
diff --git a/starmath/source/utility.cxx b/starmath/source/utility.cxx
index cde1b35..1d450ec 100644
--- a/starmath/source/utility.cxx
+++ b/starmath/source/utility.cxx
@@ -50,122 +50,58 @@
 
 /**************************************************************************/
 
-SmPickList::SmPickList(sal_uInt16 nInitSize, sal_uInt16 nMaxSize) :
-    SfxPtrArr((sal_uInt8) nInitSize, 1)
+void SmFontPickList::Clear()
 {
-    nSize = nMaxSize;
+    aFontVec.clear();
 }
 
-
-SmPickList::~SmPickList()
+SmFontPickList& SmFontPickList::operator = (const SmFontPickList& rList)
 {
     Clear();
-}
-
-
-SmPickList& SmPickList::operator=(const SmPickList& rList)
-{
-    sal_uInt16  nPos;
-
-    Clear();
-    nSize = rList.nSize;
-    for (nPos = 0; nPos < rList.Count(); nPos++)
-        InsertPtr(nPos, CreateItem(rList.Get(nPos)));
+    nMaxItems = rList.nMaxItems;
+    for (sal_uInt16 nPos = 0; nPos < rList.aFontVec.size(); nPos++)
+        aFontVec.push_back( rList.aFontVec[nPos] );
 
     return *this;
 }
 
-
-void SmPickList::Insert(const void *pItem)
+Font SmFontPickList::operator [] (sal_uInt16 nPos) const
 {
-    Remove(pItem);
-    InsertPtr(0, CreateItem(pItem));
+    return aFontVec[nPos];
+}
 
-    if (Count() > nSize)
-    {
-        DestroyItem(GetPtr(nSize));
-        RemovePtr(nSize, 1);
-    }
+Font SmFontPickList::Get(sal_uInt16 nPos) const
+{
+    return nPos < aFontVec.size() ? aFontVec[nPos] : Font();
+}
+
+bool SmFontPickList::Contains(const Font &rFont) const
+{
+    return std::find( aFontVec.begin(), aFontVec.end(), rFont ) != aFontVec.end();
 }
 
 
-void SmPickList::Update(const void *pItem, const void *pNewItem)
-{
-    sal_uInt16  nPos;
 
-    for (nPos = 0; nPos < Count(); nPos++)
-        if (CompareItem(GetPtr(nPos), pItem))
-        {
-            DestroyItem(GetPtr(nPos));
-            GetPtr(nPos) = CreateItem(pNewItem);
-            break;
-        }
+
+bool SmFontPickList::CompareItem(const Font & rFirstFont, const Font & rSecondFont) const
+{
+  return rFirstFont.GetName() == rSecondFont.GetName() &&
+        rFirstFont.GetFamily()  == rSecondFont.GetFamily()  &&
+        rFirstFont.GetCharSet() == rSecondFont.GetCharSet() &&
+        rFirstFont.GetWeight()  == rSecondFont.GetWeight()  &&
+        rFirstFont.GetItalic()  == rSecondFont.GetItalic();
 }
 
-void SmPickList::Remove(const void *pItem)
+OUString SmFontPickList::GetStringItem(const Font &rFont)
 {
-    sal_uInt16  nPos;
+    OUStringBuffer aString(rFont.GetName());
 
-    for (nPos = 0; nPos < Count(); nPos++)
-        if (CompareItem(GetPtr(nPos), pItem))
-        {
-            DestroyItem(GetPtr(nPos));
-            RemovePtr(nPos, 1);
-            break;
-        }
-}
-
-void SmPickList::Clear()
-{
-    sal_uInt16  nPos;
-
-    for (nPos = 0; nPos < Count(); nPos++)
-        DestroyItem(GetPtr(nPos));
-
-    RemovePtr(0, Count());
-}
-
-
-/**************************************************************************/
-
-void * SmFontPickList::CreateItem(const void *pItem)
-{
-    return new Font(*((Font *) pItem));
-}
-
-void SmFontPickList::DestroyItem(void *pItem)
-{
-    delete (Font *)pItem;
-}
-
-bool SmFontPickList::CompareItem(const void *pFirstItem, const void *pSecondItem) const
-{
-    Font    *pFirstFont, *pSecondFont;
-
-    pFirstFont  = (Font *)pFirstItem;
-    pSecondFont = (Font *)pSecondItem;
-
-    if (pFirstFont->GetName() == pSecondFont->GetName())
-        if ((pFirstFont->GetFamily()  == pSecondFont->GetFamily())  &&
-            (pFirstFont->GetCharSet() == pSecondFont->GetCharSet()) &&
-            (pFirstFont->GetWeight()  == pSecondFont->GetWeight())  &&
-            (pFirstFont->GetItalic()  == pSecondFont->GetItalic()))
-            return (true);
-
-    return false;
-}
-
-OUString SmFontPickList::GetStringItem(void *pItem)
-{
-    Font *pFont = (Font *)pItem;
-    OUStringBuffer aString(pFont->GetName());
-
-    if (IsItalic( *pFont ))
+    if (IsItalic( rFont ))
     {
         aString.append(", ");
         aString.append(SM_RESSTR(RID_FONTITALIC));
     }
-    if (IsBold( *pFont ))
+    if (IsBold( rFont ))
     {
         aString.append(", ");
         aString.append(SM_RESSTR(RID_FONTBOLD));
@@ -176,17 +112,33 @@
 
 void SmFontPickList::Insert(const Font &rFont)
 {
-    SmPickList::Insert((void *)&rFont);
+    Remove(rFont);
+    aFontVec.push_front( rFont );
+
+    if (aFontVec.size() > nMaxItems)
+    {
+        aFontVec.pop_back();
+    }
 }
 
 void SmFontPickList::Update(const Font &rFont, const Font &rNewFont)
 {
-    SmPickList::Update((void *)&rFont, (void *)&rNewFont);
+    for (sal_uInt16 nPos = 0; nPos < aFontVec.size(); nPos++)
+        if (CompareItem( aFontVec[nPos], rFont ))
+        {
+            aFontVec[nPos] = rNewFont;
+            break;
+        }
 }
 
 void SmFontPickList::Remove(const Font &rFont)
 {
-    SmPickList::Remove((void *)&rFont);
+    for (sal_uInt16 nPos = 0; nPos < aFontVec.size(); nPos++)
+        if (CompareItem( aFontVec[nPos], rFont))
+        {
+            aFontVec.erase( aFontVec.begin() + nPos );
+            break;
+        }
 }
 
 
@@ -225,8 +177,8 @@
 }
 
 
-SmFontPickListBox::SmFontPickListBox(Window* pParent, const ResId& rResId, sal_uInt16 nMax) :
-    SmFontPickList(nMax, nMax),
+SmFontPickListBox::SmFontPickListBox(Window* pParent, const ResId& rResId) :
+    SmFontPickList(4),
     ListBox(pParent, rResId)
 {
     SetSelectHdl(LINK(this, SmFontPickListBox, SelectHdl));
@@ -239,11 +191,11 @@
 
     *(SmFontPickList *)this = rList;
 
-    for (nPos = 0; nPos < Count(); nPos++)
-        InsertEntry(GetStringItem(GetPtr(nPos)), nPos);
+    for (nPos = 0; nPos < aFontVec.size(); nPos++)
+        InsertEntry(GetStringItem(aFontVec[nPos]), nPos);
 
-    if (Count() > 0)
-        SelectEntry(GetStringItem(GetPtr(0)));
+    if (aFontVec.size() > 0)
+        SelectEntry(GetStringItem(aFontVec.front()));
 
     return *this;
 }
@@ -252,11 +204,11 @@
 {
     SmFontPickList::Insert(rFont);
 
-    RemoveEntry(GetStringItem(GetPtr(0)));
-    InsertEntry(GetStringItem(GetPtr(0)), 0);
-    SelectEntry(GetStringItem(GetPtr(0)));
+    RemoveEntry(GetStringItem(aFontVec.front()));
+    InsertEntry(GetStringItem(aFontVec.front()), 0);
+    SelectEntry(GetStringItem(aFontVec.front()));
 
-    while (GetEntryCount() > nSize)
+    while (GetEntryCount() > nMaxItems)
         RemoveEntry(GetEntryCount() - 1);
 
     return;

-- 
To view, visit https://gerrit.libreoffice.org/3398
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Idedff240456788c473ac49bdaa3f6d27a217e3d6
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Noel Grandin <noelgrandin@gmail.com>


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.