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:
Binary file not shown.
Binary file not shown.
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
@@ -1,5 +1,5 @@
|
||||
#Thu, 08 Aug 2013 19:52:35 -0500
|
||||
#Thu, 08 Aug 2013 23:12:38 -0500
|
||||
lib.local=true
|
||||
name=timestamper-cli
|
||||
version=0.1
|
||||
build.number=29
|
||||
version=0.2
|
||||
build.number=13
|
||||
|
||||
@@ -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,60 @@ 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())
|
||||
out.flush();
|
||||
|
||||
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,13 +151,13 @@ 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/:
|
||||
@@ -163,8 +172,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) {
|
||||
|
||||
Reference in New Issue
Block a user