/******************************************************************************* * Copyright (c) 2006 Oracle Corporation. * 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: * Cameron Bateman/Oracle - initial API and implementation * ********************************************************************************/ package org.eclipse.jst.jsf.ui.internal.contentassist.el; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.jface.text.contentassist.IContextInformationValidator; import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext; import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory; import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistParser; import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistStrategy; import org.eclipse.jst.jsf.designtime.DTAppManagerUtil; import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter; import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException; import org.eclipse.jst.jsf.designtime.internal.view.XMLViewDefnAdapter.DTELExpression; import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin; import org.eclipse.wst.xml.ui.internal.contentassist.ProposalComparator; /** * The content assist processor for JSF EL partitions on attribute values. * * @author cbateman * */ public class JSFELContentAssistProcessor implements IContentAssistProcessor { /** * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer, * int) */ public ICompletionProposal[] computeCompletionProposals( final ITextViewer viewer, final int documentPosition) { final List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>(); final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(viewer, documentPosition); if (context != null) { final XMLViewDefnAdapter viewAdapter = DTAppManagerUtil.getXMLViewDefnAdapter(context); if (viewAdapter != null) { try { final DTELExpression elExpression = viewAdapter.getELExpression(context); if (elExpression != null) { final ContentAssistStrategy strategy = ContentAssistParser.getPrefix(documentPosition - elExpression.getDocumentContext() .getDocumentPosition() + 1, elExpression.getText().trim()); if (strategy != null) { proposals.addAll(strategy.getProposals(context)); } Collections.sort(proposals, new ProposalComparator()); } } catch (ViewHandlerException e) { JSFUiPlugin.log(IStatus.ERROR, "During el resolution", e); //$NON-NLS-1$ } } } return proposals.toArray(new ICompletionProposal[0]); } public IContextInformation[] computeContextInformation( final ITextViewer viewer, final int offset) { // no context info return null; } public char[] getCompletionProposalAutoActivationCharacters() { // auto activate when user hits a '.' return new char[] { '.' }; } public char[] getContextInformationAutoActivationCharacters() { // no auto-activation for context info return null; } public String getErrorMessage() { // don't flag errors return null; } public IContextInformationValidator getContextInformationValidator() { // don't validate context information return null; } }