summaryrefslogtreecommitdiff
path: root/src/swing
diff options
context:
space:
mode:
authorNAME <USER@epfl.ch>2008-04-21 17:00:14 +0000
committerNAME <USER@epfl.ch>2008-04-21 17:00:14 +0000
commitdbf80520e30584c7836f9c7158d6c884ba14916b (patch)
tree2284e0af2718aabf615246ac654065c2b8975ded /src/swing
parent1e5d8760f66e05a4a4d92d7d09986d881296daaf (diff)
downloadscala-dbf80520e30584c7836f9c7158d6c884ba14916b.tar.gz
scala-dbf80520e30584c7836f9c7158d6c884ba14916b.tar.bz2
scala-dbf80520e30584c7836f9c7158d6c884ba14916b.zip
Joined alignments, resolved some issues with nu...
Joined alignments, resolved some issues with null and Option
Diffstat (limited to 'src/swing')
-rw-r--r--src/swing/doc/README33
-rw-r--r--src/swing/scala/swing/Action.scala12
-rw-r--r--src/swing/scala/swing/Alignment.scala (renamed from src/swing/scala/swing/YAlignment.scala)8
-rw-r--r--src/swing/scala/swing/Frame.scala3
-rw-r--r--src/swing/scala/swing/Icon.scala11
-rw-r--r--src/swing/scala/swing/Label.scala8
-rw-r--r--src/swing/scala/swing/ScrollPane.scala8
-rw-r--r--src/swing/scala/swing/Swing.scala2
-rw-r--r--src/swing/scala/swing/XAlignment.scala9
-rw-r--r--src/swing/swing.version.properties2
10 files changed, 72 insertions, 24 deletions
diff --git a/src/swing/doc/README b/src/swing/doc/README
new file mode 100644
index 0000000000..df3565e276
--- /dev/null
+++ b/src/swing/doc/README
@@ -0,0 +1,33 @@
+scala.swing
+
+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. In a few places we decided
+to chose to depart from Java Swing's architecture. The main differences are:
+
+ In Java Swing all components are containers per default. This doesn't 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
+ 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
+ that it is 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
+
+
+The library comprises three main packages:
+
+ scala.swing
+ All essential widget classes and traits.
+
+ scala.swing.event
+ The event hierarchy.
+
+ scala.swing.test
+ A set of demos.
+
diff --git a/src/swing/scala/swing/Action.scala b/src/swing/scala/swing/Action.scala
index c4f099e9a9..e259ba748a 100644
--- a/src/swing/scala/swing/Action.scala
+++ b/src/swing/scala/swing/Action.scala
@@ -45,12 +45,12 @@ abstract class Action(title0: String) {
/**
* None if large icon and small icon are not equal.
*/
- def icon: Option[Icon] = smallIcon //if(largeIcon == smallIcon) largeIcon else None
- def icon_=(i: Option[Icon]) { /*largeIcon = i;*/ smallIcon = i }
- // 1.6: def largeIcon: Option[Icon] = toOption(peer.getValue(javax.swing.Action.LARGE_ICON_KEY))
- // def largeIcon_=(i: Option[Icon]) { peer.putValue(javax.swing.Action.LARGE_ICON_KEY, toNull(i)) }
- def smallIcon: Option[Icon] = toOption(peer.getValue(javax.swing.Action.SMALL_ICON))
- def smallIcon_=(i: Option[Icon]) { peer.putValue(javax.swing.Action.SMALL_ICON, toNull(i)) }
+ def icon: Icon = smallIcon //if(largeIcon == smallIcon) largeIcon else None
+ def icon_=(i: Icon) { /*largeIcon = i;*/ smallIcon = i }
+ // 1.6: def largeIcon: Icon = toNoIcon(peer.getValue(javax.swing.Action.LARGE_ICON_KEY).asInstanceOf[Icon])
+ // def largeIcon_=(i: Icon) { peer.putValue(javax.swing.Action.LARGE_ICON_KEY, toNullIcon(i)) }
+ def smallIcon: Icon = toNoIcon(peer.getValue(javax.swing.Action.SMALL_ICON).asInstanceOf[Icon])
+ def smallIcon_=(i: Icon) { peer.putValue(javax.swing.Action.SMALL_ICON, toNullIcon(i)) }
/**
* For all components.
diff --git a/src/swing/scala/swing/YAlignment.scala b/src/swing/scala/swing/Alignment.scala
index 9851511de1..848f7449c9 100644
--- a/src/swing/scala/swing/YAlignment.scala
+++ b/src/swing/scala/swing/Alignment.scala
@@ -2,9 +2,13 @@ package scala.swing
import javax.swing.SwingConstants._
-object YAlignment extends Enumeration {
+object Alignment extends Enumeration {
+ val Left = Value(LEFT)
+ val Right = Value(RIGHT)
+
+ val Center = Value(CENTER)
+
val Top = Value(TOP)
val Bottom = Value(BOTTOM)
- val Center = Value(CENTER)
//1.6: val Baseline = Value(BASELINE)
}
diff --git a/src/swing/scala/swing/Frame.scala b/src/swing/scala/swing/Frame.scala
index 4ee081cbd3..019c0f3925 100644
--- a/src/swing/scala/swing/Frame.scala
+++ b/src/swing/scala/swing/Frame.scala
@@ -17,6 +17,9 @@ class Frame(override val peer: JFrame) extends UIElement with RootPanel with Pub
}
def defaultButton: Option[PushButton] =
Swing.toOption(peer.getRootPane.getDefaultButton).map(Component.wrapperFor(_))
+ def defaultButton_=(b: PushButton) {
+ peer.getRootPane.setDefaultButton(b.peer)
+ }
def defaultButton_=(b: Option[PushButton]) {
peer.getRootPane.setDefaultButton(Swing.toNull(b.map(_.peer)))
}
diff --git a/src/swing/scala/swing/Icon.scala b/src/swing/scala/swing/Icon.scala
new file mode 100644
index 0000000000..2a794df29f
--- /dev/null
+++ b/src/swing/scala/swing/Icon.scala
@@ -0,0 +1,11 @@
+package scala.swing
+
+import javax.swing._
+
+object Icon {
+ case object Empty extends Icon {
+ def getIconHeight: Int = 0
+ def getIconWidth: Int = 0
+ def paintIcon(c: java.awt.Component, g: java.awt.Graphics, x: Int, y: Int) {}
+ }
+}
diff --git a/src/swing/scala/swing/Label.scala b/src/swing/scala/swing/Label.scala
index 2b48f9aff9..9ccca8ac84 100644
--- a/src/swing/scala/swing/Label.scala
+++ b/src/swing/scala/swing/Label.scala
@@ -13,8 +13,8 @@ class Label(override val peer: JLabel) extends Component(peer) {
/**
* The alignment of the label's contents relative to its bounding box.
*/
- def xAlignment: XAlignment.Value = XAlignment(peer.getHorizontalAlignment)
- def xAlignment_=(x: XAlignment.Value) = peer.setHorizontalAlignment(x.id)
- def yAlignment: YAlignment.Value = YAlignment(peer.getVerticalAlignment)
- def yAlignment_=(x: YAlignment.Value) = peer.setVerticalAlignment(x.id)
+ def xAlignment: Alignment.Value = Alignment(peer.getHorizontalAlignment)
+ def xAlignment_=(x: Alignment.Value) = peer.setHorizontalAlignment(x.id)
+ def yAlignment: Alignment.Value = Alignment(peer.getVerticalAlignment)
+ def yAlignment_=(x: Alignment.Value) = peer.setVerticalAlignment(x.id)
}
diff --git a/src/swing/scala/swing/ScrollPane.scala b/src/swing/scala/swing/ScrollPane.scala
index cea712f96c..f82e814ecb 100644
--- a/src/swing/scala/swing/ScrollPane.scala
+++ b/src/swing/scala/swing/ScrollPane.scala
@@ -13,8 +13,10 @@ class ScrollPane(override val peer: JScrollPane) extends Component(peer) with Co
List(Component.wrapperFor(peer.getViewport.getView.asInstanceOf[javax.swing.JComponent]))
def contents_=(c: Component) { peer.setViewportView(c.peer) }
- /*def rowHeaderView: Component = null
+ def rowHeaderView: Option[Component] = Swing.toOption(peer.getRowHeader.getView).map(Component.wrapperFor(_))
def rowHeaderView_=(c: Component) = peer.setRowHeaderView(c.peer)
- def viewportView: Component = null
- def viewportView_=(c: Component) = peer.setViewportView(c.peer)*/
+ def rowHeaderView_=(c: Option[Component]) = peer.setRowHeaderView(Swing.toNull(c.map(_.peer)))
+ def viewportView: Option[Component] = Swing.toOption(peer.getViewport.getView).map(Component.wrapperFor(_))
+ def viewportView_=(c: Component) = peer.setViewportView(c.peer)
+ def viewportView_=(c: Option[Component]) = peer.setViewportView(Swing.toNull(c.map(_.peer)))
}
diff --git a/src/swing/scala/swing/Swing.scala b/src/swing/scala/swing/Swing.scala
index 9196df5f91..2e48e26904 100644
--- a/src/swing/scala/swing/Swing.scala
+++ b/src/swing/scala/swing/Swing.scala
@@ -8,6 +8,8 @@ object Swing {
protected[swing] def ifNull[A](o: Object, a: A): A = if(o eq null) a else o.asInstanceOf[A]
protected[swing] def toOption[A](o: Object): Option[A] = if(o eq null) None else Some(o.asInstanceOf[A])
protected[swing] def toNull[A>:Null<:AnyRef](a: Option[A]): A = if(a == None) null else a.get
+ protected[swing] def toNoIcon(i: Icon): Icon = if(i == null) Icon.Empty else i
+ protected[swing] def toNullIcon(i: Icon): Icon = if(i == Icon.Empty) null else i
implicit def block2Runnable(block: =>Unit): Runnable = new Runnable {
override def run = block
diff --git a/src/swing/scala/swing/XAlignment.scala b/src/swing/scala/swing/XAlignment.scala
deleted file mode 100644
index 2129ea281a..0000000000
--- a/src/swing/scala/swing/XAlignment.scala
+++ /dev/null
@@ -1,9 +0,0 @@
-package scala.swing
-
-import javax.swing.SwingConstants._
-
-object XAlignment extends Enumeration {
- val Left = Value(LEFT)
- val Right = Value(RIGHT)
- val Center = Value(CENTER)
-}
diff --git a/src/swing/swing.version.properties b/src/swing/swing.version.properties
new file mode 100644
index 0000000000..dea0a2f4e9
--- /dev/null
+++ b/src/swing/swing.version.properties
@@ -0,0 +1,2 @@
+version.major=0
+version.minor=1 \ No newline at end of file