blob: 0e5024d9675470bb7d43f7b587449231e4619b5d [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2007, 2011 IBM Corporation and others.
* 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:
* IBM Corporation - Initial API and implementation
**********************************************************************/
package org.eclipse.wst.server.ui.internal;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.internal.text.html.HTML2TextReader;
import org.eclipse.jface.text.TextPresentation;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.wst.server.core.*;
import org.eclipse.wst.server.ui.IServerModule;
import org.eclipse.wst.server.ui.internal.provisional.IServerToolTip;
public class ServerToolTip extends ToolTip {
protected Hashtable<String,ArrayList<IServerToolTip>> toolTipProviders = new Hashtable<String,ArrayList<IServerToolTip>>();
protected static Shell CURRENT_TOOLTIP;
protected Label hintLabel;
protected Tree tree;
protected int x;
protected int y;
public ServerToolTip(final Tree tree) {
super(tree);
this.tree = tree;
tree.addMouseMoveListener(new MouseMoveListener() {
public void mouseMove(MouseEvent e) {
x = e.x;
y = e.y;
}
});
tree.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if (e == null)
return;
if (e.keyCode == SWT.ESC) {
if (CURRENT_TOOLTIP != null) {
CURRENT_TOOLTIP.dispose();
CURRENT_TOOLTIP = null;
}
activate();
}
if (e.keyCode == SWT.F6) {
if (CURRENT_TOOLTIP == null) {
deactivate();
hide();
createFocusedTooltip(tree);
}
}
}
public void keyReleased(KeyEvent e){
// nothing to do
}
});
loadExtensions();
}
public void createFocusedTooltip(final Control control) {
final Shell stickyTooltip = new Shell(control.getShell(), SWT.ON_TOP | SWT.TOOL
| SWT.NO_FOCUS);
stickyTooltip.setLayout(new FillLayout());
stickyTooltip.setBackground(stickyTooltip.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
control.getDisplay().asyncExec(new Runnable() {
public void run() {
Event event = new Event();
event.x = x;
event.y = y;
event.widget = tree;
createToolTipContentArea(event, stickyTooltip);
stickyTooltip.pack();
stickyTooltip.setLocation(stickyTooltip.getDisplay().getCursorLocation());
hintLabel.setText(Messages.toolTipDisableFocus);
stickyTooltip.setVisible(true);
// Eventually we want to add a listener that checks if
// the mouseDown event is occurring outside of the bounds of the tooltip
// if it is, then hide the tooltip
// addListener(stickyTooltip);
}
});
CURRENT_TOOLTIP = stickyTooltip;
}
// read the createFocusedTooltip method for information on why this is commented out
//
// private void addListener(Control control){
// control.addMouseListener(new StickyTipMouseListener());
// if (control instanceof Composite){
// Control[] childrens = ((Composite)control).getChildren();
// for (Control child :childrens){
// addListener(child);
// }
// }
//
// }
@Override
protected Object getToolTipArea(Event event) {
Object o = tree.getItem(new Point(event.x,event.y));
return o;
}
protected final boolean shouldCreateToolTip(Event event) {
if (tree.getItem(new Point(event.x, event.y)) == null)
return false;
return super.shouldCreateToolTip(event);
}
protected Composite createToolTipContentArea(Event event, Composite parent) {
Object o = tree.getItem(new Point(event.x, event.y));
if (o == null)
return null;
IServer server = null;
IServerModule module = null;
if (o instanceof TreeItem) {
Object obj = ((TreeItem)o).getData();
if (obj instanceof IServer)
server = (IServer) obj;
if (obj instanceof IServerModule)
module = (IServerModule) obj;
}
FillLayout layout = (FillLayout)parent.getLayout();
layout.type = SWT.VERTICAL;
parent.setLayout(layout);
parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
// set the default text for the tooltip
StyledText sText = new StyledText(parent, SWT.NONE);
sText.setEditable(false);
sText.setBackground(parent.getBackground());
if (module != null) {
IModule[] modules = module.getModule();
IModule m = modules[modules.length - 1];
sText.setText("<b>" + m.getName() + "</b>");
//sText.setText("<b>" + m.getName() + "</b></p>" + m.getModuleType().getName());
StyledText sText2 = new StyledText(parent, SWT.NONE);
sText2.setEditable(false);
sText2.setBackground(parent.getBackground());
sText2.setText(m.getModuleType().getName());
}
if (server != null) {
sText.setText("<b>" + server.getName() + "</b>");
// add adopters content
if (server.getServerType() != null) {
ArrayList<IServerToolTip> listOfProviders = toolTipProviders.get(server.getServerType().getId());
if (listOfProviders != null) {
for (IServerToolTip tipProvider : listOfProviders) {
tipProvider.createContent(parent,server);
}
}
}
}
// add the F3 text
hintLabel = new Label(parent,SWT.BORDER);
hintLabel.setAlignment(SWT.RIGHT);
hintLabel.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
hintLabel.setText(Messages.toolTipEnableFocus);
hintLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
final Font font;
Display display = parent.getDisplay();
FontData[] fd = parent.getFont().getFontData();
int size2 = fd.length;
for (int i = 0; i < size2; i++)
fd[i].setHeight(7);
font = new Font(display, fd);
parent.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
font.dispose();
}
});
hintLabel.setFont(font);
parseText(sText.getText(),sText);
return parent;
}
protected void parseText(String htmlText,StyledText sText) {
TextPresentation presentation = new TextPresentation();
HTML2TextReader reader = new HTML2TextReader(new StringReader(htmlText), presentation);
String text;
try {
text = reader.getString();
} catch (IOException e) {
text= ""; //$NON-NLS-1$
}
sText.setText(text);
Iterator iter = presentation.getAllStyleRangeIterator();
while (iter.hasNext()) {
StyleRange sr = (StyleRange)iter.next();
sText.setStyleRange(sr);
}
}
private void loadExtensions() {
if (Trace.EXTENSION_POINT) {
Trace.trace(Trace.STRING_EXTENSION_POINT, "->- Loading serverToolTip extension point ->-");
}
// search for extension points
IExtensionRegistry reg = Platform.getExtensionRegistry();
IConfigurationElement[] extensions = reg.getConfigurationElementsFor(ServerUIPlugin.PLUGIN_ID + ".serverToolTip");
IServerType[] serverTypes = ServerCore.getServerTypes();
for (int i=0; i < extensions.length; i++){
IConfigurationElement exElement = extensions[i];
try {
// sort the extensions based on serverType
String exServerType = exElement.getAttribute("serverTypes");
for (IServerType serverType : serverTypes) {
if ("*".equals(exServerType) || serverType.getId().matches(exServerType)) {
IServerToolTip exTooltip = (IServerToolTip) exElement.createExecutableExtension("class");
ArrayList<IServerToolTip> listOfProviders = new ArrayList<IServerToolTip>();
if (toolTipProviders.containsKey(serverType.getId()))
listOfProviders = toolTipProviders.get(serverType.getId());
listOfProviders.add(exTooltip);
toolTipProviders.put(serverType.getId(), listOfProviders);
if (Trace.EXTENSION_POINT) {
Trace.trace(Trace.STRING_EXTENSION_POINT,
" Loaded serverToolTip: " + exElement.getAttribute("id") + " for server type: "
+ serverType.getId());
}
}
}
} catch (CoreException e) {
if (Trace.SEVERE) {
Trace.trace(Trace.STRING_SEVERE, "Tooltip failed to load" + exElement.toString(), e);
}
}
}
if (Trace.EXTENSION_POINT) {
Trace.trace(Trace.STRING_EXTENSION_POINT, "-<- Done loading serverToolTip extension point -<-");
}
}
// read the createFocusedTooltip method for information on why this is commented out
//
// protected class StickyTipMouseListener implements MouseListener{
//
// public void mouseDoubleClick(MouseEvent e) {
// // Auto-generated method stub
//
// }
//
// public void mouseDown(MouseEvent e) {
// //System.out.println("mouseDown");
// if (CURRENT_TOOLTIP.getBounds().contains(new Point(e.x,e.y)) == true){
// CURRENT_TOOLTIP.setVisible(false);
// CURRENT_TOOLTIP.dispose();
// activate();
// CURRENT_TOOLTIP.removeMouseListener(this);
// }
// }
//
// public void mouseUp(MouseEvent e) {
// // Auto-generated method stub
// }
// }
}