/*******************************************************************************
 * Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) 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:
 *     Soyatec - initial API and implementation
 *******************************************************************************/
package org.eclipse.xwt.tools.ui.designer.core.editor;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.ui.IEditorPart;

/**
 * @author jliu (jin.liu@soyatec.com)
 */
public class EditDomain extends DefaultEditDomain {

	private Map<Object, Map<Object, Object>> viewerData;
	private Map<Object, Object> domainData;

	private List<EditPartViewer> viewers = new ArrayList<EditPartViewer>();

	/**
	 * @param editorPart
	 */
	public EditDomain(IEditorPart editorPart) {
		super(editorPart);
	}

	public void addViewer(EditPartViewer viewer) {
		super.addViewer(viewer);
		if (!viewers.contains(viewer)) {
			viewers.add(viewer);
		}
	}

	public void removeViewer(EditPartViewer viewer) {
		super.removeViewer(viewer);
		viewers.remove(viewer);
	}

	public List<EditPartViewer> getViewers() {
		return viewers;
	}

	/**
	 * @param graphicalViewer
	 * @param key
	 * @param zoomController
	 */
	public void setViewerData(GraphicalViewer viewer, Object key, Object data) {
		if (viewerData == null)
			viewerData = new HashMap<Object, Map<Object, Object>>(3);

		HashMap<Object, Object> vdata = (HashMap<Object, Object>) viewerData.get(viewer);
		if (vdata == null)
			viewerData.put(viewer, vdata = new HashMap<Object, Object>(3));
		vdata.put(key, data);
	}

	/**
	 * Get the data for the specified key for a particular viewer. Return null if the key is not set.
	 */
	public Object getViewerData(EditPartViewer viewer, Object key) {
		if (viewerData != null) {
			HashMap<Object, Object> data = (HashMap<Object, Object>) viewerData.get(viewer);
			if (data != null)
				return data.get(key);
		}
		return null;
	}

	public void setData(Object key, Object data) {
		if (domainData == null) {
			domainData = new HashMap<Object, Object>();
		}
		domainData.put(key, data);
	}

	public Object getData(Object key) {
		if (domainData == null) {
			return null;
		}
		return domainData.get(key);
	}

	public static EditDomain getEditDomain(EditPart ep) {
		if (ep != null) {
			EditPartViewer viewer = ep.getViewer();
			if (viewer == null ){
				return null;
			}
			return (EditDomain) viewer.getEditDomain();
		}
		return null;
	}
}
