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