Changeset 30491 in osm for applications/editors/josm
- Timestamp:
- 2014-06-10T00:04:18+02:00 (11 years ago)
- Location:
- applications/editors/josm/plugins/NanoLog
- Files:
-
- 7 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/NanoLog/build.xml
r30416 r30491 1 1 <?xml version="1.0" encoding="utf-8"?> 2 2 <project name="NanoLog" default="dist" basedir="."> 3 3 4 <!-- enter the SVN commit message --> 4 5 <property name="commit.message" value="NanoLog"/> … … 23 24 ********************************************************** 24 25 --> 25 <target name="init"> 26 <mkdir dir="${plugin.build.dir}"/> 27 </target> 28 <!-- 29 ********************************************************** 30 ** compile - complies the source tree 31 ********************************************************** 32 --> 33 <target name="compile" depends="init"> 34 <echo message="compiling sources for ${plugin.jar} ... "/> 35 <javac srcdir="src" classpath="${josm}" debug="true" destdir="${plugin.build.dir}"> 36 <compilerarg value="-Xlint:deprecation"/> 37 <compilerarg value="-Xlint:unchecked"/> 38 </javac> 39 </target> 40 <!-- 41 ********************************************************** 42 ** dist - creates the plugin jar 43 ********************************************************** 44 --> 45 <target name="dist" depends="compile,revision"> 46 <echo message="creating ${ant.project.name}.jar ... "/> 47 <copy todir="${plugin.build.dir}/images"> 48 <fileset dir="images"/> 49 </copy> 50 <copy todir="${plugin.build.dir}/data"> 51 <fileset dir="data"/> 52 </copy> 53 <copy todir="${plugin.build.dir}"> 54 <fileset dir="src" includes="**/*.txt"/> 55 </copy> 56 <copy todir="${plugin.build.dir}"> 57 <fileset dir="."> 58 <include name="README"/> 59 <include name="LICENSE"/> 60 </fileset> 61 </copy> 62 <jar destfile="${plugin.jar}" basedir="${plugin.build.dir}"> 63 <!-- 64 ************************************************ 65 ** configure these properties. Most of them will be copied to the plugins 66 ** manifest file. Property values will also show up in the list available 67 ** plugins: http://josm.openstreetmap.de/wiki/Plugins. 68 ** 69 ************************************************ 70 --> 71 <manifest> 72 <attribute name="Author" value="Ilya Zverev"/> 73 <attribute name="Plugin-Class" value="nanolog.NanoLogPlugin"/> 74 <attribute name="Plugin-Date" value="${version.entry.commit.date}"/> 75 <attribute name="Plugin-Description" value="NanoLog adjustment and browsing layer"/> 76 <attribute name="ru_Plugin-Description" value="Загрузчик слоя NanoLog"/> 77 <attribute name="Plugin-Icon" value="images/nanolog.png"/> 78 <attribute name="Plugin-Link" value="http://wiki.openstreetmap.org/wiki/NanoLog"/> 79 <attribute name="ru_Plugin-Link" value="http://wiki.openstreetmap.org/wiki/RU:NanoLog"/> 80 <attribute name="Plugin-Mainversion" value="${plugin.main.version}"/> 81 <attribute name="Plugin-Version" value="${version.entry.commit.revision}"/> 82 </manifest> 83 </jar> 84 </target> 85 <!-- 86 ********************************************************** 87 ** revision - extracts the current revision number for the 88 ** file build.number and stores it in the XML property 89 ** version.* 90 ********************************************************** 91 --> 92 <target name="revision"> 93 <exec append="false" output="REVISION" executable="svn" failifexecutionfails="false"> 94 <env key="LANG" value="C"/> 95 <arg value="info"/> 96 <arg value="--xml"/> 97 <arg value="."/> 98 </exec> 99 <xmlproperty file="REVISION" prefix="version" keepRoot="false" collapseAttributes="true"/> 100 <delete file="REVISION"/> 101 </target> 102 <!-- 103 ********************************************************** 104 ** clean - clean up the build environment 105 ********************************************************** 106 --> 107 <target name="clean"> 108 <delete dir="${plugin.build.dir}"/> 109 <delete file="${plugin.jar}"/> 110 </target> 111 <!-- 112 ********************************************************** 113 ** install - install the plugin in your local JOSM installation 114 ********************************************************** 115 --> 116 <target name="install" depends="dist"> 117 <property environment="env"/> 118 <condition property="josm.plugins.dir" value="${env.APPDATA}/JOSM/plugins" else="${user.home}/.josm/plugins"> 119 <and> 120 <os family="windows"/> 121 </and> 122 </condition> 123 <copy file="${plugin.jar}" todir="${josm.plugins.dir}"/> 124 </target> 125 <!-- 126 ************************** Publishing the plugin *********************************** 127 --> 128 <!-- 129 ** extracts the JOSM release for the JOSM version in ../core and saves it in the 130 ** property ${coreversion.info.entry.revision} 131 ** 132 --> 133 <target name="core-info"> 134 <exec append="false" output="core.info.xml" executable="svn" failifexecutionfails="false"> 135 <env key="LANG" value="C"/> 136 <arg value="info"/> 137 <arg value="--xml"/> 138 <arg value="../../core"/> 139 </exec> 140 <xmlproperty file="core.info.xml" prefix="coreversion" keepRoot="true" collapseAttributes="true"/> 141 <echo>Building against core revision ${coreversion.info.entry.revision}.</echo> 142 <echo>Plugin-Mainversion is set to ${plugin.main.version}.</echo> 143 <delete file="core.info.xml"/> 144 </target> 145 <!-- 146 ** commits the source tree for this plugin 147 --> 148 <target name="commit-current"> 149 <echo>Commiting the plugin source with message '${commit.message}' ...</echo> 150 <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false"> 151 <env key="LANG" value="C"/> 152 <arg value="commit"/> 153 <arg value="-m '${commit.message}'"/> 154 <arg value="."/> 155 </exec> 156 </target> 157 <!-- 158 ** updates (svn up) the source tree for this plugin 159 --> 160 <target name="update-current"> 161 <echo>Updating plugin source ...</echo> 162 <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false"> 163 <env key="LANG" value="C"/> 164 <arg value="up"/> 165 <arg value="."/> 166 </exec> 167 <echo>Updating ${plugin.jar} ...</echo> 168 <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false"> 169 <env key="LANG" value="C"/> 170 <arg value="up"/> 171 <arg value="../dist/${plugin.jar}"/> 172 </exec> 173 </target> 174 <!-- 175 ** commits the plugin.jar 176 --> 177 <target name="commit-dist"> 178 <echo> 179 ***** Properties of published ${plugin.jar} ***** 180 Commit message : '${commit.message}' 181 Plugin-Mainversion: ${plugin.main.version} 182 JOSM build version: ${coreversion.info.entry.revision} 183 Plugin-Version : ${version.entry.commit.revision} 184 ***** / Properties of published ${plugin.jar} ***** 185 186 Now commiting ${plugin.jar} ... 187 </echo> 188 <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false"> 189 <env key="LANG" value="C"/> 190 <arg value="-m '${commit.message}'"/> 191 <arg value="commit"/> 192 <arg value="${plugin.jar}"/> 193 </exec> 194 </target> 195 <!-- ** make sure svn is present as a command line tool ** --> 196 <target name="ensure-svn-present"> 197 <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false" failonerror="false" resultproperty="svn.exit.code"> 198 <env key="LANG" value="C"/> 199 <arg value="--version"/> 200 </exec> 201 <fail message="Fatal: command 'svn --version' failed. Please make sure svn is installed on your system."> 202 <!-- return code not set at all? Most likely svn isn't installed --> 203 <condition> 204 <not> 205 <isset property="svn.exit.code"/> 206 </not> 207 </condition> 208 </fail> 209 <fail message="Fatal: command 'svn --version' failed. Please make sure a working copy of svn is installed on your system."> 210 <!-- error code from SVN? Most likely svn is not what we are looking on this system --> 211 <condition> 212 <isfailure code="${svn.exit.code}"/> 213 </condition> 214 </fail> 215 </target> 216 <target name="publish" depends="ensure-svn-present,core-info,commit-current,update-current,clean,dist,commit-dist"> 217 </target> 26 <property name="plugin.author" value="Ilya Zverev"/> 27 <property name="plugin.class" value="nanolog.NanoLogPlugin"/> 28 <property name="plugin.description" value="NanoLog adjustment and btowsing layer"/> 29 <property name="plugin.icon" value="images/nanolog.png"/> 30 <!--<property name="plugin.early" value="..."/>--> 31 <!--<property name="plugin.requires" value="..."/>--> 32 <!--<property name="plugin.stage" value="..."/>--> 33 <property name="plugin.description.ru" value="Загрузчик слоя NanoLog"/> 34 <property name="plugin.link" value="http://wiki.openstreetmap.org/wiki/NanoLog"/> 35 <property name="plugin.link.ru" value="http://wiki.openstreetmap.org/wiki/RU:NanoLog"/> 36 37 38 <property name="josm" location="../../core/dist/josm-custom.jar"/> 39 <property name="plugin.dist.dir" value="../../dist"/> 40 41 <!-- ** include targets that all plugins have in common ** --> 42 <import file="../build-common.xml"/> 43 218 44 </project> -
applications/editors/josm/plugins/NanoLog/src/nanolog/NanoLogEntry.java
r27939 r30491 1 1 package nanolog; 2 2 3 import java.util.Date; 3 import java.awt.*; 4 import java.util.*; 5 import org.openstreetmap.josm.Main; 6 import org.openstreetmap.josm.data.Bounds; 4 7 import org.openstreetmap.josm.data.coor.LatLon; 8 import org.openstreetmap.josm.gui.MapView; 5 9 6 10 /** … … 9 13 * @author zverik 10 14 */ 11 public class NanoLogEntry {15 public class NanoLogEntry implements Comparable<NanoLogEntry> { 12 16 private LatLon pos; 13 17 private Date time; 14 18 private String message; 15 private int direction; 16 private LatLon tmpPos; 19 private Integer direction; 20 private Integer baseDir; 21 private LatLon basePos; 17 22 18 public int getDirection() { 23 public NanoLogEntry( Date time, String message, LatLon basePos, Integer baseDir ) { 24 this.basePos = basePos; 25 this.baseDir = baseDir; 26 this.pos = basePos; 27 this.direction = baseDir; 28 this.time = time; 29 this.message = message; 30 this.direction = direction; 31 } 32 33 public NanoLogEntry( Date time, String message ) { 34 this(time, message, null, null); 35 } 36 37 public Integer getDirection() { 19 38 return direction; 20 39 } … … 25 44 26 45 public LatLon getPos() { 27 return tmpPos == null ? pos : tmpPos; 46 return pos; 47 } 48 49 public void setPos( LatLon pos ) { 50 this.pos = pos; 51 } 52 53 public void setDirection( Integer direction ) { 54 this.direction = direction; 55 } 56 57 public LatLon getBasePos() { 58 return basePos; 59 } 60 61 public Integer getBaseDir() { 62 return baseDir; 28 63 } 29 64 … … 31 66 return time; 32 67 } 68 69 @Override 70 public int compareTo( NanoLogEntry t ) { 71 return time.compareTo(t.time); 72 } 33 73 } -
applications/editors/josm/plugins/NanoLog/src/nanolog/NanoLogLayer.java
r27939 r30491 1 1 package nanolog; 2 2 3 import java.awt.Color; 4 import java.awt.Graphics2D; 5 import java.awt.Point; 6 import java.awt.Rectangle; 7 import java.awt.event.ActionEvent; 8 import java.beans.PropertyChangeListener; 3 import java.awt.*; 4 import java.awt.event.*; 9 5 import java.io.*; 10 import java.util.ArrayList; 6 import java.text.ParseException; 7 import java.text.SimpleDateFormat; 8 import java.util.*; 11 9 import java.util.List; 12 import javax.swing.AbstractAction; 13 import javax.swing.Action; 14 import javax.swing.Icon; 10 import java.util.regex.*; 11 import javax.swing.*; 15 12 import org.openstreetmap.josm.Main; 16 import org.openstreetmap.josm.actions.RenameLayerAction; 17 import org.openstreetmap.josm.actions.SaveAction; 13 import org.openstreetmap.josm.actions.*; 18 14 import org.openstreetmap.josm.data.Bounds; 15 import org.openstreetmap.josm.data.coor.EastNorth; 16 import org.openstreetmap.josm.data.coor.LatLon; 17 import org.openstreetmap.josm.data.gpx.WayPoint; 19 18 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor; 20 19 import org.openstreetmap.josm.gui.MapView; 21 import org.openstreetmap.josm.gui.dialogs.LayerListDialog; 22 import org.openstreetmap.josm.gui.dialogs.LayerListPopup; 23 import org.openstreetmap.josm.gui.layer.JumpToMarkerActions; 24 import org.openstreetmap.josm.gui.layer.Layer; 20 import org.openstreetmap.josm.gui.dialogs.*; 21 import org.openstreetmap.josm.gui.layer.*; 25 22 import static org.openstreetmap.josm.tools.I18n.tr; 26 import static org.openstreetmap.josm.tools.I18n.trn;27 23 import org.openstreetmap.josm.tools.ImageProvider; 28 24 29 25 /** 26 * NanoLog layer: a set of points that can be georeferenced. 30 27 * 31 28 * @author zverik … … 35 32 private List<NanoLogEntry> log; 36 33 private int selectedEntry; 34 private final Set<NanoLogLayerListener> listeners = new HashSet<NanoLogLayerListener>(); 35 private NLLMouseAdapter mouseListener; 36 37 public NanoLogLayer( List<NanoLogEntry> entries ) { 38 super(tr("NanoLog")); 39 log = new ArrayList<NanoLogEntry>(entries); 40 selectedEntry = -1; 41 mouseListener = new NLLMouseAdapter(); 42 Main.map.mapView.addMouseListener(mouseListener); 43 Main.map.mapView.addMouseMotionListener(mouseListener); 44 } 45 46 @Override 47 public void destroy() { 48 Main.map.mapView.removeMouseListener(mouseListener); 49 Main.map.mapView.removeMouseMotionListener(mouseListener); 50 super.destroy(); 51 } 37 52 38 53 public NanoLogLayer( File file ) throws IOException { 39 super(tr("NanoLog")); 40 log = readNanoLog(file); 41 selectedEntry = -1; 54 this(readNanoLog(file)); 55 } 56 57 public void addListener( NanoLogLayerListener listener ) { 58 listeners.add(listener); 59 } 60 61 public void removeListener( NanoLogLayerListener listener ) { 62 listeners.remove(listener); 63 } 64 65 protected void fireMarkersChanged() { 66 for( NanoLogLayerListener listener : listeners ) 67 listener.markersUpdated(this); 68 } 69 70 protected void fireMarkerSelected() { 71 for( NanoLogLayerListener listener : listeners ) 72 listener.markerActivated(this, selectedEntry < 0 ? null : log.get(selectedEntry)); 73 } 74 75 public List<NanoLogEntry> getEntries() { 76 return Collections.unmodifiableList(log); 42 77 } 43 78 44 79 public static List<NanoLogEntry> readNanoLog( File file ) throws IOException { 80 final Pattern NANOLOG_LINE = Pattern.compile("(.+?)\\t(.+?)(?:\\s*\\{\\{(-?\\d+\\.\\d+),\\s*(-?\\d+\\.\\d+)(?:,\\s*(\\d+))?\\}\\})?"); 81 final SimpleDateFormat fmt = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss.SS"); 45 82 List<NanoLogEntry> result = new ArrayList<NanoLogEntry>(); 46 83 BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF8")); … … 48 85 String line = r.readLine(); 49 86 if( line != null ) { 50 // parse it 87 Matcher m = NANOLOG_LINE.matcher(line); 88 if( m.matches() ) { 89 String time = m.group(1); 90 String message = m.group(2); 91 String lat = m.group(3); 92 String lon = m.group(4); 93 String dir = m.group(5); 94 Date timeDate = null; 95 try { 96 timeDate = fmt.parse(time); 97 } catch( ParseException e ) { 98 } 99 if( message == null || message.length() == 0 || timeDate == null ) 100 continue; 101 LatLon pos = null; 102 Integer direction = null; 103 if( lat != null && lon != null ) { 104 try { 105 pos = new LatLon(Double.parseDouble(lat), Double.parseDouble(lon)); 106 direction = new Integer(dir); 107 } catch( NumberFormatException e ) { 108 // well... 109 } 110 } 111 NanoLogEntry entry = new NanoLogEntry(timeDate, message, pos, direction); 112 result.add(entry); 113 } 51 114 } 52 115 } … … 58 121 public void paint( Graphics2D g, MapView mv, Bounds box ) { 59 122 // todo 60 int radius = 4; 61 int width = Main.map.mapView.getWidth(); 62 int height = Main.map.mapView.getHeight(); 63 Rectangle clip = g.getClipBounds(); 64 for( NanoLogEntry entry : log ) { 123 for( int i = 0; i < log.size(); i++ ) { 124 NanoLogEntry entry = log.get(i); 125 int radius = 4; 65 126 if( entry.getPos() != null ) { 66 127 Point p = mv.getPoint(entry.getPos()); 67 g.setColor( Color.green);128 g.setColor(selectedEntry == i ? Color.red : Color.yellow); 68 129 g.fillOval(p.x - radius, p.y - radius, radius * 2, radius * 2); 69 130 } 70 }71 if( selectedEntry >= 0 && selectedEntry < log.size() ) {72 Point p = mv.getPoint(log.get(selectedEntry).getPos());73 g.setColor(Color.red);74 g.fillOval(p.x - radius, p.y - radius, radius * 2, radius * 2);75 131 } 76 132 } … … 120 176 new RenameLayerAction(null, this), 121 177 SeparatorLayerAction.INSTANCE, 122 new CorrelateEntries(), 178 new CorrelateEntries(true), 179 new CorrelateEntries(false), 123 180 new SaveLayer(), 124 181 SeparatorLayerAction.INSTANCE, … … 127 184 } 128 185 186 @Override 129 187 public void jumpToNextMarker() { 130 188 selectedEntry++; … … 136 194 } 137 195 196 @Override 138 197 public void jumpToPreviousMarker() { 139 198 selectedEntry--; … … 144 203 Main.map.repaint(); 145 204 } 146 147 private class CorrelateEntries extends AbstractAction { 148 205 206 protected void setSelected( int i ) { 207 int newSelected = i >= 0 && i < log.size() ? i : -1; 208 if( newSelected != selectedEntry ) { 209 // System.out.println("selected: " + log.get(newSelected).getMessage()); 210 selectedEntry = newSelected; 211 fireMarkerSelected(); 212 Main.map.mapView.repaint(); 213 } 214 } 215 216 public void setSelected( NanoLogEntry entry ) { 217 if( entry == null ) 218 setSelected(-1); 219 else { 220 for( int i = 0; i < log.size(); i++ ) { 221 if( entry.equals(log.get(i)) ) { 222 setSelected(i); 223 break; 224 } 225 } 226 } 227 } 228 229 private class NLLMouseAdapter extends MouseAdapter { 230 private int dragging; 231 232 public int nearestEntry( MouseEvent e ) { 233 LatLon ll = Main.map.mapView.getLatLon(e.getX(), e.getY()); 234 int radius = 8; 235 if( ll != null ) { 236 LatLon lld = Main.map.mapView.getLatLon(e.getX() + radius, e.getY() + radius); 237 double distance = Math.max(lld.lat() - ll.lat(), lld.lon() - ll.lon()); 238 boolean selectedIsSelected = false; 239 int newSelected = -1; 240 for( int i = 0; i < log.size(); i++ ) { 241 if( log.get(i).getPos() != null && log.get(i).getPos().distance(ll) < distance ) { 242 newSelected = i; 243 if( i == selectedEntry ) 244 selectedIsSelected = true; 245 } 246 } 247 if( newSelected >= 0 ) 248 return selectedIsSelected ? selectedEntry : newSelected; 249 } 250 return -1; 251 } 252 253 @Override 254 public void mouseMoved( MouseEvent e ) { 255 int nearest = nearestEntry(e); 256 if( nearest > 0 ) 257 setSelected(nearest); 258 } 259 260 @Override 261 public void mouseDragged( MouseEvent e ) { 262 doDrag(e); 263 } 264 265 @Override 266 public void mouseReleased( MouseEvent e ) { 267 if( dragging > 0 ) { 268 dragging = 0; 269 } 270 } 271 272 @Override 273 public void mousePressed( MouseEvent e ) { 274 int nearest = nearestEntry(e); 275 if( nearest > 0 && Main.map.mapView.getActiveLayer() == NanoLogLayer.this ) { 276 dragging = nearest; 277 doDrag(e); 278 } 279 } 280 281 private void doDrag( MouseEvent e ) { 282 if( dragging > 0 ) 283 dragTo(dragging, e.getX(), e.getY()); 284 } 285 } 286 287 protected void dragTo( int entry, int x, int y ) { 288 GpxLayer gpx = GPXChooser.topLayer(); 289 if( gpx == null ) 290 return; 291 EastNorth eastNorth = Main.map.mapView.getEastNorth(x, y); 292 double tolerance = eastNorth.distance(Main.map.mapView.getEastNorth(x + 300, y)); 293 WayPoint wp = gpx.data.nearestPointOnTrack(eastNorth, tolerance); 294 if( wp == null ) 295 return; 296 long newTime = Correlator.getGpxDate(gpx.data, wp.getCoor()); 297 if( newTime <= 0 ) 298 return; 299 Correlator.revertPos(log); 300 Correlator.correlate(log, gpx.data, log.get(entry).getTime().getTime() - newTime); 301 Main.map.mapView.repaint(); 302 } 303 304 private class CorrelateEntries extends JosmAction { 305 private boolean toZero; 306 307 public CorrelateEntries() { 308 this(false); 309 } 310 311 public CorrelateEntries( boolean toZero ) { 312 super(toZero ? tr("Correlate with GPX...") : tr("Put on GPX..."), "nanolog/correlate", tr("Correlate entries with GPS trace"), null, false); 313 this.toZero = toZero; 314 } 315 316 @Override 317 public void actionPerformed( ActionEvent e ) { 318 // 1. Select GPX trace or display message to load one 319 // (better yet, disable when no GPX traces) 320 GpxLayer layer = GPXChooser.chooseLayer(); 321 // 2. Correlate by default, sticking by date 322 // (if does not match, shift so hours-minutes stay) 323 if( layer != null ) { 324 long offset = toZero ? 0 : Correlator.crudeMatch(log, layer.data); 325 Correlator.revertPos(log); 326 Correlator.correlate(log, layer.data, offset); 327 fireMarkersChanged(); 328 Main.map.mapView.repaint(); 329 } 330 // 3. Show non-modal (?) window with a slider and a text input 331 // (todo: better slider, like in blender) 332 } 333 } 334 335 private class SaveLayer extends JosmAction { 336 337 public SaveLayer() { 338 super(tr("Save layer..."), "nanolog/save", tr("Save NanoLog layer"), null, false); 339 } 340 341 @Override 149 342 public void actionPerformed( ActionEvent e ) { 150 343 // todo 151 } 152 } 153 154 private class SaveLayer extends AbstractAction { 155 156 public void actionPerformed( ActionEvent e ) { 157 // todo 158 } 344 JOptionPane.showMessageDialog(Main.parent, "Sorry, no saving yet", "NanoLog", JOptionPane.ERROR_MESSAGE); 345 } 346 } 347 348 public static interface NanoLogLayerListener { 349 void markersUpdated( NanoLogLayer layer ); 350 void markerActivated( NanoLogLayer layer, NanoLogEntry entry ); 159 351 } 160 352 } -
applications/editors/josm/plugins/NanoLog/src/nanolog/NanoLogPanel.java
r27960 r30491 1 1 package nanolog; 2 2 3 import java.awt.Rectangle; 4 import java.text.SimpleDateFormat; 5 import java.util.*; 3 6 import javax.swing.*; 7 import nanolog.NanoLogLayer.NanoLogLayerListener; 8 import org.openstreetmap.josm.Main; 9 import org.openstreetmap.josm.gui.MapView.LayerChangeListener; 4 10 import org.openstreetmap.josm.gui.dialogs.ToggleDialog; 11 import org.openstreetmap.josm.gui.layer.Layer; 5 12 import static org.openstreetmap.josm.tools.I18n.tr; 6 13 import org.openstreetmap.josm.tools.Shortcut; … … 11 18 * @author zverik 12 19 */ 13 public class NanoLogPanel extends ToggleDialog {14 private JList logPanel;20 public class NanoLogPanel extends ToggleDialog implements LayerChangeListener, NanoLogLayerListener { 21 private JList<String> logPanel; 15 22 private LogListModel listModel; 16 23 17 24 public NanoLogPanel() { 18 super(tr("NanoLog"), "nanolog", tr("Open NanoLog panel"), null, 150, true);25 super(tr("NanoLog"), "nanolog", tr("Open NanoLog panel"), null, 150, false); 19 26 20 27 listModel = new LogListModel(); 21 logPanel = new JList (listModel);28 logPanel = new JList<String>(listModel); 22 29 createLayout(logPanel, true, null); 23 30 } 31 32 public void updateMarkers() { 33 List<NanoLogEntry> entries = new ArrayList<NanoLogEntry>(); 34 for( NanoLogLayer l : Main.map.mapView.getLayersOfType(NanoLogLayer.class) ) { 35 entries.addAll(l.getEntries()); 36 } 37 listModel.setEntries(entries); 38 } 39 40 @Override 41 public void activeLayerChange( Layer oldLayer, Layer newLayer ) { 42 // todo 43 } 44 45 @Override 46 public void layerAdded( Layer newLayer ) { 47 if( newLayer instanceof NanoLogLayer ) 48 ((NanoLogLayer)newLayer).addListener(this); 49 updateMarkers(); 50 } 51 52 @Override 53 public void layerRemoved( Layer oldLayer ) { 54 updateMarkers(); 55 } 56 57 @Override 58 public void markersUpdated( NanoLogLayer layer ) { 59 updateMarkers(); 60 } 61 62 @Override 63 public void markerActivated( NanoLogLayer layer, NanoLogEntry entry ) { 64 int idx = entry == null ? -1 : listModel.find(entry); 65 if( idx >= 0 ) { 66 logPanel.setSelectedIndex(idx); 67 Rectangle rect = logPanel.getCellBounds(Math.max(0, idx-2), Math.min(idx+4, listModel.getSize())); 68 logPanel.scrollRectToVisible(rect); 69 } 70 } 24 71 25 private class LogListModel extends AbstractListModel { 72 private class LogListModel extends AbstractListModel<String> { 73 private List<NanoLogEntry> entries; 74 private final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm:ss"); 26 75 27 76 public int getSize() { 28 return 0;77 return entries.size(); 29 78 } 30 79 31 80 public String getElementAt( int index ) { 32 return ""; // todo 81 return TIME_FORMAT.format(entries.get(index).getTime()) + " " + entries.get(index).getMessage(); 82 } 83 84 public void setEntries( List<NanoLogEntry> entries ) { 85 this.entries = entries; 86 fireContentsChanged(this, 0, entries.size()); 87 } 88 89 public int find( NanoLogEntry entry ) { 90 return entries.indexOf(entry); 33 91 } 34 92 } -
applications/editors/josm/plugins/NanoLog/src/nanolog/NanoLogPlugin.java
r27939 r30491 2 2 3 3 import java.awt.event.ActionEvent; 4 import java.io.IOException; 5 import java.util.List; 4 6 import javax.swing.JFileChooser; 7 import javax.swing.JOptionPane; 5 8 import org.openstreetmap.josm.Main; 6 9 import org.openstreetmap.josm.actions.JosmAction; 7 10 import org.openstreetmap.josm.gui.MapFrame; 11 import org.openstreetmap.josm.gui.MapView; 8 12 import org.openstreetmap.josm.plugins.Plugin; 9 13 import org.openstreetmap.josm.plugins.PluginInformation; … … 18 22 public NanoLogPlugin( PluginInformation info ) { 19 23 super(info); 20 Main.main.menu.fileMenu. add(new OpenNanoLogLayerAction());24 Main.main.menu.fileMenu.insert(new OpenNanoLogLayerAction(), 4); 21 25 } 22 26 … … 24 28 public void mapFrameInitialized( MapFrame oldFrame, MapFrame newFrame ) { 25 29 if( oldFrame == null && newFrame != null ) { 26 newFrame.addToggleDialog(new NanoLogPanel()); 30 NanoLogPanel panel = new NanoLogPanel(); 31 newFrame.addToggleDialog(panel); 32 MapView.addLayerChangeListener(panel); 27 33 } 28 34 } … … 37 43 JFileChooser fc = new JFileChooser(); 38 44 if( fc.showOpenDialog(Main.parent) == JFileChooser.APPROVE_OPTION ) { 39 // open layer, ok 45 try { 46 List<NanoLogEntry> entries = NanoLogLayer.readNanoLog(fc.getSelectedFile()); 47 if( !entries.isEmpty() ) { 48 NanoLogLayer layer = new NanoLogLayer(entries); 49 Main.main.addLayer(layer); 50 } 51 } catch( IOException ex ) { 52 JOptionPane.showMessageDialog(Main.parent, tr("Could not read NanoLog file:") + "\n" + ex.getMessage()); 53 } 40 54 } 41 55 }
Note:
See TracChangeset
for help on using the changeset viewer.