package org.archstudio.xadl.bna.logics.editing;
import java.util.List;
import java.util.Set;
import org.archstudio.bna.IBNAView;
import org.archstudio.bna.IBNAWorld;
import org.archstudio.bna.ICoordinate;
import org.archstudio.bna.IThing;
import org.archstudio.bna.logics.AbstractThingLogic;
import org.archstudio.bna.logics.editing.BNAOperations;
import org.archstudio.bna.ui.IBNAMenuListener2;
import org.archstudio.bna.utils.Assemblies;
import org.archstudio.bna.utils.BNAAction;
import org.archstudio.bna.utils.BNAUtils;
import org.archstudio.bna.utils.BNAUtils2.ThingsAtLocation;
import org.archstudio.utils.resources.Resources;
import org.archstudio.utils.resources.swt.ImageUtils;
import org.archstudio.xadl.bna.facets.IHasObjRef;
import org.archstudio.xarchadt.IXArchADT;
import org.archstudio.xarchadt.IXArchADTTypeMetadata;
import org.archstudio.xarchadt.ObjRef;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.widgets.Display;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
public class RemoveElementLogic extends AbstractThingLogic implements IBNAMenuListener2 {
final protected IXArchADT xarch;
public RemoveElementLogic(IBNAWorld world, IXArchADT xarch) {
super(world);
this.xarch = xarch;
}
@Override
public void fillMenu(IBNAView view, ICoordinate location, ThingsAtLocation thingsAtLocation, IMenuManager menu) {
BNAUtils.checkLock();
if (thingsAtLocation.getViewAtLocation() != null) {
return;
}
if (thingsAtLocation.getThingAtLocation() != null) {
final Set<ObjRef> objRefs = Sets.newHashSet();
for (IThing thing : BNAUtils.getSelectedThings(view.getBNAWorld().getBNAModel())) {
IThing objRefThing = Assemblies.getThingWithProperty(model, thing, IHasObjRef.OBJREF_KEY);
if (objRefThing != null) {
ObjRef objRef = thing.get(IHasObjRef.OBJREF_KEY);
if (objRef != null) {
objRefs.add(objRef);
}
}
}
IThing objRefThing =
Assemblies.getThingWithProperty(model, thingsAtLocation.getThing(), IHasObjRef.OBJREF_KEY);
if (objRefThing != null) {
ObjRef objRef = objRefThing.get(IHasObjRef.OBJREF_KEY);
if (objRef != null) {
objRefs.add(objRef);
}
}
if (objRefs.size() > 0) {
menu.add(new BNAAction(objRefs.size() == 1 ? "Delete" : "Delete " + objRefs.size() + " Elements") {
@Override
public void runWithLock() {
final List<Runnable> undo = Lists.newArrayList();
final List<Runnable> redo = Lists.newArrayList();
for (final ObjRef objRef : objRefs) {
final ObjRef parentRef = xarch.getParent(objRef);
if (parentRef != null) {
IXArchADTTypeMetadata type = xarch.getTypeMetadata(parentRef);
final String elementName = xarch.getContainingFeatureName(objRef);
switch (type.getFeatures().get(elementName).getType()) {
case ATTRIBUTE:
case ELEMENT_SINGLE:
undo.add(new Runnable() {
@Override
public void run() {
xarch.set(parentRef, elementName, objRef);
}
});
redo.add(new Runnable() {
@Override
public void run() {
xarch.clear(parentRef, elementName);
}
});
break;
case ELEMENT_MULTIPLE:
undo.add(new Runnable() {
@Override
public void run() {
xarch.add(parentRef, elementName, objRef);
}
});
redo.add(new Runnable() {
@Override
public void run() {
xarch.remove(parentRef, elementName, objRef);
}
});
break;
}
}
}
BNAOperations.runnable("Delete", new Runnable() {
@Override
public void run() {
for (Runnable r : undo) {
r.run();
}
}
}, new Runnable() {
@Override
public void run() {
for (Runnable r : redo) {
r.run();
}
}
}, true);
}
@Override
public ImageDescriptor getImageDescriptor() {
return ImageUtils
.toImageDescriptor(ImageUtils.getImage(Display.getDefault(), Resources.DELETE_ICON_16));
}
});
}
}
}
}