/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.project.capabilities;
import java.lang.reflect.InvocationTargetException;
import java.util.Properties;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.*;
import org.jboss.tools.common.meta.action.impl.*;
import org.jboss.tools.common.model.*;
public class AddJSFCapabilitiesSupport extends SpecialWizardSupport {
static String ATTR_CAPABILITY = "capability";
CapabilitiesPerformer performer = new CapabilitiesPerformer();
public AddJSFCapabilitiesSupport() {}
public String getHelpKey() {
if(action == null) return null;
//Let it be the same for all entities
return action.getName() + "_" + getStepId();
}
public void reset() {
performer.init(getTarget().getModel());
getProperties().put("CapabilitiesPerformer", performer);
}
void setCapabilitiList() {
XModelObject[] os = JSFCapabilities.getInstance().getChildren();
String[] options = new String[os.length == 0 ? 1 : os.length];
for (int i = 0; i < os.length; i++) {
options[i] = os[i].getAttributeValue("name");
}
if(os.length == 0) options[0] = "";
setValueList(0, ATTR_CAPABILITY, options);
setAttributeValue(0, ATTR_CAPABILITY, options[0]);
}
public void action(String name) throws XModelException {
if(FINISH.equals(name)) {
boolean b = executeWithContext();
if(b) setStepId(1);
} else if(CLOSE.equals(name)) {
setFinished(true);
} else if(CANCEL.equals(name)) {
setFinished(true);
}
}
public String[] getActionNames(int stepId) {
if(stepId == 0) return new String[]{FINISH, CANCEL, HELP};
return new String[]{CLOSE, HELP};
}
protected boolean executeWithContext() throws XModelException {
IRunnableContext context = (IRunnableContext)getProperties().get("IRunnableContext");
final Executor executor = new Executor();
try {
context.run(false, true, executor);
} catch (InvocationTargetException e) {
throw new XModelException(e);
} catch (InterruptedException e) {
throw new XModelException(e);
}
if(executor.exception != null) XModelException.rethrow(executor.exception);
getProperties().put("addedCapabilities", (executor.added != null) ? executor.added : new String[0]);
return !executor.cancelled;
}
class Executor implements IRunnableWithProgress {
Exception exception = null;
String[] added;
boolean cancelled = false;
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
monitor.beginTask("" + getTitle(), getTaskCount());
try {
XJob.waitForJob(true);
} catch (InterruptedException e) {
//ignore
}
PerformerContext context = new PerformerContext(monitor);
try {
IPerformerItem[] items = performer.getChildren();
for (int i = 0; i < items.length; i++) {
if(!items[i].isSelected()) continue;
if(!items[i].execute(context)) {
//do nothing
}
monitor.worked(getTaskCount(items[i], 0));
}
} catch (CoreException e) {
exception = e;
monitor.setCanceled(true);
}finally {
monitor.done();
added = (String[])context.changeList.toArray(new String[0]);
cancelled = monitor.isCanceled();
}
}
}
public String getStepImplementingClass(int stepId) {
if(stepId == 0) {
return "org.jboss.tools.jsf.ui.wizard.capabilities.AddCapabilitiesScreenOne";
} else if(stepId == 1) {
return "org.jboss.tools.jsf.ui.wizard.capabilities.AddCapabilitiesScreenTwo";
}
return "org.jboss.tools.common.model.ui.wizards.special.SpecialWizardStep";
}
int getTaskCount() {
return getTaskCount(performer, 0);
}
int getTaskCount(IPerformerItem item, int count) {
if(item.isSelected()) count++;
IPerformerItem[] cs = item.getChildren();
if(cs != null) for (int i = 0; i < cs.length; i++) {
count = getTaskCount(cs[i], count);
}
return count;
}
public boolean isActionEnabled(String name) {
if(getStepId() == 0 && FINISH.equals(name)) {
IPerformerItem[] cs = performer.getChildren();
for (int i = 0; i < cs.length; i++) {
if(hasSelected(cs[i])) return true;
}
return false;
}
return super.isActionEnabled(name);
}
boolean hasSelected(IPerformerItem item) {
if(!item.isSelected()) return false;
IPerformerItem[] cs = item.getChildren();
if(cs.length == 0) return true;
for (int i = 0; i < cs.length; i++) {
if(hasSelected(cs[i])) return true;
}
return false;
}
}