// License: GPL. For details, see LICENSE file.
package at.dallermassl.josm.plugin.surveyor;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import livegps.LiveGpsPlugin;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.tools.Shortcut;
import org.openstreetmap.josm.tools.XmlObjectParser;
import org.xml.sax.SAXException;
import at.dallermassl.josm.plugin.surveyor.util.ResourceLoader;
/**
* @author cdaller
*
*/
public class SurveyorShowAction extends JosmAction {
private static final long serialVersionUID = 2184570223633094734L;
private static final String DEFAULT_SOURCE = "resource://resources/surveyor.xml";
private JFrame surveyorFrame;
private LiveGpsPlugin gpsPlugin;
public SurveyorShowAction(LiveGpsPlugin gpsPlugin) {
super(tr("Surveyor..."), "surveyormenu.png", tr("Open surveyor tool."),
Shortcut.registerShortcut("surveyor:open", tr("Tool: {0}", tr("Surveyor...")),
KeyEvent.VK_R, Shortcut.CTRL_SHIFT), true);
this.gpsPlugin = gpsPlugin;
}
@Override
public void actionPerformed(ActionEvent e) {
if (surveyorFrame == null) {
surveyorFrame = new JFrame();
SurveyorComponent comp = createComponent();
// add component as gps event listener:
gpsPlugin.addPropertyChangeListener(comp);
// add some hotkeys to the component:
ActionMap actionMap = comp.getActionMap();
InputMap inputMap = comp.getInputMap();
// zoomout:
actionMap.put("zoomout", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (Main.map != null && Main.map.mapView != null) {
Main.map.mapView.zoomToFactor(2);
}
}
});
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0), "zoomout");
// zoomin:
actionMap.put("zoomin", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (Main.map != null && Main.map.mapView != null) {
Main.map.mapView.zoomToFactor(1/2);
}
}
});
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0), "zoomin");
// autocenter:
actionMap.put("autocenter", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
// toggle autocenter
gpsPlugin.setAutoCenter(!gpsPlugin.isAutoCenter());
}
});
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0), "autocenter");
surveyorFrame.add(comp);
surveyorFrame.pack();
surveyorFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
//surveyorFrame.setTitle((String)getValue(AbstractAction.NAME));
surveyorFrame.setTitle(tr("Surveyor"));
// <FIXXME date="28.04.2007" author="cdaller">
// TODO get old pos of frame from properties
// </FIXXME>
SurveyorPlugin.setSurveyorFrame(surveyorFrame);
}
surveyorFrame.setAlwaysOnTop(true);
surveyorFrame.setVisible(true);
}
public SurveyorComponent createComponent() {
String source = Main.pref.get("surveyor.source");
if (source == null || source.length() == 0) {
source = DEFAULT_SOURCE;
Main.pref.put("surveyor.source", DEFAULT_SOURCE);
// <FIXXME date="04.05.2007" author="cdaller">
// TODO copy xml file to .josm directory if it does not exist!
// </FIXXME>
}
try (InputStream in = ResourceLoader.getInputStream(source)) {
return createComponent(in);
} catch (IOException e) {
Main.error(e);
JOptionPane.showMessageDialog(Main.parent, tr("Could not read surveyor definition: {0}", source));
} catch (SAXException e) {
Main.error(e);
JOptionPane.showMessageDialog(Main.parent, tr("Error parsing {0}: {1}", source, e.getMessage()));
}
return null;
}
/**
* Parse an xml file containing the definitions for the surveyor component.
* @param in the inputstream to read the xml from.
* @return the component.
* @throws SAXException if the xml could not be read.
*/
public SurveyorComponent createComponent(InputStream in) throws SAXException {
XmlObjectParser parser = new XmlObjectParser();
parser.mapOnStart("surveyor", SurveyorComponent.class);
parser.map("button", ButtonDescription.class);
parser.map("action", SurveyorActionDescription.class);
SurveyorComponent surveyorComponent = null;
parser.start(new BufferedReader(new InputStreamReader(in)));
List<SurveyorActionDescription> actions = new ArrayList<>();
while (parser.hasNext()) {
Object object = parser.next();
if (object instanceof SurveyorComponent) {
//System.out.println("SurveyorComponent " + object);
surveyorComponent = (SurveyorComponent) object;
} else if (object instanceof ButtonDescription) {
//System.out.println("ButtonDescription " + object);
((ButtonDescription) object).setActions(actions);
surveyorComponent.addButton(((ButtonDescription) object));
actions = new ArrayList<>();
} else if (object instanceof SurveyorActionDescription) {
//System.out.println("SurveyorActionDescription " + object);
actions.add((SurveyorActionDescription) object);
} else {
Main.error("surveyor: unknown xml element: " + object);
}
}
return surveyorComponent;
}
}