1)
2)
/**
* Table that provides fake tooltips for items in a SWT table
*/
public class TooltipTable extends Table {
private TooltipTableListener tableListener;
protected void checkSubclass() {
}
public TooltipTable(Composite parent, int style) {
super(parent, style);
//1)
setToolTipText("");
//2)
tableListener = new TooltipTableListener(this);
addListener(SWT.Dispose, tableListener);
addListener(SWT.KeyDown, tableListener);
addListener(SWT.MouseExit, tableListener); //Hide tootip
addListener(SWT.MouseDown, tableListener); //Hide tooltip
addListener(SWT.MouseHover, tableListener); //Show tooltip
}
/** Default tooltip extracted from TableItem, subclass may override it */
protected String getTooltip(TableItem item) {
return "Hint: " + item.getText();
}
}
2)
/**
* Show tooltip when mouse hover TableItem
* Hide tooltip when mouse out of TableItem and not in tooltip
*/
public class TooltipTableListener implements Listener {
private Shell tip;
private Label label;
private TooltipTable table;
private TooltipLabelListener labelListener;
//private String brokerName;
private TableItem item;
//It should > 0
private int delayToRemoveTip = 100;
//Remove tooltip when mouse out of the TableItem and not in tooltip
private boolean isRemoveTip = true;
public TooltipTableListener(TooltipTable table) {
this.table = table;
labelListener = new TooltipLabelListener();
}
public void handleEvent(Event event) {
switch (event.type) {
case SWT.Dispose:
case SWT.KeyDown:
case SWT.MouseDown:
case SWT.MouseExit:
isRemoveTip = true;
disposeTooltip();
break;
case SWT.MouseHover:
item = table.getItem(new Point(event.x, event.y));
createTooltip();
}
}
/**
* Hide tooltip when mouse out of TableItem
* Do it after some delay, if mouse go into tooltip, don't hide tooltip
*/
class ReleaseTipThread extends Thread {
public void run() {
try {
Thread.yield();
Thread.sleep(delayToRemoveTip);
} catch (Exception e) {
e.printStackTrace();
}
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (isRemoveTip && tip != null && !tip.isDisposed()) {
tip.dispose();
tip = null;
}
}
});
}
}
private void disposeTooltip() {
new ReleaseTipThread().start();
}
private void createTooltip() {
if (item == null) {
disposeTooltip();
return;
}
if (table.getTooltip(item) == null)
return;
if (tip == null || tip.isDisposed()) {
Shell shell = table.getShell();
Display display = table.getDisplay();
tip = new Shell(shell, SWT.ON_TOP | SWT.TOOL);
FillLayout layout = new FillLayout();
tip.setLayout(layout);
label = new Label(tip, SWT.NONE);
//label.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
//label.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
label.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
label.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
label.addListener(SWT.MouseDown, labelListener);
label.addListener(SWT.MouseHover, labelListener);
}
initTip();
}
private void initTip() {
label.setData("_TABLEITEM", item);
label.setText(table.getTooltip(item));
Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
Rectangle rect = item.getBounds(0);
Point pt = table.toDisplay(rect.x, rect.y);
tip.setBounds(pt.x, pt.y, size.x, size.y);
tip.setVisible(true);
}
/** If MouseHover in the tooltip label, don't remove the tooltip */
class TooltipLabelListener implements Listener {
public void handleEvent(Event event) {
Label label = (Label) event.widget;
if ((label == null) || label.isDisposed())
return;
switch (event.type) {
case SWT.MouseHover:
isRemoveTip = false;
break;
case SWT.MouseDown:
Event e = new Event();
e.item = (TableItem) label.getData("_TABLEITEM");
table.setSelection(new TableItem[] { (TableItem) e.item });
table.notifyListeners(SWT.Selection, e);
isRemoveTip = true;
disposeTooltip();
}
}
}
}