duc_bit_imp9/Quellcodes/duc_bit_hexeditor/Edit.java
2024-12-29 13:43:45 +01:00

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