forked from jasder/antlr
makes the UI dialog to save/restore its state - width, height, location on screen, the placement of splitter as well as viewer scale
This commit is contained in:
parent
66e275d164
commit
f56a27bb4b
|
@ -36,7 +36,6 @@ import org.abego.treelayout.TreeLayout;
|
||||||
import org.abego.treelayout.util.DefaultConfiguration;
|
import org.abego.treelayout.util.DefaultConfiguration;
|
||||||
import org.antlr.v4.runtime.misc.GraphicsSupport;
|
import org.antlr.v4.runtime.misc.GraphicsSupport;
|
||||||
import org.antlr.v4.runtime.misc.JFileChooserConfirmOverwrite;
|
import org.antlr.v4.runtime.misc.JFileChooserConfirmOverwrite;
|
||||||
import org.antlr.v4.runtime.misc.NotNull;
|
|
||||||
import org.antlr.v4.runtime.misc.Utils;
|
import org.antlr.v4.runtime.misc.Utils;
|
||||||
import org.antlr.v4.runtime.tree.ErrorNode;
|
import org.antlr.v4.runtime.tree.ErrorNode;
|
||||||
import org.antlr.v4.runtime.tree.Tree;
|
import org.antlr.v4.runtime.tree.Tree;
|
||||||
|
@ -54,8 +53,7 @@ import javax.swing.tree.DefaultMutableTreeNode;
|
||||||
import javax.swing.tree.TreePath;
|
import javax.swing.tree.TreePath;
|
||||||
import javax.swing.tree.TreeSelectionModel;
|
import javax.swing.tree.TreeSelectionModel;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.*;
|
||||||
import java.awt.event.ActionListener;
|
|
||||||
import java.awt.geom.CubicCurve2D;
|
import java.awt.geom.CubicCurve2D;
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
@ -68,6 +66,7 @@ import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.prefs.Preferences;
|
||||||
|
|
||||||
public class TreeViewer extends JComponent {
|
public class TreeViewer extends JComponent {
|
||||||
public static final Color LIGHT_RED = new Color(244, 213, 211);
|
public static final Color LIGHT_RED = new Color(244, 213, 211);
|
||||||
|
@ -269,10 +268,19 @@ public class TreeViewer extends JComponent {
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
private static final String DIALOG_WIDTH_PREFS_KEY = "dialog_width";
|
||||||
|
private static final String DIALOG_HEIGHT_PREFS_KEY = "dialog_height";
|
||||||
|
private static final String DIALOG_X_PREFS_KEY = "dialog_x";
|
||||||
|
private static final String DIALOG_Y_PREFS_KEY = "dialog_y";
|
||||||
|
private static final String DIALOG_DIVIDER_LOC_PREFS_KEY = "dialog_divider_location";
|
||||||
|
private static final String DIALOG_VIEWER_SCALE_PREFS_KEY = "dialog_slider_location";
|
||||||
|
|
||||||
protected static JDialog showInDialog(final TreeViewer viewer) {
|
protected static JDialog showInDialog(final TreeViewer viewer) {
|
||||||
final JDialog dialog = new JDialog();
|
final JDialog dialog = new JDialog();
|
||||||
dialog.setTitle("Parse Tree Inspector");
|
dialog.setTitle("Parse Tree Inspector");
|
||||||
|
|
||||||
|
final Preferences prefs = Preferences.userNodeForPackage(TreeViewer.class);
|
||||||
|
|
||||||
// Make new content panes
|
// Make new content panes
|
||||||
final Container mainPane = new JPanel(new BorderLayout(5,5));
|
final Container mainPane = new JPanel(new BorderLayout(5,5));
|
||||||
final Container contentPane = new JPanel(new BorderLayout(0,0));
|
final Container contentPane = new JPanel(new BorderLayout(0,0));
|
||||||
|
@ -294,15 +302,14 @@ public class TreeViewer extends JComponent {
|
||||||
new ActionListener() {
|
new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
dialog.setVisible(false);
|
dialog.dispatchEvent(new WindowEvent(dialog, WindowEvent.WINDOW_CLOSING));
|
||||||
dialog.dispose();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
wrapper.add(ok);
|
wrapper.add(ok);
|
||||||
|
|
||||||
// Add an export-to-png button right of the "OK" button
|
// Add an export-to-png button right of the "OK" button
|
||||||
JButton png = new JButton("png");
|
JButton png = new JButton("Export as PNG");
|
||||||
png.addActionListener(
|
png.addActionListener(
|
||||||
new ActionListener() {
|
new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -316,9 +323,12 @@ public class TreeViewer extends JComponent {
|
||||||
bottomPanel.add(wrapper, BorderLayout.SOUTH);
|
bottomPanel.add(wrapper, BorderLayout.SOUTH);
|
||||||
|
|
||||||
// Add scale slider
|
// Add scale slider
|
||||||
int sliderValue = (int) ((viewer.getScale()-1.0) * 1000);
|
double lastKnownViewerScale = prefs.getDouble(DIALOG_VIEWER_SCALE_PREFS_KEY, viewer.getScale());
|
||||||
final JSlider scaleSlider = new JSlider(JSlider.HORIZONTAL,
|
viewer.setScale(lastKnownViewerScale);
|
||||||
-999,1000,sliderValue);
|
|
||||||
|
int sliderValue = (int) ((lastKnownViewerScale - 1.0) * 1000);
|
||||||
|
final JSlider scaleSlider = new JSlider(JSlider.HORIZONTAL, -999, 1000, sliderValue);
|
||||||
|
|
||||||
scaleSlider.addChangeListener(
|
scaleSlider.addChangeListener(
|
||||||
new ChangeListener() {
|
new ChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -362,7 +372,7 @@ public class TreeViewer extends JComponent {
|
||||||
treePanel.add(new JScrollPane(tree));
|
treePanel.add(new JScrollPane(tree));
|
||||||
|
|
||||||
// Create the pane for both the JTree and the AST
|
// Create the pane for both the JTree and the AST
|
||||||
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
|
final JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
|
||||||
treePanel, contentPane);
|
treePanel, contentPane);
|
||||||
|
|
||||||
mainPane.add(splitPane, BorderLayout.CENTER);
|
mainPane.add(splitPane, BorderLayout.CENTER);
|
||||||
|
@ -370,14 +380,41 @@ public class TreeViewer extends JComponent {
|
||||||
dialog.setContentPane(mainPane);
|
dialog.setContentPane(mainPane);
|
||||||
|
|
||||||
// make viz
|
// make viz
|
||||||
dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
WindowListener exitListener = new WindowAdapter() {
|
||||||
dialog.setPreferredSize(new Dimension(600, 500));
|
public void windowClosing(WindowEvent e) {
|
||||||
|
prefs.putInt(DIALOG_WIDTH_PREFS_KEY, (int) dialog.getSize().getWidth());
|
||||||
|
prefs.putInt(DIALOG_HEIGHT_PREFS_KEY, (int) dialog.getSize().getHeight());
|
||||||
|
prefs.putDouble(DIALOG_X_PREFS_KEY, dialog.getLocationOnScreen().getX());
|
||||||
|
prefs.putDouble(DIALOG_Y_PREFS_KEY, dialog.getLocationOnScreen().getY());
|
||||||
|
prefs.putInt(DIALOG_DIVIDER_LOC_PREFS_KEY, splitPane.getDividerLocation());
|
||||||
|
prefs.putDouble(DIALOG_VIEWER_SCALE_PREFS_KEY, viewer.getScale());
|
||||||
|
|
||||||
|
dialog.setVisible(false);
|
||||||
|
dialog.dispose();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
dialog.addWindowListener(exitListener);
|
||||||
|
dialog.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
|
||||||
|
|
||||||
|
int width = prefs.getInt(DIALOG_WIDTH_PREFS_KEY, 600);
|
||||||
|
int height = prefs.getInt(DIALOG_HEIGHT_PREFS_KEY, 500);
|
||||||
|
dialog.setPreferredSize(new Dimension(width, height));
|
||||||
dialog.pack();
|
dialog.pack();
|
||||||
|
|
||||||
// After pack(): set the divider at 1/3 of the frame.
|
// After pack(): set the divider at 1/3 (200/600) of the frame.
|
||||||
splitPane.setDividerLocation(0.33);
|
int dividerLocation = prefs.getInt(DIALOG_DIVIDER_LOC_PREFS_KEY, 200);
|
||||||
|
splitPane.setDividerLocation(dividerLocation);
|
||||||
|
|
||||||
|
if (prefs.getDouble(DIALOG_X_PREFS_KEY, -1) != -1) {
|
||||||
|
dialog.setLocation(
|
||||||
|
(int)prefs.getDouble(DIALOG_X_PREFS_KEY, 100),
|
||||||
|
(int)prefs.getDouble(DIALOG_Y_PREFS_KEY, 100)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dialog.setLocationRelativeTo(null);
|
||||||
|
}
|
||||||
|
|
||||||
dialog.setLocationRelativeTo(null);
|
|
||||||
dialog.setVisible(true);
|
dialog.setVisible(true);
|
||||||
return dialog;
|
return dialog;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue