package de.blau.android;
import java.util.HashMap;
import android.support.annotation.Nullable;
import android.util.Log;
import de.blau.android.filter.Filter;
import de.blau.android.filter.IndoorFilter;
import de.blau.android.osm.OsmElement;
import de.blau.android.osm.Tags;
import de.blau.android.presets.Preset;
/**
* Enums for modes.
*/
public enum Mode {
/**
* edit geometries in "easyedit" mode
*/
MODE_EASYEDIT("EASY", true, true, true, null, R.drawable.unlocked_white, null),
/**
* tag edit only mode
*/
MODE_TAG_EDIT("TAG", true, true, false, null, R.drawable.unlocked_tag_white, null),
/**
* Background alignment mode
*/
MODE_ALIGN_BACKGROUND("EASY",false,false,false, MODE_EASYEDIT, R.drawable.unlocked_white, new ModeConfig() {
@Override
public void setup(Main main, Logic logic) {
if (main.getBackgroundAlignmentActionModeCallback() == null) {
Log.d("Logic","weird state of edit mode, resetting");
logic.setMode(main, Mode.MODE_EASYEDIT);
}
}
@Override
public void teardown(Main main, Logic logic) {
}
@Override
public HashMap<String, String> getExtraTags(Logic logic, OsmElement e) {
return null;
}
@Override
public Preset getPreset(Logic logic, OsmElement e) {
return null;
}
}),
/**
* Indoor mode
*/
MODE_INDOOR("INDOOR",true,true,true, null, R.drawable.unlocked_indoor_white, new ModeConfig() {
@Override
public void setup(final Main main, final Logic logic) {
Filter.Update updater = new Filter.Update() {
@Override
public void execute() {
logic.invalidateMap();
main.scheduleAutoLock();
} };
Filter filter = logic.getFilter();
if (filter!=null) {
if (!(filter instanceof IndoorFilter)) {
filter.saveState();
filter.hideControls();
filter.removeControls();
IndoorFilter indoor = new IndoorFilter();
indoor.saveFilter(filter);
logic.setFilter(indoor);
indoor.addControls(main.getMapLayout(), updater);
}
} else { // no filter yet
logic.setFilter(new IndoorFilter());
logic.getFilter().addControls(main.getMapLayout(), updater);
}
logic.getFilter().showControls();
logic.deselectAll();
}
@Override
public void teardown(final Main main, final Logic logic) {
Filter.Update updater = new Filter.Update() {
@Override
public void execute() {
logic.invalidateMap();
main.scheduleAutoLock();
} };
// indoor mode is a special case of a filter
// needs to be removed here and previous filter, if any, restored
Filter filter = logic.getFilter();
if (filter!=null) {
if (filter instanceof IndoorFilter) {
filter.saveState();
filter.hideControls();
filter.removeControls();
filter = filter.getSavedFilter();
logic.setFilter(filter);
if (filter!=null) {
filter.addControls(main.getMapLayout(), updater);
filter.showControls();
}
}
}
}
@Override
public HashMap<String, String> getExtraTags(Logic logic, OsmElement e) {
HashMap<String,String> result = new HashMap<String,String>();
// we only want to apply a level tag automatically to newly created objects if they don't already have the tag and not when the filter is inverted
Filter filter = logic.getFilter();
if (filter != null && filter instanceof IndoorFilter && !((IndoorFilter)filter).isInverted() && e.getState() == OsmElement.STATE_CREATED && !e.hasTagKey(Tags.KEY_LEVEL)) {
result.put(Tags.KEY_LEVEL, Integer.toString(((IndoorFilter)filter).getLevel()));
}
return result;
}
@Override
public Preset getPreset(Logic logic, OsmElement e) {
// TODO Auto-generated method stub
return null;
}
});
final private String tag;
final private boolean selectable;
final private boolean editable;
final private boolean geomEditable;
final private Mode subModeOf;
private boolean enabled = true;
private int iconResourceId = -1;
final private ModeConfig config;
Mode(String tag, boolean selectable, boolean editable, boolean geomEditable, Mode subModeOf, int iconResourceId, ModeConfig config) {
this.tag = tag;
this.selectable = selectable;
this.editable = editable;
this.geomEditable = geomEditable;
this.subModeOf = subModeOf;
this.iconResourceId = iconResourceId;
this.config = config;
}
boolean elementsSelectable() {
return selectable;
}
boolean elementsEditable() {
return editable;
}
boolean elementsGeomEditiable() {
return geomEditable;
}
void setEnabled(boolean enabled) {
this.enabled = enabled;
}
boolean isEnabled() {
return enabled;
}
int iconResourceId() {
return iconResourceId;
}
Mode isSubModeOf() {
return subModeOf;
}
String tag() {
return tag;
}
void setup(Main main, Logic logic) {
if (config != null) {
config.setup(main, logic);
}
}
void teardown(Main main, Logic logic) {
if (config != null) {
config.teardown(main, logic);
}
}
/**
* Return the Mode for a given tag
* @param tag
* @return the corresponding Mode
*/
static Mode modeForTag(String tag) {
for (Mode mode:Mode.values()) {
if (mode.tag().equals(tag)) {
return mode;
}
}
return null; // can't happen
}
/**
* Get any special tags for this mode, not very elegant
* @param logic the current Logic instance
* @param e the selected element
* @return map containing the additional tags or null
*/
@Nullable
public HashMap<String, String> getExtraTags(Logic logic, OsmElement e) {
if (config != null) {
return config.getExtraTags(logic, e);
}
return null;
}
}