package org.ebookdroid.common.touch;
import org.sufficientlysecure.viewer.R;
import org.ebookdroid.common.touch.TouchManager.ActionRef;
import org.ebookdroid.common.touch.TouchManager.Region;
import org.ebookdroid.common.touch.TouchManager.Touch;
import org.ebookdroid.common.touch.TouchManager.TouchProfile;
import org.ebookdroid.ui.viewer.IActivityController;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Rect;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import java.util.ArrayList;
import java.util.List;
import org.emdev.ui.actions.ActionEx;
import org.emdev.ui.actions.ActionMethod;
import org.emdev.ui.actions.DialogController;
import org.emdev.ui.adapters.ActionsAdapter;
public class TouchConfigDialog extends Dialog {
private final TouchManagerView view;
private final DialogController<TouchConfigDialog> actions;
private final TouchProfile profile;
private RegionWrapper wrapper;
private final RegionsAdapter adapter;
private final ActionsAdapter actionsAdapter;
private final Spinner stList;
private final Spinner dtList;
private final Spinner ltList;
private final Spinner tftList;
private Spinner regionList;
public TouchConfigDialog(final IActivityController base, final TouchManagerView view, final TouchProfile profile,
final Region region) {
super(base.getContext());
this.view = view;
this.profile = profile;
this.actions = new DialogController<TouchConfigDialog>(this);
setTitle("Tap configuration");
setContentView(R.layout.tap_zones_config);
final ActionSelectionListener actionListener = new ActionSelectionListener();
actionsAdapter = new ActionsAdapter(getContext());
stList = (Spinner) this.findViewById(R.id.tapZonesConfigSingleAction);
stList.setAdapter(actionsAdapter);
stList.setTag(TouchManager.Touch.SingleTap);
stList.setOnItemSelectedListener(actionListener);
dtList = (Spinner) this.findViewById(R.id.tapZonesConfigDoubleAction);
dtList.setAdapter(actionsAdapter);
dtList.setTag(TouchManager.Touch.DoubleTap);
dtList.setOnItemSelectedListener(actionListener);
ltList = (Spinner) this.findViewById(R.id.tapZonesConfigLongAction);
ltList.setAdapter(actionsAdapter);
ltList.setTag(TouchManager.Touch.LongTap);
ltList.setOnItemSelectedListener(actionListener);
tftList = (Spinner) this.findViewById(R.id.tapZonesConfigTwoFingerAction);
tftList.setAdapter(actionsAdapter);
tftList.setTag(TouchManager.Touch.TwoFingerTap);
tftList.setOnItemSelectedListener(actionListener);
adapter = new RegionsAdapter(getContext(), wraps(profile.regions));
regionList = (Spinner) this.findViewById(R.id.tapZonesConfigRegions);
regionList.setAdapter(adapter);
regionList.setSelection(profile.regions.indexOf(region));
regionList.setOnItemSelectedListener(new RegionSelectionListener());
actions.connectViewToAction(R.id.tapZonesConfigClear);
actions.connectViewToAction(R.id.tapZonesConfigDelete);
actions.connectViewToAction(R.id.tapZonesConfigReset);
// for (Region r : this.profile.regions) {
// System.out.println("TouchConfigDialog.TouchConfigDialog(): " + r);
// }
}
@Override
protected void onStop() {
super.onStop();
profile.regions.clear();
for (int i = 0; i < adapter.getCount(); i++) {
profile.regions.add(adapter.getItem(i).r);
}
// for (Region r : this.profile.regions) {
// System.out.println("TouchConfigDialog.onStop(): " + r);
// }
TouchManager.persist();
view.invalidate();
}
protected void updateAction(final Spinner view) {
if (wrapper != null) {
final TouchManager.Touch t = (Touch) view.getTag();
final ActionRef ref = wrapper.r.getAction(t);
if (ref != null) {
final String name = ref.name;
view.setSelection(actionsAdapter.getPosition(name));
return;
}
}
view.setSelection(0);
}
@ActionMethod(ids = R.id.tapZonesConfigReset)
public void resetRegion(final ActionEx action) {
if (wrapper != null) {
for (final Region r : profile.regions) {
if (r.getRect().equals(wrapper.r.getRect())) {
wrapper.r = new Region(r);
updateAction(stList);
updateAction(dtList);
updateAction(ltList);
updateAction(tftList);
return;
}
}
}
}
@ActionMethod(ids = R.id.tapZonesConfigClear)
public void clearRegion(final ActionEx action) {
if (wrapper != null) {
wrapper.r.clear();
updateAction(stList);
updateAction(dtList);
updateAction(ltList);
updateAction(tftList);
}
}
@ActionMethod(ids = R.id.tapZonesConfigDelete)
public void deleteRegion(final ActionEx action) {
if (wrapper != null) {
adapter.remove(wrapper);
wrapper = (RegionWrapper) regionList.getSelectedItem();
}
}
private List<RegionWrapper> wraps(final List<Region> list) {
final List<RegionWrapper> res = new ArrayList<RegionWrapper>(list.size());
for (final Region r : list) {
res.add(new RegionWrapper(r));
}
return res;
}
private final class RegionSelectionListener implements OnItemSelectedListener {
@Override
public void onItemSelected(final AdapterView<?> parent, final View view, final int position, final long id) {
wrapper = adapter.getItem(position);
// System.out.println("onItemSelected(): " + wrapper);
updateAction(stList);
updateAction(dtList);
updateAction(ltList);
updateAction(tftList);
}
@Override
public void onNothingSelected(final AdapterView<?> parent) {
wrapper = null;
updateAction(stList);
updateAction(dtList);
updateAction(ltList);
updateAction(tftList);
}
}
private final class ActionSelectionListener implements OnItemSelectedListener {
@Override
public void onItemSelected(final AdapterView<?> parent, final View view, final int position, final long id) {
if (wrapper != null) {
final Integer actionId = ActionEx.getActionId(actionsAdapter.getActionId(position));
if (actionId != null) {
wrapper.r.setAction((Touch) parent.getTag(), actionId, true);
} else {
wrapper.r.clear((Touch) parent.getTag());
}
}
}
@Override
public void onNothingSelected(final AdapterView<?> parent) {
if (wrapper != null) {
wrapper.r.clear((Touch) parent.getTag());
}
}
}
final class RegionsAdapter extends ArrayAdapter<RegionWrapper> {
RegionsAdapter(final Context context, final List<RegionWrapper> objects) {
super(context, R.layout.list_item, R.id.list_item, objects);
setDropDownViewResource(R.layout.list_dropdown_item);
}
}
final class RegionWrapper {
public Region r;
public RegionWrapper(final Region r) {
this.r = new Region(r);
}
@Override
public String toString() {
final Rect rect = r.getRect();
return "[ " + rect.left + "%, " + rect.top + "% - " + rect.right + "%, " + rect.bottom + "% ]";
}
}
}