package org.wheelmap.android.tango.mode.operations; import android.support.annotation.CallSuper; import org.rajawali3d.Object3D; import org.wheelmap.android.tango.renderer.WheelmapModeRenderer; import java.util.ArrayList; import java.util.List; public abstract class CreateObjectsOperation implements Operation { private List<Object3D> createdObjects = new ArrayList<>(); private List<Object3D> removedObjects = new ArrayList<>(); private CreateObjectManipulator manipulatorWrapper = new CreateObjectManipulator(); protected List<Object3D> getCreatedObjects() { return createdObjects; } @CallSuper @Override public final void run(WheelmapModeRenderer.Manipulator manipulator) { createdObjects.clear(); manipulatorWrapper.setWrappedManipulator(manipulator); execute(manipulatorWrapper); } public abstract void execute(WheelmapModeRenderer.Manipulator manipulator); @Override public void undo(WheelmapModeRenderer.Manipulator manipulator) { for (Object3D createdObject : createdObjects) { manipulator.removeObject(createdObject); } for (Object3D removedObject : removedObjects) { manipulator.addObject(removedObject); } } private class CreateObjectManipulator implements WheelmapModeRenderer.Manipulator { private WheelmapModeRenderer.Manipulator impl; void setWrappedManipulator(WheelmapModeRenderer.Manipulator impl) { this.impl = impl; } @Override public void addObject(Object3D object3D) { impl.addObject(object3D); removedObjects.remove(object3D); createdObjects.add(object3D); } @Override public void removeObject(Object3D object3D) { createdObjects.remove(object3D); removedObjects.add(object3D); impl.removeObject(object3D); } } }