From 30610072ac6bec2c6e70dbb0e779f4a53bf39688 Mon Sep 17 00:00:00 2001 From: NAME Date: Sun, 6 Apr 2008 15:49:24 +0000 Subject: scala.swing update, reverted Martin's changes --- src/swing/scala/swing/Applet.scala | 30 +++++ src/swing/scala/swing/BoxPanel.scala | 2 +- src/swing/scala/swing/Component.scala | 135 +++++++++++++++++++-- src/swing/scala/swing/Container.scala | 14 +++ src/swing/scala/swing/EditorComponent.scala | 2 +- src/swing/scala/swing/FlowPanel.scala | 2 +- src/swing/scala/swing/Frame.scala | 19 +-- src/swing/scala/swing/GridPanel.scala | 2 +- src/swing/scala/swing/IndexedPanel.scala | 2 +- src/swing/scala/swing/Point.scala | 7 ++ src/swing/scala/swing/ProgressBar.scala | 2 +- src/swing/scala/swing/RootPanel.scala | 19 +++ src/swing/scala/swing/ScrollPane.scala | 2 +- src/swing/scala/swing/Showable.scala | 2 +- src/swing/scala/swing/Swing.scala | 2 +- src/swing/scala/swing/UIElement.scala | 2 +- .../scala/swing/event/BackgroundChanged.scala | 3 + src/swing/scala/swing/event/ComponentEvent.scala | 7 +- src/swing/scala/swing/event/ContainerEvent.scala | 6 + src/swing/scala/swing/event/ContentModified.scala | 2 +- src/swing/scala/swing/event/FocusEvent.scala | 12 ++ src/swing/scala/swing/event/FontChanged.scala | 3 + .../scala/swing/event/ForegroundChanged.scala | 3 + src/swing/scala/swing/event/MouseEvent.scala | 30 +++++ src/swing/scala/swing/test/SimpleApplet.scala | 19 +++ 25 files changed, 295 insertions(+), 34 deletions(-) create mode 100644 src/swing/scala/swing/Applet.scala create mode 100644 src/swing/scala/swing/Point.scala create mode 100644 src/swing/scala/swing/RootPanel.scala create mode 100644 src/swing/scala/swing/event/BackgroundChanged.scala create mode 100644 src/swing/scala/swing/event/ContainerEvent.scala create mode 100644 src/swing/scala/swing/event/FocusEvent.scala create mode 100644 src/swing/scala/swing/event/FontChanged.scala create mode 100644 src/swing/scala/swing/event/ForegroundChanged.scala create mode 100644 src/swing/scala/swing/event/MouseEvent.scala create mode 100644 src/swing/scala/swing/test/SimpleApplet.scala (limited to 'src/swing') diff --git a/src/swing/scala/swing/Applet.scala b/src/swing/scala/swing/Applet.scala new file mode 100644 index 0000000000..c80f8422dc --- /dev/null +++ b/src/swing/scala/swing/Applet.scala @@ -0,0 +1,30 @@ +package scala.swing + +import javax.swing.JApplet + +/** + * Clients should implement the ui field. See the SimpleApplet demo for a sample. + * + * Note: Applet extends JApplet to satisfy Java's applet loading mechanism. + * The usual component wrapping scheme doesn't work here. + */ +abstract class Applet extends JApplet { outer => + val ui: UI + + override def init() { ui.init() } + override def start() { ui.start() } + override def stop() { ui.stop() } + + abstract class UI extends RootPanel { + def peer = outer + override def content_=(c: Component) { + super.content_=(c) + peer.validate() + } + + def init() + def start() {} + def stop() {} + } +} + diff --git a/src/swing/scala/swing/BoxPanel.scala b/src/swing/scala/swing/BoxPanel.scala index 0c7c1b90bd..d8af118ef9 100644 --- a/src/swing/scala/swing/BoxPanel.scala +++ b/src/swing/scala/swing/BoxPanel.scala @@ -1,4 +1,4 @@ -package swing +package scala.swing class BoxPanel(orientation: Orientation)(content0: Component*) extends IndexedPanel { override lazy val peer = { diff --git a/src/swing/scala/swing/Component.scala b/src/swing/scala/swing/Component.scala index a302ca6e91..2d3a319b0b 100644 --- a/src/swing/scala/swing/Component.scala +++ b/src/swing/scala/swing/Component.scala @@ -1,13 +1,32 @@ package scala.swing -import javax.swing._; -import java.awt._; +import event._ +import java.awt.Font +import java.awt.event._ +import javax.swing.JComponent +import javax.swing.border.Border -abstract class Component -extends Object -with Reactor -{ - val acomponent: java.awt.Component +object Component { + val ClientKey = "scala.swingWrapper" + 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 {} + peer.putClientProperty(Component.ClientKey, this) + + def minimumSize = peer.getMinimumSize + def minimumSize_=(x: Dimension) = peer.setMinimumSize(x.peer) + def maxiumumSize = peer.getMaximumSize + def maxiumumSize_=(x: Dimension) = peer.setMaximumSize(x.peer) + def preferredSize = peer.getPreferredSize + def preferredSize_=(x: Dimension) = peer.setPreferredSize(x.peer) + + def xAlignment: Double = peer.getAlignmentX + def xAlignment_=(x: Double) = peer.setAlignmentX(x.toFloat) + def yAlignment: Double = peer.getAlignmentY + def yAlignment_=(x: Double) = peer.setAlignmentY(x.toFloat) def foreground: Color = new Color(peer.getForeground) def foreground_=(x: Color) = peer.setForeground(x) @@ -42,5 +61,107 @@ with Reactor }) }*/ + peer.addComponentListener(new java.awt.event.ComponentListener { + def componentHidden(e: java.awt.event.ComponentEvent) { + publish(ComponentHidden(Component.this)) + } + def componentShown(e: java.awt.event.ComponentEvent) { + publish(ComponentShown(Component.this)) + } + def componentMoved(e: java.awt.event.ComponentEvent) { + publish(ComponentMoved(Component.this)) + } + def componentResized(e: java.awt.event.ComponentEvent) { + publish(ComponentResized(Component.this)) + } + }) + + peer.addFocusListener(new java.awt.event.FocusListener { + def other(e: java.awt.event.FocusEvent) = e.getOppositeComponent match { + case c: JComponent => Some(Component.wrapperFor(c)) + case _ => None + } + + def focusGained(e: java.awt.event.FocusEvent) { + publish(FocusGained(Component.this, other(e), e.isTemporary)) + } + def focusLost(e: java.awt.event.FocusEvent) { + publish(FocusLost(Component.this, other(e), e.isTemporary)) + } + }) + + object Mouse { + val clicks: Publisher = new Publisher { + peer.addMouseListener(new MouseListener { + def mouseEntered(e: java.awt.event.MouseEvent) { } + 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)) + } + def mousePressed(e: java.awt.event.MouseEvent) { + publish(MousePressed(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]), + Point(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)) + } + }) + } + val moves: Publisher = new 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)) + } + def mouseExited(e: java.awt.event.MouseEvent) { + publish(MouseExited(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]), + Point(e.getPoint), e.getModifiers)) + } + def mouseClicked(e: java.awt.event.MouseEvent) {} + def mousePressed(e: java.awt.event.MouseEvent) { } + def mouseReleased(e: java.awt.event.MouseEvent) { } + }) + peer.addMouseMotionListener(new MouseMotionListener { + def mouseMoved(e: java.awt.event.MouseEvent) { + publish(MouseMoved(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]), + Point(e.getPoint), e.getModifiers)) + } + def mouseDragged(e: java.awt.event.MouseEvent) { + publish(MouseDragged(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]), + Point(e.getPoint), e.getModifiers)) + } + }) + } + val wheel: Publisher = new 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)) } + }) + } + } + + + peer.addPropertyChangeListener(new java.beans.PropertyChangeListener { + def propertyChange(e: java.beans.PropertyChangeEvent) { + e.getPropertyName match { + case "font" => publish(FontChanged(Component.this)) + case "background" => publish(ForegroundChanged(Component.this)) + case "foreground" => publish(BackgroundChanged(Component.this)) + case _ => + /*case "focusable" => + case "focusTraversalKeysEnabled" => + case "forwardFocusTraversalKeys" => + case "backwardFocusTraversalKeys" => + case "upCycleFocusTraversalKeys" => + case "downCycleFocusTraversalKeys" => + case "focusTraversalPolicy" => + case "focusCycleRoot" =>*/ + } + } + }) + override def toString = "scala.swing wrapper " + peer.toString } diff --git a/src/swing/scala/swing/Container.scala b/src/swing/scala/swing/Container.scala index 4397c3a46f..896ecc03d3 100644 --- a/src/swing/scala/swing/Container.scala +++ b/src/swing/scala/swing/Container.scala @@ -1,5 +1,8 @@ package scala.swing +import event._ +import scala.collection.mutable.Buffer + abstract class Container(override val peer: javax.swing.JComponent) extends Component { def this() = this(new javax.swing.JComponent {}) def content: Seq[Component] = new Content @@ -31,5 +34,16 @@ abstract class Container(override val peer: javax.swing.JComponent) extends Comp def elements = peer.getComponents.projection.map(wrap(_)).elements 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, + Component.wrapperFor(e.getChild.asInstanceOf[javax.swing.JComponent]))) + } + }) } diff --git a/src/swing/scala/swing/EditorComponent.scala b/src/swing/scala/swing/EditorComponent.scala index e83dce3bc9..0985a88cb8 100644 --- a/src/swing/scala/swing/EditorComponent.scala +++ b/src/swing/scala/swing/EditorComponent.scala @@ -1,4 +1,4 @@ -package swing +package scala.swing trait EditorComponent extends Component { val contentModified: Publisher diff --git a/src/swing/scala/swing/FlowPanel.scala b/src/swing/scala/swing/FlowPanel.scala index cd14c2e731..6d9a2189b5 100644 --- a/src/swing/scala/swing/FlowPanel.scala +++ b/src/swing/scala/swing/FlowPanel.scala @@ -1,4 +1,4 @@ -package swing +package scala.swing class FlowPanel(orientation: Orientation)(content0: Component*) extends IndexedPanel { override lazy val peer = new javax.swing.JPanel(new java.awt.FlowLayout(orientation.peer)) diff --git a/src/swing/scala/swing/Frame.scala b/src/swing/scala/swing/Frame.scala index edf895fcfc..7a690a78f4 100644 --- a/src/swing/scala/swing/Frame.scala +++ b/src/swing/scala/swing/Frame.scala @@ -3,26 +3,15 @@ package scala.swing import javax.swing.JFrame import event._ -class Frame(val peer: JFrame) extends UIElement with Showable.Swing with Publisher { +class Frame(val peer: JFrame) extends UIElement with RootPanel with Showable.Swing with Publisher { def this() = this(new JFrame) def title: String = peer.getTitle def title_=(s: String) = peer.setTitle(s) content = new Component {} - def content: Component = { - if (peer.getContentPane.getComponentCount == 0) new Component {} - else { - val c = peer.getContentPane.getComponent(0) - Component.wrapperFor(c.asInstanceOf[javax.swing.JComponent]) - } - } - def content_=(c: Component) = { - if (peer.getContentPane.getComponentCount > 0) { - val old = peer.getContentPane.getComponent(0) - peer.getContentPane.remove(old) - } - peer.getContentPane.add(c.peer) - peer.pack() // pack also validates, which is generally required after an add} + override def content_=(c: Component) { + super.content_=(c) + peer.pack() // pack also validates, which is generally required after an add} } def defaultButton: Button = Component.wrapperFor(peer.getRootPane.getDefaultButton) def defaultButton_=(b: Button) { peer.getRootPane.setDefaultButton(b.peer) } diff --git a/src/swing/scala/swing/GridPanel.scala b/src/swing/scala/swing/GridPanel.scala index 21bbd76455..e6360aadbe 100644 --- a/src/swing/scala/swing/GridPanel.scala +++ b/src/swing/scala/swing/GridPanel.scala @@ -1,4 +1,4 @@ -package swing +package scala.swing object GridPanel { val Adapt = 0 diff --git a/src/swing/scala/swing/IndexedPanel.scala b/src/swing/scala/swing/IndexedPanel.scala index 491df9a6b1..c2d0034184 100644 --- a/src/swing/scala/swing/IndexedPanel.scala +++ b/src/swing/scala/swing/IndexedPanel.scala @@ -1,4 +1,4 @@ -package swing +package scala.swing import scala.collection.mutable.Buffer diff --git a/src/swing/scala/swing/Point.scala b/src/swing/scala/swing/Point.scala new file mode 100644 index 0000000000..953f6bf3ab --- /dev/null +++ b/src/swing/scala/swing/Point.scala @@ -0,0 +1,7 @@ +package scala.swing + +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/ProgressBar.scala b/src/swing/scala/swing/ProgressBar.scala index 6172a1f598..07d48f168f 100644 --- a/src/swing/scala/swing/ProgressBar.scala +++ b/src/swing/scala/swing/ProgressBar.scala @@ -1,4 +1,4 @@ -package swing +package scala.swing import event._ diff --git a/src/swing/scala/swing/RootPanel.scala b/src/swing/scala/swing/RootPanel.scala new file mode 100644 index 0000000000..c6480fa403 --- /dev/null +++ b/src/swing/scala/swing/RootPanel.scala @@ -0,0 +1,19 @@ +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 {} + else { + val c = peer.getContentPane.getComponent(0) + Component.wrapperFor(c.asInstanceOf[javax.swing.JComponent]) + } + } + def content_=(c: Component) { + if (peer.getContentPane.getComponentCount > 0) { + val old = peer.getContentPane.getComponent(0) + peer.getContentPane.remove(old) + } + peer.getContentPane.add(c.peer) + } +} diff --git a/src/swing/scala/swing/ScrollPane.scala b/src/swing/scala/swing/ScrollPane.scala index 50f9496cbb..c794372edc 100644 --- a/src/swing/scala/swing/ScrollPane.scala +++ b/src/swing/scala/swing/ScrollPane.scala @@ -1,4 +1,4 @@ -package scala.swing; +package scala.swing import javax.swing.JScrollPane diff --git a/src/swing/scala/swing/Showable.scala b/src/swing/scala/swing/Showable.scala index 02e6110144..7435d2dc0c 100644 --- a/src/swing/scala/swing/Showable.scala +++ b/src/swing/scala/swing/Showable.scala @@ -1,4 +1,4 @@ -package swing +package scala.swing object Showable { trait Swing extends Showable { diff --git a/src/swing/scala/swing/Swing.scala b/src/swing/scala/swing/Swing.scala index 8c0b255b73..781e399794 100644 --- a/src/swing/scala/swing/Swing.scala +++ b/src/swing/scala/swing/Swing.scala @@ -1,4 +1,4 @@ -package swing +package scala.swing import javax.swing._ import javax.swing.event._ diff --git a/src/swing/scala/swing/UIElement.scala b/src/swing/scala/swing/UIElement.scala index bf0f81fcc5..d5524b779f 100644 --- a/src/swing/scala/swing/UIElement.scala +++ b/src/swing/scala/swing/UIElement.scala @@ -1,4 +1,4 @@ -package swing +package scala.swing trait UIElement { diff --git a/src/swing/scala/swing/event/BackgroundChanged.scala b/src/swing/scala/swing/event/BackgroundChanged.scala new file mode 100644 index 0000000000..2e9c212b97 --- /dev/null +++ b/src/swing/scala/swing/event/BackgroundChanged.scala @@ -0,0 +1,3 @@ +package scala.swing.event + +case class BackgroundChanged(override val source: Component) extends ComponentEvent(source) diff --git a/src/swing/scala/swing/event/ComponentEvent.scala b/src/swing/scala/swing/event/ComponentEvent.scala index 191bc707f0..1cde8e58a1 100644 --- a/src/swing/scala/swing/event/ComponentEvent.scala +++ b/src/swing/scala/swing/event/ComponentEvent.scala @@ -1,3 +1,8 @@ -package swing.event +package scala.swing.event abstract class ComponentEvent(override val source: Component) extends Event(source) + +case class ComponentMoved(override val source: Component) extends ComponentEvent(source) +case class ComponentResized(override val source: Component) extends ComponentEvent(source) +case class ComponentShown(override val source: Component) extends ComponentEvent(source) +case class ComponentHidden(override val source: Component) extends ComponentEvent(source) diff --git a/src/swing/scala/swing/event/ContainerEvent.scala b/src/swing/scala/swing/event/ContainerEvent.scala new file mode 100644 index 0000000000..aaeb41e77f --- /dev/null +++ b/src/swing/scala/swing/event/ContainerEvent.scala @@ -0,0 +1,6 @@ +package scala.swing.event + +abstract class ContainerEvent(override val source: Container) extends Event(source) + +case class ComponentAdded(override val source: Container, child: Component) extends ContainerEvent(source) +case class ComponentRemoved(override val source: Container, child: Component) extends ContainerEvent(source) diff --git a/src/swing/scala/swing/event/ContentModified.scala b/src/swing/scala/swing/event/ContentModified.scala index 2d0d955720..a84558085d 100644 --- a/src/swing/scala/swing/event/ContentModified.scala +++ b/src/swing/scala/swing/event/ContentModified.scala @@ -1,3 +1,3 @@ -package swing.event +package scala.swing.event case class ContentModified(override val source: Component) extends ComponentEvent(source) diff --git a/src/swing/scala/swing/event/FocusEvent.scala b/src/swing/scala/swing/event/FocusEvent.scala new file mode 100644 index 0000000000..31546f00d3 --- /dev/null +++ b/src/swing/scala/swing/event/FocusEvent.scala @@ -0,0 +1,12 @@ +package scala.swing.event + +/** + * The other component is None if it is a non Swing, i.e., AWT or native, component. + */ +abstract class FocusEvent(override val source: Component, val other: Option[Component], val temporary: Boolean) extends ComponentEvent(source) + +case class FocusGained(override val source: Component, override val other: Option[Component], override val temporary: Boolean) + extends FocusEvent(source, other, temporary) + +case class FocusLost(override val source: Component, override val other: Option[Component], override val temporary: Boolean) + extends FocusEvent(source, other, temporary) \ No newline at end of file diff --git a/src/swing/scala/swing/event/FontChanged.scala b/src/swing/scala/swing/event/FontChanged.scala new file mode 100644 index 0000000000..357c1b361e --- /dev/null +++ b/src/swing/scala/swing/event/FontChanged.scala @@ -0,0 +1,3 @@ +package scala.swing.event + +case class FontChanged(override val source: Component) extends ComponentEvent(source) diff --git a/src/swing/scala/swing/event/ForegroundChanged.scala b/src/swing/scala/swing/event/ForegroundChanged.scala new file mode 100644 index 0000000000..a486afa9a8 --- /dev/null +++ b/src/swing/scala/swing/event/ForegroundChanged.scala @@ -0,0 +1,3 @@ +package scala.swing.event + +case class ForegroundChanged(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 new file mode 100644 index 0000000000..52f6731d1a --- /dev/null +++ b/src/swing/scala/swing/event/MouseEvent.scala @@ -0,0 +1,30 @@ +package scala.swing.event + +class MouseEvent(source: Component, point: Point, modifiers: Int) extends ComponentEvent(source) + +class MouseButtonEvent(source: Component, point: Point, modifiers: Int, + clicks: Int, triggersPopup: Boolean) + extends MouseEvent(source, point, modifiers) +case class MouseClicked(override val source: Component, point: Point, modifiers: Int, + clicks: Int, triggersPopup: Boolean) + extends MouseButtonEvent(source, point, modifiers, clicks, triggersPopup) +case class MousePressed(override val source: Component, point: Point, modifiers: Int, + clicks: Int, triggersPopup: Boolean) + extends MouseButtonEvent(source, point, modifiers, clicks, triggersPopup) +case class MouseReleased(override val source: Component, point: Point, modifiers: Int, + clicks: Int, triggersPopup: Boolean) + extends MouseButtonEvent(source, point, modifiers, clicks, triggersPopup) + +class MouseMotionEvent(override val source: Component, point: Point, modifiers: Int) + extends MouseEvent(source, point, modifiers) +case class MouseMoved(override val source: Component, point: Point, modifiers: Int) + extends MouseMotionEvent(source, point, modifiers) +case class MouseDragged(override val source: Component, point: Point, modifiers: Int) + extends MouseMotionEvent(source, point, modifiers) +case class MouseEntered(override val source: Component, point: Point, modifiers: Int) + extends MouseMotionEvent(source, point, modifiers) +case class MouseExited(override val source: Component, point: Point, modifiers: Int) + extends MouseMotionEvent(source, point, modifiers) + +case class MouseWheelMoved(override val source: Component, point: Point, modifiers: Int, rotation: Int) + extends MouseEvent(source, point, modifiers) \ No newline at end of file diff --git a/src/swing/scala/swing/test/SimpleApplet.scala b/src/swing/scala/swing/test/SimpleApplet.scala new file mode 100644 index 0000000000..c42bc873eb --- /dev/null +++ b/src/swing/scala/swing/test/SimpleApplet.scala @@ -0,0 +1,19 @@ +package scala.swing.test + +import event._ + +class SimpleApplet extends Applet { + object ui extends UI with Reactor { + def init() = { + val button = new Button("Press here!") + val text = new TextField("Java Version: " + + System.getProperty("java.version")+"\n") + listenTo(button) + reactions += { + case ButtonPressed(_) => text.content += "Button Pressed!\n" + case _ => + } + content = new BoxPanel(Vertical)(button, text) + } + } +} \ No newline at end of file -- cgit v1.2.3