/*
 * $Id: EditElementWizard.java,v 1.1 2004-10-05 20:51:57 jsurfer Exp $
 * Copyright Narushima Hironori. All rights reserved.
 */
package net.sourceforge.phpeclipse.wizards.html;

import net.sourceforge.phpdt.internal.ui.PHPUiImages;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;

import org.eclipse.core.resources.IFile;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;

/**
 * EditElementWizard. TODO: privides extension point element editor. pluggable element edit page.
 */
public class EditElementWizard extends Wizard {

  static Object[] elementEditPages = new Object[] { 
  //  "a", AElementWizardPage.class,
  //  "img", ImgElementWizardPage.class,
      "dl", ListElementWizardPage.class, 
      "ul", ListElementWizardPage.class, 
      "ol", ListElementWizardPage.class, 
      "table", TableElementWizardPage.class };

  String targetElemName;

  ITextEditor htEditor;

  EditElementWizardPage rootPage;

  /**
   * Second argument specify element name, If specify null, call new element edit wizard page.
   */
  public EditElementWizard(ITextEditor editor, String targetElemName) {
    htEditor = editor;
    this.targetElemName = targetElemName;

    setWindowTitle("Edit HTML Element");
    setDefaultPageImageDescriptor(PHPUiImages.getImageRegistry().getDescriptor("wizban/editelem_wiz.gif"));

    setForcePreviousAndNextButtons(true);
  }

  public void addPages() {
    if (targetElemName == null) {
      rootPage = new NewElementWizardPage();
    } else {
      IDocument doc = getDocument();
      rootPage = createElementEditPage(targetElemName);
      rootPage.setEditType(EditElementWizardPage.MODIFY);
    }
    addPage(rootPage);
  }

  public boolean performFinish() {
    IWizardPage page = rootPage;
    for (IWizardPage p; (p = page.getNextPage()) != null;) {
      page = p;
    }
    if (page instanceof EditElementWizardPage) {
      ((EditElementWizardPage) page).performFinish();
    }
    return true;
  }

  public IDocument getDocument() {
    return htEditor.getDocumentProvider().getDocument(htEditor.getEditorInput());
  }

  public ITextSelection getSelection() {
    return (ITextSelection) htEditor.getSelectionProvider().getSelection();
  }

  public void setSelection(ITextSelection sel) {
    htEditor.getSelectionProvider().setSelection(sel);
  }

  public IFile getCurrentEditFile() {
    IEditorInput input = htEditor.getEditorInput();
    return (input instanceof IFileEditorInput) ? ((IFileEditorInput) input).getFile() : null;
  }

  /**
   * If not edit target returns UnknownElementWizardPage.
   */
  public EditElementWizardPage createElementEditPage(String elementName) {
    EditElementWizardPage page = null;
    try {
      for (int i = 0; i < elementEditPages.length; i += 2) {
        if (((String) elementEditPages[i]).equalsIgnoreCase(elementName)) {
          Class klass = (Class) elementEditPages[i + 1];
          page = (EditElementWizardPage) klass.newInstance();
        }
      }
    } catch (InstantiationException e) {
      PHPeclipsePlugin.log(e);
    } catch (IllegalAccessException e) {
      PHPeclipsePlugin.log(e);
    }
    if (page == null) {
      page = new UnknownElementWizardPage();
    }
    page.setElementName(elementName);
    page.setWizard(this);

    return page;
  }

}