#!/usr/bin/env rune
# Copyright 2004-2006 Kevin Reid, under the terms of the MIT X license
# found at http://www.opensource.org/licenses/mit-license.html ................
# This is a test application for an EIO implementation. It's a trivial 'telnet' client - receive text, send text.
pragma.enable("easy-return")
pragma.disable("explicit-result-guard")
pragma.enable("accumulator")
pragma.enable("unary-star")
pragma.enable("dot-props")
def ScrollPaneConstants :=
def makeBorderLayout :=
def makeJFrame :=
def makeJTextArea :=
def makeKeyEvent :=
def makeScrollPane :=
def dimension :=
def font :=
def network := (privilegedScope)
#def makeInCharDecoder :=
#def makeOutCharEncoder :=
# Using dot-props heavily as an experiment.
def [hostStr, portStr, charsetStr] := switch (interp::args) {
match [a,b,c] { [a,b,c] }
match [`@a:@b`, c] { [a,b,c] }
match [a,b] { [a,b,"UTF-8"] }
match [`@a:@b`] { [a,b,"UTF-8"] }
}
# --- Making UI ---
def send
# Derived from Den's ui.makeTerminal
def outputScrollPane := makeScrollPane()
outputScrollPane::preferredSize := dimension(320,320)
outputScrollPane::verticalScrollBarPolicy := ScrollPaneConstants::VERTICAL_SCROLLBAR_ALWAYS
outputScrollPane::viewport."add(Component)"(
def outputC := makeJTextArea()
outputC::lineWrap := true
outputC::font := font("Courier", 0, 10)
outputC::editable := false
outputC
)
def inputC := ()
inputC.addKeyListener(def enterKeyListener{
to keyPressed(theEvent) :void {
try {
if (theEvent::keyCode == makeKeyEvent::VK_ENTER) {
send(inputC::text)
inputC.selectAll()
}
} catch p {
throw <- (p)
}
}
match _ {}
})
def win := makeJFrame(`$hostStr:$portStr`)
win::contentPane := JPanel`
$outputScrollPane.X.Y
$inputC.X
`
# --- ---
def ins
def outs
bind send(text) {
stderr.println(`send($text)`)
outs.whenAvailable(text.size() + 1, fn{
stderr.println(`send whenAvailable thunk`)
outs.write(text + "\n")
outs.flush()
})
}
win.addWindowListener(def mainWindowListener {
to windowClosing(event) :void {
try {
ins.close()
} catch p {
throw <- (p)
}
try {
outs.close()
} catch p {
throw <- (p)
}
interp.continueAtTop()
}
match _ {}
})
def doc := outputC::document
def handler() {
if (ins.isTerminated()) {
win::contentPane := JPanel`$outputScrollPane`
# I couldn't get it to relayout and redraw properly any other way:
def s := win::size
win.setSize(s::width.floor(), s::height.floor() + 1)
win.setSize(s::width.floor(), s::height.floor())
#win.invalidate()
#win::contentPane.invalidate()
#win::contentPane.repaint()
} else {
doc.insertString(doc::length, __makeTwine.fromChars(ins.read(0, 2**16), null), null)
ins <- whenAvailable(1, handler)
}
}
ins <- whenAvailable(1, handler)
# --- Making connection ---
def remotePort := network.getRemoteTCPEndpoint(hostStr, __makeInt(portStr, 10))
def [bind ins, bind outs] := remotePort.connect(["textStreams" => charsetStr])
#def [rawIns, rawOuts] := remotePort.connect()
#stderr.println(`% makeInCharDecoder`)
#bind ins := makeInCharDecoder(rawIns, "ISO-8859-15", => stderr)
#stderr.println(`% makeOutCharEncoder`)
#bind outs := makeOutCharEncoder(rawOuts, "ISO-8859-15", => stderr)
stderr.println(`% showing window`)
win.show()
interp.blockAtTop()