org.jboss.tools.as.wst.server.ui.xpl.ServerToolTip.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.as.wst.server.ui.xpl.ServerToolTip.java

Source

/**********************************************************************
 * 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.jboss.tools.as.wst.server.ui.xpl;

import java.io.IOException;
import java.io.StringReader;
import java.util.Iterator;

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.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

public abstract class ServerToolTip extends ToolTip {
    protected Shell FOCUSSED_TOOLTIP;
    protected Object tooltipSelection;
    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 CustomKeyListener(true, true));
    }

    // Created a key listener to add it to both the shell and the styledText of the focussed tooltip
    private class CustomKeyListener implements KeyListener {
        private boolean handleEscape, handlef6;

        public CustomKeyListener(boolean handlesEscape, boolean handlesf6) {
            this.handleEscape = handlesEscape;
            this.handlef6 = handlesf6;
        }

        public void keyPressed(KeyEvent e) {
            if (e == null)
                return;
            if (handleEscape && e.keyCode == SWT.ESC)
                handleEscape();
            if (handlef6 && e.keyCode == SWT.F6)
                handlef6();
        }

        public void keyReleased(KeyEvent e) {
        }
    };

    protected void handleEscape() {
        if (FOCUSSED_TOOLTIP != null) {
            FOCUSSED_TOOLTIP.dispose();
            FOCUSSED_TOOLTIP = null;
            tooltipSelection = null;
        }
        activate();
    }

    protected void handlef6() {
        // We have no focussed window, and we DO have a selection to show in focus
        if (FOCUSSED_TOOLTIP == null && tooltipSelection != null) {
            deactivate();
            hide();
            createFocusedTooltip(tree);
        }
    }

    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));
        stickyTooltip.addShellListener(new ShellAdapter() {
            public void shellClosed(ShellEvent e) {
                handleEscape();
            }
        });
        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("Press 'ESC' to Hide.");
                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);
            }
        });
        FOCUSSED_TOOLTIP = stickyTooltip;
    }

    @Override
    protected Object getToolTipArea(Event event) {
        Object o = tree.getItem(new Point(event.x, event.y));
        return o;
    }

    protected boolean shouldCreateToolTip(Event event) {
        if (tree.getItem(new Point(event.x, event.y)) == null)
            return false;
        /* JBT:  Added this check */
        Object o = tree.getItem(new Point(event.x, event.y));
        boolean ret;
        if (o instanceof TreeItem && !isMyType(((TreeItem) o).getData()))
            ret = false;
        else
            ret = super.shouldCreateToolTip(event);
        if (!ret)
            tooltipSelection = null;
        return ret;
    }

    /*
     * JBT:  Added a method
     */
    protected abstract boolean isMyType(Object selected);

    protected abstract void fillStyledText(Composite parent, StyledText sText, Object o);

    protected Composite createToolTipContentArea(Event event, Composite parent) {
        Object o = tree.getItem(new Point(event.x, event.y));
        if (o == null)
            return null;
        tooltipSelection = o;

        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());
        sText.addKeyListener(new CustomKeyListener(true, false));

        fillStyledText(parent, sText, o);

        // add the F6 text 
        hintLabel = new Label(parent, SWT.BORDER);
        hintLabel.setAlignment(SWT.RIGHT);
        hintLabel.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
        hintLabel.setText("Press 'F6' for Focus.");
        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);
        }
    }
}