Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDani Megert2017-01-19 20:11:30 +0000
committerDani Megert2017-01-19 20:11:30 +0000
commit889d3c82bc8592914b11549d395f58ae6fb3d8ab (patch)
treeff393590d28db8df6ef5ea09e963ffdc375ef30b
parentaf4d8cf0a424c87ca13bebe9a4918175393f4ef6 (diff)
downloadeclipse.platform.text-889d3c82bc8592914b11549d395f58ae6fb3d8ab.tar.gz
eclipse.platform.text-889d3c82bc8592914b11549d395f58ae6fb3d8ab.tar.xz
eclipse.platform.text-889d3c82bc8592914b11549d395f58ae6fb3d8ab.zip
Polish bug 251156: [content assist] Asynchronous code completion [with patch]I20170120-2000I20170119-2000
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java11
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncContentAssistSubjectControlAdapter.java28
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncContentAssistant.java33
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistSubjectControlAdapter.java31
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java48
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/JFaceTextMessages.properties4
-rw-r--r--org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextViewerConfiguration.java16
7 files changed, 77 insertions, 94 deletions
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java
index f46384c11be..efb19eb5c95 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java
@@ -37,10 +37,11 @@ import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.TextUtilities;
/**
- * This is the controller for the completion proposal list, which is used
- * by the {@link AsyncContentAssistant}. It is aimed at orchestrating all operations
- * from {@link IContentAssistProcessor} asynchronously and to provide a good user
- * experience, including reporting and eye-candies.
+ * This class is used to present proposals asynchronously to the user. If additional information
+ * exists for a proposal, then selecting that proposal will result in the information being
+ * displayed in a secondary window.
+ *
+ * @since 3.12
*/
class AsyncCompletionProposalPopup extends CompletionProposalPopup {
@@ -81,7 +82,7 @@ class AsyncCompletionProposalPopup extends CompletionProposalPopup {
@Override
public String getDisplayString() {
- return NLS.bind(JFaceTextMessages.getString("CompletionProposalPopup.computing"), Integer.valueOf(fSize - fRemaining), Integer.valueOf(fSize)); //$NON-NLS-1$
+ return NLS.bind(JFaceTextMessages.getString("AsyncCompletionProposalPopup.computing"), Integer.valueOf(fSize - fRemaining), Integer.valueOf(fSize)); //$NON-NLS-1$
}
@Override
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncContentAssistSubjectControlAdapter.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncContentAssistSubjectControlAdapter.java
deleted file mode 100644
index d0d3cfded9f..00000000000
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncContentAssistSubjectControlAdapter.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Red Hat Inc. 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:
- * Mickael Istria (Red Hat Inc.) - [251156] async content assist
- *******************************************************************************/
-package org.eclipse.jface.text.contentassist;
-
-import org.eclipse.jface.text.ITextViewer;
-
-class AsyncContentAssistSubjectControlAdapter extends ContentAssistSubjectControlAdapter {
-
- public AsyncContentAssistSubjectControlAdapter(ITextViewer viewer) {
- super(viewer);
- }
-
- @Override
- CompletionProposalPopup createCompletionProposalPopup(ContentAssistant contentAssistant, AdditionalInfoController controller) {
- if (fContentAssistSubjectControl != null)
- return new AsyncCompletionProposalPopup(contentAssistant, fContentAssistSubjectControl, controller);
- return new AsyncCompletionProposalPopup(contentAssistant, fViewer, controller);
- }
-
-}
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncContentAssistant.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncContentAssistant.java
deleted file mode 100644
index 22aa3caeb32..00000000000
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncContentAssistant.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Red Hat Inc. 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:
- * Mickael Istria (Red Hat Inc.) - [251156] async content assist
- *******************************************************************************/
-package org.eclipse.jface.text.contentassist;
-
-import org.eclipse.jface.text.ITextViewer;
-
-/**
- * A content assistant allowing multiple {@link IContentAssistProcessor}s and invoking their methods
- * asynchronously whenever possible.
- * @since 3.12
- */
-public class AsyncContentAssistant extends ContentAssistant {
-
- @Override
- public void addContentAssistProcessor(IContentAssistProcessor processor, String contentType) {
- super.addContentAssistProcessor(processor, contentType);
- }
-
- @Override
- public void install(ITextViewer textViewer) {
- fViewer= textViewer;
- fContentAssistSubjectControlAdapter= new AsyncContentAssistSubjectControlAdapter(fViewer);
- install();
- }
-}
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistSubjectControlAdapter.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistSubjectControlAdapter.java
index 6a8dd155d18..8d648d91b84 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistSubjectControlAdapter.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistSubjectControlAdapter.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2016 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 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
@@ -261,17 +261,24 @@ class ContentAssistSubjectControlAdapter implements IContentAssistSubjectControl
}
/**
- * Creates and returns a completion proposal popup for the given content assistant.
- *
- * @param contentAssistant the content assistant
- * @param controller the additional info controller, or <code>null</code>
- * @return the completion proposal popup
- */
- CompletionProposalPopup createCompletionProposalPopup(ContentAssistant contentAssistant, AdditionalInfoController controller) {
- if (fContentAssistSubjectControl != null)
- return new CompletionProposalPopup(contentAssistant, fContentAssistSubjectControl, controller);
- return new CompletionProposalPopup(contentAssistant, fViewer, controller);
-
+ * Creates and returns a completion proposal popup for the given content assistant.
+ *
+ * @param contentAssistant the content assistant
+ * @param controller the additional info controller, or <code>null</code>
+ * @param asynchronous <true> if this content assistant should present the proposals
+ * asynchronously, <code>false</code> otherwise
+ * @return the completion proposal popup
+ */
+ CompletionProposalPopup createCompletionProposalPopup(ContentAssistant contentAssistant, AdditionalInfoController controller, boolean asynchronous) {
+ if (asynchronous) {
+ if (fContentAssistSubjectControl != null)
+ return new AsyncCompletionProposalPopup(contentAssistant, fContentAssistSubjectControl, controller);
+ return new AsyncCompletionProposalPopup(contentAssistant, fViewer, controller);
+ } else {
+ if (fContentAssistSubjectControl != null)
+ return new CompletionProposalPopup(contentAssistant, fContentAssistSubjectControl, controller);
+ return new CompletionProposalPopup(contentAssistant, fViewer, controller);
+ }
}
/**
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java
index 3697b013e17..84eee07dc21 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2016 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 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
@@ -81,8 +81,11 @@ import org.eclipse.jface.text.TextUtilities;
/**
- * The standard implementation of the <code>IContentAssistant</code> interface. Usually, clients
+ * The standard implementation of the {@link IContentAssistant} interface. Usually, clients
* instantiate this class and configure it before using it.
+ *
+ * Since 3.12, it can compute and display the proposals asynchronously when invoking
+ * {@link #ContentAssistant(boolean)} with <code>true</code>.
*/
public class ContentAssistant implements IContentAssistant, IContentAssistantExtension, IContentAssistantExtension2, IContentAssistantExtension3, IContentAssistantExtension4, IWidgetTokenKeeper, IWidgetTokenKeeperExtension {
@@ -926,7 +929,7 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt
private Color fProposalSelectorBackground;
private Color fProposalSelectorForeground;
- ITextViewer fViewer;
+ private ITextViewer fViewer;
private String fLastErrorMessage;
private Closer fCloser;
@@ -966,7 +969,7 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt
*
* @since 3.0
*/
- ContentAssistSubjectControlAdapter fContentAssistSubjectControlAdapter;
+ private ContentAssistSubjectControlAdapter fContentAssistSubjectControlAdapter;
/**
* The dialog settings for the control's bounds.
*
@@ -1045,6 +1048,13 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt
private ICompletionProposalSorter fSorter;
/**
+ * Tells whether this content assistant allows to run asynchronous
+ *
+ * @since 3.12
+ */
+ private boolean fAsynchronous;
+
+ /**
* Creates a new content assistant. The content assistant is not automatically activated,
* overlays the completion proposals with context information list if necessary, and shows the
* context information above the location at which it was activated. If auto activation will be
@@ -1052,7 +1062,23 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt
* milliseconds delay. It uses the default partitioning.
*/
public ContentAssistant() {
+ this(false);
+ }
+
+ /**
+ * Creates a new content assistant. The content assistant is not automatically activated,
+ * overlays the completion proposals with context information list if necessary, and shows the
+ * context information above the location at which it was activated. If auto activation will be
+ * enabled, without further configuration steps, this content assistant is activated after a 500
+ * milliseconds delay. It uses the default partitioning.
+ *
+ * @param asynchronous <true> if this content assistant should present the proposals
+ * asynchronously, <code>false</code> otherwise
+ * @since 3.12
+ */
+ public ContentAssistant(boolean asynchronous) {
fPartitioning= IDocumentExtension3.DEFAULT_PARTITIONING;
+ fAsynchronous= asynchronous;
}
/**
@@ -1101,7 +1127,7 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt
* @param contentType Document token content-type it applies to
* @since 3.12
*/
- protected void addContentAssistProcessor(IContentAssistProcessor processor, String contentType) {
+ public void addContentAssistProcessor(IContentAssistProcessor processor, String contentType) {
Assert.isNotNull(contentType);
if (fProcessors == null)
@@ -1134,11 +1160,15 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt
}
/**
- * @param contentType Document token content-type it applies to
- * @return the available content-assist processors for provide token content-type.
+ * Returns the content assist processors to be used for the given content type.
+ *
+ * @param contentType the type of the content for which this content assistant is to be
+ * requested
+ * @return the content assist processors or <code>null</code> if none exists for the specified
+ * content type
* @since 3.12
*/
- protected Set<IContentAssistProcessor> getContentAssistProcessors(String contentType) {
+ Set<IContentAssistProcessor> getContentAssistProcessors(String contentType) {
if (fProcessors == null)
return null;
@@ -1501,7 +1531,7 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt
controller= new AdditionalInfoController(fInformationControlCreator, OpenStrategy.getPostSelectionDelay());
fContextInfoPopup= fContentAssistSubjectControlAdapter.createContextInfoPopup(this);
- fProposalPopup= fContentAssistSubjectControlAdapter.createCompletionProposalPopup(this, controller);
+ fProposalPopup= fContentAssistSubjectControlAdapter.createCompletionProposalPopup(this, controller, fAsynchronous);
fProposalPopup.setSorter(fSorter);
registerHandler(SELECT_NEXT_PROPOSAL_COMMAND_ID, fProposalPopup.createProposalSelectionHandler(CompletionProposalPopup.ProposalSelectionHandler.SELECT_NEXT));
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/JFaceTextMessages.properties b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/JFaceTextMessages.properties
index 73584bdc4dc..543ab27f2d4 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/JFaceTextMessages.properties
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/JFaceTextMessages.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2000, 2014 IBM Corporation and others.
+# Copyright (c) 2000, 2017 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
@@ -19,6 +19,6 @@ ContentAssistant.assist_delay_timer_name=AutoAssist Delay
ContentAssistant.error_computing_completion=Error computing completion proposals.
ContentAssistant.error_computing_context=Error computing context information.
CompletionProposalPopup.no_proposals=no proposals
-CompletionProposalPopup.computing=Computing ({0}/{1})...
CompletionProposalPopup.error_retrieving_proposal=Error retrieving proposal text
CompletionProposalPopup.unexpected_error=Unexpected error while retrieving text for a content assistance proposal.
+AsyncCompletionProposalPopup.computing=Computing ({0}/{1}) ...
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextViewerConfiguration.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextViewerConfiguration.java
index 61b3c083673..0b5aa832f27 100644
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextViewerConfiguration.java
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextViewerConfiguration.java
@@ -17,27 +17,32 @@ import java.util.List;
import java.util.Queue;
import java.util.Set;
+import org.eclipse.swt.widgets.Shell;
+
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
+
import org.eclipse.jface.preference.IPreferenceStore;
+
import org.eclipse.jface.text.AbstractReusableInformationControlCreator;
import org.eclipse.jface.text.DefaultInformationControl;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentPartitioningListener;
import org.eclipse.jface.text.IInformationControl;
import org.eclipse.jface.text.ITextHover;
-import org.eclipse.jface.text.contentassist.AsyncContentAssistant;
import org.eclipse.jface.text.contentassist.ContentAssistant;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.jface.text.contentassist.IContentAssistant;
import org.eclipse.jface.text.presentation.IPresentationReconciler;
import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.swt.widgets.Shell;
+
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
+
import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
+
/**
* The configuration of the {@link ExtensionBasedTextEditor}. It registers the proxy composite
* for hover, completion, syntax highlighting, and then those proxy take care of resolving to
@@ -50,7 +55,8 @@ public final class ExtensionBasedTextViewerConfiguration extends TextSourceViewe
private ITextEditor editor;
private Set<IContentType> contentTypes;
private IDocument document;
- private AsyncContentAssistant contentAssistant;
+
+ private ContentAssistant contentAssistant;
private List<IContentAssistProcessor> processors;
/**
@@ -96,7 +102,7 @@ public final class ExtensionBasedTextViewerConfiguration extends TextSourceViewe
@Override
public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
ContentAssistProcessorRegistry registry= GenericEditorPlugin.getDefault().getContentAssistProcessorRegistry();
- contentAssistant = new AsyncContentAssistant();
+ contentAssistant= new ContentAssistant(true);
contentAssistant.setContextInformationPopupOrientation(ContentAssistant.CONTEXT_INFO_BELOW);
contentAssistant.setProposalPopupOrientation(ContentAssistant.PROPOSAL_REMOVE);
contentAssistant.enableColoredLabels(true);

Back to the top