--- /dev/null
+/*\r
+* Common\r
+*\r
+* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
+*\r
+* Contact: \r
+* Ho Namkoong <ho.namkoong@samsung.com>\r
+* \r
+* Licensed under the Apache License, Version 2.0 (the "License");\r
+* you may not use this file except in compliance with the License.\r
+* You may obtain a copy of the License at\r
+*\r
+* http://www.apache.org/licenses/LICENSE-2.0\r
+*\r
+* Unless required by applicable law or agreed to in writing, software\r
+* distributed under the License is distributed on an "AS IS" BASIS,\r
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+* See the License for the specific language governing permissions and\r
+* limitations under the License.\r
+*\r
+* Contributors:\r
+* - S-Core Co., Ltd\r
+*\r
+*/\r
+\r
+package org.tizen.common.ui;\r
+\r
+import java.net.MalformedURLException;\r
+import java.net.URL;\r
+\r
+import org.eclipse.jface.window.DefaultToolTip;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.SelectionAdapter;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.events.SelectionListener;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.Cursor;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.layout.GridLayout;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Event;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Link;\r
+import org.eclipse.swt.widgets.Listener;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.ui.PlatformUI;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.tizen.common.util.OpenBrowserUtil;\r
+import org.tizen.common.util.StringUtil;\r
+\r
+public class HelpToolTip extends DefaultToolTip {\r
+ final Logger logger = LoggerFactory.getLogger(HelpToolTip.class);\r
+\r
+ private Cursor helpCursor;\r
+ private TooltipShowListener showListener;\r
+ private TooltipHideListener hideListener;\r
+ private Composite composite;\r
+ private Control tooltipControl;\r
+ private int popupDelay;\r
+ private boolean showOnMouseDown;\r
+ private boolean focusOnHover;\r
+ private SelectionListener linkListener;\r
+\r
+ public HelpToolTip(Composite c) {\r
+ this(c, true, false);\r
+ }\r
+\r
+ public HelpToolTip(Composite c, boolean showOnMouseDown, boolean hideOnMouseDown) {\r
+ super(HelpToolTip.createHelpIcon(c), NO_RECREATE, false);\r
+ tooltipControl = (Control) getToolTipArea(null);\r
+ helpCursor = new Cursor(tooltipControl.getShell().getDisplay(), SWT.CURSOR_HAND);\r
+ tooltipControl.setCursor(helpCursor);\r
+ showListener = new TooltipShowListener();\r
+ hideListener = new TooltipHideListener();\r
+ linkListener = new TooltipSelectionListener();\r
+ tooltipControl.addListener(SWT.MouseDown, showListener);\r
+\r
+ setPopupDelay(1000);\r
+ setShowOnMouseDown(showOnMouseDown);\r
+ setHideOnMouseDown(hideOnMouseDown);\r
+ }\r
+\r
+ @Override\r
+ public void deactivate() {\r
+ super.deactivate();\r
+ if (tooltipControl != null)\r
+ tooltipControl.removeListener(SWT.MouseDown, showListener);\r
+ }\r
+\r
+ @Override\r
+ public void activate() {\r
+ super.activate();\r
+ setShowOnMouseDown(showOnMouseDown);\r
+ }\r
+\r
+ @Override\r
+ protected final Composite createToolTipContentArea(Event event, Composite parent) {\r
+ composite = doCreateToolTipContentArea(event, parent);\r
+ tooltipControl.removeListener(SWT.MouseDown, showListener);\r
+ if (composite != null)\r
+ tooltipControl.addListener(SWT.MouseExit, hideListener);\r
+ return composite;\r
+ }\r
+\r
+ protected Composite doCreateToolTipContentArea(Event event, Composite parent) {\r
+ String text = getText(event);\r
+ Color fgColor = getForegroundColor(event);\r
+ Color bgColor = getBackgroundColor(event);\r
+ Font font = getFont(event);\r
+ SelectionListener listener = getLinkListener(event);\r
+ Composite composite = new Composite(parent, 0);\r
+ composite.setLayout(new GridLayout());\r
+ Control label;\r
+\r
+ if (listener != null) {\r
+ setFocusOnHover(true);\r
+ label = new Link(composite, getStyle(event) | 0x40);\r
+ ((Link) label).addSelectionListener(listener);\r
+ if (text != null)\r
+ ((Link) label).setText(text);\r
+ } else {\r
+ label = new Label(composite, getStyle(event) | 0x40);\r
+ if (text != null)\r
+ ((Label) label).setText(text);\r
+ }\r
+\r
+ if (label.computeSize(-1, -1).x > 350) {\r
+ GridData gd = new GridData();\r
+ gd.widthHint = 350;\r
+ label.setLayoutData(gd);\r
+ }\r
+ if (fgColor != null)\r
+ label.setForeground(fgColor);\r
+ if (bgColor != null) {\r
+ composite.setBackground(bgColor);\r
+ label.setBackground(bgColor);\r
+ }\r
+ if (font != null)\r
+ label.setFont(font);\r
+\r
+ return composite;\r
+ }\r
+\r
+ protected void afterHideToolTip(Event event) {\r
+ tooltipControl.removeListener(SWT.MouseDown, showListener);\r
+ if (showOnMouseDown)\r
+ tooltipControl.addListener(SWT.MouseDown, showListener);\r
+ tooltipControl.removeListener(SWT.MouseExit, hideListener);\r
+\r
+ super.afterHideToolTip(event);\r
+ }\r
+\r
+ public void setPopupDelay(int popupDelay) {\r
+ this.popupDelay = popupDelay;\r
+ super.setPopupDelay(popupDelay);\r
+ }\r
+\r
+ protected SelectionListener getLinkListener(Event event) {\r
+ return linkListener;\r
+ }\r
+\r
+ public void setShowOnMouseDown(boolean showOnMouseDown) {\r
+ this.showOnMouseDown = showOnMouseDown;\r
+ if (tooltipControl != null) {\r
+ tooltipControl.removeListener(SWT.MouseDown, showListener);\r
+ if (showOnMouseDown)\r
+ tooltipControl.addListener(SWT.MouseDown, showListener);\r
+ }\r
+ }\r
+\r
+ public boolean isShowOnMouseDown() {\r
+ return showOnMouseDown;\r
+ }\r
+\r
+ public void setFocusOnHover(boolean focusOnHover) {\r
+ this.focusOnHover = focusOnHover;\r
+ }\r
+\r
+ public boolean isFocusOnHover() {\r
+ return focusOnHover;\r
+ }\r
+\r
+ private static Label createHelpIcon(Composite c) {\r
+ Label helpIcon = new Label(c, SWT.NONE);\r
+ helpIcon.setImage(PlatformUI.getWorkbench().getSharedImages().getImage("IMG_LCL_LINKTO_HELP"));\r
+ return helpIcon;\r
+ }\r
+\r
+ public void dispose() {\r
+ if (helpCursor != null)\r
+ helpCursor.dispose();\r
+ }\r
+\r
+ class TooltipShowListener implements Listener {\r
+ @Override\r
+ public void handleEvent(Event event) {\r
+ switch (event.type) {\r
+ case SWT.MouseDown :\r
+ hide();\r
+ setPopupDelay(0);\r
+ Point cursorAbsLocation = tooltipControl.getDisplay().getCursorLocation();\r
+ Point containerAbsLocation = tooltipControl.getParent().toDisplay(tooltipControl.getLocation());\r
+ int relativeX = cursorAbsLocation.x - containerAbsLocation.x;\r
+ int relativeY = cursorAbsLocation.y - containerAbsLocation.y;\r
+ show(new Point(relativeX, relativeY));\r
+ setPopupDelay(popupDelay);\r
+\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ class TooltipHideListener implements Listener {\r
+ @Override\r
+ public void handleEvent(Event event) {\r
+ if (composite.isDisposed())\r
+ return;\r
+\r
+ Shell shell = composite.getShell();\r
+ switch (event.type) {\r
+ case SWT.MouseUp :\r
+ case SWT.MouseMove :\r
+ case SWT.MouseEnter :\r
+ break;\r
+ case SWT.MouseDown :\r
+ if (isHideOnMouseDown())\r
+ hide();\r
+\r
+ break;\r
+ case SWT.MouseExit :\r
+ if (!shell.getBounds().contains(composite.getDisplay().getCursorLocation())) {\r
+ hide();\r
+ break;\r
+ }\r
+ if (focusOnHover) {\r
+ shell.setActive();\r
+ composite.setFocus();\r
+ }\r
+\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ class TooltipSelectionListener extends SelectionAdapter {\r
+ public void widgetSelected(SelectionEvent e) {\r
+ hide();\r
+ String link = e.text.toLowerCase();\r
+ if (link == null)\r
+ return;\r
+ if (link.startsWith("http://"))\r
+ try {\r
+ OpenBrowserUtil.openExternal(new URL(e.text), tooltipControl.getDisplay());\r
+ } catch (MalformedURLException e1) {\r
+ logger.error(e1.getMessage());\r
+ }\r
+ else if (link.startsWith("help://")) {\r
+ // help://org.tizen.native.appprogramming/html/ide_sdk_tools/project_settings.htm -> /org.tizen.native.appprogramming/html/ide_sdk_tools/project_settings.htm\r
+ PlatformUI.getWorkbench().getHelpSystem().displayHelpResource("/" + StringUtil.removeStart(link, "help://"));\r
+ }\r
+ }\r
+ }\r
+}\r