/*******************************************************************************
 * Copyright (c) 2007 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is 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:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/ 

package org.jboss.tools.seam.ui.internal.project.facet;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.jboss.tools.common.ui.widget.editor.IFieldEditor;

/**
 * It is intended to collect all changes from Wizard Page and put it to 
 * IDataModel instance behind it.
 * @author eskimo
 *
 */
public class DataModelSynchronizer implements PropertyChangeListener {
	/**
	 * Target IDataModel instance
	 */
	protected IDataModel model;
	
	/**
	 * Map allows get particular IFieldEditor instance by its name. 
	 * It is used by register(IFieldEditor) method.
	 */
	Map<String,IFieldEditor> editors = new HashMap<String,IFieldEditor>();
	
	/**
	 * 
	 * @param model is a target IDataModel instance
	 */
	public DataModelSynchronizer(IDataModel model) {
		this.model = model;
	}

	/**
	 * This class implements PropertyChangeListener interface from Java Beans 
	 * API to receive property change events from registered IFieldEditors.
	 */
	public void propertyChange(PropertyChangeEvent evt) {
		model.setProperty(evt.getPropertyName(), evt.getNewValue());
	}

	/**
	 * 
	 * @param name - name of property from IDataModel instance
	 * @return IFieldEditor used to edit property with given name
	 */
	public IFieldEditor getNamedElement(String name) {
		return editors.get(name);
	}
	
	/**
	 * Registers a editor used to edit IDataModel property. 
	 * The name of editor and model property should be the same.
	 * @param editor - instance of IFiedEditor placed on IWizardPage
	 */
	public void register(IFieldEditor editor) {
		editors.put(editor.getName(), editor);
		model.setProperty(editor.getName(), editor.getValue());
		editor.addPropertyChangeListener(this);
	}
}
