Java tutorial
/* * -------------------------------------------------------------- * * 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. * * -------------------------------------------------------------- * * (c) 2006 by Tomo Krajina, aaa@puzz.info * */ package info.puzz.trackprofiler.gui; import com.cloudgarden.layout.AnchorConstraint; import com.cloudgarden.layout.AnchorLayout; import info.puzz.trackprofiler.Messages; import info.puzz.trackprofiler.TrackProfilerAppContext; import info.puzz.trackprofiler.TrackProfilerException; import info.puzz.trackprofiler.appobjects.Track; import info.puzz.trackprofiler.appobjects.TrackExtreeme; import info.puzz.trackprofiler.appobjects.TrackLoader; import info.puzz.trackprofiler.appobjects.TrackPoint; import info.puzz.trackprofiler.appobjects.Waypoint; import info.puzz.trackprofiler.appobjects.Waypoints; import info.puzz.trackprofiler.util.Message; import info.puzz.trackprofiler.util.TrackFileFilter; import info.puzz.trackprofiler.util.TrackProfilerMath; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.JToolBar; import javax.swing.SwingConstants; import javax.swing.WindowConstants; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.annotations.XYPointerAnnotation; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.ValueMarker; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYAreaRenderer; import org.jfree.data.xy.AbstractXYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import org.jfree.ui.LengthAdjustmentType; import org.jfree.ui.RectangleAnchor; import org.jfree.ui.RectangleInsets; import org.jfree.ui.TextAnchor; /** * This code was generated using CloudGarden's Jigloo SWT/Swing GUI Builder, * which is free for non-commercial use. If Jigloo is being used commercially * (ie, by a corporation, company or business for any purpose whatever) then you * should purchase a license for each developer using Jigloo. Please visit * www.cloudgarden.com for details. Use of Jigloo implies acceptance of these * licensing terms. ************************************* A COMMERCIAL LICENSE * HAS NOT BEEN PURCHASED for this machine, so Jigloo or this code cannot be * used legally for any corporate or commercial purpose. * ************************************* */ public class TrackProfilerFrame extends javax.swing.JFrame { private static final String PLT_EXTENSION = "plt"; //$NON-NLS-1$ private static final String WPT_EXTENSION = "wpt"; //$NON-NLS-1$ private JPanel jPanel1; private JToolBar topToolBar; private JButton aboutButton; private JTable trackTable; private JScrollPane jScrollPane1; private JButton waypointsButton; private JButton preferencesButton; private JPanel jPanel3; private JButton exitButton; private JTextField length2DField; private JTextField length3DField; private JTextField downhillField; private JTextField climbingSumField; private JLabel length3dLabel; private JLabel length2dLabel; private JLabel downhillSumLabel; private JLabel climbingSumLabel; private JTextField lowPointField; private JLabel lowPointLabel; private JTextField hiPointField; private JLabel hiPointLabel; private JButton extreemesButton; private JButton izravnajButton; private JButton resetButton; private JButton loadFiles; private JPanel jPanel2; private ChartPanel chartPanel; private Track track; /** Ovdje se cuva pocetni track (u slucaju reseta vraca se na njega. */ private File trackFile; /** Waypoints file. */ private File waypointsFile; private boolean showExtreemes = false; private static TrackProfilerFrame _instance = null; /** * Ovdje se cuva direktorij s kojim se je zadnji put pristupilo kod * ucitavanja track-a. */ private File folderWithTracks = null; /** Redni broj tocke koja je trenutno oznacena. */ // private int selectedPoint = -1; /** Pocetna odabrana tocka u tablici s tockama track-a. */ private int startSelectedPoints = -1; /** Krajnja odabrana tocka. @see #startSelectedPoints */ private int endSelectedPoints = -1; public static void main(String[] args) { TrackProfilerFrame inst = new TrackProfilerFrame(); inst.setVisible(true); } private TrackProfilerFrame() { super(); initGUI(); } public static TrackProfilerFrame getInstance() { if (_instance == null) { _instance = new TrackProfilerFrame(); } return _instance; } private void initGUI() { try { BorderLayout thisLayout = new BorderLayout(); this.getContentPane().setLayout(thisLayout); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); this.setTitle("Track Profiler " + TrackProfilerAppContext.PROGRAM_VERSION); //$NON-NLS-1$//$NON-NLS-2$ this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { rootWindowClosing(evt); } }); this.getContentPane().add(getJPanel1(), BorderLayout.CENTER); this.getContentPane().add(getTopToolBar(), BorderLayout.NORTH); this.getContentPane().add(getJPanel2(), BorderLayout.EAST); this.setLocation(new java.awt.Point(100, 100)); pack(); this.setSize(794, 537); } catch (Exception e) { e.printStackTrace(); } } private JPanel getJPanel1() { if (jPanel1 == null) { jPanel1 = new JPanel(); BorderLayout jPanel1Layout = new BorderLayout(); jPanel1.setLayout(jPanel1Layout); jPanel1.setBorder(BorderFactory.createTitledBorder("")); //$NON-NLS-1$ jPanel1.add(getChartPanel()); } return jPanel1; } private JPanel getJPanel2() { if (jPanel2 == null) { jPanel2 = new JPanel(); AnchorLayout jPanel2Layout = new AnchorLayout(); jPanel2.setLayout(jPanel2Layout); jPanel2.setPreferredSize(new java.awt.Dimension(200, 230)); jPanel2.add(getJPanel3(), new AnchorConstraint(10, 10, 415, 10, AnchorConstraint.ANCHOR_ABS, AnchorConstraint.ANCHOR_ABS, AnchorConstraint.ANCHOR_NONE, AnchorConstraint.ANCHOR_ABS)); jPanel2.add(getJScrollPane1(), new AnchorConstraint(200, 10, 11, 10, AnchorConstraint.ANCHOR_ABS, AnchorConstraint.ANCHOR_ABS, AnchorConstraint.ANCHOR_ABS, AnchorConstraint.ANCHOR_ABS)); } return jPanel2; } public void setTrack(Track track) throws TrackProfilerException { this.track = track; this.getTrackTable().setModel(new TrackTableModel(this)); if (track == null) { this.resetTrackInfo(); } else { drawChart(); } } protected Track getTrack() { return this.track; } private void computeTrackInfo() throws TrackProfilerException { if (this.track == null) { throw new TrackProfilerException(new Message(Messages.TRACK_NOT_LOADED).toString()); } double length2d = this.track.getTrack2DLength(); double length3d = this.track.getTrack3DLength(); TrackPoint lowest = this.track.getLowestPoint(); TrackPoint highest = this.track.getHighestPoint(); double[] upDown = this.track.getClimbingAndDownhillSum(); this.getLength2DField().setText("" + TrackProfilerMath.round(length2d, 1)); //$NON-NLS-1$ this.getLength3DField().setText("" + TrackProfilerMath.round(length3d, 1)); //$NON-NLS-1$ this.getLowPointField().setText("" + TrackProfilerMath.round(lowest.getElevation(), 1)); //$NON-NLS-1$ this.getHiPointField().setText("" + TrackProfilerMath.round(highest.getElevation(), 1)); //$NON-NLS-1$ this.getClimbingSumField().setText("" + TrackProfilerMath.round(upDown[0], 1)); //$NON-NLS-1$ this.getDownhillField().setText("" + TrackProfilerMath.round(upDown[1], 1)); //$NON-NLS-1$ } private void resetTrackInfo() { this.getLength2DField().setText(""); //$NON-NLS-1$ this.getLength3DField().setText(""); //$NON-NLS-1$ this.getLowPointField().setText(""); //$NON-NLS-1$ this.getHiPointField().setText(""); //$NON-NLS-1$ this.getClimbingSumField().setText(""); //$NON-NLS-1$ this.getDownhillField().setText(""); //$NON-NLS-1$ this.startSelectedPoints = -1; this.endSelectedPoints = -1; } protected void drawChart() throws TrackProfilerException { if (this.track == null) { throw new TrackProfilerException("track_not_loaded"); //$NON-NLS-1$ } this.computeTrackInfo(); String name = trackFile != null ? trackFile.getName() : "TrackProfiler"; //$NON-NLS-1$ JFreeChart chart; if (TrackProfilerAppContext.getInstance().isFilledGraph()) { chart = ChartFactory.createXYAreaChart(name, new Message(Messages.LENGTH).toString(), new Message(Messages.ELEVATION).toString(), this.toDataset(), PlotOrientation.VERTICAL, true, true, false); } else { chart = ChartFactory.createXYLineChart(name, new Message(Messages.LENGTH).toString(), new Message(Messages.ELEVATION).toString(), this.toDataset(), PlotOrientation.VERTICAL, true, true, false); } chart.setBackgroundPaint(Color.white); XYPlot xyplot = (XYPlot) chart.getPlot(); XYAreaRenderer xyarearenderer = new XYAreaRenderer(); xyarearenderer.setSeriesPaint(0, new Color(186, 197, 231, 200)); xyplot.setRenderer(0, xyarearenderer); drawSelectedPoints(xyplot); if (this.track.getWaypoints().size() > 0) { Waypoints markerPoints = new Waypoints(); markerPoints.addAll(this.track.getWaypoints()); for (int i = 0; i < this.track.getWaypoints().size(); i++) { Waypoint waypoint = (Waypoint) this.track.getWaypoints().get(i); prepareWaypontOnChart(xyplot, waypoint); } xyplot.setAxisOffset(new RectangleInsets(5, 5, 5, 5)); xyplot.getRangeAxis().setUpperMargin(0.15); } if (showExtreemes) { Vector/* <TrackExtreeme> */ extreemes = this.track.findExtremes(); for (int i = 0; i < extreemes.size(); i++) { Waypoint ex = (Waypoint) extreemes.get(i); prepareWaypontOnChart(xyplot, ex); } } getChartPanel().setChart(chart); getJPanel1().repaint(); } private void drawSelectedPoints(XYPlot xyplot) { if (this.startSelectedPoints >= 0) { _drawSelectedPoint(xyplot, this.startSelectedPoints); } if (this.endSelectedPoints >= 0 && this.endSelectedPoints != this.startSelectedPoints) { _drawSelectedPoint(xyplot, this.endSelectedPoints); } } private void _drawSelectedPoint(XYPlot xyplot, int position) { TrackPoint point = this.getTrack().getPointAt(position); // Strelicu crtamo samo ako je samo jedna tocka oznacena: if (this.startSelectedPoints < 0 || this.endSelectedPoints < 0 || this.startSelectedPoints == this.endSelectedPoints) { double angle = point.getAngle(); XYPointerAnnotation xypointerannotation = new XYPointerAnnotation("", point.getPosition(), //$NON-NLS-1$ point.getElevation(), Math.PI - angle); xypointerannotation.setTipRadius(3.0D); xypointerannotation.setBaseRadius(30); xypointerannotation.setTextAnchor(TextAnchor.BASELINE_RIGHT); xypointerannotation.setFont(GUIConstants.SANS_SERIF_11); if (angle > 0) { xypointerannotation.setPaint(Color.red); } else if (angle < 0) { xypointerannotation.setPaint(Color.green); } else { xypointerannotation.setPaint(Color.gray); } xypointerannotation.setText((TrackProfilerMath.round(100 * angle, 1)) + " %"); //$NON-NLS-1$ xyplot.addAnnotation(xypointerannotation); } ValueMarker valuemarker = new ValueMarker(point.getPosition()); valuemarker.setLabelOffsetType(LengthAdjustmentType.NO_CHANGE); valuemarker.setStroke(new BasicStroke(1.0F)); if (this.startSelectedPoints != this.endSelectedPoints && position == this.startSelectedPoints) { valuemarker.setLabelPaint(Color.blue); valuemarker.setLabelAnchor(RectangleAnchor.BOTTOM_LEFT); valuemarker.setLabelTextAnchor(TextAnchor.BOTTOM_LEFT); // Ispisuje udaljenost i kut: TrackPoint t1 = this.getTrack().getPointAt(this.startSelectedPoints); TrackPoint t2 = this.getTrack().getPointAt(this.endSelectedPoints); double distance3D = TrackProfilerMath.round(t1.getPosition() - t2.getPosition(), 1); String angle = Math.abs(TrackProfilerMath.round(t1.getAngle(t2) * 100, 1)) + "%"; //$NON-NLS-1$ String label = Message.get(Messages.SELECTED_DISTANCE_LABEL) + distance3D + ", " //$NON-NLS-1$ + Message.get(Messages.SELECTED_ANGLE_LABEL) + angle; valuemarker.setLabel(" " + label); //$NON-NLS-1$ valuemarker.setLabelFont(GUIConstants.SANS_SERIF_11); } xyplot.addDomainMarker(valuemarker); } private void prepareWaypontOnChart(XYPlot xyplot, Waypoint waypoint) { Vector positions = waypoint.getPositionsOnTrack(); for (int i = 0; i < positions.size(); i++) { double position = ((Double) positions.get(i)).doubleValue(); double elevation = waypoint.getElevation(); if (position > 0 && waypoint.isVisible()) { String waypointLabel; if (TrackProfilerAppContext.getInstance().isWaypointLabelFromTitle()) { waypointLabel = waypoint.getTitle(); } else { waypointLabel = waypoint.getDescription(); } double arrowAngle = Math.PI * 1.5; if (waypoint.getArrowLength() < 0) { arrowAngle += Math.PI; } XYPointerAnnotation xypointerannotation = new XYPointerAnnotation(waypointLabel, position, elevation, arrowAngle); xypointerannotation.setTipRadius(3.0D); xypointerannotation.setBaseRadius(Math.abs(waypoint.getArrowLength())); xypointerannotation.setFont(GUIConstants.SANS_SERIF_11); xypointerannotation.setPaint(Color.blue); xypointerannotation.setTextAnchor(TextAnchor.BASELINE_CENTER); xyplot.addAnnotation(xypointerannotation); ValueMarker valuemarker = new ValueMarker(position); valuemarker.setLabelOffsetType(LengthAdjustmentType.NO_CHANGE); valuemarker.setStroke(new BasicStroke(1.0F)); // TODO: u postavke da li ispisivati ovdje if (false) { valuemarker.setLabel(waypoint.getTitle()); } valuemarker.setLabelFont(GUIConstants.SANS_SERIF_11); if (waypoint instanceof TrackExtreeme) { valuemarker.setPaint(Color.blue); } else { valuemarker.setPaint(new Color(220, 220, 220)); } valuemarker.setLabelPaint(Color.red); valuemarker.setLabelAnchor(RectangleAnchor.BOTTOM_LEFT); valuemarker.setLabelTextAnchor(TextAnchor.BOTTOM_LEFT); // xyplot.addRangeMarker(valuemarker); xyplot.addDomainMarker(valuemarker); } } } public void setWaypoints(Waypoints waypoints) throws TrackProfilerException { if (this.track != null) { this.track.setWaypoints(waypoints); this.drawChart(); } else { throw new TrackProfilerException("track_not_loaded"); //$NON-NLS-1$ } } public ChartPanel getChartPanel() { if (this.chartPanel == null) { this.chartPanel = new ChartPanel(null); this.chartPanel.setPreferredSize(null); } return this.chartPanel; } private JToolBar getTopToolBar() { if (topToolBar == null) { topToolBar = new JToolBar(); topToolBar.setFloatable(false); topToolBar.add(getLoadFiles()); topToolBar.add(getResetButton()); topToolBar.add(getIzravnajButton()); topToolBar.add(getExtreemesButton()); topToolBar.add(getWaypointsButton()); topToolBar.add(getPreferencesButton()); topToolBar.add(getAboutButton()); topToolBar.add(getExitButton()); } return topToolBar; } private JButton getLoadFiles() { if (loadFiles == null) { loadFiles = new JButton(); loadFiles.setText(new Message(Messages.LOAD).toString()); loadFiles.setFont(GUIConstants.DIALOG_12); loadFiles.setIcon(new ImageIcon( getClass().getClassLoader().getResource("info/puzz/trackprofiler/icons/fldr_obj.gif"))); //$NON-NLS-1$ loadFiles.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { try { loadFilesActionPerformed(evt); } catch (TrackProfilerException e) { TrackProfilerFrame.this.showError(new Message(e.getMessage())); } } }); } return loadFiles; } private void loadFilesActionPerformed(ActionEvent evt) throws TrackProfilerException { JFileChooser chooser = null; if (this.folderWithTracks != null) { chooser = new JFileChooser(this.folderWithTracks); } else { chooser = new JFileChooser(); } TrackFileFilter filter = new TrackFileFilter(); filter.addExtension(PLT_EXTENSION); filter.addExtension(WPT_EXTENSION); filter.setDescription(new Message(Messages.PLT_AND_WPT_FILES).toString()); chooser.setFileFilter(filter); chooser.setMultiSelectionEnabled(true); int returnVal = chooser.showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { File[] selectedFiles = chooser.getSelectedFiles(); for (int i = 0; i < selectedFiles.length; i++) { File selectedFile = selectedFiles[i]; this.folderWithTracks = selectedFile.getParentFile(); if (selectedFile.getName().toLowerCase().endsWith("." + PLT_EXTENSION)) { //$NON-NLS-1$ try { loadTrack(selectedFile); } catch (FileNotFoundException e) { throw new TrackProfilerException( new Message(Messages.ERROR_WHEN_LOADING).toString() + selectedFile.getName()); } } } for (int i = 0; i < selectedFiles.length; i++) { File selectedFile = selectedFiles[i]; this.folderWithTracks = selectedFile.getParentFile(); if (selectedFile.getName().toLowerCase().endsWith("." + WPT_EXTENSION)) { //$NON-NLS-1$ try { loadWaypoints(selectedFile); } catch (FileNotFoundException e) { throw new TrackProfilerException( new Message(Messages.ERROR_WHEN_LOADING).toString() + selectedFile.getName()); } } } } } private void loadWaypoints(File selectedFile) throws FileNotFoundException, TrackProfilerException { this.waypointsFile = selectedFile; FileInputStream in = new FileInputStream(selectedFile); this.setWaypoints(TrackLoader.loadWaypoints(in)); } private void loadTrack(File selectedFile) throws FileNotFoundException, TrackProfilerException { this.trackFile = selectedFile; FileInputStream in = new FileInputStream(selectedFile); this.setTrack(TrackLoader.loadTrack(in)); } private JButton getResetButton() { if (resetButton == null) { resetButton = new JButton(); resetButton.setText(new Message(Messages.RESET).toString()); resetButton.setIcon(new ImageIcon( getClass().getClassLoader().getResource("info/puzz/trackprofiler/icons/undo_edit.gif"))); //$NON-NLS-1$ resetButton.setFont(GUIConstants.DIALOG_12); resetButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { try { resetButtonActionPerformed(evt); } catch (TrackProfilerException e) { TrackProfilerFrame.this.showError(new Message(e.getMessage())); //$NON-NLS-1$ } } }); } return resetButton; } private void resetButtonActionPerformed(ActionEvent evt) throws TrackProfilerException { try { if (this.trackFile == null) { throw new TrackProfilerException("track_not_loaded"); //$NON-NLS-1$ } this.loadTrack(this.trackFile); if (this.waypointsFile != null) { this.loadWaypoints(this.waypointsFile); } } catch (TrackProfilerException e) { throw e; } catch (FileNotFoundException e) { throw new TrackProfilerException("file_not_found!"); //$NON-NLS-1$ } this.getChartPanel().repaint(); } private JButton getIzravnajButton() { if (izravnajButton == null) { izravnajButton = new JButton(); izravnajButton.setText(new Message(Messages.SMOOTH).toString()); izravnajButton.setFont(GUIConstants.DIALOG_12); izravnajButton.setIcon(new ImageIcon( getClass().getClassLoader().getResource("info/puzz/trackprofiler/icons/curve.gif"))); //$NON-NLS-1$ izravnajButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { try { izravnajButtonActionPerformed(evt); } catch (TrackProfilerException e) { TrackProfilerFrame.this.showError(new Message(e.getMessage())); //$NON-NLS-1$ } } }); } return izravnajButton; } private void izravnajButtonActionPerformed(ActionEvent evt) throws TrackProfilerException { if (this.track == null) { throw new TrackProfilerException("track_not_loaded"); //$NON-NLS-1$ } // 2x: this.track.smoothTrack(); this.track.smoothTrack(); this.drawChart(); this.getTrackTable().setModel(new TrackTableModel(this)); } private JButton getExtreemesButton() { if (extreemesButton == null) { extreemesButton = new JButton(); extreemesButton.setText(new Message(Messages.EXTREMES).toString()); extreemesButton.setFont(GUIConstants.DIALOG_12); extreemesButton.setIcon(new ImageIcon( getClass().getClassLoader().getResource("info/puzz/trackprofiler/icons/minimum.gif"))); //$NON-NLS-1$ extreemesButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { try { extreemesButtonActionPerformed(evt); } catch (TrackProfilerException e) { TrackProfilerFrame.this.showError(new Message(e.getMessage())); } } }); } return extreemesButton; } private void extreemesButtonActionPerformed(ActionEvent evt) throws TrackProfilerException { if (this.track == null) { throw new TrackProfilerException("track_not_loaded"); //$NON-NLS-1$ } this.showExtreemes = !this.showExtreemes; this.drawChart(); } private JLabel getHiPointLabel() { if (hiPointLabel == null) { hiPointLabel = new JLabel(); hiPointLabel.setText(new Message(Messages.HIGHEST_POINT).toString()); hiPointLabel.setBounds(20, 55, 80, 20); hiPointLabel.setFont(GUIConstants.DIALOG_10); hiPointLabel.setHorizontalAlignment(SwingConstants.RIGHT); } return hiPointLabel; } private JTextField getHiPointField() { if (hiPointField == null) { hiPointField = new JTextField(); hiPointField.setBounds(100, 55, 70, 20); hiPointField.setEditable(false); } return hiPointField; } private JLabel getLowPointLabel() { if (lowPointLabel == null) { lowPointLabel = new JLabel(); lowPointLabel.setText(new Message(Messages.LOWEST_POINT).toString()); //$NON-NLS-1$ lowPointLabel.setFont(GUIConstants.DIALOG_10); lowPointLabel.setBounds(10, 30, 90, 20); lowPointLabel.setHorizontalAlignment(SwingConstants.RIGHT); } return lowPointLabel; } private JTextField getLowPointField() { if (lowPointField == null) { lowPointField = new JTextField(); lowPointField.setBounds(100, 30, 70, 20); lowPointField.setEditable(false); } return lowPointField; } private JLabel getClimbingSumLabel() { if (climbingSumLabel == null) { climbingSumLabel = new JLabel(); climbingSumLabel.setText(new Message(Messages.UPHILL_SUM).toString()); climbingSumLabel.setFont(GUIConstants.DIALOG_10); climbingSumLabel.setBounds(10, 80, 90, 20); climbingSumLabel.setHorizontalAlignment(SwingConstants.RIGHT); } return climbingSumLabel; } private JLabel getDownhillSumLabel() { if (downhillSumLabel == null) { downhillSumLabel = new JLabel(); downhillSumLabel.setText(new Message(Messages.DOWNHILL_SUM).toString()); downhillSumLabel.setFont(GUIConstants.DIALOG_10); downhillSumLabel.setBounds(0, 105, 100, 20); downhillSumLabel.setHorizontalAlignment(SwingConstants.RIGHT); } return downhillSumLabel; } private JLabel getLength2dLabel() { if (length2dLabel == null) { length2dLabel = new JLabel(); length2dLabel.setText(new Message(Messages._2D_LENGTH).toString()); length2dLabel.setFont(GUIConstants.DIALOG_10); length2dLabel.setBounds(30, 130, 70, 20); length2dLabel.setHorizontalAlignment(SwingConstants.RIGHT); } return length2dLabel; } private JLabel getLength3dLabel() { if (length3dLabel == null) { length3dLabel = new JLabel(); length3dLabel.setText(new Message(Messages._3D_LENGTH).toString()); length3dLabel.setFont(GUIConstants.DIALOG_10); length3dLabel.setBounds(10, 155, 90, 20); length3dLabel.setHorizontalAlignment(SwingConstants.RIGHT); } return length3dLabel; } private JTextField getClimbingSumField() { if (climbingSumField == null) { climbingSumField = new JTextField(); climbingSumField.setBounds(100, 80, 70, 20); climbingSumField.setEditable(false); } return climbingSumField; } private JTextField getDownhillField() { if (downhillField == null) { downhillField = new JTextField(); downhillField.setBounds(100, 105, 70, 20); downhillField.setEditable(false); } return downhillField; } private JTextField getLength3DField() { if (length3DField == null) { length3DField = new JTextField(); length3DField.setBounds(100, 155, 70, 20); length3DField.setEditable(false); } return length3DField; } private JTextField getLength2DField() { if (length2DField == null) { length2DField = new JTextField(); length2DField.setBounds(100, 130, 70, 20); length2DField.setEditable(false); } return length2DField; } private JButton getExitButton() { if (exitButton == null) { exitButton = new JButton(); exitButton.setText(new Message(Messages.EXIT).toString()); exitButton.setIcon(new ImageIcon( getClass().getClassLoader().getResource("info/puzz/trackprofiler/icons/delete_edit.gif"))); //$NON-NLS-1$ exitButton.setFont(GUIConstants.DIALOG_12); exitButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { exitButtonActionPerformed(evt); } }); } return exitButton; } private JPanel getJPanel3() { if (jPanel3 == null) { jPanel3 = new JPanel(); jPanel3.setBorder(BorderFactory.createTitledBorder(new Message(Messages.TRACK_DETAILS).toString())); jPanel3.setLayout(null); jPanel3.setPreferredSize(new java.awt.Dimension(180, 185)); jPanel3.add(getClimbingSumLabel()); jPanel3.add(getHiPointField()); jPanel3.add(getLowPointLabel()); jPanel3.add(getLowPointField()); jPanel3.add(getDownhillSumLabel()); jPanel3.add(getLength2dLabel()); jPanel3.add(getLength3dLabel()); jPanel3.add(getClimbingSumField()); jPanel3.add(getDownhillField()); jPanel3.add(getLength3DField()); jPanel3.add(getLength2DField()); jPanel3.add(getHiPointLabel()); } return jPanel3; } private void exitButtonActionPerformed(ActionEvent evt) { this.close(); } private void rootWindowClosing(WindowEvent evt) { this.close(); } private void close() { this.setVisible(false); System.exit(1); } private JButton getPreferencesButton() { if (preferencesButton == null) { preferencesButton = new JButton(); preferencesButton.setText(new Message(Messages.PREFERENCES).toString()); preferencesButton.setIcon(new ImageIcon( getClass().getClassLoader().getResource("info/puzz/trackprofiler/icons/ok_st_obj.gif"))); //$NON-NLS-1$ preferencesButton.setFont(GUIConstants.DIALOG_12); preferencesButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { propertiesButtonActionPerformed(evt); } }); } return preferencesButton; } private void propertiesButtonActionPerformed(ActionEvent evt) { TrackProfilerPreferencesDialog trackProfilerPropertiesDialog = new TrackProfilerPreferencesDialog(this); trackProfilerPropertiesDialog.setModal(true); trackProfilerPropertiesDialog.setVisible(true); } private JButton getWaypointsButton() { if (waypointsButton == null) { waypointsButton = new JButton(); waypointsButton.setText(new Message(Messages.WAYPOINTS).toString()); waypointsButton.setFont(GUIConstants.DIALOG_12); waypointsButton.setIcon(new ImageIcon( getClass().getClassLoader().getResource("info/puzz/trackprofiler/icons/brkpi_obj.gif"))); //$NON-NLS-1$ waypointsButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { waypointsButtonActionPerformed(evt); } }); } return waypointsButton; } private void waypointsButtonActionPerformed(ActionEvent evt) { if (this.track == null) { this.showError(new Message(Messages.TRACK_NOT_LOADED)); return; } WaypointsTable table = new WaypointsTable(); table.setVisible(true); } private void showError(Message message) { JOptionPane.showMessageDialog(this, message.getLocalizedMessage(), new Message(Messages.ERROR).toString(), JOptionPane.WARNING_MESSAGE); } private JScrollPane getJScrollPane1() { if (jScrollPane1 == null) { jScrollPane1 = new JScrollPane(); jScrollPane1.setBorder(BorderFactory.createTitledBorder(Message.get(Messages.TRACK_POINTS))); jScrollPane1.setPreferredSize(new java.awt.Dimension(180, 260)); jScrollPane1.setViewportView(getTrackTable()); } return jScrollPane1; } private JTable getTrackTable() { if (trackTable == null) { trackTable = new JTable(); trackTable.setModel(new TrackTableModel(this)); trackTable.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent evt) { TrackProfilerFrame.this.setSelectedPoint(); } // public void mouseClicked(MouseEvent evt) { // TrackProfilerFrame.this.setSelectedPoint(); // } }); trackTable.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent evt) { TrackProfilerFrame.this.setSelectedPoint(); } }); } return trackTable; } /** Posebno oznacava tocku na track-u koja je oznacena u tablici. */ private void setSelectedPoint() { int[] _selectedPoints = this.getTrackTable().getSelectedRows(); if (_selectedPoints == null || _selectedPoints.length == 0) { this.startSelectedPoints = -1; this.endSelectedPoints = -1; } else { // Trazimo prvu i zadnju tocku: int _start = _selectedPoints[0]; int _end = _selectedPoints[_selectedPoints.length - 1]; if (_start == this.startSelectedPoints && _end == this.endSelectedPoints && _start == _end) { // Ako je odabrana samo jedna tocka - i to ona koja je otprije odabrana => micemo odabir this.startSelectedPoints = -1; this.endSelectedPoints = -1; } else { this.startSelectedPoints = _start; this.endSelectedPoints = _end; } } // Ako su tocke iste kao i stare => necemo prikazati na tablici: try { this.drawChart(); } catch (TrackProfilerException e) { this.showError(new Message(e.getMessage())); } } /** Vraca Dataset za crtanje grafa od trenutnog track-a. */ public AbstractXYDataset toDataset() { XYSeries xyseries = new XYSeries(new Message(Messages.TRACK_PROFILE).toString()); //$NON-NLS-1$ double ukupno = 0D; for (int i = 1; i < this.getTrack().size(); i++) { TrackPoint t1 = this.getTrack().getPointAt(i - 1); TrackPoint t2 = this.getTrack().getPointAt(i); // System.out.println( "Udaljenost:" + t1.distance( t2 ) ); ukupno = ukupno + t1.distance2D(t2); // Ne crta tocku ako je izmedju dvije posebno oznacene: if (i > this.startSelectedPoints && i < this.endSelectedPoints) { continue; } xyseries.add(ukupno, t1.getElevation()); } return new XYSeriesCollection(xyseries); } private JButton getAboutButton() { if (aboutButton == null) { aboutButton = new JButton(); aboutButton.setFont(GUIConstants.DIALOG_12); aboutButton.setIcon(new ImageIcon( getClass().getClassLoader().getResource("info/puzz/trackprofiler/icons/help_contents.gif"))); //$NON-NLS-1$ aboutButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { aboutButtonActionPerformed(evt); } }); aboutButton.setText(Message.get(Messages.ABOUT)); } return aboutButton; } private void aboutButtonActionPerformed(ActionEvent evt) { JOptionPane.showMessageDialog(this, Message.get(Messages.COPYRIGHT, TrackProfilerAppContext.PROGRAM_VERSION), Message.get(Messages.ABOUT), JOptionPane.INFORMATION_MESSAGE); } }