/*******************************************************************************
* Copyright (c) 2011 Subgraph.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Subgraph - initial API and implementation
******************************************************************************/
package com.subgraph.vega.ui.hexeditor;
import org.eclipse.jface.viewers.ITableFontProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
public class HexEditLabelProvider extends LabelProvider implements ITableLabelProvider, ITableFontProvider {
private final HexEditFonts fonts;
HexEditLabelProvider(HexEditFonts fonts) {
this.fonts = fonts;
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
if(!(element instanceof HexEditModelItem))
return null;
final HexEditModelItem item = (HexEditModelItem) element;
if(columnIndex == 0)
return String.format("%04X:", item.getOffset());
else if(columnIndex > 0 && columnIndex <= item.getRowLength()) {
int value = item.getByteAt(columnIndex - 1);
if(value == -1)
return "";
else
return String.format("%02X", value);
} else if(columnIndex == item.getRowLength() + 1) {
return renderAscii(item);
} else {
return "???";
}
}
private String renderAscii(HexEditModelItem item) {
final StringBuilder buffer = new StringBuilder();
final int len = item.getRowByteCount();
final byte[] rowData = new byte[len];
item.getData(rowData);
for(int i = 0; i < item.getRowLength(); i++) {
if(i >= rowData.length)
buffer.append(" ");
else
buffer.append(renderByte(rowData[i]));
}
return buffer.toString();
}
private String renderByte(byte b) {
if(isPrintable(b))
return Character.toString((char)b);
else
return ".";
}
private boolean isPrintable(byte b) {
return (b >= 32 && b <= 126);
}
@Override
public Font getFont(Object element, int columnIndex) {
if(!(element instanceof HexEditModelItem))
return null;
final HexEditModelItem item = (HexEditModelItem) element;
if(columnIndex <= item.getRowLength())
return fonts.getElementFont();
else
return fonts.getAsciiFont();
}
}