332 lines
8.2 KiB
Java
332 lines
8.2 KiB
Java
import java.awt.*;
|
|
import java.awt.event.*;
|
|
import javax.swing.*;
|
|
import java.io.*;
|
|
|
|
|
|
class Edit extends JComponent {
|
|
Datei file;
|
|
int pos, subpos, modus;
|
|
int ueberschreiben=1;
|
|
int breite, hoehe, proZeile, luecke, anzahl;
|
|
|
|
String searchString="";
|
|
int searchPos = -1;
|
|
|
|
HexEditor parent;
|
|
|
|
|
|
class myKeyListener implements KeyListener
|
|
{
|
|
public void keyPressed( KeyEvent k )
|
|
{
|
|
int iHeight = getSize().height;
|
|
|
|
if (k.getKeyCode()==8) delete(-1);
|
|
if (k.getKeyCode()==127) delete(0);
|
|
if (k.getKeyCode()==37) movePos(-1);
|
|
if (k.getKeyCode()==39) movePos(1);
|
|
if (k.getKeyCode()==38) movePos(-proZeile);
|
|
if (k.getKeyCode()==40) movePos(proZeile);
|
|
if (k.getKeyCode()==33) movePos(-proZeile*(iHeight/hoehe));
|
|
if (k.getKeyCode()==34) movePos(proZeile*(iHeight/hoehe));
|
|
|
|
}
|
|
public void keyReleased(KeyEvent k){}
|
|
|
|
public void keyTyped(KeyEvent k){
|
|
|
|
switch(modus) {
|
|
case 1: {
|
|
if (k.getKeyChar()>='0' && k.getKeyChar()<='1') modifyByte(k.getKeyChar());
|
|
break;
|
|
}
|
|
case 2: {
|
|
if (k.getKeyChar()>='0' && k.getKeyChar()<='9') modifyByte(k.getKeyChar());
|
|
if (k.getKeyChar()>='a' && k.getKeyChar()<='f') modifyByte(k.getKeyChar());
|
|
if (k.getKeyChar()>='A' && k.getKeyChar()<='F') modifyByte(k.getKeyChar());
|
|
break;
|
|
}
|
|
default: {
|
|
if (k.getKeyCode()!= 127) modifyByte(k.getKeyChar());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
class myMouseListener implements MouseListener
|
|
{
|
|
public void mouseClicked( MouseEvent m )
|
|
{
|
|
moveToMousePos(m.getX(),m.getY() );
|
|
}
|
|
public void mouseExited(MouseEvent e) {
|
|
}
|
|
public void mouseEntered(MouseEvent e) {
|
|
}
|
|
public void mousePressed(MouseEvent e) {
|
|
}
|
|
public void mouseReleased(MouseEvent e) {
|
|
}
|
|
|
|
|
|
}
|
|
|
|
public Edit(HexEditor p){
|
|
super();
|
|
parent = p;
|
|
file = null;
|
|
pos = 0;
|
|
subpos = 0;
|
|
addKeyListener(new myKeyListener());
|
|
addMouseListener(new myMouseListener());
|
|
modus = 1;
|
|
}
|
|
|
|
public void adjustTextMetrics()
|
|
{
|
|
int iWidth = getSize().width;
|
|
int iHeight = getSize().height;
|
|
Graphics g = getGraphics();
|
|
|
|
g.setFont(new Font("Monospaced",Font.PLAIN,12));
|
|
FontMetrics fm = g.getFontMetrics( g.getFont() );
|
|
|
|
hoehe = fm.getHeight();
|
|
switch (modus) {
|
|
case 1: breite = fm.stringWidth("01010101")+4; luecke = 4; anzahl = 8;
|
|
break;
|
|
case 2: breite = fm.stringWidth("FF")+4; luecke = 4; anzahl = 2;
|
|
break;
|
|
default : breite = fm.stringWidth("F"); luecke = 0; anzahl = 1;
|
|
}
|
|
|
|
proZeile = iWidth / breite;
|
|
}
|
|
|
|
public void paint(Graphics g){
|
|
String s;
|
|
int iWidth = getSize().width;
|
|
int iHeight = getSize().height;
|
|
|
|
Rectangle r = getVisibleRect();
|
|
|
|
adjustTextMetrics();
|
|
|
|
g.setFont(new Font("Monospaced",Font.PLAIN,12));
|
|
g.setColor( Color.black );
|
|
int zeile, spalte;
|
|
|
|
if (file != null) {
|
|
|
|
int laenge = file.getLength();
|
|
|
|
|
|
int start = (int)(r.getY() / hoehe) * proZeile;
|
|
int ende = ((int) ((r.getY()+r.getHeight()) / hoehe)+1)*proZeile;
|
|
zeile = (int) (r.getY() / hoehe);
|
|
spalte = 0;
|
|
for (int i=start; i<ende && i<laenge; i++){
|
|
|
|
if (file.getSearchByte(i) == 1) {
|
|
g.setColor( Color.red);
|
|
g.fillRect((spalte)*breite+luecke/2-1,4+(zeile)*hoehe-1,breite-luecke/2+1,hoehe+2);
|
|
g.setColor( Color.black);
|
|
}
|
|
|
|
if (i==pos) {
|
|
g.setColor( Color.lightGray);
|
|
g.fillRect((spalte)*breite+luecke/2,4+(zeile)*hoehe,breite-luecke/2-1,hoehe);
|
|
if (subpos != 0) {
|
|
g.setColor( Color.GRAY);
|
|
g.fillRect((spalte)*breite+subpos*(breite-luecke)/anzahl+luecke/2,4+(zeile)*hoehe,(breite-luecke/2)/anzahl-1,hoehe);
|
|
}
|
|
g.setColor( Color.black);
|
|
}
|
|
switch (modus) {
|
|
case 1: s = file.getByteBinary(i);
|
|
break;
|
|
case 2: s = file.getByteHex(i);
|
|
break;
|
|
default : s = file.getByteChar(i);
|
|
|
|
}
|
|
g.drawString(s,(spalte)*breite+luecke/2,hoehe+(zeile)*hoehe);
|
|
spalte++;
|
|
|
|
if (spalte >= proZeile) {
|
|
zeile++;
|
|
spalte = 0;
|
|
}
|
|
}
|
|
|
|
if (pos<ende && pos==laenge) { // Cursor steht hinter dem letzten Zeichen => leeres Rechteck zeichnen
|
|
g.setColor( Color.lightGray);
|
|
g.fillRect((spalte)*breite+luecke/2,4+(zeile)*hoehe,breite-luecke/2-1,hoehe);
|
|
g.setColor( Color.black);
|
|
}
|
|
parent.showLabels(file.getByteBinary(pos), file.getByteHex(pos), file.getByteChar(pos), pos+1);
|
|
}
|
|
}
|
|
|
|
public void setDatei(Datei file) {
|
|
this.file = file;
|
|
pos = 0;
|
|
subpos = 0;
|
|
}
|
|
|
|
public Datei getDatei(){
|
|
return file;
|
|
}
|
|
|
|
public Dimension getPreferredSize()
|
|
{
|
|
adjustTextMetrics();
|
|
|
|
if (file == null)
|
|
{
|
|
return new Dimension( 300, 200 );
|
|
}
|
|
else
|
|
{
|
|
int laenge = file.getLength();
|
|
|
|
int komponentenhoehe = hoehe+(laenge/proZeile)*hoehe+5;
|
|
if (komponentenhoehe < 200) {
|
|
komponentenhoehe = 200;
|
|
}
|
|
return new Dimension( 300, komponentenhoehe);
|
|
|
|
}
|
|
}
|
|
|
|
public Dimension getMinimumSize()
|
|
{
|
|
return getPreferredSize();
|
|
}
|
|
|
|
public void setMode( int i) {
|
|
modus = i;
|
|
subpos = 0;
|
|
repaint();
|
|
}
|
|
|
|
public void setUeberschreiben(int i) {
|
|
ueberschreiben = i;
|
|
}
|
|
|
|
public int getUeberschreiben() {
|
|
return ueberschreiben;
|
|
}
|
|
|
|
public void movePos ( int i ){
|
|
if (file!=null) {
|
|
subpos = 0;
|
|
pos += i;
|
|
if (pos > file.getLength()) pos = file.getLength();
|
|
if (pos < 0) pos = 0;
|
|
repaint();
|
|
|
|
}
|
|
}
|
|
|
|
public void moveToMousePos(int x, int y) {
|
|
if(file!=null) {
|
|
pos = (y / hoehe)*proZeile + (x / breite);
|
|
subpos = 0;
|
|
if (pos > file.getLength()) pos = file.getLength();
|
|
if (pos < 0) pos = 0;
|
|
repaint();
|
|
}
|
|
}
|
|
|
|
public int compare(File vergleichDatei) {
|
|
int gefunden = -1;
|
|
if (file!=null)
|
|
{
|
|
gefunden = file.compare(vergleichDatei);
|
|
}
|
|
repaint();
|
|
return gefunden;
|
|
}
|
|
|
|
|
|
public int search(String s) {
|
|
int gefunden = -1;
|
|
if (file!=null)
|
|
{
|
|
String s2="";
|
|
char b;
|
|
for (int i = 0; i < s.length(); i++)
|
|
{
|
|
b = s.charAt(i);
|
|
if (modus==1 && (b == '0' || b == '1')) s2 = s2 + b;
|
|
if (modus==2 && ((b >= '0' && b <= '9')|| (b>='A' && b <='F') || (b>='a' && b<='f'))) s2 = s2+b;
|
|
if (modus==3) s2 = s2+b;
|
|
}
|
|
if (modus==2) s2 = s2.toUpperCase();
|
|
if (s2.length()>0) gefunden = file.search(s2,modus);
|
|
}
|
|
repaint();
|
|
return gefunden;
|
|
}
|
|
|
|
public void delete( int i) {
|
|
if (file != null && pos+i>0 && pos+i<file.getLength()) {
|
|
file.deleteByte(pos+i);
|
|
subpos = 0;
|
|
pos += i;
|
|
if (pos > file.getLength()) pos--;
|
|
}
|
|
repaint();
|
|
}
|
|
|
|
public void modifyByte( char c ) {
|
|
String s;
|
|
if (file!= null) {
|
|
if (pos == file.getLength() || (subpos == 0 && !(ueberschreiben==1))) file.insertByte(pos);
|
|
|
|
switch (modus) {
|
|
case 1: s = file.getByteBinary(pos);
|
|
break;
|
|
case 2: s = file.getByteHex(pos);
|
|
break;
|
|
default : s = file.getByteChar(pos);
|
|
}
|
|
|
|
|
|
s = s.substring(0,subpos)+c+s.substring(subpos+1);
|
|
subpos++;
|
|
|
|
int maxSubpos;
|
|
switch (modus) {
|
|
case 1: maxSubpos = 7;
|
|
file.setByteBinary(pos,s);
|
|
break;
|
|
case 2: maxSubpos = 1;
|
|
file.setByteHex(pos,s);
|
|
break;
|
|
default : maxSubpos = 0;
|
|
file.setByteChar(pos,c);
|
|
}
|
|
|
|
if (subpos > maxSubpos)
|
|
{
|
|
subpos = 0;
|
|
movePos(1);
|
|
}
|
|
repaint();
|
|
|
|
}
|
|
}
|
|
|
|
public void keyPressed ( KeyEvent e){
|
|
}
|
|
public void keyReleased ( KeyEvent e ){
|
|
}
|
|
|
|
public boolean isFocusable() {
|
|
return true;
|
|
}
|
|
|
|
}
|