blob: 9d9f4b33bce00126ac006b45494385db3e8a683d [file] [log] [blame]
package org.eclipse.ptp.debug.internal.ui.views;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
/**
* @author clement
*
*/
public class CTableCellRenderer {
public static CTableCellRenderer defaultRenderer = new CTableCellRenderer();
protected Display m_Display = null;
protected Map<String, Point> stringExtentCache = new HashMap<String, Point>();
public CTableCellRenderer() {
m_Display = Display.getCurrent();
}
public void dispose() {
stringExtentCache.clear();
}
private Point getStringExtentCache(GC gc, String text) {
Point pt = stringExtentCache.get(text);
if (pt == null) {
pt = gc.stringExtent(text);
stringExtentCache.put(text, pt);
}
return pt;
}
public int getOptimalWidth(GC gc, int col, int row, Object content, boolean fixed) {
return gc.stringExtent(content.toString()).x + 8;
}
public void drawCell(GC gc, Rectangle rect, int col, int row, Object content, boolean focus, boolean fixed, boolean clicked) {
String text = content.toString();
if (fixed) {
if (col == 0 && row == 0)
text = "";
rect.height += 1;
rect.width += 1;
gc.setForeground(m_Display.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
if (clicked) {
drawText(gc, text, rect.x, rect.y, rect.width, rect.height, 1, 1, m_Display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND), m_Display.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW));
} else {
drawText(gc, text, rect.x, rect.y, rect.width, rect.height, 1, 1, m_Display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND), m_Display.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW));
}
}
else {
Color textColor;
Color backColor;
Color vBorderColor;
Color hBorderColor;
if (focus) {
textColor = m_Display.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT);
backColor = (m_Display.getSystemColor(SWT.COLOR_LIST_SELECTION));
vBorderColor = m_Display.getSystemColor(SWT.COLOR_LIST_SELECTION);
hBorderColor = m_Display.getSystemColor(SWT.COLOR_LIST_SELECTION);
} else {
textColor = m_Display.getSystemColor(SWT.COLOR_LIST_FOREGROUND);
backColor = m_Display.getSystemColor(SWT.COLOR_LIST_BACKGROUND);
vBorderColor = m_Display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
hBorderColor = m_Display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
}
gc.setForeground(hBorderColor);
gc.drawLine(rect.x, rect.y + rect.height, rect.x + rect.width, rect.y + rect.height);
gc.setForeground(vBorderColor);
gc.drawLine(rect.x + rect.width, rect.y, rect.x + rect.width, rect.y + rect.height);
gc.setBackground(backColor);
gc.setForeground(textColor);
gc.fillRectangle(rect);
drawText(gc, text, rect.x + 3, rect.y, rect.width - 3, rect.height, 0, 0);
}
}
private void drawText(GC gc, String text, int x, int y, int w, int h, int leftMargin, int topMargin, Color face, Color shadow) {
Color prevForeground = gc.getForeground();
Color prevBackground = gc.getBackground();
try {
gc.setBackground(face);
gc.setForeground(shadow);
gc.drawRectangle(x-1, y-1, w, h);
//gc.fillRectangle(x + 1, y + 1, 1 + leftMargin, h);
//gc.fillRectangle(x + 1, y + 1, w - 2, topMargin + 1);
gc.setForeground(prevForeground);
drawText(gc, text, x, y, w, h, leftMargin, topMargin);
} finally {
gc.setForeground(prevForeground);
gc.setBackground(prevBackground);
}
}
private void drawText(GC gc, String text, int x, int y, int w, int h, int leftMargin, int topMargin) {
Point pt = getStringExtentCache(gc, text);
if (pt.x > w-leftMargin) {
text = "...";
pt = getStringExtentCache(gc, text);
}
gc.drawText(text, x+(w-pt.x)/2+leftMargin, y+(h-pt.y)/2+topMargin);
}
}