// License: GPL. For details, see LICENSE file. package at.dallermassl.josm.plugin.surveyor; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import livegps.LiveGpsData; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.tools.XmlObjectParser; import org.xml.sax.SAXException; /** * @author cdaller * */ public class SurveyorComponent extends JComponent implements PropertyChangeListener, GpsDataSource { private static final long serialVersionUID = 4539838472057529042L; private LiveGpsData gpsData; private int rows = 0; private int columns = 0; private int width = 0; private int height = 0; private JLabel streetLabel; private JPanel buttonPanel; private Set<String> hotKeys; public SurveyorComponent() { super(); hotKeys = new HashSet<>(); setLayout(new BorderLayout()); streetLabel = new JLabel(tr("Way: ")); float fontSize = Float.parseFloat(Main.pref.get(SurveyorPlugin.PREF_KEY_STREET_NAME_FONT_SIZE, "35")); Main.pref.put(SurveyorPlugin.PREF_KEY_STREET_NAME_FONT_SIZE, String.valueOf(fontSize)); streetLabel.setFont(streetLabel.getFont().deriveFont(35f)); add(streetLabel, BorderLayout.NORTH); buttonPanel = new JPanel(); add(buttonPanel, BorderLayout.CENTER); } /** * Set the number of rows as a string (callback method from xml parser). * @param rowsString the row string. */ public void setRows(String rowsString) { rows = Integer.parseInt(rowsString); buttonPanel.setLayout(new GridLayout(rows, columns)); } /** * Set the number of columns as a string (callback method from xml parser). * @param columnsString the column string. */ public void setColumns(String columnsString) { System.out.println("setting columns to " +columnsString); columns = Integer.parseInt(columnsString); buttonPanel.setLayout(new GridLayout(rows, columns)); } /** * Set the width as a string. * @param widthString the width of the component. */ public void setWidth(String widthString) { width = Integer.parseInt(widthString); if (width > 0 && height > 0) { super.setPreferredSize(new Dimension(width, height)); } } /** * Set the width as a string. * @param widthString the width of the component. */ public void setHeight(String heightString) { height = Integer.parseInt(heightString); if (width > 0 && height > 0) { super.setPreferredSize(new Dimension(width, height)); } } public void setGridSize(int rows, int cols) { setLayout(new GridLayout(rows, cols)); } public void addButton(ButtonDescription description) { if (description.getHotkey() != "" && hotKeys.contains(description.getHotkey())) { JOptionPane.showMessageDialog(Main.parent, tr("Duplicate hotkey for button ''{0}'' - button will be ignored!", description.getLabel())); } else { if (rows == 0 && columns == 0) { setColumns("4"); } description.setGpsDataSource(this); buttonPanel.add(description.createComponent()); hotKeys.add(description.getHotkey()); } } public static void main(String[] args) { // parse xml file and create component from it: Reader in = new InputStreamReader(SurveyorComponent.class.getClassLoader().getResourceAsStream("resources/surveyor.xml")); XmlObjectParser parser = new XmlObjectParser(); parser.mapOnStart("surveyor", SurveyorComponent.class); parser.map("button", ButtonDescription.class); parser.map("action", SurveyorActionDescription.class); SurveyorComponent surveyorComponent = null; try { parser.start(in); } catch (SAXException e) { e.printStackTrace(); } 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.clear(); } else if (object instanceof SurveyorActionDescription) { System.out.println("SurveyorActionDescription " + object); actions.add((SurveyorActionDescription) object); } else { System.err.println("unknown " + object); } } JFrame frame = new JFrame(); frame.add(surveyorComponent); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } @Override public void propertyChange(PropertyChangeEvent evt) { if ("gpsdata".equals(evt.getPropertyName())) { gpsData = (LiveGpsData) evt.getNewValue(); streetLabel.setText(tr("Way: ") + gpsData.getWayInfo()); } } @Override public LiveGpsData getGpsData() { return gpsData; } }