bcv-vf/src/com/jhe/hexed/JHexEditor.java
Kalen Kinloch 4e6647be19 2.3.0 Release
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.
2014-12-19 13:18:51 -08:00

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++);
}
}
}
}