Αυτόματη συμπλήρωση περιεχομένου

Η αυτόματη συμπλήρωση περιεχομένου σας επιτρέπει να παρέχετε συμφραστική συμπλήρωση περιεχομένου αν ζητηθεί από το χρήστη.  Αυτή η λειτουργία υλοποιείται από το πλαίσιο κειμένου πλατφόρμας στο πακέτο org.eclipse.jface.text.contentassist.   Τα αναδυόμενα παράθυρα (infopops) χρησιμοποιούνται για να προτείνουν πιθανές επιλογές κειμένου για τη συμπλήρωση μιας φράσης.  Ο χρήστης μπορεί να τις επιλέξει για εισαγωγή στο κείμενο.  Η αυτόματη συμπλήρωση περιεχομένου υποστηρίζει επίσης συμφραστικά αναδυόμενα παράθυρα πληροφοριών που παρέχουν στο χρήστη πληροφορίες σχετικά με την τρέχουσα θέση στο έγγραφο. 

Η υλοποίηση της αυτόματης συμπλήρωσης περιεχομένου είναι προαιρετική.  Η κλάση SourceViewerConfiguration, από προεπιλογή, δεν εγκαθιστά την αυτόματη συμπλήρωση, εφόσον δε γνωρίζει το μοντέλο του εγγράφου που χρησιμοποιείται για μια συγκεκριμένη λειτουργία επεξεργασίας και δεν έχει μια γενική συμπεριφορά για αυτόματη συμπλήρωση περιεχομένου. 

Για να υλοποιηθεί, η παραμετροποίηση της προβολής πρωτογενούς κώδικα της λειτουργίας επεξεργασίας πρέπει να είναι ρυθμισμένη για να την καθορίσει.  Αυτό συμβαίνει στο παράδειγμα λειτουργίας επεξεργασίας Java μέσα στην κλάση JavaSourceViewerConfiguration.

public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {

	ContentAssistant assistant= new ContentAssistant();
	assistant.setContentAssistProcessor(new JavaCompletionProcessor(), IDocument.DEFAULT_CONTENT_TYPE);
	assistant.setContentAssistProcessor(new JavaDocCompletionProcessor(), JavaPartitionScanner.JAVA_DOC);

	...
	return assistant;
}

Η συμπεριφορά αυτόματης συμπλήρωσης περιεχομένου ορίζεται στη διεπαφή IContentAssistant.  Η ρύθμισή της μοιάζει αρκετά με τη ρύθμιση της επισήμανσης σύνταξης.  Θα πρέπει να ρυθμίζεται με διαφορετικές στρατηγικές συμπλήρωσης φράσης για διαφορετικά είδη περιεχομένων εγγράφων.  Οι στρατηγικές συμπλήρωσης υλοποιούνται χρησιμοποιώντας την διεπαφή  IContentAssistProcessor.  Ένας επεξεργαστής προτείνει τις συμπληρώσεις και υπολογίζει τις πληροφορίες περιβάλλοντος για ένα σημείο εκκίνησης σε συγκεκριμένο είδος περιεχομένου.

Επεξεργαστές αυτόματης συμπλήρωσης περιεχομένου

Δεν είναι απαραίτητο για όλα τα είδη περιεχομένου να έχουν αυτόματη συμπλήρωση περιεχομένου.  Στη λειτουργία επεξεργασίας του παραδείγματος Java, οι επεξεργαστές αυτόματης συμπλήρωσης περιεχομένου παρέχονται για το προεπιλεγμένο είδος περιεχομένου και το javadoc αλλά όχι και για τα σχόλια πολλαπλών γραμμών.  Ας εξετάσουμε τον κάθε έναν από αυτούς τους επεξεργαστές.

Ο JavaCompletionProcessor είναι αρκετά απλός.  Μπορεί να προτείνει λέξεις-κλειδιά ως υποψήφια στοιχεία για συμπλήρωση.  Οι λέξεις-κλειδιά ορίζονται σε ένα πεδίο, fgProposals, και οι συγκεκριμένες λέξεις-κλειδιά προτείνονται πάντα ως υποψήφια στοιχεία:

public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
	ICompletionProposal[] result= new ICompletionProposal[fgProposals.length];
	for (int i= 0; i < fgProposals.length; i++) {
		IContextInformation info= new ContextInformation(fgProposals[i], MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.Proposal.ContextInfo.pattern"), new Object[] { fgProposals[i] })); //$NON-NLS-1$
		result[i]= new CompletionProposal(fgProposals[i], documentOffset, 0, fgProposals[i].length(), null, fgProposals[i], info, MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.Proposal.hoverinfo.pattern"), new Object[] { fgProposals[i]})); //$NON-NLS-1$
	}
	return result;
}

Αυτόματη συμπλήρωση περιεχομένου για λέξεις-κλειδιά

Η συμπλήρωση μπορεί να ενεργοποιηθεί από αίτηση του χρήστη ή μπορεί να ενεργοποιηθεί αυτόματα όταν πληκτρολογηθεί ο χαρακτήρας "(" or ")":

public char[] getCompletionProposalAutoActivationCharacters() {
	return new char[] { '.', '(' };
}

Εκτός από το να προτείνει συμπληρώσεις, ο επεξεργαστής JavaCompletionProcessor ορίζει πληροφορίες περιβάλλοντος που μπορεί να ζητήσει ο χρήστης.  Οι πληροφορίες περιβάλλοντος περιέχουν μια περιγραφή των πληροφοριών που είναι διαθέσιμες σε ένα δεδομένο περιβάλλον καθώς και το λεπτομερές μήνυμα πληροφοριών.  

Στο παράδειγμα λειτουργίας επεξεργασίας Java, οι πληροφορίες δεν είναι πραγματικά συμφραστικές.  Όταν ο χρήστης ζητά πληροφορίες περιβάλλοντος, υπολογίζεται για το τρέχον σημείο εκκίνησης ένας πίνακας που περιέχει πέντε αντικείμενα με παρόμοιες πληροφορίες περιβάλλοντος. Όλα αυτά τα αντικείμενα πληροφοριών περιβάλλοντος ορίζουν ένα περιβάλλον που περιέχει τους πέντε χαρακτήρες που βρίσκονται πριν και τους πέντε που βρίσκονται μετά το σημείο εκκίνησης. Αν επιλεγεί κάποια από αυτές τις πέντε προτάσεις, οι λεπτομερείς πληροφορίες θα εμφανιστούν κοντά στο δρομέα και θα παραμείνουν για όσο χρόνο ο δρομέας βρίσκεται μέσα στο περιβάλλον των πέντε χαρακτήρων γύρω από το σημείο εκκίνησης.

public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) {
	IContextInformation[] result= new IContextInformation[5];
	for (int i= 0; i < result.length; i++)
		result[i]= new ContextInformation(
			MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.ContextInfo.display.pattern"), new Object[] { new Integer(i), new Integer(documentOffset) }),
			MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.ContextInfo.value.pattern"), new Object[] { new Integer(i), new Integer(documentOffset - 5), new Integer(documentOffset + 5)}));
	return result;
}

Αυτόματη συμπλήρωση περιεχομένου Java

 

Αυτές οι πληροφορίες περιεχομένου παρουσιάζονται αυτόματα όταν πληκτρολογήσετε το χαρακτήρα "#":

public char[] getContextInformationAutoActivationCharacters() {
	return new char[] { '#' };
}

Ρύθμιση αυτόματης συμπλήρωσης περιεχομένου

Η εμφάνιση και η συμπεριφορά της αυτόματης συμπλήρωσης περιεχομένου μπορεί να ρυθμιστεί χρησιμοποιώντας την κλάσηIContentAssistant.  Για παράδειγμα, μπορείτε να ρυθμίσετε τη λήξη του χρόνου αυτόματης ενεργοποίησης καθώς και τον προσανατολισμό και το χρώμα στα αναδυόμενα παράθυρα πληροφοριών.

public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {

	ContentAssistant assistant= new ContentAssistant();
	...
	assistant.enableAutoActivation(true);
	assistant.setAutoActivationDelay(500);
	assistant.setProposalPopupOrientation(IContentAssistant.PROPOSAL_OVERLAY);
	assistant.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_ABOVE);
	assistant.setContextInformationPopupBackground(JavaEditorEnvironment.getJavaColorProvider().getColor(new RGB(150, 150, 0)));

	return assistant;
}

Δημιουργήστε την ενέργεια αυτόματης συμπλήρωσης περιεχομένου και συσχετίστε την με ένα δεσμό πλήκτρων

Προκειμένου να επιτραπεί στους χρήστες να καλέσουν την αυτόματη συμπλήρωση περιεχομένου, πρέπει να δημιουργηθεί μια ενέργεια και να ρυθμιστούν οι παράμετροι της. Αυτό συνήθως γίνεται με την υλοποίηση της μεθόδου AbstractTextEditor.createActions() σε επίπεδο υποκλάσης:

protected void createActions() {
	...
	IAction action= new ContentAssistAction(aResourceBundle, "ContentAssistProposal.", this); //$NON-NLS-1$
	action.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
	setAction(actionId, action); //$NON-NLS-1$
	markAsStateDependentAction(actionId, true); //$NON-NLS-1$
	PlatformUI.getWorkbench().getHelpSystem().setHelp(action, helpContextId);
	...
}
Η μέθοδος συνεισφοράς για τη γραμμή ενεργειών της λειτουργίας επεξεργασίας πρέπει να επεκταθεί προκειμένου η ενέργεια να εμφανιστεί στο κύριο μενού:
...
private RetargetTextEditorAction fContentAssist;

public MyEditorActionContributor() {
	fContentAssist= new RetargetTextEditorAction();
	String commandId= ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS;
	fContentAssist.setActionDefinitionId(commandId);
}

public void contributeToMenu(IMenuManager menu) {
	IMenuManager editMenu= menu.findMenuUsingPath(M_EDIT);
	editMenu.appendToGroup(MB_ADDITIONS, fContentAssist);
}

public void setActiveEditor(IEditorPart part) {
	IAction editorAction= getAction(part, "ContentAssist");
	fContentAssist.setAction(editorAction);
}
...