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