package de.blau.android.osm;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import android.util.Log;
import de.blau.android.exception.StorageException;
public class ClipboardStorage implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public enum Mode { COPY, CUT }
private Mode mode;
private Storage storage;
/*
* save where object (really only necessary for ways) was selected
*/
private int selectionLat;
private int selectionLon;
/**
* cut elements are deleted and have their state set appropriately, the original pre-cut state has to be restored on paste
*/
private byte savedState;
private HashMap<Node,Byte> savedNdState;
ClipboardStorage() {
storage = new Storage();
}
private void reset() {
storage = new Storage();
}
/**
* assumes the element has already been cloned
* note no need to store nodes separate from ways
* @param e
* @param lat
* @param lon
*/
public void copyTo(OsmElement e, int lat, int lon) {
reset();
selectionLat = lat;
selectionLon = lon;
mode = Mode.COPY;
try {
storage.insertElementUnsafe(e);
} catch (StorageException sex) {
// TODO handle oom situation
sex.printStackTrace();
}
}
/**
* assumes that element will be deleted and any necessary objects cloned
* @param e
* @param lat
* @param lon
*/
public void cutTo(OsmElement e, int lat, int lon) {
copyTo(e, lat, lon);
savedState = e.getState();
if (e instanceof Way) {
savedNdState = new HashMap<Node,Byte>();
for (Node nd:((Way)e).getNodes()) {
Log.d("CutTo","Saving state for " + nd.getOsmId());
savedNdState.put(nd, nd.getState());
}
}
mode = Mode.CUT;
}
public boolean isEmpty() {
return storage.isEmpty();
}
/**
* returns whatever is in the clipboard
* @return
*/
public OsmElement pasteFrom() {
List<Way> ways = storage.getWays();
List<Node> nodes = storage.getNodes();
if (mode == Mode.CUT) {
reset(); // can only paste a cut way once
if (ways != null && ways.size() == 1) { // restore original state
Way w = ways.get(0);
w.setState(savedState);
for (Node nd:w.getNodes()) {
Log.d("PasteFrom","Restoring state for " + nd.getOsmId());
nd.setState(savedNdState.get(nd));
}
return w;
} else if (nodes != null && nodes.size() == 1) {
Node n = nodes.get(0);
n.setState(savedState);
return n;
}
} else {
if (ways != null && ways.size() == 1) {
return ways.get(0);
} else if (nodes != null && nodes.size() == 1) {
return nodes.get(0);
}
}
return null;
}
public int getSelectionLat() {
return selectionLat;
}
public int getSelectionLon() {
return selectionLon;
}
}