/*******************************************************************************
 * 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.DialogCellEditor;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

public class ExtendedAgileDialogCellEditor extends DialogCellEditor {

	private EditingDomain editingDomain;

	private Object affectedObject;

	private boolean dialogOpen = false;

	private IItemPropertyDescriptor itemPropertyDescriptor;

	private ILabelProvider labelProvider;

	public ExtendedAgileDialogCellEditor(AgileGrid agileGrid,
			EditingDomain editingDomain,
			IItemPropertyDescriptor itemPropertyDescriptor, Object object) {
		super(agileGrid);
		this.editingDomain = editingDomain;
		this.itemPropertyDescriptor = itemPropertyDescriptor;
		this.affectedObject = object;
		labelProvider = ProrPropertyCellEditorProvider.getLabelProvider(
				this.itemPropertyDescriptor, this.affectedObject);
	}

	@Override
	protected void doSetValue(Object value) {
		super.doSetValue(value);
	}

	@Override
	protected Object doGetValue() {

		Object val = super.doGetValue();

		if (dialogOpen) {
			Command setCmd = SetCommand.create(editingDomain, affectedObject,
					itemPropertyDescriptor.getFeature(affectedObject), val);
			editingDomain.getCommandStack().execute(setCmd);
		}

		return val;

	}

	@Override
	protected Object openDialogBox(Control cellEditorWindow) {
		dialogOpen = true;
		return null;
	}

	@Override
	protected void updateContents(Object object) {
		if (getDefaultLabel() != null && labelProvider != null) {
			getDefaultLabel().setText(labelProvider.getText(object));
		}
	}

	@Override
	protected Button createButton(Composite parent) {
		Button result = new Button(parent, SWT.DOWN);
		result.setText("..."); //$NON-NLS-1$
		return result;
	}

}
