summaryrefslogtreecommitdiff
path: root/src/swing
diff options
context:
space:
mode:
authorNAME <USER@epfl.ch>2008-04-29 17:55:45 +0000
committerNAME <USER@epfl.ch>2008-04-29 17:55:45 +0000
commitf8085a2e65f4ee9fb21f276da1b8ebbf317ad224 (patch)
treee6be0064664d11069c273ae414f218e7e4c26a88 /src/swing
parent7bb24097c92ad5772e7456bb28cb1d2b13473653 (diff)
downloadscala-f8085a2e65f4ee9fb21f276da1b8ebbf317ad224.tar.gz
scala-f8085a2e65f4ee9fb21f276da1b8ebbf317ad224.tar.bz2
scala-f8085a2e65f4ee9fb21f276da1b8ebbf317ad224.zip
Wrapped some simple dialogs and BorderPanel
Diffstat (limited to 'src/swing')
-rw-r--r--src/swing/scala/swing/BorderPanel.scala39
-rw-r--r--src/swing/scala/swing/ButtonGroup.scala1
-rw-r--r--src/swing/scala/swing/Dialog.scala66
-rw-r--r--src/swing/scala/swing/Icon.scala3
-rw-r--r--src/swing/scala/swing/PasswordField.scala26
-rw-r--r--src/swing/scala/swing/test/Dialogs.scala163
-rw-r--r--src/swing/scala/swing/test/UIDemo.scala15
7 files changed, 289 insertions, 24 deletions
diff --git a/src/swing/scala/swing/BorderPanel.scala b/src/swing/scala/swing/BorderPanel.scala
new file mode 100644
index 0000000000..ad3c4ab11c
--- /dev/null
+++ b/src/swing/scala/swing/BorderPanel.scala
@@ -0,0 +1,39 @@
+package scala.swing
+
+import java.awt.BorderLayout
+
+object BorderPanel {
+ object Position extends Enumeration {
+ val North = Value(BorderLayout.NORTH)
+ val South = Value(BorderLayout.SOUTH)
+ val West = Value(BorderLayout.WEST)
+ val East = Value(BorderLayout.EAST)
+ val Center = Value(BorderLayout.CENTER)
+ }
+ private[swing] def wrapPosition(s: String): Position.Value = s match {
+ case BorderLayout.NORTH => Position.North
+ case BorderLayout.SOUTH => Position.South
+ case BorderLayout.WEST => Position.West
+ case BorderLayout.EAST => Position.East
+ case BorderLayout.CENTER => Position.Center
+ }
+}
+
+/**
+ * @see javax.swing.BorderLayout
+ */
+class BorderPanel extends Panel with LayoutContainer {
+ import BorderPanel._
+ def layoutManager = peer.getLayout.asInstanceOf[BorderLayout]
+ override lazy val peer = new javax.swing.JPanel(new BorderLayout)
+
+ type Constraints = Position.Value
+
+ protected def constraintsFor(comp: Component) =
+ wrapPosition(layoutManager.getConstraints(comp.peer).asInstanceOf[String])
+
+ protected def areValid(c: Constraints): (Boolean, String) = (true, "")
+ protected def add(c: Component, l: Constraints) { peer.add(c.peer, l.toString) }
+
+
+}
diff --git a/src/swing/scala/swing/ButtonGroup.scala b/src/swing/scala/swing/ButtonGroup.scala
index bdbf322059..7000df60b7 100644
--- a/src/swing/scala/swing/ButtonGroup.scala
+++ b/src/swing/scala/swing/ButtonGroup.scala
@@ -3,6 +3,7 @@ package scala.swing
import javax.swing.{AbstractButton => JAbstractButton,Icon}
import event._
import scala.collection._
+import scala.collection.mutable.Buffer
/**
* A button mutex. At most one of its associated buttons is selected
diff --git a/src/swing/scala/swing/Dialog.scala b/src/swing/scala/swing/Dialog.scala
new file mode 100644
index 0000000000..ad80193627
--- /dev/null
+++ b/src/swing/scala/swing/Dialog.scala
@@ -0,0 +1,66 @@
+package scala.swing
+
+import javax.swing.{Icon, JOptionPane}
+
+object Dialog {
+ object Message extends Enumeration {
+ val Error = Value(JOptionPane.ERROR_MESSAGE)
+ val Info = Value(JOptionPane.INFORMATION_MESSAGE)
+ val Warning = Value(JOptionPane.WARNING_MESSAGE)
+ val Question = Value(JOptionPane.QUESTION_MESSAGE)
+ val Plain = Value(JOptionPane.PLAIN_MESSAGE)
+ }
+ object Options extends Enumeration {
+ val Default = Value(JOptionPane.DEFAULT_OPTION)
+ val YesNo = Value(JOptionPane.YES_NO_OPTION)
+ val YesNoCancel = Value(JOptionPane.YES_NO_CANCEL_OPTION)
+ val OkCancel = Value(JOptionPane.OK_CANCEL_OPTION)
+ }
+ object Result extends Enumeration {
+ val Yes = Value(JOptionPane.YES_OPTION)
+ val Ok = Yes
+ val No = Value(JOptionPane.NO_OPTION)
+ val Cancel = Value(JOptionPane.CANCEL_OPTION)
+ val Closed = Value(JOptionPane.CLOSED_OPTION)
+ }
+
+
+ def showConfirmation(parent: Component, message: String, title: String,
+ optionType: Options.Value, messageType: Message.Value, icon: Icon): Result.Value =
+ Result(JOptionPane.showConfirmDialog(parent.peer, message, title,
+ optionType.id, messageType.id, Icon.wrap(icon)))
+ def showConfirmation(parent: Component, message: String, title: String,
+ optionType: Options.Value): Result.Value =
+ Result(JOptionPane.showConfirmDialog(parent.peer, message, title,
+ optionType.id))
+
+ def showOptions(parent: Component, message: String, title: String,
+ optionType: Options.Value, messageType: Message.Value, icon: Icon,
+ entries: Seq[Any], initialEntry: Int): Either[Result.Closed.type, Int] = {
+ val r = JOptionPane.showOptionDialog(parent.peer, message, title,
+ optionType.id, messageType.id, Icon.wrap(icon),
+ entries.map(_.asInstanceOf[AnyRef]).toArray, entries(initialEntry))
+ if (r == JOptionPane.CLOSED_OPTION) Left[Result.Closed.type, Int](Result.Closed)
+ else Right[Result.Closed.type, Int](r)
+ }
+
+ def showInput[A](parent: Component, message: String, title: String,
+ messageType: Message.Value, icon: Icon,
+ entries: Seq[A], initialEntry: A): Option[A] = {
+ val e = if (entries.isEmpty) null
+ else entries.map(_.asInstanceOf[AnyRef]).toArray
+ val r = JOptionPane.showInputDialog(parent.peer, message, title,
+ messageType.id, Icon.wrap(icon),
+ e, initialEntry)
+ Swing.toOption(r)
+ }
+ def showMessage(parent: Component, message: String, title: String,
+ messageType: Message.Value, icon: Icon) {
+ JOptionPane.showMessageDialog(parent.peer, message, title,
+ messageType.id, Icon.wrap(icon))
+ }
+
+ def showMessage(parent: Component, message: String) {
+ JOptionPane.showMessageDialog(parent.peer, message)
+ }
+}
diff --git a/src/swing/scala/swing/Icon.scala b/src/swing/scala/swing/Icon.scala
index a36a55a45f..44e8af337b 100644
--- a/src/swing/scala/swing/Icon.scala
+++ b/src/swing/scala/swing/Icon.scala
@@ -15,4 +15,7 @@ object Icon {
def getIconWidth: Int = 0
def paintIcon(c: java.awt.Component, g: java.awt.Graphics, x: Int, y: Int) {}
}
+
+ def unwrap(icon: Icon): Icon = if (icon == null) Empty else icon
+ def wrap(icon: Icon): Icon = if (icon == Empty) null else icon
}
diff --git a/src/swing/scala/swing/PasswordField.scala b/src/swing/scala/swing/PasswordField.scala
new file mode 100644
index 0000000000..58a4150fb8
--- /dev/null
+++ b/src/swing/scala/swing/PasswordField.scala
@@ -0,0 +1,26 @@
+package scala.swing
+
+import javax.swing._
+import java.awt.event._
+import event._
+
+/**
+ * @see javax.swing.JPasswordField
+ */
+class PasswordField(text0: String, columns0: Int) extends TextField(text0, columns0) {
+ override lazy val peer: JPasswordField = new JPasswordField(text0, columns0)
+ def this(text: String) = this(text, 0)
+ def this(columns: Int) = this("", columns)
+ def this() = this("")
+
+ def echoChar: Char = peer.getEchoChar
+ def echoChar_=(c: Char) = peer.setEchoChar(c)
+
+ /**
+ * The text property should not be used on a password field for
+ * security reasons.
+ */
+ override def text: String = ""
+ override def text_=(s: String) {}
+ def password: Array[Char] = peer.getPassword
+}
diff --git a/src/swing/scala/swing/test/Dialogs.scala b/src/swing/scala/swing/test/Dialogs.scala
index c8cf4698ae..ac156343f1 100644
--- a/src/swing/scala/swing/test/Dialogs.scala
+++ b/src/swing/scala/swing/test/Dialogs.scala
@@ -4,39 +4,154 @@ import swing._
import swing.event._
object Dialogs extends SimpleGUIApplication {
- val ui = new GridBagPanel { grid =>
- import GridBagPanel._
- val buttonText = new TextField("Click Me")
+ import TabbedPane._
- val c = new Constraints
- c.fill = Fill.Horizontal
- c.grid = (1,1)
+ val label = new Label("No Result yet")
+ val tabs = new TabbedPane {
+ pages += new Page("File", new GridBagPanel { grid =>
+ import GridBagPanel._
+ val buttonText = new TextField("Click Me")
- val chooser = new FileChooser
- layout(new PushButton(Action("Open") {
- chooser.showOpenDialog(grid)
- })) = c
+ val c = new Constraints
+ c.fill = Fill.Horizontal
+ c.grid = (1,1)
- c.grid = (1,2)
- layout(new PushButton(Action("Save") {
- chooser.showSaveDialog(grid)
- })) = c
+ val chooser = new FileChooser
+ layout(new PushButton(Action("Open") {
+ chooser.showOpenDialog(grid)
+ })) = c
- c.grid = (1,3)
- layout(new PushButton(Action("Custom") {
- chooser.showDialog(grid, buttonText.text)
- })) = c
+ c.grid = (1,2)
+ layout(new PushButton(Action("Save") {
+ chooser.showSaveDialog(grid)
+ })) = c
- c.grid = (2,3)
- layout(new Label(" with Text ")) = c
+ c.grid = (1,3)
+ layout(new PushButton(Action("Custom") {
+ chooser.showDialog(grid, buttonText.text)
+ })) = c
- c.grid = (3,3)
- c.ipadx = 50
- layout(buttonText) = c
+ c.grid = (2,3)
+ layout(new Label(" with Text ")) = c
- border = Border.Empty(5, 5, 5, 5)
+ c.grid = (3,3)
+ c.ipadx = 50
+ layout(buttonText) = c
+
+ border = Border.Empty(5, 5, 5, 5)
+ })
+ pages += new Page("Simple Modal Dialogs", new BorderPanel {
+ import BorderPanel._
+ val mutex = new ButtonGroup
+ val ok = new RadioButton("OK (in the L&F's words)")
+ val ynlf = new RadioButton("Yes/No (in the L&F's words)")
+ val ynp = new RadioButton("Yes/No (in the programmer's words)")
+ val yncp = new RadioButton("Yes/No/Cancel (in the programmer's words)")
+ val radios = List(ok, ynlf, ynp, yncp)
+ mutex.buttons ++= radios
+ mutex.select(ok)
+ val buttons = new BoxPanel(Orientation.Vertical) {
+ contents ++= radios
+ }
+ layout(buttons) = Position.North
+ layout(new PushButton(Action("Show It!") {
+ import Dialog._
+ mutex.selected.get match {
+ case `ok` =>
+ showMessage(buttons, "Eggs aren't supposed to be green.")
+ case `ynlf` =>
+ showConfirmation(buttons, "Would you like green eggs and ham?",
+ "An Inane Question", Options.YesNo) match {
+ case Result.Yes => label.text = "Ewww!"
+ case Result.No => label.text = "Me neither!"
+ case _ => label.text = "Come on -- tell me!"
+ }
+ case `ynp` =>
+ val options = List("Yes, please",
+ "No, thanks",
+ "No eggs, no ham!")
+ showOptions(buttons,
+ "Would you like some green eggs to go with that ham?",
+ "A Silly Question",
+ Options.YesNo, Message.Question,
+ Icon.Empty, options, 2) match {
+ case Result.Yes => label.text = "You're kidding!"
+ case Result.No => label.text = "I don't like them, either."
+ case _ => label.text = "Come on -- 'fess up!"
+ }
+ case `yncp` =>
+ val options = List("Yes, please",
+ "No, thanks",
+ "No eggs, no ham!")
+ showOptions(buttons,
+ "Would you like some green eggs to go with that ham?",
+ "A Silly Question",
+ Options.YesNoCancel, Message.Question,
+ Icon.Empty, options, 2) match {
+ case Result.Yes => label.text = "Here you go: green eggs and ham!"
+ case Result.No => label.text = "OK, just the ham, then."
+ case Result.Cancel => label.text = "Well, I'm certainly not going to eat them!"
+ case _ => label.text = "Please tell me what you want!"
+ }
+ }
+ })) = Position.South
+ })
+ pages += new Page("More Dialogs", new BorderPanel {
+ import BorderPanel._
+ val mutex = new ButtonGroup
+ val pick = new RadioButton("Pick one of several choices")
+ val enter = new RadioButton("Enter some text")
+ //val nonClosing = new RadioButton("Non-auto-closing dialog")
+ //val validate = new RadioButton("Input-validating dialog (with custom message area)")
+ //val nonModal = new RadioButton("Non-modal dialog")
+ val radios = List(pick, enter)//, nonClosing, validate, nonModal)
+ mutex.buttons ++= radios
+ mutex.select(pick)
+ val buttons = new BoxPanel(Orientation.Vertical) {
+ contents ++= radios
+ }
+ layout(buttons) = Position.North
+ layout(new PushButton(Action("Show It!") {
+ import Dialog._
+ mutex.selected.get match {
+ case `pick` =>
+ val possibilities = List("ham", "spam", "yam")
+ val s = showInput(buttons,
+ "Complete the sentence:\n"
+ + "\"Green eggs and...\"",
+ "Customized Dialog",
+ Message.Plain, Icon.Empty,
+ possibilities, "ham")
+
+ //If a string was returned, say so.
+ if ((s != None) && (s.get.length > 0))
+ label.text = "Green eggs and... " + s.get + "!"
+ else
+ label.text = "Come on, finish the sentence!"
+ case `enter` =>
+ val s = showInput(buttons,
+ "Complete the sentence:\n"
+ + "\"Green eggs and...\"",
+ "Customized Dialog",
+ Message.Plain, Icon.Empty,
+ Nil, "ham")
+
+ //If a string was returned, say so.
+ if ((s != None) && (s.get.length > 0))
+ label.text = "Green eggs and... " + s.get + "!"
+ else
+ label.text = "Come on, finish the sentence!"
+ }
+ })) = Position.South
+ })
}
+ val ui = new BorderPanel {
+ layout(tabs) = BorderPanel.Position.Center
+ layout(label) = BorderPanel.Position.South
+ }
+
+
def top = new MainFrame {
title = "Dialog Demo"
contents = ui
diff --git a/src/swing/scala/swing/test/UIDemo.scala b/src/swing/scala/swing/test/UIDemo.scala
index d08208300a..830fbff28a 100644
--- a/src/swing/scala/swing/test/UIDemo.scala
+++ b/src/swing/scala/swing/test/UIDemo.scala
@@ -70,6 +70,21 @@ object UIDemo extends SimpleGUIApplication {
pages += new Page("Converter", CelsiusConverter2.ui)
pages += new Page("Tables", TableSelection.ui)
pages += new Page("Dialogs", Dialogs.ui)
+
+ val password = new FlowPanel {
+ contents += new Label("Enter your secret password here ")
+ val field = new PasswordField(10)
+
+ contents += field
+ val label = new Label(field.text)
+ contents += label
+ listenTo(field)
+ reactions += {
+ case ValueChanged(`field`, false) => label.text = field.password.mkString
+ }
+ }
+
+ pages += new Page("Password", password)
}
contents += tabs