// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.dataprofiler.core.ui.dialog.composite;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
/**
* DOC zqin class global comment. Detailled comment
*/
public class TooltipTree extends Tree {
private static final String TREEITEM = "_TREEITEM"; //$NON-NLS-1$
private final Composite parent;
/**
* DOC zqin TooltipTree constructor comment.
*
* @param parent
* @param style
*/
public TooltipTree(Composite parent, int style) {
super(parent, style);
this.parent = parent;
init();
}
/*
* Disable the judge of subclass.
*
* @see org.eclipse.swt.widgets.TreeItem#checkSubclass()
*/
@Override
protected void checkSubclass() {
}
private void init() {
final Listener labelListener = new Listener() {
public void handleEvent(Event event) {
Label label = (Label) event.widget;
Shell shell = label.getShell();
switch (event.type) {
case SWT.MouseDown:
Event e = new Event();
e.item = (TreeItem) label.getData(TREEITEM);
// Assuming table is single select, set the selection as if
// the mouse down event went through to the table
setSelection(new TreeItem[] { (TreeItem) e.item });
notifyListeners(SWT.Selection, e);
shell.dispose();
// MOD yyi 2011-06-13:20344: sync tree layout on adding pattern
// setFocus();
break;
case SWT.MouseExit:
shell.dispose();
break;
default:
}
}
};
Listener treeListener = new Listener() {
Shell tip = null;
Label label = null;
public void handleEvent(Event event) {
switch (event.type) {
case SWT.Dispose:
case SWT.KeyDown:
case SWT.MouseMove:
if (tip == null) {
break;
}
tip.dispose();
tip = null;
label = null;
break;
case SWT.MouseHover:
TreeItem item = getItem(new Point(event.x, event.y));
if (isValidItem(item)) {
if (tip != null && !tip.isDisposed()) {
tip.dispose();
}
tip = new Shell(parent.getShell(), SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
tip.setBackground(parent.getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
FillLayout layout = new FillLayout();
layout.marginWidth = 2;
tip.setLayout(layout);
label = new Label(tip, SWT.WRAP);
label.setForeground(parent.getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
label.setBackground(parent.getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
label.setData(TREEITEM, item);
String displayedText = getItemTooltipText(item);
label.setText(displayedText);
label.addListener(SWT.MouseExit, labelListener);
label.addListener(SWT.MouseDown, labelListener);
// MOD 2009-01-07 mzhao wrap text if length too long.
int widthHit = SWT.DEFAULT;
if (displayedText.length() > 100) {
widthHit = 500;
}
Point size = tip.computeSize(widthHit, SWT.DEFAULT);
Rectangle rect = item.getBounds(0);
Point pt = toDisplay(rect.x + 80, rect.y);
tip.setBounds(pt.x, pt.y, size.x, size.y);
tip.setVisible(true);
}
default:
}
}
};
this.addListener(SWT.Dispose, treeListener);
this.addListener(SWT.KeyDown, treeListener);
this.addListener(SWT.MouseMove, treeListener);
this.addListener(SWT.MouseHover, treeListener);
}
protected boolean isValidItem(TreeItem item) {
return item != null;
}
protected String getItemTooltipText(TreeItem item) {
return item.getText();
}
}