X-Git-Url: https://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2FContact.java;h=948fd8447965a87d06663db2b4513d6bea022d92;hb=26d2bd0591901a8d52bd24802a8d6827d0e9b833;hp=c5579fe8c5e1cf4a71eeec149d83c7d23be79ff4;hpb=89d9d47d0c2be35228ae8add7dc166722df04db8;p=jvcard.git diff --git a/src/be/nikiroo/jvcard/Contact.java b/src/be/nikiroo/jvcard/Contact.java index c5579fe..948fd84 100644 --- a/src/be/nikiroo/jvcard/Contact.java +++ b/src/be/nikiroo/jvcard/Contact.java @@ -1,5 +1,8 @@ package be.nikiroo.jvcard; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -15,12 +18,9 @@ import be.nikiroo.jvcard.tui.StringUtils; * @author niki * */ -public class Contact { - private List datas; +public class Contact extends BaseClass { private int nextBKey = 1; private Map binaries; - private boolean dirty; - private Card parent; /** * Create a new Contact from the given information. Note that the BKeys data @@ -30,85 +30,10 @@ public class Contact { * the information about the contact */ public Contact(List content) { - this.datas = new LinkedList(); - - boolean fn = false; - boolean n = false; - if (content != null) { - for (Data data : content) { - if (data.getName().equals("N")) { - n = true; - } else if (data.getName().equals("FN")) { - fn = true; - } - - if (!data.getName().equals("VERSION")) { - datas.add(data); - } - } - } - - // required fields: - if (!n) { - datas.add(new Data(null, "N", "", null)); - } - if (!fn) { - datas.add(new Data(null, "FN", "", null)); - } - + super(load(content)); updateBKeys(true); } - /** - * Return the number of {@link Data} present in this {@link Contact}. - * - * @return the number of {@link Data}s - */ - public int size() { - return datas.size(); - } - - /** - * Return the {@link Data} at index index. - * - * @param index - * the index of the {@link Data} to find - * - * @return the {@link Data} - * - * @throws IndexOutOfBoundsException - * if the index is < 0 or >= {@link Contact#size()} - */ - public Data get(int index) { - return datas.get(index); - } - - /** - * Add a new {@link Data} in this {@link Contact}. - * - * @param data - * the new data - */ - public void add(Data data) { - data.setParent(this); - data.setDirty(); - datas.add(data); - } - - /** - * Remove the given {@link Data} from its this {@link Contact} if it is in. - * - * @return TRUE in case of success - */ - public boolean remove(Data data) { - if (datas.remove(data)) { - setDirty(); - return true; - } - - return false; - } - /** * Return the preferred Data field with the given name, or NULL if none. * @@ -158,7 +83,7 @@ public class Contact { public List getData(String name) { List found = new LinkedList(); - for (Data data : datas) { + for (Data data : this) { if (data.getName().equals(name)) found.add(data); } @@ -463,7 +388,7 @@ public class Contact { public void updateFrom(Contact vc) { updateBKeys(false); - List newDatas = new LinkedList(vc.datas); + List newDatas = new LinkedList(vc); for (int i = 0; i < newDatas.size(); i++) { Data data = newDatas.get(i); int bkey = Parser.getBKey(data); @@ -474,33 +399,8 @@ public class Contact { } } - this.datas = newDatas; + replaceListContent(newDatas); this.nextBKey = vc.nextBKey; - - setParent(parent); - setDirty(); - } - - /** - * Delete this {@link Contact} from its parent {@link Card} if any. - * - * @return TRUE in case of success - */ - public boolean delete() { - if (parent != null) { - return parent.remove(this); - } - - return false; - } - - /** - * Check if this {@link Contact} has unsaved changes. - * - * @return TRUE if it has - */ - public boolean isDirty() { - return dirty; } /** @@ -530,7 +430,7 @@ public class Contact { binaries = new HashMap(); } - for (Data data : datas) { + for (Data data : this) { if (data.isBinary() && (data.getB64Key() <= 0 || force)) { binaries.put(nextBKey, data); data.resetB64Key(nextBKey++); @@ -539,37 +439,45 @@ public class Contact { } /** - * Notify that this element has unsaved changes, and notify its parent of - * the same if any. + * Load the data from the given {@link File} under the given {@link Format}. + * + * @param file + * the {@link File} to load from + * @param format + * the {@link Format} to load as + * + * @return the list of elements + * @throws IOException + * in case of IO error */ - protected void setDirty() { - this.dirty = true; - if (this.parent != null) - this.parent.setDirty(); - } + static private List load(List content) { + List datas = new ArrayList(); - /** - * Notify this element and all its descendants that it is in pristine - * state (as opposed to dirty). - */ - void setPristine() { - dirty = false; - for (Data data : datas) { - data.setPristine(); + boolean fn = false; + boolean n = false; + if (content != null) { + for (Data data : content) { + if (data.getName().equals("N")) { + n = true; + } else if (data.getName().equals("FN")) { + fn = true; + } + + if (!data.getName().equals("VERSION")) { + datas.add(data); + } + } } - } - /** - * Set the parent of this {@link Contact} and all its descendants. - * - * @param parent - * the new parent - */ - void setParent(Card parent) { - this.parent = parent; - for (Data data : datas) { - data.setParent(this); + // required fields: + if (!n) { + datas.add(new Data(null, "N", "", null)); } + if (!fn) { + datas.add(new Data(null, "FN", "", null)); + } + + return datas; } /** @@ -603,5 +511,4 @@ public class Contact { list.add(add); return add.length(); } - }