12/16/2014 - Started updating the class viewer. 12/18/2014 - Finished a basic concept of the new class viewer. 12/18/2014 - Fixed an error with importing some jars. 12/18/2014 - Fixed the about window. 12/18/2014 - Finished the final concept for the new class viewer. 12/18/2014 - Threaded save Java files as zip, it now runs in a background thread. 12/18/2014 - Save Java files as zip now prompts you to select a decompiler. 12/18/2014 - Removed the cursor waiting for save Java files as zip. 12/18/2014 - Wrapped the save Java files as zip around an exception handler, it will now safely show the exception if any is thrown. 12/18/2014 - Fixed not escaping the Java strings by default for the Bytecode decompiler. - http://i.imgur.com/YrRnZA7.png 12/18/2014 - Used Eclipse's code formatting tool and formatted the code 12/19/2014 - Priav03 fixed the quick class searcher.
257 lines
6.6 KiB
Java
257 lines
6.6 KiB
Java
package com.jhe.hexed;
|
|
|
|
import javax.swing.*;
|
|
import java.awt.*;
|
|
import java.awt.event.*;
|
|
|
|
/**
|
|
* Created by IntelliJ IDEA. User: laullon Date: 08-abr-2003 Time: 13:21:09
|
|
*/
|
|
public class JHexEditor extends JPanel implements FocusListener,
|
|
AdjustmentListener, MouseWheelListener {
|
|
private static final long serialVersionUID = 2289328616534802372L;
|
|
byte[] buff;
|
|
public int cursor;
|
|
protected static Font font = new Font("Monospaced", 0, 12);
|
|
protected int border = 2;
|
|
public boolean DEBUG = false;
|
|
private JPanel panel;
|
|
private JScrollBar sb;
|
|
private int inicio = 0;
|
|
private int lineas = 10;
|
|
|
|
public JHexEditor(byte[] buff) {
|
|
super();
|
|
this.buff = buff;
|
|
|
|
this.addMouseWheelListener(this);
|
|
|
|
sb = new JScrollBar(JScrollBar.VERTICAL);
|
|
sb.addAdjustmentListener(this);
|
|
sb.setMinimum(0);
|
|
sb.setMaximum(buff.length / getLineas());
|
|
|
|
JPanel p1, p2, p3;
|
|
// centro
|
|
p1 = new JPanel(new BorderLayout(1, 1));
|
|
p1.add(new JHexEditorHEX(this), BorderLayout.CENTER);
|
|
p1.add(new Columnas(), BorderLayout.NORTH);
|
|
|
|
// izq.
|
|
p2 = new JPanel(new BorderLayout(1, 1));
|
|
p2.add(new Filas(), BorderLayout.CENTER);
|
|
p2.add(new Caja(), BorderLayout.NORTH);
|
|
|
|
// der
|
|
p3 = new JPanel(new BorderLayout(1, 1));
|
|
p3.add(sb, BorderLayout.EAST);
|
|
p3.add(new JHexEditorASCII(this), BorderLayout.CENTER);
|
|
p3.add(new Caja(), BorderLayout.NORTH);
|
|
|
|
panel = new JPanel();
|
|
panel.setLayout(new BorderLayout(1, 1));
|
|
panel.add(p1, BorderLayout.CENTER);
|
|
panel.add(p2, BorderLayout.WEST);
|
|
panel.add(p3, BorderLayout.EAST);
|
|
|
|
this.setLayout(new BorderLayout(1, 1));
|
|
this.add(panel, BorderLayout.CENTER);
|
|
}
|
|
|
|
public void paint(Graphics g) {
|
|
FontMetrics fn = getFontMetrics(font);
|
|
Rectangle rec = this.getBounds();
|
|
lineas = (rec.height / fn.getHeight()) - 1;
|
|
int n = (buff.length / 16) - 1;
|
|
if (lineas > n) {
|
|
lineas = n;
|
|
inicio = 0;
|
|
}
|
|
|
|
sb.setValues(getInicio(), +getLineas(), 0, buff.length / 16);
|
|
sb.setValueIsAdjusting(true);
|
|
super.paint(g);
|
|
}
|
|
|
|
protected void actualizaCursor() {
|
|
int n = (cursor / 16);
|
|
|
|
System.out.print("- " + inicio + "<" + n + "<" + (lineas + inicio)
|
|
+ "(" + lineas + ")");
|
|
|
|
if (n < inicio)
|
|
inicio = n;
|
|
else if (n >= inicio + lineas)
|
|
inicio = n - (lineas - 1);
|
|
|
|
System.out.println(" - " + inicio + "<" + n + "<" + (lineas + inicio)
|
|
+ "(" + lineas + ")");
|
|
|
|
repaint();
|
|
}
|
|
|
|
protected int getInicio() {
|
|
return inicio;
|
|
}
|
|
|
|
protected int getLineas() {
|
|
return lineas;
|
|
}
|
|
|
|
protected void fondo(Graphics g, int x, int y, int s) {
|
|
FontMetrics fn = getFontMetrics(font);
|
|
g.fillRect(((fn.stringWidth(" ") + 1) * x) + border,
|
|
(fn.getHeight() * y) + border, ((fn.stringWidth(" ") + 1) * s),
|
|
fn.getHeight() + 1);
|
|
}
|
|
|
|
protected void cuadro(Graphics g, int x, int y, int s) {
|
|
FontMetrics fn = getFontMetrics(font);
|
|
g.drawRect(((fn.stringWidth(" ") + 1) * x) + border,
|
|
(fn.getHeight() * y) + border, ((fn.stringWidth(" ") + 1) * s),
|
|
fn.getHeight() + 1);
|
|
}
|
|
|
|
protected void printString(Graphics g, String s, int x, int y) {
|
|
FontMetrics fn = getFontMetrics(font);
|
|
g.drawString(s, ((fn.stringWidth(" ") + 1) * x) + border,
|
|
((fn.getHeight() * (y + 1)) - fn.getMaxDescent()) + border);
|
|
}
|
|
|
|
public void focusGained(FocusEvent e) {
|
|
this.repaint();
|
|
}
|
|
|
|
public void focusLost(FocusEvent e) {
|
|
this.repaint();
|
|
}
|
|
|
|
public void adjustmentValueChanged(AdjustmentEvent e) {
|
|
inicio = e.getValue();
|
|
if (inicio < 0)
|
|
inicio = 0;
|
|
repaint();
|
|
}
|
|
|
|
public void mouseWheelMoved(MouseWheelEvent e) {
|
|
inicio += (e.getUnitsToScroll());
|
|
if ((inicio + lineas) >= buff.length / 16)
|
|
inicio = (buff.length / 16) - lineas;
|
|
if (inicio < 0)
|
|
inicio = 0;
|
|
repaint();
|
|
}
|
|
|
|
public void keyPressed(KeyEvent e) {
|
|
/*
|
|
* switch(e.getKeyCode()) { case 33: // rep if(cursor>=(16*lineas))
|
|
* cursor-=(16*lineas); actualizaCursor(); break; case 34: // fin
|
|
* if(cursor<(buff.length-(16*lineas))) cursor+=(16*lineas);
|
|
* actualizaCursor(); break; case 35: // fin cursor=buff.length-1;
|
|
* actualizaCursor(); break; case 36: // ini cursor=0;
|
|
* actualizaCursor(); break; case 37: // <-- if(cursor!=0) cursor--;
|
|
* actualizaCursor(); break; case 38: // <-- if(cursor>15) cursor-=16;
|
|
* actualizaCursor(); break; case 39: // --> if(cursor!=(buff.length-1))
|
|
* cursor++; actualizaCursor(); break; case 40: // -->
|
|
* if(cursor<(buff.length-16)) cursor+=16; actualizaCursor(); break; }
|
|
*/
|
|
}
|
|
|
|
private class Columnas extends JPanel {
|
|
private static final long serialVersionUID = -1734199617526339842L;
|
|
|
|
public Columnas() {
|
|
this.setLayout(new BorderLayout(1, 1));
|
|
}
|
|
|
|
public Dimension getPreferredSize() {
|
|
return getMinimumSize();
|
|
}
|
|
|
|
public Dimension getMinimumSize() {
|
|
Dimension d = new Dimension();
|
|
FontMetrics fn = getFontMetrics(font);
|
|
int h = fn.getHeight();
|
|
int nl = 1;
|
|
d.setSize(((fn.stringWidth(" ") + 1) * +((16 * 3) - 1))
|
|
+ (border * 2) + 1, h * nl + (border * 2) + 1);
|
|
return d;
|
|
}
|
|
|
|
public void paint(Graphics g) {
|
|
Dimension d = getMinimumSize();
|
|
g.setColor(Color.white);
|
|
g.fillRect(0, 0, d.width, d.height);
|
|
g.setColor(Color.black);
|
|
g.setFont(font);
|
|
|
|
for (int n = 0; n < 16; n++) {
|
|
if (n == (cursor % 16))
|
|
cuadro(g, n * 3, 0, 2);
|
|
String s = "00" + Integer.toHexString(n);
|
|
s = s.substring(s.length() - 2);
|
|
printString(g, s, n * 3, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
private class Caja extends JPanel {
|
|
private static final long serialVersionUID = -6124062720565016834L;
|
|
|
|
public Dimension getPreferredSize() {
|
|
return getMinimumSize();
|
|
}
|
|
|
|
public Dimension getMinimumSize() {
|
|
Dimension d = new Dimension();
|
|
FontMetrics fn = getFontMetrics(font);
|
|
int h = fn.getHeight();
|
|
d.setSize((fn.stringWidth(" ") + 1) + (border * 2) + 1, h
|
|
+ (border * 2) + 1);
|
|
return d;
|
|
}
|
|
|
|
}
|
|
|
|
private class Filas extends JPanel {
|
|
private static final long serialVersionUID = 8797347523486018051L;
|
|
|
|
public Filas() {
|
|
this.setLayout(new BorderLayout(1, 1));
|
|
}
|
|
|
|
public Dimension getPreferredSize() {
|
|
return getMinimumSize();
|
|
}
|
|
|
|
public Dimension getMinimumSize() {
|
|
Dimension d = new Dimension();
|
|
FontMetrics fn = getFontMetrics(font);
|
|
int h = fn.getHeight();
|
|
int nl = getLineas();
|
|
d.setSize((fn.stringWidth(" ") + 1) * (8) + (border * 2) + 1, h
|
|
* nl + (border * 2) + 1);
|
|
return d;
|
|
}
|
|
|
|
public void paint(Graphics g) {
|
|
Dimension d = getMinimumSize();
|
|
g.setColor(Color.white);
|
|
g.fillRect(0, 0, d.width, d.height);
|
|
g.setColor(Color.black);
|
|
g.setFont(font);
|
|
|
|
int ini = getInicio();
|
|
int fin = ini + getLineas();
|
|
int y = 0;
|
|
for (int n = ini; n < fin; n++) {
|
|
if (n == (cursor / 16))
|
|
cuadro(g, 0, y, 8);
|
|
String s = "0000000000000" + Integer.toHexString(n);
|
|
s = s.substring(s.length() - 8);
|
|
printString(g, s, 0, y++);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|