From a51564d27807a7f4ab8ace603b17867996722da8 Mon Sep 17 00:00:00 2001 From: Ingo Maier Date: Tue, 14 Apr 2009 09:49:08 +0000 Subject: Fix for #1442 --- src/swing/scala/swing/Component.scala | 16 ++++++++++------ src/swing/scala/swing/Publisher.scala | 20 +++++++++++++++++++- 2 files changed, 29 insertions(+), 7 deletions(-) (limited to 'src/swing') 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) } -- cgit v1.2.3