/**
* *****************************************************************************
* Copyright (c) 2012 Johannes Mitlmeier.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin St, Fifth Floor, Boston, MA 02110, USA
*
*****************************************************************************
*/
package de.fub.agg2graph.ui.gui.jmv;
import de.fub.agg2graph.input.GPXWriter;
import de.fub.agg2graph.structs.GPSPoint;
import de.fub.agg2graph.structs.GPSSegment;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.jdesktop.swingx.JXMapViewer;
import org.jdesktop.swingx.mapviewer.GeoPosition;
public class DrawGPX {
private static final Logger LOG = Logger.getLogger(DrawGPX.class.getName());
private Rectangle2D.Double area = new Rectangle2D.Double(0, 0, 1, 1);
private GPSPoint startCenter = new GPSPoint(52.5148476, 13.3973507);
private List<GPSSegment> segments = new ArrayList<GPSSegment>(5);
private int counter = 0;
private JFrame frmGpxGenerator;
private final JButton btnNext = new JButton("Next");
private RenderPanel panel;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
DrawGPX window = new DrawGPX();
window.frmGpxGenerator.setVisible(true);
}
});
}
/**
* Create the application.
*/
public DrawGPX() {
segments.add(new GPSSegment());
initialize();
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
SwingUtilities.updateComponentTreeUI(frmGpxGenerator);
frmGpxGenerator.pack();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
LOG.log(Level.SEVERE, e.getMessage(), e);
}
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frmGpxGenerator = new JFrame();
frmGpxGenerator.setTitle("GPX generator");
frmGpxGenerator.setBounds(100, 100, 450, 300);
frmGpxGenerator.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new RenderPanel();
// center the map
// panel.setZoomContolsVisible(false);
panel.setCenterPosition(new GeoPosition(startCenter.getLat(), startCenter.getLon()));
panel.setZoom(5);
// panel.setMapRectanglesVisible(false);
updateArea();
panel.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
updateArea();
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() != MouseEvent.BUTTON1) {
return;
}
GPSSegment currentSegment = segments.get(segments.size() - 1);
// make new GPSPoint
GeoPosition pos = panel.convertPointToGeoPosition(new Point2D.Double(e.getX(), e.getY()));
GPSPoint point = new GPSPoint(pos.getLatitude(), pos.getLongitude());
LOG.info(point.toString());
currentSegment.add(point);
panel.repaint();
}
});
panel.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
updateArea();
}
});
frmGpxGenerator.getContentPane().add(panel, BorderLayout.CENTER);
btnNext.setMnemonic('n');
btnNext.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
new File("test/input/draw-gpx").mkdirs();
GPXWriter.writeSegment(
new File(String.format(
"test/input/draw-gpx/%04d.gpx", counter++)),
segments.get(segments.size() - 1));
} catch (IOException e1) {
LOG.log(Level.SEVERE, "Write error: {0}", e1.getLocalizedMessage());
LOG.log(Level.SEVERE, e1.getMessage(), e1);
}
segments.add(new GPSSegment());
panel.repaint();
}
});
frmGpxGenerator.getContentPane().add(btnNext, BorderLayout.SOUTH);
}
private void updateArea() {
GeoPosition topLeft = panel.convertPointToGeoPosition(new Point2D.Double(0, panel.getHeight()));
GeoPosition bottomRight = panel.convertPointToGeoPosition(new Point2D.Double(panel.getWidth(), 0));
area.setRect(topLeft.getLatitude(),
topLeft.getLongitude(),
bottomRight.getLatitude() - topLeft.getLatitude(),
bottomRight.getLongitude() - topLeft.getLongitude());
}
public class RenderPanel extends JXMapViewer {
private static final long serialVersionUID = 1858332755567599369L;
@Override
public void paint(Graphics g) {
g.clearRect(0, 0, getWidth(), getHeight());
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
repaintOverlay(g2);
}
public void repaintOverlay(Graphics2D g2) {
// old segments
g2.setColor(new Color(0f, 0f, 0f, 0.4f));
g2.setStroke(new BasicStroke(2f));
for (int s = 0; s < segments.size() - 1; s++) {
paintSegment(g2, segments.get(s));
}
// current segment
g2.setColor(new Color(0.5f, 0.1f, 1f, 1f));
g2.setStroke(new BasicStroke(5f));
paintSegment(g2, segments.get(segments.size() - 1));
}
private void paintSegment(Graphics2D g2, GPSSegment segment) {
for (int i = 0; i < segment.size(); i++) {
GPSPoint point = segment.get(i);
Point2D p2 = convertGeoPositionToPoint(new GeoPosition(point.getLat(), point.getLon()));
g2.drawOval((int) p2.getX() - 2, (int) p2.getY() - 2, 4, 4);
if (i > 0) {
GPSPoint lastPoint = segment.get(i - 1);
Point2D p1 = convertGeoPositionToPoint(new GeoPosition(lastPoint.getLat(), lastPoint.getLon()));
g2.drawLine((int) p2.getX(), (int) p2.getY(), (int) p1.getX(), (int) p1.getY());
}
}
}
}
}