diff --git a/README.md b/README.md
index c408b57b..06d3f4d2 100644
--- a/README.md
+++ b/README.md
@@ -5,25 +5,32 @@
[](http://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.scala-lang.modules%20a%3Ascala-swing_2.12)
[](http://waffle.io/scala/scala-swing)
-This is now community maintained by @benhutchison & @Sciss. If you're interested in helping then contact them or @adriaanm.
+This is now community maintained by @benhutchison & @Sciss. If you are interested in helping then contact them or @adriaanm.
This is a UI library that will wrap most of Java Swing for Scala in a straightforward manner.
The widget class hierarchy loosely resembles that of Java Swing. The main differences are:
-- In Java Swing all components are containers per default. This doesn't make much sense for
+- In Java Swing all components are containers per default. This does not make much sense for
a number of components, like TextField, CheckBox, RadioButton, and so on. Our guess is that
this architecture was chosen because Java lacks multiple inheritance.
In scala-swing, components that can have child components extend the Container trait.
-- Layout managers and panels are coupled. There is no way to exchange the layout manager
+- Layout managers and panels are coupled. There is no way to exchange the layout manager
of a panel. As a result, the layout constraints for widgets can be typed.
(Note that you gain more type-safety and don't loose much flexibility here. Besides
being not a common operation, exchanging the layout manager of a panel in Java
Swing almost always leads to exchanging the layout constraints for every of the panel's
child component. In the end, it is not more work to move all children to a newly created
panel.)
-
- The event system. TODO.
-
+- Widget hierarchies are built by adding children to their parent container's `contents`
+ collection. The typical usage style is to create anonymous subclasses of the widgets to
+ customize their properties, and nest children and event reactions.
+- The scala-swing event system follows a different approach than the underlying Java system.
+ Instead of add event listeners with a particular interface (such as `java.awt.ActionListener`),
+ a `Reactor` instances announces the interest in receiving events by calling `listenTo` for
+ a `Publisher`. Publishers are also reactors and listen to themselves per default as a convenience.
+ A reactor contains an object `reactions` which serves as a convenient place to register observers
+ by adding partial functions that pattern match for any event that the observer is interested in.
+ This is shown in the examples section below.
- For more details see [SIP-8](docs/SIP-8.md)
The library comprises two main packages:
@@ -31,11 +38,11 @@ The library comprises two main packages:
- `scala.swing`: All widget classes and traits.
- `scala.swing.event`: The event hierarchy.
-
## Examples
A number of examples can be found in the `examples` project.
-A good place to start is `[12] scala.swing.examples.UIDemo` (_index number may be different for you_). This pulls in the all the other examples into a tabbed window.
+A good place to start is `[16] scala.swing.examples.UIDemo`.
+This pulls in the all the other examples into a tabbed window.
```
$ sbt examples/run
@@ -43,25 +50,51 @@ $ sbt examples/run
Multiple main classes detected, select one to run:
[1] scala.swing.examples.ButtonApp
- [2] scala.swing.examples.Dialogs
- [3] scala.swing.examples.ComboBoxes
- [4] scala.swing.examples.CelsiusConverter2
- [5] scala.swing.examples.ListViewDemo
- [6] scala.swing.examples.HelloWorld
- [7] scala.swing.examples.LabelTest
- [8] scala.swing.examples.PopupDemo
- [9] scala.swing.examples.ColorChooserDemo
- [10] scala.swing.examples.LinePainting
- [11] scala.swing.examples.GridBagDemo
- [12] scala.swing.examples.UIDemo
- [13] scala.swing.examples.TableSelection
- [14] scala.swing.examples.CelsiusConverter
- [15] scala.swing.examples.SwingApp
- [16] scala.swing.examples.CountButton
+ [2] scala.swing.examples.CelsiusConverter
+ [3] scala.swing.examples.CelsiusConverter2
+ [4] scala.swing.examples.ColorChooserDemo
+ [5] scala.swing.examples.ComboBoxes
+ [6] scala.swing.examples.CountButton
+ [7] scala.swing.examples.Dialogs
+ [8] scala.swing.examples.GridBagDemo
+ [9] scala.swing.examples.HelloWorld
+ [10] scala.swing.examples.LabelTest
+ [11] scala.swing.examples.LinePainting
+ [12] scala.swing.examples.ListViewDemo
+ [13] scala.swing.examples.PopupDemo
+ [14] scala.swing.examples.SwingApp
+ [15] scala.swing.examples.TableSelection
+ [16] scala.swing.examples.UIDemo
Enter number:
```
+### Frame with a Button
+
+The following example shows how to plug components and containers together and react to a
+mouse click on a button:
+
+```scala
+import scala.swing._
+
+new Frame {
+ title = "Hello world"
+
+ contents = new FlowPanel {
+ contents += new Label("Launch rainbows:")
+ contents += new Button("Click me") {
+ reactions += {
+ case event.ButtonClicked(_) =>
+ println("All the colours!")
+ }
+ }
+ }
+
+ pack()
+ centerOnScreen()
+ open()
+}
+```
## Versions
@@ -69,15 +102,18 @@ Enter number:
- The `2.0.x` branch is compiled with JDK 8 and released for Scala 2.11 and 2.12.
- When using Scala 2.11, you can use the Scala swing 2.0.x releases on JDK 6 or newer.
- Scala 2.12 requires you to use JDK 8 (that has nothing to do with scala-swing).
+- Version `2.1.0` adds support for Scala 2.13, while dropping Scala 2.10.
-The reason to have two versions is to allow for binary incompatible changes. Also, some java-swing classes were generified in JDK 7 (see [SI-3634](https://issues.scala-lang.org/browse/SI-3634)) and require the scala-swing soruces to be adjusted.
+The reason to have different major versions is to allow for binary incompatible changes. Also, some java-swing classes were
+generified in JDK 7 (see [SI-3634](https://issues.scala-lang.org/browse/SI-3634)) and require the scala-swing sources to be adjusted.
## API documentation (Scaladoc)
-The API documentation for scala-swing can be found at [http://www.scala-lang.org/documentation/api.html](http://www.scala-lang.org/documentation/api.html).
+The API documentation for scala-swing can be found
+at [http://www.scala-lang.org/documentation/api.html](http://www.scala-lang.org/documentation/api.html).
## Current Work
-Current changes are being made on the `2.0.x` branch.
+Current changes are being made on the `work` branch.
diff --git a/build.sbt b/build.sbt
index 6b780218..d2ad2a9c 100644
--- a/build.sbt
+++ b/build.sbt
@@ -4,21 +4,23 @@ scalaModuleSettings
name := "scala-swing"
-version := "2.0.4-SNAPSHOT"
+version := "2.1.0-SNAPSHOT"
-scalacOptions ++= Seq("-deprecation", "-feature")
+scalacOptions in ThisBuild ++= Seq("-deprecation", "-feature")
// Map[JvmMajorVersion, List[(ScalaVersion, UseForPublishing)]]
scalaVersionsByJvm in ThisBuild := Map(
- 8 -> List("2.11.12", "2.12.6", "2.13.0-M3").map(_ -> true),
- 9 -> List("2.11.12", "2.12.6", "2.13.0-M3").map(_ -> false),
- 10 -> List("2.11.12", "2.12.6", "2.13.0-M3").map(_ -> false),
- 11 -> List("2.11.12", "2.12.6", "2.13.0-M3").map(_ -> false)
+ 8 -> List("2.11.12", "2.12.8", "2.13.0-M5").map(_ -> true),
+ 9 -> List("2.11.12", "2.12.8", "2.13.0-M5").map(_ -> false),
+ 10 -> List("2.11.12", "2.12.8", "2.13.0-M5").map(_ -> false),
+ 11 -> List("2.11.12", "2.12.8", "2.13.0-M5").map(_ -> false)
)
+scalaVersion in ThisBuild := "2.13.0-M5" // for testing
+
OsgiKeys.exportPackage := Seq(s"scala.swing.*;version=${version.value}")
-mimaPreviousVersion := Some("2.0.0")
+mimaPreviousVersion := None // Some("2.0.0")
// set the prompt (for this build) to include the project id.
shellPrompt in ThisBuild := { state => Project.extract(state).currentRef.project + "> " }
@@ -26,8 +28,8 @@ shellPrompt in ThisBuild := { state => Project.extract(state).currentRef.project
lazy val swing = project.in(file("."))
.settings(
libraryDependencies += {
- val v = if (scalaVersion.value == "2.13.0-M3") "3.0.5-M1" else "3.0.5"
- "org.scalatest" %% "scalatest" % v % "test"
+ val v = if (scalaVersion.value == "2.13.0-M5") "3.0.6-SNAP5" else "3.0.5"
+ "org.scalatest" %% "scalatest" % v % Test
}
)
diff --git a/examples/src/main/scala/scala/swing/examples/ButtonApp.scala b/examples/src/main/scala/scala/swing/examples/ButtonApp.scala
index 47a4117c..628ccb8e 100644
--- a/examples/src/main/scala/scala/swing/examples/ButtonApp.scala
+++ b/examples/src/main/scala/scala/swing/examples/ButtonApp.scala
@@ -12,7 +12,7 @@ import scala.swing._
import scala.swing.event._
object ButtonApp extends SimpleSwingApplication {
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
title = "My Frame"
contents = new GridPanel(2, 2) {
hGap = 3
@@ -27,4 +27,3 @@ object ButtonApp extends SimpleSwingApplication {
size = new Dimension(300, 80)
}
}
-
diff --git a/examples/src/main/scala/scala/swing/examples/CelsiusConverter.scala b/examples/src/main/scala/scala/swing/examples/CelsiusConverter.scala
index d3a97a12..d2cf6c78 100644
--- a/examples/src/main/scala/scala/swing/examples/CelsiusConverter.scala
+++ b/examples/src/main/scala/scala/swing/examples/CelsiusConverter.scala
@@ -15,7 +15,7 @@ import scala.swing.event._
* A GUI app to convert celsius to centigrade
*/
object CelsiusConverter extends SimpleSwingApplication {
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
title = "Convert Celsius to Fahrenheit"
val tempCelsius = new TextField
val celsiusLabel = new Label {
@@ -42,7 +42,7 @@ object CelsiusConverter extends SimpleSwingApplication {
}
}
contents = new GridPanel(2, 2) {
- contents.append(tempCelsius, celsiusLabel, convertButton, fahrenheitLabel)
+ contents ++= Seq(tempCelsius, celsiusLabel, convertButton, fahrenheitLabel)
border = Swing.EmptyBorder(10, 10, 10, 10)
}
//defaultButton = Some(convertButton)
diff --git a/examples/src/main/scala/scala/swing/examples/CelsiusConverter2.scala b/examples/src/main/scala/scala/swing/examples/CelsiusConverter2.scala
index 2dcf972f..7ad8ccf5 100644
--- a/examples/src/main/scala/scala/swing/examples/CelsiusConverter2.scala
+++ b/examples/src/main/scala/scala/swing/examples/CelsiusConverter2.scala
@@ -12,14 +12,14 @@ import scala.swing._
import scala.swing.event._
object CelsiusConverter2 extends SimpleSwingApplication {
- def newField = new TextField {
+ def newField: TextField = new TextField {
text = "0"
columns = 5
horizontalAlignment = Alignment.Right
}
- val celsius = newField
- val fahrenheit = newField
+ val celsius = newField
+ val fahrenheit = newField
listenTo(fahrenheit, celsius)
reactions += {
@@ -38,7 +38,7 @@ object CelsiusConverter2 extends SimpleSwingApplication {
border = Swing.EmptyBorder(15, 10, 10, 10)
}
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
title = "Convert Celsius / Fahrenheit"
contents = ui
}
diff --git a/examples/src/main/scala/scala/swing/examples/ColorChooserDemo.scala b/examples/src/main/scala/scala/swing/examples/ColorChooserDemo.scala
index 65e8a003..6d9a66df 100644
--- a/examples/src/main/scala/scala/swing/examples/ColorChooserDemo.scala
+++ b/examples/src/main/scala/scala/swing/examples/ColorChooserDemo.scala
@@ -9,10 +9,11 @@
package scala.swing.examples
import java.awt.{Color, Font}
+
+import scala.swing.BorderPanel._
+import scala.swing.Swing._
import scala.swing._
import scala.swing.event._
-import scala.swing.Swing._
-import scala.swing.BorderPanel._
/**
* Demo for ColorChooser.
@@ -21,14 +22,14 @@ import scala.swing.BorderPanel._
* @author andy@hicks.net
*/
object ColorChooserDemo extends SimpleSwingApplication {
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
title = "ColorChooser Demo"
size = new Dimension(400, 400)
contents = ui
}
- val banner = new Label("Welcome to Scala Swing") {
+ val banner: Label = new Label("Welcome to Scala Swing") {
horizontalAlignment = Alignment.Center
foreground = Color.yellow
background = Color.blue
@@ -36,8 +37,8 @@ object ColorChooserDemo extends SimpleSwingApplication {
font = new Font("SansSerif", Font.BOLD, 24)
}
- def ui = new BorderPanel {
- val colorChooser = new ColorChooser {
+ def ui: BorderPanel = new BorderPanel {
+ val colorChooser: ColorChooser = new ColorChooser {
reactions += {
case ColorChanged(_, c) =>
banner.foreground = c
@@ -46,13 +47,13 @@ object ColorChooserDemo extends SimpleSwingApplication {
colorChooser.border = TitledBorder(EtchedBorder, "Choose Text Color")
- val bannerArea = new BorderPanel {
+ val bannerArea: BorderPanel = new BorderPanel {
layout(banner) = Position.Center
border = TitledBorder(EtchedBorder, "Banner")
}
// Display a color selection dialog when button pressed
- val selectColor = new Button("Choose Background Color") {
+ val selectColor: Button = new Button("Choose Background Color") {
reactions += {
case ButtonClicked(_) =>
ColorChooser.showDialog(this, "Test", Color.red) match {
@@ -62,8 +63,8 @@ object ColorChooserDemo extends SimpleSwingApplication {
}
}
- layout(bannerArea) = Position.North
- layout(colorChooser) = Position.Center
- layout(selectColor) = Position.South
+ layout(bannerArea) = Position.North
+ layout(colorChooser) = Position.Center
+ layout(selectColor) = Position.South
}
}
\ No newline at end of file
diff --git a/examples/src/main/scala/scala/swing/examples/ComboBoxes.scala b/examples/src/main/scala/scala/swing/examples/ComboBoxes.scala
index 3d8e452c..923d9e0a 100644
--- a/examples/src/main/scala/scala/swing/examples/ComboBoxes.scala
+++ b/examples/src/main/scala/scala/swing/examples/ComboBoxes.scala
@@ -8,13 +8,15 @@
package scala.swing.examples
-import scala.swing._
-import scala.swing.event._
-import java.util.Date
import java.awt.Color
import java.text.SimpleDateFormat
+import java.util.Date
+
import javax.swing.{Icon, ImageIcon}
+import scala.swing._
+import scala.swing.event._
+
/**
* Demonstrates how to use combo boxes and custom item renderers.
*
@@ -24,7 +26,7 @@ object ComboBoxes extends SimpleSwingApplication {
import ComboBox._
- lazy val ui = new FlowPanel {
+ lazy val ui: FlowPanel = new FlowPanel {
contents += new ComboBox(List(1, 2, 3, 4))
val patterns = List(
@@ -100,10 +102,9 @@ object ComboBoxes extends SimpleSwingApplication {
contents += iconBox
}
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
title = "ComboBoxes Demo"
contents = ui
}
-
}
diff --git a/examples/src/main/scala/scala/swing/examples/CountButton.scala b/examples/src/main/scala/scala/swing/examples/CountButton.scala
index e6a9993d..dc13cf6e 100644
--- a/examples/src/main/scala/scala/swing/examples/CountButton.scala
+++ b/examples/src/main/scala/scala/swing/examples/CountButton.scala
@@ -12,7 +12,7 @@ import scala.swing._
import scala.swing.event._
object CountButton extends SimpleSwingApplication {
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
title = "My Frame"
contents = new GridPanel(2, 2) {
hGap = 3
@@ -27,11 +27,11 @@ object CountButton extends SimpleSwingApplication {
contents += label
listenTo(button)
- var nclicks = 0
+ var nClicks = 0
reactions += {
- case ButtonClicked(b) =>
- nclicks += 1
- label.text = "Number of button clicks: " + nclicks
+ case ButtonClicked(_) =>
+ nClicks += 1
+ label.text = "Number of button clicks: " + nClicks
}
}
}
diff --git a/examples/src/main/scala/scala/swing/examples/Dialogs.scala b/examples/src/main/scala/scala/swing/examples/Dialogs.scala
index 54aeb7f2..a8c27abb 100644
--- a/examples/src/main/scala/scala/swing/examples/Dialogs.scala
+++ b/examples/src/main/scala/scala/swing/examples/Dialogs.scala
@@ -56,10 +56,10 @@ object Dialogs extends SimpleSwingApplication {
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 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)
@@ -76,10 +76,10 @@ object Dialogs extends SimpleSwingApplication {
label.text = showConfirmation(buttons,
"Would you like green eggs and ham?",
"An Inane Question") match {
- case Result.Yes => "Ewww!"
- case Result.No => "Me neither!"
- case _ => "Come on -- tell me!"
- }
+ case Result.Yes => "Ewww!"
+ case Result.No => "Me neither!"
+ case _ => "Come on -- tell me!"
+ }
case `ynp` =>
val options = List("Yes, please",
"No, thanks",
@@ -89,10 +89,10 @@ object Dialogs extends SimpleSwingApplication {
"A Silly Question",
entries = options,
initial = 2) match {
- case Result.Yes => "You're kidding!"
- case Result.No => "I don't like them, either."
- case _ => "Come on -- 'fess up!"
- }
+ case Result.Yes => "You're kidding!"
+ case Result.No => "I don't like them, either."
+ case _ => "Come on -- 'fess up!"
+ }
case `yncp` =>
val options = List("Yes, please",
"No, thanks",
@@ -102,11 +102,11 @@ object Dialogs extends SimpleSwingApplication {
title = "A Silly Question",
entries = options,
initial = 2) match {
- case Result.Yes => "Here you go: green eggs and ham!"
- case Result.No => "OK, just the ham, then."
- case Result.Cancel => "Well, I'm certainly not going to eat them!"
- case _ => "Please tell me what you want!"
- }
+ case Result.Yes => "Here you go: green eggs and ham!"
+ case Result.No => "OK, just the ham, then."
+ case Result.Cancel => "Well, I'm certainly not going to eat them!"
+ case _ => "Please tell me what you want!"
+ }
}
})) = Position.South
})
@@ -114,12 +114,12 @@ object Dialogs extends SimpleSwingApplication {
import BorderPanel._
- val mutex = new ButtonGroup
- val pick = new RadioButton("Pick one of several choices")
- val enter = new RadioButton("Enter some text")
- val custom = new RadioButton("Custom")
+ val mutex = new ButtonGroup
+ val pick = new RadioButton("Pick one of several choices")
+ val enter = new RadioButton("Enter some text")
+ val custom = new RadioButton("Custom")
val customUndec = new RadioButton("Custom undecorated")
- val custom2 = new RadioButton("2 custom dialogs")
+ val custom2 = new RadioButton("2 custom dialogs")
val radios = List(pick, enter, custom, customUndec, custom2)
mutex.buttons ++= radios
mutex.select(pick)
@@ -140,7 +140,7 @@ object Dialogs extends SimpleSwingApplication {
possibilities, "ham")
//If a string was returned, say so.
- label.text = if ((s != None) && (s.get.length > 0))
+ label.text = if (s.isDefined && (s.get.length > 0))
"Green eggs and... " + s.get + "!"
else
"Come on, finish the sentence!"
@@ -153,7 +153,7 @@ object Dialogs extends SimpleSwingApplication {
Nil, "ham")
//If a string was returned, say so.
- label.text = if ((s != None) && (s.get.length > 0))
+ label.text = if (s.isDefined && (s.get.length > 0))
"Green eggs and... " + s.get + "!"
else
"Come on, finish the sentence!"
@@ -191,7 +191,7 @@ object Dialogs extends SimpleSwingApplication {
}
- lazy val top = new MainFrame {
+ lazy val top: Frame = new MainFrame {
title = "Dialog Demo"
contents = ui
}
diff --git a/examples/src/main/scala/scala/swing/examples/GridBagDemo.scala b/examples/src/main/scala/scala/swing/examples/GridBagDemo.scala
index ff371aa8..b896b109 100644
--- a/examples/src/main/scala/scala/swing/examples/GridBagDemo.scala
+++ b/examples/src/main/scala/scala/swing/examples/GridBagDemo.scala
@@ -8,12 +8,13 @@
package scala.swing.examples
-import scala.swing._
-import GridBagPanel._
import java.awt.Insets
+import scala.swing.GridBagPanel._
+import scala.swing._
+
object GridBagDemo extends SimpleSwingApplication {
- lazy val ui = new GridBagPanel {
+ lazy val ui: GridBagPanel = new GridBagPanel {
val c = new Constraints
val shouldFill = true
if (shouldFill) {
@@ -22,49 +23,49 @@ object GridBagDemo extends SimpleSwingApplication {
val button1 = new Button("Button 1")
- c.weightx = 0.5
+ c.weightx = 0.5
- c.fill = Fill.Horizontal
- c.gridx = 0
- c.gridy = 0
+ c.fill = Fill.Horizontal
+ c.gridx = 0
+ c.gridy = 0
layout(button1) = c
val button2 = new Button("Button 2")
- c.fill = Fill.Horizontal
- c.weightx = 0.5
- c.gridx = 1
- c.gridy = 0
+ c.fill = Fill.Horizontal
+ c.weightx = 0.5
+ c.gridx = 1
+ c.gridy = 0
layout(button2) = c
val button3 = new Button("Button 3")
- c.fill = Fill.Horizontal
- c.weightx = 0.5
- c.gridx = 2
- c.gridy = 0
+ c.fill = Fill.Horizontal
+ c.weightx = 0.5
+ c.gridx = 2
+ c.gridy = 0
layout(button3) = c
val button4 = new Button("Long-Named Button 4")
- c.fill = Fill.Horizontal
- c.ipady = 40 //make this component tall
- c.weightx = 0.0
+ c.fill = Fill.Horizontal
+ c.ipady = 40 //make this component tall
+ c.weightx = 0.0
c.gridwidth = 3
- c.gridx = 0
- c.gridy = 1
+ c.gridx = 0
+ c.gridy = 1
layout(button4) = c
val button5 = new Button("5")
- c.fill = Fill.Horizontal
- c.ipady = 0 //reset to default
- c.weighty = 1.0 //request any extra vertical space
- c.anchor = Anchor.PageEnd
- c.insets = new Insets(10, 0, 0, 0) //top padding
- c.gridx = 1 //aligned with button 2
+ c.fill = Fill.Horizontal
+ c.ipady = 0 //reset to default
+ c.weighty = 1.0 //request any extra vertical space
+ c.anchor = Anchor.PageEnd
+ c.insets = new Insets(10, 0, 0, 0) //top padding
+ c.gridx = 1 //aligned with button 2
c.gridwidth = 2 //2 columns wide
- c.gridy = 2 //third row
+ c.gridy = 2 //third row
layout(button5) = c
}
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
title = "GridBag Demo"
contents = ui
}
diff --git a/examples/src/main/scala/scala/swing/examples/HelloWorld.scala b/examples/src/main/scala/scala/swing/examples/HelloWorld.scala
index b454073a..a5f1d05b 100644
--- a/examples/src/main/scala/scala/swing/examples/HelloWorld.scala
+++ b/examples/src/main/scala/scala/swing/examples/HelloWorld.scala
@@ -14,7 +14,7 @@ import scala.swing._
* A simple swing demo.
*/
object HelloWorld extends SimpleSwingApplication {
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
title = "Hello, World!"
contents = new Button("Click Me!")
}
diff --git a/examples/src/main/scala/scala/swing/examples/LabelTest.scala b/examples/src/main/scala/scala/swing/examples/LabelTest.scala
index f3f66e27..617a96d0 100644
--- a/examples/src/main/scala/scala/swing/examples/LabelTest.scala
+++ b/examples/src/main/scala/scala/swing/examples/LabelTest.scala
@@ -12,13 +12,13 @@ import scala.swing._
import scala.swing.event._
object LabelTest extends SimpleSwingApplication {
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
contents = new Label {
text = "Hello"
listenTo(mouse.clicks)
reactions += {
case MousePressed(_, _, _, _, _) =>
- println("Mouse pressed2")
+ println("Mouse pressed")
}
}
}
diff --git a/examples/src/main/scala/scala/swing/examples/LinePainting.scala b/examples/src/main/scala/scala/swing/examples/LinePainting.scala
index 605fd00e..2b3b31ae 100644
--- a/examples/src/main/scala/scala/swing/examples/LinePainting.scala
+++ b/examples/src/main/scala/scala/swing/examples/LinePainting.scala
@@ -8,10 +8,11 @@
package scala.swing.examples
+import java.awt.{Color, Graphics2D, Point, geom}
+
import scala.swing.Swing._
-import scala.swing.{SimpleSwingApplication, MainFrame, Panel}
import scala.swing.event._
-import java.awt.{Color, Graphics2D, Point, geom}
+import scala.swing.{Frame, MainFrame, Panel, SimpleSwingApplication}
/**
* Dragging the mouse draws a simple graph
@@ -19,9 +20,9 @@ import java.awt.{Color, Graphics2D, Point, geom}
* @author Frank Teubler, Ingo Maier
*/
object LinePainting extends SimpleSwingApplication {
- lazy val ui = new Panel {
+ lazy val ui: Panel = new Panel {
background = Color.white
- preferredSize = (200, 200)
+ preferredSize = (300, 200)
focusable = true
listenTo(mouse.clicks, mouse.moves, keys)
@@ -49,17 +50,18 @@ object LinePainting extends SimpleSwingApplication {
path.moveTo(p.x, p.y); repaint()
}
- override def paintComponent(g: Graphics2D) = {
+ override def paintComponent(g: Graphics2D): Unit = {
super.paintComponent(g)
g.setColor(new Color(100, 100, 100))
- g.drawString("Press left mouse button and drag to paint." +
- (if (hasFocus) " Press 'c' to clear." else ""), 10, size.height - 10)
+ val h = size.height
+ g.drawString("Press left mouse button and drag to paint.", 10, h - 26)
+ if (hasFocus) g.drawString("Press 'c' to clear.", 10, h - 10)
g.setColor(Color.black)
g.draw(path)
}
}
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
title = "Simple Line Painting Demo"
contents = ui
}
diff --git a/examples/src/main/scala/scala/swing/examples/ListViewDemo.scala b/examples/src/main/scala/scala/swing/examples/ListViewDemo.scala
index f6b566d2..349260cc 100644
--- a/examples/src/main/scala/scala/swing/examples/ListViewDemo.scala
+++ b/examples/src/main/scala/scala/swing/examples/ListViewDemo.scala
@@ -11,16 +11,16 @@ package scala.swing.examples
import scala.swing._
object ListViewDemo extends SimpleSwingApplication {
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
case class City(name: String, country: String, population: Int, capital: Boolean)
- val items = List(
- City("Lausanne", "Switzerland", 129273, false),
- City("Paris", "France", 2203817, true),
- City("New York", "USA", 8363710, false),
- City("Berlin", "Germany", 3416300, true),
- City("Tokio", "Japan", 12787981, true)
+ val items: List[City] = List(
+ City(name = "Lausanne" , country = "Switzerland" , population = 129273, capital = false ),
+ City(name = "Paris" , country = "France" , population = 2203817, capital = true ),
+ City(name = "New York" , country = "USA" , population = 8363710, capital = false ),
+ City(name = "Berlin" , country = "Germany" , population = 3416300, capital = true ),
+ City(name = "Tokyo" , country = "Japan" , population = 12787981, capital = true )
)
import ListView._
@@ -28,6 +28,5 @@ object ListViewDemo extends SimpleSwingApplication {
contents = new FlowPanel(new ScrollPane(new ListView(items) {
renderer = Renderer(_.name)
}))
- //new ScrollPane(new Table(items)))
}
}
diff --git a/examples/src/main/scala/scala/swing/examples/PopupDemo.scala b/examples/src/main/scala/scala/swing/examples/PopupDemo.scala
index ccb1b14f..e619fbd6 100644
--- a/examples/src/main/scala/scala/swing/examples/PopupDemo.scala
+++ b/examples/src/main/scala/scala/swing/examples/PopupDemo.scala
@@ -16,8 +16,8 @@ import scala.swing.event._
* @author Ingo Maier
*/
object PopupDemo extends SimpleSwingApplication {
- def top = new MainFrame {
- val popupMenu = new PopupMenu {
+ def top: Frame = new MainFrame {
+ val popupMenu: PopupMenu = new PopupMenu {
contents += new Menu("menu 1") {
contents += new RadioMenuItem("radio 1.1")
contents += new RadioMenuItem("radio 1.2")
@@ -29,7 +29,7 @@ object PopupDemo extends SimpleSwingApplication {
}
val button = new Button("Show Popup Menu")
reactions += {
- case ButtonClicked(b) => popupMenu.show(b, 0, b.bounds.height)
+ case ButtonClicked(b) => popupMenu.show(b, 0, b.bounds.height)
case PopupMenuCanceled(m) => println("Menu " + m + " canceled.")
}
listenTo(popupMenu)
diff --git a/examples/src/main/scala/scala/swing/examples/SimpleApplet.scala b/examples/src/main/scala/scala/swing/examples/SimpleApplet.scala
index 564d8a25..6b585563 100644
--- a/examples/src/main/scala/scala/swing/examples/SimpleApplet.scala
+++ b/examples/src/main/scala/scala/swing/examples/SimpleApplet.scala
@@ -14,7 +14,7 @@ import scala.swing.event._
class SimpleApplet extends Applet {
object ui extends UI with Reactor {
- def init() = {
+ def init(): Unit = {
val button = new Button("Press here!")
val text = new TextArea("Java Version: " + util.Properties.javaVersion + "\n")
listenTo(button)
@@ -23,7 +23,7 @@ class SimpleApplet extends Applet {
case _ =>
}
contents = new BoxPanel(Orientation.Vertical) {
- contents.append(button, text)
+ contents ++= Seq(button, text)
}
}
}
diff --git a/examples/src/main/scala/scala/swing/examples/SwingApp.scala b/examples/src/main/scala/scala/swing/examples/SwingApp.scala
index 6f9892da..b9a32736 100644
--- a/examples/src/main/scala/scala/swing/examples/SwingApp.scala
+++ b/examples/src/main/scala/scala/swing/examples/SwingApp.scala
@@ -12,18 +12,18 @@ import scala.swing._
import scala.swing.event._
object SwingApp extends SimpleSwingApplication {
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
title = "SwingApp"
- var numclicks = 0
+ var numClicks = 0
object label extends Label {
val prefix = "Number of button clicks: "
text = prefix + "0 "
listenTo(button)
reactions += {
- case ButtonClicked(button) =>
- numclicks = numclicks + 1
- text = prefix + numclicks
+ case ButtonClicked(_) =>
+ numClicks = numClicks + 1
+ text = prefix + numClicks
}
}
@@ -32,7 +32,7 @@ object SwingApp extends SimpleSwingApplication {
}
contents = new FlowPanel {
- contents.append(button, label)
+ contents ++= Seq(button, label)
border = Swing.EmptyBorder(5, 5, 5, 5)
}
}
diff --git a/examples/src/main/scala/scala/swing/examples/TableSelection.scala b/examples/src/main/scala/scala/swing/examples/TableSelection.scala
index f1332028..81692e74 100644
--- a/examples/src/main/scala/scala/swing/examples/TableSelection.scala
+++ b/examples/src/main/scala/scala/swing/examples/TableSelection.scala
@@ -9,7 +9,7 @@
package scala.swing.examples
import scala.swing._
-import swing.event._
+import scala.swing.event._
object TableSelection extends SimpleSwingApplication {
val model = Array(List("Mary", "Campione", "Snowboarding", 5, false).toArray,
@@ -18,8 +18,8 @@ object TableSelection extends SimpleSwingApplication {
List("Sharon", "Zakhour", "Speed reading", 5, false).toArray,
List("Philip", "Milne", "Pool", 5, false).toArray)
- lazy val ui = new BoxPanel(Orientation.Vertical) {
- val table = new Table(model, Array("First Name", "Last Name", "Sport", "# of Years", "Vegetarian")) {
+ lazy val ui: BoxPanel = new BoxPanel(Orientation.Vertical) {
+ val table: Table = new Table(model, Array("First Name", "Last Name", "Sport", "# of Years", "Vegetarian")) {
preferredViewportSize = new Dimension(500, 70)
}
//1.6:table.fillsViewportHeight = true
@@ -36,17 +36,17 @@ object TableSelection extends SimpleSwingApplication {
b
}
- val intervalMutex = new ButtonGroup
- val multiInterval = radio(intervalMutex, "Multiple Interval Selection")
+ val intervalMutex = new ButtonGroup
+ val multiInterval = radio(intervalMutex, "Multiple Interval Selection")
val elementInterval = radio(intervalMutex, "Single Selection")
- val singleInterval = radio(intervalMutex, "Single Interval Selection")
+ val singleInterval = radio(intervalMutex, "Single Interval Selection")
intervalMutex.select(multiInterval)
contents += new Label("Selection Options")
- val elemMutex = new ButtonGroup
- val rowSelection = radio(elemMutex, "Row Selection")
+ val elemMutex = new ButtonGroup
+ val rowSelection = radio(elemMutex, "Row Selection")
val columnSelection = radio(elemMutex, "Column Selection")
- val cellSelection = radio(elemMutex, "Cell Selection")
+ val cellSelection = radio(elemMutex, "Cell Selection")
elemMutex.select(rowSelection)
val output = new TextArea(5, 40) {
@@ -96,7 +96,7 @@ object TableSelection extends SimpleSwingApplication {
}
}
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
title = "Table Selection"
contents = ui
}
diff --git a/examples/src/main/scala/scala/swing/examples/UIDemo.scala b/examples/src/main/scala/scala/swing/examples/UIDemo.scala
index eef39a7c..997de0c7 100644
--- a/examples/src/main/scala/scala/swing/examples/UIDemo.scala
+++ b/examples/src/main/scala/scala/swing/examples/UIDemo.scala
@@ -8,13 +8,13 @@
package scala.swing.examples
+import scala.swing.ListView._
+import scala.swing.Swing._
import scala.swing._
import scala.swing.event._
-import scala.swing.Swing._
-import scala.swing.ListView._
object UIDemo extends SimpleSwingApplication {
- def top = new MainFrame {
+ def top: Frame = new MainFrame {
title = "Scala Swing Demo"
/*
@@ -49,11 +49,11 @@ object UIDemo extends SimpleSwingApplication {
var reactLive = false
- val tabs = new TabbedPane {
+ val tabs: TabbedPane = new TabbedPane {
import TabbedPane._
- val buttons = new FlowPanel {
+ val buttons: FlowPanel = new FlowPanel {
border = Swing.EmptyBorder(5, 5, 5, 5)
contents += new BoxPanel(Orientation.Vertical) {
@@ -70,7 +70,7 @@ object UIDemo extends SimpleSwingApplication {
val paintTicks = new CheckBox("Paint Ticks")
val snapTicks = new CheckBox("Snap To Ticks")
val live = new CheckBox("Live")
- contents.append(paintLabels, paintTicks, snapTicks, live)
+ contents ++= Seq(paintLabels, paintTicks, snapTicks, live)
listenTo(paintLabels, paintTicks, snapTicks, live)
reactions += {
case ButtonClicked(`paintLabels`) =>
@@ -87,18 +87,18 @@ object UIDemo extends SimpleSwingApplication {
centerOnScreen()
})
}
- pages += new Page("Buttons", buttons)
- pages += new Page("GridBag", GridBagDemo.ui)
- pages += new Page("Converter", CelsiusConverter2.ui)
- pages += new Page("Tables", TableSelection.ui)
- pages += new Page("Dialogs", Dialogs.ui)
- pages += new Page("Combo Boxes", ComboBoxes.ui)
- pages += new Page("Split Panes",
+ pages += new Page("Buttons" , buttons)
+ pages += new Page("GridBag" , GridBagDemo .ui)
+ pages += new Page("Converter" , CelsiusConverter2 .ui)
+ pages += new Page("Tables" , TableSelection .ui)
+ pages += new Page("Dialogs" , Dialogs .ui)
+ pages += new Page("Combo Boxes" , ComboBoxes .ui)
+ pages += new Page("Split Panes" ,
new SplitPane(Orientation.Vertical, new Button("Hello"), new Button("World")) {
continuousLayout = true
})
- val password = new FlowPanel {
+ val password: FlowPanel = new FlowPanel {
contents += new Label("Enter your secret password here ")
val field = new PasswordField(10)
contents += field
@@ -115,12 +115,12 @@ object UIDemo extends SimpleSwingApplication {
//pages += new Page("Text Editor", TextEditor.ui)
}
- val list = new ListView(tabs.pages) {
+ val list: ListView[TabbedPane.Page] = new ListView(tabs.pages) {
selectIndices(0)
selection.intervalMode = ListView.IntervalMode.Single
renderer = ListView.Renderer(_.title)
}
- val center = new SplitPane(Orientation.Vertical, new ScrollPane(list), tabs) {
+ val center: SplitPane = new SplitPane(Orientation.Vertical, new ScrollPane(list), tabs) {
oneTouchExpandable = true
continuousLayout = true
}
@@ -132,9 +132,9 @@ object UIDemo extends SimpleSwingApplication {
* type inference at times.
*/
object slider extends Slider {
- min = 0
+ min = 0
value = tabs.selection.index
- max = tabs.pages.size - 1
+ max = tabs.pages.size - 1
majorTickSpacing = 1
}
diff --git a/examples/src/main/scala/scala/swing/examples/tutorials/components/ListDemo.scala b/examples/src/main/scala/scala/swing/examples/tutorials/components/ListDemo.scala
index 9f054015..f84fe27e 100644
--- a/examples/src/main/scala/scala/swing/examples/tutorials/components/ListDemo.scala
+++ b/examples/src/main/scala/scala/swing/examples/tutorials/components/ListDemo.scala
@@ -76,7 +76,7 @@ class ListDemo extends BorderPanel {
val nameSelected: String = listModel(initiallySelected)
//Create a panel that uses BoxLayout.
- val buttonPane = new BoxPanel(Orientation.Horizontal) {
+ val buttonPane: BoxPanel = new BoxPanel(Orientation.Horizontal) {
border = Swing.EmptyBorder(5, 5, 5, 5)
contents += fireButton
contents += Swing.HStrut(5)
@@ -157,7 +157,7 @@ class ListDemo extends BorderPanel {
}
object ListDemo extends SimpleSwingApplication {
- lazy val top = new MainFrame() {
+ lazy val top: Frame = new MainFrame() {
title = "ListDemo"
//Create and set up the content pane.
contents = new ListDemo()
diff --git a/examples/src/main/scala/scala/swing/examples/tutorials/components/PasswordDemo.scala b/examples/src/main/scala/scala/swing/examples/tutorials/components/PasswordDemo.scala
index 326b98a1..a278c854 100644
--- a/examples/src/main/scala/scala/swing/examples/tutorials/components/PasswordDemo.scala
+++ b/examples/src/main/scala/scala/swing/examples/tutorials/components/PasswordDemo.scala
@@ -14,10 +14,9 @@ import scala.swing._
class PasswordDemo(val controllingFrame: Frame) extends FlowPanel {
val passwordField = new PasswordField(10)
val label = new Label("Enter the password: ")
-// label.peer.setLabelFor(passwordField.peer)
- val buttonPane = createButtonPanel()
- val textPane = new FlowPanel() {
+ val buttonPane: Component = createButtonPanel()
+ val textPane : Component = new FlowPanel {
contents += label
contents += passwordField
}
@@ -37,7 +36,7 @@ class PasswordDemo(val controllingFrame: Frame) extends FlowPanel {
Dialog.Message.Error, Swing.EmptyIcon)
}
//Zero out the possible password, for security.
- for (i <- 0 until input.length) {
+ for (i <- input.indices) {
input(i) = '0'
}
passwordField.selectAll()
@@ -50,7 +49,7 @@ class PasswordDemo(val controllingFrame: Frame) extends FlowPanel {
+ "source code for the string \"correctPassword\".\n"
+ "Or look at the section How to Use Password Fields in\n"
+ "the components section of The Java Tutorial.",
- "Passord Help", Dialog.Message.Info, Swing.EmptyIcon)
+ "Password Help", Dialog.Message.Info, Swing.EmptyIcon)
})
contents += okButton
@@ -70,15 +69,16 @@ object PasswordDemo extends SimpleSwingApplication {
*/
def isPasswordCorrect(input: Array[Char]): Boolean = {
val correctPassword = Array[Char]('b', 'u', 'g', 'a', 'b', 'o', 'o')
- val isCorrect = input.deep == correctPassword.deep
+ val isCorrect = input.sameElements(correctPassword)
//Zero out the password.
// Arrays.fill(correctPassword,'0');
- for (i <- 0 until correctPassword.length)
- correctPassword.update(i, '0')
+ for (i <- correctPassword.indices) {
+ correctPassword(i) = '0'
+ }
isCorrect
}
- lazy val top = new MainFrame() {
+ lazy val top: Frame = new MainFrame() {
title = "PasswordDemo"
//Create and set up the content pane.
contents = new PasswordDemo(this)
diff --git a/examples/src/main/scala/scala/swing/examples/tutorials/layout/DiagonalLayout.scala b/examples/src/main/scala/scala/swing/examples/tutorials/layout/DiagonalLayout.scala
index ae3dbaf9..9ad10cad 100644
--- a/examples/src/main/scala/scala/swing/examples/tutorials/layout/DiagonalLayout.scala
+++ b/examples/src/main/scala/scala/swing/examples/tutorials/layout/DiagonalLayout.scala
@@ -35,8 +35,6 @@ package scala.swing.examples.tutorials.layout
*/
import java.awt._
-//remove if not needed
-import scala.collection.JavaConversions._
class DiagonalLayout(private var vgap: Int) extends LayoutManager {
@@ -55,11 +53,9 @@ class DiagonalLayout(private var vgap: Int) extends LayoutManager {
}
/* Required by LayoutManager. */
- def addLayoutComponent(name: String, comp: Component): Unit = {
- }
+ def addLayoutComponent(name: String, comp: Component): Unit = ()
- def removeLayoutComponent(comp: Component): Unit = {
- }
+ def removeLayoutComponent(comp: Component): Unit = ()
private def setSizes(parent: Container): Unit = {
val nComps = parent.getComponentCount
@@ -89,11 +85,10 @@ class DiagonalLayout(private var vgap: Int) extends LayoutManager {
/* Required by LayoutManager. */
def preferredLayoutSize(parent: Container): Dimension = {
val dim = new Dimension(0, 0)
- val nComps = parent.getComponentCount
setSizes(parent)
- val insets = parent.getInsets
- dim.width = preferredWidth + insets.left + insets.right
- dim.height = preferredHeight + insets.top + insets.bottom
+ val insets = parent.getInsets
+ dim.width = preferredWidth + insets.left + insets.right
+ dim.height = preferredHeight + insets.top + insets.bottom
sizeUnknown = false
dim
}
@@ -101,10 +96,9 @@ class DiagonalLayout(private var vgap: Int) extends LayoutManager {
/* Required by LayoutManager. */
def minimumLayoutSize(parent: Container): Dimension = {
val dim = new Dimension(0, 0)
- val nComps = parent.getComponentCount
- val insets = parent.getInsets
- dim.width = minWidth + insets.left + insets.right
- dim.height = minHeight + insets.top + insets.bottom
+ val insets = parent.getInsets
+ dim.width = minWidth + insets.left + insets.right
+ dim.height = minHeight + insets.top + insets.bottom
sizeUnknown = false
dim
}
@@ -118,19 +112,17 @@ class DiagonalLayout(private var vgap: Int) extends LayoutManager {
* of applets, at least, they probably won't be.
*/
def layoutContainer(parent: Container): Unit = {
- val insets = parent.getInsets
- val maxWidth = parent.getWidth - (insets.left + insets.right)
- val maxHeight = parent.getHeight - (insets.top + insets.bottom)
- val nComps = parent.getComponentCount
- var previousWidth = 0
- var previousHeight = 0
- var x = 0
- var y = insets.top
- val rowh = 0
- val start = 0
- var xFudge = 0
- var yFudge = 0
- var oneColumn = false
+ val insets = parent.getInsets
+ val maxWidth = parent.getWidth - (insets.left + insets.right)
+ val maxHeight = parent.getHeight - (insets.top + insets.bottom)
+ val nComps = parent.getComponentCount
+ var previousWidth = 0
+ var previousHeight = 0
+ var x = 0
+ var y = insets.top
+ var xFudge = 0
+ var yFudge = 0
+ var oneColumn = false
// Go through the components' sizes, if neither
// preferredLayoutSize nor minimumLayoutSize has
// been called.
@@ -174,7 +166,7 @@ class DiagonalLayout(private var vgap: Int) extends LayoutManager {
}
}
- override def toString(): String = {
+ override def toString: String = {
val str = ""
getClass.getName + "[vgap=" + vgap + str + "]"
}
diff --git a/src/main/scala-2.11 b/src/main/scala-2.11
new file mode 120000
index 00000000..7fde8739
--- /dev/null
+++ b/src/main/scala-2.11
@@ -0,0 +1 @@
+scala-2.12
\ No newline at end of file
diff --git a/src/main/scala/scala/swing/BufferWrapper.scala b/src/main/scala-2.12/scala/swing/BufferWrapper.scala
similarity index 55%
rename from src/main/scala/scala/swing/BufferWrapper.scala
rename to src/main/scala-2.12/scala/swing/BufferWrapper.scala
index 6c2760ef..44d9dc0e 100644
--- a/src/main/scala/scala/swing/BufferWrapper.scala
+++ b/src/main/scala-2.12/scala/swing/BufferWrapper.scala
@@ -13,25 +13,35 @@ import scala.collection.{Iterator, mutable}
/**
* Default partial implementation for buffer adapters.
*/
-protected[swing] abstract class BufferWrapper[A] extends mutable.Buffer[A] { outer =>
- def clear(): Unit = for (_ <- 0 until length) remove(0)
+abstract class BufferWrapper[A] extends mutable.Buffer[A] {
+ // abstract
- def update(n: Int, a: A): Unit = {
+ def addOne(elem: A): this.type
+
+ def insert(idx: Int, elem: A): Unit
+
+ // impl
+
+ type MoreElem[+B] = Traversable[B]
+
+ final override def +=(elem: A): this.type = addOne(elem)
+
+ override def clear(): Unit = for (_ <- 0 until length) remove(0)
+
+ override def update(n: Int, a: A): Unit = {
remove(n)
- insertAt(n, a)
+ insert(n, a)
}
- def insertAll(n: Int, elems: Traversable[A]): Unit = {
+ override def insertAll(n: Int, elems: MoreElem[A]): Unit = {
var i = n
for (el <- elems) {
- insertAt(i, el)
+ insert(i, el)
i += 1
}
}
- protected def insertAt(n: Int, a: A): Unit
-
- def +=:(a: A): this.type = { insertAt(0, a); this }
+ override def +=:(a: A): this.type = { insert(0, a); this }
- def iterator: Iterator[A] = Iterator.range(0,length).map(apply)
+ override def iterator: Iterator[A] = Iterator.range(0,length).map(apply)
}
diff --git a/src/main/scala-2.12/scala/swing/MapWrapper.scala b/src/main/scala-2.12/scala/swing/MapWrapper.scala
new file mode 100644
index 00000000..c189b3a4
--- /dev/null
+++ b/src/main/scala-2.12/scala/swing/MapWrapper.scala
@@ -0,0 +1,64 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+package scala.swing
+
+import scala.annotation.tailrec
+import scala.collection.mutable
+
+/**
+ * Default partial implementation for mutable map adapters.
+ */
+abstract class MapWrapper[K, V] extends mutable.Map[K, V] {
+ // abstract
+
+ def addOne (elem: (K, V)): this.type
+ def subtractOne (key: K) : this.type
+
+ // impl
+
+ final def +=(elem: (K, V)): this.type = addOne (elem)
+ final def -=(key: K) : this.type = subtractOne(key)
+
+ /** The collection passed to `addAll` and `subtractAll` */
+ type MoreElem[+B] = TraversableOnce[B]
+
+ /** Cross-version way for creating an iterator from `MoreElem`. */
+ final protected def mkIterator[B](xs: MoreElem[B]): Iterator[B] = xs.toIterator
+
+ final override def ++=(xs: MoreElem[(K, V)]): this.type = addAll (xs)
+ final override def --=(xs: MoreElem[ K ]): this.type = subtractAll(xs)
+
+ def addAll(xs: MoreElem[(K, V)]): this.type = {
+ @tailrec def loop(xsl: scala.collection.LinearSeq[(K, V)]): Unit =
+ if (xsl.nonEmpty) {
+ addOne(xsl.head)
+ loop(xsl.tail)
+ }
+
+ xs match {
+ case xsl: scala.collection.LinearSeq[(K, V)] => loop(xsl)
+ case _ => xs.foreach(addOne)
+ }
+ this
+ }
+
+ def subtractAll(xs: MoreElem[K]): this.type = {
+ @tailrec def loop(xsl: collection.LinearSeq[K]): Unit =
+ if (xsl.nonEmpty) {
+ subtractOne(xsl.head)
+ loop(xsl.tail)
+ }
+
+ xs match {
+ case xsl: scala.collection.LinearSeq[K] => loop(xsl)
+ case _ => xs.foreach(subtractOne)
+ }
+ this
+ }
+}
\ No newline at end of file
diff --git a/src/main/scala-2.12/scala/swing/SetWrapper.scala b/src/main/scala-2.12/scala/swing/SetWrapper.scala
new file mode 100644
index 00000000..261c507e
--- /dev/null
+++ b/src/main/scala-2.12/scala/swing/SetWrapper.scala
@@ -0,0 +1,64 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+package scala.swing
+
+import scala.annotation.tailrec
+import scala.collection.mutable
+
+/**
+ * Default partial implementation for mutable set adapters.
+ */
+abstract class SetWrapper[A] extends mutable.Set[A] {
+ // abstract
+
+ def addOne (elem: A): this.type
+ def subtractOne (elem: A): this.type
+
+ // impl
+
+ final def +=(elem: A): this.type = addOne (elem)
+ final def -=(elem: A): this.type = subtractOne(elem)
+
+ /** The collection passed to `addAll` and `subtractAll` */
+ type MoreElem[+B] = TraversableOnce[B]
+
+ /** Cross-version way for creating an iterator from `MoreElem`. */
+ final protected def mkIterator[B](xs: MoreElem[B]): Iterator[B] = xs.toIterator
+
+ final override def ++=(xs: MoreElem[A]): this.type = addAll (xs)
+ final override def --=(xs: MoreElem[A]): this.type = subtractAll(xs)
+
+ def addAll(xs: MoreElem[A]): this.type = {
+ @tailrec def loop(xsl: scala.collection.LinearSeq[A]): Unit =
+ if (xsl.nonEmpty) {
+ addOne(xsl.head)
+ loop(xsl.tail)
+ }
+
+ xs match {
+ case xsl: scala.collection.LinearSeq[A] => loop(xsl)
+ case _ => xs.foreach(addOne)
+ }
+ this
+ }
+
+ def subtractAll(xs: MoreElem[A]): this.type = {
+ @tailrec def loop(xsl: collection.LinearSeq[A]): Unit =
+ if (xsl.nonEmpty) {
+ subtractOne(xsl.head)
+ loop(xsl.tail)
+ }
+
+ xs match {
+ case xsl: scala.collection.LinearSeq[A] => loop(xsl)
+ case _ => xs.foreach(subtractOne)
+ }
+ this
+ }
+}
\ No newline at end of file
diff --git a/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala b/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala
new file mode 100644
index 00000000..b695072c
--- /dev/null
+++ b/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala
@@ -0,0 +1,56 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+package scala.swing
+
+import scala.collection.{Iterator, mutable}
+
+/**
+ * Default partial implementation for buffer adapters.
+ */
+abstract class BufferWrapper[A] extends mutable.Buffer[A] {
+ type MoreElem[+B] = IterableOnce[B]
+
+ override def clear(): Unit = for (_ <- 0 until length) remove(0)
+
+ override def update(n: Int, a: A): Unit = {
+ remove(n)
+ insert(n, a)
+ }
+
+ override def iterator: Iterator[A] = Iterator.range(0, length).map(apply)
+
+ override def prepend(elem: A): this.type = { insert(0, elem); this }
+
+ override def insertAll(idx: Int, elems: MoreElem[A]): Unit = {
+ var i = idx
+ for (el <- elems.iterator) {
+ insert(i, el)
+ i += 1
+ }
+ }
+
+ override def remove(idx: Int, count: Int): Unit = {
+ require(count >= 0)
+ var n = 0
+ while (n < count) {
+ remove(idx + n)
+ n += 1
+ }
+ }
+
+ override def patchInPlace(from: Int, patch: scala.collection.Seq[A], replaced: Int): this.type = {
+ if (replaced > 0) {
+ remove(from, replaced)
+ }
+ if (patch.nonEmpty) {
+ insertAll(from, patch)
+ }
+ this
+ }
+}
diff --git a/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala b/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala
new file mode 100644
index 00000000..c7f93088
--- /dev/null
+++ b/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala
@@ -0,0 +1,22 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+package scala.swing
+
+import scala.collection.mutable
+
+/**
+ * Default partial implementation for mutable map adapters.
+ */
+abstract class MapWrapper[K, V] extends mutable.Map[K, V] {
+ /** The collection passed to `addAll` and `subtractAll` */
+ type MoreElem[+B] = IterableOnce[B]
+
+ /** Cross-version way for creating an iterator from `MoreElem`. */
+ final protected def mkIterator[B](xs: MoreElem[B]): Iterator[B] = xs.iterator
+}
\ No newline at end of file
diff --git a/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala b/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala
new file mode 100644
index 00000000..b877cd0e
--- /dev/null
+++ b/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala
@@ -0,0 +1,24 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+package scala.swing
+
+import scala.collection.mutable
+
+/**
+ * Default partial implementation for mutable set adapters.
+ */
+abstract class SetWrapper[A] extends mutable.Set[A] {
+ /** The collection passed to `addAll` and `subtractAll` */
+ type MoreElem[+B] = IterableOnce[B]
+
+ /** Cross-version way for creating an iterator from `MoreElem`. */
+ final protected def mkIterator[B](xs: MoreElem[B]): Iterator[B] = xs.iterator
+
+ override def clear(): Unit = iterator.toList.foreach(remove)
+}
\ No newline at end of file
diff --git a/src/main/scala/scala/swing/AbstractButton.scala b/src/main/scala/scala/swing/AbstractButton.scala
index 00126886..3bfe6f04 100644
--- a/src/main/scala/scala/swing/AbstractButton.scala
+++ b/src/main/scala/scala/swing/AbstractButton.scala
@@ -6,12 +6,11 @@
** |/ **
\* */
-
-
package scala.swing
-import event._
-import javax.swing.{AbstractButton => JAbstractButton, Icon}
+import javax.swing.{Icon, AbstractButton => JAbstractButton}
+
+import scala.swing.event.{ButtonClicked, Key}
/**
* Base class of all button-like widgets, such as push buttons,
diff --git a/src/main/scala/scala/swing/Action.scala b/src/main/scala/scala/swing/Action.scala
index 580687d5..14074aed 100644
--- a/src/main/scala/scala/swing/Action.scala
+++ b/src/main/scala/scala/swing/Action.scala
@@ -6,13 +6,12 @@
** |/ **
\* */
-
-
package scala.swing
-import javax.swing.{KeyStroke, Icon}
import java.awt.event.ActionListener
+import javax.swing.{Icon, KeyStroke}
+
object Action {
/**
* Special action that has an empty title and all default properties and does nothing.
@@ -29,7 +28,7 @@ object Action {
def addActionListener(a: ActionListener): Unit
def removeActionListener(a: ActionListener): Unit
def setAction(a: javax.swing.Action): Unit
- def getAction(): javax.swing.Action
+ def getAction(): javax.swing.Action // note: must keep empty parentheses for Java compatibility
}
// TODO: we need an action cache
diff --git a/src/main/scala/scala/swing/Adjustable.scala b/src/main/scala/scala/swing/Adjustable.scala
index 7cc9cfcd..9e82268f 100644
--- a/src/main/scala/scala/swing/Adjustable.scala
+++ b/src/main/scala/scala/swing/Adjustable.scala
@@ -1,3 +1,11 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
package scala.swing
import java.awt.{Adjustable => JAdjustable}
diff --git a/src/main/scala/scala/swing/Alignment.scala b/src/main/scala/scala/swing/Alignment.scala
index bdbbca99..1050c7c3 100644
--- a/src/main/scala/scala/swing/Alignment.scala
+++ b/src/main/scala/scala/swing/Alignment.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
/**
diff --git a/src/main/scala/scala/swing/Applet.scala b/src/main/scala/scala/swing/Applet.scala
index b5e0f6a6..decd0dee 100644
--- a/src/main/scala/scala/swing/Applet.scala
+++ b/src/main/scala/scala/swing/Applet.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
import javax.swing.JApplet
diff --git a/src/main/scala/scala/swing/BorderPanel.scala b/src/main/scala/scala/swing/BorderPanel.scala
index ab73b67b..584ce634 100644
--- a/src/main/scala/scala/swing/BorderPanel.scala
+++ b/src/main/scala/scala/swing/BorderPanel.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
import java.awt.BorderLayout
diff --git a/src/main/scala/scala/swing/BoxPanel.scala b/src/main/scala/scala/swing/BoxPanel.scala
index f5859a8b..a97da84c 100644
--- a/src/main/scala/scala/swing/BoxPanel.scala
+++ b/src/main/scala/scala/swing/BoxPanel.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
/**
@@ -17,7 +15,7 @@ package scala.swing
* @see javax.swing.BoxLayout
*/
class BoxPanel(orientation: Orientation.Value) extends Panel with SequentialContainer.Wrapper {
- override lazy val peer = {
+ override lazy val peer: javax.swing.JPanel = {
val p = new javax.swing.JPanel with SuperMixin
val l = new javax.swing.BoxLayout(p, orientation.id)
p.setLayout(l)
diff --git a/src/main/scala/scala/swing/Button.scala b/src/main/scala/scala/swing/Button.scala
index 492dfd29..c0c3885b 100644
--- a/src/main/scala/scala/swing/Button.scala
+++ b/src/main/scala/scala/swing/Button.scala
@@ -8,10 +8,10 @@
package scala.swing
-import javax.swing._
+import javax.swing.JButton
object Button {
- def apply(text0: String)(op: => Unit) = new Button(Action(text0)(op))
+ def apply(text0: String)(op: => Unit): Button = new Button(Action(text0)(op))
}
/**
diff --git a/src/main/scala/scala/swing/ButtonGroup.scala b/src/main/scala/scala/swing/ButtonGroup.scala
index 82658561..86bbc8db 100644
--- a/src/main/scala/scala/swing/ButtonGroup.scala
+++ b/src/main/scala/scala/swing/ButtonGroup.scala
@@ -19,14 +19,17 @@ import scala.collection.mutable
class ButtonGroup(initialButtons: AbstractButton*) {
val peer: javax.swing.ButtonGroup = new javax.swing.ButtonGroup
- val buttons: mutable.Set[AbstractButton] = new mutable.Set[AbstractButton] {
- def -=(b: AbstractButton): this.type = { peer.remove(b.peer); this }
- def +=(b: AbstractButton): this.type = { peer.add(b.peer); this }
+ val buttons: mutable.Set[AbstractButton] = new SetWrapper[AbstractButton] {
+ override def subtractOne(b: AbstractButton): this.type = { peer.remove(b.peer); this }
+ override def addOne (b: AbstractButton): this.type = { peer.add (b.peer); this }
+
def contains(b: AbstractButton): Boolean = this.iterator.contains(b)
+
override def size: Int = peer.getButtonCount
+
def iterator: Iterator[AbstractButton] = new Iterator[AbstractButton] {
- val enum = peer.getElements
- def next: AbstractButton = UIElement.cachedWrapper[AbstractButton](enum.nextElement)
+ private val enum = peer.getElements
+ def next(): AbstractButton = UIElement.cachedWrapper[AbstractButton](enum.nextElement())
def hasNext: Boolean = enum.hasMoreElements
}
}
diff --git a/src/main/scala/scala/swing/CheckBox.scala b/src/main/scala/scala/swing/CheckBox.scala
index 2e884aee..3be4b068 100644
--- a/src/main/scala/scala/swing/CheckBox.scala
+++ b/src/main/scala/scala/swing/CheckBox.scala
@@ -6,11 +6,9 @@
** |/ **
\* */
-
-
package scala.swing
-import javax.swing._
+import javax.swing.JCheckBox
/**
* Two state button that can either be checked or unchecked.
diff --git a/src/main/scala/scala/swing/ColorChooser.scala b/src/main/scala/scala/swing/ColorChooser.scala
index f4fc3aae..56a890a9 100644
--- a/src/main/scala/scala/swing/ColorChooser.scala
+++ b/src/main/scala/scala/swing/ColorChooser.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
import javax.swing.JColorChooser
diff --git a/src/main/scala/scala/swing/ComboBox.scala b/src/main/scala/scala/swing/ComboBox.scala
index b1e4b6e3..9a88ec4e 100644
--- a/src/main/scala/scala/swing/ComboBox.scala
+++ b/src/main/scala/scala/swing/ComboBox.scala
@@ -9,9 +9,10 @@
package scala.swing
import java.awt.event.ActionListener
+
import javax.swing.{AbstractListModel, ComboBoxModel, InputVerifier, JComboBox, JComponent, JTextField, ListCellRenderer}
-import scala.swing.event._
+import scala.swing.event.ActionEvent
object ComboBox {
/**
@@ -44,7 +45,7 @@ object ComboBox {
def getEditorComponent: JComponent = Editor.this.component.peer
- def getItem(): AnyRef = item.asInstanceOf[AnyRef]
+ def getItem: AnyRef = item.asInstanceOf[AnyRef]
def selectAll(): Unit = startEditing()
@@ -84,7 +85,7 @@ object ComboBox {
def getEditorComponent: JComponent = editor.getEditorComponent.asInstanceOf[JComponent]
def selectAll(): Unit = editor.selectAll()
- def getItem(): AnyRef = { verifier.verify(getEditorComponent); value.asInstanceOf[AnyRef] }
+ def getItem: AnyRef = { verifier.verify(getEditorComponent); value.asInstanceOf[AnyRef] }
def setItem(a: Any): Unit = editor.setItem(a)
val verifier: InputVerifier = new InputVerifier {
@@ -115,12 +116,12 @@ object ComboBox {
def startEditing(): Unit = comboBoxPeer.selectAll()
}
- implicit def stringEditor(c: ComboBox[String]): Editor[String] = new BuiltInEditor(c)(s => s, s => s)
- implicit def intEditor(c: ComboBox[Int]): Editor[Int] = new BuiltInEditor(c)(s => s.toInt, s => s.toString)
- implicit def floatEditor(c: ComboBox[Float]): Editor[Float] = new BuiltInEditor(c)(s => s.toFloat, s => s.toString)
- implicit def doubleEditor(c: ComboBox[Double]): Editor[Double] = new BuiltInEditor(c)(s => s.toDouble, s => s.toString)
+ implicit def stringEditor (c: ComboBox[String ]): Editor[String ] = new BuiltInEditor(c)(s => s , s => s)
+ implicit def intEditor (c: ComboBox[Int ]): Editor[Int ] = new BuiltInEditor(c)(s => s.toInt , s => s.toString)
+ implicit def floatEditor (c: ComboBox[Float ]): Editor[Float ] = new BuiltInEditor(c)(s => s.toFloat , s => s.toString)
+ implicit def doubleEditor (c: ComboBox[Double ]): Editor[Double ] = new BuiltInEditor(c)(s => s.toDouble, s => s.toString)
- def newConstantModel[A](items: Seq[A]): ComboBoxModel[A] = {
+ def newConstantModel[A](items: scala.collection.Seq[A]): ComboBoxModel[A] = {
new AbstractListModel[A] with ComboBoxModel[A] {
private var selected: A = if (items.isEmpty) null.asInstanceOf[A] else items(0)
def getSelectedItem: AnyRef = selected.asInstanceOf[AnyRef]
@@ -136,7 +137,7 @@ object ComboBox {
}
}
- /*def newMutableModel[A, Self](items: Seq[A] with scala.collection.mutable.Publisher[scala.collection.mutable.Message[A], Self]): ComboBoxModel = {
+ /*def newMutableModel[A, Self](items: scala.collection.Seq[A] with scala.collection.mutable.Publisher[scala.collection.mutable.Message[A], Self]): ComboBoxModel = {
new AbstractListModel with ComboBoxModel {
private var selected = items(0)
def getSelectedItem: AnyRef = selected.asInstanceOf[AnyRef]
@@ -146,8 +147,8 @@ object ComboBox {
}
}
- def newConstantModel[A](items: Seq[A]): ComboBoxModel = items match {
- case items: Seq[A] with scala.collection.mutable.Publisher[scala.collection.mutable.Message[A], Self] => newMutableModel
+ def newConstantModel[A](items: scala.collection.Seq[A]): ComboBoxModel = items match {
+ case items: scala.collection.Seq[A] with scala.collection.mutable.Publisher[scala.collection.mutable.Message[A], Self] => newMutableModel
case _ => newConstantModel(items)
}*/
}
@@ -158,7 +159,7 @@ object ComboBox {
*
* @see javax.swing.JComboBox
*/
-class ComboBox[A](items: Seq[A]) extends Component with Publisher {
+class ComboBox[A](items: scala.collection.Seq[A]) extends Component with Publisher {
override lazy val peer: JComboBox[A] = new JComboBox(ComboBox.newConstantModel(items)) with SuperMixin
object selection extends Publisher {
@@ -187,7 +188,7 @@ class ComboBox[A](items: Seq[A]) extends Component with Publisher {
def renderer: ListView.Renderer[A] = ListView.Renderer.wrap(peer.getRenderer.asInstanceOf[ListCellRenderer[A]])
def renderer_=(r: ListView.Renderer[A]): Unit = peer.setRenderer(r.peer)
- /* XXX: currently not safe to expose:
+ /* TODO: currently not safe to expose:
def editor: ComboBox.Editor[A] =
def editor_=(r: ComboBox.Editor[A]) { peer.setEditor(r.comboBoxPeer) }
*/
diff --git a/src/main/scala/scala/swing/Component.scala b/src/main/scala/scala/swing/Component.scala
index 680ccaf9..6506e7ac 100644
--- a/src/main/scala/scala/swing/Component.scala
+++ b/src/main/scala/scala/swing/Component.scala
@@ -8,8 +8,6 @@
package scala.swing
-import event._
-
import java.awt.Graphics
import java.awt.event._
import javax.swing.JComponent
@@ -42,7 +40,6 @@ object Component {
*/
abstract class Component extends UIElement {
override lazy val peer: javax.swing.JComponent = new javax.swing.JComponent with SuperMixin {}
- var initP: JComponent = null
/**
* This trait is used to redirect certain calls from the peer to the wrapper
@@ -127,13 +124,13 @@ abstract class Component extends UIElement {
def mouseEntered(e: java.awt.event.MouseEvent): Unit = ()
def mouseExited(e: java.awt.event.MouseEvent): Unit = ()
def mouseClicked(e: java.awt.event.MouseEvent): Unit =
- publish(new MouseClicked(e))
+ publish(new event.MouseClicked(e))
def mousePressed(e: java.awt.event.MouseEvent): Unit =
- publish(new MousePressed(e))
+ publish(new event.MousePressed(e))
def mouseReleased(e: java.awt.event.MouseEvent): Unit =
- publish(new MouseReleased(e))
+ publish(new event.MouseReleased(e))
}
def onFirstSubscribe (): Unit = peer.addMouseListener(l)
@@ -145,10 +142,10 @@ abstract class Component extends UIElement {
val moves: Publisher = new LazyPublisher {
lazy val mouseListener: MouseListener = new MouseListener {
def mouseEntered(e: java.awt.event.MouseEvent): Unit =
- publish(new MouseEntered(e))
+ publish(new event.MouseEntered(e))
def mouseExited(e: java.awt.event.MouseEvent): Unit =
- publish(new MouseExited(e))
+ publish(new event.MouseExited(e))
def mouseClicked (e: java.awt.event.MouseEvent): Unit = ()
def mousePressed (e: java.awt.event.MouseEvent): Unit = ()
@@ -157,10 +154,10 @@ abstract class Component extends UIElement {
lazy val mouseMotionListener: MouseMotionListener = new MouseMotionListener {
def mouseMoved(e: java.awt.event.MouseEvent): Unit =
- publish(new MouseMoved(e))
+ publish(new event.MouseMoved(e))
def mouseDragged(e: java.awt.event.MouseEvent): Unit =
- publish(new MouseDragged(e))
+ publish(new event.MouseDragged(e))
}
def onFirstSubscribe(): Unit = {
peer.addMouseListener(mouseListener)
@@ -179,7 +176,7 @@ abstract class Component extends UIElement {
// mouse wheel events if there is a listener installed. See ticket #1442.
lazy val l: MouseWheelListener = new MouseWheelListener {
def mouseWheelMoved(e: java.awt.event.MouseWheelEvent): Unit =
- publish(new MouseWheelMoved(e))
+ publish(new event.MouseWheelMoved(e))
}
def onFirstSubscribe (): Unit = peer.addMouseWheelListener(l)
def onLastUnsubscribe(): Unit = peer.removeMouseWheelListener(l)
@@ -188,9 +185,9 @@ abstract class Component extends UIElement {
object keys extends Publisher {
peer.addKeyListener(new KeyListener {
- def keyPressed (e: java.awt.event.KeyEvent): Unit = publish(new KeyPressed(e))
- def keyReleased (e: java.awt.event.KeyEvent): Unit = publish(new KeyReleased(e))
- def keyTyped (e: java.awt.event.KeyEvent): Unit = publish(new KeyTyped(e))
+ def keyPressed (e: java.awt.event.KeyEvent): Unit = publish(new event.KeyPressed (e))
+ def keyReleased (e: java.awt.event.KeyEvent): Unit = publish(new event.KeyReleased(e))
+ def keyTyped (e: java.awt.event.KeyEvent): Unit = publish(new event.KeyTyped (e))
})
}
@@ -205,16 +202,16 @@ abstract class Component extends UIElement {
// TODO: deprecated, remove after 2.8
peer.addComponentListener(new java.awt.event.ComponentListener {
def componentHidden(e: java.awt.event.ComponentEvent): Unit =
- publish(UIElementHidden(Component.this))
+ publish(event.UIElementHidden(Component.this))
def componentShown(e: java.awt.event.ComponentEvent): Unit =
- publish(UIElementShown(Component.this))
+ publish(event.UIElementShown(Component.this))
def componentMoved(e: java.awt.event.ComponentEvent): Unit =
- publish(UIElementMoved(Component.this))
+ publish(event.UIElementMoved(Component.this))
def componentResized(e: java.awt.event.ComponentEvent): Unit =
- publish(UIElementResized(Component.this))
+ publish(event.UIElementResized(Component.this))
})
peer.addFocusListener(new java.awt.event.FocusListener {
@@ -224,18 +221,18 @@ abstract class Component extends UIElement {
}
def focusGained(e: java.awt.event.FocusEvent): Unit =
- publish(FocusGained(Component.this, other(e), e.isTemporary))
+ publish(event.FocusGained(Component.this, other(e), e.isTemporary))
def focusLost(e: java.awt.event.FocusEvent): Unit =
- publish(FocusLost(Component.this, other(e), e.isTemporary))
+ publish(event.FocusLost(Component.this, other(e), e.isTemporary))
})
peer.addPropertyChangeListener(new java.beans.PropertyChangeListener {
def propertyChange(e: java.beans.PropertyChangeEvent): Unit =
e.getPropertyName match {
- case "font" => publish(FontChanged (Component.this))
- case "background" => publish(BackgroundChanged(Component.this))
- case "foreground" => publish(ForegroundChanged(Component.this))
+ case "font" => publish(event.FontChanged (Component.this))
+ case "background" => publish(event.BackgroundChanged(Component.this))
+ case "foreground" => publish(event.ForegroundChanged(Component.this))
case _ =>
/*case "focusable" =>
case "focusTraversalKeysEnabled" =>
diff --git a/src/main/scala/scala/swing/Container.scala b/src/main/scala/scala/swing/Container.scala
index 9ae0bd6a..bc84c51e 100644
--- a/src/main/scala/scala/swing/Container.scala
+++ b/src/main/scala/scala/swing/Container.scala
@@ -6,11 +6,9 @@
** |/ **
\* */
-
-
package scala.swing
-import scala.swing.event._
+import scala.swing.event.{ComponentAdded, ComponentRemoved}
object Container {
/**
@@ -21,18 +19,23 @@ object Container {
override def peer: javax.swing.JComponent
protected val _contents = new Content
- def contents: Seq[Component] = _contents
+ def contents: scala.collection.Seq[Component] = _contents
protected class Content extends BufferWrapper[Component] {
override def clear(): Unit = peer.removeAll()
+
override def remove(n: Int): Component = {
val c = peer.getComponent(n)
peer.remove(n)
UIElement.cachedWrapper[Component](c)
}
- protected def insertAt(n: Int, c: Component): Unit = peer.add(c.peer, n)
- def +=(c: Component): this.type = { peer.add(c.peer) ; this }
+
+ override def insert(n: Int, c: Component): Unit = peer.add(c.peer, n)
+
+ override def addOne(c: Component): this.type = { peer.add(c.peer) ; this }
+
def length: Int = peer.getComponentCount
+
def apply(n: Int): Component = UIElement.cachedWrapper[Component](peer.getComponent(n))
}
@@ -58,5 +61,5 @@ trait Container extends UIElement {
/**
* The child components of this container.
*/
- def contents: Seq[Component]
+ def contents: scala.collection.Seq[Component]
}
diff --git a/src/main/scala/scala/swing/EditorPane.scala b/src/main/scala/scala/swing/EditorPane.scala
index 3ab0305e..f4efbdfb 100644
--- a/src/main/scala/scala/swing/EditorPane.scala
+++ b/src/main/scala/scala/swing/EditorPane.scala
@@ -8,11 +8,11 @@
package scala.swing
-import javax.swing._
-import javax.swing.text._
+import javax.swing.JEditorPane
+import javax.swing.text.EditorKit
/**
- * A text component that allows multiline text input and display.
+ * A text component that allows multi-line text input and display.
*
* @see javax.swing.JEditorPane
*/
diff --git a/src/main/scala/scala/swing/FileChooser.scala b/src/main/scala/scala/swing/FileChooser.scala
index 44633e32..d84519fe 100644
--- a/src/main/scala/scala/swing/FileChooser.scala
+++ b/src/main/scala/scala/swing/FileChooser.scala
@@ -9,8 +9,9 @@
package scala.swing
import java.io.File
-import javax.swing._
-import javax.swing.filechooser._
+
+import javax.swing.filechooser.FileFilter
+import javax.swing.{Icon, JFileChooser}
object FileChooser {
/**
@@ -89,8 +90,8 @@ class FileChooser(dir: File) {
def selectedFile: File = peer.getSelectedFile
def selectedFile_=(file: File): Unit = peer.setSelectedFile(file)
- def selectedFiles: Seq[File] = peer.getSelectedFiles
- def selectedFiles_=(files: File*): Unit = peer.setSelectedFiles(files.toArray)
+ def selectedFiles: scala.collection.Seq[File] = peer.getSelectedFiles.toSeq
+ def selectedFiles_=(files: scala.collection.Seq[File]): Unit = peer.setSelectedFiles(files.toArray)
def multiSelectionEnabled: Boolean = peer.isMultiSelectionEnabled
def multiSelectionEnabled_=(b: Boolean): Unit = peer.setMultiSelectionEnabled(b)
diff --git a/src/main/scala/scala/swing/FlowPanel.scala b/src/main/scala/scala/swing/FlowPanel.scala
index 45696cd1..1bbd7fcc 100644
--- a/src/main/scala/scala/swing/FlowPanel.scala
+++ b/src/main/scala/scala/swing/FlowPanel.scala
@@ -6,11 +6,10 @@
** |/ **
\* */
-
-
package scala.swing
import java.awt.FlowLayout
+
import javax.swing.JPanel
object FlowPanel {
@@ -38,7 +37,7 @@ class FlowPanel(alignment: FlowPanel.Alignment.Value)(contents0: Component*) ext
contents ++= contents0
- private def layoutManager = peer.getLayout.asInstanceOf[java.awt.FlowLayout]
+ private def layoutManager: FlowLayout = peer.getLayout.asInstanceOf[FlowLayout]
def vGap: Int = layoutManager.getVgap
def vGap_=(n: Int): Unit = layoutManager.setVgap(n)
diff --git a/src/main/scala/scala/swing/FormattedTextField.scala b/src/main/scala/scala/swing/FormattedTextField.scala
index 301b9dc7..c624416a 100644
--- a/src/main/scala/scala/swing/FormattedTextField.scala
+++ b/src/main/scala/scala/swing/FormattedTextField.scala
@@ -8,7 +8,7 @@
package scala.swing
-import javax.swing._
+import javax.swing.JFormattedTextField
object FormattedTextField {
/**
diff --git a/src/main/scala/scala/swing/GridBagPanel.scala b/src/main/scala/scala/swing/GridBagPanel.scala
index fdeaf249..e15a151a 100644
--- a/src/main/scala/scala/swing/GridBagPanel.scala
+++ b/src/main/scala/scala/swing/GridBagPanel.scala
@@ -51,7 +51,7 @@ class GridBagPanel extends Panel with LayoutContainer {
override lazy val peer = new javax.swing.JPanel(new GridBagLayout) with SuperMixin
import GridBagPanel._
- private def layoutManager = peer.getLayout.asInstanceOf[GridBagLayout]
+ private def layoutManager: GridBagLayout = peer.getLayout.asInstanceOf[GridBagLayout]
/**
* Convenient conversion from xy-coords given as pairs to
@@ -65,7 +65,7 @@ class GridBagPanel extends Panel with LayoutContainer {
}
class Constraints(val peer: GridBagConstraints) extends Proxy {
- def self = peer
+ def self: Any = peer
def this(gridx: Int, gridy: Int,
gridwidth: Int, gridheight: Int,
weightx: Double, weighty: Double,
@@ -107,7 +107,7 @@ class GridBagPanel extends Panel with LayoutContainer {
def ipady_=(y: Int): Unit = { peer.ipady = y }
}
- protected def constraintsFor(comp: Component) =
+ protected def constraintsFor(comp: Component): Constraints =
new Constraints(layoutManager.getConstraints(comp.peer))
protected def areValid(c: Constraints): (Boolean, String) = (true, "")
diff --git a/src/main/scala/scala/swing/GridPanel.scala b/src/main/scala/scala/swing/GridPanel.scala
index 2a0204a5..7e54839a 100644
--- a/src/main/scala/scala/swing/GridPanel.scala
+++ b/src/main/scala/scala/swing/GridPanel.scala
@@ -6,10 +6,10 @@
** |/ **
\* */
-
-
package scala.swing
+import java.awt.GridLayout
+
object GridPanel {
val Adapt = 0
}
@@ -37,7 +37,7 @@ class GridPanel(rows0: Int, cols0: Int) extends Panel with SequentialContainer.W
protected def areValid(c: Constraints): (Boolean, String) =
((c._1 > 0 && c._2 > 0), "Grid coordinates (row,col) must be >= 1 but where " + c)*/
- private def layoutManager = peer.getLayout.asInstanceOf[java.awt.GridLayout]
+ private def layoutManager: GridLayout = peer.getLayout.asInstanceOf[GridLayout]
def rows: Int = layoutManager.getRows
def rows_=(n: Int): Unit = layoutManager.setRows(n)
diff --git a/src/main/scala/scala/swing/Label.scala b/src/main/scala/scala/swing/Label.scala
index 7b1bc8d1..b7837425 100644
--- a/src/main/scala/scala/swing/Label.scala
+++ b/src/main/scala/scala/swing/Label.scala
@@ -6,12 +6,11 @@
** |/ **
\* */
-
-
package scala.swing
-import javax.swing._
-import scala.swing.Swing._
+import javax.swing.{Icon, JLabel}
+
+import scala.swing.Swing.{EmptyIcon, toNullIcon}
/**
* A label component that display either a text, an icon, or both.
diff --git a/src/main/scala/scala/swing/LayoutContainer.scala b/src/main/scala/scala/swing/LayoutContainer.scala
index ac9d5cc4..fdd7ec27 100644
--- a/src/main/scala/scala/swing/LayoutContainer.scala
+++ b/src/main/scala/scala/swing/LayoutContainer.scala
@@ -9,6 +9,7 @@
package scala.swing
import javax.swing.JComponent
+
import scala.collection.mutable
/** A container that associates layout constraints of member type
@@ -54,9 +55,10 @@ trait LayoutContainer extends Container.Wrapper {
*
* also ensures that myComponent is properly added to this container.
*/
- def layout: mutable.Map[Component, Constraints] = new mutable.Map[Component, Constraints] {
- def -= (c: Component): this.type = { _contents -= c; this }
- def += (cl: (Component, Constraints)): this.type = { update(cl._1, cl._2); this }
+ def layout: mutable.Map[Component, Constraints] = new MapWrapper[Component, Constraints] {
+ override def subtractOne(c: Component): this.type = { _contents -= c; this }
+
+ override def addOne(cl: (Component, Constraints)): this.type = { update(cl._1, cl._2); this }
override def update(c: Component, l: Constraints): Unit = {
val (v, msg) = areValid(l)
diff --git a/src/main/scala/scala/swing/ListView.scala b/src/main/scala/scala/swing/ListView.scala
index 6f3ca2a4..7a769719 100644
--- a/src/main/scala/scala/swing/ListView.scala
+++ b/src/main/scala/scala/swing/ListView.scala
@@ -6,14 +6,14 @@
** |/ **
\* */
-
-
package scala.swing
import event._
import javax.swing._
import javax.swing.event._
+import scala.collection.immutable
+
object ListView {
/**
* The supported modes of user selections.
@@ -26,7 +26,7 @@ object ListView {
}
def wrap[A](c: JList[A]): ListView[A] = new ListView[A] {
- override lazy val peer = c
+ override lazy val peer: JList[A] = c
}
object Renderer {
@@ -145,30 +145,30 @@ class ListView[A] extends Component {
import ListView._
override lazy val peer: JList[A] = new JList[A] with SuperMixin
- def this(items: Seq[A]) = {
+ def this(items: scala.collection.Seq[A]) = {
this()
listData = items
}
- protected class ModelWrapper[B](val items: Seq[B]) extends AbstractListModel[B] {
- def getElementAt(n: Int) = items(n)
+ protected class ModelWrapper[B](val items: scala.collection.Seq[B]) extends AbstractListModel[B] {
+ def getElementAt(n: Int): B = items(n)
def getSize: Int = items.size
}
- def listData: Seq[A] = peer.getModel match {
+ def listData: scala.collection.Seq[A] = peer.getModel match {
case model: ModelWrapper[a] => model.items
- case model => new Seq[A] { selfSeq =>
+ case model => new immutable.Seq[A] { selfSeq =>
def length: Int = model.getSize
def iterator: Iterator[A] = new Iterator[A] {
var idx = 0
- def next: A = { idx += 1; apply(idx-1) }
+ def next(): A = { idx += 1; apply(idx-1) }
def hasNext: Boolean = idx < selfSeq.length
}
def apply(n: Int): A = model.getElementAt(n)
}
}
- def listData_=(items: Seq[A]): Unit = {
+ def listData_=(items: scala.collection.Seq[A]): Unit = {
peer.setModel(new AbstractListModel[A] {
def getElementAt(n: Int): A = items(n)
def getSize: Int = items.size
@@ -179,30 +179,35 @@ class ListView[A] extends Component {
* The current item selection.
*/
object selection extends Publisher {
- protected abstract class Indices[B](a: => Seq[B]) extends scala.collection.mutable.Set[B] {
- def -=(n: B): this.type
- def +=(n: B): this.type
+ protected abstract class Indices[B](a: => scala.collection.Seq[B]) extends SetWrapper[B] {
def contains(n: B): Boolean = a.contains(n)
+
override def size: Int = a.length
+
def iterator: Iterator[B] = a.iterator
}
- def leadIndex: Int = peer.getSelectionModel.getLeadSelectionIndex
- def anchorIndex: Int = peer.getSelectionModel.getAnchorSelectionIndex
+ def leadIndex : Int = peer.getSelectionModel.getLeadSelectionIndex
+ def anchorIndex : Int = peer.getSelectionModel.getAnchorSelectionIndex
/**
* The indices of the currently selected items.
*/
object indices extends Indices(peer.getSelectedIndices) {
- def -=(n: Int): this.type = { peer.removeSelectionInterval(n,n); this }
- def +=(n: Int): this.type = { peer.addSelectionInterval(n,n); this }
+ override def addOne (n: Int): this.type = { peer.addSelectionInterval (n,n); this }
+ override def subtractOne(n: Int): this.type = { peer.removeSelectionInterval(n,n); this }
+
+ override def clear(): Unit = peer.clearSelection()
}
/**
* The currently selected items.
*/
- object items extends scala.collection.SeqProxy[A] {
- def self = peer.getSelectedValues.map(_.asInstanceOf[A])
+ def items: immutable.Seq[A] = {
+ // note: we should be using `getSelectedValuesList`, but it would break the Scala 2.11
+ // promise of working with Java 6 (requires Java 7).
+ // Note: in Scala <= 2.12, toSeq might produce a Stream.
+ peer.getSelectedValues.iterator.map(_.asInstanceOf[A]).toIndexedSeq
}
def intervalMode: IntervalMode.Value = IntervalMode(peer.getSelectionModel.getSelectionMode)
diff --git a/src/main/scala/scala/swing/MainFrame.scala b/src/main/scala/scala/swing/MainFrame.scala
index b67f3fa4..5bd729dd 100644
--- a/src/main/scala/scala/swing/MainFrame.scala
+++ b/src/main/scala/scala/swing/MainFrame.scala
@@ -9,7 +9,7 @@
package scala.swing
/**
- * A frame that can be used for main application windows. Shuts down the
+ * A frame that can be used for main application windows. It shuts down the
* framework and quits the application when closed.
*/
class MainFrame(gc: java.awt.GraphicsConfiguration = null) extends Frame(gc) {
diff --git a/src/main/scala/scala/swing/Menu.scala b/src/main/scala/scala/swing/Menu.scala
index 38b1787c..fbe8d4a1 100644
--- a/src/main/scala/scala/swing/Menu.scala
+++ b/src/main/scala/scala/swing/Menu.scala
@@ -8,8 +8,9 @@
package scala.swing
+import javax.swing.{JCheckBoxMenuItem, JMenu, JMenuBar, JMenuItem, JRadioButtonMenuItem}
+
import scala.collection.mutable
-import javax.swing._
object MenuBar {
case object NoMenuBar extends MenuBar
diff --git a/src/main/scala/scala/swing/Orientable.scala b/src/main/scala/scala/swing/Orientable.scala
index 86929372..c1bb3c28 100644
--- a/src/main/scala/scala/swing/Orientable.scala
+++ b/src/main/scala/scala/swing/Orientable.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
object Orientable {
diff --git a/src/main/scala/scala/swing/Orientation.scala b/src/main/scala/scala/swing/Orientation.scala
index 5fa2aeef..1226f8b8 100644
--- a/src/main/scala/scala/swing/Orientation.scala
+++ b/src/main/scala/scala/swing/Orientation.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
object Orientation extends Enumeration {
diff --git a/src/main/scala/scala/swing/Oriented.scala b/src/main/scala/scala/swing/Oriented.scala
index 1a705f05..5dd8789a 100644
--- a/src/main/scala/scala/swing/Oriented.scala
+++ b/src/main/scala/scala/swing/Oriented.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
object Oriented {
@@ -16,13 +14,13 @@ object Oriented {
/*
* Need to revert to structural type, since scroll bars are oriented
- * and these are created by scroll panes. Shouldn't be a bootleneck.
+ * and these are created by scroll panes. Shouldn't be a bottleneck.
*/
protected type OrientedMixin = {
- def getOrientation(): Int
+ def getOrientation(): Int // note: must keep empty parentheses for Java compatibility
def setOrientation(n: Int): Unit
}
- def orientation: Orientation.Value = Orientation(peer.getOrientation)
+ def orientation: Orientation.Value = Orientation(peer.getOrientation())
}
}
diff --git a/src/main/scala/scala/swing/Panel.scala b/src/main/scala/scala/swing/Panel.scala
index 89ad4d3d..3892740c 100644
--- a/src/main/scala/scala/swing/Panel.scala
+++ b/src/main/scala/scala/swing/Panel.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
/**
diff --git a/src/main/scala/scala/swing/PasswordField.scala b/src/main/scala/scala/swing/PasswordField.scala
index e7ee3bf7..acf6caac 100644
--- a/src/main/scala/scala/swing/PasswordField.scala
+++ b/src/main/scala/scala/swing/PasswordField.scala
@@ -8,7 +8,7 @@
package scala.swing
-import javax.swing._
+import javax.swing.JPasswordField
/**
* A password field, that displays a replacement character for each character in the password.
diff --git a/src/main/scala/scala/swing/PopupMenu.scala b/src/main/scala/scala/swing/PopupMenu.scala
index 15566aaa..83b45bca 100644
--- a/src/main/scala/scala/swing/PopupMenu.scala
+++ b/src/main/scala/scala/swing/PopupMenu.scala
@@ -6,13 +6,10 @@
** |/ **
\* */
-
-
package scala.swing
import javax.swing.JPopupMenu
-import javax.swing.event.{PopupMenuListener, PopupMenuEvent}
-import event._
+import javax.swing.event.{PopupMenuEvent, PopupMenuListener}
/**
* A popup menu.
@@ -46,13 +43,13 @@ class PopupMenu extends Component with SequentialContainer.Wrapper with Publishe
peer.addPopupMenuListener(new PopupMenuListener {
def popupMenuCanceled(e: PopupMenuEvent): Unit =
- publish(PopupMenuCanceled(PopupMenu.this))
+ publish(event.PopupMenuCanceled(PopupMenu.this))
def popupMenuWillBecomeInvisible(e: PopupMenuEvent): Unit =
- publish(PopupMenuWillBecomeInvisible(PopupMenu.this))
+ publish(event.PopupMenuWillBecomeInvisible(PopupMenu.this))
def popupMenuWillBecomeVisible(e: PopupMenuEvent): Unit =
- publish(PopupMenuWillBecomeVisible(PopupMenu.this))
+ publish(event.PopupMenuWillBecomeVisible(PopupMenu.this))
})
def show(invoker: Component, x: Int, y: Int): Unit = peer.show(invoker.peer, x, y)
diff --git a/src/main/scala/scala/swing/ProgressBar.scala b/src/main/scala/scala/swing/ProgressBar.scala
index ab67f3a9..283098b7 100644
--- a/src/main/scala/scala/swing/ProgressBar.scala
+++ b/src/main/scala/scala/swing/ProgressBar.scala
@@ -8,6 +8,8 @@
package scala.swing
+import javax.swing.JProgressBar
+
/**
* A bar indicating progress of some action. Can be in indeterminate mode,
* in which it indicates that the action is in progress (usually by some
@@ -16,7 +18,7 @@ package scala.swing
* @see javax.swing.JProgressBar
*/
class ProgressBar extends Component with Orientable.Wrapper {
- override lazy val peer: javax.swing.JProgressBar =
+ override lazy val peer: JProgressBar =
new javax.swing.JProgressBar with SuperMixin
def min: Int = peer.getMinimum
diff --git a/src/main/scala/scala/swing/Publisher.scala b/src/main/scala/scala/swing/Publisher.scala
index 70cd0fbb..bdc692a5 100644
--- a/src/main/scala/scala/swing/Publisher.scala
+++ b/src/main/scala/scala/swing/Publisher.scala
@@ -9,6 +9,7 @@
package scala.swing
import scala.collection.mutable
+import scala.ref.{Reference, WeakReference}
import scala.swing.event.Event
/**
@@ -28,12 +29,13 @@ import scala.swing.event.Event
trait Publisher extends Reactor {
import Reactions._
- protected val listeners = new RefSet[Reaction] {
- import scala.ref._
- val underlying = new mutable.HashSet[Reference[Reaction]]
+ protected val listeners: RefSet[Reaction] = new RefSet[Reaction] {
+ protected val underlying: mutable.Set[Reference[Reaction]] =
+ new mutable.HashSet[Reference[Reaction]]
+
protected def Ref(a: Reaction): Ref[Reaction] = a match {
- case a: StronglyReferenced => new StrongReference[Reaction](a) with super.Ref[Reaction]
- case _ => new WeakReference[Reaction](a, referenceQueue) with super.Ref[Reaction]
+ case a: StronglyReferenced => new StrongReference [Reaction](a) with super.Ref[Reaction]
+ case _ => new WeakReference [Reaction](a, referenceQueue) with super.Ref[Reaction]
}
}
@@ -125,49 +127,26 @@ private[swing] trait SingleRefCollection[+A <: AnyRef] extends Iterable[A] { sel
}
private[swing] class StrongReference[+T <: AnyRef](value: T) extends Reference[T] {
- private[this] var ref: Option[T] = Some(value)
- def isValid: Boolean = ref.isDefined
- def apply(): T = ref.get
- def get : Option[T] = ref
- override def toString: String = get.map(_.toString).getOrElse("ButtonGroup
diff --git a/src/main/scala/scala/swing/Reactions.scala b/src/main/scala/scala/swing/Reactions.scala
index d8c3baf5..36e4a428 100644
--- a/src/main/scala/scala/swing/Reactions.scala
+++ b/src/main/scala/scala/swing/Reactions.scala
@@ -6,17 +6,14 @@
** |/ **
\* */
-
-
package scala.swing
import scala.collection.mutable
-import scala.collection.mutable.ListBuffer
import scala.swing.event.Event
object Reactions {
class Impl extends Reactions {
- private val parts: mutable.Buffer[Reaction] = new ListBuffer[Reaction]
+ private val parts: mutable.Buffer[Reaction] = new mutable.ListBuffer[Reaction]
def isDefinedAt(e: Event): Boolean = parts.exists(_ isDefinedAt e)
def += (r: Reaction): this.type = { parts += r; this }
def -= (r: Reaction): this.type = { parts -= r; this }
diff --git a/src/main/scala/scala/swing/Reactor.scala b/src/main/scala/scala/swing/Reactor.scala
index 3f813673..6a7a4f27 100644
--- a/src/main/scala/scala/swing/Reactor.scala
+++ b/src/main/scala/scala/swing/Reactor.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
/**
diff --git a/src/main/scala/scala/swing/RichWindow.scala b/src/main/scala/scala/swing/RichWindow.scala
index 1aa546e8..3aadd7c0 100644
--- a/src/main/scala/scala/swing/RichWindow.scala
+++ b/src/main/scala/scala/swing/RichWindow.scala
@@ -8,9 +8,11 @@
package scala.swing
-import java.awt.{ Window => AWTWindow, Frame => AWTFrame }
-import javax.swing._
-import Swing._
+import java.awt.{Frame => AWTFrame, Window => AWTWindow}
+
+import javax.swing.{Icon, JDialog, JFrame, JMenuBar, JOptionPane, UIManager}
+
+import scala.swing.Swing.{EmptyIcon, PeerContainer, nullPeer}
object RichWindow {
/**
@@ -34,13 +36,13 @@ sealed trait RichWindow extends Window {
def peer: AWTWindow with InterfaceMixin
trait InterfaceMixin extends super.InterfaceMixin {
- def getJMenuBar(): JMenuBar
+ def getJMenuBar: JMenuBar
def setJMenuBar(b: JMenuBar): Unit
def setUndecorated(b: Boolean): Unit
def setTitle(s: String): Unit
- def getTitle(): String
+ def getTitle: String
def setResizable(b: Boolean): Unit
- def isResizable(): Boolean
+ def isResizable: Boolean
}
def title: String = peer.getTitle
@@ -144,7 +146,7 @@ object Dialog {
optionType: Options.Value = Options.YesNo,
messageType: Message.Value = Message.Question,
icon: Icon = EmptyIcon,
- entries: Seq[Any],
+ entries: scala.collection.Seq[Any],
initial: Int): Result.Value = {
val r = JOptionPane.showOptionDialog(nullPeer(parent), message, title,
optionType.id, messageType.id, Swing.wrapIcon(icon),
@@ -157,10 +159,10 @@ object Dialog {
title: String = uiString("OptionPane.inputDialogTitle"),
messageType: Message.Value = Message.Question,
icon: Icon = EmptyIcon,
- entries: Seq[A] = Nil,
+ entries: scala.collection.Seq[A] = Nil,
initial: A): Option[A] = {
val e = if (entries.isEmpty) null
- else (entries map toAnyRef).toArray
+ else entries.iterator.map(toAnyRef).toArray
val r = JOptionPane.showInputDialog(nullPeer(parent), message, title,
messageType.id, Swing.wrapIcon(icon),
e, initial)
diff --git a/src/main/scala/scala/swing/RootPanel.scala b/src/main/scala/scala/swing/RootPanel.scala
index e0ac3590..29bf2b82 100644
--- a/src/main/scala/scala/swing/RootPanel.scala
+++ b/src/main/scala/scala/swing/RootPanel.scala
@@ -6,10 +6,10 @@
** |/ **
\* */
-
-
package scala.swing
+import scala.collection.immutable
+
/**
* The root of a component hierarchy. Contains at most one component.
*
@@ -21,7 +21,7 @@ trait RootPanel extends Container {
/**
* At most one component.
*/
- def contents: Seq[Component] =
+ def contents: immutable.Seq[Component] =
if (peer.getContentPane.getComponentCount == 0) Nil
else {
val c = peer.getContentPane.getComponent(0).asInstanceOf[javax.swing.JComponent]
diff --git a/src/main/scala/scala/swing/ScrollBar.scala b/src/main/scala/scala/swing/ScrollBar.scala
index 376b48c9..913a01c1 100644
--- a/src/main/scala/scala/swing/ScrollBar.scala
+++ b/src/main/scala/scala/swing/ScrollBar.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
import javax.swing.JScrollBar
@@ -16,15 +14,15 @@ object ScrollBar {
def wrap(c: JScrollBar): ScrollBar = {
val w = UIElement.cachedWrapper[ScrollBar](c)
if (w != null) w
- else new ScrollBar { override lazy val peer = c }
+ else new ScrollBar { override lazy val peer: JScrollBar = c }
}
}
class ScrollBar extends Component with Orientable.Wrapper with Adjustable.Wrapper {
override lazy val peer: JScrollBar = new JScrollBar with SuperMixin
- def valueIsAjusting: Boolean = peer.getValueIsAdjusting
- def valueIsAjusting_=(b : Boolean): Unit = peer.setValueIsAdjusting(b)
+ def valueIsAdjusting: Boolean = peer.getValueIsAdjusting
+ def valueIsAdjusting_=(b : Boolean): Unit = peer.setValueIsAdjusting(b)
// TODO: can we find a better interface?
//def setValues(value: Int = this.value, visible: Int = visibleAmount,
diff --git a/src/main/scala/scala/swing/ScrollPane.scala b/src/main/scala/scala/swing/ScrollPane.scala
index ec746b79..6ca8a15f 100644
--- a/src/main/scala/scala/swing/ScrollPane.scala
+++ b/src/main/scala/scala/swing/ScrollPane.scala
@@ -6,12 +6,12 @@
** |/ **
\* */
-
-
package scala.swing
import javax.swing.{JScrollPane, ScrollPaneConstants}
+import scala.collection.immutable
+
object ScrollPane {
object BarPolicy extends Enumeration {
import ScrollPaneConstants._
@@ -48,7 +48,7 @@ class ScrollPane extends Component with Container {
this()
contents = c
}
- def contents: Seq[Component] =
+ def contents: immutable.Seq[Component] =
List(UIElement.cachedWrapper[Component](peer.getViewport.getView.asInstanceOf[javax.swing.JComponent]))
/**
diff --git a/src/main/scala/scala/swing/Scrollable.scala b/src/main/scala/scala/swing/Scrollable.scala
index 3cf93f8b..599dc789 100644
--- a/src/main/scala/scala/swing/Scrollable.scala
+++ b/src/main/scala/scala/swing/Scrollable.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
object Scrollable {
diff --git a/src/main/scala/scala/swing/Separator.scala b/src/main/scala/scala/swing/Separator.scala
index 32d209d5..44555a49 100644
--- a/src/main/scala/scala/swing/Separator.scala
+++ b/src/main/scala/scala/swing/Separator.scala
@@ -6,11 +6,9 @@
** |/ **
\* */
-
-
package scala.swing
-import javax.swing._
+import javax.swing.JSeparator
/**
* A bar that can be used a separator, most commonly in menus.
diff --git a/src/main/scala/scala/swing/SequentialContainer.scala b/src/main/scala/scala/swing/SequentialContainer.scala
index a37a0d18..2c5344db 100644
--- a/src/main/scala/scala/swing/SequentialContainer.scala
+++ b/src/main/scala/scala/swing/SequentialContainer.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
import scala.collection.mutable
diff --git a/src/main/scala/scala/swing/SimpleSwingApplication.scala b/src/main/scala/scala/swing/SimpleSwingApplication.scala
index 0a4cd7bf..d68133a3 100644
--- a/src/main/scala/scala/swing/SimpleSwingApplication.scala
+++ b/src/main/scala/scala/swing/SimpleSwingApplication.scala
@@ -1,3 +1,11 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
package scala.swing
/**
diff --git a/src/main/scala/scala/swing/Slider.scala b/src/main/scala/scala/swing/Slider.scala
index 12e2f28d..db274c15 100644
--- a/src/main/scala/scala/swing/Slider.scala
+++ b/src/main/scala/scala/swing/Slider.scala
@@ -6,12 +6,9 @@
** |/ **
\* */
-
-
package scala.swing
-import javax.swing.{JSlider, JLabel}
-import scala.swing.event._
+import javax.swing.{JLabel, JSlider}
/**
* Lets users select a value from a given range. Visually, this is represented
@@ -52,10 +49,11 @@ class Slider extends Component with Orientable.Wrapper with Publisher {
def adjusting: Boolean = peer.getValueIsAdjusting
def labels: scala.collection.Map[Int, Label] = {
- import scala.collection.convert.WrapAsScala._
- val labelTable = peer.getLabelTable.asInstanceOf[java.util.Map[Int, JLabel]]
- labelTable.mapValues(v => UIElement.cachedWrapper[Label](v))
+ import scala.collection.JavaConverters._
+ val labelTable = peer.getLabelTable.asInstanceOf[java.util.Map[Int, JLabel]].asScala
+ labelTable.map { case (k, v) => (k, UIElement.cachedWrapper[Label](v)) }
}
+
def labels_=(l: scala.collection.Map[Int, Label]): Unit = {
// TODO: do some lazy wrapping
val table = new java.util.Hashtable[java.lang.Integer, javax.swing.JComponent]
@@ -65,6 +63,6 @@ class Slider extends Component with Orientable.Wrapper with Publisher {
peer.addChangeListener(new javax.swing.event.ChangeListener {
def stateChanged(e: javax.swing.event.ChangeEvent): Unit =
- publish(new ValueChanged(Slider.this))
+ publish(new event.ValueChanged(Slider.this))
})
}
diff --git a/src/main/scala/scala/swing/SplitPane.scala b/src/main/scala/scala/swing/SplitPane.scala
index d584c168..cc21a99e 100644
--- a/src/main/scala/scala/swing/SplitPane.scala
+++ b/src/main/scala/scala/swing/SplitPane.scala
@@ -8,7 +8,10 @@
package scala.swing
-import Swing._
+import javax.swing.JSplitPane
+
+import scala.collection.immutable
+import scala.swing.Swing.nullPeer
/**
* A container with exactly two children. Arranges them side by side, either
@@ -18,12 +21,12 @@ import Swing._
* @see javax.swing.JSplitPane
*/
class SplitPane(o: Orientation.Value, left: Component, right: Component) extends Component with Container with Orientable.Wrapper {
- override lazy val peer: javax.swing.JSplitPane =
+ override lazy val peer: JSplitPane =
new javax.swing.JSplitPane(o.id, left.peer, right.peer) with SuperMixin
def this(o: Orientation.Value) = this(o, new Component {}, new Component {})
def this() = this(Orientation.Horizontal)
- def contents: Seq[Component] = List(leftComponent, rightComponent)
+ def contents: immutable.Seq[Component] = List(leftComponent, rightComponent)
def contents_=(left: Component, right: Component): Unit = {
peer.setLeftComponent(nullPeer(left))
peer.setRightComponent(nullPeer(right))
diff --git a/src/main/scala/scala/swing/Swing.scala b/src/main/scala/scala/swing/Swing.scala
index cd97a1cf..e5287dd7 100644
--- a/src/main/scala/scala/swing/Swing.scala
+++ b/src/main/scala/scala/swing/Swing.scala
@@ -6,29 +6,28 @@
** |/ **
\* */
-
-
package scala.swing
import java.awt
-import java.awt.event._
-import javax.swing.border._
-import javax.swing.event._
-import javax.swing.{BorderFactory, Icon, JComponent, SwingUtilities}
+import java.awt.event.{ActionEvent, ActionListener}
+
+import javax.swing.border.{BevelBorder, Border, CompoundBorder, MatteBorder, TitledBorder}
+import javax.swing.event.{ChangeEvent, ChangeListener}
+import javax.swing.{BorderFactory, Icon, ImageIcon, JComponent, SwingUtilities}
/**
* Helpers for this package.
*/
object Swing {
- protected[swing] type PeerContainer = {def peer: awt.Container}
+ protected[swing] type PeerContainer = { def peer: awt.Container }
- protected[swing] def toNoIcon(i: Icon): Icon = if(i == null) EmptyIcon else i
- protected[swing] def toNullIcon(i: Icon): Icon = if(i == EmptyIcon) null else i
+ protected[swing] def toNoIcon (i: Icon): Icon = if (i == null) EmptyIcon else i
+ protected[swing] def toNullIcon (i: Icon): Icon = if (i == EmptyIcon) null else i
protected[swing] def nullPeer(c: PeerContainer): awt.Container = if (c != null) c.peer else null
- implicit def pair2Dimension(p: (Int, Int)): Dimension = new Dimension(p._1, p._2)
- implicit def pair2Point(p: (Int, Int)): Point = new Point(p._1, p._2)
- implicit def pair2Point(p: (Int, Int, Int, Int)): Rectangle = new Rectangle(p._1, p._2, p._3, p._4)
+ implicit def pair2Dimension(p: (Int, Int)) : Dimension = new Dimension (p._1, p._2)
+ implicit def pair2Point (p: (Int, Int)) : Point = new Point (p._1, p._2)
+ implicit def pair2Point (p: (Int, Int, Int, Int)): Rectangle = new Rectangle (p._1, p._2, p._3, p._4)
@inline final def Runnable(@inline block: => Unit): Runnable = new Runnable {
def run(): Unit = block
@@ -40,31 +39,31 @@ object Swing {
def actionPerformed(e: ActionEvent): Unit = f(e)
}
- def Box(min: Dimension, pref: Dimension, max: Dimension) = new Component {
- override lazy val peer = new javax.swing.Box.Filler(min, pref, max)
+ def Box(min: Dimension, pref: Dimension, max: Dimension): Component = new Component {
+ override lazy val peer: JComponent = new javax.swing.Box.Filler(min, pref, max)
}
- def HGlue = new Component {
- override lazy val peer = javax.swing.Box.createHorizontalGlue.asInstanceOf[JComponent]
+ def HGlue: Component = new Component {
+ override lazy val peer: JComponent = javax.swing.Box.createHorizontalGlue.asInstanceOf[JComponent]
}
- def VGlue = new Component {
- override lazy val peer = javax.swing.Box.createVerticalGlue.asInstanceOf[JComponent]
+ def VGlue: Component = new Component {
+ override lazy val peer: JComponent = javax.swing.Box.createVerticalGlue.asInstanceOf[JComponent]
}
- def Glue = new Component {
- override lazy val peer = javax.swing.Box.createGlue.asInstanceOf[JComponent]
+ def Glue: Component = new Component {
+ override lazy val peer: JComponent = javax.swing.Box.createGlue.asInstanceOf[JComponent]
}
- def RigidBox(dim: Dimension) = new Component {
- override lazy val peer = javax.swing.Box.createRigidArea(dim).asInstanceOf[JComponent]
+ def RigidBox(dim: Dimension): Component = new Component {
+ override lazy val peer: JComponent = javax.swing.Box.createRigidArea(dim).asInstanceOf[JComponent]
}
- def HStrut(width: Int) = new Component {
- override lazy val peer = javax.swing.Box.createHorizontalStrut(width).asInstanceOf[JComponent]
+ def HStrut(width: Int): Component = new Component {
+ override lazy val peer: JComponent = javax.swing.Box.createHorizontalStrut(width).asInstanceOf[JComponent]
}
- def VStrut(height: Int) = new Component {
- override lazy val peer = javax.swing.Box.createVerticalStrut(height).asInstanceOf[JComponent]
+ def VStrut(height: Int): Component = new Component {
+ override lazy val peer: JComponent = javax.swing.Box.createVerticalStrut(height).asInstanceOf[JComponent]
}
- def Icon(image: java.awt.Image) = new javax.swing.ImageIcon(image)
- def Icon(filename: String) = new javax.swing.ImageIcon(filename)
- def Icon(url: java.net.URL) = new javax.swing.ImageIcon(url)
+ def Icon(image: java.awt.Image) : ImageIcon = new ImageIcon(image)
+ def Icon(filename: String) : ImageIcon = new ImageIcon(filename)
+ def Icon(url: java.net.URL) : ImageIcon = new ImageIcon(url)
/**
* The empty icon. Use this icon instead of null
to indicate
@@ -77,7 +76,7 @@ object Swing {
}
def unwrapIcon(icon: Icon): Icon = if (icon == null) EmptyIcon else icon
- def wrapIcon(icon: Icon): Icon = if (icon == EmptyIcon) null else icon
+ def wrapIcon (icon: Icon): Icon = if (icon == EmptyIcon) null else icon
def EmptyBorder: Border = BorderFactory.createEmptyBorder()
def EmptyBorder(weight: Int): Border =
diff --git a/src/main/scala/scala/swing/SwingApplication.scala b/src/main/scala/scala/swing/SwingApplication.scala
index 121dca4a..bb82cbc0 100644
--- a/src/main/scala/scala/swing/SwingApplication.scala
+++ b/src/main/scala/scala/swing/SwingApplication.scala
@@ -1,3 +1,11 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
package scala.swing
/** Convenience class with utility methods for GUI applications. */
diff --git a/src/main/scala/scala/swing/TabbedPane.scala b/src/main/scala/scala/swing/TabbedPane.scala
index 99e62d0e..badb3a9c 100644
--- a/src/main/scala/scala/swing/TabbedPane.scala
+++ b/src/main/scala/scala/swing/TabbedPane.scala
@@ -6,15 +6,10 @@
** |/ **
\* */
-
-
package scala.swing
import javax.swing.JTabbedPane
-import scala.swing.event._
-
-
object TabbedPane {
object Layout extends Enumeration {
import JTabbedPane._
@@ -23,7 +18,7 @@ object TabbedPane {
}
class Page protected[TabbedPane](parent0: TabbedPane, title0: String, content0: Component, tip0: String) extends Proxy {
- def self = content0
+ def self: Any = content0
def this(title0: String, content0: Component, tip0: String) =
this(null, title0, content0, tip0)
@@ -90,15 +85,22 @@ class TabbedPane extends Component with Publisher {
//for(i <- n to length) apply(i)._index -= 1
t
}
- protected def insertAt(n: Int, t: Page): Unit = {
+
+ override def insert(n: Int, t: Page): Unit = {
//for(i <- n to length) apply(i)._index += 1
t.parent = TabbedPane.this
peer.insertTab(t.title, null, t.content.peer, t.tip, n)
}
- def +=(t: Page): this.type = { t.parent = TabbedPane.this; peer.addTab(t.title, null, t.content.peer, t.tip); this }
+ override def addOne(t: Page): this.type = {
+ t.parent = TabbedPane.this
+ peer.addTab(t.title, null, t.content.peer, t.tip)
+ this
+ }
+
def length: Int = peer.getTabCount
- def apply(n: Int) = new Page(TabbedPane.this, peer.getTitleAt(n),
+
+ def apply(n: Int): Page = new Page(TabbedPane.this, peer.getTitleAt(n),
UIElement.cachedWrapper[Component](peer.getComponentAt(n).asInstanceOf[javax.swing.JComponent]),
peer.getToolTipTextAt(n))
}
@@ -125,7 +127,7 @@ class TabbedPane extends Component with Publisher {
peer.addChangeListener(new javax.swing.event.ChangeListener {
def stateChanged(e: javax.swing.event.ChangeEvent): Unit =
- publish(SelectionChanged(TabbedPane.this))
+ publish(event.SelectionChanged(TabbedPane.this))
})
}
}
diff --git a/src/main/scala/scala/swing/Table.scala b/src/main/scala/scala/swing/Table.scala
index b2664cfa..e5dceaf0 100644
--- a/src/main/scala/scala/swing/Table.scala
+++ b/src/main/scala/scala/swing/Table.scala
@@ -6,16 +6,14 @@
** |/ **
\* */
-
-
package scala.swing
-import javax.swing._
-import javax.swing.event._
-import javax.swing.table._
+import javax.swing.event.{ListSelectionListener, TableModelEvent, TableModelListener}
+import javax.swing.table.{AbstractTableModel, DefaultTableModel, TableCellEditor, TableCellRenderer, TableModel}
+import javax.swing.{Icon, JComponent, JTable, ListSelectionModel, RowSorter, SortOrder}
import scala.collection.mutable
-import scala.swing.event._
+import scala.swing.event.{TableChanged, TableColumnsSelected, TableRowsAdded, TableRowsRemoved, TableRowsSelected, TableStructureChanged, TableUpdated}
object Table {
object AutoResizeMode extends Enumeration {
@@ -135,7 +133,7 @@ class Table extends Component with Scrollable.Wrapper {
* by calling `toString` on the elements. The size of this sequence
* must correspond with the inner dimension of `rowData`.
*/
- def this(rowData: Array[Array[Any]], columnNames: Seq[_]) = {
+ def this(rowData: Array[Array[Any]], columnNames: scala.collection.Seq[_]) = {
this()
model = new AbstractTableModel {
override def getColumnName(column: Int): String = columnNames(column).toString
@@ -198,25 +196,38 @@ class Table extends Component with Scrollable.Wrapper {
object selection extends Publisher {
// TODO: could be a sorted set
- protected abstract class SelectionSet[A](a: => Seq[A]) extends mutable.Set[A] {
- def -=(n: A): this.type
- def +=(n: A): this.type
+ protected abstract class SelectionSet[A](a: => scala.collection.Seq[A]) extends SetWrapper[A] {
+ // def -=(n: A): this.type
+ // def +=(n: A): this.type
+
def contains(n: A): Boolean = a.contains(n)
+
override def size: Int = a.length
+
def iterator: Iterator[A] = a.iterator
}
object rows extends SelectionSet(peer.getSelectedRows) {
- def -=(n: Int): this.type = { peer.removeRowSelectionInterval(n,n); this }
- def +=(n: Int): this.type = { peer.addRowSelectionInterval (n,n); this }
+ override def subtractOne(n: Int): this.type = { peer.removeRowSelectionInterval(n,n); this }
+ override def addOne (n: Int): this.type = { peer.addRowSelectionInterval (n,n); this }
+
+ override def clear(): Unit = {
+ val n = peer.getRowCount
+ if (n > 0) peer.removeRowSelectionInterval(0, n - 1)
+ }
def leadIndex : Int = peer.getSelectionModel.getLeadSelectionIndex
def anchorIndex: Int = peer.getSelectionModel.getAnchorSelectionIndex
}
object columns extends SelectionSet(peer.getSelectedColumns) {
- def -=(n: Int): this.type = { peer.removeColumnSelectionInterval(n,n); this }
- def +=(n: Int): this.type = { peer.addColumnSelectionInterval (n,n); this }
+ override def subtractOne(n: Int): this.type = { peer.removeColumnSelectionInterval(n,n); this }
+ override def addOne (n: Int): this.type = { peer.addColumnSelectionInterval (n,n); this }
+
+ override def clear(): Unit = {
+ val n = peer.getColumnCount
+ if (n > 0) peer.removeColumnSelectionInterval(0, n - 1)
+ }
def leadIndex : Int = peer.getColumnModel.getSelectionModel.getLeadSelectionIndex
def anchorIndex: Int = peer.getColumnModel.getSelectionModel.getAnchorSelectionIndex
@@ -224,16 +235,20 @@ class Table extends Component with Scrollable.Wrapper {
def cells: mutable.Set[(Int, Int)] =
new SelectionSet[(Int, Int)]((for(r <- selection.rows; c <- selection.columns) yield (r,c)).toSeq) { outer =>
- def -=(n: (Int, Int)): this.type = {
+ override def subtractOne(n: (Int, Int)): this.type = {
peer.removeRowSelectionInterval (n._1,n._1)
peer.removeColumnSelectionInterval(n._2,n._2)
this
}
- def +=(n: (Int, Int)): this.type = {
+
+ override def addOne(n: (Int, Int)): this.type = {
peer.addRowSelectionInterval (n._1,n._1)
peer.addColumnSelectionInterval(n._2,n._2)
this
}
+
+ override def clear(): Unit = peer.clearSelection()
+
override def size: Int = peer.getSelectedRowCount * peer.getSelectedColumnCount
}
diff --git a/src/main/scala/scala/swing/TextArea.scala b/src/main/scala/scala/swing/TextArea.scala
index d7e660c1..a59ecbcf 100644
--- a/src/main/scala/scala/swing/TextArea.scala
+++ b/src/main/scala/scala/swing/TextArea.scala
@@ -8,10 +8,10 @@
package scala.swing
-import javax.swing._
+import javax.swing.JTextArea
/**
- * A text component that allows multiline text input and display.
+ * A text component that allows multi-line text input and display.
*
* @see javax.swing.JTextArea
*/
diff --git a/src/main/scala/scala/swing/TextComponent.scala b/src/main/scala/scala/swing/TextComponent.scala
index e1dffcac..7023c5b8 100644
--- a/src/main/scala/scala/swing/TextComponent.scala
+++ b/src/main/scala/scala/swing/TextComponent.scala
@@ -8,9 +8,8 @@
package scala.swing
-import event._
-import javax.swing.text._
-import javax.swing.event._
+import javax.swing.event.{CaretEvent, CaretListener, DocumentEvent, DocumentListener}
+import javax.swing.text.JTextComponent
object TextComponent {
trait HasColumns extends TextComponent {
@@ -51,7 +50,7 @@ class TextComponent extends Component with Publisher {
peer.addCaretListener {
new CaretListener {
- def caretUpdate(e: CaretEvent): Unit = publish(CaretUpdate(TextComponent.this))
+ def caretUpdate(e: CaretEvent): Unit = publish(event.CaretUpdate(TextComponent.this))
}
}
}
@@ -70,8 +69,8 @@ class TextComponent extends Component with Publisher {
def selectAll(): Unit = peer.selectAll()
peer.getDocument.addDocumentListener(new DocumentListener {
- def changedUpdate(e:DocumentEvent): Unit = publish(new ValueChanged(TextComponent.this))
- def insertUpdate (e:DocumentEvent): Unit = publish(new ValueChanged(TextComponent.this))
- def removeUpdate (e:DocumentEvent): Unit = publish(new ValueChanged(TextComponent.this))
+ def changedUpdate(e: DocumentEvent): Unit = publish(new event.ValueChanged(TextComponent.this))
+ def insertUpdate (e: DocumentEvent): Unit = publish(new event.ValueChanged(TextComponent.this))
+ def removeUpdate (e: DocumentEvent): Unit = publish(new event.ValueChanged(TextComponent.this))
})
}
diff --git a/src/main/scala/scala/swing/TextField.scala b/src/main/scala/scala/swing/TextField.scala
index 5906a7f9..b85762b4 100644
--- a/src/main/scala/scala/swing/TextField.scala
+++ b/src/main/scala/scala/swing/TextField.scala
@@ -6,14 +6,13 @@
** |/ **
\* */
-
-
package scala.swing
-import event._
-import javax.swing._
-import java.awt.event._
+import java.awt.event.FocusAdapter
+
+import javax.swing.{InputVerifier, JComponent, JTextField}
+import scala.swing.event.EditDone
/*object TextField {
object FocusLostBehavior extends Enumeration {
@@ -64,7 +63,7 @@ class TextField(text0: String, columns0: Int) extends TextComponent with TextCom
def verifier_=(v: String => Boolean): Unit = {
peer.setInputVerifier(new InputVerifier {
private val old = Option(peer.getInputVerifier)
- def verify(c: JComponent) = v(text)
+ def verify(c: JComponent): Boolean = v(text)
override def shouldYieldFocus(c: JComponent): Boolean = old forall (_ shouldYieldFocus c)
})
}
@@ -73,7 +72,7 @@ class TextField(text0: String, columns0: Int) extends TextComponent with TextCom
peer.setInputVerifier(new InputVerifier {
private val old = peer.getInputVerifier
def verify(c: JComponent): Boolean = old.verify(c)
- override def shouldYieldFocus(c: JComponent) = y(text)
+ override def shouldYieldFocus(c: JComponent): Boolean = y(text)
})
}
}
diff --git a/src/main/scala/scala/swing/TextPane.scala b/src/main/scala/scala/swing/TextPane.scala
index 76749696..0ffef69d 100644
--- a/src/main/scala/scala/swing/TextPane.scala
+++ b/src/main/scala/scala/swing/TextPane.scala
@@ -5,6 +5,7 @@
** /____/\___/_/ |_/____/_/ | | **
** |/ **
\* */
+
package scala.swing
/**
@@ -12,7 +13,7 @@ package scala.swing
*
* @see javax.swing.JTextPane
*/
-class TextPane() extends TextComponent {
+class TextPane extends TextComponent {
override lazy val peer: javax.swing.JTextPane = new javax.swing.JTextPane() with SuperMixin
def styledDocument: javax.swing.text.StyledDocument = peer.getStyledDocument
}
\ No newline at end of file
diff --git a/src/main/scala/scala/swing/ToggleButton.scala b/src/main/scala/scala/swing/ToggleButton.scala
index 8f210d00..0bd2975c 100644
--- a/src/main/scala/scala/swing/ToggleButton.scala
+++ b/src/main/scala/scala/swing/ToggleButton.scala
@@ -8,7 +8,7 @@
package scala.swing
-import javax.swing._
+import javax.swing.JToggleButton
/**
* A two state button with a push button like user interface.
diff --git a/src/main/scala/scala/swing/UIElement.scala b/src/main/scala/scala/swing/UIElement.scala
index fb46c76e..dbf197b6 100644
--- a/src/main/scala/scala/swing/UIElement.scala
+++ b/src/main/scala/scala/swing/UIElement.scala
@@ -9,15 +9,14 @@
package scala.swing
import java.awt.{ComponentOrientation, Cursor, Toolkit}
-import java.util
import java.util.Locale
+import java.{util => ju}
-import scala.ref._
-import scala.swing.event._
+import scala.ref.WeakReference
object UIElement {
private val ClientKey = "scala.swingWrapper"
- private[this] val wrapperCache = new util.WeakHashMap[java.awt.Component, WeakReference[UIElement]]
+ private[this] val wrapperCache = new ju.WeakHashMap[java.awt.Component, WeakReference[UIElement]]
private def cache(e: UIElement) = e.peer match {
case p: javax.swing.JComponent => p.putClientProperty(ClientKey, e)
@@ -52,7 +51,7 @@ object UIElement {
def wrap(c: java.awt.Component): UIElement = {
val w = cachedWrapper[UIElement](c)
if (w != null) w
- else new UIElement { def peer = c }
+ else new UIElement { def peer: java.awt.Component = c }
}
}
@@ -75,7 +74,7 @@ trait UIElement extends Proxy with LazyPublisher {
* The underlying Swing peer.
*/
def peer: java.awt.Component
- def self = peer
+ def self: Any = peer
UIElement.cache(this)
@@ -122,16 +121,16 @@ trait UIElement extends Proxy with LazyPublisher {
protected def onFirstSubscribe(): Unit = {
peer.addComponentListener(new java.awt.event.ComponentListener {
def componentHidden(e: java.awt.event.ComponentEvent): Unit =
- publish(UIElementHidden(UIElement.this))
+ publish(event.UIElementHidden(UIElement.this))
def componentShown(e: java.awt.event.ComponentEvent): Unit =
- publish(UIElementShown(UIElement.this))
+ publish(event.UIElementShown(UIElement.this))
def componentMoved(e: java.awt.event.ComponentEvent): Unit =
- publish(UIElementMoved(UIElement.this))
+ publish(event.UIElementMoved(UIElement.this))
def componentResized(e: java.awt.event.ComponentEvent): Unit =
- publish(UIElementResized(UIElement.this))
+ publish(event.UIElementResized(UIElement.this))
})
}
protected def onLastUnsubscribe(): Unit = ()
diff --git a/src/main/scala/scala/swing/Window.scala b/src/main/scala/scala/swing/Window.scala
index 97ca0693..5d254578 100644
--- a/src/main/scala/scala/swing/Window.scala
+++ b/src/main/scala/scala/swing/Window.scala
@@ -8,8 +8,8 @@
package scala.swing
+import java.awt.event.{WindowEvent, WindowListener}
import java.awt.{Window => AWTWindow}
-import event._
/**
* A window with decoration such as a title, border, and action buttons.
@@ -25,9 +25,9 @@ abstract class Window extends UIElement with RootPanel with Publisher { outer =>
protected trait InterfaceMixin extends javax.swing.RootPaneContainer
protected trait SuperMixin extends AWTWindow {
- override protected def processWindowEvent(e: java.awt.event.WindowEvent): Unit = {
+ override protected def processWindowEvent(e: WindowEvent): Unit = {
super.processWindowEvent(e)
- if (e.getID == java.awt.event.WindowEvent.WINDOW_CLOSING)
+ if (e.getID == WindowEvent.WINDOW_CLOSING)
closeOperation()
}
}
@@ -63,16 +63,16 @@ abstract class Window extends UIElement with RootPanel with Publisher { outer =>
def owner: Window = UIElement.cachedWrapper[Window](peer.getOwner)
- def open (): Unit = peer setVisible true
- def close(): Unit = peer setVisible false
+ def open (): Unit = peer.setVisible(true)
+ def close(): Unit = peer.setVisible(false)
- peer.addWindowListener(new java.awt.event.WindowListener {
- def windowActivated (e: java.awt.event.WindowEvent): Unit = publish(WindowActivated(outer))
- def windowClosed (e: java.awt.event.WindowEvent): Unit = publish(WindowClosed(outer))
- def windowClosing (e: java.awt.event.WindowEvent): Unit = publish(WindowClosing(outer))
- def windowDeactivated (e: java.awt.event.WindowEvent): Unit = publish(WindowDeactivated(outer))
- def windowDeiconified (e: java.awt.event.WindowEvent): Unit = publish(WindowDeiconified(outer))
- def windowIconified (e: java.awt.event.WindowEvent): Unit = publish(WindowIconified(outer))
- def windowOpened (e: java.awt.event.WindowEvent): Unit = publish(WindowOpened(outer))
+ peer.addWindowListener(new WindowListener {
+ def windowActivated (e: WindowEvent): Unit = publish(event.WindowActivated (outer))
+ def windowClosed (e: WindowEvent): Unit = publish(event.WindowClosed (outer))
+ def windowClosing (e: WindowEvent): Unit = publish(event.WindowClosing (outer))
+ def windowDeactivated (e: WindowEvent): Unit = publish(event.WindowDeactivated(outer))
+ def windowDeiconified (e: WindowEvent): Unit = publish(event.WindowDeiconified(outer))
+ def windowIconified (e: WindowEvent): Unit = publish(event.WindowIconified (outer))
+ def windowOpened (e: WindowEvent): Unit = publish(event.WindowOpened (outer))
})
}
diff --git a/src/main/scala/scala/swing/event/ActionEvent.scala b/src/main/scala/scala/swing/event/ActionEvent.scala
index 7b2de43d..b1cc9421 100644
--- a/src/main/scala/scala/swing/event/ActionEvent.scala
+++ b/src/main/scala/scala/swing/event/ActionEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/AdjustingEvent.scala b/src/main/scala/scala/swing/event/AdjustingEvent.scala
index a4b7d29c..1082272b 100644
--- a/src/main/scala/scala/swing/event/AdjustingEvent.scala
+++ b/src/main/scala/scala/swing/event/AdjustingEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/BackgroundChanged.scala b/src/main/scala/scala/swing/event/BackgroundChanged.scala
index bdd67f95..53ba8e8a 100644
--- a/src/main/scala/scala/swing/event/BackgroundChanged.scala
+++ b/src/main/scala/scala/swing/event/BackgroundChanged.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/ButtonClicked.scala b/src/main/scala/scala/swing/event/ButtonClicked.scala
index d0220190..53c67f19 100644
--- a/src/main/scala/scala/swing/event/ButtonClicked.scala
+++ b/src/main/scala/scala/swing/event/ButtonClicked.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/CaretUpdate.scala b/src/main/scala/scala/swing/event/CaretUpdate.scala
index 2821175e..35de1845 100644
--- a/src/main/scala/scala/swing/event/CaretUpdate.scala
+++ b/src/main/scala/scala/swing/event/CaretUpdate.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/ColorChanged.scala b/src/main/scala/scala/swing/event/ColorChanged.scala
index 6cb35e77..bdc19bc4 100644
--- a/src/main/scala/scala/swing/event/ColorChanged.scala
+++ b/src/main/scala/scala/swing/event/ColorChanged.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/ComponentEvent.scala b/src/main/scala/scala/swing/event/ComponentEvent.scala
index 701b9629..82fe9489 100644
--- a/src/main/scala/scala/swing/event/ComponentEvent.scala
+++ b/src/main/scala/scala/swing/event/ComponentEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/ContainerEvent.scala b/src/main/scala/scala/swing/event/ContainerEvent.scala
index 46f3768e..06a8e8b0 100644
--- a/src/main/scala/scala/swing/event/ContainerEvent.scala
+++ b/src/main/scala/scala/swing/event/ContainerEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/EditDone.scala b/src/main/scala/scala/swing/event/EditDone.scala
index 9d382347..d1c21315 100644
--- a/src/main/scala/scala/swing/event/EditDone.scala
+++ b/src/main/scala/scala/swing/event/EditDone.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/Event.scala b/src/main/scala/scala/swing/event/Event.scala
index fd113560..d094b3b2 100644
--- a/src/main/scala/scala/swing/event/Event.scala
+++ b/src/main/scala/scala/swing/event/Event.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/FocusEvent.scala b/src/main/scala/scala/swing/event/FocusEvent.scala
index 5c29d8f6..be270921 100644
--- a/src/main/scala/scala/swing/event/FocusEvent.scala
+++ b/src/main/scala/scala/swing/event/FocusEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/FontChanged.scala b/src/main/scala/scala/swing/event/FontChanged.scala
index ca936e19..0c57c984 100644
--- a/src/main/scala/scala/swing/event/FontChanged.scala
+++ b/src/main/scala/scala/swing/event/FontChanged.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/ForegroundChanged.scala b/src/main/scala/scala/swing/event/ForegroundChanged.scala
index 42b45aae..6fbc6753 100644
--- a/src/main/scala/scala/swing/event/ForegroundChanged.scala
+++ b/src/main/scala/scala/swing/event/ForegroundChanged.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/InputEvent.scala b/src/main/scala/scala/swing/event/InputEvent.scala
index 966aba4d..389a1f37 100644
--- a/src/main/scala/scala/swing/event/InputEvent.scala
+++ b/src/main/scala/scala/swing/event/InputEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/Key.scala b/src/main/scala/scala/swing/event/Key.scala
index 9d26fddd..3ccc5cbb 100644
--- a/src/main/scala/scala/swing/event/Key.scala
+++ b/src/main/scala/scala/swing/event/Key.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/KeyEvent.scala b/src/main/scala/scala/swing/event/KeyEvent.scala
index bc5413bb..be66973b 100644
--- a/src/main/scala/scala/swing/event/KeyEvent.scala
+++ b/src/main/scala/scala/swing/event/KeyEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/ListEvent.scala b/src/main/scala/scala/swing/event/ListEvent.scala
index bdb769d4..4bc7c6e2 100644
--- a/src/main/scala/scala/swing/event/ListEvent.scala
+++ b/src/main/scala/scala/swing/event/ListEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/MouseEvent.scala b/src/main/scala/scala/swing/event/MouseEvent.scala
index c92d26a1..70869ccc 100644
--- a/src/main/scala/scala/swing/event/MouseEvent.scala
+++ b/src/main/scala/scala/swing/event/MouseEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/PopupMenuEvent.scala b/src/main/scala/scala/swing/event/PopupMenuEvent.scala
index ad39eb35..1c403f6f 100644
--- a/src/main/scala/scala/swing/event/PopupMenuEvent.scala
+++ b/src/main/scala/scala/swing/event/PopupMenuEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/SelectionEvent.scala b/src/main/scala/scala/swing/event/SelectionEvent.scala
index 39d6a13b..e054abbb 100644
--- a/src/main/scala/scala/swing/event/SelectionEvent.scala
+++ b/src/main/scala/scala/swing/event/SelectionEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/TableEvent.scala b/src/main/scala/scala/swing/event/TableEvent.scala
index c420ea27..96094c88 100644
--- a/src/main/scala/scala/swing/event/TableEvent.scala
+++ b/src/main/scala/scala/swing/event/TableEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/UIEvent.scala b/src/main/scala/scala/swing/event/UIEvent.scala
index a4644b02..fa959922 100644
--- a/src/main/scala/scala/swing/event/UIEvent.scala
+++ b/src/main/scala/scala/swing/event/UIEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/ValueChanged.scala b/src/main/scala/scala/swing/event/ValueChanged.scala
index ef080857..d3780fed 100644
--- a/src/main/scala/scala/swing/event/ValueChanged.scala
+++ b/src/main/scala/scala/swing/event/ValueChanged.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/WindowActivated.scala b/src/main/scala/scala/swing/event/WindowActivated.scala
index 1473242e..59f62bdf 100644
--- a/src/main/scala/scala/swing/event/WindowActivated.scala
+++ b/src/main/scala/scala/swing/event/WindowActivated.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/WindowClosed.scala b/src/main/scala/scala/swing/event/WindowClosed.scala
index 80afe1a9..651baae3 100644
--- a/src/main/scala/scala/swing/event/WindowClosed.scala
+++ b/src/main/scala/scala/swing/event/WindowClosed.scala
@@ -1,3 +1,11 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/WindowClosing.scala b/src/main/scala/scala/swing/event/WindowClosing.scala
index 3c64aeb0..0ce77fea 100644
--- a/src/main/scala/scala/swing/event/WindowClosing.scala
+++ b/src/main/scala/scala/swing/event/WindowClosing.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/WindowDeactivated.scala b/src/main/scala/scala/swing/event/WindowDeactivated.scala
index f0eec579..b35f1f9e 100644
--- a/src/main/scala/scala/swing/event/WindowDeactivated.scala
+++ b/src/main/scala/scala/swing/event/WindowDeactivated.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/WindowDeiconified.scala b/src/main/scala/scala/swing/event/WindowDeiconified.scala
index 6e07f853..46990aba 100644
--- a/src/main/scala/scala/swing/event/WindowDeiconified.scala
+++ b/src/main/scala/scala/swing/event/WindowDeiconified.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/WindowEvent.scala b/src/main/scala/scala/swing/event/WindowEvent.scala
index b8ca329a..7a351248 100644
--- a/src/main/scala/scala/swing/event/WindowEvent.scala
+++ b/src/main/scala/scala/swing/event/WindowEvent.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/WindowIconified.scala b/src/main/scala/scala/swing/event/WindowIconified.scala
index 3b5139f7..db212500 100644
--- a/src/main/scala/scala/swing/event/WindowIconified.scala
+++ b/src/main/scala/scala/swing/event/WindowIconified.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/event/WindowOpened.scala b/src/main/scala/scala/swing/event/WindowOpened.scala
index f5854edc..c5943c6d 100644
--- a/src/main/scala/scala/swing/event/WindowOpened.scala
+++ b/src/main/scala/scala/swing/event/WindowOpened.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.swing
package event
diff --git a/src/main/scala/scala/swing/model/Matrix.scala b/src/main/scala/scala/swing/model/Matrix.scala
deleted file mode 100644
index 664d44a9..00000000
--- a/src/main/scala/scala/swing/model/Matrix.scala
+++ /dev/null
@@ -1,121 +0,0 @@
-/* __ *\
-** ________ ___ / / ___ Scala API **
-** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL **
-** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
-** /____/\___/_/ |_/____/_/ | | **
-** |/ **
-\* */
-
-
-package scala.swing
-package model
-
-// Dummy to keep ant from recompiling on every run.
-trait Matrix { }
-
-/*trait Matrix[A] extends Function2[Int, Int, A] {
-
- val width: Int
- val height: Int
-
- assert(width > 0 && height > 0)
-
- private val delegate = new Array[A](width * height)
-
- override def apply(col: Int, row: Int): A =
- delegate(col * height + row)
-
- def apply(coord: (Int, Int)): A =
- apply(coord._1, coord._2)
-
- def col(index: Int): Matrix.FlatSeq[A] =
- new Matrix.SubArray[A](delegate, index * height, height)
-
- def row(index: Int): Matrix.FlatSeq[A] =
- new Matrix.SparseArray[A](delegate, index, height)
-
- def update(xpos: Int, ypos: Int, elem: A) {
- delegate(xpos % width * height + ypos % height) = elem
- }
-
- def update(coord: (Int, Int), elem: A) {
- update(coord._1, coord._2, elem)
- }
-
- def initializeWith(f: (Int, Int) => A): this.type = {
- for (index <- 0 until (width * height))
- delegate(index) = f(index / height, index % height)
- this
- }
-
- def initializeTo(v: => A): this.type = {
- for (index <- 0 until (width * height))
- delegate(index) = v
- this
- }
-
- def size: (Int, Int) = (width, height)
-
- /** A flattened view of the matrix. The flattening is done on columns i.e.
- * the first values of the flattened sequence are the cells of the first
- * column. As this is a view of the matrix, any change to the matrix will
- * also be visible in the flattened array, and vice-versa. */
- def flat: Array[A] = delegate
-
-}
-
-object Matrix {
-
- def apply[A](columns: Int, rows: Int) = new Matrix[A] {
- val width = columns
- val height = rows
- }
-
- def apply[A](default: (Int, Int) => A, columns: Int, rows: Int) = new Matrix[A] {
- val width = columns
- val height = rows
- initializeWith(default)
- }
-
- def apply[A](default: => A, columns: Int, rows: Int) = new Matrix[A] {
- val width = columns
- val height = rows
- initializeTo(default)
- }
-
- trait FlatSeq[A] extends RandomAccessSeq[A] {
- def update (index: Int, elem: A): Unit
- }
-
- private class SubArray[A](delegate: Array[A], start: Int, val length: Int) extends FlatSeq[A] {
- def apply(index: Int): A =
- if (index < length)
- delegate(index + start)
- else throw new IndexOutOfBoundsException
- def update(index: Int, elem: A): Unit =
- if (index < length)
- delegate(index + start) = elem
- else throw new IndexOutOfBoundsException
- }
-
- private class SparseArray[A](delegate: Array[A], start: Int, span: Int) extends FlatSeq[A] {
- def apply(index: Int): A = {
- if (index < length)
- delegate((index * span) + start)
- else throw new IndexOutOfBoundsException
- }
- def length: Int = delegate.length / span
- def update(index: Int, elem: A): Unit =
- if (index < length)
- delegate((index * span) + start) = elem
- else throw new IndexOutOfBoundsException
- }
-
- implicit def MatrixToSeqs[A](matrix: Matrix[A]): Seq[Seq[A]] = {
- val result = new Array[SubArray[A]](matrix.width)
- for (col <- 0 until matrix.width)
- result(col) = new SubArray[A](matrix.delegate, col * matrix.height, matrix.height)
- result
- }
-
-}*/
diff --git a/src/main/scala/scala/swing/package.scala b/src/main/scala/scala/swing/package.scala
index cbfd0ded..1869d847 100644
--- a/src/main/scala/scala/swing/package.scala
+++ b/src/main/scala/scala/swing/package.scala
@@ -1,7 +1,15 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
package scala
/**
- * Useful imports that don't have wrappers.
+ * Useful imports that do not have wrappers.
*/
package object swing {
type Point = java.awt.Point
@@ -17,7 +25,8 @@ package object swing {
implicit lazy val reflectiveCalls = scala.language.reflectiveCalls
implicit lazy val implicitConversions = scala.language.implicitConversions
- private[swing] def ifNull[A](o: Object, a: A): A = if(o eq null) a else o.asInstanceOf[A]
- private[swing] def toOption[A](o: Object): Option[A] = if(o eq null) None else Some(o.asInstanceOf[A])
+ private[swing] def ifNull [A](o: Object, a: A): A = if(o eq null) a else o.asInstanceOf[A]
+ private[swing] def toOption [A](o: Object): Option[A] = if(o eq null) None else Some(o.asInstanceOf[A])
+
private[swing] def toAnyRef(x: Any): AnyRef = x.asInstanceOf[AnyRef]
}