Revision: 6041
http://sourceforge.net/p/jump-pilot/code/6041
Author: edso
Date: 2018-12-27 16:52:16 +0000 (Thu, 27 Dec 2018)
Log Message:
-----------
speedup InstallZoomBarPlugIn by delaying gui init and prevent double init
com.vividsolutions.jump.workbench.ui.zoom.InstallZoomBarPlugIn took 1.22s now
0.02s
Modified Paths:
--------------
core/trunk/ChangeLog
core/trunk/src/com/vividsolutions/jump/workbench/ui/zoom/ZoomBar.java
Added Paths:
-----------
core/trunk/src/com/vividsolutions/jump/workbench/ui/LazyJPanel.java
Modified: core/trunk/ChangeLog
===================================================================
--- core/trunk/ChangeLog 2018-12-27 15:37:54 UTC (rev 6040)
+++ core/trunk/ChangeLog 2018-12-27 16:52:16 UTC (rev 6041)
@@ -15,6 +15,11 @@
took 0.43s now 0.01s
org.openjump.core.ui.plugin.file.OpenFilePlugIn took 0.62s now 0.03s
org.openjump.core.ui.plugin.file.OpenProjectPlugIn took 0.46s now 0.01s
+ com.vividsolutions.jump.workbench.ui.zoom.InstallZoomBarPlugIn
+ took 1.22s now 0.02s
+ as a side note, testing shows that OJ startup gets faster with newer java
+ versions _out of the box_, repeated tests on a 2 core laptop showed:
+ jdk8 21.30s, jdk9 14,24s, jdk11 12,02s
2018-12-22 Giuseppe Aruta.
* Updated OpenKLEM to ver 20181222, correct some bugs
Added: core/trunk/src/com/vividsolutions/jump/workbench/ui/LazyJPanel.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/workbench/ui/LazyJPanel.java
(rev 0)
+++ core/trunk/src/com/vividsolutions/jump/workbench/ui/LazyJPanel.java
2018-12-27 16:52:16 UTC (rev 6041)
@@ -0,0 +1,73 @@
+package com.vividsolutions.jump.workbench.ui;
+
+import java.awt.Graphics;
+
+import javax.swing.JPanel;
+
+/**
+ * wrapper class to defer ui init until panel is drawn
+ */
+public abstract class LazyJPanel extends JPanel {
+ // init only once
+ private boolean lazyInitCalled = false;
+
+ // wait for constructor to run lazy init
+ private boolean isConstructorFinished = false;
+
+ protected LazyJPanel() {
+ isConstructorFinished = true;
+ }
+
+ public void paint(Graphics g) {
+ callLazyInit();
+ super.paint(g);
+ }
+
+ public void paintAll(Graphics g) {
+ callLazyInit();
+ super.paintAll(g);
+ }
+
+ public void paintComponents(Graphics g) {
+ callLazyInit();
+ super.paintComponents(g);
+ }
+
+ public void repaint() {
+ callLazyInit();
+ super.repaint();
+ }
+
+ public void repaint(long l) {
+ callLazyInit();
+ super.repaint(l);
+ }
+
+ public void repaint(int i1, int i2, int i3, int i4) {
+ callLazyInit();
+ super.repaint(i1, i2, i3, i4);
+ }
+
+ public void repaint(long l, int i1, int i2, int i3, int i4) {
+ callLazyInit();
+ super.repaint(l, i1, i2, i3, i4);
+ }
+
+ public void update(Graphics g) {
+ callLazyInit();
+ super.update(g);
+ }
+
+ public synchronized final void callLazyInit() {
+ if ((lazyInitCalled == false) && (getParent() != null)) {
+ lazyInit();
+ lazyInitCalled = true;
+ validate();
+ }
+ }
+
+ /**
+ * implements the delayed gui init code
+ */
+ abstract protected void lazyInit();
+}
\ No newline at end of file
Property changes on:
core/trunk/src/com/vividsolutions/jump/workbench/ui/LazyJPanel.java
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
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:37:54 UTC (rev 6040)
+++ core/trunk/src/com/vividsolutions/jump/workbench/ui/zoom/ZoomBar.java
2018-12-27 16:52:16 UTC (rev 6041)
@@ -57,6 +57,7 @@
import com.vividsolutions.jump.util.Blackboard;
import com.vividsolutions.jump.util.CoordinateArrays;
import com.vividsolutions.jump.util.MathUtil;
+import com.vividsolutions.jump.workbench.JUMPWorkbench;
import com.vividsolutions.jump.workbench.model.CategoryEvent;
import com.vividsolutions.jump.workbench.model.FeatureEvent;
import com.vividsolutions.jump.workbench.model.FeatureEventType;
@@ -69,6 +70,7 @@
import com.vividsolutions.jump.workbench.ui.LayerViewPanel;
import com.vividsolutions.jump.workbench.ui.LayerViewPanelContext;
import com.vividsolutions.jump.workbench.ui.LayerViewPanelProxy;
+import com.vividsolutions.jump.workbench.ui.LazyJPanel;
import com.vividsolutions.jump.workbench.ui.Viewport;
import com.vividsolutions.jump.workbench.ui.ViewportListener;
import com.vividsolutions.jump.workbench.ui.WorkbenchFrame;
@@ -78,22 +80,30 @@
import com.vividsolutions.jump.workbench.ui.plugin.scalebar.ScaleBarRenderer;
import com.vividsolutions.jump.workbench.ui.renderer.java2D.Java2DConverter;
-public class ZoomBar extends JPanel implements Java2DConverter.PointConverter {
+public class ZoomBar extends LazyJPanel 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();
- }
- return totalGeometries;
- }
+ 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 static final String SEGMENT_CACHE_KEY = ZoomBar.class.getName() + "
- SEGMENT CACHE";
+
+ private static final int LARGE_GEOMETRIES = 100;
+ private static final int LARGE_ONSCREEN_GEOMETRIES = 200;
+
private Envelope lastGoodEnvelope = null;
private WorkbenchFrame frame;
private JSlider slider = new JSlider();
private JLabel label = new JLabel();
+ private Font sliderLabelFont = new Font("Dialog", Font.PLAIN, 10);
+ private boolean showingSliderLabels, showingRightSideLabel;
private IncrementChooser incrementChooser = new IncrementChooser();
private Collection metricUnits = new MetricSystem(1).createUnits();
@@ -105,122 +115,7 @@
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);
- }
- }
- });
-
- //
- // 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);
-
- installListenersOnCurrentPanel();
- updateComponents();
+ this.showingRightSideLabel = showingRightSideLabel;
}
private void installListenersOnCurrentPanel() {
@@ -375,8 +270,6 @@
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]
@@ -450,12 +343,6 @@
return segments;
}
- // 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;
-
// 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
@@ -509,6 +396,15 @@
return largeGeometries;
}
+ 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 Collection<Geometry> largeOnScreenGeometries() {
List<Feature> onScreenFeatures = new ArrayList<>();
if (totalGeometries() == 0) {
@@ -720,16 +616,6 @@
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();
}
@@ -738,28 +624,43 @@
return layerViewPanel().getLayerManager().getBlackboard();
}
- private final LayerViewPanel dummyLayerViewPanel = new LayerViewPanel(new
LayerManager(),
- new LayerViewPanelContext() {
+ private LayerViewPanel dummyLayerViewPanel = null;
- public void setStatusMessage(String message) {
- }
-
- public void warnUser(String warning) {
- }
-
- public void handleThrowable(Throwable t) {
- }
-
- });
-
private LayerViewPanel layerViewPanel() {
if (!(frame.getActiveInternalFrame() instanceof LayerViewPanelProxy)) {
+ if (dummyLayerViewPanel == null) {
+ dummyLayerViewPanel = new LayerViewPanel(new LayerManager(), new
LayerViewPanelContext() {
+ public void setStatusMessage(String message) {
+ }
+ public void warnUser(String warning) {
+ }
+ public void handleThrowable(Throwable t) {
+ }
+ });
+ }
return dummyLayerViewPanel;
}
return ((LayerViewPanelProxy)
frame.getActiveInternalFrame()).getLayerViewPanel();
}
- void jbInit() {
+ protected void lazyInit() {
+ 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);
+ }
+
this.setLayout(new BorderLayout());
label.setText(" ");
slider.setPaintLabels(true);
@@ -768,6 +669,106 @@
this.add(slider, BorderLayout.CENTER);
this.add(label, BorderLayout.EAST);
+
+ 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);
+ }
+ }
+ });
+
+ //
+ // 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);
+
+ installListenersOnCurrentPanel();
+ try {
+ updateComponents();
+ } catch (NoninvertibleTransformException e1) {
+ JUMPWorkbench.getInstance().getFrame().handleThrowable(e1);
+ }
}
private void updateLabel() throws NoninvertibleTransformException {
@@ -779,10 +780,6 @@
return incrementChooser.chooseGoodIncrement(metricUnits,
layerViewPanel().getWidth() / scale);
}
- private Font sliderLabelFont = new Font("Dialog", Font.PLAIN, 10);
-
- private boolean showingSliderLabels;
-
private void updateSliderLabels() throws NoninvertibleTransformException {
// Expensive if the data cache has been cleared. [Jon Aquino]
if (!showingSliderLabels) {
_______________________________________________
Jump-pilot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel