/*******************************************************************************
 * Copyright (c) 2011, 2012 Formal Mind GmbH and University of Dusseldorf.
 * 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:
 *     Michael Jastram - initial API and implementation
 *     Lukas Ladenberger - ProR GUI
 ******************************************************************************/
package org.eclipse.rmf.reqif10.pror.editor.propertiesview;

import org.agilemore.agilegrid.AgileGrid;
import org.agilemore.agilegrid.editors.TextCellEditor;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.rmf.reqif10.pror.editor.propertiesview.ProrPropertyCellEditorProvider.EDataTypeValueHandler;
import org.eclipse.rmf.reqif10.pror.editor.util.ProrEditorUtil;
import org.eclipse.swt.events.ModifyEvent;

public class EDataTypeAgileCellEditor extends TextCellEditor {

	protected EDataType eDataType;

	protected EDataTypeValueHandler valueHandler;

	private EditingDomain editingDomain;

	private Object affectedObject;

	private IItemPropertyDescriptor itemPropertyDescriptor;

	public EDataTypeAgileCellEditor(AgileGrid agileGrid,
			EditingDomain editingDomain,
			IItemPropertyDescriptor itemPropertyDescriptor, Object object,
			final EDataType eDataType) {
		super(agileGrid);
		this.eDataType = eDataType;
		valueHandler = new EDataTypeValueHandler(eDataType);
		this.itemPropertyDescriptor = itemPropertyDescriptor;
		this.editingDomain = editingDomain;
		this.affectedObject = object;
		setValidator(valueHandler);
	}

	@Override
	public Object doGetValue() {

		Object val = valueHandler.toValue((String) super.doGetValue());

		Command setCmd = SetCommand.create(editingDomain, affectedObject,
				itemPropertyDescriptor.getFeature(affectedObject), val);
		Command affectedObjectCommand = ProrEditorUtil
				.getAffectedObjectCommand(affectedObject, setCmd);
		editingDomain.getCommandStack().execute(affectedObjectCommand);

		return val;

	}

	@Override
	public void doSetValue(Object value) {
		value = valueHandler.toString(value);
		super.doSetValue(value);
	}

	// CellEditor.setValue() calls isCorrect() to validate the value that is
	// about to be set. We are doing conversion
	// between the value and a corresponding string, and we would usually like
	// to validate the string. Because
	// setValue() is final, we cannot do that conversion there, so we need to
	// record what we're trying to validate and
	// work around the problem in isCorrect().
	//
	protected boolean validateAsValue = true;

	@Override
	protected void editOccured(ModifyEvent e) {
		validateAsValue = false;
		super.editOccured(e);
		validateAsValue = true;
	}

	@Override
	protected boolean isCorrect(Object value) {
		if (validateAsValue) {
			value = valueHandler.toString(value);
		}
		return super.isCorrect(value);
	}

}
