+ @Override
+ public DataType getDataType() {
+ return DataType.DATA;
+ }
+
+ @Override
+ public List<KeyAction> getKeyBindings() {
+ List<KeyAction> actions = new LinkedList<KeyAction>();
+
+ actions.add(new KeyAction(Mode.ASK_USER, KeyType.Enter,
+ StringId.KEY_ACTION_EDIT_FIELD) {
+ @Override
+ public Object getObject() {
+ Data data = getSelectedData();
+ if (data != null && data.getB64Key() != -1) {
+ setMessage("Cannot modify binary values in RAW mode", true);
+ data = null;
+ }
+
+ return data;
+ }
+
+ @Override
+ public String getQuestion() {
+ Data data = getData();
+ if (data != null) {
+ return data.getName();
+ }
+
+ return null;
+ }
+
+ @Override
+ public String getDefaultAnswer() {
+ Data data = getData();
+ if (data != null) {
+ return data.getRawValue().replaceAll("\n", "\\\\n");
+ }
+
+ return null;
+ }
+
+ @Override
+ public String callback(String answer) {
+ Data data = getData();
+ if (data != null) {
+ data.setRawValue(answer.replaceAll("\\\\n", "\n"));
+ return null;
+ }
+
+ // TODO: i18n
+ return "Cannot modify value";
+ }
+ });
+ actions.add(new KeyAction(Mode.ASK_USER_KEY, 'd',
+ StringId.KEY_ACTION_DELETE) {
+ @Override
+ public Object getObject() {
+ return getSelectedData();
+ }
+
+ @Override
+ public String getQuestion() {
+ // TODO i18n
+ return "Delete data? [Y/N]";
+ }
+
+ @Override
+ public String callback(String answer) {
+ if (answer.equalsIgnoreCase("y")) {
+ Data data = getData();
+ if (data != null && data.delete()) {
+ removeItem("x");
+ return null;
+ }
+
+ // TODO i18n
+ return "Cannot delete data";
+ }
+
+ return null;
+ }
+ });
+ // TODO: ui and i18n
+ actions.add(new KeyAction(Mode.ASK_USER, 'a', StringId.KEY_ACTION_ADD) {
+ private String name;
+
+ @Override
+ public boolean onAction() {
+ new ActionListDialogBuilder()
+ .setTitle("New data")
+ .setDescription("Choose a data type")
+ .addAction("Email address", new Runnable() {
+ @Override
+ public void run() {
+ name = "EMAIL";
+ }
+ })
+ .addAction("Telephone number", new Runnable() {
+ @Override
+ public void run() {
+ name = "TEL";
+ }
+ })
+ .addAction("Birthday", new Runnable() {
+ @Override
+ public void run() {
+ name = "BDAY";
+ }
+ })
+ .addAction("[other]", new Runnable() {
+ @Override
+ public void run() {
+ name = "";
+ }
+ })
+ .build()
+ .showDialog(
+ new MultiWindowTextGUI(TuiLauncher.getScreen()));
+
+ String name = this.name;
+ this.name = null;
+
+ if (name != null) {
+ if (name.length() > 0) {
+ Data data = new Data(null, name, "", null);
+ getContact().add(data);
+ addItem("x");
+ }
+
+ return (name.length() == 0);
+ }
+
+ return false;
+ }
+
+ @Override
+ public Object getObject() {
+ return contact;
+ }
+
+ @Override
+ public String getQuestion() {
+ // TODO i18n
+ if (name == null)
+ return "Data name: ";
+
+ return null;
+ }
+
+ @Override
+ public String callback(String answer) {
+ if (answer != null & answer.length() > 0) {
+ Data data = new Data(null, answer, "", null);
+ getContact().add(data);
+ addItem("x");
+ }
+
+ return null;
+ }
+ });
+ // TODO: use a real UI for this, not a simple text box (a list or
+ // something, maybe a whole new pane?)
+ actions.add(new KeyAction(Mode.ASK_USER, 't', StringId.DUMMY) {
+ private String previous;
+
+ @Override
+ public Object getObject() {
+ return getSelectedData();
+ }
+
+ @Override
+ public String getQuestion() {
+ Data data = getData();
+ if (data != null) {
+ return data.getName();
+ }
+
+ return null;
+ }
+
+ @Override
+ public String getDefaultAnswer() {
+ Data data = getData();
+ if (data != null) {
+ previous = typesToString(data, null).toString();
+ return previous;
+ }
+
+ return null;
+ }
+
+ @Override
+ public String callback(String answer) {
+ Data data = getData();
+ if (data != null) {
+ if (!answer.equals(previous)) {
+ data.replaceListContent(stringToTypes(answer));
+ }
+ return null;
+ }
+
+ // TODO: i18n
+ return "Cannot modify value";
+ }
+ });
+ actions.add(new KeyAction(Mode.ASK_USER, 'g', StringId.DUMMY) {
+ private String previous;
+
+ @Override
+ public Object getObject() {
+ return getSelectedData();
+ }
+
+ @Override
+ public String getQuestion() {
+ Data data = getData();
+ if (data != null) {
+ return data.getName();
+ }
+
+ return null;
+ }
+
+ @Override
+ public String getDefaultAnswer() {
+ Data data = getData();
+ if (data != null) {
+ previous = data.getGroup();
+ return previous;
+ }
+
+ return null;
+ }
+
+ @Override
+ public String callback(String answer) {
+ Data data = getData();
+ if (data != null) {
+ if (!answer.equals(previous)) {
+ data.setGroup(answer);
+ }
+ return null;
+ }
+
+ // TODO: i18n
+ return "Cannot modify group";
+ }
+ });
+ actions.add(new KeyAction(Mode.NONE, KeyType.Tab,
+ StringId.KEY_ACTION_SWITCH_FORMAT) {
+ @Override
+ public boolean onAction() {
+ extMode = !extMode;
+ return false;
+ }
+ });
+
+ return actions;
+ }
+
+ @Override
+ public String getTitle() {
+ String title = null;
+
+ if (contact != null) {
+ title = contact.getPreferredDataValue("FN");
+ if (title == null || title.length() == 0)
+ title = contact.getPreferredDataValue("N");
+ }
+
+ return title;
+ }
+
+ @Override
+ public String move(int x, int y) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+