diff options
author | NAME <USER@epfl.ch> | 2008-04-21 13:00:40 +0000 |
---|---|---|
committer | NAME <USER@epfl.ch> | 2008-04-21 13:00:40 +0000 |
commit | d814e5047d99fe3cca56b8bdea1b6cf16b73f48b (patch) | |
tree | 2233b3765a91232600111d62320783a6d7a20867 | |
parent | d17ec3325ae0f61493dfce8a311dcde26f7011a4 (diff) | |
download | scala-d814e5047d99fe3cca56b8bdea1b6cf16b73f48b.tar.gz scala-d814e5047d99fe3cca56b8bdea1b6cf16b73f48b.tar.bz2 scala-d814e5047d99fe3cca56b8bdea1b6cf16b73f48b.zip |
scala.swing update for rc2
76 files changed, 737 insertions, 654 deletions
diff --git a/src/swing/scala/swing/Action.scala b/src/swing/scala/swing/Action.scala index 627d9468b9..c4f099e9a9 100644 --- a/src/swing/scala/swing/Action.scala +++ b/src/swing/scala/swing/Action.scala @@ -12,8 +12,12 @@ object Action { def action: Action def action_=(a: Action) - def hideActionText: Boolean - def hideActionText_=(b: Boolean) + //1.6: def hideActionText: Boolean + //def hideActionText_=(b: Boolean) + } + + def apply(title: String)(block: =>Unit) = new Action(title) { + def apply() { block } } } @@ -41,10 +45,10 @@ abstract class Action(title0: String) { /** * None if large icon and small icon are not equal. */ - def icon: Option[Icon] = if(largeIcon == smallIcon) largeIcon else None - def icon_=(i: Option[Icon]) { largeIcon = i; smallIcon = i } - 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 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)) } @@ -73,14 +77,15 @@ abstract class Action(title0: String) { java.awt.event.KeyEvent.VK_UNDEFINED) def mnemonic_=(m: Int) { peer.putValue(javax.swing.Action.MNEMONIC_KEY, m) } - /** + /*/** * Indicates which character of the title should be underlined to indicate the mnemonic key. * Ignored if out of bounds of the title string. Default: -1, i.e., ignored. * For all buttons and thus menu items. */ - def mnemonicIndex: Int = - ifNull(peer.getValue(javax.swing.Action.DISPLAYED_MNEMONIC_INDEX_KEY), -1) - def mnemonicIndex_=(n: Int) { peer.putValue(javax.swing.Action.DISPLAYED_MNEMONIC_INDEX_KEY, n) } + 1.6: def mnemonicIndex: Int = + ifNull(peer.getValue(javax.swing.Action.DISPLAYED_MNEMONIC_INDEX_KEY), -1) + def mnemonicIndex_=(n: Int) { peer.putValue(javax.swing.Action.DISPLAYED_MNEMONIC_INDEX_KEY, n) } + */ /** * For menus. @@ -97,14 +102,14 @@ abstract class Action(title0: String) { def enabled: Boolean = peer.isEnabled def enabled_=(b: Boolean) { peer.setEnabled(b) } - /** + /*/** * Only honored if not <code>None</code>. For various buttons. */ - def selected: Option[Boolean] = toOption(peer.getValue(javax.swing.Action.SELECTED_KEY)) - def selected_=(b: Option[Boolean]) { - peer.putValue(javax.swing.Action.SELECTED_KEY, - if (b == None) null else new java.lang.Boolean(b.get)) - } + 1.6: def selected: Option[Boolean] = toOption(peer.getValue(javax.swing.Action.SELECTED_KEY)) + def selected_=(b: Option[Boolean]) { + peer.putValue(javax.swing.Action.SELECTED_KEY, + if (b == None) null else new java.lang.Boolean(b.get)) + }*/ def apply() } diff --git a/src/swing/scala/swing/Applet.scala b/src/swing/scala/swing/Applet.scala index c80f8422dc..99c3c35c03 100644 --- a/src/swing/scala/swing/Applet.scala +++ b/src/swing/scala/swing/Applet.scala @@ -3,10 +3,12 @@ package scala.swing import javax.swing.JApplet /** - * Clients should implement the ui field. See the SimpleApplet demo for a sample. + * Clients should implement the ui field. See the SimpleApplet demo for an example. * * Note: Applet extends JApplet to satisfy Java's applet loading mechanism. * The usual component wrapping scheme doesn't work here. + * + * @see javax.swing.JApplet */ abstract class Applet extends JApplet { outer => val ui: UI @@ -17,8 +19,8 @@ abstract class Applet extends JApplet { outer => abstract class UI extends RootPanel { def peer = outer - override def content_=(c: Component) { - super.content_=(c) + override def contents_=(c: Component) { + super.contents_=(c) peer.validate() } diff --git a/src/swing/scala/swing/Border.scala b/src/swing/scala/swing/Border.scala new file mode 100644 index 0000000000..fef3481eeb --- /dev/null +++ b/src/swing/scala/swing/Border.scala @@ -0,0 +1,57 @@ +package scala.swing + +import java.awt.Color +import javax.swing.{Icon, BorderFactory} +import javax.swing.border._ + +/** + * @see javax.swing.BorderFactory + */ +object Border { + def Empty = BorderFactory.createEmptyBorder() + def Empty(top: Int, left: Int, bottom: Int, right: Int) = + BorderFactory.createEmptyBorder(top, left, bottom, right) + + def Line(c: Color) = BorderFactory.createLineBorder(c) + def Line(c: Color, weight: Int) = BorderFactory.createLineBorder(c, weight) + + def Beveled(kind: Embossing) = BorderFactory.createBevelBorder(kind.bevelPeer) + def Beveled(kind: Embossing, highlight: Color, shadow: Color) = + BorderFactory.createBevelBorder(kind.bevelPeer, highlight, shadow) + def Beveled(kind: Embossing, + highlightOuter: Color, highlightInner: Color, + shadowOuter: Color, shadowInner: Color) = + BorderFactory.createBevelBorder(kind.bevelPeer, + highlightOuter, highlightInner, + shadowOuter, shadowInner) + + sealed abstract class Embossing { + def bevelPeer: Int + def etchPeer: Int + } + case object Lowered extends Embossing { + def bevelPeer = BevelBorder.LOWERED + def etchPeer = EtchedBorder.LOWERED + } + case object Raised extends Embossing { + def bevelPeer = BevelBorder.RAISED + def etchPeer = EtchedBorder.RAISED + } + + def Etched = BorderFactory.createEtchedBorder() + def Etched(kind: Embossing) = + BorderFactory.createEtchedBorder(kind.etchPeer) + def Etched(kind: Embossing, highlight: Color, shadow: Color) = + BorderFactory.createEtchedBorder(kind.etchPeer, highlight, shadow) + + def Matte(top: Int, left: Int, bottom: Int, right: Int, color: Color) = + BorderFactory.createMatteBorder(top, left, bottom, right, color) + def Matte(top: Int, left: Int, bottom: Int, right: Int, icon: Icon) = + BorderFactory.createMatteBorder(top, left, bottom, right, icon) + + def Compound(outside: Border, inside: Border) = + BorderFactory.createCompoundBorder(outside, inside) + + def Titled(border: Border, title: String) = + BorderFactory.createTitledBorder(border, title) +}
\ No newline at end of file diff --git a/src/swing/scala/swing/BoxPanel.scala b/src/swing/scala/swing/BoxPanel.scala index 6520224f04..0c13489025 100644 --- a/src/swing/scala/swing/BoxPanel.scala +++ b/src/swing/scala/swing/BoxPanel.scala @@ -1,10 +1,11 @@ package scala.swing -class BoxPanel(orientation: Orientation) extends Panel with IndexedContainer { - override lazy val peer = { +/** + * @see javax.swing.BoxLayout + */ +class BoxPanel(orientation: Orientation.Value) extends Panel ({ val p = new javax.swing.JPanel - val l = new javax.swing.BoxLayout(p, orientation.peer) + val l = new javax.swing.BoxLayout(p, orientation.id) p.setLayout(l) p - } -} + }) with SequentialContainer.Wrapper diff --git a/src/swing/scala/swing/BufferAdapter.scala b/src/swing/scala/swing/BufferWrapper.scala index 4e0c4b9d09..de5b2b0b81 100644 --- a/src/swing/scala/swing/BufferAdapter.scala +++ b/src/swing/scala/swing/BufferWrapper.scala @@ -5,7 +5,7 @@ import scala.collection.mutable.Buffer /** * Default partial implementation for buffer adapters. */ -protected[swing] abstract class BufferAdapter[A] extends Buffer[A] { outer => +protected[swing] abstract class BufferWrapper[A] extends Buffer[A] { outer => def clear { for (i <- 0 to length) remove(0) } def update(n: Int, a: A) { remove(0) diff --git a/src/swing/scala/swing/ButtonMutex.scala b/src/swing/scala/swing/ButtonGroup.scala index 4edae73b9d..66fa8fe874 100644 --- a/src/swing/scala/swing/ButtonMutex.scala +++ b/src/swing/scala/swing/ButtonGroup.scala @@ -4,8 +4,10 @@ import javax.swing.{AbstractButton => JAbstractButton,Icon} import event._ import scala.collection._ - -class ButtonMutex(initialButtons: Button*) { +/** + * @see javax.swing.ButtonGroup + */ +class ButtonGroup(initialButtons: Button*) { val peer: javax.swing.ButtonGroup = new javax.swing.ButtonGroup val buttons: mutable.Set[Button] = new mutable.Set[Button] { @@ -21,7 +23,7 @@ class ButtonMutex(initialButtons: Button*) { } buttons ++= initialButtons - def deselectAll() { peer.clearSelection } - def selected: Option[Selectable] = buttons.find(_.selected) - def select(b: Selectable) { b.selected = true } + //1.6: def deselectAll() { peer.clearSelection } + def selected: Option[Button] = buttons.find(_.selected) + def select(b: Button) { peer.setSelected(b.peer.getModel, true) } } diff --git a/src/swing/scala/swing/Caret.scala b/src/swing/scala/swing/Caret.scala deleted file mode 100644 index 68e8b2c108..0000000000 --- a/src/swing/scala/swing/Caret.scala +++ /dev/null @@ -1,8 +0,0 @@ -package scala.swing; - -import javax.swing - -class Caret(val jcaret: swing.text.Caret) extends Publisher { - def dot: int = jcaret.getDot() - def mark: int = jcaret.getMark() -} diff --git a/src/swing/scala/swing/CheckBox.scala b/src/swing/scala/swing/CheckBox.scala index 7851c8c75d..92ebb93769 100644 --- a/src/swing/scala/swing/CheckBox.scala +++ b/src/swing/scala/swing/CheckBox.scala @@ -2,7 +2,10 @@ package scala.swing import javax.swing._ -class CheckBox(override val peer: JCheckBox) extends ToggleButton { +/** + * @see javax.swing.JCheckBox + */ +class CheckBox(override val peer: JCheckBox) extends ToggleButton(peer) { def this(txt: String) = this(new JCheckBox(txt)) def this() = this(new JCheckBox) }
\ No newline at end of file diff --git a/src/swing/scala/swing/Color.scala b/src/swing/scala/swing/Color.scala deleted file mode 100644 index b29f54e1dc..0000000000 --- a/src/swing/scala/swing/Color.scala +++ /dev/null @@ -1,5 +0,0 @@ -package scala.swing - -/*case class Color(r: Int, g: Int, b: Int) extends java.awt.Color(r, g, b) { - def this(col: java.awt.Color) = this(col.getRed, col.getGreen, col.getBlue) -}*/ diff --git a/src/swing/scala/swing/Component.scala b/src/swing/scala/swing/Component.scala index 85bb5866b1..8b3d85d05b 100644 --- a/src/swing/scala/swing/Component.scala +++ b/src/swing/scala/swing/Component.scala @@ -1,8 +1,8 @@ package scala.swing import event._ -import geometry._ +import java.awt.{Dimension, Point} import java.awt.event._ import javax.swing.JComponent import javax.swing.border.Border @@ -12,16 +12,19 @@ object Component { def wrapperFor[C<:Component](c: javax.swing.JComponent): C = c.getClientProperty(ClientKey).asInstanceOf[C] } -abstract class Component extends UIElement with Showable.Swing with Publisher { - lazy val peer: javax.swing.JComponent = new javax.swing.JComponent {} +/** + * @see javax.swing.JComponent + */ +abstract class Component(override val peer: javax.swing.JComponent) extends UIElement with Publisher { + def this() = this(new javax.swing.JComponent{}) peer.putClientProperty(Component.ClientKey, this) def minimumSize = peer.getMinimumSize - def minimumSize_=(x: Dimension) = peer.setMinimumSize(x.peer) + def minimumSize_=(x: Dimension) = peer.setMinimumSize(x) def maxiumumSize = peer.getMaximumSize - def maxiumumSize_=(x: Dimension) = peer.setMaximumSize(x.peer) + def maxiumumSize_=(x: Dimension) = peer.setMaximumSize(x) def preferredSize = peer.getPreferredSize - def preferredSize_=(x: Dimension) = peer.setPreferredSize(x.peer) + def preferredSize_=(x: Dimension) = peer.setPreferredSize(x) /** * Used by certain layout managers, e.g., BoxLayout or OverlayLayout to @@ -98,15 +101,15 @@ abstract class Component extends UIElement with Showable.Swing with Publisher { def mouseExited(e: java.awt.event.MouseEvent) { } def mouseClicked(e: java.awt.event.MouseEvent) { publish(MouseClicked(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]), - Point(e.getPoint), e.getModifiers, e.getClickCount, e.isPopupTrigger)) + e.getPoint, e.getModifiers, e.getClickCount, e.isPopupTrigger)) } def mousePressed(e: java.awt.event.MouseEvent) { publish(MousePressed(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]), - Point(e.getPoint), e.getModifiers, e.getClickCount, e.isPopupTrigger)) + e.getPoint, e.getModifiers, e.getClickCount, e.isPopupTrigger)) } def mouseReleased(e: java.awt.event.MouseEvent) { publish(MouseReleased(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]), - Point(e.getPoint), e.getModifiers, e.getClickCount, e.isPopupTrigger)) + e.getPoint, e.getModifiers, e.getClickCount, e.isPopupTrigger)) } }) } @@ -114,11 +117,11 @@ abstract class Component extends UIElement with Showable.Swing with Publisher { peer.addMouseListener(new MouseListener { def mouseEntered(e: java.awt.event.MouseEvent) { publish(MouseEntered(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]), - Point(e.getPoint), e.getModifiers)) + e.getPoint, e.getModifiers)) } def mouseExited(e: java.awt.event.MouseEvent) { publish(MouseExited(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]), - Point(e.getPoint), e.getModifiers)) + e.getPoint, e.getModifiers)) } def mouseClicked(e: java.awt.event.MouseEvent) {} def mousePressed(e: java.awt.event.MouseEvent) { } @@ -127,11 +130,11 @@ abstract class Component extends UIElement with Showable.Swing with Publisher { peer.addMouseMotionListener(new MouseMotionListener { def mouseMoved(e: java.awt.event.MouseEvent) { publish(MouseMoved(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]), - Point(e.getPoint), e.getModifiers)) + e.getPoint, e.getModifiers)) } def mouseDragged(e: java.awt.event.MouseEvent) { publish(MouseDragged(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]), - Point(e.getPoint), e.getModifiers)) + e.getPoint, e.getModifiers)) } }) } @@ -139,7 +142,7 @@ abstract class Component extends UIElement with Showable.Swing with Publisher { peer.addMouseWheelListener(new MouseWheelListener { def mouseWheelMoved(e: java.awt.event.MouseWheelEvent) { publish(MouseWheelMoved(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]), - Point(e.getPoint), e.getModifiers, e.getWheelRotation)) } + e.getPoint, e.getModifiers, e.getWheelRotation)) } }) } } @@ -164,5 +167,7 @@ abstract class Component extends UIElement with Showable.Swing with Publisher { } }) + def revalidate() { peer.revalidate() } + override def toString = "scala.swing wrapper " + peer.toString } diff --git a/src/swing/scala/swing/ComponentList.scala b/src/swing/scala/swing/ComponentList.scala index 31e48e65b1..99d431bf59 100644 --- a/src/swing/scala/swing/ComponentList.scala +++ b/src/swing/scala/swing/ComponentList.scala @@ -3,7 +3,7 @@ package scala.swing import javax.swing._ import event._ -class ComponentList(override val peer: JList) extends Component with Container with Publisher { +class ComponentList(override val peer: JList) extends Component(peer) with SequentialContainer.Wrapper with Publisher { def this() = this(new JList) def this(elems: Seq[Object]) = this(new JList(elems.toArray)) diff --git a/src/swing/scala/swing/Container.scala b/src/swing/scala/swing/Container.scala index 674fbee796..20ef0c0fed 100644 --- a/src/swing/scala/swing/Container.scala +++ b/src/swing/scala/swing/Container.scala @@ -3,33 +3,38 @@ package scala.swing import event._ import scala.collection.mutable.Buffer -trait Container extends Component { - protected val _contents = new Content - def contents: Seq[Component] = _contents +object Container { + trait Wrapper extends Component with Container { + protected val _contents = new Content + def contents: Seq[Component] = _contents - protected class Content extends BufferAdapter[Component] { - def wrap(c: java.awt.Component) = Component.wrapperFor(c.asInstanceOf[javax.swing.JComponent]) - override def clear { peer.removeAll() } - def remove(n: Int): Component = { - val c = peer.getComponent(n) - peer.remove(n) - wrap(c) + protected class Content extends BufferWrapper[Component] { + def wrap(c: java.awt.Component) = Component.wrapperFor(c.asInstanceOf[javax.swing.JComponent]) + override def clear { peer.removeAll() } + def remove(n: Int): Component = { + val c = peer.getComponent(n) + peer.remove(n) + wrap(c) + } + protected def insertAt(n: Int, c: Component) { peer.add(c.peer, n) } + def +=(c: Component) { peer.add(c.peer) } + def length = peer.getComponentCount + def apply(n: Int) = wrap(peer.getComponent(n)) } - protected def insertAt(n: Int, c: Component) { peer.add(c.peer, n) } - def +=(c: Component) { peer.add(c.peer) } - def length = peer.getComponentCount - def apply(n: Int) = wrap(peer.getComponent(n)) - } - peer.addContainerListener(new java.awt.event.ContainerListener { - def componentAdded(e: java.awt.event.ContainerEvent) { - publish(ComponentAdded(Container.this, - Component.wrapperFor(e.getChild.asInstanceOf[javax.swing.JComponent]))) - } - def componentRemoved(e: java.awt.event.ContainerEvent) { - publish(ComponentRemoved(Container.this, + peer.addContainerListener(new java.awt.event.ContainerListener { + def componentAdded(e: java.awt.event.ContainerEvent) { + publish(ComponentAdded(Wrapper.this, Component.wrapperFor(e.getChild.asInstanceOf[javax.swing.JComponent]))) - } - }) + } + def componentRemoved(e: java.awt.event.ContainerEvent) { + publish(ComponentRemoved(Wrapper.this, + Component.wrapperFor(e.getChild.asInstanceOf[javax.swing.JComponent]))) + } + }) + } } +trait Container extends UIElement { + def contents: Seq[Component] +}
\ No newline at end of file diff --git a/src/swing/scala/swing/EdgePosition.scala b/src/swing/scala/swing/EdgePosition.scala new file mode 100644 index 0000000000..5214857303 --- /dev/null +++ b/src/swing/scala/swing/EdgePosition.scala @@ -0,0 +1,10 @@ +package scala.swing + +import javax.swing.SwingConstants._ + +object EdgePosition extends Enumeration { + val Left = Value(LEFT) + val Right = Value(RIGHT) + val Top = Value(TOP) + val Bottom = Value(BOTTOM) +} diff --git a/src/swing/scala/swing/EditorComponent.scala b/src/swing/scala/swing/EditorComponent.scala deleted file mode 100644 index 0985a88cb8..0000000000 --- a/src/swing/scala/swing/EditorComponent.scala +++ /dev/null @@ -1,5 +0,0 @@ -package scala.swing - -trait EditorComponent extends Component { - val contentModified: Publisher -}
\ No newline at end of file diff --git a/src/swing/scala/swing/EmptyBorder.scala b/src/swing/scala/swing/EmptyBorder.scala deleted file mode 100644 index 41570fe4ab..0000000000 --- a/src/swing/scala/swing/EmptyBorder.scala +++ /dev/null @@ -1,10 +0,0 @@ -package scala.swing - -object EmptyBorder { - def apply(top: int, left: int, bottom: int, right: int) = - new javax.swing.border.EmptyBorder(top, left, bottom, right) - def apply() = new javax.swing.border.EmptyBorder(0, 0, 0, 0) -} - - - diff --git a/src/swing/scala/swing/FlowPanel.scala b/src/swing/scala/swing/FlowPanel.scala index 8842d2fcf6..08a5b7fa8f 100644 --- a/src/swing/scala/swing/FlowPanel.scala +++ b/src/swing/scala/swing/FlowPanel.scala @@ -12,10 +12,13 @@ object FlowPanel { } } -class FlowPanel(alignment: FlowPanel.Alignment.Value) extends Panel with IndexedContainer { +/** + * @see java.awt.FlowLayout + */ +class FlowPanel(override val peer: javax.swing.JPanel) extends Panel(peer) with SequentialContainer.Wrapper { + def this(alignment: FlowPanel.Alignment.Value) = this(new javax.swing.JPanel(new java.awt.FlowLayout(alignment.id))) def this() = this(FlowPanel.Alignment.Center) - override lazy val layoutManager = new java.awt.FlowLayout(alignment.id) - override lazy val peer = new javax.swing.JPanel(layoutManager) + private def layoutManager = peer.getLayout.asInstanceOf[java.awt.FlowLayout] def vGap: Int = layoutManager.getVgap def vGap_=(n: Int) { layoutManager.setVgap(n) } diff --git a/src/swing/scala/swing/FormattedTextField.scala b/src/swing/scala/swing/FormattedTextField.scala index 86cf35d0c6..e9658d27ca 100644 --- a/src/swing/scala/swing/FormattedTextField.scala +++ b/src/swing/scala/swing/FormattedTextField.scala @@ -1,9 +1,12 @@ -package scala.swing; +package scala.swing import javax.swing._ import java.awt.event._ import event._ -class FormattedTextField(val jftextfield: JFormattedTextField) extends TextComponent(jftextfield) { - def this(format: java.text.Format) = this(new JFormattedTextField(format)); +/** + * @see javax.swing.JFormattedTextField + */ +class FormattedTextField(override val peer: JFormattedTextField) extends TextComponent(peer) { + def this(format: java.text.Format) = this(new JFormattedTextField(format)) } diff --git a/src/swing/scala/swing/Frame.scala b/src/swing/scala/swing/Frame.scala index 9c75863881..4ee081cbd3 100644 --- a/src/swing/scala/swing/Frame.scala +++ b/src/swing/scala/swing/Frame.scala @@ -1,20 +1,26 @@ package scala.swing -import javax.swing.JFrame +import javax.swing._ import event._ -class Frame(val peer: JFrame) extends UIElement with RootPanel with Showable.Swing with Publisher { +/** + * @see javax.swing.JFrame + */ +class Frame(override val peer: JFrame) extends UIElement with RootPanel with Publisher { def this() = this(new JFrame) def title: String = peer.getTitle def title_=(s: String) = peer.setTitle(s) - content = new Component { opaque = false } - override def content_=(c: Component) { - super.content_=(c) + override def contents_=(c: Component) { + super.contents_=(c) peer.pack() // pack also validates, which is generally required after an add } - def defaultButton: PushButton = Component.wrapperFor(peer.getRootPane.getDefaultButton) - def defaultButton_=(b: PushButton) { peer.getRootPane.setDefaultButton(b.peer) } + def defaultButton: Option[PushButton] = + Swing.toOption(peer.getRootPane.getDefaultButton).map(Component.wrapperFor(_)) + def defaultButton_=(b: Option[PushButton]) { + peer.getRootPane.setDefaultButton(Swing.toNull(b.map(_.peer))) + } + def pack(): this.type = { peer.pack(); this } def menuBar: MenuBar = Component.wrapperFor(peer.getJMenuBar) diff --git a/src/swing/scala/swing/GUIApplication.scala b/src/swing/scala/swing/GUIApplication.scala index f629a59efa..e008b5422d 100644 --- a/src/swing/scala/swing/GUIApplication.scala +++ b/src/swing/scala/swing/GUIApplication.scala @@ -4,17 +4,14 @@ import javax.swing._ import event.Event class GUIApplication { - - type Reaction = PartialFunction[Event, unit] - - def defaultLookAndFeelDecorated: boolean = true + //def defaultLookAndFeelDecorated: Boolean = true def init() = { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) - JFrame.setDefaultLookAndFeelDecorated(defaultLookAndFeelDecorated) + //UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) + //JFrame.setDefaultLookAndFeelDecorated(defaultLookAndFeelDecorated) } - def run(prog: => unit): unit = + def run(prog: => Unit): Unit = SwingUtilities.invokeLater { new Runnable() { def run() = { init(); prog } diff --git a/src/swing/scala/swing/GridBagPanel.scala b/src/swing/scala/swing/GridBagPanel.scala index 874ad36840..44e0e774f4 100644 --- a/src/swing/scala/swing/GridBagPanel.scala +++ b/src/swing/scala/swing/GridBagPanel.scala @@ -2,6 +2,7 @@ package scala.swing import java.awt.{Insets, GridBagConstraints} + object GridBagPanel { object Fill extends Enumeration { val None = Value(GridBagConstraints.NONE) @@ -31,11 +32,15 @@ object GridBagPanel { } } -class GridBagPanel extends Panel with LayoutContainer { +/** + * @see java.awt.GridBagLayout + */ +class GridBagPanel(override val peer: javax.swing.JPanel) extends Panel(peer) with LayoutContainer { import GridBagPanel._ - override lazy val layoutManager = new java.awt.GridBagLayout - override lazy val peer = new javax.swing.JPanel(layoutManager) + def this() = this(new javax.swing.JPanel(new java.awt.GridBagLayout)) + + private def layoutManager = peer.getLayout.asInstanceOf[java.awt.GridBagLayout] class Constraints(val peer: GridBagConstraints) extends Proxy { def self = peer diff --git a/src/swing/scala/swing/GridPanel.scala b/src/swing/scala/swing/GridPanel.scala index 799e52d9ae..9c8e246c20 100644 --- a/src/swing/scala/swing/GridPanel.scala +++ b/src/swing/scala/swing/GridPanel.scala @@ -4,9 +4,12 @@ object GridPanel { val Adapt = 0 } -class GridPanel(rows0: Int, cols0: Int) extends Panel with IndexedContainer { - override lazy val layoutManager = new java.awt.GridLayout(rows0, cols0) - override lazy val peer = new javax.swing.JPanel(layoutManager) +/** + * @see java.awt.GridLayout + */ +class GridPanel(override val peer: javax.swing.JPanel) extends Panel(peer) with SequentialContainer.Wrapper { + def this(rows0: Int, cols0: Int) = this(new javax.swing.JPanel(new java.awt.GridLayout(rows0, cols0))) + private def layoutManager = peer.getLayout.asInstanceOf[java.awt.GridLayout] def rows: Int = layoutManager.getRows def rows_=(n: Int) { layoutManager.setRows(n) } diff --git a/src/swing/scala/swing/IndexedContainer.scala b/src/swing/scala/swing/IndexedContainer.scala deleted file mode 100644 index dd38479c17..0000000000 --- a/src/swing/scala/swing/IndexedContainer.scala +++ /dev/null @@ -1,8 +0,0 @@ -package scala.swing - -import scala.collection.mutable.Buffer - -trait IndexedContainer extends Container { - override val contents: Buffer[Component] = new Content - def contents_=(c: Component*) { contents.clear(); contents ++= c } -} diff --git a/src/swing/scala/swing/Label.scala b/src/swing/scala/swing/Label.scala index 34ef214d20..2b48f9aff9 100644 --- a/src/swing/scala/swing/Label.scala +++ b/src/swing/scala/swing/Label.scala @@ -2,7 +2,10 @@ package scala.swing import javax.swing._ -class Label(override val peer: JLabel) extends Component { +/** + * @see javax.swing.JLabel + */ +class Label(override val peer: JLabel) extends Component(peer) { def this(txt: String) = this(new JLabel(txt)) def this() = this("") def text: String = peer.getText() @@ -10,8 +13,8 @@ class Label(override val peer: JLabel) extends Component { /** * The alignment of the label's contents relative to its bounding box. */ - def xAlignment: XAlignment = XAlignment.wrap(peer.getHorizontalAlignment) - def xAlignment_=(x: XAlignment) = peer.setHorizontalAlignment(x.peer) - def yAlignment: YAlignment = YAlignment.wrap(peer.getVerticalAlignment) - def yAlignment_=(x: YAlignment) = peer.setVerticalAlignment(x.peer) + 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) } diff --git a/src/swing/scala/swing/LayoutContainer.scala b/src/swing/scala/swing/LayoutContainer.scala index 46cc0e2c10..f7982b27ef 100644 --- a/src/swing/scala/swing/LayoutContainer.scala +++ b/src/swing/scala/swing/LayoutContainer.scala @@ -3,7 +3,11 @@ package scala.swing import javax.swing.JComponent import scala.collection.mutable.Map -trait LayoutContainer extends Container { +/** + * A container that associates layout constraints with its children. + * See GridBagPanel for an example. + */ +trait LayoutContainer extends Container.Wrapper { type Constraints <: { def peer: AnyRef } protected def constraintsFor(c: Component): Constraints def layout: Map[Component, Constraints] = new Map[Component, Constraints] { diff --git a/src/swing/scala/swing/Menu.scala b/src/swing/scala/swing/Menu.scala index fdb75229c1..294a512f4e 100644 --- a/src/swing/scala/swing/Menu.scala +++ b/src/swing/scala/swing/Menu.scala @@ -3,8 +3,11 @@ package scala.swing import scala.collection.mutable._ import javax.swing._ -class MenuBar extends IndexedContainer { - override lazy val peer = new JMenuBar +/** + * @see javax.swing.JMenuBar + */ +class MenuBar(override val peer: JMenuBar) extends Component(peer) with SequentialContainer.Wrapper { + def this() = this(new JMenuBar) def menus: Seq[Menu] = contents.filter(_.isInstanceOf[Menu]).map(_.asInstanceOf[Menu]) @@ -19,22 +22,33 @@ class MenuBar extends IndexedContainer { def subElements: Seq[MenuElement] = peer.getSubElements.map(Component.wrapperFor(_)) }*/ -class MenuItem(val title: String) extends Button { +/** + * @see javax.swing.JMenuItem + */ +class MenuItem(override val peer: JMenuItem) extends Button(peer) { + def this(title: String) = this(new JMenuItem(title)) def this(a: Action) = { this("") action = a } - override lazy val peer = new JMenuItem(title) } -class Menu(title: String) extends MenuItem(title) with IndexedContainer { self: Menu => - override lazy val peer = new JMenu(title) +/** + * @see javax.swing.JMenu + */ +class Menu(override val peer: JMenu) extends MenuItem(peer) with SequentialContainer.Wrapper { self: Menu => + def this(title: String) = this(new JMenu(title)) } -class RadioMenuItem(title: String) extends MenuItem(title) { - override lazy val peer = new JRadioButtonMenuItem(title) +/** + * @see javax.swing.JRadioButtonMenuItem + */ +class RadioMenuItem(override val peer: JRadioButtonMenuItem) extends MenuItem(peer) { + def this(title: String) = this(new JRadioButtonMenuItem(title)) } - -class CheckMenuItem(title: String) extends MenuItem(title) { - override lazy val peer = new JCheckBoxMenuItem(title) +/** + * @see javax.swing.JCheckBoxMenuItem + */ +class CheckMenuItem(override val peer: JCheckBoxMenuItem) extends MenuItem(peer) { + def this(title: String) = this(new JCheckBoxMenuItem(title)) }
\ No newline at end of file diff --git a/src/swing/scala/swing/Orientable.scala b/src/swing/scala/swing/Orientable.scala new file mode 100644 index 0000000000..a4fc0126d0 --- /dev/null +++ b/src/swing/scala/swing/Orientable.scala @@ -0,0 +1,5 @@ +package scala.swing + +trait Orientable extends Oriented { + def orientation_=(o: Orientation.Value) { peer.setOrientation(o.id) } +} diff --git a/src/swing/scala/swing/Orientation.scala b/src/swing/scala/swing/Orientation.scala index dd38056ccb..6657155340 100644 --- a/src/swing/scala/swing/Orientation.scala +++ b/src/swing/scala/swing/Orientation.scala @@ -1,60 +1,8 @@ package scala.swing import javax.swing.SwingConstants._ -import javax.swing.JTabbedPane -object Orientation { - def wrap(n: Int): Orientation = n match { - case HORIZONTAL => Horizontal - case VERTICAL => Vertical - } +object Orientation extends Enumeration { + val Horizontal = Value(HORIZONTAL) + val Vertical = Value(VERTICAL) } -sealed trait Orientation { def peer: Int } -case object Horizontal extends Orientation { def peer = HORIZONTAL } -case object Vertical extends Orientation { def peer = VERTICAL } - -object Edge { - def wrap(n: Int): Edge = n match { - case LEFT => Left - case RIGHT => Right - case TOP => Top - case BOTTOM => Bottom - } -} - -sealed trait Edge { - def peer: Int -} - -object XAlignment { - def wrap(n: Int): XAlignment = n match { - case LEFT => Left - case RIGHT => Right - case CENTER => Center - } -} -sealed trait XAlignment { def peer: Int } - -object YAlignment { - def wrap(n: Int): YAlignment = n match { - case TOP => Top - case BOTTOM => Bottom - case CENTER => Center - //case BASELINE => Baseline - } -} -sealed trait YAlignment { def peer: Int } -case object Left extends XAlignment with Edge { def peer = LEFT } -case object Right extends XAlignment with Edge { def peer = RIGHT } -case object Top extends YAlignment with Edge { def peer = TOP } -//case object Baseline extends YAlignment { def peer = BASELINE } -case object Bottom extends YAlignment with Edge { def peer = BOTTOM } -case object Center extends XAlignment with YAlignment { def peer = CENTER } - -/*object Orientation extends Enumeration { - val Left = Value(LEFT, "left") - val Right = Value(RIGHT, "right") - val Bottom = Value(BOTTOM, "bottom") - val Top = Value(TOP, "top") - val Center = Value(CENTER, "center") -}*/ diff --git a/src/swing/scala/swing/Oriented.scala b/src/swing/scala/swing/Oriented.scala index 39e2b0ba2a..7efa61d615 100644 --- a/src/swing/scala/swing/Oriented.scala +++ b/src/swing/scala/swing/Oriented.scala @@ -5,9 +5,5 @@ trait Oriented { def getOrientation(): Int def setOrientation(n: Int) } - def orientation: Orientation = Orientation.wrap(peer.getOrientation) -} - -trait Orientable extends Oriented { - def orientation_=(o: Orientation) { peer.setOrientation(o.peer) } + def orientation: Orientation.Value = Orientation(peer.getOrientation) } diff --git a/src/swing/scala/swing/Panel.scala b/src/swing/scala/swing/Panel.scala index 5ff6cef0e3..b0a85b8f0e 100644 --- a/src/swing/scala/swing/Panel.scala +++ b/src/swing/scala/swing/Panel.scala @@ -1,7 +1,6 @@ package scala.swing -abstract class Panel extends Container { - override lazy val peer: javax.swing.JPanel = new javax.swing.JPanel - - def layoutManager: java.awt.LayoutManager = peer.getLayout -} +/** + * @see javax.swing.JPanel + */ +abstract class Panel(override val peer: javax.swing.JPanel) extends Component(peer) with Container.Wrapper diff --git a/src/swing/scala/swing/ProgressBar.scala b/src/swing/scala/swing/ProgressBar.scala index db80035058..c43b4f523c 100644 --- a/src/swing/scala/swing/ProgressBar.scala +++ b/src/swing/scala/swing/ProgressBar.scala @@ -2,7 +2,10 @@ package scala.swing import event._ -class ProgressBar(override val peer: javax.swing.JProgressBar) extends Component with Orientable { +/** + * @see javax.swing.JProgressBar + */ +class ProgressBar(override val peer: javax.swing.JProgressBar) extends Component(peer) with Orientable { def this() = this(new javax.swing.JProgressBar) def min: Int = peer.getMinimum diff --git a/src/swing/scala/swing/PushButton.scala b/src/swing/scala/swing/PushButton.scala index 54b75e6a39..39a1bc0dc7 100644 --- a/src/swing/scala/swing/PushButton.scala +++ b/src/swing/scala/swing/PushButton.scala @@ -3,8 +3,10 @@ package scala.swing import javax.swing._ import event._ -/** A class for buttons; standard constructor wraps around a swing button */ -class PushButton(override val peer: JButton) extends Button with Publisher { +/** + * @see javax.swing.JButton + */ +class PushButton(override val peer: JButton) extends Button(peer) with Publisher { def this(txt: String) = this(new JButton(txt)) def this() = this("") def this(a: Action) = { diff --git a/src/swing/scala/swing/RadioButton.scala b/src/swing/scala/swing/RadioButton.scala index 4b0cd50087..b2d37a71e4 100644 --- a/src/swing/scala/swing/RadioButton.scala +++ b/src/swing/scala/swing/RadioButton.scala @@ -2,7 +2,10 @@ package scala.swing import javax.swing._ +/** + * @see javax.swing.JRadioButton + */ class RadioButton(override val peer: JRadioButton) extends ToggleButton(peer) { - def this(txt: String) = this(new JRadioButton(txt)) + def this(text: String) = this(new JRadioButton(text)) def this() = this(new JRadioButton) }
\ No newline at end of file diff --git a/src/swing/scala/swing/RootPanel.scala b/src/swing/scala/swing/RootPanel.scala index c6480fa403..95fa5ef140 100644 --- a/src/swing/scala/swing/RootPanel.scala +++ b/src/swing/scala/swing/RootPanel.scala @@ -1,15 +1,22 @@ package scala.swing -trait RootPanel { self: Object { def peer: java.awt.Component with javax.swing.RootPaneContainer } => - content = new Component {} - def content: Component = { - if (peer.getContentPane.getComponentCount == 0) new Component {} +/** + * @see javax.swing.RootPaneContainer + */ +trait RootPanel extends Container { + def peer: java.awt.Component with javax.swing.RootPaneContainer + //contents = new Component { opaque = false } + def contents: Seq[Component] = { + Swing.toOption(peer.getContentPane.getComponent(0)).map { c => + Component.wrapperFor(c.asInstanceOf[javax.swing.JComponent]) + }.toList + /*if (peer.getContentPane.getComponentCount == 0) Nil else { val c = peer.getContentPane.getComponent(0) - Component.wrapperFor(c.asInstanceOf[javax.swing.JComponent]) - } + ListComponent.wrapperFor(c.asInstanceOf[javax.swing.JComponent]) + }*/ } - def content_=(c: Component) { + def contents_=(c: Component) { if (peer.getContentPane.getComponentCount > 0) { val old = peer.getContentPane.getComponent(0) peer.getContentPane.remove(old) diff --git a/src/swing/scala/swing/ScrollPane.scala b/src/swing/scala/swing/ScrollPane.scala index 4f54e93520..cea712f96c 100644 --- a/src/swing/scala/swing/ScrollPane.scala +++ b/src/swing/scala/swing/ScrollPane.scala @@ -2,12 +2,19 @@ package scala.swing import javax.swing.JScrollPane -class ScrollPane(override val peer: JScrollPane) extends Component with Publisher { +/** + * @see javax.swing.JScrollPane + */ +class ScrollPane(override val peer: JScrollPane) extends Component(peer) with Container { def this() = this(new JScrollPane) def this(contents: Component) = this(new JScrollPane(contents.peer)) - def rowHeaderView: Component = null + def contents: Seq[Component] = + List(Component.wrapperFor(peer.getViewport.getView.asInstanceOf[javax.swing.JComponent])) + def contents_=(c: Component) { peer.setViewportView(c.peer) } + + /*def rowHeaderView: Component = null def rowHeaderView_=(c: Component) = peer.setRowHeaderView(c.peer) def viewportView: Component = null - def viewportView_=(c: Component) = peer.setViewportView(c.peer) + def viewportView_=(c: Component) = peer.setViewportView(c.peer)*/ } diff --git a/src/swing/scala/swing/Scrollable.scala b/src/swing/scala/swing/Scrollable.scala index d5ffe636b6..73be856459 100644 --- a/src/swing/scala/swing/Scrollable.scala +++ b/src/swing/scala/swing/Scrollable.scala @@ -1,7 +1,10 @@ package scala.swing -import geometry._ +import java.awt.Rectangle +/** + * @see javax.swing.Scrollable + */ trait Scrollable extends Component { protected def scrollablePeer: javax.swing.Scrollable def preferredViewportSize = scrollablePeer.getPreferredScrollableViewportSize @@ -9,9 +12,9 @@ trait Scrollable extends Component { def tracksViewportHeight: Boolean = scrollablePeer.getScrollableTracksViewportHeight def tracksViewportWidth: Boolean = scrollablePeer.getScrollableTracksViewportWidth - def blockIncrement(visibleRect: Rectangle, orientation: Orientation, direction: Int): Int = - scrollablePeer.getScrollableBlockIncrement(visibleRect.peer, orientation.peer, direction) + def blockIncrement(visibleRect: Rectangle, orientation: Orientation.Value, direction: Int): Int = + scrollablePeer.getScrollableBlockIncrement(visibleRect, orientation.id, direction) - def unitIncrement(visibleRect: Rectangle, orientation: Orientation, direction: Int): Int = - scrollablePeer.getScrollableUnitIncrement(visibleRect.peer, orientation.peer, direction) + def unitIncrement(visibleRect: Rectangle, orientation: Orientation.Value, direction: Int): Int = + scrollablePeer.getScrollableUnitIncrement(visibleRect, orientation.id, direction) } diff --git a/src/swing/scala/swing/Selectable.scala b/src/swing/scala/swing/Selectable.scala deleted file mode 100644 index 38b86efb60..0000000000 --- a/src/swing/scala/swing/Selectable.scala +++ /dev/null @@ -1,11 +0,0 @@ -package scala.swing - -trait Selectable { - def peer: javax.swing.JComponent { - def setSelected(b: Boolean) - def isSelected(): Boolean - } - - def selected: Boolean = peer.isSelected - def selected_=(b: Boolean) = peer.setSelected(b) -} diff --git a/src/swing/scala/swing/Separator.scala b/src/swing/scala/swing/Separator.scala index 3be204a49f..7f6fdb8d41 100644 --- a/src/swing/scala/swing/Separator.scala +++ b/src/swing/scala/swing/Separator.scala @@ -5,6 +5,6 @@ import javax.swing._ /** * @see javax.swing.JSeparator */ -class Separator extends Component with Oriented { - override lazy val peer = new JSeparator +class Separator(override val peer: JSeparator) extends Component(peer) with Oriented { + def this() = this(new JSeparator) } diff --git a/src/swing/scala/swing/SequentialContainer.scala b/src/swing/scala/swing/SequentialContainer.scala new file mode 100644 index 0000000000..333c0b1969 --- /dev/null +++ b/src/swing/scala/swing/SequentialContainer.scala @@ -0,0 +1,15 @@ +package scala.swing + +import scala.collection.mutable.Buffer + +object SequentialContainer { + trait Wrapper extends Component with SequentialContainer with Container.Wrapper { + override val contents: Buffer[Component] = new Content + def contents_=(c: Component*) { contents.clear(); contents ++= c } + } +} + +trait SequentialContainer extends Container { + override def contents: Buffer[Component] + def contents_=(c: Component*) +} diff --git a/src/swing/scala/swing/Showable.scala b/src/swing/scala/swing/Showable.scala deleted file mode 100644 index 7435d2dc0c..0000000000 --- a/src/swing/scala/swing/Showable.scala +++ /dev/null @@ -1,12 +0,0 @@ -package scala.swing - -object Showable { - trait Swing extends Showable { - def peer: { def setVisible(b: Boolean) } - def show(): this.type = { peer.setVisible(true); this } - } -} - -trait Showable { - def show(): this.type -} diff --git a/src/swing/scala/swing/SimpleGUIApplication.scala b/src/swing/scala/swing/SimpleGUIApplication.scala index 8995852b79..b341a16e0e 100644 --- a/src/swing/scala/swing/SimpleGUIApplication.scala +++ b/src/swing/scala/swing/SimpleGUIApplication.scala @@ -7,9 +7,7 @@ abstract class SimpleGUIApplication extends GUIApplication { def main(args: Array[String]) = { SwingUtilities.invokeLater { - new Runnable { def run() { init(); top.pack().show() } } + new Runnable { def run() { init(); top.pack(); top.visible = true } } } } - - implicit def string2label(s: String): Label = new Label(s) } diff --git a/src/swing/scala/swing/Slider.scala b/src/swing/scala/swing/Slider.scala index 0c0e4894a8..bc0ddd2d85 100644 --- a/src/swing/scala/swing/Slider.scala +++ b/src/swing/scala/swing/Slider.scala @@ -3,7 +3,10 @@ package scala.swing import event._ import Swing._ -class Slider(override val peer: javax.swing.JSlider) extends Component with Orientable with EditorComponent { +/** + * @see javax.swing.JSlider + */ +class Slider(override val peer: javax.swing.JSlider) extends Component(peer) with Orientable with Publisher { def this() = this(new javax.swing.JSlider) def min: Int = peer.getMinimum @@ -38,7 +41,9 @@ class Slider(override val peer: javax.swing.JSlider) extends Component with Orie peer.setLabelTable(table) } - lazy val contentModified = new Publisher { - peer.addChangeListener { ChangeListener( e => publish(ContentModified(Slider.this))) } - } + peer.addChangeListener(new javax.swing.event.ChangeListener { + def stateChanged(e: javax.swing.event.ChangeEvent) { + publish(ValueChanged(Slider.this, peer.getValueIsAdjusting)) + } + }) }
\ No newline at end of file diff --git a/src/swing/scala/swing/SplitPane.scala b/src/swing/scala/swing/SplitPane.scala new file mode 100644 index 0000000000..a78dfd9840 --- /dev/null +++ b/src/swing/scala/swing/SplitPane.scala @@ -0,0 +1,44 @@ +package scala.swing + +import event._ +import Swing._ + +/** + * @see javax.swing.JSplitPane + */ +class SplitPane(override val peer: javax.swing.JSplitPane) extends Component(peer) with Container with Orientable { + def this(o: Orientation.Value) = this(new javax.swing.JSplitPane(o.id)) + + leftComponent = new Component {} + rightComponent = new Component {} + + def contents: Seq[Component] = List(leftComponent, rightComponent) + def contents_=(left: Component, right: Component) { + peer.setLeftComponent(left.peer) + peer.setRightComponent(right.peer) + } + + def topComponent: Component = Component.wrapperFor(peer.getTopComponent.asInstanceOf[javax.swing.JComponent]) + def topComponent_=(c: Component) { peer.setTopComponent(c.peer) } + def bottomComponent: Component = Component.wrapperFor(peer.getBottomComponent.asInstanceOf[javax.swing.JComponent]) + def bottomComponent_=(c: Component) { peer.setBottomComponent(c.peer) } + + def leftComponent: Component = topComponent + def leftComponent_=(c: Component) { topComponent = c } + def rightComponent: Component = bottomComponent + def rightComponent_=(c: Component) { bottomComponent = c } + + def dividerLocation: Int = peer.getDividerLocation + def dividerLocation_=(n: Int) { peer.setDividerLocation(n) } + def dividerSize: Int = peer.getDividerSize + def dividerSize_=(n: Int) { peer.setDividerSize(n) } + def resizeWeight: Double = peer.getResizeWeight + def resizeWeight_=(n: Double) { peer.setResizeWeight(n) } + + def resetToPreferredSizes() { peer.resetToPreferredSizes() } + + def oneTouchExpandable: Boolean = peer.isOneTouchExpandable + def oneTouchExpandable_=(b: Boolean) { peer.setOneTouchExpandable(b) } + def continuousLayout: Boolean = peer.isContinuousLayout + def continuousLayout_=(b: Boolean) { peer.setContinuousLayout(b) } +}
\ No newline at end of file diff --git a/src/swing/scala/swing/Spreadsheet.scala b/src/swing/scala/swing/Spreadsheet.scala deleted file mode 100644 index 9c175b1f3f..0000000000 --- a/src/swing/scala/swing/Spreadsheet.scala +++ /dev/null @@ -1,100 +0,0 @@ -package scala.swing - -import javax.swing.table.{AbstractTableModel, TableCellRenderer} -import javax.swing.event.{TableModelListener, TableModelEvent} -import javax.swing._ -import event._ - -/*class Spreadsheet(width: Int, height: Int) extends Component with SwingComponent with Publisher { - - - def showGrid: Boolean = acomponent.table.getShowHorizontalLines && acomponent.table.getShowVerticalLines - def showGrid_=(x: Boolean) = acomponent.table.setShowGrid(x) - - case class SpreadsheetCell(var userData: String, var displayData: String) - - val data = model.Matrix[SpreadsheetCell](SpreadsheetCell("", ""), width, height) - - val acomponent = new JScrollPane { - setPreferredSize(new java.awt.Dimension(800, 600)) - val table = new JTable { - setSelectionModel(new DefaultListSelectionModel) - setAutoResizeMode(JTable.AUTO_RESIZE_OFF) - setRowHeight(25) - val model = new AbstractTableModel { model => - class UserDataEvent(col: Int, row: Int) extends TableModelEvent(model, row, row, col) - val getRowCount = height - val getColumnCount = width - def getValueAt(row: Int, col: Int) = - data(col, row).userData - override def setValueAt(value: AnyRef, row: Int, col: Int) = { - data(col, row).userData = value.toString - fireTableChanged(new UserDataEvent(col, row)) - } - def setDisplayValueAt(value: AnyRef, row: Int, col: Int) = { - data(col, row).displayData = value.toString - fireTableCellUpdated(row, col) - } - override def isCellEditable(row: Int, col: Int) = true - addTableModelListener(new TableModelListener { - def tableChanged(event: TableModelEvent) = event match { - case de:UserDataEvent => - publish(CellModified(event.getColumn, event.getFirstRow, data(event.getColumn, event.getFirstRow).userData)) - case _ => - } - }) - } - setModel(model) - setDefaultRenderer(classOf[AnyRef], new TableCellRenderer { - def getTableCellRendererComponent(table: JTable, value: AnyRef, selected: Boolean, focus: Boolean, row: Int, col: Int) = - if (focus) new JTextField { - setText(data(col, row).userData) - } - else new JLabel { - setText(data(col, row).displayData) - } - }) - getTableHeader.setReorderingAllowed(false) - getTableHeader.setResizingAllowed(false) - } - setViewportView(table) - setColumnHeaderView(table.getTableHeader) - setRowHeaderView(new JList { - setListData(((1 to height) map (_.toString)).toArray.asInstanceOf[Array[Object]]) - setFixedCellWidth(50) - setCellRenderer(new JLabel with ListCellRenderer { - setOpaque(true) - setBorder(UIManager.getBorder("TableHeader.cellBorder")) - setHorizontalAlignment(SwingConstants.CENTER) - setForeground(table.getTableHeader.getForeground) - setBackground(table.getTableHeader.getBackground) - setFont(table.getTableHeader.getFont) - def getListCellRendererComponent(list: JList, value: AnyRef, index: Int, isSelected: Boolean, cellHasFocus: Boolean) = { - setPreferredSize(new Dimension(50, table.getRowHeight(index))) - setText(value.toString) - this - } - }) - }) - def corner = new JLabel{ - setOpaque(true) - setBorder(UIManager.getBorder("TableHeader.cellBorder")) - setForeground(table.getTableHeader.getForeground) - setBackground(table.getTableHeader.getBackground) - } - setCorner(ScrollPaneConstants.UPPER_LEFT_CORNER, corner) - setCorner(ScrollPaneConstants.UPPER_RIGHT_CORNER, corner) - setCorner(ScrollPaneConstants.LOWER_LEFT_CORNER, corner) - setCorner(ScrollPaneConstants.UPPER_RIGHT_CORNER, corner) - } - - def update(col: Int, row: Int, value: Any) = { - acomponent.table.model.setDisplayValueAt(value.toString, row, col) - } -// SwingUtilities.invokeLater(new Runnable { -// def run = acomponent.table.model.setDisplayValueAt(value.toString, row, col) -// }) - - def apply(pos: (Int, Int)) = data(pos._1, pos._2).userData - -}*/ diff --git a/src/swing/scala/swing/Swing.scala b/src/swing/scala/swing/Swing.scala index f1dcfc7ebb..9196df5f91 100644 --- a/src/swing/scala/swing/Swing.scala +++ b/src/swing/scala/swing/Swing.scala @@ -1,13 +1,13 @@ package scala.swing -import geometry._ +import java.awt.Dimension import javax.swing._ import javax.swing.event._ 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]): Object = if(a == None) null else a.get + protected[swing] def toNull[A>:Null<:AnyRef](a: Option[A]): A = if(a == None) null else a.get implicit def block2Runnable(block: =>Unit): Runnable = new Runnable { override def run = block @@ -17,7 +17,7 @@ object Swing { } def Box(min: Dimension, pref: Dimension, max: Dimension) = new Component { - override lazy val peer = new javax.swing.Box.Filler(min.peer, pref.peer, max.peer) + override lazy val peer = new javax.swing.Box.Filler(min, pref, max) } def HGlue = new Component { override lazy val peer = javax.swing.Box.createHorizontalGlue.asInstanceOf[JComponent] @@ -29,7 +29,7 @@ object Swing { override lazy val peer = javax.swing.Box.createGlue.asInstanceOf[JComponent] } def RigidBox(dim: Dimension) = new Component { - override lazy val peer = javax.swing.Box.createRigidArea(dim.peer).asInstanceOf[JComponent] + override lazy val peer = javax.swing.Box.createRigidArea(dim).asInstanceOf[JComponent] } def HStrut(width: Int) = new Component { override lazy val peer = javax.swing.Box.createHorizontalStrut(width).asInstanceOf[JComponent] diff --git a/src/swing/scala/swing/SwingComponent.scala b/src/swing/scala/swing/SwingComponent.scala deleted file mode 100644 index 28231eb9a5..0000000000 --- a/src/swing/scala/swing/SwingComponent.scala +++ /dev/null @@ -1,11 +0,0 @@ -package scala.swing - -import javax.swing._ -import java.awt._ - -/*trait SwingComponent extends Component { - val jcomponent = acomponent.asInstanceOf[JComponent] - def border: javax.swing.border.Border = jcomponent.getBorder() - def border_=(x: javax.swing.border.Border): unit = jcomponent.setBorder(x) -}*/ - diff --git a/src/swing/scala/swing/TabbedPane.scala b/src/swing/scala/swing/TabbedPane.scala index e9dc2b36a0..3c906ebad2 100644 --- a/src/swing/scala/swing/TabbedPane.scala +++ b/src/swing/scala/swing/TabbedPane.scala @@ -1,9 +1,9 @@ package scala.swing -import geometry._ +import event._ import scala.collection.mutable.Buffer import javax.swing.{JTabbedPane, JComponent} -import java.awt.Color +import java.awt.{Color, Rectangle} object TabbedPane { @@ -11,58 +11,77 @@ object TabbedPane { val Wrap = Value(JTabbedPane.WRAP_TAB_LAYOUT) val Scroll = Value(JTabbedPane.SCROLL_TAB_LAYOUT) } -} -class TabbedPane(override val peer: JTabbedPane) extends Component with Publisher { - import TabbedPane._ + class Page protected(title0: String, content0: Component, tip0: String, index0: Int) extends Proxy { + def self = content0 - class Tab protected(title0: String, component0: Component, tip0: String, index0: Int) { - def this(title0: String, component0: Component, tip0: String) = - this(title0, component0, tip0, 0) + def this(title0: String, content0: Component, tip0: String) = + this(title0, content0, tip0, 0) + def this(title0: String, content0: Component) = + this(title0, content0, "") + content = content0 // first add component, *then* set other things title = title0 - component = component0 tip = tip0 - def title: String = peer.getTitleAt(index) - def title_=(t: String) { peer.setTitleAt(index, t) } - def component: Component = Component.wrapperFor(peer.getComponentAt(index).asInstanceOf[JComponent]) - def component_=(c: Component) { peer.setComponentAt(index, c.peer) } - def tip: String = peer.getToolTipTextAt(index) - def tip_=(t: String) { peer.setToolTipTextAt(index, t) } - def enabled: Boolean = peer.isEnabledAt(index) - def enabled_=(b: Boolean) { peer.setEnabledAt(index, b) } - def mnemonic: Int = peer.getMnemonicAt(index) - def mnemonic_=(k: Int) = peer.setMnemonicAt(index, k) - def foreground: Color = peer.getForegroundAt(index) - def foreground_=(c: Color) = peer.setForegroundAt(index, c) - def background: Color = peer.getBackgroundAt(index) - def background_=(c: Color) = peer.setBackgroundAt(index, c) - def bounds: Rectangle = Rectangle.wrap(peer.getBoundsAt(index)) + + protected[TabbedPane] var parent: TabbedPane = null + + protected var _title = title0 + def title: String = _title//parent.peer.getTitleAt(index) + def title_=(t: String) { _title = title0; if (parent != null) parent.peer.setTitleAt(index, t) } + protected var _content = content0 + def content: Component = _content//Component.wrapperFor(peer.getComponentAt(index).asInstanceOf[JComponent]) + def content_=(c: Component) { _content = c; if (parent != null) parent.peer.setComponentAt(index, c.peer) } + protected var _tip = tip0 + def tip: String = _tip//peer.getToolTipTextAt(index) + def tip_=(t: String) { _tip = t; if (parent != null) parent.peer.setToolTipTextAt(index, t) } + protected var _enabled = true + def enabled: Boolean = _enabled//peer.isEnabledAt(index) + def enabled_=(b: Boolean) { _enabled = b; if (parent != null) parent.peer.setEnabledAt(index, b) } + protected var _mnemonic = -1 + def mnemonic: Int = _mnemonic//peer.getMnemonicAt(index) + def mnemonic_=(k: Int) { _mnemonic = k; if (parent != null) parent.peer.setMnemonicAt(index, k)} + protected var _foreground: Color = null + def foreground: Color = _foreground//peer.getForegroundAt(index) + def foreground_=(c: Color) { _foreground = c; if (parent != null) parent.peer.setForegroundAt(index, c)} + protected var _background: Color = null + def background: Color = _background //peer.getBackgroundAt(index) + def background_=(c: Color) { _background = c; if (parent != null) parent.peer.setBackgroundAt(index, c)} + def bounds: Rectangle = parent.peer.getBoundsAt(index) // TODO: icon, disabledIcon def index = _index protected[TabbedPane] var _index: Int = index0 } +} + +/** + * @see javax.swing.JTabbedPane + */ +class TabbedPane(override val peer: JTabbedPane) extends Component(peer) with Publisher { + import TabbedPane._ def this() = this(new JTabbedPane) - object tabs extends BufferAdapter[Tab] { + object pages extends BufferWrapper[Page] { def runCount: Int = peer.getTabRunCount - def remove(n: Int): Tab = { + def remove(n: Int): Page = { val t = apply(n) peer.removeTabAt(n) + t.parent = null for(i <- n to length) apply(i)._index -= 1 t } - protected def insertAt(n: Int, t: Tab) { + protected def insertAt(n: Int, t: Page) { for(i <- n to length) apply(i)._index += 1 - peer.insertTab(t.title, null, t.component.peer, t.tip, n) + t.parent = TabbedPane.this + peer.insertTab(t.title, null, t.content.peer, t.tip, n) } - def +=(t: Tab) { peer.addTab(t.title, null, t.component.peer, t.tip) } + def +=(t: Page) { t.parent = TabbedPane.this; peer.addTab(t.title, null, t.content.peer, t.tip) } def length = peer.getTabCount - def apply(n: Int) = new Tab(peer.getTitleAt(n), + def apply(n: Int) = new Page(peer.getTitleAt(n), Component.wrapperFor(peer.getComponentAt(n).asInstanceOf[javax.swing.JComponent]), peer.getToolTipTextAt(n)) } @@ -70,8 +89,20 @@ class TabbedPane(override val peer: JTabbedPane) extends Component with Publishe def tabLayoutPolicy: Layout.Value = Layout(peer.getTabLayoutPolicy) def tabLayoutPolicy_=(p: Layout.Value) { peer.setTabLayoutPolicy(p.id) } - def tabPlacement: Edge = Edge.wrap(peer.getTabPlacement) - def tabPlacement(b: Edge) { peer.setTabPlacement(b.peer) } + def tabPlacement: EdgePosition.Value = EdgePosition(peer.getTabPlacement) + def tabPlacement(b: EdgePosition.Value) { peer.setTabPlacement(b.id) } + + object selection extends Publisher { + def page: Page = pages(index) + def page_=(p: Page) { index = p.index } - def selected: Tab = tabs(peer.getSelectedIndex) + def index: Int = peer.getSelectedIndex + def index_=(n: Int) { peer.setSelectedIndex(n) } + + peer.addChangeListener(new javax.swing.event.ChangeListener { + def stateChanged(e: javax.swing.event.ChangeEvent) { + publish(SelectionChanged(TabbedPane.this)) + } + }) + } } diff --git a/src/swing/scala/swing/Table.scala b/src/swing/scala/swing/Table.scala index 716ce461e3..8b957f1217 100644 --- a/src/swing/scala/swing/Table.scala +++ b/src/swing/scala/swing/Table.scala @@ -1,11 +1,10 @@ package scala.swing -import geometry._ import model.Matrix import javax.swing._ import javax.swing.table._ import javax.swing.event._ -import java.awt.Color +import java.awt.{Dimension, Color} import event._ import scala.collection.mutable.Set @@ -30,7 +29,10 @@ object Table { } } -class Table(override val peer: JTable) extends Component with Scrollable with Publisher { +/** + * @see javax.swing.JTable + */ +class Table(override val peer: JTable) extends Component(peer) with Scrollable with Publisher { import Table._ def this() = this(new JTable()) def this(numRows: Int, numColumns: Int) = this(new JTable(numRows, numColumns)) @@ -60,9 +62,9 @@ class Table(override val peer: JTable) extends Component with Scrollable with Pu def gridColor = peer.getGridColor def gridColor_=(color: Color) = peer.setGridColor(color) - def preferredViewportSize_=(dim: Dimension) = peer.setPreferredScrollableViewportSize(dim.peer) - def fillsViewportHeight: Boolean = peer.getFillsViewportHeight - def fillsViewportHeight_=(b: Boolean) = peer.setFillsViewportHeight(b) + def preferredViewportSize_=(dim: Dimension) = peer.setPreferredScrollableViewportSize(dim) + //1.6: def fillsViewportHeight: Boolean = peer.getFillsViewportHeight + //def fillsViewportHeight_=(b: Boolean) = peer.setFillsViewportHeight(b) // TODO: could be a sorted set protected abstract class SelectionSet[A](a: =>Seq[A]) extends Set[A] { @@ -125,13 +127,13 @@ class Table(override val peer: JTable) extends Component with Scrollable with Pu } peer.getColumnModel.getSelectionModel.addListSelectionListener(new ListSelectionListener { - def valueChanged(e: ListSelectionEvent) { - publish(ColumnsSelected(Table.this, e.getValueIsAdjusting, e.getFirstIndex to e.getLastIndex)) + def valueChanged(e: javax.swing.event.ListSelectionEvent) { + publish(ColumnsSelected(Table.this, e.getFirstIndex to e.getLastIndex, e.getValueIsAdjusting)) } }) peer.getSelectionModel.addListSelectionListener(new ListSelectionListener { - def valueChanged(e: ListSelectionEvent) { - publish(RowsSelected(Table.this, e.getValueIsAdjusting, e.getFirstIndex to e.getLastIndex)) + def valueChanged(e: javax.swing.event.ListSelectionEvent) { + publish(RowsSelected(Table.this, e.getFirstIndex to e.getLastIndex, e.getValueIsAdjusting)) } }) } diff --git a/src/swing/scala/swing/TextArea.scala b/src/swing/scala/swing/TextArea.scala index 396f218d30..25fba7cfc0 100644 --- a/src/swing/scala/swing/TextArea.scala +++ b/src/swing/scala/swing/TextArea.scala @@ -4,6 +4,9 @@ import javax.swing._ import java.awt.event._ import event._ +/** + * @see javax.swing.JTextArea + */ class TextArea(override val peer: JTextArea) extends TextComponent(peer) with TextComponent.HasColumns with TextComponent.HasRows { def this(text: String, rows: Int, columns: int) = this(new JTextArea(text, rows, columns)) def this(text: String) = this(new JTextArea(text)) diff --git a/src/swing/scala/swing/TextComponent.scala b/src/swing/scala/swing/TextComponent.scala index fb06cb4023..a5779f6826 100644 --- a/src/swing/scala/swing/TextComponent.scala +++ b/src/swing/scala/swing/TextComponent.scala @@ -16,35 +16,44 @@ object TextComponent { } } -class TextComponent(override val peer: JTextComponent) extends Component with EditorComponent with Publisher { - def contents: String = peer.getText - def contents_=(t: String) = peer.setText(t) +/** + * @see javax.swing.JTextComponent + */ +class TextComponent(override val peer: JTextComponent) extends Component(peer) with Publisher { + def text: String = peer.getText + def text_=(t: String) = peer.setText(t) + + class Caret extends Publisher { + def dot: Int = peer.getCaret.getDot + def dot_=(n: Int) { peer.getCaret.setDot(n) } + def mark: Int = peer.getCaret.getMark + def moveDot(n: Int) { peer.getCaret.moveDot(n) } + def visible: Boolean = peer.getCaret.isVisible + def visible_=(b: Boolean) { peer.getCaret.setVisible(b) } + def selectionVisible: Boolean = peer.getCaret.isSelectionVisible + def selectionVisible_=(b: Boolean) { peer.getCaret.setSelectionVisible(b) } + def blinkRate: Int = peer.getCaret.getBlinkRate + def blinkRate_=(n: Int) { peer.getCaret.setBlinkRate(n) } + + peer.addCaretListener { + new CaretListener { + def caretUpdate(e: CaretEvent) { publish(CaretUpdate(TextComponent.this)) } + } + } + } - val caret = new Caret(peer.getCaret) + object caret extends Caret def editable: Boolean = peer.isEditable def editable_=(x: Boolean) = peer.setEditable(x) - def cut() { peer.cut() } def copy() { peer.copy() } def selected: String = peer.getSelectedText - peer.addCaretListener { - new CaretListener { - def caretUpdate(e: CaretEvent) { publish(CaretUpdate(TextComponent.this)) } - } - } - - lazy val contentModified = liveContentModified - - protected def liveContentModified = new Publisher { - peer.getDocument.addDocumentListener { - new DocumentListener { - override def changedUpdate(e:DocumentEvent) { publish(ContentModified(TextComponent.this)) } - override def insertUpdate(e:DocumentEvent) { publish(ContentModified(TextComponent.this)) } - override def removeUpdate(e:DocumentEvent) { publish(ContentModified(TextComponent.this)) } - } - } - } + peer.getDocument.addDocumentListener(new DocumentListener { + def changedUpdate(e:DocumentEvent) { publish(ValueChanged(TextComponent.this, true)) } + def insertUpdate(e:DocumentEvent) { publish(ValueChanged(TextComponent.this, true)) } + def removeUpdate(e:DocumentEvent) { publish(ValueChanged(TextComponent.this, true)) } + }) } diff --git a/src/swing/scala/swing/TextField.scala b/src/swing/scala/swing/TextField.scala index 9658230608..a437596204 100644 --- a/src/swing/scala/swing/TextField.scala +++ b/src/swing/scala/swing/TextField.scala @@ -4,6 +4,9 @@ import javax.swing._ import java.awt.event._ import event._ +/** + * @see javax.swing.JTextField + */ class TextField(override val peer: JTextField) extends TextComponent(peer) with TextComponent.HasColumns { def this(text: String, columns: int) = this(new JTextField(text, columns)) def this(text: String) = this(new JTextField(text)) @@ -13,13 +16,7 @@ class TextField(override val peer: JTextField) extends TextComponent(peer) with def columns: Int = peer.getColumns def columns_=(n: Int) = peer.setColumns(n) - override lazy val contentModified = new Publisher { - peer.addActionListener { - new ActionListener { - def actionPerformed(e: ActionEvent) { publish(ContentModified(TextField.this)) } - } - } - } - - override lazy val liveContentModified = super.liveContentModified + peer.addActionListener(new ActionListener { + def actionPerformed(e: ActionEvent) { publish(ValueChanged(TextField.this, false)) } + }) } diff --git a/src/swing/scala/swing/ToggleButton.scala b/src/swing/scala/swing/ToggleButton.scala index eebf3f3675..a4a6e3d378 100644 --- a/src/swing/scala/swing/ToggleButton.scala +++ b/src/swing/scala/swing/ToggleButton.scala @@ -3,6 +3,9 @@ package scala.swing import javax.swing._ import event._ +/** + * @see javax.swing.JToggleButton + */ class ToggleButton(override val peer: JToggleButton) extends Button(peer) { def this(txt: String) = this(new JToggleButton(txt)) def this() = this(new JToggleButton) diff --git a/src/swing/scala/swing/UIElement.scala b/src/swing/scala/swing/UIElement.scala index 246c4e24bb..9cb7bdb37a 100644 --- a/src/swing/scala/swing/UIElement.scala +++ b/src/swing/scala/swing/UIElement.scala @@ -1,8 +1,10 @@ package scala.swing -import java.awt.Color -import java.awt.Font +import java.awt.{Color, Cursor, Font} +/** + * The root of all user interface elements. + */ trait UIElement { def peer: java.awt.Component def foreground: Color = peer.getForeground @@ -12,4 +14,20 @@ trait UIElement { def font: Font = peer.getFont def font_=(f: Font) = peer.setFont(f) + + def locationOnScreen = peer.getLocationOnScreen + def location = peer.getLocation + def bounds = peer.getBounds + def size = peer.getSize + def locale = peer.getLocale + def toolkit = peer.getToolkit + + def cursor: Cursor = peer.getCursor + def cursor_=(c: Cursor) { peer.setCursor(c) } + + def visible: Boolean = peer.isVisible + def visible_=(b: Boolean) { peer.setVisible(b) } + def showing: Boolean = peer.isShowing + + def repaint() { peer.repaint } } diff --git a/src/swing/scala/swing/Views.scala b/src/swing/scala/swing/Views.scala index 9278a0b71b..eeea5eb721 100644 --- a/src/swing/scala/swing/Views.scala +++ b/src/swing/scala/swing/Views.scala @@ -1,7 +1,7 @@ package scala.swing object Views { - implicit def action2MenuItem(a: Action): MenuItem = new MenuItem(a) + //implicit def action2MenuItem(a: Action): MenuItem = new MenuItem(a) //implicit def action2PushButton(a: Action): PushButton = new PushButton(a) //implicit def string2Label(s: String): Label = new Label(s) } diff --git a/src/swing/scala/swing/XAlignment.scala b/src/swing/scala/swing/XAlignment.scala new file mode 100644 index 0000000000..2129ea281a --- /dev/null +++ b/src/swing/scala/swing/XAlignment.scala @@ -0,0 +1,9 @@ +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 new file mode 100644 index 0000000000..9851511de1 --- /dev/null +++ b/src/swing/scala/swing/YAlignment.scala @@ -0,0 +1,10 @@ +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/scala/swing/event/CellModified.scala b/src/swing/scala/swing/event/CellModified.scala deleted file mode 100644 index 7a42a82317..0000000000 --- a/src/swing/scala/swing/event/CellModified.scala +++ /dev/null @@ -1,3 +0,0 @@ -package scala.swing.event - -//case class CellModified(source: Table, col: Int, row: int, value: String) extends Event(source) diff --git a/src/swing/scala/swing/event/ContentModified.scala b/src/swing/scala/swing/event/ContentModified.scala deleted file mode 100644 index a84558085d..0000000000 --- a/src/swing/scala/swing/event/ContentModified.scala +++ /dev/null @@ -1,3 +0,0 @@ -package scala.swing.event - -case class ContentModified(override val source: Component) extends ComponentEvent(source) diff --git a/src/swing/scala/swing/event/MouseEvent.scala b/src/swing/scala/swing/event/MouseEvent.scala index 20a520c3a6..46009697f7 100644 --- a/src/swing/scala/swing/event/MouseEvent.scala +++ b/src/swing/scala/swing/event/MouseEvent.scala @@ -1,6 +1,6 @@ package scala.swing.event -import geometry._ +import java.awt.Point class MouseEvent(source: Component, point: Point, modifiers: Int) extends ComponentEvent(source) diff --git a/src/swing/scala/swing/event/SelectionEvent.scala b/src/swing/scala/swing/event/SelectionEvent.scala index 5fea0a6f57..d9d6d6d21f 100644 --- a/src/swing/scala/swing/event/SelectionEvent.scala +++ b/src/swing/scala/swing/event/SelectionEvent.scala @@ -1,5 +1,9 @@ package scala.swing.event -trait SelectionEvent { +trait SelectionEvent extends UIEvent + +trait ListSelectionEvent extends SelectionEvent { def range: Range } + +case class SelectionChanged(override val source: Component) extends UIEvent(source) with SelectionEvent
\ No newline at end of file diff --git a/src/swing/scala/swing/event/TableEvent.scala b/src/swing/scala/swing/event/TableEvent.scala index 4a556fed20..bf917dd239 100644 --- a/src/swing/scala/swing/event/TableEvent.scala +++ b/src/swing/scala/swing/event/TableEvent.scala @@ -2,9 +2,11 @@ package scala.swing.event class TableEvent(override val source: Table) extends ComponentEvent(source) -case class TableChanged(override val source: Table, firstRow: Int, lastRow: Int, column: Int) extends TableEvent(source) +case class TableChanged(override val source: Table, firstRow: Int, lastRow: Int, column: Int) + extends TableEvent(source) case class TableResized(override val source: Table) extends TableEvent(source) -//case class TextModified(override val source: TextComponent) extends ContentModified(source) -case class ColumnsSelected(override val source: Table, live: Boolean, range: Range) extends TableEvent(source) with LiveEvent with SelectionEvent -case class RowsSelected(override val source: Table, live: Boolean, range: Range) extends TableEvent(source) with LiveEvent with SelectionEvent
\ No newline at end of file +case class ColumnsSelected(override val source: Table, range: Range, live: Boolean) + extends TableEvent(source) with LiveEvent with ListSelectionEvent +case class RowsSelected(override val source: Table, range: Range, live: Boolean) + extends TableEvent(source) with LiveEvent with ListSelectionEvent
\ No newline at end of file diff --git a/src/swing/scala/swing/event/TextModified.scala b/src/swing/scala/swing/event/TextModified.scala deleted file mode 100644 index b40bcc5a0e..0000000000 --- a/src/swing/scala/swing/event/TextModified.scala +++ /dev/null @@ -1,3 +0,0 @@ -package scala.swing.event - -//case class TextModified(override val source: TextComponent) extends ContentModified(source) diff --git a/src/swing/scala/swing/event/ValueChanged.scala b/src/swing/scala/swing/event/ValueChanged.scala new file mode 100644 index 0000000000..7070ea2d52 --- /dev/null +++ b/src/swing/scala/swing/event/ValueChanged.scala @@ -0,0 +1,3 @@ +package scala.swing.event + +case class ValueChanged(override val source: Component, live: Boolean) extends ComponentEvent(source) with LiveEvent diff --git a/src/swing/scala/swing/geometry/Dimension.scala b/src/swing/scala/swing/geometry/Dimension.scala deleted file mode 100644 index abe48f8c0a..0000000000 --- a/src/swing/scala/swing/geometry/Dimension.scala +++ /dev/null @@ -1,17 +0,0 @@ -package scala.swing.geometry - -object Dimension { - def apply(w: Int, h: Int) = new Dimension { - lazy val peer: java.awt.Dimension = new java.awt.Dimension(w, h) - } - - def wrap(dim: java.awt.Dimension) = new Dimension { - def peer: java.awt.Dimension = dim - } -} - -abstract class Dimension { - def peer: java.awt.Dimension - def width = peer.getWidth - def height = peer.getHeight -} diff --git a/src/swing/scala/swing/geometry/Point.scala b/src/swing/scala/swing/geometry/Point.scala deleted file mode 100644 index 352afb5985..0000000000 --- a/src/swing/scala/swing/geometry/Point.scala +++ /dev/null @@ -1,7 +0,0 @@ -package scala.swing.geometry - -object Point { - def apply(p: java.awt.Point) = new Point(p.getX, p.getY) -} - -class Point(x: Double, y: Double) extends Pair(x,y) diff --git a/src/swing/scala/swing/geometry/Rectangle.scala b/src/swing/scala/swing/geometry/Rectangle.scala deleted file mode 100644 index 707c99a3a1..0000000000 --- a/src/swing/scala/swing/geometry/Rectangle.scala +++ /dev/null @@ -1,19 +0,0 @@ -package scala.swing.geometry - -object Rectangle { - def apply(x: Int, y: Int, w: Int, h: Int) = new Rectangle { - lazy val peer: java.awt.Rectangle = new java.awt.Rectangle(x, y, w, h) - } - - def wrap(rect: java.awt.Rectangle) = new Rectangle { - def peer: java.awt.Rectangle = rect - } -} - -abstract class Rectangle { - def peer: java.awt.Rectangle - def width = peer.getWidth - def height = peer.getHeight - def x = peer.x - def y = peer.y -} diff --git a/src/swing/scala/swing/model/Matrix.scala b/src/swing/scala/swing/model/Matrix.scala index a578452fd2..d028b6826e 100644 --- a/src/swing/scala/swing/model/Matrix.scala +++ b/src/swing/scala/swing/model/Matrix.scala @@ -1,6 +1,6 @@ package scala.swing.model -trait Matrix[A] extends Function2[Int, Int, A] { +/*trait Matrix[A] extends Function2[Int, Int, A] { val width: Int val height: Int @@ -105,4 +105,4 @@ object Matrix { result } -} +}*/ diff --git a/src/swing/scala/swing/test/CelsiusConverter.scala b/src/swing/scala/swing/test/CelsiusConverter.scala index 9cd6092f31..3578419698 100644 --- a/src/swing/scala/swing/test/CelsiusConverter.scala +++ b/src/swing/scala/swing/test/CelsiusConverter.scala @@ -8,30 +8,30 @@ import event._ object CelsiusConverter extends SimpleGUIApplication { def top = new MainFrame { title = "Convert Celsius to Fahrenheit" - defaultButton = convertButton + defaultButton = Some(convertButton) object tempCelsius extends TextField object celsiusLabel extends Label { text = "Celsius" - border = EmptyBorder(5, 5, 5, 5) + border = Border.Empty(5, 5, 5, 5) } object convertButton extends PushButton { - icon = new javax.swing.ImageIcon("c:\\workspace\\gui\\images\\convert.gif") - border = EmptyBorder(5, 5, 5, 5) + text = "Convert"//new javax.swing.ImageIcon("c:\\workspace\\gui\\images\\convert.gif") + //border = Border.Empty(5, 5, 5, 5) } object fahrenheitLabel extends Label { text = "Fahrenheit " - border = EmptyBorder(5, 5, 5, 5) + border = Border.Empty(5, 5, 5, 5) listenTo(convertButton, tempCelsius) reactions += { - case ButtonClicked(_) | ContentModified(_) => - val c = Integer.parseInt(tempCelsius.contents) + case ButtonClicked(_) | ValueChanged(_,false) => + val c = Integer.parseInt(tempCelsius.text) val f = c * 9 / 5 + 32 text = "<html><font color = red>"+f+"</font> Fahrenheit</html>" } } - content = new GridPanel(2,2) { + contents = new GridPanel(2,2) { contents.append(tempCelsius, celsiusLabel, convertButton, fahrenheitLabel) - border = EmptyBorder(10, 10, 10, 10) + border = Border.Empty(10, 10, 10, 10) } } } diff --git a/src/swing/scala/swing/test/CelsiusConverter2.scala b/src/swing/scala/swing/test/CelsiusConverter2.scala index 5b8af8f5c0..728c63c8fa 100644 --- a/src/swing/scala/swing/test/CelsiusConverter2.scala +++ b/src/swing/scala/swing/test/CelsiusConverter2.scala @@ -4,25 +4,27 @@ import swing._ import event._ object CelsiusConverter2 extends SimpleGUIApplication { - def top = new MainFrame { - title = "Convert Celsius / Fahrenheit" - object Celsius extends TextField { columns = 5 } + val ui = new FlowPanel { + object Celsius extends TextField { columns = 5 } object Fahrenheit extends TextField { columns = 5 } - content = new FlowPanel { - contents.append(Celsius, new Label(" Celsius = "), Fahrenheit, new Label(" Fahrenheit")) - border = EmptyBorder(15, 10, 10, 10) - } - listenTo(Fahrenheit.contentModified, Celsius.contentModified) + contents.append(Celsius, new Label(" Celsius = "), Fahrenheit, new Label(" Fahrenheit")) + border = Border.Empty(15, 10, 10, 10) + + listenTo(Fahrenheit, Celsius) reactions += { - case ContentModified(Fahrenheit) => - val f = Integer.parseInt(Fahrenheit.contents) + case ValueChanged(Fahrenheit, false) => + val f = Integer.parseInt(Fahrenheit.text) val c = (f - 32) * 5 / 9 - Celsius.contents = c.toString - case ContentModified(Celsius) => - val c = Integer.parseInt(Celsius.contents) + Celsius.text = c.toString + case ValueChanged(Celsius, false) => + val c = Integer.parseInt(Celsius.text) val f = c * 9 / 5 + 32 - Fahrenheit.contents = f.toString + Fahrenheit.text = f.toString } } + def top = new MainFrame { + title = "Convert Celsius / Fahrenheit" + contents = ui + } } diff --git a/src/swing/scala/swing/test/GridBagDemo.scala b/src/swing/scala/swing/test/GridBagDemo.scala index 2131d0c82e..b2092c934d 100644 --- a/src/swing/scala/swing/test/GridBagDemo.scala +++ b/src/swing/scala/swing/test/GridBagDemo.scala @@ -6,57 +6,59 @@ import GridBagPanel._ import java.awt.Insets object GridBagDemo extends SimpleGUIApplication { - def top = new MainFrame { - title = "GridBag Demo" - content = new GridBagPanel { - val c = new Constraints - val shouldFill = true - if (shouldFill) { - c.fill = Fill.Horizontal - } + val ui = new GridBagPanel { + val c = new Constraints + val shouldFill = true + if (shouldFill) { + c.fill = Fill.Horizontal + } - val button1 = new PushButton("Button 1") + val button1 = new PushButton("Button 1") - c.weightx = 0.5 + c.weightx = 0.5 - c.fill = Fill.Horizontal - c.gridx = 0; - c.gridy = 0; - layout(button1) = c + c.fill = Fill.Horizontal + c.gridx = 0; + c.gridy = 0; + layout(button1) = c - val button2 = new PushButton("Button 2") - c.fill = Fill.Horizontal - c.weightx = 0.5; - c.gridx = 1; - c.gridy = 0; - layout(button2) = c + val button2 = new PushButton("Button 2") + c.fill = Fill.Horizontal + c.weightx = 0.5; + c.gridx = 1; + c.gridy = 0; + layout(button2) = c - val button3 = new PushButton("Button 3") - c.fill = Fill.Horizontal - c.weightx = 0.5; - c.gridx = 2; - c.gridy = 0; - layout(button3) = c + val button3 = new PushButton("Button 3") + c.fill = Fill.Horizontal + c.weightx = 0.5; + c.gridx = 2; + c.gridy = 0; + layout(button3) = c - val button4 = new PushButton("Long-Named Button 4") - c.fill = Fill.Horizontal - c.ipady = 40; //make this component tall - c.weightx = 0.0; - c.gridwidth = 3; - c.gridx = 0; - c.gridy = 1; - layout(button4) = c - - val button5 = new PushButton("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.gridwidth = 2; //2 columns wide - c.gridy = 2; //third row - layout(button5) = c - } + val button4 = new PushButton("Long-Named Button 4") + c.fill = Fill.Horizontal + c.ipady = 40; //make this component tall + c.weightx = 0.0; + c.gridwidth = 3; + c.gridx = 0; + c.gridy = 1; + layout(button4) = c + + val button5 = new PushButton("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.gridwidth = 2; //2 columns wide + c.gridy = 2; //third row + layout(button5) = c + } + + def top = new MainFrame { + title = "GridBag Demo" + contents = ui } }
\ No newline at end of file diff --git a/src/swing/scala/swing/test/HelloWorld.scala b/src/swing/scala/swing/test/HelloWorld.scala index 366252c3c9..e4d70cd84b 100644 --- a/src/swing/scala/swing/test/HelloWorld.scala +++ b/src/swing/scala/swing/test/HelloWorld.scala @@ -4,9 +4,11 @@ import swing._ object HelloWorld extends GUIApplication { def main(args: Array[String]) = run { - new Frame { + val frame = new Frame { title = "HelloWorldSwing" - content = new Label("Hello World") - }.pack.show + contents = new Label("Hello World") + } + frame.pack() + frame.visible = true } } diff --git a/src/swing/scala/swing/test/MenuDemo.scala b/src/swing/scala/swing/test/MenuDemo.scala deleted file mode 100644 index 990b4121ca..0000000000 --- a/src/swing/scala/swing/test/MenuDemo.scala +++ /dev/null @@ -1,32 +0,0 @@ -package scala.swing.test - -import swing._ -import swing.event._ - -object MenuDemo extends SimpleGUIApplication { - def top = new MainFrame { - title = "Menu Demo" - menuBar = new MenuBar - - import Views._ - - val menu = new Menu("A Menu") - menu.contents += new MenuItem("An item") - menu.contents += new Action("An action item") { - def apply() { println("Action '"+ title +"' invoked") } - } - menu.contents += new Separator - menu.contents += new CheckMenuItem("Check me") - menu.contents += new CheckMenuItem("Me too!") - menu.contents += new Separator - val a = new RadioMenuItem("a") - val b = new RadioMenuItem("b") - val c = new RadioMenuItem("b") - val mutex = new ButtonMutex(a,b,c) - menu.contents ++= mutex.buttons - - menuBar.contents += menu - menuBar.contents += new Menu("Empty Menu") - } -} - diff --git a/src/swing/scala/swing/test/SimpleApplet.scala b/src/swing/scala/swing/test/SimpleApplet.scala index f072a617d6..510c63f3e3 100644 --- a/src/swing/scala/swing/test/SimpleApplet.scala +++ b/src/swing/scala/swing/test/SimpleApplet.scala @@ -6,14 +6,14 @@ class SimpleApplet extends Applet { object ui extends UI with Reactor { def init() = { val button = new PushButton("Press here!") - val text = new TextField("Java Version: " + + val text = new TextArea("Java Version: " + System.getProperty("java.version")+"\n") listenTo(button) reactions += { - case ButtonClicked(_) => text.contents += "Button Pressed!\n" + case ButtonClicked(_) => text.text += "Button Pressed!\n" case _ => } - content = new BoxPanel(Vertical) { contents.append(button, text) } + contents = new BoxPanel(Orientation.Vertical) { contents.append(button, text) } } } }
\ No newline at end of file diff --git a/src/swing/scala/swing/test/SwingApp.scala b/src/swing/scala/swing/test/SwingApp.scala index 5560c74f59..d09434b865 100644 --- a/src/swing/scala/swing/test/SwingApp.scala +++ b/src/swing/scala/swing/test/SwingApp.scala @@ -20,9 +20,9 @@ object SwingApp extends SimpleGUIApplication { object button extends PushButton { text = "I am a button" } - content = new GridPanel(GridPanel.Adapt,1) { + contents = new GridPanel(GridPanel.Adapt,1) { contents.append(label, button) - border = EmptyBorder(5, 5, 5, 5) + border = Border.Empty(5, 5, 5, 5) } } } diff --git a/src/swing/scala/swing/test/TableSelection.scala b/src/swing/scala/swing/test/TableSelection.scala index 2e454144dd..9a4843d66c 100644 --- a/src/swing/scala/swing/test/TableSelection.scala +++ b/src/swing/scala/swing/test/TableSelection.scala @@ -1,46 +1,48 @@ package scala.swing.test +import java.awt.Dimension import swing._ import swing.event._ import swing.geometry._ object TableSelection extends SimpleGUIApplication { - def top = new MainFrame { - title = "Table Selection" - - val model = Array[Array[AnyRef]](Array[AnyRef]("Mary", "Campione", "Snowboarding", new java.lang.Integer(5), new java.lang.Boolean(false)), + val model = Array[Array[AnyRef]](Array[AnyRef]("Mary", "Campione", "Snowboarding", new java.lang.Integer(5), new java.lang.Boolean(false)), Array[AnyRef]("Alison", "Huml", "Rowing", new java.lang.Integer(5), new java.lang.Boolean(false)), Array[AnyRef]("Kathy", "Walrath", "Knitting", new java.lang.Integer(5), new java.lang.Boolean(false)), Array[AnyRef]("Sharon", "Zakhour", "Speed reading", new java.lang.Integer(5), new java.lang.Boolean(false)), Array[AnyRef]("Philip", "Milne", "Pool", new java.lang.Integer(5), new java.lang.Boolean(false))) - content = new BoxPanel(Vertical) { + val ui = new BoxPanel(Orientation.Vertical) { val table = new Table(model, Array[AnyRef]("First Name", "Last Name", "Sport", "# of Years", "Vegetarian")) listenTo() - table.preferredViewportSize = Dimension(500, 70) - table.fillsViewportHeight = true + table.preferredViewportSize = new Dimension(500, 70) + //1.6:table.fillsViewportHeight = true listenTo(table.selection) contents += new ScrollPane(table) contents += new Label("Selection Mode") - val intervalMutex = new ButtonMutex - def radio(mutex: ButtonMutex, text: String): RadioButton = { + + def radio(mutex: ButtonGroup, text: String): RadioButton = { val b = new RadioButton(text) listenTo(b) mutex.buttons += b contents += b b } + + val intervalMutex = new ButtonGroup val multiInterval = radio(intervalMutex, "Multiple Interval Selection") val elementInterval = radio(intervalMutex, "Single Selection") val singleInterval = radio(intervalMutex, "Single Interval Selection") + intervalMutex.select(multiInterval) contents += new Label("Selection Options") - val elemMutex = new ButtonMutex + val elemMutex = new ButtonGroup val rowSelection = radio(elemMutex, "Row Selection") val columnSelection = radio(elemMutex, "Column Selection") val cellSelection = radio(elemMutex, "Cell Selection") + elemMutex.select(rowSelection) val output = new TextArea(5, 40) { editable = false } contents += new ScrollPane(output) @@ -67,15 +69,15 @@ object TableSelection extends SimpleGUIApplication { case ButtonClicked(`multiInterval`) => table.selection.intervalMode = Table.IntervalMode.MultiInterval if (cellSelection.selected) { - elemMutex.deselectAll() + elemMutex.select(rowSelection) table.selection.elementMode = Table.ElementMode.None } cellSelection.enabled = false case ButtonClicked(`elementInterval`) => - table.selection.intervalMode = Table.IntervalMode.SingleInterval + table.selection.intervalMode = Table.IntervalMode.Single cellSelection.enabled = true case ButtonClicked(`singleInterval`) => - table.selection.intervalMode = Table.IntervalMode.Single + table.selection.intervalMode = Table.IntervalMode.SingleInterval cellSelection.enabled = true case ButtonClicked(`rowSelection`) => if (rowSelection.selected) @@ -86,14 +88,18 @@ object TableSelection extends SimpleGUIApplication { case ButtonClicked(`cellSelection`) => if (cellSelection.selected) table.selection.elementMode = Table.ElementMode.Cell - case RowsSelected(table, false, range) => + case RowsSelected(_, range, false) => output.append("Rows selected, changes: " + range + "\n") outputSelection() - case ColumnsSelected(table, false, range) => + case ColumnsSelected(_, range, false) => output.append("Columns selected, changes " + range + "\n") outputSelection() } } + + def top = new MainFrame { + title = "Table Selection" + contents = ui } } diff --git a/src/swing/scala/swing/test/UIDemo.scala b/src/swing/scala/swing/test/UIDemo.scala new file mode 100644 index 0000000000..00681bd8da --- /dev/null +++ b/src/swing/scala/swing/test/UIDemo.scala @@ -0,0 +1,84 @@ +package scala.swing.test + +import swing._ +import event._ + +object UIDemo extends SimpleGUIApplication { + def top = new MainFrame { + title = "UIElement Test" + + menuBar = new MenuBar + + import Views._ + import Border._ + + val menu = new Menu("A Menu") + menu.contents += new MenuItem("An item") + menu.contents += new MenuItem(Action("An action item") { + println("Action '"+ title +"' invoked") + }) + menu.contents += new Separator + menu.contents += new CheckMenuItem("Check me") + menu.contents += new CheckMenuItem("Me too!") + menu.contents += new Separator + val a = new RadioMenuItem("a") + val b = new RadioMenuItem("b") + val c = new RadioMenuItem("c") + val mutex = new ButtonGroup(a,b,c) + menu.contents ++= mutex.buttons + + menuBar.contents += menu + menuBar.contents += new Menu("Empty Menu") + + contents = new BoxPanel(Orientation.Vertical) { + val tabs = new TabbedPane { + import TabbedPane._ + val buttons = new FlowPanel { + border = Empty(5,5,5,5) + contents += new BoxPanel(Orientation.Vertical) { + border = Compound(Titled(Etched, "Radio Buttons"), Empty(5,5,5,10)) + val a = new RadioButton("Green Vegetables") + val b = new RadioButton("Red Meat") + val c = new RadioButton("White Tofu") + val mutex = new ButtonGroup(a,b,c) + contents ++= mutex.buttons + } + contents += new BoxPanel(Orientation.Vertical) { + border = Compound(Titled(Etched, "Check Boxes"), Empty(5,5,5,10)) + val a = new CheckBox("Paint Labels") + val b = new CheckBox("Paint Ticks") + val c = new CheckBox("Snap To Ticks") + contents.append(a,b,c) + listenTo(a,b,c) + reactions += { + case ButtonClicked(`a`) => slider.paintLabels = a.selected + case ButtonClicked(`b`) => slider.paintTicks = b.selected + case ButtonClicked(`c`) => slider.snapToTicks = c.selected + } + } + } + pages += new Page("Buttons", buttons) + pages += new Page("GridBag", GridBagDemo.ui) + pages += new Page("Converter", CelsiusConverter2.ui) + pages += new Page("Tables", TableSelection.ui) + } + contents += tabs + + object slider extends Slider { + min = 0 + value = tabs.selection.index + max = tabs.pages.size-1 + majorTickSpacing = 1 + } + contents += slider + + listenTo(slider) + listenTo(tabs.selection) + reactions += { + case ValueChanged(`slider`, false) => tabs.selection.index = slider.value + case SelectionChanged(`tabs`) => slider.value = tabs.selection.index + } + } + } +} + diff --git a/src/swing/scala/swing/test/UIElementTest.scala b/src/swing/scala/swing/test/UIElementTest.scala deleted file mode 100644 index 5cbe617d8c..0000000000 --- a/src/swing/scala/swing/test/UIElementTest.scala +++ /dev/null @@ -1,13 +0,0 @@ -package scala.swing.test - -import swing._ -import swing.event._ -import java.awt.Color - -object UIElementTest extends SimpleGUIApplication { - def top = new MainFrame { - title = "UIElement Test" - background = Color.RED - } -} - |