X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2Ftui%2Fpanes%2FFileList.java;h=da589aa009c58e5b3940aefde28cc020db1811bc;hb=e119a1c1a924998b9315e46c96b1c750aab1deb9;hp=dfc3b73114cf3ffda2f2989d74841a1e602a9e69;hpb=bcb54330afff6a443ab43ee3d38cc7f863c701b7;p=jvcard.git diff --git a/src/be/nikiroo/jvcard/tui/panes/FileList.java b/src/be/nikiroo/jvcard/tui/panes/FileList.java index dfc3b73..da589aa 100644 --- a/src/be/nikiroo/jvcard/tui/panes/FileList.java +++ b/src/be/nikiroo/jvcard/tui/panes/FileList.java @@ -7,25 +7,29 @@ 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.enums.ColorOption; +import be.nikiroo.jvcard.resources.enums.StringId; 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 files; + private List cards; - public FileList(List files) { - super(UiColors.Element.CONTACT_LINE, - UiColors.Element.CONTACT_LINE_SELECTED); + private FileList merger; + private String mergeRemoteState; + private String mergeSourceFile; + private File mergeTargetFile; + public FileList(List files) { setFiles(files); } @@ -35,13 +39,13 @@ public class FileList extends MainContentList { * @param files * the new files */ - public void setFiles(List files) { + public void setFiles(List files) { clearItems(); this.files = files; - cards = new ArrayList(); + cards = new ArrayList(); - for (File file : files) { - addItem(file.getName()); + for (String file : files) { + addItem(file); // TODO cards.add(null); } @@ -59,18 +63,28 @@ public class FileList extends MainContentList { // TODO: from ini file? int SIZE_COL_1 = 3; - Element el = (focused && selected) ? Element.CONTACT_LINE_SELECTED - : Element.CONTACT_LINE; - Element elSep = (focused && selected) ? Element.CONTACT_LINE_SEPARATOR_SELECTED - : Element.CONTACT_LINE_SEPARATOR; + ColorOption el = (focused && selected) ? ColorOption.CONTACT_LINE_SELECTED + : ColorOption.CONTACT_LINE; + ColorOption elSep = (focused && selected) ? ColorOption.CONTACT_LINE_SEPARATOR_SELECTED + : ColorOption.CONTACT_LINE_SEPARATOR; 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('/'); + if (indexSl >= 0) { + name = name.substring(indexSl + 1); + } - String name = files.get(index).getName(); + name = StringUtils.sanitize(name, Main.isUnicode()); count = " " + StringUtils.padString(count, SIZE_COL_1) + " "; name = " " @@ -90,46 +104,152 @@ public class FileList extends MainContentList { // TODO del, save... actions.add(new KeyAction(Mode.CONTACT_LIST, KeyType.Enter, - Trans.StringId.KEY_ACTION_VIEW_CARD) { + 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); - - File file = files.get(index); - Format format = Format.Abook; - String ext = file.getName(); - if (ext.contains(".")) { - String tab[] = ext.split("\\."); - if (tab.length > 1 - && tab[tab.length - 1].equalsIgnoreCase("vcf")) { - format = Format.VCard21; + 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); } } - try { - Card card = new Card(file, format); - cards.set(index, card); - - invalidate(); - return card; - } catch (IOException ioe) { - ioe.printStackTrace(); - return null; - } + return obj; } + }); return actions; } @Override - public Mode getMode() { - return Mode.FILE_LIST; + 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); + } + + merger = null; + + // TODO i18n + return "merged."; + } + + return null; } }