--- tkchat.tcl	Tue Mar 16 10:23:41 2004
+++ tkchat-tile.tcl	Tue Mar 16 10:36:02 2004
@@ -36,6 +36,26 @@
     }
 }
 
+if {[catch {package require tile}]} {
+    foreach cmd {button checkbutton radiobutton scrollbar \
+                     frame labelframe label scale menubutton} {
+        interp alias {} t$cmd {} $cmd
+    }
+} else {
+    # Try finding the demo pixmap themes...
+    foreach lib [info loaded] {
+        foreach {path pkg} $lib {}
+        if {$pkg == "Tile"} {
+            set path [file join [file dirname $path] demos]
+            if {[file exists $path]} {
+                set ::auto_path [concat $path $::auto_path]
+                [package unknown] Tcl [package provide Tcl]
+            }
+            break
+        }
+    }
+}
+
 # Under windows, we can use DDE to open urls
 if {$tcl_platform(platform) == "windows"} {
     package require dde
@@ -44,7 +64,7 @@
 package forget app-tkchat	;# Workaround until I can convince people
 				;# that apps are not packages.  :)  DGP
 package provide app-tkchat \
-    [regexp -inline {\d+(?:\.\d+)?} {$Revision: 1.151 $}]
+    [regexp -inline {\d+(?:\.\d+)?} {$Revision: 1.150 $}]
 
 # Maybe exec a user defined preload script at startup (to set Tk options,
 # for example.
@@ -69,7 +89,7 @@
     variable HOST http://mini.net
 
     variable HEADUrl {http://cvs.sourceforge.net/viewcvs.py/tcllib/tclapps/apps/tkchat/tkchat.tcl?rev=HEAD}
-    variable rcsid   {$Id: tkchat.tcl,v 1.151 2004/03/16 10:23:41 patthoyts Exp $}
+    variable rcsid   {$Id: tkchat.tcl,v 1.150 2004/03/16 09:30:10 patthoyts Exp $}
 
     variable MSGS
     set MSGS(entered) [list \
@@ -350,15 +370,15 @@
 	    set i 0
 	    variable HistQueryNum [llength $loglist]
 	    foreach l $loglist {
-		grid [radiobutton $t.rb$i -text "$l ($logsize($l))" \
+		grid [tradiobutton $t.rb$i -text "$l ($logsize($l))" \
 			-val $i -var ::tkchat::HistQueryNum] \
 			-sticky w -padx 15 -pady 0
 		incr i
 	    }
-	    grid [radiobutton $t.rb$i -text "None" \
+	    grid [tradiobutton $t.rb$i -text "None" \
 		    -val $i -var ::tkchat::HistQueryNum] \
 		    -sticky w -padx 15 -pady 0
-	    grid [button $t.ok -text Ok -width 8 -command [list destroy $t] \
+	    grid [tbutton $t.ok -text Ok -width 8 -command [list destroy $t] \
 		    -default active] \
 		    -sticky e -padx 5 -pady 10
 	    grid columnconfigure $t 0 -weight 1
@@ -589,7 +609,7 @@
 		wm transient .pause .
 		pack [label .pause.m -text \
                             "The session is paused,\nno updates will occur."]
-		button .pause.r -text "Resume" \
+		tbutton .pause.r -text "Resume" \
                       -command { ::tkchat::pause off ; wm withdraw .pause }
 		pack .pause.r -padx 5 -pady 10
 		bind .pause <Destroy> [list ::tkchat::pause off]
@@ -1709,7 +1729,7 @@
     }
     $t.txt insert end "\n"
     $t.txt config -state disabled
-    button $t.close -text Close -command [list destroy $t]
+    tbutton $t.close -text Close -command [list destroy $t]
     focus $t.close
     pack $t.close -side right
 }
@@ -1933,6 +1953,54 @@
     
 }
 
+# -------------------------------------------------------------------------
+# Theme support (using the tile package)
+
+proc ::tkchat::CreateThemeMenu {parent} {
+    global Options
+    if {![info exists ::THEMELIST]} { GetThemes }
+    foreach {theme name} $::THEMELIST {
+        $parent add radiobutton -label $name \
+            -variable ::Options(Theme) \
+            -value $theme -command [list ::tkchat::SetTheme $theme]
+    }
+}
+
+proc ::tkchat::GetThemes {} {
+    global THEMELIST
+    set THEMELIST {
+        {}       "Classic"
+        alt      "Revitalized"
+        step     "OpenStep"
+        winnative "Windows native"
+        xpnative "XP Native"
+    }
+    array set THEMES $THEMELIST
+
+    # Add in any available loadable themes.
+    foreach pkg [package names] {
+        if {![string match tile::theme::* $pkg]} { continue }
+        set name [lindex [split $pkg :] end]
+        if {![info exists THEMES($name)]} {
+            lappend THEMELIST $name \
+                [set THEMES($name) [string totitle $name]]
+        }
+    }
+}
+
+# Set theme, but permit delayed loading of the pixmap themes.
+proc ::tkchat::SetTheme {theme} {
+    global Options
+    if {[lsearch -exact [package names] tile::theme::$theme] >= 0} {
+	package require tile::theme::$theme
+    }
+    if {![catch {style theme use $theme} msg]} {
+        set ::Options(Theme) $theme
+    }
+}
+
+# -------------------------------------------------------------------------
+
 proc ::tkchat::CreateGUI {} {
     global Options
 
@@ -2004,6 +2072,13 @@
     $m add command -label "Options ..." -underline 0 \
             -command ::tkchat::EditOptions
     
+    if {[package provide tile] != {}} {
+        $m add separator
+        $m add cascade -label "Theme" \
+            -menu [menu $m.theme -tearoff 0] -underline 0
+        CreateThemeMenu $m.theme
+    }
+    
     $m add separator
 
     $m add cascade -label "Refresh Frequency" \
@@ -2197,7 +2272,7 @@
     if {[info command ::panedwindow] != {} && $Options(UsePane)} {
         set UsePane 1
         panedwindow .pane -sashpad 4 -sashrelief ridge
-        frame .txtframe
+        tframe .txtframe
     } else {
         set UsePane 0
     }
@@ -2207,7 +2282,7 @@
           -font FNT -relief sunken -bd 2 -wrap word \
           -yscroll "::tkchat::scroll_set .sbar" \
           -state disabled -cursor left_ptr -height 1
-    scrollbar .sbar -command ".txt yview"
+    tscrollbar .sbar -command ".txt yview"
     # user display
     text .names -background "#[getColor MainBG]" \
           -foreground "#[getColor MainFG]" \
@@ -2215,8 +2290,8 @@
           -cursor left_ptr -height 1 -wrap word
     
     # bottom frame for entry
-    frame .btm
-    button .ml -text ">>" -command ::tkchat::showExtra 
+    tframe .btm
+    tbutton .ml -text ">>" -command ::tkchat::showExtra 
     entry .eMsg
     bind .eMsg <Return>   ::tkchat::userPost
     bind .eMsg <KP_Enter> ::tkchat::userPost
@@ -2225,9 +2300,9 @@
     bind .eMsg <Key-Tab>  {::tkchat::nickComplete ; break}
     text .tMsg -height 6 -font FNT
     bind .tMsg <Key-Tab> {::tkchat::nickComplete ; break}
-    button .post -text "Post" -command ::tkchat::userPost
+    tbutton .post -text "Post" -command ::tkchat::userPost
     #button .refresh -text "Refresh" -command {pause off}
-    menubutton .mb -indicator on -pady 4 \
+    tmenubutton .mb -indicator on -pady 4 \
           -menu .mb.mnu -textvar Options(MsgTo)
     menu .mb.mnu -tearoff 0
     .mb.mnu add command -label "All Users" \
@@ -2375,7 +2450,7 @@
     
     set parent [winfo parent $w]
     for {set n 0} {[winfo exists $parent.f$n]} {incr n} {}
-    set f [frame $parent.f$n]
+    set f [tframe $parent.f$n]
     set vs [$sbcmd $f.vs -orient vertical -command [list $w yview]]
     $w configure -yscrollcommand [list $vs set]
     raise $w $f
@@ -2401,7 +2476,7 @@
     wm withdraw $w
     wm transient $w .
     wm title $w "About TkChat $rcsVersion"
-    button $w.b -text Dismiss -command [list wm withdraw $w]
+    tbutton $w.b -text Dismiss -command [list wm withdraw $w]
     text $w.text -height 30 -bd 1 -width 100
     pack $w.b -fill x -side bottom
     pack $w.text -fill both -side left -expand 1
@@ -2409,7 +2484,7 @@
     $w.text tag config title -justify center -font {Courier -18 bold}
     $w.text tag config h1 -justify left -font {Sans -12 bold}
     $w.text insert 1.0 "About TkChat v$rcsVersion" title \
-          "\n\nCopyright (C) 2001 Bruce B Hartweg <brhartweg@bigfoot.com>" \
+          "\n\nCopyright \u00a9 2001 Bruce B Hartweg <brhartweg@bigfoot.com>" \
           center "\n$rcsid\n\n" center
 
     $w.text insert end "Commands\n" h1 \
@@ -2956,26 +3031,26 @@
 	wm withdraw .logon
 	wm transient .logon .
 	wm title .logon "Logon to the Tcl'ers Chat"
-	checkbutton .logon.prx -text "Use Proxy" -var Options(UseProxy) \
+	tcheckbutton .logon.prx -text "Use Proxy" -var Options(UseProxy) \
             -underline 7
-	label .logon.lph -text "Proxy Host" -underline 6
-	label .logon.lpp -text "Proxy Port" -underline 6
+	tlabel .logon.lph -text "Proxy Host" -underline 6
+	tlabel .logon.lpp -text "Proxy Port" -underline 6
 	entry .logon.eph -textvar Options(ProxyHost)
 	entry .logon.epp -textvar Options(ProxyPort)
-	label .logon.lpan -text "Proxy Auth Username" -underline 11
-	label .logon.lpap -text "Proxy Auth Password" -underline 13
+	tlabel .logon.lpan -text "Proxy Auth Username" -underline 11
+	tlabel .logon.lpap -text "Proxy Auth Password" -underline 13
 	entry .logon.epan -textvar Options(ProxyUsername)
 	entry .logon.epap -textvar Options(ProxyPassword) -show {*}
-	label .logon.lnm -text "Chat Username" -underline 9
-	label .logon.lpw -text "Chat Password" -underline 6
+	tlabel .logon.lnm -text "Chat Username" -underline 9
+	tlabel .logon.lpw -text "Chat Password" -underline 6
 	entry .logon.enm -textvar Options(Username)
 	entry .logon.epw -textvar Options(Password) -show *
-	checkbutton .logon.rpw -text "Remember Chat Password" \
+	tcheckbutton .logon.rpw -text "Remember Chat Password" \
               -var Options(SavePW) -underline 0
-	checkbutton .logon.atc -text "Auto-connect" -var Options(AutoConnect) \
+	tcheckbutton .logon.atc -text "Auto-connect" -var Options(AutoConnect) \
             -underline 5
-	button .logon.ok -text "Logon" -command "set LOGON 1" -width 8 -underline 0
-	button .logon.cn -text "Quit" -width 8 -underline 0 \
+	tbutton .logon.ok -text "Logon" -command "set LOGON 1" -width 8 -underline 0
+	tbutton .logon.cn -text "Quit" -width 8 -underline 0 \
             -command [namespace origin quit]
 
         bind .logon <Alt-x> {.logon.prx invoke}
@@ -3025,6 +3100,17 @@
     logonChat
 }
 
+proc ::tkchat::SetState {w state} {
+    set tilewidgets [list TScrollbar TLabel TFrame TLabelFrame TButton \
+                         TCheckbutton TRadiobutton TScale]
+    if {[lsearch -exact $tilewidgets [winfo class $w]] != -1} {
+        if {$state == "normal"} { set state !disabled }
+        $w state $state
+    } else {
+        $w configure -state $state
+    }
+}
+
 proc ::tkchat::optSet {args} {
     global Options
     if {$Options(UseProxy)} {
@@ -3033,12 +3119,12 @@
 	set s disabled
     }
     foreach w {lph lpp eph epp lpan epan lpap epap} {
-	.logon.$w config -state $s
+	SetState .logon.$w $s ;#.logon.$w config -state $s
     }
     if {$Options(SavePW)} {
-	.logon.atc config -state normal
+	SetState .logon.atc normal ;#.logon.atc config -state normal
     } else {
-	.logon.atc config -state disabled
+	SetState .logon.atc disabled ;#.logon.atc config -state disabled
 	set Options(AutoConnect) 0
     }
 }
@@ -3147,23 +3233,23 @@
 	incr buildRow_seq
     }
     set seq $buildRow_seq
-    label $f.nm$seq -text "$disp" -anchor w -font NAME -padx 0 -pady 0
-    radiobutton $f.def$seq -text "default" \
+    tlabel $f.nm$seq -text "$disp" -anchor w -font NAME -padx 0 -pady 0
+    tradiobutton $f.def$seq -text "default" \
           -var DlgData(Color,$idx,Which) \
           -val Web -fg "#$DlgData(Color,$idx,Web)" \
           -selectcolor "#$DlgData(Color,$idx,Web)" \
           -indicatoron 0 -padx 0 -pady 0 -font FNT
-    radiobutton $f.inv$seq -text "inverted" \
+    tradiobutton $f.inv$seq -text "inverted" \
           -var DlgData(Color,$idx,Which) \
           -val Inv -fg "#$DlgData(Color,$idx,Inv)" \
           -selectcolor "#$DlgData(Color,$idx,Inv)" \
           -indicatoron 0 -padx 0 -pady 0 -font FNT
-    radiobutton $f.ovr$seq -text "custom" \
+    tradiobutton $f.ovr$seq -text "custom" \
           -var DlgData(Color,$idx,Which) \
           -val Mine -fg "#$DlgData(Color,$idx,Mine)"\
           -selectcolor  "#$DlgData(Color,$idx,Mine)" \
           -indicatoron 0  -padx 0 -pady 0 -font FNT
-    button $f.clr$seq -text "..." -padx 0 -pady 0  -font FNT \
+    tbutton $f.clr$seq -text "..." -padx 0 -pady 0  -font FNT \
           -command [list ::tkchat::newColor $f.ovr$seq $idx]
     grid $f.nm$seq $f.def$seq $f.inv$seq $f.ovr$seq $f.clr$seq \
           -padx 2 -pady 2 -sticky ew
@@ -3178,16 +3264,16 @@
     wm title $t "Edit Macros"
 
     listbox $t.lst -yscroll "$t.scr set" -font FNT -selectmode extended
-    scrollbar $t.scr -command "$t.lst yview"
-    label $t.lbl1 -text "Macro:" -font NAME
+    tscrollbar $t.scr -command "$t.lst yview"
+    tlabel $t.lbl1 -text "Macro:" -font NAME
     entry $t.mac -width 10 -font FNT -validate all -vcmd {regexp -- {^\S*$} %P}
     bind $t.mac <Return> "focus $t.txt"
-    label $t.lbl2 -text "Text:" -font NAME
+    tlabel $t.lbl2 -text "Text:" -font NAME
     entry $t.txt -width 40 -font FNT
     bind $t.txt <Return> "$t.sav invoke"
     bind $t.lst <Double-1> "::tkchat::MacroSel %W @%x,%y"
-    button $t.sav -text Save -command "::tkchat::MacroSave $t"
-    button $t.del -text Delete -command "::tkchat::MacroKill $t.lst"
+    tbutton $t.sav -text Save -command "::tkchat::MacroSave $t"
+    tbutton $t.del -text Delete -command "::tkchat::MacroKill $t.lst"
     set    help "Macros are invoked whenever the first word in the posted\n"
     append help "message matches a defined macro name. Instead of the\n"
     append help "original message being sent, the Text from the macro\n"
@@ -3277,10 +3363,11 @@
     wm withdraw $t
     wm title $t "Color Settings"
 
-    label $t.l1 -text "Posting Color" -font NAME
+    tlabel $t.l1 -text "Posting Color" -font NAME
     label $t.l2 -text "Example Text" -background white \
         -foreground \#$DlgData(MyColor) -font ACT
-    button $t.myclr -text "Change..." -font FNT -command {
+
+    tbutton $t.myclr -text "Change..." -font FNT -command {
         set tmp [tk_chooseColor \
                        -title "Select Your User Color" \
                        -initialcolor \#$::DlgData(MyColor)]
@@ -3290,20 +3377,20 @@
         }
     }
 
-    label $t.l3 -text "Display Color Overrides" -font NAME
-    frame $t.f -relief sunken -bd 2 -height 300
+    tlabel $t.l3 -text "Display Color Overrides" -font NAME
+    tframe $t.f -relief sunken -border 2 ;#TILE -height 300
     canvas $t.f.cvs -yscrollcommand [list $t.f.scr set] \
-          -width 10 -height 300 -highlightthickness 0 -bd 0
-    scrollbar $t.f.scr -command [list $t.f.cvs yview]
+          -width 10 -height 300 -highlightthickness 0 -border 0
+    tscrollbar $t.f.scr -command [list $t.f.cvs yview]
     pack $t.f.cvs -side left -expand 1 -fill both
     pack $t.f.scr -side left -fill y
-    set f [frame $t.f.cvs.frm]
+    set f [tframe $t.f.cvs.frm]
     $t.f.cvs create window 0 0 -anchor nw -window $f
     bind $f <Configure> {
 	[winfo parent %W] config -width [expr {%w+5}] -scrollregion [list 0 0 %w %h]
     }
     foreach {key str} {Web "All\nDefault" Inv "All\nInverted" Mine "All\nCustom"} {
-        button $f.all$key -text $str -padx 0 -pady 0 -font SYS -command \
+        tbutton $f.all$key -text $str -font SYS -command \
               [string map [list %val% $key] {
                   foreach idx [array names DlgData *,Which] {
                       set DlgData($idx) %val%
@@ -3326,10 +3413,10 @@
             buildRow $f $nick $nick
         }
     }
-    frame $t.f2
-    button $t.f2.ok -width 8 -text "OK" -command {set DlgDone ok} -font SYS
-    button $t.f2.app -width 8 -text "Apply" -command {set DlgDone apply} -font SYS
-    button $t.f2.can -width 8 -text "Cancel" -command {set DlgDone cancel} -font SYS
+    tframe $t.f2
+    tbutton $t.f2.ok -width 8 -text "OK" -command {set DlgDone ok} -font SYS
+    tbutton $t.f2.app -width 8 -text "Apply" -command {set DlgDone apply} -font SYS
+    tbutton $t.f2.can -width 8 -text "Cancel" -command {set DlgDone cancel} -font SYS
     pack $t.f2.ok $t.f2.app $t.f2.can -side left -expand 1 -fill none
     
     grid $t.l1  $t.l2 $t.myclr x -padx 1 -pady 3 -sticky {}
@@ -4233,19 +4320,19 @@
     wm withdraw $w
     bind $w <Double-Button-3> [list wm withdraw $w]
     wm protocol $w WM_DELETE_WINDOW [list wm withdraw $w]
-    frame $w.main
-    frame  $w.top
+    tframe $w.main
+    tframe  $w.top
     entry  $w.top.ent -bg white -textvariable [namespace current]::Query
-    button $w.top.but -text "ask LEO" -command [namespace code askLEO]
+    tbutton $w.top.but -text "ask LEO" -command [namespace code askLEO]
     bind   $w.top.ent <Return> [list $w.top.but invoke]
     
     pack $w.top.ent -expand yes -fill x -side left
     pack $w.top.but -expand no -fill none -side left
     pack $w.top	    -fill x -in $w.main
     
-    frame $w.bot
-    scrollbar $w.bot.scry -command [list $w.bot.text yview]
-    scrollbar $w.bot.scrx -orient horizontal -command [list $w.bot.text xview]
+    tframe $w.bot
+    tscrollbar $w.bot.scry -command [list $w.bot.text yview]
+    tscrollbar $w.bot.scrx -orient horizontal -command [list $w.bot.text xview]
     text $w.bot.text -wrap no -font fixed -state disabled \
 	-yscrollcommand [list $w.bot.scry set] -xscrollcommand [list $w.bot.scrx set]
     grid $w.bot.text -row 0 -column 0 -sticky nsew
@@ -4918,21 +5005,21 @@
     }
 
     set dlg [toplevel .userinfo]
-    set f [frame $dlg.f -bd 0]
+    set f [tframe $dlg.f -bd 0]
 
     foreach {key text} {realname "Real name" email Email country Country \
                             city City age Age url "Homepage URL" \
                             photo_url "Picture URL" icq_uin "ICQ uin"} {
-        set l [label $f.l$key -text $text -anchor nw]
+        set l [tlabel $f.l$key -text $text -anchor nw]
         set e [entry $f.e$key \
                    -textvariable [namespace current]::UserInfo($key) \
                    -bd 1 -background white]
         grid configure $l $e -sticky news -padx 1 -pady 1
     }    
-    set l [label $f.lstuff -text "Anything else" -anchor nw]
-    set e [frame $f.estuff -bd 0]
+    set l [tlabel $f.lstuff -text "Anything else" -anchor nw]
+    set e [tframe $f.estuff -bd 0]
     set et [text $e.text -height 6 -bd 1 -background white]
-    set es [scrollbar $e.scroll -bd 1 -command [list $et yview]]
+    set es [tscrollbar $e.scroll -bd 1 -command [list $et yview]]
     $et configure -yscrollcommand [list $es set]
     catch {$et insert 0.0 $UserInfo(stuff)}
     grid configure $et $es -sticky news
@@ -4943,10 +5030,10 @@
     grid columnconfigure $f 1 -weight 1
     grid rowconfigure $f 8 -weight 1
 
-    set btns [frame $dlg.buttons -bd 1]
-    button $btns.ok -text Save -width 10 \
+    set btns [tframe $dlg.buttons -bd 1]
+    tbutton $btns.ok -text Save -width 10 \
         -command [list set [namespace current]::UserInfoBtn 1]
-    button $btns.cancel -text Cancel -width 10 \
+    tbutton $btns.cancel -text Cancel -width 10 \
         -command [list set [namespace current]::UserInfoBtn 0]
     pack $btns.cancel $btns.ok -side right
 
@@ -5264,7 +5351,7 @@
     wm withdraw $dlg
     wm title $dlg "Tkchat Options"
 
-    set bf [labelframe $dlg.bf -text "Preferred browser" -padx 1 -pady 1]
+    set bf [tlabelframe $dlg.bf -text "Preferred browser" -padx 1 -pady 1]
     message $bf.m -justify left -width 320 \
         -text "Provide the command used to launch your web browser. For\
         instance /opt/bin/mozilla or xterm -e links. The URL to\
@@ -5272,7 +5359,7 @@
         mozilla-type browsers we will call the -remote option to\
         try to use a previously existing browser."
     entry $bf.e -textvariable ::tkchat::EditOptions(BROWSER)
-    button $bf.b -text "..."  -command {
+    tbutton $bf.b -text "..."  -command {
         if {[set file [tk_getOpenFile]] != {}} {
             set ::tkchat::EditOptions(BROWSER) $file
         }
@@ -5283,17 +5370,17 @@
     grid rowconfigure $bf 0 -weight 1
     grid columnconfigure $bf 0 -weight 1
 
-    set sf [labelframe $dlg.sf -text "Tk style" -padx 1 -pady 1]
+    set sf [tlabelframe $dlg.sf -text "Tk style" -padx 1 -pady 1]
     message $sf.m -justify left -width 320 \
         -text "The Tk style selection available here will apply when you \
            next restart tkchat."
-    radiobutton $sf.as -text "ActiveState" -underline 0 \
+    tradiobutton $sf.as -text "ActiveState" -underline 0 \
         -variable ::tkchat::EditOptions(Style) -value as_style
-    radiobutton $sf.gtk -text "GTK look" -underline 0 \
+    tradiobutton $sf.gtk -text "GTK look" -underline 0 \
         -variable ::tkchat::EditOptions(Style) -value gtklook
-    radiobutton $sf.any -text "Any" -underline 1 \
+    tradiobutton $sf.any -text "Any" -underline 1 \
         -variable ::tkchat::EditOptions(Style) -value any
-    radiobutton $sf.def -text "Tk default" -underline 0 \
+    tradiobutton $sf.def -text "Tk default" -underline 0 \
         -variable ::tkchat::EditOptions(Style) -value tk
     
     if {[catch {package require as::style}]} {
@@ -5305,9 +5392,9 @@
     grid rowconfigure $bf 0 -weight 1
     grid columnconfigure $bf 0 -weight 1
 
-    button $dlg.ok -text OK \
+    tbutton $dlg.ok -text OK \
         -command [list set ::tkchat::EditOptions(Result) 1]
-    button $dlg.cancel -text Cancel \
+    tbutton $dlg.cancel -text Cancel \
         -command [list set ::tkchat::EditOptions(Result) 0]
 
     grid $bf - -sticky news -padx 2 -pady 2
