# gui/implementation/Notebook.tcl

    @implementation Notebook {
      - init {} {
          $super init
          $path configure -width 100 -height 100 -bd 2
          set counter 1
          label $path.test -text foo -bd 1 -relief raised -padx 3m -pady 1m
          set height [expr [winfo reqheight $path.test] -1]
          destroy $path.test

          set main [frame $path.main -height [expr $height +10] \
            -width 10 -relief raised -bd 1]
          set bar [frame $path.bar -height [expr $height + 4] -bd 0]
          set shadow [frame $path.shadow -height 2 -bd 0]

          place $bar -relx 0.0 -rely 0.0 -relwidth 1 -anchor nw
          pack propagate $bar 0
          place $main -x 0 -relwidth 1 -y $height \
            -relheight 1 -height -$height -anchor nw
          raise $main
        }

      - views: aList {
          foreach view $aList { $self add: $view }
          $self selection: [lindex $aList 0]
        }

      - views {} {
          return $views
        }

      - add: aView {
          if [$self contains: $aView] { return }
          pack [label $bar.$counter -text $aView -highlightthickness 0 \
            -relief raised -bd 1 -padx 3m -pady 1m] \
            -anchor s -side left -padx 1
          bind $bar.$counter <ButtonPress-1> "$self selection: \"$aView\""
          set f [frame $main.$counter -bd 10]
          incr counter
          lappend views $aView
          $self selection: $aView
          return $f
        }

      - remove: aView {
          if {![$self contains: $aView]} { return }
          views remove: $aView
          set index [$self indexOf: $aView]
          catch {destroy $bar.$index $main.$index}
          if {"$selection" == "$aView"} {
            $self selection: [lindex $views end]
          }
        }

      - selection: aView {
          if {![$self contains: $aView]} { return }
          set index [$self indexOf: $aView]
          if [string length [set old [pack slaves $main]]] {
            set i [lindex [split $old .] end]
            $bar.$i configure -padx 3m
            pack configure $bar.$i -anchor s -padx 1
            pack forget $old
          }
          $bar.$index configure -padx 4m
          pack configure $bar.$index -anchor n -padx 0
          pack $main.$index -padx 1 -pady 1 -fill both -expand 1
          place $shadow -in $bar.$index -relwidth 1 \
            -relx 0.0 -rely 1.0 -bordermode inside
          place $shadow -y 0
          raise $main
          raise $main.$index
          update ; raise $shadow
          set selection $aView
        }

      - selection {} {
          return $selection
        }

      - contains: aView {
          if [views contains: $aView] {
            return 1
          } else {
            return 0
          }
        }

      - frameOf: aView {
          if [$self contains: $aView] {
            return $main.[$self indexOf: $aView]
          } else {
            return [error "$self doesn't contain \"$aView\""]
          }
        }
      - indexOf: aView {
          foreach view [pack slaves $bar] {
            if {"[$view cget -text]" == "$aView"} {
              return [lindex [split $view .] end]
            }
          }
          return
        }

      - dealloc {} {
          catch {destroy $main $bar $shadow}
          return [$super dealloc]
        }
    }