X-Git-Url: http://git.nikiroo.be/?p=jvcard.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2FContact.java;h=21ed69b86f66e532adee8bc06a5bf317d00f9021;hp=f2a8b01b5ac4be470383f2b29934fde412bbeca8;hb=0b0b2b0ff1f5e21f7b0feb955b4b54855fb3d508;hpb=9c8baf0c360173b864683176c567757429c4fb12 diff --git a/src/be/nikiroo/jvcard/Contact.java b/src/be/nikiroo/jvcard/Contact.java index f2a8b01..21ed69b 100644 --- a/src/be/nikiroo/jvcard/Contact.java +++ b/src/be/nikiroo/jvcard/Contact.java @@ -135,6 +135,29 @@ public class Contact { return Parser.toString(this, format, startingBKey); } + /** + * 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: + * + * + * Example: "N@10|FN@20|NICK@+|PHOTO@x" + * + * @param format + * the format to use + * + * @return the {@link String} representation + */ + public String toString(String format) { + return toString(format, "|", null, -1); + } + /** * Return a {@link String} representation of this contact formated * accordingly to the given format. @@ -153,46 +176,79 @@ public class Contact { * the format to use * @param separator * the separator {@link String} to use between fields + * @param padding + * the {@link String} to use for left and right padding * @param width * a fixed width or -1 for "as long as needed" * * @return the {@link String} representation */ - public String toString(String format, String separator, int width) { + public String toString(String format, String separator, String padding, + int width) { StringBuilder builder = new StringBuilder(); - String[] formatFields = format.split("\\|"); - if (width > -1 && separator != null && separator.length() > 0 - && formatFields.length > 1) { - int swidth = (formatFields.length - 1) * separator.length(); - if (swidth >= width) { - int num = width / separator.length(); - int remainder = width % separator.length(); - - if (remainder > 0) - num++; - - while (builder.length() < width) { - if (builder.length() + separator.length() <= width) - builder.append(separator); - else - builder.append(separator - .substring(0, (builder.length() + separator - .length()) - - width)); - } + for (String str : toStringArray(format, separator, padding, width)) { + builder.append(str); + } - return builder.toString(); - } + return builder.toString(); + } - width -= swidth; + /** + * 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: + * + * + * Example: "N@10|FN@20|NICK@+|PHOTO@x" + * + * @param format + * the format to use + * @param separator + * the separator {@link String} to use between fields + * @param padding + * the {@link String} to use for left and right padding + * @param width + * a fixed width or -1 for "as long as needed" + * + * @return the {@link String} representation + */ + public String[] toStringArray(String format, String separator, + String padding, int width) { + if (width > -1) { + int numOfFields = format.split("\\|").length; + if (separator != null) + width -= (numOfFields - 1) * separator.length(); + if (padding != null) + width -= (numOfFields) * (2 * padding.length()); + + if (width < 0) + width = 0; } - for (String str : toStringArray(format, width)) { - builder.append(str); + List str = new LinkedList(); + + boolean first = true; + for (String s : toStringArray(format, width)) { + if (!first) { + str.add(separator); + } + + if (padding != null) + str.add(padding + s + padding); + else + str.add(s); + + first = false; } - return builder.toString(); + return str.toArray(new String[] {}); } /** @@ -200,8 +256,14 @@ public class Contact { * accordingly to the given format, part by part. * * The format is basically a list of field names separated by a pipe and - * optionally parametrised. See {@link Contact#toString} for more - * information about the format. + * optionally parametrised. The parameters allows you to: + * + * + * Example: "N@10|FN@20|NICK@+|PHOTO@x" * * @param format * the format to use @@ -221,6 +283,10 @@ public class Contact { int totalSize = 0; if (width == 0) { + for (int i = 0; i < formatFields.length; i++) { + str.add(""); + } + return str.toArray(new String[] {}); } @@ -305,15 +371,11 @@ public class Contact { for (int i = 0; i < values.length; i++) { if (expandedFields[i]) { if (remainder > 0) { - values[i] = values[i] - + new String(new char[remainder]).replace( - '\0', ' '); + values[i] = values[i] + fixedString("", remainder); remainder = 0; } if (padPerItem > 0) { - values[i] = values[i] - + new String(new char[padPerItem]).replace( - '\0', ' '); + values[i] = values[i] + fixedString("", padPerItem); } } } @@ -344,11 +406,12 @@ public class Contact { static private String fixedString(String string, int size) { int length = string.length(); - if (length > size) + if (length > size) { string = string.substring(0, size); - else if (length < size) + } else if (length < size) { string = string + new String(new char[size - length]).replace('\0', ' '); + } return string; } @@ -381,10 +444,7 @@ public class Contact { } } - if (add.length() > 0) { - list.add(add); - } - + list.add(add); return add.length(); }