e.gc.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
e.gc.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
e.gc.fillRectangle(0, 0, WIDTH, TEXT_HEIGHT);
GCStringPrinter.printString(e.gc,title+"\n"+ _getStringValue(), new Rectangle(0,
0, WIDTH, HEIGHT), true, false, SWT.CENTER | SWT.TOP | SWT.WRAP);
e.gc.drawLine(0, TEXT_HEIGHT - 1, WIDTH, TEXT_HEIGHT - 1);
// options list
int y = TEXT_HEIGHT;
Point mousePos = composite.toControl(display.getCursorLocation());
for (Iterator iter = mapOptions.keySet().iterator(); iter.hasNext();) {
long value = (Long) iter.next();
String text = (String) mapOptions.get(value);
Rectangle area = new Rectangle(0, y, WIDTH, OPTION_HEIGHT);
Color bg;
if (area.contains(mousePos)) {
bg = display.getSystemColor(SWT.COLOR_LIST_SELECTION);
e.gc.setBackground(bg);
e.gc.setForeground(display.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT));
e.gc.fillRectangle(area);
} else {
bg = display.getSystemColor(SWT.COLOR_LIST_BACKGROUND);
e.gc.setBackground(bg);
e.gc.setForeground(display.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
}
int ovalSize = OPTION_HEIGHT - 6;
if (getValue() == value) {
Color saveColor = e.gc.getBackground();
e.gc.setBackground(e.gc.getForeground());
e.gc.fillOval(4, y + 5, ovalSize - 3, ovalSize - 3);
e.gc.setBackground(saveColor);
}
if (JMConstants.isLinux) {
// Hack: on linux, drawing oval seems to draw a line from last pos
// to start of oval.. drawing a point (anywhere) seems to clear the
// path
Color saveColor = e.gc.getForeground();
e.gc.setForeground(bg);
e.gc.drawPoint(2, y + 3);
e.gc.setForeground(saveColor);
}
e.gc.drawOval(2, y + 3, ovalSize, ovalSize);
GCStringPrinter.printString(e.gc, text, new Rectangle(OPTION_HEIGHT,
y, WIDTH - OPTION_HEIGHT, OPTION_HEIGHT), true, false, SWT.LEFT);
y += OPTION_HEIGHT;
}
// typed value
if (sValue.length() > 0) {
Point extent = e.gc.textExtent(sValue);
if (extent.x > WIDTH - 10) {
extent.x = WIDTH - 10;
}
Rectangle rect = new Rectangle(WIDTH - 8 - extent.x, 14,
extent.x + 5, extent.y + 4 + 14 > TEXT_HEIGHT ? TEXT_HEIGHT - 15
: extent.y + 4);
e.gc.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
e.gc.fillRectangle(rect);
try {
e.gc.setAlpha(TYPED_TEXT_ALPHA);
} catch (Exception ex) {
}
e.gc.setBackground(display.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
e.gc.setForeground(display.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
//e.gc.drawRectangle(rect);
GCStringPrinter.printString(e.gc, sValue , new Rectangle(rect.x + 2,
rect.y + 2, WIDTH - 5, OPTION_HEIGHT), true, false, SWT.LEFT
| SWT.BOTTOM);
}
}
});
Point location = display.getCursorLocation();
location.y -= getBaselinePos();
int x = (int) (WIDTH_NO_PADDING * (value > maxValue ? 1 : (double) value
/ maxValue));
location.x -= PADDING_X0 + x;
Rectangle bounds = new Rectangle(location.x, location.y, WIDTH, HEIGHT);
Monitor mouseMonitor = shell.getMonitor();
Monitor[] monitors = display.getMonitors();
for (int i = 0; i < monitors.length; i++) {
Monitor monitor = monitors[i];
if (monitor.getBounds().contains(location)) {
mouseMonitor = monitor;
break;
}
}
Rectangle monitorBounds = mouseMonitor.getBounds();
Rectangle intersection = monitorBounds.intersection(bounds);
if (intersection.width != bounds.width) {
bounds.x = monitorBounds.x + monitorBounds.width - WIDTH;
bounds.width = WIDTH;
}
if (intersection.height != bounds.height) {