Skip to content

Instantly share code, notes, and snippets.

@nil2013
Created April 11, 2016 16:58
Show Gist options
  • Save nil2013/662fbcc01f8dd3fddd7ac00481733d9d to your computer and use it in GitHub Desktop.
Save nil2013/662fbcc01f8dd3fddd7ac00481733d9d to your computer and use it in GitHub Desktop.
How to use Clipboard in Scala
import java.awt.datatransfer.FlavorListener
import java.awt.datatransfer.FlavorEvent
import java.awt.Toolkit
import java.awt.datatransfer.DataFlavor
import scala.annotation.tailrec
object ClipboardTest {
private var listener: Option[StrFlavorListener] = None
def clipboard = Toolkit.getDefaultToolkit.getSystemClipboard
def startTest {
listener match {
case Some(_) =>
case None =>
val l = new StrFlavorListener
listener = Option(l)
clipboard.addFlavorListener(l)
println(DataFlavor.imageFlavor.getRepresentationClass)
}
}
def showListenerList {
clipboard.getFlavorListeners foreach println
}
def stopTest {
listener match {
case Some(l) => clipboard.removeFlavorListener(l)
case None =>
}
}
class StrFlavorListener extends FlavorListener {
override def flavorsChanged(e: FlavorEvent) {
println(e.toString)
println(e.getSource)
}
}
class ClipboardWatcher(flavor: DataFlavor) {
private var watching = false
def getData = flavor.getRepresentationClass.cast(clipboard.getData(flavor))
def start(whenChanged: Any => Unit) {
var data = Option(getData)
@tailrec def loop {
(data, Option(getData)) match {
case (Some(d1), d @ Some(d2)) if d1 != d2 =>
whenChanged(d2)
data = d
case (None, d @ Some(d1)) =>
whenChanged(d1)
data = d
case _ =>
}
Thread.sleep(100)
if (watching) { loop }
}
watching = true
loop
watching = false
}
def stop { watching = false }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment