//------------------------------------------------------------------------------
// 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.uma.Role;
import org.eclipse.epf.uma.UmaPackage;
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 for the Role editor.
 * 
 * @author Shilpa Toraskar
 * @author Kelvin Low
 * @since 1.0
 */
public class RoleDescriptionPage extends DescriptionFormPage {

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

	private static final String BASE_ROLE = AuthoringUIText.BASE_ELEMENT_TEXT;

	private IMethodRichText ctrl_skills;

	private IMethodRichText ctrl_assign;

	private IMethodRichText ctrl_synonyms;

	private Role role;

	/**
	 * Creates a new instance.
	 */
	public RoleDescriptionPage(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);
		role = (Role) contentElement;
		notationSectionOn = true;
		externalIdOn = true;
	}

	/**
	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#createEditorContent(FormToolkit)
	 */
	protected void createEditorContent(FormToolkit toolkit) {
		super.createEditorContent(toolkit);
		label_base.setText(BASE_ROLE);
	}

	/**
	 * Creates the Staffing section.
	 */
	protected void createNotationSectionContent() {
		super.createNotationSectionContent();
		notationSection.setText(AuthoringUIText.STAFFING_SECTION_NAME);
		notationSection.setDescription(AuthoringUIText.STAFFING_SECTION_DESC);
		ctrl_skills = createRichTextEditWithLinkForSection(toolkit,
				notationComposite, AuthoringUIText.SKILLS_TEXT, 40, 400,
				NOTATION_SECTION_ID);
		ctrl_assign = createRichTextEditWithLinkForSection(toolkit,
				notationComposite, AuthoringUIText.ASSIGNMENT_APPROACHES_TEXT,
				40, 400, NOTATION_SECTION_ID);
		ctrl_synonyms = createRichTextEditWithLinkForSection(toolkit,
				notationComposite, AuthoringUIText.SYNONYMS_TEXT, 40, 400,
				NOTATION_SECTION_ID);
	}

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

		final MethodElementEditor editor = (MethodElementEditor) getEditor();

		if (notationSectionOn) {
			ctrl_skills.setModalObject(contentElement.getPresentation());
			ctrl_skills.setModalObjectFeature(UmaPackage.eINSTANCE
					.getRoleDescription_Skills());
			ctrl_skills.addModifyListener(contentModifyListener);
			ctrl_skills.addListener(SWT.Deactivate, new Listener() {
				public void handleEvent(Event e) {
					IMethodRichText control = descExpandFlag ? ctrl_expanded
							: ctrl_skills;
					if (!control.getModified()) {
						return;
					}
					String oldContent = ((org.eclipse.epf.uma.RoleDescription) role
							.getPresentation()).getSkills();
					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.getRoleDescription_Skills(),
								newContent, -1);
						if (success && isVersionSectionOn()) {
							updateChangeDate();
						}
					}
				}
			});

			ctrl_assign.setModalObject(contentElement.getPresentation());
			ctrl_assign.setModalObjectFeature(UmaPackage.eINSTANCE
					.getRoleDescription_AssignmentApproaches());
			ctrl_assign.addModifyListener(contentModifyListener);
			ctrl_assign.addListener(SWT.Deactivate, new Listener() {
				public void handleEvent(Event e) {
					IMethodRichText control = descExpandFlag ? ctrl_expanded
							: ctrl_assign;
					if (!control.getModified()) {
						return;
					}
					String oldContent = ((org.eclipse.epf.uma.RoleDescription) role
							.getPresentation()).getAssignmentApproaches();
					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
										.getRoleDescription_AssignmentApproaches(),
								newContent, -1);
						if (success && isVersionSectionOn()) {
							updateChangeDate();
						}
					}
				}
			});

			ctrl_synonyms.setModalObject(contentElement.getPresentation());
			ctrl_synonyms.setModalObjectFeature(UmaPackage.eINSTANCE
					.getRoleDescription_Synonyms());
			ctrl_synonyms.addModifyListener(contentModifyListener);
			ctrl_synonyms.addListener(SWT.Deactivate, new Listener() {
				public void handleEvent(Event e) {
					IMethodRichText control = descExpandFlag ? ctrl_expanded
							: ctrl_synonyms;
					if (!control.getModified()) {
						return;
					}
					String oldContent = ((org.eclipse.epf.uma.RoleDescription) role
							.getPresentation()).getSynonyms();
					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.getRoleDescription_Synonyms(),
								newContent, -1);
						if (success && isVersionSectionOn()) {
							updateChangeDate();
						}
					}
				}
			});
		}
	}

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

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

		if (notationSectionOn) {
			String skills = ((org.eclipse.epf.uma.RoleDescription) role.getPresentation())
					.getSkills();
			String assign = ((org.eclipse.epf.uma.RoleDescription) role.getPresentation())
					.getAssignmentApproaches();
			String synonyms = ((org.eclipse.epf.uma.RoleDescription) role.getPresentation())
					.getSynonyms();
	
			ctrl_skills.setText(skills == null ? "" : skills); //$NON-NLS-1$
			ctrl_assign.setText(assign == null ? "" : assign); //$NON-NLS-1$
			ctrl_synonyms.setText(synonyms == null ? "" : synonyms); //$NON-NLS-1$
		}
	}

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

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

	/**
	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
	 */
	protected IFilter getFilter() {
		filter = new ContentFilter() {
			protected boolean childAccept(Object obj) {
				return (obj instanceof Role);
			}
		};

		// Set additional filter for variability base element checking.
		((ContentFilter) filter)
				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
						role) });
		return filter;
	}
	
	
	/**
	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
	 */
	public void loadSectionDescription() {
		this.generalSectionDescription = AuthoringUIResources.role_generalInfoSection_desc;
		this.detailSectionDescription = AuthoringUIResources.role_detailSection_desc;
		this.variabilitySectionDescription = AuthoringUIResources.role_variabilitySection_desc;
		this.versionSectionDescription = AuthoringUIResources.role_versionInfoSection_desc;
	}

}