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= proZeile) { zeile++; spalte = 0; } } if (pos 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()) 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; } }