2 Commits
0.1 ... 0.3

Author SHA1 Message Date
284a4159d1 Added command to re-read the timeline source. 2013-08-09 11:45:56 -05:00
e4a756baf5 Moved back to realtime update model.
* Using patched version of Jansi.
* Raw ANSI controls always sent to play well with Nailgun.
2013-08-08 23:14:18 -05:00
13 changed files with 83 additions and 55 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,5 +1,5 @@
#Thu, 08 Aug 2013 19:52:35 -0500
#Fri, 09 Aug 2013 11:44:57 -0500
lib.local=true
name=timestamper-cli
version=0.1
build.number=29
version=0.3
build.number=1

View File

@ -1,5 +1,6 @@
package com.jdblabs.timestamper.cli
import com.jdbernard.io.NonBlockingInputStreamReader
import com.jdbernard.util.SmartConfig
import com.jdbernard.util.LightOptionParser
import com.jdblabs.timestamper.core.Timeline
@ -43,7 +44,7 @@ public class TimeStamperCLI {
protected static doMain(TimeStamperCLI inst, String[] args,
def sin, def out, def err) {
out = new PrintStream(AnsiConsole.wrapOutputStream(out))
//out = new PrintStream(AnsiConsole.wrapOutputStream(out))
def opts = LightOptionParser.parseOptions(cli, args as List)
File workingDir = new File(opts.d ?: '.')
@ -84,52 +85,59 @@ public class TimeStamperCLI {
//out.println ""
def currentMarker = timeline.getLastMarker(new Date())
Reader reader = new InputStreamReader(sin)
def reader = new NonBlockingInputStreamReader(sin)
Thread readerThread = new Thread(reader)
readerThread.start()
boolean running = true
def blockingReadLine = {
String line = null;
while (line == null && readerThread.isAlive()) {
line = reader.readLine()
Thread.sleep(200) }
return line }
def readNotes = {
out.println(ansi().fg(YELLOW).
a("Notes (end with EOF or a blank line):").reset())
String notes = ""
String line = null
line = reader.readLine()
line = blockingReadLine()
while(line != "" && line != "EOF" && line != null) {
notes += line + EOL
line = reader.readLine() }
line = blockingReadLine() }
return notes
}
return notes }
def printPrompt = {
out.print(formatMarker(currentMarker) + EOL +
ansi().fg(YELLOW).a("> ").reset())
out.flush() }
String line = null
while (running) {
out.println formatMarker(currentMarker)
out.print(ansi().fg(YELLOW).a("> ").reset())
out.flush();
printPrompt()
while (running && readerThread.isAlive()) {
// Handle user input
line = reader.readLine()
if (line != null) {
out.flush();
switch (line) {
case null:
case ~/quit|exit|\u0004/:
running = false;
break
case ~/r|refresh|^$/:
out.print(ansi().eraseLine().cursorUp(2).eraseLine())
break
case ~/n|new/:
// Read mark
out.println(ansi().fg(YELLOW).a("New timestamp:").reset())
String mark = reader.readLine()
String mark = blockingReadLine()
// Read notes
String notes = readNotes();
@ -142,19 +150,24 @@ public class TimeStamperCLI {
break
case ~/h|help/:
out.println(ansi().eraseLine().
fg(RED).a("Not yet implemented."));
out.println(ansi().fg(RED).
a("Not yet implemented.").reset());
break
case ~/l|list|history/:
out.println(ansi().eraseLine().
fg(RED).a("Not yet implemented."));
out.println(ansi().fg(RED).
a("Not yet implemented.").reset());
break
case ~/s|save/:
timelineProperties.save()
break
case ~/reload/:
timeline = timelineProperties.reloadTimeline()
currentMarker = timeline.getLastMarker(new Date())
break
default:
String notes = readNotes()
currentMarker = new TimelineMarker(new Date(), line, notes)
@ -163,8 +176,23 @@ public class TimeStamperCLI {
timelineProperties.save()
break
}
printPrompt()
} else {
out.print(ansi().saveCursorPosition().cursorUpLine().eraseLine().toString() +
formatMarker(currentMarker) +
ansi().cursorDown(1).restorCursorPosition().toString())
out.flush();
Thread.sleep(200)
}
}
if (readerThread.isAlive()) {
readerThread.interrupt();
readerThread.join(500);
if (readerThread.isAlive()) readerThread.stop(); }
out.println ""
}
protected static String formatMarker(TimelineMarker tm) {