Package org.eclipse.jst.jsf.core.internal.contentassist.el

Source Code of org.eclipse.jst.jsf.core.internal.contentassist.el.IdCompletionStrategy$MyProposalFactory

/*******************************************************************************
* 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.core.internal.contentassist.el;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
import org.eclipse.jst.jsf.context.symbol.ISymbol;
import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
import org.eclipse.jst.jsf.context.symbol.provider.ProposalCreationFactoryAdapter;
import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider.IProposalCreationFactory;
import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
import org.eclipse.jst.jsf.designtime.resolver.StructuredDocumentSymbolResolverFactory;
import org.eclipse.swt.graphics.Image;

/**
* A strategy for getting completions for EL id completions like:
*
*     var
*     ^
*    
* @author cbateman
*
*/
class IdCompletionStrategy extends ContentAssistStrategy
{

    /**
     * Construct a strategy for completing an ID completion
     *
     * @param prefixValue
     * @param proposalStart - the part of the proposal which was already typed when user invoked autocomplete
     */
    public IdCompletionStrategy(final String prefixValue, String proposalStart)
    {
        super(ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION, prefixValue, proposalStart);
    }

    /**
     * @see org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistStrategy#getProposals(org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext)
     */
    public List<ICompletionProposal> getProposals(IStructuredDocumentContext context)
    {
        final List<ICompletionProposal> completionList = new ArrayList<ICompletionProposal>();
        final IWorkspaceContextResolver workspaceResolver =
            IStructuredDocumentContextResolverFactory.INSTANCE.
                getWorkspaceContextResolver(context);

        final IFile  iFile = (IFile) workspaceResolver.getResource();

        ISymbol[]       symbols = null;

        if (iFile != null)
        {
            final ISymbolContextResolver  symbolResolver =
                StructuredDocumentSymbolResolverFactory.getInstance().
                    getSymbolContextResolver(context);
           
            symbols = symbolResolver.getAllVariables();
        }

        final ComposedAdapterFactory factory =
            new ComposedAdapterFactory(ComposedAdapterFactory.
                                                  Descriptor.Registry.INSTANCE);

        final IProposalCreationFactory  creationInfo =
           new MyProposalFactory(context.getDocumentPosition(), getProposalStart().length());

        for (int i = 0; symbols != null && i < symbols.length; i++)
        {
            final ISymbol  symbol = symbols[i];

            final Object  adapter = 
                factory.adapt(symbol, IContentProposalProvider.class);
               
            if (adapter instanceof IContentProposalProvider)
            {
                final IContentProposalProvider  provider =
                    (IContentProposalProvider) adapter;
                final ICompletionProposal[] proposal  =
                    provider.getProposals(symbol, creationInfo);
                if (proposal != null)
                {
                  addProposalsMatchingProposalStart(completionList, proposal);
                }
            }
        }

        return Collections.unmodifiableList(completionList);
    }
   
    private static class MyProposalFactory extends ProposalCreationFactoryAdapter
    {
        private final static int   HIGH_RELEVANCE = 2;
        private final static int   NORMAL_RELEVANCE = 1;
        private final static int   LOW_RELEVANCE = 0;

        /**
         * @param replacementOffset
         * @param replacementLength
         */
        public MyProposalFactory(int replacementOffset, int replacementLength)
        {
          /*TODO I changed the meaning of "replacementLength" from "number of chars AFTER cursor to be
           * replaced" to "number of chars BEFORE cursor to be replaced. Since "replacementLength"
           * has always been 0 (constructor is only called by IdCompletionStrategy.getProposals()),
           * this should not change anything, but I don't know if there have been different plans
           * for "replacementLength".
           * TODO Maybe this change should be done in the super class instead?
           */
            super(replacementOffset - replacementLength, replacementLength);
        }

        public ICompletionProposal createProposal(final String replacementText,
                                                  final String displayText,
                                                  final String additionalText,
                                                  final Image displayImage,
                                                  final Object targetObject)
        {
            return createDefaultProposal(replacementText, _replacementOffset,
                                         _replacementLength,
                                         replacementText.length(), displayImage,
                                         displayText, null, additionalText,
                                         getRelevance(targetObject));
        }
       
        private int getRelevance(Object target)
        {
            // put tag vars at top, followed by beans, then implicits and other
            if (target instanceof IInstanceSymbol)
            {
                final IInstanceSymbol symbol = (IInstanceSymbol) target;
               
                switch (symbol.getRuntimeSource().getValue())
                {
                    case ERuntimeSource.TAG_INSTANTIATED_SYMBOL:
                        return HIGH_RELEVANCE;
                    case ERuntimeSource.MANAGED_BEAN_SYMBOL:
                        return NORMAL_RELEVANCE;
                    case ERuntimeSource.BUILT_IN_SYMBOL:
                    case ERuntimeSource.OTHER:
                        return LOW_RELEVANCE;
                }
            }
           
            // if none of the above, return low relevance
            return LOW_RELEVANCE;
        }
    }
}
TOP

Related Classes of org.eclipse.jst.jsf.core.internal.contentassist.el.IdCompletionStrategy$MyProposalFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.