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))
}
})
}