From 999c64037fb7251f87bd7b105231b3763e003c07 Mon Sep 17 00:00:00 2001 From: hg Date: Sun, 27 Jul 2014 00:52:28 -0400 Subject: made gui responsive to caret position and show identifier info --- src/cuchaz/enigma/gui/Gui.java | 228 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 206 insertions(+), 22 deletions(-) (limited to 'src/cuchaz/enigma/gui/Gui.java') diff --git a/src/cuchaz/enigma/gui/Gui.java b/src/cuchaz/enigma/gui/Gui.java index e0d53d8..d1a3cb2 100644 --- a/src/cuchaz/enigma/gui/Gui.java +++ b/src/cuchaz/enigma/gui/Gui.java @@ -12,11 +12,20 @@ package cuchaz.enigma.gui; import java.awt.BorderLayout; import java.awt.Container; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.List; import java.util.Vector; +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JLabel; @@ -24,14 +33,21 @@ import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; +import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.WindowConstants; +import javax.swing.event.CaretListener; import javax.swing.text.BadLocationException; import jsyntaxpane.DefaultSyntaxKit; import jsyntaxpane.Token; import cuchaz.enigma.ClassFile; import cuchaz.enigma.analysis.SourceIndex; +import cuchaz.enigma.mapping.ArgumentEntry; +import cuchaz.enigma.mapping.ClassEntry; +import cuchaz.enigma.mapping.Entry; +import cuchaz.enigma.mapping.FieldEntry; +import cuchaz.enigma.mapping.MethodEntry; public class Gui { @@ -42,11 +58,18 @@ public class Gui private JList m_obfClasses; private JList m_deobfClasses; private JEditorPane m_editor; + private JPanel m_actionPanel; + private JPanel m_renamePanel; + private JLabel m_typeLabel; + private JTextField m_nameField; + private JButton m_renameButton; - // handlers - private ClassSelectionHandler m_classSelectionHandler; + // listeners + private ClassSelectionListener m_classSelectionListener; + private RenameListener m_renameListener; private BoxHighlightPainter m_highlightPainter; + private Entry m_selectedEntry; public Gui( ) { @@ -66,12 +89,12 @@ public class Gui { if( event.getClickCount() == 2 ) { - if( m_classSelectionHandler != null ) + if( m_classSelectionListener != null ) { ClassFile selected = m_obfClasses.getSelectedValue(); if( selected != null ) { - m_classSelectionHandler.classSelected( selected ); + m_classSelectionListener.classSelected( selected ); } } } @@ -93,6 +116,34 @@ public class Gui deobfPanel.add( new JLabel( "De-obfuscated Classes" ), BorderLayout.NORTH ); deobfPanel.add( deobfScroller, BorderLayout.CENTER ); + // init action panel + m_actionPanel = new JPanel(); + m_actionPanel.setLayout( new BoxLayout( m_actionPanel, BoxLayout.Y_AXIS ) ); + m_actionPanel.setPreferredSize( new Dimension( 0, 120 ) ); + m_actionPanel.setBorder( BorderFactory.createTitledBorder( "Identifier Info" ) ); + m_nameField = new JTextField( 26 ); + m_renameButton = new JButton( "Rename" ); + m_renameButton.addActionListener( new ActionListener( ) + { + @Override + public void actionPerformed( ActionEvent event ) + { + if( m_renameListener != null && m_selectedEntry != null ) + { + m_renameListener.rename( m_selectedEntry, m_nameField.getText() ); + } + } + } ); + m_renamePanel = new JPanel(); + m_renamePanel.setLayout( new FlowLayout( FlowLayout.LEFT, 6, 0 ) ); + m_typeLabel = new JLabel( "LongName:", JLabel.RIGHT ); + // NOTE: this looks ridiculous, but it fixes the label size to the size of current text + m_typeLabel.setPreferredSize( m_typeLabel.getPreferredSize() ); + m_renamePanel.add( m_typeLabel ); + m_renamePanel.add( m_nameField ); + m_renamePanel.add( m_renameButton ); + clearEntry(); + // init editor DefaultSyntaxKit.initKit(); m_editor = new JEditorPane(); @@ -102,17 +153,23 @@ public class Gui // layout controls JSplitPane splitLeft = new JSplitPane( JSplitPane.VERTICAL_SPLIT, true, obfPanel, deobfPanel ); - JSplitPane splitMain = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, true, splitLeft, sourceScroller ); + JPanel rightPanel = new JPanel(); + rightPanel.setLayout( new BorderLayout() ); + rightPanel.add( m_actionPanel, BorderLayout.NORTH ); + rightPanel.add( sourceScroller, BorderLayout.CENTER ); + JSplitPane splitMain = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, true, splitLeft, rightPanel ); pane.add( splitMain, BorderLayout.CENTER ); // show the frame pane.doLayout(); m_frame.setSize( 800, 600 ); + m_frame.setMinimumSize( new Dimension( 640, 480 ) ); m_frame.setVisible( true ); m_frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); - // init handlers - m_classSelectionHandler = null; + // init listeners + m_classSelectionListener = null; + m_renameListener = null; m_highlightPainter = new BoxHighlightPainter(); } @@ -135,29 +192,156 @@ public class Gui public void setSource( String source, SourceIndex index ) { m_editor.setText( source ); - + } + + public void highlightTokens( Iterable tokens ) + { // remove any old highlighters - m_editor.getHighlighter().removeAllHighlights();; + m_editor.getHighlighter().removeAllHighlights(); - if( index != null ) + if( tokens == null ) { - // color things based on the index - for( Token token : index.tokens() ) + return; + } + + // color things based on the index + for( Token token : tokens ) + { + try { - try - { - m_editor.getHighlighter().addHighlight( token.start, token.end(), m_highlightPainter ); - } - catch( BadLocationException ex ) - { - throw new Error( ex ); - } + m_editor.getHighlighter().addHighlight( token.start, token.end(), m_highlightPainter ); + } + catch( BadLocationException ex ) + { + throw new IllegalArgumentException( ex ); } } + + redraw(); + } + + public void setClassSelectionListener( ClassSelectionListener val ) + { + m_classSelectionListener = val; + } + + public void setRenameListener( RenameListener val ) + { + m_renameListener = val; + } + + public void setCaretListener( CaretListener listener ) + { + // remove any old listeners + for( CaretListener oldListener : m_editor.getCaretListeners() ) + { + m_editor.removeCaretListener( oldListener ); + } + + m_editor.addCaretListener( listener ); + } + + public void clearEntry( ) + { + m_actionPanel.removeAll(); + JLabel label = new JLabel( "No identifier selected" ); + unboldLabel( label ); + label.setHorizontalAlignment( JLabel.CENTER ); + m_actionPanel.add( label ); + + redraw(); + } + + public void showEntry( Entry entry ) + { + if( entry == null ) + { + clearEntry(); + return; + } + + // layout the action panel + m_actionPanel.removeAll(); + m_actionPanel.add( m_renamePanel ); + m_nameField.setText( entry.getName() ); + + // layout the dynamic section + JPanel dynamicPanel = new JPanel(); + dynamicPanel.setLayout( new GridLayout( 3, 1, 0, 0 ) ); + m_actionPanel.add( dynamicPanel ); + if( entry instanceof ClassEntry ) + { + showEntry( (ClassEntry)entry, dynamicPanel ); + } + else if( entry instanceof FieldEntry ) + { + showEntry( (FieldEntry)entry, dynamicPanel ); + } + else if( entry instanceof MethodEntry ) + { + showEntry( (MethodEntry)entry, dynamicPanel ); + } + else if( entry instanceof ArgumentEntry ) + { + showEntry( (ArgumentEntry)entry, dynamicPanel ); + } + else + { + throw new Error( "Unknown entry type: " + entry.getClass().getName() ); + } + + redraw(); + } + + public void showEntry( ClassEntry entry, JPanel panel ) + { + m_typeLabel.setText( "Class: " ); + } + + public void showEntry( FieldEntry entry, JPanel panel ) + { + m_typeLabel.setText( "Field: " ); + addNameValue( panel, "Class", entry.getClassEntry().getName() ); + } + + public void showEntry( MethodEntry entry, JPanel panel ) + { + m_typeLabel.setText( "Method: " ); + addNameValue( panel, "Class", entry.getClassEntry().getName() ); + addNameValue( panel, "Signature", entry.getSignature() ); + } + + public void showEntry( ArgumentEntry entry, JPanel panel ) + { + m_typeLabel.setText( "Argument: " ); + addNameValue( panel, "Class", entry.getMethodEntry().getClassEntry().getName() ); + addNameValue( panel, "Method", entry.getMethodEntry().getName() ); + addNameValue( panel, "Index", Integer.toString( entry.getIndex() ) ); + } + + private void addNameValue( JPanel container, String name, String value ) + { + JPanel panel = new JPanel(); + panel.setLayout( new FlowLayout( FlowLayout.LEFT, 6, 0 ) ); + container.add( panel ); + + JLabel label = new JLabel( name + ":", JLabel.RIGHT ); + label.setPreferredSize( new Dimension( 80, label.getPreferredSize().height ) ); + panel.add( label ); + + panel.add( unboldLabel( new JLabel( value, JLabel.LEFT ) ) ); + } + + private JLabel unboldLabel( JLabel label ) + { + Font font = label.getFont(); + label.setFont( font.deriveFont( font.getStyle() & ~Font.BOLD ) ); + return label; } - public void setClassSelectionHandler( ClassSelectionHandler val ) + private void redraw( ) { - m_classSelectionHandler = val; + m_frame.validate(); + m_frame.repaint(); } } -- cgit v1.2.3