[Libreoffice-commits] .: cui/source

Michael Meeks michael at kemper.freedesktop.org
Tue Oct 11 09:23:24 PDT 2011


 cui/source/inc/cuitabarea.hxx   |   13 +++-
 cui/source/inc/treeopt.hxx      |   18 ++----
 cui/source/options/treeopt.cxx  |   44 +--------------
 cui/source/tabpages/tabarea.cxx |    1 
 cui/source/tabpages/tpcolor.cxx |  114 +++++++++++++++++++++++++++++++++++++++-
 5 files changed, 135 insertions(+), 55 deletions(-)

New commits:
commit 8025a41b80d0de2c5fddc3d2d74d2ad34181afe5
Author: Michael Meeks <michael.meeks at suse.com>
Date:   Tue Oct 11 14:05:42 2011 +0100

    fix XColorList related crasher in tools->options, and try to clean more

diff --git a/cui/source/inc/cuitabarea.hxx b/cui/source/inc/cuitabarea.hxx
index 64801ca..1f76ce0 100644
--- a/cui/source/inc/cuitabarea.hxx
+++ b/cui/source/inc/cuitabarea.hxx
@@ -672,12 +672,14 @@ public:
 
 /************************************************************************/
 
+struct SvxColorTabPageShadow;
 class SvxColorTabPage : public SfxTabPage, public SvxLoadSaveEmbed
 {
     using TabPage::ActivatePage;
     using TabPage::DeactivatePage;
 
 private:
+    SvxColorTabPageShadow *pShadow;
     FixedLine           aFlProp;
     FixedText           aFtName;
     Edit                aEdtName;
@@ -751,7 +753,8 @@ private:
 
     void UpdateModified();
 public:
-    SvxColorTabPage( Window* pParent, const SfxItemSet& rInAttrs  );
+    SvxColorTabPage( Window* pParent, const SfxItemSet& rInAttrs );
+    ~SvxColorTabPage();
 
     void    Construct();
 
@@ -762,7 +765,13 @@ public:
     virtual void ActivatePage( const SfxItemSet& rSet );
     virtual int  DeactivatePage( SfxItemSet* pSet );
 
-    void    SetColorList( XColorListRef pColTab ) { pColorList = pColTab; }
+    virtual XPropertyListRef GetPropertyList( XPropertyListType t );
+    virtual void             SetPropertyList( XPropertyListType t, const XPropertyListRef &xRef );
+
+    void    SetColorList( XColorListRef pColList );
+    XColorListRef GetColorList() { return pColorList; }
+    void    SaveToViewFrame( SfxViewFrame *pViewFrame );
+    void    SetupForViewFrame( SfxViewFrame *pViewFrame );
 
     void    SetPageType( sal_uInt16* pInType ) { pPageType = pInType; }
     void    SetDlgType( sal_uInt16* pInType ) { pDlgType = pInType; }
diff --git a/cui/source/inc/treeopt.hxx b/cui/source/inc/treeopt.hxx
index a5b7fd3..ac12fc2 100644
--- a/cui/source/inc/treeopt.hxx
+++ b/cui/source/inc/treeopt.hxx
@@ -172,6 +172,7 @@ namespace com { namespace sun { namespace star { namespace awt { class XContaine
 struct OptionsPageInfo;
 struct Module;
 class ExtensionsTabPage;
+class SvxColorTabPage;
 typedef std::vector< ExtensionsTabPage* > VectorOfPages;
 
 class OfaTreeOptionsDialog : public SfxModalDialog
@@ -201,15 +202,11 @@ private:
 
     // for the ColorTabPage
     SfxItemSet*     pColorPageItemSet;
-    XColorListRef       pColorList;
-    sal_uInt16          nChangeType;
-    sal_uInt16          nUnknownType;
-    sal_uInt16          nUnknownPos;
-    sal_Bool            bIsAreaTP;
-
-    sal_Bool            bForgetSelection;
-    sal_Bool            bExternBrowserActive;
-    sal_Bool            bImageResized;
+    SvxColorTabPage *mpColorPage;;
+
+    sal_Bool        bForgetSelection;
+    sal_Bool        bExternBrowserActive;
+    sal_Bool        bImageResized;
     bool            bInSelectHdl_Impl;
     bool            bIsFromExtensionManager;
 
@@ -272,9 +269,6 @@ public:
     void                ActivatePage( const String& rPageURL );
     void                ApplyItemSets();
 
-    sal_uInt16          GetColorChanged() const { return nChangeType; }
-    XColorListRef       GetColorList() { return pColorList; }
-
     // helper functions to call the language settings TabPage from the SpellDialog
     static void         ApplyLanguageOptions(const SfxItemSet& rSet);
 };
diff --git a/cui/source/options/treeopt.cxx b/cui/source/options/treeopt.cxx
index 76dca3b..57b8976 100644
--- a/cui/source/options/treeopt.cxx
+++ b/cui/source/options/treeopt.cxx
@@ -154,7 +154,6 @@ using namespace ::com::sun::star::util;
 #define HINT_TIMEOUT            200
 #define SELECT_FIRST_TIMEOUT    0
 #define SELECT_TIMEOUT          300
-#define COLORPAGE_UNKNOWN       ((sal_uInt16)0xFFFF)
 #define EXPAND_PROTOCOL         "vnd.sun.star.expand:"
 
 LastPageSaver* OfaTreeOptionsDialog::pLastPageSaver = NULL;
@@ -553,10 +552,7 @@ sal_Bool OfaOptionsTreeListBox::Collapse( SvLBoxEntry* pParent )
     sNotLoadedError     (       CUI_RES( ST_LOAD_ERROR ) ),\
     pCurrentPageEntry   ( NULL ),\
     pColorPageItemSet   ( NULL ),\
-    nChangeType         ( CT_NONE ),\
-    nUnknownType        ( COLORPAGE_UNKNOWN ),\
-    nUnknownPos         ( COLORPAGE_UNKNOWN ),\
-    bIsAreaTP           ( sal_False ),\
+    mpColorPage         ( NULL ),\
     bForgetSelection    ( sal_False ),\
     bImageResized       ( sal_False ),\
     bInSelectHdl_Impl   ( false ),\
@@ -1159,20 +1155,8 @@ IMPL_LINK( OfaTreeOptionsDialog, SelectHdl_Impl, Timer*, EMPTYARG )
             {
                 pPageInfo->m_pPage = ::CreateGeneralTabPage(
                     pPageInfo->m_nPageId, this, *pColorPageItemSet );
-                SvxColorTabPage& rColPage = *(SvxColorTabPage*)pPageInfo->m_pPage;
-                const OfaRefItem<XColorList> *pPtr = NULL;
-                if ( SfxViewFrame::Current() && SfxViewFrame::Current()->GetDispatcher() )
-                    pPtr = (const OfaRefItem<XColorList> *)SfxViewFrame::Current()->
-                        GetDispatcher()->Execute( SID_GET_COLORLIST, SFX_CALLMODE_SYNCHRON );
-                pColorList = pPtr ? pPtr->GetValue() : XColorList::GetStdColorList();
-
-                rColPage.SetColorList( pColorList );
-                rColPage.SetPageType( &nUnknownType );
-                rColPage.SetDlgType( &nUnknownType );
-                rColPage.SetPos( &nUnknownPos );
-                rColPage.SetAreaTP( &bIsAreaTP );
-                rColPage.SetColorChgd( (ChangeType*)&nChangeType );
-                rColPage.Construct();
+                mpColorPage = (SvxColorTabPage*)pPageInfo->m_pPage;
+                mpColorPage->SetupForViewFrame( SfxViewFrame::Current() );
             }
 
             DBG_ASSERT( pPageInfo->m_pPage, "tabpage could not created");
@@ -2605,26 +2589,8 @@ short OfaTreeOptionsDialog::Execute()
     if( RET_OK == nRet )
     {
         ApplyItemSets();
-        if( GetColorList().is() )
-        {
-            GetColorList()->Save();
-
-            // notify current viewframe that it uses the same color table
-            if ( SfxViewFrame::Current() && SfxViewFrame::Current()->GetDispatcher() )
-            {
-                const OfaRefItem<XColorList> * pPtr = (const OfaRefItem<XColorList>*)SfxViewFrame::Current()->GetDispatcher()->Execute( SID_GET_COLORLIST, SFX_CALLMODE_SYNCHRON );
-                if( pPtr )
-                {
-                    XColorListRef _pColorList = pPtr->GetValue();
-
-                    if( _pColorList.is() &&
-                        _pColorList->GetPath() == GetColorList()->GetPath() &&
-                        _pColorList->GetName() == GetColorList()->GetName() )
-                        SfxObjectShell::Current()->PutItem( SvxColorListItem( GetColorList(), SID_COLOR_TABLE ) );
-                }
-            }
-        }
-
+        if( mpColorPage )
+            mpColorPage->SaveToViewFrame( SfxViewFrame::Current() );
         utl::ConfigManager::GetConfigManager().StoreConfigItems();
     }
 
diff --git a/cui/source/tabpages/tabarea.cxx b/cui/source/tabpages/tabarea.cxx
index cda945a..497af51 100644
--- a/cui/source/tabpages/tabarea.cxx
+++ b/cui/source/tabpages/tabarea.cxx
@@ -74,7 +74,6 @@ SvxAreaTabDialog::SvxAreaTabDialog
     mnHatchingListState ( CT_NONE ),
     mnPageType( PT_AREA ),
     mnDlgType( 0 ),
-    mnPos( 0 ),
     mbAreaTP( sal_False )
 {
     FreeResource();
diff --git a/cui/source/tabpages/tpcolor.cxx b/cui/source/tabpages/tpcolor.cxx
index 9e9daa7..c63c799 100644
--- a/cui/source/tabpages/tpcolor.cxx
+++ b/cui/source/tabpages/tpcolor.cxx
@@ -31,9 +31,14 @@
 #include <unotools/pathoptions.hxx>
 #include <sfx2/app.hxx>
 #include <sfx2/module.hxx>
+#include <sfx2/objsh.hxx>
+#include <sfx2/viewsh.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/dispatch.hxx>
 #include <svtools/colrdlg.hxx>
 #include <vcl/msgbox.hxx>
 #include <sfx2/filedlghelper.hxx>
+#include <svx/ofaitem.hxx>
 #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
 
 #define _SVX_TPCOLOR_CXX
@@ -96,6 +101,13 @@ XPropertyListRef SvxLoadSaveEmbed::GetList()
             pList = pLine->GetColorList();
     }
 
+    // URGH - abstract this nicely ... for re-using SvxLoadSaveEmbed
+    if( !pList.is() ) {
+        SvxColorTabPage *pPage = dynamic_cast< SvxColorTabPage *>( this );
+        if( pPage )
+            pList = pPage->GetColorList();
+    }
+
     return XPropertyListRef( static_cast< XPropertyList * >( pList.get() ) );
 }
 
@@ -133,6 +145,8 @@ void SvxLoadSaveEmbed::UpdateTableName()
     aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
 
     XPropertyListRef pList = GetList();
+    if( !pList.is() )
+        return;
 
     INetURLObject aURL( pList->GetPath() );
     aURL.Append( pList->GetName() );
@@ -294,6 +308,26 @@ void SvxColorTabPage::Update(bool bLoaded)
     UpdateModified();
 }
 
+// FIXME: you have to hate yourself for this - all this
+// horrible and broadly unused pointer based coupling
+// needs to die. cf SetupForViewFrame
+#define COLORPAGE_UNKNOWN ((sal_uInt16)0xFFFF)
+
+struct SvxColorTabPageShadow
+{
+    sal_uInt16 nUnknownType;
+    sal_uInt16 nUnknownPos;
+    sal_Bool   bIsAreaTP;
+    sal_uInt16 nChangeType;
+    SvxColorTabPageShadow()
+        : nUnknownType( COLORPAGE_UNKNOWN )
+        , nUnknownPos( COLORPAGE_UNKNOWN )
+        , bIsAreaTP( sal_False )
+        , nChangeType( 0 )
+    {
+    }
+};
+
 // -----------------------------------------------------------------------
 
 SvxColorTabPage::SvxColorTabPage
@@ -308,6 +342,7 @@ SvxColorTabPage::SvxColorTabPage
                           CUI_RES( BTN_EMBED ), CUI_RES( FT_TABLE_NAME ),
                           XCOLOR_LIST, (XOutdevItemPool*) rInAttrs.GetPool() ),
 
+    pShadow             ( new SvxColorTabPageShadow() ),
     aFlProp             ( this, CUI_RES( FL_PROP ) ),
     aFtName             ( this, CUI_RES( FT_NAME ) ),
     aEdtName            ( this, CUI_RES( EDT_NAME ) ),
@@ -335,11 +370,16 @@ SvxColorTabPage::SvxColorTabPage
 
     rOutAttrs           ( rInAttrs ),
 
+    // All the horrific pointers we store and should not
+    pPageType           ( NULL ),
+    pDlgType            ( NULL ),
+    pPos                ( NULL ),
+    pbAreaTP            ( NULL ),
+
     aXFStyleItem        ( XFILL_SOLID ),
     aXFillColorItem     ( String(), Color( COL_BLACK ) ),
     aXFillAttr          ( (XOutdevItemPool*) rInAttrs.GetPool() ),
     rXFSet              ( aXFillAttr.GetItemSet() ),
-
     eCM                 ( CM_RGB )
 {
     FreeResource();
@@ -389,12 +429,18 @@ SvxColorTabPage::SvxColorTabPage
     aBtnDelete.SetAccessibleRelationMemberOf( &aFlProp );
 }
 
+SvxColorTabPage::~SvxColorTabPage()
+{
+    delete pShadow;
+}
+
 // -----------------------------------------------------------------------
 
 void SvxColorTabPage::Construct()
 {
     aLbColor.Fill( pColorList );
     FillValueSet_Impl( aValSetColorList );
+    UpdateTableName();
 }
 
 // -----------------------------------------------------------------------
@@ -1202,4 +1248,70 @@ void SvxColorTabPage::FillUserData()
     SetUserData( UniString::CreateFromInt32( eCM ) );
 }
 
+//------------------------------------------------------------------------
+
+void SvxColorTabPage::SetupForViewFrame( SfxViewFrame *pViewFrame )
+{
+    const OfaRefItem<XColorList> *pPtr = NULL;
+    if ( pViewFrame != NULL && pViewFrame->GetDispatcher() )
+        pPtr = (const OfaRefItem<XColorList> *)pViewFrame->
+            GetDispatcher()->Execute( SID_GET_COLORLIST,
+                                      SFX_CALLMODE_SYNCHRON );
+    pColorList = pPtr ? pPtr->GetValue() : XColorList::GetStdColorList();
+
+    SetPageType( &pShadow->nUnknownType );
+    SetDlgType( &pShadow->nUnknownType );
+    SetPos( &pShadow->nUnknownPos );
+    SetAreaTP( &pShadow->bIsAreaTP );
+    SetColorChgd( (ChangeType*)&pShadow->nChangeType );
+    Construct();
+}
+
+void SvxColorTabPage::SaveToViewFrame( SfxViewFrame *pViewFrame )
+{
+    if( !pColorList.is() )
+        return;
+
+    pColorList->Save();
+
+    if( !pViewFrame )
+        return;
+
+    // notify current viewframe that it uses the same color table
+    if ( !pViewFrame->GetDispatcher() )
+        return;
+
+    const OfaRefItem<XColorList> * pPtr;
+    pPtr = (const OfaRefItem<XColorList>*)pViewFrame->GetDispatcher()->Execute( SID_GET_COLORLIST, SFX_CALLMODE_SYNCHRON );
+    if( pPtr )
+    {
+        XColorListRef pReference = pPtr->GetValue();
+
+        if( pReference.is() &&
+            pReference->GetPath() == pColorList->GetPath() &&
+            pReference->GetName() == pColorList->GetName() )
+            SfxObjectShell::Current()->PutItem( SvxColorListItem( pColorList,
+                                                                  SID_COLOR_TABLE ) );
+    }
+}
+
+void SvxColorTabPage::SetPropertyList( XPropertyListType t, const XPropertyListRef &xRef )
+{
+    OSL_ASSERT( t == XCOLOR_LIST );
+    pColorList = XColorListRef( static_cast<XColorList *>(xRef.get() ) );
+}
+
+void SvxColorTabPage::SetColorList( XColorListRef pColList )
+{
+    SetPropertyList( XCOLOR_LIST, XPropertyListRef( ( pColList.get() ) ) );
+}
+
+XPropertyListRef SvxColorTabPage::GetPropertyList( XPropertyListType t )
+{
+    OSL_ASSERT( t == XCOLOR_LIST );
+    return XPropertyListRef( pColorList.get() );
+}
+
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+


More information about the Libreoffice-commits mailing list