100 lines
2.6 KiB
Java
100 lines
2.6 KiB
Java
|
package com.itjw.txviewer.ui.swt;
|
||
|
|
||
|
import org.eclipse.swt.SWT;
|
||
|
import org.eclipse.swt.events.DisposeEvent;
|
||
|
import org.eclipse.swt.events.DisposeListener;
|
||
|
import org.eclipse.swt.events.PaintEvent;
|
||
|
import org.eclipse.swt.events.PaintListener;
|
||
|
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.Composite;
|
||
|
|
||
|
import com.itjw.txviewer.ui.TxEditorPlugin;
|
||
|
|
||
|
public class Ruler extends Composite {
|
||
|
|
||
|
static final int height = 20;
|
||
|
static final int rulerTickMinor = 10;
|
||
|
static final int rulerTickMajor = 100;
|
||
|
|
||
|
private int length;
|
||
|
private int start;
|
||
|
|
||
|
private TxEditorPlugin plugin;
|
||
|
private Color headerBgColor;
|
||
|
private Color headerFgColor;
|
||
|
|
||
|
Ruler(Composite parent, int style, int lenght) {
|
||
|
super(parent, style | SWT.DOUBLE_BUFFERED);
|
||
|
this.length=lenght;
|
||
|
headerBgColor=getDisplay().getSystemColor(SWT.COLOR_WHITE);
|
||
|
headerFgColor=getDisplay().getSystemColor(SWT.COLOR_BLACK);
|
||
|
plugin=TxEditorPlugin.getDefault();
|
||
|
if(plugin!=null){
|
||
|
headerBgColor=plugin.getColor(TxEditorPlugin.headerBgColor);
|
||
|
headerFgColor=plugin.getColor(TxEditorPlugin.headerFgColor);
|
||
|
}
|
||
|
addDisposeListener(new DisposeListener() {
|
||
|
public void widgetDisposed(DisposeEvent e) {
|
||
|
Ruler.this.widgetDisposed(e);
|
||
|
}
|
||
|
});
|
||
|
addPaintListener(new PaintListener() {
|
||
|
public void paintControl(PaintEvent e) {
|
||
|
Ruler.this.paintControl(e);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public int getLength() {
|
||
|
return length;
|
||
|
}
|
||
|
|
||
|
public void setLength(int length) {
|
||
|
this.length = length;
|
||
|
layout(true);
|
||
|
redraw();
|
||
|
}
|
||
|
|
||
|
protected void widgetDisposed(DisposeEvent e) {
|
||
|
}
|
||
|
|
||
|
void paintControl(PaintEvent e) {
|
||
|
GC gc = e.gc;
|
||
|
int startMinorIncr = start;
|
||
|
int modulo = start % rulerTickMinor;
|
||
|
startMinorIncr+=rulerTickMinor-modulo;
|
||
|
int bottom=height - 2;
|
||
|
int end=start+e.width;
|
||
|
|
||
|
gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
|
||
|
gc.fillRectangle(new Rectangle(0, 0, e.width, height));
|
||
|
gc.setBackground(headerBgColor);
|
||
|
gc.fillRectangle(new Rectangle(0, 0, e.width, height - 1));
|
||
|
gc.setForeground(headerFgColor);
|
||
|
gc.drawLine(0, bottom, e.width, bottom);
|
||
|
|
||
|
for (int tick = startMinorIncr; tick < end; tick += rulerTickMinor) {
|
||
|
int x0 = tick-start;
|
||
|
if ((tick % rulerTickMajor) == 0) {
|
||
|
gc.drawLine(x0, 10, x0, bottom);
|
||
|
gc.drawText(Integer.toString(tick), x0, 0);
|
||
|
} else {
|
||
|
gc.drawLine(x0, 15, x0, bottom);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public Point computeSize(int wHint, int hHint, boolean changed) {
|
||
|
return new Point(0, height);
|
||
|
}
|
||
|
|
||
|
public void setStartPoint(int start) {
|
||
|
this.start=start;
|
||
|
redraw();
|
||
|
}
|
||
|
}
|