Skip to content

Commit 5924070

Browse files
committed
Make menu item for plugins
Fixes #28
1 parent 7ccbe2c commit 5924070

File tree

5 files changed

+133
-56
lines changed

5 files changed

+133
-56
lines changed

mapleir/src/main/java/org/mapleir/jdaplugin/MaplePlugin.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.mapleir.context.BasicAnalysisContext;
1212
import org.mapleir.context.IRCache;
1313
import org.mapleir.ir.cfg.builder.ControlFlowGraphBuilder;
14+
import org.mapleir.jdaplugin.gui.AboutDialog;
1415
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
1516

1617
import java.util.HashMap;
@@ -70,4 +71,9 @@ public void onOpenFile(FileContainer fileContainer) {
7071
public void onCloseFile(FileContainer fc) {
7172
cxts.remove(fc);
7273
}
74+
75+
@Override
76+
public void onPluginButton() {
77+
new AboutDialog().show();
78+
}
7379
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.mapleir.jdaplugin.gui;
2+
3+
import javax.swing.*;
4+
5+
public class AboutDialog extends JDialog {
6+
public AboutDialog() {
7+
super(new JFrame(), "MapleIR - About", true);
8+
Box b = Box.createVerticalBox();
9+
b.add(Box.createGlue());
10+
b.add(new JLabel("Powered by MapleIR"));
11+
b.add(Box.createGlue());
12+
getContentPane().add(b, "Center");
13+
14+
JPanel okPanel = new JPanel();
15+
JButton ok = new JButton("Ok");
16+
okPanel.add(ok);
17+
getContentPane().add(okPanel, "South");
18+
19+
ok.addActionListener(evt -> setVisible(false));
20+
21+
setSize(250, 100);
22+
}
23+
}

src/main/java/club/bytecode/the/jda/JDA.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,19 @@ public static void unloadPlugin(JDAPlugin plugin) {
9595
plugins.remove(plugin);
9696
}
9797

98+
public static List<JDAPlugin> getLoadedPlugins() {
99+
return Collections.unmodifiableList(plugins);
100+
}
101+
98102
private static void loadPlugins() throws MalformedURLException {
103+
if (injectedPlugin != null) {
104+
JDAPlugin plugin = injectedPlugin.get();
105+
System.out.println("Loading dependency-injected plugin " + plugin.getName());
106+
loadPlugin(injectedPlugin.get());
107+
System.out.println("Skipping other plugins.");
108+
return;
109+
}
110+
99111
if (!pluginsDir.exists())
100112
if (!pluginsDir.mkdirs())
101113
throw new RuntimeException("Couldn't create plugins directory");
@@ -111,12 +123,6 @@ else if (!pluginsDir.isDirectory())
111123
if (pluginInstance != null)
112124
loadPlugin(pluginInstance);
113125
}
114-
115-
if (injectedPlugin != null) {
116-
JDAPlugin plugin = injectedPlugin.get();
117-
System.out.println("Loading dependency-injected plugin " + plugin.getName());
118-
loadPlugin(injectedPlugin.get());
119-
}
120126
}
121127

122128
public static void onGUILoad() {
@@ -160,7 +166,8 @@ public static void boot(String[] args) {
160166
private static void onExit() {
161167
// unload all plugins
162168
plugins.forEach(JDAPlugin::onExit);
163-
plugins.forEach(JDA::unloadPlugin);
169+
while (!plugins.isEmpty())
170+
unloadPlugin(plugins.get(0));
164171

165172
for (Process proc : createdProcesses)
166173
proc.destroy();

src/main/java/club/bytecode/the/jda/api/JDAPlugin.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,9 @@ public interface JDAPlugin {
3939
* Callback for when a file has been closed in JDA.
4040
*/
4141
void onCloseFile(FileContainer container);
42+
43+
/**
44+
* Called when the plugin's button in the Edit/Plugins menu is pressed.
45+
*/
46+
void onPluginButton();
4247
}

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

Lines changed: 85 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import club.bytecode.the.jda.FileContainer;
55
import club.bytecode.the.jda.JDA;
66
import club.bytecode.the.jda.Resources;
7+
import club.bytecode.the.jda.api.JDAPlugin;
78
import club.bytecode.the.jda.decompilers.Decompilers;
89
import club.bytecode.the.jda.decompilers.JDADecompiler;
910
import club.bytecode.the.jda.gui.dialogs.AboutWindow;
@@ -43,7 +44,7 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier, IPersis
4344
public JMenu viewMenu;
4445
public JMenu fileMenu;
4546
public JMenu windowMenu;
46-
public JMenu settingsMenu;
47+
public JMenu editMenu;
4748
public JMenu helpMenu;
4849

4950
public boolean isMaximized = false;
@@ -64,6 +65,8 @@ public class MainViewerGUI extends JFrame implements FileChangeNotifier, IPersis
6465
public JMenu mnRecentFiles = new JMenu("Recent Files");
6566
private JMenuItem spinnerMenu = new JMenuItem("");
6667
public FontOptionsDialog fontOptionsDialog = new FontOptionsDialog();
68+
public JMenu settingsMenu;
69+
public JMenu pluginsMenu;
6770

6871
public MainViewerGUI() {
6972
initializeWindows();
@@ -123,6 +126,7 @@ public void componentMoved(ComponentEvent e) {
123126
this.setIconImages(Resources.iconList);
124127

125128
initializeMenubar();
129+
initializePanelGroup();
126130

127131
if (JDA.previewCopy)
128132
setTitle("JDA v" + JDA.version + " Preview");
@@ -161,12 +165,15 @@ private void initializeMenubar() {
161165
fileMenu = new JMenu("File");
162166
viewMenu = new JMenu("View");
163167
windowMenu = new JMenu("Window");
164-
settingsMenu = new JMenu("Settings");
168+
editMenu = new JMenu("Edit");
165169
helpMenu = new JMenu("Help");
166170
setJMenuBar(menuBar);
167171

168172
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
169173

174+
// ===========================================================================================
175+
// File menu
176+
// ===========================================================================================
170177
menuBar.add(fileMenu);
171178

172179
JMenuItem mntmLoadJar = new JMenuItem("Add..");
@@ -215,11 +222,74 @@ private void initializeMenubar() {
215222

216223
fileMenu.add(mntmExit);
217224

225+
// ===========================================================================================
226+
// Edit menu
227+
// ===========================================================================================
228+
menuBar.add(editMenu);
229+
230+
// -------------------------------------------------------------------------------------------
231+
// Settings menu
232+
settingsMenu = new JMenu("Settings");
233+
editMenu.add(settingsMenu);
234+
235+
refreshOnChange.addItemListener(e -> Settings.REFRESH_ON_VIEW_CHANGE.set(refreshOnChange.isSelected()));
236+
refreshOnChange.setSelected(Settings.REFRESH_ON_VIEW_CHANGE.getBool());
237+
settingsMenu.add(refreshOnChange);
238+
239+
mntmFontSettings.addActionListener(e -> fontOptionsDialog.display());
240+
settingsMenu.add(mntmFontSettings);
241+
242+
settingsMenu.add(new JSeparator());
243+
244+
mnShowContainer.setSelected(Settings.SHOW_CONTAINER_NAME.getBool());
245+
mnShowContainer.addItemListener(e -> {
246+
JTabbedPane tabs = fileViewerPane.tabs;
247+
Component[] components = tabs.getComponents();
248+
for (int i = 0; i < components.length; i++) {
249+
Component c = components[i];
250+
if (c instanceof Viewer) {
251+
((Viewer) c).updateName();
252+
int idx = tabs.indexOfComponent(c);
253+
tabs.setTabComponentAt(idx, new TabbedPane(c.getName(), tabs));
254+
fileViewerPane.tabs.setTitleAt(idx, c.getName());
255+
}
256+
}
257+
Settings.SHOW_CONTAINER_NAME.set(mnShowContainer.isSelected());
258+
});
259+
viewMenu.add(mnShowContainer);
260+
mntmSetOptionalLibrary.addActionListener(e -> setOptionalLibrary());
261+
settingsMenu.add(mntmSetOptionalLibrary);
262+
263+
settingsMenu.add(new JSeparator());
264+
265+
for (JDADecompiler decompiler : Decompilers.getAllDecompilers()) {
266+
JMenuItem settingsButton = new JMenuItem(decompiler.getName());
267+
settingsButton.addActionListener(e -> decompiler.getSettings().displayDialog());
268+
settingsMenu.add(settingsButton);
269+
}
270+
271+
// -------------------------------------------------------------------------------------------
272+
// Plugins menu
273+
pluginsMenu = new JMenu("Plugins");
274+
editMenu.add(pluginsMenu);
275+
for (JDAPlugin plugin : JDA.getLoadedPlugins()) {
276+
JMenuItem button = new JMenuItem(plugin.getName());
277+
button.addActionListener((e) -> plugin.onPluginButton());
278+
pluginsMenu.add(button);
279+
}
280+
281+
// ===========================================================================================
282+
// View menu
283+
// ===========================================================================================
218284
menuBar.add(viewMenu);
219285
viewMenu.add(generatePane(0));
220286
viewMenu.add(generatePane(1));
221287
viewMenu.add(generatePane(2));
222-
288+
289+
// ===========================================================================================
290+
// Windows menu
291+
// ===========================================================================================
292+
menuBar.add(windowMenu);
223293
for (JDAWindow frame : windows) {
224294
JMenuItem button = new JMenuItem(frame.getName());
225295
button.addActionListener(e -> {
@@ -236,29 +306,11 @@ private void initializeMenubar() {
236306
mnSnapToEdges.setSelected(Settings.SNAP_TO_EDGES.getBool());
237307
mnSnapToEdges.addItemListener(e -> Settings.SNAP_TO_EDGES.set(mnSnapToEdges.isSelected()));
238308
windowMenu.add(mnSnapToEdges);
239-
240-
menuBar.add(windowMenu);
241-
242-
refreshOnChange.addItemListener(e -> Settings.REFRESH_ON_VIEW_CHANGE.set(refreshOnChange.isSelected()));
243-
refreshOnChange.setSelected(Settings.REFRESH_ON_VIEW_CHANGE.getBool());
244-
settingsMenu.add(refreshOnChange);
245-
246-
settingsMenu.add(new JSeparator());
247-
248-
mntmSetOptionalLibrary.addActionListener(e -> setOptionalLibrary());
249-
250-
settingsMenu.add(mntmSetOptionalLibrary);
251-
252-
settingsMenu.add(new JSeparator());
253-
254-
for (JDADecompiler decompiler : Decompilers.getAllDecompilers()) {
255-
JMenuItem settingsButton = new JMenuItem(decompiler.getName());
256-
settingsButton.addActionListener(e -> decompiler.getSettings().displayDialog());
257-
settingsMenu.add(settingsButton);
258-
}
259-
260-
menuBar.add(settingsMenu);
261-
309+
310+
// ===========================================================================================
311+
// Help menu
312+
// ===========================================================================================
313+
menuBar.add(helpMenu);
262314
mntmAbout.addActionListener(arg0 -> aboutWindow.setVisible(true));
263315
helpMenu.add(mntmAbout);
264316

@@ -269,30 +321,14 @@ private void initializeMenubar() {
269321
mntmUpdateCheck.setEnabled(false);
270322
mntmUpdateCheck.addActionListener(e -> Settings.DO_UPDATE_CHECK.set(mntmUpdateCheck.isSelected()));
271323
helpMenu.add(mntmUpdateCheck);
272-
menuBar.add(helpMenu);
273-
324+
325+
// ===========================================================================================
326+
// Spinner (must go last)
327+
// ===========================================================================================
274328
menuBar.add(spinnerMenu);
275-
276-
mntmFontSettings.addActionListener(e -> fontOptionsDialog.display());
277-
viewMenu.add(mntmFontSettings);
278-
279-
mnShowContainer.setSelected(Settings.SHOW_CONTAINER_NAME.getBool());
280-
mnShowContainer.addItemListener(e -> {
281-
JTabbedPane tabs = fileViewerPane.tabs;
282-
Component[] components = tabs.getComponents();
283-
for (int i = 0; i < components.length; i++) {
284-
Component c = components[i];
285-
if (c instanceof Viewer) {
286-
((Viewer) c).updateName();
287-
int idx = tabs.indexOfComponent(c);
288-
tabs.setTabComponentAt(idx, new TabbedPane(c.getName(), tabs));
289-
fileViewerPane.tabs.setTitleAt(idx, c.getName());
290-
}
291-
}
292-
Settings.SHOW_CONTAINER_NAME.set(mnShowContainer.isSelected());
293-
});
294-
viewMenu.add(mnShowContainer);
295-
329+
}
330+
331+
private void initializePanelGroup() {
296332
panelGroup1.setSelected(allDecompilersRev.get(panelGroup1).get(Decompilers.FERNFLOWER).getModel(), true);
297333
panelGroup2.setSelected(allDecompilersRev.get(panelGroup2).get(Decompilers.BYTECODE).getModel(), true);
298334
panelGroup3.setSelected(allDecompilersRev.get(panelGroup3).get(null).getModel(), true);

0 commit comments

Comments
 (0)