Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextEditor.java75
-rw-r--r--org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/Messages.java6
-rw-r--r--org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/messages.properties5
3 files changed, 82 insertions, 4 deletions
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextEditor.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextEditor.java
index ad14b1c5e50..5cea4e45a4b 100644
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextEditor.java
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextEditor.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2017 Red Hat Inc. and others.
+ * Copyright (c) 2000, 2021 Red Hat Inc. and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -18,10 +18,19 @@ package org.eclipse.ui.internal.genericeditor;
import java.util.List;
+import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.HyperlinkManager;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetectorExtension2;
import org.eclipse.jface.text.source.ICharacterPairMatcher;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.IVerticalRuler;
@@ -84,8 +93,70 @@ public class ExtensionBasedTextEditor extends TextEditor {
fOverviewRuler = createOverviewRuler(getSharedColors());
ProjectionViewer viewer = new ProjectionViewer(parent, ruler, getOverviewRuler(), isOverviewRulerVisible(),
- styles);
+ styles) {
+
+ @Override
+ public void doOperation(int operation) {
+ if (HyperlinkManager.OPEN_HYPERLINK == operation) {
+ if (!openFirstHyperlink()) {
+ MessageDialog.openInformation(getControl().getShell(),
+ Messages.TextViewer_open_hyperlink_error_title,
+ Messages.TextViewer_open_hyperlink_error_message);
+ }
+ return;
+ }
+
+ super.doOperation(operation);
+ }
+
+ private boolean openFirstHyperlink() {
+ ITextSelection sel = (ITextSelection) this.getSelection();
+ int offset = sel.getOffset();
+ if (offset == -1)
+ return false;
+
+ IRegion region = new Region(offset, 0);
+ IHyperlink hyperlink = findFirstHyperlink(region);
+ if (hyperlink != null) {
+ hyperlink.open();
+ return true;
+ }
+ return false;
+ }
+
+ private IHyperlink findFirstHyperlink(IRegion region) {
+ int activeHyperlinkStateMask = getSourceViewerConfiguration().getHyperlinkStateMask(this);
+ synchronized (fHyperlinkDetectors) {
+ for (IHyperlinkDetector detector : fHyperlinkDetectors) {
+ if (detector == null)
+ continue;
+
+ if (detector instanceof IHyperlinkDetectorExtension2) {
+ int stateMask = ((IHyperlinkDetectorExtension2) detector).getStateMask();
+ if (stateMask != -1 && stateMask != activeHyperlinkStateMask)
+ continue;
+ else if (stateMask == -1 && activeHyperlinkStateMask != fHyperlinkStateMask)
+ continue;
+ } else if (activeHyperlinkStateMask != fHyperlinkStateMask)
+ continue;
+
+ boolean canShowMultipleHyperlinks = fHyperlinkPresenter.canShowMultipleHyperlinks();
+ IHyperlink[] hyperlinks = detector.detectHyperlinks(this, region, canShowMultipleHyperlinks);
+ if (hyperlinks == null)
+ continue;
+
+ Assert.isLegal(hyperlinks.length > 0);
+
+ return hyperlinks[0];
+ }
+ }
+ return null;
+ }
+
+ };
+
SourceViewerDecorationSupport support = getSourceViewerDecorationSupport(viewer);
+
configureCharacterPairMatcher(viewer, support);
return viewer;
}
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/Messages.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/Messages.java
index 07e7cb7c0b9..a2c54740d74 100644
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/Messages.java
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/Messages.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2018 Red Hat Inc. and others.
+ * Copyright (c) 2018, 2021 Red Hat Inc. and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -18,6 +18,10 @@ import org.eclipse.osgi.util.NLS;
public class Messages extends NLS {
private static final String BUNDLE_NAME = "org.eclipse.ui.internal.genericeditor.messages"; //$NON-NLS-1$
public static String DefaultWordHighlightStrategy_OccurrencesOf;
+
+ public static String TextViewer_open_hyperlink_error_title;
+ public static String TextViewer_open_hyperlink_error_message;
+
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/messages.properties b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/messages.properties
index 5f8e219ae40..1356d1440d9 100644
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/messages.properties
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/messages.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2018 Red Hat Inc. and others.
+# Copyright (c) 2018, 2021 Red Hat Inc. and others.
#
# This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
@@ -12,3 +12,6 @@
# Alexander Kurtakov (Red Hat Inc.) - initial API and implementation
###############################################################################
DefaultWordHighlightStrategy_OccurrencesOf=Occurrence of ''{0}''
+
+TextViewer_open_hyperlink_error_title=Open Hyperlink
+TextViewer_open_hyperlink_error_message=The operation is not applicable to the current selection. Select a hyperlink target.

Back to the top