blob: b4b8c386a9adb20c50d5f93916a43ea78d3a8de9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2012 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:
* Red Hat, Inc. - initial API and implementation
*
* @author Ivar Meikas
******************************************************************************/
package org.eclipse.bpmn2.modeler.core.features;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.IReason;
import org.eclipse.graphiti.features.IUpdateFeature;
import org.eclipse.graphiti.features.context.IUpdateContext;
import org.eclipse.graphiti.features.impl.AbstractUpdateFeature;
import org.eclipse.graphiti.features.impl.Reason;
// TODO: Auto-generated Javadoc
/**
* The Class MultiUpdateFeature.
*/
public class MultiUpdateFeature extends AbstractUpdateFeature {
/** The features. */
protected List<IUpdateFeature> features = new ArrayList<IUpdateFeature>();
protected boolean[] updateNeeded;
protected boolean[] canUpdate;
IReason reason = null;
/**
* Instantiates a new multi update feature.
*
* @param fp the fp
*/
public MultiUpdateFeature(IFeatureProvider fp) {
super(fp);
}
/* (non-Javadoc)
* @see org.eclipse.graphiti.func.IUpdate#canUpdate(org.eclipse.graphiti.features.context.IUpdateContext)
*/
@Override
public boolean canUpdate(IUpdateContext context) {
// keep track of which features can update so we don't have to waste time
// asking each feature again during @{link #updateNeeded(IUpdateContext)}
boolean result = false;
if (canUpdate==null) {
canUpdate = new boolean[features.size()];
int i = 0;
for (IUpdateFeature f : features) {
if (f.canUpdate(context)) {
canUpdate[i] = true;
result = true;
}
++i;
}
}
else {
for (int i=0; i<canUpdate.length; ++i) {
if (canUpdate[i]) {
result = true;
break;
}
}
}
return result;
}
/* (non-Javadoc)
* @see org.eclipse.graphiti.func.IUpdate#updateNeeded(org.eclipse.graphiti.features.context.IUpdateContext)
*/
@Override
public IReason updateNeeded(IUpdateContext context) {
if (reason==null) {
String text = null;
canUpdate(context);
// keep track of which features need updating so we don't have to waste time
// asking each feature again during @{link #update(IUpdateContext)}
updateNeeded = new boolean[features.size()];
int i = 0;
for (IUpdateFeature f : features) {
// This MultiUpdateFeature will be called for PictogramElement
// children but not all Features in our list may apply to all
// children of the parent PE, so we need to ask the Feature
// again if it applies this PE.
if (canUpdate[i]) {
IReason reason = f.updateNeeded(context);
if (reason.toBoolean()) {
updateNeeded[i] = true;
if (text==null) {
text = f.getName() + ": " + reason.getText(); //$NON-NLS-1$
}
else
text += "\n" + f.getName() + ": " + reason.getText(); //$NON-NLS-1$ //$NON-NLS-2$
}
}
++i;
}
if (text!=null)
reason = Reason.createTrueReason(text);
else
reason = Reason.createFalseReason();
}
return reason;
}
/* (non-Javadoc)
* @see org.eclipse.graphiti.func.IUpdate#update(org.eclipse.graphiti.features.context.IUpdateContext)
*/
@Override
public boolean update(IUpdateContext context) {
boolean updated = false;
boolean forceUpdate = Boolean.TRUE.equals(context.getProperty(GraphitiConstants.FORCE_UPDATE_ALL));
updateNeeded(context);
int i = 0;
for (IUpdateFeature f : features) {
if ((updateNeeded[i] || forceUpdate) && canUpdate[i] && f.update(context)) {
updated = true;
}
++i;
}
return updated;
}
/**
* Adds the update feature.
*
* @param feature the feature
*/
public void addFeature(IUpdateFeature feature) {
if (feature != null) {
features.add(feature);
}
}
/**
* Get the list of individual UpdateFeatures that will be evaluated.
*
* @return
*/
public List<IUpdateFeature> getFeatures() {
return features;
}
}