package net.sourceforge.phpeclipse.phpeditor;

/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp. and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html

Contributors:
    IBM Corporation - Initial implementation
    Klaus Hartlage - www.eclipseproject.de
**********************************************************************/

import net.sourceforge.phpeclipse.phpeditor.php.IPHPPartitionScannerConstants;
import net.sourceforge.phpeclipse.phpeditor.php.PHPPartitionScanner;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.DefaultLineTracker;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentPartitioner;
import org.eclipse.jface.text.ILineTracker;
import org.eclipse.jface.text.rules.DefaultPartitioner;
import org.eclipse.ui.editors.text.FileDocumentProvider;
import org.eclipse.ui.part.FileEditorInput;

/** 
 * The PHPDocumentProvider provides the IDocuments used by java editors.
 */

public class PHPDocumentProvider extends FileDocumentProvider {

  // private final static String[] TYPES= new String[] { PHPPartitionScanner.PHP, PHPPartitionScanner.JAVA_DOC, PHPPartitionScanner.JAVA_MULTILINE_COMMENT };
  private final static String[] TYPES =
    new String[] {
      IPHPPartitionScannerConstants.PHP,
      IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT,
      IPHPPartitionScannerConstants.HTML,
      IPHPPartitionScannerConstants.HTML_MULTILINE_COMMENT,
      IPHPPartitionScannerConstants.JAVASCRIPT,
      IPHPPartitionScannerConstants.CSS };

  private static PHPPartitionScanner fgScanner = null;

  public PHPDocumentProvider() {
    super();
  }

  /* (non-Javadoc)
   * Method declared on AbstractDocumentProvider
   */
  protected IDocument createDocument(Object element) throws CoreException {
    IDocument document = super.createDocument(element);
    if (document != null) {
      //  int fileType = 0; // PHP 
      IDocumentPartitioner partitioner = null;
      if (element instanceof FileEditorInput) {
        IFile file = (IFile) ((FileEditorInput) element).getAdapter(IFile.class);
        String filename = file.getLocation().toString();
        String extension = filename.substring(filename.lastIndexOf("."), filename.length());
     //   System.out.println(extension);
        if (extension.equalsIgnoreCase(".html") || extension.equalsIgnoreCase(".htm")) {
          // html
          partitioner = createHTMLPartitioner();
        } else if (extension.equalsIgnoreCase(".xml")) {
          // xml
          partitioner = createXMLPartitioner();
        } else if (extension.equalsIgnoreCase(".js")) {
          // javascript
          partitioner = createJavaScriptPartitioner();
        } else if (extension.equalsIgnoreCase(".css")) {
          // cascading style sheets
          partitioner = createCSSPartitioner();
        } else if (extension.equalsIgnoreCase(".tpl")) {
          // smarty ?
          partitioner = createSmartyPartitioner();
        } else if (extension.equalsIgnoreCase(".inc")) {
          // php include files ?
          partitioner = createIncludePartitioner();
        }
      }

      if (partitioner == null) {
        partitioner = createPHPPartitioner();
      }
      document.setDocumentPartitioner(partitioner);
      partitioner.connect(document);
    }
    return document;
  }

  /**
   * Return a partitioner for .php files.
   */
  private IDocumentPartitioner createPHPPartitioner() {
    return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
  }

  /**
   * Return a partitioner for .html files.
   */
  private IDocumentPartitioner createHTMLPartitioner() {
    return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
  }

  private IDocumentPartitioner createXMLPartitioner() {
    return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
  }

  private IDocumentPartitioner createJavaScriptPartitioner() {
    return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
  }

  private IDocumentPartitioner createCSSPartitioner() {
    return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
  }

  private IDocumentPartitioner createSmartyPartitioner() {
    return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
  }

  private IDocumentPartitioner createIncludePartitioner() {
    return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
  }
  /**
   * Return a scanner for creating php partitions.
   */
  private PHPPartitionScanner getPHPPartitionScanner() {
    if (fgScanner == null)
      fgScanner = new PHPPartitionScanner();
    return fgScanner;
  }

  /**
   * Creates a line tracker working with the same line delimiters as the document
   * of the given element. Assumes the element to be managed by this document provider.
   * 
   * @param element the element serving as blue print
   * @return a line tracker based on the same line delimiters as the element's document
   */
  public ILineTracker createLineTracker(Object element) {
    return new DefaultLineTracker();
  }
}