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 committed 2013-08-08 23:14:18 -05:00
1 parent f78cd57ec7
commit e4a756baf5
11 files changed
+80 -56

No files matched your search

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+3 -3
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
Whitespace-only changes.
@@ -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) {