Package org.pdtextensions.semanticanalysis.ui.contentassist

Source Code of org.pdtextensions.semanticanalysis.ui.contentassist.InterfaceMethodCompletionProposal

/*******************************************************************************
* This file is part of the PDT Extensions eclipse plugin.
*
* (c) Robert Gruendler <r.gruendler@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
******************************************************************************/
package org.pdtextensions.semanticanalysis.ui.contentassist;

import org.eclipse.dltk.ast.declarations.ModuleDeclaration;
import org.eclipse.dltk.core.IMethod;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.SourceParserUtil;
import org.eclipse.dltk.internal.core.ModelElement;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.TextUtilities;
import org.eclipse.php.internal.core.format.FormatPreferencesSupport;
import org.eclipse.php.internal.core.format.FormatterUtils;
import org.eclipse.php.internal.ui.editor.PHPStructuredEditor;
import org.eclipse.php.internal.ui.editor.PHPStructuredTextViewer;
import org.eclipse.php.internal.ui.editor.contentassist.PHPCompletionProposal;
import org.eclipse.php.internal.ui.editor.contentassist.UseStatementInjector;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.texteditor.ITextEditor;
import org.pdtextensions.core.log.Logger;
import org.pdtextensions.core.ui.PDTPluginImages;
import org.pdtextensions.core.ui.PEXUIPlugin;
import org.pdtextensions.core.ui.codemanipulation.MethodStub;
import org.pdtextensions.semanticanalysis.validation.MissingMethodImplementation;
import org.pdtextensions.semanticanalysis.validation.validator.ImplementationValidator;


/**
*
* A completion proposal which generates unimplemented interface methods
* into the class body.
*
* @author Robert Gruendler <r.gruendler@gmail.com>
*
*/
@SuppressWarnings("restriction")
public class InterfaceMethodCompletionProposal extends PHPCompletionProposal {

  public InterfaceMethodCompletionProposal(String replacementString,
      int replacementOffset, int replacementLength, Image image,
      String displayString, int relevance) {
    super(replacementString, replacementOffset, replacementLength, image,
        displayString, relevance);

  }
 
  @Override
  public Image getImage() {

    return PEXUIPlugin.getImageDescriptorRegistry().get(PDTPluginImages.DESC_CORRECTION_CHANGE);
   
  }

  @Override
  public void apply(ITextViewer viewer, char trigger, int stateMask,
      int offset) {

    IDocument document = viewer.getDocument();
    ITextEditor textEditor = ((PHPStructuredTextViewer) viewer)
        .getTextEditor();

    if (textEditor instanceof PHPStructuredEditor) {
      IModelElement editorElement = ((PHPStructuredEditor) textEditor)
          .getModelElement();
      if (editorElement != null) {
       
        ISourceModule sourceModule = ((ModelElement) editorElement)
            .getSourceModule();
               
        try {

          if (sourceModule.getTypes().length != 1) {
            return;
          }
          ModuleDeclaration module = SourceParserUtil.getModuleDeclaration(sourceModule);
          ImplementationValidator validator = new ImplementationValidator(sourceModule);
          String code = "";
          try {
            module.traverse(validator);
          } catch (Exception e) {
            e.getClass();
            e.printStackTrace();
          }
          char indentChar = FormatterUtils
              .getFormatterCommonPrferences().getIndentationChar(document);
          String indent = String.valueOf(indentChar);
         
          for (MissingMethodImplementation miss : validator.getMissing()) {
           
            for (IMethod method : miss.getMisses()) {
              code += MethodStub.getMethodStub(method.getParent().getElementName(), method, method, indent, TextUtilities.getDefaultLineDelimiter(document), true);
            }
                     
            document.replace(miss.getInjectionOffset(), 0, code);
           
            UseStatementInjector injector = new UseStatementInjector(this);
            injector.inject(document, getTextViewer(), offset);
           
            //TODO: format code using new PDT formatter
            /*
            Formatter formatter = new Formatter();
            formatter.format(document);
            */
           
          }
         
        } catch (Exception e) {
          Logger.logException(e);
        }
      }
    }
  }
}
TOP

Related Classes of org.pdtextensions.semanticanalysis.ui.contentassist.InterfaceMethodCompletionProposal

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.