All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scalaswingcontrib.RenderableCellsCompanion.scala Maven / Gradle / Ivy

The newest version!
package scalaswingcontrib

import scala.swing.{Label, Component, Publisher}
import javax.{swing => js}
import scala.language.higherKinds

/**
* Describes the structure of a component's companion object where pluggable cell renderers must be supported.
* @author Ken Scambler
*/
trait RenderableCellsCompanion {
  type Renderer[-A] <: CellRenderer[A]
  protected type Owner <: Component with CellView[_]
  
  val Renderer: CellRendererCompanion
  
  /**
  * A generic renderer that uses Swing's built-in renderers. If there is no 
  * specific renderer for a type, this renderer falls back to a renderer 
  * that renders the string returned from an item's toString.
  */
  implicit val GenericRenderer: Renderer[Any] = Renderer.default

  /**
  * A default renderer implementation based on a Label.  
  */
  type DefaultRenderer[-A] <: Label with Renderer[A]
  
  
  trait CellRendererCompanion {
    type Peer // eg. javax.swing.table.TableCellRenderer, javax.swing.tree.TreeCellRenderer
    type CellInfo
    
    val emptyCellInfo: CellInfo
    def wrap[A](r: Peer): Renderer[A]
    def apply[A, B: Renderer](f: A => B): Renderer[A]

    def default[A]: DefaultRenderer[A]
    
    /**
    * Convenient default display of a cell node, which provides an Icon and label text for each item.
    */
    def labeled[A](f: A => (js.Icon, String)): DefaultRenderer[A]
    
    protected trait LabelRenderer[-A] extends CellRenderer[A] {
      this: DefaultRenderer[A] =>
      val convert: A => (js.Icon, String)
      
      override abstract def componentFor(owner: Owner, a: A, info: companion.CellInfo): Component = {
        val c = super.componentFor(owner, a, info)
        val (labelIcon, labelText) = convert(a)
        icon = labelIcon
        text = labelText
        c
      }
    }
  }

  trait CellRenderer[-A] extends Publisher  {
    val companion: CellRendererCompanion
    def peer: companion.Peer
    def componentFor(owner: Owner, value: A, cellInfo: companion.CellInfo): Component
  }
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy