/*
 * 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.diagramming.view.factories;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.epf.diagramming.base.view.DiagramImpl;
import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
import org.eclipse.gmf.runtime.diagram.ui.view.factories.DiagramViewFactory;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.MeasurementUnit;
import org.eclipse.gmf.runtime.notation.NotationFactory;
import org.eclipse.gmf.runtime.notation.View;

/**
 * @generated
 */
public class ActivityViewFactory extends DiagramViewFactory {

	/**
	 * @generated 
	 */
	protected List createStyles(View view) {
		List styles = new ArrayList();
		styles.add(NotationFactory.eINSTANCE.createPageStyle());
		styles.add(NotationFactory.eINSTANCE.createGuideStyle());
		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
		return styles;
	}

	/**
	 * @generated
	 */
	protected void decorateView(View view, IAdaptable semanticAdapter,
			String diagramKind) {
		super.decorateView(view, semanticAdapter, diagramKind);
	}

	/**
	 * 
	 * @see org.eclipse.gmf.runtime.diagram.ui.view.factories.DiagramViewFactory#createDiagram(org.eclipse.core.runtime.IAdaptable, java.lang.String, org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint)
	 * @modified
	 */
	public Diagram createDiagram(IAdaptable semanticAdapter,
			String diagramKind, PreferencesHint thePreferencesHint) {
		setPreferencesHint(thePreferencesHint);
		Diagram diagram = new DiagramImpl();
		List styles = createStyles(diagram);
		if (styles.size() > 0) {
			diagram.getStyles().addAll(styles);
		}

		if (diagramKind != null)
			diagram.setType(diagramKind);
		if (semanticAdapter != null)
			diagram.setElement((EObject) semanticAdapter
					.getAdapter(EObject.class));
		else
			// enforce a set to NULL
			diagram.setElement(null);

		initializeMeasurementUnit(diagram);

		// do the necessary initializations (creating children, setting properties...etc)
		decorateView(diagram, semanticAdapter, diagramKind);

		return diagram;
	}

	/**
	 * 
	 * @param diagram
	 * @custom
	 */
	private void initializeMeasurementUnit(Diagram diagram) {
		if (!diagram.isSetMeasurementUnit()) {
			diagram.setMeasurementUnit(getMeasurementUnit());
		}
	}

	/**
	 * @generated
	 */
	protected MeasurementUnit getMeasurementUnit() {
		return MeasurementUnit.PIXEL_LITERAL;
	}

}
