diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java index e4a2f543d..783bf0e7d 100755 --- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java @@ -180,7 +180,16 @@ public void run() // something (changed the caret) or when a new tab has been // added or the window has been resized. verticalScrollBar.setValue(verticalScrollBar.getMaximum()); - chatTextPane.setCaretPosition(document.getLength()); + Document doc = chatTextPane.getDocument(); + if(doc != null) + { + int pos = document.getLength(); + if (pos >= 0 && + pos <= chatTextPane.getDocument().getLength()) + { + chatTextPane.setCaretPosition(pos); + } + } } } }; @@ -825,8 +834,9 @@ private void finishMessageAdd(String message, String contentType) * video/image sources with their previews or any other substitution. Spawns * a separate thread for replacement. * - * @param elem the element in the HTML Document. + * @param messageID the messageID element. * @param chatString the message. + * @param contentType */ private void processReplacement(final String messageID, final String chatString, @@ -1882,10 +1892,9 @@ private Element findElement(HTML.Attribute attribute, } /** - * - * @param attribute - * @param matchStrings - * @return + * Finds the first element with name. + * @param name the name to search for. + * @return the first element with name. */ private Element findFirstElement(String name) { @@ -1926,11 +1935,11 @@ private Element findFirstElement( Element element, } /** - * - * @param element - * @param attrName - * @param matchStrings - * @return + * Finds the first element with name among the child elements of + * element. + * @param element the element to searh for. + * @param name the name to search for. + * @return the first element with name. */ private Element findFirstElement( Element element, String name) diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomConfigurationWindow.java b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomConfigurationWindow.java index 608682c1d..e0ddd4684 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomConfigurationWindow.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomConfigurationWindow.java @@ -176,7 +176,7 @@ private void loadConfigurationForm() Iterator values = formField.getValues(); Iterator options = formField.getOptions(); - JComponent field = null; + JComponent field; JLabel label = new JLabel("", JLabel.RIGHT); if(formField.getLabel() != null) @@ -192,7 +192,7 @@ private void loadConfigurationForm() if(values.hasNext()) { ((JCheckBox)field) - .setSelected(((Boolean)values.next()).booleanValue()); + .setSelected((Boolean)values.next()); } } else if(fieldType.equals( @@ -205,8 +205,8 @@ else if(fieldType.equals( String value = values.next().toString(); ((JLabel) field).setText(value); - ((JLabel) field).setFont(new Font(null, Font.ITALIC, 9)); - ((JLabel) field).setForeground(Color.GRAY); + field.setFont(new Font(null, Font.ITALIC, 9)); + field.setForeground(Color.GRAY); } } else if(fieldType.equals( @@ -408,7 +408,7 @@ else if (c instanceof AbstractButton) { boolean isSelected = ((AbstractButton)c).isSelected(); - formField.addValue(Boolean.valueOf(isSelected)); + formField.addValue(isSelected); } else if (c instanceof JComboBox) { @@ -420,12 +420,12 @@ else if (c instanceof JPanel) { Component[] components = c.getComponents(); - for(int i = 0; i < components.length; i++) + for(Component comp : components) { - if(!(components[i] instanceof JCheckBox)) + if(!(comp instanceof JCheckBox)) continue; - JCheckBox checkBox = (JCheckBox) components[i]; + JCheckBox checkBox = (JCheckBox) comp; formField.addValue(checkBox.getText()); } 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 65c21f54b..09b8263a2 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 @@ -11,6 +11,7 @@ import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.chat.conference.*; import net.java.sip.communicator.service.protocol.*; +import net.java.sip.communicator.service.protocol.event.*; import net.java.sip.communicator.util.*; import org.jitsi.service.configuration.*; @@ -22,6 +23,7 @@ * @author Yana Stamcheva */ public class ChatRoomList + implements RegistrationStateChangeListener { /** * The logger. @@ -79,12 +81,13 @@ public void loadList() } /** - * Adds a chat server and all its existing chat rooms. + * Adds a chat server which is registered and all its existing chat rooms. * * @param pps the ProtocolProviderService corresponding to the chat * server */ - public void addChatProvider(ProtocolProviderService pps) + private ChatRoomProviderWrapper + addRegisteredChatProvider(ProtocolProviderService pps) { ChatRoomProviderWrapper chatRoomProvider = new ChatRoomProviderWrapper(pps); @@ -129,6 +132,22 @@ public void addChatProvider(ProtocolProviderService pps) } fireProviderWrapperAdded(chatRoomProvider); + + return chatRoomProvider; + } + + /** + * Adds a listener to wait for provider to be registered or unregistered. + * + * @param pps the ProtocolProviderService corresponding to the chat + * server + */ + public void addChatProvider(ProtocolProviderService pps) + { + if(pps.isRegistered()) + addRegisteredChatProvider(pps); + else + pps.addRegistrationStateChangeListener(this); } /** @@ -143,7 +162,7 @@ public void removeChatProvider(ProtocolProviderService pps) ChatRoomProviderWrapper wrapper = findServerWrapperFromProvider(pps); if (wrapper != null) - removeChatProvider(wrapper); + removeChatProvider(wrapper, true); } /** @@ -152,44 +171,53 @@ public void removeChatProvider(ProtocolProviderService pps) * * @param chatRoomProvider the ChatRoomProviderWrapper * corresponding to the server to remove + * @param permanently whether to remove any listener + * and stored configuration */ - private void removeChatProvider(ChatRoomProviderWrapper chatRoomProvider) + private void removeChatProvider(ChatRoomProviderWrapper chatRoomProvider, + boolean permanently) { providersList.remove(chatRoomProvider); - ConfigurationService configService - = GuiActivator.getConfigurationService(); - String prefix = "net.java.sip.communicator.impl.gui.accounts"; - AccountID accountID = - chatRoomProvider.getProtocolProvider().getAccountID(); - - // if provider is just disabled don't remove its stored rooms - if(!GuiActivator.getAccountManager().getStoredAccounts() - .contains(accountID)) + if(permanently) { - String providerAccountUID = accountID.getAccountUniqueID(); - - for (String accountRootPropName - : configService.getPropertyNamesByPrefix(prefix, true)) + chatRoomProvider.getProtocolProvider() + .removeRegistrationStateChangeListener(this); + + ConfigurationService configService + = GuiActivator.getConfigurationService(); + String prefix = "net.java.sip.communicator.impl.gui.accounts"; + AccountID accountID = + chatRoomProvider.getProtocolProvider().getAccountID(); + + // if provider is just disabled don't remove its stored rooms + if(!GuiActivator.getAccountManager().getStoredAccounts() + .contains(accountID)) { - String accountUID - = configService.getString(accountRootPropName); + String providerAccountUID = accountID.getAccountUniqueID(); - if(accountUID.equals(providerAccountUID)) + for (String accountRootPropName + : configService.getPropertyNamesByPrefix(prefix, true)) { - List chatRooms - = configService.getPropertyNamesByPrefix( - accountRootPropName + ".chatRooms", - true); + String accountUID + = configService.getString(accountRootPropName); - for (String chatRoomPropName : chatRooms) + if(accountUID.equals(providerAccountUID)) { - configService.setProperty( - chatRoomPropName + ".chatRoomName", - null); + List chatRooms + = configService.getPropertyNamesByPrefix( + accountRootPropName + ".chatRooms", + true); + + for (String chatRoomPropName : chatRooms) + { + configService.setProperty( + chatRoomPropName + ".chatRoomName", + null); + } + + configService.setProperty(accountRootPropName, null); } - - configService.setProperty(accountRootPropName, null); } } } @@ -336,6 +364,11 @@ public void synchronizeOpSetWithLocalContactList( ChatRoomProviderWrapper chatRoomProvider = findServerWrapperFromProvider(protocolProvider); + if(chatRoomProvider == null) + { + chatRoomProvider = addRegisteredChatProvider(protocolProvider); + } + if (chatRoomProvider != null) { chatRoomProvider.synchronizeProvider(); @@ -404,6 +437,36 @@ private void fireProviderWrapperRemoved(ChatRoomProviderWrapper provider) } } + /** + * Listens for changes of providers registration state, so we can use only + * registered providers. + * @param evt a RegistrationStateChangeEvent which describes the + * event that occurred. + */ + @Override + public void registrationStateChanged(RegistrationStateChangeEvent evt) + { + ProtocolProviderService pps = evt.getProvider(); + + if (evt.getNewState() == RegistrationState.REGISTERED) + { + // will use synchronizeOpSetWithLocalContactList + // to avoid any concurrency + } + else if(evt.getNewState() == RegistrationState.UNREGISTERED + || evt.getNewState() == RegistrationState.AUTHENTICATION_FAILED + || evt.getNewState() == RegistrationState.CONNECTION_FAILED) + { + ChatRoomProviderWrapper wrapper = + findServerWrapperFromProvider(pps); + + if (wrapper != null) + { + removeChatProvider(wrapper, false); + } + } + } + /** * Listener which registers for provider add/remove changes. */ diff --git a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableDialog.java b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableDialog.java index dce0fde6a..2157b7d66 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableDialog.java +++ b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableDialog.java @@ -347,7 +347,7 @@ public void actionPerformed(ActionEvent e) getSelectedProvider().getProtocolProvider(), new ArrayList(), "", false, true); - String nickName = null; + String nickName; ChatOperationReasonDialog reasonDialog = new ChatOperationReasonDialog(GuiActivator.getResources() @@ -554,7 +554,7 @@ public void run() roomsCombo.removeAllItems(); - // if there is no room list comming from provider + // if there is no room list coming from provider if(rooms == null) { roomsCombo.setEnabled(true); diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/ChatRoomJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/ChatRoomJabberImpl.java index 94eb2eb71..61d039495 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/ChatRoomJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/ChatRoomJabberImpl.java @@ -739,6 +739,9 @@ public void leave() this.provider.getConnection().removePacketListener( invitationRejectionListeners); + + opSetMuc.fireLocalUserPresenceEvent(this, + LocalUserChatRoomPresenceChangeEvent.LOCAL_USER_LEFT, null); } /** diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopSharingServerJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopSharingServerJabberImpl.java index 95de7e6e9..ee49a5282 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopSharingServerJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopSharingServerJabberImpl.java @@ -371,6 +371,9 @@ public static void registrationStateChanged( PacketFilter packetFilter, Connection connection) { + if(connection == null) + return; + if ((evt.getNewState() == RegistrationState.REGISTERING)) { /* listen to specific inputevt IQ */ diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetMultiUserChatJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetMultiUserChatJabberImpl.java index a5b877ee4..4d9b292f7 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetMultiUserChatJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetMultiUserChatJabberImpl.java @@ -683,6 +683,15 @@ else if (evt.getNewState() == RegistrationState.UNREGISTERED // clear cached chatrooms as there are no longer valid chatRoomCache.clear(); } + else if (evt.getNewState() == RegistrationState.UNREGISTERING) + { + // lets check for joined rooms and leave them + List joinedRooms = getCurrentlyJoinedChatRooms(); + for(ChatRoom room : joinedRooms) + { + room.leave(); + } + } } } diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java index 6898c4a75..51672dd8e 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java @@ -1419,6 +1419,15 @@ public void unregister(boolean fireEvent) { synchronized(initializationLock) { + if(fireEvent) + { + fireRegistrationStateChanged( + getRegistrationState() + , RegistrationState.UNREGISTERING + , RegistrationStateChangeEvent.REASON_NOT_SPECIFIED + , null); + } + disconnectAndCleanConnection(); RegistrationState currRegState = getRegistrationState();