Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/BBTracker.java =================================================================== --- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/BBTracker.java (revision 109) +++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/BBTracker.java (working copy) @@ -132,6 +132,15 @@ public static Timer getTimer() { return instance.timer; } + + public void resetApp(){ + firstStart = true; + try { + startApp(); + } catch (MIDletStateChangeException e) { + e.printStackTrace(); + } + } public static void nonFatal(final Throwable t, final String action, final Displayable next) { log(BBTracker.class, t, "non-fatal " + action); Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/FileTrackStore.java =================================================================== --- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/FileTrackStore.java (revision 109) +++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/FileTrackStore.java (working copy) @@ -139,7 +139,9 @@ } private String getTrackDirectory() throws TrackStoreException { + //Updated 2007 SIB to store in BBT Directory final String dir = Preferences.getInstance().getTrackDirectory(); + //End Update 2007 SIB if (dir == null) { throw new TrackStoreException("No track directory set, please configure it on the options screen!"); } Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/Preferences.java =================================================================== --- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/Preferences.java (revision 109) +++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/Preferences.java (working copy) @@ -95,6 +95,10 @@ private int detailsFontSize = Font.SIZE_MEDIUM; private String trackDirectory; + + //Added 2007 SIB + private String exportDirectory; + //End Added 2007 SIB private UnitConverter unitConverter; @@ -120,6 +124,12 @@ public String getTrackDirectory() { return trackDirectory; } + + //Added 2007 SIB + public String getExportDirectory() { + return exportDirectory; + } + //End Added 2007 SIB public void setTrackDirectory(final String trackDirectory) { if (trackDirectory == null || trackDirectory.length() == 0) { @@ -131,6 +141,19 @@ } } } + + //Added 2007 SIB + public void setExportDirectory(final String exportDirectory) { + if (exportDirectory == null || exportDirectory.length() == 0) { + this.exportDirectory = null; + } else { + this.exportDirectory = exportDirectory; + if (!this.exportDirectory.endsWith("/")) { + this.exportDirectory += "/"; + } + } + } + //End Added 2007 SIB public void setExportFormat(final int index, final boolean value) { if (index >= EXPORT_FORMATS.length || index < 0) { @@ -220,11 +243,18 @@ startAction = in.readShort(); sampleInterval = in.readInt(); trackNumber = in.readInt(); - if (in.readByte() != 0) { + if (in.readByte() == 1) { trackDirectory = in.readUTF(); } else { trackDirectory = null; } + //Added 2007 SIB + if (in.readByte() == 3) { + exportDirectory = in.readUTF(); + } else { + exportDirectory = null; + } + //End Added 2007 SIB exportFormats = in.readInt(); units = in.readInt(); statusFontSize = in.readInt(); @@ -268,11 +298,24 @@ out.writeShort(startAction); out.writeInt(sampleInterval); out.writeInt(trackNumber); - if (trackDirectory == null) { - out.writeByte(0); - } else { + if (trackDirectory == null && exportDirectory != null){ out.writeByte(1); + out.writeUTF(exportDirectory); + out.writeByte(3); + out.writeUTF(exportDirectory); + } else if (trackDirectory != null & exportDirectory == null){ + out.writeByte(1); out.writeUTF(trackDirectory); + out.writeByte(3); + out.writeUTF(trackDirectory); + } else if (trackDirectory != null && exportDirectory != null){ + out.writeByte(1); + out.writeUTF(trackDirectory); + out.writeByte(3); + out.writeUTF(exportDirectory); + } else { + out.writeByte(0); + out.writeByte(2); } out.writeInt(exportFormats); out.writeInt(units); Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/StatusTile.java =================================================================== --- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/StatusTile.java (revision 109) +++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/StatusTile.java (working copy) @@ -67,6 +67,7 @@ private int pointWidth; + private boolean twoLineLayout = true; public StatusTile(final TrackManager manager) { @@ -123,6 +124,7 @@ float courseValue = Float.NaN; float elevationValue = Float.NaN; double lengthValue = Double.NaN; + String timeString = "-"; if (p != null) { lonValue = p.getLongitude(); latValue = p.getLatitude(); @@ -132,8 +134,12 @@ } if (track != null) { lengthValue = track.getLength(); + if (p != null) { + final long offset = track.getPointOffset(p); + timeString = Utils.durationToString(offset); + } } - + final String lon = Utils.longitudeToString(lonValue); final String lat = Utils.latitudeToString(latValue); final String course = Utils.courseToHeadingString(courseValue); @@ -170,20 +176,28 @@ int lengthY; final int pointX; int pointY; + int timeY; if (twoLineLayout) { lengthX = width - MARGIN; lengthY = line1; pointX = lengthX; pointY = line2; + timeY = line2; } else { lengthX = width / 2; lengthY = line2 + font.getHeight(); pointX = width - MARGIN; pointY = lengthY; + //Added 2007 SIB + timeY = lengthY; + //End Added 2007 SIB } g.drawString(length, lengthX, lengthY, Graphics.TOP | Graphics.RIGHT); g.drawString(point, pointX, pointY, Graphics.TOP | Graphics.RIGHT); + //Added 2007 SIB + g.drawString(timeString, 1, timeY, Graphics.TOP | Graphics.LEFT); + //End Added 2007 SIB } public void showNotify() { Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/DetailsTile.java =================================================================== --- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/DetailsTile.java (revision 109) +++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/DetailsTile.java (working copy) @@ -45,6 +45,8 @@ private static final String DISTANCE_LABEL = "Distance: "; private static final String SPEED_LABEL = "Speed: "; + + private static final String PACE_LABEL = "Pace: "; private static final String POINT_LABEL = "Point: "; @@ -74,6 +76,7 @@ updateLabeWidth(SPEED_LABEL); updateLabeWidth(POINT_LABEL); updateLabeWidth(NAME_LABEL); + updateLabeWidth(PACE_LABEL); } private void updateLabeWidth(final String label) { Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/TracksForm.java =================================================================== --- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/TracksForm.java (revision 109) +++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/TracksForm.java (working copy) @@ -135,7 +135,7 @@ BBTracker.getInstance().showMainCanvas(); } else if (command == exportCommand) { final Preferences preferences = Preferences.getInstance(); - final String dir = preferences.getTrackDirectory(); + final String dir = preferences.getExportDirectory(); if (dir == null) { final Alert alert = new Alert("No track directory defined!", "Please define an export directory in the options screen.", null, AlertType.WARNING); Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/SummaryTile.java =================================================================== --- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/SummaryTile.java (revision 0) +++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/SummaryTile.java (revision 0) @@ -0,0 +1,196 @@ +/* + * Copyright 2007 SIB + * Copyright 2007 Joachim Sauer + * + * This file is part of bbTracker. + * + * bbTracker is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * bbTracker 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, see . + */ +package org.bbtracker.mobile.gui; + +import java.util.Date; + +import javax.microedition.lcdui.Font; +import javax.microedition.lcdui.Graphics; + +import org.bbtracker.Track; +import org.bbtracker.TrackPoint; +import org.bbtracker.UnitConverter; +import org.bbtracker.Utils; +import org.bbtracker.mobile.Preferences; +import org.bbtracker.mobile.TrackManager; + +public class SummaryTile extends Tile { + + private static final String MAX_ELEVATION_LABEL = "Max Elev: "; + + private static final String MIN_ELEVATION_LABEL = "Min Elev: "; + + private static final String GAIN_ELEVATION_LABEL = "Total Gain: "; + + private static final String TIME_LABEL = "Time: "; + + private static final String START_TIME_LABEL = "Start Time: "; + + private static final String END_TIME_LABEL = "End Time: "; + + private static final String DISTANCE_LABEL = "Distance: "; + + private static final String MAX_SPEED_LABEL = "Max Speed: "; + + private static final String AVG_SPEED_LABEL = "Avg Speed: "; + + private static final String POINTS_LABEL = "Points: "; + + private static final String NAME_LABEL = "Name: "; + + private static final int MARGIN = 2; + + private final TrackManager manager; + + private Font font; + + private int labelWidth; + + public SummaryTile(final TrackManager manager) { + this.manager = manager; + setFontSize(Font.SIZE_SMALL); + } + + private void setFontSize(final int fontSize) { + font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, fontSize); + labelWidth = 0; + updateLabeWidth(MAX_ELEVATION_LABEL); + updateLabeWidth(MIN_ELEVATION_LABEL); + updateLabeWidth(GAIN_ELEVATION_LABEL); + updateLabeWidth(TIME_LABEL); + updateLabeWidth(START_TIME_LABEL); + updateLabeWidth(END_TIME_LABEL); + updateLabeWidth(DISTANCE_LABEL); + updateLabeWidth(MAX_SPEED_LABEL); + updateLabeWidth(AVG_SPEED_LABEL); + updateLabeWidth(POINTS_LABEL); + updateLabeWidth(NAME_LABEL); + } + + private void updateLabeWidth(final String label) { + final int w = font.stringWidth(label); + if (w > labelWidth) { + labelWidth = w; + } + } + + protected void doPaint(final Graphics g) { + final Track track = manager.getTrack(); + + g.setColor(0x00ffffff); + g.fillRect(0, 0, width, height); + g.setColor(0x00000000); + g.setFont(font); + + float avgspeedValue = Float.NaN; + float avgmovingspeedValue = Float.NaN; + float maxspeedValue = Float.NaN; + float maxelevationValue = Float.NaN; + float minelevationValue = Float.NaN; + float gainelevationValue = Float.NaN; + double lengthValue = Double.NaN; + int pointcountValue = 0; + int pointcountEndTime = 0; + String timeString = "-"; + String pointendTime = "-"; + String pointstartTime = "-"; + String points = "-"; + if (track != null) { + lengthValue = track.getLength(); + maxspeedValue = track.getMaxSpeed(); + avgspeedValue = track.getAvgSpeed(); + avgmovingspeedValue = track.getAvgMovingSpeed(); + maxelevationValue = track.getMaxElevation(); + minelevationValue = track.getMinElevation(); + gainelevationValue = track.getElevationGain(); + pointcountValue = track.getPointCount(); + points = pointcountValue + ""; + if (track.getPointCount() > 0) { + final TrackPoint lastPoint = track.getPoint(track.getPointCount() - 1); + final long duration = track.getPointOffset(lastPoint); + timeString = Utils.durationToString(duration); + pointcountEndTime = track.getPointCount() - 1; + TrackPoint pEnd = track.getPoint(pointcountEndTime); + pointendTime = new Date(pEnd.getTimestamp()).toString().substring(11, 19); + TrackPoint pStart = track.getPoint(0); + pointstartTime = new Date(pStart.getTimestamp()).toString().substring(11, 19); + } + } + + final String trackName; + if (track == null) { + trackName = "-"; + } else { + if (manager.getState() == TrackManager.STATE_STATIC) { + trackName = track.getName() + " (static)"; + } else { + trackName = track.getName(); + } + } + + final UnitConverter unit = Preferences.getInstance().getUnitsConverter(); + final String maxspeed = unit.speedToString(maxspeedValue); + final String avgspeed = unit.speedToString(avgspeedValue) + " (" + unit.speedToString(avgmovingspeedValue) + ")"; + final String maxelevation = unit.elevationToString(maxelevationValue); + final String minelevation = unit.elevationToString(minelevationValue); + final String gainelevation = unit.elevationToString(gainelevationValue); + final String length = unit.distanceToString(lengthValue); + + final int fontHeight = font.getHeight(); + final int x = MARGIN + labelWidth; + int y = MARGIN; + + g.drawString(NAME_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT); + g.drawString(trackName, x, y, Graphics.TOP | Graphics.LEFT); + y += fontHeight; + g.drawString(POINTS_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT); + g.drawString(points, x, y, Graphics.TOP | Graphics.LEFT); + y += fontHeight; + g.drawString(DISTANCE_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT); + g.drawString(length, x, y, Graphics.TOP | Graphics.LEFT); + y += fontHeight; + g.drawString(START_TIME_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT); + g.drawString(pointstartTime, x, y, Graphics.TOP | Graphics.LEFT); + y += fontHeight; + g.drawString(END_TIME_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT); + g.drawString(pointendTime, x, y, Graphics.TOP | Graphics.LEFT); + y += fontHeight; + g.drawString(TIME_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT); + g.drawString(timeString, x, y, Graphics.TOP | Graphics.LEFT); + y += fontHeight * 2; + g.drawString(MAX_SPEED_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT); + g.drawString(maxspeed, x, y, Graphics.TOP | Graphics.LEFT); + y += fontHeight; + g.drawString(AVG_SPEED_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT); + g.drawString(avgspeed, x, y, Graphics.TOP | Graphics.LEFT); + y += fontHeight * 2; + g.drawString(MAX_ELEVATION_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT); + g.drawString(maxelevation, x, y, Graphics.TOP | Graphics.LEFT); + y += fontHeight; + g.drawString(MIN_ELEVATION_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT); + g.drawString(minelevation, x, y, Graphics.TOP | Graphics.LEFT); + y += fontHeight; + g.drawString(GAIN_ELEVATION_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT); + g.drawString(gainelevation, x, y, Graphics.TOP | Graphics.LEFT); + } + + public void showNotify() { + setFontSize(Preferences.getInstance().getDetailsFontSize()); + } +} \ No newline at end of file Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/OptionsForm.java =================================================================== --- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/OptionsForm.java (revision 109) +++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/OptionsForm.java (working copy) @@ -50,13 +50,19 @@ private final Command cancelCommand; private final Command browseCommand; + + //Added 2007 SIB + private final Command browseExportCommand; + private final TextField exportdirectoryField; + //End Added 2007 SIB + private final TextField sampleField; private final ChoiceGroup startTypeGroup; private final TextField directoryField; - + private final ChoiceGroup exportFormatGroup; private final ChoiceGroup unitsGroup; @@ -97,11 +103,18 @@ browseCommand = new Command("Browse", Command.ITEM, 1); directoryField.setDefaultCommand(browseCommand); directoryField.setItemCommandListener(this); - + exportFormatGroup = new ChoiceGroup("Export to: ", Choice.MULTIPLE, Preferences.EXPORT_FORMATS, null); for (int i = 0; i < Preferences.EXPORT_FORMATS.length; i++) { exportFormatGroup.setSelectedIndex(i, pref.getExportFormat(i)); } + + //Added 2007 SIB + exportdirectoryField = new TextField("Export directory: ", pref.getExportDirectory(), 100, TextField.URL); + browseExportCommand = new Command("Browse", Command.ITEM, 1); + exportdirectoryField.setDefaultCommand(browseExportCommand); + exportdirectoryField.setItemCommandListener(this); + //End Added 2007 SIB append(sampleField); append(unitsGroup); @@ -109,8 +122,13 @@ append(detailsFontSizeGroup); append(startTypeGroup); append(directoryField); + //Added 2007 SIB + append(""); + append(exportdirectoryField); + append(""); + //End Added 2007 SIB append(exportFormatGroup); - + okCommand = new Command("OK", Command.OK, 0); cancelCommand = new Command("Cancel", Command.CANCEL, 1); @@ -185,9 +203,26 @@ private String validatePreferences() { final String trackDir = directoryField.getString(); + //Added 2007 SIB + final String exportDir = exportdirectoryField.getString(); + //End Added 2007 SIB if (trackDir == null || trackDir.length() == 0) { - return "No track directory has been selected!"; - } else { + if (exportDir == null || exportDir.length()== 0){ + return "No directories have been selected!"; + } else { + return "No Track Directory has been selected! The Export Directory will be used! (" + exportDir + ")"; + } + //Added 2007 SIB + }else if (exportDir == null || exportDir.length()== 0){ + if (trackDir == null || trackDir.length() == 0){ + return "No directories have been selected!"; + } else { + return "No Export Directory has been selected! The Track Directory will be used! (" + trackDir + ")"; + } + // End Added 2007 SIB + // Updated 2007 SIB + } else if (trackDir != null){ + // End Updated 2007 SIB FileConnection connection = null; try { connection = (FileConnection) Connector.open("file:///" + trackDir, Connector.READ); @@ -211,7 +246,33 @@ } } } + //Added 2007 SIB + } else if (exportDir != null){ + FileConnection connection = null; + try { + connection = (FileConnection) Connector.open("file:///" + exportDir, Connector.READ); + if (!connection.exists()) { + return "The directory identified by <" + exportDir + "> does not exist."; + } else if (!connection.isDirectory()) { + return "The file identified by <" + exportDir + "> is not a directory."; + } else if (!connection.canWrite()) { + return "The directory identified by <" + exportDir + "> is not writeable."; + } + } catch (final IOException e) { + return "Could not verify track directory <" + exportDir + ">: " + e.getMessage(); + } catch (final IllegalArgumentException e) { + return "Malformed track directory <" + exportDir + ">!"; + } finally { + if (connection != null) { + try { + connection.close(); + } catch (final IOException ignored) { + // ignore + } + } + } } + //End Added 2007 SIB return null; } @@ -228,6 +289,7 @@ } pref.setStartAction(startTypeGroup.getSelectedIndex()); pref.setTrackDirectory(directoryField.getString()); + pref.setExportDirectory(exportdirectoryField.getString()); BBTracker.initLog(); for (int i = 0; i < Preferences.EXPORT_FORMATS.length; i++) { @@ -251,7 +313,7 @@ public void commandAction(final Command command, final Item item) { if (command == browseCommand) { - final BrowseForm browser = new BrowseForm("Save Directory", directoryField.getString()); + final BrowseForm browser = new BrowseForm("Save Track Directory", directoryField.getString()); final Display display = BBTracker.getDisplay(); browser.setCallback(new Runnable() { @@ -266,5 +328,23 @@ }); display.setCurrent(browser); } + //Added 2007 SIB + if (command == browseExportCommand) { + final BrowseForm browser = new BrowseForm("Save Export Directory", exportdirectoryField.getString()); + final Display display = BBTracker.getDisplay(); + browser.setCallback(new Runnable() { + + public void run() { + final String selectedPath = browser.getPath(); + if (selectedPath != null) { + exportdirectoryField.setString(selectedPath); + } + display.setCurrent(OptionsForm.this); + } + + }); + display.setCurrent(browser); + } + //End Add 2007 SIB } } Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/MainCanvas.java =================================================================== --- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/MainCanvas.java (revision 109) +++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/MainCanvas.java (working copy) @@ -17,8 +17,12 @@ */ package org.bbtracker.mobile.gui; +import java.io.IOException; +import java.io.OutputStream; import java.util.TimerTask; +import javax.microedition.io.Connector; +import javax.microedition.io.file.FileConnection; import javax.microedition.lcdui.Alert; import javax.microedition.lcdui.AlertType; import javax.microedition.lcdui.Canvas; @@ -28,11 +32,16 @@ import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; +import org.bbtracker.Track; import org.bbtracker.TrackPoint; import org.bbtracker.mobile.BBTracker; +import org.bbtracker.mobile.Preferences; import org.bbtracker.mobile.TrackListener; import org.bbtracker.mobile.TrackManager; import org.bbtracker.mobile.TrackStore.TrackStoreException; +import org.bbtracker.mobile.exporter.GpxTrackExporter; +import org.bbtracker.mobile.exporter.KmlTrackExporter; +import org.bbtracker.mobile.exporter.TrackExporter; public class MainCanvas extends Canvas implements TrackListener, CommandListener { private static final int DEFAULT_STATUS_TIMEOUT = 5 * 1000; @@ -44,13 +53,15 @@ private final TrackManager manager; private final Tile trackTile; + + private final Tile paceTile; private final Tile elevationProfileTile; private final Tile speedProfileTile; private final StatusTile statusTile; - + private final Tile detailsTile; private final Command newTrackCommand; @@ -66,6 +77,18 @@ private final Command aboutCommand; private final Command exitCommand; + + //Added 2007 SIB + private final Tile summaryTile; + + private final Command exportCommand; + + private int canvasView = 0; + + private final Command detailsViewCommand; + + private final Command plotterViewCommand; + //End Added 2007 SIB private String statusMessage = null; @@ -81,14 +104,21 @@ speedProfileTile = new SpeedPlotterTile(manager, DataProvider.TIME); statusTile = new StatusTile(manager); detailsTile = new DetailsTile(manager); + summaryTile = new SummaryTile(manager); + paceTile = new PaceTile(manager); - switchViewCommand = new Command("Switch View", Command.SCREEN, 0); - newTrackCommand = new Command("New Track", Command.SCREEN, 1); - stopTrackingCommand = new Command("Stop tracking", Command.STOP, 2); - tracksCommand = new Command("Track Manager", Command.SCREEN, 3); + switchViewCommand = new Command("Switch View", Command.SCREEN, 11); + newTrackCommand = new Command("Start Track", Command.SCREEN, 1); + stopTrackingCommand = new Command("Stop Track", Command.STOP, 2); + tracksCommand = new Command("Tracks", Command.SCREEN, 3); optionsCommand = new Command("Options", Command.SCREEN, 4); aboutCommand = new Command("About", Command.SCREEN, 5); - exitCommand = new Command("Exit", Command.EXIT, 6); + //Added 2007 SIB + exportCommand = new Command("Export Track", Command.SCREEN, 0); + detailsViewCommand = new Command("Details View", Command.SCREEN, 9); + plotterViewCommand = new Command("Plotter View", Command.SCREEN, 9); + //End Added 2007 SIB + exitCommand = new Command("Exit", Command.EXIT, 11); addCommand(switchViewCommand); addCommand(newTrackCommand); @@ -96,6 +126,7 @@ addCommand(optionsCommand); addCommand(aboutCommand); addCommand(exitCommand); + addCommand(detailsViewCommand); setCommandListener(this); @@ -181,8 +212,17 @@ public void stateChanged(final int newState) { if (newState == TrackManager.STATE_TRACKING) { addCommand(stopTrackingCommand); + //Added 2007 SIB + removeCommand(exportCommand); + } else if (newState == TrackManager.STATE_STATIC){ + removeCommand(stopTrackingCommand); + addCommand(exportCommand); + //End Added 2007 SIB } else { removeCommand(stopTrackingCommand); + //Added 2007 SIB + removeCommand(exportCommand); + //End Added 2007 SIB } updateStatusText(newState); for (int i = 0; i < visibleTiles.length && visibleTiles[i] != null; i++) { @@ -203,24 +243,42 @@ } private void nextTileConfiguration() { - tileConfiguration = (tileConfiguration + 1) % 4; - switch (tileConfiguration) { - case 0: - setMainTile(trackTile, true); - setStatusMessage("Track view"); - break; - case 1: - setMainTile(elevationProfileTile, true); - setStatusMessage("Elevation over time"); - break; - case 2: - setMainTile(speedProfileTile, true); - setStatusMessage("Speed over time"); - break; - case 3: - setMainTile(detailsTile, false); - setStatusMessage("Details"); - break; + if (canvasView == 1){ + addCommand(plotterViewCommand); + removeCommand(detailsViewCommand); + tileConfiguration = (tileConfiguration + 1) % 3; + switch (tileConfiguration) { + case 0: + setMainTile(detailsTile, false); + setStatusMessage("Details"); + break; + case 1: + setMainTile(summaryTile, false); + setStatusMessage("Summary"); + break; + case 2: + setMainTile(paceTile, false); + setStatusMessage("Pace"); + break; + } + } else { + removeCommand(plotterViewCommand); + addCommand(detailsViewCommand); + tileConfiguration = (tileConfiguration + 1) % 3; + switch (tileConfiguration) { + case 0: + setMainTile(trackTile, true); + setStatusMessage("Track view"); + break; + case 1: + setMainTile(elevationProfileTile, true); + setStatusMessage("Elevation over time"); + break; + case 2: + setMainTile(speedProfileTile, true); + setStatusMessage("Speed over time"); + break; + } } } @@ -239,8 +297,15 @@ final int state = manager.getState(); if (state == TrackManager.STATE_TRACKING) { addCommand(stopTrackingCommand); - } else { + //Added 2007 SIB + removeCommand(exportCommand); + } else if (state == TrackManager.STATE_STATIC){ removeCommand(stopTrackingCommand); + addCommand(exportCommand); + //End Added 2007 SIB + }else { + removeCommand(stopTrackingCommand); + removeCommand(exportCommand); } updateStatusText(state); } @@ -249,7 +314,37 @@ if (command == exitCommand) { exitAction(); } else if (command == switchViewCommand) { - nextTileConfiguration(); + nextTileConfiguration(); + } else if (command == detailsViewCommand) { + canvasView = 1; + setMainTile(detailsTile, false); + setStatusMessage("Details"); + } else if (command == plotterViewCommand) { + canvasView = 0; + setMainTile(trackTile, true); + setStatusMessage("Track view"); + //Added 2007 SIB + }else if (command == exportCommand){ + final Preferences preferences = Preferences.getInstance(); + final String dir = preferences.getExportDirectory(); + final Track track = manager.getTrack(); + if (dir == null) { + final Alert alert = new Alert("No track directory defined!", + "Please define an export directory in the options screen.", null, AlertType.WARNING); + BBTracker.alert(alert, this); + return; + } + int count; + try { + count = exportTrack(dir, track); + } catch (final IOException e) { + BBTracker.nonFatal(e, "exporting track", this); + return; + } + final Alert alert = new Alert("Finished exporting", "The track " + track.getName() + + " has been exported successfully to " + count + " formats!", null, AlertType.INFO); + BBTracker.alert(alert, this); + //End Added 2007 SIB } else { final Displayable nextDisplayable; if (command == aboutCommand) { @@ -381,4 +476,48 @@ MainCanvas.this.repaint(); } } + + //Added 2007 SIB from code on TracksForm + private int exportTrack(final String dir, final Track track) throws IOException { + final Preferences pref = Preferences.getInstance(); + int exportCount = 0; + if (pref.getExportFormat(0)) { + export(dir, track, new KmlTrackExporter()); + exportCount++; + } + if (pref.getExportFormat(1)) { + export(dir, track, new GpxTrackExporter()); + exportCount++; + } + return exportCount; + } + + private void export(final String dir, final Track track, final TrackExporter exporter) throws IOException { + final String fileName = exporter.getFileName(track); + final String fullName = dir.endsWith("/") ? dir + fileName : dir + "/" + fileName; + FileConnection connection = null; + OutputStream out = null; + try { + connection = (FileConnection) Connector.open("file:///" + fullName, Connector.READ_WRITE); + connection.create(); + out = connection.openOutputStream(); + exporter.export(out, track); + } finally { + if (out != null) { + try { + out.close(); + } catch (final IOException ignored) { + // ignore + } + } + if (connection != null) { + try { + connection.close(); + } catch (final IOException ignored) { + // ignore + } + } + } + } + //End Added 2007 SIB } \ No newline at end of file Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/PaceTile.java =================================================================== --- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/PaceTile.java (revision 0) +++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/PaceTile.java (revision 0) @@ -0,0 +1,97 @@ +/* + * Copyright 2007 SIB + * Copyright 2007 Joachim Sauer + * + * This file is part of bbTracker. + * + * bbTracker is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * bbTracker 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, see . + */ +package org.bbtracker.mobile.gui; + +import javax.microedition.lcdui.*; + +import org.bbtracker.Track; +import org.bbtracker.TrackPoint; +import org.bbtracker.UnitConverter; +import org.bbtracker.Utils; +import org.bbtracker.mobile.Preferences; +import org.bbtracker.mobile.TrackManager; + +public class PaceTile extends Tile { + + private static final int MARGIN = 2; + + private final TrackManager manager; + + private Font font; + + public PaceTile(final TrackManager manager) { + this.manager = manager; + setFontSize(Font.SIZE_LARGE); + } + + private void setFontSize(final int fontSize) { + font = Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, fontSize); + } + + + protected void doPaint(final Graphics g) { + final Track track = manager.getTrack(); + + g.setColor(0x00ffffff); + g.fillRect(0, 0, width, height); + g.setColor(0x00000000); + g.setFont(font); + + double lengthValue = Double.NaN; + float speedValue = Float.NaN; + float avgspeedValue = Float.NaN; + long duration = 0; + String timeString = "-"; + if (track != null) { + lengthValue = track.getLength(); + avgspeedValue = track.getAvgSpeed(); + if (track.getPointCount() > 0) { + final TrackPoint lastPoint = track.getPoint(track.getPointCount() - 1); + duration = track.getPointOffset(lastPoint); + if (manager.getState() == TrackManager.STATE_TRACKING) { + speedValue = lastPoint.getSpeed(); + } else { + speedValue = track.getAvgSpeed(); + } + timeString = Utils.durationToString(duration); + } + } + + final UnitConverter unit = Preferences.getInstance().getUnitsConverter(); + final String length = unit.distanceToString(lengthValue); + final String pace = unit.paceToString(avgspeedValue); + final String speed = unit.speedToString(speedValue); + + final int fontHeight = font.getHeight(); + int x = (width/2); + int y = height/2 - ((fontHeight + MARGIN)*2); + + g.drawString(timeString, x, y, Graphics.TOP | Graphics.HCENTER); + y += fontHeight + MARGIN; + g.drawString(length, x, y, Graphics.TOP | Graphics.HCENTER); + y += fontHeight + MARGIN; + g.drawString(speed, x, y, Graphics.TOP | Graphics.HCENTER); + y += fontHeight + MARGIN; + g.drawString(pace, x, y, Graphics.TOP | Graphics.HCENTER); + y += fontHeight + MARGIN; + } + + public void showNotify() { + } +} \ No newline at end of file Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/exporter/KmlTrackExporter.java =================================================================== --- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/exporter/KmlTrackExporter.java (revision 109) +++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/exporter/KmlTrackExporter.java (working copy) @@ -63,6 +63,7 @@ final String maxElevString = unit.elevationToString(track.getMaxElevation()); final String minElevString = unit.elevationToString(track.getMinElevation()); final String maxSpeedString = unit.speedToString(track.getMaxSpeed()); + final String avgSpeedString = unit.speedToString(track.getAvgSpeed());; w = new OutputStreamWriter(out, "UTF-8"); w.write(XML_HEADER); @@ -93,6 +94,11 @@ w.write("Max Speed: "); w.write(maxSpeedString); w.write("\n"); + //Added New Field 2007 SIB + w.write("Average Speed: "); + w.write(avgSpeedString); + w.write("\n"); + //End Added SIB w.write("Max Elevation: "); w.write(maxElevString); w.write("\n");