From df50e05006b43b007c2587549030d24b5c154398 Mon Sep 17 00:00:00 2001 From: Gilles Dubochet Date: Fri, 16 Dec 2005 18:29:42 +0000 Subject: 'test-nsc' has been moved to 'test'. --- test/files/pos/gui.scala | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 test/files/pos/gui.scala (limited to 'test/files/pos/gui.scala') diff --git a/test/files/pos/gui.scala b/test/files/pos/gui.scala new file mode 100644 index 0000000000..b40759fb01 --- /dev/null +++ b/test/files/pos/gui.scala @@ -0,0 +1,99 @@ +object Geom { + trait Shape; + case class Point(x: int, y: int) extends Shape; + case class Rectangle(ll: Point, ur: Point) extends Shape { + def inset(delta: int) = + Rectangle(Point(ll.x - delta, ll.y - delta), Point(ur.x + delta, ur.y + delta)); + } +} + +object Color { + type Color = int; + val black = 0x000000; + val grey = 0x808080; +} + +trait Screen { + type Color = int; + def drawRect(r: Geom.Rectangle, c: Color): unit; + def fillRect(r: Geom.Rectangle, c: Color): unit; +} + +object DummyScreen extends Screen { + def drawRect(r: Geom.Rectangle, c: Color): unit = + System.out.println("draw " + r + " with " + c); + def fillRect(r: Geom.Rectangle, c: Color): unit = + System.out.println("fill " + r + " with " + c); +} + +object GUI { + + object Controller { + def addMouseCtl(c: MouseCtl) = () + } + + trait Glyph { + def getRect: Geom.Rectangle; + def setLoc(p: Geom.Point): unit; + def draw() = System.out.println("draw " + this); + } + + class Label(scr: Screen, p: Geom.Point, name: String) extends Glyph { + private var origin = p; + def getRect = Geom.Rectangle(origin, origin).inset(10); + def setLoc(p: Geom.Point) = { origin = p } + } + + trait Ctl { + def getGlyph: Glyph; + def enable(b: Boolean): this.type; + } + + trait MouseCtl extends Ctl { + def mouseDown(p: Geom.Point): unit; + } + + abstract class Button(scr: Screen, p: Geom.Point, name: String) + extends Glyph with MouseCtl { + var enabled: boolean = false; + val label = new Label(scr, p, name); + + /* Glyph methods */ + override def draw(): unit = { + if (enabled) scr.drawRect(getRect, Color.black) + else scr.fillRect(getRect, Color.grey); + label.draw(); + } + def setLoc(p: Geom.Point) = label.setLoc(p); + def getRect = label.getRect.inset(-2); + + /* Ctl methods */ + def enable(b: boolean): this.type = { enabled = b; draw(); this } + def getGlyph = label; + final def mouseDown(p: Geom.Point): unit = + if (enabled) doit() else System.out.println("button is disabled"); + + /* deferred method to be specified by client */ + def doit(): unit; + } +} + +object GUIClient { + + class Application { + def quit() = System.out.println("application exited"); + } + + class QuitButton (scr: Screen, p: Geom.Point, name: String, a: Application) + extends GUI.Button(scr, p, name) { + def doit(): unit = a.quit(); + } + + def main(args: Array[String]) = { + val b = new QuitButton( + DummyScreen, Geom.Point(1, 1), "quit", new Application); + b.draw(); + b.enable(true).mouseDown(Geom.Point(1, 2)); + } +} + -- cgit v1.2.3