import java.io.File;
import java.io.IOException;
+import java.lang.reflect.Field;
+import java.net.Socket;
+import java.nio.charset.Charset;
import java.util.LinkedList;
import java.util.List;
+import be.nikiroo.jvcard.Card;
+import be.nikiroo.jvcard.i18n.Trans;
+import be.nikiroo.jvcard.i18n.Trans.StringId;
+import be.nikiroo.jvcard.remote.Command.Verb;
+import be.nikiroo.jvcard.remote.SimpleSocket;
+import be.nikiroo.jvcard.resources.Bundles;
import be.nikiroo.jvcard.tui.panes.FileList;
-import com.googlecode.lanterna.TextColor;
-import com.googlecode.lanterna.gui2.BasicWindow;
-import com.googlecode.lanterna.gui2.DefaultWindowManager;
-import com.googlecode.lanterna.gui2.EmptySpace;
-import com.googlecode.lanterna.gui2.MultiWindowTextGUI;
import com.googlecode.lanterna.gui2.Window;
-import com.googlecode.lanterna.gui2.table.Table;
-import com.googlecode.lanterna.screen.Screen;
-import com.googlecode.lanterna.screen.TerminalScreen;
-import com.googlecode.lanterna.terminal.DefaultTerminalFactory;
-import com.googlecode.lanterna.terminal.Terminal;
+import com.googlecode.lanterna.input.KeyStroke;
/**
* This class contains the runnable Main method. It will parse the user supplied
*
*/
public class Main {
+ // TODO: move Main to be.nikiroo.jvcard, use introspection to load the other
+ // main classes, allow the 3 programs to run from this new Main
+ // also requires StringUtils/... in a new package
+ private int TODO;
+
public static final String APPLICATION_TITLE = "jVcard";
- public static final String APPLICATION_VERSION = "1.0-beta1-dev";
+ public static final String APPLICATION_VERSION = "1.0-beta2-dev";
+
+ static private Trans transService;
+
+ /**
+ * Translate the given {@link StringId}.
+ *
+ * @param id
+ * the ID to translate
+ *
+ * @return the translation
+ */
+ static public String trans(StringId id) {
+ if (transService == null)
+ return "";
+ return transService.trans(id);
+ }
+
+ /**
+ * Translate the given {@link KeyStroke}.
+ *
+ * @param key
+ * the key to translate
+ *
+ * @return the translation
+ */
+ static public String trans(KeyStroke key) {
+ if (transService == null)
+ return "";
+
+ return transService.trans(key);
+ }
+
+ /**
+ * Start the application.
+ *
+ * @param args
+ * the parameters (see <tt>--help</tt> to know which are
+ * supported)
+ */
public static void main(String[] args) {
Boolean textMode = null;
boolean noMoreParams = false;
boolean filesTried = false;
- List<File> files = new LinkedList<File>();
- for (String arg : args) {
+ // get the "system default" language to help translate the --help
+ // message if needed
+ String language = null;
+ transService = new Trans(language);
+
+ List<String> files = new LinkedList<String>();
+ for (int index = 0; index < args.length; index++) {
+ String arg = args[index];
if (!noMoreParams && arg.equals("--")) {
noMoreParams = true;
} else if (!noMoreParams && arg.equals("--help")) {
+ "Usable switches:\n"
+ "\t--: stop looking for switches\n"
+ "\t--help: this here thingy\n"
+ + "\t--lang LANGUAGE: choose the language, for instance en_GB\n"
+ "\t--tui: force pure text mode even if swing treminal is available\n"
+ "\t--gui: force swing terminal mode\n"
+ + "\t--noutf: force non-utf8 mode if you need it\n"
+ + "\t--config DIRECTORY: force the given directory as a CONFIG_DIR\n"
+ "everyhing else is either a file to open or a directory to open\n"
- + "(we will only open 1st level files in given directories)");
+ + "(we will only open 1st level files in given directories)\n"
+ + "('jvcard://hostname:8888/file' links -- or without 'file' -- are also ok)\n");
return;
} else if (!noMoreParams && arg.equals("--tui")) {
textMode = true;
} else if (!noMoreParams && arg.equals("--gui")) {
textMode = false;
+ } else if (!noMoreParams && arg.equals("--noutf")) {
+ UiColors.getInstance().setUnicode(false);
+ } else if (!noMoreParams && arg.equals("--lang")) {
+ index++;
+ if (index < args.length)
+ language = args[index];
+ transService = new Trans(language);
+ } else if (!noMoreParams && arg.equals("--config")) {
+ index++;
+ if (index < args.length) {
+ Bundles.setDirectory(args[index]);
+ transService = new Trans(language);
+ }
} else {
filesTried = true;
files.addAll(open(arg));
}
}
+ if (UiColors.getInstance().isUnicode()) {
+ utf8();
+ }
+
if (files.size() == 0) {
if (filesTried) {
System.exit(1);
files.addAll(open("."));
}
+ // TODO error case when no file
+
+ Window win = new MainWindow(new FileList(files));
+
try {
- TuiLauncher.start(textMode, new MainWindow(new FileList(files)));
+ TuiLauncher.start(textMode, win);
} catch (IOException ioe) {
ioe.printStackTrace();
System.exit(2);
}
-
- /*
- * String file = args.length > 0 ? args[0] : null; String file2 =
- * args.length > 1 ? args[1] : null;
- *
- * if (file == null) file =
- * "/home/niki/workspace/rcard/utils/CVcard/test.vcf"; if (file2 ==
- * null) file2 = "/home/niki/workspace/rcard/utils/CVcard/test.abook";
- *
- * Card card = new Card(new File(file), Format.VCard21);
- * System.out.println(card.toString());
- *
- * System.out.println("\n -- PINE -- \n");
- *
- * card = new Card(new File(file2), Format.Abook);
- * System.out.println(card.toString(Format.Abook));
- */
}
/**
*
* @return the list of opened files
*/
- static private List<File> open(String path) {
- List<File> files = new LinkedList<File>();
-
- File file = new File(path);
- if (file.exists()) {
- if (file.isDirectory()) {
- for (File subfile : file.listFiles()) {
- if (!subfile.isDirectory())
- files.add(subfile);
- }
+ static private List<String> open(String path) {
+ List<String> files = new LinkedList<String>();
+
+ if (path != null && path.startsWith("jvcard://")) {
+ if (path.endsWith("/")) {
+ files.addAll(list(path));
} else {
- files.add(file);
+ files.add(path);
}
} else {
- System.err.println("File or directory not found: \"" + path + "\"");
+ File file = new File(path);
+ if (file.exists()) {
+ if (file.isDirectory()) {
+ for (File subfile : file.listFiles()) {
+ if (!subfile.isDirectory())
+ files.add(subfile.getAbsolutePath());
+ }
+ } else {
+ files.add(file.getAbsolutePath());
+ }
+ } else {
+ System.err.println("File or directory not found: \"" + path
+ + "\"");
+ }
}
return files;
}
- static private void fullTestTable() throws IOException {
- final Table<String> table = new Table<String>("Column 1", "Column 2",
- "Column 3");
- table.getTableModel().addRow("1", "2", "3");
- table.setSelectAction(new Runnable() {
- @Override
- public void run() {
- List<String> data = table.getTableModel().getRow(
- table.getSelectedRow());
- for (int i = 0; i < data.size(); i++) {
- System.out.println(data.get(i));
- }
- }
- });
-
- Window win = new BasicWindow();
- win.setComponent(table);
-
- DefaultTerminalFactory factory = new DefaultTerminalFactory();
- Terminal terminal = factory.createTerminal();
+ /**
+ * List all the available {@link Card}s on the given network location (which
+ * is expected to be a jVCard remote server, obviously).
+ *
+ * @param path
+ * the jVCard remote server path (e.g.:
+ * <tt>jvcard://localhost:4444/</tt>)
+ *
+ * @return the list of {@link Card}s
+ */
+ static private List<String> list(String path) {
+ List<String> files = new LinkedList<String>();
- Screen screen = new TerminalScreen(terminal);
- screen.startScreen();
+ try {
+ String host = path.split("\\:")[1].substring(2);
+ int port = Integer.parseInt(path.split("\\:")[2].replaceAll("/$",
+ ""));
+ SimpleSocket s = new SimpleSocket(new Socket(host, port),
+ "sync client");
+ s.open(true);
+
+ s.sendCommand(Verb.LIST);
+ for (String p : s.receiveBlock()) {
+ files.add(path
+ + p.substring(StringUtils.fromTime(0).length() + 1));
+ }
+ s.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
- // Create gui and start gui
- MultiWindowTextGUI gui = new MultiWindowTextGUI(screen,
- new DefaultWindowManager(), new EmptySpace(TextColor.ANSI.BLUE));
- gui.addWindowAndWait(win);
+ return files;
+ }
- screen.stopScreen();
+ /**
+ * Really, really ask for UTF-8 encoding.
+ */
+ static private void utf8() {
+ try {
+ System.setProperty("file.encoding", "UTF-8");
+ Field charset = Charset.class.getDeclaredField("defaultCharset");
+ charset.setAccessible(true);
+ charset.set(null, null);
+ } catch (SecurityException e) {
+ } catch (NoSuchFieldException e) {
+ } catch (IllegalArgumentException e) {
+ } catch (IllegalAccessException e) {
+ }
}
}