package jadex.tools.comanalyzer;
import jadex.commons.SUtil;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.swing.AbstractAction;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
/**
* The menu for message filter. Selected messages are passed to the menu to
* provide filter options suitable for the given messages.
*/
public class MessageFilterMenu extends TitlePopupMenu
{
/** The default parameters */
protected final static String[] default_parameters = new String[]{Message.CONVERSATION_ID, Message.PROTOCOL, Message.PERFORMATIVE};
/** The extended parameters */
protected final static String[] extended_parameters = new String[]{Message.XID, Message.SENDER, Message.RECEIVER, Message.IN_REPLY_TO,
Message.REPLY_TO, Message.REPLY_WITH, Message.REPLY_BY, Message.CONTENT, Message.ONTOLOGY, Message.ENCODING, Message.LANGUAGE};
// Message.CONTENT_CLASS, Message.CONTENT_START, Message.ACTION_CLASS};
/** The ComanalyzerPlugin */
protected ComanalyzerPlugin plugin;
/** The passed messages */
protected Message[] messages;
/** Weather to replace an existing filter or to add a new */
protected boolean replacefilter = true;
/**
* Creates the message filter menu with a single message.
*
* @param plugin The plugin.
* @param message The message
*/
public MessageFilterMenu(ComanalyzerPlugin plugin, final Message message)
{
this(plugin, new Message[]{message});
}
/**
* Creates the message filter menu with an array of messages.
*
* @param plugin The plugin.
* @param messages The array of messages
*/
public MessageFilterMenu(ComanalyzerPlugin plugin, final Message[] messages)
{
super("Message Filter");
this.plugin = plugin;
this.messages = messages;
createMenu();
}
/**
* Creates the menu items.
*/
protected void createMenu()
{
JMenuItem menu0 = new JMenuItem("Remove message filter");
menu0.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
plugin.removeMessageFilter();
plugin.applyMessageFilter();
}
});
add(menu0);
addSeparator();
JMenuItem menu1 = new JMenuItem("Show only messages between participants");
menu1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
MessageFilter filter = new MessageFilter();
for(int i = 0; i < messages.length; i++)
{
filter.addValue(Message.SENDER, messages[i].getParameter(Message.SENDER));
filter.addValue(Message.SENDER, messages[i].getParameter(Message.RECEIVER));
filter.addValue(Message.RECEIVER, messages[i].getParameter(Message.RECEIVER));
filter.addValue(Message.RECEIVER, messages[i].getParameter(Message.SENDER));
}
plugin.setMessageFilter(new MessageFilter[]{filter});
plugin.applyMessageFilter();
}
});
add(menu1);
JMenuItem menu2 = new JMenuItem("Show only selected messages");
menu2.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
MessageFilter filter = new MessageFilter();
for(int i = 0; i < messages.length; i++)
{
filter.addValue(Message.SEQ_NO, messages[i].getParameter(Message.SEQ_NO));
}
plugin.setMessageFilter(new MessageFilter[]{filter});
plugin.applyMessageFilter();
}
});
if(messages.length > 1)
{
add(menu2);
}
addSeparator();
JCheckBoxMenuItem addfilter = new JCheckBoxMenuItem("Replace filter");
addfilter.setSelected(true);
addfilter.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JCheckBoxMenuItem checkbox = (JCheckBoxMenuItem)e.getSource();
replacefilter = checkbox.isSelected();
setVisible(true);
}
});
add(addfilter);
addParameterMenuItems(default_parameters);
addSeparator();
JMenuItem extend = new JMenuItem("Extend...");
// set italic
extend.setFont(getFont().deriveFont(getFont().getStyle() + Font.ITALIC));
extend.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JMenuItem item = (JMenuItem)e.getSource();
item.setVisible(false);
addParameterMenuItems(extended_parameters);
// prevent popup from closing
setVisible(true);
}
});
add(extend);
}
/**
* Adds the menu items for the given parameter names by extracting the
* values from the messages. Only items are enabled, where the values for
* all messages are equal
*
* @param parameters The parameter names.
*/
private void addParameterMenuItems(String[] parameters)
{
for(int i=0; i<parameters.length; i++)
{
KeyMenuItem item;
Set valueset = new HashSet();
for(int j=0; j< messages.length; j++)
{
valueset.add(messages[j].getParameter(parameters[i]));
}
Object[] values = (Object[])valueset.toArray(new Object[valueset.size()]);
if(valueset.size() == 1)
{
item = new KeyMenuItem(parameters[i], values[0]);
}
else
{
item = new KeyMenuItem(parameters[i]);
}
add(item);
}
}
// -------- inner class --------
/**
* A menu item for parameter values
*/
private class KeyMenuItem extends JMenuItem
{
/**
* Creates a disabled menu item for a parameter key. (There are more
* than one values for the key)
*
* @param key The parameter key.
*/
public KeyMenuItem(final String key)
{
super(key + ": more than one value");
setEnabled(false);
}
/**
* Creates a menu item for a parameter key and a value. The action for
* applying the filter based on the given parameter is contained.
*
* @param key The parameter key.
* @param value The parameter value.
*/
public KeyMenuItem(final String key, final Object value)
{
super(key + ": " + value);
String name = key + ": " + value;
setAction(new AbstractAction(name)
{
public void actionPerformed(ActionEvent e)
{
MessageFilter[] fil;
MessageFilter filter = new MessageFilter();
filter.addValue(key, value);
if(replacefilter)
{
fil = new MessageFilter[]{filter};
}
else
{
List list = SUtil.arrayToList(plugin.getMessageFilter());
list.add(filter);
fil = (MessageFilter[])list.toArray(new MessageFilter[list.size()]);
}
plugin.setMessageFilter(fil);
plugin.applyMessageFilter();
}
});
}
}
}