//------------------------------------------------------------------------------
// 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.authoring.ui.forms;

import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.authoring.ui.AuthoringUIText;
import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
import org.eclipse.epf.authoring.ui.filters.ContentFilter;
import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
import org.eclipse.epf.library.edit.IFilter;
import org.eclipse.epf.library.edit.command.IActionManager;
import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
import org.eclipse.epf.library.edit.itemsfilter.VariabilityBaseElementFilter;
import org.eclipse.epf.library.ui.LibraryUIText;
import org.eclipse.epf.uma.Checklist;
import org.eclipse.epf.uma.Concept;
import org.eclipse.epf.uma.ContentElement;
import org.eclipse.epf.uma.EstimationConsiderations;
import org.eclipse.epf.uma.Example;
import org.eclipse.epf.uma.Guidance;
import org.eclipse.epf.uma.Guideline;
import org.eclipse.epf.uma.Practice;
import org.eclipse.epf.uma.Report;
import org.eclipse.epf.uma.ReusableAsset;
import org.eclipse.epf.uma.Roadmap;
import org.eclipse.epf.uma.SupportingMaterial;
import org.eclipse.epf.uma.Template;
import org.eclipse.epf.uma.TermDefinition;
import org.eclipse.epf.uma.ToolMentor;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.Whitepaper;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.widgets.FormToolkit;


/**
 * The Description page in a Guidance editor.
 * 
 * @author Kelvin Low
 * @author Shilpa Toraskar
 * @since 1.0
 */
public class GuidanceDescriptionPage extends DescriptionFormPage {

	private static final String FORM_PAGE_ID = "guidanceDescriptionPage"; //$NON-NLS-1$

	protected Guidance guidance;

	private String elementLabel;

	private IMethodRichText ctrl_content;

	private int contentFieldHeight = 400;

	/**
	 * Creates a new instance.
	 */
	public GuidanceDescriptionPage(FormEditor editor) {
		super(editor, FORM_PAGE_ID, AuthoringUIText.DESCRIPTION_PAGE_TITLE);
	}

	/**
	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
	 */
	public void init(IEditorSite site, IEditorInput input) {
		super.init(site, input);
		guidance = (Guidance) contentElement;
		elementLabel = LibraryUIText.getUIText(guidance);
		setElementTypeOn(true);
		if (guidance instanceof TermDefinition)
			setBriefDescOn(false);
		setFullDescOn(false);
		setKeyConsiderationOn(false);
		setIconSectionOn(true);
		setExternalIDOn(true);
	}

	/**
	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFormPrefix()
	 */
	protected String getFormPrefix() {
		return new StringBuffer(LibraryUIText.TEXT_GUIDANCE)
				.append(" (").append(elementLabel).append("): ").toString(); //$NON-NLS-1$ //$NON-NLS-2$	
	}

	/**
	 * Creates the editor tab content
	 * 
	 * @param toolkit
	 *            The form toolkit.
	 */
	protected void createEditorContent(FormToolkit toolkit) {
		super.createEditorContent(toolkit);
		ctrl_content = createRichTextEditWithLinkForSection(toolkit,
				detailComposite, AuthoringUIText.MAIN_DESCRIPTION_TEXT,
				contentFieldHeight, 400, DETAIL_SECTION_ID);
	}

	/**
	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#addListeners()
	 */
	protected void addListeners() {
		super.addListeners();

		final MethodElementEditor editor = (MethodElementEditor) getEditor();

		ctrl_content.setModalObject(contentElement.getPresentation());
		ctrl_content.setModalObjectFeature(UmaPackage.eINSTANCE
				.getContentDescription_MainDescription());
		ctrl_content.addModifyListener(contentModifyListener);
		ctrl_content.addListener(SWT.Deactivate, new Listener() {
			public void handleEvent(Event e) {
				IMethodRichText control = descExpandFlag ? ctrl_expanded
						: ctrl_content;
				if (!control.getModified()) {
					return;
				}
				String oldContent = guidance.getPresentation()
						.getMainDescription();
				if (((MethodElementEditor) getEditor()).mustRestoreValue(
						control, oldContent)) {
					return;
				}
				String newContent = control.getText();
				if (!newContent.equals(oldContent)) {
					boolean success = editor.getActionManager().doAction(
							IActionManager.SET,
							contentElement.getPresentation(),
							UmaPackage.eINSTANCE
									.getContentDescription_MainDescription(),
							newContent, -1);
					if (success && isVersionSectionOn()) {
						updateChangeDate();
					}
				}
			}
		});
	}

	/**
	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#refresh(boolean)
	 */
	protected void refresh(boolean editable) {
		super.refresh(editable);
		ctrl_content.setEditable(editable);
	}

	/**
	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadData()
	 */
	protected void loadData() {
		super.loadData();
		if (guidance != null) {
			String content = null;
			if (guidance.getPresentation() != null) {
				content = guidance.getPresentation().getMainDescription();
			}
			ctrl_content.setText(content == null ? "" : content); //$NON-NLS-1$
		}
	}

	/**
	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
	 */
	protected Object getContentElement() {
		return guidance;
	}

	/**
	 * Returns the height of the Main Description text box.
	 */
	public int getContentFieldHeight() {
		return contentFieldHeight;
	}

	/**
	 * Sets the height of the Main Description text box.
	 */
	public void setContentFieldHeight(int contentFieldHeight) {
		this.contentFieldHeight = contentFieldHeight;
	}

	/**
	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
	 */
	protected String getTabString() {
		return FilterConstants.GUIDANCE;
	}

	/**
	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
	 */
	protected IFilter getFilter() {
		filter = new ContentFilter() {
			protected boolean childAccept(Object obj) {
				if (obj instanceof Guidance) {
					return (((ContentElement) obj).getType()
							.equals(((Guidance) contentElement).getType()));
				}
				return false;
			}
		};

		// Set additional filter for variability base element checking.
		((ContentFilter) filter)
				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
						guidance) });
		return filter;
	}
	
	/**
	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
	 */
	public void loadSectionDescription() {
		if(contentElement instanceof Whitepaper){
			this.generalSectionDescription = AuthoringUIResources.whitepaper_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.whitepaper_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.whitepaper_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.whitepaper_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.whitepaper_iconSection_desc;
		}
		else if(contentElement instanceof Concept){
			this.generalSectionDescription = AuthoringUIResources.concept_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.concept_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.concept_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.concept_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.concept_iconSection_desc;
		}
		else if(contentElement instanceof Checklist){
			this.generalSectionDescription = AuthoringUIResources.checklist_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.checklist_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.checklist_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.checklist_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.checklist_iconSection_desc;
		}
		else if(contentElement instanceof Example){
			this.generalSectionDescription = AuthoringUIResources.example_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.example_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.example_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.example_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.example_iconSection_desc;
		}
		else if(contentElement instanceof Guideline){
			this.generalSectionDescription = AuthoringUIResources.guideline_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.guideline_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.guideline_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.guideline_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.guideline_iconSection_desc;
		}
		else if(contentElement instanceof EstimationConsiderations){
			this.generalSectionDescription = AuthoringUIResources.estimationconsideration_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.estimationconsideration_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.estimationconsideration_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.estimationconsideration_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.estimationconsideration_iconSection_desc;
		}
		else if(contentElement instanceof Practice){
			this.generalSectionDescription = AuthoringUIResources.practice_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.practice_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.practice_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.practice_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.practice_iconSection_desc;
		}
		else if(contentElement instanceof SupportingMaterial){
			this.generalSectionDescription = AuthoringUIResources.supportingmaterial_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.supportingmaterial_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.supportingmaterial_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.supportingmaterial_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.supportingmaterial_iconSection_desc;
		}
		else if(contentElement instanceof Report){
			this.generalSectionDescription = AuthoringUIResources.report_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.report_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.report_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.report_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.report_iconSection_desc;
		}
		else if(contentElement instanceof Roadmap){
			this.generalSectionDescription = AuthoringUIResources.roadmap_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.roadmap_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.roadmap_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.roadmap_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.roadmap_iconSection_desc;
		}
		else if(contentElement instanceof Template){
			this.generalSectionDescription = AuthoringUIResources.template_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.template_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.template_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.template_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.template_iconSection_desc;
		}
		else if(contentElement instanceof TermDefinition){
			this.generalSectionDescription = AuthoringUIResources.termdefinition_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.termdefinition_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.termdefinition_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.termdefinition_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.termdefinition_iconSection_desc;
		}
		else if(contentElement instanceof ReusableAsset){
			this.generalSectionDescription = AuthoringUIResources.resuableasset_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.resuableasset_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.resuableasset_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.resuableasset_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.reusableasset_iconSection_desc;
		}
		else if(contentElement instanceof ToolMentor){
			this.generalSectionDescription = AuthoringUIResources.toolmentor_generalInfoSection_desc;
			this.detailSectionDescription = AuthoringUIResources.toolmentor_detailSection_desc;
			this.variabilitySectionDescription = AuthoringUIResources.toolmentor_variabilitySection_desc;
			this.versionSectionDescription = AuthoringUIResources.toolmentor_versionInfoSection_desc;
			this.iconSectionDescription = AuthoringUIResources.toolmentor_iconSection_desc;
		}
	}

}