From 8407cac45f7932442f907de66b42eae0f8ed764e Mon Sep 17 00:00:00 2001 From: Hanns Holger Rutz Date: Wed, 12 Dec 2018 14:04:18 +0100 Subject: [PATCH 1/9] clean up; bump to 2.1.0-SNAPSHOT - add explicit return types (e.g. Proxy's self now is Any) - fully qualify imports, avoid wildcard imports - remove dummy class Matrix --- build.sbt | 18 +-- .../scala/scala/swing/AbstractButton.scala | 5 +- src/main/scala/scala/swing/Action.scala | 5 +- src/main/scala/scala/swing/BoxPanel.scala | 2 +- src/main/scala/scala/swing/Button.scala | 4 +- src/main/scala/scala/swing/ButtonGroup.scala | 2 +- src/main/scala/scala/swing/CheckBox.scala | 2 +- src/main/scala/scala/swing/ComboBox.scala | 7 +- src/main/scala/scala/swing/Component.scala | 46 +++---- src/main/scala/scala/swing/Container.scala | 2 +- src/main/scala/scala/swing/EditorPane.scala | 6 +- src/main/scala/scala/swing/FileChooser.scala | 5 +- src/main/scala/scala/swing/FlowPanel.scala | 3 +- .../scala/swing/FormattedTextField.scala | 2 +- src/main/scala/scala/swing/GridBagPanel.scala | 6 +- src/main/scala/scala/swing/GridPanel.scala | 4 +- src/main/scala/scala/swing/Label.scala | 5 +- .../scala/scala/swing/LayoutContainer.scala | 1 + src/main/scala/scala/swing/ListView.scala | 4 +- src/main/scala/scala/swing/Menu.scala | 3 +- src/main/scala/scala/swing/Oriented.scala | 4 +- .../scala/scala/swing/PasswordField.scala | 2 +- src/main/scala/scala/swing/PopupMenu.scala | 9 +- src/main/scala/scala/swing/ProgressBar.scala | 4 +- src/main/scala/scala/swing/RadioButton.scala | 2 +- src/main/scala/scala/swing/Reactions.scala | 3 +- src/main/scala/scala/swing/RichWindow.scala | 14 +- src/main/scala/scala/swing/Separator.scala | 2 +- src/main/scala/scala/swing/Slider.scala | 5 +- src/main/scala/scala/swing/SplitPane.scala | 6 +- src/main/scala/scala/swing/Swing.scala | 43 ++++--- src/main/scala/scala/swing/TabbedPane.scala | 9 +- src/main/scala/scala/swing/Table.scala | 8 +- src/main/scala/scala/swing/TextArea.scala | 2 +- .../scala/scala/swing/TextComponent.scala | 13 +- src/main/scala/scala/swing/TextField.scala | 11 +- src/main/scala/scala/swing/TextPane.scala | 2 +- src/main/scala/scala/swing/ToggleButton.scala | 2 +- src/main/scala/scala/swing/UIElement.scala | 19 ++- src/main/scala/scala/swing/Window.scala | 26 ++-- src/main/scala/scala/swing/model/Matrix.scala | 121 ------------------ 41 files changed, 165 insertions(+), 274 deletions(-) delete mode 100644 src/main/scala/scala/swing/model/Matrix.scala diff --git a/build.sbt b/build.sbt index 6b780218..ad5af88e 100644 --- a/build.sbt +++ b/build.sbt @@ -4,21 +4,23 @@ scalaModuleSettings name := "scala-swing" -version := "2.0.4-SNAPSHOT" +version := "2.1.0-SNAPSHOT" scalacOptions ++= Seq("-deprecation", "-feature") // Map[JvmMajorVersion, List[(ScalaVersion, UseForPublishing)]] scalaVersionsByJvm in ThisBuild := Map( - 8 -> List("2.11.12", "2.12.6", "2.13.0-M3").map(_ -> true), - 9 -> List("2.11.12", "2.12.6", "2.13.0-M3").map(_ -> false), - 10 -> List("2.11.12", "2.12.6", "2.13.0-M3").map(_ -> false), - 11 -> List("2.11.12", "2.12.6", "2.13.0-M3").map(_ -> false) + 8 -> List("2.11.12", "2.12.6", "2.13.0-M5").map(_ -> true), + 9 -> List("2.11.12", "2.12.6", "2.13.0-M5").map(_ -> false), + 10 -> List("2.11.12", "2.12.6", "2.13.0-M5").map(_ -> false), + 11 -> List("2.11.12", "2.12.6", "2.13.0-M5").map(_ -> false) ) +scalaVersion in ThisBuild := "2.12.8" // for testing + OsgiKeys.exportPackage := Seq(s"scala.swing.*;version=${version.value}") -mimaPreviousVersion := Some("2.0.0") +mimaPreviousVersion := None // Some("2.0.0") // set the prompt (for this build) to include the project id. shellPrompt in ThisBuild := { state => Project.extract(state).currentRef.project + "> " } @@ -26,8 +28,8 @@ shellPrompt in ThisBuild := { state => Project.extract(state).currentRef.project lazy val swing = project.in(file(".")) .settings( libraryDependencies += { - val v = if (scalaVersion.value == "2.13.0-M3") "3.0.5-M1" else "3.0.5" - "org.scalatest" %% "scalatest" % v % "test" + val v = if (scalaVersion.value == "2.13.0-M5") "3.0.6-SNAP5" else "3.0.5" + "org.scalatest" %% "scalatest" % v % Test } ) diff --git a/src/main/scala/scala/swing/AbstractButton.scala b/src/main/scala/scala/swing/AbstractButton.scala index 00126886..d936f528 100644 --- a/src/main/scala/scala/swing/AbstractButton.scala +++ b/src/main/scala/scala/swing/AbstractButton.scala @@ -10,8 +10,9 @@ package scala.swing -import event._ -import javax.swing.{AbstractButton => JAbstractButton, Icon} +import javax.swing.{Icon, AbstractButton => JAbstractButton} + +import scala.swing.event.{ButtonClicked, Key} /** * Base class of all button-like widgets, such as push buttons, diff --git a/src/main/scala/scala/swing/Action.scala b/src/main/scala/scala/swing/Action.scala index 580687d5..31e4678c 100644 --- a/src/main/scala/scala/swing/Action.scala +++ b/src/main/scala/scala/swing/Action.scala @@ -10,9 +10,10 @@ package scala.swing -import javax.swing.{KeyStroke, Icon} import java.awt.event.ActionListener +import javax.swing.{Icon, KeyStroke} + object Action { /** * Special action that has an empty title and all default properties and does nothing. @@ -29,7 +30,7 @@ object Action { def addActionListener(a: ActionListener): Unit def removeActionListener(a: ActionListener): Unit def setAction(a: javax.swing.Action): Unit - def getAction(): javax.swing.Action + def getAction(): javax.swing.Action // note: must keep empty parentheses for Java compatibility } // TODO: we need an action cache diff --git a/src/main/scala/scala/swing/BoxPanel.scala b/src/main/scala/scala/swing/BoxPanel.scala index f5859a8b..42aa5e30 100644 --- a/src/main/scala/scala/swing/BoxPanel.scala +++ b/src/main/scala/scala/swing/BoxPanel.scala @@ -17,7 +17,7 @@ package scala.swing * @see javax.swing.BoxLayout */ class BoxPanel(orientation: Orientation.Value) extends Panel with SequentialContainer.Wrapper { - override lazy val peer = { + override lazy val peer: javax.swing.JPanel = { val p = new javax.swing.JPanel with SuperMixin val l = new javax.swing.BoxLayout(p, orientation.id) p.setLayout(l) diff --git a/src/main/scala/scala/swing/Button.scala b/src/main/scala/scala/swing/Button.scala index 492dfd29..c0c3885b 100644 --- a/src/main/scala/scala/swing/Button.scala +++ b/src/main/scala/scala/swing/Button.scala @@ -8,10 +8,10 @@ package scala.swing -import javax.swing._ +import javax.swing.JButton object Button { - def apply(text0: String)(op: => Unit) = new Button(Action(text0)(op)) + def apply(text0: String)(op: => Unit): Button = new Button(Action(text0)(op)) } /** diff --git a/src/main/scala/scala/swing/ButtonGroup.scala b/src/main/scala/scala/swing/ButtonGroup.scala index 82658561..caf8e02e 100644 --- a/src/main/scala/scala/swing/ButtonGroup.scala +++ b/src/main/scala/scala/swing/ButtonGroup.scala @@ -25,7 +25,7 @@ class ButtonGroup(initialButtons: AbstractButton*) { def contains(b: AbstractButton): Boolean = this.iterator.contains(b) override def size: Int = peer.getButtonCount def iterator: Iterator[AbstractButton] = new Iterator[AbstractButton] { - val enum = peer.getElements + private val enum = peer.getElements def next: AbstractButton = UIElement.cachedWrapper[AbstractButton](enum.nextElement) def hasNext: Boolean = enum.hasMoreElements } diff --git a/src/main/scala/scala/swing/CheckBox.scala b/src/main/scala/scala/swing/CheckBox.scala index 2e884aee..11aa05f7 100644 --- a/src/main/scala/scala/swing/CheckBox.scala +++ b/src/main/scala/scala/swing/CheckBox.scala @@ -10,7 +10,7 @@ package scala.swing -import javax.swing._ +import javax.swing.JCheckBox /** * Two state button that can either be checked or unchecked. diff --git a/src/main/scala/scala/swing/ComboBox.scala b/src/main/scala/scala/swing/ComboBox.scala index b1e4b6e3..c507cca9 100644 --- a/src/main/scala/scala/swing/ComboBox.scala +++ b/src/main/scala/scala/swing/ComboBox.scala @@ -9,9 +9,10 @@ package scala.swing import java.awt.event.ActionListener + import javax.swing.{AbstractListModel, ComboBoxModel, InputVerifier, JComboBox, JComponent, JTextField, ListCellRenderer} -import scala.swing.event._ +import scala.swing.event.ActionEvent object ComboBox { /** @@ -44,7 +45,7 @@ object ComboBox { def getEditorComponent: JComponent = Editor.this.component.peer - def getItem(): AnyRef = item.asInstanceOf[AnyRef] + def getItem: AnyRef = item.asInstanceOf[AnyRef] def selectAll(): Unit = startEditing() @@ -84,7 +85,7 @@ object ComboBox { def getEditorComponent: JComponent = editor.getEditorComponent.asInstanceOf[JComponent] def selectAll(): Unit = editor.selectAll() - def getItem(): AnyRef = { verifier.verify(getEditorComponent); value.asInstanceOf[AnyRef] } + def getItem: AnyRef = { verifier.verify(getEditorComponent); value.asInstanceOf[AnyRef] } def setItem(a: Any): Unit = editor.setItem(a) val verifier: InputVerifier = new InputVerifier { diff --git a/src/main/scala/scala/swing/Component.scala b/src/main/scala/scala/swing/Component.scala index 680ccaf9..a3475f63 100644 --- a/src/main/scala/scala/swing/Component.scala +++ b/src/main/scala/scala/swing/Component.scala @@ -8,8 +8,6 @@ package scala.swing -import event._ - import java.awt.Graphics import java.awt.event._ import javax.swing.JComponent @@ -42,7 +40,9 @@ object Component { */ abstract class Component extends UIElement { override lazy val peer: javax.swing.JComponent = new javax.swing.JComponent with SuperMixin {} - var initP: JComponent = null + + // TODO: what was this used for? + // var initP: JComponent = null /** * This trait is used to redirect certain calls from the peer to the wrapper @@ -127,13 +127,13 @@ abstract class Component extends UIElement { def mouseEntered(e: java.awt.event.MouseEvent): Unit = () def mouseExited(e: java.awt.event.MouseEvent): Unit = () def mouseClicked(e: java.awt.event.MouseEvent): Unit = - publish(new MouseClicked(e)) + publish(new event.MouseClicked(e)) def mousePressed(e: java.awt.event.MouseEvent): Unit = - publish(new MousePressed(e)) + publish(new event.MousePressed(e)) def mouseReleased(e: java.awt.event.MouseEvent): Unit = - publish(new MouseReleased(e)) + publish(new event.MouseReleased(e)) } def onFirstSubscribe (): Unit = peer.addMouseListener(l) @@ -145,10 +145,10 @@ abstract class Component extends UIElement { val moves: Publisher = new LazyPublisher { lazy val mouseListener: MouseListener = new MouseListener { def mouseEntered(e: java.awt.event.MouseEvent): Unit = - publish(new MouseEntered(e)) + publish(new event.MouseEntered(e)) def mouseExited(e: java.awt.event.MouseEvent): Unit = - publish(new MouseExited(e)) + publish(new event.MouseExited(e)) def mouseClicked (e: java.awt.event.MouseEvent): Unit = () def mousePressed (e: java.awt.event.MouseEvent): Unit = () @@ -157,10 +157,10 @@ abstract class Component extends UIElement { lazy val mouseMotionListener: MouseMotionListener = new MouseMotionListener { def mouseMoved(e: java.awt.event.MouseEvent): Unit = - publish(new MouseMoved(e)) + publish(new event.MouseMoved(e)) def mouseDragged(e: java.awt.event.MouseEvent): Unit = - publish(new MouseDragged(e)) + publish(new event.MouseDragged(e)) } def onFirstSubscribe(): Unit = { peer.addMouseListener(mouseListener) @@ -179,7 +179,7 @@ abstract class Component extends UIElement { // mouse wheel events if there is a listener installed. See ticket #1442. lazy val l: MouseWheelListener = new MouseWheelListener { def mouseWheelMoved(e: java.awt.event.MouseWheelEvent): Unit = - publish(new MouseWheelMoved(e)) + publish(new event.MouseWheelMoved(e)) } def onFirstSubscribe (): Unit = peer.addMouseWheelListener(l) def onLastUnsubscribe(): Unit = peer.removeMouseWheelListener(l) @@ -188,9 +188,9 @@ abstract class Component extends UIElement { object keys extends Publisher { peer.addKeyListener(new KeyListener { - def keyPressed (e: java.awt.event.KeyEvent): Unit = publish(new KeyPressed(e)) - def keyReleased (e: java.awt.event.KeyEvent): Unit = publish(new KeyReleased(e)) - def keyTyped (e: java.awt.event.KeyEvent): Unit = publish(new KeyTyped(e)) + def keyPressed (e: java.awt.event.KeyEvent): Unit = publish(new event.KeyPressed (e)) + def keyReleased (e: java.awt.event.KeyEvent): Unit = publish(new event.KeyReleased(e)) + def keyTyped (e: java.awt.event.KeyEvent): Unit = publish(new event.KeyTyped (e)) }) } @@ -205,16 +205,16 @@ abstract class Component extends UIElement { // TODO: deprecated, remove after 2.8 peer.addComponentListener(new java.awt.event.ComponentListener { def componentHidden(e: java.awt.event.ComponentEvent): Unit = - publish(UIElementHidden(Component.this)) + publish(event.UIElementHidden(Component.this)) def componentShown(e: java.awt.event.ComponentEvent): Unit = - publish(UIElementShown(Component.this)) + publish(event.UIElementShown(Component.this)) def componentMoved(e: java.awt.event.ComponentEvent): Unit = - publish(UIElementMoved(Component.this)) + publish(event.UIElementMoved(Component.this)) def componentResized(e: java.awt.event.ComponentEvent): Unit = - publish(UIElementResized(Component.this)) + publish(event.UIElementResized(Component.this)) }) peer.addFocusListener(new java.awt.event.FocusListener { @@ -224,18 +224,18 @@ abstract class Component extends UIElement { } def focusGained(e: java.awt.event.FocusEvent): Unit = - publish(FocusGained(Component.this, other(e), e.isTemporary)) + publish(event.FocusGained(Component.this, other(e), e.isTemporary)) def focusLost(e: java.awt.event.FocusEvent): Unit = - publish(FocusLost(Component.this, other(e), e.isTemporary)) + publish(event.FocusLost(Component.this, other(e), e.isTemporary)) }) peer.addPropertyChangeListener(new java.beans.PropertyChangeListener { def propertyChange(e: java.beans.PropertyChangeEvent): Unit = e.getPropertyName match { - case "font" => publish(FontChanged (Component.this)) - case "background" => publish(BackgroundChanged(Component.this)) - case "foreground" => publish(ForegroundChanged(Component.this)) + case "font" => publish(event.FontChanged (Component.this)) + case "background" => publish(event.BackgroundChanged(Component.this)) + case "foreground" => publish(event.ForegroundChanged(Component.this)) case _ => /*case "focusable" => case "focusTraversalKeysEnabled" => diff --git a/src/main/scala/scala/swing/Container.scala b/src/main/scala/scala/swing/Container.scala index 9ae0bd6a..be591a11 100644 --- a/src/main/scala/scala/swing/Container.scala +++ b/src/main/scala/scala/swing/Container.scala @@ -10,7 +10,7 @@ package scala.swing -import scala.swing.event._ +import scala.swing.event.{ComponentAdded, ComponentRemoved} object Container { /** diff --git a/src/main/scala/scala/swing/EditorPane.scala b/src/main/scala/scala/swing/EditorPane.scala index 3ab0305e..f4efbdfb 100644 --- a/src/main/scala/scala/swing/EditorPane.scala +++ b/src/main/scala/scala/swing/EditorPane.scala @@ -8,11 +8,11 @@ package scala.swing -import javax.swing._ -import javax.swing.text._ +import javax.swing.JEditorPane +import javax.swing.text.EditorKit /** - * A text component that allows multiline text input and display. + * A text component that allows multi-line text input and display. * * @see javax.swing.JEditorPane */ diff --git a/src/main/scala/scala/swing/FileChooser.scala b/src/main/scala/scala/swing/FileChooser.scala index 44633e32..931d033a 100644 --- a/src/main/scala/scala/swing/FileChooser.scala +++ b/src/main/scala/scala/swing/FileChooser.scala @@ -9,8 +9,9 @@ package scala.swing import java.io.File -import javax.swing._ -import javax.swing.filechooser._ + +import javax.swing.filechooser.FileFilter +import javax.swing.{Icon, JFileChooser} object FileChooser { /** diff --git a/src/main/scala/scala/swing/FlowPanel.scala b/src/main/scala/scala/swing/FlowPanel.scala index 45696cd1..987194a2 100644 --- a/src/main/scala/scala/swing/FlowPanel.scala +++ b/src/main/scala/scala/swing/FlowPanel.scala @@ -11,6 +11,7 @@ package scala.swing import java.awt.FlowLayout + import javax.swing.JPanel object FlowPanel { @@ -38,7 +39,7 @@ class FlowPanel(alignment: FlowPanel.Alignment.Value)(contents0: Component*) ext contents ++= contents0 - private def layoutManager = peer.getLayout.asInstanceOf[java.awt.FlowLayout] + private def layoutManager: FlowLayout = peer.getLayout.asInstanceOf[FlowLayout] def vGap: Int = layoutManager.getVgap def vGap_=(n: Int): Unit = layoutManager.setVgap(n) diff --git a/src/main/scala/scala/swing/FormattedTextField.scala b/src/main/scala/scala/swing/FormattedTextField.scala index 301b9dc7..c624416a 100644 --- a/src/main/scala/scala/swing/FormattedTextField.scala +++ b/src/main/scala/scala/swing/FormattedTextField.scala @@ -8,7 +8,7 @@ package scala.swing -import javax.swing._ +import javax.swing.JFormattedTextField object FormattedTextField { /** diff --git a/src/main/scala/scala/swing/GridBagPanel.scala b/src/main/scala/scala/swing/GridBagPanel.scala index fdeaf249..e15a151a 100644 --- a/src/main/scala/scala/swing/GridBagPanel.scala +++ b/src/main/scala/scala/swing/GridBagPanel.scala @@ -51,7 +51,7 @@ class GridBagPanel extends Panel with LayoutContainer { override lazy val peer = new javax.swing.JPanel(new GridBagLayout) with SuperMixin import GridBagPanel._ - private def layoutManager = peer.getLayout.asInstanceOf[GridBagLayout] + private def layoutManager: GridBagLayout = peer.getLayout.asInstanceOf[GridBagLayout] /** * Convenient conversion from xy-coords given as pairs to @@ -65,7 +65,7 @@ class GridBagPanel extends Panel with LayoutContainer { } class Constraints(val peer: GridBagConstraints) extends Proxy { - def self = peer + def self: Any = peer def this(gridx: Int, gridy: Int, gridwidth: Int, gridheight: Int, weightx: Double, weighty: Double, @@ -107,7 +107,7 @@ class GridBagPanel extends Panel with LayoutContainer { def ipady_=(y: Int): Unit = { peer.ipady = y } } - protected def constraintsFor(comp: Component) = + protected def constraintsFor(comp: Component): Constraints = new Constraints(layoutManager.getConstraints(comp.peer)) protected def areValid(c: Constraints): (Boolean, String) = (true, "") diff --git a/src/main/scala/scala/swing/GridPanel.scala b/src/main/scala/scala/swing/GridPanel.scala index 2a0204a5..b229062d 100644 --- a/src/main/scala/scala/swing/GridPanel.scala +++ b/src/main/scala/scala/swing/GridPanel.scala @@ -10,6 +10,8 @@ package scala.swing +import java.awt.GridLayout + object GridPanel { val Adapt = 0 } @@ -37,7 +39,7 @@ class GridPanel(rows0: Int, cols0: Int) extends Panel with SequentialContainer.W protected def areValid(c: Constraints): (Boolean, String) = ((c._1 > 0 && c._2 > 0), "Grid coordinates (row,col) must be >= 1 but where " + c)*/ - private def layoutManager = peer.getLayout.asInstanceOf[java.awt.GridLayout] + private def layoutManager: GridLayout = peer.getLayout.asInstanceOf[GridLayout] def rows: Int = layoutManager.getRows def rows_=(n: Int): Unit = layoutManager.setRows(n) diff --git a/src/main/scala/scala/swing/Label.scala b/src/main/scala/scala/swing/Label.scala index 7b1bc8d1..489f3362 100644 --- a/src/main/scala/scala/swing/Label.scala +++ b/src/main/scala/scala/swing/Label.scala @@ -10,8 +10,9 @@ package scala.swing -import javax.swing._ -import scala.swing.Swing._ +import javax.swing.{Icon, JLabel} + +import scala.swing.Swing.{EmptyIcon, toNullIcon} /** * A label component that display either a text, an icon, or both. diff --git a/src/main/scala/scala/swing/LayoutContainer.scala b/src/main/scala/scala/swing/LayoutContainer.scala index ac9d5cc4..b5d29568 100644 --- a/src/main/scala/scala/swing/LayoutContainer.scala +++ b/src/main/scala/scala/swing/LayoutContainer.scala @@ -9,6 +9,7 @@ package scala.swing import javax.swing.JComponent + import scala.collection.mutable /** A container that associates layout constraints of member type diff --git a/src/main/scala/scala/swing/ListView.scala b/src/main/scala/scala/swing/ListView.scala index 6f3ca2a4..6d1482e7 100644 --- a/src/main/scala/scala/swing/ListView.scala +++ b/src/main/scala/scala/swing/ListView.scala @@ -26,7 +26,7 @@ object ListView { } def wrap[A](c: JList[A]): ListView[A] = new ListView[A] { - override lazy val peer = c + override lazy val peer: JList[A] = c } object Renderer { @@ -151,7 +151,7 @@ class ListView[A] extends Component { } protected class ModelWrapper[B](val items: Seq[B]) extends AbstractListModel[B] { - def getElementAt(n: Int) = items(n) + def getElementAt(n: Int): B = items(n) def getSize: Int = items.size } diff --git a/src/main/scala/scala/swing/Menu.scala b/src/main/scala/scala/swing/Menu.scala index 38b1787c..fbe8d4a1 100644 --- a/src/main/scala/scala/swing/Menu.scala +++ b/src/main/scala/scala/swing/Menu.scala @@ -8,8 +8,9 @@ package scala.swing +import javax.swing.{JCheckBoxMenuItem, JMenu, JMenuBar, JMenuItem, JRadioButtonMenuItem} + import scala.collection.mutable -import javax.swing._ object MenuBar { case object NoMenuBar extends MenuBar diff --git a/src/main/scala/scala/swing/Oriented.scala b/src/main/scala/scala/swing/Oriented.scala index 1a705f05..4253c6c4 100644 --- a/src/main/scala/scala/swing/Oriented.scala +++ b/src/main/scala/scala/swing/Oriented.scala @@ -16,10 +16,10 @@ object Oriented { /* * Need to revert to structural type, since scroll bars are oriented - * and these are created by scroll panes. Shouldn't be a bootleneck. + * and these are created by scroll panes. Shouldn't be a bottleneck. */ protected type OrientedMixin = { - def getOrientation(): Int + def getOrientation(): Int // note: must keep empty parentheses for Java compatibility def setOrientation(n: Int): Unit } def orientation: Orientation.Value = Orientation(peer.getOrientation) diff --git a/src/main/scala/scala/swing/PasswordField.scala b/src/main/scala/scala/swing/PasswordField.scala index e7ee3bf7..acf6caac 100644 --- a/src/main/scala/scala/swing/PasswordField.scala +++ b/src/main/scala/scala/swing/PasswordField.scala @@ -8,7 +8,7 @@ package scala.swing -import javax.swing._ +import javax.swing.JPasswordField /** * A password field, that displays a replacement character for each character in the password. diff --git a/src/main/scala/scala/swing/PopupMenu.scala b/src/main/scala/scala/swing/PopupMenu.scala index 15566aaa..6fc21de1 100644 --- a/src/main/scala/scala/swing/PopupMenu.scala +++ b/src/main/scala/scala/swing/PopupMenu.scala @@ -11,8 +11,7 @@ package scala.swing import javax.swing.JPopupMenu -import javax.swing.event.{PopupMenuListener, PopupMenuEvent} -import event._ +import javax.swing.event.{PopupMenuEvent, PopupMenuListener} /** * A popup menu. @@ -46,13 +45,13 @@ class PopupMenu extends Component with SequentialContainer.Wrapper with Publishe peer.addPopupMenuListener(new PopupMenuListener { def popupMenuCanceled(e: PopupMenuEvent): Unit = - publish(PopupMenuCanceled(PopupMenu.this)) + publish(event.PopupMenuCanceled(PopupMenu.this)) def popupMenuWillBecomeInvisible(e: PopupMenuEvent): Unit = - publish(PopupMenuWillBecomeInvisible(PopupMenu.this)) + publish(event.PopupMenuWillBecomeInvisible(PopupMenu.this)) def popupMenuWillBecomeVisible(e: PopupMenuEvent): Unit = - publish(PopupMenuWillBecomeVisible(PopupMenu.this)) + publish(event.PopupMenuWillBecomeVisible(PopupMenu.this)) }) def show(invoker: Component, x: Int, y: Int): Unit = peer.show(invoker.peer, x, y) diff --git a/src/main/scala/scala/swing/ProgressBar.scala b/src/main/scala/scala/swing/ProgressBar.scala index ab67f3a9..283098b7 100644 --- a/src/main/scala/scala/swing/ProgressBar.scala +++ b/src/main/scala/scala/swing/ProgressBar.scala @@ -8,6 +8,8 @@ package scala.swing +import javax.swing.JProgressBar + /** * A bar indicating progress of some action. Can be in indeterminate mode, * in which it indicates that the action is in progress (usually by some @@ -16,7 +18,7 @@ package scala.swing * @see javax.swing.JProgressBar */ class ProgressBar extends Component with Orientable.Wrapper { - override lazy val peer: javax.swing.JProgressBar = + override lazy val peer: JProgressBar = new javax.swing.JProgressBar with SuperMixin def min: Int = peer.getMinimum diff --git a/src/main/scala/scala/swing/RadioButton.scala b/src/main/scala/scala/swing/RadioButton.scala index 64f8b237..0bc6e066 100644 --- a/src/main/scala/scala/swing/RadioButton.scala +++ b/src/main/scala/scala/swing/RadioButton.scala @@ -10,7 +10,7 @@ package scala.swing -import javax.swing._ +import javax.swing.JRadioButton /** * A two state button that is usually used in a ButtonGroup diff --git a/src/main/scala/scala/swing/Reactions.scala b/src/main/scala/scala/swing/Reactions.scala index d8c3baf5..86d491ec 100644 --- a/src/main/scala/scala/swing/Reactions.scala +++ b/src/main/scala/scala/swing/Reactions.scala @@ -11,12 +11,11 @@ package scala.swing import scala.collection.mutable -import scala.collection.mutable.ListBuffer import scala.swing.event.Event object Reactions { class Impl extends Reactions { - private val parts: mutable.Buffer[Reaction] = new ListBuffer[Reaction] + private val parts: mutable.Buffer[Reaction] = new mutable.ListBuffer[Reaction] def isDefinedAt(e: Event): Boolean = parts.exists(_ isDefinedAt e) def += (r: Reaction): this.type = { parts += r; this } def -= (r: Reaction): this.type = { parts -= r; this } diff --git a/src/main/scala/scala/swing/RichWindow.scala b/src/main/scala/scala/swing/RichWindow.scala index 1aa546e8..7675f162 100644 --- a/src/main/scala/scala/swing/RichWindow.scala +++ b/src/main/scala/scala/swing/RichWindow.scala @@ -8,9 +8,11 @@ package scala.swing -import java.awt.{ Window => AWTWindow, Frame => AWTFrame } -import javax.swing._ -import Swing._ +import java.awt.{Frame => AWTFrame, Window => AWTWindow} + +import javax.swing.{Icon, JDialog, JFrame, JMenuBar, JOptionPane, UIManager} + +import scala.swing.Swing.{EmptyIcon, PeerContainer, nullPeer} object RichWindow { /** @@ -34,13 +36,13 @@ sealed trait RichWindow extends Window { def peer: AWTWindow with InterfaceMixin trait InterfaceMixin extends super.InterfaceMixin { - def getJMenuBar(): JMenuBar + def getJMenuBar: JMenuBar def setJMenuBar(b: JMenuBar): Unit def setUndecorated(b: Boolean): Unit def setTitle(s: String): Unit - def getTitle(): String + def getTitle: String def setResizable(b: Boolean): Unit - def isResizable(): Boolean + def isResizable: Boolean } def title: String = peer.getTitle diff --git a/src/main/scala/scala/swing/Separator.scala b/src/main/scala/scala/swing/Separator.scala index 32d209d5..4dc03e7d 100644 --- a/src/main/scala/scala/swing/Separator.scala +++ b/src/main/scala/scala/swing/Separator.scala @@ -10,7 +10,7 @@ package scala.swing -import javax.swing._ +import javax.swing.JSeparator /** * A bar that can be used a separator, most commonly in menus. diff --git a/src/main/scala/scala/swing/Slider.scala b/src/main/scala/scala/swing/Slider.scala index 12e2f28d..d3457bf2 100644 --- a/src/main/scala/scala/swing/Slider.scala +++ b/src/main/scala/scala/swing/Slider.scala @@ -10,8 +10,7 @@ package scala.swing -import javax.swing.{JSlider, JLabel} -import scala.swing.event._ +import javax.swing.{JLabel, JSlider} /** * Lets users select a value from a given range. Visually, this is represented @@ -65,6 +64,6 @@ class Slider extends Component with Orientable.Wrapper with Publisher { peer.addChangeListener(new javax.swing.event.ChangeListener { def stateChanged(e: javax.swing.event.ChangeEvent): Unit = - publish(new ValueChanged(Slider.this)) + publish(new event.ValueChanged(Slider.this)) }) } diff --git a/src/main/scala/scala/swing/SplitPane.scala b/src/main/scala/scala/swing/SplitPane.scala index d584c168..3725ed1b 100644 --- a/src/main/scala/scala/swing/SplitPane.scala +++ b/src/main/scala/scala/swing/SplitPane.scala @@ -8,7 +8,9 @@ package scala.swing -import Swing._ +import javax.swing.JSplitPane + +import scala.swing.Swing.nullPeer /** * A container with exactly two children. Arranges them side by side, either @@ -18,7 +20,7 @@ import Swing._ * @see javax.swing.JSplitPane */ class SplitPane(o: Orientation.Value, left: Component, right: Component) extends Component with Container with Orientable.Wrapper { - override lazy val peer: javax.swing.JSplitPane = + override lazy val peer: JSplitPane = new javax.swing.JSplitPane(o.id, left.peer, right.peer) with SuperMixin def this(o: Orientation.Value) = this(o, new Component {}, new Component {}) def this() = this(Orientation.Horizontal) diff --git a/src/main/scala/scala/swing/Swing.scala b/src/main/scala/scala/swing/Swing.scala index cd97a1cf..0bf55436 100644 --- a/src/main/scala/scala/swing/Swing.scala +++ b/src/main/scala/scala/swing/Swing.scala @@ -11,10 +11,11 @@ package scala.swing import java.awt -import java.awt.event._ -import javax.swing.border._ -import javax.swing.event._ -import javax.swing.{BorderFactory, Icon, JComponent, SwingUtilities} +import java.awt.event.{ActionEvent, ActionListener} + +import javax.swing.border.{BevelBorder, Border, CompoundBorder, MatteBorder, TitledBorder} +import javax.swing.event.{ChangeEvent, ChangeListener} +import javax.swing.{BorderFactory, Icon, ImageIcon, JComponent, SwingUtilities} /** * Helpers for this package. @@ -40,31 +41,31 @@ object Swing { def actionPerformed(e: ActionEvent): Unit = f(e) } - def Box(min: Dimension, pref: Dimension, max: Dimension) = new Component { - override lazy val peer = new javax.swing.Box.Filler(min, pref, max) + def Box(min: Dimension, pref: Dimension, max: Dimension): Component = new Component { + override lazy val peer: JComponent = new javax.swing.Box.Filler(min, pref, max) } - def HGlue = new Component { - override lazy val peer = javax.swing.Box.createHorizontalGlue.asInstanceOf[JComponent] + def HGlue: Component = new Component { + override lazy val peer: JComponent = javax.swing.Box.createHorizontalGlue.asInstanceOf[JComponent] } - def VGlue = new Component { - override lazy val peer = javax.swing.Box.createVerticalGlue.asInstanceOf[JComponent] + def VGlue: Component = new Component { + override lazy val peer: JComponent = javax.swing.Box.createVerticalGlue.asInstanceOf[JComponent] } - def Glue = new Component { - override lazy val peer = javax.swing.Box.createGlue.asInstanceOf[JComponent] + def Glue: Component = new Component { + override lazy val peer: JComponent = javax.swing.Box.createGlue.asInstanceOf[JComponent] } - def RigidBox(dim: Dimension) = new Component { - override lazy val peer = javax.swing.Box.createRigidArea(dim).asInstanceOf[JComponent] + def RigidBox(dim: Dimension): Component = new Component { + override lazy val peer: JComponent = javax.swing.Box.createRigidArea(dim).asInstanceOf[JComponent] } - def HStrut(width: Int) = new Component { - override lazy val peer = javax.swing.Box.createHorizontalStrut(width).asInstanceOf[JComponent] + def HStrut(width: Int): Component = new Component { + override lazy val peer: JComponent = javax.swing.Box.createHorizontalStrut(width).asInstanceOf[JComponent] } - def VStrut(height: Int) = new Component { - override lazy val peer = javax.swing.Box.createVerticalStrut(height).asInstanceOf[JComponent] + def VStrut(height: Int): Component = new Component { + override lazy val peer: JComponent = javax.swing.Box.createVerticalStrut(height).asInstanceOf[JComponent] } - def Icon(image: java.awt.Image) = new javax.swing.ImageIcon(image) - def Icon(filename: String) = new javax.swing.ImageIcon(filename) - def Icon(url: java.net.URL) = new javax.swing.ImageIcon(url) + def Icon(image: java.awt.Image) : ImageIcon = new ImageIcon(image) + def Icon(filename: String) : ImageIcon = new ImageIcon(filename) + def Icon(url: java.net.URL) : ImageIcon = new ImageIcon(url) /** * The empty icon. Use this icon instead of null to indicate diff --git a/src/main/scala/scala/swing/TabbedPane.scala b/src/main/scala/scala/swing/TabbedPane.scala index 99e62d0e..e3ab7e59 100644 --- a/src/main/scala/scala/swing/TabbedPane.scala +++ b/src/main/scala/scala/swing/TabbedPane.scala @@ -12,9 +12,6 @@ package scala.swing import javax.swing.JTabbedPane -import scala.swing.event._ - - object TabbedPane { object Layout extends Enumeration { import JTabbedPane._ @@ -23,7 +20,7 @@ object TabbedPane { } class Page protected[TabbedPane](parent0: TabbedPane, title0: String, content0: Component, tip0: String) extends Proxy { - def self = content0 + def self: Any = content0 def this(title0: String, content0: Component, tip0: String) = this(null, title0, content0, tip0) @@ -98,7 +95,7 @@ class TabbedPane extends Component with Publisher { def +=(t: Page): this.type = { t.parent = TabbedPane.this; peer.addTab(t.title, null, t.content.peer, t.tip); this } def length: Int = peer.getTabCount - def apply(n: Int) = new Page(TabbedPane.this, peer.getTitleAt(n), + def apply(n: Int): Page = new Page(TabbedPane.this, peer.getTitleAt(n), UIElement.cachedWrapper[Component](peer.getComponentAt(n).asInstanceOf[javax.swing.JComponent]), peer.getToolTipTextAt(n)) } @@ -125,7 +122,7 @@ class TabbedPane extends Component with Publisher { peer.addChangeListener(new javax.swing.event.ChangeListener { def stateChanged(e: javax.swing.event.ChangeEvent): Unit = - publish(SelectionChanged(TabbedPane.this)) + publish(event.SelectionChanged(TabbedPane.this)) }) } } diff --git a/src/main/scala/scala/swing/Table.scala b/src/main/scala/scala/swing/Table.scala index b2664cfa..81c1e258 100644 --- a/src/main/scala/scala/swing/Table.scala +++ b/src/main/scala/scala/swing/Table.scala @@ -10,12 +10,12 @@ package scala.swing -import javax.swing._ -import javax.swing.event._ -import javax.swing.table._ +import javax.swing.event.{ListSelectionListener, TableModelEvent, TableModelListener} +import javax.swing.table.{AbstractTableModel, DefaultTableModel, TableCellEditor, TableCellRenderer, TableModel} +import javax.swing.{Icon, JComponent, JTable, ListSelectionModel, RowSorter, SortOrder} import scala.collection.mutable -import scala.swing.event._ +import scala.swing.event.{TableChanged, TableColumnsSelected, TableRowsAdded, TableRowsRemoved, TableRowsSelected, TableStructureChanged, TableUpdated} object Table { object AutoResizeMode extends Enumeration { diff --git a/src/main/scala/scala/swing/TextArea.scala b/src/main/scala/scala/swing/TextArea.scala index d7e660c1..fe3c272b 100644 --- a/src/main/scala/scala/swing/TextArea.scala +++ b/src/main/scala/scala/swing/TextArea.scala @@ -8,7 +8,7 @@ package scala.swing -import javax.swing._ +import javax.swing.JTextArea /** * A text component that allows multiline text input and display. diff --git a/src/main/scala/scala/swing/TextComponent.scala b/src/main/scala/scala/swing/TextComponent.scala index e1dffcac..7023c5b8 100644 --- a/src/main/scala/scala/swing/TextComponent.scala +++ b/src/main/scala/scala/swing/TextComponent.scala @@ -8,9 +8,8 @@ package scala.swing -import event._ -import javax.swing.text._ -import javax.swing.event._ +import javax.swing.event.{CaretEvent, CaretListener, DocumentEvent, DocumentListener} +import javax.swing.text.JTextComponent object TextComponent { trait HasColumns extends TextComponent { @@ -51,7 +50,7 @@ class TextComponent extends Component with Publisher { peer.addCaretListener { new CaretListener { - def caretUpdate(e: CaretEvent): Unit = publish(CaretUpdate(TextComponent.this)) + def caretUpdate(e: CaretEvent): Unit = publish(event.CaretUpdate(TextComponent.this)) } } } @@ -70,8 +69,8 @@ class TextComponent extends Component with Publisher { def selectAll(): Unit = peer.selectAll() peer.getDocument.addDocumentListener(new DocumentListener { - def changedUpdate(e:DocumentEvent): Unit = publish(new ValueChanged(TextComponent.this)) - def insertUpdate (e:DocumentEvent): Unit = publish(new ValueChanged(TextComponent.this)) - def removeUpdate (e:DocumentEvent): Unit = publish(new ValueChanged(TextComponent.this)) + def changedUpdate(e: DocumentEvent): Unit = publish(new event.ValueChanged(TextComponent.this)) + def insertUpdate (e: DocumentEvent): Unit = publish(new event.ValueChanged(TextComponent.this)) + def removeUpdate (e: DocumentEvent): Unit = publish(new event.ValueChanged(TextComponent.this)) }) } diff --git a/src/main/scala/scala/swing/TextField.scala b/src/main/scala/scala/swing/TextField.scala index 5906a7f9..f62574c2 100644 --- a/src/main/scala/scala/swing/TextField.scala +++ b/src/main/scala/scala/swing/TextField.scala @@ -10,10 +10,11 @@ package scala.swing -import event._ -import javax.swing._ -import java.awt.event._ +import java.awt.event.FocusAdapter +import javax.swing.{InputVerifier, JComponent, JTextField} + +import scala.swing.event.EditDone /*object TextField { object FocusLostBehavior extends Enumeration { @@ -64,7 +65,7 @@ class TextField(text0: String, columns0: Int) extends TextComponent with TextCom def verifier_=(v: String => Boolean): Unit = { peer.setInputVerifier(new InputVerifier { private val old = Option(peer.getInputVerifier) - def verify(c: JComponent) = v(text) + def verify(c: JComponent): Boolean = v(text) override def shouldYieldFocus(c: JComponent): Boolean = old forall (_ shouldYieldFocus c) }) } @@ -73,7 +74,7 @@ class TextField(text0: String, columns0: Int) extends TextComponent with TextCom peer.setInputVerifier(new InputVerifier { private val old = peer.getInputVerifier def verify(c: JComponent): Boolean = old.verify(c) - override def shouldYieldFocus(c: JComponent) = y(text) + override def shouldYieldFocus(c: JComponent): Boolean = y(text) }) } } diff --git a/src/main/scala/scala/swing/TextPane.scala b/src/main/scala/scala/swing/TextPane.scala index 76749696..a2a5f90b 100644 --- a/src/main/scala/scala/swing/TextPane.scala +++ b/src/main/scala/scala/swing/TextPane.scala @@ -12,7 +12,7 @@ package scala.swing * * @see javax.swing.JTextPane */ -class TextPane() extends TextComponent { +class TextPane extends TextComponent { override lazy val peer: javax.swing.JTextPane = new javax.swing.JTextPane() with SuperMixin def styledDocument: javax.swing.text.StyledDocument = peer.getStyledDocument } \ No newline at end of file diff --git a/src/main/scala/scala/swing/ToggleButton.scala b/src/main/scala/scala/swing/ToggleButton.scala index 8f210d00..0bd2975c 100644 --- a/src/main/scala/scala/swing/ToggleButton.scala +++ b/src/main/scala/scala/swing/ToggleButton.scala @@ -8,7 +8,7 @@ package scala.swing -import javax.swing._ +import javax.swing.JToggleButton /** * A two state button with a push button like user interface. diff --git a/src/main/scala/scala/swing/UIElement.scala b/src/main/scala/scala/swing/UIElement.scala index fb46c76e..dbf197b6 100644 --- a/src/main/scala/scala/swing/UIElement.scala +++ b/src/main/scala/scala/swing/UIElement.scala @@ -9,15 +9,14 @@ package scala.swing import java.awt.{ComponentOrientation, Cursor, Toolkit} -import java.util import java.util.Locale +import java.{util => ju} -import scala.ref._ -import scala.swing.event._ +import scala.ref.WeakReference object UIElement { private val ClientKey = "scala.swingWrapper" - private[this] val wrapperCache = new util.WeakHashMap[java.awt.Component, WeakReference[UIElement]] + private[this] val wrapperCache = new ju.WeakHashMap[java.awt.Component, WeakReference[UIElement]] private def cache(e: UIElement) = e.peer match { case p: javax.swing.JComponent => p.putClientProperty(ClientKey, e) @@ -52,7 +51,7 @@ object UIElement { def wrap(c: java.awt.Component): UIElement = { val w = cachedWrapper[UIElement](c) if (w != null) w - else new UIElement { def peer = c } + else new UIElement { def peer: java.awt.Component = c } } } @@ -75,7 +74,7 @@ trait UIElement extends Proxy with LazyPublisher { * The underlying Swing peer. */ def peer: java.awt.Component - def self = peer + def self: Any = peer UIElement.cache(this) @@ -122,16 +121,16 @@ trait UIElement extends Proxy with LazyPublisher { protected def onFirstSubscribe(): Unit = { peer.addComponentListener(new java.awt.event.ComponentListener { def componentHidden(e: java.awt.event.ComponentEvent): Unit = - publish(UIElementHidden(UIElement.this)) + publish(event.UIElementHidden(UIElement.this)) def componentShown(e: java.awt.event.ComponentEvent): Unit = - publish(UIElementShown(UIElement.this)) + publish(event.UIElementShown(UIElement.this)) def componentMoved(e: java.awt.event.ComponentEvent): Unit = - publish(UIElementMoved(UIElement.this)) + publish(event.UIElementMoved(UIElement.this)) def componentResized(e: java.awt.event.ComponentEvent): Unit = - publish(UIElementResized(UIElement.this)) + publish(event.UIElementResized(UIElement.this)) }) } protected def onLastUnsubscribe(): Unit = () diff --git a/src/main/scala/scala/swing/Window.scala b/src/main/scala/scala/swing/Window.scala index 97ca0693..5d254578 100644 --- a/src/main/scala/scala/swing/Window.scala +++ b/src/main/scala/scala/swing/Window.scala @@ -8,8 +8,8 @@ package scala.swing +import java.awt.event.{WindowEvent, WindowListener} import java.awt.{Window => AWTWindow} -import event._ /** * A window with decoration such as a title, border, and action buttons. @@ -25,9 +25,9 @@ abstract class Window extends UIElement with RootPanel with Publisher { outer => protected trait InterfaceMixin extends javax.swing.RootPaneContainer protected trait SuperMixin extends AWTWindow { - override protected def processWindowEvent(e: java.awt.event.WindowEvent): Unit = { + override protected def processWindowEvent(e: WindowEvent): Unit = { super.processWindowEvent(e) - if (e.getID == java.awt.event.WindowEvent.WINDOW_CLOSING) + if (e.getID == WindowEvent.WINDOW_CLOSING) closeOperation() } } @@ -63,16 +63,16 @@ abstract class Window extends UIElement with RootPanel with Publisher { outer => def owner: Window = UIElement.cachedWrapper[Window](peer.getOwner) - def open (): Unit = peer setVisible true - def close(): Unit = peer setVisible false + def open (): Unit = peer.setVisible(true) + def close(): Unit = peer.setVisible(false) - peer.addWindowListener(new java.awt.event.WindowListener { - def windowActivated (e: java.awt.event.WindowEvent): Unit = publish(WindowActivated(outer)) - def windowClosed (e: java.awt.event.WindowEvent): Unit = publish(WindowClosed(outer)) - def windowClosing (e: java.awt.event.WindowEvent): Unit = publish(WindowClosing(outer)) - def windowDeactivated (e: java.awt.event.WindowEvent): Unit = publish(WindowDeactivated(outer)) - def windowDeiconified (e: java.awt.event.WindowEvent): Unit = publish(WindowDeiconified(outer)) - def windowIconified (e: java.awt.event.WindowEvent): Unit = publish(WindowIconified(outer)) - def windowOpened (e: java.awt.event.WindowEvent): Unit = publish(WindowOpened(outer)) + peer.addWindowListener(new WindowListener { + def windowActivated (e: WindowEvent): Unit = publish(event.WindowActivated (outer)) + def windowClosed (e: WindowEvent): Unit = publish(event.WindowClosed (outer)) + def windowClosing (e: WindowEvent): Unit = publish(event.WindowClosing (outer)) + def windowDeactivated (e: WindowEvent): Unit = publish(event.WindowDeactivated(outer)) + def windowDeiconified (e: WindowEvent): Unit = publish(event.WindowDeiconified(outer)) + def windowIconified (e: WindowEvent): Unit = publish(event.WindowIconified (outer)) + def windowOpened (e: WindowEvent): Unit = publish(event.WindowOpened (outer)) }) } diff --git a/src/main/scala/scala/swing/model/Matrix.scala b/src/main/scala/scala/swing/model/Matrix.scala deleted file mode 100644 index 664d44a9..00000000 --- a/src/main/scala/scala/swing/model/Matrix.scala +++ /dev/null @@ -1,121 +0,0 @@ -/* __ *\ -** ________ ___ / / ___ Scala API ** -** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL ** -** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** -** /____/\___/_/ |_/____/_/ | | ** -** |/ ** -\* */ - - -package scala.swing -package model - -// Dummy to keep ant from recompiling on every run. -trait Matrix { } - -/*trait Matrix[A] extends Function2[Int, Int, A] { - - val width: Int - val height: Int - - assert(width > 0 && height > 0) - - private val delegate = new Array[A](width * height) - - override def apply(col: Int, row: Int): A = - delegate(col * height + row) - - def apply(coord: (Int, Int)): A = - apply(coord._1, coord._2) - - def col(index: Int): Matrix.FlatSeq[A] = - new Matrix.SubArray[A](delegate, index * height, height) - - def row(index: Int): Matrix.FlatSeq[A] = - new Matrix.SparseArray[A](delegate, index, height) - - def update(xpos: Int, ypos: Int, elem: A) { - delegate(xpos % width * height + ypos % height) = elem - } - - def update(coord: (Int, Int), elem: A) { - update(coord._1, coord._2, elem) - } - - def initializeWith(f: (Int, Int) => A): this.type = { - for (index <- 0 until (width * height)) - delegate(index) = f(index / height, index % height) - this - } - - def initializeTo(v: => A): this.type = { - for (index <- 0 until (width * height)) - delegate(index) = v - this - } - - def size: (Int, Int) = (width, height) - - /** A flattened view of the matrix. The flattening is done on columns i.e. - * the first values of the flattened sequence are the cells of the first - * column. As this is a view of the matrix, any change to the matrix will - * also be visible in the flattened array, and vice-versa. */ - def flat: Array[A] = delegate - -} - -object Matrix { - - def apply[A](columns: Int, rows: Int) = new Matrix[A] { - val width = columns - val height = rows - } - - def apply[A](default: (Int, Int) => A, columns: Int, rows: Int) = new Matrix[A] { - val width = columns - val height = rows - initializeWith(default) - } - - def apply[A](default: => A, columns: Int, rows: Int) = new Matrix[A] { - val width = columns - val height = rows - initializeTo(default) - } - - trait FlatSeq[A] extends RandomAccessSeq[A] { - def update (index: Int, elem: A): Unit - } - - private class SubArray[A](delegate: Array[A], start: Int, val length: Int) extends FlatSeq[A] { - def apply(index: Int): A = - if (index < length) - delegate(index + start) - else throw new IndexOutOfBoundsException - def update(index: Int, elem: A): Unit = - if (index < length) - delegate(index + start) = elem - else throw new IndexOutOfBoundsException - } - - private class SparseArray[A](delegate: Array[A], start: Int, span: Int) extends FlatSeq[A] { - def apply(index: Int): A = { - if (index < length) - delegate((index * span) + start) - else throw new IndexOutOfBoundsException - } - def length: Int = delegate.length / span - def update(index: Int, elem: A): Unit = - if (index < length) - delegate((index * span) + start) = elem - else throw new IndexOutOfBoundsException - } - - implicit def MatrixToSeqs[A](matrix: Matrix[A]): Seq[Seq[A]] = { - val result = new Array[SubArray[A]](matrix.width) - for (col <- 0 until matrix.width) - result(col) = new SubArray[A](matrix.delegate, col * matrix.height, matrix.height) - result - } - -}*/ From ca1579e256890c092dc1568ac8852c08105be5a8 Mon Sep 17 00:00:00 2001 From: Hanns Holger Rutz Date: Wed, 12 Dec 2018 16:23:43 +0100 Subject: [PATCH 2/9] cross-compiles Scala 2.11, 2.12, 2.13.0-M5. - introduce SetWrapper and MapWrapper, similar to @som-snytt 's shims (seems we can't do without) - clean up code - add scala.swing.Seq alias (as in @som-snytt 's version) - TODO: ListView#selection.items is still `???` --- README.md | 36 ++++---- build.sbt | 12 +-- .../scala/swing/examples/ButtonApp.scala | 3 +- .../swing/examples/CelsiusConverter.scala | 4 +- .../swing/examples/CelsiusConverter2.scala | 8 +- .../swing/examples/ColorChooserDemo.scala | 23 +++--- .../scala/swing/examples/ComboBoxes.scala | 13 +-- .../scala/swing/examples/CountButton.scala | 10 +-- .../scala/scala/swing/examples/Dialogs.scala | 50 +++++------ .../scala/swing/examples/GridBagDemo.scala | 57 ++++++------- .../scala/swing/examples/HelloWorld.scala | 2 +- .../scala/swing/examples/LabelTest.scala | 4 +- .../scala/swing/examples/LinePainting.scala | 18 ++-- .../scala/swing/examples/ListViewDemo.scala | 15 ++-- .../scala/swing/examples/PopupDemo.scala | 6 +- .../scala/swing/examples/SimpleApplet.scala | 4 +- .../scala/scala/swing/examples/SwingApp.scala | 12 +-- .../scala/swing/examples/TableSelection.scala | 20 ++--- .../scala/scala/swing/examples/UIDemo.scala | 36 ++++---- .../tutorials/components/PasswordDemo.scala | 18 ++-- .../tutorials/layout/DiagonalLayout.scala | 48 +++++------ src/main/scala-2.11 | 1 + .../scala/swing/BufferWrapper.scala | 14 +++- .../scala-2.12/scala/swing/MapWrapper.scala | 18 ++++ .../scala-2.12/scala/swing/SetWrapper.scala | 18 ++++ .../scala/swing/BufferWrapper.scala | 49 +++++++++++ .../scala/swing/MapWrapper.scala | 5 ++ .../scala/swing/SetWrapper.scala | 5 ++ .../scala/scala/swing/AbstractButton.scala | 2 - src/main/scala/scala/swing/Action.scala | 2 - src/main/scala/scala/swing/Adjustable.scala | 8 ++ src/main/scala/scala/swing/Alignment.scala | 2 - src/main/scala/scala/swing/Applet.scala | 2 - src/main/scala/scala/swing/BorderPanel.scala | 2 - src/main/scala/scala/swing/BoxPanel.scala | 2 - src/main/scala/scala/swing/ButtonGroup.scala | 13 ++- src/main/scala/scala/swing/CheckBox.scala | 2 - src/main/scala/scala/swing/ColorChooser.scala | 2 - src/main/scala/scala/swing/ComboBox.scala | 10 +-- src/main/scala/scala/swing/Component.scala | 3 - src/main/scala/scala/swing/Container.scala | 9 +- src/main/scala/scala/swing/FileChooser.scala | 2 +- src/main/scala/scala/swing/FlowPanel.scala | 2 - src/main/scala/scala/swing/GridPanel.scala | 2 - src/main/scala/scala/swing/Label.scala | 2 - .../scala/scala/swing/LayoutContainer.scala | 7 +- src/main/scala/scala/swing/ListView.scala | 30 +++---- src/main/scala/scala/swing/MainFrame.scala | 2 +- src/main/scala/scala/swing/Orientable.scala | 2 - src/main/scala/scala/swing/Orientation.scala | 2 - src/main/scala/scala/swing/Oriented.scala | 4 +- src/main/scala/scala/swing/Panel.scala | 2 - src/main/scala/scala/swing/PopupMenu.scala | 2 - src/main/scala/scala/swing/Publisher.scala | 82 +++++++++++-------- src/main/scala/scala/swing/RadioButton.scala | 2 - src/main/scala/scala/swing/Reactions.scala | 2 - src/main/scala/scala/swing/Reactor.scala | 2 - src/main/scala/scala/swing/RootPanel.scala | 2 - src/main/scala/scala/swing/ScrollBar.scala | 8 +- src/main/scala/scala/swing/ScrollPane.scala | 2 - src/main/scala/scala/swing/Scrollable.scala | 2 - src/main/scala/scala/swing/Separator.scala | 2 - .../scala/swing/SequentialContainer.scala | 2 - .../scala/swing/SimpleSwingApplication.scala | 8 ++ src/main/scala/scala/swing/Slider.scala | 9 +- src/main/scala/scala/swing/Swing.scala | 8 +- .../scala/scala/swing/SwingApplication.scala | 8 ++ src/main/scala/scala/swing/TabbedPane.scala | 10 ++- src/main/scala/scala/swing/Table.scala | 37 ++++++--- src/main/scala/scala/swing/TextArea.scala | 2 +- src/main/scala/scala/swing/TextField.scala | 2 - src/main/scala/scala/swing/TextPane.scala | 1 + .../scala/scala/swing/event/ActionEvent.scala | 2 - .../scala/swing/event/AdjustingEvent.scala | 2 - .../scala/swing/event/BackgroundChanged.scala | 2 - .../scala/swing/event/ButtonClicked.scala | 2 - .../scala/scala/swing/event/CaretUpdate.scala | 2 - .../scala/swing/event/ColorChanged.scala | 2 - .../scala/swing/event/ComponentEvent.scala | 2 - .../scala/swing/event/ContainerEvent.scala | 2 - .../scala/scala/swing/event/EditDone.scala | 2 - src/main/scala/scala/swing/event/Event.scala | 2 - .../scala/scala/swing/event/FocusEvent.scala | 2 - .../scala/scala/swing/event/FontChanged.scala | 2 - .../scala/swing/event/ForegroundChanged.scala | 2 - .../scala/scala/swing/event/InputEvent.scala | 2 - src/main/scala/scala/swing/event/Key.scala | 2 - .../scala/scala/swing/event/KeyEvent.scala | 2 - .../scala/scala/swing/event/ListEvent.scala | 2 - .../scala/scala/swing/event/MouseEvent.scala | 2 - .../scala/swing/event/PopupMenuEvent.scala | 2 - .../scala/swing/event/SelectionEvent.scala | 2 - .../scala/scala/swing/event/TableEvent.scala | 2 - .../scala/scala/swing/event/UIEvent.scala | 2 - .../scala/swing/event/ValueChanged.scala | 2 - .../scala/swing/event/WindowActivated.scala | 2 - .../scala/swing/event/WindowClosed.scala | 8 ++ .../scala/swing/event/WindowClosing.scala | 2 - .../scala/swing/event/WindowDeactivated.scala | 2 - .../scala/swing/event/WindowDeiconified.scala | 2 - .../scala/scala/swing/event/WindowEvent.scala | 2 - .../scala/swing/event/WindowIconified.scala | 2 - .../scala/swing/event/WindowOpened.scala | 2 - src/main/scala/scala/swing/package.scala | 12 ++- 104 files changed, 482 insertions(+), 416 deletions(-) create mode 120000 src/main/scala-2.11 rename src/main/{scala => scala-2.12}/scala/swing/BufferWrapper.scala (90%) create mode 100644 src/main/scala-2.12/scala/swing/MapWrapper.scala create mode 100644 src/main/scala-2.12/scala/swing/SetWrapper.scala create mode 100644 src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala create mode 100644 src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala create mode 100644 src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala diff --git a/README.md b/README.md index c408b57b..a6b45041 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,12 @@ [](http://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.scala-lang.modules%20a%3Ascala-swing_2.12) [![Stories in Ready](https://badge.waffle.io/scala/scala-swing.svg?label=ready&title=Ready)](http://waffle.io/scala/scala-swing) -This is now community maintained by @benhutchison & @Sciss. If you're interested in helping then contact them or @adriaanm. +This is now community maintained by @benhutchison & @Sciss. If you are interested in helping then contact them or @adriaanm. This is a UI library that will wrap most of Java Swing for Scala in a straightforward manner. The widget class hierarchy loosely resembles that of Java Swing. The main differences are: -- In Java Swing all components are containers per default. This doesn't make much sense for +- In Java Swing all components are containers per default. This does not make much sense for a number of components, like TextField, CheckBox, RadioButton, and so on. Our guess is that this architecture was chosen because Java lacks multiple inheritance. In scala-swing, components that can have child components extend the Container trait. @@ -43,21 +43,21 @@ $ sbt examples/run Multiple main classes detected, select one to run: [1] scala.swing.examples.ButtonApp - [2] scala.swing.examples.Dialogs - [3] scala.swing.examples.ComboBoxes - [4] scala.swing.examples.CelsiusConverter2 - [5] scala.swing.examples.ListViewDemo - [6] scala.swing.examples.HelloWorld - [7] scala.swing.examples.LabelTest - [8] scala.swing.examples.PopupDemo - [9] scala.swing.examples.ColorChooserDemo - [10] scala.swing.examples.LinePainting - [11] scala.swing.examples.GridBagDemo - [12] scala.swing.examples.UIDemo - [13] scala.swing.examples.TableSelection - [14] scala.swing.examples.CelsiusConverter - [15] scala.swing.examples.SwingApp - [16] scala.swing.examples.CountButton + [2] scala.swing.examples.CelsiusConverter + [3] scala.swing.examples.CelsiusConverter2 + [4] scala.swing.examples.ColorChooserDemo + [5] scala.swing.examples.ComboBoxes + [6] scala.swing.examples.CountButton + [7] scala.swing.examples.Dialogs + [8] scala.swing.examples.GridBagDemo + [9] scala.swing.examples.HelloWorld + [10] scala.swing.examples.LabelTest + [11] scala.swing.examples.LinePainting + [12] scala.swing.examples.ListViewDemo + [13] scala.swing.examples.PopupDemo + [14] scala.swing.examples.SwingApp + [15] scala.swing.examples.TableSelection + [16] scala.swing.examples.UIDemo Enter number: ``` @@ -70,7 +70,7 @@ Enter number: - When using Scala 2.11, you can use the Scala swing 2.0.x releases on JDK 6 or newer. - Scala 2.12 requires you to use JDK 8 (that has nothing to do with scala-swing). -The reason to have two versions is to allow for binary incompatible changes. Also, some java-swing classes were generified in JDK 7 (see [SI-3634](https://issues.scala-lang.org/browse/SI-3634)) and require the scala-swing soruces to be adjusted. +The reason to have two versions is to allow for binary incompatible changes. Also, some java-swing classes were generified in JDK 7 (see [SI-3634](https://issues.scala-lang.org/browse/SI-3634)) and require the scala-swing sources to be adjusted. ## API documentation (Scaladoc) diff --git a/build.sbt b/build.sbt index ad5af88e..d2ad2a9c 100644 --- a/build.sbt +++ b/build.sbt @@ -6,17 +6,17 @@ name := "scala-swing" version := "2.1.0-SNAPSHOT" -scalacOptions ++= Seq("-deprecation", "-feature") +scalacOptions in ThisBuild ++= Seq("-deprecation", "-feature") // Map[JvmMajorVersion, List[(ScalaVersion, UseForPublishing)]] scalaVersionsByJvm in ThisBuild := Map( - 8 -> List("2.11.12", "2.12.6", "2.13.0-M5").map(_ -> true), - 9 -> List("2.11.12", "2.12.6", "2.13.0-M5").map(_ -> false), - 10 -> List("2.11.12", "2.12.6", "2.13.0-M5").map(_ -> false), - 11 -> List("2.11.12", "2.12.6", "2.13.0-M5").map(_ -> false) + 8 -> List("2.11.12", "2.12.8", "2.13.0-M5").map(_ -> true), + 9 -> List("2.11.12", "2.12.8", "2.13.0-M5").map(_ -> false), + 10 -> List("2.11.12", "2.12.8", "2.13.0-M5").map(_ -> false), + 11 -> List("2.11.12", "2.12.8", "2.13.0-M5").map(_ -> false) ) -scalaVersion in ThisBuild := "2.12.8" // for testing +scalaVersion in ThisBuild := "2.13.0-M5" // for testing OsgiKeys.exportPackage := Seq(s"scala.swing.*;version=${version.value}") diff --git a/examples/src/main/scala/scala/swing/examples/ButtonApp.scala b/examples/src/main/scala/scala/swing/examples/ButtonApp.scala index 47a4117c..628ccb8e 100644 --- a/examples/src/main/scala/scala/swing/examples/ButtonApp.scala +++ b/examples/src/main/scala/scala/swing/examples/ButtonApp.scala @@ -12,7 +12,7 @@ import scala.swing._ import scala.swing.event._ object ButtonApp extends SimpleSwingApplication { - def top = new MainFrame { + def top: Frame = new MainFrame { title = "My Frame" contents = new GridPanel(2, 2) { hGap = 3 @@ -27,4 +27,3 @@ object ButtonApp extends SimpleSwingApplication { size = new Dimension(300, 80) } } - diff --git a/examples/src/main/scala/scala/swing/examples/CelsiusConverter.scala b/examples/src/main/scala/scala/swing/examples/CelsiusConverter.scala index d3a97a12..d2cf6c78 100644 --- a/examples/src/main/scala/scala/swing/examples/CelsiusConverter.scala +++ b/examples/src/main/scala/scala/swing/examples/CelsiusConverter.scala @@ -15,7 +15,7 @@ import scala.swing.event._ * A GUI app to convert celsius to centigrade */ object CelsiusConverter extends SimpleSwingApplication { - def top = new MainFrame { + def top: Frame = new MainFrame { title = "Convert Celsius to Fahrenheit" val tempCelsius = new TextField val celsiusLabel = new Label { @@ -42,7 +42,7 @@ object CelsiusConverter extends SimpleSwingApplication { } } contents = new GridPanel(2, 2) { - contents.append(tempCelsius, celsiusLabel, convertButton, fahrenheitLabel) + contents ++= Seq(tempCelsius, celsiusLabel, convertButton, fahrenheitLabel) border = Swing.EmptyBorder(10, 10, 10, 10) } //defaultButton = Some(convertButton) diff --git a/examples/src/main/scala/scala/swing/examples/CelsiusConverter2.scala b/examples/src/main/scala/scala/swing/examples/CelsiusConverter2.scala index 2dcf972f..7ad8ccf5 100644 --- a/examples/src/main/scala/scala/swing/examples/CelsiusConverter2.scala +++ b/examples/src/main/scala/scala/swing/examples/CelsiusConverter2.scala @@ -12,14 +12,14 @@ import scala.swing._ import scala.swing.event._ object CelsiusConverter2 extends SimpleSwingApplication { - def newField = new TextField { + def newField: TextField = new TextField { text = "0" columns = 5 horizontalAlignment = Alignment.Right } - val celsius = newField - val fahrenheit = newField + val celsius = newField + val fahrenheit = newField listenTo(fahrenheit, celsius) reactions += { @@ -38,7 +38,7 @@ object CelsiusConverter2 extends SimpleSwingApplication { border = Swing.EmptyBorder(15, 10, 10, 10) } - def top = new MainFrame { + def top: Frame = new MainFrame { title = "Convert Celsius / Fahrenheit" contents = ui } diff --git a/examples/src/main/scala/scala/swing/examples/ColorChooserDemo.scala b/examples/src/main/scala/scala/swing/examples/ColorChooserDemo.scala index 65e8a003..6d9a66df 100644 --- a/examples/src/main/scala/scala/swing/examples/ColorChooserDemo.scala +++ b/examples/src/main/scala/scala/swing/examples/ColorChooserDemo.scala @@ -9,10 +9,11 @@ package scala.swing.examples import java.awt.{Color, Font} + +import scala.swing.BorderPanel._ +import scala.swing.Swing._ import scala.swing._ import scala.swing.event._ -import scala.swing.Swing._ -import scala.swing.BorderPanel._ /** * Demo for ColorChooser. @@ -21,14 +22,14 @@ import scala.swing.BorderPanel._ * @author andy@hicks.net */ object ColorChooserDemo extends SimpleSwingApplication { - def top = new MainFrame { + def top: Frame = new MainFrame { title = "ColorChooser Demo" size = new Dimension(400, 400) contents = ui } - val banner = new Label("Welcome to Scala Swing") { + val banner: Label = new Label("Welcome to Scala Swing") { horizontalAlignment = Alignment.Center foreground = Color.yellow background = Color.blue @@ -36,8 +37,8 @@ object ColorChooserDemo extends SimpleSwingApplication { font = new Font("SansSerif", Font.BOLD, 24) } - def ui = new BorderPanel { - val colorChooser = new ColorChooser { + def ui: BorderPanel = new BorderPanel { + val colorChooser: ColorChooser = new ColorChooser { reactions += { case ColorChanged(_, c) => banner.foreground = c @@ -46,13 +47,13 @@ object ColorChooserDemo extends SimpleSwingApplication { colorChooser.border = TitledBorder(EtchedBorder, "Choose Text Color") - val bannerArea = new BorderPanel { + val bannerArea: BorderPanel = new BorderPanel { layout(banner) = Position.Center border = TitledBorder(EtchedBorder, "Banner") } // Display a color selection dialog when button pressed - val selectColor = new Button("Choose Background Color") { + val selectColor: Button = new Button("Choose Background Color") { reactions += { case ButtonClicked(_) => ColorChooser.showDialog(this, "Test", Color.red) match { @@ -62,8 +63,8 @@ object ColorChooserDemo extends SimpleSwingApplication { } } - layout(bannerArea) = Position.North - layout(colorChooser) = Position.Center - layout(selectColor) = Position.South + layout(bannerArea) = Position.North + layout(colorChooser) = Position.Center + layout(selectColor) = Position.South } } \ No newline at end of file diff --git a/examples/src/main/scala/scala/swing/examples/ComboBoxes.scala b/examples/src/main/scala/scala/swing/examples/ComboBoxes.scala index 3d8e452c..923d9e0a 100644 --- a/examples/src/main/scala/scala/swing/examples/ComboBoxes.scala +++ b/examples/src/main/scala/scala/swing/examples/ComboBoxes.scala @@ -8,13 +8,15 @@ package scala.swing.examples -import scala.swing._ -import scala.swing.event._ -import java.util.Date import java.awt.Color import java.text.SimpleDateFormat +import java.util.Date + import javax.swing.{Icon, ImageIcon} +import scala.swing._ +import scala.swing.event._ + /** * Demonstrates how to use combo boxes and custom item renderers. * @@ -24,7 +26,7 @@ object ComboBoxes extends SimpleSwingApplication { import ComboBox._ - lazy val ui = new FlowPanel { + lazy val ui: FlowPanel = new FlowPanel { contents += new ComboBox(List(1, 2, 3, 4)) val patterns = List( @@ -100,10 +102,9 @@ object ComboBoxes extends SimpleSwingApplication { contents += iconBox } - def top = new MainFrame { + def top: Frame = new MainFrame { title = "ComboBoxes Demo" contents = ui } - } diff --git a/examples/src/main/scala/scala/swing/examples/CountButton.scala b/examples/src/main/scala/scala/swing/examples/CountButton.scala index e6a9993d..dc13cf6e 100644 --- a/examples/src/main/scala/scala/swing/examples/CountButton.scala +++ b/examples/src/main/scala/scala/swing/examples/CountButton.scala @@ -12,7 +12,7 @@ import scala.swing._ import scala.swing.event._ object CountButton extends SimpleSwingApplication { - def top = new MainFrame { + def top: Frame = new MainFrame { title = "My Frame" contents = new GridPanel(2, 2) { hGap = 3 @@ -27,11 +27,11 @@ object CountButton extends SimpleSwingApplication { contents += label listenTo(button) - var nclicks = 0 + var nClicks = 0 reactions += { - case ButtonClicked(b) => - nclicks += 1 - label.text = "Number of button clicks: " + nclicks + case ButtonClicked(_) => + nClicks += 1 + label.text = "Number of button clicks: " + nClicks } } } diff --git a/examples/src/main/scala/scala/swing/examples/Dialogs.scala b/examples/src/main/scala/scala/swing/examples/Dialogs.scala index 54aeb7f2..a8c27abb 100644 --- a/examples/src/main/scala/scala/swing/examples/Dialogs.scala +++ b/examples/src/main/scala/scala/swing/examples/Dialogs.scala @@ -56,10 +56,10 @@ object Dialogs extends SimpleSwingApplication { import BorderPanel._ val mutex = new ButtonGroup - val ok = new RadioButton("OK (in the L&F's words)") - val ynlf = new RadioButton("Yes/No (in the L&F's words)") - val ynp = new RadioButton("Yes/No (in the programmer's words)") - val yncp = new RadioButton("Yes/No/Cancel (in the programmer's words)") + val ok = new RadioButton("OK (in the L&F's words)") + val ynlf = new RadioButton("Yes/No (in the L&F's words)") + val ynp = new RadioButton("Yes/No (in the programmer's words)") + val yncp = new RadioButton("Yes/No/Cancel (in the programmer's words)") val radios = List(ok, ynlf, ynp, yncp) mutex.buttons ++= radios mutex.select(ok) @@ -76,10 +76,10 @@ object Dialogs extends SimpleSwingApplication { label.text = showConfirmation(buttons, "Would you like green eggs and ham?", "An Inane Question") match { - case Result.Yes => "Ewww!" - case Result.No => "Me neither!" - case _ => "Come on -- tell me!" - } + case Result.Yes => "Ewww!" + case Result.No => "Me neither!" + case _ => "Come on -- tell me!" + } case `ynp` => val options = List("Yes, please", "No, thanks", @@ -89,10 +89,10 @@ object Dialogs extends SimpleSwingApplication { "A Silly Question", entries = options, initial = 2) match { - case Result.Yes => "You're kidding!" - case Result.No => "I don't like them, either." - case _ => "Come on -- 'fess up!" - } + case Result.Yes => "You're kidding!" + case Result.No => "I don't like them, either." + case _ => "Come on -- 'fess up!" + } case `yncp` => val options = List("Yes, please", "No, thanks", @@ -102,11 +102,11 @@ object Dialogs extends SimpleSwingApplication { title = "A Silly Question", entries = options, initial = 2) match { - case Result.Yes => "Here you go: green eggs and ham!" - case Result.No => "OK, just the ham, then." - case Result.Cancel => "Well, I'm certainly not going to eat them!" - case _ => "Please tell me what you want!" - } + case Result.Yes => "Here you go: green eggs and ham!" + case Result.No => "OK, just the ham, then." + case Result.Cancel => "Well, I'm certainly not going to eat them!" + case _ => "Please tell me what you want!" + } } })) = Position.South }) @@ -114,12 +114,12 @@ object Dialogs extends SimpleSwingApplication { import BorderPanel._ - val mutex = new ButtonGroup - val pick = new RadioButton("Pick one of several choices") - val enter = new RadioButton("Enter some text") - val custom = new RadioButton("Custom") + val mutex = new ButtonGroup + val pick = new RadioButton("Pick one of several choices") + val enter = new RadioButton("Enter some text") + val custom = new RadioButton("Custom") val customUndec = new RadioButton("Custom undecorated") - val custom2 = new RadioButton("2 custom dialogs") + val custom2 = new RadioButton("2 custom dialogs") val radios = List(pick, enter, custom, customUndec, custom2) mutex.buttons ++= radios mutex.select(pick) @@ -140,7 +140,7 @@ object Dialogs extends SimpleSwingApplication { possibilities, "ham") //If a string was returned, say so. - label.text = if ((s != None) && (s.get.length > 0)) + label.text = if (s.isDefined && (s.get.length > 0)) "Green eggs and... " + s.get + "!" else "Come on, finish the sentence!" @@ -153,7 +153,7 @@ object Dialogs extends SimpleSwingApplication { Nil, "ham") //If a string was returned, say so. - label.text = if ((s != None) && (s.get.length > 0)) + label.text = if (s.isDefined && (s.get.length > 0)) "Green eggs and... " + s.get + "!" else "Come on, finish the sentence!" @@ -191,7 +191,7 @@ object Dialogs extends SimpleSwingApplication { } - lazy val top = new MainFrame { + lazy val top: Frame = new MainFrame { title = "Dialog Demo" contents = ui } diff --git a/examples/src/main/scala/scala/swing/examples/GridBagDemo.scala b/examples/src/main/scala/scala/swing/examples/GridBagDemo.scala index ff371aa8..b896b109 100644 --- a/examples/src/main/scala/scala/swing/examples/GridBagDemo.scala +++ b/examples/src/main/scala/scala/swing/examples/GridBagDemo.scala @@ -8,12 +8,13 @@ package scala.swing.examples -import scala.swing._ -import GridBagPanel._ import java.awt.Insets +import scala.swing.GridBagPanel._ +import scala.swing._ + object GridBagDemo extends SimpleSwingApplication { - lazy val ui = new GridBagPanel { + lazy val ui: GridBagPanel = new GridBagPanel { val c = new Constraints val shouldFill = true if (shouldFill) { @@ -22,49 +23,49 @@ object GridBagDemo extends SimpleSwingApplication { val button1 = new Button("Button 1") - c.weightx = 0.5 + c.weightx = 0.5 - c.fill = Fill.Horizontal - c.gridx = 0 - c.gridy = 0 + c.fill = Fill.Horizontal + c.gridx = 0 + c.gridy = 0 layout(button1) = c val button2 = new Button("Button 2") - c.fill = Fill.Horizontal - c.weightx = 0.5 - c.gridx = 1 - c.gridy = 0 + c.fill = Fill.Horizontal + c.weightx = 0.5 + c.gridx = 1 + c.gridy = 0 layout(button2) = c val button3 = new Button("Button 3") - c.fill = Fill.Horizontal - c.weightx = 0.5 - c.gridx = 2 - c.gridy = 0 + c.fill = Fill.Horizontal + c.weightx = 0.5 + c.gridx = 2 + c.gridy = 0 layout(button3) = c val button4 = new Button("Long-Named Button 4") - c.fill = Fill.Horizontal - c.ipady = 40 //make this component tall - c.weightx = 0.0 + c.fill = Fill.Horizontal + c.ipady = 40 //make this component tall + c.weightx = 0.0 c.gridwidth = 3 - c.gridx = 0 - c.gridy = 1 + c.gridx = 0 + c.gridy = 1 layout(button4) = c val button5 = new Button("5") - c.fill = Fill.Horizontal - c.ipady = 0 //reset to default - c.weighty = 1.0 //request any extra vertical space - c.anchor = Anchor.PageEnd - c.insets = new Insets(10, 0, 0, 0) //top padding - c.gridx = 1 //aligned with button 2 + c.fill = Fill.Horizontal + c.ipady = 0 //reset to default + c.weighty = 1.0 //request any extra vertical space + c.anchor = Anchor.PageEnd + c.insets = new Insets(10, 0, 0, 0) //top padding + c.gridx = 1 //aligned with button 2 c.gridwidth = 2 //2 columns wide - c.gridy = 2 //third row + c.gridy = 2 //third row layout(button5) = c } - def top = new MainFrame { + def top: Frame = new MainFrame { title = "GridBag Demo" contents = ui } diff --git a/examples/src/main/scala/scala/swing/examples/HelloWorld.scala b/examples/src/main/scala/scala/swing/examples/HelloWorld.scala index b454073a..a5f1d05b 100644 --- a/examples/src/main/scala/scala/swing/examples/HelloWorld.scala +++ b/examples/src/main/scala/scala/swing/examples/HelloWorld.scala @@ -14,7 +14,7 @@ import scala.swing._ * A simple swing demo. */ object HelloWorld extends SimpleSwingApplication { - def top = new MainFrame { + def top: Frame = new MainFrame { title = "Hello, World!" contents = new Button("Click Me!") } diff --git a/examples/src/main/scala/scala/swing/examples/LabelTest.scala b/examples/src/main/scala/scala/swing/examples/LabelTest.scala index f3f66e27..617a96d0 100644 --- a/examples/src/main/scala/scala/swing/examples/LabelTest.scala +++ b/examples/src/main/scala/scala/swing/examples/LabelTest.scala @@ -12,13 +12,13 @@ import scala.swing._ import scala.swing.event._ object LabelTest extends SimpleSwingApplication { - def top = new MainFrame { + def top: Frame = new MainFrame { contents = new Label { text = "Hello" listenTo(mouse.clicks) reactions += { case MousePressed(_, _, _, _, _) => - println("Mouse pressed2") + println("Mouse pressed") } } } diff --git a/examples/src/main/scala/scala/swing/examples/LinePainting.scala b/examples/src/main/scala/scala/swing/examples/LinePainting.scala index 605fd00e..2b3b31ae 100644 --- a/examples/src/main/scala/scala/swing/examples/LinePainting.scala +++ b/examples/src/main/scala/scala/swing/examples/LinePainting.scala @@ -8,10 +8,11 @@ package scala.swing.examples +import java.awt.{Color, Graphics2D, Point, geom} + import scala.swing.Swing._ -import scala.swing.{SimpleSwingApplication, MainFrame, Panel} import scala.swing.event._ -import java.awt.{Color, Graphics2D, Point, geom} +import scala.swing.{Frame, MainFrame, Panel, SimpleSwingApplication} /** * Dragging the mouse draws a simple graph @@ -19,9 +20,9 @@ import java.awt.{Color, Graphics2D, Point, geom} * @author Frank Teubler, Ingo Maier */ object LinePainting extends SimpleSwingApplication { - lazy val ui = new Panel { + lazy val ui: Panel = new Panel { background = Color.white - preferredSize = (200, 200) + preferredSize = (300, 200) focusable = true listenTo(mouse.clicks, mouse.moves, keys) @@ -49,17 +50,18 @@ object LinePainting extends SimpleSwingApplication { path.moveTo(p.x, p.y); repaint() } - override def paintComponent(g: Graphics2D) = { + override def paintComponent(g: Graphics2D): Unit = { super.paintComponent(g) g.setColor(new Color(100, 100, 100)) - g.drawString("Press left mouse button and drag to paint." + - (if (hasFocus) " Press 'c' to clear." else ""), 10, size.height - 10) + val h = size.height + g.drawString("Press left mouse button and drag to paint.", 10, h - 26) + if (hasFocus) g.drawString("Press 'c' to clear.", 10, h - 10) g.setColor(Color.black) g.draw(path) } } - def top = new MainFrame { + def top: Frame = new MainFrame { title = "Simple Line Painting Demo" contents = ui } diff --git a/examples/src/main/scala/scala/swing/examples/ListViewDemo.scala b/examples/src/main/scala/scala/swing/examples/ListViewDemo.scala index f6b566d2..349260cc 100644 --- a/examples/src/main/scala/scala/swing/examples/ListViewDemo.scala +++ b/examples/src/main/scala/scala/swing/examples/ListViewDemo.scala @@ -11,16 +11,16 @@ package scala.swing.examples import scala.swing._ object ListViewDemo extends SimpleSwingApplication { - def top = new MainFrame { + def top: Frame = new MainFrame { case class City(name: String, country: String, population: Int, capital: Boolean) - val items = List( - City("Lausanne", "Switzerland", 129273, false), - City("Paris", "France", 2203817, true), - City("New York", "USA", 8363710, false), - City("Berlin", "Germany", 3416300, true), - City("Tokio", "Japan", 12787981, true) + val items: List[City] = List( + City(name = "Lausanne" , country = "Switzerland" , population = 129273, capital = false ), + City(name = "Paris" , country = "France" , population = 2203817, capital = true ), + City(name = "New York" , country = "USA" , population = 8363710, capital = false ), + City(name = "Berlin" , country = "Germany" , population = 3416300, capital = true ), + City(name = "Tokyo" , country = "Japan" , population = 12787981, capital = true ) ) import ListView._ @@ -28,6 +28,5 @@ object ListViewDemo extends SimpleSwingApplication { contents = new FlowPanel(new ScrollPane(new ListView(items) { renderer = Renderer(_.name) })) - //new ScrollPane(new Table(items))) } } diff --git a/examples/src/main/scala/scala/swing/examples/PopupDemo.scala b/examples/src/main/scala/scala/swing/examples/PopupDemo.scala index ccb1b14f..e619fbd6 100644 --- a/examples/src/main/scala/scala/swing/examples/PopupDemo.scala +++ b/examples/src/main/scala/scala/swing/examples/PopupDemo.scala @@ -16,8 +16,8 @@ import scala.swing.event._ * @author Ingo Maier */ object PopupDemo extends SimpleSwingApplication { - def top = new MainFrame { - val popupMenu = new PopupMenu { + def top: Frame = new MainFrame { + val popupMenu: PopupMenu = new PopupMenu { contents += new Menu("menu 1") { contents += new RadioMenuItem("radio 1.1") contents += new RadioMenuItem("radio 1.2") @@ -29,7 +29,7 @@ object PopupDemo extends SimpleSwingApplication { } val button = new Button("Show Popup Menu") reactions += { - case ButtonClicked(b) => popupMenu.show(b, 0, b.bounds.height) + case ButtonClicked(b) => popupMenu.show(b, 0, b.bounds.height) case PopupMenuCanceled(m) => println("Menu " + m + " canceled.") } listenTo(popupMenu) diff --git a/examples/src/main/scala/scala/swing/examples/SimpleApplet.scala b/examples/src/main/scala/scala/swing/examples/SimpleApplet.scala index 564d8a25..6b585563 100644 --- a/examples/src/main/scala/scala/swing/examples/SimpleApplet.scala +++ b/examples/src/main/scala/scala/swing/examples/SimpleApplet.scala @@ -14,7 +14,7 @@ import scala.swing.event._ class SimpleApplet extends Applet { object ui extends UI with Reactor { - def init() = { + def init(): Unit = { val button = new Button("Press here!") val text = new TextArea("Java Version: " + util.Properties.javaVersion + "\n") listenTo(button) @@ -23,7 +23,7 @@ class SimpleApplet extends Applet { case _ => } contents = new BoxPanel(Orientation.Vertical) { - contents.append(button, text) + contents ++= Seq(button, text) } } } diff --git a/examples/src/main/scala/scala/swing/examples/SwingApp.scala b/examples/src/main/scala/scala/swing/examples/SwingApp.scala index 6f9892da..b9a32736 100644 --- a/examples/src/main/scala/scala/swing/examples/SwingApp.scala +++ b/examples/src/main/scala/scala/swing/examples/SwingApp.scala @@ -12,18 +12,18 @@ import scala.swing._ import scala.swing.event._ object SwingApp extends SimpleSwingApplication { - def top = new MainFrame { + def top: Frame = new MainFrame { title = "SwingApp" - var numclicks = 0 + var numClicks = 0 object label extends Label { val prefix = "Number of button clicks: " text = prefix + "0 " listenTo(button) reactions += { - case ButtonClicked(button) => - numclicks = numclicks + 1 - text = prefix + numclicks + case ButtonClicked(_) => + numClicks = numClicks + 1 + text = prefix + numClicks } } @@ -32,7 +32,7 @@ object SwingApp extends SimpleSwingApplication { } contents = new FlowPanel { - contents.append(button, label) + contents ++= Seq(button, label) border = Swing.EmptyBorder(5, 5, 5, 5) } } diff --git a/examples/src/main/scala/scala/swing/examples/TableSelection.scala b/examples/src/main/scala/scala/swing/examples/TableSelection.scala index f1332028..81692e74 100644 --- a/examples/src/main/scala/scala/swing/examples/TableSelection.scala +++ b/examples/src/main/scala/scala/swing/examples/TableSelection.scala @@ -9,7 +9,7 @@ package scala.swing.examples import scala.swing._ -import swing.event._ +import scala.swing.event._ object TableSelection extends SimpleSwingApplication { val model = Array(List("Mary", "Campione", "Snowboarding", 5, false).toArray, @@ -18,8 +18,8 @@ object TableSelection extends SimpleSwingApplication { List("Sharon", "Zakhour", "Speed reading", 5, false).toArray, List("Philip", "Milne", "Pool", 5, false).toArray) - lazy val ui = new BoxPanel(Orientation.Vertical) { - val table = new Table(model, Array("First Name", "Last Name", "Sport", "# of Years", "Vegetarian")) { + lazy val ui: BoxPanel = new BoxPanel(Orientation.Vertical) { + val table: Table = new Table(model, Array("First Name", "Last Name", "Sport", "# of Years", "Vegetarian")) { preferredViewportSize = new Dimension(500, 70) } //1.6:table.fillsViewportHeight = true @@ -36,17 +36,17 @@ object TableSelection extends SimpleSwingApplication { b } - val intervalMutex = new ButtonGroup - val multiInterval = radio(intervalMutex, "Multiple Interval Selection") + val intervalMutex = new ButtonGroup + val multiInterval = radio(intervalMutex, "Multiple Interval Selection") val elementInterval = radio(intervalMutex, "Single Selection") - val singleInterval = radio(intervalMutex, "Single Interval Selection") + val singleInterval = radio(intervalMutex, "Single Interval Selection") intervalMutex.select(multiInterval) contents += new Label("Selection Options") - val elemMutex = new ButtonGroup - val rowSelection = radio(elemMutex, "Row Selection") + val elemMutex = new ButtonGroup + val rowSelection = radio(elemMutex, "Row Selection") val columnSelection = radio(elemMutex, "Column Selection") - val cellSelection = radio(elemMutex, "Cell Selection") + val cellSelection = radio(elemMutex, "Cell Selection") elemMutex.select(rowSelection) val output = new TextArea(5, 40) { @@ -96,7 +96,7 @@ object TableSelection extends SimpleSwingApplication { } } - def top = new MainFrame { + def top: Frame = new MainFrame { title = "Table Selection" contents = ui } diff --git a/examples/src/main/scala/scala/swing/examples/UIDemo.scala b/examples/src/main/scala/scala/swing/examples/UIDemo.scala index eef39a7c..997de0c7 100644 --- a/examples/src/main/scala/scala/swing/examples/UIDemo.scala +++ b/examples/src/main/scala/scala/swing/examples/UIDemo.scala @@ -8,13 +8,13 @@ package scala.swing.examples +import scala.swing.ListView._ +import scala.swing.Swing._ import scala.swing._ import scala.swing.event._ -import scala.swing.Swing._ -import scala.swing.ListView._ object UIDemo extends SimpleSwingApplication { - def top = new MainFrame { + def top: Frame = new MainFrame { title = "Scala Swing Demo" /* @@ -49,11 +49,11 @@ object UIDemo extends SimpleSwingApplication { var reactLive = false - val tabs = new TabbedPane { + val tabs: TabbedPane = new TabbedPane { import TabbedPane._ - val buttons = new FlowPanel { + val buttons: FlowPanel = new FlowPanel { border = Swing.EmptyBorder(5, 5, 5, 5) contents += new BoxPanel(Orientation.Vertical) { @@ -70,7 +70,7 @@ object UIDemo extends SimpleSwingApplication { val paintTicks = new CheckBox("Paint Ticks") val snapTicks = new CheckBox("Snap To Ticks") val live = new CheckBox("Live") - contents.append(paintLabels, paintTicks, snapTicks, live) + contents ++= Seq(paintLabels, paintTicks, snapTicks, live) listenTo(paintLabels, paintTicks, snapTicks, live) reactions += { case ButtonClicked(`paintLabels`) => @@ -87,18 +87,18 @@ object UIDemo extends SimpleSwingApplication { centerOnScreen() }) } - pages += new Page("Buttons", buttons) - pages += new Page("GridBag", GridBagDemo.ui) - pages += new Page("Converter", CelsiusConverter2.ui) - pages += new Page("Tables", TableSelection.ui) - pages += new Page("Dialogs", Dialogs.ui) - pages += new Page("Combo Boxes", ComboBoxes.ui) - pages += new Page("Split Panes", + pages += new Page("Buttons" , buttons) + pages += new Page("GridBag" , GridBagDemo .ui) + pages += new Page("Converter" , CelsiusConverter2 .ui) + pages += new Page("Tables" , TableSelection .ui) + pages += new Page("Dialogs" , Dialogs .ui) + pages += new Page("Combo Boxes" , ComboBoxes .ui) + pages += new Page("Split Panes" , new SplitPane(Orientation.Vertical, new Button("Hello"), new Button("World")) { continuousLayout = true }) - val password = new FlowPanel { + val password: FlowPanel = new FlowPanel { contents += new Label("Enter your secret password here ") val field = new PasswordField(10) contents += field @@ -115,12 +115,12 @@ object UIDemo extends SimpleSwingApplication { //pages += new Page("Text Editor", TextEditor.ui) } - val list = new ListView(tabs.pages) { + val list: ListView[TabbedPane.Page] = new ListView(tabs.pages) { selectIndices(0) selection.intervalMode = ListView.IntervalMode.Single renderer = ListView.Renderer(_.title) } - val center = new SplitPane(Orientation.Vertical, new ScrollPane(list), tabs) { + val center: SplitPane = new SplitPane(Orientation.Vertical, new ScrollPane(list), tabs) { oneTouchExpandable = true continuousLayout = true } @@ -132,9 +132,9 @@ object UIDemo extends SimpleSwingApplication { * type inference at times. */ object slider extends Slider { - min = 0 + min = 0 value = tabs.selection.index - max = tabs.pages.size - 1 + max = tabs.pages.size - 1 majorTickSpacing = 1 } diff --git a/examples/src/main/scala/scala/swing/examples/tutorials/components/PasswordDemo.scala b/examples/src/main/scala/scala/swing/examples/tutorials/components/PasswordDemo.scala index 326b98a1..a278c854 100644 --- a/examples/src/main/scala/scala/swing/examples/tutorials/components/PasswordDemo.scala +++ b/examples/src/main/scala/scala/swing/examples/tutorials/components/PasswordDemo.scala @@ -14,10 +14,9 @@ import scala.swing._ class PasswordDemo(val controllingFrame: Frame) extends FlowPanel { val passwordField = new PasswordField(10) val label = new Label("Enter the password: ") -// label.peer.setLabelFor(passwordField.peer) - val buttonPane = createButtonPanel() - val textPane = new FlowPanel() { + val buttonPane: Component = createButtonPanel() + val textPane : Component = new FlowPanel { contents += label contents += passwordField } @@ -37,7 +36,7 @@ class PasswordDemo(val controllingFrame: Frame) extends FlowPanel { Dialog.Message.Error, Swing.EmptyIcon) } //Zero out the possible password, for security. - for (i <- 0 until input.length) { + for (i <- input.indices) { input(i) = '0' } passwordField.selectAll() @@ -50,7 +49,7 @@ class PasswordDemo(val controllingFrame: Frame) extends FlowPanel { + "source code for the string \"correctPassword\".\n" + "Or look at the section How to Use Password Fields in\n" + "the components section of The Java Tutorial.", - "Passord Help", Dialog.Message.Info, Swing.EmptyIcon) + "Password Help", Dialog.Message.Info, Swing.EmptyIcon) }) contents += okButton @@ -70,15 +69,16 @@ object PasswordDemo extends SimpleSwingApplication { */ def isPasswordCorrect(input: Array[Char]): Boolean = { val correctPassword = Array[Char]('b', 'u', 'g', 'a', 'b', 'o', 'o') - val isCorrect = input.deep == correctPassword.deep + val isCorrect = input.sameElements(correctPassword) //Zero out the password. // Arrays.fill(correctPassword,'0'); - for (i <- 0 until correctPassword.length) - correctPassword.update(i, '0') + for (i <- correctPassword.indices) { + correctPassword(i) = '0' + } isCorrect } - lazy val top = new MainFrame() { + lazy val top: Frame = new MainFrame() { title = "PasswordDemo" //Create and set up the content pane. contents = new PasswordDemo(this) diff --git a/examples/src/main/scala/scala/swing/examples/tutorials/layout/DiagonalLayout.scala b/examples/src/main/scala/scala/swing/examples/tutorials/layout/DiagonalLayout.scala index ae3dbaf9..9ad10cad 100644 --- a/examples/src/main/scala/scala/swing/examples/tutorials/layout/DiagonalLayout.scala +++ b/examples/src/main/scala/scala/swing/examples/tutorials/layout/DiagonalLayout.scala @@ -35,8 +35,6 @@ package scala.swing.examples.tutorials.layout */ import java.awt._ -//remove if not needed -import scala.collection.JavaConversions._ class DiagonalLayout(private var vgap: Int) extends LayoutManager { @@ -55,11 +53,9 @@ class DiagonalLayout(private var vgap: Int) extends LayoutManager { } /* Required by LayoutManager. */ - def addLayoutComponent(name: String, comp: Component): Unit = { - } + def addLayoutComponent(name: String, comp: Component): Unit = () - def removeLayoutComponent(comp: Component): Unit = { - } + def removeLayoutComponent(comp: Component): Unit = () private def setSizes(parent: Container): Unit = { val nComps = parent.getComponentCount @@ -89,11 +85,10 @@ class DiagonalLayout(private var vgap: Int) extends LayoutManager { /* Required by LayoutManager. */ def preferredLayoutSize(parent: Container): Dimension = { val dim = new Dimension(0, 0) - val nComps = parent.getComponentCount setSizes(parent) - val insets = parent.getInsets - dim.width = preferredWidth + insets.left + insets.right - dim.height = preferredHeight + insets.top + insets.bottom + val insets = parent.getInsets + dim.width = preferredWidth + insets.left + insets.right + dim.height = preferredHeight + insets.top + insets.bottom sizeUnknown = false dim } @@ -101,10 +96,9 @@ class DiagonalLayout(private var vgap: Int) extends LayoutManager { /* Required by LayoutManager. */ def minimumLayoutSize(parent: Container): Dimension = { val dim = new Dimension(0, 0) - val nComps = parent.getComponentCount - val insets = parent.getInsets - dim.width = minWidth + insets.left + insets.right - dim.height = minHeight + insets.top + insets.bottom + val insets = parent.getInsets + dim.width = minWidth + insets.left + insets.right + dim.height = minHeight + insets.top + insets.bottom sizeUnknown = false dim } @@ -118,19 +112,17 @@ class DiagonalLayout(private var vgap: Int) extends LayoutManager { * of applets, at least, they probably won't be. */ def layoutContainer(parent: Container): Unit = { - val insets = parent.getInsets - val maxWidth = parent.getWidth - (insets.left + insets.right) - val maxHeight = parent.getHeight - (insets.top + insets.bottom) - val nComps = parent.getComponentCount - var previousWidth = 0 - var previousHeight = 0 - var x = 0 - var y = insets.top - val rowh = 0 - val start = 0 - var xFudge = 0 - var yFudge = 0 - var oneColumn = false + val insets = parent.getInsets + val maxWidth = parent.getWidth - (insets.left + insets.right) + val maxHeight = parent.getHeight - (insets.top + insets.bottom) + val nComps = parent.getComponentCount + var previousWidth = 0 + var previousHeight = 0 + var x = 0 + var y = insets.top + var xFudge = 0 + var yFudge = 0 + var oneColumn = false // Go through the components' sizes, if neither // preferredLayoutSize nor minimumLayoutSize has // been called. @@ -174,7 +166,7 @@ class DiagonalLayout(private var vgap: Int) extends LayoutManager { } } - override def toString(): String = { + override def toString: String = { val str = "" getClass.getName + "[vgap=" + vgap + str + "]" } diff --git a/src/main/scala-2.11 b/src/main/scala-2.11 new file mode 120000 index 00000000..7fde8739 --- /dev/null +++ b/src/main/scala-2.11 @@ -0,0 +1 @@ +scala-2.12 \ No newline at end of file diff --git a/src/main/scala/scala/swing/BufferWrapper.scala b/src/main/scala-2.12/scala/swing/BufferWrapper.scala similarity index 90% rename from src/main/scala/scala/swing/BufferWrapper.scala rename to src/main/scala-2.12/scala/swing/BufferWrapper.scala index 6c2760ef..141656ce 100644 --- a/src/main/scala/scala/swing/BufferWrapper.scala +++ b/src/main/scala-2.12/scala/swing/BufferWrapper.scala @@ -13,7 +13,17 @@ import scala.collection.{Iterator, mutable} /** * Default partial implementation for buffer adapters. */ -protected[swing] abstract class BufferWrapper[A] extends mutable.Buffer[A] { outer => +protected[swing] abstract class BufferWrapper[A] extends mutable.Buffer[A] { + // abstract + + def addOne(elem: A): this.type + + protected def insertAt(n: Int, a: A): Unit + + // impl + + final def +=(elem: A): this.type = addOne(elem) + def clear(): Unit = for (_ <- 0 until length) remove(0) def update(n: Int, a: A): Unit = { @@ -29,8 +39,6 @@ protected[swing] abstract class BufferWrapper[A] extends mutable.Buffer[A] { out } } - protected def insertAt(n: Int, a: A): Unit - def +=:(a: A): this.type = { insertAt(0, a); this } def iterator: Iterator[A] = Iterator.range(0,length).map(apply) diff --git a/src/main/scala-2.12/scala/swing/MapWrapper.scala b/src/main/scala-2.12/scala/swing/MapWrapper.scala new file mode 100644 index 00000000..885c227d --- /dev/null +++ b/src/main/scala-2.12/scala/swing/MapWrapper.scala @@ -0,0 +1,18 @@ +package scala.swing + +import scala.collection.mutable + +/** + * Default partial implementation for set adapters. + */ +protected[swing] abstract class MapWrapper[K, V] extends mutable.Map[K, V] { + // abstract + + def addOne (elem: (K, V)): this.type + def subtractOne (key: K) : this.type + + // impl + + final def +=(elem: (K, V)): this.type = addOne (elem) + final def -=(key: K) : this.type = subtractOne(key) +} \ No newline at end of file diff --git a/src/main/scala-2.12/scala/swing/SetWrapper.scala b/src/main/scala-2.12/scala/swing/SetWrapper.scala new file mode 100644 index 00000000..cc7413b0 --- /dev/null +++ b/src/main/scala-2.12/scala/swing/SetWrapper.scala @@ -0,0 +1,18 @@ +package scala.swing + +import scala.collection.mutable + +/** + * Default partial implementation for set adapters. + */ +protected[swing] abstract class SetWrapper[A] extends mutable.Set[A] { + // abstract + + def addOne (elem: A): this.type + def subtractOne (elem: A): this.type + + // impl + + final def +=(elem: A): this.type = addOne (elem) + final def -=(elem: A): this.type = subtractOne(elem) +} \ No newline at end of file diff --git a/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala b/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala new file mode 100644 index 00000000..00a6746d --- /dev/null +++ b/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala @@ -0,0 +1,49 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +package scala.swing + +import scala.collection.{Iterator, mutable} + +/** + * Default partial implementation for buffer adapters. + */ +protected[swing] abstract class BufferWrapper[A] extends mutable.Buffer[A] { + def clear(): Unit = for (_ <- 0 until length) remove(0) + + def update(n: Int, a: A): Unit = { + remove(n) + insertAt(n, a) + } + + def insertAll(n: Int, elems: Iterable[A]): Unit = { + var i = n + for (el <- elems) { + insertAt(i, el) + i += 1 + } + } + + protected def insertAt(n: Int, a: A): Unit + +// XXX TODO: remove +// def +=:(a: A): this.type = { insertAt(0, a); this } + + def iterator: Iterator[A] = Iterator.range(0,length).map(apply) + + // XXX TODO + def prepend(elem: A): BufferWrapper.this.type = ??? + + def insert(idx: Int, elem: A): Unit = ??? + + def insertAll(idx: Int, elems: IterableOnce[A]): Unit = ??? + + def remove(idx: Int, count: Int): Unit = ??? + + def patchInPlace(from: Int, patch: collection.Seq[A], replaced: Int): BufferWrapper.this.type = ??? +} diff --git a/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala b/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala new file mode 100644 index 00000000..a406111e --- /dev/null +++ b/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala @@ -0,0 +1,5 @@ +package scala.swing + +import scala.collection.mutable + +protected[swing] abstract class MapWrapper[K, V] extends mutable.Map[K, V] \ No newline at end of file diff --git a/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala b/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala new file mode 100644 index 00000000..ec9b00bb --- /dev/null +++ b/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala @@ -0,0 +1,5 @@ +package scala.swing + +import scala.collection.mutable + +protected[swing] abstract class SetWrapper[A] extends mutable.Set[A] \ No newline at end of file diff --git a/src/main/scala/scala/swing/AbstractButton.scala b/src/main/scala/scala/swing/AbstractButton.scala index d936f528..3bfe6f04 100644 --- a/src/main/scala/scala/swing/AbstractButton.scala +++ b/src/main/scala/scala/swing/AbstractButton.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import javax.swing.{Icon, AbstractButton => JAbstractButton} diff --git a/src/main/scala/scala/swing/Action.scala b/src/main/scala/scala/swing/Action.scala index 31e4678c..14074aed 100644 --- a/src/main/scala/scala/swing/Action.scala +++ b/src/main/scala/scala/swing/Action.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import java.awt.event.ActionListener diff --git a/src/main/scala/scala/swing/Adjustable.scala b/src/main/scala/scala/swing/Adjustable.scala index 7cc9cfcd..9e82268f 100644 --- a/src/main/scala/scala/swing/Adjustable.scala +++ b/src/main/scala/scala/swing/Adjustable.scala @@ -1,3 +1,11 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + package scala.swing import java.awt.{Adjustable => JAdjustable} diff --git a/src/main/scala/scala/swing/Alignment.scala b/src/main/scala/scala/swing/Alignment.scala index bdbbca99..1050c7c3 100644 --- a/src/main/scala/scala/swing/Alignment.scala +++ b/src/main/scala/scala/swing/Alignment.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing /** diff --git a/src/main/scala/scala/swing/Applet.scala b/src/main/scala/scala/swing/Applet.scala index b5e0f6a6..decd0dee 100644 --- a/src/main/scala/scala/swing/Applet.scala +++ b/src/main/scala/scala/swing/Applet.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import javax.swing.JApplet diff --git a/src/main/scala/scala/swing/BorderPanel.scala b/src/main/scala/scala/swing/BorderPanel.scala index ab73b67b..584ce634 100644 --- a/src/main/scala/scala/swing/BorderPanel.scala +++ b/src/main/scala/scala/swing/BorderPanel.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import java.awt.BorderLayout diff --git a/src/main/scala/scala/swing/BoxPanel.scala b/src/main/scala/scala/swing/BoxPanel.scala index 42aa5e30..a97da84c 100644 --- a/src/main/scala/scala/swing/BoxPanel.scala +++ b/src/main/scala/scala/swing/BoxPanel.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing /** diff --git a/src/main/scala/scala/swing/ButtonGroup.scala b/src/main/scala/scala/swing/ButtonGroup.scala index caf8e02e..f67f8260 100644 --- a/src/main/scala/scala/swing/ButtonGroup.scala +++ b/src/main/scala/scala/swing/ButtonGroup.scala @@ -19,14 +19,19 @@ import scala.collection.mutable class ButtonGroup(initialButtons: AbstractButton*) { val peer: javax.swing.ButtonGroup = new javax.swing.ButtonGroup - val buttons: mutable.Set[AbstractButton] = new mutable.Set[AbstractButton] { - def -=(b: AbstractButton): this.type = { peer.remove(b.peer); this } - def +=(b: AbstractButton): this.type = { peer.add(b.peer); this } + val buttons: mutable.Set[AbstractButton] = new SetWrapper[AbstractButton] { + override def subtractOne(b: AbstractButton): this.type = { peer.remove(b.peer); this } + override def addOne (b: AbstractButton): this.type = { peer.add (b.peer); this } + + override def clear(): Unit = iterator.toList.foreach(remove) + def contains(b: AbstractButton): Boolean = this.iterator.contains(b) + override def size: Int = peer.getButtonCount + def iterator: Iterator[AbstractButton] = new Iterator[AbstractButton] { private val enum = peer.getElements - def next: AbstractButton = UIElement.cachedWrapper[AbstractButton](enum.nextElement) + def next(): AbstractButton = UIElement.cachedWrapper[AbstractButton](enum.nextElement()) def hasNext: Boolean = enum.hasMoreElements } } diff --git a/src/main/scala/scala/swing/CheckBox.scala b/src/main/scala/scala/swing/CheckBox.scala index 11aa05f7..3be4b068 100644 --- a/src/main/scala/scala/swing/CheckBox.scala +++ b/src/main/scala/scala/swing/CheckBox.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import javax.swing.JCheckBox diff --git a/src/main/scala/scala/swing/ColorChooser.scala b/src/main/scala/scala/swing/ColorChooser.scala index f4fc3aae..56a890a9 100644 --- a/src/main/scala/scala/swing/ColorChooser.scala +++ b/src/main/scala/scala/swing/ColorChooser.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import javax.swing.JColorChooser diff --git a/src/main/scala/scala/swing/ComboBox.scala b/src/main/scala/scala/swing/ComboBox.scala index c507cca9..3632e9f6 100644 --- a/src/main/scala/scala/swing/ComboBox.scala +++ b/src/main/scala/scala/swing/ComboBox.scala @@ -116,10 +116,10 @@ object ComboBox { def startEditing(): Unit = comboBoxPeer.selectAll() } - implicit def stringEditor(c: ComboBox[String]): Editor[String] = new BuiltInEditor(c)(s => s, s => s) - implicit def intEditor(c: ComboBox[Int]): Editor[Int] = new BuiltInEditor(c)(s => s.toInt, s => s.toString) - implicit def floatEditor(c: ComboBox[Float]): Editor[Float] = new BuiltInEditor(c)(s => s.toFloat, s => s.toString) - implicit def doubleEditor(c: ComboBox[Double]): Editor[Double] = new BuiltInEditor(c)(s => s.toDouble, s => s.toString) + implicit def stringEditor (c: ComboBox[String ]): Editor[String ] = new BuiltInEditor(c)(s => s , s => s) + implicit def intEditor (c: ComboBox[Int ]): Editor[Int ] = new BuiltInEditor(c)(s => s.toInt , s => s.toString) + implicit def floatEditor (c: ComboBox[Float ]): Editor[Float ] = new BuiltInEditor(c)(s => s.toFloat , s => s.toString) + implicit def doubleEditor (c: ComboBox[Double ]): Editor[Double ] = new BuiltInEditor(c)(s => s.toDouble, s => s.toString) def newConstantModel[A](items: Seq[A]): ComboBoxModel[A] = { new AbstractListModel[A] with ComboBoxModel[A] { @@ -188,7 +188,7 @@ class ComboBox[A](items: Seq[A]) extends Component with Publisher { def renderer: ListView.Renderer[A] = ListView.Renderer.wrap(peer.getRenderer.asInstanceOf[ListCellRenderer[A]]) def renderer_=(r: ListView.Renderer[A]): Unit = peer.setRenderer(r.peer) - /* XXX: currently not safe to expose: + /* TODO: currently not safe to expose: def editor: ComboBox.Editor[A] = def editor_=(r: ComboBox.Editor[A]) { peer.setEditor(r.comboBoxPeer) } */ diff --git a/src/main/scala/scala/swing/Component.scala b/src/main/scala/scala/swing/Component.scala index a3475f63..6506e7ac 100644 --- a/src/main/scala/scala/swing/Component.scala +++ b/src/main/scala/scala/swing/Component.scala @@ -41,9 +41,6 @@ object Component { abstract class Component extends UIElement { override lazy val peer: javax.swing.JComponent = new javax.swing.JComponent with SuperMixin {} - // TODO: what was this used for? - // var initP: JComponent = null - /** * This trait is used to redirect certain calls from the peer to the wrapper * and back. Useful to expose methods that can be customized by overriding. diff --git a/src/main/scala/scala/swing/Container.scala b/src/main/scala/scala/swing/Container.scala index be591a11..948d9007 100644 --- a/src/main/scala/scala/swing/Container.scala +++ b/src/main/scala/scala/swing/Container.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import scala.swing.event.{ComponentAdded, ComponentRemoved} @@ -25,14 +23,19 @@ object Container { protected class Content extends BufferWrapper[Component] { override def clear(): Unit = peer.removeAll() + override def remove(n: Int): Component = { val c = peer.getComponent(n) peer.remove(n) UIElement.cachedWrapper[Component](c) } + protected def insertAt(n: Int, c: Component): Unit = peer.add(c.peer, n) - def +=(c: Component): this.type = { peer.add(c.peer) ; this } + + override def addOne(c: Component): this.type = { peer.add(c.peer) ; this } + def length: Int = peer.getComponentCount + def apply(n: Int): Component = UIElement.cachedWrapper[Component](peer.getComponent(n)) } diff --git a/src/main/scala/scala/swing/FileChooser.scala b/src/main/scala/scala/swing/FileChooser.scala index 931d033a..807ae43a 100644 --- a/src/main/scala/scala/swing/FileChooser.scala +++ b/src/main/scala/scala/swing/FileChooser.scala @@ -90,7 +90,7 @@ class FileChooser(dir: File) { def selectedFile: File = peer.getSelectedFile def selectedFile_=(file: File): Unit = peer.setSelectedFile(file) - def selectedFiles: Seq[File] = peer.getSelectedFiles + def selectedFiles: Seq[File] = peer.getSelectedFiles.toSeq def selectedFiles_=(files: File*): Unit = peer.setSelectedFiles(files.toArray) def multiSelectionEnabled: Boolean = peer.isMultiSelectionEnabled diff --git a/src/main/scala/scala/swing/FlowPanel.scala b/src/main/scala/scala/swing/FlowPanel.scala index 987194a2..1bbd7fcc 100644 --- a/src/main/scala/scala/swing/FlowPanel.scala +++ b/src/main/scala/scala/swing/FlowPanel.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import java.awt.FlowLayout diff --git a/src/main/scala/scala/swing/GridPanel.scala b/src/main/scala/scala/swing/GridPanel.scala index b229062d..7e54839a 100644 --- a/src/main/scala/scala/swing/GridPanel.scala +++ b/src/main/scala/scala/swing/GridPanel.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import java.awt.GridLayout diff --git a/src/main/scala/scala/swing/Label.scala b/src/main/scala/scala/swing/Label.scala index 489f3362..b7837425 100644 --- a/src/main/scala/scala/swing/Label.scala +++ b/src/main/scala/scala/swing/Label.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import javax.swing.{Icon, JLabel} diff --git a/src/main/scala/scala/swing/LayoutContainer.scala b/src/main/scala/scala/swing/LayoutContainer.scala index b5d29568..fdd7ec27 100644 --- a/src/main/scala/scala/swing/LayoutContainer.scala +++ b/src/main/scala/scala/swing/LayoutContainer.scala @@ -55,9 +55,10 @@ trait LayoutContainer extends Container.Wrapper { * * also ensures that myComponent is properly added to this container. */ - def layout: mutable.Map[Component, Constraints] = new mutable.Map[Component, Constraints] { - def -= (c: Component): this.type = { _contents -= c; this } - def += (cl: (Component, Constraints)): this.type = { update(cl._1, cl._2); this } + def layout: mutable.Map[Component, Constraints] = new MapWrapper[Component, Constraints] { + override def subtractOne(c: Component): this.type = { _contents -= c; this } + + override def addOne(cl: (Component, Constraints)): this.type = { update(cl._1, cl._2); this } override def update(c: Component, l: Constraints): Unit = { val (v, msg) = areValid(l) diff --git a/src/main/scala/scala/swing/ListView.scala b/src/main/scala/scala/swing/ListView.scala index 6d1482e7..70300a95 100644 --- a/src/main/scala/scala/swing/ListView.scala +++ b/src/main/scala/scala/swing/ListView.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import event._ @@ -161,7 +159,7 @@ class ListView[A] extends Component { def length: Int = model.getSize def iterator: Iterator[A] = new Iterator[A] { var idx = 0 - def next: A = { idx += 1; apply(idx-1) } + def next(): A = { idx += 1; apply(idx-1) } def hasNext: Boolean = idx < selfSeq.length } def apply(n: Int): A = model.getElementAt(n) @@ -179,11 +177,11 @@ class ListView[A] extends Component { * The current item selection. */ object selection extends Publisher { - protected abstract class Indices[B](a: => Seq[B]) extends scala.collection.mutable.Set[B] { - def -=(n: B): this.type - def +=(n: B): this.type + protected abstract class Indices[B](a: => Seq[B]) extends SetWrapper[B] { def contains(n: B): Boolean = a.contains(n) + override def size: Int = a.length + def iterator: Iterator[B] = a.iterator } @@ -194,17 +192,21 @@ class ListView[A] extends Component { * The indices of the currently selected items. */ object indices extends Indices(peer.getSelectedIndices) { - def -=(n: Int): this.type = { peer.removeSelectionInterval(n,n); this } - def +=(n: Int): this.type = { peer.addSelectionInterval(n,n); this } - } + override def subtractOne(n: Int): this.type = { peer.removeSelectionInterval(n,n); this } + override def addOne (n: Int): this.type = { peer.addSelectionInterval (n,n); this } - /** - * The currently selected items. - */ - object items extends scala.collection.SeqProxy[A] { - def self = peer.getSelectedValues.map(_.asInstanceOf[A]) + override def clear(): Unit = peer.clearSelection() } +// XXX TODO +// /** +// * The currently selected items. +// */ +// object items extends scala.collection.SeqProxy[A] { +// def self = peer.getSelectedValues.map(_.asInstanceOf[A]) +// } + def items: Seq[A] = ??? + def intervalMode: IntervalMode.Value = IntervalMode(peer.getSelectionModel.getSelectionMode) def intervalMode_=(m: IntervalMode.Value): Unit = peer.getSelectionModel.setSelectionMode(m.id) diff --git a/src/main/scala/scala/swing/MainFrame.scala b/src/main/scala/scala/swing/MainFrame.scala index b67f3fa4..5bd729dd 100644 --- a/src/main/scala/scala/swing/MainFrame.scala +++ b/src/main/scala/scala/swing/MainFrame.scala @@ -9,7 +9,7 @@ package scala.swing /** - * A frame that can be used for main application windows. Shuts down the + * A frame that can be used for main application windows. It shuts down the * framework and quits the application when closed. */ class MainFrame(gc: java.awt.GraphicsConfiguration = null) extends Frame(gc) { diff --git a/src/main/scala/scala/swing/Orientable.scala b/src/main/scala/scala/swing/Orientable.scala index 86929372..c1bb3c28 100644 --- a/src/main/scala/scala/swing/Orientable.scala +++ b/src/main/scala/scala/swing/Orientable.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing object Orientable { diff --git a/src/main/scala/scala/swing/Orientation.scala b/src/main/scala/scala/swing/Orientation.scala index 5fa2aeef..1226f8b8 100644 --- a/src/main/scala/scala/swing/Orientation.scala +++ b/src/main/scala/scala/swing/Orientation.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing object Orientation extends Enumeration { diff --git a/src/main/scala/scala/swing/Oriented.scala b/src/main/scala/scala/swing/Oriented.scala index 4253c6c4..5dd8789a 100644 --- a/src/main/scala/scala/swing/Oriented.scala +++ b/src/main/scala/scala/swing/Oriented.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing object Oriented { @@ -22,7 +20,7 @@ object Oriented { def getOrientation(): Int // note: must keep empty parentheses for Java compatibility def setOrientation(n: Int): Unit } - def orientation: Orientation.Value = Orientation(peer.getOrientation) + def orientation: Orientation.Value = Orientation(peer.getOrientation()) } } diff --git a/src/main/scala/scala/swing/Panel.scala b/src/main/scala/scala/swing/Panel.scala index 89ad4d3d..3892740c 100644 --- a/src/main/scala/scala/swing/Panel.scala +++ b/src/main/scala/scala/swing/Panel.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing /** diff --git a/src/main/scala/scala/swing/PopupMenu.scala b/src/main/scala/scala/swing/PopupMenu.scala index 6fc21de1..83b45bca 100644 --- a/src/main/scala/scala/swing/PopupMenu.scala +++ b/src/main/scala/scala/swing/PopupMenu.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import javax.swing.JPopupMenu diff --git a/src/main/scala/scala/swing/Publisher.scala b/src/main/scala/scala/swing/Publisher.scala index 70cd0fbb..75c9200c 100644 --- a/src/main/scala/scala/swing/Publisher.scala +++ b/src/main/scala/scala/swing/Publisher.scala @@ -9,6 +9,7 @@ package scala.swing import scala.collection.mutable +import scala.ref.{Reference, WeakReference} import scala.swing.event.Event /**

@@ -28,12 +29,13 @@ import scala.swing.event.Event trait Publisher extends Reactor { import Reactions._ - protected val listeners = new RefSet[Reaction] { - import scala.ref._ - val underlying = new mutable.HashSet[Reference[Reaction]] + protected val listeners: RefSet[Reaction] = new RefSet[Reaction] { + protected val underlying: mutable.Set[Reference[Reaction]] = + new mutable.HashSet[Reference[Reaction]] + protected def Ref(a: Reaction): Ref[Reaction] = a match { - case a: StronglyReferenced => new StrongReference[Reaction](a) with super.Ref[Reaction] - case _ => new WeakReference[Reaction](a, referenceQueue) with super.Ref[Reaction] + case a: StronglyReferenced => new StrongReference [Reaction](a) with super.Ref[Reaction] + case _ => new WeakReference [Reaction](a, referenceQueue) with super.Ref[Reaction] } } @@ -132,42 +134,52 @@ private[swing] class StrongReference[+T <: AnyRef](value: T) extends Reference[T override def toString: String = get.map(_.toString).getOrElse("") def clear(): Unit = { ref = None } def enqueue(): Boolean = false - def isEnqueued(): Boolean = false - } - -abstract class RefBuffer[A <: AnyRef] extends mutable.Buffer[A] with SingleRefCollection[A] { self => - protected val underlying: mutable.Buffer[Reference[A]] - - def +=(el: A): this.type = { purgeReferences(); underlying += Ref(el); this } - def +=:(el: A): this.type = { purgeReferences(); Ref(el) +=: underlying; this } - def remove(el: A): Unit = { underlying -= Ref(el); purgeReferences(); } - def remove(n: Int): A = { val el = apply(n); remove(el); el } - def insertAll(n: Int, iter: Iterable[A]): Unit = { - purgeReferences() - underlying.insertAll(n, iter.view.map(Ref)) - } - def update(n: Int, el: A): Unit = { purgeReferences(); underlying(n) = Ref(el) } - def apply(n: Int): A = { - purgeReferences() - var el = underlying(n).get - while (el.isEmpty) { - purgeReferences(); el = underlying(n).get - } - el.get + def isEnqueued: Boolean = false } - def length: Int = { purgeReferences(); underlying.length } - def clear(): Unit = { underlying.clear(); purgeReferences() } +//abstract class RefBuffer[A <: AnyRef] extends BufferWrapper[A] with SingleRefCollection[A] { self => +// protected val underlying: mutable.Buffer[Reference[A]] +// +// def addOne (el: A): this.type = { purgeReferences(); underlying += Ref(el) ; this } +// def prependOne(el: A): this.type = { purgeReferences(); Ref(el) +=: underlying; this } +// +// def remove(el: A): Unit = { underlying -= Ref(el); purgeReferences(); } +// +// def remove(n: Int): A = { val el = apply(n); remove(el); el } +// +// def insertAll(n: Int, iter: Iterable[A]): Unit = { +// purgeReferences() +// underlying.insertAll(n, iter.view.map(Ref)) +// } +// +// def update(n: Int, el: A): Unit = { purgeReferences(); underlying(n) = Ref(el) } +// +// def apply(n: Int): A = { +// purgeReferences() +// var el = underlying(n).get +// while (el.isEmpty) { +// purgeReferences(); el = underlying(n).get +// } +// el.get +// } +// +// def length: Int = { purgeReferences(); underlying.length } +// +// def clear(): Unit = { underlying.clear(); purgeReferences() } +// +// protected[this] def removeReference(ref: Reference[A]): Unit = { underlying -= ref } +//} + +private[swing] abstract class RefSet[A <: AnyRef] extends SetWrapper[A] with SingleRefCollection[A] { self => + protected val underlying: mutable.Set[Reference[A]] - protected[this] def removeReference(ref: Reference[A]): Unit = { underlying -= ref } -} + override def addOne (el: A): this.type = { purgeReferences(); underlying += Ref(el); this } + override def subtractOne(el: A): this.type = { underlying -= Ref(el); purgeReferences(); this } -private[swing] abstract class RefSet[A <: AnyRef] extends mutable.Set[A] with SingleRefCollection[A] { self => - protected val underlying: mutable.Set[Reference[A]] + override def clear(): Unit = { underlying.clear(); purgeReferences() } - def -=(el: A): this.type = { underlying -= Ref(el); purgeReferences(); this } - def +=(el: A): this.type = { purgeReferences(); underlying += Ref(el); this } def contains(el: A): Boolean = { purgeReferences(); underlying.contains(Ref(el)) } + override def size: Int = { purgeReferences(); underlying.size } protected[this] def removeReference(ref: Reference[A]): Unit = { underlying -= ref } diff --git a/src/main/scala/scala/swing/RadioButton.scala b/src/main/scala/scala/swing/RadioButton.scala index 0bc6e066..ffa401ab 100644 --- a/src/main/scala/scala/swing/RadioButton.scala +++ b/src/main/scala/scala/swing/RadioButton.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import javax.swing.JRadioButton diff --git a/src/main/scala/scala/swing/Reactions.scala b/src/main/scala/scala/swing/Reactions.scala index 86d491ec..36e4a428 100644 --- a/src/main/scala/scala/swing/Reactions.scala +++ b/src/main/scala/scala/swing/Reactions.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import scala.collection.mutable diff --git a/src/main/scala/scala/swing/Reactor.scala b/src/main/scala/scala/swing/Reactor.scala index 3f813673..6a7a4f27 100644 --- a/src/main/scala/scala/swing/Reactor.scala +++ b/src/main/scala/scala/swing/Reactor.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing /** diff --git a/src/main/scala/scala/swing/RootPanel.scala b/src/main/scala/scala/swing/RootPanel.scala index e0ac3590..8f75b3de 100644 --- a/src/main/scala/scala/swing/RootPanel.scala +++ b/src/main/scala/scala/swing/RootPanel.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing /** diff --git a/src/main/scala/scala/swing/ScrollBar.scala b/src/main/scala/scala/swing/ScrollBar.scala index 376b48c9..913a01c1 100644 --- a/src/main/scala/scala/swing/ScrollBar.scala +++ b/src/main/scala/scala/swing/ScrollBar.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import javax.swing.JScrollBar @@ -16,15 +14,15 @@ object ScrollBar { def wrap(c: JScrollBar): ScrollBar = { val w = UIElement.cachedWrapper[ScrollBar](c) if (w != null) w - else new ScrollBar { override lazy val peer = c } + else new ScrollBar { override lazy val peer: JScrollBar = c } } } class ScrollBar extends Component with Orientable.Wrapper with Adjustable.Wrapper { override lazy val peer: JScrollBar = new JScrollBar with SuperMixin - def valueIsAjusting: Boolean = peer.getValueIsAdjusting - def valueIsAjusting_=(b : Boolean): Unit = peer.setValueIsAdjusting(b) + def valueIsAdjusting: Boolean = peer.getValueIsAdjusting + def valueIsAdjusting_=(b : Boolean): Unit = peer.setValueIsAdjusting(b) // TODO: can we find a better interface? //def setValues(value: Int = this.value, visible: Int = visibleAmount, diff --git a/src/main/scala/scala/swing/ScrollPane.scala b/src/main/scala/scala/swing/ScrollPane.scala index ec746b79..3d67dcdb 100644 --- a/src/main/scala/scala/swing/ScrollPane.scala +++ b/src/main/scala/scala/swing/ScrollPane.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import javax.swing.{JScrollPane, ScrollPaneConstants} diff --git a/src/main/scala/scala/swing/Scrollable.scala b/src/main/scala/scala/swing/Scrollable.scala index 3cf93f8b..599dc789 100644 --- a/src/main/scala/scala/swing/Scrollable.scala +++ b/src/main/scala/scala/swing/Scrollable.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing object Scrollable { diff --git a/src/main/scala/scala/swing/Separator.scala b/src/main/scala/scala/swing/Separator.scala index 4dc03e7d..44555a49 100644 --- a/src/main/scala/scala/swing/Separator.scala +++ b/src/main/scala/scala/swing/Separator.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import javax.swing.JSeparator diff --git a/src/main/scala/scala/swing/SequentialContainer.scala b/src/main/scala/scala/swing/SequentialContainer.scala index a37a0d18..2c5344db 100644 --- a/src/main/scala/scala/swing/SequentialContainer.scala +++ b/src/main/scala/scala/swing/SequentialContainer.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import scala.collection.mutable diff --git a/src/main/scala/scala/swing/SimpleSwingApplication.scala b/src/main/scala/scala/swing/SimpleSwingApplication.scala index 0a4cd7bf..d68133a3 100644 --- a/src/main/scala/scala/swing/SimpleSwingApplication.scala +++ b/src/main/scala/scala/swing/SimpleSwingApplication.scala @@ -1,3 +1,11 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + package scala.swing /** diff --git a/src/main/scala/scala/swing/Slider.scala b/src/main/scala/scala/swing/Slider.scala index d3457bf2..db274c15 100644 --- a/src/main/scala/scala/swing/Slider.scala +++ b/src/main/scala/scala/swing/Slider.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import javax.swing.{JLabel, JSlider} @@ -51,10 +49,11 @@ class Slider extends Component with Orientable.Wrapper with Publisher { def adjusting: Boolean = peer.getValueIsAdjusting def labels: scala.collection.Map[Int, Label] = { - import scala.collection.convert.WrapAsScala._ - val labelTable = peer.getLabelTable.asInstanceOf[java.util.Map[Int, JLabel]] - labelTable.mapValues(v => UIElement.cachedWrapper[Label](v)) + import scala.collection.JavaConverters._ + val labelTable = peer.getLabelTable.asInstanceOf[java.util.Map[Int, JLabel]].asScala + labelTable.map { case (k, v) => (k, UIElement.cachedWrapper[Label](v)) } } + def labels_=(l: scala.collection.Map[Int, Label]): Unit = { // TODO: do some lazy wrapping val table = new java.util.Hashtable[java.lang.Integer, javax.swing.JComponent] diff --git a/src/main/scala/scala/swing/Swing.scala b/src/main/scala/scala/swing/Swing.scala index 0bf55436..ba299629 100644 --- a/src/main/scala/scala/swing/Swing.scala +++ b/src/main/scala/scala/swing/Swing.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import java.awt @@ -27,9 +25,9 @@ object Swing { protected[swing] def toNullIcon(i: Icon): Icon = if(i == EmptyIcon) null else i protected[swing] def nullPeer(c: PeerContainer): awt.Container = if (c != null) c.peer else null - implicit def pair2Dimension(p: (Int, Int)): Dimension = new Dimension(p._1, p._2) - implicit def pair2Point(p: (Int, Int)): Point = new Point(p._1, p._2) - implicit def pair2Point(p: (Int, Int, Int, Int)): Rectangle = new Rectangle(p._1, p._2, p._3, p._4) + implicit def pair2Dimension(p: (Int, Int)) : Dimension = new Dimension (p._1, p._2) + implicit def pair2Point (p: (Int, Int)) : Point = new Point (p._1, p._2) + implicit def pair2Point (p: (Int, Int, Int, Int)): Rectangle = new Rectangle (p._1, p._2, p._3, p._4) @inline final def Runnable(@inline block: => Unit): Runnable = new Runnable { def run(): Unit = block diff --git a/src/main/scala/scala/swing/SwingApplication.scala b/src/main/scala/scala/swing/SwingApplication.scala index 121dca4a..bb82cbc0 100644 --- a/src/main/scala/scala/swing/SwingApplication.scala +++ b/src/main/scala/scala/swing/SwingApplication.scala @@ -1,3 +1,11 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + package scala.swing /** Convenience class with utility methods for GUI applications. */ diff --git a/src/main/scala/scala/swing/TabbedPane.scala b/src/main/scala/scala/swing/TabbedPane.scala index e3ab7e59..457cf024 100644 --- a/src/main/scala/scala/swing/TabbedPane.scala +++ b/src/main/scala/scala/swing/TabbedPane.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import javax.swing.JTabbedPane @@ -93,8 +91,14 @@ class TabbedPane extends Component with Publisher { peer.insertTab(t.title, null, t.content.peer, t.tip, n) } - def +=(t: Page): this.type = { t.parent = TabbedPane.this; peer.addTab(t.title, null, t.content.peer, t.tip); this } + override def addOne(t: Page): this.type = { + t.parent = TabbedPane.this + peer.addTab(t.title, null, t.content.peer, t.tip) + this + } + def length: Int = peer.getTabCount + def apply(n: Int): Page = new Page(TabbedPane.this, peer.getTitleAt(n), UIElement.cachedWrapper[Component](peer.getComponentAt(n).asInstanceOf[javax.swing.JComponent]), peer.getToolTipTextAt(n)) diff --git a/src/main/scala/scala/swing/Table.scala b/src/main/scala/scala/swing/Table.scala index 81c1e258..a3b21498 100644 --- a/src/main/scala/scala/swing/Table.scala +++ b/src/main/scala/scala/swing/Table.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import javax.swing.event.{ListSelectionListener, TableModelEvent, TableModelListener} @@ -198,25 +196,38 @@ class Table extends Component with Scrollable.Wrapper { object selection extends Publisher { // TODO: could be a sorted set - protected abstract class SelectionSet[A](a: => Seq[A]) extends mutable.Set[A] { - def -=(n: A): this.type - def +=(n: A): this.type + protected abstract class SelectionSet[A](a: => Seq[A]) extends SetWrapper[A] { + // def -=(n: A): this.type + // def +=(n: A): this.type + def contains(n: A): Boolean = a.contains(n) + override def size: Int = a.length + def iterator: Iterator[A] = a.iterator } object rows extends SelectionSet(peer.getSelectedRows) { - def -=(n: Int): this.type = { peer.removeRowSelectionInterval(n,n); this } - def +=(n: Int): this.type = { peer.addRowSelectionInterval (n,n); this } + override def subtractOne(n: Int): this.type = { peer.removeRowSelectionInterval(n,n); this } + override def addOne (n: Int): this.type = { peer.addRowSelectionInterval (n,n); this } + + override def clear(): Unit = { + val n = peer.getRowCount + if (n > 0) peer.removeRowSelectionInterval(0, n - 1) + } def leadIndex : Int = peer.getSelectionModel.getLeadSelectionIndex def anchorIndex: Int = peer.getSelectionModel.getAnchorSelectionIndex } object columns extends SelectionSet(peer.getSelectedColumns) { - def -=(n: Int): this.type = { peer.removeColumnSelectionInterval(n,n); this } - def +=(n: Int): this.type = { peer.addColumnSelectionInterval (n,n); this } + override def subtractOne(n: Int): this.type = { peer.removeColumnSelectionInterval(n,n); this } + override def addOne (n: Int): this.type = { peer.addColumnSelectionInterval (n,n); this } + + override def clear(): Unit = { + val n = peer.getColumnCount + if (n > 0) peer.removeColumnSelectionInterval(0, n - 1) + } def leadIndex : Int = peer.getColumnModel.getSelectionModel.getLeadSelectionIndex def anchorIndex: Int = peer.getColumnModel.getSelectionModel.getAnchorSelectionIndex @@ -224,16 +235,20 @@ class Table extends Component with Scrollable.Wrapper { def cells: mutable.Set[(Int, Int)] = new SelectionSet[(Int, Int)]((for(r <- selection.rows; c <- selection.columns) yield (r,c)).toSeq) { outer => - def -=(n: (Int, Int)): this.type = { + override def subtractOne(n: (Int, Int)): this.type = { peer.removeRowSelectionInterval (n._1,n._1) peer.removeColumnSelectionInterval(n._2,n._2) this } - def +=(n: (Int, Int)): this.type = { + + override def addOne(n: (Int, Int)): this.type = { peer.addRowSelectionInterval (n._1,n._1) peer.addColumnSelectionInterval(n._2,n._2) this } + + override def clear(): Unit = peer.clearSelection() + override def size: Int = peer.getSelectedRowCount * peer.getSelectedColumnCount } diff --git a/src/main/scala/scala/swing/TextArea.scala b/src/main/scala/scala/swing/TextArea.scala index fe3c272b..a59ecbcf 100644 --- a/src/main/scala/scala/swing/TextArea.scala +++ b/src/main/scala/scala/swing/TextArea.scala @@ -11,7 +11,7 @@ package scala.swing import javax.swing.JTextArea /** - * A text component that allows multiline text input and display. + * A text component that allows multi-line text input and display. * * @see javax.swing.JTextArea */ diff --git a/src/main/scala/scala/swing/TextField.scala b/src/main/scala/scala/swing/TextField.scala index f62574c2..b85762b4 100644 --- a/src/main/scala/scala/swing/TextField.scala +++ b/src/main/scala/scala/swing/TextField.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing import java.awt.event.FocusAdapter diff --git a/src/main/scala/scala/swing/TextPane.scala b/src/main/scala/scala/swing/TextPane.scala index a2a5f90b..0ffef69d 100644 --- a/src/main/scala/scala/swing/TextPane.scala +++ b/src/main/scala/scala/swing/TextPane.scala @@ -5,6 +5,7 @@ ** /____/\___/_/ |_/____/_/ | | ** ** |/ ** \* */ + package scala.swing /** diff --git a/src/main/scala/scala/swing/event/ActionEvent.scala b/src/main/scala/scala/swing/event/ActionEvent.scala index 7b2de43d..b1cc9421 100644 --- a/src/main/scala/scala/swing/event/ActionEvent.scala +++ b/src/main/scala/scala/swing/event/ActionEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/AdjustingEvent.scala b/src/main/scala/scala/swing/event/AdjustingEvent.scala index a4b7d29c..1082272b 100644 --- a/src/main/scala/scala/swing/event/AdjustingEvent.scala +++ b/src/main/scala/scala/swing/event/AdjustingEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/BackgroundChanged.scala b/src/main/scala/scala/swing/event/BackgroundChanged.scala index bdd67f95..53ba8e8a 100644 --- a/src/main/scala/scala/swing/event/BackgroundChanged.scala +++ b/src/main/scala/scala/swing/event/BackgroundChanged.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/ButtonClicked.scala b/src/main/scala/scala/swing/event/ButtonClicked.scala index d0220190..53c67f19 100644 --- a/src/main/scala/scala/swing/event/ButtonClicked.scala +++ b/src/main/scala/scala/swing/event/ButtonClicked.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/CaretUpdate.scala b/src/main/scala/scala/swing/event/CaretUpdate.scala index 2821175e..35de1845 100644 --- a/src/main/scala/scala/swing/event/CaretUpdate.scala +++ b/src/main/scala/scala/swing/event/CaretUpdate.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/ColorChanged.scala b/src/main/scala/scala/swing/event/ColorChanged.scala index 6cb35e77..bdc19bc4 100644 --- a/src/main/scala/scala/swing/event/ColorChanged.scala +++ b/src/main/scala/scala/swing/event/ColorChanged.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/ComponentEvent.scala b/src/main/scala/scala/swing/event/ComponentEvent.scala index 701b9629..82fe9489 100644 --- a/src/main/scala/scala/swing/event/ComponentEvent.scala +++ b/src/main/scala/scala/swing/event/ComponentEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/ContainerEvent.scala b/src/main/scala/scala/swing/event/ContainerEvent.scala index 46f3768e..06a8e8b0 100644 --- a/src/main/scala/scala/swing/event/ContainerEvent.scala +++ b/src/main/scala/scala/swing/event/ContainerEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/EditDone.scala b/src/main/scala/scala/swing/event/EditDone.scala index 9d382347..d1c21315 100644 --- a/src/main/scala/scala/swing/event/EditDone.scala +++ b/src/main/scala/scala/swing/event/EditDone.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/Event.scala b/src/main/scala/scala/swing/event/Event.scala index fd113560..d094b3b2 100644 --- a/src/main/scala/scala/swing/event/Event.scala +++ b/src/main/scala/scala/swing/event/Event.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/FocusEvent.scala b/src/main/scala/scala/swing/event/FocusEvent.scala index 5c29d8f6..be270921 100644 --- a/src/main/scala/scala/swing/event/FocusEvent.scala +++ b/src/main/scala/scala/swing/event/FocusEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/FontChanged.scala b/src/main/scala/scala/swing/event/FontChanged.scala index ca936e19..0c57c984 100644 --- a/src/main/scala/scala/swing/event/FontChanged.scala +++ b/src/main/scala/scala/swing/event/FontChanged.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/ForegroundChanged.scala b/src/main/scala/scala/swing/event/ForegroundChanged.scala index 42b45aae..6fbc6753 100644 --- a/src/main/scala/scala/swing/event/ForegroundChanged.scala +++ b/src/main/scala/scala/swing/event/ForegroundChanged.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/InputEvent.scala b/src/main/scala/scala/swing/event/InputEvent.scala index 966aba4d..389a1f37 100644 --- a/src/main/scala/scala/swing/event/InputEvent.scala +++ b/src/main/scala/scala/swing/event/InputEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/Key.scala b/src/main/scala/scala/swing/event/Key.scala index 9d26fddd..3ccc5cbb 100644 --- a/src/main/scala/scala/swing/event/Key.scala +++ b/src/main/scala/scala/swing/event/Key.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/KeyEvent.scala b/src/main/scala/scala/swing/event/KeyEvent.scala index bc5413bb..be66973b 100644 --- a/src/main/scala/scala/swing/event/KeyEvent.scala +++ b/src/main/scala/scala/swing/event/KeyEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/ListEvent.scala b/src/main/scala/scala/swing/event/ListEvent.scala index bdb769d4..4bc7c6e2 100644 --- a/src/main/scala/scala/swing/event/ListEvent.scala +++ b/src/main/scala/scala/swing/event/ListEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/MouseEvent.scala b/src/main/scala/scala/swing/event/MouseEvent.scala index c92d26a1..70869ccc 100644 --- a/src/main/scala/scala/swing/event/MouseEvent.scala +++ b/src/main/scala/scala/swing/event/MouseEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/PopupMenuEvent.scala b/src/main/scala/scala/swing/event/PopupMenuEvent.scala index ad39eb35..1c403f6f 100644 --- a/src/main/scala/scala/swing/event/PopupMenuEvent.scala +++ b/src/main/scala/scala/swing/event/PopupMenuEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/SelectionEvent.scala b/src/main/scala/scala/swing/event/SelectionEvent.scala index 39d6a13b..e054abbb 100644 --- a/src/main/scala/scala/swing/event/SelectionEvent.scala +++ b/src/main/scala/scala/swing/event/SelectionEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/TableEvent.scala b/src/main/scala/scala/swing/event/TableEvent.scala index c420ea27..96094c88 100644 --- a/src/main/scala/scala/swing/event/TableEvent.scala +++ b/src/main/scala/scala/swing/event/TableEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/UIEvent.scala b/src/main/scala/scala/swing/event/UIEvent.scala index a4644b02..fa959922 100644 --- a/src/main/scala/scala/swing/event/UIEvent.scala +++ b/src/main/scala/scala/swing/event/UIEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/ValueChanged.scala b/src/main/scala/scala/swing/event/ValueChanged.scala index ef080857..d3780fed 100644 --- a/src/main/scala/scala/swing/event/ValueChanged.scala +++ b/src/main/scala/scala/swing/event/ValueChanged.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/WindowActivated.scala b/src/main/scala/scala/swing/event/WindowActivated.scala index 1473242e..59f62bdf 100644 --- a/src/main/scala/scala/swing/event/WindowActivated.scala +++ b/src/main/scala/scala/swing/event/WindowActivated.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/WindowClosed.scala b/src/main/scala/scala/swing/event/WindowClosed.scala index 80afe1a9..651baae3 100644 --- a/src/main/scala/scala/swing/event/WindowClosed.scala +++ b/src/main/scala/scala/swing/event/WindowClosed.scala @@ -1,3 +1,11 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + package scala.swing package event diff --git a/src/main/scala/scala/swing/event/WindowClosing.scala b/src/main/scala/scala/swing/event/WindowClosing.scala index 3c64aeb0..0ce77fea 100644 --- a/src/main/scala/scala/swing/event/WindowClosing.scala +++ b/src/main/scala/scala/swing/event/WindowClosing.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/WindowDeactivated.scala b/src/main/scala/scala/swing/event/WindowDeactivated.scala index f0eec579..b35f1f9e 100644 --- a/src/main/scala/scala/swing/event/WindowDeactivated.scala +++ b/src/main/scala/scala/swing/event/WindowDeactivated.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/WindowDeiconified.scala b/src/main/scala/scala/swing/event/WindowDeiconified.scala index 6e07f853..46990aba 100644 --- a/src/main/scala/scala/swing/event/WindowDeiconified.scala +++ b/src/main/scala/scala/swing/event/WindowDeiconified.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/WindowEvent.scala b/src/main/scala/scala/swing/event/WindowEvent.scala index b8ca329a..7a351248 100644 --- a/src/main/scala/scala/swing/event/WindowEvent.scala +++ b/src/main/scala/scala/swing/event/WindowEvent.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/WindowIconified.scala b/src/main/scala/scala/swing/event/WindowIconified.scala index 3b5139f7..db212500 100644 --- a/src/main/scala/scala/swing/event/WindowIconified.scala +++ b/src/main/scala/scala/swing/event/WindowIconified.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/event/WindowOpened.scala b/src/main/scala/scala/swing/event/WindowOpened.scala index f5854edc..c5943c6d 100644 --- a/src/main/scala/scala/swing/event/WindowOpened.scala +++ b/src/main/scala/scala/swing/event/WindowOpened.scala @@ -6,8 +6,6 @@ ** |/ ** \* */ - - package scala.swing package event diff --git a/src/main/scala/scala/swing/package.scala b/src/main/scala/scala/swing/package.scala index cbfd0ded..184da415 100644 --- a/src/main/scala/scala/swing/package.scala +++ b/src/main/scala/scala/swing/package.scala @@ -1,7 +1,15 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + package scala /** - * Useful imports that don't have wrappers. + * Useful imports that do not have wrappers. */ package object swing { type Point = java.awt.Point @@ -14,6 +22,8 @@ package object swing { type Image = java.awt.Image type Font = java.awt.Font + type Seq[A] = scala.collection.Seq[A] // because scala.Seq differs between Scala 2.12 and 2.13 + implicit lazy val reflectiveCalls = scala.language.reflectiveCalls implicit lazy val implicitConversions = scala.language.implicitConversions From e9e1efcd4c1df7f5021189f4915cfd9c89ec0ebc Mon Sep 17 00:00:00 2001 From: Hanns Holger Rutz Date: Wed, 12 Dec 2018 17:04:57 +0100 Subject: [PATCH 3/9] implement missing methods in 2.13 buffer-wrapper; insertAt -> insert --- build.sbt | 2 +- .../scala/swing/BufferWrapper.scala | 18 +++---- .../scala/swing/BufferWrapper.scala | 51 ++++++++++--------- src/main/scala/scala/swing/Container.scala | 2 +- src/main/scala/scala/swing/TabbedPane.scala | 3 +- 5 files changed, 41 insertions(+), 35 deletions(-) diff --git a/build.sbt b/build.sbt index d2ad2a9c..8ed6ad81 100644 --- a/build.sbt +++ b/build.sbt @@ -16,7 +16,7 @@ scalaVersionsByJvm in ThisBuild := Map( 11 -> List("2.11.12", "2.12.8", "2.13.0-M5").map(_ -> false) ) -scalaVersion in ThisBuild := "2.13.0-M5" // for testing +scalaVersion in ThisBuild := "2.11.12" // for testing OsgiKeys.exportPackage := Seq(s"scala.swing.*;version=${version.value}") diff --git a/src/main/scala-2.12/scala/swing/BufferWrapper.scala b/src/main/scala-2.12/scala/swing/BufferWrapper.scala index 141656ce..718a59bd 100644 --- a/src/main/scala-2.12/scala/swing/BufferWrapper.scala +++ b/src/main/scala-2.12/scala/swing/BufferWrapper.scala @@ -18,28 +18,28 @@ protected[swing] abstract class BufferWrapper[A] extends mutable.Buffer[A] { def addOne(elem: A): this.type - protected def insertAt(n: Int, a: A): Unit + def insert(idx: Int, elem: A): Unit // impl - final def +=(elem: A): this.type = addOne(elem) + final override def +=(elem: A): this.type = addOne(elem) - def clear(): Unit = for (_ <- 0 until length) remove(0) + override def clear(): Unit = for (_ <- 0 until length) remove(0) - def update(n: Int, a: A): Unit = { + override def update(n: Int, a: A): Unit = { remove(n) - insertAt(n, a) + insert(n, a) } - def insertAll(n: Int, elems: Traversable[A]): Unit = { + override def insertAll(n: Int, elems: Traversable[A]): Unit = { var i = n for (el <- elems) { - insertAt(i, el) + insert(i, el) i += 1 } } - def +=:(a: A): this.type = { insertAt(0, a); this } + override def +=:(a: A): this.type = { insert(0, a); this } - def iterator: Iterator[A] = Iterator.range(0,length).map(apply) + override def iterator: Iterator[A] = Iterator.range(0,length).map(apply) } diff --git a/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala b/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala index 00a6746d..bdd8fb71 100644 --- a/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala +++ b/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala @@ -14,36 +14,41 @@ import scala.collection.{Iterator, mutable} * Default partial implementation for buffer adapters. */ protected[swing] abstract class BufferWrapper[A] extends mutable.Buffer[A] { - def clear(): Unit = for (_ <- 0 until length) remove(0) + override def clear(): Unit = for (_ <- 0 until length) remove(0) - def update(n: Int, a: A): Unit = { + override def update(n: Int, a: A): Unit = { remove(n) - insertAt(n, a) + insert(n, a) } - def insertAll(n: Int, elems: Iterable[A]): Unit = { - var i = n - for (el <- elems) { - insertAt(i, el) + override def iterator: Iterator[A] = Iterator.range(0, length).map(apply) + + override def prepend(elem: A): this.type = { insert(0, elem); this } + + override def insertAll(idx: Int, elems: IterableOnce[A]): Unit = { + var i = idx + for (el <- elems.iterator) { + insert(i, el) i += 1 } } - protected def insertAt(n: Int, a: A): Unit - -// XXX TODO: remove -// def +=:(a: A): this.type = { insertAt(0, a); this } - - def iterator: Iterator[A] = Iterator.range(0,length).map(apply) - - // XXX TODO - def prepend(elem: A): BufferWrapper.this.type = ??? - - def insert(idx: Int, elem: A): Unit = ??? - - def insertAll(idx: Int, elems: IterableOnce[A]): Unit = ??? - - def remove(idx: Int, count: Int): Unit = ??? + override def remove(idx: Int, count: Int): Unit = { + require(count >= 0) + var n = 0 + while (n < count) { + remove(idx + n) + n += 1 + } + } - def patchInPlace(from: Int, patch: collection.Seq[A], replaced: Int): BufferWrapper.this.type = ??? + override def patchInPlace(from: Int, patch: Seq[A], replaced: Int): this.type = { + if (replaced > 0) { + remove(from, replaced) + } + if (patch.nonEmpty) { + insertAll(from, patch) + } + this + } } diff --git a/src/main/scala/scala/swing/Container.scala b/src/main/scala/scala/swing/Container.scala index 948d9007..4e0d78a1 100644 --- a/src/main/scala/scala/swing/Container.scala +++ b/src/main/scala/scala/swing/Container.scala @@ -30,7 +30,7 @@ object Container { UIElement.cachedWrapper[Component](c) } - protected def insertAt(n: Int, c: Component): Unit = peer.add(c.peer, n) + override def insert(n: Int, c: Component): Unit = peer.add(c.peer, n) override def addOne(c: Component): this.type = { peer.add(c.peer) ; this } diff --git a/src/main/scala/scala/swing/TabbedPane.scala b/src/main/scala/scala/swing/TabbedPane.scala index 457cf024..badb3a9c 100644 --- a/src/main/scala/scala/swing/TabbedPane.scala +++ b/src/main/scala/scala/swing/TabbedPane.scala @@ -85,7 +85,8 @@ class TabbedPane extends Component with Publisher { //for(i <- n to length) apply(i)._index -= 1 t } - protected def insertAt(n: Int, t: Page): Unit = { + + override def insert(n: Int, t: Page): Unit = { //for(i <- n to length) apply(i)._index += 1 t.parent = TabbedPane.this peer.insertTab(t.title, null, t.content.peer, t.tip, n) From 041d1efba18f477ecb7a99bcf0c3287f963ac30e Mon Sep 17 00:00:00 2001 From: Hanns Holger Rutz Date: Wed, 12 Dec 2018 22:38:53 +0100 Subject: [PATCH 4/9] make coll. wrapper classes usable by other libs; seq alias variance --- src/main/scala-2.12/scala/swing/BufferWrapper.scala | 6 ++++-- src/main/scala-2.12/scala/swing/MapWrapper.scala | 2 +- src/main/scala-2.12/scala/swing/SetWrapper.scala | 2 +- src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala | 6 ++++-- src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala | 2 +- src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala | 2 +- src/main/scala/scala/swing/package.scala | 2 +- 7 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/scala-2.12/scala/swing/BufferWrapper.scala b/src/main/scala-2.12/scala/swing/BufferWrapper.scala index 718a59bd..44d9dc0e 100644 --- a/src/main/scala-2.12/scala/swing/BufferWrapper.scala +++ b/src/main/scala-2.12/scala/swing/BufferWrapper.scala @@ -13,7 +13,7 @@ import scala.collection.{Iterator, mutable} /** * Default partial implementation for buffer adapters. */ -protected[swing] abstract class BufferWrapper[A] extends mutable.Buffer[A] { +abstract class BufferWrapper[A] extends mutable.Buffer[A] { // abstract def addOne(elem: A): this.type @@ -22,6 +22,8 @@ protected[swing] abstract class BufferWrapper[A] extends mutable.Buffer[A] { // impl + type MoreElem[+B] = Traversable[B] + final override def +=(elem: A): this.type = addOne(elem) override def clear(): Unit = for (_ <- 0 until length) remove(0) @@ -31,7 +33,7 @@ protected[swing] abstract class BufferWrapper[A] extends mutable.Buffer[A] { insert(n, a) } - override def insertAll(n: Int, elems: Traversable[A]): Unit = { + override def insertAll(n: Int, elems: MoreElem[A]): Unit = { var i = n for (el <- elems) { insert(i, el) diff --git a/src/main/scala-2.12/scala/swing/MapWrapper.scala b/src/main/scala-2.12/scala/swing/MapWrapper.scala index 885c227d..9e1308cb 100644 --- a/src/main/scala-2.12/scala/swing/MapWrapper.scala +++ b/src/main/scala-2.12/scala/swing/MapWrapper.scala @@ -5,7 +5,7 @@ import scala.collection.mutable /** * Default partial implementation for set adapters. */ -protected[swing] abstract class MapWrapper[K, V] extends mutable.Map[K, V] { +abstract class MapWrapper[K, V] extends mutable.Map[K, V] { // abstract def addOne (elem: (K, V)): this.type diff --git a/src/main/scala-2.12/scala/swing/SetWrapper.scala b/src/main/scala-2.12/scala/swing/SetWrapper.scala index cc7413b0..735b36c4 100644 --- a/src/main/scala-2.12/scala/swing/SetWrapper.scala +++ b/src/main/scala-2.12/scala/swing/SetWrapper.scala @@ -5,7 +5,7 @@ import scala.collection.mutable /** * Default partial implementation for set adapters. */ -protected[swing] abstract class SetWrapper[A] extends mutable.Set[A] { +abstract class SetWrapper[A] extends mutable.Set[A] { // abstract def addOne (elem: A): this.type diff --git a/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala b/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala index bdd8fb71..8c0803ee 100644 --- a/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala +++ b/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala @@ -13,7 +13,9 @@ import scala.collection.{Iterator, mutable} /** * Default partial implementation for buffer adapters. */ -protected[swing] abstract class BufferWrapper[A] extends mutable.Buffer[A] { +abstract class BufferWrapper[A] extends mutable.Buffer[A] { + type MoreElem[+B] = IterableOnce[B] + override def clear(): Unit = for (_ <- 0 until length) remove(0) override def update(n: Int, a: A): Unit = { @@ -25,7 +27,7 @@ protected[swing] abstract class BufferWrapper[A] extends mutable.Buffer[A] { override def prepend(elem: A): this.type = { insert(0, elem); this } - override def insertAll(idx: Int, elems: IterableOnce[A]): Unit = { + override def insertAll(idx: Int, elems: MoreElem[A]): Unit = { var i = idx for (el <- elems.iterator) { insert(i, el) diff --git a/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala b/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala index a406111e..b6045f39 100644 --- a/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala +++ b/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala @@ -2,4 +2,4 @@ package scala.swing import scala.collection.mutable -protected[swing] abstract class MapWrapper[K, V] extends mutable.Map[K, V] \ No newline at end of file +abstract class MapWrapper[K, V] extends mutable.Map[K, V] \ No newline at end of file diff --git a/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala b/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala index ec9b00bb..dd6dcd62 100644 --- a/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala +++ b/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala @@ -2,4 +2,4 @@ package scala.swing import scala.collection.mutable -protected[swing] abstract class SetWrapper[A] extends mutable.Set[A] \ No newline at end of file +abstract class SetWrapper[A] extends mutable.Set[A] \ No newline at end of file diff --git a/src/main/scala/scala/swing/package.scala b/src/main/scala/scala/swing/package.scala index 184da415..723841c9 100644 --- a/src/main/scala/scala/swing/package.scala +++ b/src/main/scala/scala/swing/package.scala @@ -22,7 +22,7 @@ package object swing { type Image = java.awt.Image type Font = java.awt.Font - type Seq[A] = scala.collection.Seq[A] // because scala.Seq differs between Scala 2.12 and 2.13 + type Seq[+A] = scala.collection.Seq[A] // because scala.Seq differs between Scala 2.12 and 2.13 implicit lazy val reflectiveCalls = scala.language.reflectiveCalls implicit lazy val implicitConversions = scala.language.implicitConversions From 466d7f65c8dffa109fd464380c411fd3c8016cb8 Mon Sep 17 00:00:00 2001 From: Hanns Holger Rutz Date: Wed, 12 Dec 2018 23:16:55 +0100 Subject: [PATCH 5/9] list-view selection items is read only --- src/main/scala/scala/swing/ListView.scala | 22 +++++++++++----------- src/main/scala/scala/swing/Swing.scala | 8 ++++---- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/scala/scala/swing/ListView.scala b/src/main/scala/scala/swing/ListView.scala index 70300a95..47554df7 100644 --- a/src/main/scala/scala/swing/ListView.scala +++ b/src/main/scala/scala/swing/ListView.scala @@ -185,27 +185,27 @@ class ListView[A] extends Component { def iterator: Iterator[B] = a.iterator } - def leadIndex: Int = peer.getSelectionModel.getLeadSelectionIndex - def anchorIndex: Int = peer.getSelectionModel.getAnchorSelectionIndex + def leadIndex : Int = peer.getSelectionModel.getLeadSelectionIndex + def anchorIndex : Int = peer.getSelectionModel.getAnchorSelectionIndex /** * The indices of the currently selected items. */ object indices extends Indices(peer.getSelectedIndices) { - override def subtractOne(n: Int): this.type = { peer.removeSelectionInterval(n,n); this } override def addOne (n: Int): this.type = { peer.addSelectionInterval (n,n); this } + override def subtractOne(n: Int): this.type = { peer.removeSelectionInterval(n,n); this } override def clear(): Unit = peer.clearSelection() } -// XXX TODO -// /** -// * The currently selected items. -// */ -// object items extends scala.collection.SeqProxy[A] { -// def self = peer.getSelectedValues.map(_.asInstanceOf[A]) -// } - def items: Seq[A] = ??? + /** + * The currently selected items. + */ + def items: Seq[A] = { + // note: we should be using `getSelectedValuesList`, but it would break the Scala 2.11 + // promise of working with Java 6 (requires Java 7) + peer.getSelectedValues.iterator.map(_.asInstanceOf[A]).toSeq + } def intervalMode: IntervalMode.Value = IntervalMode(peer.getSelectionModel.getSelectionMode) def intervalMode_=(m: IntervalMode.Value): Unit = peer.getSelectionModel.setSelectionMode(m.id) diff --git a/src/main/scala/scala/swing/Swing.scala b/src/main/scala/scala/swing/Swing.scala index ba299629..e5287dd7 100644 --- a/src/main/scala/scala/swing/Swing.scala +++ b/src/main/scala/scala/swing/Swing.scala @@ -19,10 +19,10 @@ import javax.swing.{BorderFactory, Icon, ImageIcon, JComponent, SwingUtilities} * Helpers for this package. */ object Swing { - protected[swing] type PeerContainer = {def peer: awt.Container} + protected[swing] type PeerContainer = { def peer: awt.Container } - protected[swing] def toNoIcon(i: Icon): Icon = if(i == null) EmptyIcon else i - protected[swing] def toNullIcon(i: Icon): Icon = if(i == EmptyIcon) null else i + protected[swing] def toNoIcon (i: Icon): Icon = if (i == null) EmptyIcon else i + protected[swing] def toNullIcon (i: Icon): Icon = if (i == EmptyIcon) null else i protected[swing] def nullPeer(c: PeerContainer): awt.Container = if (c != null) c.peer else null implicit def pair2Dimension(p: (Int, Int)) : Dimension = new Dimension (p._1, p._2) @@ -76,7 +76,7 @@ object Swing { } def unwrapIcon(icon: Icon): Icon = if (icon == null) EmptyIcon else icon - def wrapIcon(icon: Icon): Icon = if (icon == EmptyIcon) null else icon + def wrapIcon (icon: Icon): Icon = if (icon == EmptyIcon) null else icon def EmptyBorder: Border = BorderFactory.createEmptyBorder() def EmptyBorder(weight: Int): Border = From c228e6fce1317bda46408107fed6a7cfe9716fbc Mon Sep 17 00:00:00 2001 From: Hanns Holger Rutz Date: Sun, 16 Dec 2018 02:34:54 +0100 Subject: [PATCH 6/9] add cross-scala way for set and map adaptors' addAll/subtractAll - this mirrors the provisions of buffer-wrapper and is needed by third party swing extensions to avoid forking sources between Scala 2.12 and 2.13 - also provide a default `clear` implementation --- build.sbt | 2 +- .../scala-2.12/scala/swing/MapWrapper.scala | 48 ++++++++++++++++++- .../scala-2.12/scala/swing/SetWrapper.scala | 48 ++++++++++++++++++- .../scala/swing/MapWrapper.scala | 19 +++++++- .../scala/swing/SetWrapper.scala | 21 +++++++- src/main/scala/scala/swing/ButtonGroup.scala | 2 - 6 files changed, 133 insertions(+), 7 deletions(-) diff --git a/build.sbt b/build.sbt index 8ed6ad81..d2ad2a9c 100644 --- a/build.sbt +++ b/build.sbt @@ -16,7 +16,7 @@ scalaVersionsByJvm in ThisBuild := Map( 11 -> List("2.11.12", "2.12.8", "2.13.0-M5").map(_ -> false) ) -scalaVersion in ThisBuild := "2.11.12" // for testing +scalaVersion in ThisBuild := "2.13.0-M5" // for testing OsgiKeys.exportPackage := Seq(s"scala.swing.*;version=${version.value}") diff --git a/src/main/scala-2.12/scala/swing/MapWrapper.scala b/src/main/scala-2.12/scala/swing/MapWrapper.scala index 9e1308cb..c189b3a4 100644 --- a/src/main/scala-2.12/scala/swing/MapWrapper.scala +++ b/src/main/scala-2.12/scala/swing/MapWrapper.scala @@ -1,9 +1,18 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + package scala.swing +import scala.annotation.tailrec import scala.collection.mutable /** - * Default partial implementation for set adapters. + * Default partial implementation for mutable map adapters. */ abstract class MapWrapper[K, V] extends mutable.Map[K, V] { // abstract @@ -15,4 +24,41 @@ abstract class MapWrapper[K, V] extends mutable.Map[K, V] { final def +=(elem: (K, V)): this.type = addOne (elem) final def -=(key: K) : this.type = subtractOne(key) + + /** The collection passed to `addAll` and `subtractAll` */ + type MoreElem[+B] = TraversableOnce[B] + + /** Cross-version way for creating an iterator from `MoreElem`. */ + final protected def mkIterator[B](xs: MoreElem[B]): Iterator[B] = xs.toIterator + + final override def ++=(xs: MoreElem[(K, V)]): this.type = addAll (xs) + final override def --=(xs: MoreElem[ K ]): this.type = subtractAll(xs) + + def addAll(xs: MoreElem[(K, V)]): this.type = { + @tailrec def loop(xsl: scala.collection.LinearSeq[(K, V)]): Unit = + if (xsl.nonEmpty) { + addOne(xsl.head) + loop(xsl.tail) + } + + xs match { + case xsl: scala.collection.LinearSeq[(K, V)] => loop(xsl) + case _ => xs.foreach(addOne) + } + this + } + + def subtractAll(xs: MoreElem[K]): this.type = { + @tailrec def loop(xsl: collection.LinearSeq[K]): Unit = + if (xsl.nonEmpty) { + subtractOne(xsl.head) + loop(xsl.tail) + } + + xs match { + case xsl: scala.collection.LinearSeq[K] => loop(xsl) + case _ => xs.foreach(subtractOne) + } + this + } } \ No newline at end of file diff --git a/src/main/scala-2.12/scala/swing/SetWrapper.scala b/src/main/scala-2.12/scala/swing/SetWrapper.scala index 735b36c4..261c507e 100644 --- a/src/main/scala-2.12/scala/swing/SetWrapper.scala +++ b/src/main/scala-2.12/scala/swing/SetWrapper.scala @@ -1,9 +1,18 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + package scala.swing +import scala.annotation.tailrec import scala.collection.mutable /** - * Default partial implementation for set adapters. + * Default partial implementation for mutable set adapters. */ abstract class SetWrapper[A] extends mutable.Set[A] { // abstract @@ -15,4 +24,41 @@ abstract class SetWrapper[A] extends mutable.Set[A] { final def +=(elem: A): this.type = addOne (elem) final def -=(elem: A): this.type = subtractOne(elem) + + /** The collection passed to `addAll` and `subtractAll` */ + type MoreElem[+B] = TraversableOnce[B] + + /** Cross-version way for creating an iterator from `MoreElem`. */ + final protected def mkIterator[B](xs: MoreElem[B]): Iterator[B] = xs.toIterator + + final override def ++=(xs: MoreElem[A]): this.type = addAll (xs) + final override def --=(xs: MoreElem[A]): this.type = subtractAll(xs) + + def addAll(xs: MoreElem[A]): this.type = { + @tailrec def loop(xsl: scala.collection.LinearSeq[A]): Unit = + if (xsl.nonEmpty) { + addOne(xsl.head) + loop(xsl.tail) + } + + xs match { + case xsl: scala.collection.LinearSeq[A] => loop(xsl) + case _ => xs.foreach(addOne) + } + this + } + + def subtractAll(xs: MoreElem[A]): this.type = { + @tailrec def loop(xsl: collection.LinearSeq[A]): Unit = + if (xsl.nonEmpty) { + subtractOne(xsl.head) + loop(xsl.tail) + } + + xs match { + case xsl: scala.collection.LinearSeq[A] => loop(xsl) + case _ => xs.foreach(subtractOne) + } + this + } } \ No newline at end of file diff --git a/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala b/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala index b6045f39..c7f93088 100644 --- a/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala +++ b/src/main/scala-2.13.0-M5/scala/swing/MapWrapper.scala @@ -1,5 +1,22 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + package scala.swing import scala.collection.mutable -abstract class MapWrapper[K, V] extends mutable.Map[K, V] \ No newline at end of file +/** + * Default partial implementation for mutable map adapters. + */ +abstract class MapWrapper[K, V] extends mutable.Map[K, V] { + /** The collection passed to `addAll` and `subtractAll` */ + type MoreElem[+B] = IterableOnce[B] + + /** Cross-version way for creating an iterator from `MoreElem`. */ + final protected def mkIterator[B](xs: MoreElem[B]): Iterator[B] = xs.iterator +} \ No newline at end of file diff --git a/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala b/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala index dd6dcd62..b877cd0e 100644 --- a/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala +++ b/src/main/scala-2.13.0-M5/scala/swing/SetWrapper.scala @@ -1,5 +1,24 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2007-2013, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + package scala.swing import scala.collection.mutable -abstract class SetWrapper[A] extends mutable.Set[A] \ No newline at end of file +/** + * Default partial implementation for mutable set adapters. + */ +abstract class SetWrapper[A] extends mutable.Set[A] { + /** The collection passed to `addAll` and `subtractAll` */ + type MoreElem[+B] = IterableOnce[B] + + /** Cross-version way for creating an iterator from `MoreElem`. */ + final protected def mkIterator[B](xs: MoreElem[B]): Iterator[B] = xs.iterator + + override def clear(): Unit = iterator.toList.foreach(remove) +} \ No newline at end of file diff --git a/src/main/scala/scala/swing/ButtonGroup.scala b/src/main/scala/scala/swing/ButtonGroup.scala index f67f8260..86bbc8db 100644 --- a/src/main/scala/scala/swing/ButtonGroup.scala +++ b/src/main/scala/scala/swing/ButtonGroup.scala @@ -23,8 +23,6 @@ class ButtonGroup(initialButtons: AbstractButton*) { override def subtractOne(b: AbstractButton): this.type = { peer.remove(b.peer); this } override def addOne (b: AbstractButton): this.type = { peer.add (b.peer); this } - override def clear(): Unit = iterator.toList.foreach(remove) - def contains(b: AbstractButton): Boolean = this.iterator.contains(b) override def size: Int = peer.getButtonCount From acf7c700cf7affdc2e067fcc9779fab7aa713de9 Mon Sep 17 00:00:00 2001 From: Hanns Holger Rutz Date: Mon, 17 Dec 2018 01:36:51 +0100 Subject: [PATCH 7/9] clean up readme; remove commented stale code - remove the commented former and unused class `RefBuffer` - add more information about architecture (events) to read-me; update information about versions and branches --- README.md | 54 ++++++++++++++++++---- src/main/scala/scala/swing/Publisher.scala | 51 ++++---------------- 2 files changed, 54 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index a6b45041..06d3f4d2 100644 --- a/README.md +++ b/README.md @@ -14,16 +14,23 @@ The widget class hierarchy loosely resembles that of Java Swing. The main differ a number of components, like TextField, CheckBox, RadioButton, and so on. Our guess is that this architecture was chosen because Java lacks multiple inheritance. In scala-swing, components that can have child components extend the Container trait. -- Layout managers and panels are coupled. There is no way to exchange the layout manager +- Layout managers and panels are coupled. There is no way to exchange the layout manager of a panel. As a result, the layout constraints for widgets can be typed. (Note that you gain more type-safety and don't loose much flexibility here. Besides being not a common operation, exchanging the layout manager of a panel in Java Swing almost always leads to exchanging the layout constraints for every of the panel's child component. In the end, it is not more work to move all children to a newly created panel.) - - The event system. TODO. - +- Widget hierarchies are built by adding children to their parent container's `contents` + collection. The typical usage style is to create anonymous subclasses of the widgets to + customize their properties, and nest children and event reactions. +- The scala-swing event system follows a different approach than the underlying Java system. + Instead of add event listeners with a particular interface (such as `java.awt.ActionListener`), + a `Reactor` instances announces the interest in receiving events by calling `listenTo` for + a `Publisher`. Publishers are also reactors and listen to themselves per default as a convenience. + A reactor contains an object `reactions` which serves as a convenient place to register observers + by adding partial functions that pattern match for any event that the observer is interested in. + This is shown in the examples section below. - For more details see [SIP-8](docs/SIP-8.md) The library comprises two main packages: @@ -31,11 +38,11 @@ The library comprises two main packages: - `scala.swing`: All widget classes and traits. - `scala.swing.event`: The event hierarchy. - ## Examples A number of examples can be found in the `examples` project. -A good place to start is `[12] scala.swing.examples.UIDemo` (_index number may be different for you_). This pulls in the all the other examples into a tabbed window. +A good place to start is `[16] scala.swing.examples.UIDemo`. +This pulls in the all the other examples into a tabbed window. ``` $ sbt examples/run @@ -62,6 +69,32 @@ Multiple main classes detected, select one to run: Enter number: ``` +### Frame with a Button + +The following example shows how to plug components and containers together and react to a +mouse click on a button: + +```scala +import scala.swing._ + +new Frame { + title = "Hello world" + + contents = new FlowPanel { + contents += new Label("Launch rainbows:") + contents += new Button("Click me") { + reactions += { + case event.ButtonClicked(_) => + println("All the colours!") + } + } + } + + pack() + centerOnScreen() + open() +} +``` ## Versions @@ -69,15 +102,18 @@ Enter number: - The `2.0.x` branch is compiled with JDK 8 and released for Scala 2.11 and 2.12. - When using Scala 2.11, you can use the Scala swing 2.0.x releases on JDK 6 or newer. - Scala 2.12 requires you to use JDK 8 (that has nothing to do with scala-swing). +- Version `2.1.0` adds support for Scala 2.13, while dropping Scala 2.10. -The reason to have two versions is to allow for binary incompatible changes. Also, some java-swing classes were generified in JDK 7 (see [SI-3634](https://issues.scala-lang.org/browse/SI-3634)) and require the scala-swing sources to be adjusted. +The reason to have different major versions is to allow for binary incompatible changes. Also, some java-swing classes were +generified in JDK 7 (see [SI-3634](https://issues.scala-lang.org/browse/SI-3634)) and require the scala-swing sources to be adjusted. ## API documentation (Scaladoc) -The API documentation for scala-swing can be found at [http://www.scala-lang.org/documentation/api.html](http://www.scala-lang.org/documentation/api.html). +The API documentation for scala-swing can be found +at [http://www.scala-lang.org/documentation/api.html](http://www.scala-lang.org/documentation/api.html). ## Current Work -Current changes are being made on the `2.0.x` branch. +Current changes are being made on the `work` branch. diff --git a/src/main/scala/scala/swing/Publisher.scala b/src/main/scala/scala/swing/Publisher.scala index 75c9200c..bdc692a5 100644 --- a/src/main/scala/scala/swing/Publisher.scala +++ b/src/main/scala/scala/swing/Publisher.scala @@ -127,48 +127,15 @@ private[swing] trait SingleRefCollection[+A <: AnyRef] extends Iterable[A] { sel } private[swing] class StrongReference[+T <: AnyRef](value: T) extends Reference[T] { - private[this] var ref: Option[T] = Some(value) - def isValid: Boolean = ref.isDefined - def apply(): T = ref.get - def get : Option[T] = ref - override def toString: String = get.map(_.toString).getOrElse("") - def clear(): Unit = { ref = None } - def enqueue(): Boolean = false - def isEnqueued: Boolean = false - } - -//abstract class RefBuffer[A <: AnyRef] extends BufferWrapper[A] with SingleRefCollection[A] { self => -// protected val underlying: mutable.Buffer[Reference[A]] -// -// def addOne (el: A): this.type = { purgeReferences(); underlying += Ref(el) ; this } -// def prependOne(el: A): this.type = { purgeReferences(); Ref(el) +=: underlying; this } -// -// def remove(el: A): Unit = { underlying -= Ref(el); purgeReferences(); } -// -// def remove(n: Int): A = { val el = apply(n); remove(el); el } -// -// def insertAll(n: Int, iter: Iterable[A]): Unit = { -// purgeReferences() -// underlying.insertAll(n, iter.view.map(Ref)) -// } -// -// def update(n: Int, el: A): Unit = { purgeReferences(); underlying(n) = Ref(el) } -// -// def apply(n: Int): A = { -// purgeReferences() -// var el = underlying(n).get -// while (el.isEmpty) { -// purgeReferences(); el = underlying(n).get -// } -// el.get -// } -// -// def length: Int = { purgeReferences(); underlying.length } -// -// def clear(): Unit = { underlying.clear(); purgeReferences() } -// -// protected[this] def removeReference(ref: Reference[A]): Unit = { underlying -= ref } -//} + private[this] var ref: Option[T] = Some(value) + def isValid: Boolean = ref.isDefined + def apply(): T = ref.get + def get : Option[T] = ref + override def toString: String = get.map(_.toString).getOrElse("") + def clear(): Unit = { ref = None } + def enqueue(): Boolean = false + def isEnqueued: Boolean = false +} private[swing] abstract class RefSet[A <: AnyRef] extends SetWrapper[A] with SingleRefCollection[A] { self => protected val underlying: mutable.Set[Reference[A]] From 72fd1d66c98cb5ac392936dd46ce8d3ecf4fb9a7 Mon Sep 17 00:00:00 2001 From: Hanns Holger Rutz Date: Tue, 18 Dec 2018 11:42:27 +0100 Subject: [PATCH 8/9] remove swing.Seq alias; use immutable.Seq where appropriate - we leave scala.collection.Seq where the API would use Java Arrays, so we do not get sub-par performance in 2.13 - we use the more strict type immutable.Seq where its effortless and actually ensures correct behaviour. Since we are in a binary incompatible new scala-swing version, in the worst case user code that used Array in Scala <2.13 would have to enforce toList, toVector or similar --- .../tutorials/components/ListDemo.scala | 4 ++-- .../scala/swing/BufferWrapper.scala | 2 +- src/main/scala/scala/swing/ComboBox.scala | 10 ++++----- src/main/scala/scala/swing/Container.scala | 4 ++-- src/main/scala/scala/swing/FileChooser.scala | 4 +++- src/main/scala/scala/swing/ListView.scala | 21 +++++++++++-------- src/main/scala/scala/swing/RichWindow.scala | 6 +++--- src/main/scala/scala/swing/RootPanel.scala | 4 +++- src/main/scala/scala/swing/ScrollPane.scala | 4 +++- src/main/scala/scala/swing/SplitPane.scala | 3 ++- src/main/scala/scala/swing/Table.scala | 4 ++-- src/main/scala/scala/swing/package.scala | 7 +++---- 12 files changed, 41 insertions(+), 32 deletions(-) diff --git a/examples/src/main/scala/scala/swing/examples/tutorials/components/ListDemo.scala b/examples/src/main/scala/scala/swing/examples/tutorials/components/ListDemo.scala index 9f054015..f84fe27e 100644 --- a/examples/src/main/scala/scala/swing/examples/tutorials/components/ListDemo.scala +++ b/examples/src/main/scala/scala/swing/examples/tutorials/components/ListDemo.scala @@ -76,7 +76,7 @@ class ListDemo extends BorderPanel { val nameSelected: String = listModel(initiallySelected) //Create a panel that uses BoxLayout. - val buttonPane = new BoxPanel(Orientation.Horizontal) { + val buttonPane: BoxPanel = new BoxPanel(Orientation.Horizontal) { border = Swing.EmptyBorder(5, 5, 5, 5) contents += fireButton contents += Swing.HStrut(5) @@ -157,7 +157,7 @@ class ListDemo extends BorderPanel { } object ListDemo extends SimpleSwingApplication { - lazy val top = new MainFrame() { + lazy val top: Frame = new MainFrame() { title = "ListDemo" //Create and set up the content pane. contents = new ListDemo() diff --git a/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala b/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala index 8c0803ee..b695072c 100644 --- a/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala +++ b/src/main/scala-2.13.0-M5/scala/swing/BufferWrapper.scala @@ -44,7 +44,7 @@ abstract class BufferWrapper[A] extends mutable.Buffer[A] { } } - override def patchInPlace(from: Int, patch: Seq[A], replaced: Int): this.type = { + override def patchInPlace(from: Int, patch: scala.collection.Seq[A], replaced: Int): this.type = { if (replaced > 0) { remove(from, replaced) } diff --git a/src/main/scala/scala/swing/ComboBox.scala b/src/main/scala/scala/swing/ComboBox.scala index 3632e9f6..9a88ec4e 100644 --- a/src/main/scala/scala/swing/ComboBox.scala +++ b/src/main/scala/scala/swing/ComboBox.scala @@ -121,7 +121,7 @@ object ComboBox { implicit def floatEditor (c: ComboBox[Float ]): Editor[Float ] = new BuiltInEditor(c)(s => s.toFloat , s => s.toString) implicit def doubleEditor (c: ComboBox[Double ]): Editor[Double ] = new BuiltInEditor(c)(s => s.toDouble, s => s.toString) - def newConstantModel[A](items: Seq[A]): ComboBoxModel[A] = { + def newConstantModel[A](items: scala.collection.Seq[A]): ComboBoxModel[A] = { new AbstractListModel[A] with ComboBoxModel[A] { private var selected: A = if (items.isEmpty) null.asInstanceOf[A] else items(0) def getSelectedItem: AnyRef = selected.asInstanceOf[AnyRef] @@ -137,7 +137,7 @@ object ComboBox { } } - /*def newMutableModel[A, Self](items: Seq[A] with scala.collection.mutable.Publisher[scala.collection.mutable.Message[A], Self]): ComboBoxModel = { + /*def newMutableModel[A, Self](items: scala.collection.Seq[A] with scala.collection.mutable.Publisher[scala.collection.mutable.Message[A], Self]): ComboBoxModel = { new AbstractListModel with ComboBoxModel { private var selected = items(0) def getSelectedItem: AnyRef = selected.asInstanceOf[AnyRef] @@ -147,8 +147,8 @@ object ComboBox { } } - def newConstantModel[A](items: Seq[A]): ComboBoxModel = items match { - case items: Seq[A] with scala.collection.mutable.Publisher[scala.collection.mutable.Message[A], Self] => newMutableModel + def newConstantModel[A](items: scala.collection.Seq[A]): ComboBoxModel = items match { + case items: scala.collection.Seq[A] with scala.collection.mutable.Publisher[scala.collection.mutable.Message[A], Self] => newMutableModel case _ => newConstantModel(items) }*/ } @@ -159,7 +159,7 @@ object ComboBox { * * @see javax.swing.JComboBox */ -class ComboBox[A](items: Seq[A]) extends Component with Publisher { +class ComboBox[A](items: scala.collection.Seq[A]) extends Component with Publisher { override lazy val peer: JComboBox[A] = new JComboBox(ComboBox.newConstantModel(items)) with SuperMixin object selection extends Publisher { diff --git a/src/main/scala/scala/swing/Container.scala b/src/main/scala/scala/swing/Container.scala index 4e0d78a1..bc84c51e 100644 --- a/src/main/scala/scala/swing/Container.scala +++ b/src/main/scala/scala/swing/Container.scala @@ -19,7 +19,7 @@ object Container { override def peer: javax.swing.JComponent protected val _contents = new Content - def contents: Seq[Component] = _contents + def contents: scala.collection.Seq[Component] = _contents protected class Content extends BufferWrapper[Component] { override def clear(): Unit = peer.removeAll() @@ -61,5 +61,5 @@ trait Container extends UIElement { /** * The child components of this container. */ - def contents: Seq[Component] + def contents: scala.collection.Seq[Component] } diff --git a/src/main/scala/scala/swing/FileChooser.scala b/src/main/scala/scala/swing/FileChooser.scala index 807ae43a..a002b102 100644 --- a/src/main/scala/scala/swing/FileChooser.scala +++ b/src/main/scala/scala/swing/FileChooser.scala @@ -13,6 +13,8 @@ import java.io.File import javax.swing.filechooser.FileFilter import javax.swing.{Icon, JFileChooser} +import scala.collection.immutable + object FileChooser { /** * The result of a file dialog. The precise meaning of the `Approve` @@ -90,7 +92,7 @@ class FileChooser(dir: File) { def selectedFile: File = peer.getSelectedFile def selectedFile_=(file: File): Unit = peer.setSelectedFile(file) - def selectedFiles: Seq[File] = peer.getSelectedFiles.toSeq + def selectedFiles: immutable.Seq[File] = peer.getSelectedFiles.toIndexedSeq def selectedFiles_=(files: File*): Unit = peer.setSelectedFiles(files.toArray) def multiSelectionEnabled: Boolean = peer.isMultiSelectionEnabled diff --git a/src/main/scala/scala/swing/ListView.scala b/src/main/scala/scala/swing/ListView.scala index 47554df7..7a769719 100644 --- a/src/main/scala/scala/swing/ListView.scala +++ b/src/main/scala/scala/swing/ListView.scala @@ -12,6 +12,8 @@ import event._ import javax.swing._ import javax.swing.event._ +import scala.collection.immutable + object ListView { /** * The supported modes of user selections. @@ -143,19 +145,19 @@ class ListView[A] extends Component { import ListView._ override lazy val peer: JList[A] = new JList[A] with SuperMixin - def this(items: Seq[A]) = { + def this(items: scala.collection.Seq[A]) = { this() listData = items } - protected class ModelWrapper[B](val items: Seq[B]) extends AbstractListModel[B] { + protected class ModelWrapper[B](val items: scala.collection.Seq[B]) extends AbstractListModel[B] { def getElementAt(n: Int): B = items(n) def getSize: Int = items.size } - def listData: Seq[A] = peer.getModel match { + def listData: scala.collection.Seq[A] = peer.getModel match { case model: ModelWrapper[a] => model.items - case model => new Seq[A] { selfSeq => + case model => new immutable.Seq[A] { selfSeq => def length: Int = model.getSize def iterator: Iterator[A] = new Iterator[A] { var idx = 0 @@ -166,7 +168,7 @@ class ListView[A] extends Component { } } - def listData_=(items: Seq[A]): Unit = { + def listData_=(items: scala.collection.Seq[A]): Unit = { peer.setModel(new AbstractListModel[A] { def getElementAt(n: Int): A = items(n) def getSize: Int = items.size @@ -177,7 +179,7 @@ class ListView[A] extends Component { * The current item selection. */ object selection extends Publisher { - protected abstract class Indices[B](a: => Seq[B]) extends SetWrapper[B] { + protected abstract class Indices[B](a: => scala.collection.Seq[B]) extends SetWrapper[B] { def contains(n: B): Boolean = a.contains(n) override def size: Int = a.length @@ -201,10 +203,11 @@ class ListView[A] extends Component { /** * The currently selected items. */ - def items: Seq[A] = { + def items: immutable.Seq[A] = { // note: we should be using `getSelectedValuesList`, but it would break the Scala 2.11 - // promise of working with Java 6 (requires Java 7) - peer.getSelectedValues.iterator.map(_.asInstanceOf[A]).toSeq + // promise of working with Java 6 (requires Java 7). + // Note: in Scala <= 2.12, toSeq might produce a Stream. + peer.getSelectedValues.iterator.map(_.asInstanceOf[A]).toIndexedSeq } def intervalMode: IntervalMode.Value = IntervalMode(peer.getSelectionModel.getSelectionMode) diff --git a/src/main/scala/scala/swing/RichWindow.scala b/src/main/scala/scala/swing/RichWindow.scala index 7675f162..3aadd7c0 100644 --- a/src/main/scala/scala/swing/RichWindow.scala +++ b/src/main/scala/scala/swing/RichWindow.scala @@ -146,7 +146,7 @@ object Dialog { optionType: Options.Value = Options.YesNo, messageType: Message.Value = Message.Question, icon: Icon = EmptyIcon, - entries: Seq[Any], + entries: scala.collection.Seq[Any], initial: Int): Result.Value = { val r = JOptionPane.showOptionDialog(nullPeer(parent), message, title, optionType.id, messageType.id, Swing.wrapIcon(icon), @@ -159,10 +159,10 @@ object Dialog { title: String = uiString("OptionPane.inputDialogTitle"), messageType: Message.Value = Message.Question, icon: Icon = EmptyIcon, - entries: Seq[A] = Nil, + entries: scala.collection.Seq[A] = Nil, initial: A): Option[A] = { val e = if (entries.isEmpty) null - else (entries map toAnyRef).toArray + else entries.iterator.map(toAnyRef).toArray val r = JOptionPane.showInputDialog(nullPeer(parent), message, title, messageType.id, Swing.wrapIcon(icon), e, initial) diff --git a/src/main/scala/scala/swing/RootPanel.scala b/src/main/scala/scala/swing/RootPanel.scala index 8f75b3de..29bf2b82 100644 --- a/src/main/scala/scala/swing/RootPanel.scala +++ b/src/main/scala/scala/swing/RootPanel.scala @@ -8,6 +8,8 @@ package scala.swing +import scala.collection.immutable + /** * The root of a component hierarchy. Contains at most one component. * @@ -19,7 +21,7 @@ trait RootPanel extends Container { /** * At most one component. */ - def contents: Seq[Component] = + def contents: immutable.Seq[Component] = if (peer.getContentPane.getComponentCount == 0) Nil else { val c = peer.getContentPane.getComponent(0).asInstanceOf[javax.swing.JComponent] diff --git a/src/main/scala/scala/swing/ScrollPane.scala b/src/main/scala/scala/swing/ScrollPane.scala index 3d67dcdb..6ca8a15f 100644 --- a/src/main/scala/scala/swing/ScrollPane.scala +++ b/src/main/scala/scala/swing/ScrollPane.scala @@ -10,6 +10,8 @@ package scala.swing import javax.swing.{JScrollPane, ScrollPaneConstants} +import scala.collection.immutable + object ScrollPane { object BarPolicy extends Enumeration { import ScrollPaneConstants._ @@ -46,7 +48,7 @@ class ScrollPane extends Component with Container { this() contents = c } - def contents: Seq[Component] = + def contents: immutable.Seq[Component] = List(UIElement.cachedWrapper[Component](peer.getViewport.getView.asInstanceOf[javax.swing.JComponent])) /** diff --git a/src/main/scala/scala/swing/SplitPane.scala b/src/main/scala/scala/swing/SplitPane.scala index 3725ed1b..cc21a99e 100644 --- a/src/main/scala/scala/swing/SplitPane.scala +++ b/src/main/scala/scala/swing/SplitPane.scala @@ -10,6 +10,7 @@ package scala.swing import javax.swing.JSplitPane +import scala.collection.immutable import scala.swing.Swing.nullPeer /** @@ -25,7 +26,7 @@ class SplitPane(o: Orientation.Value, left: Component, right: Component) extends def this(o: Orientation.Value) = this(o, new Component {}, new Component {}) def this() = this(Orientation.Horizontal) - def contents: Seq[Component] = List(leftComponent, rightComponent) + def contents: immutable.Seq[Component] = List(leftComponent, rightComponent) def contents_=(left: Component, right: Component): Unit = { peer.setLeftComponent(nullPeer(left)) peer.setRightComponent(nullPeer(right)) diff --git a/src/main/scala/scala/swing/Table.scala b/src/main/scala/scala/swing/Table.scala index a3b21498..e5dceaf0 100644 --- a/src/main/scala/scala/swing/Table.scala +++ b/src/main/scala/scala/swing/Table.scala @@ -133,7 +133,7 @@ class Table extends Component with Scrollable.Wrapper { * by calling `toString` on the elements. The size of this sequence * must correspond with the inner dimension of `rowData`. */ - def this(rowData: Array[Array[Any]], columnNames: Seq[_]) = { + def this(rowData: Array[Array[Any]], columnNames: scala.collection.Seq[_]) = { this() model = new AbstractTableModel { override def getColumnName(column: Int): String = columnNames(column).toString @@ -196,7 +196,7 @@ class Table extends Component with Scrollable.Wrapper { object selection extends Publisher { // TODO: could be a sorted set - protected abstract class SelectionSet[A](a: => Seq[A]) extends SetWrapper[A] { + protected abstract class SelectionSet[A](a: => scala.collection.Seq[A]) extends SetWrapper[A] { // def -=(n: A): this.type // def +=(n: A): this.type diff --git a/src/main/scala/scala/swing/package.scala b/src/main/scala/scala/swing/package.scala index 723841c9..1869d847 100644 --- a/src/main/scala/scala/swing/package.scala +++ b/src/main/scala/scala/swing/package.scala @@ -22,12 +22,11 @@ package object swing { type Image = java.awt.Image type Font = java.awt.Font - type Seq[+A] = scala.collection.Seq[A] // because scala.Seq differs between Scala 2.12 and 2.13 - implicit lazy val reflectiveCalls = scala.language.reflectiveCalls implicit lazy val implicitConversions = scala.language.implicitConversions - private[swing] def ifNull[A](o: Object, a: A): A = if(o eq null) a else o.asInstanceOf[A] - private[swing] def toOption[A](o: Object): Option[A] = if(o eq null) None else Some(o.asInstanceOf[A]) + private[swing] def ifNull [A](o: Object, a: A): A = if(o eq null) a else o.asInstanceOf[A] + private[swing] def toOption [A](o: Object): Option[A] = if(o eq null) None else Some(o.asInstanceOf[A]) + private[swing] def toAnyRef(x: Any): AnyRef = x.asInstanceOf[AnyRef] } From 15c7223f6461c1850a00d690e3c81d273185f447 Mon Sep 17 00:00:00 2001 From: Hanns Holger Rutz Date: Tue, 18 Dec 2018 11:55:26 +0100 Subject: [PATCH 9/9] FileChooser selectedFiles_= should not use var-args - the previous signature `selectedFiles_=(files: File*)` does not make sense, because we want to write that without parentheses, and getter and setter should have matching arguments. Use s.c.Seq now in both cases. --- src/main/scala/scala/swing/FileChooser.scala | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/scala/scala/swing/FileChooser.scala b/src/main/scala/scala/swing/FileChooser.scala index a002b102..d84519fe 100644 --- a/src/main/scala/scala/swing/FileChooser.scala +++ b/src/main/scala/scala/swing/FileChooser.scala @@ -13,8 +13,6 @@ import java.io.File import javax.swing.filechooser.FileFilter import javax.swing.{Icon, JFileChooser} -import scala.collection.immutable - object FileChooser { /** * The result of a file dialog. The precise meaning of the `Approve` @@ -92,8 +90,8 @@ class FileChooser(dir: File) { def selectedFile: File = peer.getSelectedFile def selectedFile_=(file: File): Unit = peer.setSelectedFile(file) - def selectedFiles: immutable.Seq[File] = peer.getSelectedFiles.toIndexedSeq - def selectedFiles_=(files: File*): Unit = peer.setSelectedFiles(files.toArray) + def selectedFiles: scala.collection.Seq[File] = peer.getSelectedFiles.toSeq + def selectedFiles_=(files: scala.collection.Seq[File]): Unit = peer.setSelectedFiles(files.toArray) def multiSelectionEnabled: Boolean = peer.isMultiSelectionEnabled def multiSelectionEnabled_=(b: Boolean): Unit = peer.setMultiSelectionEnabled(b)