diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatPanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatPanel.java
index 0b63e712e..326d2a4a3 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatPanel.java
@@ -1844,6 +1844,15 @@ public void removeChatContact(ChatContact> chatContact)
chatContactListPanel.removeContact(chatContact);
}
+ /**
+ * Removes all chat contacts from the contact list of the chat.
+ */
+ public void removeAllChatContacts()
+ {
+ if (chatContactListPanel != null)
+ chatContactListPanel.removeAllChatContacts();
+ }
+
/**
* Updates the contact status.
* @param chatContact the chat contact to update
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatSessionRenderer.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatSessionRenderer.java
index 0490caf4b..ea3e37631 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatSessionRenderer.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatSessionRenderer.java
@@ -51,6 +51,11 @@ public interface ChatSessionRenderer
*/
public void removeChatContact(ChatContact> chatContact);
+ /**
+ * Removes all chat contacts from the contact list of the chat.
+ */
+ public void removeAllChatContacts();
+
/**
* Updates the status of the given chat transport.
*
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatContactListModel.java b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatContactListModel.java
index b54f252c4..695b3f6b0 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatContactListModel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatContactListModel.java
@@ -191,4 +191,21 @@ public void removeElement(ChatContact> chatContact)
fireIntervalRemoved(this, index, index);
}
}
+
+ /**
+ * Removes all the elements from this model.
+ */
+ public void removeAllElements()
+ {
+ if (chatContacts == null || chatContacts.size() <= 0)
+ return;
+
+ synchronized(chatContacts)
+ {
+ int contactsSize = chatContacts.size();
+ chatContacts.clear();
+
+ fireIntervalRemoved(this, 0, contactsSize - 1);
+ }
+ }
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomMemberListPanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomMemberListPanel.java
index b27d776f4..25364e9d3 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomMemberListPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomMemberListPanel.java
@@ -132,6 +132,14 @@ public void removeContact(ChatContact> chatContact)
memberListModel.removeElement(chatContact);
}
+ /**
+ * Removes all chat contacts from the contact list of the chat.
+ */
+ public void removeAllChatContacts()
+ {
+ memberListModel.removeAllElements();
+ }
+
/**
* In the corresponding ChatContactPanel changes the name of the
* given Contact.
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomProviderWrapper.java b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomProviderWrapper.java
index 33f77a951..1d9c0c775 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomProviderWrapper.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomProviderWrapper.java
@@ -152,11 +152,12 @@ public boolean containsChatRoom(ChatRoomWrapper chatRoom)
*/
public ChatRoomWrapper findChatRoomWrapperForChatRoom(ChatRoom chatRoom)
{
- // compare ids, cause saved chatrooms don't have ChatRoom object
- // but Id's are the same
+ // Compare ids, cause saved chatrooms don't have ChatRoom object
+ // but Id's are the same.
for (ChatRoomWrapper chatRoomWrapper : chatRoomsOrderedCopy)
{
- if (chatRoomWrapper.getChatRoomID().equals(chatRoom.getIdentifier()))
+ if (chatRoomWrapper.getChatRoomID()
+ .equals(chatRoom.getIdentifier()))
{
return chatRoomWrapper;
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ConferenceChatSession.java b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ConferenceChatSession.java
index 45e838780..996400511 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ConferenceChatSession.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ConferenceChatSession.java
@@ -494,9 +494,23 @@ public boolean isDescriptorPersistent()
*/
public void loadChatRoom(ChatRoom chatRoom)
{
+ // Re-init the chat transport, as we have a new chat room object.
+ currentChatTransport
+ = new ConferenceChatTransport(this, chatRoomWrapper.getChatRoom());
+
+ chatTransports.clear();
+ chatTransports.add(currentChatTransport);
+
+ // Remove all existing contacts.
+ sessionRenderer.removeAllChatContacts();
+
+ // Add the new list of members.
for (ChatRoomMember member : chatRoom.getMembers())
+ {
sessionRenderer.addChatContact(new ConferenceChatContact(member));
+ }
+ // Add all listeners to the new chat room.
chatRoom.addPropertyChangeListener(this);
chatRoom.addMemberPresenceListener(this);
diff --git a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomList.java b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomList.java
index a26ded9cb..2ca4b17be 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomList.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomList.java
@@ -280,8 +280,10 @@ public ChatRoomWrapper findChatRoomWrapperFromChatRoom(ChatRoom chatRoom)
{
// stored chatrooms has no chatroom, but their
// id is the same as the chatroom we are searching wrapper
- // for
- if(chatRoomWrapper.getChatRoom() == null)
+ // for. Also during reconnect we don't have the same chat
+ // id for another chat room object.
+ if(chatRoomWrapper.getChatRoom() == null
+ || !chatRoomWrapper.getChatRoom().equals(chatRoom))
{
chatRoomWrapper.setChatRoom(chatRoom);
}