summaryrefslogtreecommitdiff
path: root/src/swing
diff options
context:
space:
mode:
authorIngo Maier <ingo.maier@epfl.ch>2009-04-14 09:49:08 +0000
committerIngo Maier <ingo.maier@epfl.ch>2009-04-14 09:49:08 +0000
commita51564d27807a7f4ab8ace603b17867996722da8 (patch)
tree0dbb3fcaec99a71301fa3bf83642b0e2f0919bbe /src/swing
parent21376b3811ff882c4f2f68913a654a7eda66f023 (diff)
downloadscala-a51564d27807a7f4ab8ace603b17867996722da8.tar.gz
scala-a51564d27807a7f4ab8ace603b17867996722da8.tar.bz2
scala-a51564d27807a7f4ab8ace603b17867996722da8.zip
Fix for #1442
Diffstat (limited to 'src/swing')
-rw-r--r--src/swing/scala/swing/Component.scala16
-rw-r--r--src/swing/scala/swing/Publisher.scala20
2 files changed, 29 insertions, 7 deletions
diff --git a/src/swing/scala/swing/Component.scala b/src/swing/scala/swing/Component.scala
index 36600e9e19..4ca5149f87 100644
--- a/src/swing/scala/swing/Component.scala
+++ b/src/swing/scala/swing/Component.scala
@@ -189,12 +189,16 @@ abstract class Component extends UIElement with Publisher {
/**
* Publishes mouse wheel moves.
*/
- val wheel: Publisher = new Publisher {
- peer.addMouseWheelListener(new MouseWheelListener {
- def mouseWheelMoved(e: java.awt.event.MouseWheelEvent) {
- publish(MouseWheelMoved(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]),
- e.getPoint, e.getModifiersEx, e.getWheelRotation)(e.getWhen)) }
- })
+ val wheel: Publisher = new LazyPublisher {
+ // We need to subscribe lazily and unsubscribe, since components in scroll panes capture
+ // mouse wheel events if there is a listener installed. See ticket #1442.
+ lazy val l = new MouseWheelListener {
+ def mouseWheelMoved(e: java.awt.event.MouseWheelEvent) {
+ publish(MouseWheelMoved(Component.wrapperFor(e.getSource.asInstanceOf[JComponent]),
+ e.getPoint, e.getModifiersEx, e.getWheelRotation)(e.getWhen)) }
+ }
+ def onFirstSubscribe() = peer.addMouseWheelListener(l)
+ def onLastUnsubscribe() = peer.removeMouseWheelListener(l)
}
}
diff --git a/src/swing/scala/swing/Publisher.scala b/src/swing/scala/swing/Publisher.scala
index 67728705a0..1db4ecaced 100644
--- a/src/swing/scala/swing/Publisher.scala
+++ b/src/swing/scala/swing/Publisher.scala
@@ -38,6 +38,24 @@ trait Publisher extends Reactor {
listenTo(this)
}
+private[swing] trait LazyPublisher extends Publisher {
+ import Reactions._
+
+ def onFirstSubscribe()
+ def onLastUnsubscribe()
+
+ override def subscribe(listener: Reaction) {
+ if(listeners.size == 1) onFirstSubscribe()
+ super.subscribe(listener)
+ }
+ override def unsubscribe(listener: Reaction) {
+ super.unsubscribe(listener)
+ if(listeners.size == 1) onLastUnsubscribe()
+ }
+}
+
+
+
import scala.ref._
private[swing] trait SingleRefCollection[+A <: AnyRef] extends Collection[A] { self =>
@@ -102,7 +120,7 @@ private[swing] class StrongReference[+T <: AnyRef](value: T) extends Reference[T
def isEnqueued(): Boolean = false
}
- abstract class RefBuffer[A <: AnyRef] extends Buffer[A] with SingleRefCollection[A] { self =>
+abstract class RefBuffer[A <: AnyRef] extends Buffer[A] with SingleRefCollection[A] { self =>
protected val underlying: Buffer[Reference[A]]
def +=(el: A) { purgeReferences(); underlying += Ref(el) }