package org.eclipse.epf.authoring.ui.providers;

import java.util.Map;

import org.eclipse.epf.authoring.ui.forms.ChecklistItemsPage;
import org.eclipse.epf.authoring.ui.forms.ContentElementGuidancePage;
import org.eclipse.epf.authoring.ui.forms.ContentPackageDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.CustomCategoryAssignPage;
import org.eclipse.epf.authoring.ui.forms.CustomCategoryDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.DisciplineDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.DisciplineGroupingDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.DisciplineGroupingDisciplinesPage;
import org.eclipse.epf.authoring.ui.forms.DisciplineReferenceWorkflowPage;
import org.eclipse.epf.authoring.ui.forms.DisciplineTasksPage;
import org.eclipse.epf.authoring.ui.forms.DomainDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.DomainWorkProductsPage;
import org.eclipse.epf.authoring.ui.forms.GuidanceDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.GuidanceWithAttachmentsDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.MethodLibraryDescriptionFormPage;
import org.eclipse.epf.authoring.ui.forms.MethodPluginDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.PracticeDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.PracticeReferencesPage;
import org.eclipse.epf.authoring.ui.forms.RoleCategoriesPage;
import org.eclipse.epf.authoring.ui.forms.RoleDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.RoleSetDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.RoleSetGroupingDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.RoleSetGroupingRoleSets;
import org.eclipse.epf.authoring.ui.forms.RoleSetRolesPage;
import org.eclipse.epf.authoring.ui.forms.RoleWorkProductsPage;
import org.eclipse.epf.authoring.ui.forms.TaskCategoriesPage;
import org.eclipse.epf.authoring.ui.forms.TaskDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.TaskRolesPage;
import org.eclipse.epf.authoring.ui.forms.TaskStepsPage;
import org.eclipse.epf.authoring.ui.forms.TaskWorkProductsPage;
import org.eclipse.epf.authoring.ui.forms.ToolDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.ToolToolMentorsPage;
import org.eclipse.epf.authoring.ui.forms.WorkProductCategoriesPage;
import org.eclipse.epf.authoring.ui.forms.WorkProductDeliverablePartsPage;
import org.eclipse.epf.authoring.ui.forms.WorkProductDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.WorkProductTypeDescriptionPage;
import org.eclipse.epf.authoring.ui.forms.WorkProductTypeWorkProductsPage;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.uma.Checklist;
import org.eclipse.epf.uma.ContentPackage;
import org.eclipse.epf.uma.CustomCategory;
import org.eclipse.epf.uma.Deliverable;
import org.eclipse.epf.uma.Discipline;
import org.eclipse.epf.uma.DisciplineGrouping;
import org.eclipse.epf.uma.Domain;
import org.eclipse.epf.uma.Guidance;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.epf.uma.Practice;
import org.eclipse.epf.uma.Role;
import org.eclipse.epf.uma.RoleSet;
import org.eclipse.epf.uma.RoleSetGrouping;
import org.eclipse.epf.uma.Task;
import org.eclipse.epf.uma.Tool;
import org.eclipse.epf.uma.WorkProduct;
import org.eclipse.epf.uma.WorkProductType;
import org.eclipse.ui.forms.editor.FormEditor;

public class MethodElementEditorDefaultPageProvider implements
		IMethodElementEditorPageProviderExtension {

	public Map<Object, String> getPages(Map<Object,String> pageMap, FormEditor editor, Object input) {
		if (input instanceof MethodLibrary) {
			pageMap.put(new MethodLibraryDescriptionFormPage(editor), null);
		} else if (input instanceof MethodPlugin) {
			pageMap.put(new MethodPluginDescriptionPage(editor), null);
		} else if (input instanceof ContentPackage) {
			pageMap.put(new ContentPackageDescriptionPage(editor), null);
		} else if (input instanceof Role) {
			pageMap.put(new RoleDescriptionPage(editor), null);
			pageMap.put(new RoleWorkProductsPage(editor), null);
			pageMap.put(new ContentElementGuidancePage(editor), null);
			pageMap.put(new RoleCategoriesPage(editor), null);
		} else if (input instanceof Task) {
			pageMap.put(new TaskDescriptionPage(editor), null);
			pageMap.put(new TaskStepsPage(editor), null);
			pageMap.put(new TaskRolesPage(editor), null);
			pageMap.put(new TaskWorkProductsPage(editor), null);
			pageMap.put(new ContentElementGuidancePage(editor), null);
			pageMap.put(new TaskCategoriesPage(editor), null);
		} else if (input instanceof WorkProduct) {
			pageMap.put(new WorkProductDescriptionPage(editor), null);
			if (input instanceof Deliverable) {
				pageMap.put(new WorkProductDeliverablePartsPage(editor), null);
			}
			pageMap.put(new ContentElementGuidancePage(editor), null);
			pageMap.put(new WorkProductCategoriesPage(editor), null);
		} else if (input instanceof Guidance) {
			if (TngUtil.isAllowedAttachments((Guidance)input)) {
				pageMap.put(new GuidanceWithAttachmentsDescriptionPage(editor), null);
			} else if (input instanceof Practice) {
				pageMap.put(new PracticeDescriptionPage(editor), null);
				pageMap.put(new PracticeReferencesPage(editor), null);
			} else if (input instanceof Checklist) {
				pageMap.put(new GuidanceDescriptionPage(editor), null);
				pageMap.put(new ChecklistItemsPage(editor), null);
			} else {
				pageMap.put(new GuidanceDescriptionPage(editor), null);
			}
			if (!(input instanceof Practice))
				pageMap.put(new ContentElementGuidancePage(editor), null);
		} else if (input instanceof Discipline) {
			pageMap.put(new DisciplineDescriptionPage(editor), null);
			pageMap.put(new DisciplineTasksPage(editor), null);
			pageMap.put(new DisciplineReferenceWorkflowPage(editor), null);
			pageMap.put(new ContentElementGuidancePage(editor), null);
		} else if (input instanceof DisciplineGrouping) {
			pageMap.put(new DisciplineGroupingDescriptionPage(editor), null);
			pageMap.put(new DisciplineGroupingDisciplinesPage(editor), null);
		} else if (input instanceof Domain) {
			pageMap.put(new DomainDescriptionPage(editor), null);
			pageMap.put(new DomainWorkProductsPage(editor), null);
			pageMap.put(new ContentElementGuidancePage(editor), null);
		} else if (input instanceof WorkProductType) {
			pageMap.put(new WorkProductTypeDescriptionPage(editor), null);
			pageMap.put(new WorkProductTypeWorkProductsPage(editor), null);
			pageMap.put(new ContentElementGuidancePage(editor), null);
		} else if (input instanceof RoleSet) {
			pageMap.put(new RoleSetDescriptionPage(editor), null);
			pageMap.put(new RoleSetRolesPage(editor), null);
			pageMap.put(new ContentElementGuidancePage(editor), null);
		} else if (input instanceof RoleSetGrouping) {
			pageMap.put(new RoleSetGroupingDescriptionPage(editor), null);
			pageMap.put(new RoleSetGroupingRoleSets(editor), null);
		} else if (input instanceof Tool) {
			pageMap.put(new ToolDescriptionPage(editor), null);
			pageMap.put(new ToolToolMentorsPage(editor), null);
			pageMap.put(new ContentElementGuidancePage(editor), null);
		} else if (input instanceof CustomCategory) {
			pageMap.put(new CustomCategoryDescriptionPage(editor), null);
			pageMap.put(new CustomCategoryAssignPage(editor), null);
		}
		return pageMap;
	}
}
