diff --git a/src/net/java/sip/communicator/impl/gui/main/account/AccountList.java b/src/net/java/sip/communicator/impl/gui/main/account/AccountList.java
index f4bac522e..be1310641 100644
--- a/src/net/java/sip/communicator/impl/gui/main/account/AccountList.java
+++ b/src/net/java/sip/communicator/impl/gui/main/account/AccountList.java
@@ -30,8 +30,14 @@ public class AccountList
ServiceListener,
MouseListener
{
+ /**
+ * The account list model.
+ */
private final AccountListModel accountListModel = new AccountListModel();
+ /**
+ * The edit button.
+ */
private final JButton editButton;
/**
@@ -91,11 +97,15 @@ private void accountsInit()
presence.addProviderPresenceStatusListener(this);
}
- accountListModel.addElement(new Account(protocolProvider));
+ accountListModel.addAccount(new Account(protocolProvider));
}
}
}
+ /**
+ * Returns the selected account.
+ * @return the selected account
+ */
public Account getSelectedAccount()
{
return (Account) this.getSelectedValue();
@@ -103,6 +113,8 @@ public Account getSelectedAccount()
/**
* Refreshes the account status icon, when the status has changed.
+ * @param evt the ProviderPresenceStatusChangeEvent that notified
+ * us
*/
public void providerStatusChanged(ProviderPresenceStatusChangeEvent evt)
{
@@ -154,15 +166,14 @@ public void serviceChanged(ServiceEvent event)
// Add a presence listener in order to listen for any status
// changes.
OperationSetPresence presence
- = protocolProvider
- .getOperationSet(OperationSetPresence.class);
+ = protocolProvider.getOperationSet(OperationSetPresence.class);
if (presence != null)
{
presence.addProviderPresenceStatusListener(this);
}
- accountListModel.addElement(new Account(protocolProvider));
+ accountListModel.addAccount(new Account(protocolProvider));
}
else if (event.getType() == ServiceEvent.UNREGISTERING)
{
@@ -178,6 +189,7 @@ else if (event.getType() == ServiceEvent.UNREGISTERING)
/**
* Listens for double mouse click events in order to open the edit form.
+ * @param e the MouseEvent that notified us
*/
public void mouseClicked(MouseEvent e)
{
@@ -187,17 +199,13 @@ public void mouseClicked(MouseEvent e)
}
}
- public void mouseEntered(MouseEvent e)
- {}
+ public void mouseEntered(MouseEvent e) {}
- public void mouseExited(MouseEvent e)
- {}
+ public void mouseExited(MouseEvent e) {}
- public void mousePressed(MouseEvent e)
- {}
+ public void mousePressed(MouseEvent e) {}
- public void mouseReleased(MouseEvent e)
- {}
+ public void mouseReleased(MouseEvent e) {}
/**
* Refreshes the account status icon, when the status has changed.
@@ -241,5 +249,59 @@ public void contentChanged(Account account)
int index = this.indexOf(account);
this.fireContentsChanged(this, index, index);
}
+
+ /**
+ * Adds the given account to this model.
+ * @param account the Account to add
+ */
+ public void addAccount(Account account)
+ {
+ // If this is the first account in our menu.
+ if (getSize() == 0)
+ {
+ addElement(account);
+ return;
+ }
+
+ boolean isAccountAdded = false;
+ Enumeration accounts = (Enumeration) elements();
+ AccountID accountID = account.getProtocolProvider().getAccountID();
+
+ // If we already have other accounts.
+ while (accounts.hasMoreElements())
+ {
+ Account a = accounts.nextElement();
+ AccountID listAccountID = a.getProtocolProvider().getAccountID();
+
+ int accountIndex = indexOf(a);
+
+ int protocolCompare
+ = accountID.getProtocolDisplayName().compareTo(
+ listAccountID.getProtocolDisplayName());
+
+ // If the new account protocol name is before the name of the
+ // menu we insert the new account before the given menu.
+ if (protocolCompare < 0)
+ {
+ insertElementAt(account, accountIndex);
+ isAccountAdded = true;
+ break;
+ }
+ else if (protocolCompare == 0)
+ {
+ // If we have the same protocol name, we check the account name.
+ if (accountID.getDisplayName()
+ .compareTo(listAccountID.getDisplayName()) < 0)
+ {
+ insertElementAt(account, accountIndex);
+ isAccountAdded = true;
+ break;
+ }
+ }
+ }
+
+ if (!isAccountAdded)
+ addElement(account);
+ }
}
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/account/NewAccountDialog.java b/src/net/java/sip/communicator/impl/gui/main/account/NewAccountDialog.java
index 897a8a049..47f120f0e 100644
--- a/src/net/java/sip/communicator/impl/gui/main/account/NewAccountDialog.java
+++ b/src/net/java/sip/communicator/impl/gui/main/account/NewAccountDialog.java
@@ -75,8 +75,8 @@ public NewAccountDialog()
{
super(GuiActivator.getUIService().getMainFrame());
- this.setTitle(
- GuiActivator.getResources().getI18NString("service.gui.NEW_ACCOUNT"));
+ this.setTitle(GuiActivator.getResources()
+ .getI18NString("service.gui.NEW_ACCOUNT"));
this.getContentPane().add(mainPanel);
@@ -329,6 +329,7 @@ private void loadErrorMessage(String errorMessage)
/**
* Handles button actions.
+ * @param event the ActionEvent that notified us
*/
public void actionPerformed(ActionEvent event)
{
@@ -433,6 +434,7 @@ public static void showNewAccountDialog()
/**
* Remove the newAccountDialog, when the window is closed.
+ * @param isEscaped indicates if the dialog has been escaped
*/
protected void close(boolean isEscaped)
{
diff --git a/src/net/java/sip/communicator/impl/gui/main/presence/GlobalStatusSelectorBox.java b/src/net/java/sip/communicator/impl/gui/main/presence/GlobalStatusSelectorBox.java
index acda7a19a..45b81355d 100644
--- a/src/net/java/sip/communicator/impl/gui/main/presence/GlobalStatusSelectorBox.java
+++ b/src/net/java/sip/communicator/impl/gui/main/presence/GlobalStatusSelectorBox.java
@@ -60,13 +60,6 @@ public class GlobalStatusSelectorBox
private final Logger logger
= Logger.getLogger(GlobalStatusSelectorBox.class);
- /**
- * Mapping of ProtocolProviderService and corresponding
- * StatusSelectorMenu.
- */
- private final Map accountMenus
- = new Hashtable();
-
/**
* The main application window.
*/
@@ -105,6 +98,11 @@ public class GlobalStatusSelectorBox
*/
private int textWidth = 0;
+ /**
+ * Indicates if this is the first account added.
+ */
+ private boolean isFirstAccount = true;
+
/**
* Creates an instance of SimpleStatusSelectorBox.
*
@@ -208,8 +206,53 @@ public void addAccount(ProtocolProviderService protocolProvider)
? new PresenceStatusMenu(protocolProvider)
: new SimpleStatusMenu(protocolProvider);
- this.add(statusSelectorMenu);
- this.accountMenus.put(protocolProvider, statusSelectorMenu);
+ // If this is the first account in our menu.
+ if (isFirstAccount)
+ {
+ add(statusSelectorMenu);
+ isFirstAccount = false;
+ return;
+ }
+
+ boolean isMenuAdded = false;
+ AccountID accountId = protocolProvider.getAccountID();
+ // If we already have other accounts.
+ for (Component c : getPopupMenu().getComponents())
+ {
+ if (!(c instanceof StatusSelectorMenu))
+ continue;
+
+ StatusSelectorMenu menu = (StatusSelectorMenu) c;
+ int menuIndex = getPopupMenu().getComponentIndex(menu);
+
+ AccountID menuAccountID = menu.getProtocolProvider().getAccountID();
+
+ int protocolCompare = accountId.getProtocolDisplayName().compareTo(
+ menuAccountID.getProtocolDisplayName());
+
+ // If the new account protocol name is before the name of the menu
+ // we insert the new account before the given menu.
+ if (protocolCompare < 0)
+ {
+ insert(statusSelectorMenu, menuIndex);
+ isMenuAdded = true;
+ break;
+ }
+ else if (protocolCompare == 0)
+ {
+ // If we have the same protocol name, we check the account name.
+ if (accountId.getDisplayName()
+ .compareTo(menuAccountID.getDisplayName()) < 0)
+ {
+ insert( statusSelectorMenu, menuIndex);
+ isMenuAdded = true;
+ break;
+ }
+ }
+ }
+
+ if (!isMenuAdded)
+ add(statusSelectorMenu);
}
/**
@@ -220,11 +263,10 @@ public void addAccount(ProtocolProviderService protocolProvider)
*/
public void removeAccount(ProtocolProviderService protocolProvider)
{
- StatusSelectorMenu statusSelectorMenu
- = this.accountMenus.get(protocolProvider);
+ StatusSelectorMenu menu = getStatusSelectorMenu(protocolProvider);
- this.remove(statusSelectorMenu);
- this.accountMenus.remove(protocolProvider);
+ if (menu != null)
+ remove(menu);
}
/**
@@ -236,7 +278,12 @@ public void removeAccount(ProtocolProviderService protocolProvider)
*/
public boolean containsAccount(ProtocolProviderService protocolProvider)
{
- return accountMenus.containsKey(protocolProvider);
+ StatusSelectorMenu menu = getStatusSelectorMenu(protocolProvider);
+
+ if (menu != null)
+ return true;
+
+ return false;
}
/**
@@ -246,7 +293,10 @@ public boolean containsAccount(ProtocolProviderService protocolProvider)
*/
public void startConnecting(ProtocolProviderService protocolProvider)
{
- accountMenus.get(protocolProvider).startConnecting();
+ StatusSelectorMenu menu = getStatusSelectorMenu(protocolProvider);
+
+ if (menu != null)
+ menu.startConnecting();
}
/**
@@ -256,9 +306,10 @@ public void startConnecting(ProtocolProviderService protocolProvider)
*/
public void stopConnecting(ProtocolProviderService protocolProvider)
{
- StatusSelectorMenu selectorMenu = accountMenus.get(protocolProvider);
- if (selectorMenu != null)
- selectorMenu.stopConnecting();
+ StatusSelectorMenu menu = getStatusSelectorMenu(protocolProvider);
+
+ if (menu != null)
+ menu.stopConnecting();
}
/**
@@ -269,9 +320,16 @@ public void stopConnecting(ProtocolProviderService protocolProvider)
*/
public boolean hasSelectedMenus()
{
- for (StatusSelectorMenu statusSelectorMenu : accountMenus.values())
- if (statusSelectorMenu.isSelected())
+ for (Component c : getComponents())
+ {
+ if (!(c instanceof StatusSelectorMenu))
+ continue;
+
+ StatusSelectorMenu menu = (StatusSelectorMenu) c;
+
+ if (menu.isSelected())
return true;
+ }
return false;
}
@@ -497,7 +555,7 @@ else if (itemName.equals(Constants.AWAY_STATUS))
*/
public void updateStatus(ProtocolProviderService protocolProvider)
{
- StatusSelectorMenu accountMenu = accountMenus.get(protocolProvider);
+ StatusSelectorMenu accountMenu = getStatusSelectorMenu(protocolProvider);
if (accountMenu == null)
return;
@@ -543,7 +601,7 @@ public void updateStatus(ProtocolProviderService protocolProvider)
public void updateStatus(ProtocolProviderService protocolProvider,
PresenceStatus presenceStatus)
{
- StatusSelectorMenu accountMenu = accountMenus.get(protocolProvider);
+ StatusSelectorMenu accountMenu = getStatusSelectorMenu(protocolProvider);
if (accountMenu == null)
return;
@@ -867,4 +925,29 @@ private void fitSizeToText()
this.setPreferredSize(new Dimension(
textWidth + 2*IMAGE_INDENT + arrowImage.getWidth(null) + 5, 20));
}
+
+ /**
+ * Returns the StatusSelectorMenu corresponding to the given
+ * protocolProvider.
+ * @param protocolProvider the ProtocolProviderService, which
+ * corresponding menu we're looking for
+ * @return the StatusSelectorMenu corresponding to the given
+ * protocolProvider
+ */
+ private StatusSelectorMenu getStatusSelectorMenu(
+ ProtocolProviderService protocolProvider)
+ {
+ for (Component c : getPopupMenu().getComponents())
+ {
+ if (!(c instanceof StatusSelectorMenu))
+ continue;
+
+ StatusSelectorMenu menu = (StatusSelectorMenu) c;
+
+ if (menu.getProtocolProvider() != null
+ && menu.getProtocolProvider().equals(protocolProvider))
+ return menu;
+ }
+ return null;
+ }
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/presence/PresenceStatusMenu.java b/src/net/java/sip/communicator/impl/gui/main/presence/PresenceStatusMenu.java
index d62e1e7b0..ef0a2242d 100644
--- a/src/net/java/sip/communicator/impl/gui/main/presence/PresenceStatusMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/presence/PresenceStatusMenu.java
@@ -35,12 +35,6 @@ public class PresenceStatusMenu
{
private final Logger logger = Logger.getLogger(PresenceStatusMenu.class);
- /**
- * The ProtocolProviderService which has its presence status
- * depicted and changed by this instance.
- */
- private final ProtocolProviderService protocolProvider;
-
private Iterator statusIterator;
private PresenceStatus offlineStatus;
@@ -64,9 +58,8 @@ public class PresenceStatusMenu
public PresenceStatusMenu(ProtocolProviderService protocolProvider)
{
super(protocolProvider.getAccountID().getDisplayName(),
- ImageLoader.getAccountStatusImage(protocolProvider));
-
- this.protocolProvider = protocolProvider;
+ ImageLoader.getAccountStatusImage(protocolProvider),
+ protocolProvider);
this.presence
= protocolProvider.getOperationSet(OperationSetPresence.class);
diff --git a/src/net/java/sip/communicator/impl/gui/main/presence/SimpleStatusMenu.java b/src/net/java/sip/communicator/impl/gui/main/presence/SimpleStatusMenu.java
index 5821af70c..aabe78995 100644
--- a/src/net/java/sip/communicator/impl/gui/main/presence/SimpleStatusMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/presence/SimpleStatusMenu.java
@@ -12,7 +12,6 @@
import javax.swing.*;
import net.java.sip.communicator.impl.gui.*;
-import net.java.sip.communicator.impl.gui.customcontrols.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
@@ -33,8 +32,6 @@ public class SimpleStatusMenu
private static final Logger logger
= Logger.getLogger(SimpleStatusMenu.class);
- private final ProtocolProviderService protocolProvider;
-
private final JMenuItem onlineItem;
private final JMenuItem offlineItem;
@@ -57,9 +54,7 @@ private SimpleStatusMenu(ProtocolProviderService protocolProvider,
String displayName,
Image onlineImage)
{
- super(displayName, new ImageIcon(onlineImage));
-
- this.protocolProvider = protocolProvider;
+ super(displayName, new ImageIcon(onlineImage), protocolProvider);
this.setToolTipText("" + displayName
+ "
Offline");
diff --git a/src/net/java/sip/communicator/impl/gui/main/presence/StatusSelectorMenu.java b/src/net/java/sip/communicator/impl/gui/main/presence/StatusSelectorMenu.java
index 1c61f26ff..b2ba24dcc 100644
--- a/src/net/java/sip/communicator/impl/gui/main/presence/StatusSelectorMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/presence/StatusSelectorMenu.java
@@ -29,12 +29,23 @@ public abstract class StatusSelectorMenu
extends SIPCommMenu
implements ImageObserver
{
+ /**
+ * The connecting icon.
+ */
private final Image connectingIcon
= GuiActivator.getResources().getImage("service.gui.icons.CONNECTING")
.getImage();
+ /**
+ * Indicates if this menu is currently connecting.
+ */
private boolean isConnecting;
+ /**
+ * The ProtocolProviderService associated with this status menu.
+ */
+ protected ProtocolProviderService protocolProvider;
+
/**
* Creates a StatusSelectorMenu.
*/
@@ -48,10 +59,16 @@ public StatusSelectorMenu()
* show.
* @param text the text of the menu
* @param defaultIcon the icon of the menu
+ * @param protocolProvider the ProtocolProviderService associated
+ * with this status menu
*/
- public StatusSelectorMenu(String text, Icon defaultIcon)
+ public StatusSelectorMenu( String text,
+ Icon defaultIcon,
+ ProtocolProviderService protocolProvider)
{
super(text, defaultIcon);
+
+ this.protocolProvider = protocolProvider;
}
/**
@@ -187,4 +204,13 @@ public boolean imageUpdate(Image img, int infoflags,
repaint();
return true;
}
+
+ /**
+ * Returns the protocol provider associated with this status menu.
+ * @return the protocol provider associated with this status menu
+ */
+ public ProtocolProviderService getProtocolProvider()
+ {
+ return protocolProvider;
+ }
}
diff --git a/src/net/java/sip/communicator/service/protocol/AccountID.java b/src/net/java/sip/communicator/service/protocol/AccountID.java
index bcfed621b..25ea6ff7c 100644
--- a/src/net/java/sip/communicator/service/protocol/AccountID.java
+++ b/src/net/java/sip/communicator/service/protocol/AccountID.java
@@ -153,8 +153,7 @@ public String getUserID()
public String getDisplayName()
{
String returnValue = getUserID();
- String protocolName =
- getAccountPropertyString(ProtocolProviderFactory.PROTOCOL);
+ String protocolName = getProtocolDisplayName();
if (protocolName != null && protocolName.trim().length() > 0)
returnValue += " (" + protocolName + ")";
@@ -162,6 +161,16 @@ public String getDisplayName()
return returnValue;
}
+ /**
+ * Returns the display name of the protocol.
+ *
+ * @return the display name of the protocol
+ */
+ public String getProtocolDisplayName()
+ {
+ return getAccountPropertyString(ProtocolProviderFactory.PROTOCOL);
+ }
+
/**
* Returns a String uniquely identifying this account, guaranteed to remain
* the same across multiple installations of the same account and to always