diff options
author | Ingo Maier <ingo.maier@epfl.ch> | 2008-07-15 14:35:42 +0000 |
---|---|---|
committer | Ingo Maier <ingo.maier@epfl.ch> | 2008-07-15 14:35:42 +0000 |
commit | aa3d38d9a08f89c0f9ce21f25982b652bc86c20a (patch) | |
tree | aa1997d1035a8326c56a6f906b33542ad2d49910 /src | |
parent | 06f6a127b763908166d151a26817d00fa69bbd51 (diff) | |
download | scala-aa3d38d9a08f89c0f9ce21f25982b652bc86c20a.tar.gz scala-aa3d38d9a08f89c0f9ce21f25982b652bc86c20a.tar.bz2 scala-aa3d38d9a08f89c0f9ce21f25982b652bc86c20a.zip |
Fixed and added things for Andrew, rearranged e...
Fixed and added things for Andrew, rearranged event hierarchy and list
renderers
Diffstat (limited to 'src')
30 files changed, 154 insertions, 68 deletions
diff --git a/src/swing/scala/swing/AbstractButton.scala b/src/swing/scala/swing/AbstractButton.scala index e496d0566a..85fb6f39d1 100644 --- a/src/swing/scala/swing/AbstractButton.scala +++ b/src/swing/scala/swing/AbstractButton.scala @@ -45,8 +45,8 @@ abstract class AbstractButton extends Component with Action.Trigger with Publish def selected: Boolean = peer.isSelected def selected_=(b: Boolean) = peer.setSelected(b) - def contentAreaFilled: Boolean = peer.isContentAreaFilled() - def contentAreaFilled_=(b: Boolean) { peer.setContentAreaFilled(true) } + def contentAreaFilled: Boolean = peer.isContentAreaFilled + def contentAreaFilled_=(b: Boolean) { peer.setContentAreaFilled(b) } def borderPainted: Boolean = peer.isBorderPainted def borderPainted_=(b: Boolean) { peer.setBorderPainted(b) } diff --git a/src/swing/scala/swing/ComboBox.scala b/src/swing/scala/swing/ComboBox.scala index ef290781b0..4e400e726c 100644 --- a/src/swing/scala/swing/ComboBox.scala +++ b/src/swing/scala/swing/ComboBox.scala @@ -82,7 +82,6 @@ object ComboBox { val verifier = new javax.swing.InputVerifier { // TODO: should chain with potentially existing verifier in editor def verify(c: JComponent) = try { - println(c) value = string2A(c.asInstanceOf[JTextField].getText) true } @@ -155,11 +154,11 @@ class ComboBox[A](items: Seq[A]) extends Component with Publisher { object selection extends Publisher { def index: Int = peer.getSelectedIndex + def index_=(n: Int) { peer.setSelectedIndex(n) } def item: A = peer.getSelectedItem.asInstanceOf[A] + def item_=(a: A) { peer.setSelectedItem(a) } - println("created") peer.addActionListener(Swing.ActionListener { e => - println("action") publish(event.SelectionChanged(ComboBox.this)) }) } diff --git a/src/swing/scala/swing/Component.scala b/src/swing/scala/swing/Component.scala index 3a715e91aa..27ddde51bd 100644 --- a/src/swing/scala/swing/Component.scala +++ b/src/swing/scala/swing/Component.scala @@ -11,8 +11,8 @@ object Component { private val ClientKey = "scala.swingWrapper" /** - * Returns the wrapper for a given peer. - * Fails if there is no wrapper for the given component. + * Returns the wrapper for a given peer, null if there is no wrapper + * for the given component. */ protected[swing] def wrapperFor[C<:Component](c: javax.swing.JComponent): C = c.getClientProperty(ClientKey).asInstanceOf[C] @@ -20,7 +20,7 @@ object Component { /** * Wraps a given Java Swing Component into a new wrapper. */ - def wrap[A](c: JComponent) = new Component { + def wrap(c: JComponent): Component = new Component { override lazy val peer = c } } diff --git a/src/swing/scala/swing/Container.scala b/src/swing/scala/swing/Container.scala index 0c421f6f4a..c1a2c7cc32 100644 --- a/src/swing/scala/swing/Container.scala +++ b/src/swing/scala/swing/Container.scala @@ -9,7 +9,7 @@ object Container { def contents: Seq[Component] = _contents protected class Content extends BufferWrapper[Component] { - def wrap(c: java.awt.Component) = Component.wrapperFor(c.asInstanceOf[javax.swing.JComponent]) + def wrap(c: java.awt.Component): Component = Component.wrapperFor(c.asInstanceOf[javax.swing.JComponent]) override def clear { peer.removeAll() } def remove(n: Int): Component = { val c = peer.getComponent(n) diff --git a/src/swing/scala/swing/Frame.scala b/src/swing/scala/swing/Frame.scala index 4b790cc905..9d0162356f 100644 --- a/src/swing/scala/swing/Frame.scala +++ b/src/swing/scala/swing/Frame.scala @@ -33,6 +33,8 @@ class Frame extends UIElement with RootPanel with Publisher { def menuBar: MenuBar = Component.wrapperFor(peer.getJMenuBar) def menuBar_=(m: MenuBar) = peer.setJMenuBar(m.peer) + def setLocationRelativeTo(c: UIElement) { peer.setLocationRelativeTo(c.peer) } + peer.addWindowListener(new java.awt.event.WindowListener { def windowActivated(e: java.awt.event.WindowEvent) { publish(WindowActivated(Frame.this)) } def windowClosed(e: java.awt.event.WindowEvent) { publish(WindowClosed(Frame.this)) } diff --git a/src/swing/scala/swing/ListView.scala b/src/swing/scala/swing/ListView.scala index 25af541802..1b1fbb76e8 100644 --- a/src/swing/scala/swing/ListView.scala +++ b/src/swing/scala/swing/ListView.scala @@ -20,19 +20,28 @@ object ListView { def wrap[A](r: ListCellRenderer): Renderer[A] = new Wrapped[A](r) class Wrapped[A](override val peer: ListCellRenderer) extends Renderer[A] { - def componentFor(list: ListView[_<:A], isSelected: Boolean, hasFocus: Boolean, a: A, index: Int) = { + def componentFor(list: ListView[_], isSelected: Boolean, hasFocus: Boolean, a: A, index: Int) = { Component.wrap(peer.getListCellRendererComponent(list.peer, a, index, isSelected, hasFocus).asInstanceOf[JComponent]) } } + + def apply[A,B](f: A => B)(implicit renderer: Renderer[B]): Renderer[A] = new Renderer[A] { + def componentFor(list: ListView[_], isSelected: Boolean, hasFocus: Boolean, a: A, index: Int): Component = + renderer.componentFor(list, isSelected, hasFocus, f(a), index) + } } + /*def Renderer[A,B](f: A => B)(implicit renderer: Renderer[B]): Renderer[A] = new Renderer[A] { + def componentFor(list: ListView[_], isSelected: Boolean, hasFocus: Boolean, a: A, index: Int): Component = + renderer.componentFor(list, isSelected, hasFocus, f(a), index) + }*/ + abstract class Renderer[-A] { def peer: ListCellRenderer = new ListCellRenderer { - def getListCellRendererComponent(list: JList, a: Any, index: Int, isSelected: Boolean, hasFocus: Boolean) = { + def getListCellRendererComponent(list: JList, a: Any, index: Int, isSelected: Boolean, hasFocus: Boolean) = componentFor(ListView.wrap[A](list), isSelected, hasFocus, a.asInstanceOf[A], index).peer - } } - def componentFor(list: ListView[_<:A], isSelected: Boolean, hasFocus: Boolean, a: A, index: Int): Component + def componentFor(list: ListView[_], isSelected: Boolean, hasFocus: Boolean, a: A, index: Int): Component } /** @@ -41,7 +50,7 @@ object ListView { * components type so clients can easily use component specific attributes * during configuration. */ - abstract class DefaultRenderer[-A, C<:Component](protected val component: C) extends Renderer[A] { + abstract class AbstractRenderer[-A, C<:Component](protected val component: C) extends Renderer[A] { // The renderer component is responsible for painting selection // backgrounds. Hence, make sure it is opaque to let it draw // the background. @@ -50,7 +59,7 @@ object ListView { /** * Standard preconfiguration that is commonly done for any component. */ - def preConfigure(list: ListView[_<:A], isSelected: Boolean, hasFocus: Boolean, a: A, index: Int) { + def preConfigure(list: ListView[_], isSelected: Boolean, hasFocus: Boolean, a: A, index: Int) { if (isSelected) { component.background = list.selectionBackground component.foreground = list.selectionForeground @@ -62,17 +71,26 @@ object ListView { /** * Configuration that is specific to the component and this renderer. */ - def configure(list: ListView[_<:A], isSelected: Boolean, hasFocus: Boolean, a: A, index: Int) + def configure(list: ListView[_], isSelected: Boolean, hasFocus: Boolean, a: A, index: Int) /** * Configures the component before returning it. */ - def componentFor(list: ListView[_<:A], isSelected: Boolean, hasFocus: Boolean, a: A, index: Int): Component = { + def componentFor(list: ListView[_], isSelected: Boolean, hasFocus: Boolean, a: A, index: Int): Component = { preConfigure(list, isSelected, hasFocus, a, index) configure(list, isSelected, hasFocus, a, index) component } } + + implicit object GenericRenderer extends Renderer[Any] { + override lazy val peer: ListCellRenderer = new DefaultListCellRenderer + def componentFor(list: ListView[_], isSelected: Boolean, hasFocus: Boolean, a: Any, index: Int): Component = { + val c = peer.getListCellRendererComponent(list.peer, a, index, isSelected, hasFocus).asInstanceOf[JComponent] + val w = Component.wrapperFor[Component](c) + if (w eq null) Component.wrap(c) else w + } + } } /** @@ -88,12 +106,35 @@ class ListView[A] extends Component { def this(items: Seq[A]) = { this() + listData = items + } + + protected class ModelWrapper(val items: Seq[A]) extends AbstractListModel { + def getElementAt(n: Int) = items(n).asInstanceOf[AnyRef] + def getSize = items.size + } + + def listData: Seq[A] = peer.getModel match { + case model: ModelWrapper => model.items + case model @ _ => new Seq[A] { + def length = model.getSize + def elements = new Iterator[A] { + var idx = 0 + def next = { idx += 1; apply(idx-1) } + def hasNext = idx < length + } + def apply(n: Int) = model.getElementAt(n).asInstanceOf[A] + } + } + + def listData_=(items: Seq[A]) { peer.setModel(new AbstractListModel { def getElementAt(n: Int) = items(n).asInstanceOf[AnyRef] def getSize = items.size }) } + object selection extends Publisher { protected abstract class Indices[A](a: =>Seq[A]) extends scala.collection.mutable.Set[A] { def -=(n: A) @@ -110,9 +151,10 @@ class ListView[A] extends Component { def leadIndex: Int = peer.getSelectionModel.getLeadSelectionIndex def anchorIndex: Int = peer.getSelectionModel.getAnchorSelectionIndex } + def selectIndices(ind: Int*) = peer.setSelectedIndices(ind.toArray) object items extends SeqProxy[A] { - def self = peer.getSelectedValues.projection.map(_.asInstanceOf[A]) + def self = peer.getSelectedValues.map(_.asInstanceOf[A]) def leadIndex: Int = peer.getSelectionModel.getLeadSelectionIndex def anchorIndex: Int = peer.getSelectionModel.getAnchorSelectionIndex } @@ -122,11 +164,14 @@ class ListView[A] extends Component { peer.getSelectionModel.addListSelectionListener(new ListSelectionListener { def valueChanged(e: javax.swing.event.ListSelectionEvent) { - publish(ElementSelected(ListView.this, e.getFirstIndex to e.getLastIndex, e.getValueIsAdjusting)) + publish(ListSelectionChanged(ListView.this, e.getFirstIndex to e.getLastIndex, e.getValueIsAdjusting)) } }) } + def renderer: ListView.Renderer[A] = ListView.Renderer.wrap(peer.getCellRenderer) + def renderer_=(r: ListView.Renderer[A]) { peer.setCellRenderer(r.peer) } + def fixedCellWidth = peer.getFixedCellWidth def fixedCellWidth_=(x: Int) = peer.setFixedCellWidth(x) diff --git a/src/swing/scala/swing/SplitPane.scala b/src/swing/scala/swing/SplitPane.scala index 05d1da2b13..747dc4eb29 100644 --- a/src/swing/scala/swing/SplitPane.scala +++ b/src/swing/scala/swing/SplitPane.scala @@ -6,13 +6,11 @@ import Swing._ /** * @see javax.swing.JSplitPane */ -class SplitPane(o: Orientation.Value) extends Component with Container with Orientable { - override lazy val peer: javax.swing.JSplitPane = new javax.swing.JSplitPane(o.id) +class SplitPane(o: Orientation.Value, left: Component, right: Component) extends Component with Container with Orientable { + override lazy val peer: javax.swing.JSplitPane = new javax.swing.JSplitPane(o.id, left.peer, right.peer) + def this(o: Orientation.Value) = this(Orientation.Horizontal, new Component {}, new Component {}) def this() = this(Orientation.Horizontal) - leftComponent = new Component {} - rightComponent = new Component {} - def contents: Seq[Component] = List(leftComponent, rightComponent) def contents_=(left: Component, right: Component) { peer.setLeftComponent(left.peer) @@ -31,6 +29,12 @@ class SplitPane(o: Orientation.Value) extends Component with Container with Orie def dividerLocation: Int = peer.getDividerLocation def dividerLocation_=(n: Int) { peer.setDividerLocation(n) } + + /*def proportionalDividerLocation: Double = + if (orientation == Orientation.Vertical) dividerLocation / (size.height - dividerSize) + else dividerLocation / (size.width - dividerSize)*/ + def dividerLocation_=(f: Double) { peer.setDividerLocation(f) } + def dividerSize: Int = peer.getDividerSize def dividerSize_=(n: Int) { peer.setDividerSize(n) } def resizeWeight: Double = peer.getResizeWeight diff --git a/src/swing/scala/swing/TabbedPane.scala b/src/swing/scala/swing/TabbedPane.scala index 7ccd747bd5..e86c1f060c 100644 --- a/src/swing/scala/swing/TabbedPane.scala +++ b/src/swing/scala/swing/TabbedPane.scala @@ -12,18 +12,18 @@ object TabbedPane { val Scroll = Value(JTabbedPane.SCROLL_TAB_LAYOUT) } - class Page protected(title0: String, content0: Component, tip0: String, index0: Int) extends Proxy { + class Page protected[TabbedPane](parent0: TabbedPane, title0: String, content0: Component, tip0: String) extends Proxy { def self = content0 def this(title0: String, content0: Component, tip0: String) = - this(title0, content0, tip0, 0) + this(null, title0, content0, tip0) def this(title0: String, content0: Component) = this(title0, content0, "") content = content0 // first add component, *then* set other things title = title0 tip = tip0 - protected[TabbedPane] var parent: TabbedPane = null + protected[TabbedPane] var parent: TabbedPane = parent0 protected var _title = title0 def title: String = _title//parent.peer.getTitleAt(index) @@ -50,8 +50,8 @@ object TabbedPane { // TODO: icon, disabledIcon - def index = _index - protected[TabbedPane] var _index: Int = index0 + def index = if(parent != null) parent.peer.indexOfTab(title) else 0//_index + //protected[TabbedPane] var _index: Int = index0 } } @@ -69,18 +69,18 @@ class TabbedPane extends Component with Publisher { val t = apply(n) peer.removeTabAt(n) t.parent = null - for(i <- n to length) apply(i)._index -= 1 + //for(i <- n to length) apply(i)._index -= 1 t } protected def insertAt(n: Int, t: Page) { - for(i <- n to length) apply(i)._index += 1 + //for(i <- n to length) apply(i)._index += 1 t.parent = TabbedPane.this peer.insertTab(t.title, null, t.content.peer, t.tip, n) } def +=(t: Page) { t.parent = TabbedPane.this; peer.addTab(t.title, null, t.content.peer, t.tip) } def length = peer.getTabCount - def apply(n: Int) = new Page(peer.getTitleAt(n), + def apply(n: Int) = new Page(TabbedPane.this, peer.getTitleAt(n), Component.wrapperFor(peer.getComponentAt(n).asInstanceOf[javax.swing.JComponent]), peer.getToolTipTextAt(n)) } diff --git a/src/swing/scala/swing/Table.scala b/src/swing/scala/swing/Table.scala index 22012b0b45..219b567526 100644 --- a/src/swing/scala/swing/Table.scala +++ b/src/swing/scala/swing/Table.scala @@ -38,7 +38,7 @@ object Table { def componentFor(table: Table, isSelected: Boolean, hasFocus: Boolean, a: A, row: Int, column: Int): Component } - abstract class DefaultRenderer[-A, C<:Component](val component: C) extends Renderer[A] { + abstract class AbstractRenderer[-A, C<:Component](val component: C) extends Renderer[A] { // The renderer component is responsible for painting selection // backgrounds. Hence, make sure it is opaque to let it draw // the background. @@ -71,7 +71,7 @@ object Table { } } - class LabelRenderer[A](convert: A => (Icon, String)) extends DefaultRenderer[A, Label](new Label) { + class LabelRenderer[A](convert: A => (Icon, String)) extends AbstractRenderer[A, Label](new Label) { def configure(table: Table, isSelected: Boolean, hasFocus: Boolean, a: A, row: Int, column: Int) { val (icon, text) = convert(a) component.icon = icon diff --git a/src/swing/scala/swing/TextArea.scala b/src/swing/scala/swing/TextArea.scala index 12abe1b5ea..50e1767080 100644 --- a/src/swing/scala/swing/TextArea.scala +++ b/src/swing/scala/swing/TextArea.scala @@ -9,10 +9,10 @@ import event._ * * @see javax.swing.JTextArea */ -class TextArea(text0: String, rows0: Int, columns0: int) extends TextComponent with TextComponent.HasColumns with TextComponent.HasRows { +class TextArea(text0: String, rows0: Int, columns0: Int) extends TextComponent with TextComponent.HasColumns with TextComponent.HasRows { override lazy val peer: JTextArea = new JTextArea(text0, rows0, columns0) def this(text: String) = this(text, 0, 0) - def this(rows: Int, columns: int) = this("", rows, columns) + def this(rows: Int, columns: Int) = this("", rows, columns) def this() = this("", 0, 0) // TODO: we could make contents StringBuilder-like diff --git a/src/swing/scala/swing/UIElement.scala b/src/swing/scala/swing/UIElement.scala index 7101f0ae27..22370d33b0 100644 --- a/src/swing/scala/swing/UIElement.scala +++ b/src/swing/scala/swing/UIElement.scala @@ -5,8 +5,9 @@ import java.awt.{Color, Cursor, Font, Dimension} /** * The base trait of all user interface elements. */ -trait UIElement { +trait UIElement extends Proxy { def peer: java.awt.Component + def self = peer def foreground: Color = peer.getForeground def foreground_=(c: Color) = peer.setForeground(c) def background: Color = peer.getBackground diff --git a/src/swing/scala/swing/event/BackgroundChanged.scala b/src/swing/scala/swing/event/BackgroundChanged.scala index 2e9c212b97..6673ec47c1 100644 --- a/src/swing/scala/swing/event/BackgroundChanged.scala +++ b/src/swing/scala/swing/event/BackgroundChanged.scala @@ -1,3 +1,3 @@ package scala.swing.event -case class BackgroundChanged(override val source: Component) extends ComponentEvent(source) +case class BackgroundChanged(override val source: Component) extends ComponentEvent diff --git a/src/swing/scala/swing/event/ButtonClicked.scala b/src/swing/scala/swing/event/ButtonClicked.scala index ce3fcf3c18..ce5b0c7cdd 100644 --- a/src/swing/scala/swing/event/ButtonClicked.scala +++ b/src/swing/scala/swing/event/ButtonClicked.scala @@ -1,4 +1,4 @@ package scala.swing.event -case class ButtonClicked(override val source: AbstractButton) extends ComponentEvent(source) with ActionEvent +case class ButtonClicked(override val source: AbstractButton) extends ComponentEvent with ActionEvent diff --git a/src/swing/scala/swing/event/CaretUpdate.scala b/src/swing/scala/swing/event/CaretUpdate.scala index 7bb6638ec9..f5cd1702ab 100644 --- a/src/swing/scala/swing/event/CaretUpdate.scala +++ b/src/swing/scala/swing/event/CaretUpdate.scala @@ -1,3 +1,3 @@ package scala.swing.event -case class CaretUpdate(override val source: TextComponent) extends ComponentEvent(source) +case class CaretUpdate(override val source: TextComponent) extends ComponentEvent diff --git a/src/swing/scala/swing/event/ComponentEvent.scala b/src/swing/scala/swing/event/ComponentEvent.scala index e5bcd30633..a76207d144 100644 --- a/src/swing/scala/swing/event/ComponentEvent.scala +++ b/src/swing/scala/swing/event/ComponentEvent.scala @@ -1,8 +1,10 @@ package scala.swing.event -abstract class ComponentEvent(override val source: Component) extends UIEvent(source) +trait ComponentEvent extends UIEvent { + override val source: Component +} -case class ComponentMoved(override val source: Component) extends ComponentEvent(source) -case class ComponentResized(override val source: Component) extends ComponentEvent(source) -case class ComponentShown(override val source: Component) extends ComponentEvent(source) -case class ComponentHidden(override val source: Component) extends ComponentEvent(source) +case class ComponentMoved(override val source: Component) extends ComponentEvent +case class ComponentResized(override val source: Component) extends ComponentEvent +case class ComponentShown(override val source: Component) extends ComponentEvent +case class ComponentHidden(override val source: Component) extends ComponentEvent diff --git a/src/swing/scala/swing/event/ContainerEvent.scala b/src/swing/scala/swing/event/ContainerEvent.scala index e89e75a8e0..d15b0703cf 100644 --- a/src/swing/scala/swing/event/ContainerEvent.scala +++ b/src/swing/scala/swing/event/ContainerEvent.scala @@ -1,6 +1,6 @@ package scala.swing.event -abstract class ContainerEvent(override val source: Container) extends UIEvent(source) +abstract class ContainerEvent(override val source: Container) extends UIEvent case class ComponentAdded(override val source: Container, child: Component) extends ContainerEvent(source) case class ComponentRemoved(override val source: Container, child: Component) extends ContainerEvent(source) diff --git a/src/swing/scala/swing/event/Event.scala b/src/swing/scala/swing/event/Event.scala index 0538bdf3be..4de5930e09 100644 --- a/src/swing/scala/swing/event/Event.scala +++ b/src/swing/scala/swing/event/Event.scala @@ -1,3 +1,3 @@ package scala.swing.event -abstract class Event +trait Event diff --git a/src/swing/scala/swing/event/FocusEvent.scala b/src/swing/scala/swing/event/FocusEvent.scala index 31546f00d3..75b3bb0a5a 100644 --- a/src/swing/scala/swing/event/FocusEvent.scala +++ b/src/swing/scala/swing/event/FocusEvent.scala @@ -3,7 +3,7 @@ package scala.swing.event /** * The other component is None if it is a non Swing, i.e., AWT or native, component. */ -abstract class FocusEvent(override val source: Component, val other: Option[Component], val temporary: Boolean) extends ComponentEvent(source) +abstract class FocusEvent(override val source: Component, val other: Option[Component], val temporary: Boolean) extends ComponentEvent case class FocusGained(override val source: Component, override val other: Option[Component], override val temporary: Boolean) extends FocusEvent(source, other, temporary) diff --git a/src/swing/scala/swing/event/FontChanged.scala b/src/swing/scala/swing/event/FontChanged.scala index 357c1b361e..b2e09024d4 100644 --- a/src/swing/scala/swing/event/FontChanged.scala +++ b/src/swing/scala/swing/event/FontChanged.scala @@ -1,3 +1,3 @@ package scala.swing.event -case class FontChanged(override val source: Component) extends ComponentEvent(source) +case class FontChanged(override val source: Component) extends ComponentEvent diff --git a/src/swing/scala/swing/event/ForegroundChanged.scala b/src/swing/scala/swing/event/ForegroundChanged.scala index a486afa9a8..94a1a8a25d 100644 --- a/src/swing/scala/swing/event/ForegroundChanged.scala +++ b/src/swing/scala/swing/event/ForegroundChanged.scala @@ -1,3 +1,3 @@ package scala.swing.event -case class ForegroundChanged(override val source: Component) extends ComponentEvent(source) +case class ForegroundChanged(override val source: Component) extends ComponentEvent diff --git a/src/swing/scala/swing/event/ListEvent.scala b/src/swing/scala/swing/event/ListEvent.scala index aa1f6d9878..efae65b24d 100644 --- a/src/swing/scala/swing/event/ListEvent.scala +++ b/src/swing/scala/swing/event/ListEvent.scala @@ -1,11 +1,13 @@ package scala.swing.event -abstract class ListEvent[A](override val source: ListView[A]) extends ComponentEvent(source) +trait ListEvent[A] extends ComponentEvent { + override val source: ListView[A] +} -case class ElementSelected[A](override val source: ListView[A], range: Range, live: Boolean) - extends ListEvent(source) with LiveEvent with ListSelectionEvent +//case class ElementSelected[A](override val source: ListView[A], range: Range, live: Boolean) +// extends ListEvent[A] with LiveEvent with ListSelectionEvent -abstract class ListChange[A](override val source: ListView[A]) extends ListEvent(source) +abstract class ListChange[A](override val source: ListView[A]) extends ListEvent[A] case class ListChanged[A](override val source: ListView[A]) extends ListChange(source) case class ListElementsAdded[A](override val source: ListView[A], range: Range) diff --git a/src/swing/scala/swing/event/MouseEvent.scala b/src/swing/scala/swing/event/MouseEvent.scala index 46009697f7..a9c43eb536 100644 --- a/src/swing/scala/swing/event/MouseEvent.scala +++ b/src/swing/scala/swing/event/MouseEvent.scala @@ -2,9 +2,9 @@ package scala.swing.event import java.awt.Point -class MouseEvent(source: Component, point: Point, modifiers: Int) extends ComponentEvent(source) +class MouseEvent(val source: Component, point: Point, modifiers: Int) extends ComponentEvent -class MouseButtonEvent(source: Component, point: Point, modifiers: Int, +class MouseButtonEvent(override val source: Component, point: Point, modifiers: Int, clicks: Int, triggersPopup: Boolean) extends MouseEvent(source, point, modifiers) case class MouseClicked(override val source: Component, point: Point, modifiers: Int, diff --git a/src/swing/scala/swing/event/SelectionEvent.scala b/src/swing/scala/swing/event/SelectionEvent.scala index d9d6d6d21f..7c597934c8 100644 --- a/src/swing/scala/swing/event/SelectionEvent.scala +++ b/src/swing/scala/swing/event/SelectionEvent.scala @@ -1,9 +1,11 @@ package scala.swing.event -trait SelectionEvent extends UIEvent +trait SelectionEvent extends ComponentEvent trait ListSelectionEvent extends SelectionEvent { def range: Range } -case class SelectionChanged(override val source: Component) extends UIEvent(source) with SelectionEvent
\ No newline at end of file +case class SelectionChanged(override val source: Component) extends ComponentEvent with SelectionEvent +case class ListSelectionChanged[A](override val source: ListView[A], range: Range, live: Boolean) + extends SelectionChanged(source) with ListEvent[A]
\ No newline at end of file diff --git a/src/swing/scala/swing/event/TableEvent.scala b/src/swing/scala/swing/event/TableEvent.scala index dc9f80a794..bf39a21001 100644 --- a/src/swing/scala/swing/event/TableEvent.scala +++ b/src/swing/scala/swing/event/TableEvent.scala @@ -1,6 +1,6 @@ package scala.swing.event -abstract class TableEvent(override val source: Table) extends ComponentEvent(source) +abstract class TableEvent(override val source: Table) extends ComponentEvent abstract class TableChange(override val source: Table) extends TableEvent(source) diff --git a/src/swing/scala/swing/event/UIEvent.scala b/src/swing/scala/swing/event/UIEvent.scala index 7e003089b6..f2941e7052 100644 --- a/src/swing/scala/swing/event/UIEvent.scala +++ b/src/swing/scala/swing/event/UIEvent.scala @@ -1,3 +1,5 @@ package scala.swing.event -abstract class UIEvent(val source: UIElement) extends Event +trait UIEvent extends Event { + val source: UIElement +} diff --git a/src/swing/scala/swing/event/ValueChanged.scala b/src/swing/scala/swing/event/ValueChanged.scala index 7070ea2d52..93faa92541 100644 --- a/src/swing/scala/swing/event/ValueChanged.scala +++ b/src/swing/scala/swing/event/ValueChanged.scala @@ -1,3 +1,3 @@ package scala.swing.event -case class ValueChanged(override val source: Component, live: Boolean) extends ComponentEvent(source) with LiveEvent +case class ValueChanged(override val source: Component, live: Boolean) extends ComponentEvent with LiveEvent diff --git a/src/swing/scala/swing/event/WindowEvent.scala b/src/swing/scala/swing/event/WindowEvent.scala index 5f88c0cc75..c0caf2bee9 100644 --- a/src/swing/scala/swing/event/WindowEvent.scala +++ b/src/swing/scala/swing/event/WindowEvent.scala @@ -1,3 +1,3 @@ package scala.swing.event -abstract class WindowEvent(source: Frame) extends UIEvent(source) +abstract class WindowEvent(override val source: Frame) extends UIEvent diff --git a/src/swing/scala/swing/test/ButtonApp.scala b/src/swing/scala/swing/test/ButtonApp.scala index c6f3e5ec94..577f3984a6 100755 --- a/src/swing/scala/swing/test/ButtonApp.scala +++ b/src/swing/scala/swing/test/ButtonApp.scala @@ -1,3 +1,5 @@ +package scala.swing.test + import swing._, swing.event._ object MyApp extends SimpleGUIApplication { diff --git a/src/swing/scala/swing/test/ComboBoxes.scala b/src/swing/scala/swing/test/ComboBoxes.scala index 46441dbeef..961866a815 100644 --- a/src/swing/scala/swing/test/ComboBoxes.scala +++ b/src/swing/scala/swing/test/ComboBoxes.scala @@ -56,8 +56,8 @@ object ComboBoxes extends SimpleGUIApplication { new ImageIcon(resourceFromUserDirectory("swing/images/banana.jpg").toURL)) val iconBox = new ComboBox(icons) { - renderer = new ListView.DefaultRenderer[Icon, Label](new Label) { - def configure(list: ListView[_<:Icon], isSelected: Boolean, hasFocus: Boolean, icon: Icon, index: Int) { + renderer = new ListView.AbstractRenderer[Icon, Label](new Label) { + def configure(list: ListView[_], isSelected: Boolean, hasFocus: Boolean, icon: Icon, index: Int) { component.icon = icon component.xAlignment = Alignment.Center if(isSelected) { diff --git a/src/swing/scala/swing/test/UIDemo.scala b/src/swing/scala/swing/test/UIDemo.scala index a55913d47d..8dbec4379b 100644 --- a/src/swing/scala/swing/test/UIDemo.scala +++ b/src/swing/scala/swing/test/UIDemo.scala @@ -2,8 +2,12 @@ package scala.swing.test import swing._ import event._ +import Swing._ object UIDemo extends SimpleGUIApplication { + //new java.awt.Font("Bitstream Vera Sans", java.awt.Font.PLAIN, 16). + //javax.swing.UIManager.getLookAndFeelDefaults().put("defaultFont", new java.awt.Font("Bitstream Vera Sans", java.awt.Font.PLAIN, 16)) + def top = new MainFrame { title = "UIElement Test" @@ -32,7 +36,8 @@ object UIDemo extends SimpleGUIApplication { var reactLive = false - contents = new BoxPanel(Orientation.Vertical) { + contents = new BorderPanel { + import BorderPanel.Position._ val tabs = new TabbedPane { import TabbedPane._ val buttons = new FlowPanel { @@ -71,6 +76,9 @@ object UIDemo extends SimpleGUIApplication { 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 { contents += new Label("Enter your secret password here ") @@ -87,7 +95,18 @@ object UIDemo extends SimpleGUIApplication { pages += new Page("Password", password) } - contents += tabs + + val list = new ListView(tabs.pages) { + selection.selectIndices(0) + selection.intervalMode = ListView.IntervalMode.Single + import ListView._ + renderer = ListView.Renderer(_.title) + } + val center = new SplitPane(Orientation.Vertical, new ScrollPane(list), tabs) { + oneTouchExpandable = true + continuousLayout = true + } + layout(center) = Center object slider extends Slider { min = 0 @@ -95,14 +114,20 @@ object UIDemo extends SimpleGUIApplication { max = tabs.pages.size-1 majorTickSpacing = 1 } - contents += slider + layout(slider) = South listenTo(slider) listenTo(tabs.selection) + listenTo(list.selection) reactions += { case ValueChanged(`slider`, live) => if(!live || live == reactLive) tabs.selection.index = slider.value - case SelectionChanged(`tabs`) => slider.value = tabs.selection.index + case SelectionChanged(`tabs`) => + slider.value = tabs.selection.index + list.selection.selectIndices(tabs.selection.index) + case SelectionChanged(`list`) => + if (list.selection.items.size == 1) + tabs.selection.page = list.selection.items(0) } } } |