Workspace Refactoring

This commit is contained in:
Konloch 2021-07-15 20:50:05 -07:00
parent 45c9cd5d1a
commit 4696818056
9 changed files with 50 additions and 36 deletions

View file

@ -202,12 +202,13 @@ public class BytecodeViewer
Boot.boot(args, CLI != CommandLineInput.GUI); Boot.boot(args, CLI != CommandLineInput.GUI);
} }
//CLI arguments say spawn the GUI
if (CLI == CommandLineInput.GUI) if (CLI == CommandLineInput.GUI)
{ {
BytecodeViewer.boot(false); BytecodeViewer.boot(false);
Configuration.bootState = Configuration.BootState.GUI_SHOWING; Configuration.bootState = Configuration.BootState.GUI_SHOWING;
} }
else else //CLI arguments say keep it CLI
{ {
BytecodeViewer.boot(true); BytecodeViewer.boot(true);
CommandLineInput.executeCommandLine(args); CommandLineInput.executeCommandLine(args);

View file

@ -8,7 +8,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import javax.swing.*; import javax.swing.*;
import org.objectweb.asm.tree.ClassNode;
import the.bytecode.club.bytecodeviewer.*; import the.bytecode.club.bytecodeviewer.*;
import the.bytecode.club.bytecodeviewer.gui.components.*; import the.bytecode.club.bytecodeviewer.gui.components.*;
import the.bytecode.club.bytecodeviewer.gui.plugins.MaliciousCodeScannerOptions; import the.bytecode.club.bytecodeviewer.gui.plugins.MaliciousCodeScannerOptions;
@ -16,7 +15,7 @@ import the.bytecode.club.bytecodeviewer.gui.plugins.ReplaceStringsOptions;
import the.bytecode.club.bytecodeviewer.gui.resourcelist.ResourceListPane; import the.bytecode.club.bytecodeviewer.gui.resourcelist.ResourceListPane;
import the.bytecode.club.bytecodeviewer.gui.resourcesearch.SearchBoxPane; import the.bytecode.club.bytecodeviewer.gui.resourcesearch.SearchBoxPane;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.DecompilerSelectionPane; import the.bytecode.club.bytecodeviewer.gui.resourceviewer.DecompilerSelectionPane;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.WorkPaneMainComponent; import the.bytecode.club.bytecodeviewer.gui.resourceviewer.Workspace;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ClassViewer; import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ClassViewer;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ResourceViewer; import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ResourceViewer;
import the.bytecode.club.bytecodeviewer.gui.theme.LAFTheme; import the.bytecode.club.bytecodeviewer.gui.theme.LAFTheme;
@ -72,7 +71,7 @@ public class MainViewerGUI extends JFrame
//main UI components //main UI components
private static final ArrayList<VisibleComponent> uiComponents = new ArrayList<>(); private static final ArrayList<VisibleComponent> uiComponents = new ArrayList<>();
public final WorkPaneMainComponent workPane = new WorkPaneMainComponent(); public final Workspace workPane = new Workspace();
public final ResourceListPane resourcePane = new ResourceListPane(); public final ResourceListPane resourcePane = new ResourceListPane();
public final SearchBoxPane searchBoxPane = new SearchBoxPane(); public final SearchBoxPane searchBoxPane = new SearchBoxPane();
public JSplitPane splitPane1; public JSplitPane splitPane1;

View file

@ -4,7 +4,7 @@ import the.bytecode.club.bytecodeviewer.decompilers.Decompiler;
import the.bytecode.club.bytecodeviewer.translation.Translation; import the.bytecode.club.bytecodeviewer.translation.Translation;
import the.bytecode.club.bytecodeviewer.translation.components.TranslatedJCheckBoxMenuItem; import the.bytecode.club.bytecodeviewer.translation.components.TranslatedJCheckBoxMenuItem;
import the.bytecode.club.bytecodeviewer.translation.components.TranslatedJRadioButtonMenuItem; import the.bytecode.club.bytecodeviewer.translation.components.TranslatedJRadioButtonMenuItem;
import the.bytecode.club.bytecodeviewer.util.RefreshWorkPane; import the.bytecode.club.bytecodeviewer.gui.resourceviewer.WorkspaceRefreshEvent;
import javax.swing.*; import javax.swing.*;
@ -68,7 +68,7 @@ public class DecompilerViewComponent
menu.add(editable); menu.add(editable);
} }
java.addActionListener(new RefreshWorkPane()); java.addActionListener(new WorkspaceRefreshEvent());
} }
public void addToGroup(ButtonGroup group) public void addToGroup(ButtonGroup group)

View file

@ -39,10 +39,8 @@ import static the.bytecode.club.bytecodeviewer.Constants.nl;
* @author Konloch * @author Konloch
* @since 6/24/2021 * @since 6/24/2021
*/ */
public class BytecodeViewPanel public class BytecodeViewPanel extends JPanel
{ {
public final JPanel panel = new JPanel(new BorderLayout());
public final int panelIndex; public final int panelIndex;
public final ClassViewer viewer; public final ClassViewer viewer;
public SearchableRSyntaxTextArea textArea; public SearchableRSyntaxTextArea textArea;
@ -52,17 +50,18 @@ public class BytecodeViewPanel
public BytecodeViewPanel(int panelIndex, ClassViewer viewer) public BytecodeViewPanel(int panelIndex, ClassViewer viewer)
{ {
super(new BorderLayout());
this.panelIndex = panelIndex; this.panelIndex = panelIndex;
this.viewer = viewer; this.viewer = viewer;
} }
public void createPane(ClassViewer viewer) public void createPane(ClassViewer viewer)
{ {
panel.removeAll(); removeAll();
textArea = null; textArea = null;
if(viewer.resource == null || viewer.resource.getResourceClassNode() == null) if(viewer.resource == null || viewer.resource.getResourceClassNode() == null)
panel.add(new JLabel("ERROR: Resource Viewer Corrupt ClassNode")); add(new JLabel("ERROR: Resource Viewer Corrupt ClassNode"));
} }
public void updatePane(ClassViewer cv, byte[] b, JButton button, boolean isPanelEditable) public void updatePane(ClassViewer cv, byte[] b, JButton button, boolean isPanelEditable)

View file

@ -12,7 +12,7 @@ import javax.swing.JMenuItem;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import javax.swing.JTabbedPane; import javax.swing.JTabbedPane;
import org.objectweb.asm.tree.ClassNode;
import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.BytecodeViewer;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ClassViewer; import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.ClassViewer;
import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.FileViewer; import the.bytecode.club.bytecodeviewer.gui.resourceviewer.viewer.FileViewer;
@ -49,14 +49,15 @@ import static the.bytecode.club.bytecodeviewer.Constants.BLOCK_TAB_MENU;
* @author WaterWolf * @author WaterWolf
* @since 09/26/2011 * @since 09/26/2011
*/ */
public class WorkPaneMainComponent extends TranslatedVisibleComponent
public class Workspace extends TranslatedVisibleComponent
{ {
public final JTabbedPane tabs; public final JTabbedPane tabs;
public final JPanel buttonPanel; public final JPanel buttonPanel;
public final JButton refreshClass; public final JButton refreshClass;
public final HashSet<String> openedTabs = new HashSet<>(); public final HashSet<String> openedTabs = new HashSet<>();
public WorkPaneMainComponent() public Workspace()
{ {
super("Workspace", Translation.WORK_SPACE); super("Workspace", Translation.WORK_SPACE);
@ -145,7 +146,7 @@ public class WorkPaneMainComponent extends TranslatedVisibleComponent
refreshClass.addActionListener((event)-> refreshClass.addActionListener((event)->
{ {
refreshClass.setEnabled(false); refreshClass.setEnabled(false);
Thread t = new Thread(() -> new WorkPaneRefresh(event).run(), "Refresh"); Thread t = new Thread(() -> new WorkspaceRefresh(event).run(), "Refresh");
t.start(); t.start();
}); });
@ -179,28 +180,41 @@ public class WorkPaneMainComponent extends TranslatedVisibleComponent
//create a new tab if the resource isn't opened currently //create a new tab if the resource isn't opened currently
if (!openedTabs.contains(workingName)) if (!openedTabs.contains(workingName))
{ {
//start processing the resource to be viewed
if(resourceView instanceof ClassViewer) if(resourceView instanceof ClassViewer)
{ resourceView.refresh(null);
((ClassViewer)resourceView).refresh(null);
}
resourceView.resource.workingName = workingName;
//add the resource view to the tabs
tabs.add(resourceView); tabs.add(resourceView);
final int tabIndex = tabs.indexOfComponent(resourceView);
openedTabs.add(workingName);
//get the resource view index
final int tabIndex = tabs.indexOfComponent(resourceView);
//create a new tabbed pane
TabbedPane tabbedPane = new TabbedPane(tabIndex, workingName, container.name, name, tabs, resourceView); TabbedPane tabbedPane = new TabbedPane(tabIndex, workingName, container.name, name, tabs, resourceView);
resourceView.tabbedPane = tabbedPane; resourceView.tabbedPane = tabbedPane;
resourceView.resource.workingName = workingName;
//set the tabs index
tabs.setTabComponentAt(tabIndex, tabbedPane); tabs.setTabComponentAt(tabIndex, tabbedPane);
//open the tab that was just added
tabs.setSelectedIndex(tabIndex); tabs.setSelectedIndex(tabIndex);
//set resource as opened in a tab
openedTabs.add(workingName);
//refresh the tab title
resourceView.refreshTitle(); resourceView.refreshTitle();
} }
//if the resource is already opened select this tab as the active one else //if the resource is already opened select this tab as the active one
else
{ {
//TODO openedTabs could be changed to a HashMap<String, Integer> for faster lookups
//search through each tab
for(int i = 0; i < tabs.getTabCount(); i++) for(int i = 0; i < tabs.getTabCount(); i++)
{ {
//find the matching resource and open it
ResourceViewer tab = ((TabbedPane)tabs.getTabComponentAt(i)).resource; ResourceViewer tab = ((TabbedPane)tabs.getTabComponentAt(i)).resource;
if(tab.resource.workingName.equals(workingName)) if(tab.resource.workingName.equals(workingName))
{ {

View file

@ -13,11 +13,11 @@ import java.awt.event.ActionEvent;
* @author Konloch * @author Konloch
* @since 6/24/2021 * @since 6/24/2021
*/ */
public class WorkPaneRefresh implements Runnable public class WorkspaceRefresh implements Runnable
{ {
private final ActionEvent event; private final ActionEvent event;
public WorkPaneRefresh(ActionEvent event) { public WorkspaceRefresh(ActionEvent event) {
this.event = event; this.event = event;
} }

View file

@ -1,4 +1,4 @@
package the.bytecode.club.bytecodeviewer.util; package the.bytecode.club.bytecodeviewer.gui.resourceviewer;
import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.BytecodeViewer;
@ -27,7 +27,8 @@ import java.awt.event.ActionListener;
* @author Konloch * @author Konloch
* @since 6/21/2021 * @since 6/21/2021
*/ */
public class RefreshWorkPane implements ActionListener
public class WorkspaceRefreshEvent implements ActionListener
{ {
@Override @Override
public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e)

View file

@ -72,8 +72,8 @@ public class ClassViewer extends ResourceViewer
this.setName(name); this.setName(name);
this.setLayout(new BorderLayout()); this.setLayout(new BorderLayout());
this.sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, bytecodeViewPanel1.panel, bytecodeViewPanel2.panel); this.sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, bytecodeViewPanel1, bytecodeViewPanel2);
this.sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sp, bytecodeViewPanel3.panel); this.sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sp, bytecodeViewPanel3);
this.add(sp2, BorderLayout.CENTER); this.add(sp2, BorderLayout.CENTER);
this.addComponentListener(new ComponentAdapter() { this.addComponentListener(new ComponentAdapter() {

View file

@ -98,7 +98,7 @@ public class BytecodeViewPanelUpdater implements Runnable
final JHexEditor hex = new JHexEditor(cw.toByteArray()); final JHexEditor hex = new JHexEditor(cw.toByteArray());
hex.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int) BytecodeViewer.viewer.fontSpinner.getValue())); hex.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int) BytecodeViewer.viewer.fontSpinner.getValue()));
bytecodeViewPanel.panel.add(hex); bytecodeViewPanel.add(hex);
}); });
} }
else else
@ -221,7 +221,7 @@ public class BytecodeViewPanelUpdater implements Runnable
} }
if (BytecodeViewer.viewer.synchronizedViewing.isSelected()) { if (BytecodeViewer.viewer.synchronizedViewing.isSelected()) {
int panes = 2; int panes = 2;
if (viewer.bytecodeViewPanel3.panel != null) if (viewer.bytecodeViewPanel3 != null)
panes = 3; panes = 3;
for (int i = 0; i < panes; i++) { for (int i = 0; i < panes; i++) {
@ -239,7 +239,7 @@ public class BytecodeViewPanelUpdater implements Runnable
@Override @Override
public void stateChanged(ChangeEvent e) { public void stateChanged(ChangeEvent e) {
int panes = 2; int panes = 2;
if (viewer.bytecodeViewPanel3.panel != null) if (viewer.bytecodeViewPanel3 != null)
panes = 3; panes = 3;
if (BytecodeViewer.viewer.synchronizedViewing.isSelected()) { if (BytecodeViewer.viewer.synchronizedViewing.isSelected()) {
@ -381,8 +381,8 @@ public class BytecodeViewPanelUpdater implements Runnable
updateUpdaterTextArea = new SearchableRSyntaxTextArea(); updateUpdaterTextArea = new SearchableRSyntaxTextArea();
Configuration.rstaTheme.apply(updateUpdaterTextArea); Configuration.rstaTheme.apply(updateUpdaterTextArea);
bytecodeViewPanel.panel.add(updateUpdaterTextArea.getScrollPane()); bytecodeViewPanel.add(updateUpdaterTextArea.getScrollPane());
bytecodeViewPanel.panel.add(updateUpdaterTextArea.getTitleHeader(), BorderLayout.NORTH); bytecodeViewPanel.add(updateUpdaterTextArea.getTitleHeader(), BorderLayout.NORTH);
bytecodeViewPanel.textArea = updateUpdaterTextArea; bytecodeViewPanel.textArea = updateUpdaterTextArea;
bytecodeViewPanel.textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); bytecodeViewPanel.textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);