summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatúš Kukan <matus.kukan@gmail.com>2012-08-03 14:02:01 +0200
committerMatúš Kukan <matus.kukan@gmail.com>2012-08-04 01:57:11 +0200
commit4e648b8e7c65fd8c382baf6b6798cdedfac5cdd8 (patch)
tree54117d9e82a40d480cbbee7feb7d28a1d3f63fd8
parentf2c7d7aea4ec8c1f9f38e1d00c14dadca67b863e (diff)
tubes: create contacts dialog instance for each document separately
This solves a crash when static dialog instance was destroyed on closing of one document but then was used in another document. Change-Id: I6ac9edb1de83f638bdf4ce7c0814fcbdf4b4b1e5
-rw-r--r--sc/source/ui/collab/sccollaboration.cxx9
-rw-r--r--sc/source/ui/inc/sccollaboration.hxx5
-rw-r--r--tubes/inc/tubes/collaboration.hxx3
-rw-r--r--tubes/source/contacts.cxx16
4 files changed, 26 insertions, 7 deletions
diff --git a/sc/source/ui/collab/sccollaboration.cxx b/sc/source/ui/collab/sccollaboration.cxx
index 758db8918f4e..fbdbe0a0938d 100644
--- a/sc/source/ui/collab/sccollaboration.cxx
+++ b/sc/source/ui/collab/sccollaboration.cxx
@@ -20,7 +20,7 @@ ScCollaboration::~ScCollaboration()
{
}
-TeleConference* ScCollaboration::GetConference() const
+TeleConference* ScCollaboration::GetConference()
{
ScDocFuncSend* pSender = GetScDocFuncSend();
if (pSender)
@@ -29,6 +29,11 @@ TeleConference* ScCollaboration::GetConference() const
return NULL;
}
+sal_uInt64 ScCollaboration::GetId()
+{
+ return reinterpret_cast<sal_uInt64> (SfxObjectShell::Current());
+}
+
void ScCollaboration::SetCollaboration( TeleConference* pConference )
{
ScDocShell* pScDocShell = dynamic_cast<ScDocShell*> (SfxObjectShell::Current());
@@ -52,7 +57,7 @@ void ScCollaboration::SendFile( TpContact* pContact, const OUString& rURL )
pSender->SendFile( pContact, rURL );
}
-ScDocFuncSend* ScCollaboration::GetScDocFuncSend() const
+ScDocFuncSend* ScCollaboration::GetScDocFuncSend()
{
ScDocShell *pScDocShell = dynamic_cast<ScDocShell*> (SfxObjectShell::Current());
ScDocFunc *pDocFunc = pScDocShell ? &pScDocShell->GetDocFunc() : NULL;
diff --git a/sc/source/ui/inc/sccollaboration.hxx b/sc/source/ui/inc/sccollaboration.hxx
index 545db920686e..41b2c5866a57 100644
--- a/sc/source/ui/inc/sccollaboration.hxx
+++ b/sc/source/ui/inc/sccollaboration.hxx
@@ -19,11 +19,12 @@ public:
ScCollaboration();
virtual ~ScCollaboration();
- virtual TeleConference* GetConference() const;
+ virtual TeleConference* GetConference();
+ virtual sal_uInt64 GetId();
virtual void SetCollaboration( TeleConference* pConference );
virtual void SendFile( TpContact* pContact, const OUString& rURL );
private:
- ScDocFuncSend* GetScDocFuncSend() const;
+ ScDocFuncSend* GetScDocFuncSend();
};
#endif // INCLUDED_SC_COLLABORATION_HXX
diff --git a/tubes/inc/tubes/collaboration.hxx b/tubes/inc/tubes/collaboration.hxx
index 5a3dddc89987..31eff7a4b937 100644
--- a/tubes/inc/tubes/collaboration.hxx
+++ b/tubes/inc/tubes/collaboration.hxx
@@ -23,7 +23,8 @@ public:
Collaboration() {}
virtual ~Collaboration() {}
- virtual TeleConference* GetConference() const = 0;
+ virtual TeleConference* GetConference() = 0;
+ virtual sal_uInt64 GetId() = 0;
virtual void SetCollaboration( TeleConference* pConference ) = 0;
// TODO: I think this could be moved to TeleManager later.
virtual void SendFile( TpContact* pContact, const OUString& rURL ) = 0;
diff --git a/tubes/source/contacts.cxx b/tubes/source/contacts.cxx
index 540e8a6f4725..9245b55284b4 100644
--- a/tubes/source/contacts.cxx
+++ b/tubes/source/contacts.cxx
@@ -42,10 +42,13 @@
#include <vcl/dialog.hxx>
#include <vcl/unohelp.hxx>
+#include <map>
#include <vector>
#include <boost/ptr_container/ptr_vector.hpp>
#include <telepathy-glib/telepathy-glib.h>
+namespace {
+
ResId TubesResId( sal_uInt32 nId )
{
static ResMgr* pResMgr = NULL;
@@ -56,7 +59,6 @@ ResId TubesResId( sal_uInt32 nId )
return ResId( nId, *pResMgr );
}
-namespace {
class TubeContacts : public ModelessDialog
{
FixedLine maLabel;
@@ -261,12 +263,22 @@ IMPL_LINK_NOARG( TubeContacts, BtnListenHdl )
return 0;
}
+TubeContacts* ContactsFactory( Collaboration* pCollaboration )
+{
+ // Mapping contacts dialog instance for each document
+ static std::map< sal_uInt64, TubeContacts* > aDialogsMap;
+ sal_uInt64 Id = pCollaboration->GetId();
+ if (aDialogsMap.find( Id ) == aDialogsMap.end())
+ aDialogsMap[ Id ] = new TubeContacts( pCollaboration );
+ return aDialogsMap[ Id ];
+}
+
} // anonymous namespace
namespace tubes {
void createContacts( Collaboration* pCollaboration )
{
- static TubeContacts *pContacts = new TubeContacts( pCollaboration );
+ TubeContacts* pContacts = ContactsFactory( pCollaboration );
pContacts->Populate();
}
}