diff --git a/.classpath b/.classpath index 041e5e65..494aa0a4 100644 --- a/.classpath +++ b/.classpath @@ -3,10 +3,19 @@ - + + + + + + - + + + + + @@ -49,5 +58,34 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore index 78010540..c87e841b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -/classes -/package -/nbproject/private/ -/build/ -/dist/ \ No newline at end of file +*/target/** + +/classes/ +/target/ +/.classpath diff --git a/.project b/.project index 1e84f0c8..fead86a5 100644 --- a/.project +++ b/.project @@ -10,8 +10,14 @@ + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.m2e.core.maven2Nature org.eclipse.jdt.core.javanature diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 1759f946..39595298 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,9 +1,9 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate @@ -18,6 +18,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled @@ -59,6 +60,7 @@ org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=ignore org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled @@ -84,7 +86,9 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disa org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=ignore -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 diff --git a/build.xml b/build.xml index c6dd5352..f2808829 100644 --- a/build.xml +++ b/build.xml @@ -6,7 +6,7 @@ ############################ --> - + + 4.0.0 + com.bbn.openmap + openmap + jar + 5.1.19-SNAPSHOT + openmap + + + UTF-8 + 1.8 + 1.8 + + + + + + junit + junit + 4.12 + + provided + + + + + + + + + ./src/openmap/ + + **/*.png + **/*.gif + **/*.jpg + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + **/jai/** + **/geotiff/** + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.0.0 + + + generate-sources + + add-source + + + + ./src/ext + + + + + + + ./src/openmap/com + + + diff --git a/src/openmap/com/bbn/openmap/event/AbstractMouseMode.java b/src/openmap/com/bbn/openmap/event/AbstractMouseMode.java index 94f91176..36354703 100644 --- a/src/openmap/com/bbn/openmap/event/AbstractMouseMode.java +++ b/src/openmap/com/bbn/openmap/event/AbstractMouseMode.java @@ -28,6 +28,7 @@ import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; +import java.awt.geom.Point2D; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.Serializable; @@ -45,6 +46,7 @@ import com.bbn.openmap.MapBean; import com.bbn.openmap.MouseDelegator; import com.bbn.openmap.OMComponent; +import com.bbn.openmap.proj.Proj; import com.bbn.openmap.util.PropUtils; import com.bbn.openmap.util.propertyEditor.OptionPropertyEditor; @@ -108,6 +110,8 @@ public class AbstractMouseMode protected boolean mouseWheelListener = true; + protected boolean mouseWheelScrollLikeOSM = true; + protected boolean noMouseWheelListenerTimer = false; protected String prettyName; @@ -176,6 +180,12 @@ public class AbstractMouseMode */ public static final String MouseWheelTimerIntervalProperty = "mouseWheelTimerInterval"; + /** + * scrollwhell zoom like OSM and Google Maps, ie mouse lat,lon is mapped to + * same x,y during scrollwheel zoom + */ + public static final String MouseWheelScrollLikeOSMProperty = "mouseWheelScrollLikeOSM"; + /** * Construct an AbstractMouseMode. Default constructor, allocates the mouse * support object. @@ -460,7 +470,9 @@ public void mouseMoved(MouseEvent e) { * Invoked from the MouseWheelListener interface. */ public void mouseWheelMoved(MouseWheelEvent e) { - if (mouseWheelListener) { + if (mouseWheelListener && mouseWheelScrollLikeOSM) { + scrollWheelZoomLikeOSM(e); + } else if (mouseWheelListener) { int rot = e.getWheelRotation(); if (e.getSource() instanceof MapBean) { MapBean mb = (MapBean) e.getSource(); @@ -680,6 +692,9 @@ public void setProperties(String prefix, Properties props) { noMouseWheelListenerTimer = PropUtils.booleanFromProperties(props, prefix + NoMouseWheelListenerTimerProperty, noMouseWheelListenerTimer); mouseWheelTimerInterval = PropUtils.intFromProperties(props, prefix + MouseWheelTimerIntervalProperty, mouseWheelTimerInterval); + + mouseWheelScrollLikeOSM = PropUtils.booleanFromProperties(props, prefix + + MouseWheelScrollLikeOSMProperty, mouseWheelScrollLikeOSM); } public Properties getProperties(Properties props) { @@ -766,6 +781,8 @@ public Properties getPropertyInfo(Properties props) { "Setting for the wait interval for the mouse wheel timer", null); + PropUtils.setI18NPropertyInfo(i18n, props, thisClass, MouseWheelScrollLikeOSMProperty, "Mouse Wheel Zoom like OSM", "Setting for using OSM like zoom", "com.bbn.openmap.util.propertyEditor.YesNoPropertyEditor"); + StringBuffer cOptions = new StringBuffer(); Field[] cFields = Cursor.class.getFields(); for (int i = 0; i < cFields.length; i++) { @@ -876,4 +893,35 @@ public boolean isNoMouseWheelListenerTimer() { public void setNoMouseWheelListenerTimer(boolean noMouseWheelListenerTimer) { this.noMouseWheelListenerTimer = noMouseWheelListenerTimer; } + + /** + * Zoom like G maps and OSM keeping the mouse x,y -> lat,lon constant between + * scale changes instead of just zooming with the center fixed. Avoids having + * to constantly manually recenter the map before/after zooming. + */ + protected void scrollWheelZoomLikeOSM(MouseWheelEvent e) { + if (mouseWheelListener && e.getSource() instanceof MapBean) { + boolean direction = isZoomWhenMouseWheelUp(); + float zoomIn = 1.1f; + float zoomOut = .9f; + float amount = zoomIn; + int rot = e.getWheelRotation(); + if ((direction && rot < 0) || (!direction && rot > 0)) { + amount = zoomOut; + } + // keep cursor x,y pointing to the same lat,lon after scale + // has been changed + MapBean mapBean = (MapBean) e.getSource(); + Proj proj = (Proj) mapBean.getProjection().makeClone(); + Point2D mouseLatLon = mapBean.getCoordinates(e); + proj.setScale(mapBean.getScale() * amount); + Point2D newXyCenter = proj.forward(proj.getCenter()); + Point2D newXy = proj.forward(mouseLatLon); + Point2D centerWithOffset = new Point2D.Double(newXyCenter.getX() + + (newXy.getX() - e.getX()), newXyCenter.getY() + (newXy.getY() - e.getY())); + proj.setCenter(proj.inverse(centerWithOffset)); + mapBean.setProjection(proj); + } + } + } \ No newline at end of file diff --git a/src/openmap/com/bbn/openmap/event/NavMouseMode.java b/src/openmap/com/bbn/openmap/event/NavMouseMode.java index d7ba1927..a6d2d545 100644 --- a/src/openmap/com/bbn/openmap/event/NavMouseMode.java +++ b/src/openmap/com/bbn/openmap/event/NavMouseMode.java @@ -316,6 +316,9 @@ public void mouseDragged(MouseEvent e) { } super.mouseDragged(e); + if (point1 == null) { + return; + } Object obj = e.getSource(); diff --git a/src/openmap/com/bbn/openmap/gui/LayerStatusPane.java b/src/openmap/com/bbn/openmap/gui/LayerStatusPane.java index f30a1b04..68899726 100644 --- a/src/openmap/com/bbn/openmap/gui/LayerStatusPane.java +++ b/src/openmap/com/bbn/openmap/gui/LayerStatusPane.java @@ -26,6 +26,7 @@ import javax.swing.ButtonGroup; import javax.swing.ImageIcon; +import javax.swing.SwingUtilities; import com.bbn.openmap.Layer; import com.bbn.openmap.LayerHandler; @@ -74,10 +75,20 @@ protected LayerStatusPane(String title) { public void updateLayerStatus(LayerStatusEvent evt) { switch (evt.getStatus()) { case LayerStatusEvent.START_WORKING: - onoffButton.setSelectedIcon(layerWorking); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + onoffButton.setSelectedIcon(layerWorking); + } + }); break; case LayerStatusEvent.FINISH_WORKING: - onoffButton.setSelectedIcon(layerDone); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + onoffButton.setSelectedIcon(layerDone); + } + }); break; } } diff --git a/src/openmap/com/bbn/openmap/gui/ScaleTextPanel.java b/src/openmap/com/bbn/openmap/gui/ScaleTextPanel.java index 5eadb86e..80f3070c 100644 --- a/src/openmap/com/bbn/openmap/gui/ScaleTextPanel.java +++ b/src/openmap/com/bbn/openmap/gui/ScaleTextPanel.java @@ -27,6 +27,7 @@ import java.io.Serializable; import javax.swing.JTextField; +import javax.swing.SwingUtilities; import com.bbn.openmap.I18n; import com.bbn.openmap.MapBean; @@ -102,12 +103,18 @@ public synchronized void setProjection(Projection aProjection) { + String.valueOf(projection.getScale()) + "\""); } - String oldScale = scaleField.getText(); - String newScale = df.format(projection.getScale()); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + String oldScale = scaleField.getText(); + String newScale = df.format(projection.getScale()); - if (!oldScale.equals(newScale)) { - scaleField.setText("1:" + newScale); - } + if (!oldScale.equals(newScale)) { + scaleField.setText("1:" + newScale); + } + + } + }); } /** diff --git a/src/openmap/com/bbn/openmap/gui/StatusLightPanel.java b/src/openmap/com/bbn/openmap/gui/StatusLightPanel.java index 8944d042..ecd22668 100644 --- a/src/openmap/com/bbn/openmap/gui/StatusLightPanel.java +++ b/src/openmap/com/bbn/openmap/gui/StatusLightPanel.java @@ -252,7 +252,7 @@ public void reset() { * @param icon the icon light representing the status. */ protected void setLayerStatus(Layer layer, Icon icon) { - JButton statusgif = statusLights.get(layer); + JButton statusgif = statusLights.get(layer); if (statusgif != null) { statusgif.setIcon(icon); @@ -288,19 +288,29 @@ protected void setLayerStatus(Layer layer, Icon icon) { * * @param evt LayerStatusEvent */ - public void updateLayerStatus(LayerStatusEvent evt) { + public void updateLayerStatus(final LayerStatusEvent evt) { switch (evt.getStatus()) { // these need to be coordinated correctly by the Layer, // otherwise // we'll get phantom status ticks or maybe an ArrayOutOfBounds // negative... case LayerStatusEvent.START_WORKING: - setLayerStatus((Layer) evt.getSource(), redIcon); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + setLayerStatus((Layer) evt.getSource(), redIcon); + } + }); break; case LayerStatusEvent.STATUS_UPDATE: break; case LayerStatusEvent.FINISH_WORKING: - setLayerStatus((Layer) evt.getSource(), greenIcon); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + setLayerStatus((Layer) evt.getSource(), greenIcon); + } + }); break; default: System.err.println("InformationDelegator.updateLayerStatus(): " diff --git a/src/openmap/com/bbn/openmap/gui/menu/ProjectionMenu.java b/src/openmap/com/bbn/openmap/gui/menu/ProjectionMenu.java index 4366abcb..a5263c29 100644 --- a/src/openmap/com/bbn/openmap/gui/menu/ProjectionMenu.java +++ b/src/openmap/com/bbn/openmap/gui/menu/ProjectionMenu.java @@ -34,6 +34,7 @@ import javax.swing.ButtonGroup; import javax.swing.JMenuItem; import javax.swing.JRadioButtonMenuItem; +import javax.swing.SwingUtilities; import com.bbn.openmap.MapBean; import com.bbn.openmap.event.ProjectionEvent; @@ -124,22 +125,27 @@ public void propertyChange(PropertyChangeEvent pce) { * * @param e ProjectionEvent */ - public void projectionChanged(ProjectionEvent e) { + public void projectionChanged(final ProjectionEvent e) { - Projection newProj = e.getProjection(); + final Projection newProj = e.getProjection(); if (logger.isLoggable(Level.FINE)) { logger.fine(newProj != null ? newProj.toString() : "null"); } - if (newProj != null - && (projection == null || (!projection.equals(newProj)))) { - setProjection((Projection) newProj.makeClone()); - Object source = e.getSource(); - if (source instanceof Component) { - projComponent = (Component) source; - } - } + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + if (newProj != null + && (projection == null || (!projection.equals(newProj)))) { + setProjection((Projection) newProj.makeClone()); + Object source = e.getSource(); + if (source instanceof Component) { + projComponent = (Component) source; + } + } + } + }); } /** diff --git a/src/openmap/com/bbn/openmap/io/BinaryBufferedFile.java b/src/openmap/com/bbn/openmap/io/BinaryBufferedFile.java index 10a0c76c..1512b6b2 100644 --- a/src/openmap/com/bbn/openmap/io/BinaryBufferedFile.java +++ b/src/openmap/com/bbn/openmap/io/BinaryBufferedFile.java @@ -488,7 +488,7 @@ public void readIntegerArray(int vec[], int offset, int len) for (int i = 0; i < reallyread; i++) { vec[offset++] = MoreMath.BuildIntegerBE(buffer, cursor); cursor += 4; - } + } } else { for (int i = 0; i < reallyread; i++) { vec[offset++] = MoreMath.BuildIntegerLE(buffer, cursor); @@ -582,4 +582,13 @@ public String readFixedLengthString(int length) throws EOFException, } return retstring; } + + @Override + public void close() throws IOException { + super.close(); + firstbyteoffset = 0; + bytesinbuffer = 0; + curptr = 0; + } + } \ No newline at end of file diff --git a/src/openmap/com/bbn/openmap/layer/BufferedLayer.java b/src/openmap/com/bbn/openmap/layer/BufferedLayer.java index b724493a..b650dcd5 100644 --- a/src/openmap/com/bbn/openmap/layer/BufferedLayer.java +++ b/src/openmap/com/bbn/openmap/layer/BufferedLayer.java @@ -46,6 +46,7 @@ import javax.swing.JCheckBox; import javax.swing.JPanel; import javax.swing.JTabbedPane; +import javax.swing.SwingUtilities; import com.bbn.openmap.BufferedMapBean; import com.bbn.openmap.Layer; @@ -372,9 +373,14 @@ public Paint getBckgrnd(Paint paint) { * necessary. */ @Override - public void projectionChanged(ProjectionEvent pevent) { + public void projectionChanged(final ProjectionEvent pevent) { // Just pass it on, let the layers decide if they have to update. - mapBean.setProjection(pevent.getProjection()); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + mapBean.setProjection(pevent.getProjection()); + } + }); } /** diff --git a/src/openmap/com/bbn/openmap/layer/shape/SpatialIndex.java b/src/openmap/com/bbn/openmap/layer/shape/SpatialIndex.java index dac6af02..e39377fa 100644 --- a/src/openmap/com/bbn/openmap/layer/shape/SpatialIndex.java +++ b/src/openmap/com/bbn/openmap/layer/shape/SpatialIndex.java @@ -1138,6 +1138,8 @@ protected void indexPolygons(InputStream is, long ptr, OutputStream os) { polyBounds = readBox(recBuf, 4); } else { polyBounds = new ESRIBoundingBox(); + polyBounds.min = new ESRIPoint(); + polyBounds.max = new ESRIPoint(); } ptr += recLengthBytes + 8; diff --git a/src/openmap/com/bbn/openmap/layer/vpf/VPFConfig.java b/src/openmap/com/bbn/openmap/layer/vpf/VPFConfig.java index c58ee139..c3f5de44 100644 --- a/src/openmap/com/bbn/openmap/layer/vpf/VPFConfig.java +++ b/src/openmap/com/bbn/openmap/layer/vpf/VPFConfig.java @@ -374,7 +374,7 @@ public void valueChanged(TreeSelectionEvent e) { @SuppressWarnings("unchecked") protected void loadCurrentFeatures(DefaultMutableTreeNode top, String featureName, LayerGraphicWarehouseSupport warehouse) { - Enumeration treeEnum = top.children(); + Enumeration treeEnum = top.children(); while (treeEnum.hasMoreElements()) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) treeEnum.nextElement(); Object obj = node.getUserObject(); diff --git a/src/openmap/com/bbn/openmap/omGraphics/OMDistance.java b/src/openmap/com/bbn/openmap/omGraphics/OMDistance.java index 60e7b991..9decfd4d 100644 --- a/src/openmap/com/bbn/openmap/omGraphics/OMDistance.java +++ b/src/openmap/com/bbn/openmap/omGraphics/OMDistance.java @@ -34,7 +34,6 @@ import com.bbn.openmap.proj.LineCoordinateGenerator; import com.bbn.openmap.proj.ProjMath; import com.bbn.openmap.proj.Projection; -import com.bbn.openmap.util.Debug; import com.bbn.openmap.util.DeepCopyUtil; /** @@ -260,6 +259,10 @@ public boolean generate(Projection proj) { * @param g java.awt.Graphics to paint the poly onto. */ public void render(Graphics g) { + if (!isVisible()) { + return; + } + super.render(g); if (!paintOnlyPoly) { diff --git a/src/openmap/com/bbn/openmap/omGraphics/OMPoly.java b/src/openmap/com/bbn/openmap/omGraphics/OMPoly.java index 56c6c1f8..118ec16a 100644 --- a/src/openmap/com/bbn/openmap/omGraphics/OMPoly.java +++ b/src/openmap/com/bbn/openmap/omGraphics/OMPoly.java @@ -758,7 +758,10 @@ public boolean shouldRenderFill() { * @param g java.awt.Graphics to paint the poly onto. */ public void render(Graphics g) { - + if (!isVisible()) { + return; + } + if (getShape() != null) { super.render(g); diff --git a/src/openmap/com/bbn/openmap/omGraphics/OMRangeRings.java b/src/openmap/com/bbn/openmap/omGraphics/OMRangeRings.java index 5b39a483..d5ee44b3 100755 --- a/src/openmap/com/bbn/openmap/omGraphics/OMRangeRings.java +++ b/src/openmap/com/bbn/openmap/omGraphics/OMRangeRings.java @@ -323,6 +323,9 @@ public boolean generate(Projection proj) { * @param g Graphics context to render into */ public void render(Graphics g) { + if (!isVisible()) { + return; + } super.render(g); drawingAttributes.setFrom(this); diff --git a/src/openmap/com/bbn/openmap/util/BrowserLauncher2WebBrowser.java b/src/openmap/com/bbn/openmap/util/BrowserLauncher2WebBrowser.java index dcf63398..97a1d316 100644 --- a/src/openmap/com/bbn/openmap/util/BrowserLauncher2WebBrowser.java +++ b/src/openmap/com/bbn/openmap/util/BrowserLauncher2WebBrowser.java @@ -22,9 +22,16 @@ package com.bbn.openmap.util; -import edu.stanford.ejalbert.BrowserLauncher; -import edu.stanford.ejalbert.exception.BrowserLaunchingInitializingException; -import edu.stanford.ejalbert.exception.UnsupportedOperatingSystemException; +import static java.util.logging.Level.*; + +import java.awt.Desktop; +import java.net.URI; +import java.util.logging.Level; +import java.util.logging.Logger; + +//import edu.stanford.ejalbert.BrowserLauncher; +//import edu.stanford.ejalbert.exception.BrowserLaunchingInitializingException; +//import edu.stanford.ejalbert.exception.UnsupportedOperatingSystemException; /** * A WebBrowser implementation that uses BrowserLauncher2. Requires the @@ -35,22 +42,24 @@ */ public class BrowserLauncher2WebBrowser extends WebBrowser { - BrowserLauncher browserLauncher; + private static Logger log = Logger.getLogger(BrowserLauncher2WebBrowser.class.getName()); + + // BrowserLauncher browserLauncher; /** * Create a web browser that delegates launching to BrowserLauncher2. * */ public BrowserLauncher2WebBrowser() { - try { - browserLauncher = new BrowserLauncher(); - } catch (BrowserLaunchingInitializingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (UnsupportedOperatingSystemException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + // try { + // browserLauncher = new BrowserLauncher(); + // } catch (BrowserLaunchingInitializingException e) { + // // TODO Auto-generated catch block + // e.printStackTrace(); + // } catch (UnsupportedOperatingSystemException e) { + // // TODO Auto-generated catch block + // e.printStackTrace(); + // } } /** @@ -60,8 +69,16 @@ public BrowserLauncher2WebBrowser() { * @param urlString URL * */ + // public void launch(String urlString) { + // browserLauncher.openURLinBrowser(urlString); + // } + public void launch(String urlString) { - browserLauncher.openURLinBrowser(urlString); + try { + Desktop.getDesktop().browse(new URI(urlString)); + } catch (Exception e) { + log.log(SEVERE, "Could not open url " + urlString, e); + } } } \ No newline at end of file