Moved back to realtime update model.

* Using patched version of Jansi.
* Raw ANSI controls always sent to play well with Nailgun.
This commit is contained in:
Jonathan Bernard 2013-08-08 23:14:18 -05:00
parent f78cd57ec7
commit e4a756baf5
11 changed files with 80 additions and 56 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 #Thu, 08 Aug 2013 23:12:38 -0500
lib.local=true lib.local=true
name=timestamper-cli name=timestamper-cli
version=0.1 version=0.2
build.number=29 build.number=13

View File

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