scala/ScalaBook/chapter-06/tabs2.scala
import javax.swing.{Icon, ImageIcon}
import swing._
import event._
import Swing._
import TabbedPane._
object tabs extends SimpleGUIApplication {
def top = new MainFrame {
title = "Tabs with Icons"
//
var picture1 = new FlowPanel {
val pic = new Label
pic.icon = new ImageIcon(resourceFromClassloader("pictures/picture1.jpg"))
contents += pic
}
var picture2 = new FlowPanel {
val pic = new Label
pic.icon = new ImageIcon(resourceFromClassloader("pictures/picture2.jpg"))
contents += pic
}
var picture3 = new FlowPanel {
val pic = new Label
pic.icon = new ImageIcon(resourceFromClassloader("pictures/picture3.jpg"))
contents += pic
}
var picture4 = new FlowPanel {
val pic = new Label
pic.icon = new ImageIcon(resourceFromClassloader("pictures/picture4.jpg"))
contents += pic
}
var picture5 = new FlowPanel {
val pic = new Label
pic.icon = new ImageIcon(resourceFromClassloader("pictures/picture5.jpg"))
contents += pic
}
contents = new GridPanel(1,1) {
val tabs = new TabbedPane
tabs.pages += new Page("Autumn", picture1)
tabs.peer.setTabComponentAt(0, (new ButtonTabComponent(tabs)).peer)
tabs.pages += new Page("River in Winter", picture2)
tabs.peer.setTabComponentAt(1, (new ButtonTabComponent(tabs)).peer)
tabs.pages += new Page("River in Summer", picture3)
tabs.peer.setTabComponentAt(2, (new ButtonTabComponent(tabs)).peer)
tabs.pages += new Page("Sea Shore", picture4)
tabs.peer.setTabComponentAt(3, (new ButtonTabComponent(tabs)).peer)
tabs.pages += new Page("Montmartre", picture5)
tabs.peer.setTabComponentAt(4, (new ButtonTabComponent(tabs)).peer)
contents += tabs
}
}
}
class ButtonTabComponent(val pane: TabbedPane)
extends FlowPanel(FlowPanel.Alignment.Left) {
opaque = false
val label = new Label {
border = EmptyBorder(0,0,0,5)
text = pane.pages.apply(pane.pages.length-1).title
}
val button = new TabButton(Action("") {
val i = pane.peer.indexOfTabComponent(
ButtonTabComponent.this.peer)
if ( i != -1 )
pane.pages.remove(i)
})
contents += label
contents += button
border = EmptyBorder(2,0,0,0)
//
class TabButton extends Button {
def this(a: Action) = {
this()
action = a
}
val mysize = 17
preferredSize = (mysize, mysize)
tooltip = "close this tab"
peer.setUI(new javax.swing.plaf.basic.BasicButtonUI())
//peer.setContentAreaFilled(false)
peer.setFocusable(false)
border = EtchedBorder
rolloverEnabled = true
override def paintComponent(g: java.awt.Graphics) {
super.paintComponent(g)
val g2 = g.asInstanceOf[java.awt.Graphics2D]
if ( peer.getModel().isPressed() )
g2.translate(1, 1)
g2.setStroke( new java.awt.BasicStroke(2) )
g2.setColor( java.awt.Color.black )
if ( peer.getModel().isRollover() )
g2.setColor( java.awt.Color.magenta )
val delta = 6
g2.drawLine(delta, delta, size.width - delta - 1, size.height - delta - 1)
g2.drawLine(size.width - delta - 1, delta, delta, size.height - delta - 1)
}
listenTo(Mouse.moves)
reactions += {
case MouseEntered(c,_,_) =>
if (c.isInstanceOf[AbstractButton]) {
val button = c.asInstanceOf[AbstractButton]
button.borderPainted = true
}
case MouseExited(c,_,_) =>
if (c.isInstanceOf[AbstractButton]) {
val button = c.asInstanceOf[AbstractButton]
button.borderPainted = false
}
}
}
listenTo(Mouse.clicks)
reactions += {
case MousePressed(c, _, _, _, _) =>
if (c.isInstanceOf[Component]) {
val i = pane.peer.indexOfTabComponent(
ButtonTabComponent.this.peer)
if ( i != -1 )
pane.selection.page = pane.pages.apply(i)
}
}
}