package de.blau.android.actionbar;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog.Builder;
import android.text.Html;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import de.blau.android.Logic;
import de.blau.android.Main;
import de.blau.android.R;
import de.blau.android.osm.UndoStorage;
import de.blau.android.util.Density;
import de.blau.android.util.ThemeUtils;
public class UndoDialogFactory {
public static void showUndoDialog(final Main main, final Logic logic, final UndoStorage undo) {
Builder dialog = new Builder(main);
dialog.setTitle(R.string.undo);
String[] undoActions = undo.getUndoActions();
String[] redoActions = undo.getRedoActions();
List<UndoDialogItem> items = new ArrayList<UndoDialogItem>();
for (int i = 0; i < redoActions.length; i++) {
items.add(new UndoDialogItem(main, redoActions.length-i, true, redoActions[i]));
}
for (int i = undoActions.length-1; i >= 0; i--) {
items.add(new UndoDialogItem(main, undoActions.length-i, false, undoActions[i]));
}
final UndoAdapter adapter = new UndoAdapter(main, items);
dialog.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
UndoDialogItem item = adapter.getItem(which);
for (int i = 0; i < item.index; i++) {
if (item.isRedo) {
logic.redo();
} else {
logic.undo();
}
}
dialog.dismiss();
main.invalidateMap();
main.supportInvalidateOptionsMenu();
}
});
dialog.show();
}
private static class UndoAdapter extends ArrayAdapter<UndoDialogItem> {
public UndoAdapter(Context context, List<UndoDialogItem> objects) {
super(context, android.R.layout.simple_list_item_1, objects);
}
@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
return getItem(position);
}
}
private static class UndoDialogItem extends TextView {
public final int index;
public final boolean isRedo;
private UndoDialogItem(Context ctx, int index, boolean isRedo, String name) {
super(ctx);
Resources r = ctx.getResources();
setText(Html.fromHtml(r.getString(isRedo ? R.string.redo : R.string.undo) + ": " + name));
int pad = Density.dpToPx(15);
setPadding(pad, pad, pad, pad);
setCompoundDrawablePadding(pad);
setCompoundDrawablesWithIntrinsicBounds(isRedo ? ThemeUtils.getResIdFromAttribute(ctx,R.attr.undolist_redo) : ThemeUtils.getResIdFromAttribute(ctx,R.attr.undolist_undo), 0, 0, 0);
this.index = index;
this.isRedo = isRedo;
}
}
}