###!/bin/sh
# the next line restarts using wish \
##exec wish "$0" ${1+"$@"}

# widget --
# This script demonstrates the various widgets provided by Tk, along with many
# of the features of the Tk toolkit. This file only contains code to generate
# the main window for the application, which invokes individual
# demonstrations. The code for the actual demonstrations is contained in
# separate ".tcl" files is this directory, which are sourced by this script as
# needed.

##package require Tcl	8.5
##package require Tk	8.5
##package require msgcat
import os
import sys
from tkinter import *
from tkinter.font import Font
from tkinter import ttk
from tkinter.scrolledtext import ScrolledText
from tkinter import messagebox

##eval destroy [winfo child .]
##set tk_demoDirectory [file join [pwd] [file dirname [info script]]]
##::msgcat::mcload $tk_demoDirectory
##namespace import ::msgcat::mc
##wm title . [mc "Widget Demonstration"]
##if {[tk windowingsystem] eq "x11"} {
##    # This won't work everywhere, but there's no other way in core Tk at the
##    # moment to display a coloured icon.
##    image create photo TclPowered \
##	    -file [file join $tk_library images logo64.gif]
##    wm iconwindow . [toplevel ._iconWindow]
##    pack [label ._iconWindow.i -image TclPowered]
##    wm iconname . [mc "tkWidgetDemo"]
##}
tk_demoDirectory = os.getcwd()
root = Tk()
root.title("Widget Demonstration")
if root._windowingsystem == 'x11':
    pass

##if {"defaultFont" ni [font names]} {
##    # TIP #145 defines some standard named fonts
##    if {"TkDefaultFont" in [font names] && "TkFixedFont" in [font names]} {
##        # FIX ME: the following technique of cloning the font to copy it works
##        #         fine but means that if the system font is changed by Tk
##        #         cannot update the copied font. font alias might be useful
##        #         here -- or fix the app to use TkDefaultFont etc.
##        font create mainFont   {*}[font configure TkDefaultFont]
##        font create fixedFont  {*}[font configure TkFixedFont]
##        font create boldFont   {*}[font configure TkDefaultFont] -weight bold
##        font create titleFont  {*}[font configure TkDefaultFont] -weight bold
##        font create statusFont {*}[font configure TkDefaultFont]
##        font create varsFont   {*}[font configure TkDefaultFont]
##	if {[tk windowingsystem] eq "aqua"} {
##	    font configure titleFont -size 17
##	}
##    } else {
##        font create mainFont   -family Helvetica -size 12
##        font create fixedFont  -family Courier   -size 10
##        font create boldFont   -family Helvetica -size 12 -weight bold
##        font create titleFont  -family Helvetica -size 18 -weight bold
##        font create statusFont -family Helvetica -size 10
##        font create varsFont   -family Helvetica -size 14
##    }
##}
if 'defaultFont' not in root.tk.call('font', 'names'):
    if 'TkDefaultFont' in root.tk.call('font', 'names') and 'TkFixedFont' in root.tk.call('font', 'names'):
        mainFont = Font(name='TkDefaultFont', exists=True).copy()
        fixedFont = Font(name='TkFixedFont', exists=True).copy()
        boldFont = Font(name='TkDefaultFont', exists=True).copy()
        boldFont['weight'] = 'bold'
        titleFont = Font(name='TkDefaultFont', exists=True).copy()
        titleFont['weight'] = 'bold'
        statusFont = Font(name='TkDefaultFont', exists=True).copy()
        varsFont = Font(name='TkDefaultFont', exists=True).copy()
        if root._windowingsystem == 'aqua':
            titleFont['size'] = 17
    else:
        mainFont = Font(family='Helvetica', size=12)
        fixedFont = Font(family='Courier', size=10)
        boldFont = Font(family='Helvetica', size=12, weight='bold')
        titleFont = Font(family='Helvetica', size=18, weight='bold')
        statusFont = Font(family='Helvetica', size=10)
        varsFont = Font(family='Helvetica', size=14)

##set widgetDemo 1
##set font mainFont
widgetDemo = 1
font = mainFont

##image create photo ::img::refresh -format GIF -data {
##    R0lGODlhEAAQAJEDAP///wAAACpnKv///yH5BAEAAAMALAAAAAAQABAAAAI63IKp
##    xgcPH2ouwgBCw1HIxHCQ4F3hSJKmwZXqWrmWxj7lKJ2dndcon9EBUq+gz3brVXAR
##    2tICU0gXBQA7
##}
img_refresh = PhotoImage(format='GIF', data="""
    R0lGODlhEAAQAJEDAP///wAAACpnKv///yH5BAEAAAMALAAAAAAQABAAAAI63IKp
    xgcPH2ouwgBCw1HIxHCQ4F3hSJKmwZXqWrmWxj7lKJ2dndcon9EBUq+gz3brVXAR
    2tICU0gXBQA7
""")

##image create photo ::img::view -format GIF -data {
##    R0lGODlhEAAQAKIHAP///wwMDAAAAMDAwNnZ2SYmJmZmZv///yH5BAEAAAcALAAA
##    AAAQABAAAANMKLos90+ASamDRxJCgw9YVnlDOXiQBgRDBRgHKE6sW8QR3doPKK27
##    yg33q/GIOhdg6OsEJzeZykiBSUcs06e56Xx6np8ScIkFGuhQAgA7
##}
img_view = PhotoImage(format='GIF', data="""
    R0lGODlhEAAQAKIHAP///wwMDAAAAMDAwNnZ2SYmJmZmZv///yH5BAEAAAcALAAA
    AAAQABAAAANMKLos90+ASamDRxJCgw9YVnlDOXiQBgRDBRgHKE6sW8QR3doPKK27
    yg33q/GIOhdg6OsEJzeZykiBSUcs06e56Xx6np8ScIkFGuhQAgA7
""")

##image create photo ::img::delete -format GIF -data {
##    R0lGODlhEAAQAIABAIQAAP///yH5BAEAAAEALAAAAAAQABAAAAIjjI+pmwAc3HGy
##    PUSvqYpuvWQg40FfSVacBa5nN6JYDI3mzRQAOw==
##}
img_delete = PhotoImage(format='GIF', data="""
    R0lGODlhEAAQAIABAIQAAP///yH5BAEAAAEALAAAAAAQABAAAAIjjI+pmwAc3HGy
    PUSvqYpuvWQg40FfSVacBa5nN6JYDI3mzRQAOw==
""")

##image create photo ::img::print -format GIF -data {
##    R0lGODlhEAAQALMKAAAAAP///52VunNkl8C82Yl+qldBgq+pyrOzs1fYAP///wAA
##    AAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAQABAAAARGUMlJKwU4AztB+ODGeUiJ
##    fGLlgeEYmGWQXmx7aXgmAUTv/74N4EAsGhOJg1DAbDqbwoJ0Sp0KB9isNis0eL/g
##    ryhH5pgnEQA7
##}
img_print = PhotoImage(format='GIF', data="""
    R0lGODlhEAAQALMKAAAAAP///52VunNkl8C82Yl+qldBgq+pyrOzs1fYAP///wAA
    AAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAQABAAAARGUMlJKwU4AztB+ODGeUiJ
    fGLlgeEYmGWQXmx7aXgmAUTv/74N4EAsGhOJg1DAbDqbwoJ0Sp0KB9isNis0eL/g
    ryhH5pgnEQA7
""")

# Note that this is run through the message catalog! This is because this is
# actually an image of a word.
##image create photo ::img::new -format GIF -data [mc {
##    R0lGODlhHgAOALMPALMAANyIiOu7u8dEROaqqvru7sxVVeGZmbgREfXd3b0iItZ3
##    d8IzM9FmZvDMzP///yH5BAEAAA8ALAAAAAAeAA4AAASa8MlJq7046827WVOCHEkw
##    nANhUgJlEBIABJIwL3K+4IcUALCHjfbItYZDSgJgkBiYPmBMAUAkkLPKs/BAyLgM
##    wAQwOAAY2ByCaw4QAFQSoDEePJ6DmU1xInYZTw5nOEFFdgVUelkVDTIMd3AKFGQ1
##    MgI2AwEmQW8APZ0gdRONAks5nhIFVVxdAAkUAS2pAVwFl7ITB4UqHb0XEQA7
##}]
img_new = PhotoImage(format='GIF', data="""
    R0lGODlhHgAOALMPALMAANyIiOu7u8dEROaqqvru7sxVVeGZmbgREfXd3b0iItZ3
    d8IzM9FmZvDMzP///yH5BAEAAA8ALAAAAAAeAA4AAASa8MlJq7046827WVOCHEkw
    nANhUgJlEBIABJIwL3K+4IcUALCHjfbItYZDSgJgkBiYPmBMAUAkkLPKs/BAyLgM
    wAQwOAAY2ByCaw4QAFQSoDEePJ6DmU1xInYZTw5nOEFFdgVUelkVDTIMd3AKFGQ1
    MgI2AwEmQW8APZ0gdRONAks5nhIFVVxdAAkUAS2pAVwFl7ITB4UqHb0XEQA7
""")

#----------------------------------------------------------------
# The code below create the main window, consisting of a menu bar and a text
# widget that explains how to use the program, plus lists all of the demos as
# hypertext items.
#----------------------------------------------------------------

##menu .menuBar -tearoff 0
menuBar = Menu(root, tearoff=0)

##if {[tk windowingsystem] ne "aqua"} {
##    # This is a tk-internal procedure to make i18n easier
##    ::tk::AmpMenuArgs .menuBar add cascade -label [mc "&File"] \
##	    -menu .menuBar.file
##    menu .menuBar.file -tearoff 0
##    ::tk::AmpMenuArgs .menuBar.file add command -label [mc "&About..."] \
##	    -command {tkAboutDialog} -accelerator [mc "<F1>"]
##    bind . <F1> {tkAboutDialog}
##    .menuBar.file add sep
##    if {[string match win* [tk windowingsystem]]} {
##	# Windows doesn't usually have a Meta key
##	::tk::AmpMenuArgs .menuBar.file add command -label [mc "&Quit"] \
##		-command {exit} -accelerator [mc "Ctrl+Q"]
##	bind . <[mc "Control-q"]> {exit}
##    } else {
##	::tk::AmpMenuArgs .menuBar.file add command -label [mc "&Quit"] \
##		-command {exit} -accelerator [mc "Meta-Q"]
##	bind . <[mc "Meta-q"]> {exit}
##    }
##}
def tkAboutDialog():
    messagebox.showinfo(title='About Widget Demo',
                        message='Tk widget demonstration application',
                        detail="""
Copyright \u00a9 1996-1997 Sun Microsystems, Inc.
Copyright \u00a9 1997-2000 Ajuba Solutions, Inc.
Copyright \u00a9 2001-2009 Donal K. Fellows
Copyright \u00a9 2002-2007 Daniel A. Steffen
""".strip())
if root._windowingsystem != 'aqua':
    file = Menu(menuBar, tearoff=0)
    file.add('command', label='About...', underline=0,
             command=tkAboutDialog, accelerator='<F1>')
    root.bind('<F1>', tkAboutDialog)
    file.add('sep')
    if root._windowingsystem.startswith('win'):
        file.add('command', label='Quit', underline=0,
                 command=root.destroy, accelerator='Ctrl+Q')
        root.bind('Control-q', root.destroy)
    else:
        file.add('command', label='Quit', underline=0,
                 command=root.destroy, accelerator='Meta-Q')
        root.bind('Meta-q', root.destroy)
    menuBar.add('cascade', label='File', underline=0, menu=file)

##. configure -menu .menuBar
root['menu'] = menuBar

##ttk::frame .statusBar
##ttk::label .statusBar.lab -text "   " -anchor w
##if {[tk windowingsystem] eq "aqua"} {
##    ttk::separator .statusBar.sep
##    pack .statusBar.sep -side top -expand yes -fill x -pady 0
##}
##pack .statusBar.lab -side left -padx 2 -expand yes -fill both
##if {[tk windowingsystem] ne "aqua"} {
##    ttk::sizegrip .statusBar.foo
##    pack .statusBar.foo -side left -padx 2
##}
##pack .statusBar -side bottom -fill x -pady 2
statusBar = ttk.Frame(root)
statusBar_lab = ttk.Label(statusBar, text='   ', anchor='w')
if root._windowingsystem == 'aqua':
    sep = ttk.Separator(statusBar)
    sep.pack(side='top', expand='yes', fill='x', pady=0)
statusBar_lab.pack(side='left', padx=2, expand='yes', fill='both')
if root._windowingsystem != 'aqua':
    foo = ttk.Sizegrip(statusBar)
    foo.pack(side='left', padx=2)
statusBar.pack(side='bottom', fill='x', pady=2)

##set textheight 30
##catch {
##    set textheight [expr {
##	([winfo screenheight .] * 0.7) /
##	[font metrics mainFont -displayof . -linespace]
##    }]
##}
textheight = 30
try:
    textheight = root.winfo_screenheight() * 0.7 / mainFont.metrics('linespace', displayof='.')
except:
    pass

##ttk::frame .textFrame
##scrollbar .s -orient vertical -command {.t yview} -takefocus 1
##pack .s -in .textFrame -side right -fill y
##text .t -yscrollcommand {.s set} -wrap word -width 70 -height $textheight \
##	-font mainFont -setgrid 1 -highlightthickness 0 \
##	-padx 4 -pady 2 -takefocus 0
##pack .t -in .textFrame -expand y -fill both -padx 1
##pack .textFrame -expand yes -fill both
##if {[tk windowingsystem] eq "aqua"} {
##    pack configure .statusBar.lab -padx {10 18} -pady {4 6}
##    pack configure .statusBar -pady 0
##    .t configure -padx 10 -pady 0
##}
textFrame = ttk.Frame(root)
##s = Scrollbar(textFrame, orient= 'vertical', takefocus=1)
##t = Text(textFrame, wrap='word', width=70,
##         height=textheight, font=mainFont, setgrid=1, highlightthickness=0,
##         padx=4, pady=2, takefocus=0)
##s['command'] = t.yview
##t['yscrollcommand'] = s.set
##s.pack(side='right', fill='y')
##t.pack(expand='y', fill='both', padx=1)
t = ScrolledText(textFrame, wrap='word', width=70, height=textheight,
                 font=mainFont, setgrid=1, highlightthickness=0,
                 padx=4, pady=2, takefocus=0)
t.pack(expand='y', fill='both', padx=1)
textFrame.pack(expand='yes', fill='both')
if root._windowingsystem == 'aqua':
    pass

# Create a bunch of tags to use in the text widget, such as those for section
# titles and demo descriptions. Also define the bindings for tags.

##.t tag configure title -font titleFont
##.t tag configure subtitle -font titleFont
##.t tag configure bold  -font boldFont
##if {[tk windowingsystem] eq "aqua"} {
##    .t tag configure title -spacing1 8
##    .t tag configure subtitle -spacing3 3
##}
t.tag_configure('title', font=titleFont)
t.tag_configure('subtitle', font=titleFont)
t.tag_configure('bold', font=boldFont)
if root._windowingsystem == 'aqua':
    t.tag_configure('title', spacing1=8)
    t.tag_configure('subtitle', spacing1=3)

# We put some "space" characters to the left and right of each demo
# description so that the descriptions are highlighted only when the mouse
# cursor is right over them (but not when the cursor is to their left or
# right).
#
##.t tag configure demospace -lmargin1 1c -lmargin2 1c
t.tag_configure('demospace', lmargin1='1c', lmargin2='1c')

##if {[winfo depth .] == 1} {
##    .t tag configure demo -lmargin1 1c -lmargin2 1c \
##	-underline 1
##    .t tag configure visited -lmargin1 1c -lmargin2 1c \
##	-underline 1
##    .t tag configure hot -background black -foreground white
##} else {
##    .t tag configure demo -lmargin1 1c -lmargin2 1c \
##	-foreground blue -underline 1
##    .t tag configure visited -lmargin1 1c -lmargin2 1c \
##	-foreground #303080 -underline 1
##    .t tag configure hot -foreground red -underline 1
##}
##.t tag bind demo <ButtonRelease-1> {
##    invoke [.t index {@%x,%y}]
##}
##set lastLine ""
##.t tag bind demo <Enter> {
##    set lastLine [.t index {@%x,%y linestart}]
##    .t tag add hot "$lastLine +1 chars" "$lastLine lineend -1 chars"
##    .t config -cursor [::ttk::cursor link]
##    showStatus [.t index {@%x,%y}]
##}
##.t tag bind demo <Leave> {
##    .t tag remove hot 1.0 end
##    .t config -cursor [::ttk::cursor text]
##    .statusBar.lab config -text ""
##}
##.t tag bind demo <Motion> {
##    set newLine [.t index {@%x,%y linestart}]
##    if {$newLine ne $lastLine} {
##	.t tag remove hot 1.0 end
##	set lastLine $newLine
##
##	set tags [.t tag names {@%x,%y}]
##	set i [lsearch -glob $tags demo-*]
##	if {$i >= 0} {
##	    .t tag add hot "$lastLine +1 chars" "$lastLine lineend -1 chars"
##	}
##    }
##    showStatus [.t index {@%x,%y}]
##}
ttk_cursor = {'text':'ibeam', 'link':'hand2', 'busy':'wait'}
demo_name = {}
def invoke(index):
    global tk_demoDirectory
    tags = t.tag_names(index)
    demo_tags = [i for i in tags if i.startswith('demo-')]
    if len(demo_tags) == 0:
        return
    cursor = t.cget('cursor')
    t['cursor'] = ttk_cursor['busy']
    root.update()
    demo = demo_tags[0][5:]
    demo_file = '%s/%s.py' % (tk_demoDirectory, demo)
    #global_dict = {'widgetDemo':widgetDemo,
    #               'tk_demoDirectory':tk_demoDirectory,
    #               'root':root,
    #               'font_':font_,
    #               'positionWindow':positionWindow,
    #               'addSeeDismiss':addSeeDismiss,
    #               'demo_name':demo_name}
    #exec(compile(open(demo_file).read(), demo_file, 'exec'), global_dict, {})
    print(demo_file)
    exec(open(demo_file).read())
    root.update()
    t['cursor'] = cursor
    t.tag_add('visited', '%s linestart +1 chars'%index,
              '%s lineend -1 chars'%index)
if root.winfo_depth() == 1:
    t.tag_configure('demo', lmargin1='1c', lmargin2='1c', underline=1)
    t.tag_configure('visited', lmargin1='1c', lmargin2='1c', underline=1)
    t.tag_configure('hot', background='black', foreground='white')
else:
    t.tag_configure('demo', lmargin1='1c', lmargin2='1c',
                    foreground='blue', underline=1)
    t.tag_configure('visited', lmargin1='1c', lmargin2='1c',
                    foreground='#303080', underline=1)
    t.tag_configure('hot', foreground='red', underline=1)
t.tag_bind('demo', '<ButtonRelease-1>',
           lambda e: invoke(t.index('@%r,%r'%(e.x, e.y))))
def showStatus(index):
    tags = t.tag_names(index)
    cursor = t.cget('cursor')
    demo_tags = [i for i in tags if i.startswith('demo-')]
    if len(demo_tags) == 0:
        statusBar_lab['text'] = ''
        newcursor = ttk_cursor['text']
    else:
        demo = demo_tags[0][5:]
        statusBar_lab['text'] = 'Run the "%s" sample program'%demo
        newcursor = ttk_cursor['link'] 
    if cursor != newcursor:
        t['cursor'] = newcursor
lastLine = ''
def t_tag_bind_demo_enter(e):
    global lastLine
    lastLine = t.index('@%r,%r linestart'%(e.x, e.y))
    t.tag_add('hot', '%s +1 chars'%lastLine, '%s lineend -1 chars'%lastLine)
    t['cursor'] = ttk_cursor['link']
    showStatus(t.index('@%r,%r'%(e.x, e.y)))
t.tag_bind('demo', '<Enter>', t_tag_bind_demo_enter)
def t_tag_bind_demo_leave(e):
    t.tag_remove('hot', 1.0, 'end')
    t['cursor'] = ttk_cursor['text'] 
    statusBar_lab['text'] = ''
t.tag_bind('demo', '<Leave>', t_tag_bind_demo_leave)
##.t tag bind demo <Motion> {
##    set newLine [.t index {@%x,%y linestart}]
##    if {$newLine ne $lastLine} {
##	.t tag remove hot 1.0 end
##	set lastLine $newLine
##
##	set tags [.t tag names {@%x,%y}]
##	set i [lsearch -glob $tags demo-*]
##	if {$i >= 0} {
##	    .t tag add hot "$lastLine +1 chars" "$lastLine lineend -1 chars"
##	}
##    }
##    showStatus [.t index {@%x,%y}]
##}
def t_tag_bind_demo_motion(e):
    newLine = t.index('@%r,%r linestart'%(e.x, e.y))
    global lastLine
    if newLine != lastLine:
        t.tag_remove('hot', 1.0, 'end')
        lastLine = newLine
        tags = t.tag_names('@%r,%r'%(e.x, e.y))
        demo_tags = [i for i in tags if i.startswith('demo-')]
        if len(demo_tags) > 0:
            t.tag_add('hot', '%s +1 chars'%lastLine, '%s lineend -1 chars'%lastLine)
    showStatus(t.index('@%r,%r'%(e.x, e.y)))
t.tag_bind('demo', '<Motion>', t_tag_bind_demo_motion)

##############################################################################
# Create the text for the text widget.

# addFormattedText --
#
#	Add formatted text (but not hypertext) to the text widget after first
#	passing it through the message catalog to allow for localization.
#	Lines starting with @@ are formatting directives (insert title, insert
#	demo hyperlink, begin newline, or change style) and all other lines
#	are literal strings to be inserted. Substitutions are performed,
#	allowing processing pieces through the message catalog. Blank lines
#	are ignored.
#
##proc addFormattedText {formattedText} {
##    set style normal
##    set isNL 1
##    set demoCount 0
##    set new 0
##    foreach line [split $formattedText \n] {
##	set line [string trim $line]
##	if {$line eq ""} {
##	    continue
##	}
##	if {[string match @@* $line]} {
##	    set data [string range $line 2 end]
##	    set key [lindex $data 0]
##	    set values [lrange $data 1 end]
##	    switch -exact -- $key {
##		title {
##		    .t insert end [mc $values]\n title \n normal
##		}
##		newline {
##		    .t insert end \n $style
##		    set isNL 1
##		}
##		subtitle {
##		    .t insert end "\n" {} [mc $values] subtitle \
##			    " \n " demospace
##		    set demoCount 0
##		}
##		demo {
##		    set description [lassign $values name]
##		    .t insert end "[incr demoCount]. [mc $description]" \
##			    [list demo demo-$name]
##		    if {$new} {
##			.t image create end -image ::img::new -padx 5
##			set new 0
##		    }
##		    .t insert end " \n " demospace
##		}
##		new {
##		    set new 1
##		}
##		default {
##		    set style $key
##		}
##	    }
##	    continue
##	}
##	if {!$isNL} {
##	    .t insert end " " $style
##	}
##	set isNL 0
##	.t insert end [mc $line] $style
##    }
##}
def addFormattedText(formattedText):
    style = 'normal'
    isNL = 1
    demoCount = 0
    new = 0
    for line in formattedText.splitlines():
        line = line.strip()
        if line == '':
            continue
        if line.startswith('@@'):
            data = line[2:]
            data_list = data.split(None, 1)
            key = data_list[0]
            if len(data_list) > 1:
                values = data_list[1]
            if key == 'title':
                t.insert('end', values+'\n', 'title', '\n', 'normal')
            elif key == 'newline':
                t.insert('end', '\n', style)
                isNL = 1
            elif key == 'subtitle':
                t.insert('end', '\n', '', values, 'subtitle', ' \n ',
                         'demospace')
                demoCount = 0
            elif key == 'demo':
                data_list = values.split(None, 1)
                name = data_list[0]
                if len(data_list) > 1:
                    description = data_list[1]
                else:
                    description = ''
                demoCount += 1
                t.insert('end', "%i. %s"%(demoCount, description),
                         'demo demo-%s'%name)
                if new:
                    t.image_create('end', image=img_new, padx=5)
                    new = 0
                t.insert('end', ' \n ', 'demospace')
            elif key == 'new':
                new = 1
            else:
                style = key
            continue
        if not isNL:
            t.insert('end', ' ', style)
        isNL = 0
        t.insert('end', line, style)      

##addFormattedText {
##    @@title	Tk Widget Demonstrations
##
##    This application provides a front end for several short scripts
##    that demonstrate what you can do with Tk widgets.  Each of the
##    numbered lines below describes a demonstration; you can click on
##    it to invoke the demonstration.  Once the demonstration window
##    appears, you can click the
##    @@bold
##    See Code
##    @@normal
##    button to see the Tcl/Tk code that created the demonstration.  If
##    you wish, you can edit the code and click the
##    @@bold
##    Rerun Demo
##    @@normal
##    button in the code window to reinvoke the demonstration with the
##    modified code.
##    @@newline
##
##    @@subtitle	Labels, buttons, checkbuttons, and radiobuttons
##    @@demo label	Labels (text and bitmaps)
##    @@demo unicodeout	Labels and UNICODE text
##    @@demo button	Buttons
##    @@demo check	Check-buttons (select any of a group)
##    @@demo radio	Radio-buttons (select one of a group)
##    @@demo puzzle	A 15-puzzle game made out of buttons
##    @@demo icon		Iconic buttons that use bitmaps
##    @@demo image1	Two labels displaying images
##    @@demo image2	A simple user interface for viewing images
##    @@demo labelframe	Labelled frames
##    @@demo ttkbut	The simple Themed Tk widgets
##
##    @@subtitle	Listboxes and Trees
##    @@demo states	The 50 states
##    @@demo colors	Colors: change the color scheme for the application
##    @@demo sayings	A collection of famous and infamous sayings
##    @@demo mclist	A multi-column list of countries
##    @@demo tree		A directory browser tree
##
##    @@subtitle	Entries, Spin-boxes and Combo-boxes
##    @@demo entry1	Entries without scrollbars
##    @@demo entry2	Entries with scrollbars
##    @@demo entry3	Validated entries and password fields
##    @@demo spin		Spin-boxes
##    @@demo combo	Combo-boxes
##    @@demo form		Simple Rolodex-like form
##
##    @@subtitle	Text
##    @@demo text		Basic editable text
##    @@demo style	Text display styles
##    @@demo bind		Hypertext (tag bindings)
##    @@demo twind	A text widget with embedded windows and other features
##    @@demo search	A search tool built with a text widget
##    @@demo textpeer	Peering text widgets
##
##    @@subtitle	Canvases
##    @@demo items	The canvas item types
##    @@demo plot		A simple 2-D plot
##    @@demo ctext	Text items in canvases
##    @@demo arrow	An editor for arrowheads on canvas lines
##    @@demo ruler	A ruler with adjustable tab stops
##    @@demo floor	A building floor plan
##    @@demo cscroll	A simple scrollable canvas
##    @@demo knightstour  A Knight's tour of the chess board
##
##    @@subtitle	Scales and Progress Bars
##    @@demo hscale	Horizontal scale
##    @@demo vscale	Vertical scale
##    @@new
##    @@demo ttkscale	Themed scale linked to a label with traces
##    @@demo ttkprogress	Progress bar
##
##    @@subtitle	Paned Windows and Notebooks
##    @@demo paned1	Horizontal paned window
##    @@demo paned2	Vertical paned window
##    @@demo ttkpane	Themed nested panes
##    @@demo ttknote	Notebook widget
##
##    @@subtitle	Menus and Toolbars
##    @@demo menu		Menus and cascades (sub-menus)
##    @@demo menubu	Menu-buttons
##    @@demo ttkmenu	Themed menu buttons
##    @@demo toolbar	Themed toolbar
##
##    @@subtitle	Common Dialogs
##    @@demo msgbox	Message boxes
##    @@demo filebox	File selection dialog
##    @@demo clrpick	Color picker
##    @@demo fontchoose	Font selection dialog
##
##    @@subtitle	Animation
##    @@demo anilabel	Animated labels
##    @@demo aniwave	Animated wave
##    @@demo pendulum	Pendulum simulation
##    @@demo goldberg	A celebration of Rube Goldberg
##
##    @@subtitle	Miscellaneous
##    @@demo bitmap	The built-in bitmaps
##    @@demo dialog1	A dialog box with a local grab
##    @@demo dialog2	A dialog box with a global grab
##}
addFormattedText("""
    @@title	Tk Widget Demonstrations

    This application provides a front end for several short scripts
    that demonstrate what you can do with Tk widgets.  Each of the
    numbered lines below describes a demonstration; you can click on
    it to invoke the demonstration.  Once the demonstration window
    appears, you can click the
    @@bold
    See Code
    @@normal
    button to see the Tcl/Tk code that created the demonstration.  If
    you wish, you can edit the code and click the
    @@bold
    Rerun Demo
    @@normal
    button in the code window to reinvoke the demonstration with the
    modified code.
    @@newline

    @@subtitle	Labels, buttons, checkbuttons, and radiobuttons
    @@demo label	Labels (text and bitmaps)
    @@demo unicodeout	Labels and UNICODE text
    @@demo button	Buttons
    @@demo check	Check-buttons (select any of a group)
    @@demo radio	Radio-buttons (select one of a group)
    @@demo puzzle	A 15-puzzle game made out of buttons
    @@demo icon		Iconic buttons that use bitmaps
    @@demo image1	Two labels displaying images
    @@demo image2	A simple user interface for viewing images
    @@demo labelframe	Labelled frames
    @@demo ttkbut	The simple Themed Tk widgets

    @@subtitle	Listboxes and Trees
    @@demo states	The 50 states
    @@demo colors	Colors: change the color scheme for the application
    @@demo sayings	A collection of famous and infamous sayings
    @@demo mclist	A multi-column list of countries
    @@demo tree		A directory browser tree

    @@subtitle	Entries, Spin-boxes and Combo-boxes
    @@demo entry1	Entries without scrollbars
    @@demo entry2	Entries with scrollbars
    @@demo entry3	Validated entries and password fields
    @@demo spin		Spin-boxes
    @@demo combo	Combo-boxes
    @@demo form		Simple Rolodex-like form

    @@subtitle	Text
    @@demo text		Basic editable text
    @@demo style	Text display styles
    @@demo bind		Hypertext (tag bindings)
    @@demo twind	A text widget with embedded windows and other features
    @@demo search	A search tool built with a text widget
    @@demo textpeer	Peering text widgets

    @@subtitle	Canvases
    @@demo items	The canvas item types
    @@demo plot		A simple 2-D plot
    @@demo ctext	Text items in canvases
    @@demo arrow	An editor for arrowheads on canvas lines
    @@demo ruler	A ruler with adjustable tab stops
    @@demo floor	A building floor plan
    @@demo cscroll	A simple scrollable canvas
    @@demo knightstour  A Knight's tour of the chess board

    @@subtitle	Scales and Progress Bars
    @@demo hscale	Horizontal scale
    @@demo vscale	Vertical scale
    @@new
    @@demo ttkscale	Themed scale linked to a label with traces
    @@demo ttkprogress	Progress bar

    @@subtitle	Paned Windows and Notebooks
    @@demo paned1	Horizontal paned window
    @@demo paned2	Vertical paned window
    @@demo ttkpane	Themed nested panes
    @@demo ttknote	Notebook widget

    @@subtitle	Menus and Toolbars
    @@demo menu		Menus and cascades (sub-menus)
    @@demo menubu	Menu-buttons
    @@demo ttkmenu	Themed menu buttons
    @@demo toolbar	Themed toolbar

    @@subtitle	Common Dialogs
    @@demo msgbox	Message boxes
    @@demo filebox	File selection dialog
    @@demo clrpick	Color picker
    @@demo fontchoose	Font selection dialog

    @@subtitle	Animation
    @@demo anilabel	Animated labels
    @@demo aniwave	Animated wave
    @@demo pendulum	Pendulum simulation
    @@demo goldberg	A celebration of Rube Goldberg

    @@subtitle	Miscellaneous
    @@demo bitmap	The built-in bitmaps
    @@demo dialog1	A dialog box with a local grab
    @@demo dialog2	A dialog box with a global grab
""")

##############################################################################

##.t configure -state disabled
##focus .s
t['state'] = 'disabled'
t.focus()

# addSeeDismiss --
# Add "See Code" and "Dismiss" button frame, with optional "See Vars"
#
# Arguments:
# w -		The name of the frame to use.

##proc addSeeDismiss {w show {vars {}} {extra {}}} {
##    ## See Code / Dismiss buttons
##    ttk::frame $w
##    ttk::separator $w.sep
##    #ttk::frame $w.sep -height 2 -relief sunken
##    grid $w.sep -columnspan 4 -row 0 -sticky ew -pady 2
##    ttk::button $w.dismiss -text [mc "Dismiss"] \
##	-image ::img::delete -compound left \
##	-command [list destroy [winfo toplevel $w]]
##    ttk::button $w.code -text [mc "See Code"] \
##	-image ::img::view -compound left \
##	-command [list showCode $show]
##    set buttons [list x $w.code $w.dismiss]
##    if {[llength $vars]} {
##	ttk::button $w.vars -text [mc "See Variables"] \
##	    -image ::img::view -compound left \
##	    -command [concat [list showVars $w.dialog] $vars]
##	set buttons [linsert $buttons 1 $w.vars]
##    }
##    if {$extra ne ""} {
##	set buttons [linsert $buttons 1 [uplevel 1 $extra]]
##    }
##    grid {*}$buttons -padx 4 -pady 4
##    grid columnconfigure $w 0 -weight 1
##    if {[tk windowingsystem] eq "aqua"} {
##	foreach b [lrange $buttons 1 end] {$b configure -takefocus 0}
##	grid configure $w.sep -pady 0
##	grid configure {*}$buttons -pady {10 12}
##	grid configure [lindex $buttons 1] -padx {16 4}
##	grid configure [lindex $buttons end] -padx {4 18}
##    }
##    return $w
##}
def showVars(master, *args):
    global vardlg
    try: vardlg.destroy()
    except: pass
    w = vardlg = Toplevel(master)
    if root._windowingsystem == 'x11': pass
    w.wm_title('Variable values')

    b = ttk.Frame(w)
    b.grid(sticky='news')
    f = ttk.Labelframe(b, text='Variable values:')
    for i, var in enumerate(args):
        n = ttk.Label(f, text='%s:'%(var._name), anchor='w')
        v = ttk.Label(f, textvariable=var, anchor='w')
        n.grid(column=0, row=i, padx=2, pady=2, sticky='w')
        v.grid(column=1, row=i, padx=2, pady=2, sticky='w')
    ok = ttk.Button(b, text='OK', command=w.destroy, default='active')
    w.bind('<Return>', ok.invoke)
    w.bind('<Escape>', ok.invoke)

    f.grid(sticky='news', padx=4)
    ok.grid(sticky='e', padx=4, pady='6 4')
    if root._windowingsystem == 'aqua': pass
    f.columnconfigure(1, weight=1)
    f.rowconfigure(100, weight=1)
    b.columnconfigure(0, weight=1)
    b.rowconfigure(0, weight=1)
    w.columnconfigure(0, weight=1)
    w.rowconfigure(0, weight=1)
    
def addSeeDismiss(w, show, vars_=[], extra=[]):
    #w = ttk.Frame(w)
    sep = ttk.Separator(w)
    sep.grid(columnspan=4, row=0, sticky='ew', pady=2)
    dismiss = ttk.Button(w, text='Dismiss', image=img_delete, compound='left',
                         command=w.winfo_toplevel().destroy)
    code = ttk.Button(w, text='See Code', image=img_view, compound='left',
                      command=lambda:
                      os.system('"%s/Lib/idlelib/idle.bat" -e %s.py' \
                                % (sys.exec_prefix, show)))
    buttons = [code, dismiss]
    if vars_:
        vars_btn = ttk.Button(w, text='See Variables', image=img_view,
                              compound='left',
                              command=lambda: showVars(w, *vars_))
        buttons.insert(0, vars_btn)
    if extra:
        #extra[0].configure(master=w)
        buttons.insert(0, extra[0])
    for i, btn in enumerate(buttons, 1):
        btn.grid(column=i, row=1, padx=4, pady=4)
    w.columnconfigure(0, weight=1)
    if root._windowingsystem == 'aqua':
        pass
    return w

# positionWindow --
# This procedure is invoked by most of the demos to position a new demo
# window.
#
# Arguments:
# w -		The name of the window to position.

##proc positionWindow w {
##    wm geometry $w +300+300
##}
def positionWindow(w):
    w.wm_geometry('+300+300')

# showVars --
# Displays the values of one or more variables in a window, and updates the
# display whenever any of the variables changes.
#
# Arguments:
# w -		Name of new window to create for display.
# args -	Any number of names of variables.

##proc showVars {w args} {
##    catch {destroy $w}
##    toplevel $w
##    if {[tk windowingsystem] eq "x11"} {wm attributes $w -type dialog}
##    wm title $w [mc "Variable values"]
##
##    set b [ttk::frame $w.frame]
##    grid $b -sticky news
##    set f [ttk::labelframe $b.title -text [mc "Variable values:"]]
##    foreach var $args {
##	ttk::label $f.n$var -text "$var:" -anchor w
##	ttk::label $f.v$var -textvariable $var -anchor w
##	grid $f.n$var $f.v$var -padx 2 -pady 2 -sticky w
##    }
##    ttk::button $b.ok -text [mc "OK"] \
##	-command [list destroy $w] -default active
##    bind $w <Return> [list $b.ok invoke]
##    bind $w <Escape> [list $b.ok invoke]
##
##    grid $f -sticky news -padx 4
##    grid $b.ok -sticky e -padx 4 -pady {6 4}
##    if {[tk windowingsystem] eq "aqua"} {
##	$b.ok configure -takefocus 0
##	grid configure $b.ok -pady {10 12} -padx {16 18}
##	grid configure $f -padx 10 -pady {10 0}
##    }
##    grid columnconfig $f 1 -weight 1
##    grid rowconfigure $f 100 -weight 1
##    grid columnconfig $b 0 -weight 1
##    grid rowconfigure $b 0 -weight 1
##    grid columnconfig $w 0 -weight 1
##    grid rowconfigure $w 0 -weight 1
##}

# invoke --
# This procedure is called when the user clicks on a demo description. It is
# responsible for invoking the demonstration.
#
# Arguments:
# index -	The index of the character that the user clicked on.

##proc invoke index {
##    global tk_demoDirectory
##    set tags [.t tag names $index]
##    set i [lsearch -glob $tags demo-*]
##    if {$i < 0} {
##	return
##    }
##    set cursor [.t cget -cursor]
##    .t configure -cursor [::ttk::cursor busy]
##    update
##    set demo [string range [lindex $tags $i] 5 end]
##    uplevel 1 [list source [file join $tk_demoDirectory $demo.tcl]]
##    update
##    .t configure -cursor $cursor
##
##    .t tag add visited "$index linestart +1 chars" "$index lineend -1 chars"
##}

# showStatus --
#
#	Show the name of the demo program in the status bar. This procedure is
#	called when the user moves the cursor over a demo description.
#
##proc showStatus index {
##    set tags [.t tag names $index]
##    set i [lsearch -glob $tags demo-*]
##    set cursor [.t cget -cursor]
##    if {$i < 0} {
##	.statusBar.lab config -text " "
##	set newcursor [::ttk::cursor text]
##    } else {
##	set demo [string range [lindex $tags $i] 5 end]
##	.statusBar.lab config -text [mc "Run the \"%s\" sample program" $demo]
##	set newcursor [::ttk::cursor link]
##    }
##    if {$cursor ne $newcursor} {
##	.t config -cursor $newcursor
##    }
##}

# evalShowCode --
#
# Arguments:
# w -		Name of text widget containing code to eval

##proc evalShowCode {w} {
##    set code [$w get 1.0 end-1c]
##    uplevel #0 $code
##}

# showCode --
# This procedure creates a toplevel window that displays the code for a
# demonstration and allows it to be edited and reinvoked.
#
# Arguments:
# w -		The name of the demonstration's window, which can be used to
#		derive the name of the file containing its code.

##proc showCode w {
##    global tk_demoDirectory
##    set file [string range $w 1 end].tcl
##    set top .code
##    if {![winfo exists $top]} {
##	toplevel $top
##	if {[tk windowingsystem] eq "x11"} {wm attributes $top -type dialog}
##
##	set t [frame $top.f]
##	set text [text $t.text -font fixedFont -height 24 -wrap word \
##		      -xscrollcommand [list $t.xscroll set] \
##		      -yscrollcommand [list $t.yscroll set] \
##		      -setgrid 1 -highlightthickness 0 -pady 2 -padx 3]
##	scrollbar $t.xscroll -command [list $t.text xview] -orient horizontal
##	scrollbar $t.yscroll -command [list $t.text yview] -orient vertical
##
##	grid $t.text $t.yscroll -sticky news
##	#grid $t.xscroll
##	grid rowconfigure $t 0 -weight 1
##	grid columnconfig $t 0 -weight 1
##
##	set btns [ttk::frame $top.btns]
##	ttk::separator $btns.sep
##	grid $btns.sep -columnspan 4 -row 0 -sticky ew -pady 2
##	ttk::button $btns.dismiss -text [mc "Dismiss"] \
##	    -default active -command [list destroy $top] \
##	    -image ::img::delete -compound left
##	ttk::button $btns.print   -text [mc "Print Code"] \
##	    -command [list printCode $text $file] \
##	    -image ::img::print -compound left
##	ttk::button $btns.rerun   -text [mc "Rerun Demo"] \
##	    -command [list evalShowCode $text] \
##	    -image ::img::refresh -compound left
##	set buttons [list x $btns.rerun $btns.print $btns.dismiss]
##	grid {*}$buttons -padx 4 -pady 4 
##	grid columnconfigure $btns 0 -weight 1
##	if {[tk windowingsystem] eq "aqua"} {
##	    foreach b [lrange $buttons 1 end] {$b configure -takefocus 0}
##	    grid configure $btns.sep -pady 0
##	    grid configure {*}$buttons -pady {10 12}
##	    grid configure [lindex $buttons 1] -padx {16 4}
##	    grid configure [lindex $buttons end] -padx {4 18}
##	}
##	grid $t    -sticky news
##	grid $btns -sticky ew
##	grid rowconfigure $top 0 -weight 1
##	grid columnconfig $top 0 -weight 1
##
##	bind $top <Return> {
##	    if {[winfo class %W] ne "Text"} { .code.btns.dismiss invoke }
##	}
##	bind $top <Escape> [bind $top <Return>]
##    } else {
##	wm deiconify $top
##	raise $top
##    }
##    wm title $top [mc "Demo code: %s" [file join $tk_demoDirectory $file]]
##    wm iconname $top $file
##    set id [open [file join $tk_demoDirectory $file]]
##    $top.f.text delete 1.0 end
##    $top.f.text insert 1.0 [read $id]
##    $top.f.text mark set insert 1.0
##    close $id
##}

# printCode --
# Prints the source code currently displayed in the See Code dialog. Much
# thanks to Arjen Markus for this.
#
# Arguments:
# w -		Name of text widget containing code to print
# file -		Name of the original file (implicitly for title)

##proc printCode {w file} {
##    set code [$w get 1.0 end-1c]
##
##    set dir "."
##    if {[info exists ::env(HOME)]} {
##	set dir "$::env(HOME)"
##    }
##    if {[info exists ::env(TMP)]} {
##	set dir $::env(TMP)
##    }
##    if {[info exists ::env(TEMP)]} {
##	set dir $::env(TEMP)
##    }
##
##    set filename [file join $dir "tkdemo-$file"]
##    set outfile [open $filename "w"]
##    puts $outfile $code
##    close $outfile
##
##    switch -- $::tcl_platform(platform) {
##	unix {
##	    if {[catch {exec lp -c $filename} msg]} {
##		tk_messageBox -title "Print spooling failure" \
##			-message "Print spooling probably failed: $msg"
##	    }
##	}
##	windows {
##	    if {[catch {PrintTextWin32 $filename} msg]} {
##		tk_messageBox -title "Print spooling failure" \
##			-message "Print spooling probably failed: $msg"
##	    }
##	}
##	default {
##	    tk_messageBox -title "Operation not Implemented" \
##		    -message "Wow! Unknown platform: $::tcl_platform(platform)"
##	}
##    }
##
##    #
##    # Be careful to throw away the temporary file in a gentle manner ...
##    #
##    if {[file exists $filename]} {
##	catch {file delete $filename}
##    }
##}

# PrintTextWin32 --
#    Print a file under Windows using all the "intelligence" necessary
#
# Arguments:
# filename -		Name of the file
#
# Note:
# Taken from the Wiki page by Keith Vetter, "Printing text files under
# Windows".
# Note:
# Do not execute the command in the background: that way we can dispose of the
# file smoothly.
#
##proc PrintTextWin32 {filename} {
##    package require registry
##    set app [auto_execok notepad.exe]
##    set pcmd "$app /p %1"
##    catch {
##	set app [registry get {HKEY_CLASSES_ROOT\.txt} {}]
##	set pcmd [registry get \
##		{HKEY_CLASSES_ROOT\\$app\\shell\\print\\command} {}]
##    }
##
##    regsub -all {%1} $pcmd $filename pcmd
##    puts $pcmd
##
##    regsub -all {\\} $pcmd {\\\\} pcmd
##    set command "[auto_execok start] /min $pcmd"
##    eval exec $command
##}

# tkAboutDialog --
#
#	Pops up a message box with an "about" message
#
##proc tkAboutDialog {} {
##    tk_messageBox -icon info -type ok -title [mc "About Widget Demo"] \
##	    -message [mc "Tk widget demonstration application"] -detail \
##"[mc "Copyright \u00a9 %s" {1996-1997 Sun Microsystems, Inc.}]
##[mc "Copyright \u00a9 %s" {1997-2000 Ajuba Solutions, Inc.}]
##[mc "Copyright \u00a9 %s" {2001-2009 Donal K. Fellows}]
##[mc "Copyright \u00a9 %s" {2002-2007 Daniel A. Steffen}]"
##}

# Local Variables:
# mode: tcl
# End:

root.mainloop()

