[jbosstools-commits] JBoss Tools SVN: r42636 - in trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink: xpl and 1 other directory.

jbosstools-commits at lists.jboss.org jbosstools-commits at lists.jboss.org
Wed Jul 18 19:27:10 EDT 2012


Author: scabanovich
Date: 2012-07-18 19:27:09 -0400 (Wed, 18 Jul 2012)
New Revision: 42636

Added:
   trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/InformationControlManager.java
   trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/AbstractInformationControl.java
   trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/HierarchyInformationControl.java
   trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/InformationPresenter.java
   trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/MultipleHyperlinkPresenter.java
Log:
JBIDE-12295
https://issues.jboss.org/browse/JBIDE-12295
Open-on of multiple declarations of ui:param with the same name are supported.

Added: trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/InformationControlManager.java
===================================================================
--- trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/InformationControlManager.java	                        (rev 0)
+++ trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/InformationControlManager.java	2012-07-18 23:27:09 UTC (rev 42636)
@@ -0,0 +1,54 @@
+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ * Distributed under license by Red Hat, Inc. All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ ******************************************************************************/ 
+package org.jboss.tools.common.text.ext.hyperlink;
+
+import org.eclipse.jface.text.AbstractInformationControlManager;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+import org.jboss.tools.common.text.ext.hyperlink.xpl.HierarchyInformationControl;
+import org.jboss.tools.common.text.ext.hyperlink.xpl.InformationPresenter;
+
+public class InformationControlManager {
+	public static final InformationControlManager instance = new InformationControlManager();
+
+	public IInformationControl showHyperlinks(String title, ITextViewer viewer, IHyperlink[] hyperlinks){
+		return showHyperlinks(title, viewer, hyperlinks, false);
+	}
+	
+	public IInformationControl showHyperlinks(String title, ITextViewer viewer, IHyperlink[] hyperlinks, boolean test){
+		InformationPresenter presenter= new InformationPresenter(viewer, getHierarchyPresenterControlCreator(title, hyperlinks));
+		presenter.setAnchor(AbstractInformationControlManager.ANCHOR_GLOBAL);
+		presenter.setSizeConstraints(60, 10, true, false);
+		presenter.install(viewer.getTextWidget());
+		if(test){
+			return presenter.showInformationForTest();
+		} else {
+			presenter.showInformation();
+			return null;
+		}
+	}
+	
+	protected IInformationControlCreator getHierarchyPresenterControlCreator(final String title, final IHyperlink[] hyperlinks) {
+		return new IInformationControlCreator() {
+			public IInformationControl createInformationControl(Shell parent) {
+				int shellStyle= SWT.RESIZE;
+				int treeStyle= SWT.V_SCROLL | SWT.H_SCROLL;
+				HierarchyInformationControl iControl = new HierarchyInformationControl(parent, title, shellStyle, treeStyle, hyperlinks);
+				iControl.setInput(hyperlinks);
+				return iControl;
+			}
+		};
+	}
+}


Property changes on: trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/InformationControlManager.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Copied: trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/AbstractInformationControl.java (from rev 42449, trunk/cdi/plugins/org.jboss.tools.cdi.text.ext/src/org/jboss/tools/cdi/text/ext/hyperlink/xpl/AbstractInformationControl.java)
===================================================================
--- trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/AbstractInformationControl.java	                        (rev 0)
+++ trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/AbstractInformationControl.java	2012-07-18 23:27:09 UTC (rev 42636)
@@ -0,0 +1,708 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 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
+ *     Red Hat, Inc.
+ *******************************************************************************/
+package org.jboss.tools.common.text.ext.hyperlink.xpl;
+
+import java.util.List;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.util.StringMatcher;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.PopupDialog;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlExtension;
+import org.eclipse.jface.text.IInformationControlExtension2;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Item;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbenchCommandConstants;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ActionHandler;
+import org.eclipse.ui.commands.HandlerSubmission;
+import org.eclipse.ui.commands.ICommand;
+import org.eclipse.ui.commands.ICommandManager;
+import org.eclipse.ui.commands.IKeySequenceBinding;
+import org.eclipse.ui.commands.Priority;
+import org.eclipse.ui.keys.KeySequence;
+
+/**
+ * Abstract class for Show hierarchy in light-weight controls.
+ *
+ * @since 2.1
+ */
+public abstract class AbstractInformationControl extends PopupDialog implements IInformationControl, IInformationControlExtension, IInformationControlExtension2, DisposeListener {
+
+	/** The control's text widget */
+	private Text fFilterText;
+	/** The control's table widget */
+	private TableViewer fTableViewer;
+	/** The current string matcher */
+	protected StringMatcher fStringMatcher;
+	private ICommand fInvokingCommand;
+	private KeySequence[] fInvokingCommandKeySequences;
+
+	/**
+	 * Fields that support the dialog menu
+	 * @since 3.0
+	 * @since 3.2 - now appended to framework menu
+	 */
+	private Composite fViewMenuButtonComposite;
+
+	private IAction fShowViewMenuAction;
+	private HandlerSubmission fShowViewMenuHandlerSubmission;
+
+	/**
+	 * Field for table style since it must be remembered by the instance.
+	 *
+	 * @since 3.2
+	 */
+	private int fTableStyle;
+
+	/**
+	 * The initially selected type.
+	 * @since 3.5
+	 */
+	protected IType fInitiallySelectedType;
+
+	/**
+	 * Creates a table information control with the given shell as parent. The given
+	 * styles are applied to the shell and the table widget.
+	 *
+	 * @param parent the parent shell
+	 * @param shellStyle the additional styles for the shell
+	 * @param tableStyle the additional styles for the table widget
+	 * @param invokingCommandId the id of the command that invoked this control or <code>null</code>
+	 * @param showStatusField <code>true</code> iff the control has a status field at the bottom
+	 */
+	public AbstractInformationControl(Shell parent, int shellStyle, int tableStyle, String invokingCommandId, boolean showStatusField) {
+		super(parent, shellStyle, true, true, false, true, true, null, null);
+		if (invokingCommandId != null) {
+			ICommandManager commandManager= PlatformUI.getWorkbench().getCommandSupport().getCommandManager();
+			fInvokingCommand= commandManager.getCommand(invokingCommandId);
+			if (fInvokingCommand != null && !fInvokingCommand.isDefined())
+				fInvokingCommand= null;
+			else
+				// Pre-fetch key sequence - do not change because scope will change later.
+				getInvokingCommandKeySequences();
+		}
+		fTableStyle= tableStyle;
+		// Title and status text must be set to get the title label created, so force empty values here.
+		if (hasHeader())
+			setTitleText(""); //$NON-NLS-1$
+		setInfoText(""); //  //$NON-NLS-1$
+
+		// Create all controls early to preserve the life cycle of the original implementation.
+		create();
+
+		// Status field text can only be computed after widgets are created.
+		setInfoText(getStatusFieldText());
+	}
+
+	/**
+	 * Create the main content for this information control.
+	 *
+	 * @param parent The parent composite
+	 * @return The control representing the main content.
+	 * @since 3.2
+	 */
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		fTableViewer= createTableViewer(parent, fTableStyle);
+
+		final Table table= fTableViewer.getTable();
+		table.addKeyListener(new KeyListener() {
+			public void keyPressed(KeyEvent e)  {
+				if (e.character == 0x1B) // ESC
+					dispose();
+			}
+			public void keyReleased(KeyEvent e) {
+				// do nothing
+			}
+		});
+
+		table.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				// do nothing
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+				gotoSelectedElement();
+			}
+		});
+
+		table.addMouseMoveListener(new MouseMoveListener()	 {
+			TableItem fLastItem= null;
+			public void mouseMove(MouseEvent e) {
+				if (table.equals(e.getSource())) {
+					Object o= table.getItem(new Point(e.x, e.y));
+					if (fLastItem == null ^ o == null) {
+						table.setCursor(o == null ? null : table.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
+					}
+					if (o instanceof TableItem) {
+						Rectangle clientArea = table.getClientArea();
+						if (!o.equals(fLastItem)) {
+							fLastItem= (TableItem)o;
+							table.setSelection(new TableItem[] { fLastItem });
+						} else if (e.y - clientArea.y < table.getItemHeight() / 4) {
+							// Scroll up
+							Point p= table.toDisplay(e.x, e.y);
+							Item item= fTableViewer.scrollUp(p.x, p.y);
+							if (item instanceof TableItem) {
+								fLastItem= (TableItem)item;
+								table.setSelection(new TableItem[] { fLastItem });
+							}
+						} else if (clientArea.y + clientArea.height - e.y < table.getItemHeight() / 4) {
+							// Scroll down
+							Point p= table.toDisplay(e.x, e.y);
+							Item item= fTableViewer.scrollDown(p.x, p.y);
+							if (item instanceof TableItem) {
+								fLastItem= (TableItem)item;
+								table.setSelection(new TableItem[] { fLastItem });
+							}
+						}
+					} else if (o == null) {
+						fLastItem= null;
+					}
+				}
+			}
+		});
+
+		table.addMouseListener(new MouseAdapter() {
+			@Override
+			public void mouseUp(MouseEvent e) {
+
+				if (table.getSelectionCount() < 1)
+					return;
+
+				if (e.button != 1)
+					return;
+
+				if (table.equals(e.getSource())) {
+					Object o= table.getItem(new Point(e.x, e.y));
+					TableItem selection= table.getSelection()[0];
+					if (selection.equals(o))
+						gotoSelectedElement();
+				}
+			}
+		});
+
+		installFilter();
+
+		addDisposeListener(this);
+		return fTableViewer.getControl();
+	}
+
+	/**
+	 * Creates a table information control with the given shell as parent. The given
+	 * styles are applied to the shell and the table widget.
+	 *
+	 * @param parent the parent shell
+	 * @param shellStyle the additional styles for the shell
+	 * @param tableStyle the additional styles for the table widget
+	 */
+	public AbstractInformationControl(Shell parent, int shellStyle, int tableStyle) {
+		this(parent, shellStyle, tableStyle, null, false);
+	}
+
+	protected abstract TableViewer createTableViewer(Composite parent, int style);
+
+	/**
+	 * Returns the name of the dialog settings section.
+	 *
+	 * @return the name of the dialog settings section
+	 */
+	protected abstract String getId();
+
+	protected TableViewer getTableViewer() {
+		return fTableViewer;
+	}
+
+	/**
+	 * Returns <code>true</code> if the control has a header, <code>false</code> otherwise.
+	 * <p>
+	 * The default is to return <code>false</code>.
+	 * </p>
+	 *
+	 * @return <code>true</code> if the control has a header
+	 */
+	protected boolean hasHeader() {
+		// default is to have no header
+		return false;
+	}
+
+	protected Text getFilterText() {
+		return fFilterText;
+	}
+
+	protected Text createFilterText(Composite parent) {
+		fFilterText= new Text(parent, SWT.NONE);
+		Dialog.applyDialogFont(fFilterText);
+
+		GridData data= new GridData(GridData.FILL_HORIZONTAL);
+		data.horizontalAlignment= GridData.FILL;
+		data.verticalAlignment= GridData.CENTER;
+		fFilterText.setLayoutData(data);
+
+		fFilterText.addKeyListener(new KeyListener() {
+			public void keyPressed(KeyEvent e) {
+				if (e.keyCode == 0x0D) // return
+					gotoSelectedElement();
+				if (e.keyCode == SWT.ARROW_DOWN)
+					fTableViewer.getTable().setFocus();
+				if (e.keyCode == SWT.ARROW_UP)
+					fTableViewer.getTable().setFocus();
+				if (e.character == 0x1B) // ESC
+					dispose();
+			}
+			public void keyReleased(KeyEvent e) {
+				// do nothing
+			}
+		});
+
+		return fFilterText;
+	}
+
+	protected void createHorizontalSeparator(Composite parent) {
+		Label separator= new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL | SWT.LINE_DOT);
+		separator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+	}
+
+	protected void updateStatusFieldText() {
+		setInfoText(getStatusFieldText());
+	}
+
+	protected String getStatusFieldText() {
+		return ""; //$NON-NLS-1$
+	}
+
+	private void installFilter() {
+		fFilterText.setText(""); //$NON-NLS-1$
+
+		fFilterText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				fTableViewer.refresh();
+			}
+		});
+	}
+
+
+	protected StringMatcher getMatcher() {
+		return fStringMatcher;
+	}
+
+	/**
+	 * Implementers can modify
+	 *
+	 * @return the selected element
+	 */
+	protected Object getSelectedElement() {
+		if (fTableViewer == null)
+			return null;
+
+		return ((IStructuredSelection) fTableViewer.getSelection()).getFirstElement();
+	}
+
+	private void gotoSelectedElement() {
+		Object selectedElement= getSelectedElement();
+		if (selectedElement instanceof IHyperlink) {
+			((IHyperlink)selectedElement).open();
+		}
+	}
+
+	/**
+	 * Selects the first element in the table which
+	 * matches the current filter pattern.
+	 */
+	protected void selectFirstMatch() {
+		Object selectedElement= fTableViewer.testFindItem(fInitiallySelectedType);
+		TableItem element;
+		final Table table = fTableViewer.getTable();
+		if (selectedElement instanceof TableItem)
+			element= findElement(new TableItem[] { (TableItem)selectedElement });
+		else
+			element= findElement(table.getItems());
+
+		if (element != null) {
+			table.setSelection(element);
+			table.showItem(element);
+		} else
+			fTableViewer.setSelection(StructuredSelection.EMPTY);
+	}
+
+	private TableItem findElement(TableItem[] items) {
+		return findElement(items, null, true);
+	}
+
+	private TableItem findElement(TableItem[] items, TableItem[] toBeSkipped, boolean allowToGoUp) {
+		if (fStringMatcher == null)
+			return items.length > 0 ? items[0] : null;
+
+		ILabelProvider labelProvider= (ILabelProvider)fTableViewer.getLabelProvider();
+
+		// First search at same level
+		for (int i= 0; i < items.length; i++) {
+			final TableItem item= items[i];
+			IHyperlink element= (IHyperlink)item.getData();
+			if (element != null) {
+				String label= labelProvider.getText(element);
+				if (fStringMatcher.match(label))
+					return item;
+			}
+		}
+
+		return null;
+	}
+	
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setInformation(String information) {
+		// this method is ignored, see IInformationControlExtension2
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public abstract void setInput(Object information);
+
+	/**
+	 * Fills the view menu.
+	 * Clients can extend or override.
+	 *
+	 * @param viewMenu the menu manager that manages the menu
+	 * @since 3.0
+	 */
+	protected void fillViewMenu(IMenuManager viewMenu) {
+		//fCustomFiltersActionGroup.fillViewMenu(viewMenu);
+	}
+
+	/*
+	 * Overridden to call the old framework method.
+	 *
+	 * @see org.eclipse.jface.dialogs.PopupDialog#fillDialogMenu(IMenuManager)
+	 * @since 3.2
+	 */
+	@Override
+	protected void fillDialogMenu(IMenuManager dialogMenu) {
+		super.fillDialogMenu(dialogMenu);
+		fillViewMenu(dialogMenu);
+	}
+
+	protected void inputChanged(Object newInput, Object newSelection) {
+		fFilterText.setText(""); //$NON-NLS-1$
+		fInitiallySelectedType= null;
+		fTableViewer.setInput(newInput);
+		if (newSelection != null)
+			fTableViewer.setSelection(new StructuredSelection(newSelection));
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setVisible(boolean visible) {
+		if (visible) {
+			open();
+		} else {
+			removeHandlerAndKeyBindingSupport();
+			saveDialogBounds(getShell());
+			getShell().setVisible(false);
+		}
+	}
+
+	/*
+	 * @see org.eclipse.jface.dialogs.PopupDialog#open()
+	 * @since 3.3
+	 */
+	@Override
+	public int open() {
+		addHandlerAndKeyBindingSupport();
+		return super.open();
+	}
+	
+	protected Control getFocusControl() {
+		return fFilterText;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public final void dispose() {
+		close();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * @param event can be null
+	 * <p>
+	 * Subclasses may extend.
+	 * </p>
+	 */
+	public void widgetDisposed(DisposeEvent event) {
+		removeHandlerAndKeyBindingSupport();
+		fTableViewer= null;
+		fFilterText= null;
+	}
+
+	/**
+	 * Adds handler and key binding support.
+	 *
+	 * @since 3.2
+	 */
+	protected void addHandlerAndKeyBindingSupport() {
+		// Register action with command support
+		if (fShowViewMenuHandlerSubmission == null) {
+			fShowViewMenuHandlerSubmission= new HandlerSubmission(null, getShell(), null, fShowViewMenuAction.getActionDefinitionId(), new ActionHandler(fShowViewMenuAction), Priority.MEDIUM);
+			PlatformUI.getWorkbench().getCommandSupport().addHandlerSubmission(fShowViewMenuHandlerSubmission);
+		}
+	}
+
+	/**
+	 * Removes handler and key binding support.
+	 *
+	 * @since 3.2
+	 */
+	protected void removeHandlerAndKeyBindingSupport() {
+		// Remove handler submission
+		if (fShowViewMenuHandlerSubmission != null)
+			PlatformUI.getWorkbench().getCommandSupport().removeHandlerSubmission(fShowViewMenuHandlerSubmission);
+
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean hasContents() {
+		return fTableViewer != null && fTableViewer.getInput() != null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setSizeConstraints(int maxWidth, int maxHeight) {
+		// ignore
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Point computeSizeHint() {
+		// return the shell's size - note that it already has the persisted size if persisting
+		// is enabled.
+		return getShell().getSize();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setLocation(Point location) {
+		/*
+		 * If the location is persisted, it gets managed by PopupDialog - fine. Otherwise, the location is
+		 * computed in Window#getInitialLocation, which will center it in the parent shell / main
+		 * monitor, which is wrong for two reasons:
+		 * - we want to center over the editor / subject control, not the parent shell
+		 * - the center is computed via the initalSize, which may be also wrong since the size may
+		 *   have been updated since via min/max sizing of AbstractInformationControlManager.
+		 * In that case, override the location with the one computed by the manager. Note that
+		 * the call to constrainShellSize in PopupDialog.open will still ensure that the shell is
+		 * entirely visible.
+		 */
+		if (!getPersistLocation() || getDialogSettings() == null)
+			getShell().setLocation(location);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setSize(int width, int height) {
+		getShell().setSize(width, height);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void addDisposeListener(DisposeListener listener) {
+		getShell().addDisposeListener(listener);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void removeDisposeListener(DisposeListener listener) {
+		getShell().removeDisposeListener(listener);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setForegroundColor(Color foreground) {
+		applyForegroundColor(foreground, getContents());
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setBackgroundColor(Color background) {
+		applyBackgroundColor(background, getContents());
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean isFocusControl() {
+		return getShell().getDisplay().getActiveShell() == getShell();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setFocus() {
+		getShell().forceFocus();
+		fFilterText.setFocus();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void addFocusListener(FocusListener listener) {
+		getShell().addFocusListener(listener);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void removeFocusListener(FocusListener listener) {
+		getShell().removeFocusListener(listener);
+	}
+
+	final protected ICommand getInvokingCommand() {
+		return fInvokingCommand;
+	}
+
+	final protected KeySequence[] getInvokingCommandKeySequences() {
+		if (fInvokingCommandKeySequences == null) {
+			if (getInvokingCommand() != null) {
+				List<IKeySequenceBinding> list= getInvokingCommand().getKeySequenceBindings();
+				if (!list.isEmpty()) {
+					fInvokingCommandKeySequences= new KeySequence[list.size()];
+					for (int i= 0; i < fInvokingCommandKeySequences.length; i++) {
+						fInvokingCommandKeySequences[i]= list.get(i).getKeySequence();
+					}
+					return fInvokingCommandKeySequences;
+				}
+			}
+		}
+		return fInvokingCommandKeySequences;
+	}
+
+	/*
+	 * @see org.eclipse.jface.dialogs.PopupDialog#getDialogSettings()
+	 */
+	@Override
+	protected IDialogSettings getDialogSettings() {
+		String sectionName= getId();
+
+		IDialogSettings settings= JavaPlugin.getDefault().getDialogSettings().getSection(sectionName);
+		if (settings == null)
+			settings= JavaPlugin.getDefault().getDialogSettings().addNewSection(sectionName);
+
+		return settings;
+	}
+
+	/*
+	 * Overridden to insert the filter text into the title and menu area.
+	 *
+	 * @since 3.2
+	 */
+	@Override
+	protected Control createTitleMenuArea(Composite parent) {
+		fViewMenuButtonComposite= (Composite) super.createTitleMenuArea(parent);
+
+		// If there is a header, then the filter text must be created
+		// underneath the title and menu area.
+
+		if (hasHeader()) {
+			fFilterText= createFilterText(parent);
+		}
+
+		// Create show view menu action
+		fShowViewMenuAction= new Action("showViewMenu") { //$NON-NLS-1$
+			/*
+			 * @see org.eclipse.jface.action.Action#run()
+			 */
+			@Override
+			public void run() {
+				showDialogMenu();
+			}
+		};
+		fShowViewMenuAction.setEnabled(true);
+		fShowViewMenuAction.setActionDefinitionId(IWorkbenchCommandConstants.WINDOW_SHOW_VIEW_MENU);
+
+		return fViewMenuButtonComposite;
+	}
+
+	/*
+	 * Overridden to insert the filter text into the title control
+	 * if there is no header specified.
+	 * @since 3.2
+	 */
+	@Override
+	protected Control createTitleControl(Composite parent) {
+		if (hasHeader()) {
+			return super.createTitleControl(parent);
+		}
+		fFilterText= createFilterText(parent);
+		return fFilterText;
+	}
+
+	/*
+	 * @see org.eclipse.jface.dialogs.PopupDialog#setTabOrder(org.eclipse.swt.widgets.Composite)
+	 */
+	@Override
+	protected void setTabOrder(Composite composite) {
+		if (hasHeader()) {
+			composite.setTabList(new Control[] { fFilterText, fTableViewer.getTable() });
+		} else {
+			fViewMenuButtonComposite.setTabList(new Control[] { fFilterText });
+			composite.setTabList(new Control[] { fViewMenuButtonComposite, fTableViewer.getTable() });
+		}
+	}
+}


Property changes on: trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/AbstractInformationControl.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Copied: trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/HierarchyInformationControl.java (from rev 42449, trunk/cdi/plugins/org.jboss.tools.cdi.text.ext/src/org/jboss/tools/cdi/text/ext/hyperlink/xpl/HierarchyInformationControl.java)
===================================================================
--- trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/HierarchyInformationControl.java	                        (rev 0)
+++ trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/HierarchyInformationControl.java	2012-07-18 23:27:09 UTC (rev 42636)
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 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
+ *     Red Hat, Inc.
+ *******************************************************************************/
+package org.jboss.tools.common.text.ext.hyperlink.xpl;
+
+import org.eclipse.jdt.ui.actions.IJavaEditorActionDefinitionIds;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.StyledCellLabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.TextStyle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.ui.dialogs.SearchPattern;
+
+/**
+ * Show hierarchy in light-weight control.
+ *
+ * @since 3.0
+ */
+public class HierarchyInformationControl extends AbstractInformationControl {
+	private IHyperlink[] hyperlinks;
+
+	private BeanTableLabelProvider fLabelProvider;
+
+	public HierarchyInformationControl(Shell parent, String title, int shellStyle, int tableStyle, IHyperlink[] hyperlinks) {
+		super(parent, shellStyle, tableStyle, IJavaEditorActionDefinitionIds.OPEN_HIERARCHY, true);
+		this.hyperlinks = hyperlinks;
+		setTitleText(title);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	protected boolean hasHeader() {
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jdt.internal.ui.text.JavaOutlineInformationControl#createTableViewer(org.eclipse.swt.widgets.Composite, int)
+	 */
+	@Override
+	protected TableViewer createTableViewer(Composite parent, int style) {
+		Table table = new Table(parent, SWT.SINGLE | (style & ~SWT.MULTI));
+		GridData gd= new GridData(GridData.FILL_BOTH);
+		gd.heightHint= table.getItemHeight() * 12;
+		table.setLayoutData(gd);
+
+		TableViewer tableViewer= new TableViewer(table);
+		
+		tableViewer.addFilter(new BeanFilter());
+
+		fLabelProvider= createTableLableProvider();
+
+		tableViewer.setLabelProvider(fLabelProvider);
+
+		return tableViewer;
+	}
+
+	protected BeanTableLabelProvider createTableLableProvider() {
+		return new BeanTableLabelProvider();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void setInput(Object information) {
+		if(!(information instanceof IHyperlink[])){
+			inputChanged(null, null);
+			return;
+		}
+		
+		hyperlinks = (IHyperlink[])information;
+
+		BeanTableContentProvider contentProvider= new BeanTableContentProvider(hyperlinks);
+		getTableViewer().setContentProvider(contentProvider);
+
+
+		inputChanged(hyperlinks, hyperlinks[0]);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	protected Object getSelectedElement() {
+		Object selectedElement= super.getSelectedElement();
+		return selectedElement;
+	}
+
+	@Override
+	protected String getId() {
+		return "org.jboss.tools.cdi.text.ext.InformationControl";
+	}
+	
+	public static class BeanTableContentProvider implements IStructuredContentProvider{
+		private IHyperlink[] hyperlinks;
+		
+		public BeanTableContentProvider(IHyperlink[] beans){
+			this.hyperlinks = beans;
+		}
+
+		@Override
+		public void dispose() {
+		}
+
+		@Override
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
+
+		@Override
+		public Object[] getElements(Object inputElement) {
+			return hyperlinks;
+		}
+
+	}
+	
+	protected boolean select2(SearchPattern patternMatcher, Object element) {
+		return true;
+	}
+
+	public class BeanFilter extends ViewerFilter {
+		SearchPattern patternMatcher = new SearchPattern();
+		public boolean isConsistentItem(Object item) {
+			return true;
+		}
+
+		public boolean select(Viewer viewer, Object parentElement,
+	            Object element) {
+			return select2(patternMatcher, element);
+		}
+		
+	}
+
+	protected static Color gray = new Color(null, 128, 128, 128);
+	protected static Color black = new Color(null, 0, 0, 0);
+
+	protected static Styler NAME_STYLE = new DefaultStyler(black, false);
+	protected static Styler PACKAGE_STYLE = new DefaultStyler(gray, false);
+	
+	private static class DefaultStyler extends Styler {
+		private final Color foreground;
+		private final boolean italic;
+
+		public DefaultStyler(Color foreground, boolean italic) {
+			this.foreground = foreground;
+			this.italic = italic;
+		}
+
+		public void applyStyles(TextStyle textStyle) {
+			if (foreground != null) {
+				textStyle.foreground = foreground;
+			}
+			if(italic) {
+				textStyle.font = JFaceResources.getFontRegistry().getItalic(JFaceResources.DEFAULT_FONT);
+			}
+		}
+	}
+	
+	protected class BeanTableLabelProvider extends StyledCellLabelProvider implements DelegatingStyledCellLabelProvider.IStyledLabelProvider {
+		public void update(ViewerCell cell) {
+			Object element = cell.getElement();
+			StyledString styledString = getStyledText(element);
+			cell.setText(styledString.getString());
+			cell.setStyleRanges(styledString.getStyleRanges());
+			cell.setImage(getImage(element));
+
+			super.update(cell);
+		}
+
+		public String getText(Object element) {
+			return getStyledText(element).getString();
+		}
+		public StyledString getStyledText(Object element) {
+			StyledString sb = new StyledString();
+			if(element instanceof IHyperlink){
+				sb.append(((IHyperlink)element).getHyperlinkText(), NAME_STYLE);
+			}
+			return sb;
+		}
+
+		public Image getImage(Object element) {
+			return null;
+		}		
+	}
+}
+


Property changes on: trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/HierarchyInformationControl.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Copied: trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/InformationPresenter.java (from rev 42449, trunk/cdi/plugins/org.jboss.tools.cdi.text.ext/src/org/jboss/tools/cdi/text/ext/hyperlink/xpl/InformationPresenter.java)
===================================================================
--- trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/InformationPresenter.java	                        (rev 0)
+++ trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/InformationPresenter.java	2012-07-18 23:27:09 UTC (rev 42636)
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 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
+ *     Red Hat, Inc.
+ *******************************************************************************/
+package org.jboss.tools.common.text.ext.hyperlink.xpl;
+
+import org.eclipse.jface.text.AbstractInformationControlManager;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.IViewportListener;
+import org.eclipse.jface.util.Geometry;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+public class InformationPresenter extends AbstractInformationControlManager{
+	private ITextViewer viwer;
+
+	public InformationPresenter(ITextViewer viwer, IInformationControlCreator creator) {
+		super(creator);
+		this.viwer = viwer;
+		setCloser(new Closer());
+	}
+
+	@Override
+	public void showInformation() {
+		showInformation_internal(false);
+	}
+	
+	private IInformationControl showInformation_internal(boolean test){
+		IInformationControl iControl = getInformationControl();
+		Point sizeConstraints= computeSizeConstraints(viwer.getTextWidget(), null, iControl);
+		iControl.setSizeConstraints(sizeConstraints.x, sizeConstraints.y);
+		Point size= null;
+		Rectangle bounds= restoreInformationControlBounds();
+
+		if (bounds != null) {
+			if (bounds.width > -1 && bounds.height > -1)
+				size= Geometry.getSize(bounds);
+		}
+
+		if (size == null)
+			size= iControl.computeSizeHint();
+
+		size= Geometry.max(size, sizeConstraints);
+
+		iControl.setSize(size.x, size.y);
+		if(test){
+			((HierarchyInformationControl)iControl).setBlockOnOpen(false);
+		}
+		iControl.setVisible(true);
+		return iControl;
+	}
+	
+	public IInformationControl showInformationForTest(){
+		return showInformation_internal(true);
+	}
+
+	@Override
+	protected void computeInformation() {
+		setInformation("Information", new Rectangle(1,1,100,100));
+	}
+	
+	class Closer implements IInformationControlCloser, ControlListener, MouseListener, FocusListener, IViewportListener, KeyListener {
+
+		/** The subject control. */
+		private Control fSubjectControl;
+		/** The information control. */
+		private IInformationControl fInformationControlToClose;
+		/** Indicates whether this closer is active. */
+		private boolean fIsActive= false;
+
+		/*
+		 * @see IInformationControlCloser#setSubjectControl(Control)
+		 */
+		public void setSubjectControl(Control control) {
+			fSubjectControl= control;
+		}
+
+		/*
+		 * @see IInformationControlCloser#setInformationControl(IInformationControl)
+		 */
+		public void setInformationControl(IInformationControl control) {
+			fInformationControlToClose= control;
+		}
+
+		/*
+		 * @see IInformationControlCloser#start(Rectangle)
+		 */
+		public void start(Rectangle informationArea) {
+
+			if (fIsActive)
+				return;
+			fIsActive= true;
+
+			if (fSubjectControl != null && !fSubjectControl.isDisposed()) {
+				fSubjectControl.addControlListener(this);
+				fSubjectControl.addMouseListener(this);
+				fSubjectControl.addFocusListener(this);
+				fSubjectControl.addKeyListener(this);
+			}
+
+			if (fInformationControlToClose != null)
+				fInformationControlToClose.addFocusListener(this);
+
+			viwer.addViewportListener(this);
+		}
+
+		/*
+		 * @see IInformationControlCloser#stop()
+		 */
+		public void stop() {
+
+			if (!fIsActive)
+				return;
+			fIsActive= false;
+
+			viwer.removeViewportListener(this);
+
+			if (fInformationControlToClose != null)
+				fInformationControlToClose.removeFocusListener(this);
+
+			if (fSubjectControl != null && !fSubjectControl.isDisposed()) {
+				fSubjectControl.removeControlListener(this);
+				fSubjectControl.removeMouseListener(this);
+				fSubjectControl.removeFocusListener(this);
+				fSubjectControl.removeKeyListener(this);
+			}
+		}
+
+		/*
+		 * @see ControlListener#controlResized(ControlEvent)
+		 */
+		 public void controlResized(ControlEvent e) {
+			 hideInformationControl();
+		}
+
+		/*
+		 * @see ControlListener#controlMoved(ControlEvent)
+		 */
+		 public void controlMoved(ControlEvent e) {
+			 hideInformationControl();
+		}
+
+		/*
+		 * @see MouseListener#mouseDown(MouseEvent)
+		 */
+		 public void mouseDown(MouseEvent e) {
+			 hideInformationControl();
+		}
+
+		/*
+		 * @see MouseListener#mouseUp(MouseEvent)
+		 */
+		public void mouseUp(MouseEvent e) {
+		}
+
+		/*
+		 * @see MouseListener#mouseDoubleClick(MouseEvent)
+		 */
+		public void mouseDoubleClick(MouseEvent e) {
+			hideInformationControl();
+		}
+
+		/*
+		 * @see FocusListener#focusGained(FocusEvent)
+		 */
+		public void focusGained(FocusEvent e) {
+		}
+
+		/*
+		 * @see FocusListener#focusLost(FocusEvent)
+		 */
+		 public void focusLost(FocusEvent e) {
+			Display d= fSubjectControl.getDisplay();
+			d.asyncExec(new Runnable() {
+				// Without the asyncExec, mouse clicks to the workbench window are swallowed.
+				public void run() {
+					if (fInformationControlToClose == null || !fInformationControlToClose.isFocusControl())
+						hideInformationControl();
+				}
+			});
+		}
+
+		/*
+		 * @see IViewportListenerListener#viewportChanged(int)
+		 */
+		public void viewportChanged(int topIndex) {
+			hideInformationControl();
+		}
+
+		/*
+		 * @see KeyListener#keyPressed(KeyEvent)
+		 */
+		public void keyPressed(KeyEvent e) {
+			hideInformationControl();
+		}
+
+		/*
+		 * @see KeyListener#keyReleased(KeyEvent)
+		 */
+		public void keyReleased(KeyEvent e) {
+		}
+	}
+
+
+}


Property changes on: trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/InformationPresenter.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Copied: trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/MultipleHyperlinkPresenter.java (from rev 42449, trunk/cdi/plugins/org.jboss.tools.cdi.text.ext/src/org/jboss/tools/cdi/text/ext/hyperlink/xpl/MultipleHyperlinkPresenter.java)
===================================================================
--- trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/MultipleHyperlinkPresenter.java	                        (rev 0)
+++ trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/MultipleHyperlinkPresenter.java	2012-07-18 23:27:09 UTC (rev 42636)
@@ -0,0 +1,812 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 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
+ *     Exadel, Inc.
+ *     Red Hat, Inc.
+ *******************************************************************************/
+package org.jboss.tools.common.text.ext.hyperlink.xpl;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.AbstractInformationControl;
+import org.eclipse.jface.text.AbstractInformationControlManager;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.IInformationControlExtension2;
+import org.eclipse.jface.text.IInformationControlExtension3;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITextHoverExtension;
+import org.eclipse.jface.text.ITextHoverExtension2;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.IWidgetTokenKeeper;
+import org.eclipse.jface.text.IWidgetTokenKeeperExtension;
+import org.eclipse.jface.text.IWidgetTokenOwner;
+import org.eclipse.jface.text.IWidgetTokenOwnerExtension;
+import org.eclipse.jface.text.JFaceTextUtil;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.DefaultHyperlinkPresenter;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.util.Geometry;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.ShellAdapter;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+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.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+
+public class MultipleHyperlinkPresenter  extends DefaultHyperlinkPresenter {
+
+	private static final boolean IS_WIN32= "win32".equals(SWT.getPlatform()); //$NON-NLS-1$
+
+	/**
+	 * An information control capable of showing a list of hyperlinks. The hyperlinks can be opened.
+	 */
+	private static class LinkListInformationControl extends AbstractInformationControl implements IInformationControlExtension2 {
+
+		private static final class LinkContentProvider implements IStructuredContentProvider {
+
+			/*
+			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+			 */
+			public Object[] getElements(Object inputElement) {
+				return (Object[]) inputElement;
+			}
+
+			/*
+			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+			 */
+			public void dispose() {
+			}
+
+			/*
+			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+			 */
+			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			}
+		}
+
+		private static final class LinkLabelProvider extends ColumnLabelProvider {
+			/*
+			 * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
+			 */
+			public String getText(Object element) {
+				IHyperlink link= (IHyperlink)element;
+				String text= link.getHyperlinkText();
+				if (text != null)
+					return text;
+				return "Unknown Link";
+			}
+		}
+
+		private final MultipleHyperlinkHoverManager fManager;
+
+		private IHyperlink[] fInput;
+		private Composite fParent;
+		private Table fTable;
+
+		private Color fForegroundColor;
+		private Color fBackgroundColor;
+
+
+		/**
+		 * Creates a link list information control with the given shell as parent.
+		 *
+		 * @param parentShell the parent shell
+		 * @param manager the hover manager
+		 * @param foregroundColor the foreground color, must not be disposed
+		 * @param backgroundColor the background color, must not be disposed
+		 */
+		public LinkListInformationControl(Shell parentShell, MultipleHyperlinkHoverManager manager, Color foregroundColor, Color backgroundColor) {
+			super(parentShell, false);
+			fManager= manager;
+			fForegroundColor= foregroundColor;
+			fBackgroundColor= backgroundColor;
+			create();
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.IInformationControl#setInformation(java.lang.String)
+		 */
+		public void setInformation(String information) {
+			//replaced by IInformationControlExtension2#setInput(java.lang.Object)
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.IInformationControlExtension2#setInput(java.lang.Object)
+		 */
+		public void setInput(Object input) {
+			fInput= (IHyperlink[]) input;
+			deferredCreateContent(fParent);
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.AbstractInformationControl#createContent(org.eclipse.swt.widgets.Composite)
+		 */
+		protected void createContent(Composite parent) {
+			fParent= parent;
+			if (IS_WIN32) {
+				GridLayout layout= new GridLayout();
+				layout.marginWidth= 0;
+				layout.marginRight= 4;
+				fParent.setLayout(layout);
+			}
+			fParent.setForeground(fForegroundColor);
+			fParent.setBackground(fBackgroundColor);
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.AbstractInformationControl#computeSizeHint()
+		 */
+		public Point computeSizeHint() {
+			Point preferedSize= getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+
+			Point constraints= getSizeConstraints();
+			if (constraints == null)
+				return preferedSize;
+
+			if (fTable.getVerticalBar() == null || fTable.getHorizontalBar() == null)
+				return Geometry.min(constraints, preferedSize);
+
+			int scrollBarWidth= fTable.getVerticalBar().getSize().x;
+			int scrollBarHeight= fTable.getHorizontalBar().getSize().y;
+
+			int width;
+			if (preferedSize.y - scrollBarHeight <= constraints.y) {
+				width= preferedSize.x - scrollBarWidth;
+				fTable.getVerticalBar().setVisible(false);
+			} else {
+				width= Math.min(preferedSize.x, constraints.x);
+			}
+
+			int height;
+			if (preferedSize.x - scrollBarWidth <= constraints.x) {
+				height= preferedSize.y - scrollBarHeight;
+				fTable.getHorizontalBar().setVisible(false);
+			} else {
+				height= Math.min(preferedSize.y, constraints.y);
+			}
+
+			return new Point(width, height);
+		}
+
+		private void deferredCreateContent(Composite parent) {
+			fTable= new Table(parent, SWT.SINGLE | SWT.FULL_SELECTION);
+			fTable.setLinesVisible(false);
+			fTable.setHeaderVisible(false);
+			fTable.setForeground(fForegroundColor);
+			fTable.setBackground(fBackgroundColor);
+			fTable.setFont(JFaceResources.getDialogFont());
+
+			if (IS_WIN32) {
+				GridData data= new GridData(SWT.BEGINNING, SWT.BEGINNING, true, true);
+				fTable.setLayoutData(data);
+			}
+
+			final TableViewer viewer= new TableViewer(fTable);
+			viewer.setContentProvider(new LinkContentProvider());
+			viewer.setLabelProvider(new LinkLabelProvider());
+			viewer.setInput(fInput);
+			fTable.setSelection(0);
+
+			registerTableListeners();
+
+			getShell().addShellListener(new ShellAdapter() {
+
+				/*
+				 * @see org.eclipse.swt.events.ShellAdapter#shellActivated(org.eclipse.swt.events.ShellEvent)
+				 */
+				public void shellActivated(ShellEvent e) {
+					if (viewer.getTable().getSelectionCount() == 0) {
+						viewer.getTable().setSelection(0);
+					}
+
+					viewer.getTable().setFocus();
+				}
+			});
+		}
+
+		private void registerTableListeners() {
+
+			fTable.addMouseMoveListener(new MouseMoveListener() {
+				TableItem fLastItem= null;
+
+				public void mouseMove(MouseEvent e) {
+					if (fTable.equals(e.getSource())) {
+						Object o= fTable.getItem(new Point(e.x, e.y));
+						if (o instanceof TableItem) {
+							TableItem item= (TableItem) o;
+							if (!o.equals(fLastItem)) {
+								fLastItem= (TableItem) o;
+								fTable.setSelection(new TableItem[] { fLastItem });
+							} else if (e.y < fTable.getItemHeight() / 4) {
+								// Scroll up
+								int index= fTable.indexOf(item);
+								if (index > 0) {
+									fLastItem= fTable.getItem(index - 1);
+									fTable.setSelection(new TableItem[] { fLastItem });
+								}
+							} else if (e.y > fTable.getBounds().height - fTable.getItemHeight() / 4) {
+								// Scroll down
+								int index= fTable.indexOf(item);
+								if (index < fTable.getItemCount() - 1) {
+									fLastItem= fTable.getItem(index + 1);
+									fTable.setSelection(new TableItem[] { fLastItem });
+								}
+							}
+						}
+					}
+				}
+			});
+
+			fTable.addSelectionListener(new SelectionAdapter() {
+				public void widgetSelected(SelectionEvent e) {
+					openSelectedLink();
+				}
+			});
+
+			fTable.addMouseListener(new MouseAdapter() {
+				public void mouseUp(MouseEvent e) {
+					if (fTable.getSelectionCount() < 1)
+						return;
+
+					if (e.button != 1)
+						return;
+
+					if (fTable.equals(e.getSource())) {
+						Object o= fTable.getItem(new Point(e.x, e.y));
+						TableItem selection= fTable.getSelection()[0];
+						if (selection.equals(o))
+							openSelectedLink();
+					}
+				}
+			});
+
+			fTable.addKeyListener(new KeyAdapter() {
+				public void keyPressed(KeyEvent e) {
+					if (e.keyCode == 0x0D) // return
+						openSelectedLink();
+				}
+			});
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.IInformationControlExtension#hasContents()
+		 */
+		public boolean hasContents() {
+			return true;
+		}
+
+		/**
+		 * Opens the currently selected link.
+		 */
+		private void openSelectedLink() {
+			if (fTable.getSelectionCount() < 1)
+				return;
+			
+			TableItem selection= fTable.getSelection()[0];
+			IHyperlink link= (IHyperlink)selection.getData();
+			fManager.hideInformationControl();
+			fManager.setCaret();
+			link.open();
+		}
+	}
+
+	private class MultipleHyperlinkHover implements ITextHover, ITextHoverExtension, ITextHoverExtension2 {
+
+		/**
+		 * @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion)
+		 * @deprecated As of 3.4, replaced by
+		 *             {@link ITextHoverExtension2#getHoverInfo2(ITextViewer, IRegion)}
+		 */
+		public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
+			return null;
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface.text.ITextViewer, int)
+		 */
+		public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
+			return fSubjectRegion;
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.ITextHoverExtension2#getHoverInfo2(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion)
+		 */
+		public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) {
+			return fHyperlinks;
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.ITextHoverExtension#getHoverControlCreator()
+		 */
+		public IInformationControlCreator getHoverControlCreator() {
+			return new IInformationControlCreator() {
+				public IInformationControl createInformationControl(Shell parent) {
+					Color foregroundColor= fTextViewer.getTextWidget().getForeground();
+					Color backgroundColor= fTextViewer.getTextWidget().getBackground();
+					return new LinkListInformationControl(parent, fManager, foregroundColor, backgroundColor);
+				}
+			};
+		}
+	}
+
+	private static class MultipleHyperlinkHoverManager extends AbstractInformationControlManager implements IWidgetTokenKeeper, IWidgetTokenKeeperExtension {
+
+		private class Closer implements IInformationControlCloser, Listener, KeyListener, MouseListener {
+
+			private Control fSubjectControl;
+			private Display fDisplay;
+			private IInformationControl fControl;
+			private Rectangle fSubjectArea;
+			private long startTime;
+			
+			public Closer(){
+				startTime = System.currentTimeMillis();
+			}
+			
+			/**
+			 * Attempt to avoid losing focus just after opening. See JBIDE-9390
+			 * @return
+			 */
+			private boolean isItTime(){
+				return System.currentTimeMillis() - startTime > 500;
+			}
+
+			/*
+			 * @see org.eclipse.jface.text.AbstractInformationControlManager.IInformationControlCloser#setInformationControl(org.eclipse.jface.text.IInformationControl)
+			 */
+			public void setInformationControl(IInformationControl control) {
+				fControl= control;
+			}
+
+			/*
+			 * @see org.eclipse.jface.text.AbstractInformationControlManager.IInformationControlCloser#setSubjectControl(org.eclipse.swt.widgets.Control)
+			 */
+			public void setSubjectControl(Control subject) {
+				fSubjectControl= subject;
+			}
+
+			/*
+			 * @see org.eclipse.jface.text.AbstractInformationControlManager.IInformationControlCloser#start(org.eclipse.swt.graphics.Rectangle)
+			 */
+			public void start(Rectangle subjectArea) {
+				fSubjectArea= subjectArea;
+
+				fDisplay= fSubjectControl.getDisplay();
+				if (!fDisplay.isDisposed()) {
+					fDisplay.addFilter(SWT.FocusOut, this);
+					fDisplay.addFilter(SWT.MouseMove, this);
+					fTextViewer.getTextWidget().addKeyListener(this);
+					fTextViewer.getTextWidget().addMouseListener(this);
+				}
+			}
+
+			/*
+			 * @see org.eclipse.jface.text.AbstractInformationControlManager.IInformationControlCloser#stop()
+			 */
+			public void stop() {
+				if (fDisplay != null && !fDisplay.isDisposed()) {
+					fDisplay.removeFilter(SWT.FocusOut, this);
+					fDisplay.removeFilter(SWT.MouseMove, this);
+					fTextViewer.getTextWidget().removeKeyListener(this);
+					fTextViewer.getTextWidget().removeMouseListener(this);
+				}
+
+				fSubjectArea= null;
+			}
+
+			/*
+			 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+			 */
+			public void handleEvent(Event event) {
+				switch (event.type) {
+					case SWT.FocusOut:
+						if (isItTime() && !fControl.isFocusControl())
+							disposeInformationControl();
+						break;
+					case SWT.MouseMove:
+						handleMouseMove(event);
+						break;
+				}
+			}
+
+			/**
+			 * Handle mouse movement events.
+			 *
+			 * @param event the event
+			 */
+			private void handleMouseMove(Event event) {
+				if (!(event.widget instanceof Control))
+					return;
+
+				if (fControl.isFocusControl())
+					return;
+
+				Control eventControl= (Control) event.widget;
+
+				//transform coordinates to subject control:
+				Point mouseLoc= event.display.map(eventControl, fSubjectControl, event.x, event.y);
+
+				if (fSubjectArea.contains(mouseLoc))
+					return;
+
+				if (inKeepUpZone(mouseLoc.x, mouseLoc.y, ((IInformationControlExtension3) fControl).getBounds()))
+					return;
+
+				hideInformationControl();
+			}
+
+			/**
+			 * Tests whether a given mouse location is within the keep-up zone.
+			 * The hover should not be hidden as long as the mouse stays inside this zone.
+			 *
+			 * @param x the x coordinate, relative to the <em>subject control</em>
+			 * @param y the y coordinate, relative to the <em>subject control</em>
+			 * @param controlBounds the bounds of the current control
+			 *
+			 * @return <code>true</code> iff the mouse event occurred in the keep-up zone
+			 */
+			private boolean inKeepUpZone(int x, int y, Rectangle controlBounds) {
+				//  +-----------+
+				//  |subjectArea|
+				//  +-----------+
+				//  |also keepUp|
+				// ++-----------+-------+
+				// | totalBounds        |
+				// +--------------------+
+				if (fSubjectArea.contains(x, y))
+					return true;
+
+				Rectangle iControlBounds= fSubjectControl.getDisplay().map(null, fSubjectControl, controlBounds);
+				Rectangle totalBounds= Geometry.copy(iControlBounds);
+				if (totalBounds.contains(x, y))
+					return true;
+
+				int keepUpY= fSubjectArea.y + fSubjectArea.height;
+				Rectangle alsoKeepUp= new Rectangle(fSubjectArea.x, keepUpY, fSubjectArea.width, totalBounds.y - keepUpY);
+				return alsoKeepUp.contains(x, y);
+			}
+
+			/*
+			 * @see org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events.KeyEvent)
+			 */
+			public void keyPressed(KeyEvent e) {
+			}
+
+			/*
+			 * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
+			 */
+			public void keyReleased(KeyEvent e) {
+				hideInformationControl();
+			}
+
+			/*
+			 * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
+			 * @since 3.5
+			 */
+			public void mouseDoubleClick(MouseEvent e) {
+			}
+
+			/*
+			 * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
+			 * @since 3.5
+			 */
+			public void mouseDown(MouseEvent e) {
+			}
+
+			/*
+			 * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
+			 * @since 3.5
+			 */
+			public void mouseUp(MouseEvent e) {
+				hideInformationControl();
+			}
+
+		}
+
+		/**
+		 * Priority of the hover managed by this manager.
+		 * Default value: One higher then for the hovers
+		 * managed by TextViewerHoverManager.
+		 */
+		private static final int WIDGET_TOKEN_PRIORITY= 1;
+
+		private final MultipleHyperlinkHover fHover;
+		private final ITextViewer fTextViewer;
+		private final MultipleHyperlinkPresenter fHyperlinkPresenter;
+		private Closer fCloser;
+		private boolean fIsControlVisible;
+
+
+		/**
+		 * Create a new MultipleHyperlinkHoverManager. The MHHM can show and hide
+		 * the given MultipleHyperlinkHover inside the given ITextViewer.
+		 *
+		 * @param hover the hover to manage
+		 * @param viewer the viewer to show the hover in
+		 * @param hyperlinkPresenter the hyperlink presenter using this manager to present hyperlinks
+		 */
+		public MultipleHyperlinkHoverManager(MultipleHyperlinkHover hover, ITextViewer viewer, MultipleHyperlinkPresenter hyperlinkPresenter) {
+			super(hover.getHoverControlCreator());
+
+			fHover= hover;
+			fTextViewer= viewer;
+			fHyperlinkPresenter= hyperlinkPresenter;
+
+			fCloser= new Closer();
+			setCloser(fCloser);
+			fIsControlVisible= false;
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.AbstractInformationControlManager#computeInformation()
+		 */
+		protected void computeInformation() {
+			IRegion region= fHover.getHoverRegion(fTextViewer, -1);
+			if (region == null) {
+				setInformation(null, null);
+				return;
+			}
+
+			Rectangle area= JFaceTextUtil.computeArea(region, fTextViewer);
+			if (area == null || area.isEmpty()) {
+				setInformation(null, null);
+				return;
+			}
+
+			Object information= fHover.getHoverInfo2(fTextViewer, region);
+			setCustomInformationControlCreator(fHover.getHoverControlCreator());
+			setInformation(information, area);
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.AbstractInformationControlManager#computeInformationControlLocation(org.eclipse.swt.graphics.Rectangle, org.eclipse.swt.graphics.Point)
+		 */
+		protected Point computeInformationControlLocation(Rectangle subjectArea, Point controlSize) {
+			Point point = Display.getCurrent().getCursorLocation();
+			Point location = new Point(point.x-20, point.y-20);
+			return location;
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.AbstractInformationControlManager#showInformationControl(org.eclipse.swt.graphics.Rectangle)
+		 */
+		protected void showInformationControl(Rectangle subjectArea) {
+			if (fTextViewer instanceof IWidgetTokenOwnerExtension) {
+				if (((IWidgetTokenOwnerExtension) fTextViewer).requestWidgetToken(this, WIDGET_TOKEN_PRIORITY))
+					super.showInformationControl(subjectArea);
+			} else if (fTextViewer instanceof IWidgetTokenOwner) {
+				if (((IWidgetTokenOwner) fTextViewer).requestWidgetToken(this))
+					super.showInformationControl(subjectArea);
+			} else {
+				super.showInformationControl(subjectArea);
+			}
+
+			fIsControlVisible= true;
+		}
+
+		/**
+		 * Sets the caret where hyperlinking got initiated.
+		 * 
+		 * @since 3.5
+		 */
+		private void setCaret() {
+			fHyperlinkPresenter.setCaret();
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.AbstractInformationControlManager#hideInformationControl()
+		 */
+		protected void hideInformationControl() {
+			super.hideInformationControl();
+
+			if (fTextViewer instanceof IWidgetTokenOwner) {
+				((IWidgetTokenOwner) fTextViewer).releaseWidgetToken(this);
+			}
+
+			fIsControlVisible= false;
+			fHyperlinkPresenter.hideHyperlinks();
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.AbstractInformationControlManager#disposeInformationControl()
+		 */
+		public void disposeInformationControl() {
+			super.disposeInformationControl();
+
+			if (fTextViewer instanceof IWidgetTokenOwner) {
+				((IWidgetTokenOwner) fTextViewer).releaseWidgetToken(this);
+			}
+
+			fIsControlVisible= false;
+			fHyperlinkPresenter.hideHyperlinks();
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.IWidgetTokenKeeper#requestWidgetToken(org.eclipse.jface.text.IWidgetTokenOwner)
+		 */
+		public boolean requestWidgetToken(IWidgetTokenOwner owner) {
+			hideInformationControl();
+			return true;
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.IWidgetTokenKeeperExtension#requestWidgetToken(org.eclipse.jface.text.IWidgetTokenOwner, int)
+		 */
+		public boolean requestWidgetToken(IWidgetTokenOwner owner, int priority) {
+			if (priority < WIDGET_TOKEN_PRIORITY)
+				return false;
+
+			hideInformationControl();
+			return true;
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.IWidgetTokenKeeperExtension#setFocus(org.eclipse.jface.text.IWidgetTokenOwner)
+		 */
+		public boolean setFocus(IWidgetTokenOwner owner) {
+			return false;
+		}
+
+		/**
+		 * Returns <code>true</code> if the information control managed by
+		 * this manager is visible, <code>false</code> otherwise.
+		 *
+		 * @return <code>true</code> if information control is visible
+		 */
+		public boolean isInformationControlVisible() {
+			return fIsControlVisible;
+		}
+	}
+
+	private ITextViewer fTextViewer;
+
+	private IHyperlink[] fHyperlinks;
+	private Region fSubjectRegion;
+	private MultipleHyperlinkHoverManager fManager;
+
+	/**
+	 * The offset in the text viewer where hyperlinking got initiated.
+	 * @since 3.5
+	 */
+	private int fCursorOffset;
+
+	/**
+	 * Creates a new multiple hyperlink presenter which uses
+	 * {@link #HYPERLINK_COLOR} to read the color from the given preference store.
+	 *
+	 * @param store the preference store
+	 */
+	public MultipleHyperlinkPresenter(IPreferenceStore store) {
+		super(store);
+	}
+
+	/**
+	 * Creates a new multiple hyperlink presenter.
+	 *
+	 * @param color the hyperlink color, to be disposed by the caller
+	 */
+	public MultipleHyperlinkPresenter(RGB color) {
+		super(color);
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.hyperlink.DefaultHyperlinkPresenter#install(org.eclipse.jface.text.ITextViewer)
+	 */
+	public void install(ITextViewer viewer) {
+		super.install(viewer);
+		fTextViewer= viewer;
+
+		fManager= new MultipleHyperlinkHoverManager(new MultipleHyperlinkHover(), fTextViewer, this);
+		fManager.install(viewer.getTextWidget());
+		fManager.setSizeConstraints(100, 12, false, true);
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.hyperlink.DefaultHyperlinkPresenter#uninstall()
+	 */
+	public void uninstall() {
+		super.uninstall();
+
+		if (fTextViewer != null) {
+			fManager.dispose();
+
+			fTextViewer= null;
+		}
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.hyperlink.DefaultHyperlinkPresenter#canShowMultipleHyperlinks()
+	 */
+	public boolean canShowMultipleHyperlinks() {
+		return true;
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.hyperlink.DefaultHyperlinkPresenter#canHideHyperlinks()
+	 */
+	public boolean canHideHyperlinks() {
+		return !fManager.isInformationControlVisible();
+	}
+
+	/*
+	 * @see org.eclipse.jface.text.hyperlink.DefaultHyperlinkPresenter#hideHyperlinks()
+	 */
+	public void hideHyperlinks() {
+		super.hideHyperlinks();
+		fHyperlinks= null;
+	}
+	
+	/*
+	 * @see org.eclipse.jface.text.hyperlink.DefaultHyperlinkPresenter#showHyperlinks(org.eclipse.jface.text.hyperlink.IHyperlink[])
+	 */
+	public void showHyperlinks(IHyperlink[] hyperlinks) {
+		super.showHyperlinks(new IHyperlink[] { hyperlinks[0] });
+		
+		fSubjectRegion= null;
+		fHyperlinks= hyperlinks;
+
+		if (hyperlinks.length == 1)
+			return;
+
+		int start= hyperlinks[0].getHyperlinkRegion().getOffset();
+		int end= start + hyperlinks[0].getHyperlinkRegion().getLength();
+
+		for (int i= 1; i < hyperlinks.length; i++) {
+			int hstart= hyperlinks[i].getHyperlinkRegion().getOffset();
+			int hend= hstart + hyperlinks[i].getHyperlinkRegion().getLength();
+
+			start= Math.min(start, hstart);
+			end= Math.max(end, hend);
+		}
+
+		fSubjectRegion= new Region(start, end - start);
+		fCursorOffset= JFaceTextUtil.getOffsetForCursorLocation(fTextViewer);
+
+		fManager.showInformation();
+	}
+
+	/**
+	 * Sets the caret where hyperlinking got initiated.
+	 * 
+	 * @since 3.5
+	 */
+	private void setCaret() {
+		Point selectedRange= fTextViewer.getSelectedRange();
+		if (fCursorOffset != -1 && !(fSubjectRegion.getOffset() <= selectedRange.x && selectedRange.x + selectedRange.y <= fSubjectRegion.getOffset() + fSubjectRegion.getLength()))
+			fTextViewer.setSelectedRange(fCursorOffset, 0);
+	}
+
+
+}


Property changes on: trunk/common/plugins/org.jboss.tools.common.text.ext/src/org/jboss/tools/common/text/ext/hyperlink/xpl/MultipleHyperlinkPresenter.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain



More information about the jbosstools-commits mailing list