/******************************************************************************* * Copyright 2017 Capital One Services, LLC and Bitwise, Inc. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package hydrograph.ui.tooltip.tooltips; import hydrograph.ui.common.util.XMLConfigUtil; import hydrograph.ui.logging.factory.LogFactory; import hydrograph.ui.tooltip.utils.ToolTipUtils; import java.nio.CharBuffer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseTrackListener; 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.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.slf4j.Logger; /** * * This is custom tooltip, to be shown in Component Palette * * @author Bitwise * */ public class PaletteToolTip extends Shell { private static final Logger logger = LogFactory.INSTANCE.getLogger(PaletteToolTip.class); private PaletteToolTip thisTestPaletteToolTip; private Composite toolTipComposite; private Label toolTipText; private String blankCharacters; private Link helpLink; private String componentName; /** * * Computes height and width of tooltip and saves it in Point, * where Point.x is width and Point.y is height * * @return org.eclipse.swt.graphics.Point */ private Point getToolTipWidthHeight() { Point tooltipSize = toolTipComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT); logger.debug("Computed Width=" + tooltipSize.x + "Height=" + tooltipSize.y); return tooltipSize; } /** * * Returns tooltip bounds * * @return org.eclipse.swt.graphics.Rectangle */ public Rectangle getToolTipBounds(){ Point tooltipSize = getToolTipWidthHeight(); Rectangle bounds = new Rectangle(0, 0, tooltipSize.x, tooltipSize.y); logger.debug("tooltip bounds=" + bounds); return bounds; } /** * set tooltip text * * @param text - text message to set */ public void setToolTipText(String text){ String[] lines = ToolTipUtils.getLines(text); int maxLength = ToolTipUtils.getMaxLength(lines); toolTipText.setText(text.replace("\\n", "\n")+" "); setSize(this.computeSize(SWT.DEFAULT, SWT.DEFAULT)); logger.debug("set tooltip text - " + text); } /** * Create the shell. * @param display */ public PaletteToolTip(Display display) { super(display, SWT.NONE); thisTestPaletteToolTip = this; setLayoutToOuterMostContainer(); addToolTipComposite(); logger.debug("created tooltip box"); addToolTipTextArea(); logger.debug("added tooltip textarea"); addSeparator(); logger.debug("added separator"); addHelpLink(); logger.debug("added help link"); addListenersToHideToolTip(); logger.debug("tooltip hide listener"); createContents(); } /** * Create link for "Help" */ private void addHelpLink() { helpLink = new Link(toolTipComposite, SWT.NONE); helpLink.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); helpLink.setText("<a>Help</a> "); helpLink.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_INFO_BACKGROUND)); helpLink.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { String helpFilePath = XMLConfigUtil.INSTANCE.getComponent(componentName).getHelpFilePath(); PlatformUI.getWorkbench().getHelpSystem().displayHelpResource( helpFilePath); } @Override public void widgetDefaultSelected(SelectionEvent e) { //Do Nothing } }); logger.debug("Added help link"); } /** * Create a separator between tooltip text area and add "Help" link */ private void addSeparator() { Label label = new Label(toolTipComposite, SWT.SEPARATOR | SWT.HORIZONTAL); label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); logger.debug("Added help link-tooltip text separator"); } /** * Add tooltip text area - toolTipText(Label hydrograph.ui.tooltip.tooltips.PaletteToolTip.toolTipText) */ private void addToolTipTextArea() { toolTipText = new Label(toolTipComposite, SWT.NONE); toolTipComposite.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_INFO_BACKGROUND)); toolTipText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); toolTipComposite.setSize(toolTipComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); toolTipText.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_INFO_BACKGROUND)); logger.debug("Initialized Tooltip text area"); } private void addListenersToHideToolTip() { addToolTipTextAreaMouseTrackListener(); addToolTipHelpLinkMouseTrackListener(); logger.debug("added listeners to hide tooltip"); } /** * help link Mouse exit event to hide tooltip */ private void addToolTipHelpLinkMouseTrackListener() { helpLink.addMouseTrackListener(new MouseTrackListener() { @Override public void mouseHover(MouseEvent e) { //Do Nothing } @Override public void mouseExit(MouseEvent e) { logger.debug("PaletteToolTip.addToolTipHelpLinkMouseTrackListener(mouseExit) :" + " (e.x , toolTipText.getBounds().width , e.y , toolTipText.getBounds().height)= " + e.x + " , " + toolTipText.getBounds().width + e.x + " , " + e.y + e.x + " , " + toolTipText.getBounds().height ); if(e.x < 0 || e.x > toolTipText.getBounds().width || e.y > toolTipText.getBounds().height){ logger.debug("PaletteToolTip.addToolTipHelpLinkMouseTrackListener: hiding tooltip"); thisTestPaletteToolTip.setVisible(false); } } @Override public void mouseEnter(MouseEvent e) { helpLink.setFocus(); } }); } /** * toolTipText area Mouse exit event to hide tooltip */ private void addToolTipTextAreaMouseTrackListener() { toolTipText.addMouseTrackListener(new MouseTrackListener() { @Override public void mouseHover(MouseEvent e) { //Do Nothing } @Override public void mouseExit(MouseEvent e) { logger.debug("PaletteToolTip.addToolTipTextAreaMouseTrackListener(mouseExit) :" + " (e.x , toolTipText.getBounds().width , e.y , toolTipText.getBounds().height)= " + e.x + " , " + toolTipText.getBounds().width + e.x + " , " + e.y + e.x + " , " + toolTipText.getBounds().height ); if(e.y < 0 || e.x < 0 || e.x > toolTipText.getBounds().width){ logger.debug("PaletteToolTip.addToolTipHelpLinkMouseTrackListener: hiding tooltip"); thisTestPaletteToolTip.setVisible(false); } } @Override public void mouseEnter(MouseEvent e) { //Do Nothing } }); } /** * Add main tooltip composite */ private void addToolTipComposite() { toolTipComposite = new Composite(this, SWT.NONE); GridLayout gl_composite = new GridLayout(1, false); gl_composite.verticalSpacing = 0; gl_composite.marginWidth = 0; gl_composite.marginHeight = 0; gl_composite.horizontalSpacing = 0; toolTipComposite.setLayout(gl_composite); } /** * Set Layout To Outer Most Container */ private void setLayoutToOuterMostContainer() { GridLayout gridLayout = new GridLayout(1, false); gridLayout.verticalSpacing = 0; gridLayout.marginWidth = 0; gridLayout.marginHeight = 0; gridLayout.horizontalSpacing = 0; setLayout(gridLayout); } public String getComponentName() { return componentName; } public void setComponentName(String name) { this.componentName = name; } /** * Create contents of the shell. */ protected void createContents() { setText("SWT Application"); setSize(this.computeSize(SWT.DEFAULT, SWT.DEFAULT)); } @Override protected void checkSubclass() { // Disable the check that prevents subclassing of SWT components } }