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); }