package jadex.application.space.envsupport.observer.gui.plugin;
import jadex.application.space.envsupport.math.Vector2Double;
import jadex.application.space.envsupport.observer.gui.ObserverCenter;
import jadex.application.space.envsupport.observer.perspective.IPerspective;
import jadex.application.space.envsupport.observer.perspective.Perspective2D;
import jadex.commons.SUtil;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListSelectionModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
public class VisualsPlugin implements IObserverCenterPlugin
{
/** Plugin name
*/
private static final String NAME = "Visuals";
/** The main panel
*/
private JSplitPane mainPane;
/** The perspectives
*/
private JTable perspectivelist;
/** The dataviews
*/
private JList dataviewlist;
/** The zoom spinner
*/
private JSpinner zoomSpinner;
/** Check box for inverting the x-axis */
private JCheckBox invertXBox;
/** Check box for inverting the y-axis */
private JCheckBox invertYBox;
/** The observer center
*/
private ObserverCenter observerCenter_;
/** The perspective selection controller
*/
private ListSelectionListener perspectiveController_;
/** The dataview selection controller
*/
private ListSelectionListener dataviewController_;
public VisualsPlugin()
{
mainPane = new JSplitPane();
mainPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
mainPane.setOneTouchExpandable(true);
mainPane.setDividerLocation(160);
mainPane.setResizeWeight(0.5);
mainPane.setMinimumSize(new Dimension(50, 400));
JSplitPane persViewPane = new JSplitPane();
persViewPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
persViewPane.setOneTouchExpandable(true);
persViewPane.setDividerLocation(80);
persViewPane.setResizeWeight(0.5);
mainPane.setTopComponent(persViewPane);
JPanel perspectivePanel = new JPanel(new GridBagLayout());
perspectivePanel.setBorder(new TitledBorder("Perspective"));
persViewPane.setTopComponent(perspectivePanel);
DefaultTableModel perspectiveModel = new DefaultTableModel(new String[]{"Perspective", "OpenGL"}, 0)
{
@Override
public Class getColumnClass(int columnIndex)
{
if (columnIndex == 1)
return Boolean.class;
return super.getColumnClass(columnIndex);
}
public boolean isCellEditable(int row, int column)
{
return (column == 1);
}
};
perspectiveModel.addTableModelListener(new TableModelListener()
{
public void tableChanged(TableModelEvent e)
{
if (e.getColumn() == 1)
{
int row = perspectivelist.getSelectedRow();
String selection = null;
if (row != -1)
selection = (String) ((DefaultTableModel) perspectivelist.getModel()).getValueAt(row, 0);
if (selection != null)
{
Boolean opengl = (Boolean) ((DefaultTableModel) perspectivelist.getModel()).getValueAt(row, 1);
observerCenter_.setOpenGLMode(selection, opengl.booleanValue());
}
}
}
});
perspectivelist = new JTable(perspectiveModel);
perspectivelist.setSelectionModel(new DefaultListSelectionModel());
JScrollPane perspectiveScrollPane = new JScrollPane(perspectivelist);
perspectiveController_ = new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e)
{
/*int col = perspectivelist.getSelectedColumn();
if (col == 1)
return;*/
int row = perspectivelist.getSelectedRow();
String selection = null;
if (row != -1)
selection = (String) ((DefaultTableModel) perspectivelist.getModel()).getValueAt(row, 0);
if (selection != null)
{
observerCenter_.setSelectedPerspective(selection);
}
}
};
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.weighty = 1.0;
c.weightx = 1.0;
c.anchor = GridBagConstraints.CENTER;
c.fill = GridBagConstraints.BOTH;
perspectivePanel.add(perspectiveScrollPane, c);
JPanel dataviewPanel = new JPanel(new GridBagLayout());
dataviewPanel.setBorder(new TitledBorder("Dataview"));
persViewPane.setBottomComponent(dataviewPanel);
dataviewlist = new JList(new DefaultComboBoxModel());
JScrollPane dataviewScrollPane = new JScrollPane(dataviewlist);
dataviewController_ = new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e)
{
String selection = (String) dataviewlist.getSelectedValue();
observerCenter_.setSelectedDataView(selection);
}
};
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.weighty = 1.0;
c.weightx = 1.0;
c.anchor = GridBagConstraints.NORTH;
c.fill = GridBagConstraints.BOTH;
dataviewPanel.add(dataviewScrollPane, c);
JPanel controlPanel = new JPanel(new GridBagLayout());
controlPanel.setBorder(new TitledBorder("Controls"));
mainPane.setBottomComponent(controlPanel);
JPanel movePanel = new JPanel(new GridBagLayout());
//String[] moveButtonNames = {"Up", "Right", "Down", "Left"};
String baseImgLoc = "/jadex/application/space/envsupport/observer/images/";
String[] moveImgNames = {"arrow_up.png", "arrow_right.png", "arrow_down.png", "arrow_left.png", "x_small.png"};
int[] moveButtonPos = {1, 2, 1, 0};
for (int i = 0; i < 5; ++i)
{
JButton b = new JButton();
c = new GridBagConstraints();
if (i < 4)
{
c.gridx = moveButtonPos[i];
c.gridy = moveButtonPos[(i + 3) % 4];
final Vector2Double direction = new Vector2Double((i == 1)||(i == 3)? 0.1:0.0, (i == 0)||(i== 2)? 0.1:0.0);
if ((i & 2) != 0)
direction.negate();
b.setAction(new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
IPerspective p = observerCenter_.getSelectedPerspective();
if (p instanceof Perspective2D)
{
Perspective2D pers = (Perspective2D) p;
pers.shiftPosition(direction.copy());
}
}
});
}
else if (i == 4)
{
c.gridx = 1;
c.gridy = 1;
b.setAction(new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
IPerspective p = observerCenter_.getSelectedPerspective();
if (p instanceof Perspective2D)
{
p.resetZoomAndPosition();
}
}
});
}
try
{
b.setIcon(new ImageIcon(ImageIO.read(SUtil.getResource(baseImgLoc + moveImgNames[i], getClass().getClassLoader()))));
}
catch (IOException e1)
{
e1.printStackTrace();
}
b.setBorderPainted(false);
b.setContentAreaFilled(false);
c.weighty = 0.0;
c.weightx = 0.0;
c.anchor = GridBagConstraints.CENTER;
c.fill = GridBagConstraints.NONE;
movePanel.add(b, c);
}
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.weighty = 0.0;
c.weightx = 0.0;
c.ipady = 10;
c.anchor = GridBagConstraints.NORTH;
c.fill = GridBagConstraints.NONE;
controlPanel.add(movePanel, c);
JPanel zoomPanel = new JPanel(new GridBagLayout());
c.gridx = 0;
c.gridy = 1;
c.weighty = 0.0;
c.weightx = 0.0;
c.anchor = GridBagConstraints.NORTH;
c.fill = GridBagConstraints.NONE;
controlPanel.add(zoomPanel, c);
JLabel zoomDesc = new JLabel("Zoom");
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.weighty = 0.0;
c.weightx = 0.0;
c.ipadx = 30;
c.anchor = GridBagConstraints.NORTH;
c.fill = GridBagConstraints.NONE;
zoomPanel.add(zoomDesc, c);
zoomSpinner = new JSpinner(new SpinnerNumberModel(1.0, 0.1, 20.0, 0.0));
zoomSpinner.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
IPerspective p = observerCenter_.getSelectedPerspective();
if (p instanceof Perspective2D)
{
Perspective2D pers = (Perspective2D) p;
double newVal = ((Double)zoomSpinner.getValue()).doubleValue();
pers.setZoom(newVal);
}
}
});
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 0;
c.weighty = 0.0;
c.weightx = 0.0;
c.anchor = GridBagConstraints.NORTH;
c.fill = GridBagConstraints.NONE;
zoomPanel.add(zoomSpinner, c);
JPanel invertPanel = new JPanel(new GridBagLayout());
c.gridx = 0;
c.gridy = 2;
c.weighty = 0.0;
c.weightx = 0.0;
c.anchor = GridBagConstraints.NORTH;
c.fill = GridBagConstraints.NONE;
controlPanel.add(invertPanel, c);
invertXBox = new JCheckBox(new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
IPerspective p = observerCenter_.getSelectedPerspective();
if (p instanceof Perspective2D)
{
Perspective2D pers = (Perspective2D) p;
pers.setInvertXAxis(invertXBox.isSelected());
}
}
});
invertXBox.setText("X-Axis Inversion");
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.weighty = 0.0;
c.weightx = 0.0;
c.anchor = GridBagConstraints.NORTH;
c.fill = GridBagConstraints.NONE;
invertPanel.add(invertXBox, c);
invertYBox = new JCheckBox(new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
IPerspective p = observerCenter_.getSelectedPerspective();
if (p instanceof Perspective2D)
{
Perspective2D pers = (Perspective2D) p;
pers.setInvertYAxis(invertYBox.isSelected());
}
}
});
invertYBox.setText("Y-Axis Inversion");
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 1;
c.weighty = 0.0;
c.weightx = 0.0;
c.anchor = GridBagConstraints.NORTH;
c.fill = GridBagConstraints.NONE;
invertPanel.add(invertYBox, c);
JPanel dummy = new JPanel();
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 2;
c.weighty = 1.0;
c.weightx = 1.0;
c.anchor = GridBagConstraints.NORTH;
c.fill = GridBagConstraints.BOTH;
controlPanel.add(dummy, c);
}
/** Starts the plugin
*
* @param the observer center
*/
public void start(ObserverCenter main)
{
observerCenter_ = main;
Map perspectives = observerCenter_.getPerspectives();
synchronized(perspectives)
{
Set themeNames = perspectives.entrySet();
for (Iterator it = themeNames.iterator(); it.hasNext(); )
{
Map.Entry entry = (Map.Entry) it.next();
String name = (String) entry.getKey();
Boolean opengl = new Boolean(((IPerspective) entry.getValue()).getOpenGl());
((DefaultTableModel) perspectivelist.getModel()).addRow(new Object[]{name, opengl});
}
String perspname = observerCenter_.getSelectedPerspective().getName();
int row = 0;
while (!perspectivelist.getValueAt(row, 0).equals(perspname))
++row;
perspectivelist.getSelectionModel().setSelectionInterval(row, row);
}
perspectivelist.getSelectionModel().addListSelectionListener(perspectiveController_);
Map dataviews = observerCenter_.getDataViews();
synchronized(dataviews)
{
Set dataviewnames = dataviews.keySet();
for (Iterator it = dataviewnames.iterator(); it.hasNext(); )
{
String name = (String) it.next();
((DefaultComboBoxModel) dataviewlist.getModel()).addElement(name);
}
}
dataviewlist.addListSelectionListener(dataviewController_);
refresh();
}
/** Stops the plugin
*
*/
public void shutdown()
{
perspectivelist.getSelectionModel().removeListSelectionListener(perspectiveController_);
while (((DefaultTableModel) perspectivelist.getModel()).getRowCount() > 0)
((DefaultTableModel) perspectivelist.getModel()).removeRow(0);
dataviewlist.removeListSelectionListener(dataviewController_);
((DefaultComboBoxModel) dataviewlist.getModel()).removeAllElements();
}
/** Returns the name of the plugin
*
* @return name of the plugin
*/
public String getName()
{
return NAME;
}
/** Returns the path to the icon for the plugin in the toolbar.
*
* @return path to the icon
*/
public String getIconPath()
{
return getClass().getPackage().getName().replaceAll("gui.plugin","").concat("images.").replaceAll("\\.", "/").concat("visuals_icon.png");
}
/** Returns the viewable component of the plugin
*
* @return viewable component of the plugin
*/
public Component getView()
{
return mainPane;
}
/** Refreshes the display
*/
public void refresh()
{
String selection = observerCenter_.getSelectedPerspective().getName();
//TODO: FIXME
/*Map perspectives = observerCenter_.getPerspectives();
perspectivelist.getSelectionModel().removeListSelectionListener(perspectiveController_);
((DefaultComboBoxModel) perspectivelist.getModel()).removeAllElements();
synchronized(perspectives)
{
Set themeNames = perspectives.keySet();
for (Iterator it = themeNames.iterator(); it.hasNext(); )
{
String name = (String) it.next();
((DefaultComboBoxModel) perspectivelist.getModel()).addElement(name);
}
}*/
/*int row = ((DefaultTableModel) perspectivelist.getModel());
perspectivelist.getSelectionModel().// setSelectedValue(selection, true);*/
//perspectivelist.getSelectionModel().addListSelectionListener(perspectiveController_);
selection = observerCenter_.getSelectedDataViewName();
Map dataviews = observerCenter_.getDataViews();
dataviewlist.removeListSelectionListener(dataviewController_);
((DefaultComboBoxModel) dataviewlist.getModel()).removeAllElements();
synchronized(dataviews)
{
Set dataviewnames = dataviews.keySet();
for (Iterator it = dataviewnames.iterator(); it.hasNext(); )
{
String name = (String) it.next();
((DefaultComboBoxModel) dataviewlist.getModel()).addElement(name);
}
}
dataviewlist.setSelectedValue(selection, true);
dataviewlist.addListSelectionListener(dataviewController_);
IPerspective p = observerCenter_.getSelectedPerspective();
if (p instanceof Perspective2D)
{
Perspective2D pers = (Perspective2D) p;
zoomSpinner.setValue(new Double(pers.getZoom()));
((SpinnerNumberModel) zoomSpinner.getModel()).setMaximum(new Double(pers.getZoomLimit()));
((SpinnerNumberModel) zoomSpinner.getModel()).setStepSize(new Double(pers.getZoomStepping()));
invertXBox.setSelected(pers.getInvertXAxis());
invertYBox.setSelected(pers.getInvertYAxis());
}
}
}