Ticket #47: bbtracker_src_0415.txt

File bbtracker_src_0415.txt, 34.4 KB (added by sibion, 4 years ago)
Line 
1Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/BBTracker.java
2===================================================================
3--- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/BBTracker.java (revision 109)
4+++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/BBTracker.java (working copy)
5@@ -132,6 +132,15 @@
6        public static Timer getTimer() {
7                return instance.timer;
8        }
9+       
10+       public void resetApp(){
11+               firstStart = true;
12+               try {
13+                       startApp();
14+               } catch (MIDletStateChangeException e) {
15+                       e.printStackTrace();
16+               }
17+       }
18 
19        public static void nonFatal(final Throwable t, final String action, final Displayable next) {
20                log(BBTracker.class, t, "non-fatal " + action);
21Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/FileTrackStore.java
22===================================================================
23--- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/FileTrackStore.java    (revision 109)
24+++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/FileTrackStore.java    (working copy)
25@@ -139,7 +139,9 @@
26        }
27 
28        private String getTrackDirectory() throws TrackStoreException {
29+               //Updated 2007 SIB to store in BBT Directory
30                final String dir = Preferences.getInstance().getTrackDirectory();
31+               //End Update 2007 SIB
32                if (dir == null) {
33                        throw new TrackStoreException("No track directory set, please configure it on the options screen!");
34                }
35Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/Preferences.java
36===================================================================
37--- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/Preferences.java       (revision 109)
38+++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/Preferences.java       (working copy)
39@@ -95,6 +95,10 @@
40        private int detailsFontSize = Font.SIZE_MEDIUM;
41 
42        private String trackDirectory;
43+       
44+       //Added 2007 SIB
45+       private String exportDirectory;
46+       //End Added 2007 SIB
47 
48        private UnitConverter unitConverter;
49 
50@@ -120,6 +124,12 @@
51        public String getTrackDirectory() {
52                return trackDirectory;
53        }
54+       
55+       //Added 2007 SIB
56+       public String getExportDirectory() {
57+               return exportDirectory;
58+       }
59+       //End Added 2007 SIB
60 
61        public void setTrackDirectory(final String trackDirectory) {
62                if (trackDirectory == null || trackDirectory.length() == 0) {
63@@ -131,6 +141,19 @@
64                        }
65                }
66        }
67+       
68+       //Added 2007 SIB
69+       public void setExportDirectory(final String exportDirectory) {
70+               if (exportDirectory == null || exportDirectory.length() == 0) {
71+                       this.exportDirectory = null;
72+               } else {
73+                       this.exportDirectory = exportDirectory;
74+                       if (!this.exportDirectory.endsWith("/")) {
75+                               this.exportDirectory += "/";
76+                       }
77+               }
78+       }
79+       //End Added 2007 SIB
80 
81        public void setExportFormat(final int index, final boolean value) {
82                if (index >= EXPORT_FORMATS.length || index < 0) {
83@@ -220,11 +243,18 @@
84                                startAction = in.readShort();
85                                sampleInterval = in.readInt();
86                                trackNumber = in.readInt();
87-                               if (in.readByte() != 0) {
88+                               if (in.readByte() == 1) {
89                                        trackDirectory = in.readUTF();
90                                } else {
91                                        trackDirectory = null;
92                                }
93+                               //Added 2007 SIB
94+                               if (in.readByte() == 3) {
95+                                       exportDirectory = in.readUTF();
96+                               } else {
97+                                       exportDirectory = null;
98+                               }
99+                               //End Added 2007 SIB
100                                exportFormats = in.readInt();
101                                units = in.readInt();
102                                statusFontSize = in.readInt();
103@@ -268,11 +298,24 @@
104                        out.writeShort(startAction);
105                        out.writeInt(sampleInterval);
106                        out.writeInt(trackNumber);
107-                       if (trackDirectory == null) {
108-                               out.writeByte(0);
109-                       } else {
110+                       if (trackDirectory == null && exportDirectory != null){
111                                out.writeByte(1);
112+                               out.writeUTF(exportDirectory);
113+                               out.writeByte(3);
114+                               out.writeUTF(exportDirectory);
115+                       } else if (trackDirectory != null & exportDirectory == null){
116+                               out.writeByte(1);
117                                out.writeUTF(trackDirectory);
118+                               out.writeByte(3);
119+                               out.writeUTF(trackDirectory);
120+                       } else if (trackDirectory != null && exportDirectory != null){
121+                               out.writeByte(1);
122+                               out.writeUTF(trackDirectory);
123+                               out.writeByte(3);
124+                               out.writeUTF(exportDirectory);
125+                       } else {
126+                               out.writeByte(0);
127+                               out.writeByte(2);
128                        }
129                        out.writeInt(exportFormats);
130                        out.writeInt(units);
131Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/StatusTile.java
132===================================================================
133--- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/StatusTile.java    (revision 109)
134+++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/StatusTile.java    (working copy)
135@@ -67,6 +67,7 @@
136 
137        private int pointWidth;
138 
139+
140        private boolean twoLineLayout = true;
141 
142        public StatusTile(final TrackManager manager) {
143@@ -123,6 +124,7 @@
144                float courseValue = Float.NaN;
145                float elevationValue = Float.NaN;
146                double lengthValue = Double.NaN;
147+               String timeString = "-";
148                if (p != null) {
149                        lonValue = p.getLongitude();
150                        latValue = p.getLatitude();
151@@ -132,8 +134,12 @@
152                }
153                if (track != null) {
154                        lengthValue = track.getLength();
155+                       if (p != null) {
156+                               final long offset = track.getPointOffset(p);
157+                               timeString = Utils.durationToString(offset);
158+                       }
159                }
160-
161+               
162                final String lon = Utils.longitudeToString(lonValue);
163                final String lat = Utils.latitudeToString(latValue);
164                final String course = Utils.courseToHeadingString(courseValue);
165@@ -170,20 +176,28 @@
166                int lengthY;
167                final int pointX;
168                int pointY;
169+               int timeY;
170 
171                if (twoLineLayout) {
172                        lengthX = width - MARGIN;
173                        lengthY = line1;
174                        pointX = lengthX;
175                        pointY = line2;
176+                       timeY = line2;
177                } else {
178                        lengthX = width / 2;
179                        lengthY = line2 + font.getHeight();
180                        pointX = width - MARGIN;
181                        pointY = lengthY;
182+                       //Added 2007 SIB
183+                       timeY = lengthY;
184+                       //End Added 2007 SIB
185                }
186                g.drawString(length, lengthX, lengthY, Graphics.TOP | Graphics.RIGHT);
187                g.drawString(point, pointX, pointY, Graphics.TOP | Graphics.RIGHT);
188+               //Added 2007 SIB
189+               g.drawString(timeString, 1, timeY, Graphics.TOP | Graphics.LEFT);
190+               //End Added 2007 SIB
191        }
192 
193        public void showNotify() {
194Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/DetailsTile.java
195===================================================================
196--- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/DetailsTile.java   (revision 109)
197+++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/DetailsTile.java   (working copy)
198@@ -45,6 +45,8 @@
199        private static final String DISTANCE_LABEL = "Distance: ";
200 
201        private static final String SPEED_LABEL = "Speed: ";
202+       
203+       private static final String PACE_LABEL = "Pace: ";
204 
205        private static final String POINT_LABEL = "Point: ";
206 
207@@ -74,6 +76,7 @@
208                updateLabeWidth(SPEED_LABEL);
209                updateLabeWidth(POINT_LABEL);
210                updateLabeWidth(NAME_LABEL);
211+               updateLabeWidth(PACE_LABEL);
212        }
213 
214        private void updateLabeWidth(final String label) {
215Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/TracksForm.java
216===================================================================
217--- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/TracksForm.java    (revision 109)
218+++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/TracksForm.java    (working copy)
219@@ -135,7 +135,7 @@
220                                BBTracker.getInstance().showMainCanvas();
221                        } else if (command == exportCommand) {
222                                final Preferences preferences = Preferences.getInstance();
223-                               final String dir = preferences.getTrackDirectory();
224+                               final String dir = preferences.getExportDirectory();
225                                if (dir == null) {
226                                        final Alert alert = new Alert("No track directory defined!",
227                                                        "Please define an export directory in the options screen.", null, AlertType.WARNING);
228Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/SummaryTile.java
229===================================================================
230--- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/SummaryTile.java   (revision 0)
231+++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/SummaryTile.java   (revision 0)
232@@ -0,0 +1,196 @@
233+/*
234+ * Copyright 2007 SIB
235+ * Copyright 2007 Joachim Sauer
236+ *
237+ * This file is part of bbTracker.
238+ *
239+ * bbTracker is free software; you can redistribute it and/or modify
240+ * it under the terms of the GNU General Public License version 2 as
241+ * published by the Free Software Foundation.
242+ *
243+ * bbTracker is distributed in the hope that it will be useful,
244+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
245+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
246+ * GNU General Public License for more details.
247+ *
248+ * You should have received a copy of the GNU General Public License
249+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
250+ */
251+package org.bbtracker.mobile.gui;
252+
253+import java.util.Date;
254+
255+import javax.microedition.lcdui.Font;
256+import javax.microedition.lcdui.Graphics;
257+
258+import org.bbtracker.Track;
259+import org.bbtracker.TrackPoint;
260+import org.bbtracker.UnitConverter;
261+import org.bbtracker.Utils;
262+import org.bbtracker.mobile.Preferences;
263+import org.bbtracker.mobile.TrackManager;
264+
265+public class SummaryTile extends Tile {
266+
267+       private static final String MAX_ELEVATION_LABEL = "Max Elev: ";
268+       
269+       private static final String MIN_ELEVATION_LABEL = "Min Elev: ";
270+       
271+       private static final String GAIN_ELEVATION_LABEL = "Total Gain: ";
272+
273+       private static final String TIME_LABEL = "Time: ";
274+       
275+       private static final String START_TIME_LABEL = "Start Time: ";
276+       
277+       private static final String END_TIME_LABEL = "End Time: ";
278+
279+       private static final String DISTANCE_LABEL = "Distance: ";
280+
281+       private static final String MAX_SPEED_LABEL = "Max Speed: ";
282+       
283+       private static final String AVG_SPEED_LABEL = "Avg Speed: ";
284+       
285+       private static final String POINTS_LABEL = "Points: ";
286+
287+       private static final String NAME_LABEL = "Name: ";
288+
289+       private static final int MARGIN = 2;
290+
291+       private final TrackManager manager;
292+
293+       private Font font;
294+
295+       private int labelWidth;
296+
297+       public SummaryTile(final TrackManager manager) {
298+               this.manager = manager;
299+               setFontSize(Font.SIZE_SMALL);
300+       }
301+
302+       private void setFontSize(final int fontSize) {
303+               font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, fontSize);
304+               labelWidth = 0;
305+               updateLabeWidth(MAX_ELEVATION_LABEL);
306+               updateLabeWidth(MIN_ELEVATION_LABEL);
307+               updateLabeWidth(GAIN_ELEVATION_LABEL);
308+               updateLabeWidth(TIME_LABEL);
309+               updateLabeWidth(START_TIME_LABEL);
310+               updateLabeWidth(END_TIME_LABEL);
311+               updateLabeWidth(DISTANCE_LABEL);
312+               updateLabeWidth(MAX_SPEED_LABEL);
313+               updateLabeWidth(AVG_SPEED_LABEL);
314+               updateLabeWidth(POINTS_LABEL);
315+               updateLabeWidth(NAME_LABEL);
316+       }
317+
318+       private void updateLabeWidth(final String label) {
319+               final int w = font.stringWidth(label);
320+               if (w > labelWidth) {
321+                       labelWidth = w;
322+               }
323+       }
324+
325+       protected void doPaint(final Graphics g) {
326+               final Track track = manager.getTrack();
327+
328+               g.setColor(0x00ffffff);
329+               g.fillRect(0, 0, width, height);
330+               g.setColor(0x00000000);
331+               g.setFont(font);
332+
333+               float avgspeedValue = Float.NaN;
334+               float avgmovingspeedValue = Float.NaN;
335+               float maxspeedValue = Float.NaN;
336+               float maxelevationValue = Float.NaN;
337+               float minelevationValue = Float.NaN;
338+               float gainelevationValue = Float.NaN;
339+               double lengthValue = Double.NaN;
340+               int pointcountValue = 0;
341+               int pointcountEndTime = 0;
342+               String timeString = "-";
343+               String pointendTime = "-";
344+               String pointstartTime = "-";
345+               String points = "-";
346+               if (track != null) {
347+                       lengthValue = track.getLength();
348+                       maxspeedValue = track.getMaxSpeed();
349+                       avgspeedValue = track.getAvgSpeed();
350+                       avgmovingspeedValue = track.getAvgMovingSpeed();
351+                       maxelevationValue = track.getMaxElevation();
352+                       minelevationValue = track.getMinElevation();
353+                       gainelevationValue = track.getElevationGain();
354+                       pointcountValue = track.getPointCount();
355+                       points = pointcountValue + "";
356+                       if (track.getPointCount() > 0) {
357+                               final TrackPoint lastPoint = track.getPoint(track.getPointCount() - 1);
358+                               final long duration = track.getPointOffset(lastPoint);
359+                               timeString = Utils.durationToString(duration);
360+                               pointcountEndTime = track.getPointCount() - 1;
361+                               TrackPoint pEnd = track.getPoint(pointcountEndTime);
362+                               pointendTime = new Date(pEnd.getTimestamp()).toString().substring(11, 19);
363+                               TrackPoint pStart = track.getPoint(0);
364+                               pointstartTime = new Date(pStart.getTimestamp()).toString().substring(11, 19);
365+                       }
366+               }
367+               
368+               final String trackName;
369+               if (track == null) {
370+                       trackName = "-";
371+               } else {
372+                       if (manager.getState() == TrackManager.STATE_STATIC) {
373+                               trackName = track.getName() + " (static)";
374+                       } else {
375+                               trackName = track.getName();
376+                       }
377+               }
378+               
379+               final UnitConverter unit = Preferences.getInstance().getUnitsConverter();
380+               final String maxspeed = unit.speedToString(maxspeedValue);
381+               final String avgspeed = unit.speedToString(avgspeedValue) + " (" + unit.speedToString(avgmovingspeedValue) + ")";
382+               final String maxelevation = unit.elevationToString(maxelevationValue);
383+               final String minelevation = unit.elevationToString(minelevationValue);
384+               final String gainelevation = unit.elevationToString(gainelevationValue);
385+               final String length = unit.distanceToString(lengthValue);
386+
387+               final int fontHeight = font.getHeight();
388+               final int x = MARGIN + labelWidth;
389+               int y = MARGIN;
390+
391+               g.drawString(NAME_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT);
392+               g.drawString(trackName, x, y, Graphics.TOP | Graphics.LEFT);
393+               y += fontHeight;
394+               g.drawString(POINTS_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT);
395+               g.drawString(points, x, y, Graphics.TOP | Graphics.LEFT);
396+               y += fontHeight;
397+               g.drawString(DISTANCE_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT);
398+               g.drawString(length, x, y, Graphics.TOP | Graphics.LEFT);
399+               y += fontHeight;
400+               g.drawString(START_TIME_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT);
401+               g.drawString(pointstartTime, x, y, Graphics.TOP | Graphics.LEFT);
402+               y += fontHeight;
403+               g.drawString(END_TIME_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT);
404+               g.drawString(pointendTime, x, y, Graphics.TOP | Graphics.LEFT);
405+               y += fontHeight;
406+               g.drawString(TIME_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT);
407+               g.drawString(timeString, x, y, Graphics.TOP | Graphics.LEFT);
408+               y += fontHeight * 2;
409+               g.drawString(MAX_SPEED_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT);
410+               g.drawString(maxspeed, x, y, Graphics.TOP | Graphics.LEFT);
411+               y += fontHeight;
412+               g.drawString(AVG_SPEED_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT);
413+               g.drawString(avgspeed, x, y, Graphics.TOP | Graphics.LEFT);
414+               y += fontHeight * 2;
415+               g.drawString(MAX_ELEVATION_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT);
416+               g.drawString(maxelevation, x, y, Graphics.TOP | Graphics.LEFT);
417+               y += fontHeight;
418+               g.drawString(MIN_ELEVATION_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT);
419+               g.drawString(minelevation, x, y, Graphics.TOP | Graphics.LEFT);
420+               y += fontHeight;
421+               g.drawString(GAIN_ELEVATION_LABEL, MARGIN, y, Graphics.TOP | Graphics.LEFT);
422+               g.drawString(gainelevation, x, y, Graphics.TOP | Graphics.LEFT);
423+               }
424+
425+       public void showNotify() {
426+               setFontSize(Preferences.getInstance().getDetailsFontSize());
427+       }
428+}
429\ No newline at end of file
430Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/OptionsForm.java
431===================================================================
432--- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/OptionsForm.java   (revision 109)
433+++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/OptionsForm.java   (working copy)
434@@ -50,13 +50,19 @@
435        private final Command cancelCommand;
436 
437        private final Command browseCommand;
438+       
439+       //Added 2007 SIB
440+       private final Command browseExportCommand;
441 
442+       private final TextField exportdirectoryField;
443+       //End Added 2007 SIB
444+
445        private final TextField sampleField;
446 
447        private final ChoiceGroup startTypeGroup;
448 
449        private final TextField directoryField;
450-
451+               
452        private final ChoiceGroup exportFormatGroup;
453 
454        private final ChoiceGroup unitsGroup;
455@@ -97,11 +103,18 @@
456                browseCommand = new Command("Browse", Command.ITEM, 1);
457                directoryField.setDefaultCommand(browseCommand);
458                directoryField.setItemCommandListener(this);
459-
460+               
461                exportFormatGroup = new ChoiceGroup("Export to: ", Choice.MULTIPLE, Preferences.EXPORT_FORMATS, null);
462                for (int i = 0; i < Preferences.EXPORT_FORMATS.length; i++) {
463                        exportFormatGroup.setSelectedIndex(i, pref.getExportFormat(i));
464                }
465+               
466+               //Added 2007 SIB
467+               exportdirectoryField = new TextField("Export directory: ", pref.getExportDirectory(), 100, TextField.URL);
468+               browseExportCommand = new Command("Browse", Command.ITEM, 1);
469+               exportdirectoryField.setDefaultCommand(browseExportCommand);
470+               exportdirectoryField.setItemCommandListener(this);
471+               //End Added 2007 SIB
472 
473                append(sampleField);
474                append(unitsGroup);
475@@ -109,8 +122,13 @@
476                append(detailsFontSizeGroup);
477                append(startTypeGroup);
478                append(directoryField);
479+               //Added 2007 SIB
480+               append("");
481+               append(exportdirectoryField);
482+               append("");
483+               //End Added 2007 SIB
484                append(exportFormatGroup);
485-
486+               
487                okCommand = new Command("OK", Command.OK, 0);
488                cancelCommand = new Command("Cancel", Command.CANCEL, 1);
489 
490@@ -185,9 +203,26 @@
491 
492        private String validatePreferences() {
493                final String trackDir = directoryField.getString();
494+               //Added 2007 SIB
495+               final String exportDir = exportdirectoryField.getString();
496+               //End Added 2007 SIB
497                if (trackDir == null || trackDir.length() == 0) {
498-                       return "No track directory has been selected!";
499-               } else {
500+                       if (exportDir == null || exportDir.length()== 0){
501+                               return "No directories have been selected!";
502+                       } else {
503+                               return "No Track Directory has been selected! The Export Directory will be used! (" + exportDir + ")";
504+                       }
505+               //Added 2007 SIB
506+               }else if (exportDir == null || exportDir.length()== 0){
507+                       if (trackDir == null || trackDir.length() == 0){
508+                               return "No directories have been selected!";
509+                       } else {
510+                               return "No Export Directory has been selected! The Track Directory will be used! (" + trackDir + ")";
511+                       }
512+               // End Added 2007 SIB
513+               // Updated 2007 SIB
514+               } else if (trackDir != null){
515+               // End Updated 2007 SIB
516                        FileConnection connection = null;
517                        try {
518                                connection = (FileConnection) Connector.open("file:///" + trackDir, Connector.READ);
519@@ -211,7 +246,33 @@
520                                        }
521                                }
522                        }
523+               //Added 2007 SIB
524+               } else if (exportDir != null){
525+                       FileConnection connection = null;
526+                       try {
527+                               connection = (FileConnection) Connector.open("file:///" + exportDir, Connector.READ);
528+                               if (!connection.exists()) {
529+                                       return "The directory identified by <" + exportDir + "> does not exist.";
530+                               } else if (!connection.isDirectory()) {
531+                                       return "The file identified by <" + exportDir + "> is not a directory.";
532+                               } else if (!connection.canWrite()) {
533+                                       return "The directory identified by <" + exportDir + "> is not writeable.";
534+                               }
535+                       } catch (final IOException e) {
536+                               return "Could not verify track directory <" + exportDir + ">: " + e.getMessage();
537+                       } catch (final IllegalArgumentException e) {
538+                               return "Malformed track directory <" + exportDir + ">!";
539+                       } finally {
540+                               if (connection != null) {
541+                                       try {
542+                                               connection.close();
543+                                       } catch (final IOException ignored) {
544+                                               // ignore
545+                                       }
546+                               }
547+                       }
548                }
549+               //End Added 2007 SIB
550                return null;
551        }
552 
553@@ -228,6 +289,7 @@
554                        }
555                        pref.setStartAction(startTypeGroup.getSelectedIndex());
556                        pref.setTrackDirectory(directoryField.getString());
557+                       pref.setExportDirectory(exportdirectoryField.getString());
558                        BBTracker.initLog();
559 
560                        for (int i = 0; i < Preferences.EXPORT_FORMATS.length; i++) {
561@@ -251,7 +313,7 @@
562 
563        public void commandAction(final Command command, final Item item) {
564                if (command == browseCommand) {
565-                       final BrowseForm browser = new BrowseForm("Save Directory", directoryField.getString());
566+                       final BrowseForm browser = new BrowseForm("Save Track Directory", directoryField.getString());
567                        final Display display = BBTracker.getDisplay();
568                        browser.setCallback(new Runnable() {
569 
570@@ -266,5 +328,23 @@
571                        });
572                        display.setCurrent(browser);
573                }
574+               //Added 2007 SIB
575+               if (command == browseExportCommand) {
576+                       final BrowseForm browser = new BrowseForm("Save Export Directory", exportdirectoryField.getString());
577+                       final Display display = BBTracker.getDisplay();
578+                       browser.setCallback(new Runnable() {
579+
580+                               public void run() {
581+                                       final String selectedPath = browser.getPath();
582+                                       if (selectedPath != null) {
583+                                               exportdirectoryField.setString(selectedPath);
584+                                       }
585+                                       display.setCurrent(OptionsForm.this);
586+                               }
587+
588+                       });
589+                       display.setCurrent(browser);
590+               }
591+               //End Add 2007 SIB
592        }
593 }
594Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/MainCanvas.java
595===================================================================
596--- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/MainCanvas.java    (revision 109)
597+++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/MainCanvas.java    (working copy)
598@@ -17,8 +17,12 @@
599  */
600 package org.bbtracker.mobile.gui;
601 
602+import java.io.IOException;
603+import java.io.OutputStream;
604 import java.util.TimerTask;
605 
606+import javax.microedition.io.Connector;
607+import javax.microedition.io.file.FileConnection;
608 import javax.microedition.lcdui.Alert;
609 import javax.microedition.lcdui.AlertType;
610 import javax.microedition.lcdui.Canvas;
611@@ -28,11 +32,16 @@
612 import javax.microedition.lcdui.Font;
613 import javax.microedition.lcdui.Graphics;
614 
615+import org.bbtracker.Track;
616 import org.bbtracker.TrackPoint;
617 import org.bbtracker.mobile.BBTracker;
618+import org.bbtracker.mobile.Preferences;
619 import org.bbtracker.mobile.TrackListener;
620 import org.bbtracker.mobile.TrackManager;
621 import org.bbtracker.mobile.TrackStore.TrackStoreException;
622+import org.bbtracker.mobile.exporter.GpxTrackExporter;
623+import org.bbtracker.mobile.exporter.KmlTrackExporter;
624+import org.bbtracker.mobile.exporter.TrackExporter;
625 
626 public class MainCanvas extends Canvas implements TrackListener, CommandListener {
627        private static final int DEFAULT_STATUS_TIMEOUT = 5 * 1000;
628@@ -44,13 +53,15 @@
629        private final TrackManager manager;
630 
631        private final Tile trackTile;
632+       
633+       private final Tile paceTile;
634 
635        private final Tile elevationProfileTile;
636 
637        private final Tile speedProfileTile;
638 
639        private final StatusTile statusTile;
640-
641+       
642        private final Tile detailsTile;
643 
644        private final Command newTrackCommand;
645@@ -66,6 +77,18 @@
646        private final Command aboutCommand;
647 
648        private final Command exitCommand;
649+       
650+       //Added 2007 SIB       
651+       private final Tile summaryTile;
652+       
653+       private final Command exportCommand;
654+       
655+       private int canvasView = 0;
656+       
657+       private final Command detailsViewCommand;
658+       
659+       private final Command plotterViewCommand;
660+       //End Added 2007 SIB
661 
662        private String statusMessage = null;
663 
664@@ -81,14 +104,21 @@
665                speedProfileTile = new SpeedPlotterTile(manager, DataProvider.TIME);
666                statusTile = new StatusTile(manager);
667                detailsTile = new DetailsTile(manager);
668+               summaryTile = new SummaryTile(manager);
669+               paceTile = new PaceTile(manager);
670 
671-               switchViewCommand = new Command("Switch View", Command.SCREEN, 0);
672-               newTrackCommand = new Command("New Track", Command.SCREEN, 1);
673-               stopTrackingCommand = new Command("Stop tracking", Command.STOP, 2);
674-               tracksCommand = new Command("Track Manager", Command.SCREEN, 3);
675+               switchViewCommand = new Command("Switch View", Command.SCREEN, 11);
676+               newTrackCommand = new Command("Start Track", Command.SCREEN, 1);
677+               stopTrackingCommand = new Command("Stop Track", Command.STOP, 2);
678+               tracksCommand = new Command("Tracks", Command.SCREEN, 3);
679                optionsCommand = new Command("Options", Command.SCREEN, 4);
680                aboutCommand = new Command("About", Command.SCREEN, 5);
681-               exitCommand = new Command("Exit", Command.EXIT, 6);
682+               //Added 2007 SIB
683+               exportCommand = new Command("Export Track", Command.SCREEN, 0);
684+               detailsViewCommand = new Command("Details View", Command.SCREEN, 9);
685+               plotterViewCommand = new Command("Plotter View", Command.SCREEN, 9);
686+               //End Added 2007 SIB
687+               exitCommand = new Command("Exit", Command.EXIT, 11);
688 
689                addCommand(switchViewCommand);
690                addCommand(newTrackCommand);
691@@ -96,6 +126,7 @@
692                addCommand(optionsCommand);
693                addCommand(aboutCommand);
694                addCommand(exitCommand);
695+               addCommand(detailsViewCommand);
696 
697                setCommandListener(this);
698 
699@@ -181,8 +212,17 @@
700        public void stateChanged(final int newState) {
701                if (newState == TrackManager.STATE_TRACKING) {
702                        addCommand(stopTrackingCommand);
703+               //Added 2007 SIB
704+                       removeCommand(exportCommand);
705+               } else if (newState == TrackManager.STATE_STATIC){
706+                       removeCommand(stopTrackingCommand);
707+                       addCommand(exportCommand);
708+               //End Added 2007 SIB
709                } else {
710                        removeCommand(stopTrackingCommand);
711+                       //Added 2007 SIB
712+                       removeCommand(exportCommand);
713+                       //End Added 2007 SIB
714                }
715                updateStatusText(newState);
716                for (int i = 0; i < visibleTiles.length && visibleTiles[i] != null; i++) {
717@@ -203,24 +243,42 @@
718        }
719 
720        private void nextTileConfiguration() {
721-               tileConfiguration = (tileConfiguration + 1) % 4;
722-               switch (tileConfiguration) {
723-               case 0:
724-                       setMainTile(trackTile, true);
725-                       setStatusMessage("Track view");
726-                       break;
727-               case 1:
728-                       setMainTile(elevationProfileTile, true);
729-                       setStatusMessage("Elevation over time");
730-                       break;
731-               case 2:
732-                       setMainTile(speedProfileTile, true);
733-                       setStatusMessage("Speed over time");
734-                       break;
735-               case 3:
736-                       setMainTile(detailsTile, false);
737-                       setStatusMessage("Details");
738-                       break;
739+               if (canvasView == 1){
740+                       addCommand(plotterViewCommand);
741+                       removeCommand(detailsViewCommand);
742+                       tileConfiguration = (tileConfiguration + 1) % 3;
743+                       switch (tileConfiguration) {
744+                       case 0:
745+                               setMainTile(detailsTile, false);
746+                               setStatusMessage("Details");
747+                               break;
748+                       case 1:
749+                               setMainTile(summaryTile, false);
750+                               setStatusMessage("Summary");
751+                               break;
752+                       case 2:
753+                               setMainTile(paceTile, false);
754+                               setStatusMessage("Pace");
755+                               break;
756+                       }
757+               } else {
758+                       removeCommand(plotterViewCommand);
759+                       addCommand(detailsViewCommand);
760+                       tileConfiguration = (tileConfiguration + 1) % 3;
761+                       switch (tileConfiguration) {
762+                       case 0:
763+                               setMainTile(trackTile, true);
764+                               setStatusMessage("Track view");
765+                               break;
766+                       case 1:
767+                               setMainTile(elevationProfileTile, true);
768+                               setStatusMessage("Elevation over time");
769+                               break;
770+                       case 2:
771+                               setMainTile(speedProfileTile, true);
772+                               setStatusMessage("Speed over time");
773+                               break;
774+                       }
775                }
776        }
777 
778@@ -239,8 +297,15 @@
779                final int state = manager.getState();
780                if (state == TrackManager.STATE_TRACKING) {
781                        addCommand(stopTrackingCommand);
782-               } else {
783+               //Added 2007 SIB
784+                       removeCommand(exportCommand);
785+               } else if (state == TrackManager.STATE_STATIC){
786                        removeCommand(stopTrackingCommand);
787+                       addCommand(exportCommand);
788+               //End Added 2007 SIB
789+               }else {
790+                       removeCommand(stopTrackingCommand);
791+                       removeCommand(exportCommand);
792                }
793                updateStatusText(state);
794        }
795@@ -249,7 +314,37 @@
796                if (command == exitCommand) {
797                        exitAction();
798                } else if (command == switchViewCommand) {
799-                       nextTileConfiguration();
800+                       nextTileConfiguration();
801+               } else if (command == detailsViewCommand) {
802+                       canvasView = 1;
803+                       setMainTile(detailsTile, false);
804+                       setStatusMessage("Details");
805+               } else if (command == plotterViewCommand) {
806+                       canvasView = 0;
807+                       setMainTile(trackTile, true);
808+                       setStatusMessage("Track view");
809+               //Added 2007 SIB
810+               }else if (command == exportCommand){
811+                       final Preferences preferences = Preferences.getInstance();
812+                       final String dir = preferences.getExportDirectory();
813+                       final Track track = manager.getTrack();
814+                       if (dir == null) {
815+                               final Alert alert = new Alert("No track directory defined!",
816+                                               "Please define an export directory in the options screen.", null, AlertType.WARNING);
817+                               BBTracker.alert(alert, this);
818+                               return;
819+                       }
820+                       int count;
821+                       try {
822+                               count = exportTrack(dir, track);
823+                       } catch (final IOException e) {
824+                               BBTracker.nonFatal(e, "exporting track", this);
825+                               return;
826+                       }
827+                       final Alert alert = new Alert("Finished exporting", "The track " + track.getName() +
828+                                       " has been exported successfully to " + count + " formats!", null, AlertType.INFO);
829+                       BBTracker.alert(alert, this);
830+               //End Added 2007 SIB
831                } else {
832                        final Displayable nextDisplayable;
833                        if (command == aboutCommand) {
834@@ -381,4 +476,48 @@
835                        MainCanvas.this.repaint();
836                }
837        }
838+       
839+       //Added 2007 SIB from code on TracksForm
840+       private int exportTrack(final String dir, final Track track) throws IOException {
841+               final Preferences pref = Preferences.getInstance();
842+               int exportCount = 0;
843+               if (pref.getExportFormat(0)) {
844+                       export(dir, track, new KmlTrackExporter());
845+                       exportCount++;
846+               }
847+               if (pref.getExportFormat(1)) {
848+                       export(dir, track, new GpxTrackExporter());
849+                       exportCount++;
850+               }
851+               return exportCount;
852+       }
853+
854+       private void export(final String dir, final Track track, final TrackExporter exporter) throws IOException {
855+               final String fileName = exporter.getFileName(track);
856+               final String fullName = dir.endsWith("/") ? dir + fileName : dir + "/" + fileName;
857+               FileConnection connection = null;
858+               OutputStream out = null;
859+               try {
860+                       connection = (FileConnection) Connector.open("file:///" + fullName, Connector.READ_WRITE);
861+                       connection.create();
862+                       out = connection.openOutputStream();
863+                       exporter.export(out, track);
864+               } finally {
865+                       if (out != null) {
866+                               try {
867+                                       out.close();
868+                               } catch (final IOException ignored) {
869+                                       // ignore
870+                               }
871+                       }
872+                       if (connection != null) {
873+                               try {
874+                                       connection.close();
875+                               } catch (final IOException ignored) {
876+                                       // ignore
877+                               }
878+                       }
879+               }
880+       }
881+       //End Added 2007 SIB
882 }
883\ No newline at end of file
884Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/PaceTile.java
885===================================================================
886--- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/PaceTile.java      (revision 0)
887+++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/gui/PaceTile.java      (revision 0)
888@@ -0,0 +1,97 @@
889+/*
890+ * Copyright 2007 SIB
891+ * Copyright 2007 Joachim Sauer
892+ *
893+ * This file is part of bbTracker.
894+ *
895+ * bbTracker is free software; you can redistribute it and/or modify
896+ * it under the terms of the GNU General Public License version 2 as
897+ * published by the Free Software Foundation.
898+ *
899+ * bbTracker is distributed in the hope that it will be useful,
900+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
901+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
902+ * GNU General Public License for more details.
903+ *
904+ * You should have received a copy of the GNU General Public License
905+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
906+ */
907+package org.bbtracker.mobile.gui;
908+
909+import javax.microedition.lcdui.*;
910+
911+import org.bbtracker.Track;
912+import org.bbtracker.TrackPoint;
913+import org.bbtracker.UnitConverter;
914+import org.bbtracker.Utils;
915+import org.bbtracker.mobile.Preferences;
916+import org.bbtracker.mobile.TrackManager;
917+
918+public class PaceTile extends Tile {
919+
920+       private static final int MARGIN = 2;
921+       
922+       private final TrackManager manager;
923+
924+       private Font font;
925+
926+       public PaceTile(final TrackManager manager) {
927+               this.manager = manager;
928+               setFontSize(Font.SIZE_LARGE);
929+       }
930+
931+       private void setFontSize(final int fontSize) {
932+               font = Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, fontSize);
933+       }
934+       
935+       
936+       protected void doPaint(final Graphics g) {
937+               final Track track = manager.getTrack();
938+
939+               g.setColor(0x00ffffff);
940+               g.fillRect(0, 0, width, height);
941+               g.setColor(0x00000000);
942+               g.setFont(font);
943+
944+               double lengthValue = Double.NaN;
945+               float speedValue = Float.NaN;
946+               float avgspeedValue = Float.NaN;
947+               long duration = 0;
948+               String timeString = "-";
949+               if (track != null) {
950+                       lengthValue = track.getLength();
951+                       avgspeedValue = track.getAvgSpeed();
952+                       if (track.getPointCount() > 0) {
953+                               final TrackPoint lastPoint = track.getPoint(track.getPointCount() - 1);
954+                               duration = track.getPointOffset(lastPoint);
955+                               if (manager.getState() == TrackManager.STATE_TRACKING) {
956+                                       speedValue = lastPoint.getSpeed();
957+                               } else {
958+                                       speedValue = track.getAvgSpeed();
959+                               }
960+                               timeString = Utils.durationToString(duration);
961+                       }
962+               }
963+               
964+               final UnitConverter unit = Preferences.getInstance().getUnitsConverter();
965+               final String length = unit.distanceToString(lengthValue);
966+               final String pace = unit.paceToString(avgspeedValue);
967+               final String speed = unit.speedToString(speedValue);
968+               
969+               final int fontHeight = font.getHeight();
970+               int x = (width/2);
971+               int y = height/2 - ((fontHeight + MARGIN)*2);
972+
973+               g.drawString(timeString, x, y, Graphics.TOP | Graphics.HCENTER);
974+               y += fontHeight + MARGIN;
975+               g.drawString(length, x, y, Graphics.TOP | Graphics.HCENTER);
976+               y += fontHeight + MARGIN;
977+               g.drawString(speed, x, y, Graphics.TOP | Graphics.HCENTER);
978+               y += fontHeight + MARGIN;
979+               g.drawString(pace, x, y, Graphics.TOP | Graphics.HCENTER);
980+               y += fontHeight + MARGIN;
981+       }
982+
983+       public void showNotify() {
984+       }
985+}
986\ No newline at end of file
987Index: C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/exporter/KmlTrackExporter.java
988===================================================================
989--- C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/exporter/KmlTrackExporter.java (revision 109)
990+++ C:/Projects/bbTracker/stable/0412/bbtracker/src/org/bbtracker/mobile/exporter/KmlTrackExporter.java (working copy)
991@@ -63,6 +63,7 @@
992                        final String maxElevString = unit.elevationToString(track.getMaxElevation());
993                        final String minElevString = unit.elevationToString(track.getMinElevation());
994                        final String maxSpeedString = unit.speedToString(track.getMaxSpeed());
995+                       final String avgSpeedString = unit.speedToString(track.getAvgSpeed());;
996 
997                        w = new OutputStreamWriter(out, "UTF-8");
998                        w.write(XML_HEADER);
999@@ -93,6 +94,11 @@
1000                        w.write("<tr><td><b>Max Speed: </b>");
1001                        w.write(maxSpeedString);
1002                        w.write("</td></tr>\n");
1003+                       //Added New Field 2007 SIB
1004+                       w.write("<tr><td><b>Average Speed: </b>");
1005+                       w.write(avgSpeedString);
1006+                       w.write("</td></tr>\n");
1007+                       //End Added SIB
1008                        w.write("<tr><td><b>Max Elevation: </b>");
1009                        w.write(maxElevString);
1010                        w.write("</td></tr>\n");