[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