/******************************************************************************* * Copyright (c) 2011 Google, Inc. * 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: * Google, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.wb.internal.core.model.property.table; import org.eclipse.wb.internal.core.model.property.Property; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; /** * Provider for tooltip controls. * * @author scheglov_ke * @coverage core.model.property.table */ public abstract class PropertyTooltipProvider { /** * Show tooltip directly on property row. */ public static final int ON = 0; /** * Show tooltip below property row. */ public static final int BELOW = 1; //////////////////////////////////////////////////////////////////////////// // // PropertyTooltipProvider // //////////////////////////////////////////////////////////////////////////// /** * Create tooltip control. */ public abstract Control createTooltipControl(Property property, Composite parent, int availableWidth, IPropertyTooltipSite site); /** * Shows tooltip {@link Shell}. */ public void show(Shell shell) { shell.setVisible(true); } /** * Returns position for tooltip control. Usually we should show directly on same row, because we * use tooltip to show just longer (full) text of property. But for "class" property we show * hierarchy, so it is better show it below and allow user see also property row. */ public int getTooltipPosition() { return ON; } //////////////////////////////////////////////////////////////////////////// // // Tooltip listener // //////////////////////////////////////////////////////////////////////////// /** * {@link Listener} that hides tooltip on mouse exit or click. */ protected static final class HideListener implements Listener { private final IPropertyTooltipSite m_site; //////////////////////////////////////////////////////////////////////////// // // Constructor // //////////////////////////////////////////////////////////////////////////// public HideListener(IPropertyTooltipSite site) { m_site = site; } //////////////////////////////////////////////////////////////////////////// // // Listener // //////////////////////////////////////////////////////////////////////////// public void handleEvent(Event event) { Control tooltipControl = (Control) event.widget; switch (event.type) { case SWT.MouseDown : { PropertyTable table = m_site.getTable(); // convert location from tooltip to table Point p = new Point(event.x, event.y); p = tooltipControl.toDisplay(p); p = table.toControl(p); // send MouseDown to table Event newEvent = new Event(); newEvent.x = p.x; newEvent.y = p.y; table.notifyListeners(SWT.MouseDown, newEvent); // hide tooltip m_site.hideTooltip(); break; } case SWT.MouseExit : m_site.hideTooltip(); break; } } } }