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

Jakub Trzebiatowski ubap.dev at gmail.com
Wed Aug 10 07:41:41 UTC 2016


 sw/inc/doc.hxx                     |    4 ++
 sw/inc/docstyle.hxx                |    3 +
 sw/inc/swundo.hxx                  |    4 +-
 sw/inc/tblafmt.hxx                 |    2 +
 sw/qa/extras/uiwriter/uiwriter.cxx |   35 ++++++++++++++++++++
 sw/source/core/doc/tblafmt.cxx     |   16 +++++++++
 sw/source/core/docnode/ndtbl.cxx   |   58 ++++++++++++++++++++++++++++++++++
 sw/source/core/inc/UndoTable.hxx   |   30 +++++++++++++++++
 sw/source/core/undo/undo.hrc       |    4 +-
 sw/source/core/undo/undo.src       |    8 ++++
 sw/source/core/undo/untbl.cxx      |   63 +++++++++++++++++++++++++++++++++++++
 sw/source/uibase/app/docst.cxx     |   23 ++++++++++++-
 sw/source/uibase/app/docstyle.cxx  |   49 ++++++++++++++++++----------
 13 files changed, 277 insertions(+), 22 deletions(-)

New commits:
commit 0943ee2decb8d5a1a2a5bf3b1c233934a89e9c97
Author: Jakub Trzebiatowski <ubap.dev at gmail.com>
Date:   Tue Aug 2 14:57:17 2016 +0200

    GSoC Writer Table Styles; Create by example; fix undo
    
    - Create style by example, tracked by undo;
    - Fixed delete style, now is tracked by undo
    
    Change-Id: Ic39b549b0b970b1b15001d527a82fb26e4a630aa
    Reviewed-on: https://gerrit.libreoffice.org/27990
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index 755c598..cbc3145 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -1259,6 +1259,10 @@ public:
     /// Return the available table styles.
     SwTableAutoFormatTable& GetTableStyles() { return *mpTableStyles.get(); }
     const SwTableAutoFormatTable& GetTableStyles() const { return *mpTableStyles.get(); }
+    // Create a new table style. Tracked by Undo.
+    SwTableAutoFormat* MakeTableStyle(const OUString& rName, bool bBroadcast = false);
+    // Delete table style named rName. If pAffectedTables is not null, it contains pointers to affected tables. Tracked by undo.
+    std::unique_ptr<SwTableAutoFormat> DelTableStyle(const OUString& rName, bool bBroadcast = false, std::vector<SwTable*>* pAffectedTables = nullptr);
 
     const SwCellStyleTable& GetCellStyles() const  { return *mpCellStyles.get(); }
           SwCellStyleTable& GetCellStyles()        { return *mpCellStyles.get(); }
diff --git a/sw/inc/docstyle.hxx b/sw/inc/docstyle.hxx
index bb43d7d..0e1e959 100644
--- a/sw/inc/docstyle.hxx
+++ b/sw/inc/docstyle.hxx
@@ -50,7 +50,7 @@ class SW_DLLPUBLIC SwDocStyleSheet : public SfxStyleSheetBase
     SwFrameFormat*           pFrameFormat;
     const SwPageDesc*   pDesc;
     const SwNumRule*    pNumRule;
-    const SwTableAutoFormat* pTableFormat;
+    SwTableAutoFormat*  pTableFormat;
     const SwBoxAutoFormat*   pBoxFormat;
     SwDoc&              rDoc;
     SfxItemSet          aCoreSet;
@@ -135,6 +135,7 @@ public:
     const SwPageDesc*       GetPageDesc();
     const SwNumRule*        GetNumRule();
     void                    SetNumRule(const SwNumRule& rRule);
+    SwTableAutoFormat*      GetTableFormat();
 
     virtual bool            IsUsed() const override;
 };
diff --git a/sw/inc/swundo.hxx b/sw/inc/swundo.hxx
index 2617031..9a90d4a 100644
--- a/sw/inc/swundo.hxx
+++ b/sw/inc/swundo.hxx
@@ -150,7 +150,9 @@ enum SwUndoId
     // --> #i73249#
     UNDO_FLYFRMFMT_TITLE,           // 112
     UNDO_FLYFRMFMT_DESCRIPTION,     // 113
-    UNDO_STD_END= UNDO_FLYFRMFMT_DESCRIPTION,
+    UNDO_TBLSTYLE_CREATE,           // 114
+    UNDO_TBLSTYLE_DELETE,           // 115
+    UNDO_STD_END= UNDO_TBLSTYLE_DELETE,
 
     // UI undo ID's...
     UNDO_UI_REPLACE             =  UNDO_STD_END + 1,
diff --git a/sw/inc/tblafmt.hxx b/sw/inc/tblafmt.hxx
index 92bd534..c403cb0 100644
--- a/sw/inc/tblafmt.hxx
+++ b/sw/inc/tblafmt.hxx
@@ -358,6 +358,8 @@ public:
     void EraseAutoFormat(size_t i);
     void EraseAutoFormat(const OUString& rName);
     std::unique_ptr<SwTableAutoFormat> ReleaseAutoFormat(size_t i);
+    /// Removes an autoformat. Returns pointer to the removed autoformat or nullptr.
+    std::unique_ptr<SwTableAutoFormat> ReleaseAutoFormat(const OUString& rName);
 
     /// Find table style with the provided name, return nullptr when not found.
     SwTableAutoFormat* FindAutoFormat(const OUString& rName) const;
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index e48d67c..40ca4e5 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -62,6 +62,7 @@
 #include "UndoManager.hxx"
 #include <textsh.hxx>
 #include <frmmgr.hxx>
+#include <tblafmt.hxx>
 
 #include <com/sun/star/lang/Locale.hpp>
 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
@@ -200,6 +201,7 @@ public:
     void testTdf99004();
     void testTdf84695();
     void testTdf84695NormalChar();
+    void testTableStyleUndo();
 
     CPPUNIT_TEST_SUITE(SwUiWriterTest);
     CPPUNIT_TEST(testReplaceForward);
@@ -302,6 +304,7 @@ public:
     CPPUNIT_TEST(testTdf99004);
     CPPUNIT_TEST(testTdf84695);
     CPPUNIT_TEST(testTdf84695NormalChar);
+    CPPUNIT_TEST(testTableStyleUndo);
     CPPUNIT_TEST_SUITE_END();
 
 private:
@@ -3765,6 +3768,38 @@ void SwUiWriterTest::testTdf84695NormalChar()
     CPPUNIT_ASSERT_EQUAL(OUString("a"), xShape->getString());
 }
 
+void SwUiWriterTest::testTableStyleUndo()
+{
+    SwDoc* pDoc = createDoc();
+    sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
+
+    sal_Int32 nStyleCount = pDoc->GetTableStyles().size();
+    SwTableAutoFormat* pStyle = pDoc->MakeTableStyle("Test Style");
+    SvxBrushItem aBackground(Color(0xFF00FF), RES_BACKGROUND );
+    pStyle->GetBoxFormat(0).SetBackground(aBackground);
+
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(pDoc->GetTableStyles().size()), nStyleCount + 1);
+    rUndoManager.Undo();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(pDoc->GetTableStyles().size()), nStyleCount);
+    rUndoManager.Redo();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(pDoc->GetTableStyles().size()), nStyleCount + 1);
+    // check if attributes are preserved
+    pStyle = pDoc->GetTableStyles().FindAutoFormat("Test Style");
+    CPPUNIT_ASSERT(pStyle);
+    CPPUNIT_ASSERT(pStyle->GetBoxFormat(0).GetBackground() == aBackground);
+
+    pDoc->DelTableStyle("Test Style");
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(pDoc->GetTableStyles().size()), nStyleCount);
+    rUndoManager.Undo();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(pDoc->GetTableStyles().size()), nStyleCount + 1);
+    pStyle = pDoc->GetTableStyles().FindAutoFormat("Test Style");
+    // check if attributes are preserved
+    CPPUNIT_ASSERT(pStyle);
+    CPPUNIT_ASSERT(pStyle->GetBoxFormat(0).GetBackground() == aBackground);
+    rUndoManager.Undo();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(pDoc->GetTableStyles().size()), nStyleCount);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest);
 CPPUNIT_PLUGIN_IMPLEMENT();
 
diff --git a/sw/source/core/doc/tblafmt.cxx b/sw/source/core/doc/tblafmt.cxx
index f31fe77..3d46102 100644
--- a/sw/source/core/doc/tblafmt.cxx
+++ b/sw/source/core/doc/tblafmt.cxx
@@ -1194,6 +1194,22 @@ std::unique_ptr<SwTableAutoFormat> SwTableAutoFormatTable::ReleaseAutoFormat(siz
     return pRet;
 }
 
+std::unique_ptr<SwTableAutoFormat> SwTableAutoFormatTable::ReleaseAutoFormat(const OUString& rName)
+{
+    std::unique_ptr<SwTableAutoFormat> pRet(nullptr);
+    for (auto iter = m_pImpl->m_AutoFormats.begin();
+         iter != m_pImpl->m_AutoFormats.end(); ++iter)
+    {
+        if ((*iter)->GetName() == rName)
+        {
+            pRet = std::move(*iter);
+            m_pImpl->m_AutoFormats.erase(iter);
+            break;
+        }
+    }
+    return pRet;
+}
+
 SwTableAutoFormat* SwTableAutoFormatTable::FindAutoFormat(const OUString& rName) const
 {
     for (auto &rFormat : m_pImpl->m_AutoFormats)
diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx
index 074f160..c9c9511 100644
--- a/sw/source/core/docnode/ndtbl.cxx
+++ b/sw/source/core/docnode/ndtbl.cxx
@@ -4613,4 +4613,62 @@ bool SwDoc::HasTableAnyProtection( const SwPosition* pPos,
     return bHasProtection;
 }
 
+SwTableAutoFormat* SwDoc::MakeTableStyle(const OUString& rName, bool bBroadcast)
+{
+    SwTableAutoFormat aTableFormat(rName);
+    GetTableStyles().AddAutoFormat(aTableFormat);
+    SwTableAutoFormat* pTableFormat = GetTableStyles().FindAutoFormat(rName);
+
+    getIDocumentState().SetModified();
+
+    if (GetIDocumentUndoRedo().DoesUndo())
+    {
+        SwUndo * pUndo = new SwUndoTableStyleMake(rName, this);
+
+        GetIDocumentUndoRedo().AppendUndo(pUndo);
+    }
+
+    if (bBroadcast)
+        BroadcastStyleOperation(rName, SfxStyleFamily::Table, SfxStyleSheetHintId::CREATED);
+
+    return pTableFormat;
+}
+
+std::unique_ptr<SwTableAutoFormat> SwDoc::DelTableStyle(const OUString& rName, bool bBroadcast, std::vector<SwTable*>* pAffectedTables)
+{
+    if (bBroadcast)
+        BroadcastStyleOperation(rName, SfxStyleFamily::Table, SfxStyleSheetHintId::ERASED);
+
+    std::unique_ptr<SwTableAutoFormat> pReleasedFormat = GetTableStyles().ReleaseAutoFormat(rName);
+
+    std::vector<SwTable*> vAffectedTables;
+    if (pReleasedFormat.get())
+    {
+        size_t nTableCount = GetTableFrameFormatCount(true);
+        for (size_t i=0; i < nTableCount; ++i)
+        {
+            SwFrameFormat* pFrameFormat = &GetTableFrameFormat(i, true);
+            SwTable* pTable = SwTable::FindTable(pFrameFormat);
+            if (pTable->GetTableStyleName() == pReleasedFormat->GetName())
+            {
+                pTable->SetTableStyleName("");
+                vAffectedTables.push_back(pTable);
+            }
+        }
+
+        getIDocumentState().SetModified();
+
+        if (GetIDocumentUndoRedo().DoesUndo())
+        {
+            SwUndo * pUndo = new SwUndoTableStyleDelete(std::move(pReleasedFormat), vAffectedTables, this);
+
+            GetIDocumentUndoRedo().AppendUndo(pUndo);
+        }
+    }
+
+    if (pAffectedTables)
+        *pAffectedTables = vAffectedTables;
+    return pReleasedFormat;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoTable.hxx b/sw/source/core/inc/UndoTable.hxx
index 670c8c9..d7bacd3 100644
--- a/sw/source/core/inc/UndoTable.hxx
+++ b/sw/source/core/inc/UndoTable.hxx
@@ -378,6 +378,36 @@ public:
 
 void InsertSort( std::vector<sal_uInt16>& rArr, sal_uInt16 nIdx );
 
+class SwUndoTableStyleMake : public SwUndo
+{
+    OUString m_sName;
+    std::unique_ptr<SwTableAutoFormat> m_pAutoFormat;
+public:
+    SwUndoTableStyleMake(const OUString& rName, const SwDoc* pDoc);
+
+    virtual ~SwUndoTableStyleMake();
+
+    virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+    virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+    virtual SwRewriter GetRewriter() const override;
+};
+
+class SwUndoTableStyleDelete : public SwUndo
+{
+    std::unique_ptr<SwTableAutoFormat> m_pAutoFormat;
+    std::vector<SwTable*> m_rAffectedTables;
+public:
+    SwUndoTableStyleDelete(std::unique_ptr<SwTableAutoFormat> pAutoFormat, const std::vector<SwTable*>& rAffectedTables, const SwDoc* pDoc);
+
+    virtual ~SwUndoTableStyleDelete();
+
+    virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+    virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+    virtual SwRewriter GetRewriter() const override;
+};
+
 #endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOTABLE_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/undo/undo.hrc b/sw/source/core/undo/undo.hrc
index 4d9ac05..7ed5cdf 100644
--- a/sw/source/core/undo/undo.hrc
+++ b/sw/source/core/undo/undo.hrc
@@ -138,9 +138,11 @@
 #define STR_NUMDOWN                         (CORE_REPEAT_END      +66)
 #define STR_UNDO_FLYFRMFMT_TITLE                (CORE_REPEAT_END      +67)
 #define STR_UNDO_FLYFRMFMT_DESCRITPTION         (CORE_REPEAT_END      +68)
+#define STR_UNDO_TBLSTYLE_CREATE                (CORE_REPEAT_END      +69)
+#define STR_UNDO_TBLSTYLE_DELETE                (CORE_REPEAT_END      +70)
 
 // !!!!!! umsetzen !!!!!!!!!!! umsetzen !!!!!!!!!!! umsetzen !!!!
-#define CORE_UNDO_END           STR_UNDO_FLYFRMFMT_DESCRITPTION// !!!! umsetzen !!!
+#define CORE_UNDO_END           STR_UNDO_TBLSTYLE_DELETE// !!!! umsetzen !!!
 
 // UI-Undo Klammerungen
 #define UI_UNDO_BEGIN                   (CORE_UNDO_END + 1)
diff --git a/sw/source/core/undo/undo.src b/sw/source/core/undo/undo.src
index 90b2038..b293b4e 100644
--- a/sw/source/core/undo/undo.src
+++ b/sw/source/core/undo/undo.src
@@ -650,6 +650,14 @@ String STR_UNDO_FLYFRMFMT_DESCRITPTION
 {
     Text[ en-US ] = "Change object description of $1";
 };
+String STR_UNDO_TBLSTYLE_CREATE
+{
+    Text[ en-US ] = "Create table style: $1";
+};
+String STR_UNDO_TBLSTYLE_DELETE
+{
+    Text[ en-US ] = "Delete table style: $1";
+};
 String STR_UNDO_TABLE_DELETE
 {
     Text [ en-US ] = "Delete table" ;
diff --git a/sw/source/core/undo/untbl.cxx b/sw/source/core/undo/untbl.cxx
index ffabd81..be0801b 100644
--- a/sw/source/core/undo/untbl.cxx
+++ b/sw/source/core/undo/untbl.cxx
@@ -3170,4 +3170,67 @@ void CheckTable( const SwTable& rTable )
 }
 #endif
 
+SwUndoTableStyleMake::SwUndoTableStyleMake(const OUString& rName, const SwDoc* pDoc)
+    : SwUndo(UNDO_TBLSTYLE_CREATE, pDoc),
+    m_sName(rName)
+{ }
+
+SwUndoTableStyleMake::~SwUndoTableStyleMake()
+{ }
+
+void SwUndoTableStyleMake::UndoImpl(::sw::UndoRedoContext & rContext)
+{
+    m_pAutoFormat = rContext.GetDoc().DelTableStyle(m_sName, true);
+}
+
+void SwUndoTableStyleMake::RedoImpl(::sw::UndoRedoContext & rContext)
+{
+    if (m_pAutoFormat.get())
+    {
+        SwTableAutoFormat* pFormat = rContext.GetDoc().MakeTableStyle(m_sName, true);
+        if (pFormat)
+        {
+            *pFormat = *m_pAutoFormat;
+            m_pAutoFormat.reset(nullptr);
+        }
+    }
+}
+
+SwRewriter SwUndoTableStyleMake::GetRewriter() const
+{
+    SwRewriter aResult;
+    aResult.AddRule(UndoArg1, m_sName);
+    return aResult;
+}
+
+SwUndoTableStyleDelete::SwUndoTableStyleDelete(std::unique_ptr<SwTableAutoFormat> pAutoFormat, const std::vector<SwTable*>& rAffectedTables, const SwDoc* pDoc)
+    : SwUndo(UNDO_TBLSTYLE_DELETE, pDoc),
+    m_pAutoFormat(std::move(pAutoFormat)),
+    m_rAffectedTables(rAffectedTables)
+{ }
+
+SwUndoTableStyleDelete::~SwUndoTableStyleDelete()
+{ }
+
+void SwUndoTableStyleDelete::UndoImpl(::sw::UndoRedoContext & rContext)
+{
+    SwTableAutoFormat* pNewFormat = rContext.GetDoc().MakeTableStyle(m_pAutoFormat->GetName(), true);
+    *pNewFormat = *m_pAutoFormat;
+    for (size_t i=0; i < m_rAffectedTables.size(); i++)
+        m_rAffectedTables[i]->SetTableStyleName(m_pAutoFormat->GetName());
+}
+
+void SwUndoTableStyleDelete::RedoImpl(::sw::UndoRedoContext & rContext)
+{
+    // Don't need to remember deleted table style nor affected tables, because they must be the same as these already known.
+    rContext.GetDoc().DelTableStyle(m_pAutoFormat->GetName());
+}
+
+SwRewriter SwUndoTableStyleDelete::GetRewriter() const
+{
+    SwRewriter aResult;
+    aResult.AddRule(UndoArg1, m_pAutoFormat->GetName());
+    return aResult;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/app/docst.cxx b/sw/source/uibase/app/docst.cxx
index 4a1e742..2842808 100644
--- a/sw/source/uibase/app/docst.cxx
+++ b/sw/source/uibase/app/docst.cxx
@@ -84,6 +84,7 @@
 #include "swabstdlg.hxx"
 #include <list.hxx>
 #include <paratr.hxx>
+#include <tblafmt.hxx>
 
 extern bool g_bNoInterrupt;       // in swmodule.cxx
 
@@ -121,6 +122,7 @@ void  SwDocShell::StateStyleSheet(SfxItemSet& rSet, SwWrtShell* pSh)
     {
         // determine current template to every family
         OUString aName;
+        SwTableAutoFormat aTableAutoFormat("dummy"); // needed to check if can take a table auto format at current cursor position
         switch (nWhich)
         {
             case SID_STYLE_APPLY:
@@ -249,7 +251,8 @@ void  SwDocShell::StateStyleSheet(SfxItemSet& rSet, SwWrtShell* pSh)
                         ? SfxStyleFamily::Frame != nActualFamily
                         : ( SfxStyleFamily::Frame == nActualFamily ||
                             SfxStyleFamily::Page == nActualFamily ||
-                            (SfxStyleFamily::Pseudo == nActualFamily && !pShell->GetNumRuleAtCurrCursorPos())) )
+                            (SfxStyleFamily::Pseudo == nActualFamily && !pShell->GetNumRuleAtCurrCursorPos()) ||
+                            (SfxStyleFamily::Table == nActualFamily && !pShell->GetTableAutoFormat(aTableAutoFormat))) )
                 {
                     rSet.DisableItem( nWhich );
                 }
@@ -259,7 +262,8 @@ void  SwDocShell::StateStyleSheet(SfxItemSet& rSet, SwWrtShell* pSh)
                 if( (pShell->IsFrameSelected()
                         ? SfxStyleFamily::Frame != nActualFamily
                         : SfxStyleFamily::Frame == nActualFamily) ||
-                    (SfxStyleFamily::Pseudo == nActualFamily && !pShell->GetNumRuleAtCurrCursorPos()) )
+                    (SfxStyleFamily::Pseudo == nActualFamily && !pShell->GetNumRuleAtCurrCursorPos()) ||
+                    (SfxStyleFamily::Table == nActualFamily && !pShell->GetTableAutoFormat(aTableAutoFormat)) )
                 {
                     rSet.DisableItem( nWhich );
                 }
@@ -1268,6 +1272,21 @@ SfxStyleFamily SwDocShell::MakeByExample( const OUString &rName, SfxStyleFamily
             }
         }
         break;
+
+        case SfxStyleFamily::Table:
+        {
+            SwTableAutoFormat* pFormat = pStyle->GetTableFormat();
+            if (pCurrWrtShell->GetTableAutoFormat(*pFormat))
+            {
+                pCurrWrtShell->StartAllAction();
+
+                pCurrWrtShell->SetTableStyle(rName);
+
+                pCurrWrtShell->EndAllAction();
+            }
+        }
+        break;
+
         default: break;
     }
     return nFamily;
diff --git a/sw/source/uibase/app/docstyle.cxx b/sw/source/uibase/app/docstyle.cxx
index 22deb32..e2a8e3b 100644
--- a/sw/source/uibase/app/docstyle.cxx
+++ b/sw/source/uibase/app/docstyle.cxx
@@ -301,12 +301,19 @@ static const SwNumRule* lcl_FindNumRule(   SwDoc&  rDoc,
     return pRule;
 }
 
-static const SwTableAutoFormat* lcl_FindTableStyle(SwDoc& rDoc, const OUString& rName, SwDocStyleSheet *pStyle = nullptr)
+static SwTableAutoFormat* lcl_FindTableStyle(SwDoc& rDoc, const OUString& rName, SwDocStyleSheet *pStyle = nullptr, bool bCreate = true)
 {
-    const SwTableAutoFormat* pFormat = nullptr;
+    SwTableAutoFormat* pFormat = nullptr;
 
     if (!rName.isEmpty())
+    {
         pFormat = rDoc.GetTableStyles().FindAutoFormat(rName);
+        if (!pFormat && bCreate)
+        {
+            SwTableAutoFormat aNew(rName);
+            rDoc.GetTableStyles().AddAutoFormat(aNew);
+        }
+    }
 
     if(pStyle)
     {
@@ -2004,7 +2011,7 @@ bool SwDocStyleSheet::FillStyleSheet(
         break;
 
     case SfxStyleFamily::Table:
-        pTableFormat = lcl_FindTableStyle(rDoc, aName, this);
+        pTableFormat = lcl_FindTableStyle(rDoc, aName, this, bCreate);
         SetMask((pTableFormat && pTableFormat->IsUserDefined()) ? SFXSTYLEBIT_USERDEF : 0);
         bRet = bPhysical = (nullptr != pTableFormat);
         break;
@@ -2131,6 +2138,18 @@ void SwDocStyleSheet::Create()
                 pNumRule = pRule;
             }
             break;
+
+        case SfxStyleFamily::Table:
+            if (aName.isEmpty())
+                return;
+            pTableFormat = lcl_FindTableStyle(rDoc, aName);
+            if (!pTableFormat)
+            {
+                rDoc.MakeTableStyle(aName);
+                pTableFormat = rDoc.GetTableStyles().FindAutoFormat(aName);
+                SAL_WARN_IF(!pTableFormat, "sw.ui", "Recently added auto format not found");
+            }
+            break;
         default:; //prevent warning
     }
     bPhysical = true;
@@ -2165,12 +2184,21 @@ const SwNumRule * SwDocStyleSheet::GetNumRule()
     return pNumRule;
 }
 
+
 void SwDocStyleSheet::SetNumRule(const SwNumRule& rRule)
 {
     OSL_ENSURE(pNumRule, "Wo ist die NumRule");
     rDoc.ChgNumRuleFormats( rRule );
 }
 
+SwTableAutoFormat* SwDocStyleSheet::GetTableFormat()
+{
+    if(!bPhysical)
+        FillStyleSheet( FillPhysical );
+    assert(pTableFormat && "SwDocStyleSheet table style, SwTableAutoFormat not found");
+    return pTableFormat;
+}
+
 // re-generate Name AND Family from String
 // First() and Next() (see below) insert an identification letter at Pos.1
 
@@ -2470,20 +2498,7 @@ void SwDocStyleSheetPool::Remove( SfxStyleSheetBase* pStyle)
 
     case SfxStyleFamily::Table:
         {
-            const SwTableAutoFormat* pFormat = lcl_FindTableStyle(rDoc, sName);
-            if (pFormat)
-            {
-                size_t nTableCount = rDoc.GetTableFrameFormatCount(true);
-                for (size_t i=0; i < nTableCount; ++i)
-                {
-                    SwFrameFormat* pFrameFormat = &rDoc.GetTableFrameFormat(i, true);
-                    SwTable* pTable = SwTable::FindTable(pFrameFormat);
-                    if (pTable->GetTableStyleName() == pFormat->GetName())
-                        pTable->SetTableStyleName("");
-                }
-
-                rDoc.GetTableStyles().EraseAutoFormat(pFormat->GetName());
-            }
+            rDoc.DelTableStyle(sName);
         }
         break;
 


More information about the Libreoffice-commits mailing list