alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Scala example source code file (gui.scala)

This example Scala source code file (gui.scala) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Scala tags/keywords

app, boolean, color, color, glyph, int, int, point, screen, screen, shape, string, unit, unit

The Scala gui.scala source code

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) { 
    Console.println("draw " + r + " with " + c)
  }
  def fillRect(r: Geom.Rectangle, c: Color) {
    Console.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() { Console.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() {
      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) {
      if (enabled) doit() else Console.println("button is disabled");
    }
    /* deferred method to be specified by client */
    def doit(): Unit
  }
}

object GUIClient {

  class App {
    def quit() { Console.println("application exited") }
  }

  class QuitButton (scr: Screen, p: Geom.Point, name: String, a: App) 
  extends GUI.Button(scr, p, name) {
    def doit() { a.quit() }
  }

  def main(args: Array[String]) {
    val b = new QuitButton(
      DummyScreen, Geom.Point(1, 1), "quit", new App);
    b.draw();
    b.enable(true).mouseDown(Geom.Point(1, 2));
  }
}

Other Scala examples (source code examples)

Here is a short list of links related to this Scala gui.scala source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.