Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * @(#)BinaryPanel.java  1.2  2010-09-07
   *
   * Copyright (c) 1999-2010 Werner Randelshofer, Goldau, Switzerland.
   * All rights reserved.
   *
   * You may not use, copy or modify this file, except in compliance with the
   * license agreement you entered into with Werner Randelshofer.
   * For details see accompanying license terms.
  */
 package org.monte.media.binary;
 
 import java.awt.Color;
 
 import java.awt.Font;
 import java.util.List;
 
Panel for untyped binary data.

Author(s):
Werner Randelshofer, Hausmatt 10, CH-6405 Goldau, Switzerland
Version:
1.2 2010-09-07 Adds tool tip support.
1.1 2010-01-06 Adds method addHighlight().
1.0.3 2009-12-29 Shifts layout one character to the left
1.0.2.1 2001-06-16 Upgrade to JKD 1.3 is in progress...
1.0.2 2000-10-08 Set small font when Platinum LAF is active.
1.0.1 2000-06-12
1.0 1999-10-19
 
 public class BinaryPanel
         extends JComponent {
 
     public final static Color[] HIGHLIGHT_COLORS = new Color[]{
         new Color(0xff756c), // red
         new Color(0xfab555), // orange
         new Color(0xf2df5a), // yellow
         new Color(0xbddc5a), // green
         new Color(0xcb9dde), // purple
         new Color(0x66b1ff), // blue
         new Color(0xb5b5b5), // gray
     };
     private BinaryModel model_;
     private final char[] HEX = {'0''1''2''3''4''5''6''7''8''9''a''b''c''d''e''f'};
 
     public static class Highlight {
 
         public final long from;
         public final long to;
         public final Color color;
         private final String label;
 
         public Highlight(long fromlong toColor cString label) {
             this. = from;
             this. = to;
             this. = c;
             this. = label;
         }
 
         @Override
         public String toString() {
             return "Highlight[" +  + ", " +  + ".." +  + ", color:" + Integer.toHexString(.getRGB()) + "]";
         }
     }
     private ArrayList<Highlighthighlights = new ArrayList<Highlight>();
 
     public BinaryPanel() {
          = new ByteArrayBinaryModel();
         updateUI();
         setToolTipText("Hi");
     }
 
     @Override
     public Dimension getPreferredSize() {
         FontMetrics fm = getFontMetrics(getFont());
         Dimension d = new Dimension(
                 fm.charWidth('0') * 68,
                 (int) (fm.getHeight() * (.getLength() + 15) / 16));
         return d;
     }
 
     public void setModel(BinaryModel m) {
          = m;
         revalidate();
         repaint();
     }
 
     public BinaryModel getModel() {
         return ;
     }
    public void clearHighlights() {
        .clear();
    }
    public void addHighlight(int fromint to) {
        addHighlight(fromto[2], null);
    }
    public void addHighlight(int fromint toColor cString label) {
        .add(new Highlight(fromtoclabel));
    }
    public void addHighlight(Highlight h) {
        .add(h);
    }
    public void addHighlights(List<Highlighth) {
        if (h != null) {
            .addAll(h);
        }
    }
    public void setHighlights(List<Highlighth) {
        clearHighlights();
        addHighlights(h);
    }

    
Returns the offset in the binary data at the specified location. Returns -1 if there is no binary data at the specified location.

Parameters:
x
y
Returns:
    private int getOffsetAt(int xint y) {
        FontMetrics fm = getFontMetrics(getFont());
        int row = y / fm.getHeight();
        int column = x / fm.getWidths()['0'];
        int offset;
        if (column < 10) {//00000000> (address)
            offset = -1;
        } else if (column < 10+8) {
            offset = row * 16 + (column - 10) / 2;
        } else if (column < 10+8+1) {
            offset = -1;
        } else if (column < 10+8+1+8) {
            offset = row * 16 + (column - (10+1)) / 2;
        } else if (column < 10+8+1+8+1) {
            offset = -1;
        } else if (column < 10+8+1+8+1+8) {
            offset = row * 16 + (column - (10+2)) / 2;
        } else if (column < 10+8+1+8+1+8+1) {
            offset = -1;
        } else if (column < 10+8+1+8+1+8+1+8) {
            offset = row * 16 + (column - (10+3)) / 2;
        } else if (column < 48) {
            offset = -1;
        } else if (column < 48+4) {
            offset = row * 16 + (column - 48);
        } else if (column < 48+4+1) {
            offset = -1;
        } else if (column < 48+4+1+4) {
            offset = row * 16 + (column - (48+1));
        } else if (column < 48+4+1+4+1) {
            offset = -1;
        } else if (column < 48+4+1+4+1+4) {
            offset = row * 16 + (column - (48+2));
        } else if (column < 48+4+1+4+1+4+1) {
            offset = -1;
        } else if (column < 48+4+1+4+1+4+1+4) {
            offset = row * 16 + (column - (48+3));
        } else {
            offset = -1;
        }
        return offset;
    }
    private Highlight getHighlightAt(int xint y) {
        int offset = getOffsetAt(xy);
        //System.out.println("BinaryPanel offset:" + offset);
        if (offset == -1) {
            return null;
        }
        for (int i = .size() - 1; i >= 0; i--) {
            Highlight hl = .get(i);
            if (hl.from <= offset && hl.to > offset) {
                return hl;
            }
        }
        return null;
    }
    @Override
    public void paintComponent(Graphics g) {
        Rectangle clipRect = g.getClipBounds();
        FontMetrics fm = g.getFontMetrics(getFont());
        g.setColor(getBackground());
        g.fillRect(clipRect.xclipRect.yclipRect.widthclipRect.height);
        g.setColor(getForeground());
        int startLine = clipRect.y / fm.getHeight();
        int endLine = Math.min(
                (clipRect.y + clipRect.height) / fm.getHeight() + 1,
                (int) ((.getLength() + 15) / 16));
        byte[] bytes = new byte[16];
        char[] chars = new char[69];
        // for each visible line
        for (; startLine < endLinestartLine++) {
            Arrays.fill(chars' ');
            int offset = 0;
            int startOfData = 0;
            // write the line address
            int address = startLine * 16;
            for (int i = 0; i < 8; i++) {
                chars[offset++] = [address >>> 28];
                address <<= 4;
            }
            chars[offset++] = '>';
            offset++;
            startOfData = offset;
            int len = .getBytes(startLine * 16, 16, bytes);
            for (int i = 0; i < leni++) {
                // write the data as hexadecimal digits
                chars[offset++] = [(bytes[i] >>> 4) & 0x0f];
                chars[offset++] = [bytes[i] & 0x0f];
                // write the data as characters
                char ch = (char) (bytes[i] & 0xff);
                chars[i + 48 + i / 4] = Character.isISOControl(ch) ? '.' : ch;
                if (i % 4 == 3) {
                    offset++;
                }
            }
            String str = new String(chars);
            for (Highlight hl : ) {
                address = startLine * 16;
                if (address + 16 >= hl.from && address <= hl.to) {
                    int dataStart = (int) Math.max(0, hl.from - address);
                    int dataEnd = (int) Math.max(0, Math.min(address + 16, hl.to) - address);
                    if (dataEnd > dataStart) {
                        int from = (intfm.getStringBounds(str, 0, startOfData + dataStart * 2 + (dataStart / 4), g).getWidth();
                        int length = (intfm.getStringBounds(strstartOfData + dataStart * 2 + (dataStart / 4), startOfData + dataEnd * 2 + Math.max(0, (dataEnd - 1) / 4), g).getWidth();
                        g.setColor(hl.color);
                        g.fillRect(from + 1, startLine * fm.getHeight(), length - 2, fm.getAscent() + 1);
                        from = (intfm.getStringBounds(str, 0, startOfData + 38 + dataStart + (dataStart / 4), g).getWidth();
                        length = (intfm.getStringBounds(strstartOfData + 38 + dataStart + (dataStart / 4), startOfData + 38 + dataEnd + Math.max(0, (dataEnd - 1) / 4), g).getWidth();
                        g.fillRect(from + 1, startLine * fm.getHeight(), length - 2, fm.getAscent() + 1);
                    }
                }
            }
            g.setColor(getForeground());
            g.drawString(
                    str,
                    0,
                    startLine * fm.getHeight() + fm.getAscent());
        }
    }
    @Override
    public void updateUI() {
        super.updateUI();
        setBackground(UIManager.getColor("TextArea.background"));
        setForeground(UIManager.getColor("TextArea.foreground"));
        if (UIManager.getLookAndFeel().getID().equals("MacOS")) {
            setFont(
                    new Font("Monospaced"., 10));
        } else {
            setFont(
                    new Font("Monospaced"., 12));
        }
    }
    @Override
    public String getToolTipText(MouseEvent event) {
        Highlight h = getHighlightAt(event.getX(), event.getY());
        return h == null ? null : h.label;
    }
New to GrepCode? Check out our FAQ X