Skip to content

Commit 5319820

Browse files
committed
synchronize zoom dropdown with zooming via mousewheel
1 parent 561d379 commit 5319820

File tree

7 files changed

+150
-59
lines changed

7 files changed

+150
-59
lines changed

src/main/java/com/tagtraum/perf/gcviewer/ctrl/impl/GCDocumentController.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package com.tagtraum.perf.gcviewer.ctrl.impl;
22

3+
import java.beans.PropertyChangeEvent;
4+
import java.beans.PropertyChangeListener;
5+
import java.util.logging.Logger;
6+
import javax.swing.SwingWorker;
7+
38
import com.tagtraum.perf.gcviewer.ctrl.GCModelLoader;
49
import com.tagtraum.perf.gcviewer.log.TextAreaLogHandler;
510
import com.tagtraum.perf.gcviewer.view.ChartPanelView;
611
import com.tagtraum.perf.gcviewer.view.GCDocument;
712
import com.tagtraum.perf.gcviewer.view.GCModelLoaderView;
13+
import com.tagtraum.perf.gcviewer.view.GCViewerGuiToolBar;
814
import com.tagtraum.perf.gcviewer.view.ModelChartImpl;
915

10-
import javax.swing.*;
11-
import java.beans.PropertyChangeEvent;
12-
import java.beans.PropertyChangeListener;
13-
import java.util.logging.Logger;
14-
1516
/**
1617
* Controller for {@link GCDocument}.
1718
*
@@ -29,9 +30,11 @@ public GCDocumentController(GCDocument gcDocument) {
2930
gcDocument.addPropertyChangeListener(this);
3031
}
3132

32-
public void addGCResource(GCModelLoader loader, ViewMenuController viewMenuController) {
33+
public void addGCResource(GCModelLoader loader, ViewMenuController viewMenuController, GCViewerGuiToolBar gcViewerGuiToolBar) {
3334
ChartPanelView chartPanelView = new ChartPanelView(gcDocument.getPreferences(), loader.getGcResource());
35+
((ModelChartImpl)chartPanelView.getModelChart()).addPropertyChangeListener(gcDocument);
3436
((ModelChartImpl)chartPanelView.getModelChart()).addPropertyChangeListener(viewMenuController);
37+
((ModelChartImpl)chartPanelView.getModelChart()).addPropertyChangeListener(gcViewerGuiToolBar);
3538
((ModelChartImpl)chartPanelView.getModelChart()).addTimeOffsetChangeListener(new TimeOffsetPanelController(gcDocument));
3639
gcDocument.addChartPanelView(chartPanelView);
3740
loader.addPropertyChangeListener(this);

src/main/java/com/tagtraum/perf/gcviewer/ctrl/impl/GCModelLoaderControllerImpl.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
11
package com.tagtraum.perf.gcviewer.ctrl.impl;
22

3+
import java.awt.dnd.DnDConstants;
4+
import java.awt.dnd.DropTarget;
5+
import java.awt.event.ActionListener;
6+
import java.beans.PropertyChangeListener;
7+
import java.io.File;
8+
import java.util.ArrayList;
9+
import java.util.Arrays;
10+
import java.util.Collections;
11+
import java.util.List;
12+
import java.util.Map;
13+
import javax.swing.JCheckBoxMenuItem;
14+
315
import com.tagtraum.perf.gcviewer.ctrl.GCModelLoader;
416
import com.tagtraum.perf.gcviewer.ctrl.GCModelLoaderController;
517
import com.tagtraum.perf.gcviewer.ctrl.GCModelLoaderGroupTracker;
618
import com.tagtraum.perf.gcviewer.ctrl.impl.FileDropTargetListener.DropFlavor;
7-
import com.tagtraum.perf.gcviewer.model.GcResourceFile;
819
import com.tagtraum.perf.gcviewer.model.GCResource;
20+
import com.tagtraum.perf.gcviewer.model.GcResourceFile;
921
import com.tagtraum.perf.gcviewer.model.GcResourceSeries;
1022
import com.tagtraum.perf.gcviewer.view.GCDocument;
1123
import com.tagtraum.perf.gcviewer.view.GCViewerGui;
1224
import com.tagtraum.perf.gcviewer.view.GCViewerGuiMenuBar;
1325
import com.tagtraum.perf.gcviewer.view.model.RecentGCResourcesModel;
1426

15-
import javax.swing.*;
16-
import java.awt.dnd.DnDConstants;
17-
import java.awt.dnd.DropTarget;
18-
import java.awt.event.ActionListener;
19-
import java.beans.PropertyChangeListener;
20-
import java.io.File;
21-
import java.util.*;
22-
2327
/**
2428
* Controller class for {@link GCModelLoader}.
2529
*
@@ -70,7 +74,7 @@ public void add(List<GCResource> gcResourceList) {
7074
private void addGCResource(GCResource gcResource) {
7175
GCModelLoader loader = GCModelLoaderFactory.createFor(gcResource);
7276
GCDocumentController docController = getDocumentController(gcViewerGui.getSelectedGCDocument());
73-
docController.addGCResource(loader, getViewMenuController());
77+
docController.addGCResource(loader, getViewMenuController(), gcViewerGui.getToolBar());
7478

7579
loader.execute();
7680
}
@@ -125,7 +129,7 @@ private void openGCResource(GCResource gcResource, GCModelLoader loader) {
125129
gcViewerGui.addDocument(document);
126130

127131
GCDocumentController docController = new GCDocumentController(document);
128-
docController.addGCResource(loader, getViewMenuController());
132+
docController.addGCResource(loader, getViewMenuController(), gcViewerGui.getToolBar());
129133

130134
loader.execute();
131135
}

src/main/java/com/tagtraum/perf/gcviewer/view/GCDocument.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
import java.awt.GridBagConstraints;
55
import java.awt.GridBagLayout;
66
import java.awt.Point;
7-
import java.awt.event.*;
7+
import java.awt.event.ComponentAdapter;
8+
import java.awt.event.ComponentEvent;
89
import java.beans.PropertyChangeEvent;
910
import java.beans.PropertyChangeListener;
1011
import java.util.ArrayList;
1112
import java.util.List;
1213
import java.util.logging.Logger;
13-
1414
import javax.swing.BoundedRangeModel;
1515
import javax.swing.DefaultBoundedRangeModel;
1616
import javax.swing.JInternalFrame;
@@ -25,13 +25,14 @@
2525
import com.tagtraum.perf.gcviewer.model.GCResource;
2626
import com.tagtraum.perf.gcviewer.view.model.GCPreferences;
2727
import com.tagtraum.perf.gcviewer.view.model.GCResourceGroup;
28+
import com.tagtraum.perf.gcviewer.view.model.PropertyChangeEventConsts;
2829

2930
/**
3031
* GCDocument.
3132
*
3233
* @author <a href="mailto:[email protected]">Hendrik Schreiber</a>
3334
*/
34-
public class GCDocument extends JInternalFrame {
35+
public class GCDocument extends JInternalFrame implements PropertyChangeListener {
3536

3637
private static final Logger LOGGER = Logger.getLogger(GCDocument.class.getName());
3738

@@ -124,7 +125,7 @@ else if (ChartPanelView.EVENT_CLOSED.equals(event.getPropertyName())) {
124125
*/
125126
private int removeChartPanelView(ChartPanelView chartPanelView) {
126127
chartPanelViews.remove(chartPanelView);
127-
128+
128129
final int nChartPanelViews = chartPanelViews.size();
129130
if (nChartPanelViews > 0) {
130131
relayout();
@@ -292,6 +293,13 @@ public boolean isWatched() {
292293
return watched;
293294
}
294295

296+
@Override
297+
public void propertyChange(PropertyChangeEvent evt) {
298+
if (evt.getPropertyName().equals(PropertyChangeEventConsts.MODELCHART_SCALEFACTOR_CHANGED)) {
299+
modelChartListFacade.setScaleFactor((Double) evt.getNewValue());
300+
}
301+
}
302+
295303
private static class MasterViewPortChangeListener implements ChangeListener {
296304
private List<JViewport> slaveViewPorts = new ArrayList<JViewport>();
297305

src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGui.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package com.tagtraum.perf.gcviewer.view;
22

3-
import com.tagtraum.perf.gcviewer.view.model.GCPreferences;
4-
5-
import javax.swing.*;
6-
import java.awt.*;
7-
import java.awt.event.KeyEvent;
8-
import java.awt.event.KeyListener;
3+
import java.awt.BorderLayout;
94
import java.beans.PropertyVetoException;
105
import java.util.ArrayList;
116
import java.util.List;
127
import java.util.Map;
8+
import javax.swing.Action;
9+
import javax.swing.JDesktopPane;
10+
import javax.swing.JFrame;
11+
import javax.swing.JInternalFrame;
12+
13+
import com.tagtraum.perf.gcviewer.view.model.GCPreferences;
1314

1415
/**
1516
* This is the main window of GCViewer.

src/main/java/com/tagtraum/perf/gcviewer/view/GCViewerGuiToolBar.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
package com.tagtraum.perf.gcviewer.view;
22

3+
import java.awt.event.ActionListener;
4+
import java.beans.PropertyChangeEvent;
5+
import java.beans.PropertyChangeListener;
36
import javax.swing.JComboBox;
47
import javax.swing.JToggleButton;
58
import javax.swing.JToolBar;
69

10+
import com.tagtraum.perf.gcviewer.view.model.PropertyChangeEventConsts;
11+
712
/**
813
* Toolbar for {@link GCViewerGui}.
914
*
1015
* @author <a href="mailto:[email protected]">Joerg Wuethrich</a>
1116
* <p>created on: 11.02.2014</p>
1217
*/
13-
public class GCViewerGuiToolBar extends JToolBar {
18+
public class GCViewerGuiToolBar extends JToolBar implements PropertyChangeListener {
1419

1520
private JToggleButton watchToggle;
1621
private JComboBox<String> zoomComboBox;
@@ -32,4 +37,24 @@ public JToggleButton getWatchToggleButton() {
3237
public JComboBox<String> getZoomComboBox() {
3338
return zoomComboBox;
3439
}
40+
41+
@Override
42+
public void propertyChange(PropertyChangeEvent evt) {
43+
if (evt.getPropertyName().equals(PropertyChangeEventConsts.MODELCHART_SCALEFACTOR_CHANGED)) {
44+
// don't fire change event to prevent updating twice
45+
updateWithoutFiringActionEvent(getZoomComboBox(), () -> getZoomComboBox().setSelectedItem(Math.round((double)evt.getNewValue() * 1000.0) + "%"));
46+
}
47+
}
48+
49+
private void updateWithoutFiringActionEvent(final JComboBox<String> comboBox, final Runnable runnable) {
50+
final ActionListener[] actionListeners = comboBox.getActionListeners();
51+
for (final ActionListener listener : actionListeners)
52+
comboBox.removeActionListener(listener);
53+
try {
54+
runnable.run();
55+
} finally {
56+
for (final ActionListener listener : actionListeners)
57+
comboBox.addActionListener(listener);
58+
}
59+
}
3560
}

src/main/java/com/tagtraum/perf/gcviewer/view/ModelChartImpl.java

Lines changed: 70 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package com.tagtraum.perf.gcviewer.view;
22

3-
import com.tagtraum.perf.gcviewer.model.GCModel;
4-
import com.tagtraum.perf.gcviewer.util.TimeFormat;
5-
import com.tagtraum.perf.gcviewer.view.model.GCPreferences;
6-
import com.tagtraum.perf.gcviewer.view.model.PropertyChangeEventConsts;
7-
import com.tagtraum.perf.gcviewer.view.renderer.*;
8-
9-
import javax.swing.*;
10-
import javax.swing.event.ChangeEvent;
11-
import javax.swing.event.ChangeListener;
12-
import javax.swing.event.SwingPropertyChangeSupport;
13-
import java.awt.*;
14-
import java.awt.event.*;
3+
import java.awt.Color;
4+
import java.awt.Component;
5+
import java.awt.Dimension;
6+
import java.awt.Font;
7+
import java.awt.FontMetrics;
8+
import java.awt.Graphics;
9+
import java.awt.GridBagConstraints;
10+
import java.awt.GridBagLayout;
11+
import java.awt.Rectangle;
12+
import java.awt.event.ComponentEvent;
13+
import java.awt.event.ComponentListener;
14+
import java.awt.event.InputEvent;
15+
import java.awt.event.MouseAdapter;
16+
import java.awt.event.MouseEvent;
1517
import java.beans.PropertyChangeEvent;
1618
import java.beans.PropertyChangeListener;
1719
import java.text.DateFormat;
@@ -20,6 +22,33 @@
2022
import java.time.ZonedDateTime;
2123
import java.util.Date;
2224
import java.util.logging.Logger;
25+
import javax.swing.JPanel;
26+
import javax.swing.JPopupMenu;
27+
import javax.swing.JScrollBar;
28+
import javax.swing.JScrollPane;
29+
import javax.swing.JViewport;
30+
import javax.swing.event.ChangeEvent;
31+
import javax.swing.event.ChangeListener;
32+
import javax.swing.event.SwingPropertyChangeSupport;
33+
34+
import com.tagtraum.perf.gcviewer.model.GCModel;
35+
import com.tagtraum.perf.gcviewer.util.TimeFormat;
36+
import com.tagtraum.perf.gcviewer.view.model.GCPreferences;
37+
import com.tagtraum.perf.gcviewer.view.model.PropertyChangeEventConsts;
38+
import com.tagtraum.perf.gcviewer.view.renderer.ConcurrentGcBegionEndRenderer;
39+
import com.tagtraum.perf.gcviewer.view.renderer.FullGCLineRenderer;
40+
import com.tagtraum.perf.gcviewer.view.renderer.GCRectanglesRenderer;
41+
import com.tagtraum.perf.gcviewer.view.renderer.GCTimesRenderer;
42+
import com.tagtraum.perf.gcviewer.view.renderer.IncLineRenderer;
43+
import com.tagtraum.perf.gcviewer.view.renderer.InitialMarkLevelRenderer;
44+
import com.tagtraum.perf.gcviewer.view.renderer.PolygonChartRenderer;
45+
import com.tagtraum.perf.gcviewer.view.renderer.TotalHeapRenderer;
46+
import com.tagtraum.perf.gcviewer.view.renderer.TotalTenuredRenderer;
47+
import com.tagtraum.perf.gcviewer.view.renderer.TotalYoungRenderer;
48+
import com.tagtraum.perf.gcviewer.view.renderer.UsedHeapRenderer;
49+
import com.tagtraum.perf.gcviewer.view.renderer.UsedTenuredRenderer;
50+
import com.tagtraum.perf.gcviewer.view.renderer.UsedYoungRenderer;
51+
import com.tagtraum.perf.gcviewer.view.util.OSXSupport;
2352

2453
/**
2554
* Graphical chart of the gc file. It contains the chart and all rulers surrounding it but not
@@ -183,21 +212,25 @@ private void maybePopup(MouseEvent e) {
183212
});
184213

185214

186-
addMouseWheelListener(new MouseWheelListener() {
187-
@Override
188-
public void mouseWheelMoved(MouseWheelEvent e) {
189-
if (((e.getModifiersEx() & InputEvent.META_DOWN_MASK) != 0 && System.getProperty("os.name").contains("Mac OS X"))||(e.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0 && !System.getProperty("os.name").contains("Mac OS X")) {
190-
double pos = (double)(getHorizontalScrollBar().getValue()) / (double)(chart.getWidth());
191-
if (e.getWheelRotation() > 0 && getScaleFactor() < 100) {
192-
setScaleFactor((getScaleFactor()*1.2));
193-
}
194-
if (e.getWheelRotation() < 0 && getScaleFactor() > 0.01) {
195-
setScaleFactor((getScaleFactor()/1.2));
196-
}
197-
if (e.getWheelRotation() != 0) {
198-
getHorizontalScrollBar().setValue((int)(pos * (double)(chart.getWidth())));
199-
e.consume();
200-
}
215+
addMouseWheelListener(mouseWheelEvent -> {
216+
if ((!OSXSupport.isOSX() && (mouseWheelEvent.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0)
217+
|| (OSXSupport.isOSX() && (mouseWheelEvent.getModifiersEx() & InputEvent.META_DOWN_MASK) != 0)) {
218+
219+
double pos = (double)(getHorizontalScrollBar().getValue()) / (double)(chart.getWidth());
220+
double oldScaleFactor = getScaleFactor();
221+
if (mouseWheelEvent.getWheelRotation() > 0 && getScaleFactor() < 100) {
222+
setScaleFactor((getScaleFactor()*1.2));
223+
}
224+
if (mouseWheelEvent.getWheelRotation() < 0 && getScaleFactor() > 0.001) {
225+
setScaleFactor((getScaleFactor()/1.2));
226+
}
227+
if (mouseWheelEvent.getWheelRotation() != 0) {
228+
getHorizontalScrollBar().setValue((int)(pos * (double)(chart.getWidth())));
229+
mouseWheelEvent.consume();
230+
}
231+
232+
if (Math.abs(getScaleFactor() - oldScaleFactor) > 0.000001) {
233+
fireScaleFactorChangedEvent(oldScaleFactor, getScaleFactor());
201234
}
202235
}
203236
});
@@ -241,9 +274,10 @@ public void setScaleFactor(double scaleFactor) {
241274
this.scaleFactor = scaleFactor;
242275
chart.setSize(chart.getPreferredSize());
243276
chart.resetPolygons();
244-
memoryRuler.setSize((int)memoryRuler.getPreferredSize().getWidth(), getViewport().getHeight());
245-
pauseRuler.setSize((int)pauseRuler.getPreferredSize().getWidth(), getViewport().getHeight());
246-
timestampRuler.setSize((int)(getViewport().getWidth()*getScaleFactor()), (int)timestampRuler.getPreferredSize().getHeight());
277+
memoryRuler.setSize((int) memoryRuler.getPreferredSize().getWidth(), getViewport().getHeight());
278+
pauseRuler.setSize((int) pauseRuler.getPreferredSize().getWidth(), getViewport().getHeight());
279+
timestampRuler.setSize((int) (getViewport().getWidth() * getScaleFactor()),
280+
(int) timestampRuler.getPreferredSize().getHeight());
247281

248282
repaint();
249283
}
@@ -785,4 +819,10 @@ public void propertyChange(PropertyChangeEvent evt) {
785819
}
786820
}
787821

822+
private void fireScaleFactorChangedEvent(double oldScaleFactor, double scaleFactor) {
823+
firePropertyChange(PropertyChangeEventConsts.MODELCHART_SCALEFACTOR_CHANGED,
824+
oldScaleFactor,
825+
scaleFactor);
826+
}
827+
788828
}

src/main/java/com/tagtraum/perf/gcviewer/view/model/PropertyChangeEventConsts.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,16 @@ public interface PropertyChangeEventConsts {
2323
* <p> newValue: dateStamp is shown now (boolean)
2424
*/
2525
String MODELCHART_TIMESTAMP_RULER_FORMAT_CHANGED = "modelchartTimestampRulerFormatChanged";
26-
26+
27+
/**
28+
* used to indicate that the scaleFactor of the modelchart was changed
29+
*
30+
* <p>Parameters:
31+
* <p> oldValue: scaleFactor before
32+
* <p> newValue: scaleFactor after
33+
*/
34+
String MODELCHART_SCALEFACTOR_CHANGED = "modelchartScaleFactorChanged";
35+
2736
/**
2837
* Used to indicate that the state of the date / checkbox in the
2938
* {@link com.tagtraum.perf.gcviewer.view.TimeOffsetPanel} has changed
@@ -33,4 +42,5 @@ public interface PropertyChangeEventConsts {
3342
* <p> newValue: checkbox state now
3443
*/
3544
String TIMEOFFSETPANEL_STATE_CHANGED = "timeoffsetpanelStateChanged";
45+
3646
}

0 commit comments

Comments
 (0)