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

Reply via email to