/******************************************************************************* * Copyright (c) 2007, 2014 compeople AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * compeople AG - initial API and implementation *******************************************************************************/ package org.eclipse.riena.ui.swt.facades.internal; import java.util.Collection; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.util.Policy; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.viewers.ViewerRow; import org.eclipse.jface.window.ToolTip; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Widget; import org.eclipse.riena.core.util.StringUtils; import org.eclipse.riena.internal.ui.ridgets.swt.TableRidgetLabelProvider; import org.eclipse.riena.internal.ui.ridgets.swt.TableRidgetTableViewer; import org.eclipse.riena.ui.core.marker.RowErrorMessageMarker; import org.eclipse.riena.ui.ridgets.ITableRidget; import org.eclipse.riena.ui.swt.utils.SwtUtilities; /** * Customizable tool tips for a TableRidget. * <p> * <i>(Note: The TableRidget must use <code>TableRidgetTableViewer</code>)</i> */ public class TableRidgetToolTipSupport extends ColumnViewerToolTipSupport implements ITableRidgetToolTipSupport { private static final String VIEWER_CELL_KEY = Policy.JFACE + "_VIEWER_CELL_KEY"; //$NON-NLS-1$ private static final int DEFAULT_SHIFT_X = 10; private static final int DEFAULT_SHIFT_Y = 0; private TableRidgetTableViewer viewer; private String defaultToolTip; /** * Enable ToolTip support for the viewer by creating an instance from this * class. To get all necessary informations this support class consults the * {@link TableRidgetLabelProvider}. * * @param viewer * the viewer the support is attached to * @param style * style passed to control tool tip behavior * * @param manualActivation * <code>true</code> if the activation is done manually using * {@link #show(Point)} */ protected TableRidgetToolTipSupport(final ColumnViewer viewer, final int style) { super(viewer, ToolTip.NO_RECREATE, false); Assert.isLegal(viewer instanceof TableRidgetTableViewer); this.viewer = (TableRidgetTableViewer) viewer; } /** * Create the support of JFace tooltips for a given Table. * * @param viewer * The viewer component of the table * @return The instance of the tooltip support. */ public static ITableRidgetToolTipSupport enableSupportFor(final ColumnViewer viewer) { final TableRidgetToolTipSupport support = new TableRidgetToolTipSupport(viewer, ToolTip.NO_RECREATE); support.init(); return support; } TableRidgetTableViewer getViewer() { return viewer; } private void init() { final Control table = viewer.getTable(); if (table != null) { final String tableToolTip = table.getToolTipText(); defaultToolTip = tableToolTip != null ? tableToolTip : ""; //$NON-NLS-1$ table.setToolTipText(defaultToolTip); } } /** * {@inheritDoc} */ @Override protected boolean shouldCreateToolTip(final Event event) { boolean rv = false; final Point point = new Point(event.x, event.y); final ViewerRow row = viewer.getViewerRow(point); viewer.getControl().setToolTipText(defaultToolTip); if (row != null) { final Widget item = row.getItem(); final Object element = item.getData(); final ViewerCell cell = row.getCell(point); if (cell == null) { return false; } final Table table = viewer.getTable(); final int column = SwtUtilities.findColumn(table, point); TableRidgetLabelProvider labelProvider = null; if ((viewer.getLabelProvider() instanceof TableRidgetLabelProvider) && ((column != -1))) { labelProvider = (TableRidgetLabelProvider) viewer.getLabelProvider(); } String text = getErrorToolTip(element); if (StringUtils.isEmpty(text)) { if ((labelProvider != null) && (column != -1)) { text = labelProvider.getToolTipText(element, column); } } if (StringUtils.isEmpty(text)) { if ((item instanceof TableItem) && (column != -1)) { text = ((TableItem) item).getText(column); } } if (StringUtils.isEmpty(text)) { text = defaultToolTip; } Image img = null; if ((labelProvider != null) && (column != -1)) { img = labelProvider.getToolTipImage(element, column); } if (text == null && img == null) { table.setToolTipText(defaultToolTip); rv = false; } else { Point shift = null; if (column != -1) { setPopupDelay(labelProvider.getToolTipDisplayDelayTime(element, column)); setHideDelay(labelProvider.getToolTipTimeDisplayed(element, column)); shift = labelProvider.getToolTipShift(element, column); } if (shift == null) { setShift(new Point(DEFAULT_SHIFT_X, DEFAULT_SHIFT_Y)); } else { setShift(new Point(shift.x, shift.y)); } setData(VIEWER_CELL_KEY, cell); setText(text); setImage(img); if (column != -1) { setStyle(labelProvider.getToolTipStyle(element, column)); setForegroundColor(labelProvider.getToolTipForegroundColor(element, column)); setBackgroundColor(labelProvider.getToolTipBackgroundColor(element, column)); setFont(labelProvider.getToolTipFont(element, column)); } rv = true; } } return rv; } private String getErrorToolTip(final Object element) { if (element != null) { final ITableRidget tableRidget = viewer.getTableRidget(); final Collection<RowErrorMessageMarker> markers = tableRidget.getMarkersOfType(RowErrorMessageMarker.class); for (final RowErrorMessageMarker marker : markers) { if (marker.getRowValue() == element) { return marker.getMessage(); } } } return null; } private void resetToolTip(final Control table) { if (table == null) { return; } if (table.getToolTipText() == null || !table.getToolTipText().equals(defaultToolTip)) { table.setToolTipText(defaultToolTip); } } public void disableSupport() { deactivate(); if (viewer != null) { resetToolTip(viewer.getTable()); } } public void enableSupport(final ColumnViewer viewer) { if (viewer instanceof TableRidgetTableViewer) { if (this.viewer != viewer) { disableSupport(); this.viewer = (TableRidgetTableViewer) viewer; init(); } activate(); } } }