//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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.diagram.core.util;

import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.epf.common.serviceability.MsgDialog;
import org.eclipse.epf.diagram.core.DiagramCorePlugin;
import org.eclipse.epf.diagram.core.DiagramCoreResources;
import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
import org.eclipse.epf.diagram.model.NamedNode;
import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
import org.eclipse.epf.library.edit.util.ProcessUtil;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.BreakdownElement;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.tools.CellEditorLocator;
import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.swt.widgets.Display;
import org.eclipse.uml2.uml.ActivityNode;

/**
 * Manages and validates the direct editing of editpart. Prompts accordingly.  
 * Should implement abstract methods when extends.
 */
public abstract class ValidatingTextDirectEditManager extends TextDirectEditManager {

	public ValidatingTextDirectEditManager(GraphicalEditPart source, Class editorType, CellEditorLocator locator) {
		super(source, editorType, locator);
	}
	
	/**
	 * @see org.eclipse.gef.tools.DirectEditManager#commit()
	 */
	protected void commit() {
		String msg = validate((String) getCellEditor().getValue());
		if (msg != null) {
			bringDown(false);
			Display.getCurrent().asyncExec(
					new PromptEdit(this, msg));
			return;
		}
		super.commit();
	}
	
	/**
	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
	 */
	protected void bringDown() {
		bringDown(true);
	}

	/**
	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
	 */
	protected void bringDown(boolean check) {
		super.bringDown();
		if (check) {
			Node node = (Node) getEditPart().getModel();
			EObject aNode = node.getElement();
			String name = null;
			if (aNode instanceof ActivityNode) {
				name = ((ActivityNode)aNode).getName();
				Object wbelement = BridgeHelper.getMethodElement((EModelElement)aNode);
				if (wbelement instanceof Activity
						&& ProcessUtil
								.isExtendingOrLocallyContributing((BreakdownElement) wbelement)) {
					name = ProcessUtil
							.getPresentationName((BreakdownElement) wbelement);
				}

			}else if(aNode instanceof NamedNode){
				NamedNode nameNode = (NamedNode) aNode;
				name = nameNode.getName();
				if (node instanceof WorkBreakdownElementNode) {
					Object wbelement = nameNode.getObject();
					if (wbelement instanceof Activity
							&& ProcessUtil
									.isExtendingOrLocallyContributing((BreakdownElement) wbelement)) {
						name = ProcessUtil
								.getPresentationName((BreakdownElement) wbelement);
					}

				}
			}
			
			if (name == null || name.trim().length() == 0) {
				Display.getCurrent().asyncExec(
						new PromptEdit(this,DiagramCoreResources.err_name_empty)); //$NON-NLS-1$
			}
		}
	}


	static class PromptEdit implements Runnable {

		private ValidatingTextDirectEditManager manager;

		private String msg;

		PromptEdit(ValidatingTextDirectEditManager manager, String msg) {
			this.manager = manager;
			this.msg = msg;
		}

		/**
		 * @see java.lang.Runnable#run()
		 */
		public void run() {
			String title = DiagramCoreResources.diagram_errorDialog_title;
			MsgDialog dialog = DiagramCorePlugin.getDefault().getMsgDialog();
			dialog.displayError(title, msg); //$NON-NLS-1$
			manager.performDirectEdit();
		}

	}
	
	/**
	 * Checks if the given text is valid. Subclasses can override this method.
	 * 
	 * @param txt
	 * @return null if the given text is valid, an error message otherwise
	 */
	protected abstract String validate(String txt);
	
	protected abstract void performDirectEdit();
}
