* Matthew Khouzam - Initial API and implementation
* Francois Chouinard - Refactoring, slider support, bug fixing
* Patrick Tasse - Improvements and bug fixing
+ * Xavier Raynaud - Improvements
******************************************************************************/
package org.eclipse.linuxtools.tmf.ui.widgets;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
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.Menu;
+import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Slider;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.PlatformUI;
/**
* <b><u>TmfVirtualTable</u></b>
private Slider fSlider;
private int fLinuxItemHeight = 0; // Calculated item height for Linux workaround
+ private TooltipProvider tooltipProvider = null;
+ private IDoubleClickListener doubleClickListener = null;
// ------------------------------------------------------------------------
// Constructor
}
}
});
+ // Implement a "fake" tooltip
+ final String TOOLTIP_DATA_KEY = "_TABLEITEM"; //$NON-NLS-1$
+ final Listener labelListener = new Listener () {
+ @Override
+ 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 = (TableItem) label.getData (TOOLTIP_DATA_KEY);
+ // Assuming table is single select, set the selection as if
+ // the mouse down event went through to the table
+ fTable.setSelection (new TableItem [] {(TableItem) e.item});
+ fTable.notifyListeners (SWT.Selection, e);
+ shell.dispose ();
+ fTable.setFocus();
+ break;
+ case SWT.MouseExit:
+ case SWT.MouseWheel:
+ shell.dispose ();
+ break;
+ }
+ }
+ };
+ Listener tableListener = new Listener () {
+ Shell tip = null;
+ Label label = null;
+ @Override
+ 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: {
+ TableItem item = fTable.getItem (new Point(event.x, event.y));
+ if (item != null) {
+ for(int i=0;i<fTable.getColumnCount();i++){
+ Rectangle bounds = item.getBounds(i);
+ if (bounds.contains(event.x,event.y)){
+ if (tip != null && !tip.isDisposed()) tip.dispose();
+ if (tooltipProvider == null) {
+ return;
+ } else {
+ String tooltipText = tooltipProvider.getTooltip(i, item.getData());
+ if (tooltipText == null) return;
+ tip = new Shell(fTable.getShell(), SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
+ tip.setBackground(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ FillLayout layout = new FillLayout();
+ layout.marginWidth = 2;
+ tip.setLayout(layout);
+ label = new Label(tip, SWT.WRAP);
+ label.setForeground(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+ label.setBackground(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ label.setData(TOOLTIP_DATA_KEY, item);
+ label.setText(tooltipText);
+
+ label.addListener(SWT.MouseExit, labelListener);
+ label.addListener(SWT.MouseDown, labelListener);
+ label.addListener(SWT.MouseWheel, labelListener);
+ Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+ Point pt = fTable.toDisplay(bounds.x, bounds.y);
+ tip.setBounds(pt.x, pt.y, size.x, size.y);
+ tip.setVisible(true);
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ };
+ fTable.addListener(SWT.Dispose, tableListener);
+ fTable.addListener(SWT.KeyDown, tableListener);
+ fTable.addListener(SWT.MouseMove, tableListener);
+ fTable.addListener(SWT.MouseHover, tableListener);
addControlListener(new ControlAdapter() {
@Override
public void controlResized(ControlEvent event) {
public void keyReleased(KeyEvent event) {
}
});
+
+ fTable.addListener(
+ SWT.MouseDoubleClick, new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ if (doubleClickListener != null) {
+ TableItem item = fTable.getItem (new Point (event.x, event.y));
+ if (item != null) {
+ for(int i=0;i<fTable.getColumnCount();i++){
+ Rectangle bounds = item.getBounds(i);
+ if (bounds.contains(event.x,event.y)){
+ doubleClickListener.handleDoubleClick(TmfVirtualTable.this, item, i);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ );
}
/**
event.index = index + fTableTopEventRank;
}
event.doit = true;
- notifyListeners(SWT.SetData, event);
+ fTable.notifyListeners(SWT.SetData, event);
return event.doit; // false if table item not updated yet in this thread
}
return true;
return fTable.getSelection();
}
+ @Override
+ public void addListener(int eventType, Listener listener) {
+ fTable.addListener(eventType, listener);
+ }
+
@Override
public void addKeyListener(KeyListener listener) {
fTable.addKeyListener(listener);
}
- @Override
+
+ @Override
public void addMouseListener(MouseListener listener) {
fTable.addMouseListener(listener);
}
public int getSelectionIndex() {
int index = fTable.getSelectionIndex();
+ if (index == -1) {
+ return fSelectedEventRank;
+ }
if (index < fFrozenRowCount) {
return index;
} else {
}
return null;
}
+
+ /**
+ * @return the tooltipProvider
+ */
+ public TooltipProvider getTooltipProvider() {
+ return tooltipProvider;
+ }
+
+ /**
+ * @param tooltipProvider the tooltipProvider to set
+ */
+ public void setTooltipProvider(TooltipProvider tooltipProvider) {
+ this.tooltipProvider = tooltipProvider;
+ }
+
+ /**
+ * @return the doubleClickListener
+ */
+ public IDoubleClickListener getDoubleClickListener() {
+ return doubleClickListener;
+ }
+
+ /**
+ * @param doubleClickListener the doubleClickListener to set
+ */
+ public void setDoubleClickListener(IDoubleClickListener doubleClickListener) {
+ this.doubleClickListener = doubleClickListener;
+ }
+
}