/***************************************************************************************************
 * Copyright (c) 2003, 2004 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 API and implementation
 **************************************************************************************************/
/*
 * Created on May 5, 2004
 * 
 * TODO To change the template for this generated file go to Window - Preferences - Java - Code
 * Generation - Code and Comments
 */
package org.eclipse.wst.common.frameworks.internal.operation.extensionui;

import java.util.Iterator;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.internal.ActionExpression;
import org.eclipse.wst.common.frameworks.internal.ui.WTPCommonUIResourceHandler;

import org.eclipse.jem.util.logger.proxy.Logger;

public class MasterDescriptor extends SlaveDescriptor {

	public static final String MASTER_OPERATION = "masterOperation"; //$NON-NLS-1$

	public static final String ATT_EXTENDED_OPERATION_ID = "extendedGenericId"; //$NON-NLS-1$

	public static final String SELECTION_ENABLEMENT = "selectionEnablement"; //$NON-NLS-1$

	private static final String ATT_POPULATOR_CLASS = "populatorClass"; //$NON-NLS-1$

	private static final String ATT_ALWAYS_EXECUTE = "alwaysExecute"; //$NON-NLS-1$

	private ActionExpression enablement;

	private String extendedOperationId;

	private WTPOperationDataModelUICreator creator;

	private boolean alwaysExecute;


	public MasterDescriptor(IConfigurationElement element) {
		super(element);
		init();
	}

	private void init() {
		this.extendedOperationId = getElement().getAttribute(ATT_EXTENDED_OPERATION_ID);
		if (null == extendedOperationId)
			Logger.getLogger().log(WTPCommonUIResourceHandler.getString("MasterDescriptor_UI_0", new Object[]{ATT_EXTENDED_OPERATION_ID})); //$NON-NLS-1$


		if (Boolean.valueOf(getElement().getAttribute(ATT_ALWAYS_EXECUTE)).booleanValue())
			alwaysExecute = true;

		IConfigurationElement[] elements = getElement().getChildren(SELECTION_ENABLEMENT);
		if (elements.length == 1)
			this.enablement = new ActionExpression(elements[0]);
		else
			Logger.getLogger().log(WTPCommonUIResourceHandler.getString("MasterDescriptor_ERROR_2")); //$NON-NLS-1$

	}

	/**
	 * @return Returns the extendedOperationId.
	 */
	public String getExtendedOperationId() {
		return extendedOperationId;
	}


	public boolean isEnabledFor(IStructuredSelection selection) {
		if (getEnablement() == null)
			return true;
		boolean result = false;
		for (Iterator itr = selection.iterator(); itr.hasNext();) {
			result = getEnablement().isEnabledFor(itr.next());
			if (result)
				break;
		}
		return result;
	}

	public WTPOperationDataModelUICreator getCreator() {
		if (creator == null) {
			try {
				creator = (WTPOperationDataModelUICreator) getElement().createExecutableExtension(ATT_POPULATOR_CLASS);
			} catch (CoreException e) {
				Logger.getLogger().logError(e);
			}
		}
		return creator;
	}

	protected ActionExpression getEnablement() {
		return enablement;
	}


	/**
	 * @return Returns the alwaysExecute.
	 */
	public boolean isAlwaysExecute() {
		return alwaysExecute;
	}
}