+ /**
+ * Return the currently selected {@link Data}.
+ *
+ * @return the currently selected {@link Data}
+ */
+ private Data getSelectedData() {
+ int index = getSelectedIndex();
+ if (index > -1 && index < this.contact.size())
+ return contact.get(index);
+ return null;
+ }
+
+ /**
+ * Serialise the {@link TypeInfo}s in the given {@link Data}.
+ *
+ * @param data
+ * the {@link Data} from which to take the {@link TypeInfo}s
+ * @param builder
+ * an optional {@link StringBuilder} to append the serialised
+ * version to
+ *
+ * @return the given {@link StringBuilder} or a new one if the given one is
+ * NULL
+ */
+ static private StringBuilder typesToString(Data data, StringBuilder builder) {
+ if (builder == null)
+ builder = new StringBuilder();
+
+ for (TypeInfo type : data) {
+ if (builder.length() > 1)
+ builder.append(", ");
+ builder.append(type.getName().replaceAll(",", "\\,"));
+ builder.append(": ");
+ builder.append(type.getValue().replaceAll(":", "\\:"));
+ }
+
+ return builder;
+ }
+
+ /**
+ * Unserialise a list of {@link TypeInfo}s.
+ *
+ * @param value
+ * the serialised value
+ *
+ * @return the {@link TypeInfo} in their object form
+ */
+ static private List<TypeInfo> stringToTypes(String value) {
+ List<TypeInfo> infos = new LinkedList<TypeInfo>();
+ if (value == null || value.length() == 0)
+ return infos;
+
+ char previous = '\0';
+ char car = '\0';
+ int done = 0;
+ for (int index = 0; index < value.length(); index++) {
+ car = value.charAt(index);
+ if (index == value.length() - 1) {
+ index++;
+ previous = '\0';
+ car = ',';
+ }
+
+ if (previous != '\\' && car == ',') {
+ String subValue = value.substring(done, index);
+ int indexColumn = subValue.indexOf(':');
+ while (indexColumn > 0
+ && subValue.charAt(indexColumn - 1) == '\\') {
+ if (indexColumn == subValue.length() - 1) {
+ indexColumn = -1;
+ } else {
+ indexColumn = subValue.indexOf(':', indexColumn + 1);
+ }
+ }
+
+ String n = "";
+ String v = "";
+ if (indexColumn >= 0) {
+ n = subValue.substring(0, indexColumn).trim();
+ v = subValue.substring(indexColumn + 1)
+ .replaceAll("\\\\:", ":").trim();
+ } else {
+ n = subValue.trim();
+ }
+
+ infos.add(new TypeInfo(n, v));
+
+ done = index + 1;
+ }
+
+ previous = car;
+ }
+
+ return infos;
+ }