scala/ScalaBook/chapter-06/tabs.scala

import javax.swing.{Icon, ImageIcon}
import swing._
import event._
import Swing._

object tabs extends SimpleGUIApplication {
  def top = new MainFrame {
    title = "Tabs with Icons"
    
    
    import Swing._
    
    contents = new BorderPanel {
      //import BorderPanel.Position._
      val tabs = new TabbedPane {
        import TabbedPane._
        var picture1 = new FlowPanel {
          val pic = new Label
          pic.icon = new ImageIcon(resourceFromClassloader("pictures/picture1.jpg"))
          contents += pic
        }
        pages += new Page("Autumn", picture1)
//
        var picture2 = new FlowPanel {
          val pic = new Label
          pic.icon = new ImageIcon(resourceFromClassloader("pictures/picture2.jpg"))
          contents += pic
        }
        pages += new Page("River in Winter", picture2)
        
        var picture3 = new FlowPanel {
          val pic = new Label
          pic.icon = new ImageIcon(resourceFromClassloader("pictures/picture3.jpg"))
          contents += pic
        }
        
        pages += new Page("River in Summer", picture3)

        var picture4 = new FlowPanel {
          val pic = new Label
          pic.icon = new ImageIcon(resourceFromClassloader("pictures/picture4.jpg"))
          contents += pic
        }
        
        pages += new Page("Sea Shore", picture4)
  
       var picture5 = new FlowPanel {
          val pic = new Label
          pic.icon = new ImageIcon(resourceFromClassloader("pictures/picture5.jpg"))
          contents += pic
        }
        
        pages += new Page("Montmartre", picture5)


      }
            
      val list = new ListView(tabs.pages) {
        selection.selectIndices(0)
        selection.intervalMode = ListView.IntervalMode.Single
        import ListView._
        renderer = ListView.Renderer(_.title)
      }
      val center = new SplitPane(Orientation.Vertical, 
                                   new ScrollPane(list), tabs) {
        oneTouchExpandable = true
        continuousLayout = true
        dividerSize = 15
      }      
      layout(center) = BorderPanel.Position.Center 
            
      val slider = new MSlider {
        min              = 0
        value            = tabs.selection.index
        max              = tabs.pages.size-1
        majorTickSpacing = 1
        labels           = Map(0 -> new Label("Aut."),
                               1 -> new Label("Winter"),
                               2 -> new Label("Summer"),
                               3 -> new Label("Sea Shr."),
                               4 -> new Label("Mon/re"))
        paintLabels = true
        paintTicks  = true
      }
      layout(slider) = BorderPanel.Position.South
      
      listenTo(slider,tabs.selection,list.selection)
      reactions += {
        case ValueChanged(`slider`) => 
          if ( !slider.adjusting ) 
            tabs.selection.index = slider.value
        case SelectionChanged(`tabs`) => 
          slider.value = tabs.selection.index
          list.selection.selectIndices(tabs.selection.index)
        case SelectionChanged(`list`) =>
          if (list.selection.items.size == 1)
            tabs.selection.page = list.selection.items(0)
      }
    }
  }
}

class MSlider extends Component with Orientable with Publisher {
  override lazy val peer: javax.swing.JSlider = new javax.swing.JSlider
  
  def min: Int = peer.getMinimum
  def min_=(v: Int) { peer.setMinimum(v) }
  def max: Int = peer.getMaximum
  def max_=(v: Int) { peer.setMaximum(v) }
  def value: Int = peer.getValue
  def value_=(v: Int) { peer.setValue(v) }
  def extent: Int = peer.getExtent
  def extent_=(v: Int) { peer.setExtent(v) }
  
  def paintLabels: Boolean = peer.getPaintLabels
  def paintLabels_=(v: Boolean) { peer.setPaintLabels(v) }
  def paintTicks: Boolean = peer.getPaintTicks
  def paintTicks_=(v: Boolean) { peer.setPaintTicks(v) }
  def paintTrack: Boolean = peer.getPaintTrack
  def paintTrack_=(v: Boolean) { peer.setPaintTrack(v) }
  
  def snapToTicks: Boolean = peer.getSnapToTicks
  def snapToTicks_=(v: Boolean) { peer.setSnapToTicks(v) }
  
  def minorTickSpacing: Int = peer.getMinorTickSpacing
  def minorTickSpacing_=(v: Int) { peer.setMinorTickSpacing(v) }
  def majorTickSpacing: Int = peer.getMajorTickSpacing
  def majorTickSpacing_=(v: Int) { peer.setMajorTickSpacing(v) }
  
  def adjusting = peer.getValueIsAdjusting
  
  def labels: scala.collection.Map[Int, Label] = 
    new scala.collection.jcl.MapWrapper[Int, Label] { 
      def underlying = peer.getLabelTable.asInstanceOf[java.util.Hashtable[Int, Label]] 
    }
  def labels_=(l: scala.collection.Map[Int, Label]) {
    val table = new java.util.Hashtable[Any, Any]
    for ((k,v) <- l) table.put(k, v.peer)
    peer.setLabelTable(table)
  }
  
  peer.addChangeListener(new javax.swing.event.ChangeListener {
    def stateChanged(e: javax.swing.event.ChangeEvent) { 
      publish(ValueChanged(MSlider.this)) 
    }
  })
}