Помощник по содержимому по запросу пользователей предлагает варианты дополнения содержимого в соответствии с текущим контекстом. Эта функция реализована в текстовой среде платформы с помощью модуля org.eclipse.jface.text.contentassist. Возможные варианты дополнения фразы отображаются во всплывающих окнах (контекстная справка). Пользователь может выбрать нужный вариант и вставить его в текст. Кроме того, Помощник по содержимому поддерживает контекстную справку, в которой отображается информация, связанная с текущим положением курсора в документе.
Реализация Помощника по содержимому не обязательна. По умолчанию Помощник по содержимому не устанавливается, поскольку классу 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 обработчики Помощника по содержимому предусмотрены для типа содержимого по умолчанию и документации по Java, но не для многострочных комментариев. Ниже каждый из этих обработчиков рассмотрен отдельно.
Обработчик 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; }
Помощник по содержимому может быть вызван по запросу пользователя, либо активирован автоматически при вводе символов "(" или ".":
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; }
Данная контекстная информация отображается автоматически при вводе символа "#":
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; }