/*******************************************************************************
 * Copyright (c) 2005, 2012 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.ui.actions.editpart;

import org.eclipse.bpel.model.Invoke;
import org.eclipse.bpel.model.Variable;
import org.eclipse.bpel.ui.BPELUIPlugin;
import org.eclipse.bpel.ui.IBPELUIConstants;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.commands.SetVariableCommand;
import org.eclipse.bpel.ui.dialogs.VariableSelectorDialog;
import org.eclipse.bpel.ui.util.ModelHelper;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Shell;


/**
 * Action for setting a REQUEST or RESPONSE variable.
 */
public class SetVariableAction extends AbstractAction {

	public static final int REQUEST = 1;
	public static final int RESPONSE = 2;
	
	protected int type;
	
	/**
	 * The type can be REQUEST or RESPONSE.
	 */
	public SetVariableAction(EditPart editPart, int type) {
		super(editPart);
		this.type = type;
	}

	public Image getIconImg() {
		if (type == RESPONSE) {
			return BPELUIPlugin.INSTANCE.getImage(IBPELUIConstants.ICON_ACTION_OUTGOING);
		}
		return BPELUIPlugin.INSTANCE.getImage(IBPELUIConstants.ICON_ACTION_INCOMING);
	}

	public ImageDescriptor getIcon() {
		if (type == RESPONSE) {
			return BPELUIPlugin.INSTANCE.getImageDescriptor(IBPELUIConstants.ICON_ACTION_OUTGOING);
		}
		return BPELUIPlugin.INSTANCE.getImageDescriptor(IBPELUIConstants.ICON_ACTION_INCOMING);
	}

	public boolean onButtonPressed() {
		Shell shell = viewer.getControl().getShell();
		EObject model = (EObject)editPart.getModel();
		VariableSelectorDialog dialog = new VariableSelectorDialog(shell, model, ModelHelper.getVariableType(model, getDirection()));
		dialog.setTitle(getDialogTitle());
		if (dialog.open() == Window.OK) {
			Variable variable = dialog.getVariable();
			Command command = new SetVariableCommand(model, variable, getDirection());
			viewer.getEditDomain().getCommandStack().execute(command);
		}
		return true;
	}
	
	protected int getDirection() {
		if (modelObject instanceof Invoke) {
			return (type == RESPONSE) ? ModelHelper.INCOMING : ModelHelper.OUTGOING;
		}
		return (type == RESPONSE) ? ModelHelper.OUTGOING : ModelHelper.INCOMING;
	}

	protected String getDialogTitle() {
		if (type == RESPONSE) {
			return Messages.SetVariableAction_Select_Response_Variable_2; 
		}
		return Messages.SetVariableAction_Select_Request_Variable_2; 
	}
	
	public String getToolTip() {
		if (type == RESPONSE) {
			return Messages.SetResponseVarAction_Set_Response_Variable_1; 
		}
		return Messages.SetRequestVarAction_Set_Request_Variable_1; 
	}
	
	@Override
	public ImageDescriptor getDisabledIcon() { return ImageDescriptor.getMissingImageDescriptor(); }
	@Override
	public boolean isEnabled() { return true; }	
}