Skip to content

Commit d8ec49a

Browse files
committed
Generic version of swing classes.
Adapted from commit 46ef5b488a Author: Paul Phillips <[email protected]> Date: 3 years ago scala trunk modified to build with java 7. At this time a common source base is not possible due to java7 "generifying" some swing classes, such that they exist with no type parameter in java6 but with one in java7.
1 parent dc92528 commit d8ec49a

File tree

4 files changed

+35
-36
lines changed

4 files changed

+35
-36
lines changed

.travis.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ script:
44
scala:
55
- 2.11.0-SNAPSHOT
66
jdk:
7-
- openjdk6
87
- openjdk7
98
notifications:
109
email:

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
scala-swing (unsupported) [<img src="https://api.travis-ci.org/scala/scala-swing.png"/>](https://travis-ci.org/scala/scala-swing)
1+
scala-swing (unsupported) [<img src="https://api.travis-ci.org/scala/scala-swing.png?branch=java7"/>](https://travis-ci.org/scala/scala-swing?branch=java7)
22
=========
33

44
We welcome contributions, but do not actively maintain this library.

src/main/scala/scala/swing/ComboBox.scala

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
package scala.swing
1010

1111
import event._
12-
import javax.swing.{JList, JComponent, JComboBox, JTextField, ComboBoxModel, AbstractListModel, ListCellRenderer}
12+
import javax.swing.{ JComponent, JComboBox, JTextField, ComboBoxModel, AbstractListModel, ListCellRenderer }
1313
import java.awt.event.ActionListener
1414

1515
object ComboBox {
@@ -118,18 +118,18 @@ object ComboBox {
118118
implicit def floatEditor(c: ComboBox[Float]): Editor[Float] = new BuiltInEditor(c)(s => s.toFloat, s => s.toString)
119119
implicit def doubleEditor(c: ComboBox[Double]): Editor[Double] = new BuiltInEditor(c)(s => s.toDouble, s => s.toString)
120120

121-
def newConstantModel[A](items: Seq[A]): ComboBoxModel = {
122-
new AbstractListModel with ComboBoxModel {
121+
def newConstantModel[A](items: Seq[A]): ComboBoxModel[A] = {
122+
new AbstractListModel[A] with ComboBoxModel[A] {
123123
private var selected: A = if (items.isEmpty) null.asInstanceOf[A] else items(0)
124-
def getSelectedItem: AnyRef = selected.asInstanceOf[AnyRef]
124+
def getSelectedItem = selected.asInstanceOf[AnyRef]
125125
def setSelectedItem(a: Any) {
126126
if ((selected != null && selected != a) ||
127127
selected == null && a != null) {
128128
selected = a.asInstanceOf[A]
129129
fireContentsChanged(this, -1, -1)
130130
}
131131
}
132-
def getElementAt(n: Int) = items(n).asInstanceOf[AnyRef]
132+
def getElementAt(n: Int) = items(n).asInstanceOf[A]
133133
def getSize = items.size
134134
}
135135
}
@@ -157,7 +157,7 @@ object ComboBox {
157157
* @see javax.swing.JComboBox
158158
*/
159159
class ComboBox[A](items: Seq[A]) extends Component with Publisher {
160-
override lazy val peer: JComboBox = new JComboBox(ComboBox.newConstantModel(items)) with SuperMixin
160+
override lazy val peer: JComboBox[A] = new JComboBox(ComboBox.newConstantModel(items)) with SuperMixin
161161

162162
object selection extends Publisher {
163163
def index: Int = peer.getSelectedIndex
@@ -182,7 +182,7 @@ class ComboBox[A](items: Seq[A]) extends Component with Publisher {
182182
* of the component to its own defaults _after_ the renderer has been
183183
* configured. That's Swing's principle of most suprise.
184184
*/
185-
def renderer: ListView.Renderer[A] = ListView.Renderer.wrap[A](peer.getRenderer)
185+
def renderer: ListView.Renderer[A] = ListView.Renderer.wrap(peer.getRenderer.asInstanceOf[ListCellRenderer[A]])
186186
def renderer_=(r: ListView.Renderer[A]) { peer.setRenderer(r.peer) }
187187

188188
/* XXX: currently not safe to expose:
@@ -201,8 +201,8 @@ class ComboBox[A](items: Seq[A]) extends Component with Publisher {
201201
peer.setEditor(editor(this).comboBoxPeer)
202202
}
203203

204-
def prototypeDisplayValue: Option[A] = toOption[A](peer.getPrototypeDisplayValue)
204+
def prototypeDisplayValue: Option[A] = Option(peer.getPrototypeDisplayValue)
205205
def prototypeDisplayValue_=(v: Option[A]) {
206-
peer.setPrototypeDisplayValue((v map toAnyRef).orNull)
206+
peer.setPrototypeDisplayValue(v getOrElse null.asInstanceOf[A])
207207
}
208208
}

src/main/scala/scala/swing/ListView.scala

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,21 @@ object ListView {
2424
val MultiInterval = Value(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION)
2525
}
2626

27-
def wrap[A](c: JList) = new ListView[A] {
27+
def wrap[A](c: JList[A]) = new ListView[A] {
2828
override lazy val peer = c
2929
}
3030

3131
object Renderer {
32-
def wrap[A](r: ListCellRenderer): Renderer[A] = new Wrapped[A](r)
32+
def wrap[A](r: ListCellRenderer[A]): Renderer[A] = new Wrapped[A](r)
3333

3434
/**
3535
* Wrapper for <code>javax.swing.ListCellRenderer<code>s
3636
*/
37-
class Wrapped[A](override val peer: ListCellRenderer) extends Renderer[A] {
38-
def componentFor(list: ListView[_], isSelected: Boolean, focused: Boolean, a: A, index: Int) = {
37+
class Wrapped[A](override val peer: ListCellRenderer[A]) extends Renderer[A] {
38+
def componentFor(list: ListView[_ <: A], isSelected: Boolean, focused: Boolean, a: A, index: Int) = {
3939
Component.wrap(peer.getListCellRendererComponent(list.peer, a, index, isSelected, focused).asInstanceOf[JComponent])
4040
}
41-
}
41+
}
4242

4343
/**
4444
* Returns a renderer for items of type <code>A</code>. The given function
@@ -55,8 +55,8 @@ object ListView {
5555
* </code>
5656
*/
5757
def apply[A,B](f: A => B)(implicit renderer: Renderer[B]): Renderer[A] = new Renderer[A] {
58-
def componentFor(list: ListView[_], isSelected: Boolean, focused: Boolean, a: A, index: Int): Component =
59-
renderer.componentFor(list, isSelected, focused, f(a), index)
58+
def componentFor(list: ListView[_ <: A], isSelected: Boolean, focused: Boolean, a: A, index: Int): Component =
59+
renderer.componentFor(list.asInstanceOf[ListView[_ <: B]], isSelected, focused, f(a), index)
6060
}
6161
}
6262

@@ -69,11 +69,11 @@ object ListView {
6969
* @see javax.swing.ListCellRenderer
7070
*/
7171
abstract class Renderer[-A] {
72-
def peer: ListCellRenderer = new ListCellRenderer {
73-
def getListCellRendererComponent(list: JList, a: Any, index: Int, isSelected: Boolean, focused: Boolean) =
74-
componentFor(ListView.wrap[A](list), isSelected, focused, a.asInstanceOf[A], index).peer
72+
def peer: ListCellRenderer[_ >: A] = new ListCellRenderer[A] {
73+
def getListCellRendererComponent(list: JList[_ <: A], a: A, index: Int, isSelected: Boolean, focused: Boolean) =
74+
componentFor(ListView.wrap[A](list.asInstanceOf[JList[A]]), isSelected, focused, a, index).peer
7575
}
76-
def componentFor(list: ListView[_], isSelected: Boolean, focused: Boolean, a: A, index: Int): Component
76+
def componentFor(list: ListView[_ <: A], isSelected: Boolean, focused: Boolean, a: A, index: Int): Component
7777
}
7878

7979
/**
@@ -110,7 +110,7 @@ object ListView {
110110
/**
111111
* Configures the component before returning it.
112112
*/
113-
def componentFor(list: ListView[_], isSelected: Boolean, focused: Boolean, a: A, index: Int): Component = {
113+
def componentFor(list: ListView[_ <: A], isSelected: Boolean, focused: Boolean, a: A, index: Int): Component = {
114114
preConfigure(list, isSelected, focused, a, index)
115115
configure(list, isSelected, focused, a, index)
116116
component
@@ -123,10 +123,10 @@ object ListView {
123123
* that renders the string returned from an item's <code>toString</code>.
124124
*/
125125
implicit object GenericRenderer extends Renderer[Any] {
126-
override lazy val peer: ListCellRenderer = new DefaultListCellRenderer
127-
def componentFor(list: ListView[_], isSelected: Boolean, focused: Boolean, a: Any, index: Int): Component = {
128-
val c = peer.getListCellRendererComponent(list.peer, a, index, isSelected, focused).asInstanceOf[JComponent]
129-
Component.wrap(c)
126+
override lazy val peer: ListCellRenderer[Any] = (new DefaultListCellRenderer).asInstanceOf[ListCellRenderer[Any]]
127+
def componentFor(list: ListView[_ <: Any], isSelected: Boolean, focused: Boolean, a: Any, index: Int): Component = {
128+
val c = peer.getListCellRendererComponent(list.peer, a, index, isSelected, focused)
129+
Component.wrap(c.asInstanceOf[JComponent])
130130
}
131131
}
132132
}
@@ -142,34 +142,34 @@ object ListView {
142142
*/
143143
class ListView[A] extends Component {
144144
import ListView._
145-
override lazy val peer: JList = new JList with SuperMixin
145+
override lazy val peer: JList[A] = new JList[A] with SuperMixin
146146

147147
def this(items: Seq[A]) = {
148148
this()
149149
listData = items
150150
}
151151

152-
protected class ModelWrapper(val items: Seq[A]) extends AbstractListModel {
153-
def getElementAt(n: Int) = items(n).asInstanceOf[AnyRef]
152+
protected class ModelWrapper[A](val items: Seq[A]) extends AbstractListModel[A] {
153+
def getElementAt(n: Int) = items(n)
154154
def getSize = items.size
155155
}
156156

157157
def listData: Seq[A] = peer.getModel match {
158-
case model: ModelWrapper => model.items
159-
case model @ _ => new Seq[A] { selfSeq =>
158+
case model: ModelWrapper[a] => model.items
159+
case model => new Seq[A] { selfSeq =>
160160
def length = model.getSize
161161
def iterator = new Iterator[A] {
162162
var idx = 0
163163
def next = { idx += 1; apply(idx-1) }
164164
def hasNext = idx < selfSeq.length
165165
}
166-
def apply(n: Int) = model.getElementAt(n).asInstanceOf[A]
166+
def apply(n: Int): A = model.getElementAt(n)
167167
}
168168
}
169169

170170
def listData_=(items: Seq[A]) {
171-
peer.setModel(new AbstractListModel {
172-
def getElementAt(n: Int) = items(n).asInstanceOf[AnyRef]
171+
peer.setModel(new AbstractListModel[A] {
172+
def getElementAt(n: Int) = items(n)
173173
def getSize = items.size
174174
})
175175
}
@@ -216,7 +216,7 @@ class ListView[A] extends Component {
216216
def adjusting = peer.getSelectionModel.getValueIsAdjusting
217217
}
218218

219-
def renderer: ListView.Renderer[A] = ListView.Renderer.wrap[A](peer.getCellRenderer)
219+
def renderer: ListView.Renderer[A] = ListView.Renderer.wrap(peer.getCellRenderer)
220220
def renderer_=(r: ListView.Renderer[A]) { peer.setCellRenderer(r.peer) }
221221

222222
def fixedCellWidth = peer.getFixedCellWidth

0 commit comments

Comments
 (0)