X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2Ftui%2Fpanes%2FFileList.java;h=376aae9feb503e7c8c492fa3c5d3ca2c2fa74c90;hb=3634193b7a8927e68a3ae3d38fff4f6bd36c4ee5;hp=75f9352cf92f389060276e67c1983b7f811068c3;hpb=7f82bf682ab5747b2d4ccdccae9ea3fcdb013cee;p=jvcard.git diff --git a/src/be/nikiroo/jvcard/tui/panes/FileList.java b/src/be/nikiroo/jvcard/tui/panes/FileList.java index 75f9352..376aae9 100644 --- a/src/be/nikiroo/jvcard/tui/panes/FileList.java +++ b/src/be/nikiroo/jvcard/tui/panes/FileList.java @@ -7,20 +7,27 @@ import java.util.LinkedList; import java.util.List; import be.nikiroo.jvcard.Card; -import be.nikiroo.jvcard.i18n.Trans; +import be.nikiroo.jvcard.launcher.CardResult; +import be.nikiroo.jvcard.launcher.CardResult.MergeCallback; +import be.nikiroo.jvcard.launcher.Main; import be.nikiroo.jvcard.parsers.Format; +import be.nikiroo.jvcard.resources.StringUtils; +import be.nikiroo.jvcard.resources.Trans; import be.nikiroo.jvcard.tui.KeyAction; import be.nikiroo.jvcard.tui.KeyAction.DataType; import be.nikiroo.jvcard.tui.KeyAction.Mode; -import be.nikiroo.jvcard.tui.StringUtils; -import be.nikiroo.jvcard.tui.UiColors; import be.nikiroo.jvcard.tui.UiColors.Element; import com.googlecode.lanterna.input.KeyType; public class FileList extends MainContentList { private List files; - private List cards; + private List cards; + + private FileList merger; + private String mergeRemoteState; + private String mergeSourceFile; + private File mergeTargetFile; public FileList(List files) { setFiles(files); @@ -35,7 +42,7 @@ public class FileList extends MainContentList { public void setFiles(List files) { clearItems(); this.files = files; - cards = new ArrayList(); + cards = new ArrayList(); for (String file : files) { addItem(file); // TODO @@ -64,8 +71,12 @@ public class FileList extends MainContentList { List parts = new LinkedList(); String count = ""; - if (cards.get(index) != null) - count += cards.get(index).size(); + if (cards.get(index) != null) { + try { + count += cards.get(index).getCard().size(); + } catch (IOException e) { + } + } String name = files.get(index).replaceAll("\\\\", "/"); int indexSl = name.lastIndexOf('/'); @@ -73,7 +84,7 @@ public class FileList extends MainContentList { name = name.substring(indexSl + 1); } - name = StringUtils.sanitize(name, UiColors.getInstance().isUnicode()); + name = StringUtils.sanitize(name, Main.isUnicode()); count = " " + StringUtils.padString(count, SIZE_COL_1) + " "; name = " " @@ -94,53 +105,151 @@ public class FileList extends MainContentList { // TODO del, save... actions.add(new KeyAction(Mode.CONTACT_LIST, KeyType.Enter, Trans.StringId.KEY_ACTION_VIEW_CARD) { + private Object obj = null; + @Override public Object getObject() { - int index = getSelectedIndex(); - - if (index < 0 || index >= cards.size()) - return null; - - if (cards.get(index) != null) - return cards.get(index); - - String file = files.get(index); - - try { - Card card = FileList.getCard(file); - cards.set(index, card); - - invalidate(); - - return card; - } catch (IOException ioe) { - ioe.printStackTrace(); - return null; + if (obj == null) { + int index = getSelectedIndex(); + if (index < 0 || index >= cards.size()) + return null; + + try { + if (cards.get(index) != null) { + obj = cards.get(index).getCard(); + } else { + String file = files.get(index); + + CardResult card = null; + final Card arr[] = new Card[4]; + try { + card = Main.getCard(file, new MergeCallback() { + @Override + public Card merge(Card previous, + Card local, Card server, + Card autoMerged) { + arr[0] = previous; + arr[1] = local; + arr[2] = server; + arr[3] = autoMerged; + + return null; + } + }); + + obj = card.getCard(); // throw IOE if problem + } catch (IOException e) { + if (arr[0] == null) + throw e; + + // merge management: set all merge vars in + // merger, + // make sure it has cards but mergeTargetFile + // does not exist + // (create then delete if needed) + // TODO: i18n + setMessage( + "Merge error, please check/fix the merged contact", + true); + + // TODO: i18n + filename with numbers in it to + // fix + File a = File.createTempFile("Merge result ", + ".vcf"); + File p = File.createTempFile( + "Previous common version ", ".vcf"); + File l = File.createTempFile("Local ", ".vcf"); + File s = File.createTempFile("Remote ", ".vcf"); + arr[3].saveAs(a, Format.VCard21); + arr[0].saveAs(p, Format.VCard21); + arr[1].saveAs(l, Format.VCard21); + arr[2].saveAs(s, Format.VCard21); + List mfiles = new LinkedList(); + mfiles.add(a.getAbsolutePath()); + mfiles.add(p.getAbsolutePath()); + mfiles.add(l.getAbsolutePath()); + mfiles.add(s.getAbsolutePath()); + merger = new FileList(mfiles); + merger.mergeRemoteState = arr[2] + .getContentState(false); + merger.mergeSourceFile = files.get(index); + merger.mergeTargetFile = a; + + obj = merger; + return obj; + } + + cards.set(index, card); + + invalidate(); + + if (card.isSynchronised()) { + // TODO i18n + if (card.isChanged()) + setMessage( + "card synchronised: changes from server", + false); + else + setMessage("card synchronised: no changes", + false); + } + } + } catch (IOException ioe) { + ioe.printStackTrace(); + // TODO + setMessage("ERROR!", true); + } } + + return obj; } + }); return actions; } - static private Card getCard(String input) throws IOException { - Format format = Format.Abook; - String ext = input; - if (ext.contains(".")) { - String tab[] = ext.split("\\."); - if (tab.length > 1 && tab[tab.length - 1].equalsIgnoreCase("vcf")) { - format = Format.VCard21; + @Override + public String wakeup() throws IOException { + String s = super.wakeup(); + if (s != null) + return s; + + if (merger != null) { + if (!merger.mergeTargetFile.exists()) { + throw new IOException("Merge cancelled"); + } + + // merge back to server if needed and not changed: + try { + Main.getCard(merger.mergeSourceFile, new MergeCallback() { + @Override + public Card merge(Card previous, Card local, Card server, + Card autoMerged) { + try { + if (server.getContentState(false).equals( + merger.mergeRemoteState)) { + return new Card(merger.mergeTargetFile, + Format.VCard21); + } + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + }).getCard(); + } catch (Exception e) { + e.printStackTrace(); + throw new IOException("Server changed since merge, cancel", e); } - } - Card card = null; - try { - card = new Card(new File(input), format); - } catch (IOException ioe) { - ioe.printStackTrace(); - throw ioe; + merger = null; + + // TODO i18n + return "merged."; } - return card; + return null; } }