Package org.eclipse.php.internal.ui.util

Source Code of org.eclipse.php.internal.ui.util.CodeInjector

/*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others.
* 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:
*     IBM Corporation - initial API and implementation
*     Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.ui.util;

import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.formatter.IContentFormatter;
import org.eclipse.php.internal.ui.Logger;
import org.eclipse.php.internal.ui.PHPUiPlugin;
import org.eclipse.php.internal.ui.editor.PHPStructuredEditor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;

/**
* This class handles both as a code injector and code formatter of injected
* code. If the code injector is not used to inject code in a PHP file, such as
* in new PHP file, then it can be used only to format the code.
*
* @author yaronm
*/
public class CodeInjector {
  private int offset = -1;
  private IStructuredDocument document = null;
  private IStructuredModel model = null;
  private ISourceModule existingPHPFile = null;

  public CodeInjector() {
  }

  /**
   * @param existingPHPFile
   *            - The existing php file object in which we want to inject the
   *            new element
   * @param offset
   *            - The StructuredDocument offset from which we inject the code
   */
  public CodeInjector(ISourceModule existingPHPFile, int offset) {
    this.existingPHPFile = existingPHPFile;
    this.offset = offset;
  }

  public CodeInjector(ISourceModule existingPHPFile) {
    this.existingPHPFile = existingPHPFile;
  }

  // prepares the document
  private void init() {

    try {
      // fixed bug when working on untitled php docs
      // openInEditor opened the wrong editor (regular php editor)
      IEditorPart editor = org.eclipse.dltk.internal.ui.editor.EditorUtility
          .openInEditor(existingPHPFile, true);
      document = (IStructuredDocument) ((PHPStructuredEditor) editor)
          .getDocument();
      // The model is fetched for editing and must be released
      model = StructuredModelManager.getModelManager().getModelForEdit(
          document);
    } catch (PartInitException e) {
      Logger.logException(e);
    } catch (ModelException e) {
      Logger.logException(e);
    } finally {
      model.releaseFromEdit();
    }
  }

  public void setOffset(int offset) {
    this.offset = offset;
  }

  /**
   * Performs code injection
   *
   * @param doFormat
   *            - Whether to perform formatting after code injection
   * @param saveChanges
   *            - Whether to save the PHP file after code injection
   */
  public void inject(String contents, boolean doFormat, boolean saveChanges) {
    init();
    if (offset == -1) {
      offset = document.getLength();
    }
    // inject
    document.replaceText(this, offset, 0, contents);

    // format
    if (doFormat) {
      formatDocument(document, offset, contents.length() + 1);
    }

    // save file
    if (saveChanges) {
      try {
        model.save();
      } catch (Exception e) {
        Logger.logException(e);
      }
    }
  }

  /**
   * Format the given document according to the given offset and length fixed
   * bug 14448 - Change the formatter - used the new formatter based on the
   * AST
   *
   * @param document
   * @param offset
   * @param length
   *            TODO - Today, we perform format on the code AFTER it is
   *            injected. This issue needs to be reviewed again when OFFLINE
   *            formatting will be available.
   */
  public void formatDocument(IStructuredDocument document, int offset,
      int length) {
    IContentFormatter formatter = null;
    if (formatter == null) {
      formatter = PHPUiPlugin.getDefault().getActiveFormatter();
    }
    try {
      formatter.format(document, new Region(offset, length));
    } catch (Exception e) {
      Logger.logException(e);
    }
  }

  public int getOffset() {
    return offset;
  }
}
TOP

Related Classes of org.eclipse.php.internal.ui.util.CodeInjector

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.