1 /******************************************************************************* 2 * Copyright (c) 2011 Google, Inc. 3 * All rights reserved. This program and the accompanying materials 4 * are made available under the terms of the Eclipse Public License v1.0 5 * which accompanies this distribution, and is available at 6 * http://www.eclipse.org/legal/epl-v10.html 7 * 8 * Contributors: 9 * Google, Inc. - initial API and implementation 10 *******************************************************************************/ 11 package org.eclipse.wb.internal.core.model.property.table; 12 13 import org.eclipse.wb.internal.core.model.property.Property; 14 15 import org.eclipse.swt.SWT; 16 import org.eclipse.swt.graphics.Point; 17 import org.eclipse.swt.widgets.Composite; 18 import org.eclipse.swt.widgets.Control; 19 import org.eclipse.swt.widgets.Event; 20 import org.eclipse.swt.widgets.Listener; 21 import org.eclipse.swt.widgets.Shell; 22 23 /** 24 * Provider for tooltip controls. 25 * 26 * @author scheglov_ke 27 * @coverage core.model.property.table 28 */ 29 public abstract class PropertyTooltipProvider { 30 /** 31 * Show tooltip directly on property row. 32 */ 33 public static final int ON = 0; 34 /** 35 * Show tooltip below property row. 36 */ 37 public static final int BELOW = 1; 38 39 //////////////////////////////////////////////////////////////////////////// 40 // 41 // PropertyTooltipProvider 42 // 43 //////////////////////////////////////////////////////////////////////////// 44 /** 45 * Create tooltip control. 46 */ createTooltipControl(Property property, Composite parent, int availableWidth, IPropertyTooltipSite site)47 public abstract Control createTooltipControl(Property property, 48 Composite parent, 49 int availableWidth, 50 IPropertyTooltipSite site); 51 52 /** 53 * Shows tooltip {@link Shell}. 54 */ show(Shell shell)55 public void show(Shell shell) { 56 shell.setVisible(true); 57 } 58 59 /** 60 * Returns position for tooltip control. Usually we should show directly on same row, because we 61 * use tooltip to show just longer (full) text of property. But for "class" property we show 62 * hierarchy, so it is better show it below and allow user see also property row. 63 */ getTooltipPosition()64 public int getTooltipPosition() { 65 return ON; 66 } 67 68 //////////////////////////////////////////////////////////////////////////// 69 // 70 // Tooltip listener 71 // 72 //////////////////////////////////////////////////////////////////////////// 73 /** 74 * {@link Listener} that hides tooltip on mouse exit or click. 75 */ 76 protected static final class HideListener implements Listener { 77 private final IPropertyTooltipSite m_site; 78 79 //////////////////////////////////////////////////////////////////////////// 80 // 81 // Constructor 82 // 83 //////////////////////////////////////////////////////////////////////////// HideListener(IPropertyTooltipSite site)84 public HideListener(IPropertyTooltipSite site) { 85 m_site = site; 86 } 87 88 //////////////////////////////////////////////////////////////////////////// 89 // 90 // Listener 91 // 92 //////////////////////////////////////////////////////////////////////////// handleEvent(Event event)93 public void handleEvent(Event event) { 94 Control tooltipControl = (Control) event.widget; 95 switch (event.type) { 96 case SWT.MouseDown : { 97 PropertyTable table = m_site.getTable(); 98 // convert location from tooltip to table 99 Point p = new Point(event.x, event.y); 100 p = tooltipControl.toDisplay(p); 101 p = table.toControl(p); 102 // send MouseDown to table 103 Event newEvent = new Event(); 104 newEvent.x = p.x; 105 newEvent.y = p.y; 106 table.notifyListeners(SWT.MouseDown, newEvent); 107 // hide tooltip 108 m_site.hideTooltip(); 109 break; 110 } 111 case SWT.MouseExit : 112 m_site.hideTooltip(); 113 break; 114 } 115 } 116 } 117 } 118