X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2FContact.java;h=6d362f9c9aed7675fe7fb292095d021848829b52;hb=d5260eeb873fcf2ef9855dedcd9e2a3a3a990582;hp=ce701a26a60ad88031881a13b71291b72c1ef627;hpb=7da41ecd30228908bf2afcd07ff7943ab59d4c01;p=jvcard.git diff --git a/src/be/nikiroo/jvcard/Contact.java b/src/be/nikiroo/jvcard/Contact.java index ce701a2..6d362f9 100644 --- a/src/be/nikiroo/jvcard/Contact.java +++ b/src/be/nikiroo/jvcard/Contact.java @@ -11,7 +11,7 @@ import java.util.UUID; import be.nikiroo.jvcard.parsers.Format; import be.nikiroo.jvcard.parsers.Parser; -import be.nikiroo.jvcard.resources.StringUtils; +import be.nikiroo.utils.StringUtils; /** * A contact is the information that represent a contact person or organisation. @@ -36,27 +36,26 @@ public class Contact extends BaseClass { } /** - * Return the preferred Data field with the given name, or NULL if none. + * Return the preferred Data field with the given name, the first one if + * none is preferred, or NULL if none at all. * * @param name * the name to look for - * @return the Data field, or NULL + * + * @return the {@link Data} field, or NULL */ public Data getPreferredData(String name) { - Data first = null; + Data pref = null; + int ipref = Integer.MAX_VALUE; for (Data data : getData(name)) { - if (first == null) - first = data; - for (int index = 0; index < data.size(); index++) { - TypeInfo type = data.get(index); - if (type.getName().equals("TYPE") - && type.getValue().equals("pref")) { - return data; - } - } + if (pref == null) + pref = data; + + if (data.getPreferred() < ipref) + pref = data; } - return first; + return pref; } /** @@ -92,63 +91,79 @@ public class Contact extends BaseClass { return found; } - /** - * Return a {@link String} representation of this contact. - * - * @param format - * the {@link Format} to use - * @param startingBKey - * the starting BKey or -1 for no BKeys - * @return the {@link String} representation - */ - public String toString(Format format, int startingBKey) { - updateBKeys(false); - - StringBuilder builder = new StringBuilder(); - for (String line : Parser.toStrings(this, format, startingBKey)) { - builder.append(line); - builder.append("\r\n"); - } - - return builder.toString(); - } - /** * Return a {@link String} representation of this contact formated * accordingly to the given format. * + *

* The format is basically a list of field names separated by a pipe and - * optionally parametrised. The parameters allows you to: + * optionally parametrised with the 'at' (@) symbol. The parameters allows + * you to: *

+ *

+ * + *

+ * In case of lists or multiple-fields values, you can select a specific + * list or field with: + *

+ *

* - * Example: "N@10|FN@20|NICK@+|PHOTO@x" + *

+ * You can also add a fixed text if it starts with a simple-quote ('). + *

+ * + *

+ * Example: "'Contact: |N@10|FN@20|NICK@+|PHOTO@x" + *

* * @param format * the format to use + * @param separator + * the separator {@link String} to use between fields * * @return the {@link String} representation */ - public String toString(String format) { - return toString(format, "|", null, -1, true, false); + public String toString(String format, String separator) { + return toString(format, separator, null, -1, true); } /** * Return a {@link String} representation of this contact formated * accordingly to the given format. * + *

* The format is basically a list of field names separated by a pipe and * optionally parametrised. The parameters allows you to: *

+ *

+ * + *

+ * In case of lists or multiple-fields values, you can select a specific + * list or field with: + *

+ *

+ * + *

+ * You can also add a fixed text if it starts with a simple-quote ('). + *

* - * Example: "N@10|FN@20|NICK@+|PHOTO@x" + *

+ * Example: "'Contact: |N@10|FN@20|NICK@+|PHOTO@x" + *

* * @param format * the format to use @@ -158,14 +173,13 @@ public class Contact extends BaseClass { * the {@link String} to use for left and right padding * @param width * a fixed width or -1 for "as long as needed" - * * @param unicode - * allow Uniode or only ASCII characters + * allow Unicode or only ASCII characters * * @return the {@link String} representation */ public String toString(String format, String separator, String padding, - int width, boolean unicode, boolean removeAccents) { + int width, boolean unicode) { StringBuilder builder = new StringBuilder(); for (String str : toStringArray(format, separator, padding, width, @@ -180,6 +194,7 @@ public class Contact extends BaseClass { * Return a {@link String} representation of this contact formated * accordingly to the given format, part by part. * + *

* The format is basically a list of field names separated by a pipe and * optionally parametrised. The parameters allows you to: *

    @@ -187,8 +202,24 @@ public class Contact extends BaseClass { *
  • @n: limit the size to a fixed value 'n'
  • *
  • @+: expand the size of this field as much as possible
  • *
+ *

+ * + *

+ * In case of lists or multiple-fields values, you can select a specific + * list or field with: + *

    + *
  • FIELD@(0): select the first value in a list
  • + *
  • FIELD@[1]: select the second field in a multiple-fields value
  • + *
+ *

* - * Example: "N@10|FN@20|NICK@+|PHOTO@x" + *

+ * You can also add a fixed text if it starts with a simple-quote ('). + *

+ * + *

+ * Example: "'Contact: |N@10|FN@20|NICK@+|PHOTO@x" + *

* * @param format * the format to use @@ -240,6 +271,7 @@ public class Contact extends BaseClass { * Return a {@link String} representation of this contact formated * accordingly to the given format, part by part. * + *

* The format is basically a list of field names separated by a pipe and * optionally parametrised. The parameters allows you to: *

    @@ -247,8 +279,24 @@ public class Contact extends BaseClass { *
  • @n: limit the size to a fixed value 'n'
  • *
  • @+: expand the size of this field as much as possible
  • *
+ *

+ * + *

+ * In case of lists or multiple-fields values, you can select a specific + * list or field with: + *

    + *
  • FIELD@(0): select the first value in a list
  • + *
  • FIELD@[1]: select the second field in a multiple-fields value
  • + *
+ *

* - * Example: "N@10|FN@20|NICK@+|PHOTO@x" + *

+ * You can also add a fixed text if it starts with a simple-quote ('). + *

+ * + *

+ * Example: "'Contact: |N@10|FN@20|NICK@+|PHOTO@x" + *

* * @param format * the format to use @@ -256,7 +304,7 @@ public class Contact extends BaseClass { * a fixed width or -1 for "as long as needed" * @param unicode * allow Uniode or only ASCII characters - * + * * @return the {@link String} representation */ public String[] toStringArray(String format, int width, boolean unicode) { @@ -283,8 +331,11 @@ public class Contact extends BaseClass { int size = -1; boolean binary = false; boolean expand = false; + int fieldNum = -1; + int valueNum = -1; - if (field.contains("@")) { + if (field.length() > 0 && field.charAt(0) != '\'' + && field.contains("@")) { String[] opts = field.split("@"); if (opts.length > 0) field = opts[0]; @@ -295,16 +346,48 @@ public class Contact extends BaseClass { } else if (opt.equals("+")) { expand = true; numOfFieldsToExpand++; + } else if (opt.length() > 0 && opt.charAt(0) == '(') { + try { + opt = opt.substring(1, opt.length() - 1); + valueNum = Integer.parseInt(opt); + } catch (Exception e) { + } + } else if (opt.length() > 0 && opt.charAt(0) == '[') { + try { + opt = opt.substring(1, opt.length() - 1); + fieldNum = Integer.parseInt(opt); + } catch (Exception e) { + } } else { try { size = Integer.parseInt(opt); - } catch (Exception e) { + } catch (NumberFormatException e) { } } } } - String value = getPreferredDataValue(field); + String value = null; + if (field.length() > 0 && field.charAt(0) == '\'') { + value = field.substring(1); + } else if (valueNum >= 0) { + List vv = getPreferredData(field).getValues(); + if (valueNum < vv.size()) { + value = vv.get(valueNum); + } + } else if (fieldNum >= 0) { + List ff = getPreferredData(field).getFields(); + if (fieldNum < ff.size()) { + value = ff.get(fieldNum); + } + } else { + // we don't need the *data* in binary mode... + if (binary) + value = getData(field).size() > 0 ? "x" : null; + else + value = getPreferredDataValue(field); + } + if (value == null) { value = ""; } else { @@ -418,7 +501,7 @@ public class Contact extends BaseClass { @Override public String getState() { - return "" + getPreferredDataValue("UID"); + return getId(); } /** @@ -429,7 +512,7 @@ public class Contact extends BaseClass { */ @Override public String toString() { - return toString(Format.VCard21, -1); + return "[Contact: " + getPreferredDataValue("FN") + "]"; } /**