From dbf80520e30584c7836f9c7158d6c884ba14916b Mon Sep 17 00:00:00 2001 From: NAME Date: Mon, 21 Apr 2008 17:00:14 +0000 Subject: Joined alignments, resolved some issues with nu... Joined alignments, resolved some issues with null and Option --- src/swing/doc/README | 33 +++++++++++++++++++++++++++++++++ src/swing/scala/swing/Action.scala | 12 ++++++------ src/swing/scala/swing/Alignment.scala | 14 ++++++++++++++ src/swing/scala/swing/Frame.scala | 3 +++ src/swing/scala/swing/Icon.scala | 11 +++++++++++ src/swing/scala/swing/Label.scala | 8 ++++---- src/swing/scala/swing/ScrollPane.scala | 8 +++++--- src/swing/scala/swing/Swing.scala | 2 ++ src/swing/scala/swing/XAlignment.scala | 9 --------- src/swing/scala/swing/YAlignment.scala | 10 ---------- src/swing/swing.version.properties | 2 ++ 11 files changed, 80 insertions(+), 32 deletions(-) create mode 100644 src/swing/doc/README create mode 100644 src/swing/scala/swing/Alignment.scala create mode 100644 src/swing/scala/swing/Icon.scala delete mode 100644 src/swing/scala/swing/XAlignment.scala delete mode 100644 src/swing/scala/swing/YAlignment.scala create mode 100644 src/swing/swing.version.properties 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/Alignment.scala b/src/swing/scala/swing/Alignment.scala new file mode 100644 index 0000000000..848f7449c9 --- /dev/null +++ b/src/swing/scala/swing/Alignment.scala @@ -0,0 +1,14 @@ +package scala.swing + +import javax.swing.SwingConstants._ + +object Alignment extends Enumeration { + val Left = Value(LEFT) + val Right = Value(RIGHT) + + val Center = Value(CENTER) + + val Top = Value(TOP) + val Bottom = Value(BOTTOM) + //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/scala/swing/YAlignment.scala b/src/swing/scala/swing/YAlignment.scala deleted file mode 100644 index 9851511de1..0000000000 --- a/src/swing/scala/swing/YAlignment.scala +++ /dev/null @@ -1,10 +0,0 @@ -package scala.swing - -import javax.swing.SwingConstants._ - -object YAlignment extends Enumeration { - val Top = Value(TOP) - val Bottom = Value(BOTTOM) - val Center = Value(CENTER) - //1.6: val Baseline = Value(BASELINE) -} 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 -- cgit v1.2.3