diff --git a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
index 9aeca01f5..0591da2f2 100644
--- a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
@@ -21,6 +21,8 @@
import net.java.sip.communicator.impl.gui.main.configforms.*;
import net.java.sip.communicator.impl.gui.main.contactlist.*;
import net.java.sip.communicator.impl.gui.utils.*;
+import net.java.sip.communicator.plugin.desktoputil.*;
+import net.java.sip.communicator.plugin.desktoputil.SwingWorker;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.gui.Container;
import net.java.sip.communicator.service.notification.*;
@@ -29,18 +31,20 @@
import net.java.sip.communicator.util.Logger;
import net.java.sip.communicator.util.account.*;
import net.java.sip.communicator.util.skin.*;
-import net.java.sip.communicator.plugin.desktoputil.*;
-import net.java.sip.communicator.plugin.desktoputil.SwingWorker;
import org.jitsi.service.configuration.*;
import org.jitsi.service.resources.*;
import org.jitsi.util.*;
-
import org.osgi.framework.*;
/**
- * The FileMenu is a menu in the main application menu bar that
- * contains "New account".
+ * The ToolsMenu is a menu in the contact list / chat panel bars that
+ * contains "Tools". This menu is separated in different sections by
+ * JSeparators. These sections are ordered in the following matter:
+ * 0 0 0 | 1 1 | 2 2... where numbers indicate the indices of the corresponding
+ * sections and | are separators. Currently, section 0 contains "Options",
+ * "Create a video bridge", "Create a conference call"... until the first
+ * JSeparator after which starts the next section - section 1.
*
* @author Yana Stamcheva
* @author Lyubomir Marinov
@@ -184,8 +188,11 @@ private void initPluginComponents()
{
public void run()
{
- add((Component) f.getPluginComponentInstance(
- ToolsMenu.this).getComponent());
+ PluginComponent pluginComponent =
+ f.getPluginComponentInstance(ToolsMenu.this);
+ insertInSection(
+ (JMenuItem) pluginComponent.getComponent(),
+ pluginComponent.getPositionIndex());
}
});
}
@@ -309,7 +316,11 @@ public void pluginComponentAdded(PluginComponentEvent event)
{
public void run()
{
- add((Component) c.getPluginComponentInstance(ToolsMenu.this));
+ PluginComponent pluginComponent =
+ c.getPluginComponentInstance(ToolsMenu.this);
+ insertInSection(
+ (JMenuItem) pluginComponent.getComponent(),
+ pluginComponent.getPositionIndex());
}
});
@@ -435,6 +446,61 @@ private void registerMenuItems()
loadSkin();
}
+ /**
+ * Keeps track of the indices of JSeparators
+ * that are places within this Container
+ */
+ private List separatorIndices = new LinkedList();
+
+ /**
+ * When a new separator is added to this Container its position
+ * will be saved in separatorIndices.
+ */
+ public void addSeparator()
+ {
+ super.addSeparator();
+ separatorIndices.add(this.getMenuComponentCount() - 1);
+ }
+
+ /**
+ * Inserts the given JMenuItem at the end of the specified section.
+ * Sections are ordered in the following matter: 0 0 0 | 1 1 | 2 2 ...
+ *
+ * @param item The JMenuItem that we insert
+ *
+ * @param section The section index in which we want to insert the specified
+ * JMenuItem. If section is < 0 or section is >= the
+ * JSeparators count in this menu, this item will be inserted at
+ * the end of the menu.
+ *
+ * @return The inserted JMenuItem
+ */
+ private JMenuItem insertInSection(JMenuItem item, int section)
+ {
+ if (section < 0 || section >= separatorIndices.size())
+ {
+ add(item);
+ return item;
+ }
+
+ // Gets the index of the separator so we can insert the JMenuItem
+ // before it.
+ int separatorIndex = separatorIndices.get(section);
+
+ // All following separators' positions must be incremented because we
+ // will insert a new JMenuItem before them.
+ ListIterator it = separatorIndices.listIterator(section);
+ while (it.hasNext())
+ {
+ int i = it.next() + 1;
+ it.remove();
+ it.add(i);
+ }
+
+ insert(item, separatorIndex);
+ return item;
+ }
+
/**
* Returns a list of all available video bridge providers.
*
diff --git a/src/net/java/sip/communicator/impl/protocol/msn/OperationSetServerStoredAccountInfoMsnImpl.java b/src/net/java/sip/communicator/impl/protocol/msn/OperationSetServerStoredAccountInfoMsnImpl.java
index fb43723c5..706caf767 100644
--- a/src/net/java/sip/communicator/impl/protocol/msn/OperationSetServerStoredAccountInfoMsnImpl.java
+++ b/src/net/java/sip/communicator/impl/protocol/msn/OperationSetServerStoredAccountInfoMsnImpl.java
@@ -11,15 +11,16 @@
import javax.imageio.*;
-import org.jitsi.service.fileaccess.FileCategory;
-
import net.java.sip.communicator.service.protocol.*;
+import net.java.sip.communicator.service.protocol.ServerStoredDetails.DisplayNameDetail;
import net.java.sip.communicator.service.protocol.ServerStoredDetails.GenericDetail;
import net.java.sip.communicator.service.protocol.ServerStoredDetails.ImageDetail;
import net.java.sip.communicator.service.protocol.event.*;
import net.java.sip.communicator.util.*;
import net.sf.jml.*;
+import org.jitsi.service.fileaccess.*;
+
/**
* Saves account avatar image. If one is already saved we set it as initial one
* for the MsnOwner.
@@ -254,17 +255,8 @@ public Iterator> getSupportedDetailTypes()
public boolean isDetailClassSupported(
Class extends GenericDetail> detailClass)
{
- List details = getContactDetails(uin);
- Iterator iter = details.iterator();
- while (iter.hasNext())
- {
- GenericDetail obj = iter.next();
- if (detailClass.isAssignableFrom(obj.getClass()))
- {
- return true;
- }
- }
- return false;
+ return ImageDetail.class.isAssignableFrom(detailClass) ||
+ DisplayNameDetail.class.isAssignableFrom(detailClass);
}
/**
diff --git a/src/net/java/sip/communicator/plugin/accountinfo/AccountInfoMenuItemComponent.java b/src/net/java/sip/communicator/plugin/accountinfo/AccountInfoMenuItemComponent.java
index 7ce1ad670..5ed03facc 100644
--- a/src/net/java/sip/communicator/plugin/accountinfo/AccountInfoMenuItemComponent.java
+++ b/src/net/java/sip/communicator/plugin/accountinfo/AccountInfoMenuItemComponent.java
@@ -116,4 +116,17 @@ public String getName()
return
Resources.getString("plugin.accountinfo.TITLE");
}
+
+ /**
+ * Returns the position of this PluginComponent within its
+ * Container
+ *
+ * @return Always returns 0. 0 is index of the first section in the "Tools"
+ * menu bar in the Contacts list that also contains "Options",
+ * "Create a video bridge" etc...
+ */
+ public int getPositionIndex()
+ {
+ return 0;
+ }
}
diff --git a/src/net/java/sip/communicator/plugin/spellcheck/LanguageMenuBar.java b/src/net/java/sip/communicator/plugin/spellcheck/LanguageMenuBar.java
index e4c05d39a..451d373ae 100644
--- a/src/net/java/sip/communicator/plugin/spellcheck/LanguageMenuBar.java
+++ b/src/net/java/sip/communicator/plugin/spellcheck/LanguageMenuBar.java
@@ -681,4 +681,15 @@ public void valueChanged(ListSelectionEvent e)
}
}
}
+
+ /**
+ * Returns the index indicating the position of this menu in its container.
+ *
+ * @return -1 to indicate that this menu should take the last position
+ */
+ @Override
+ public int getPositionIndex()
+ {
+ return -1;
+ }
}
diff --git a/src/net/java/sip/communicator/service/gui/PluginComponent.java b/src/net/java/sip/communicator/service/gui/PluginComponent.java
index f1984cf63..48e438d30 100644
--- a/src/net/java/sip/communicator/service/gui/PluginComponent.java
+++ b/src/net/java/sip/communicator/service/gui/PluginComponent.java
@@ -51,6 +51,15 @@ public interface PluginComponent
*/
public Object getComponent();
+ /**
+ * Returns the position of this PluginComponent within its
+ * Container
+ *
+ * @return The position of this PluginComponent within its
+ * Container
+ */
+ public int getPositionIndex();
+
/**
* Sets the current contact. Meant to be used by plugin components that
* are interested of the current contact. The current contact is the contact