//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//-------------------------------------------------------------------------------------
package org.eclipse.epf.richtext.tests.editors;

/**
 * A multi-page HTML editor built with a rich text control.
 * 
 * @author Kelvin Low
 * @since 1.0
 */
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.epf.richtext.IRichText;
import org.eclipse.epf.richtext.RichText;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.MultiPageEditorPart;

public class MultiPageHTMLEditor extends MultiPageEditorPart {
	
	// The Rich Text editor.
	private IRichText richTextEditor;
	
	// The HTML source editor.
	private Text htmlEditor;
	
	/**
	 * Creates a new instance.
	 */
	public MultiPageHTMLEditor() {
		super();
	}
	
	/**
	 * @see org.eclipse.ui.part.EditorPart#init(IEditorSite, IEditorInput)
	 */
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
    	super.init(site, input);
	    setPartName(input.getName());	
    }
    
	/**
	 * @see org.eclipse.ui.part.MultiPageEditorPart#createPage()
	 */
    protected void createPages() {
    	createRichTextPage();
    	createSourcePage();
	}
	
    /**
     * Creates the Rich Text page.
     */
    protected void createRichTextPage() {
		richTextEditor = new RichText(getContainer(), SWT.NONE);
		int index = addPage(richTextEditor.getControl());
		setPageText(index, "Rich Text");
    }
    
    /**
     * Creates the HTML Source page.
     */
    protected void createSourcePage() {
    	htmlEditor = new Text(getContainer(), SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
		int index = addPage(htmlEditor);
		setPageText(index, "HTML");
    }    
    
	/**
	 * @see org.eclipse.ui.part.MultiPageEditorPart#pageChange(int)
	 */
	protected void pageChange(int newPageIndex) {
		super.pageChange(newPageIndex);
		switch (newPageIndex) {
			case 0:
				richTextEditor.setText(htmlEditor.getText());			
				break;
			case 1:
				htmlEditor.setText(richTextEditor.getText());			
				break;
		}
	}
	
	/**
	 * @see org.eclipse.ui.part.EditorPart#disDirty()
	 */    
    public boolean isDirty() {
    	return false;
    }
    
	/**
	 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
	 */  
    public boolean isSaveAsAllowed() {
    	return false;
    }
    
	/**
	 * @see org.eclipse.ui.part.EditorPart#doSave(IProgressMonitor)
	 */
    public void doSave(IProgressMonitor monitor) {
    }
    
	/**
	 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
	 */    
    public void doSaveAs() {
    }
    
}
