added possibility to save default visualizer skins
This commit is contained in:
parent
b85bc3379c
commit
baa5e67ef1
|
@ -67,14 +67,18 @@ import java.util.List;
|
|||
import java.util.Observable;
|
||||
import java.util.Observer;
|
||||
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.Action;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBoxMenuItem;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JMenu;
|
||||
import javax.swing.JMenuItem;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JPopupMenu;
|
||||
import javax.swing.JSeparator;
|
||||
import javax.swing.MenuElement;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.Timer;
|
||||
import javax.swing.plaf.basic.BasicInternalFrameUI;
|
||||
|
@ -84,13 +88,13 @@ import org.jdom.Element;
|
|||
|
||||
import se.sics.cooja.ClassDescription;
|
||||
import se.sics.cooja.GUI;
|
||||
import se.sics.cooja.GUI.MoteRelation;
|
||||
import se.sics.cooja.Mote;
|
||||
import se.sics.cooja.MoteInterface;
|
||||
import se.sics.cooja.PluginType;
|
||||
import se.sics.cooja.SimEventCentral.MoteCountListener;
|
||||
import se.sics.cooja.Simulation;
|
||||
import se.sics.cooja.VisPlugin;
|
||||
import se.sics.cooja.GUI.MoteRelation;
|
||||
import se.sics.cooja.SimEventCentral.MoteCountListener;
|
||||
import se.sics.cooja.interfaces.LED;
|
||||
import se.sics.cooja.interfaces.Position;
|
||||
import se.sics.cooja.interfaces.SerialPort;
|
||||
|
@ -131,6 +135,7 @@ public class Visualizer extends VisPlugin {
|
|||
private GUI gui = null;
|
||||
private Simulation simulation = null;
|
||||
private final JPanel canvas;
|
||||
private boolean loadedConfig = false;
|
||||
|
||||
/* Viewport */
|
||||
private AffineTransform viewportTransform;
|
||||
|
@ -238,64 +243,9 @@ public class Visualizer extends VisPlugin {
|
|||
skinButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
Point mouse = MouseInfo.getPointerInfo().getLocation();
|
||||
JCheckBoxMenuItem item;
|
||||
JPopupMenu skinPopupMenu = new JPopupMenu();
|
||||
|
||||
for (Class<? extends VisualizerSkin> skinClass: visualizerSkins) {
|
||||
String description = GUI.getDescriptionOf(skinClass);
|
||||
item = new JCheckBoxMenuItem(description, false);
|
||||
item.putClientProperty("skinclass", skinClass);
|
||||
|
||||
/* Select skin if active */
|
||||
for (VisualizerSkin skin: currentSkins) {
|
||||
if (skin.getClass() == skinClass) {
|
||||
item.setSelected(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
item.addItemListener(new ItemListener() {
|
||||
public void itemStateChanged(ItemEvent e) {
|
||||
JCheckBoxMenuItem menuItem = ((JCheckBoxMenuItem)e.getItem());
|
||||
if (menuItem == null) {
|
||||
logger.fatal("No menu item");
|
||||
return;
|
||||
}
|
||||
|
||||
Class<VisualizerSkin> skinClass =
|
||||
(Class<VisualizerSkin>) menuItem.getClientProperty("skinclass");
|
||||
if (skinClass == null) {
|
||||
logger.fatal("Unknown visualizer skin class: " + skinClass);
|
||||
return;
|
||||
}
|
||||
|
||||
if (menuItem.isSelected()) {
|
||||
/* Create and activate new skin */
|
||||
generateAndActivateSkin(skinClass);
|
||||
} else {
|
||||
/* Deactivate skin */
|
||||
VisualizerSkin skinToDeactivate = null;
|
||||
for (VisualizerSkin skin: currentSkins) {
|
||||
if (skin.getClass() == skinClass) {
|
||||
skinToDeactivate = skin;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (skinToDeactivate == null) {
|
||||
logger.fatal("Unknown visualizer skin to deactivate: " + skinClass);
|
||||
return;
|
||||
}
|
||||
skinToDeactivate.setInactive();
|
||||
repaint();
|
||||
currentSkins.remove(skinToDeactivate);
|
||||
skinButton.setText("Select visualizer skins " +
|
||||
"(" + currentSkins.size() + "/" + visualizerSkins.size() + ")");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
skinPopupMenu.add(item);
|
||||
}
|
||||
populateSkinMenu(skinPopupMenu);
|
||||
|
||||
skinPopupMenu.setLocation(mouse);
|
||||
skinPopupMenu.setInvoker(skinButton);
|
||||
|
@ -558,6 +508,24 @@ public class Visualizer extends VisPlugin {
|
|||
repaint();
|
||||
}
|
||||
|
||||
public void startPlugin() {
|
||||
super.startPlugin();
|
||||
if (loadedConfig) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Activate default skins */
|
||||
String[] defaultSkins = GUI.getExternalToolsSetting("VISUALIZER_DEFAULT_SKINS", "").split(";");
|
||||
for (String skin: defaultSkins) {
|
||||
if (skin.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
Class<? extends VisualizerSkin> skinClass =
|
||||
simulation.getGUI().tryLoadClass(this, VisualizerSkin.class, skin);
|
||||
generateAndActivateSkin(skinClass);
|
||||
}
|
||||
}
|
||||
|
||||
public VisualizerSkin[] getCurrentSkins() {
|
||||
VisualizerSkin[] skins = new VisualizerSkin[currentSkins.size()];
|
||||
return currentSkins.toArray(skins);
|
||||
|
@ -665,6 +633,15 @@ public class Visualizer extends VisPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
/* Visualizer skin actions */
|
||||
menu.add(new JSeparator());
|
||||
JMenu skinMenu = new JMenu("Visualizer skins");
|
||||
populateSkinMenu(skinMenu);
|
||||
menu.add(skinMenu);
|
||||
makeSkinsDefaultAction.putValue(Action.NAME, "Make current skins default");
|
||||
JMenuItem skinDefaultItem = new JMenuItem(makeSkinsDefaultAction);
|
||||
menu.add(skinDefaultItem);
|
||||
|
||||
/* Show menu */
|
||||
menu.setLocation(new Point(
|
||||
canvas.getLocationOnScreen().x + x,
|
||||
|
@ -673,6 +650,70 @@ public class Visualizer extends VisPlugin {
|
|||
menu.setVisible(true);
|
||||
}
|
||||
|
||||
private void populateSkinMenu(MenuElement skinMenu) {
|
||||
JCheckBoxMenuItem item;
|
||||
for (Class<? extends VisualizerSkin> skinClass: visualizerSkins) {
|
||||
String description = GUI.getDescriptionOf(skinClass);
|
||||
item = new JCheckBoxMenuItem(description, false);
|
||||
item.putClientProperty("skinclass", skinClass);
|
||||
|
||||
/* Select skin if active */
|
||||
for (VisualizerSkin skin: currentSkins) {
|
||||
if (skin.getClass() == skinClass) {
|
||||
item.setSelected(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
item.addItemListener(new ItemListener() {
|
||||
public void itemStateChanged(ItemEvent e) {
|
||||
JCheckBoxMenuItem menuItem = ((JCheckBoxMenuItem)e.getItem());
|
||||
if (menuItem == null) {
|
||||
logger.fatal("No menu item");
|
||||
return;
|
||||
}
|
||||
|
||||
Class<VisualizerSkin> skinClass =
|
||||
(Class<VisualizerSkin>) menuItem.getClientProperty("skinclass");
|
||||
if (skinClass == null) {
|
||||
logger.fatal("Unknown visualizer skin class: " + skinClass);
|
||||
return;
|
||||
}
|
||||
|
||||
if (menuItem.isSelected()) {
|
||||
/* Create and activate new skin */
|
||||
generateAndActivateSkin(skinClass);
|
||||
} else {
|
||||
/* Deactivate skin */
|
||||
VisualizerSkin skinToDeactivate = null;
|
||||
for (VisualizerSkin skin: currentSkins) {
|
||||
if (skin.getClass() == skinClass) {
|
||||
skinToDeactivate = skin;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (skinToDeactivate == null) {
|
||||
logger.fatal("Unknown visualizer skin to deactivate: " + skinClass);
|
||||
return;
|
||||
}
|
||||
skinToDeactivate.setInactive();
|
||||
repaint();
|
||||
currentSkins.remove(skinToDeactivate);
|
||||
skinButton.setText("Select visualizer skins " +
|
||||
"(" + currentSkins.size() + "/" + visualizerSkins.size() + ")");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (skinMenu instanceof JMenu) {
|
||||
((JMenu)skinMenu).add(item);
|
||||
}
|
||||
if (skinMenu instanceof JPopupMenu) {
|
||||
((JPopupMenu)skinMenu).add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void handleMousePress(MouseEvent mouseEvent) {
|
||||
int x = mouseEvent.getX();
|
||||
int y = mouseEvent.getY();
|
||||
|
@ -975,12 +1016,12 @@ public class Visualizer extends VisPlugin {
|
|||
if (smallX == bigX) {
|
||||
scaleX = 1;
|
||||
} else {
|
||||
scaleX = (bigX - smallX) / (double) (canvas.getWidth());
|
||||
scaleX = (bigX - smallX) / (canvas.getWidth());
|
||||
}
|
||||
if (smallY == bigY) {
|
||||
scaleY = 1;
|
||||
} else {
|
||||
scaleY = (bigY - smallY) / (double) (canvas.getHeight());
|
||||
scaleY = (bigY - smallY) / (canvas.getHeight());
|
||||
}
|
||||
|
||||
viewportTransform.setToIdentity();
|
||||
|
@ -1149,6 +1190,8 @@ public class Visualizer extends VisPlugin {
|
|||
}
|
||||
|
||||
public boolean setConfigXML(Collection<Element> configXML, boolean visAvailable) {
|
||||
loadedConfig = true;
|
||||
|
||||
for (Element element : configXML) {
|
||||
if (element.getName().equals("skin")) {
|
||||
String wanted = element.getText();
|
||||
|
@ -1194,6 +1237,20 @@ public class Visualizer extends VisPlugin {
|
|||
return true;
|
||||
}
|
||||
|
||||
private AbstractAction makeSkinsDefaultAction = new AbstractAction() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (VisualizerSkin skin: currentSkins) {
|
||||
if (sb.length() > 0) {
|
||||
sb.append(';');
|
||||
}
|
||||
sb.append(skin.getClass().getName());
|
||||
}
|
||||
logger.debug("sb.toString() " + sb.toString());
|
||||
GUI.setExternalToolsSetting("VISUALIZER_DEFAULT_SKINS", sb.toString());
|
||||
}
|
||||
};
|
||||
|
||||
protected static class ButtonClickMoteMenuAction implements MoteMenuAction {
|
||||
public boolean isEnabled(Visualizer visualizer, Mote mote) {
|
||||
return mote.getInterfaces().getButton() != null
|
||||
|
|
Loading…
Reference in a new issue