Clint, All,

I found your code in a previous mailing and I corrected some TextListeners (where CharacterListeners guess this changed with 2.0).
Attached is the working version of your Scala code.

Best regards,
Bojan
package org.myproject.pivot

import org.apache.pivot.wtk.ComponentMouseListener
import org.apache.pivot.wtk.ListView.SelectMode
import org.apache.pivot.wtk.Orientation
import org.apache.pivot.wtk.Orientation._
import org.apache.pivot.wtk.Label
import org.apache.pivot.wtk.Window
import org.apache.pivot.wtk.Span
import org.apache.pivot.wtk.ListViewSelectionListener
import org.apache.pivot.wtk.ListView
import org.apache.pivot.wtk.TextInputContentListener
import org.apache.pivot.wtk.TextInput
import org.apache.pivot.wtk.Container
import org.apache.pivot.wtk.DesktopApplicationContext
import org.apache.pivot.wtk.Display
import org.apache.pivot.wtk.Application
import org.apache.pivot.wtk.Button
import org.apache.pivot.wtk.PushButton
import org.apache.pivot.wtk.BoxPane
import org.apache.pivot.wtk.ComponentMouseButtonListener
import org.apache.pivot.wtk.Component
import org.apache.pivot.wtk.Mouse
import org.apache.pivot.collections.{ Sequence => PSeq }

/**
 * 
 * @author Clint Gilbert
 * 
 * Dec 10, 2010
 *
 * This is in the public domain.  There's no warranty.  I hope someone finds this useful. 
 * If you do use this code, I ask that you please keep my name somewhere in this header.
 */
object ScalaPivot {

    def main(args: Array[String]) = DesktopApplicationContext.main(classOf[Main], args)
    
    final class Main extends ApplicationAdapter {
        override def startup(display: Display, properties: org.apache.pivot.collections.Map[String, String]): Unit = {
            val window = new Window

            import Implicits._

            val text = label("Here's a label!") 
            
            text onMouseOver {
                println("You moused over the label")
            } 
            
            text onMouseOut {
                println("You moused out of the label")
            }
            
            val pane = horizontal(
                text,
                button("Here's a button") {
                    println("You pushed the button!")
                });

            val list = listView("A value", "Another value", "Yet another value") { (index: Int, value: String) =>
                println("You selected '" + value + "' (position " + index + ")")
            }

            val input = textInput { self: TextInput =>
                println("So far, you typed '" + self.getText + "'")
            }

            window.setContent(vertical(pane, horizontal(list), horizontal(input)))

            window.open(display)
        }
    }

    //For convenience
    trait ApplicationAdapter extends Application {
        override def startup(display: Display, properties: org.apache.pivot.collections.Map[String, String]) { }
    
        override def shutdown(optional: Boolean) = false

        override def suspend { } 

        override def resume { }
    }
    
    object Implicits {
        implicit def component2HasMouseHelpers[C <: Component](component: C): HasMouseHelpers[C] = new HasMouseHelpers(component)

        implicit def container2HasContainerHelpers[C <: Container](container: C): HasContainerHelpers[C] = new HasContainerHelpers(container)

        implicit def textInput2HasTextInputHelpers[T <: TextInput](textInput: T): HasTextInputHelpers[T] = new HasTextInputHelpers(textInput)

        implicit def listView2HasListViewHelpers[L <: ListView](listView: L): HasListViewHelpers[L] = new HasListViewHelpers(listView)

        implicit def traversable2PivotList[T](seq: Traversable[T]): org.apache.pivot.collections.List[T] = {
            val result: org.apache.pivot.collections.List[T] = new org.apache.pivot.collections.ArrayList[T]

            seq.foreach(result.add)

            result
        }
    }

    final class HasMouseHelpers[C <: Component](component: C) {
        def onClick(action: (Mouse.Button, Int, Int, Int) => Boolean): C = {
            component.getComponentMouseButtonListeners.add(new ComponentMouseButtonListener.Adapter {
                override def mouseClick(component: Component, button: Mouse.Button, x: Int, y: Int, count: Int) = action(button, x, y, count)
            })

            component
        }

        def onClick(action: => Any): C = {
            component.getComponentMouseButtonListeners.add(new ComponentMouseButtonListener.Adapter {
                override def mouseClick(component: Component, button: Mouse.Button, x: Int, y: Int, count: Int) = { action; true }
            })

            component
        }

        def onDoubleClick(action: (Mouse.Button, Int, Int) => Boolean): C = {
            component.getComponentMouseButtonListeners.add(new ComponentMouseButtonListener.Adapter {
                override def mouseClick(component: Component, button: Mouse.Button, x: Int, y: Int, count: Int) = {
                    if (count == 2) action(button, x, y) else false
                }
            })

            component
        }

        def onDoubleClick(action: => Any): C = {
            component.getComponentMouseButtonListeners.add(new ComponentMouseButtonListener.Adapter {
                override def mouseClick(component: Component, button: Mouse.Button, x: Int, y: Int, count: Int) = {
                    if (count == 2) { action; true } else false
                }
            })

            component
        }

        def onMouseDown(action: (Mouse.Button, Int, Int) => Boolean): C = {
            component.getComponentMouseButtonListeners.add(new ComponentMouseButtonListener.Adapter {
                override def mouseDown(component: Component, button: Mouse.Button, x: Int, y: Int) = action(button, x, y)
            })

            component
        }

        def onMouseDown(action: => Any): C = {
            component.getComponentMouseButtonListeners.add(new ComponentMouseButtonListener.Adapter {
                override def mouseDown(component: Component, button: Mouse.Button, x: Int, y: Int) = { action; true }
            })

            component
        }

        def onMouseUp(action: (Mouse.Button, Int, Int) => Boolean): C = {
            component.getComponentMouseButtonListeners.add(new ComponentMouseButtonListener.Adapter {
                override def mouseUp(component: Component, button: Mouse.Button, x: Int, y: Int) = action(button, x, y)
            })

            component
        }

        def onMouseUp(action: => Any): C = {
            component.getComponentMouseButtonListeners.add(new ComponentMouseButtonListener.Adapter {
                override def mouseUp(component: Component, button: Mouse.Button, x: Int, y: Int) = { action; true }
            })

            component
        }
        
        def onMouseOver(action: => Any): C = {
            component.getComponentMouseListeners.add(new ComponentMouseListener.Adapter {
                override def mouseOver(component: Component): Unit = action
            })
            
            component
        }
        
        def onMouseOut(action: => Any): C = {
            component.getComponentMouseListeners.add(new ComponentMouseListener.Adapter {
                override def mouseOut(component: Component): Unit = action
            })
            
            component
        }
    }

    final class HasContainerHelpers[C <: Container](container: C) {

        def addAll[T <: Component](toBeAdded: Traversable[T]): C = addAll(container, toBeAdded)

        private def addAll[T <: Component](container: C, toBeAdded: Traversable[T]): C = {
            toBeAdded.foreach(container.add)

            container
        }

        private def add[T <: Component](container: C, toBeAdded: T): C = {
            container.add(toBeAdded)

            container
        }

        def ++=[T <: Component](toBeAdded: Traversable[T]): C = addAll(toBeAdded)

        def ++=[T <: Component](toBeAdded: T*): C = addAll(toBeAdded)

        def +=[T <: Component](toBeAdded: T): C = add(container, toBeAdded)
    }

    final class HasTextInputHelpers[T <: TextInput](textInput: T) {
        def onTyping(action: => Any): T = {
            textInput.getTextInputContentListeners.add(new TextInputContentListener.Adapter {
                override def textInserted(textInput: TextInput, index: Int, count: Int): Unit = action
                override def textRemoved(textInput: TextInput, index: Int, count: Int): Unit = action
            })

            textInput
        }

        def onTyping(action: TextInput => Any): T = {
            textInput.getTextInputContentListeners.add(new TextInputContentListener.Adapter {
                override def textInserted(textInput: TextInput, index: Int, count: Int): Unit = action(textInput)
                override def textRemoved(textInput: TextInput, index: Int, count: Int): Unit = action(textInput)
            })

            textInput
        }
    }

    final class HasListViewHelpers[L <: ListView](listView: L) {
        def onSelect(action: Int => Any): L = {
            listView.getListViewSelectionListeners.add(new ListViewSelectionListener.Adapter {
                override def selectedRangesChanged(listView: ListView, previousSelectedRanges: PSeq[Span]): Unit = action(listView.getSelectedIndex)
            })
            
            listView
        }

        /**
         * Not type-safe, unfortunately, as a Pivot ListView's model is a list of Objects
         */
        def onSelect[T](action: (Int, T) => Any): L = {
            listView.getListViewSelectionListeners.add(new ListViewSelectionListener.Adapter {
                override def selectedRangesChanged(listView: ListView, previousSelectedRanges: PSeq[Span]): Unit = action(listView.getSelectedIndex, listView.getSelectedItem.asInstanceOf[T])
            })
            
            listView
        }
    }

    import Implicits._

    def horizontal(components: Component*) = makePane(HORIZONTAL) ++= components

    def vertical(components: Component*) = makePane(VERTICAL) ++= components

    private def makePane(orientation: Orientation) = new BoxPane(orientation)

    def label(text: String): Label = new Label(text)

    def button(text: String)(action: => Any): Button = (new PushButton(text)) onClick action

    def textInput(action: => Any): TextInput = (new TextInput) onTyping action
    def textInput(action: TextInput => Any): TextInput = (new TextInput) onTyping action

    def makeListView[T](data: Seq[T]): ListView = {
        val result = new ListView(data)

        result.setSelectMode(SelectMode.SINGLE)

        result
    }

    def listView[T](data: T*)(action: (Int, T) => Any): ListView = makeListView(data) onSelect action
}

Reply via email to