/* * Copyright 2013 Serdar. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.fub.maps.gpx.analysis.ui; import de.fub.agg2graph.gpseval.data.Waypoint; import de.fub.agg2graph.structs.GPSCalc; import de.fub.maps.gpx.analysis.models.GpxTrackSegmentStatistic; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.util.List; import org.jfree.chart.axis.ValueAxis; import org.jfree.data.xy.XYSeries; import org.netbeans.api.settings.ConvertAsProperties; import org.openide.nodes.Node; import org.openide.util.NbBundle; import org.openide.windows.TopComponent; /** * Top component which displays something. */ @ConvertAsProperties( dtd = "-//de.fub.mapsforge.gpx.analysis.ui//GpxTrkSegAnalysizer//EN", autostore = false) public final class GpxTrkSegAnalysizerTopComponent extends TopComponent { private static final long serialVersionUID = 1L; private GpxTrackSegmentStatistic statistic; public GpxTrkSegAnalysizerTopComponent() { initComponents(); setName(NbBundle.getMessage(GpxTrkSegAnalysizerTopComponent.class, "CTL_GpxTrkSegAnalysizerTopComponent")); setToolTipText(NbBundle.getMessage(GpxTrkSegAnalysizerTopComponent.class, "HINT_GpxTrkSegAnalysizerTopComponent")); jSplitPane1.setDividerLocation(.75); int height = 0; for (Component child : jPanel3.getComponents()) { height += child.getPreferredSize().height; } jScrollPane1.getViewport().getView().setPreferredSize(new Dimension(0, height)); addComponentListener(new ComponentAdapterImpl()); init(); } public GpxTrkSegAnalysizerTopComponent(GpxTrackSegmentStatistic statistic) { this(); setStatistic(statistic); } private void init() { initCharts(); } public void setStatistic(GpxTrackSegmentStatistic statistic) { this.statistic = statistic; this.statisticForm1.setNode(statistic == null ? Node.EMPTY : statistic.getNodeDelegate()); updateCharts(); } private void updateCharts() { // get chat data sets XYSeries velocityDataset = velocityChart.getDataset(); velocityDataset.clear(); XYSeries accelerationDataset = accelerationChart.getDataset(); accelerationDataset.clear(); XYSeries headingDataset = headingChart.getDataset(); headingDataset.clear(); if (statistic != null) { // get track List<Waypoint> trackSegment = statistic.getTrackSegment(); Waypoint secondLastWayPoint = null; Waypoint lastWaypoint = null; double totalDistance = 0; Double lastVelocity = null; for (Waypoint waypoint : trackSegment) { if (lastWaypoint != null && lastWaypoint.getTimestamp() != null && waypoint.getTimestamp() != null && Math.abs(lastWaypoint.getTimestamp().getTime() - waypoint.getTimestamp().getTime()) > 0) { double velocity = 0; double acceleration = 0; double distance = GPSCalc.getDistVincentyFast( lastWaypoint.getLat(), lastWaypoint.getLon(), waypoint.getLat(), waypoint.getLon()); double timeDiff = (waypoint.getTimestamp().getTime() - lastWaypoint.getTimestamp().getTime()) / 1000d; if (timeDiff > 0) { velocity = (distance / timeDiff); totalDistance += distance; velocityDataset.addOrUpdate(totalDistance, velocity * 3.6); if (lastVelocity != null) { acceleration = (velocity - lastVelocity) / timeDiff; accelerationDataset.addOrUpdate(totalDistance, acceleration); } else { accelerationDataset.addOrUpdate(totalDistance, 0); } } lastVelocity = velocity; if (secondLastWayPoint != null) { double heading = GPSCalc.computeHeading(secondLastWayPoint, lastWaypoint, waypoint); headingDataset.addOrUpdate(totalDistance, heading); } } secondLastWayPoint = lastWaypoint; lastWaypoint = waypoint; } } } private void initCharts() { // set chart titles velocityChart.setTitle(NbBundle.getMessage(GpxTrkSegAnalysizerTopComponent.class, "GpxTrkSegAnalysizerTopComponent.velocity.chart.name")); accelerationChart.setTitle(NbBundle.getMessage(GpxTrkSegAnalysizerTopComponent.class, "GpxTrkSegAnalysizerTopComponent.acceleration.chart.name")); headingChart.setTitle(NbBundle.getMessage(GpxTrkSegAnalysizerTopComponent.class, "GpxTrkSegAnalysizerTopComponent.heading.chart.name")); // config domain axis ValueAxis domainAxis = velocityChart.getDomainAxis(); domainAxis.setLabel(NbBundle.getMessage(GpxTrkSegAnalysizerTopComponent.class, "GpxTrkSegAnalysizerTopComponent.velocity.chart.domainaxis.name")); domainAxis = accelerationChart.getDomainAxis(); domainAxis.setLabel(NbBundle.getMessage(GpxTrkSegAnalysizerTopComponent.class, "GpxTrkSegAnalysizerTopComponent.acceleration.chart.domainaxis.name")); domainAxis = headingChart.getDomainAxis(); domainAxis.setLabel(NbBundle.getMessage(GpxTrkSegAnalysizerTopComponent.class, "GpxTrkSegAnalysizerTopComponent.heading.chart.domainaxis.name")); // confing value axis ValueAxis rangeAxis = velocityChart.getRangeAxis(); rangeAxis.setLabel(NbBundle.getMessage(GpxTrkSegAnalysizerTopComponent.class, "GpxTrkSegAnalysizerTopComponent.velocity.chart.valueaxis.name")); rangeAxis = accelerationChart.getRangeAxis(); rangeAxis.setLabel(NbBundle.getMessage(GpxTrkSegAnalysizerTopComponent.class, "GpxTrkSegAnalysizerTopComponent.acceleration.chart.valueaxis.name")); rangeAxis = headingChart.getRangeAxis(); rangeAxis.setLabel(NbBundle.getMessage(GpxTrkSegAnalysizerTopComponent.class, "GpxTrkSegAnalysizerTopComponent.heading.chart.valueaxis.name")); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { filler3 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767)); jPanel1 = new javax.swing.JPanel(); jSplitPane1 = new javax.swing.JSplitPane(); jPanel2 = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); jPanel3 = new javax.swing.JPanel(); velocityChart = new de.fub.maps.gpx.analysis.ui.charts.ChartPanelComponent(); filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 8), new java.awt.Dimension(0, 8), new java.awt.Dimension(32767, 8)); accelerationChart = new de.fub.maps.gpx.analysis.ui.charts.ChartPanelComponent(); filler4 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 8), new java.awt.Dimension(0, 8), new java.awt.Dimension(32767, 8)); headingChart = new de.fub.maps.gpx.analysis.ui.charts.ChartPanelComponent(); statisticForm1 = new de.fub.maps.gpx.analysis.ui.StatisticForm(); setLayout(new java.awt.BorderLayout()); jPanel1.setLayout(new java.awt.BorderLayout()); jSplitPane1.setDividerLocation(700); jSplitPane1.setResizeWeight(1.0); jPanel2.setPreferredSize(new java.awt.Dimension(400, 479)); jPanel2.setLayout(new java.awt.BorderLayout()); jScrollPane1.setAutoscrolls(true); jPanel3.setBackground(new java.awt.Color(255, 255, 255)); jPanel3.setAutoscrolls(true); jPanel3.setMinimumSize(new java.awt.Dimension(100, 300)); jPanel3.setPreferredSize(new java.awt.Dimension(0, 0)); jPanel3.setLayout(new javax.swing.BoxLayout(jPanel3, javax.swing.BoxLayout.Y_AXIS)); velocityChart.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 204, 204))); velocityChart.setMaximumSize(new java.awt.Dimension(2147483647, 300)); velocityChart.setMinimumSize(new java.awt.Dimension(100, 300)); jPanel3.add(velocityChart); jPanel3.add(filler1); accelerationChart.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 204, 204))); accelerationChart.setMaximumSize(new java.awt.Dimension(2147483647, 300)); accelerationChart.setMinimumSize(new java.awt.Dimension(100, 300)); accelerationChart.setPreferredSize(new java.awt.Dimension(875, 300)); jPanel3.add(accelerationChart); jPanel3.add(filler4); jPanel3.add(headingChart); jScrollPane1.setViewportView(jPanel3); jPanel2.add(jScrollPane1, java.awt.BorderLayout.CENTER); jSplitPane1.setLeftComponent(jPanel2); statisticForm1.setPreferredSize(new java.awt.Dimension(400, 412)); jSplitPane1.setRightComponent(statisticForm1); jPanel1.add(jSplitPane1, java.awt.BorderLayout.CENTER); add(jPanel1, java.awt.BorderLayout.CENTER); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private de.fub.maps.gpx.analysis.ui.charts.ChartPanelComponent accelerationChart; private javax.swing.Box.Filler filler1; private javax.swing.Box.Filler filler3; private javax.swing.Box.Filler filler4; private de.fub.maps.gpx.analysis.ui.charts.ChartPanelComponent headingChart; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JSplitPane jSplitPane1; private de.fub.maps.gpx.analysis.ui.StatisticForm statisticForm1; private de.fub.maps.gpx.analysis.ui.charts.ChartPanelComponent velocityChart; // End of variables declaration//GEN-END:variables @Override public void componentOpened() { // TODO add custom code on component opening } @Override public void componentClosed() { // TODO add custom code on component closing } @Override public int getPersistenceType() { return TopComponent.PERSISTENCE_NEVER; } void writeProperties(java.util.Properties p) { // better to version settings since initial version as advocated at // http://wiki.apidesign.org/wiki/PropertyFiles p.setProperty("version", "1.0"); // TODO store your settings } void readProperties(java.util.Properties p) { String version = p.getProperty("version"); // TODO read your settings according to their version } private class ComponentAdapterImpl extends ComponentAdapter { public ComponentAdapterImpl() { } @Override public void componentResized(ComponentEvent e) { int width = (int) (getSize().getWidth() * .66); jSplitPane1.getLeftComponent().setMinimumSize(new Dimension(width, 0)); int dividerLocation = jSplitPane1.getDividerLocation(); if (dividerLocation < width) { jSplitPane1.setDividerLocation(.66); } } } }