Revision: 6040 http://sourceforge.net/p/jump-pilot/code/6040 Author: edso Date: 2018-12-27 15:37:54 +0000 (Thu, 27 Dec 2018) Log Message: ----------- reformatted before editing
Modified Paths: -------------- core/trunk/src/com/vividsolutions/jump/workbench/ui/zoom/ZoomBar.java Modified: core/trunk/src/com/vividsolutions/jump/workbench/ui/zoom/ZoomBar.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/workbench/ui/zoom/ZoomBar.java 2018-12-27 15:06:19 UTC (rev 6039) +++ core/trunk/src/com/vividsolutions/jump/workbench/ui/zoom/ZoomBar.java 2018-12-27 15:37:54 UTC (rev 6040) @@ -80,810 +80,751 @@ public class ZoomBar extends JPanel implements Java2DConverter.PointConverter { - private int totalGeometries() { - int totalGeometries = 0; - // Restrict count to visible layers [mmichaud 2007-05-27] - for (Layer layer : layerViewPanel().getLayerManager().getVisibleLayers(true)) { - totalGeometries += layer.getFeatureCollectionWrapper().size(); + private int totalGeometries() { + int totalGeometries = 0; + // Restrict count to visible layers [mmichaud 2007-05-27] + for (Layer layer : layerViewPanel().getLayerManager().getVisibleLayers(true)) { + totalGeometries += layer.getFeatureCollectionWrapper().size(); + } + return totalGeometries; + } + + private Envelope lastGoodEnvelope = null; + private WorkbenchFrame frame; + + private JSlider slider = new JSlider(); + private JLabel label = new JLabel(); + private IncrementChooser incrementChooser = new IncrementChooser(); + private Collection metricUnits = new MetricSystem(1).createUnits(); + + // Add java2DConverter and affineTransform for coordinate decimation + private Java2DConverter java2DConverter; + private AffineTransform affineTransform; + + public ZoomBar(boolean showingSliderLabels, boolean showingRightSideLabel, WorkbenchFrame frame) + throws NoninvertibleTransformException { + this.frame = frame; + this.showingSliderLabels = showingSliderLabels; + slider.addComponentListener(new ComponentAdapter() { + public void componentResized(ComponentEvent e) { + try { + updateComponents(); + } catch (NoninvertibleTransformException x) { + // Eat it. [Jon Aquino] } - return totalGeometries; + } + }); + if (showingSliderLabels) { + // Add a dummy label so that ZoomBars added to Toolboxes are + // packed properly. [Jon Aquino] + Hashtable<Integer, JLabel> labelTable = new Hashtable<>(); + labelTable.put(0, new JLabel(" ")); + slider.setLabelTable(labelTable); } + try { + jbInit(); + } catch (Exception ex) { + ex.printStackTrace(); + } + if (!showingRightSideLabel) { + remove(label); + } + label.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 3 && SwingUtilities.isRightMouseButton(e)) { + viewBlackboard().put(USER_DEFINED_MIN_SCALE, null); + viewBlackboard().put(USER_DEFINED_MAX_SCALE, null); + clearModelCaches(); + } + } + }); + slider.addMouseMotionListener(new MouseMotionAdapter() { + // Use #mouseDragged rather than JSlider#stateChanged because we + // are interested in user-initiated slider changes, not programmatic + // slider changes. [Jon Aquino] + public void mouseDragged(MouseEvent e) { + try { + layerViewPanel().erase((Graphics2D) layerViewPanel().getGraphics()); + drawWireframe(); + ScaleBarRenderer scaleBarRenderer = (ScaleBarRenderer) layerViewPanel().getRenderingManager() + .getRenderer(ScaleBarRenderer.CONTENT_ID); + if (scaleBarRenderer != null) { + scaleBarRenderer.paint((Graphics2D) layerViewPanel().getGraphics(), getScale()); + } + updateLabel(); + } catch (NoninvertibleTransformException x) { + // Eat it. [Jon Aquino] + } + } + }); + if (slider.getUI() instanceof BasicSliderUI) { + slider.addMouseMotionListener(new MouseMotionAdapter() { + public void mouseMoved(MouseEvent e) { + if (layerViewPanel() == dummyLayerViewPanel) { + return; + } + // try { + slider.setToolTipText(I18N.get("ui.zoom.ZoomBar.zoom-to") + " " + + chooseGoodIncrement(toScale(((BasicSliderUI) slider.getUI()).valueForXPosition(e.getX()))).toString()); + // } catch (NoninvertibleTransformException x) { + // slider.setToolTipText(I18N.get("ui.zoom.ZoomBar.zoom")); + // } + } + }); + } + // label.setPreferredSize(new Dimension(50, label.getHeight())); + slider.addKeyListener(new KeyAdapter() { + public void keyReleased(KeyEvent e) { + try { + if (e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_RIGHT) { + gestureFinished(); + } + } catch (NoninvertibleTransformException t) { + layerViewPanel().getContext().handleThrowable(t); + } + } + }); + slider.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + if (!slider.isEnabled()) { + return; + } + layerViewPanel().getRenderingManager().setPaintingEnabled(false); + } - private Envelope lastGoodEnvelope = null; - private WorkbenchFrame frame; + public void mouseReleased(MouseEvent e) { + try { + gestureFinished(); + } catch (NoninvertibleTransformException t) { + layerViewPanel().getContext().handleThrowable(t); + } + } + }); - private JSlider slider = new JSlider(); - private JLabel label = new JLabel(); - private IncrementChooser incrementChooser = new IncrementChooser(); - private Collection metricUnits = new MetricSystem(1).createUnits(); - - // Add java2DConverter and affineTransform for coordinate decimation - private Java2DConverter java2DConverter; - private AffineTransform affineTransform; + // + // Whenever anything happens on an internal frame we want to do this. + // + GUIUtil.addInternalFrameListener(frame.getDesktopPane(), GUIUtil.toInternalFrameListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + installListenersOnCurrentPanel(); + try { + updateComponents(); + } catch (NoninvertibleTransformException x) { + // Eat it. [Jon Aquino] + } + } + })); + // added to use the decimator implemented in Java2DConverter [mmichaud + // 2007-05-27] + java2DConverter = new Java2DConverter(this, 2); - public ZoomBar( - boolean showingSliderLabels, - boolean showingRightSideLabel, - WorkbenchFrame frame) - throws NoninvertibleTransformException { - this.frame = frame; - this.showingSliderLabels = showingSliderLabels; - slider.addComponentListener(new ComponentAdapter() { - public void componentResized(ComponentEvent e) { - try { - updateComponents(); - } catch (NoninvertibleTransformException x) { - //Eat it. [Jon Aquino] - } - } - }); - if (showingSliderLabels) { - //Add a dummy label so that ZoomBars added to Toolboxes are - //packed properly. [Jon Aquino] - Hashtable<Integer,JLabel> labelTable = new Hashtable<>(); - labelTable.put(0, new JLabel(" ")); - slider.setLabelTable(labelTable); - } - try { - jbInit(); - } catch (Exception ex) { - ex.printStackTrace(); - } - if (!showingRightSideLabel) { - remove(label); - } - label.addMouseListener(new MouseAdapter() { - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 3 && SwingUtilities.isRightMouseButton(e)) { - viewBlackboard().put(USER_DEFINED_MIN_SCALE, null); - viewBlackboard().put(USER_DEFINED_MAX_SCALE, null); - clearModelCaches(); - } - } - }); - slider.addMouseMotionListener(new MouseMotionAdapter() { - //Use #mouseDragged rather than JSlider#stateChanged because we - //are interested in user-initiated slider changes, not programmatic - //slider changes. [Jon Aquino] - public void mouseDragged(MouseEvent e) { - try { - layerViewPanel().erase((Graphics2D) layerViewPanel().getGraphics()); - drawWireframe(); - ScaleBarRenderer scaleBarRenderer = - (ScaleBarRenderer) layerViewPanel().getRenderingManager().getRenderer( - ScaleBarRenderer.CONTENT_ID); - if (scaleBarRenderer != null) { - scaleBarRenderer.paint( - (Graphics2D) layerViewPanel().getGraphics(), - getScale()); - } - updateLabel(); - } catch (NoninvertibleTransformException x) { - //Eat it. [Jon Aquino] - } - } - }); - if (slider.getUI() instanceof BasicSliderUI) { - slider.addMouseMotionListener(new MouseMotionAdapter() { - public void mouseMoved(MouseEvent e) { - if (layerViewPanel() == dummyLayerViewPanel) { - return; - } - //try { - slider.setToolTipText( - I18N.get("ui.zoom.ZoomBar.zoom-to")+" " - + chooseGoodIncrement( - toScale( - ((BasicSliderUI) slider.getUI()).valueForXPosition( - e.getX()))) - .toString()); - //} catch (NoninvertibleTransformException x) { - // slider.setToolTipText(I18N.get("ui.zoom.ZoomBar.zoom")); - //} - } - }); - } - //label.setPreferredSize(new Dimension(50, label.getHeight())); - slider.addKeyListener(new KeyAdapter() { - public void keyReleased(KeyEvent e) { - try { - if (e.getKeyCode() == KeyEvent.VK_LEFT - || e.getKeyCode() == KeyEvent.VK_RIGHT) { - gestureFinished(); - } - } catch (NoninvertibleTransformException t) { - layerViewPanel().getContext().handleThrowable(t); - } - } - }); - slider.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - if (!slider.isEnabled()) { - return; - } - layerViewPanel().getRenderingManager().setPaintingEnabled(false); - } - public void mouseReleased(MouseEvent e) { - try { - gestureFinished(); - } catch (NoninvertibleTransformException t) { - layerViewPanel().getContext().handleThrowable(t); - } - } - }); + installListenersOnCurrentPanel(); + updateComponents(); + } - // - // Whenever anything happens on an internal frame we want to do this. - // - GUIUtil.addInternalFrameListener( - frame.getDesktopPane(), - GUIUtil.toInternalFrameListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - installListenersOnCurrentPanel(); - try { - updateComponents(); - } catch (NoninvertibleTransformException x) { - //Eat it. [Jon Aquino] - } - } - })); + private void installListenersOnCurrentPanel() { + installViewListeners(); + installModelListeners(); + } - // added to use the decimator implemented in Java2DConverter [mmichaud 2007-05-27] - java2DConverter = new Java2DConverter(this, 2); - - installListenersOnCurrentPanel(); - updateComponents(); - } + private void installViewListeners() { - - private void installListenersOnCurrentPanel() { - installViewListeners(); - installModelListeners(); + // Use hash code to uniquely identify this zoom bar (there may be other + // zoom bars) [Jon Aquino] + String VIEW_LISTENERS_INSTALLED_KEY = Integer.toHexString(hashCode()) + " - VIEW LISTENERS INSTALLED"; + if (viewBlackboard().get(VIEW_LISTENERS_INSTALLED_KEY) != null) { + return; } - - private void installViewListeners() { - - //Use hash code to uniquely identify this zoom bar (there may be other - //zoom bars) [Jon Aquino] - String VIEW_LISTENERS_INSTALLED_KEY = - Integer.toHexString(hashCode()) + " - VIEW LISTENERS INSTALLED"; - if (viewBlackboard().get(VIEW_LISTENERS_INSTALLED_KEY) != null) { - return; + if (layerViewPanel() == null) { + return; + } + layerViewPanel().getViewport().addListener(new ViewportListener() { + public void zoomChanged(Envelope modelEnvelope) { + if (!viewBlackboard().get(CENTRE_LOCKED_KEY, false)) { + viewBlackboard().put(CENTRE_KEY, null); } - if ( layerViewPanel() == null ){ - return; + viewBlackboard().put(SCALE_KEY, null); + try { + if (layerViewPanel().getViewport().getScale() < getMinScale()) { + viewBlackboard().put(USER_DEFINED_MIN_SCALE, layerViewPanel().getViewport().getScale()); + } + if (layerViewPanel().getViewport().getScale() > getMaxScale()) { + viewBlackboard().put(USER_DEFINED_MAX_SCALE, layerViewPanel().getViewport().getScale()); + } + updateComponents(); + } catch (NoninvertibleTransformException e) { + // Eat it. [Jon Aquino] } - layerViewPanel().getViewport().addListener(new ViewportListener() { - public void zoomChanged(Envelope modelEnvelope) { - if (!viewBlackboard().get(CENTRE_LOCKED_KEY, false)) { - viewBlackboard().put(CENTRE_KEY, null); - } - viewBlackboard().put(SCALE_KEY, null); - try { - if (layerViewPanel().getViewport().getScale() < getMinScale()) { - viewBlackboard().put( - USER_DEFINED_MIN_SCALE, - layerViewPanel().getViewport().getScale()); - } - if (layerViewPanel().getViewport().getScale() > getMaxScale()) { - viewBlackboard().put( - USER_DEFINED_MAX_SCALE, - layerViewPanel().getViewport().getScale()); - } - updateComponents(); - } catch (NoninvertibleTransformException e) { - //Eat it. [Jon Aquino] - } - } - }); - viewBlackboard().put(VIEW_LISTENERS_INSTALLED_KEY, new Object()); + } + }); + viewBlackboard().put(VIEW_LISTENERS_INSTALLED_KEY, new Object()); + } + + private void installModelListeners() { + + // Use hash code to uniquely identify this zoom bar (there may be other + // zoom bars) [Jon Aquino] + String MODEL_LISTENERS_INSTALLED_KEY = Integer.toHexString(hashCode()) + " - MODEL LISTENERS INSTALLED"; + if (viewBlackboard().get(MODEL_LISTENERS_INSTALLED_KEY) != null) { + return; } + if (layerViewPanel() == null) { + return; + } - private void installModelListeners() { + layerViewPanel().getLayerManager().addLayerListener(new LayerListener() { + public void categoryChanged(CategoryEvent e) { + } - //Use hash code to uniquely identify this zoom bar (there may be other - //zoom bars) [Jon Aquino] - String MODEL_LISTENERS_INSTALLED_KEY = - Integer.toHexString(hashCode()) + " - MODEL LISTENERS INSTALLED"; - if (viewBlackboard().get(MODEL_LISTENERS_INSTALLED_KEY) != null) { - return; + public void featuresChanged(FeatureEvent e) { + if (e.getType() == FeatureEventType.ADDED || e.getType() == FeatureEventType.DELETED + || e.getType() == FeatureEventType.GEOMETRY_MODIFIED) { + clearModelCaches(); } - if ( layerViewPanel() == null ){ - return; + } + + // add LayerEventType.VISIBILITY_CHANGED condition [mmichaud 2007-05-27] + public void layerChanged(LayerEvent e) { + if (e.getType() == LayerEventType.ADDED || e.getType() == LayerEventType.REMOVED + || e.getType() == LayerEventType.VISIBILITY_CHANGED) { + clearModelCaches(); } + } + }); + viewBlackboard().put(MODEL_LISTENERS_INSTALLED_KEY, new Object()); + } - layerViewPanel().getLayerManager().addLayerListener(new LayerListener() { - public void categoryChanged(CategoryEvent e) {} - public void featuresChanged(FeatureEvent e) { - if (e.getType() == FeatureEventType.ADDED - || e.getType() == FeatureEventType.DELETED - || e.getType() == FeatureEventType.GEOMETRY_MODIFIED) { - clearModelCaches(); - } - } - // add LayerEventType.VISIBILITY_CHANGED condition [mmichaud 2007-05-27] - public void layerChanged(LayerEvent e) { - if (e.getType() == LayerEventType.ADDED || - e.getType() == LayerEventType.REMOVED || - e.getType() == LayerEventType.VISIBILITY_CHANGED) { - clearModelCaches(); - } - } - }); - viewBlackboard().put(MODEL_LISTENERS_INSTALLED_KEY, new Object()); + private void queueComponentUpdate() { + componentUpdateTimer.restart(); + } + + /** Coalesces component updates */ + private Timer componentUpdateTimer = GUIUtil.createRestartableSingleEventTimer(200, new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + updateComponents(); + } catch (NoninvertibleTransformException x) { + // Eat it. [Jon Aquino] + } } + }); - private void queueComponentUpdate() { - componentUpdateTimer.restart(); + public void updateComponents() throws NoninvertibleTransformException { + LayerViewPanel layerViewPanel = layerViewPanel(); + if (layerViewPanel == dummyLayerViewPanel || layerViewPanel == null) { + setComponentsEnabled(false); + return; } + setComponentsEnabled(true); + // Must set slider value *before* updating the label on the right. [Jon Aquino] + // I'm currently hiding the label on the right, to save real estate. [Jon + // Aquino] + slider.setValue(toSliderValue(viewBlackboard().get(SCALE_KEY, layerViewPanel.getViewport().getScale()))); + updateLabel(); + updateSliderLabels(); + } - /** Coalesces component updates */ - private Timer componentUpdateTimer = - GUIUtil.createRestartableSingleEventTimer(200, new ActionListener() { - public void actionPerformed(ActionEvent e) { - try { - updateComponents(); - } catch (NoninvertibleTransformException x) { - //Eat it. [Jon Aquino] - } - } - }); + private void gestureFinished() throws NoninvertibleTransformException { + if (!slider.isEnabled()) { + return; + } + try { + viewBlackboard().put(CENTRE_LOCKED_KEY, true); + try { + layerViewPanel().getViewport().zoom(proposedModelEnvelope()); + } finally { + viewBlackboard().put(CENTRE_LOCKED_KEY, false); + } + } finally { + layerViewPanel().getRenderingManager().setPaintingEnabled(true); + } + } - public void updateComponents() throws NoninvertibleTransformException { - LayerViewPanel layerViewPanel = layerViewPanel(); - if (layerViewPanel == dummyLayerViewPanel || layerViewPanel == null) { - setComponentsEnabled(false); - return; - } - setComponentsEnabled(true); - //Must set slider value *before* updating the label on the right. [Jon Aquino] - //I'm currently hiding the label on the right, to save real estate. [Jon Aquino] - slider.setValue( - toSliderValue( - viewBlackboard().get(SCALE_KEY, layerViewPanel.getViewport().getScale()) - ) - ); - updateLabel(); - updateSliderLabels(); + private Envelope proposedModelEnvelope() throws NoninvertibleTransformException { + Coordinate centre = (Coordinate) viewBlackboard().get(CENTRE_KEY, + EnvelopeUtil.centre(layerViewPanel().getViewport().getEnvelopeInModelCoordinates())); + double width = layerViewPanel().getWidth() / getScale(); + double height = layerViewPanel().getHeight() / getScale(); + Envelope proposedModelEnvelope = new Envelope(centre.x - (width / 2), centre.x + (width / 2), + centre.y - (height / 2), centre.y + (height / 2)); + if (proposedModelEnvelope.getWidth() == 0 || proposedModelEnvelope.getHeight() == 0) { + // We're zoomed waaay out! Avoid infinite scale. [Jon Aquino] + proposedModelEnvelope = lastGoodEnvelope; + } else { + lastGoodEnvelope = proposedModelEnvelope; } + return proposedModelEnvelope; + } - private void gestureFinished() throws NoninvertibleTransformException { - if (!slider.isEnabled()) { - return; + /** + * Return the scale of the view according to the zoom bar + */ + // getScale() public to implement Java2DConverter.PointConverter [mmichaud + // 2007-05-26] + public double getScale() throws NoninvertibleTransformException { + return toScale(slider.getValue()); + } + + private Stroke stroke = new BasicStroke(1); + + private void drawWireframe() throws NoninvertibleTransformException { + Graphics2D g = (Graphics2D) layerViewPanel().getGraphics(); + g.setColor(Color.lightGray); + g.setStroke(stroke); + g.draw(getWireFrame()); + } + + private static final String SEGMENT_CACHE_KEY = ZoomBar.class.getName() + " - SEGMENT CACHE"; + + private void clearModelCaches() { + // Use LayerManager blackboard for segment cache, so that multiple + // views can share it. [Jon Aquino] + modelBlackboard().put(SEGMENT_CACHE_KEY, null); + modelBlackboard().put(MIN_EXTENT_KEY, null); + modelBlackboard().put(MAX_EXTENT_KEY, null); + // It's expensive to recompute these cached values, so queue the call + // to #updateComponents [Jon Aquino] + queueComponentUpdate(); + } + + // private LineSegmentEnvelopeIntersector lineSegmentEnvelopeIntersector = + // new LineSegmentEnvelopeIntersector(); + + // Modified by [mmichaud 2007-05-26] to use decimation algorithm from + // Java2DConverter + private Shape getWireFrame() throws NoninvertibleTransformException { + // affineTransform computed according to the zoombar slider (getScale) + affineTransform = Viewport.modelToViewTransform(getScale(), + new Point2D.Double(proposedModelEnvelope().getMinX(), proposedModelEnvelope().getMinY()), + layerViewPanel().getSize().getHeight()); + // view2D rectangle + Rectangle2D view2D = new Rectangle2D.Double(0.0, 0.0, layerViewPanel().getWidth(), layerViewPanel().getWidth()); + GeneralPath wireFrame = new GeneralPath(); + List<Coordinate[]> segments = new ArrayList<>(getSegmentCache()); + segments.addAll(toSegments(largeOnScreenGeometries())); + for (Coordinate[] coords : segments) { + Coordinate[] coordinates = java2DConverter.toViewCoordinates(coords); + boolean drawing = false; + + for (int j = 1; j < coordinates.length; j++) { + if (!view2D.intersectsLine(coordinates[j - 1].x, coordinates[j - 1].y, coordinates[j].x, coordinates[j].y)) { + drawing = false; + continue; } - try { - viewBlackboard().put(CENTRE_LOCKED_KEY, true); - try { - layerViewPanel().getViewport().zoom(proposedModelEnvelope()); - } finally { - viewBlackboard().put(CENTRE_LOCKED_KEY, false); - } - } finally { - layerViewPanel().getRenderingManager().setPaintingEnabled(true); + if (!drawing) { + wireFrame.moveTo((float) coordinates[j - 1].x, (float) coordinates[j - 1].y); } + wireFrame.lineTo((float) coordinates[j].x, (float) coordinates[j].y); + drawing = true; + } + } + return wireFrame; - private Envelope proposedModelEnvelope() throws NoninvertibleTransformException { - Coordinate centre = - (Coordinate) viewBlackboard().get( - CENTRE_KEY, - EnvelopeUtil.centre( - layerViewPanel().getViewport().getEnvelopeInModelCoordinates())); - double width = layerViewPanel().getWidth() / getScale(); - double height = layerViewPanel().getHeight() / getScale(); - Envelope proposedModelEnvelope = - new Envelope( - centre.x - (width / 2), - centre.x + (width / 2), - centre.y - (height / 2), - centre.y + (height / 2)); - if (proposedModelEnvelope.getWidth() == 0 || proposedModelEnvelope.getHeight() == 0) { - //We're zoomed waaay out! Avoid infinite scale. [Jon Aquino] - proposedModelEnvelope = lastGoodEnvelope; - } else { - lastGoodEnvelope = proposedModelEnvelope; + } + + private Collection<Coordinate[]> getSegmentCache() { + // Use LayerManager blackboard for segment cache, so that multiple + // views can share it. [Jon Aquino] + if (modelBlackboard().get(SEGMENT_CACHE_KEY) == null) { + modelBlackboard().put(SEGMENT_CACHE_KEY, toSegments(largeGeometries(LARGE_GEOMETRIES))); + // + // We only want to do this when a frame closes. If we don't clear the + // cache in the blackboard then we'll get a memory leak. + // + frame.getActiveInternalFrame().addInternalFrameListener(new InternalFrameAdapter() { + public void internalFrameClosing(InternalFrameEvent e) { + modelBlackboard().put(SEGMENT_CACHE_KEY, null); } - return proposedModelEnvelope; + }); } - - /** - * Return the scale of the view according to the zoom bar - */ - //getScale() public to implement Java2DConverter.PointConverter [mmichaud 2007-05-26] - public double getScale() throws NoninvertibleTransformException { - return toScale(slider.getValue()); - } - - private Stroke stroke = new BasicStroke(1); + return (Collection<Coordinate[]>) modelBlackboard().get(SEGMENT_CACHE_KEY); + } - private void drawWireframe() throws NoninvertibleTransformException { - Graphics2D g = (Graphics2D) layerViewPanel().getGraphics(); - g.setColor(Color.lightGray); - g.setStroke(stroke); - g.draw(getWireFrame()); + private Collection<Coordinate[]> toSegments(Collection<Geometry> geometries) { + List<Coordinate[]> segments = new ArrayList<>(); + for (Geometry geometry : geometries) { + segments.addAll(CoordinateArrays.toCoordinateArrays(geometry, false)); } + return segments; + } - private static final String SEGMENT_CACHE_KEY = ZoomBar.class.getName() + " - SEGMENT CACHE"; + // Replace RANDOM_ONSCREEN_GEOMETRIES by LARGE_ONSCREEN_GEOMETRIES + // private static final int RANDOM_ONSCREEN_GEOMETRIES = 100; + // private static final int RANDOM_GEOMETRIES = 100; + private static final int LARGE_GEOMETRIES = 100; + private static final int LARGE_ONSCREEN_GEOMETRIES = 200; - private void clearModelCaches() { - //Use LayerManager blackboard for segment cache, so that multiple - //views can share it. [Jon Aquino] - modelBlackboard().put(SEGMENT_CACHE_KEY, null); - modelBlackboard().put(MIN_EXTENT_KEY, null); - modelBlackboard().put(MAX_EXTENT_KEY, null); - //It's expensive to recompute these cached values, so queue the call - //to #updateComponents [Jon Aquino] - queueComponentUpdate(); - } + // start [mmichaud] + // additional code to replace randomGeometries by a largestGeometries approach + // one bad side effect of random geometries approach was visible for a big set + // of points + // and a small set of polygons : polygons were not visible because of the + // proportional + // selection of geometries, and points are not displayed :-( - //private LineSegmentEnvelopeIntersector lineSegmentEnvelopeIntersector = - // new LineSegmentEnvelopeIntersector(); + // static final Comparator MAX_SIZE_COMPARATOR = new Comparator() { + // public int compare(Object f1, Object f2) { + // Envelope env1 = ((Feature)f1).getGeometry().getEnvelopeInternal(); + // Envelope env2 = ((Feature)f2).getGeometry().getEnvelopeInternal(); + // double size1 = Math.max(env1.getWidth(), env1.getHeight()); + // double size2 = Math.max(env2.getWidth(), env2.getHeight()); + // return size1 < size2 ? 1 : (size1 > size2 ? -1 : 0); + // } + // }; - // Modified by [mmichaud 2007-05-26] to use decimation algorithm from Java2DConverter - private Shape getWireFrame() throws NoninvertibleTransformException { - // affineTransform computed according to the zoombar slider (getScale) - affineTransform = Viewport.modelToViewTransform( - getScale(), - new Point2D.Double( - proposedModelEnvelope().getMinX(), proposedModelEnvelope().getMinY()), - layerViewPanel().getSize().getHeight()); - // view2D rectangle - Rectangle2D view2D = new Rectangle2D.Double( - 0.0, 0.0, layerViewPanel().getWidth(), layerViewPanel().getWidth()); - GeneralPath wireFrame = new GeneralPath(); - List<Coordinate[]> segments = new ArrayList<>(getSegmentCache()); - segments.addAll(toSegments(largeOnScreenGeometries())); - for (Coordinate[] coords : segments) { - Coordinate[] coordinates = java2DConverter.toViewCoordinates(coords); - boolean drawing = false; - - for (int j = 1; j < coordinates.length; j++) { - if (!view2D.intersectsLine(coordinates[j - 1].x, coordinates[j - 1].y, - coordinates[j].x, coordinates[j].y)) { - drawing = false; - continue; - } - if (!drawing) { - wireFrame.moveTo((float) coordinates[j - 1].x, - (float) coordinates[j - 1].y); - } - wireFrame.lineTo((float) coordinates[j].x, - (float) coordinates[j].y); - drawing = true; - } - + // Collect large geometries in a single pass (focus on efficiency rather than + // precision) + // Explore maxSize * 10 geometries (not all geometries) + // up to maxSize/2, select geometries with areas > mean previously selected area + // after maxSize/2, select geometries with areas > max previously selected areas + private Collection<Geometry> largeGeometries(int maxSize, List<Feature> features) { + // Collections.sort(features, MAX_SIZE_COMPARATOR); + int step = features.size() / maxSize / 10; + double totalArea = 0; + double meanArea = 0; + double maxArea = 0; + int countTotal = 0; + int countExplored = 0; + List<Geometry> largeGeometries = new ArrayList<>(); + for (Feature feature : features) { + if (countTotal % Math.max(step, 1) == 0) { + boolean firstHalf = largeGeometries.size() < maxSize / 2; + Geometry geom = feature.getGeometry(); + countExplored++; + double area = geom.getArea(); + totalArea += area; + if ((firstHalf && area >= meanArea) || area > maxArea) { + largeGeometries.add(geom); } - return wireFrame; - + meanArea = totalArea / countExplored; + if (area > maxArea) + maxArea = area; + countTotal++; + } + if (largeGeometries.size() >= maxSize) + break; } + return largeGeometries; + } - private Collection<Coordinate[]> getSegmentCache() { - //Use LayerManager blackboard for segment cache, so that multiple - //views can share it. [Jon Aquino] - if (modelBlackboard().get(SEGMENT_CACHE_KEY) == null) { - modelBlackboard().put(SEGMENT_CACHE_KEY, toSegments(largeGeometries(LARGE_GEOMETRIES))); - // - // We only want to do this when a frame closes. If we don't clear the - // cache in the blackboard then we'll get a memory leak. - // - frame.getActiveInternalFrame().addInternalFrameListener( - new InternalFrameAdapter() { - public void internalFrameClosing(InternalFrameEvent e) { - modelBlackboard().put(SEGMENT_CACHE_KEY, null); - } - }); - } - return (Collection<Coordinate[]>) modelBlackboard().get(SEGMENT_CACHE_KEY); + private Collection<Geometry> largeOnScreenGeometries() { + List<Feature> onScreenFeatures = new ArrayList<>(); + if (totalGeometries() == 0) { + return new ArrayList<>(); } - - private Collection<Coordinate[]> toSegments(Collection<Geometry> geometries) { - List<Coordinate[]> segments = new ArrayList<>(); - for (Geometry geometry : geometries) { - segments.addAll(CoordinateArrays.toCoordinateArrays(geometry, false)); + // Use proposedModelEnvelope (dynamically computed while the mouse is dragged) + // instead of layerViewPanel().getViewport().getEnvelopeInModelCoordinates() + // [mmichaud 2007-05-27] + Envelope modelEnvelope; + try { + modelEnvelope = proposedModelEnvelope(); + } catch (NoninvertibleTransformException e) { + modelEnvelope = layerViewPanel().getViewport().getEnvelopeInModelCoordinates(); + } // Restrict to visible layers [mmichaud 2007-05-27] + for (Layer layer : layerViewPanel().getLayerManager().getVisibleLayers(true)) { + // Select features intersecting the window + List<Feature> visibleFeatures = layer.getFeatureCollectionWrapper().query(modelEnvelope); + if (visibleFeatures.size() < LARGE_ONSCREEN_GEOMETRIES) { + // onScreenFeatures.addAll(layer.getFeatureCollectionWrapper().query(modelEnvelope)); + onScreenFeatures.addAll(visibleFeatures); + } + // If there are more than 1000 visible features in this layer + // select a maximum of 2000 features stepping through the list + else { + int step = visibleFeatures.size() / LARGE_ONSCREEN_GEOMETRIES; + for (int i = 0, max = visibleFeatures.size(); i < max; i += step) { + onScreenFeatures.add(visibleFeatures.get(i)); } - return segments; + } } + return largeGeometries(LARGE_ONSCREEN_GEOMETRIES, onScreenFeatures); + } - // Replace RANDOM_ONSCREEN_GEOMETRIES by LARGE_ONSCREEN_GEOMETRIES - // private static final int RANDOM_ONSCREEN_GEOMETRIES = 100; - // private static final int RANDOM_GEOMETRIES = 100; - private static final int LARGE_GEOMETRIES = 100; - private static final int LARGE_ONSCREEN_GEOMETRIES = 200; + // private Collection largeGeometries() { + // ArrayList<Feature> largeGeometries = new ArrayList<>(); + // if (totalGeometries() == 0) { + // return largeGeometries; + // } + // //Envelope modelEnvelope = + // layerViewPanel().getViewport().getEnvelopeInModelCoordinates(); + // for (Layer layer : layerViewPanel().getLayerManager().getVisibleLayers(true)) + // { + // //List visibleFeatures = + // layer.getFeatureCollectionWrapper().query(modelEnvelope); + // largeGeometries.addAll(layer.getFeatureCollectionWrapper().getFeatures()); + // } + // return largeGeometries(LARGE_GEOMETRIES, largeGeometries); + // } + // end [mmichaud] - - - - // start [mmichaud] - // additional code to replace randomGeometries by a largestGeometries approach - // one bad side effect of random geometries approach was visible for a big set of points - // and a small set of polygons : polygons were not visible because of the proportional - // selection of geometries, and points are not displayed :-( - - //static final Comparator MAX_SIZE_COMPARATOR = new Comparator() { - // public int compare(Object f1, Object f2) { - // Envelope env1 = ((Feature)f1).getGeometry().getEnvelopeInternal(); - // Envelope env2 = ((Feature)f2).getGeometry().getEnvelopeInternal(); - // double size1 = Math.max(env1.getWidth(), env1.getHeight()); - // double size2 = Math.max(env2.getWidth(), env2.getHeight()); - // return size1 < size2 ? 1 : (size1 > size2 ? -1 : 0); - // } - //}; - - // Collect large geometries in a single pass (focus on efficiency rather than precision) - // Explore maxSize * 10 geometries (not all geometries) - // up to maxSize/2, select geometries with areas > mean previously selected area - // after maxSize/2, select geometries with areas > max previously selected areas - private Collection<Geometry> largeGeometries(int maxSize, List<Feature> features) { - //Collections.sort(features, MAX_SIZE_COMPARATOR); - int step = features.size()/maxSize/10; - double totalArea = 0; - double meanArea = 0; - double maxArea = 0; - int countTotal = 0; - int countExplored = 0; - List<Geometry> largeGeometries = new ArrayList<>(); - for (Feature feature : features) { - if (countTotal%Math.max(step,1)==0) { - boolean firstHalf = largeGeometries.size() < maxSize/2; + // Get at most maxSize geometries + private Collection<Geometry> largeGeometries(int maxSize) { + int totalGeometries = totalGeometries(); + List<Geometry> largeGeometries = new ArrayList<>(); + if (totalGeometries == 0) + return largeGeometries; + int step = totalGeometries / maxSize / 10; + double totalArea = 0; + double meanArea = 0; + double maxArea = 0; + int countTotal = 0; + int countExplored = 0; + for (Layer layer : layerViewPanel().getLayerManager().getVisibleLayers(true)) { + for (Feature feature : layer.getFeatureCollectionWrapper().getFeatures()) { + // we explore maxSize * 10 features but we only keep features which are at least + // as large as the mean area of previous kept features + if (countTotal % Math.max(1, step) == 0) { + boolean firstHalf = largeGeometries.size() < maxSize / 2; Geometry geom = feature.getGeometry(); countExplored++; double area = geom.getArea(); totalArea += area; - if ((firstHalf && area >= meanArea) || area > maxArea) { + if (area > maxArea || (firstHalf && area >= meanArea)) { largeGeometries.add(geom); + totalArea += area; } meanArea = totalArea / countExplored; - if (area > maxArea) maxArea = area; - countTotal++; + if (area > maxArea) + maxArea = area; } - if (largeGeometries.size()>= maxSize) break; + countTotal++; + if (largeGeometries.size() >= maxSize) + break; } - return largeGeometries; + if (largeGeometries.size() >= maxSize) + break; } - - private Collection<Geometry> largeOnScreenGeometries() { - List<Feature> onScreenFeatures = new ArrayList<>(); - if (totalGeometries() == 0) { - return new ArrayList<>(); - } - // Use proposedModelEnvelope (dynamically computed while the mouse is dragged) - // instead of layerViewPanel().getViewport().getEnvelopeInModelCoordinates() - // [mmichaud 2007-05-27] - Envelope modelEnvelope; - try { - modelEnvelope = proposedModelEnvelope(); } catch(NoninvertibleTransformException e) { - modelEnvelope = layerViewPanel().getViewport().getEnvelopeInModelCoordinates(); - }// Restrict to visible layers [mmichaud 2007-05-27] - for (Layer layer : layerViewPanel().getLayerManager().getVisibleLayers(true)) { - // Select features intersecting the window - List<Feature> visibleFeatures = layer.getFeatureCollectionWrapper().query(modelEnvelope); - if (visibleFeatures.size() < LARGE_ONSCREEN_GEOMETRIES) { - //onScreenFeatures.addAll(layer.getFeatureCollectionWrapper().query(modelEnvelope)); - onScreenFeatures.addAll(visibleFeatures); - } - // If there are more than 1000 visible features in this layer - // select a maximum of 2000 features stepping through the list - else { - int step = visibleFeatures.size()/LARGE_ONSCREEN_GEOMETRIES; - for (int i = 0 , max = visibleFeatures.size() ; i < max ; i += step) { - onScreenFeatures.add(visibleFeatures.get(i)); - } - } - } - return largeGeometries(LARGE_ONSCREEN_GEOMETRIES, onScreenFeatures); - } + return largeGeometries; + } - //private Collection largeGeometries() { - // ArrayList<Feature> largeGeometries = new ArrayList<>(); - // if (totalGeometries() == 0) { - // return largeGeometries; - // } - // //Envelope modelEnvelope = layerViewPanel().getViewport().getEnvelopeInModelCoordinates(); - // for (Layer layer : layerViewPanel().getLayerManager().getVisibleLayers(true)) { - // //List visibleFeatures = layer.getFeatureCollectionWrapper().query(modelEnvelope); - // largeGeometries.addAll(layer.getFeatureCollectionWrapper().getFeatures()); - // } - // return largeGeometries(LARGE_GEOMETRIES, largeGeometries); - //} - // end [mmichaud] + // Replaced Random geometries by large geometries + /* + * private Collection randomGeometries(int maxSize, List features) { if + * (features.size() <= maxSize) { return FeatureUtil.toGeometries(features); } + * ArrayList randomGeometries = new ArrayList(); for (int j = 0; j < maxSize; + * j++) { randomGeometries.add( ((Feature) features.get((int) (Math.random() * + * features.size()))).getGeometry()); } return randomGeometries; } + * + * private Collection randomOnScreenGeometries() { ArrayList + * randomOnScreenGeometries = new ArrayList(); // Avoid method computation + * inside the loop [mmichaud] int totalGeometries = totalGeometries(); if + * (totalGeometries == 0) { return randomOnScreenGeometries; } // Use + * proposedModelEnvelope (dynamically computed while the mouse is dragged) // + * instead of layerViewPanel().getViewport().getEnvelopeInModelCoordinates() // + * [mmichaud 2007-05-27] Envelope modelEnvelope; try { modelEnvelope = + * proposedModelEnvelope(); } catch(NoninvertibleTransformException e) { + * modelEnvelope = + * layerViewPanel().getViewport().getEnvelopeInModelCoordinates(); } // Restrict + * to visible layers [mmichaud 2007-05-27] for (Iterator i = + * layerViewPanel().getLayerManager().getVisibleLayers(true).iterator(); + * i.hasNext();) { Layer layer = (Layer) i.next(); + * randomOnScreenGeometries.addAll( randomGeometries( RANDOM_ONSCREEN_GEOMETRIES + * layer.getFeatureCollectionWrapper().size() / totalGeometries(), + * layer.getFeatureCollectionWrapper().query( + * //layerViewPanel().getViewport().getEnvelopeInModelCoordinates()))); + * modelEnvelope))); } return randomOnScreenGeometries; } + * + * private Collection randomGeometries() { ArrayList randomGeometries = new + * ArrayList(); if (totalGeometries() == 0) { return randomGeometries; } // + * Restrict to visible layers [mmichaud 2007-05-27] for (Iterator i = + * layerViewPanel().getLayerManager().getVisibleLayers(true).iterator(); + * i.hasNext();) { Layer layer = (Layer) i.next(); randomGeometries.addAll( + * randomGeometries( RANDOM_GEOMETRIES + * layer.getFeatureCollectionWrapper().size() / totalGeometries(), + * layer.getFeatureCollectionWrapper().getFeatures())); + * + * } return randomGeometries; } + */ - // Get at most maxSize geometries - private Collection<Geometry> largeGeometries(int maxSize) { - int totalGeometries = totalGeometries(); - List<Geometry> largeGeometries = new ArrayList<>(); - if (totalGeometries == 0) return largeGeometries; - int step = totalGeometries/maxSize/10; - double totalArea = 0; - double meanArea = 0; - double maxArea = 0; - int countTotal = 0; - int countExplored = 0; - for (Layer layer : layerViewPanel().getLayerManager().getVisibleLayers(true)) { - for (Feature feature : layer.getFeatureCollectionWrapper().getFeatures()) { - // we explore maxSize * 10 features but we only keep features which are at least - // as large as the mean area of previous kept features - if (countTotal%Math.max(1,step) == 0) { - boolean firstHalf = largeGeometries.size() < maxSize/2; - Geometry geom = feature.getGeometry(); - countExplored++; - double area = geom.getArea(); - totalArea += area; - if (area > maxArea || (firstHalf && area >= meanArea)) { - largeGeometries.add(geom); - totalArea += area; - } - meanArea = totalArea / countExplored; - if (area > maxArea) maxArea = area; - } - countTotal++; - if (largeGeometries.size()>= maxSize) break; - } - if (largeGeometries.size()>= maxSize) break; + private int toSliderValue(double scale) throws NoninvertibleTransformException { + return slider.getMaximum() + - (int) (slider.getMaximum() * (MathUtil.base10Log(scale) - MathUtil.base10Log(getMinScale())) + / (MathUtil.base10Log(getMaxScale()) - MathUtil.base10Log(getMinScale()))); + } + + private double getMinExtent() { + if (modelBlackboard().get(MIN_EXTENT_KEY) == null) { + double smallSegmentLength = chooseSmallSegmentLength(getSegmentCache()); + // -1 smallSegmentLength means there is no data or the data are all + // points (i.e. no segments). [Jon Aquino] + if (smallSegmentLength == -1) { + return -1; } - return largeGeometries; + modelBlackboard().put(MIN_EXTENT_KEY, smallSegmentLength); } - - // Replaced Random geometries by large geometries - /* - private Collection randomGeometries(int maxSize, List features) { - if (features.size() <= maxSize) { - return FeatureUtil.toGeometries(features); + Assert.isTrue(modelBlackboard().getDouble(MIN_EXTENT_KEY) > 0); + return modelBlackboard().getDouble(MIN_EXTENT_KEY); + } + + private double chooseSmallSegmentLength(Collection<Coordinate[]> segmentCache) { + int segmentsChecked = 0; + double smallSegmentLength = -1; + for (Coordinate[] coordinates : segmentCache) { + for (int j = 1; j < coordinates.length; j++) { + double segmentLength = coordinates[j].distance(coordinates[j - 1]); + segmentsChecked++; + if (segmentLength > 0 && (smallSegmentLength == -1 || segmentLength < smallSegmentLength)) { + smallSegmentLength = segmentLength; } - ArrayList randomGeometries = new ArrayList(); - for (int j = 0; j < maxSize; j++) { - randomGeometries.add( - ((Feature) features.get((int) (Math.random() * features.size()))).getGeometry()); + if (segmentsChecked > 100) { + break; } - return randomGeometries; + } + if (segmentsChecked > 100) { + break; + } } - - private Collection randomOnScreenGeometries() { - ArrayList randomOnScreenGeometries = new ArrayList(); - // Avoid method computation inside the loop [mmichaud] - int totalGeometries = totalGeometries(); - if (totalGeometries == 0) { - return randomOnScreenGeometries; - } - // Use proposedModelEnvelope (dynamically computed while the mouse is dragged) - // instead of layerViewPanel().getViewport().getEnvelopeInModelCoordinates() - // [mmichaud 2007-05-27] - Envelope modelEnvelope; - try { - modelEnvelope = proposedModelEnvelope(); - } - catch(NoninvertibleTransformException e) { - modelEnvelope = layerViewPanel().getViewport().getEnvelopeInModelCoordinates(); - } - // Restrict to visible layers [mmichaud 2007-05-27] - for (Iterator i = layerViewPanel().getLayerManager().getVisibleLayers(true).iterator(); i.hasNext();) { - Layer layer = (Layer) i.next(); - randomOnScreenGeometries.addAll( - randomGeometries( - RANDOM_ONSCREEN_GEOMETRIES - * layer.getFeatureCollectionWrapper().size() - / totalGeometries(), - layer.getFeatureCollectionWrapper().query( - //layerViewPanel().getViewport().getEnvelopeInModelCoordinates()))); - modelEnvelope))); - } - return randomOnScreenGeometries; - } - - private Collection randomGeometries() { - ArrayList randomGeometries = new ArrayList(); - if (totalGeometries() == 0) { - return randomGeometries; - } - // Restrict to visible layers [mmichaud 2007-05-27] - for (Iterator i = layerViewPanel().getLayerManager().getVisibleLayers(true).iterator(); i.hasNext();) { - Layer layer = (Layer) i.next(); - randomGeometries.addAll( - randomGeometries( - RANDOM_GEOMETRIES - * layer.getFeatureCollectionWrapper().size() - / totalGeometries(), - layer.getFeatureCollectionWrapper().getFeatures())); + return smallSegmentLength; + } - } - return randomGeometries; + private double getMaxExtent() { + if (modelBlackboard().get(MAX_EXTENT_KEY) == null) { + if (getSegmentCache().isEmpty()) { + return -1; + } + modelBlackboard().put(MAX_EXTENT_KEY, layerViewPanel().getLayerManager().getEnvelopeOfAllLayers().getWidth()); } - */ + return modelBlackboard().getDouble(MAX_EXTENT_KEY); + } - private int toSliderValue(double scale) throws NoninvertibleTransformException { - return slider.getMaximum() - - (int) (slider.getMaximum() - * (MathUtil.base10Log(scale) - MathUtil.base10Log(getMinScale())) - / (MathUtil.base10Log(getMaxScale()) - MathUtil.base10Log(getMinScale()))); + private double getMaxScale() { + double maxScale = (getMinExtent() == -1 || getMinExtent() == 0) ? 1E3 + : (1000 * layerViewPanel().getWidth() / getMinExtent()); + if (viewBlackboard().get(USER_DEFINED_MAX_SCALE) != null) { + return Math.max(maxScale, viewBlackboard().getDouble(USER_DEFINED_MAX_SCALE)); } + return maxScale; + } - private double getMinExtent() { - if (modelBlackboard().get(MIN_EXTENT_KEY) == null) { - double smallSegmentLength = chooseSmallSegmentLength(getSegmentCache()); - //-1 smallSegmentLength means there is no data or the data are all - //points (i.e. no segments). [Jon Aquino] - if (smallSegmentLength == -1) { - return -1; - } - modelBlackboard().put(MIN_EXTENT_KEY, smallSegmentLength); - } - Assert.isTrue(modelBlackboard().getDouble(MIN_EXTENT_KEY) > 0); - return modelBlackboard().getDouble(MIN_EXTENT_KEY); + private double getMinScale() { + double minScale = (getMaxExtent() == -1 || getMaxExtent() == 0) ? 1E-3 + : (0.001 * layerViewPanel().getWidth() / getMaxExtent()); + if (viewBlackboard().get(USER_DEFINED_MIN_SCALE) != null) { + return Math.min(minScale, viewBlackboard().getDouble(USER_DEFINED_MIN_SCALE)); } + return minScale; + } - private double chooseSmallSegmentLength(Collection<Coordinate[]> segmentCache) { - int segmentsChecked = 0; - double smallSegmentLength = -1; - for (Coordinate[] coordinates : segmentCache) { - for (int j = 1; j < coordinates.length; j++) { - double segmentLength = coordinates[j].distance(coordinates[j - 1]); - segmentsChecked++; - if (segmentLength > 0 - && (smallSegmentLength == -1 || segmentLength < smallSegmentLength)) { - smallSegmentLength = segmentLength; - } - if (segmentsChecked > 100) { - break; - } - } - if (segmentsChecked > 100) { - break; - } - } - return smallSegmentLength; - } + private double toScale(int sliderValue) { + return Math + .pow(10, + ((slider.getMaximum() - sliderValue) + * (MathUtil.base10Log(getMaxScale()) - MathUtil.base10Log(getMinScale())) / slider.getMaximum()) + + MathUtil.base10Log(getMinScale())); + } - private double getMaxExtent() { - if (modelBlackboard().get(MAX_EXTENT_KEY) == null) { - if (getSegmentCache().isEmpty()) { - return -1; - } - modelBlackboard().put( - MAX_EXTENT_KEY, - layerViewPanel().getLayerManager().getEnvelopeOfAllLayers().getWidth()); + private void setComponentsEnabled(boolean componentsEnabled) { + slider.setEnabled(componentsEnabled); + label.setEnabled(componentsEnabled); + } + + private static final String SCALE_KEY = ZoomBar.class.getName() + " - SCALE"; + private static final String CENTRE_KEY = ZoomBar.class.getName() + " - CENTRE"; + // Store centre-locked flag on blackboard rather than field because there could + // be several zoom bars [Jon Aquino] + private static final String CENTRE_LOCKED_KEY = ZoomBar.class.getName() + " - CENTRE LOCKED"; + private static final String MIN_EXTENT_KEY = ZoomBar.class.getName() + " - MIN EXTENT"; + private static final String USER_DEFINED_MIN_SCALE = ZoomBar.class.getName() + " - USER DEFINED MIN SCALE"; + private static final String USER_DEFINED_MAX_SCALE = ZoomBar.class.getName() + " - USER DEFINED MAX SCALE"; + private static final String MAX_EXTENT_KEY = ZoomBar.class.getName() + " - MAX EXTENT"; + + private Blackboard viewBlackboard() { + return layerViewPanel() != null ? layerViewPanel().getBlackboard() : new Blackboard(); + } + + private Blackboard modelBlackboard() { + return layerViewPanel().getLayerManager().getBlackboard(); + } + + private final LayerViewPanel dummyLayerViewPanel = new LayerViewPanel(new LayerManager(), + new LayerViewPanelContext() { + + public void setStatusMessage(String message) { } - return modelBlackboard().getDouble(MAX_EXTENT_KEY); - } - private double getMaxScale() { - double maxScale = - (getMinExtent() == -1 || getMinExtent() == 0) - ? 1E3 - : (1000 * layerViewPanel().getWidth() / getMinExtent()); - if (viewBlackboard().get(USER_DEFINED_MAX_SCALE) != null) { - return Math.max(maxScale, viewBlackboard().getDouble(USER_DEFINED_MAX_SCALE)); + public void warnUser(String warning) { } - return maxScale; - } - private double getMinScale() { - double minScale = - (getMaxExtent() == -1 || getMaxExtent() == 0) - ? 1E-3 - : (0.001 * layerViewPanel().getWidth() / getMaxExtent()); - if (viewBlackboard().get(USER_DEFINED_MIN_SCALE) != null) { - return Math.min(minScale, viewBlackboard().getDouble(USER_DEFINED_MIN_SCALE)); + public void handleThrowable(Throwable t) { } - return minScale; - } - private double toScale(int sliderValue) { - return Math.pow( - 10, - ((slider.getMaximum() - sliderValue) - * (MathUtil.base10Log(getMaxScale()) - MathUtil.base10Log(getMinScale())) - / slider.getMaximum()) - + MathUtil.base10Log(getMinScale())); - } - private void setComponentsEnabled(boolean componentsEnabled) { - slider.setEnabled(componentsEnabled); - label.setEnabled(componentsEnabled); - } - private static final String SCALE_KEY = ZoomBar.class.getName() + " - SCALE"; - private static final String CENTRE_KEY = ZoomBar.class.getName() + " - CENTRE"; - //Store centre-locked flag on blackboard rather than field because there could - //be several zoom bars [Jon Aquino] - private static final String CENTRE_LOCKED_KEY = ZoomBar.class.getName() + " - CENTRE LOCKED"; - private static final String MIN_EXTENT_KEY = ZoomBar.class.getName() + " - MIN EXTENT"; - private static final String USER_DEFINED_MIN_SCALE = - ZoomBar.class.getName() + " - USER DEFINED MIN SCALE"; - private static final String USER_DEFINED_MAX_SCALE = - ZoomBar.class.getName() + " - USER DEFINED MAX SCALE"; - private static final String MAX_EXTENT_KEY = ZoomBar.class.getName() + " - MAX EXTENT"; + }); - private Blackboard viewBlackboard() { - return layerViewPanel() != null ? layerViewPanel().getBlackboard() : new Blackboard(); + private LayerViewPanel layerViewPanel() { + if (!(frame.getActiveInternalFrame() instanceof LayerViewPanelProxy)) { + return dummyLayerViewPanel; } - private Blackboard modelBlackboard() { - return layerViewPanel().getLayerManager().getBlackboard(); - } - private final LayerViewPanel dummyLayerViewPanel = new LayerViewPanel(new LayerManager(), new LayerViewPanelContext() { + return ((LayerViewPanelProxy) frame.getActiveInternalFrame()).getLayerViewPanel(); + } - public void setStatusMessage(String message) { - } + void jbInit() { + this.setLayout(new BorderLayout()); + label.setText(" "); + slider.setPaintLabels(true); + slider.setToolTipText(I18N.get("ui.zoom.ZoomBar.zoom")); + slider.setMaximum(1000); - public void warnUser(String warning) { - } + this.add(slider, BorderLayout.CENTER); + this.add(label, BorderLayout.EAST); + } - public void handleThrowable(Throwable t) { - } - - }); + private void updateLabel() throws NoninvertibleTransformException { + // Inexpensive. [Jon Aquino] + label.setText(chooseGoodIncrement(getScale()).toString()); + } - private LayerViewPanel layerViewPanel() { - if (!(frame.getActiveInternalFrame() instanceof LayerViewPanelProxy)) { - return dummyLayerViewPanel; - } - return ((LayerViewPanelProxy) frame.getActiveInternalFrame()).getLayerViewPanel(); - } + private RoundQuantity chooseGoodIncrement(double scale) { + return incrementChooser.chooseGoodIncrement(metricUnits, layerViewPanel().getWidth() / scale); + } - void jbInit() { - this.setLayout(new BorderLayout()); - label.setText(" "); - slider.setPaintLabels(true); - slider.setToolTipText(I18N.get("ui.zoom.ZoomBar.zoom")); - slider.setMaximum(1000); + private Font sliderLabelFont = new Font("Dialog", Font.PLAIN, 10); - this.add(slider, BorderLayout.CENTER); - this.add(label, BorderLayout.EAST); - } + private boolean showingSliderLabels; - private void updateLabel() throws NoninvertibleTransformException { - //Inexpensive. [Jon Aquino] - label.setText(chooseGoodIncrement(getScale()).toString()); + private void updateSliderLabels() throws NoninvertibleTransformException { + // Expensive if the data cache has been cleared. [Jon Aquino] + if (!showingSliderLabels) { + return; } - - private RoundQuantity chooseGoodIncrement(double scale) { - return incrementChooser.chooseGoodIncrement( - metricUnits, - layerViewPanel().getWidth() / scale); + if (!(slider.getUI() instanceof BasicSliderUI)) { + return; } + Hashtable<Integer, JLabel> labelTable = new Hashtable<>(); + final int LABEL_WIDTH = 60; + int lastLabelPosition = -2 * LABEL_WIDTH; + for (int i = 0; i < slider.getWidth(); i++) { + if (i < (lastLabelPosition + LABEL_WIDTH)) { + continue; + } + int sliderValue = ((BasicSliderUI) slider.getUI()).valueForXPosition(i); + JLabel label = new JLabel(chooseGoodIncrement(toScale(sliderValue)).toString()); + label.setFont(sliderLabelFont); + labelTable.put(sliderValue, label); + lastLabelPosition = i; + } + if (labelTable.isEmpty()) { + // Get here during initialization. [Jon Aquino] + return; + } + slider.setLabelTable(labelTable); + } - private Font sliderLabelFont = new Font("Dialog", Font.PLAIN, 10); + /** + * Return a Point2D in the view model from a model coordinate. + */ + // Added to implement Java2DConverter.PointConverter interface (used in + // getWireFrame) + // [mmichaud 2007-05-27] + public Point2D toViewPoint(Coordinate modelCoordinate) { + Point2D.Double pt = new Point2D.Double(modelCoordinate.x, modelCoordinate.y); + return affineTransform.transform(pt, pt); + } - private boolean showingSliderLabels; + // Added to implement Java2DConverter.PointConverter modified on 2011-03-06 + public Envelope getEnvelopeInModelCoordinates() { + return lastGoodEnvelope; + } - private void updateSliderLabels() throws NoninvertibleTransformException { - //Expensive if the data cache has been cleared. [Jon Aquino] - if (!showingSliderLabels) { - return; - } - if (!(slider.getUI() instanceof BasicSliderUI)) { - return; - } - Hashtable<Integer,JLabel> labelTable = new Hashtable<>(); - final int LABEL_WIDTH = 60; - int lastLabelPosition = -2 * LABEL_WIDTH; - for (int i = 0; i < slider.getWidth(); i++) { - if (i < (lastLabelPosition + LABEL_WIDTH)) { - continue; - } - int sliderValue = ((BasicSliderUI) slider.getUI()).valueForXPosition(i); - JLabel label = new JLabel(chooseGoodIncrement(toScale(sliderValue)).toString()); - label.setFont(sliderLabelFont); - labelTable.put(sliderValue, label); - lastLabelPosition = i; - } - if (labelTable.isEmpty()) { - //Get here during initialization. [Jon Aquino] - return; - } - slider.setLabelTable(labelTable); - } - - /** - * Return a Point2D in the view model from a model coordinate. - */ - // Added to implement Java2DConverter.PointConverter interface (used in getWireFrame) - // [mmichaud 2007-05-27] - public Point2D toViewPoint(Coordinate modelCoordinate) { - Point2D.Double pt = new Point2D.Double(modelCoordinate.x, modelCoordinate.y); - return affineTransform.transform(pt, pt); - } - - // Added to implement Java2DConverter.PointConverter modified on 2011-03-06 - public Envelope getEnvelopeInModelCoordinates() { - return lastGoodEnvelope; - } - } _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel