Skip to content

Commit bdf6444

Browse files
committed
Windowing improvements
Make snapping an option Add Window menu so that closed windows can be reopened Add snapping to right and bottom edges Fix snapping bug
1 parent d6bfe27 commit bdf6444

File tree

8 files changed

+122
-100
lines changed

8 files changed

+122
-100
lines changed

src/main/java/the/bytecode/club/jda/decompilers/Decompiler.java

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -29,32 +29,6 @@ public abstract class Decompiler
2929
public final static Decompiler FERNFLOWER = new FernFlowerDecompiler();
3030
public final static Decompiler PROCYON = new ProcyonDecompiler();
3131
public final static Decompiler CFR = new CFRDecompiler();
32-
public final static Decompiler HEXCODE = new Decompiler()
33-
{
34-
@Override
35-
public String decompileClassNode(ClassNode cn, byte[] b)
36-
{
37-
throw new IllegalArgumentException();
38-
}
39-
40-
@Override
41-
public void decompileToZip(String zipName)
42-
{
43-
throw new IllegalArgumentException();
44-
}
45-
46-
@Override
47-
public String getName()
48-
{
49-
return "Hexcode";
50-
}
51-
52-
@Override
53-
public DecompilerSettings getSettings()
54-
{
55-
throw new IllegalArgumentException();
56-
}
57-
};
5832

5933
public Decompiler()
6034
{

src/main/java/the/bytecode/club/jda/gui/ClassViewer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ public void updatePane(int pane, RSyntaxTextArea text, Decompiler decompiler)
6060
javas.set(pane, text);
6161
SearchPanel search = new SearchPanel(text);
6262
searches.set(pane, search);
63-
if (decompilers.get(pane) != Decompiler.HEXCODE)
64-
panels.get(pane).add(search, BorderLayout.NORTH);
63+
panels.get(pane).add(search, BorderLayout.NORTH);
6564
}
6665

6766
/**

src/main/java/the/bytecode/club/jda/gui/FileNavigationPane.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ else if (ke.getKeyCode() == KeyEvent.VK_ESCAPE)
150150
{
151151
tree.grabFocus();
152152
}
153+
154+
JDA.checkHotKey(ke);
153155
}
154156
};
155157

@@ -191,6 +193,7 @@ public void keyTyped(KeyEvent e)
191193

192194
public void keyPressed(KeyEvent e)
193195
{
196+
JDA.checkHotKey(e);
194197
}
195198

196199
@Override

src/main/java/the/bytecode/club/jda/gui/MainViewerGUI.java

Lines changed: 72 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import javax.swing.filechooser.FileFilter;
1818
import java.awt.*;
1919
import java.awt.event.*;
20+
import java.beans.PropertyVetoException;
2021
import java.io.File;
2122
import java.util.*;
2223
import java.util.List;
@@ -28,6 +29,49 @@
2829
*/
2930
public class MainViewerGUI extends JFrame implements FileChangeNotifier, IPersistentWindow
3031
{
32+
public boolean isMaximized = false;
33+
public Point unmaximizedPos;
34+
public Dimension unmaximizedSize;
35+
36+
private static final Color COLOR_DESKTOP_BACKGROUND = new Color(58, 110, 165);
37+
public JDesktopPane desktop;
38+
public static ArrayList<VisibleComponent> rfComps = new ArrayList<>();
39+
public FileNavigationPane navigator;
40+
public WorkPane workPane;
41+
42+
public AboutWindow aboutWindow = new AboutWindow();
43+
public IntroWindow introWindow = new IntroWindow();
44+
45+
public final ButtonGroup panelGroup1 = new ButtonGroup();
46+
public final ButtonGroup panelGroup2 = new ButtonGroup();
47+
public final ButtonGroup panelGroup3 = new ButtonGroup();
48+
public List<ButtonGroup> allPanes = Collections.unmodifiableList(Arrays.asList(panelGroup1, panelGroup2, panelGroup3));
49+
50+
public Map<ButtonGroup, Map<JRadioButtonMenuItem, Decompiler>> allDecompilers = new HashMap<>();
51+
public Map<ButtonGroup, Map<Decompiler, JRadioButtonMenuItem>> allDecompilersRev = new HashMap<>();
52+
public Map<ButtonGroup, Map<Decompiler, JCheckBoxMenuItem>> editButtons = new HashMap<>();
53+
54+
public final JMenuItem mntmNewWorkspace = new JMenuItem("New Workspace");
55+
public JMenu mnRecentFiles = new JMenu("Recent Files");
56+
public final JMenuItem mntmDecompileSaveAllClasses = new JMenuItem("Decompile & Save All Classes..");
57+
public final JMenuItem mntmAbout = new JMenuItem("About");
58+
public final JMenuItem mntmIntro = new JMenuItem("Help");
59+
public final JMenuItem mntmSaveAsRunnableJar = new JMenuItem("Save As Runnable Jar..");
60+
public final JCheckBoxMenuItem mntmUpdateCheck = new JCheckBoxMenuItem("Update Check");
61+
public final JMenuItem mntmDecompileSaveOpenedClasses = new JMenuItem("Decompile & Save Opened Class..");
62+
public final JCheckBoxMenuItem refreshOnChange = new JCheckBoxMenuItem("Refresh On View Change");
63+
public final JCheckBox mnShowContainer = new JCheckBox("Show Containing File's Name");
64+
public final JCheckBox mnSnapToEdges = new JCheckBox("Snap Windows to Edges");
65+
public final JMenuItem mntmSetOptionalLibrary = new JMenuItem("Set Optional Library Folder");
66+
public final JMenu mnFontSize = new JMenu("Font Size");
67+
public final JMenuItem mntmReloadResources = new JMenuItem("Reload Resources");
68+
69+
public final JMenuBar menuBar;
70+
public final JMenu viewMenu;
71+
public final JMenu fileMenu;
72+
public final JMenu windowMenu;
73+
public final JMenu settingsMenu;
74+
3175
public void setOptionalLibrary()
3276
{
3377
final JTextField text = new JTextField();
@@ -88,28 +132,22 @@ private JMenu generatePane(int id)
88132
JMenu menu = new JMenu("Pane " + (id + 1));
89133
JRadioButtonMenuItem none = new JRadioButtonMenuItem("None");
90134
JRadioButtonMenuItem bytecode = new JRadioButtonMenuItem("Bytecode");
91-
JRadioButtonMenuItem hexcode = new JRadioButtonMenuItem("Hex Dump");
92135
ButtonGroup group = allPanes.get(id);
93136

94137
group.add(none);
95138
group.add(bytecode);
96-
group.add(hexcode);
97139
allDecompilers.get(group).put(none, null);
98140
allDecompilersRev.get(group).put(null, none);
99141
allDecompilers.get(group).put(bytecode, Decompiler.BYTECODE);
100142
allDecompilersRev.get(group).put(Decompiler.BYTECODE, bytecode);
101-
allDecompilers.get(group).put(hexcode, Decompiler.HEXCODE);
102-
allDecompilersRev.get(group).put(Decompiler.HEXCODE, hexcode);
103143

104144
menu.add(none);
105145
menu.add(new JSeparator());
106146
menu.add(generateDecompilerMenu(Decompiler.PROCYON, id));
107147
menu.add(generateDecompilerMenu(Decompiler.CFR, id));
108148
menu.add(generateDecompilerMenu(Decompiler.FERNFLOWER, id));
109149
menu.add(new JSeparator());
110-
menu.add(new JSeparator());
111150
menu.add(bytecode);
112-
menu.add(hexcode);
113151
return menu;
114152
}
115153

@@ -157,42 +195,6 @@ else if (e.getID() == KeyEvent.KEY_RELEASED)
157195
}
158196
}
159197

160-
public boolean isMaximized = false;
161-
public Point unmaximizedPos;
162-
public Dimension unmaximizedSize;
163-
164-
private static final Color COLOR_DESKTOP_BACKGROUND = new Color(58, 110, 165);
165-
public JDesktopPane desktop;
166-
public static ArrayList<VisibleComponent> rfComps = new ArrayList<>();
167-
public FileNavigationPane navigator;
168-
public WorkPane workPane;
169-
170-
public AboutWindow aboutWindow = new AboutWindow();
171-
public IntroWindow introWindow = new IntroWindow();
172-
173-
public final ButtonGroup panelGroup1 = new ButtonGroup();
174-
public final ButtonGroup panelGroup2 = new ButtonGroup();
175-
public final ButtonGroup panelGroup3 = new ButtonGroup();
176-
public List<ButtonGroup> allPanes = Collections.unmodifiableList(Arrays.asList(panelGroup1, panelGroup2, panelGroup3));
177-
178-
public Map<ButtonGroup, Map<JRadioButtonMenuItem, Decompiler>> allDecompilers = new HashMap<>();
179-
public Map<ButtonGroup, Map<Decompiler, JRadioButtonMenuItem>> allDecompilersRev = new HashMap<>();
180-
public Map<ButtonGroup, Map<Decompiler, JCheckBoxMenuItem>> editButtons = new HashMap<>();
181-
182-
public final JMenuItem mntmNewWorkspace = new JMenuItem("New Workspace");
183-
public JMenu mnRecentFiles = new JMenu("Recent Files");
184-
public final JMenuItem mntmDecompileSaveAllClasses = new JMenuItem("Decompile & Save All Classes..");
185-
public final JMenuItem mntmAbout = new JMenuItem("About");
186-
public final JMenuItem mntmIntro = new JMenuItem("Help");
187-
public final JMenuItem mntmSaveAsRunnableJar = new JMenuItem("Save As Runnable Jar..");
188-
public final JCheckBoxMenuItem mntmUpdateCheck = new JCheckBoxMenuItem("Update Check");
189-
public final JMenuItem mntmDecompileSaveOpenedClasses = new JMenuItem("Decompile & Save Opened Class..");
190-
public final JCheckBoxMenuItem refreshOnChange = new JCheckBoxMenuItem("Refresh On View Change");
191-
public final JCheckBox mnShowContainer = new JCheckBox("Show Containing File's Name");
192-
private final JMenuItem mntmSetOptionalLibrary = new JMenuItem("Set Optional Library Folder");
193-
private final JMenu mnFontSize = new JMenu("Font Size");
194-
private final JMenuItem mntmReloadResources = new JMenuItem("Reload Resources");
195-
196198
public MainViewerGUI()
197199
{
198200
initializeWindows();
@@ -231,7 +233,6 @@ else if ((oldState & Frame.ICONIFIED) != 0 && (newState & Frame.ICONIFIED) == 0)
231233
}
232234
else if ((oldState & Frame.MAXIMIZED_BOTH) != 0 && (newState & Frame.MAXIMIZED_BOTH) == 0)
233235
{
234-
isMaximized = false;
235236
setSize(unmaximizedSize);
236237
setLocation(unmaximizedPos);
237238
}
@@ -258,10 +259,11 @@ public void componentMoved(ComponentEvent e)
258259

259260
this.setIconImages(Resources.iconList);
260261

261-
JMenuBar menuBar = new JMenuBar();
262-
JMenu fileMenu = new JMenu("File");
263-
JMenu viewMenu = new JMenu("View");
264-
JMenu settingsMenu = new JMenu("Settings");
262+
menuBar = new JMenuBar();
263+
fileMenu = new JMenu("File");
264+
viewMenu = new JMenu("View");
265+
windowMenu = new JMenu("Window");
266+
settingsMenu = new JMenu("Settings");
265267
setJMenuBar(menuBar);
266268

267269
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
@@ -318,6 +320,29 @@ public void componentMoved(ComponentEvent e)
318320
viewMenu.add(generatePane(1));
319321
viewMenu.add(generatePane(2));
320322

323+
for (VisibleComponent frame : rfComps)
324+
{
325+
JMenuItem button = new JMenuItem(frame.getName());
326+
button.addActionListener(e -> {
327+
try
328+
{
329+
frame.setIcon(false);
330+
frame.setVisible(true);
331+
}
332+
catch (PropertyVetoException e1)
333+
{
334+
}
335+
});
336+
windowMenu.add(button);
337+
}
338+
windowMenu.add(new JSeparator());
339+
340+
mnSnapToEdges.setSelected(Settings.SNAP_TO_EDGES.getBool());
341+
mnSnapToEdges.addItemListener(e -> Settings.SNAP_TO_EDGES.set(mnSnapToEdges.isSelected()));
342+
windowMenu.add(mnSnapToEdges);
343+
344+
menuBar.add(windowMenu);
345+
321346
settingsMenu.add(refreshOnChange);
322347

323348
settingsMenu.add(new JSeparator());
@@ -367,7 +392,6 @@ public void componentMoved(ComponentEvent e)
367392
settingsMenu.add(bytecodeSettingsMenu);
368393

369394
menuBar.add(settingsMenu);
370-
371395
menuBar.add(spinnerMenu);
372396

373397
if (JDA.previewCopy)

src/main/java/the/bytecode/club/jda/gui/PaneUpdaterThread.java

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,26 +38,19 @@ public void run()
3838
try
3939
{
4040
final byte[] b = JDA.getClassBytes(viewer.container, viewer.cn.name + ".class");
41-
if (decompiler != Decompiler.HEXCODE)
42-
{
43-
RSyntaxTextArea panelArea = new RSyntaxTextArea();
44-
panelArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
45-
panelArea.setCodeFoldingEnabled(true);
46-
panelArea.setAntiAliasingEnabled(true);
47-
final RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
48-
panelArea.setText(decompiler.decompileClassNode(viewer.cn, b));
49-
panelArea.setCaretPosition(0);
50-
panelArea.setEditable(viewer.isPaneEditable(paneId));
51-
scrollPane.setColumnHeaderView(new JLabel(decompiler.getName() + " Decompiler - Editable: " + panelArea.isEditable()));
52-
panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int) JDA.viewer.fontSpinner.getValue()));
41+
RSyntaxTextArea panelArea = new RSyntaxTextArea();
42+
panelArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
43+
panelArea.setCodeFoldingEnabled(true);
44+
panelArea.setAntiAliasingEnabled(true);
45+
final RTextScrollPane scrollPane = new RTextScrollPane(panelArea);
46+
panelArea.setText(decompiler.decompileClassNode(viewer.cn, b));
47+
panelArea.setCaretPosition(0);
48+
panelArea.setEditable(viewer.isPaneEditable(paneId));
49+
scrollPane.setColumnHeaderView(new JLabel(decompiler.getName() + " Decompiler - Editable: " + panelArea.isEditable()));
50+
panelArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int) JDA.viewer.fontSpinner.getValue()));
5351

54-
SwingUtilities.invokeLater(() -> target.add(scrollPane));
55-
viewer.updatePane(paneId, panelArea, decompiler);
56-
}
57-
else
58-
{
59-
// initialize fallback
60-
}
52+
SwingUtilities.invokeLater(() -> target.add(scrollPane));
53+
viewer.updatePane(paneId, panelArea, decompiler);
6154
}
6255
catch (Exception e)
6356
{

src/main/java/the/bytecode/club/jda/gui/VisibleComponent.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ public VisibleComponent(final String id, final String title, final Icon icon)
2929
{
3030
super(title, true, true, true, true);
3131
windowId = id;
32+
setName(title);
3233
setFrameIcon(icon);
34+
setDefaultCloseOperation(JInternalFrame.HIDE_ON_CLOSE);
3335

3436
unmaximizedPos = getDefaultPosition();
3537
unmaximizedSize = getDefaultSize();
Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,51 @@
11
package the.bytecode.club.jda.gui;
22

3+
import the.bytecode.club.jda.settings.Settings;
4+
35
import javax.swing.*;
46
import java.awt.*;
57

68
public class WorkspaceDesktopManager extends DefaultDesktopManager
79
{
10+
private static final int SNAP_THRESHOLD = 5;
11+
812
@Override
913
public void dragFrame(JComponent f, int x, int y)
1014
{
11-
if (f instanceof VisibleComponent)
15+
if (Settings.SNAP_TO_EDGES.getBool() && f instanceof VisibleComponent)
1216
{
1317
VisibleComponent frame = (VisibleComponent) f;
1418
JDesktopPane desk = frame.getDesktopPane();
1519
Dimension d = desk.getSize();
16-
if (x < 5)
20+
if (x < SNAP_THRESHOLD)
1721
x = 0;
18-
else if (x + frame.getWidth() > d.width - 5)
19-
x = d.width - frame.getWidth();
20-
if (y < 5)
22+
else if (x + frame.getWidth() > d.width - SNAP_THRESHOLD)
23+
x = Math.max(0, d.width - frame.getWidth());
24+
if (y < SNAP_THRESHOLD)
2125
y = 0;
26+
else if (y + frame.getHeight() > d.height - SNAP_THRESHOLD)
27+
y = Math.max(0, d.height - frame.getHeight());
2228
}
2329
super.dragFrame(f, x, y);
2430
}
31+
32+
@Override
33+
public void resizeFrame(JComponent f, int x, int y, int w, int h)
34+
{
35+
if (Settings.SNAP_TO_EDGES.getBool())
36+
{
37+
VisibleComponent frame = (VisibleComponent) f;
38+
JDesktopPane desk = frame.getDesktopPane();
39+
Dimension d = desk.getSize();
40+
if (x < SNAP_THRESHOLD)
41+
x = 0;
42+
else if (d.width - x - w < SNAP_THRESHOLD)
43+
w = Math.max(0, d.width - x);
44+
if (y < SNAP_THRESHOLD)
45+
y = 0;
46+
if (d.height - y - h < SNAP_THRESHOLD)
47+
h = Math.max(0, d.height - y);
48+
}
49+
super.resizeFrame(f, x, y, w, h);
50+
}
2551
}

src/main/java/the/bytecode/club/jda/settings/Settings.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public class Settings
2323

2424
public static final Setting PATH = new Setting("path", "");
2525
public static final Setting SHOW_CONTAINER_NAME = new Setting("showfilename", "false");
26+
public static final Setting SNAP_TO_EDGES = new Setting("snaptoedges", "false");
2627
public static final Setting DO_UPDATE_CHECK = new Setting("doupdatecheck", "true");
2728

2829
public static void saveGUI()

0 commit comments

Comments
 (0)