// ============================================================================
//
// 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.utils;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
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.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.PlatformUI;
import org.talend.core.model.properties.DatabaseConnectionItem;
import org.talend.dataprofiler.core.CorePlugin;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.indicators.preview.table.ChartDataEntity;
import org.talend.dq.nodes.DBTableFolderRepNode;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.RepositoryNode;
/**
* DOC bZhou class global comment. Detailled comment
*/
public final class TableUtils {
public static final Color highlightBlue = new Color(Display.getCurrent(), 223, 232, 246);
/**
* add "Right-click for actions" Tooltip.
*
* @param table
*/
public static void addActionTooltip(final Table table) {
table.setToolTipText(""); //$NON-NLS-1$
// final Shell shell = new Shell(PlatformUI.getWorkbench().getDisplay().);
// shell.setLayout(new FillLayout());
final Listener labelListener = new Listener() {
public void handleEvent(Event event) {
Label label = (Label) event.widget;
Shell labelShell = label.getShell();
switch (event.type) {
case SWT.MouseDown:
Event e = new Event();
e.item = (TableItem) label.getData("_TABLEITEM"); //$NON-NLS-1$
table.setSelection(new TableItem[] { (TableItem) e.item });
table.notifyListeners(SWT.Selection, e);
// no need a break
//$FALL-THROUGH$
case SWT.MouseExit:
labelShell.dispose();
break;
default:
break;
}
}
};
final Listener tableListener = new Listener() {
Shell actionTooltipShell = null;
Label actionTooltipLabel = null;
public void handleEvent(Event event) {
Point mousePoint = new Point(event.x, event.y);
TableItem item = table.getItem(mousePoint);
switch (event.type) {
case SWT.Dispose:
case SWT.KeyDown:
case SWT.KeyUp:
case SWT.MouseExit:
case SWT.MouseMove:
case SWT.Selection:
case SWT.MenuDetect:
case SWT.MouseDoubleClick:
if (actionTooltipShell != null && !actionTooltipShell.isDisposed()) {
actionTooltipShell.close();
}
break;
case SWT.MouseHover:
if (item != null) {
// show action tooltip
showActionTooltip(item, mousePoint);
}
break;
default:
break;
}
}
private void showActionTooltip(TableItem item, Point mousePoint) {
actionTooltipShell = new Shell(PlatformUI.getWorkbench().getDisplay().getActiveShell(), SWT.ON_TOP | SWT.TOOL);
actionTooltipShell.setLayout(new FillLayout());
actionTooltipLabel = new Label(actionTooltipShell, SWT.NONE);
actionTooltipLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
actionTooltipLabel.setData("_TABLEITEM", item); //$NON-NLS-1$
actionTooltipLabel.setText(DefaultMessagesImpl.getString("TableUtils.actionTooltipLabel")); //$NON-NLS-1$
actionTooltipLabel.addListener(SWT.MouseExit, labelListener);
actionTooltipLabel.addListener(SWT.MouseDown, labelListener);
Point size = actionTooltipShell.computeSize(SWT.DEFAULT, SWT.DEFAULT);
Point pt = table.toDisplay(mousePoint.x, mousePoint.y);
actionTooltipShell.setBounds(pt.x + 10, pt.y - 9, size.x, size.y);
actionTooltipShell.setVisible(true);
}
};
table.addListener(SWT.Dispose, tableListener);
table.addListener(SWT.KeyDown, tableListener);
table.addListener(SWT.MouseHover, tableListener);
table.addListener(SWT.MouseMove, tableListener);
table.addListener(SWT.MouseExit, tableListener);
table.addListener(SWT.MouseDoubleClick, tableListener);
table.addListener(SWT.MenuDetect, tableListener);
table.addListener(SWT.Selection, tableListener);
table.addListener(SWT.KeyUp, tableListener);
table.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
table.removeListener(SWT.Dispose, tableListener);
table.removeListener(SWT.KeyDown, tableListener);
table.removeListener(SWT.MouseHover, tableListener);
table.removeListener(SWT.MouseMove, tableListener);
table.removeListener(SWT.MouseExit, tableListener);
table.removeListener(SWT.MouseDoubleClick, tableListener);
table.removeListener(SWT.MenuDetect, tableListener);
table.removeListener(SWT.Selection, tableListener);
table.removeListener(SWT.KeyUp, tableListener);
}
});
}
/**
* add threshold Tooltip etc for table.
*
* @param table
*/
public static void addTooltipForTable(final Table table) {
table.setToolTipText(""); //$NON-NLS-1$
final Listener labelListener = new Listener() {
public void handleEvent(Event event) {
Label label = (Label) event.widget;
Shell labelShell = label.getShell();
switch (event.type) {
case SWT.MouseDown:
Event e = new Event();
e.item = (TableItem) label.getData("_TABLEITEM"); //$NON-NLS-1$
table.setSelection(new TableItem[] { (TableItem) e.item });
table.notifyListeners(SWT.Selection, e);
// no need a break
case SWT.MouseExit:
labelShell.dispose();
break;
default:
break;
}
}
};
final Listener tableListener = new Listener() {
Shell rangeTooltipShell = null;
Label rangeTooltipLabel = null;
public void handleEvent(Event event) {
Point mousePoint = new Point(event.x, event.y);
TableItem item = table.getItem(mousePoint);
switch (event.type) {
case SWT.Dispose:
if (item != null) {
item.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
}
break;
case SWT.KeyDown:
case SWT.MouseMove:
if (item != null) {
item.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
}
if (rangeTooltipShell != null && !rangeTooltipShell.isDisposed()) {
rangeTooltipShell.close();
}
break;
case SWT.MouseHover:
if (item != null) {
// TDQ-11529: when hovering over table or charts, change background color
item.setBackground(highlightBlue);
// show Range tooltip
ChartDataEntity entity = (ChartDataEntity) item.getData();
String rangeAsString = entity.getRangeAsString();
if (rangeAsString != null) {
showRangeTooltip(item, rangeAsString, mousePoint);
}
}
default:
break;
}
}
private void showRangeTooltip(TableItem item, String msg, Point mousePoint) {
rangeTooltipShell = new Shell(PlatformUI.getWorkbench().getDisplay().getActiveShell(), SWT.ON_TOP | SWT.TOOL);
rangeTooltipShell.setLayout(new FillLayout());
rangeTooltipLabel = new Label(rangeTooltipShell, SWT.NONE);
rangeTooltipLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
rangeTooltipLabel.setData("_TABLEITEM", item); //$NON-NLS-1$
rangeTooltipLabel.setText(msg);
rangeTooltipLabel.addListener(SWT.MouseExit, labelListener);
rangeTooltipLabel.addListener(SWT.MouseDown, labelListener);
Point size = rangeTooltipShell.computeSize(SWT.DEFAULT, SWT.DEFAULT);
Point pt = table.toDisplay(mousePoint.x, mousePoint.y);
rangeTooltipShell.setBounds(pt.x + 10, pt.y + 9, size.x, size.y);
rangeTooltipShell.setVisible(true);
}
};
table.addListener(SWT.Dispose, tableListener);
table.addListener(SWT.KeyDown, tableListener);
table.addListener(SWT.MouseMove, tableListener);
table.addListener(SWT.MouseHover, tableListener);
table.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
table.removeListener(SWT.Dispose, tableListener);
table.removeListener(SWT.KeyDown, tableListener);
table.removeListener(SWT.MouseMove, tableListener);
table.removeListener(SWT.MouseHover, tableListener);
}
});
}
/**
* find the table folder node under selectedHive node. currently, only under default db. Added TDQ-10328
*
* @param hiveConnectionItem2
* @return
*/
public static RepositoryNode getTableFolder(final DatabaseConnectionItem hiveConnectionItem) {
RepositoryNode hiveNode = RepositoryNodeHelper.recursiveFind(hiveConnectionItem.getProperty());
CorePlugin.getDefault().refreshDQView(hiveNode);
List<IRepositoryNode> children = hiveNode.getChildren();
RepositoryNode tableFolder = null;
for (IRepositoryNode child : children) {
if (StringUtils.equals("default", child.getLabel())) { //$NON-NLS-1$
List<IRepositoryNode> folders = child.getChildren();
for (IRepositoryNode folder : folders) {
if (folder instanceof DBTableFolderRepNode) {
return (RepositoryNode) folder;
}
}
}
}
return tableFolder;
}
/**
* find the pointed table node under the selected Hive connection. currently, only for default.Added TDQ-10328
*
* @param hiveNode
* @param tableName
* @return
*/
public static IRepositoryNode findTableInConnection(final DatabaseConnectionItem hiveNode, String tableName) {
RepositoryNode tableFolder = getTableFolder(hiveNode);
List<IRepositoryNode> allTables = tableFolder.getChildren();
for (IRepositoryNode table : allTables) {
if (StringUtils.equals(table.getLabel(), tableName)) {
return table;
}
}
return null;
}
}