diff --git a/src/runtime/mapvfs.config b/src/runtime/mapvfs.config index 1e6e37ab..e0532fa4 100644 --- a/src/runtime/mapvfs.config +++ b/src/runtime/mapvfs.config @@ -34,7 +34,7 @@ tclkit-win64-dyn.exe {punk8win.vfs punksys kit} #2 #tclsh90b2 {punk9win.vfs punk90b2 zip} #3 -#tclsh90b4_piperepl.exe {punk9win.vfs punk90b4 zip} +#tclsh90b4_piperepl.exe {punk9wintk90b2.vfs punk90b4 zip} #tclsh901t.exe {punk92in.vfs punk901t zip} tclsh90magic.exe {punk9magicsplat.vfs punkmagic zipcat} @@ -49,8 +49,7 @@ tclsh902z.exe {punk9win_for_tkruntime.vfs punk902z zip} #https://github.com/apnadkarni/tcl-sfe/releases #tclsfe-x64.exe is not a tk runtime. The versions with tk are 'wish' based so unsuitable. #punk9win_for_tkruntime.vfs is intended for kits which already have Tk -tclsfe-x64.exe {punk9win.vfs punk91 zip} - +tclsfe-x64.exe {punk9wintk903.vfs punk91 zip} #---------------------------------------------- #experiment - what happens when we run against a 'wish' runtime? Will we have stdin stdout problems? diff --git a/src/runtime/vendorlib_vfs.toml b/src/runtime/vendorlib_vfs.toml index a079ff3d..f7c47a29 100644 --- a/src/runtime/vendorlib_vfs.toml +++ b/src/runtime/vendorlib_vfs.toml @@ -25,7 +25,8 @@ [install.tcludp] source = "vendorlib_tcl9/win32-x86_64/tcludp1.0.13" targets = [ - "punk9win.vfs/lib_tcl9", + "punk9wintk90b2.vfs/lib_tcl9", + "punk9wintk903.vfs/lib_tcl9", "punk9win_for_tkruntime.vfs/lib_tcl9", "punk8win.vfs/lib_tcl8", ] diff --git a/src/vfs/punk9wintk903.vfs/bin/tcl9tk90.dll b/src/vfs/punk9wintk903.vfs/bin/tcl9tk90.dll new file mode 100644 index 00000000..75cfa827 Binary files /dev/null and b/src/vfs/punk9wintk903.vfs/bin/tcl9tk90.dll differ diff --git a/src/vfs/punk9win.vfs/bin/tcl9tk90.dll b/src/vfs/punk9wintk903.vfs/bin/tcl9tk90xxx.dll similarity index 100% rename from src/vfs/punk9win.vfs/bin/tcl9tk90.dll rename to src/vfs/punk9wintk903.vfs/bin/tcl9tk90xxx.dll diff --git a/src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/CHANGES.txt b/src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/CHANGES.txt similarity index 100% rename from src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/CHANGES.txt rename to src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/CHANGES.txt diff --git a/src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/MuPDFWidget.tcl b/src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/MuPDFWidget.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/MuPDFWidget.tcl rename to src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/MuPDFWidget.tcl diff --git a/src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/demo/demo.pdf b/src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/demo/demo.pdf similarity index 100% rename from src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/demo/demo.pdf rename to src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/demo/demo.pdf diff --git a/src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/demo/demo.tcl b/src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/demo/demo.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/demo/demo.tcl rename to src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/demo/demo.tcl diff --git a/src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/demo/demo_sharedPdf.tcl b/src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/demo/demo_sharedPdf.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/demo/demo_sharedPdf.tcl rename to src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/demo/demo_sharedPdf.tcl diff --git a/src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/docs/MuPDFWidget.html b/src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/docs/MuPDFWidget.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/docs/MuPDFWidget.html rename to src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/docs/MuPDFWidget.html diff --git a/src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/docs/MuPDFWidget.man b/src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/docs/MuPDFWidget.man similarity index 100% rename from src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/docs/MuPDFWidget.man rename to src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/docs/MuPDFWidget.man diff --git a/src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/MuPDFWidget-2.4/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/MuPDFWidget-2.4/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/itcl4.3.5/itcl.tcl b/src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/itcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/itcl4.3.5/itcl.tcl rename to src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/itcl.tcl diff --git a/src/vfs/punk9win.vfs/lib/itcl4.3.5/itclHullCmds.tcl b/src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/itclHullCmds.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/itcl4.3.5/itclHullCmds.tcl rename to src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/itclHullCmds.tcl diff --git a/src/vfs/punk9win.vfs/lib/itcl4.3.5/itclWidget.tcl b/src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/itclWidget.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/itcl4.3.5/itclWidget.tcl rename to src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/itclWidget.tcl diff --git a/src/vfs/punk9win.vfs/lib/itcl4.3.5/itclstub.lib b/src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/itclstub.lib similarity index 100% rename from src/vfs/punk9win.vfs/lib/itcl4.3.5/itclstub.lib rename to src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/itclstub.lib diff --git a/src/vfs/punk9win.vfs/lib/itcl4.3.5/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/itcl4.3.5/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/itcl4.3.5/tcl9itcl435.dll b/src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/tcl9itcl435.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib/itcl4.3.5/tcl9itcl435.dll rename to src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/tcl9itcl435.dll diff --git a/src/vfs/punk9win.vfs/lib/itcl4.3.5/test_Itcl_CreateObject.tcl b/src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/test_Itcl_CreateObject.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/itcl4.3.5/test_Itcl_CreateObject.tcl rename to src/vfs/punk9wintk903.vfs/lib/itcl4.3.5/test_Itcl_CreateObject.tcl diff --git a/src/vfs/punk9win.vfs/lib/itk4.2.5/Archetype.itk b/src/vfs/punk9wintk903.vfs/lib/itk4.2.5/Archetype.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/itk4.2.5/Archetype.itk rename to src/vfs/punk9wintk903.vfs/lib/itk4.2.5/Archetype.itk diff --git a/src/vfs/punk9win.vfs/lib/itk4.2.5/Toplevel.itk b/src/vfs/punk9wintk903.vfs/lib/itk4.2.5/Toplevel.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/itk4.2.5/Toplevel.itk rename to src/vfs/punk9wintk903.vfs/lib/itk4.2.5/Toplevel.itk diff --git a/src/vfs/punk9win.vfs/lib/itk4.2.5/Widget.itk b/src/vfs/punk9wintk903.vfs/lib/itk4.2.5/Widget.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/itk4.2.5/Widget.itk rename to src/vfs/punk9wintk903.vfs/lib/itk4.2.5/Widget.itk diff --git a/src/vfs/punk9win.vfs/lib/itk4.2.5/itk.tcl b/src/vfs/punk9wintk903.vfs/lib/itk4.2.5/itk.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/itk4.2.5/itk.tcl rename to src/vfs/punk9wintk903.vfs/lib/itk4.2.5/itk.tcl diff --git a/src/vfs/punk9win.vfs/lib/itk4.2.5/itkConfig.sh b/src/vfs/punk9wintk903.vfs/lib/itk4.2.5/itkConfig.sh similarity index 100% rename from src/vfs/punk9win.vfs/lib/itk4.2.5/itkConfig.sh rename to src/vfs/punk9wintk903.vfs/lib/itk4.2.5/itkConfig.sh diff --git a/src/vfs/punk9win.vfs/lib/itk4.2.5/libitkstub.a b/src/vfs/punk9wintk903.vfs/lib/itk4.2.5/libitkstub.a similarity index 100% rename from src/vfs/punk9win.vfs/lib/itk4.2.5/libitkstub.a rename to src/vfs/punk9wintk903.vfs/lib/itk4.2.5/libitkstub.a diff --git a/src/vfs/punk9win.vfs/lib/itk4.2.5/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/itk4.2.5/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/itk4.2.5/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/itk4.2.5/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/itk4.2.5/tcl9itk425.dll b/src/vfs/punk9wintk903.vfs/lib/itk4.2.5/tcl9itk425.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib/itk4.2.5/tcl9itk425.dll rename to src/vfs/punk9wintk903.vfs/lib/itk4.2.5/tcl9itk425.dll diff --git a/src/vfs/punk9win.vfs/lib/itk4.2.5/tclIndex b/src/vfs/punk9wintk903.vfs/lib/itk4.2.5/tclIndex similarity index 100% rename from src/vfs/punk9win.vfs/lib/itk4.2.5/tclIndex rename to src/vfs/punk9wintk903.vfs/lib/itk4.2.5/tclIndex diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/buttonbox b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/buttonbox similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/buttonbox rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/buttonbox diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/calendar b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/calendar similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/calendar rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/calendar diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/canvasprintbox b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/canvasprintbox similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/canvasprintbox rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/canvasprintbox diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/canvasprintdialog b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/canvasprintdialog similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/canvasprintdialog rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/canvasprintdialog diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/catalog b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/catalog similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/catalog rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/catalog diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/checkbox b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/checkbox similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/checkbox rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/checkbox diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/combobox b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/combobox similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/combobox rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/combobox diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/dateentry b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/dateentry similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/dateentry rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/dateentry diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/datefield b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/datefield similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/datefield rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/datefield diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/demo.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/demo.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/demo.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/demo.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/dialog b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/dialog similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/dialog rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/dialog diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/dialogshell b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/dialogshell similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/dialogshell rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/dialogshell diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/disjointlistbox b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/disjointlistbox similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/disjointlistbox rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/disjointlistbox diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/entryfield b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/entryfield similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/entryfield rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/entryfield diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/extbutton b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/extbutton similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/extbutton rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/extbutton diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/extfileselectionbox b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/extfileselectionbox similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/extfileselectionbox rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/extfileselectionbox diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/extfileselectiondialog b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/extfileselectiondialog similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/extfileselectiondialog rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/extfileselectiondialog diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/feedback b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/feedback similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/feedback rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/feedback diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/fileselectionbox b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/fileselectionbox similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/fileselectionbox rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/fileselectionbox diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/fileselectiondialog b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/fileselectiondialog similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/fileselectiondialog rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/fileselectiondialog diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/finddialog b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/finddialog similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/finddialog rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/finddialog diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/hierarchy b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/hierarchy similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/hierarchy rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/hierarchy diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/buttonbox.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/buttonbox.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/buttonbox.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/buttonbox.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/calendar.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/calendar.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/calendar.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/calendar.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/canvasprintbox.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/canvasprintbox.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/canvasprintbox.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/canvasprintbox.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/canvasprintdialog.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/canvasprintdialog.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/canvasprintdialog.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/canvasprintdialog.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/checkbox.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/checkbox.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/checkbox.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/checkbox.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/combobox.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/combobox.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/combobox.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/combobox.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/dateentry.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/dateentry.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/dateentry.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/dateentry.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/datefield.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/datefield.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/datefield.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/datefield.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/dialog.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/dialog.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/dialog.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/dialog.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/dialogshell.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/dialogshell.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/dialogshell.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/dialogshell.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/disjointlistbox.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/disjointlistbox.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/disjointlistbox.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/disjointlistbox.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/entryfield.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/entryfield.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/entryfield.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/entryfield.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/extbutton.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/extbutton.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/extbutton.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/extbutton.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/extfileselectionbox.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/extfileselectionbox.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/extfileselectionbox.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/extfileselectionbox.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/extfileselectiondialog.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/extfileselectiondialog.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/extfileselectiondialog.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/extfileselectiondialog.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/feedback.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/feedback.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/feedback.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/feedback.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/fileselectionbox.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/fileselectionbox.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/fileselectionbox.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/fileselectionbox.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/fileselectiondialog.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/fileselectiondialog.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/fileselectiondialog.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/fileselectiondialog.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/finddialog.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/finddialog.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/finddialog.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/finddialog.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/hierarchy.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/hierarchy.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/hierarchy.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/hierarchy.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/hyperhelp.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/hyperhelp.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/hyperhelp.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/hyperhelp.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/iwidgets4.0.0UserCmds.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/iwidgets4.0.0UserCmds.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/iwidgets4.0.0UserCmds.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/iwidgets4.0.0UserCmds.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/labeledframe.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/labeledframe.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/labeledframe.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/labeledframe.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/labeledwidget.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/labeledwidget.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/labeledwidget.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/labeledwidget.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/mainwindow.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/mainwindow.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/mainwindow.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/mainwindow.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/menubar.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/menubar.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/menubar.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/menubar.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/messagebox.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/messagebox.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/messagebox.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/messagebox.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/messagedialog.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/messagedialog.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/messagedialog.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/messagedialog.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/notebook.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/notebook.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/notebook.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/notebook.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/optionmenu.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/optionmenu.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/optionmenu.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/optionmenu.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/panedwindow.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/panedwindow.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/panedwindow.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/panedwindow.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/promptdialog.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/promptdialog.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/promptdialog.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/promptdialog.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/pushbutton.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/pushbutton.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/pushbutton.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/pushbutton.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/radiobox.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/radiobox.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/radiobox.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/radiobox.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/scopedobject.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/scopedobject.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/scopedobject.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/scopedobject.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/scrolledcanvas.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/scrolledcanvas.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/scrolledcanvas.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/scrolledcanvas.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/scrolledframe.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/scrolledframe.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/scrolledframe.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/scrolledframe.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/scrolledhtml.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/scrolledhtml.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/scrolledhtml.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/scrolledhtml.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/scrolledlistbox.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/scrolledlistbox.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/scrolledlistbox.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/scrolledlistbox.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/scrolledtext.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/scrolledtext.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/scrolledtext.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/scrolledtext.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/selectionbox.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/selectionbox.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/selectionbox.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/selectionbox.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/selectiondialog.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/selectiondialog.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/selectiondialog.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/selectiondialog.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/shell.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/shell.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/shell.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/shell.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/spindate.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/spindate.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/spindate.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/spindate.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/spinint.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/spinint.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/spinint.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/spinint.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/spinner.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/spinner.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/spinner.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/spinner.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/spintime.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/spintime.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/spintime.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/spintime.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/tabnotebook.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/tabnotebook.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/tabnotebook.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/tabnotebook.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/tabset.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/tabset.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/tabset.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/tabset.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/timeentry.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/timeentry.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/timeentry.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/timeentry.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/timefield.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/timefield.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/timefield.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/timefield.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/toolbar.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/toolbar.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/toolbar.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/toolbar.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/watch.n.html b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/watch.n.html similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/html/watch.n.html rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/html/watch.n.html diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/hyperhelp b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/hyperhelp similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/hyperhelp rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/hyperhelp diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/box.xbm b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/box.xbm similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/box.xbm rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/box.xbm diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/clear.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/clear.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/clear.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/clear.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/close.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/close.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/close.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/close.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/copy.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/copy.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/copy.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/copy.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/cut.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/cut.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/cut.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/cut.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/exit.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/exit.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/exit.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/exit.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/find.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/find.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/find.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/find.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/help.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/help.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/help.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/help.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/line.xbm b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/line.xbm similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/line.xbm rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/line.xbm diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/mag.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/mag.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/mag.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/mag.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/new.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/new.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/new.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/new.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/open.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/open.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/open.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/open.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/oval.xbm b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/oval.xbm similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/oval.xbm rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/oval.xbm diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/paste.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/paste.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/paste.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/paste.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/points.xbm b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/points.xbm similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/points.xbm rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/points.xbm diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/poly.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/poly.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/poly.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/poly.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/print.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/print.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/print.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/print.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/ruler.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/ruler.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/ruler.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/ruler.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/save.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/save.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/save.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/save.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/select.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/select.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/select.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/select.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/text.xbm b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/text.xbm similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/images/text.xbm rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/images/text.xbm diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/iwidgets.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/iwidgets.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/iwidgets.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/iwidgets.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/labeledframe b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/labeledframe similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/labeledframe rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/labeledframe diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/labeledwidget b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/labeledwidget similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/labeledwidget rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/labeledwidget diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/mainwindow b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/mainwindow similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/mainwindow rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/mainwindow diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/menubar b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/menubar similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/menubar rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/menubar diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/messagebox b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/messagebox similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/messagebox rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/messagebox diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/messagedialog b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/messagedialog similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/messagedialog rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/messagedialog diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/notebook b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/notebook similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/notebook rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/notebook diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/optionmenu b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/optionmenu similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/optionmenu rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/optionmenu diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/panedwindow b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/panedwindow similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/panedwindow rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/panedwindow diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/promptdialog b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/promptdialog similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/promptdialog rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/promptdialog diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/pushbutton b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/pushbutton similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/pushbutton rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/pushbutton diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/radiobox b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/radiobox similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/radiobox rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/radiobox diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/scopedobject b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/scopedobject similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/scopedobject rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/scopedobject diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/scrolledcanvas b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/scrolledcanvas similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/scrolledcanvas rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/scrolledcanvas diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/scrolledframe b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/scrolledframe similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/scrolledframe rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/scrolledframe diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/scrolledhtml b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/scrolledhtml similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/scrolledhtml rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/scrolledhtml diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/scrolledlistbox b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/scrolledlistbox similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/scrolledlistbox rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/scrolledlistbox diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/scrolledtext b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/scrolledtext similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/scrolledtext rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/scrolledtext diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/selectionbox b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/selectionbox similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/selectionbox rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/selectionbox diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/selectiondialog b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/selectiondialog similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/selectiondialog rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/selectiondialog diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/shell b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/shell similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/shell rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/shell diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/spindate b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/spindate similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/spindate rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/spindate diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/spinint b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/spinint similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/spinint rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/spinint diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/spinner b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/spinner similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/spinner rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/spinner diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/spintime b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/spintime similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/spintime rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/spintime diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/tabnotebook b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/tabnotebook similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/tabnotebook rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/tabnotebook diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/tabset b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/tabset similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/tabset rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/tabset diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/timeentry b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/timeentry similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/timeentry rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/timeentry diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/timefield b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/timefield similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/timefield rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/timefield diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/toolbar b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/toolbar similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/toolbar rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/toolbar diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/watch b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/watch similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/demos/watch rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/demos/watch diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/iwidgets.tcl b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/iwidgets.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/iwidgets.tcl rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/iwidgets.tcl diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/license.terms b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/license.terms similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/license.terms rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/license.terms diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/buttonbox.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/buttonbox.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/buttonbox.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/buttonbox.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/calendar.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/calendar.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/calendar.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/calendar.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/canvasprintbox.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/canvasprintbox.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/canvasprintbox.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/canvasprintbox.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/canvasprintdialog.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/canvasprintdialog.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/canvasprintdialog.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/canvasprintdialog.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/checkbox.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/checkbox.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/checkbox.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/checkbox.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/colors.itcl b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/colors.itcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/colors.itcl rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/colors.itcl diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/combobox.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/combobox.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/combobox.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/combobox.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/dateentry.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/dateentry.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/dateentry.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/dateentry.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/datefield.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/datefield.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/datefield.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/datefield.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/dialog.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/dialog.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/dialog.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/dialog.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/dialogshell.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/dialogshell.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/dialogshell.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/dialogshell.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/disjointlistbox.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/disjointlistbox.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/disjointlistbox.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/disjointlistbox.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/entryfield.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/entryfield.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/entryfield.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/entryfield.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/extbutton.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/extbutton.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/extbutton.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/extbutton.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/extfileselectionbox.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/extfileselectionbox.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/extfileselectionbox.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/extfileselectionbox.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/extfileselectiondialog.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/extfileselectiondialog.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/extfileselectiondialog.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/extfileselectiondialog.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/feedback.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/feedback.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/feedback.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/feedback.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/fileselectionbox.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/fileselectionbox.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/fileselectionbox.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/fileselectionbox.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/fileselectiondialog.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/fileselectiondialog.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/fileselectiondialog.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/fileselectiondialog.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/finddialog.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/finddialog.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/finddialog.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/finddialog.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/hierarchy.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/hierarchy.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/hierarchy.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/hierarchy.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/hyperhelp.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/hyperhelp.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/hyperhelp.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/hyperhelp.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/labeledframe.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/labeledframe.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/labeledframe.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/labeledframe.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/labeledwidget.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/labeledwidget.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/labeledwidget.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/labeledwidget.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/mainwindow.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/mainwindow.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/mainwindow.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/mainwindow.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/menubar.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/menubar.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/menubar.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/menubar.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/messagebox.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/messagebox.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/messagebox.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/messagebox.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/messagedialog.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/messagedialog.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/messagedialog.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/messagedialog.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/notebook.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/notebook.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/notebook.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/notebook.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/optionmenu.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/optionmenu.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/optionmenu.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/optionmenu.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/pane.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/pane.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/pane.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/pane.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/panedwindow.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/panedwindow.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/panedwindow.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/panedwindow.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/promptdialog.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/promptdialog.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/promptdialog.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/promptdialog.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/pushbutton.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/pushbutton.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/pushbutton.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/pushbutton.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/radiobox.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/radiobox.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/radiobox.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/radiobox.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/regexpfield.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/regexpfield.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/regexpfield.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/regexpfield.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/roman.itcl b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/roman.itcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/roman.itcl rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/roman.itcl diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scopedobject.itcl b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scopedobject.itcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scopedobject.itcl rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scopedobject.itcl diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scrolledcanvas.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scrolledcanvas.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scrolledcanvas.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scrolledcanvas.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scrolledframe.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scrolledframe.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scrolledframe.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scrolledframe.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scrolledhtml.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scrolledhtml.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scrolledhtml.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scrolledhtml.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scrolledlistbox.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scrolledlistbox.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scrolledlistbox.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scrolledlistbox.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scrolledtext.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scrolledtext.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scrolledtext.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scrolledtext.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scrolledwidget.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scrolledwidget.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/scrolledwidget.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/scrolledwidget.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/selectionbox.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/selectionbox.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/selectionbox.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/selectionbox.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/selectiondialog.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/selectiondialog.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/selectiondialog.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/selectiondialog.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/shell.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/shell.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/shell.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/shell.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/spindate.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/spindate.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/spindate.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/spindate.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/spinint.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/spinint.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/spinint.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/spinint.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/spinner.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/spinner.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/spinner.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/spinner.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/spintime.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/spintime.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/spintime.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/spintime.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/tabnotebook.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/tabnotebook.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/tabnotebook.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/tabnotebook.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/tabset.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/tabset.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/tabset.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/tabset.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/tclIndex b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/tclIndex similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/tclIndex rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/tclIndex diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/timeentry.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/timeentry.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/timeentry.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/timeentry.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/timefield.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/timefield.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/timefield.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/timefield.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/toolbar.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/toolbar.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/toolbar.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/toolbar.itk diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/unknownimage.gif b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/unknownimage.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/unknownimage.gif rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/unknownimage.gif diff --git a/src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/watch.itk b/src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/watch.itk similarity index 100% rename from src/vfs/punk9win.vfs/lib/iwidgets4.1.2/scripts/watch.itk rename to src/vfs/punk9wintk903.vfs/lib/iwidgets4.1.2/scripts/watch.itk diff --git a/src/vfs/punk9win.vfs/lib/materialicons0.2/MaterialIcons-Regular.svg b/src/vfs/punk9wintk903.vfs/lib/materialicons0.2/MaterialIcons-Regular.svg similarity index 100% rename from src/vfs/punk9win.vfs/lib/materialicons0.2/MaterialIcons-Regular.svg rename to src/vfs/punk9wintk903.vfs/lib/materialicons0.2/MaterialIcons-Regular.svg diff --git a/src/vfs/punk9win.vfs/lib/materialicons0.2/README.md b/src/vfs/punk9wintk903.vfs/lib/materialicons0.2/README.md similarity index 100% rename from src/vfs/punk9win.vfs/lib/materialicons0.2/README.md rename to src/vfs/punk9wintk903.vfs/lib/materialicons0.2/README.md diff --git a/src/vfs/punk9win.vfs/lib/materialicons0.2/materialicons.tcl b/src/vfs/punk9wintk903.vfs/lib/materialicons0.2/materialicons.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/materialicons0.2/materialicons.tcl rename to src/vfs/punk9wintk903.vfs/lib/materialicons0.2/materialicons.tcl diff --git a/src/vfs/punk9win.vfs/lib/materialicons0.2/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/materialicons0.2/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/materialicons0.2/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/materialicons0.2/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/materialicons0.2/show.tcl b/src/vfs/punk9wintk903.vfs/lib/materialicons0.2/show.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/materialicons0.2/show.tcl rename to src/vfs/punk9wintk903.vfs/lib/materialicons0.2/show.tcl diff --git a/src/vfs/punk9win.vfs/lib/pgintcl3.5.2/COPYING.txt b/src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/COPYING.txt similarity index 100% rename from src/vfs/punk9win.vfs/lib/pgintcl3.5.2/COPYING.txt rename to src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/COPYING.txt diff --git a/src/vfs/punk9win.vfs/lib/pgintcl3.5.2/INTERNALS.txt b/src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/INTERNALS.txt similarity index 100% rename from src/vfs/punk9win.vfs/lib/pgintcl3.5.2/INTERNALS.txt rename to src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/INTERNALS.txt diff --git a/src/vfs/punk9win.vfs/lib/pgintcl3.5.2/NEWS.txt b/src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/NEWS.txt similarity index 100% rename from src/vfs/punk9win.vfs/lib/pgintcl3.5.2/NEWS.txt rename to src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/NEWS.txt diff --git a/src/vfs/punk9win.vfs/lib/pgintcl3.5.2/README.txt b/src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/README.txt similarity index 100% rename from src/vfs/punk9win.vfs/lib/pgintcl3.5.2/README.txt rename to src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/README.txt diff --git a/src/vfs/punk9win.vfs/lib/pgintcl3.5.2/REFERENCE.txt b/src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/REFERENCE.txt similarity index 100% rename from src/vfs/punk9win.vfs/lib/pgintcl3.5.2/REFERENCE.txt rename to src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/REFERENCE.txt diff --git a/src/vfs/punk9win.vfs/lib/pgintcl3.5.2/pgin.tcl b/src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/pgin.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/pgintcl3.5.2/pgin.tcl rename to src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/pgin.tcl diff --git a/src/vfs/punk9win.vfs/lib/pgintcl3.5.2/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/pgintcl3.5.2/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/pgintcl3.5.2/tkpsql.tcl b/src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/tkpsql.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/pgintcl3.5.2/tkpsql.tcl rename to src/vfs/punk9wintk903.vfs/lib/pgintcl3.5.2/tkpsql.tcl diff --git a/src/vfs/punk9win.vfs/lib/publisher2.0/PUBLISHER.txt b/src/vfs/punk9wintk903.vfs/lib/publisher2.0/PUBLISHER.txt similarity index 100% rename from src/vfs/punk9win.vfs/lib/publisher2.0/PUBLISHER.txt rename to src/vfs/punk9wintk903.vfs/lib/publisher2.0/PUBLISHER.txt diff --git a/src/vfs/punk9win.vfs/lib/publisher2.0/REFERENCE.txt b/src/vfs/punk9wintk903.vfs/lib/publisher2.0/REFERENCE.txt similarity index 100% rename from src/vfs/punk9win.vfs/lib/publisher2.0/REFERENCE.txt rename to src/vfs/punk9wintk903.vfs/lib/publisher2.0/REFERENCE.txt diff --git a/src/vfs/punk9win.vfs/lib/publisher2.0/USERGUIDE.txt b/src/vfs/punk9wintk903.vfs/lib/publisher2.0/USERGUIDE.txt similarity index 100% rename from src/vfs/punk9win.vfs/lib/publisher2.0/USERGUIDE.txt rename to src/vfs/punk9wintk903.vfs/lib/publisher2.0/USERGUIDE.txt diff --git a/src/vfs/punk9win.vfs/lib/publisher2.0/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/publisher2.0/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/publisher2.0/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/publisher2.0/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/publisher2.0/publisher.tcl b/src/vfs/punk9wintk903.vfs/lib/publisher2.0/publisher.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/publisher2.0/publisher.tcl rename to src/vfs/punk9wintk903.vfs/lib/publisher2.0/publisher.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/autoscroll/autoscroll.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/autoscroll/autoscroll.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/autoscroll/autoscroll.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/autoscroll/autoscroll.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/autoscroll/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/autoscroll/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/autoscroll/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/autoscroll/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_drag.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_drag.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_drag.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_drag.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_ecircle.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_ecircle.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_ecircle.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_ecircle.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_epoints.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_epoints.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_epoints.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_epoints.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_epolyline.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_epolyline.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_epolyline.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_epolyline.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_equad.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_equad.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_equad.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_equad.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_erectangle.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_erectangle.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_erectangle.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_erectangle.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_gradient.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_gradient.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_gradient.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_gradient.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_highlight.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_highlight.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_highlight.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_highlight.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_mvg.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_mvg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_mvg.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_mvg.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_pdf.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_pdf.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_pdf.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_pdf.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_snap.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_snap.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_snap.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_snap.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_sqmap.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_sqmap.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_sqmap.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_sqmap.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_tags.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_tags.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_tags.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_tags.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_trlines.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_trlines.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_trlines.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_trlines.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_zoom.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_zoom.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/canvas_zoom.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/canvas_zoom.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/canvas/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/canvas/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/canvas/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/chatwidget/chatwidget.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/chatwidget/chatwidget.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/chatwidget/chatwidget.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/chatwidget/chatwidget.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/chatwidget/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/chatwidget/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/chatwidget/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/chatwidget/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/bindDown.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/bindDown.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/bindDown.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/bindDown.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/controlwidget.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/controlwidget.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/controlwidget.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/controlwidget.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/led.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/led.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/led.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/led.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/radioMatrix.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/radioMatrix.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/radioMatrix.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/radioMatrix.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/rdial.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/rdial.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/rdial.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/rdial.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/tachometer.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/tachometer.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/tachometer.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/tachometer.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/vertical_meter.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/vertical_meter.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/vertical_meter.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/vertical_meter.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/voltmeter.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/voltmeter.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/controlwidget/voltmeter.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/controlwidget/voltmeter.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/crosshair/crosshair.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/crosshair/crosshair.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/crosshair/crosshair.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/crosshair/crosshair.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/crosshair/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/crosshair/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/crosshair/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/crosshair/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/ctext/ctext.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/ctext/ctext.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/ctext/ctext.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/ctext/ctext.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/ctext/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/ctext/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/ctext/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/ctext/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/cursor/cursor.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/cursor/cursor.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/cursor/cursor.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/cursor/cursor.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/cursor/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/cursor/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/cursor/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/cursor/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/datefield/datefield.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/datefield/datefield.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/datefield/datefield.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/datefield/datefield.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/datefield/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/datefield/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/datefield/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/datefield/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/application.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/application.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/application.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/application.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/attributes.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/attributes.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/attributes.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/attributes.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/basic.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/basic.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/basic.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/basic.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/core.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/core.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/core.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/core.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/diagram.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/diagram.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/diagram.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/diagram.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/direction.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/direction.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/direction.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/direction.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/element.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/element.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/element.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/element.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/navigation.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/navigation.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/navigation.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/navigation.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/point.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/point.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/diagrams/point.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/diagrams/point.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/getstring/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/getstring/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/getstring/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/getstring/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/getstring/tk_getString.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/getstring/tk_getString.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/getstring/tk_getString.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/getstring/tk_getString.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/history/history.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/history/history.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/history/history.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/history/history.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/history/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/history/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/history/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/history/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/ico/ico.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/ico/ico.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/ico/ico.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/ico/ico.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/ico/ico0.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/ico/ico0.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/ico/ico0.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/ico/ico0.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/ico/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/ico/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/ico/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/ico/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/ipentry/ipentry.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/ipentry/ipentry.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/ipentry/ipentry.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/ipentry/ipentry.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/ipentry/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/ipentry/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/ipentry/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/ipentry/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/khim/ROOT.msg b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/ROOT.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/khim/ROOT.msg rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/ROOT.msg diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/khim/cs.msg b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/cs.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/khim/cs.msg rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/cs.msg diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/khim/da.msg b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/da.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/khim/da.msg rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/da.msg diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/khim/de.msg b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/de.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/khim/de.msg rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/de.msg diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/khim/en.msg b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/en.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/khim/en.msg rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/en.msg diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/khim/es.msg b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/es.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/khim/es.msg rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/es.msg diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/khim/khim.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/khim.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/khim/khim.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/khim.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/khim/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/khim/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/khim/pl.msg b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/pl.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/khim/pl.msg rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/pl.msg diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/khim/ru.msg b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/ru.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/khim/ru.msg rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/ru.msg diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/khim/uk.msg b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/uk.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/khim/uk.msg rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/khim/uk.msg diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/area-display.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/area-display.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/area-display.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/area-display.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/area-file.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/area-file.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/area-file.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/area-file.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/area-map-display.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/area-map-display.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/area-map-display.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/area-map-display.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/area-store-fs.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/area-store-fs.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/area-store-fs.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/area-store-fs.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/area-store-mem.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/area-store-mem.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/area-store-mem.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/area-store-mem.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/area-table-display.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/area-table-display.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/area-table-display.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/area-table-display.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/box-display.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-display.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/box-display.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-display.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/box-entry.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-entry.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/box-entry.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-entry.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/box-file.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-file.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/box-file.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-file.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/box-map-display.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-map-display.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/box-map-display.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-map-display.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/box-store-fs.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-store-fs.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/box-store-fs.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-store-fs.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/box-store-mem.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-store-mem.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/box-store-mem.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-store-mem.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/box-table-display.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-table-display.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/box-table-display.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/box-table-display.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/display.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/display.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/display.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/display.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/mark.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/mark.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/mark.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/mark.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/point-file.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/point-file.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/point-file.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/point-file.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/point-map-display.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/point-map-display.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/point-map-display.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/point-map-display.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/point-store-fs.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/point-store-fs.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/point-store-fs.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/point-store-fs.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/point-store-mem.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/point-store-mem.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/point-store-mem.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/point-store-mem.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/point-table-display.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/point-table-display.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/point-table-display.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/point-table-display.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/provider-osm.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/provider-osm.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/provider-osm.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/provider-osm.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/track-display.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-display.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/track-display.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-display.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/track-entry.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-entry.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/track-entry.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-entry.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/track-file.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-file.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/track-file.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-file.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/track-map-display.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-map-display.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/track-map-display.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-map-display.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/track-store-fs.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-store-fs.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/track-store-fs.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-store-fs.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/track-store-mem.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-store-mem.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/track-store-mem.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-store-mem.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/map/track-table-display.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-table-display.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/map/track-table-display.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/map/track-table-display.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/mentry/mentry.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/mentry.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/mentry/mentry.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/mentry.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/mentry/mentryCommon.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/mentryCommon.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/mentry/mentryCommon.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/mentryCommon.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/mentry/mentry_tile.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/mentry_tile.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/mentry/mentry_tile.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/mentry_tile.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/mentry/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/mentry/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mentryDateTime.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mentryDateTime.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mentryDateTime.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mentryDateTime.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mentryFixedPoint.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mentryFixedPoint.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mentryFixedPoint.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mentryFixedPoint.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mentryIPAddr.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mentryIPAddr.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mentryIPAddr.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mentryIPAddr.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mentryIPv6Addr.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mentryIPv6Addr.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mentryIPv6Addr.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mentryIPv6Addr.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mentryThemes.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mentryThemes.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mentryThemes.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mentryThemes.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mentryWidget.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mentryWidget.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mentryWidget.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mentryWidget.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mwutil/mwutil.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mwutil/mwutil.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mwutil/mwutil.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mwutil/mwutil.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mwutil/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mwutil/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/mwutil/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/mwutil/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/tclIndex b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/tclIndex similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/mentry/scripts/tclIndex rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/mentry/scripts/tclIndex diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/menubar/debug.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/menubar/debug.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/menubar/debug.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/menubar/debug.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/menubar/menubar.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/menubar/menubar.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/menubar/menubar.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/menubar/menubar.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/menubar/node.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/menubar/node.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/menubar/node.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/menubar/node.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/menubar/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/menubar/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/menubar/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/menubar/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/menubar/tree.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/menubar/tree.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/menubar/tree.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/menubar/tree.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/notifywindow/notifywindow.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/notifywindow/notifywindow.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/notifywindow/notifywindow.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/notifywindow/notifywindow.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/notifywindow/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/notifywindow/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/notifywindow/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/notifywindow/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/ntext/ntext.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/ntext/ntext.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/ntext/ntext.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/ntext/ntext.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/ntext/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/ntext/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/ntext/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/ntext/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/persistentSelection/persistentSelection.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/persistentSelection/persistentSelection.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/persistentSelection/persistentSelection.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/persistentSelection/persistentSelection.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/persistentSelection/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/persistentSelection/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/persistentSelection/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/persistentSelection/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plot3d.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plot3d.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plot3d.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plot3d.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotanim.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotanim.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotanim.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotanim.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotannot.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotannot.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotannot.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotannot.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotaxis.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotaxis.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotaxis.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotaxis.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotbind.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotbind.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotbind.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotbind.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotbusiness.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotbusiness.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotbusiness.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotbusiness.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotchart.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotchart.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotchart.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotchart.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotcombined.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotcombined.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotcombined.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotcombined.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotconfig.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotconfig.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotconfig.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotconfig.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotcontour.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotcontour.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotcontour.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotcontour.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotdendrogram.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotdendrogram.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotdendrogram.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotdendrogram.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotgantt.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotgantt.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotgantt.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotgantt.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotobject.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotobject.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotobject.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotobject.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotpack.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotpack.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotpack.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotpack.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotpriv.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotpriv.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotpriv.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotpriv.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotscada.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotscada.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotscada.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotscada.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotspecial.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotspecial.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotspecial.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotspecial.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotstatustimeline.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotstatustimeline.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plotstatustimeline.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plotstatustimeline.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plottable.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plottable.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/plottable.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/plottable.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/scaling.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/scaling.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/scaling.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/scaling.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/xyplot.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/xyplot.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/plotchart/xyplot.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/plotchart/xyplot.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/attrib.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/attrib.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/attrib.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/attrib.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/notebookImages.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/notebookImages.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/notebookImages.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/notebookImages.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/pagesman.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/pagesman.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/pagesman.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/pagesman.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/plainnotebook.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/plainnotebook.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/plainnotebook.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/plainnotebook.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/scrollableframe.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/scrollableframe.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/scrollableframe.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/scrollableframe.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/scrollarea.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/scrollarea.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/scrollarea.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/scrollarea.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/scrollednotebook.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/scrollednotebook.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/scrollednotebook.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/scrollednotebook.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/scrollsync.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/scrollsync.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/scrollsync.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/scrollsync.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/tclIndex b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/tclIndex similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/tclIndex rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/tclIndex diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/indicatorImgs/gifIndicatorImgs.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/indicatorImgs/gifIndicatorImgs.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/indicatorImgs/gifIndicatorImgs.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/indicatorImgs/gifIndicatorImgs.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/indicatorImgs/svgIndicatorImgs.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/indicatorImgs/svgIndicatorImgs.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/indicatorImgs/svgIndicatorImgs.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/indicatorImgs/svgIndicatorImgs.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/indicatorImgs/tclIndex b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/indicatorImgs/tclIndex similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/indicatorImgs/tclIndex rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/indicatorImgs/tclIndex diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/mwutil.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/mwutil.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/mwutil.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/mwutil.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/scaleutil.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/scaleutil.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/scaleutil.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/scaleutil.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/themepatch.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/themepatch.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/utils/themepatch.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/utils/themepatch.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/wheelEvent.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/wheelEvent.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scripts/wheelEvent.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scripts/wheelEvent.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scrollutil.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scrollutil.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scrollutil.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scrollutil.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scrollutilCommon.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scrollutilCommon.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scrollutilCommon.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scrollutilCommon.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scrollutil_tile.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scrollutil_tile.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/scrollutil/scrollutil_tile.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/scrollutil/scrollutil_tile.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/shtmlview/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/shtmlview/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/shtmlview/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/shtmlview/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/shtmlview/shtmlview-doctools.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/shtmlview/shtmlview-doctools.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/shtmlview/shtmlview-doctools.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/shtmlview/shtmlview-doctools.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/shtmlview/shtmlview-mkdoc.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/shtmlview/shtmlview-mkdoc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/shtmlview/shtmlview-mkdoc.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/shtmlview/shtmlview-mkdoc.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/shtmlview/shtmlview.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/shtmlview/shtmlview.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/shtmlview/shtmlview.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/shtmlview/shtmlview.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/style/as.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/style/as.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/style/as.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/style/as.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/style/lobster.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/style/lobster.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/style/lobster.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/style/lobster.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/style/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/style/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/style/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/style/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/style/style.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/style/style.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/style/style.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/style/style.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/swaplist/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/swaplist/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/swaplist/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/swaplist/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/swaplist/swaplist.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/swaplist/swaplist.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/swaplist/swaplist.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/swaplist/swaplist.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/pencil.cur b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/pencil.cur similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/pencil.cur rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/pencil.cur diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistBind.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistBind.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistBind.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistBind.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistConfig.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistConfig.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistConfig.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistConfig.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistEdit.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistEdit.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistEdit.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistEdit.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistImages.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistImages.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistImages.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistImages.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistMove.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistMove.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistMove.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistMove.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistSort.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistSort.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistSort.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistSort.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistThemes.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistThemes.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistThemes.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistThemes.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistUtil.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistUtil.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistUtil.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistUtil.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistWidget.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistWidget.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tablelistWidget.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tablelistWidget.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tclIndex b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tclIndex similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/tclIndex rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/tclIndex diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/indicatorImgs/gifIndicatorImgs.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/indicatorImgs/gifIndicatorImgs.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/indicatorImgs/gifIndicatorImgs.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/indicatorImgs/gifIndicatorImgs.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/indicatorImgs/svgIndicatorImgs.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/indicatorImgs/svgIndicatorImgs.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/indicatorImgs/svgIndicatorImgs.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/indicatorImgs/svgIndicatorImgs.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/indicatorImgs/tclIndex b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/indicatorImgs/tclIndex similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/indicatorImgs/tclIndex rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/indicatorImgs/tclIndex diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/mwutil.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/mwutil.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/mwutil.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/mwutil.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/scaleutil.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/scaleutil.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/scaleutil.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/scaleutil.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/scaleutilMisc.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/scaleutilMisc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/scaleutilMisc.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/scaleutilMisc.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/themepatch.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/themepatch.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/scripts/utils/themepatch.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/scripts/utils/themepatch.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/tablelist.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/tablelist.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/tablelist.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/tablelist.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/tablelistCommon.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/tablelistCommon.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/tablelistCommon.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/tablelistCommon.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/tablelist_tile.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/tablelist_tile.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tablelist/tablelist_tile.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tablelist/tablelist_tile.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/text/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/text/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/text/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/text/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/text/txmixins.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/text/txmixins.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/text/txmixins.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/text/txmixins.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/boxlabel.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/boxlabel.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/boxlabel.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/boxlabel.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/canlabel.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/canlabel.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/canlabel.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/canlabel.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/labarray.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/labarray.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/labarray.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/labarray.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/objselec.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/objselec.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/objselec.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/objselec.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/perilabel.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/perilabel.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/perilabel.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/perilabel.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/pie.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/pie.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/pie.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/pie.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/pielabel.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/pielabel.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/pielabel.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/pielabel.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/relirect.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/relirect.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/relirect.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/relirect.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/selector.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/selector.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/selector.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/selector.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/slice.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/slice.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/slice.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/slice.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/tkpiechart.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/tkpiechart.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tkpiechart/tkpiechart.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tkpiechart/tkpiechart.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tooltip/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tooltip/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tooltip/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tooltip/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tooltip/tipstack.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tooltip/tipstack.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tooltip/tipstack.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tooltip/tipstack.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/tooltip/tooltip.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/tooltip/tooltip.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/tooltip/tooltip.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/tooltip/tooltip.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/treeview/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/treeview/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/treeview/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/treeview/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/treeview/tvmixins.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/treeview/tvmixins.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/treeview/tvmixins.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/treeview/tvmixins.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/wcb/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/wcb/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/tclIndex b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/tclIndex similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/tclIndex rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/tclIndex diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/wcbCommon.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/wcbCommon.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/wcbCommon.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/wcbCommon.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/wcbEntry.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/wcbEntry.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/wcbEntry.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/wcbEntry.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/wcbListbox.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/wcbListbox.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/wcbListbox.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/wcbListbox.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/wcbTablelist.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/wcbTablelist.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/wcbTablelist.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/wcbTablelist.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/wcbText.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/wcbText.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/wcbText.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/wcbText.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/wcbTreeview.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/wcbTreeview.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/wcb/scripts/wcbTreeview.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/scripts/wcbTreeview.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/wcb/wcb.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/wcb.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/wcb/wcb.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/wcb/wcb.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/arrowb.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/arrowb.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/arrowb.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/arrowb.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/calendar.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/calendar.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/calendar.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/calendar.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/dateentry.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/dateentry.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/dateentry.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/dateentry.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/dialog.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/dialog.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/dialog.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/dialog.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/mentry.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/mentry.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/mentry.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/mentry.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/panelframe.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/panelframe.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/panelframe.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/panelframe.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/ruler.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/ruler.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/ruler.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/ruler.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/scrollw.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/scrollw.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/scrollw.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/scrollw.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/statusbar.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/statusbar.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/statusbar.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/statusbar.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/stext.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/stext.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/stext.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/stext.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/superframe.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/superframe.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/superframe.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/superframe.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/toolbar.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/toolbar.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/toolbar.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/toolbar.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widget/widget.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/widget.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widget/widget.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widget/widget.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetPlus/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetPlus/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetPlus/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetPlus/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetPlus/widgetPlus.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetPlus/widgetPlus.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetPlus/widgetPlus.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetPlus/widgetPlus.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/icons/add.png b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/icons/add.png similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/icons/add.png rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/icons/add.png diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/icons/arrow_down.png b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/icons/arrow_down.png similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/icons/arrow_down.png rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/icons/arrow_down.png diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/icons/arrow_up.png b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/icons/arrow_up.png similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/icons/arrow_up.png rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/icons/arrow_up.png diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/icons/delete.png b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/icons/delete.png similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/icons/delete.png rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/icons/delete.png diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/icons/folder_explore.png b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/icons/folder_explore.png similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/icons/folder_explore.png rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/icons/folder_explore.png diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/listentry.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/listentry.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/listentry.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/listentry.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/listsimple.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/listsimple.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/listsimple.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/listsimple.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/msgs/de.msg b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/msgs/de.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/msgs/de.msg rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/msgs/de.msg diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/msgs/en.msg b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/msgs/en.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/msgs/en.msg rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/msgs/en.msg diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/msgs/root.msg b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/msgs/root.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/msgs/root.msg rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/msgs/root.msg diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetl/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetl/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetv/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetv/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetv/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetv/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib/tklib0.9/widgetv/validator.tcl b/src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetv/validator.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib/tklib0.9/widgetv/validator.tcl rename to src/vfs/punk9wintk903.vfs/lib/tklib0.9/widgetv/validator.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Ffidl0.9.1/Ffidl091.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Ffidl0.9.1/Ffidl091.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Ffidl0.9.1/Ffidl091.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Ffidl0.9.1/Ffidl091.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Ffidl0.9.1/ffidlrt.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/Ffidl0.9.1/ffidlrt.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Ffidl0.9.1/ffidlrt.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Ffidl0.9.1/ffidlrt.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Ffidl0.9.1/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/Ffidl0.9.1/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Ffidl0.9.1/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Ffidl0.9.1/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/libjpegtclstub.a b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/libjpegtclstub.a similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/libjpegtclstub.a rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/libjpegtclstub.a diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/libpngtclstub.a b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/libpngtclstub.a similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/libpngtclstub.a rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/libpngtclstub.a diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/libtifftclstub.a b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/libtifftclstub.a similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/libtifftclstub.a rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/libtifftclstub.a diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/libtkimgstub.a b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/libtkimgstub.a similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/libtkimgstub.a rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/libtkimgstub.a diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/libzlibtclstub.a b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/libzlibtclstub.a similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/libzlibtclstub.a rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/libzlibtclstub.a diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9jpegtcl960.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9jpegtcl960.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9jpegtcl960.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9jpegtcl960.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9pngtcl1644.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9pngtcl1644.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9pngtcl1644.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9pngtcl1644.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tifftcl470.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tifftcl470.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tifftcl470.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tifftcl470.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimg201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimg201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimg201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimg201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgbmp201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgbmp201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgbmp201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgbmp201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgdted201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgdted201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgdted201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgdted201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgflir201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgflir201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgflir201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgflir201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimggif201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimggif201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimggif201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimggif201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgico201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgico201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgico201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgico201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgjpeg201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgjpeg201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgjpeg201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgjpeg201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgpcx201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgpcx201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgpcx201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgpcx201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgpixmap201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgpixmap201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgpixmap201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgpixmap201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgpng201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgpng201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgpng201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgpng201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgppm201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgppm201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgppm201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgppm201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgps201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgps201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgps201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgps201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgraw201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgraw201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgraw201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgraw201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgsgi201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgsgi201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgsgi201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgsgi201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgsun201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgsun201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgsun201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgsun201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgtga201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgtga201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgtga201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgtga201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgtiff201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgtiff201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgtiff201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgtiff201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgwindow201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgwindow201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgwindow201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgwindow201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgxbm201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgxbm201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgxbm201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgxbm201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgxpm201.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgxpm201.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9tkimgxpm201.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9tkimgxpm201.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9zlibtcl131.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9zlibtcl131.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.0.1/tcl9zlibtcl131.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.0.1/tcl9zlibtcl131.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/jpegtclstub.lib b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/jpegtclstub.lib similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/jpegtclstub.lib rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/jpegtclstub.lib diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/pngtclstub.lib b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/pngtclstub.lib similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/pngtclstub.lib rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/pngtclstub.lib diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9jpegtcl960.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9jpegtcl960.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9jpegtcl960.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9jpegtcl960.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9pngtcl1648.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9pngtcl1648.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9pngtcl1648.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9pngtcl1648.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tifftcl470.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tifftcl470.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tifftcl470.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tifftcl470.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimg210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimg210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimg210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimg210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgbmp210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgbmp210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgbmp210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgbmp210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgdted210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgdted210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgdted210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgdted210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgflir210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgflir210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgflir210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgflir210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimggif210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimggif210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimggif210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimggif210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgico210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgico210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgico210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgico210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgjpeg210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgjpeg210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgjpeg210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgjpeg210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgpcx210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgpcx210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgpcx210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgpcx210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgpixmap210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgpixmap210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgpixmap210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgpixmap210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgpng210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgpng210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgpng210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgpng210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgppm210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgppm210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgppm210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgppm210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgps210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgps210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgps210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgps210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgraw210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgraw210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgraw210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgraw210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgsgi210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgsgi210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgsgi210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgsgi210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgsun210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgsun210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgsun210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgsun210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgtga210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgtga210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgtga210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgtga210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgtiff210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgtiff210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgtiff210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgtiff210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgwindow210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgwindow210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgwindow210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgwindow210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgxbm210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgxbm210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgxbm210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgxbm210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgxpm210.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgxpm210.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9tkimgxpm210.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9tkimgxpm210.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9zlibtcl131.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9zlibtcl131.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tcl9zlibtcl131.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tcl9zlibtcl131.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tifftclstub.lib b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tifftclstub.lib similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tifftclstub.lib rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tifftclstub.lib diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tkimgstub.lib b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tkimgstub.lib similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/tkimgstub.lib rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/tkimgstub.lib diff --git a/src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/zlibtclstub.lib b/src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/zlibtclstub.lib similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/Img2.1.0/zlibtclstub.lib rename to src/vfs/punk9wintk903.vfs/lib_tcl9/Img2.1.0/zlibtclstub.lib diff --git a/src/vfs/punk9win.vfs/lib_tcl9/TclCurl8.15.0/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/TclCurl8.15.0/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/TclCurl8.15.0/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/TclCurl8.15.0/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/TclCurl8.15.0/tcl9TclCurl8150.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/TclCurl8.15.0/tcl9TclCurl8150.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/TclCurl8.15.0/tcl9TclCurl8150.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/TclCurl8.15.0/tcl9TclCurl8150.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/TclCurl8.15.0/tclcurl.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/TclCurl8.15.0/tclcurl.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/TclCurl8.15.0/tclcurl.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/TclCurl8.15.0/tclcurl.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/TclCurl8.15.0/tclcurl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/TclCurl8.15.0/tclcurl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/TclCurl8.15.0/tclcurl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/TclCurl8.15.0/tclcurl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/TclCurl8.15.0/tclcurl_multi.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/TclCurl8.15.0/tclcurl_multi.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/TclCurl8.15.0/tclcurl_multi.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/TclCurl8.15.0/tclcurl_multi.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/TclCurl8.15.0/tclcurl_share.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/TclCurl8.15.0/tclcurl_share.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/TclCurl8.15.0/tclcurl_share.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/TclCurl8.15.0/tclcurl_share.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/ankh1.1/critcl-rt.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/ankh1.1/critcl-rt.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/ankh1.1/critcl-rt.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/ankh1.1/critcl-rt.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/ankh1.1/license.terms b/src/vfs/punk9wintk903.vfs/lib_tcl9/ankh1.1/license.terms similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/ankh1.1/license.terms rename to src/vfs/punk9wintk903.vfs/lib_tcl9/ankh1.1/license.terms diff --git a/src/vfs/punk9win.vfs/lib_tcl9/ankh1.1/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/ankh1.1/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/ankh1.1/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/ankh1.1/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/ankh1.1/tcl/policy_1.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/ankh1.1/tcl/policy_1.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/ankh1.1/tcl/policy_1.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/ankh1.1/tcl/policy_1.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/ankh1.1/teapot.txt b/src/vfs/punk9wintk903.vfs/lib_tcl9/ankh1.1/teapot.txt similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/ankh1.1/teapot.txt rename to src/vfs/punk9wintk903.vfs/lib_tcl9/ankh1.1/teapot.txt diff --git a/src/vfs/punk9win.vfs/lib_tcl9/ankh1.1/win32-x86_64/ankh.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/ankh1.1/win32-x86_64/ankh.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/ankh1.1/win32-x86_64/ankh.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/ankh1.1/win32-x86_64/ankh.dll diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/CHANGELOG.md b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/CHANGELOG.md new file mode 100644 index 00000000..1fb09485 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/CHANGELOG.md @@ -0,0 +1,886 @@ +# Last changes: + + +Version `4.4.10 (7 Sep'24)` + + - CHANGE: method fillGutter: more simple in use: less "after" (thanks to George) + + +Version `4.4.9 (7 Aug'24)` + + - NEW : method bindGutter makes bindings for a text and its gutter + + +Version `4.4.8 (24 Jul'24)` + + - NEW : ent & cbx widgets for toolbar + - CHANGE: apave::splitGeometry: handle X,Y coordinates as is; neg coordinates flag + - CHANGE: tiny clearance + + +Version `4.4.6 (29 Jun'24)` + + - NEW : Enter key for treeview = Return key + - CHANGE: hl_tcl 1.1.4 + + +Version `4.4.5 (3 May'24)` + + - NEW : allow uppercased frame for nbk tab (resulting in method of same name) + - NEW : allow additional attributes for toolbar items, e.g. -font + - NEW : proc DefaultCS: gets default color scheme + - NEW : proc InvertBg: inverted color + - NEW : method onTop: -topmost attribute + - CHANGE: "23: Dusk" color scheme be close to Tk 8.7+ dark palette + - CHANGE: `-takefocus 0` as default for some widgets + + +Version `4.4.4 (24 Apr'24)` + + - BUGFIX: mistaken "split $centerme", replaced by apave::splitGeometry + - NEW : namespace export: textsplit, focusByForce & Option's + - CHANGE: tk_optionCascade: reverted to v4.4.1 + + +Version `4.4.3 (22 Apr'24)` + + - NEW : `-waitme` option of showModal: wait var/idle/time before `deiconify` + - NEW : namespace export: obj openDoc readTextFile writeTextFile undoIn undoOut + - NEW : checkGeometry: check window's geometry + - CHANGE: focusApp: restore widget's focus as well + - CHANGE: pavedPath: Modalwin variable + - CHANGE: tk_optionCascade: `after idle optionCascade_add` for better performance + - CHANGE: klnd: Windows' issues & clearance + - CHANGE: umbrella icon + + +Version `4.4.1 (3 Apr'24)` + + - NEW : apave.tcl: batch of procs moved from alited project + - NEW : `-focus` option of showModal: if "Tab", try to focus 1st widget Tabbed + - NEW : calendars: -weeks option shows (1, 2) or hides (0) week numbers + - NEW : focusApp: restore app's focused toplevel after focusing app + - CHANGE: refactoring code + - CHANGE: hl_tcl 1.1.3, bartabs 1.6.9, baltip 1.6.2 + + +Version `4.3.10 (28 Feb'24)` + + - BUGFIX: *-initialdir* of file chooser: fails at dir with spaces + + +Version `4.3.9 (7 Feb'24)` + + - NEW : proc blinkWidgetImage to flash icons + - NEW : method askForSave to set/get flag "ask for saving" + + +Version `4.3.8 (18 Jan'24)` + + - BUGFIX: edit text dialog: asking "Save changes" fails at 2nd run + - NEW : %w wildcard (current window) in *-onclose* option + - CHANGE: *-onclose* command added to dialog buttons' handlers + - CHANGE: more rigorous checking *-onclose* and *-ch* used together ("string match destroy") + + +Version `4.3.6 (3 Jan'24)` + + - BUGFIX: *plastic* ttk theme + *-2. Default* CS => error (-fg / -bg / $Fgbut / $Bgbut) + - CHANGE: -highlightcolor of "." for *classic* ttk theme + + +Version `4.3.5 (27 Dec'23)` + + - NEW : Ctrl+B / Ctrl+E to move the cursor to real beginning / end of wrapped line + - CHANGE: method themeWindow: *-arrowcolor* option (for "Tk 9.0 + dark CS" case) + - CHANGE: method AddButtonIcon: correct `res` call for *-com integer* option + + +Version `4.3.4 (20 Dec'23)` + + - CHANGE: *-undeline* options for menu and notebook (Tk 9.0 fixed) + + +Version `4.3.3 (13 Dec'23)` + + - NEW : method chooserPath: path to chooser's entry/label + - CHANGE: method Replace_chooser: restored *-validatecommand* + - CHANGE: proc splitGeometry: check result for x, y + + +Version `4.3.2 (5 Dec'23)` + + - BUGFIX: Tcl 9.0 bug making Alt+key unusable (*-underline* option of menubar items) + + +Version `4.3.1 (1 Dec'23)` + + - CHANGE: checking "namespace exists ::tablelist:" + + +Version `4.3.0 (30 Nov'23)` + + - NEW : way to Tcl 9.0 + - CHANGE: geometry stuff checked + + +Version `4.2.2 (22 Nov'23)` + + - NEW : baltip package's option *-eternal* + - NEW : date picker: OK button picks selected day, F3 key goes to current day + - CHANGE: date pickers cleared a little + + +Version `4.2.1 (15 Nov'23)` + + - BUGFIX: env(TCLLIBPATH) cleared wrongly in apavebase.tcl + - BUGFIX: highlighting a word at beginning of line (e.g. "namespace") + - CHANGE: color picker + + +Version `4.2.0 (8 Nov'23)` + + - BUGFIX: for klnd & klnd2: disable clicks on empty cells + - NEW : de.msg, es.msg for pickers + - NEW : ::tk::dialog::color::GetOptions + - NEW : for clr: -validatecommand option + - NEW : for klnd: -popup option, wildcards %d,%m,%y in -command option + - NEW : combine showModal's options: "-centerme .win -geometry WxH" (without +X+Y) + - CHANGE: validateColorChoice method: "entry selection clear" + - CHANGE: "Close" button of klnd localized + - CHANGE: "::apave::mainWindowOfApp ." initializes "main window of app" setting + - CHANGE: "CleanUps $win" after closing modal/waited windows + - CHANGE: unnecessary decorative comments removed + + +Version `4.1.8 (25 Oct'23)` + + - CHANGE: chooserGeomVars method: sets/gets variables for file/dir choosers' geometry + - CHANGE: AuxSetChooserGeometry method: default geometry of file/dir choosers + + +Version `4.1.7 (2 Oct'23)` + + - CHANGE: the -container option of showModal method is changed to -transient + - CHANGE: "-root $w" and "-parent $w" are the same as (recommended) "-centerme $w" + - CHANGE: APaveDialog's dialogues delegate the -transient option to showModal + + +Version `4.1.6 (27 Sep'23)` + + - NEW : mainWindowOfApp method + - CHANGE: hl_tcl 1.0.6, baltip 1.5.4 + + +Version `4.1.5 (14 Sep'23)` + + - BUGFIX: setting geom variable in AuxSetChooserGeometry method (potential bug) + - NEW : "-container $win" option for showModal method + + +Version `4.1.4 (7 Sep'23)` + + - DELETE: "grab release $wgr" in showWindow method + + +Version `4.1.3 (6 Sep'23)` + + - CHANGE: method waitWinVar + + +Version `4.1.2 (30 Aug'23)` + + - BUGFIX: display Tk core file/dir choosers in KDE & Fluxbox WM + - CHANGE: default -decor option + - NEW : method waitWinVar + + +Version `4.1.1 (21 Jun'23)` + + - NEW : csSet method: colors can be passed in args as -clrtitf "color" etc... + + +Version `4.1.0 (26 Apr'23)` + + - NEW : klnd::clearup - clearance for klnd data + - DELETE: dlgPath & Pdg methods + - CHANGE: get rid of arrays or their vars (Moveall instead of _pav(moveall) etc.) + - CHANGE: untouchWidgets: if 1st item of *args* is "clear", clears items by glob patterns + - CHANGE: hl_tcl 1.0.5 + + +Version `4.0.8 (19 Apr'23)` + + - NEW : initLinkFont method allows setting -foreground/-background + + +Version `4.0.7 (14 Apr'23)` + + - NEW : -labelwidget attribute (of lfr/lfR) can be a path method + - CHANGE: findInText method: 'dobell' argument + - CHANGE: hl_tcl 1.0.4 + + +Version `4.0.6 (5 Apr'23)` + + - BUGFIX: spinbox' tips (not for blank "from..to") + - NEW : -minsize option for dialogues + - NEW : msgcatDialogs proc to localize apave's messages + - CHANGE: check for {#commented item of widlist} + - CHANGE: indentation at inserting braces + - CHANGE: hl_tcl 1.0.3, bartabs 1.6.7 + + +Version `4.0.4 (25 Mar'23)` + + - CHANGE: "fillGutter $txt" to clear data of $txt + - CHANGE: -decor option of showModal initialized properly + - CHANGE: ButtonTip of klnd2.tcl: provide %D wildcard as specified (%Y/%m/%d) + - CHANGE: hl_tcl 1.0.2, bartabs 1.6.6 + + +Version `4.0.3 (23 Mar'23)` + + - CHANGE: -decor option of showModal initialized properly + - CHANGE: ButtonTip of klnd2.tcl: provide %D wildcard as specified (%Y/%m/%d) + - CHANGE: hl_tcl 1.0.1 + + +Version `4.0.2 (15 Mar'23)` + + - CHANGE: "file" icon + - CHANGE: "Close" icons instead "Exit", in dialogues + - CHANGE: DarkBrown CS: bg1 & selection colors + - CHANGE: hl_tcl 1.0.0 + + +Version `4.0.1 (8 Mar'23)` + + - NEW : -com of "but" (button) can be integer (a returned result) + - NEW : -initialdir of "fil" and "fis" (file chooser) can be "-$path" to return a rootname only + - CHANGE: dlgPath methods + - CHANGE: cursor at entry's end after choosing from choosers + - CHANGE: -rotext of text dialogues to disable "\\n -> \n" mapping + - CHANGE: some CS's tip colors + - CHANGE: bartabs 1.6.5 + + +Version `4.0.0 (1 Mar'23)` + + - BUGFIX: closing non-modal windows in arbitrary order + - BUGFIX: input method: text fields containing "\", "{", "}" + - NEW : showModal: "-waitvar 1" option to force "tkwait variable" at "-modal 0" + - NEW : showWindow: "waitvar" argument to force "tkwait variable" at "-modal 0" + - NEW : -onclose option of dialogues: may be "destroy" (useful for non-modals) + - NEW : handler of dialogue's buttons may be "destroy" (useful for non-modals) + - NEW : input method: radiobutton names may be "Names" + - NEW : input method: -comOK option (OK button's command) + - NEW : OK dialogue may be "-modal 0" (nothing to choose, only viewing) + - NEW : apave::traceRemove proc: cancel tracing of a variable + - NEW : apave::InsertChar proc: insert characters into a text at cursor's position + - NEW : dlgPath method: get dialogues' window path + - NEW : thDark method: check if a theme is dark/light/neutral + - NEW : BWidget::place ----> apave::place, used in initWM + - CHANGE: winfo vrootwidth / vrootheight + - CHANGE: APave => APaveBase, apave.tcl => apavebase.tcl, APaveInput => APave, apaveinput.tcl => apave.tcl + - CHANGE: ::islinux => ::isunix + - CHANGE: DarkBrown CS + - CHANGE: klnd: -width option to change days' width; -locale initialized + - CHANGE: hl_tcl 0.9.49, baltip 1.5.2, bartabs 1.6.4 + + +Version `3.7.0 (8 Feb'23)` + + - NEW : apave::InitBaltip, -isbaltip option of apave::initWM (to dismiss baltip) + - NEW : apave::SRCDIR to hold apave's source directory + - NEW : -centerme option can be a caller's geometry (WxH+X+Y) + - NEW : misc method's buttons argument: "result" can be or a command to get the result + - NEW : Query method: 5 buttons added to "buttons" (possible total 7) + - CHANGE: LightBrown & DarkBrown moved in the CS list + - CHANGE: hl_tcl 0.9.48 + + +Version `3.6.7 (29 Jan'23)` + + - NEW : gutterContents method: gets a gutter's current contents + - CHANGE: lightbrown theme & LightBrown CS instead of old ones + + +Version `3.6.6 (27 Jan'23)` + + - BUGFIX: -tabnext option: when it's set as "[command]" + - NEW : highlight_matches_real: for real highlighting words (esp. for Windows) + - CHANGE: Radiance CS + + +Version `3.6.5 (25 Jan'23)` + + - BUGFIX: setting "theme" variable in InitTheme + - NEW : handle plastik, radiance and darkbrown themes in InitTheme + - NEW : -encoding and -translation options of readTextFile / writeTextFile + - DELETE: all shadowing stuff (shadowAllowed etc.) + - CHANGE: in text dialogues: popup's "Save and Exit" and Ctrl+W both return "1" + - CHANGE: CS: Radiance & DarkBrown instead of Yellowstone & Dark3 + - CHANGE: bartabs 1.6.3, hl_tcl 0.9.46 + + +Version `3.6.4 (18 Jan'23)` + + - BUGFIX: Dark* themes: corrected "actfg" color + - BUGFIX: initialize basic CS of tuned CS + - BUGFIX: Replace_chooser: horizontal scrollbar for "ftx" widget + - NEW : -tabnext option: may be a call of procedure + - NEW : Replace_chooser: grid/pack options for expanding "mega-widgets" + - CHANGE: initWM: "default" theme by default, instead of "clam" + - CHANGE: little clearance + - CHANGE: bartabs 1.6.2 + + +Version `3.6.3 (4 Jan'23)` + + - NEW : TMenubutton arrow: disabled color + - CHANGE: hl_tcl 0.9.45 + + +Version `3.6.2 (28 Dec'22)` + + - DELETE: tests directory (separated into apave_tests repo) + + +Version `3.6.1 (14 Dec'22)` + + - NEW : -tabnext option can be 2 item list, 2nd (omittable) is "widget" for Shift+Tab + - NEW : focus fg/bg of TButton + - NEW : apave::FGMAIN2 / BGMAIN2 for field colors + - NEW : TreeNoHL style for treeview not highlighted + - CHANGE: Treeview colors: selected focus / not focus + + +Version `3.6.0 (7 Dec'22)` + + - BUGFIX: (esp. for Windows) fire entry's invalidation after choice from choosers + - BUGFIX: erroneous combination CS=-1 & Tint!=0 + - BUGFIX: in Windows: shimmering white in embedded calendar (klnd2) + - BUGFIX: APave object: omit some commands of popup menu for text widget + - BUGFIX: "+" as L/T neighbor in widget list didn't work for mega-widgets (dir,ftx...) + - BUGFIX: empty widget list (lwidgets) in Window method + - BUGFIX: removeOptions method to remove all instances of options + - NEW : touchWidgets method + - NEW : FG FG2 BG BG2 tags among link tags (defining colors) + - NEW : apave::isKDE, apave::repaintWindow + - NEW : -parent option of chooser method + - NEW : btT type of toolbuttons (non-ttk) + - NEW : apave::ttkToolbutton for ttk Toolbutton widgets: btt brt blt + - NEW : -cs argument for initWM, to initialize CS before any GUI visible + - NEW : apave::defaultAttrs sets a user defined widget (demoed by test2_pave.tcl) + - NEW : rootModalWindow to get modal parent window + - NEW : deiconify / withdraw / iconifyOption procs + - NEW : getShowOption / setShowOption for default options of showModal + - NEW : initStyle & clearing code + - CHANGE: untouchWidgets: additional attributes + - CHANGE: themeWindow: scrollbars active/disabled + - CHANGE: remove the old loaded aw* themes before loading the new ones + - CHANGE: frame instead of ttk::frame for paving $win.fra => no shimmering of bg, when dark themes are used + - CHANGE: themeWindow: colors of scrollbar at hovering + - CHANGE: ttk::combobox is included in navigation by Return/Enter key + - CHANGE: color chooser got -geometry option to be placed under mouse pointer or entry + - CHANGE: colorWindow args + - CHANGE: hovering color for buttons = mild magenta + - CHANGE: check for using csToned before csSet + - CHANGE: iconA & AddButtonIcon: -compound option (esp. for toolbuttons named by icons) + - CHANGE: at Windows' themes: -focusfill for TCombobox + - CHANGE: less sizes of calendars (klnd & klnd2) + - CHANGE: highlight days in klnd & klnd2 (esp. for Windows) + - CHANGE: centering & showing windows, with new procs + - CHANGE: -resizable option may be boolean + - CHANGE: highlightbackground for main toolbar buttons + overrelief (esp. for Windows) + - CHANGE: test2_pave.tcl + - CHANGE: hl_tcl 0.9.44, bartabs 1.6.0 + + +Version `3.5.9 (25 Oct'22)` + + - NEW : "-buttons" option for "input" method + - NEW : commands for buttons of dialogues (along with old "returned result") + - CHANGE: -resizable & -checkgeometry options and other geometry things + - CHANGE: AzureLight CS (selection bg) + - CHANGE: hl_tcl 0.9.43 + + +Version `3.5.8 (23 Oct'22)` + + - NEW : apave::eventOnText - cut & copy for multiple selections + - NEW : Query method: -stay option + - CHANGE: Query method: "wm geometry" instead of "winfo ..." + + +Version `3.5.7 (19 Oct'22)` + + - CHANGE: *input* method: *-values* option added for all default widgets + - CHANGE: ::apave::autoexec got *ext* argument, for Windows + - CHANGE: baltip 1.5.1 + + +Version `3.5.6 (5 Oct'22)` + + - BUGFIX: dir chooser: -initialdir option need no quoting + + +Version `3.5.5 (21 Sep'22)` + + - NEW : apave::undoIn / apave::undoOut to frame undo / redo block + - CHANGE: test2_pave.tcl + - CHANGE: baltip 1.4.1, bartabs 1.5.8 + + +Version `3.5.4 (31 Aug'22)` + + - NEW : chooserGeomVars method to restore a full geometry of dir/file choosers (Linux) + e.g. used in alited editor + + +Version `3.5.3 (25 Aug'22)` + + - CHANGE: text widget's attributes (-exportselection, -inactiveselectbackground) + - CHANGE: UpdateSelectAttrs not called for text widget + + +Version `3.5.2 (15 Aug'22)` + + - NEW : apave::_CS_(HUE) to hold a current tint of CS + - CHANGE: CS: SunValleyDeep + + +Version `3.5.1 (10 Aug'22)` + + - BUGFIX: colorWindow for "after idle/ms" item of widget list + - BUGFIX: font chooser (Linux): color of selection + - BUGFIX: after calling and theming choosers (linux), combobox's colors affected + - NEW : apave::autoexec imitates Tcl's auto_execok + - NEW : apave::lsearchFile to search normalized file names in lists + - NEW : apave::InitAwThemesPath to set awthemes' path + - NEW : bind for transpops package if any (to hide its message by Control-Alt-0) + - NEW : -clearcom option for entry-like widgets (adds "Clear" to popup menu) + - NEW : -help option for dialogues (to create "Help" button) + - NEW : dlgPath method & proc to get apave dialogue's path + - CHANGE: value of combobox' variable in input dialogue + - CHANGE: sframe.tcl refactored: checking mouse pointer in text, listbox etc. + - CHANGE: res method: if *win* argument is {}, it's set as current dialogue's path + - CHANGE: CS: Quiverly modified to quiver a little less + - CHANGE: CS: AzureLight, AzureDark, SunValleyLight + - CHANGE: baltip 1.4.0, hl_tcl 0.9.42 + + +Version `3.4.18 (3 Jul'22)` + + - NEW : menuTips method and -indexedtips to set tips for menu & opc items + - NEW : -titleHELP option for 'input' dialogue (its 'result value' is a command) + - CHANGE: CS: SunValleyDark from old Dracula, new SunValleyDeep from old SunValleyDark + - best fit to sun-valley-dark theme, meaning two (lighter/darker) CS for it + + +Version `3.4.16 (23 Jun'22)` + + - NEW : widget names for "input" can be uppercased (or include -method option) + - CHANGE: VarName method renamed to varName for public access + - CHANGE: makePopup checks also for -state = disabled + - CHANGE: remove accompanying files of baltip & bartabs packages + - CHANGE: bartabs package + + +Version `3.4.14 (18 Jun'22)` + + - BUGFIX: (avoiding bugs) check "source baltip.tcl" + - BUGFIX: (avoiding bugs) catch "configure splash widgets" + - NEW : {after idle} or {after ms} can be 1st item of widget list + - CHANGE: up to 16 levels for [info level] in ::apave::logMessage + - CHANGE: up to 5 tabs in -tab2 option + - CHANGE: test2_pave.tcl: About/Acknowledgements + + +Version `3.4.12 (8 Jun'22)` + + - BUGFIX: (avoiding bugs) apave::setTextBinds: bindToEvent instead of "bind" + - BUGFIX: (avoiding bugs) my set_highlight_matches: check for existing text + - NEW : apave::iconImage: "doit" argument to force the initialization + - CHANGE: Control-a/A to select all of text + - CHANGE: obbit_1.test + - CHANGE: baltip, bartabs packages + + +Version `3.4.11 (20 May'22)` + + - CHANGE: bartabs package + + +Version `3.4.10 (14 May'22)` + + - CHANGE: duplicate a current line (by Ctrl+D) "properly", if it is last in the text + - CHANGE: get file/dir chooser geometry from 2nd chooser, if no geometry for current one + + +Version `3.4.9 (30 Apr'22)` + + - BUGFIX: line numbers in the gutter are updated only for mapped texts + - CHANGE: test2_pave.tcl + - CHANGE: klnd package + + +Version `3.4.8 (8 Mar'22)` + + - BUGFIX: klnd2.tcl - leading spaces at comparing months & clearance + - BUGFIX: uk.msg instead of ua.msg + - NEW : frames scrolled by the mouse wheel (in Linux) + - NEW : apave::InitTheme + - NEW : apave::MODALWINDOW is a window name of last called showModal + - NEW : basicSmallFont to set/get the small font + - CHANGE: klnd: bg of frames & buttons + - CHANGE: tiny-ups with lsearch & switch + - CHANGE: klnd.tcl - buttons' width in Windows = in Linux + - CHANGE: test2_pave.tcl + - CHANGE: hl_tcl package + + +Version `3.4.7 (26 Jan'22)` + + - NEW : -popup attribute (command for right-click) + - NEW : , bindings for listbox & treeview + - NEW : -tags option for readonly text widget & dialogue + - NEW : -tab2 option for dialogue + - NEW : 'selection clear' at button/key pressing treeview & listbox + - NEW : 'padchar' argument of setTextIndent + - NEW : -debug attribute to show a widget's info while executing paveWindow + - CHANGE: csDarkEdit converted to csDark + - CHANGE: at Enter on a comment (# ) checking for upper & lower lines + - CHANGE: at Enter on a left brace checking for indentation of lower line + - CHANGE: -com attribute to fire a spinbox' command at pressing Return/Enter + - CHANGE: test2_pave.tcl + - CHANGE: hl_tcl package + + +Version `3.4.6 (15 Dec'21)` + + - BUGFIX: issues with pressing Enter at "-", "*", "#" starting lines + - BUGFIX: -initialdir option for file chooser + - BUGFIX: default/classic/alt theme & dark CS: selected check/radio buttons' bg + - BUGFIX: treeview's ttk::style for CS=-2 (i.e. if no CS) + - BUGFIX: display redefined Ctrl+Y/D, F3 + - NEW : unit tree for obbit.tcl, apaveinput.tcl, apavedialog.tcl + - NEW : ::apave::writeTextFile option of deleting empty files instead of saving + - NEW : ::apave::bindToEvent + - NEW : -method option to define a method in apave object + - NEW : tooltip for notebook tab + - NEW : unit tree for apave.tcl + - NEW : calendar: updating for y/m + - NEW : calendar: proc for right click (%y, %m, %d, %X, %Y wildcards) + - NEW : calendar: list of selected (fg) days + - NEW : progress procs (begin, go, end); add it to widgetType method & test2 + - NEW : daT widget - calendar widget + - NEW : ru.msg, ua.msg for klnd + - NEW : 'pack -after .a.b.c' may be 'pack -after C', then [my C] used + - NEW : using TCLLIBPATH (spec.feature for tclkits) + - NEW : tooltip of spinbox (from..to) + - NEW : -padx, -pady options for entry fields of choosers + - NEW : topmost attribute in showModal depending on a window's ancestors + - NEW : cs_Active to set/get flag "no CS changes" + - CHANGE: sourcing baltip.tcl modified + - CHANGE: csMainColors includes e_menu colors + - CHANGE: test0, test1, test2 modified + - CHANGE: klnd.tcl refactored (unit tree, inits) + - CHANGE: modified style of TButton, TNotebook.Tab + - CHANGE: modified CS for: bg of menus, cursor, selection, tips + - CHANGE: modified CS: Oscuros, MildDarks, rdbende's Darks + - CHANGE: hl_tcl, baltip, bartabs packages updated + + +Version `3.4.5 (6 Oct'21)` + + - bugfix: font chooser's returned value (in Windows) + - comboboxed fiL, fiS, diR, foN, clR types of choosers + - swi (switch) widget + - new methods: resetText, precedeWidgetName, paveoptionValue + - modified methods: displayTaggedText + - at pressing Enter: "-", "*", "#" duplicated with indentation + - focused "opc" widget at mouse clicking + - TButtonWestHL ttk::style + - AwDark, AwLight color schemes instead of Dark and Celestial + - Dusk CS above Darcula, to align light and dark "themed" CS + - themePopup, themeNonThemed to touch a parent popup menu + - -selectcolor for menus' check/radio + - modified style of TScrollbar, TProgressbar, TLabelframe + - bg color of disabled toolbar icons + - listbox' bg color corrected + - azure, forest, sun-valley and some other CS modified + - menu's borderwidth 1 for themes by rdbende + - create_Fonts run at changing default font size + - heading style for treeview + - Shift/Ctrl+Enter in texts corrected + - text undo/redo separators + - choosers' options (-initialdir, -initialfile, -defaultextension, -multiple) + - test2_pave.tcl got "theme" option + - menu/tool/status bars allow to set "# comment" to comment lines out + - hl_tcl, bartabs, klnd packages updated + + +Version `3.4.4 (25 Aug'21)` + + - default colors changed in InitWM + - "opc" allows -com/-command option + - background color of entry, spinbox and alike + - ttk theme + apave's color scheme = love + - CS revised; added; got 3rd reserved color + - colorized color chooser + - colorWindow in. + - fonts brought to order + - log messages + - -themed option of showModal + - hl_tcl, baltip packages updated + + +Version `3.4.1 (4 Aug'21)` + + - scf (scrolled frame) widget + - chooseDate used independently + - text's find next corrected + - HILI (highlighting) bound to a text widget + - onKeyTextM modified (to cut a text by Return/Enter) + - getting -topmost option of dialogue corrected + - modal mode corrected for Linux + - hl_tcl, bartabs, baltip packages updated + + +Version `3.3.3 (26 Apr'21)` + + - "-expand 1" option for 'sta' + - create_FontsType to make apaveFont*Typed* fonts from apaveFont* + - leadingSpaces + - initStylesFS to style lab/chb/cbx/rad/but + - some CS colors mod. + - LowercaseWidgetName for Toolbar (making its method, to refer its buttons) + - catch for 'options/attrs' (to get literals instead of errors of variables' subst) + + +Version `3.3.2 (17 Apr'21)` + + - highlighted string for searching with F3 + - an indenting amended + - cursor settings modified + - CS rearranged & renamed + - active/focus colors for sca/sb*/nbk.tab + - "-tip" may be used along with "-tooltip" + - "-after/-before %w" for packing sbv/sbh instead of default setting + - "-minsize" for showModal/showWindow + - "-pointer/pointer+x+y" for showModal/showWindow's -geometry + - "-escape" option for showModal + - "-wrap word" default for 'tex' + - -selborderwidth for 'tex' (default 1) + - -columnoptions for 'tre' + - for menuBar: 7th arg as 'fillmenu' command + - TLabelSTD, e.g. for statusbar labels + - extractOptions, writeTextFile & error procs introduced + - defaultAttrs instead of setDefaultAttrs, with more options + - icons for mc-labels + - "pack/grid propagate" for "pan" if -w and -h set + - clrpick.tcl updated + - bartabs, hl_tcl, baltip packages updated + - BUGFIX: menu's colors restored for themes + + +Version `3.3.1 (6 Mar'21)` + + - better handling for modal/non-modal windows + - color hues in. + - themes rearranged + - klnd, hl_tcl, baltip packages upd. + - BUGFIX: remove the tailing " &" in openDoc + - BUGFIX: -disabledforeground for menu + - BUGFIX: use uppercased parent + +Version `3.3 (14 Feb'21)` + + - color (Tk's modified) and date (new) choosers in 'src/pickers' + - theming file/dir choosers in Unix + - checking for screen's edges in ShowModal + - args for 'toplevel' in makeWindow + - for apave dialog with text: TkDefaultFont if not editing + - "font actual" instead of "font configure" + - hl_tcl & bartabs packages updated + - BUGFIX (and recommendation): in -lbxname checking "winfo exists" + - BUGFIX: in input method, checking $res is true (not "1") + + +Version `3.2.8 (31 Jan'21)` + + - modifying style of scale, scrollbar, combobox + - modifying menu's font size + - CS made milder + - revising popup menus of text widget + - color of matching bracket is magenta + - modifying & moving highlight matches procs from ::em to ::apave + - labelFlashing's -data allows var contents along with var name + - fillGutter can be run to update a gutter, e.g. at switching CS + - squeezing icons + - updating hl_tcl, bartabs packages + + +Version `3.2.7 (17 Jan'21)` + + - "gut" (gutter) widget + - default "-highlightbackground" for non-ttk + - eventOnText: for menu items at highlighting + - CS modified + - bartabs, hl_tcl updated + + +Version `3.2.5 (26 Dec'20)` + + - hl_tcl package + - baltip package + - borderwidth for text sel + - indent & font of text widget + - linked labels (also in text), also with images + - icon sets: "small", "middle" ("large" to do) + + +Version `3.1 (12 Sep'20)` + + - bartabs package v1.0 + - 'nbk' attributes: -traverse yes/no, -select tab + - 'lab' got "-state disabled" attribute + - "-modal false" option of showModal makes the window non-modal + - displayText got 'pos' parameter (position of cursor) + - BUGFIX: text attribute for choosers could not contain spaces + + +Version `3.0.1 (17 Jul'20)` + + - ::tk::PlaceWindow being helped again + + +Version `3.0b8 (27 Jun'20)` + + - version bound to e_menu's + - `chb` value & appearance amended + - `add` command moved to grid/pack item; old `add` item removed + - `-toprev` attribute for `but` & `chb` in input dlg + - `but` in input dlg + - errors of input dialog are caught and messaged + - readonly text's `-takefocus` amended + - `-myown` attribute + - mass commenting of methods & procs + - reference docs in Ruff! + - `Paste` event removes selection in text + - `-timeout` option for buttons & dialogs + - `But*` & `Lab*` in dialogs + - `::apave::obj` instead `themeObj` + - CS amended a lot + - fixed issue with `-lbxname` option + - `spx/spX` included in toolbar + - changing default font size + + +Version `2.9b4 (1 Jun'20)` + + - `tcl` sort of widget (to make Tcl code in widget list) + - -msgLab option of input dialog + - \n and \t for `tex` + - tkwait visibility added + - ::tk::PlaceWindow supported + - a bit of new CS + - renaming CS methods + - `setFocus` finds -tabnext widget by glob match, e.g. OK for a button + - `setDefaultAttrs` to set default attributes + - `pobj paveWindow` is preferred to the old `pobj window` (kept on for + compatibility) + - `UpdateSelectAttrs` allows to change selection atrributes in run-time; + well fit to set "!fosus color" of -selectfg/bg for some non-ttk widgets + - sequence of the previous: + initial selectfg/bg set to "!fosus color" for lbx/tbl/flb/spX/cbx/fco + - cbx colors amended + - -ALL option for lbx/tbl/flb: if true, it returns a list of 3 items - + index, selection, item list (by default, only selection is returned) + - `subst` for -array option, to pass a variable value + - test2_pave.tcl adjusted, for these two changes + - F2 hotkey added to choosers' entries (fil, dir etc.) + - "-takefocus 0" as default for choosers' buttons (fil, dir etc.) + - changed 3 icons (none, color, retry) to work in some Tk + - coloring of TNotebook.Tab modified + + +Version `2.8 (24 May'20)` + + - `nbk` widget type for ttk::notebook + - `pack forget` for layouts + - blinking by default bg removed + - popup menus got their coloring with CS + - `themingPopup` method to solve all popup CS issues + - `subst vars` allowed in value fields of `input` dialog + - -activefg/bg for non-ttk buttons + - statusbar layout corrected (.neighbor allowed, as old neighbor) + - test2_pave.tcl got icons & new statusbar (the old in comments) + + +Version `2.7 (22 May'20)` + + - color schemes added + - cs (color scheme) argument of APave / APaveDialog / APaveInput constructor + - opc (tk_optionCascade) widget added to APave + - opc (tk_optionCascade) may be used in too (toolbar) widget + - opc (tk_optionCascade) widget added to APaveInput ("input" dialog) + - but (ttk::button) may be used in too (toolbar) widget, with -image + - fco widget allows -RE (regexp) to filter records + - tbl (tablelist::tablelist) color-schemed + - appIcon: -data preferred to -file + - initPOP: popup menu with Menu key + - showModal: disables shadowing; removes blinking by default bg; -themed arg. + - removeOptions: can remove options without value + - ttk::button style configured + - -centerme option of dialogs added (centering relative to a caller's window) + - -focusback option of dialogs added (restoring an old focus of a caller) + - "edit modified false" placed nearby "edit reset" + - "label::tooltip" as a button "-text" may be used to show tooltips + - save/don't save/cancel at exiting editor + - text selection used by "Find first" of editor's popup menu + - -a option (additional options) for message labels of non-text dialogs + - lbx and tex widgets made sizeable vertically in APaveInput + - configTooltip method to configure fb, bg etc. attributes of tooltips + - test2_pave.tcl: opc widgets & color schemes added, toolbar, editor etc. + - test_pavedialog.tcl: opc widget & color schemes added + - setting 1st widget amended (uppercase names checked) + - destructors amended + - BUGFIX: color chooser failed after 1st incorrect input color + - BUGFIX: editor's "Save" button not shown at "-readonly 0 -rotext var" + - massive clean-ups + + +Version `2.6.3 (25 Apr'20)` + + - icons added for buttons, menus, choosers + - ttk::button, ttk::label configured in apave::initWM + - symbolic ID of buttons may be passed to misc dialog + - displayText, displayTaggedText mod. + - tests/*.tcl modified + - clean-ups + - BUGFIX: fixed -initialfile, -initialdir for file/dir choosers + - BUGFIX: fixed an issue with focusing at mass keypressing (Esc e.g.) + + +Version `2.5 (18 Apr'20)` + + - text and entry-like widgets (cbx ent fco spx) got their popup menu + - corrected popup menu for text widget of dialogs + - method setTextContents to fill contents of disabled text widgets + - choosers' names can be titled upper-case + - little clean-up + + +Version `2.4 (15 Apr'20)` + + - selection attributes for listboxes, to fix a listbox curselection issue + as hinted by + Donal K. Fellow (https://stackoverflow.com, the question + the-tablelist-curselection-goes-at-calling-the-directory-dialog) + Mark G. Saye (https://wiki.tcl-lang.org/page/listbox+selection) + - color initialized for colorChooser + - cleanup a bit + - CHANGELOG.md added diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/LICENSE b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/LICENSE new file mode 100644 index 00000000..72aa2b58 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/LICENSE @@ -0,0 +1,9 @@ +The MIT License (MIT) + +Copyright (c) 2019-2024 Alex Plotnikov https://aplsimple.github.io + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/README.md b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/README.md new file mode 100644 index 00000000..8d811cd5 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/README.md @@ -0,0 +1,7 @@ +# apave + +A library for GUI development with Tcl/Tk. + +Docs: + +[Full description](https://aplsimple.github.io/en/tcl/pave) diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apave.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apave.tcl new file mode 100644 index 00000000..a555e4b4 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apave.tcl @@ -0,0 +1,1184 @@ +########################################################### +# Name: apave.tcl +# Author: Alex Plotnikov (aplsimple@gmail.com) +# Date: 12/09/2021 +# Brief: Handles APave class creating input dialogs. +# License: MIT. +########################################################### + +package require Tk +package provide apave 4.4.10 + +source [file join [file dirname [info script]] apavedialog.tcl] + +# ________________________ Independent procs _________________________ # + +proc ::iswindows {} { + # Checks for "platform is MS Windows". + + expr {$::tcl_platform(platform) eq {windows}} +} + +proc ::isunix {} { + # Checks for "platform is Unix". + + expr {$::tcl_platform(platform) eq {unix}} +} + +proc ::isKDE {} { + # Checks for "desktop is KDE". + + expr {[info exists ::env(XDG_CURRENT_DESKTOP)] && $::env(XDG_CURRENT_DESKTOP) eq {KDE}} +} + +proc ::asKDE {} { + # Checks for DE behaving as weird as KDE. + + expr {[::isKDE] && ![package vsatisfies [package require Tcl] 8.6.11-]} +} +# ________________________ apave NS _________________________ # + +namespace eval ::apave { + + namespace export obj openDoc textsplit focusByForce *TextFile undo* *Option* + + mainWindowOfApp . + + variable _OBJ_ {} + + proc obj {com args} { + # Calls a method of APave class. + # com - a method + # args - arguments of the method + # It can (and must) be used only for temporary tasks. + # For persistent tasks, use a "normal" apave object. + # Returns the command's result. + + variable _OBJ_ + if {$_OBJ_ eq {}} {set _OBJ_ [::apave::APave new]} + if {[set exported [expr {$com eq "EXPORT"}]]} { + set com [lindex $args 0] + set args [lrange $args 1 end] + oo::objdefine $_OBJ_ "export $com" + } + set res [$_OBJ_ $com {*}$args] + if {$exported} { + oo::objdefine $_OBJ_ "unexport $com" + } + return $res + } + #_______________________ + + proc None {args} { + # Useful when to do nothing is better than to do something. + + } + #_______________________ + + proc autoexec {comm {ext ""}} { + # Imitates Tcl's auto_execok. + # comm - a command to find + # ext - file's extension (for Windows) + # If it doesn't get the command from Tcl's auto_execok, + # it tries to knock at its file by itself. + + if {$ext ne {} && [::iswindows]} {append comm $ext} + set res [auto_execok $comm] + if {$res eq {} && [file exists $comm]} { + set res $comm + } + return $res + } + #_______________________ + + proc openDoc {url} { + # Opens a document. + # url - document's file name, www link, e-mail etc. + + set commands {xdg-open open start} + foreach opener $commands { + if {$opener eq "start"} { + set command [list {*}[auto_execok start] {}] + } else { + set command [auto_execok $opener] + } + if {[string length $command]} { + break + } + } + if {[string length $command] == 0} { + puts "ERROR: couldn't find any opener" + } + # remove the tailing " &" (as e_menu can set) + set url [string trimright $url] + if {[string match "* &" $url]} {set url [string range $url 0 end-2]} + set url [string trim $url] + if {[catch {exec -- {*}$command $url &} error]} { + puts "ERROR: couldn't execute '$command':\n$error" + } + } + #_______________________ + + proc countChar {str ch} { + # Counts a character in a string. + # str - a string + # ch - a character + # + # Returns a number of non-escaped occurences of character *ch* in + # string *str*. + # + # See also: + # [wiki.tcl-lang.org](https://wiki.tcl-lang.org/page/Reformatting+Tcl+code+indentation) + + set icnt 0 + while {[set idx [string first $ch $str]] >= 0} { + set backslashes 0 + set nidx $idx + while {[string equal [string index $str [incr nidx -1]] \\]} { + incr backslashes + } + if {$backslashes % 2 == 0} { incr icnt } + set str [string range $str [incr idx] end] + } + return $icnt + } + #_______________________ + + proc traceRemove {v} { + # Cancels tracing of a variable. + # v - variable's name + + foreach t [trace info variable $v] { + lassign $t o c + trace remove variable $v $o $c + } + } + #_______________________ + + proc initBaltip {} { + # Initializes baltip package. + + if {[info command ::baltip] eq {}} { + if {$::apave::ISBALTIP} { + source [file join $::apave::SRCDIR baltip baltip.tcl] + } else { + # disabling baltip facilities with stub proc (no source "baltip.src") + namespace eval ::baltip { + variable expproc [list configure cget tip update hide repaint \ + optionlist tippath clear sleep showBalloon showTip] + foreach _ $expproc { + ; proc $_ {args} {return {}} + namespace export $_ + } + namespace ensemble create + namespace eval my { + ; proc BindToEvent {args} {} + } + } + } + } + } + + ## ________________________ Integers _________________________ ## + + + proc getN {sn {defn 0} {min ""} {max ""}} { + # Gets a number from a string + # sn - string containing a number + # defn - default value when sn is not a number + # min - minimal value allowed + # max - maximal value allowed + + if {$sn eq "" || [catch {set sn [expr {$sn}]}]} {set sn $defn} + if {$max ne ""} { + set sn [expr {min($max,$sn)}] + } + if {$min ne ""} { + set sn [expr {max($min,$sn)}] + } + return $sn + } + #_______________________ + + proc p+ {p1 p2} { + # Sums two text positions straightforward: lines & columns separately. + # p1 - 1st position + # p2 - 2nd position + # The lines may be with "-". + # Reasons for this: + # 1. expr $p1+$p2 doesn't work, e.g. 309.10+1.4=310.5 instead of 310.14 + # 2. do it without a text widget's path (for text's arithmetic) + + lassign [split $p1 .] l11 c11 + lassign [split $p2 .] l21 c21 + foreach n {l11 c11 l21 c21} { + if {![string is digit -strict [string trimleft [set $n] -]]} {set $n 0} + } + return [incr l11 $l21].[incr c11 $c21] + } + #_______________________ + + proc pint {pos} { + # Gets int part of text position, e.g. "4" for "4.end". + # pos - position in text + + if {[set i [string first . $pos]]>0} {incr i -1} {set i end} + expr {int([string range $pos 0 $i])} + } + #_______________________ + + proc intInRange {int min max} { + # Checks whether an integer is in min-max range. + # int - the integer + # min - minimum of the range + # max - maximum of the range + + expr {[string is integer -strict $int] && $int>=$min && $int<=$max} + } + #_______________________ + + proc IsRoundInt {i1 i2} { + # Checks whether an integer equals roundly to other integer. + # i1 - integer to compare + # i2 - integer to be compared (rounded) to i1 + + expr {$i1>($i2-3) && $i1<($i2+3)} + } + + ## _______________________ Lists, arrays _______________________ ## + + proc lsearchFile {flist fname} { + # Searches a file name in a list, using normalized file names. + # flist - list of file names + # fname - file name to find + # Returns an index of found file name or -1 if it's not found. + + set i 0 + set fname [file normalize $fname] + foreach fn $flist { + if {[file normalize $fn] eq $fname} { + return $i + } + incr i + } + return -1 + } + #_______________________ + + proc RestoreArray {arName arSave} { + # Tries restoring an array 1:1. + # arName - fully qualified array name + # arSave - saved array's value (got with "array get") + # At restoring, new items of $arName are deleted and existing items are updated, + # so that after restoring *array get $arName* is equal to $arSave. + # Note: "array unset $arName *; array set $arName $arSave" doesn't ensure this equality. + + set ar $arName + array set artmp $arSave + set tmp1 [array names artmp] + set tmp2 [array names $arName] + foreach n $tmp2 { + if {$n ni $tmp1} {unset [set ar]($n)} {set [set ar]($n) $artmp($n)} + } + foreach n $tmp1 { + # deleted items can break 1:1 equality (not the case with alited) + if {$n ni $tmp2} {set [set ar]($n) $artmp($n)} + } + } + #_______________________ + + proc EnsureArray {arName args} { + # Ensures restoring an array at calling a proc. + # arName - fully qualified array name + # args - proc name & arguments + + set arSave [array get $arName] + {*}$args + RestoreArray $arName $arSave + } + #_______________________ + + proc PushInList {listName item {pos 0} {max 16}} { + # Pushes an item in a list: deletes an old instance, inserts a new one. + # listName - the list's variable name + # item - item to push + # pos - position in the list to push in + # max - maximum length of the list + + upvar $listName ln + if {[set i [lsearch -exact $ln $item]]>-1} { + set ln [lreplace $ln $i $i] + } + set ln [linsert $ln $pos $item] + catch {set ln [lreplace $ln $max end]} + } + + ## ________________________ Widgets _________________________ ## + + proc checkGeometry {geo} { + # Checks a window's geometry. + # geo - the geometry + # Returns a "normalized" geometry (+0+0 if input not correct). + + if {!([regexp {^\d+x\d+\+-?\d+\+-?\d+$} $geo] || + [regexp {^\+-?\d+\+-?\d+$} $geo] || [regexp {^\d+x\d+$} $geo])} { + set geo +0+0 + } + return $geo + } + #_______________________ + + proc repaintWindow {win {wfoc ""}} { + # Shows a window and, optionally, focuses on a widget of it. + # win - the window's path + # wfoc - the widget's path or a command to get it + # Returns yes, if the window is shown successfully. + + if {[winfo exists $win]} { + # esp. for KDE + if {[isKDE]} { ;# KDE is KDE, Tk is Tk, and never the twain shall meet + wm withdraw $win + wm deiconify $win + wm attributes $win -topmost [wm attributes $win -topmost] + } + update + if {$wfoc ne {}} { + catch {set wfoc [{*}$wfoc]} + focus $wfoc + } + return yes + } + return no + } + #_______________________ + + proc rootModalWindow {pwin} { + # Gets a parent modal window for a given one. + # pwin - default parent + + set root $pwin + foreach w [winfo children $pwin] { + if {[winfo ismapped $w] && [InfoFind $w yes] ne {}} { + set root [winfo toplevel $w] + } + } + return $root + } + #_______________________ + + proc splitGeometry {geom {X +0} {Y +0}} { + # Gets widget's geometry components. + # geom - geometry + # X - default X-coordinate + # Y - default Y-coordinate + # Returns a list of width, height, X and Y (coordinates are always with + or -) + # and also a flag "negative coordinates, calculated from bottom right". + + lassign [split $geom x+-] w h + lassign [regexp -inline -all {([+-][[:digit:]]+)} $geom] -> x y + if {$geom ne {}} { + if {$x in {"" 0} || [catch {expr {$x+0}}]} {set x $X} + if {$y in {"" 0} || [catch {expr {$y+0}}]} {set y $Y} + } + set neg [expr {[string first - $geom]>=0 && [string first + $geom]<0}] + list $w $h $x $y $neg + } + #_______________________ + + proc focusFirst {w {dofocus yes} {res {}}} { + # Sets a focus on a first widget of a parent widget. + # w - the parent widget + # dofocus - if no, means "only return the widget's path" + # res - used for recursive call + # Returns a path to a focused widget or "". + + if {$w ne {}} { + foreach w [winfo children $w] { + if {[focusedWidget $w]} { + if {$dofocus} {after 200 "catch {focus -force $w}"} + return $w + } else { + if {[set res [focusFirst $w $dofocus]] ne {}} break + } + } + } + return $res + } + #_______________________ + + proc focusedWidget {w} { + # Gets a flag "is a widget can be focused". + # w - widget's path + + set wclass [string tolower [winfo class $w]] + foreach c [list entry text button box list view] { + if {[string match *$c $wclass]} { + if {[catch {set state [$w cget -state]}]} {set state normal} + if {$state ne {disabled}} { + if {[catch {set focus [$w cget -takefocus]}]} {set focus no} + return [expr {![string is boolean -strict $focus] || $focus}] + } + break + } + } + return no + } + #_______________________ + + proc MouseOnWidget {w1} { + # Places the mouse pointer on a widget. + # w1 - the widget's path + + update + set w2 [winfo parent $w1] + set w3 [winfo parent $w2] + lassign [split [winfo geometry $w1] +x] w h x1 y1 + lassign [split [winfo geometry $w2] +x] - - x2 y2 + event generate $w3 -warp 1 \ + -x [expr {$x1+$x2+int($w/2)}] -y [expr {$y1+$y2+int($h/2)}] + } + #_______________________ + + proc CursorAtEnd {w} { + # Sets the cursor at the end of a field. + # w - the field's path + + focus $w + $w selection clear + $w icursor end + } + #_______________________ + + proc focusByForce {foc {cnt 10}} { + # Focuses a widget. + # foc - widget's path + + if {[incr cnt -1]>0} { + after idle after 5 ::apave::focusByForce $foc $cnt + } else { + catch {focus -force [winfo toplevel $foc]; focus $foc} + } + } + #_______________________ + + proc KeyAccelerator {acc} { + # Returns a key accelerator. + # acc - key name, may contain 2 items (e.g. Control-D Control-d) + + set acc [lindex $acc 0] + string map {Control Ctrl - + bracketleft [ bracketright ]} $acc + } + #_______________________ + + proc InvertBg {clr {B #000000} {W #FFFFFF}} { + # Gets a "inverted" color (white/black) for an color. + # clr - color (#hhh or #hhhhhh) + # B - "black" color + # W - "white" color + # Returns a list of "black/white" and normalized input color + + if {[string length $clr]==4} { + lassign [split $clr {}] -> r g b + set clr #$r$r$g$g$b$b + } + lassign [winfo rgb . $clr] r g b + if {($r%256+$b%256)<15 && ($g%256)>180 || $r+1.5*$g+0.5*$b > 100000} { + set res $B + } else { + set res $W + } + list $res $clr + } + + ### ________________________ Blinking widgets _________________________ ### + + proc blinkWidget {w {fg #000} {bg #fff} {fg2 {}} {bg2 red} \ + {pause 1000} {count -1} {mode 1}} { + # Makes a widget blink. + # w - the widget's path + # fg - normal foreground color + # bg - normal background color + # fg2 - blinking foreground color (if {}, stops the blinking) + # bg2 - blinking background color + # pause - pause in millisec between blinkings + # count - means how many times do blinking + # mode - for recursive calls + + if {![winfo exists $w]} return + if {$count==0 || $fg2 eq {}} { + catch {after cancel $::apave::BLINKWIDGET1} + catch {after cancel $::apave::BLINKWIDGET2} + after idle "$w configure -foreground $fg; $w configure -background $bg" + } elseif {$mode==1} { + incr count -1 + $w configure -foreground $fg2 + $w configure -background $bg2 + set ::apave::BLINKWIDGET1 [after \ + $pause ::apave::blinkWidget $w $fg $bg $fg2 $bg2 $pause $count 2] + } elseif {$mode==2} { + $w configure -foreground $fg + $w configure -background $bg + set ::apave::BLINKWIDGET2 [after \ + $pause ::apave::blinkWidget $w $fg $bg $fg2 $bg2 $pause $count 1] + } + } + #_______________________ + + proc blinkWidgetImage {w img1 {img2 alimg_none} {cnt 6} {ms 100}} { + # Makes a widget's image blink. + # w - widget's path + # img1 - main image + # img2 - flashed image + # cnt - count of flashes + # ms - millisec between flashes + + set imgcur $img1 + if {$cnt>0} { + if {$cnt % 2} {set imgcur $img2} + after $ms "::apave::blinkWidgetImage $w $img1 $img2 [incr cnt -1] $ms" + } + $w configure -image $imgcur + } + + ## ________________________ File names _________________________ ## + + proc HomeDir {} { + # For Tcl 9.0 & Windows: gets a home directory ("~"). + + if {[catch {set hd [file home]}]} { + if {[info exists ::env(HOME)]} {set hd $::env(HOME)} {set hd ~} + } + return $hd + } + #_______________________ + + proc checkHomeDir {com} { + # For Tcl 9.0 & Windows: checks a command for "~". + + set hd [HomeDir] + set com [string map [list { ~/} " $hd/" \"~/ \"$hd/ '~/ '$hd/ \\n~/ \\n$hd/ \n~/ \n$hd/ \{~/ \{$hd/] $com] + if {[string match ~/* $com]} {set com $hd[string range $com 1 end]} + return $com + } + #_______________________ + + proc UnixPath {path} { + # Makes a path "unix-like" to be good for Tcl. + # path - the path + + set path [string trim $path "\{\}"] ;# possibly braced if contains spaces + set path [string map [list \\ / %H [HomeDir]] $path] + checkHomeDir $path + } + #_______________________ + + proc NormalizeName {name} { + # Removes spec.characters from a name (sort of normalizing it). + # name - the name + + string map [list \\ {} \{ {} \} {} \[ {} \] {} \t {} \n {} \r {} \" {}] $name + } + #_______________________ + + proc NormalizeFileName {name} { + # Removes spec.characters from a file/dir name (sort of normalizing it). + # name - the name of file/dir + + set name [string trim $name] + string map [list \ + * _ ? _ ~ _ / _ \\ _ \{ _ \} _ \[ _ \] _ \t _ \n _ \r _ \ + | _ < _ > _ & _ , _ : _ \; _ \" _ ' _ ` _] $name + } + #_______________________ + + proc FileTail {basepath fullpath} { + # Extracts a tail path from a full file path. + # E.g. FileTail /a/b /a/b/cd/ef => cd/ef + # basepath - base path + # fullpath - full path + + set lbase [file split $basepath] + set lfull [file split $fullpath] + set ll [expr {[llength $lfull] - [llength $lbase] - 1}] + if {$ll>-1} { + return [file join {*}[lrange $lfull end-$ll end]] + } + return {} + } + #_______________________ + + proc FileRelativeTail {basepath fullpath} { + # Gets a base relative path. + # E.g. FileRelativeTail /a/b /a/b/cd/ef => ../ef + # basepath - base path + # fullpath - full path + + set tail [FileTail $basepath $fullpath] + set lev [llength [file split $tail]] + set base {} + for {set i 1} {$i<$lev} {incr i} {append base ../} + append base [file tail $tail] + } + + ## ________________________ Borrowed from BWidget _________________________ ## + + # Command BWidget::place ----> apave::place + # + # Notes: + # For Windows systems with more than one monitor the available screen area may + # have negative positions. Geometry settings with negative numbers are used + # under X to place wrt the right or bottom of the screen. On windows, Tk + # continues to do this. However, a geometry such as 100x100+-200-100 can be + # used to place a window onto a secondary monitor. Passing the + gets Tk + # to pass the remainder unchanged so the Windows manager then handles -200 + # which is a position on the left hand monitor. + # I've tested this for left, right, above and below the primary monitor. + # Currently there is no way to ask Tk the extent of the Windows desktop in + # a multi monitor system. Nor what the legal co-ordinate range might be. + # + + proc place { path w h args } { + + update idletasks + + # If the window is not mapped, it may have any current size. + # Then use required size, but bound it to the screen width. + # This is mostly inexact, because any toolbars will still be removed + # which may reduce size. + if { $w == 0 && [winfo ismapped $path] } { + set w [winfo width $path] + } else { + if { $w == 0 } { + set w [winfo reqwidth $path] + } + set vsw [winfo vrootwidth $path] + if { $w > $vsw } { set w $vsw } + } + + if { $h == 0 && [winfo ismapped $path] } { + set h [winfo height $path] + } else { + if { $h == 0 } { + set h [winfo reqheight $path] + } + set vsh [winfo vrootheight $path] + if { $h > $vsh } { set h $vsh } + } + + set arglen [llength $args] + if { $arglen > 3 } { + return -code error "apave::place: bad number of argument" + } + + if { $arglen > 0 } { + set where [lindex $args 0] + set list [list at center left right above below] + set idx [lsearch $list $where] + if { $idx == -1 } { + return -code error "apave::place: bad position: $where $list" + } + if { $idx == 0 } { + set err [catch { + # purposely removed the {} around these expressions - [PT] + set x [expr int([lindex $args 1])] + set y [expr int([lindex $args 2])] + } e] + if { $err } { + return -code error "apave::place: bad position: $e" + } + if {$::tcl_platform(platform) eq {windows}} { + # handle windows multi-screen. -100 != +-100 + if {[string index [lindex $args 1] 0] ne {-}} { + set x +$x + } + if {[string index [lindex $args 2] 0] ne {-}} { + set y +$y + } + } else { + if { $x >= 0 } { + set x +$x + } + if { $y >= 0 } { + set y +$y + } + } + } else { + if { $arglen == 2 } { + set widget [lindex $args 1] + if { ![winfo exists $widget] } { + return -code error "apave::place: \"$widget\" does not exist" + } + } else { + set widget . + } + set sw [winfo screenwidth $path] + set sh [winfo screenheight $path] + if { $idx == 1 } { + if { $arglen == 2 } { + # center to widget + set x0 [expr {[winfo rootx $widget] + ([winfo width $widget] - $w)/2}] + set y0 [expr {[winfo rooty $widget] + ([winfo height $widget] - $h)/2}] + } else { + # center to screen + set x0 [expr {($sw - $w)/2 - [winfo vrootx $path]}] + set y0 [expr {($sh - $h)/2 - [winfo vrooty $path]}] + } + set x +$x0 + set y +$y0 + if {$::tcl_platform(platform) ne {windows}} { + if { $x0+$w > $sw } {set x {-0}; set x0 [expr {$sw-$w}]} + if { $x0 < 0 } {set x {+0}} + if { $y0+$h > $sh } {set y {-0}; set y0 [expr {$sh-$h}]} + if { $y0 < 0 } {set y {+0}} + } + } else { + set x0 [winfo rootx $widget] + set y0 [winfo rooty $widget] + set x1 [expr {$x0 + [winfo width $widget]}] + set y1 [expr {$y0 + [winfo height $widget]}] + if { $idx == 2 || $idx == 3 } { + set y +$y0 + if {$::tcl_platform(platform) ne {windows}} { + if { $y0+$h > $sh } {set y {-0}; set y0 [expr {$sh-$h}]} + if { $y0 < 0 } {set y {+0}} + } + if { $idx == 2 } { + # try left, then right if out, then 0 if out + if { $x0 >= $w } { + set x [expr {$x0-$w}] + } elseif { $x1+$w <= $sw } { + set x +$x1 + } else { + set x {+0} + } + } else { + # try right, then left if out, then 0 if out + if { $x1+$w <= $sw } { + set x +$x1 + } elseif { $x0 >= $w } { + set x [expr {$x0-$w}] + } else { + set x {-0} + } + } + } else { + set x +$x0 + if {$::tcl_platform(platform) ne {windows}} { + if { $x0+$w > $sw } {set x {-0}; set x0 [expr {$sw-$w}]} + if { $x0 < 0 } {set x {+0}} + } + if { $idx == 4 } { + # try top, then bottom, then 0 + if { $h <= $y0 } { + set y [expr {$y0-$h}] + } elseif { $y1+$h <= $sh } { + set y +$y1 + } else { + set y {+0} + } + } else { + # try bottom, then top, then 0 + if { $y1+$h <= $sh } { + set y +$y1 + } elseif { $h <= $y0 } { + set y [expr {$y0-$h}] + } else { + set y {-0} + } + } + } + } + } + + ## If there's not a + or - in front of the number, we need to add one. + if {[string is integer [string index $x 0]]} { set x +$x } + if {[string is integer [string index $y 0]]} { set y +$y } + + wm geometry $path "${w}x${h}${x}${y}" + } else { + wm geometry $path "${w}x${h}" + } + update idletasks + } + + ## ________________________ EONS apave _________________________ ## + +} + +# ________________________ APave _________________________ # + +oo::class create ::apave::APave { + + superclass ::apave::APaveDialog + + variable _savedvv + + constructor {args} { + # Creates APave object. + # win - window's name (path) + # args - additional arguments + + set _savedvv [list] + if {[llength [self next]]} { next {*}$args } + } + + destructor { + # Clears variables used in the object. + + my initInput + unset _savedvv + if {[llength [self next]]} next + } + #_______________________ + + method initInput {} { + # Initializes input and clears variables made in previous session. + + foreach {vn vv} $_savedvv { + catch {unset $vn} + } + set _savedvv [list] + set Widgetopts [list] + } + #_______________________ + + method varInput {} { + # Gets variables made and filled in a previous session + # as a list of "varname varvalue" pairs where varname + # is of form: namespace::var$widgetname. + + return $_savedvv + } + #_______________________ + + method valueInput {} { + # Gets input variables' values. + + set _values {} + foreach {vnam -} [my varInput] { + lappend _values [set $vnam] + } + return $_values + } + #_______________________ + + method input {icon ttl iopts args} { + # Makes and runs an input dialog. + # icon - icon (omitted if equals to "") + # ttl - title of window + # iopts - list of widgets and their attributes + # args - list of dialog's attributes + # The `iopts` contains lists of three items: + # name - name of widgets + # prompt - prompt for entering data + # valopts - value options + # The `valopts` is a list specific for a widget's type, however + # a first item of `valopts` is always an initial input value. + + if {$iopts ne {}} { + my initInput ;# clear away all internal vars + } + set pady "-pady 2" + if {[set focusopt [::apave::getOption -focus {*}$args]] ne {}} { + set focusopt "-focus $focusopt" + } + lappend inopts [list fraM + T 1 98 "-st nsew $pady -rw 1"] + set savedvv [list] + set frameprev {} + foreach {name prompt valopts} $iopts { + if {$name eq {}} continue + lassign $prompt prompt gopts attrs + lassign [::apave::extractOptions attrs -method {} -toprev {}] ismeth toprev + if {[string toupper $name 0] eq $name} { + set ismeth yes ;# overcomes the above setting + set name [string tolower $name 0] + } + set ismeth [string is true -strict $ismeth] + set gopts "$pady $gopts" + set typ [string tolower [string range $name 0 1]] + if {$typ eq "v_" || $typ eq "se"} { + lappend inopts [list fraM.$name - - - - "pack -fill x $gopts"] + continue + } + set tvar "-tvar" + switch -exact -- $typ { + ch { set tvar "-var" } + sp { set gopts "$gopts -expand 0 -side left"} + } + set framename fraM.fra$name + if {$typ in {lb te tb}} { ;# the widgets sized vertically + lappend inopts [list $framename - - - - "pack -expand 1 -fill both"] + } else { + lappend inopts [list $framename - - - - "pack -fill x"] + } + set vv [my varName $name] + set ff [my FieldName $name] + set Name [string toupper $name 0] + if {$ismeth && $typ ni {ra}} { + # -method option forces making "WidgetName" method from "widgetName" + my MakeWidgetName $ff $Name - + } + if {$typ ne {la} && $toprev eq {}} { + set takfoc [::apave::parseOptions $attrs -takefocus 1] + if {$focusopt eq {} && $takfoc} { + if {$typ in {fi di cl fo da}} { + set _ en*$name ;# 'entry-like mega-widgets' + } elseif {$typ eq "ft"} { + set _ te*$name ;# ftx - 'text-like mega-widget' + } else { + set _ $name + } + set focusopt "-focus $_" + } + if {$typ in {lb tb te}} {set anc nw} {set anc w} + lappend inopts [list fraM.fra$name.labB$name - - - - \ + "pack -side left -anchor $anc -padx 3" \ + "-t \"$prompt\" -font \ + \"-family {[my basicTextFont]} -size [my basicFontSize]\""] + } + # for most widgets: + # 1st item of 'valopts' list is the current value + # 2nd and the rest of 'valopts' are a list of values + if {$typ ni {fc te la}} { + # curr.value can be set with a variable, so 'subst' is applied + set vsel [lindex $valopts 0] + catch {set vsel [subst -nocommands -nobackslashes $vsel]} + set vlist [lrange $valopts 1 end] + } + if {[set msgLab [::apave::getOption -msgLab {*}$attrs]] ne {}} { + set attrs [::apave::removeOptions $attrs -msgLab] + } + # define a current widget's info + switch -exact -- $typ { + lb - tb { + set $vv $vlist + lappend attrs -lvar $vv + if {$vsel ni {{} -}} { + lappend attrs -lbxsel "$::apave::UFF$vsel$::apave::UFF" + } + lappend inopts [list $ff - - - - \ + "pack -side left -expand 1 -fill both $gopts" $attrs] + lappend inopts [list fraM.fra$name.sbv$name $ff L - - "pack -fill y"] + } + cb { + if {![info exist $vv]} {catch {set $vv $vsel}} + lappend attrs -tvar $vv -values $vlist + if {$vsel ni {{} -}} { + lappend attrs -cbxsel $::apave::UFF$vsel$::apave::UFF + } + lappend inopts [list $ff - - - - "pack -side left -expand 1 -fill x $gopts" $attrs] + } + fc { + if {![info exist $vv]} {catch {set $vv {}}} + lappend inopts [list $ff - - - - "pack -side left -expand 1 -fill x $gopts" "-tvar $vv -values \{$valopts\} $attrs"] + } + op { + set $vv $vsel + lappend inopts [list $ff - - - - "pack -fill x $gopts" "$vv $vlist"] + } + ra { + if {![info exist $vv]} {catch {set $vv $vsel}} + set padx 0 + foreach vo $vlist { + set name $name + set FF $ff[incr nnn] + lappend inopts [list $FF - - - - "pack -side left $gopts -padx $padx" "-var $vv -value \"$vo\" -t \"$vo\" $attrs"] + if {$ismeth} { + my MakeWidgetName $FF $Name$nnn - + } + set padx [expr {$padx ? 0 : 9}] + } + } + te { + if {![info exist $vv]} { + set valopts [string map [list \\n \n \\t \t] $valopts] + set $vv [string map [list \\\\ \\ \\\} \} \\\{ \{] $valopts] + } + if {[dict exist $attrs -state] && [dict get $attrs -state] eq "disabled"} \ + { + # disabled text widget cannot be filled with a text, so we should + # compensate this through a home-made attribute (-disabledtext) + set disattr "-disabledtext \{[set $vv]\}" + } elseif {[dict exist $attrs -readonly] && [dict get $attrs -readonly] || [dict exist $attrs -ro] && [dict get $attrs -ro]} { + set disattr "-rotext \{[set $vv]\}" + set attrs [::apave::removeOptions $attrs -readonly -ro] + } else { + set disattr {} + } + lappend inopts [list $ff - - - - "pack -side left -expand 1 -fill both $gopts" "$attrs $disattr"] + lappend inopts [list fraM.fra$name.sbv$name $ff L - - "pack -fill y"] + } + la { + if {$prompt ne {}} { set prompt "-t \"$prompt\" " } ;# prompt as -text + lappend inopts [list $ff - - - - "pack -anchor w $gopts" "$prompt$attrs"] + continue + } + bu - bt - ch { + set prompt {} + if {$toprev eq {}} { + lappend inopts [list $ff - - - - \ + "pack -side left -expand 1 -fill both $gopts" "$tvar $vv $attrs"] + } else { + lappend inopts [list $frameprev.$name - - - - \ + "pack -side left $gopts" "$tvar $vv $attrs"] + } + if {$vv ne {}} { + if {![info exist $vv]} { + catch { + if {$vsel eq {}} {set vsel 0} + set $vv $vsel + } + } + } + } + default { + if {$vlist ne {}} {lappend attrs -values $vlist} + lappend inopts [list $ff - - - - \ + "pack -side left -expand 1 -fill x $gopts" "$tvar $vv $attrs"] + if {$vv ne {}} { + if {![info exist $vv]} {catch {set $vv $vsel}} + } + } + } + if {$msgLab ne {}} { + lassign $msgLab lab msg attlab + set lab [my parentWName [lindex $inopts end 0]].$lab + if {$msg ne {}} {set msg "-t {$msg}"} + append msg " $attlab" + lappend inopts [list $lab - - - - "pack -side left -expand 1 -fill x" $msg] + } + if {![info exist $vv]} {set $vv {}} + lappend _savedvv $vv [set $vv] + set frameprev $framename + } + lassign [::apave::parseOptions $args -titleHELP {} -buttons {} -comOK 1 \ + -titleOK OK -titleCANCEL Cancel -centerme {}] \ + titleHELP buttons comOK titleOK titleCANCEL centerme + if {$titleHELP eq {}} { + set butHelp {} + } else { + lassign $titleHELP title command + set butHelp [list butHELP $title $command] + } + if {$titleCANCEL eq {}} { + set butCancel {} + } else { + set butCancel "butCANCEL $titleCANCEL destroy" + } + if {$centerme eq {}} { + set centerme {-centerme 1} + } else { + set centerme "-centerme $centerme" + } + set args [::apave::removeOptions $args \ + -titleHELP -buttons -comOK -titleOK -titleCANCEL -centerme -modal] + lappend args {*}$focusopt + if {[catch { + lassign [my PrepArgs {*}$args] args + set res [my Query $icon $ttl {} \ + "$butHelp $buttons butOK $titleOK $comOK $butCancel" \ + butOK $inopts $args {} {*}$centerme -input yes]} e] + } then { + catch {destroy $Dlgpath} ;# Query's window + set under \n[string repeat _ 80]\n\n + ::apave::obj ok err "ERROR" "\n$e$under $inopts$under $args$under $centerme" \ + -t 1 -head "\nAPave error: \n" -hfg red -weight bold -w 80 + return 0 + } + if {![lindex $res 0]} { ;# restore old values if OK not chosen + foreach {vn vv} $_savedvv { + # tk_optionCascade (destroyed now) was tracing its variable => catch + catch {set $vn $vv} + } + } + return $res + } + #_______________________ + + method vieweditFile {fname {prepcom ""} args} { + # Views or edits a file. + # fname - name of file + # prepcom - a command performing before and after creating a dialog + # args - additional options + # It's a sort of stub for calling *editfile* method. + # See also: editfile + + my editfile $fname {} {} {} $prepcom {*}$args + } + #_______________________ + + method editfile {fname fg bg cc {prepcom ""} args} { + # Edits or views a file with a set of main colors + # fname - name of file + # fg - foreground color of text widget + # bg - background color of text widget + # cc - caret's color of text widget + # prepcom - a command performing before and after creating a dialog + # args - additional options (`-readonly 1` for viewing the file). + # If *fg* isn't empty, all three colors are used to color a text. + # See also: + # [aplsimple.github.io](https://aplsimple.github.io/en/tcl/pave/index.html) + + if {$fname eq {}} { + return false + } + set newfile 0 + if {[catch {set filetxt [::apave::readTextFile $fname {} yes]}]} { + return false + } + lassign [::apave::parseOptions $args -rotext {} -readonly 1 -ro 1] rotext readonly ro + lassign [::apave::extractOptions args -buttons {}] buttadd + set btns {Close 0} ;# by default 'view' mode + set oper VIEW + if {$rotext eq {} && (!$readonly || !$ro)} { + set btns {Save 1 Close 0} + set oper EDIT + } + if {$fg eq {}} { + set tclr {} + } else { + set tclr "-fg $fg -bg $bg -cc $cc" + } + if {$prepcom eq {}} {set aa {}} {set aa [$prepcom filetxt]} + set res [my misc {} "$oper: $fname" "$filetxt" "$buttadd $btns" \ + TEXT -text 1 -w {100 80} -h 32 {*}$tclr \ + -post $prepcom {*}$aa {*}$args] + set data [string range $res 2 end] + if {[set res [string index $res 0]] eq "1"} { + set data [string range $data [string first " " $data]+1 end] + set data [string trimright $data] + set res [::apave::writeTextFile $fname data] + } elseif {$newfile} { + file delete $fname + } + return $res + } + #_______________________ + + method onTop {wpar top {wtoplist -} {res ""}} { + # Sets -topmost attribute for windows or gets a list of topmost windows. + # wpar - parent window's path + # top - -topmost attribute's value + # wtoplist - list of windows to process + # res - used to get the result + # Returns a list of "topmost=$top" windows found on $wpar path. + + if {$wtoplist ne "-"} { + # sets the attribute + foreach w $wtoplist {wm attributes $w -topmost $top} + } else { + # gets a list of topmost windows + if {$wpar ne {}} { + set res [my onTop [winfo parent $wpar] $top - $res] + catch { + if {[wm attributes $wpar -topmost]==$top} {lappend res $wpar} + } + } + } + return $res + } + +# ________________________ EONS _________________________ # + +} +# ________________________ EOF _________________________ # diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apavebase.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apavebase.tcl new file mode 100644 index 00000000..971bea5f --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apavebase.tcl @@ -0,0 +1,4073 @@ +########################################################### +# Name: apavebase.tcl +# Author: Alex Plotnikov (aplsimple@gmail.com) +# Date: 12/09/2021 +# Brief: Handles APaveBase class, sort of geometry manager. +# License: MIT. +########################################################### + +# ________________________ TCLLIBPATH _________________________ # + +# use TCLLIBPATH variable (some tclkits don't see it) +catch { + foreach _ [lreverse $::env(TCLLIBPATH)] { + set _ [file normalize $_] + if {[lsearch -exact $::auto_path $_]<0 && [file exists $_]} { + set ::auto_path [linsert $::auto_path 0 $_] + } + } +} +unset -nocomplain _ + +# _____ Remove installed subpackages of apave _____ # + +foreach _ {baltip bartabs hl_tcl} { + catch {package forget $_} + catch {namespace delete ::$_} +} +unset -nocomplain _ + +# ________________________ apave NS _________________________ # + +namespace eval ::apave { + + variable SRCDIR [file normalize [file dirname [info script]]] + + ## ________________________ apave variables _________________________ ## + + variable ISBALTIP yes + variable cursorwidth 1 + variable apaveDir [file dirname [info script]] + variable _AP_ICO { none folder OpenFile SaveFile saveall print font color \ + date help home misc terminal run tools file find replace other view \ + categories actions config pin cut copy paste plus minus add delete \ + change diagram box trash double more undo redo up down previous next \ + previous2 next2 upload download tag tagoff tree lock light restricted \ + attach share mail www map umbrella gulls sound heart clock people info \ + err warn ques retry yes no ok cancel exit } + variable _AP_IMG; array set _AP_IMG [list] + variable _AP_VARS; array set _AP_VARS [list] + set _AP_VARS(APPICON) {} + set _AP_VARS(.,MODALS) 0 + set _AP_VARS(WPAVE) {} + set _AP_VARS(TIMW) [list] + set _AP_VARS(LINKFONT) [list -underline 1] + set _AP_VARS(INDENT) " " + set _AP_VARS(KEY,F3) F3 + set _AP_VARS(KEY,CtrlA) [list Control-A Control-a] + set _AP_VARS(KEY,CtrlD) [list Control-D Control-d] + set _AP_VARS(KEY,CtrlY) [list Control-Y Control-y] + set _AP_VARS(KEY,CtrlT) [list Control-T Control-t] + set _AP_VARS(KEY,CtrlB) [list Control-B Control-b] + set _AP_VARS(KEY,CtrlE) [list Control-E Control-e] + set _AP_VARS(KEY,AltQ) [list Alt-Q Alt-q] + set _AP_VARS(KEY,AltW) [list Alt-W Alt-w] + variable _AP_VISITED; array set _AP_VISITED [list] + set _AP_VISITED(ALL) [list] + variable UFF "\uFFFF" + variable MC_NS {} FOCUSED {} + + ## _ default options & attributes of widgets _ ## + + variable _Defaults [dict create \ + bts {{} {}} \ + but {{} {}} \ + buT {{} {-width -20 -pady 1}} \ + btT {{} {-width -20 -pady 1 -relief flat -overrelief raised -highlightthickness 0 -takefocus 0}} \ + can {{} {}} \ + chb {{} {}} \ + swi {{} {}} \ + chB {{} {-relief sunken -padx 6 -pady 2}} \ + cbx {{} {}} \ + fco {{} {}} \ + ent {{} {}} \ + enT {{} {-insertwidth $::apave::cursorwidth -insertofftime 250 -insertontime 750}} \ + fil {{} {}} \ + fis {{} {}} \ + dir {{} {}} \ + fon {{} {}} \ + clr {{} {}} \ + dat {{} {}} \ + fiL {{} {}} \ + fiS {{} {}} \ + diR {{} {}} \ + foN {{} {}} \ + clR {{} {}} \ + daT {{} {}} \ + sta {{} {}} \ + too {{} {}} \ + fra {{} {-takefocus 0}} \ + frA {{} {-takefocus 0}} \ + ftx {{} {}} \ + gut {{} {-width 0 -highlightthickness 1}} \ + lab {{-sticky w} {-takefocus 0}} \ + laB {{-sticky w} {-takefocus 0}} \ + lfr {{} {-takefocus 0}} \ + lfR {{} {-relief groove -takefocus 0}} \ + lbx {{} {-activestyle none -exportselection 0 -selectmode browse}} \ + flb {{} {}} \ + meb {{} {}} \ + meB {{} {}} \ + nbk {{} {}} \ + opc {{} {}} \ + pan {{} {}} \ + pro {{} {}} \ + rad {{} {}} \ + raD {{} {-padx 6 -pady 2}} \ + sca {{} {-orient horizontal -takefocus 0}} \ + scA {{} {-orient horizontal -takefocus 0}} \ + sbh {{-sticky ew} {-orient horizontal -takefocus 0}} \ + sbH {{-sticky ew} {-orient horizontal -takefocus 0}} \ + sbv {{-sticky ns} {-orient vertical -takefocus 0}} \ + sbV {{-sticky ns} {-orient vertical -takefocus 0}} \ + scf {{} {}} \ + seh {{-sticky ew} {-orient horizontal -takefocus 0}} \ + sev {{-sticky ns} {-orient vertical -takefocus 0}} \ + siz {{} {}} \ + spx {{} {}} \ + spX {{} {}} \ + tbl {{} {-selectborderwidth 1 -highlightthickness 2 \ + -labelcommand tablelist::sortByColumn -stretch all \ + -showseparators 1}} \ + tex {{} {-undo 1 -maxundo 0 -highlightthickness 2 -insertofftime 250 -insertontime 750 -insertwidth $::apave::cursorwidth -wrap word -selborderwidth 1 -exportselection 0}} \ + tre {{} {-selectmode browse}} \ + h_ {{-sticky ew -csz 3 -padx 3} {}} \ + v_ {{-sticky ns -rsz 3 -pady 3} {}}] + + ## _______________________ Helpers _____________________ ## + + proc WindowStatus {w name {val ""} {defval ""}} { + # Sets/gets a status of window. The status is a value assigned to a name. + # w - window's path + # name - name of status + # val - if blank, to get a value of status; otherwise a value to set + # defval - default value (actual if the status not set beforehand) + # Returns a value of status. + # See also: IntStatus + + variable _AP_VARS + if {$val eq {}} { ;# getting + if {[info exist _AP_VARS($w,$name)]} { + return $_AP_VARS($w,$name) + } + return $defval + } + set _AP_VARS($w,$name) $val ;# setting + } + #_______________________ + + proc mainWindowOfApp {{win ""}} { + # Sets/gets a main window of application. + # win - window's path + # This should be run at application start, before opening any window. + + WindowStatus . MAIN_WINDOW_OF_APP $win + } + #_______________________ + + proc IntStatus {w {name "status"} {val ""}} { + # Sets/gets a status of window. The status is an integer assigned to a name. + # w - window's path + # name - name of status + # val - if blank, to get a value of status; otherwise a value to set + # Default value of status is 0. + # Returns an old value of status. + # See also: WindowStatus + + set old [WindowStatus $w $name {} 0] + if {$val ne {}} {WindowStatus $w $name $val 1} + return $old + } + #_______________________ + + proc iconImage {{icon ""} {iconset "small"} {doit no}} { + # Gets a defined icon's image or list of icons. + # If *icon* equals to "-init", initializes apave's icon set. + # icon - icon's name + # iconset - one of small/middle/large + # doit - force the initialization + # Returns the icon's image or, if *icon* is blank, a list of icons + # available in *apave*. + + variable _AP_IMG + variable _AP_ICO + if {$icon eq {}} {return $_AP_ICO} + ; proc imagename {icon} { # Get a defined icon's image name + return _AP_IMG(img$icon) + } + variable apaveDir + if {![array size _AP_IMG] || $doit} { + # Make images of icons + source [file join $apaveDir apaveimg.tcl] + if {$iconset ne "small"} { + foreach ic $_AP_ICO { ;# small icons best fit for menus + set _AP_IMG($ic-small) [set _AP_IMG($ic)] + } + if {$iconset eq "middle"} { + source [file join $apaveDir apaveimg2.tcl] + } else { + source [file join $apaveDir apaveimg2.tcl] ;# TODO + } + } + foreach ic $_AP_ICO { + if {[catch {image create photo [imagename $ic] -data [set _AP_IMG($ic)]}]} { + # some png issues on old Tk + image create photo [imagename $ic] -data [set _AP_IMG(none)] + } elseif {$iconset ne "small"} { + image create photo [imagename $ic-small] -data [set _AP_IMG($ic-small)] + } + } + } + if {$icon eq "-init"} {return $_AP_ICO} ;# just to get to icons + if {$icon ni $_AP_ICO} {set icon [lindex $_AP_ICO 0]} + if {$iconset eq "small" && "_AP_IMG(img$icon-small)" in [image names]} { + set icon $icon-small + } + return [imagename $icon] + } + #_______________________ + + proc iconData {{icon "info"} {iconset ""}} { + # Gets an icon's data. + # icon - icon's name + # iconset - one of small/middle/large + # Returns data of the icon. + + variable _AP_IMG + iconImage -init + if {$iconset ne {} && "_AP_IMG(img$icon-$iconset)" in [image names]} { + return [set _AP_IMG($icon-$iconset)] + } + set _AP_IMG($icon) + } + #_______________________ + + proc setAppIcon {win {winicon ""}} { + # Sets application's icon. + # win - path to a window of application + # winicon - data of icon + # The *winicon* may be a contents of variable (as supposed by default) or + # a file's name containing th image data. + # If it fails to find an image in either, no icon is set. + + variable _AP_VARS + set _AP_VARS(APPICON) {} + if {$winicon ne {}} { + if {[catch {set _AP_VARS(APPICON) [image create photo -data $winicon]}]} { + catch {set _AP_VARS(APPICON) [image create photo -file $winicon]} + } + } + if {$_AP_VARS(APPICON) ne {}} {wm iconphoto $win -default $_AP_VARS(APPICON)} + } + #_______________________ + + proc getAppIcon {} { + # Gets application's icon. + + variable _AP_VARS + return $_AP_VARS(APPICON) + } + #_______________________ + + proc precedeWidgetName {widname prename} { + # Adds a preceding name to a tail name of widget. + # widname - widget's full name + # prename - preceding name + # Useful at getting a entry/button name of chooser. + + # Example: + # set wentry [::apave::precedeWidgetName [$pobj DirToChoose] ent] + # See also: APaveBase::Replace_chooser + + set p [string last . $widname] + set res [string range $widname 0 $p] + append res $prename [string range $widname $p+1 end] + return $res + } + #_______________________ + + proc defaultAttrs {{type ""} {opts ""} {atrs ""} {widget ""}} { + # Sets, gets or registers default options and attributes for widget type. + # type - widget type + # opts - new default grid/pack options + # atrs - new default attributes + # widget - Tcl/Tk command for the new registered widget type + # See also: APaveBase::defaultATTRS + + obj defaultATTRS $type $opts $atrs $widget + } + #_______________________ + + proc focusApp {{win ""}} { + # Saves (if *win* is set) or restores app's focus. + # win - focused window's path + # In some DE, if app loses focus, restoring it + # focuses main window, ignores modal toplevel, locks keyboard. + # focusApp tries to focus on last modal window. + + variable FOCUSED + if {$win ne {}} { + setProperty FOCW_$win [focus] + return + } + catch { + if {[set foc [focus]] ne {}} { + set foc [winfo toplevel $foc] + set modal 0 + foreach fw $FOCUSED { + if {$fw eq $foc} {set modal 1; break} + } + # if non-modal is currently focused, let it be so + if {!$modal} { + if {[focus] eq $foc} {catch {focus [getProperty FOCW_$foc]}} + return + } + } + # find and focus last open modal + for {set i [llength $FOCUSED]} {$i} {} { + set fw [lindex $FOCUSED [incr i -1]] + if {[winfo exists $fw]} { + if {$fw ne $foc} { + focus -force $fw + catch {focus [getProperty FOCW_$fw]} + } + break + } + set FOCUSED [lreplace $FOCUSED $i $i] + } + } + } + + ## _______________________ Text little procs _________________________ ## + + proc eventOnText {w ev} { + # Generates an event on a text, saving its current index in hl_tcl. + # w - text widget's path + # ev - event + # The hl_tcl needs to call MemPos before any action changing the text. + + catch {::hl_tcl::my::MemPos $w} + if {[catch {$w tag ranges sel} sels]} {set sels [list]} + switch -exact -- $ev { + <> - <> { + if {[set llen [expr {[llength $sels]-1}]] < 2} return + # multiple ranges of selection: + # first, copy all selections to clipboard + clipboard clear -displayof $w + foreach {pos1 pos2} $sels { + clipboard append -displayof $w [$w get $pos1 $pos2] + } + if {$ev eq {<>}} { + # for Cut event: delete all selections + for {set i $llen} {$i>0} {incr i -2} { + set pos1 [lindex $sels $i-1] + set pos2 [lindex $sels $i] + $w delete $pos1 $pos2 + } + } + return -code break + } + default { + event generate $w $ev + } + } + } + #_______________________ + + proc getTextHotkeys {key} { + # Gets upper & lower keys for a hot key. + # key - the hot key + + variable _AP_VARS + if {![info exist _AP_VARS(KEY,$key)]} {return [list]} + set keys $_AP_VARS(KEY,$key) + if {[llength $keys]==1} { + if {[set i [string last - $keys]]>0} { + set lt [string range $keys $i+1 end] + if {[string length $lt]==1} { ;# for lower case of letters + set keys "[string range $keys 0 $i][string toupper $lt]" + lappend keys "[string range $keys 0 $i][string tolower $lt]" + } + } + } + return $keys + } + #_______________________ + + proc setTextHotkeys {key value} { + # Sets new key combinations for some operations on text widgets. + # key - ctrlD for "double selection", ctrlY for "delete line" operation + # value - list of new key combinations + + variable _AP_VARS + set _AP_VARS(KEY,$key) $value + } + #_______________________ + + proc setTextIndent {len {padchar { }}} { + # Sets an indenting for text widgets. + # len - length of indenting + # padchar - indenting character + + variable _AP_VARS + if {$padchar ne "\t"} {set padchar { }} + set _AP_VARS(INDENT) [string repeat $padchar $len] + } + + ## ________________________ EONS ::apave _________________________ ## + +} + +# ________________________ source *.tcl _________________________ # + +# Let the *.tcl be sourced here just to ensure +# that apave's stuff available for them and vice versa. + +source [file join $::apave::apaveDir obbit.tcl] + +# ________________________ APaveBase oo::class _________________________ # + +oo::class create ::apave::APaveBase { + + mixin ::apave::ObjectTheming + + variable PV Moveall Initialcolor Modalwin Fgbut Bgbut Fgtxt Bgtxt Prepost Widgetopts Edge + + constructor {{cs -2} args} { + # Creates APaveBase object. + # cs - color scheme (CS) + # args - additional arguments + # If cs>-2, the appropriate CS is set for the created APaveBase object. + # Makes few procedures in the object's namespace to access from + # event handlers: + # - ListboxHandle + # - ListboxSelect + # - WinResize + # This trick with *proc* inside an object is discussed at + # [proc-in-tcl-ooclass](https://stackoverflow.com/questions/54804964/proc-in-tcl-ooclass) + + # keep the 'important' data of Pave object in array + array set PV [list] + set Moveall 1 + set Initialcolor {} + set Modalwin . + set Fgbut [ttk::style lookup TButton -foreground]; if {$Fgbut eq {}} {set Fgbut #000000} + set Bgbut [ttk::style lookup TButton -background]; if {$Bgbut eq {}} {set Bgbut #d9d9d9} + set Fgtxt [ttk::style lookup TEntry -foreground] ; if {$Fgtxt eq {}} {set Fgtxt #000000} + set Prepost [list] + set Widgetopts [list] + set Edge @@ + if {$Fgtxt in {black #000000}} { + set Bgtxt white + } else { + set Bgtxt [ttk::style lookup TEntry -background] + } + # set/reset a color scheme if it is/was requested + if {$cs>=-1} {my csSet $cs} {my initTooltip} + + # object's procedures + + ; proc ListboxHandle {W offset maxChars} { + + set list {} + foreach index [$W curselection] { lappend list [$W get $index] } + set text [join $list \n] + return [string range $text $offset [expr {$offset+$maxChars-1}]] + } + + ; proc ListboxSelect {W} { + # This code had been taken from Tcl's wiki: + # https://wiki.tcl-lang.org/page/listbox+selection + + selection clear -displayof $W + selection own -command {} $W + selection handle -type UTF8_STRING \ + $W [list [namespace current]::ListboxHandle $W] + selection handle \ + $W [list [namespace current]::ListboxHandle $W] + return + } + + ; proc WinResize {win} { + # Restricts the window's sizes (thus fixing Tk's issue with a menubar) + # win - path to a window to be of restricted sizes + + if {[$win cget -menu] ne {}} { + lassign [::apave::splitGeometry [wm geometry $win]] w h + lassign [wm minsize $win] wmin hmin + if {$w<$wmin && $h<$hmin} { + set corrgeom ${wmin}x$hmin + } elseif {$w<$wmin} { + set corrgeom ${wmin}x$h + } elseif {$h<$hmin} { + set corrgeom ${w}x$hmin + } else { + return + } + wm geometry $win $corrgeom + } + return + } + + # the end of APaveBase constructor + if {[llength [self next]]} { next {*}$args } + return + } + + destructor { + # Clears variables used in the object. + + array unset PV * + if {[llength [self next]]} next + } + + ## _______________________ Methods to be redefined ____________________ ## + + method themePopup {mnu} { + # Applies a color scheme to a popup menu. + # mnu - name of popup menu + # The method is to be redefined in descendants/mixins. + + } + + method NonTtkTheme {win} { + # Applies a current color scheme for non-ttk widgets. + # win - path to a window to be colored. + # Method to be redefined in descendants/mixins. + + } + + method NonTtkStyle {typ {dsbl 0}} { + # Gets a style for non-ttk widgets. + # typ - the type of widget (in apave terms, i.e. but, buT etc.) + # dsbl - a mode to get style of disabled (1) or readonly (2) widgets + # See also: widgetType + # Method to be redefined in descendants/mixins. + + } + + ## _______________________ Helpers for APaveBase ________________________ ## + + method paveoptionValue {opt} { + # Gets an option's value. + # opt - option's name + # Returns a value for options like "Moveall". + + if {$opt in [info object vars [self]]} { + variable $opt + return [set $opt] + } + return {} + } + #_______________________ + + method checkXY {w h x y} { + # Checks the coordinates of window (against the screen). + # w - width of window + # h - height of window + # x - window's X coordinate + # y - window's Y coordinate + # Returns new coordinates in +X+Y form. + + # check for left/right edge of screen (accounting decors) + set scrw [expr {[winfo vrootwidth .] - 12}] + set scrh [expr {[winfo vrootheight .] - 36}] + if {($x + $w) > $scrw } { + set x [expr {$scrw - $w}] + } + if {($y + $h) > $scrh } { + set y [expr {$scrh - $h}] + } + if {![string match -* $x]} {set x +[string trimleft $x +]} + if {![string match -* $y]} {set y +[string trimleft $y +]} + return $x$y + } + #_______________________ + + method CenteredXY {rw rh rx ry w h} { + # Gets the coordinates of centered window (against its parent). + # rw - parent's width + # rh - parent's height + # rx - parent's X coordinate + # ry - parent's Y coordinate + # w - width of window to be centered + # h - height of window to be centered + # Returns centered coordinates in +X+Y form. + + set x [expr {max(0, $rx + ($rw - $w) / 2)}] + set y [expr {max(0,$ry + ($rh - $h) / 2)}] + my checkXY $w $h $x $y + } + #_______________________ + + method ownWName {name} { + # Gets a tail (last part) of widget's name + # name - name (path) of the widget + + lindex [split $name .] end + } + #_______________________ + + method parentWName {name} { + # Gets parent name of widget. + # name - name (path) of the widget + + string range $name 0 [string last . $name]-1 + } + #_______________________ + + method iconA {icon {iconset small} {cmpd left}} { + # Gets icon attributes for buttons, menus etc. + # icon - name of icon + # iconset - one of small/middle/large + # cmpd - value of -compound option + # The *iconset* is "small" for menus (recommended and default). + + return "-image [::apave::iconImage $icon $iconset] -compound $cmpd" + } + #_______________________ + + method configure {args} { + # Configures the apave object (all of options may be changed). + # args - list of pairs name/value of options + # Example: + # pobj configure edge "@@" + + foreach {optnam optval} $args {set $optnam $optval} + } + #_______________________ + + method ExpandOptions {options} { + # Expands shortened options. + + set options [string map { + { -st } { -sticky } + { -com } { -command } + { -t } { -text } + { -w } { -width } + { -h } { -height } + { -var } { -variable } + { -tvar } { -textvariable } + { -lvar } { -listvariable } + { -ro } { -readonly } + } " $options"] + return $options + } + #_______________________ + + method AddButtonIcon {w attrsName} { + # Gets the button's icon based on its text and name (e.g. butOK) and + # appends it to the attributes of button. + # w - button's name + # attrsName - name of variable containing attributes of the button + + upvar 1 $attrsName attrs + set com [::apave::getOption -com {*}$attrs] + if {[string is integer -strict $com]} { ;# returned integer result + ::apave::extractOptions attrs -com {} + append attrs " -com {[self] res {[my pavedPath]} $com}" + } + if {[::apave::getOption -image {*}$attrs] ne {}} return + set txt [::apave::getOption -t {*}$attrs] + if {$txt eq {}} { set txt [::apave::getOption -text {*}$attrs] } + set im {} + set icolist [list {exit abort} {exit close} \ + {SaveFile save} {OpenFile open}] + # ok, yes, cancel, apply buttons should be at the end of list + # as their texts can be renamed (e.g. "Help" in e_menu's "About") + lappend icolist {*}[::apave::iconImage] {yes apply} + foreach icon $icolist { + lassign $icon ic1 ic2 + # text of button is of highest priority at defining its icon + if {[string match -nocase $ic1 $txt] || \ + [string match -nocase b*t$ic1 $w] || ($ic2 ne {} && ( \ + [string match -nocase b*t$ic2 $w] || [string match -nocase $ic2 $txt]))} { + if {[string match -nocase btT* $w]} { + set cmpd none + } else { + set cmpd left + } + append attrs " [my iconA $ic1 small $cmpd]" + break + } + } + } + #_______________________ + + method ListboxesAttrs {w attrs} { + # Appends selection attributes to listboxes. + # Details: + # 1. https://wiki.tcl-lang.org/page/listbox+selection + # 2. https://stackoverflow.com, the question: + # the-tablelist-curselection-goes-at-calling-the-directory-dialog + + if {{-exportselection} ni $attrs} { + append attrs " -ListboxSel $w -selectmode extended -exportselection 0" + } + return $attrs + } + #_______________________ + + method getWidChildren {wid treeName {init yes}} { + # Gets children of a widget. + # wid - widget's path + # treeName - name of variable to hold the result. + + upvar $treeName tree + if {$init} {set tree [list]} + foreach ch [winfo children $wid] { + lappend tree $ch + my getWidChildren $ch $treeName no + } + } + #_______________________ + + method findWidPath {wid {mode exact} {visible yes}} { + # Searches a widget's path among the active widgets. + # w - widget name, set partially e.g. "wid" instead of ".win.wid" + # mode - if "exact", searches *.wid; if "globe", searches *wid* + # Returns the widget's full path or "" if the widget isn't active. + + my getWidChildren . tree + if {$mode eq {exact}} { + set i [lsearch -glob $tree "*.$wid"] + } else { + set i [lsearch -glob $tree "*$wid*"] + } + if {$i>-1} {return [lindex $tree $i]} + return {} + } + + ## _______________________ File content widget _______________________ ## + + method FCfieldAttrs {wnamefull attrs varopt} { + # Fills the non-standard attributes of file content widget. + # wnamefull - a widget name + # attrs - a list of all attributes + # varopt - a variable option + # The *varopt* refers to a variable part such as tvar, lvar: + # * -inpval option means an initial value of the field + # * -retpos option has p1:p2 format (e.g. 0:10) to cut a substring \ + from a returned value + # Returns *attrs* without -inpval and -retpos options. + + lassign [::apave::parseOptions $attrs $varopt {} -retpos {} -inpval {}] \ + vn rp iv + if {[string first {-state disabled} $attrs]<0 && $vn ne {}} { + set all {} + if {$varopt eq {-lvar}} { + lassign [::apave::extractOptions attrs -values {} -ALL 0] iv a + if {[string is boolean -strict $a] && $a} {set all ALL} + lappend Widgetopts "-lbxname$all $wnamefull $vn" + } + if {$rp ne {}} { + if {$all ne {}} {set rp 0:end} + lappend Widgetopts "-retpos $wnamefull $vn $rp" + } + } + if {$iv ne {}} { set $vn $iv } + return [::apave::removeOptions $attrs -retpos -inpval] + } + #_______________________ + + method FCfieldValues {wnamefull attrs} { + # Fills the file content widget's values. + # wnamefull - name (path) of fco widget + # attrs - attributes of the widget + + ; proc readFCO {fname} { + # Reads a file's content. + # Returns a list of (non-empty) lines of the file. + if {$fname eq {}} { + set retval {{}} + } else { + set retval {} + foreach ln [::apave::textsplit [::apave::readTextFile $fname {} 1]] { + # probably, it's bad idea to have braces in the file of contents + set ln [string map [list \\ \\\\ \{ \\\{ \} \\\}] $ln] + if {$ln ne {}} {lappend retval $ln} + } + } + return $retval + } + + ; proc contFCO {fline opts edge args} { + # Given a file's line and options, + # cuts a substring from the line. + lassign [::apave::parseOptionsFile 1 $opts {*}$args] opts + lassign $opts - - - div1 - div2 - pos - len - RE - ret + set ldv1 [string length $div1] + set ldv2 [string length $div2] + set i1 [expr {[string first $div1 $fline]+$ldv1}] + set i2 [expr {[string first $div2 $fline]-1}] + set filterfile yes + if {$ldv1 && $ldv2} { + if {$i1<0 || $i2<0} {return $edge} + set retval [string range $fline $i1 $i2] + } elseif {$ldv1} { + if {$i1<0} {return $edge} + set retval [string range $fline $i1 end] + } elseif {$ldv2} { + if {$i2<0} {return $edge} + set retval [string range $fline 0 $i2] + } elseif {$pos ne {} && $len ne {}} { + set retval [string range $fline $pos $pos+[incr len -1]] + } elseif {$pos ne {}} { + set retval [string range $fline $pos end] + } elseif {$len ne {}} { + set retval [string range $fline 0 $len-1] + } elseif {$RE ne {}} { + set retval [regexp -inline $RE $fline] + if {[llength $retval]>1} { + foreach r [lrange $retval 1 end] {append retval_tmp $r} + set retval $retval_tmp + } else { + set retval [lindex $retval 0] + } + } else { + set retval $fline + set filterfile no + } + if {$retval eq {} && $filterfile} {return $edge} + set retval [string map [list "\}" "\\\}" "\{" "\\\{"] $retval] + return [list $retval $ret] + } + + set edge $Edge + set ldv1 [string length $edge] + set filecontents {} + set optionlists {} + set tplvalues {} + set retpos {} + set values [::apave::getOption -values {*}$attrs] + if {[string first $edge $values]<0} { ;# if 1 file, edge + set values "$edge$values$edge" ;# may be omitted + } + # get: files' contents, files' options, template line + set lopts {-list {} -div1 {} -div2 {} -pos {} -len {} -RE {} -ret 0} + while {1} { + set i1 [string first $edge $values] + set i2 [string first $edge $values $i1+1] + if {$i1>=0 && $i2>=0} { + incr i1 $ldv1 + append tplvalues [string range $values 0 $i1-1] + set fdata [string range $values $i1 $i2-1] + lassign [::apave::parseOptionsFile 1 $fdata {*}$lopts] fopts fname + lappend filecontents [readFCO $fname] + lappend optionlists $fopts + set values [string range $values $i2+$ldv1 end] + } else { + append tplvalues $values + break + } + } + # fill the combobox lines, using files' contents and options + if {[set leno [llength $optionlists]]} { + set newvalues {} + set ilin 0 + lassign $filecontents firstFCO + foreach fline $firstFCO { ;# lines of first file for a base + set line {} + set tplline $tplvalues + for {set io 0} {$io<$leno} {incr io} { + set opts [lindex $optionlists $io] + if {$ilin==0} { ;# 1st cycle: add items from -list option + lassign $opts - list1 ;# -list option goes first + if {[llength $list1]} { + foreach l1 $list1 {append newvalues "\{$l1\} "} + lappend Widgetopts "-list $wnamefull [list $list1]" + } + } + set i1 [string first $edge $tplline] + if {$i1>=0} { + lassign [contFCO $fline $opts $edge {*}$lopts] retline ret + if {$ret ne "0" && $retline ne $edge && \ + [string first $edge $line]<0} { + set p1 [expr {[string length $line]+$i1}] + if {$io<($leno-1)} { + set p2 [expr {$p1+[string length $retline]-1}] + } else { + set p2 end + } + set retpos "-retpos $p1:$p2" + } + append line [string range $tplline 0 $i1-1] $retline + set tplline [string range $tplline $i1+$ldv1 end] + } else { + break + } + set fline [lindex [lindex $filecontents $io+1] $ilin] + } + if {[string first $edge $line]<0} { + # put only valid lines into the list of values + append newvalues "\{$line$tplline\} " + } + incr ilin + } + # replace old 'values' attribute with the new 'values' + lassign [::apave::parseOptionsFile 2 $attrs -values \ + [string trimright $newvalues]] attrs + } + return "$attrs $retpos" + } + + ## _______________________ Timeout button _______________________ ## + + method timeoutButton {w tmo lbl {lbltext ""}} { + # Invokes a button's action after a timeout. + # w - button's path + # tmo - timeout in sec. + # lbl - label widget, where seconds to wait are displayed + # lbltext - original text of label + + if {$tmo>0} { + catch {set lbl [my $lbl]} + if {[winfo exist $lbl]} { + if {$lbltext eq {}} { + set lbltext [$lbl cget -text] + lappend ::apave::_AP_VARS(TIMW) $w + } + $lbl configure -text "$lbltext $tmo sec. " + } + incr tmo -1 + after 1000 [list if "\[info commands [self]\] ne {}" \ + "[self] checkTimeoutButton $w $tmo $lbl {$lbltext}"] + return + } + if {[winfo exist $w]} {$w invoke} + } + #_______________________ + + method checkTimeoutButton {w tmo lbl {lbltext ""}} { + # Checks if the timeout button is alive & focused; if not, cancels the timeout. + # w - button's path + # tmo - timeout in sec. + # lbl - label widget, where seconds to wait are displayed + # lbltext - original text of label + + if {[winfo exists $lbl]} { + if {[focus] in [list $w {}]} { + if {$w in $::apave::_AP_VARS(TIMW)} { + my timeoutButton $w $tmo $lbl $lbltext + } + } else { + $lbl configure -text $lbltext + } + } + } + + ## ________________________ Making widgets _________________________ ## + + method widgetType {wnamefull options attrs} { + # Gets the widget type based on 3 initial letters of its name. Also + # fills the grid/pack options and attributes of the widget. + # wnamefull - path to the widget + # options - grid/pack options of the widget + # attrs - attribute of the widget + # Returns a list of items: + # widget - Tk/Ttk widget name + # options - grid/pack options of the widget + # attrs - attribute of the widget + # nam3 - 3 initial letters of widget's name + # disabled - flag of *disabled* state + + set disabled [expr {[::apave::getOption -state {*}$attrs] eq {disabled}}] + set pack $options + set name [my ownWName $wnamefull] + if {[info exists ::apave::_AP_VARS(ProSplash,type)] && \ + $::apave::_AP_VARS(ProSplash,type) eq {}} { + set val [my progress_Go [incr ::apave::_AP_VARS(ProSplash,curvalue)] {} $name] + } + set nam3 [string tolower [string index $name 0]][string range $name 1 2] + if {[string index $nam3 1] eq "_"} {set k [string range $nam3 0 1]} {set k $nam3} + lassign [my defaultATTRS $k] defopts defattrs newtype + set options "$defopts $options" + set attrs "$defattrs $attrs" + switch -glob -- $nam3 { + bts { + set widget ttk::frame + if {![namespace exists ::bartabs]} { + source [file join $::apave::SRCDIR bartabs bartabs.tcl] + } + set attrs "-bartabs {$attrs}" + } + but { + set widget ttk::button + my AddButtonIcon $name attrs + } + buT - btT { + set widget button + my AddButtonIcon $name attrs + } + can {set widget canvas} + chb {set widget ttk::checkbutton} + swi { + set widget ttk::checkbutton + if {![my apaveTheme]} { + set attrs "$attrs -style Switch.TCheckbutton" + } + } + chB {set widget checkbutton} + cbx - fco { + set widget ttk::combobox + if {$nam3 eq {fco}} { ;# file content combobox + set attrs [my FCfieldValues $wnamefull $attrs] + } + set attrs [my FCfieldAttrs $wnamefull $attrs -tvar] + } + ent {set widget ttk::entry} + enT {set widget entry} + fil - fiL - + fis - fiS - + dir - diR - + fon - foN - + clr - clR - + dat - daT - + sta - + too - + fra { + # + frame for choosers and bars + set widget ttk::frame + } + frA { + set widget frame + if {$disabled} {set attrs [::apave::removeOptions $attrs -state]} + } + ftx {set widget ttk::labelframe} + gut {set widget canvas} + lab { + set widget ttk::label + if {$disabled} { + set grey [lindex [my csGet] 8] + set attrs "-foreground $grey $attrs" + } + lassign [::apave::parseOptions $attrs -link {} -style {} -font {}] \ + cmd style font + if {$cmd ne {}} { + set attrs "-linkcom {$cmd} $attrs" + set attrs [::apave::removeOptions $attrs -link] + } + if {$style eq {} && $font eq {}} { + set attrs "-font {$::apave::FONTMAIN} $attrs" + } elseif {$style ne {}} { + # some themes stumble at ttk styles, so bring their attrs directly + set attrs [::apave::removeOptions $attrs -style] + set attrs "[ttk::style configure $style] $attrs" + } + } + laB {set widget label} + lfr {set widget ttk::labelframe} + lfR { + set widget labelframe + if {$disabled} {set attrs [::apave::removeOptions $attrs -state]} + } + lbx - flb { + set widget listbox + if {$nam3 eq {flb}} { ;# file content listbox + set attrs [my FCfieldValues $wnamefull $attrs] + } + set attrs "[my FCfieldAttrs $wnamefull $attrs -lvar]" + set attrs "[my ListboxesAttrs $wnamefull $attrs]" + my AddPopupAttr $wnamefull attrs -entrypop 1 + foreach {ev com} {Home {::apave::LbxSelect %w 0} End {::apave::LbxSelect %w end}} { + append attrs " -bindEC {<$ev> {$com}} " + } + } + meb {set widget ttk::menubutton} + meB {set widget menubutton} + nbk { + set widget ttk::notebook + set attrs "-notebazook {$attrs}" + } + opc { + ;# tk_optionCascade - example of "my method" widget + ;# arguments: vname items mbopts precom args + set widget {my tk_optionCascade} + set imax [expr {min(4,[llength $attrs])}] + for {set i 0} {$i<$imax} {incr i} { + set atr [lindex $attrs $i] + if {$i!=1} { + lset attrs $i \{$atr\} + } elseif {[llength $atr]==1 && [info exist $atr]} { + lset attrs $i [set $atr] ;# items stored in a variable + } + } + } + pan {set widget ttk::panedwindow + if {[string first -w $attrs]>-1 && [string first -h $attrs]>-1} { + # important for panes with fixed (customized) dimensions + set attrs "-propagate {$options} $attrs" + } + } + pro {set widget ttk::progressbar} + rad {set widget ttk::radiobutton} + raD {set widget radiobutton} + sca {set widget ttk::scale} + scA {set widget scale} + sbh {set widget ttk::scrollbar} + sbH {set widget scrollbar} + sbv {set widget ttk::scrollbar} + sbV {set widget scrollbar} + scf { + if {![namespace exists ::apave::sframe]} { + namespace eval ::apave { + source [file join $::apave::apaveDir sframe.tcl] + } + } + # scrolledFrame - example of "my method" widget + set widget {my scrolledFrame} + } + seh {set widget ttk::separator} + sev {set widget ttk::separator} + siz {set widget ttk::sizegrip} + spx - spX { + if {$nam3 eq {spx}} {set widget ttk::spinbox} {set widget spinbox} + lassign [::apave::parseOptions $attrs \ + -command {} -com {} -from {} -to {}] cmd cmd2 from to + append cmd $cmd2 + lassign [::apave::extractOptions attrs -tip {} -tooltip {}] t1 t2 + set t2 "$t1$t2" + if {$from ne {} || $to ne {}} { + if {$t2 ne {}} {set t2 "\n $t2"} + set t2 " $from .. $to $t2" + } + if {$t2 ne {}} {set t2 "-tip {$t2}"} + append attrs " -onReturn {$::apave::UFF{$cmd} {$from} {$to}$::apave::UFF} $t2" + } + tbl { ;# tablelist + if {![namespace exists ::tablelist::]} { + namespace eval :: {package require tablelist} + } + set widget ::tablelist::tablelist + set attrs "[my FCfieldAttrs $wnamefull $attrs -lvar]" + set attrs "[my ListboxesAttrs $wnamefull $attrs]" + } + tex {set widget text + if {[::apave::getOption -textpop {*}$attrs] eq {}} { + my AddPopupAttr $wnamefull attrs -textpop \ + [expr {[::apave::getOption -rotext {*}$attrs] ne {}}] -- disabled + } + lassign [::apave::parseOptions $attrs -ro {} -readonly {} -rotext {} \ + -gutter {} -gutterwidth 5 -guttershift 6] r1 r2 r3 g1 g2 g3 + set b1 [expr [string is boolean -strict $r1]] + set b2 [expr [string is boolean -strict $r2]] + if {($b1 && $r1) || ($b2 && $r2) || \ + ($r3 ne {} && !($b1 && !$r1) && !($b2 && !$r2))} { + set attrs "-takefocus 0 $attrs" + } + set attrs [::apave::removeOptions $attrs -gutter -gutterwidth -guttershift] + if {$g1 ne {}} { + set attrs "$attrs -gutter {-canvas $g1 -width $g2 -shift $g3}" + } + } + tre { + set widget ttk::treeview + set ec [list Home {::apave::TreSelect %w 0} End {::apave::TreSelect %w end}] + if {[::isunix]} {lappend ec KP_Enter {event generate %w }} + foreach {ev com} $ec { + append attrs " -bindEC {<$ev> {$com}} " + } + } + h_* {set widget ttk::frame} + v_* {set widget ttk::frame} + default {set widget $newtype} + } + set attrs [my GetMC $attrs] + if {$nam3 in {cbx ent enT fco spx spX}} { + # entry-like widgets need their popup menu + set clearcom [lindex [::apave::parseOptions $attrs -clearcom -] 0] + if {$clearcom eq {-}} { + my AddPopupAttr $wnamefull attrs -entrypop 0 readonly disabled + } + } + if {[string first pack [string trimleft $pack]]==0} { + catch { + # try to expand -after option (if set as WidgetName instead widgetName) + if {[set i [lsearch -exact $pack {-after}]]>=0} { + set aft [lindex $pack [incr i]] + if {[regexp {^[A-Z]} $aft]} { + set aft [my $aft] + set pack [lreplace $pack $i $i $aft] + } + } + } + set options $pack + } + set options [string trim $options] + set attrs [list {*}$attrs] + list $widget $options $attrs $nam3 $disabled + } + #_______________________ + + method defaultATTRS {{type ""} {opts ""} {atrs ""} {widget ""}} { + # Sets, gets or registers default options and attributes for widget type. + # type - widget type + # opts - new default grid/pack options + # atrs - new default attributes + # widget - Tcl/Tk command for the new registered widget type + # The *type* should be a three letter unique string. + # If the *type* is absent in the registered types and *opts* and/or *atrs* + # is not set to "", defaultATTRS registers the new *type* with its grid/pack + # options and attributes. At that *widget* is a command for the new widget + # type. For example, to register "toolbutton" widget: + # my defaultATTRS tbt {} {-style Toolbutton -compound top} ttk::button + # Options and attributes may contain data (variables and commands) + # to be processed by [subst]. + # Returns: + # - if not set *type*: a full list of options and attributes of all types + # - if set *type* only: a list of options, attributes and *widget* + # - else: a list of updated options, attributes and *widget* + + if {$type eq {}} {return $::apave::_Defaults} + set optatr "$opts$atrs" + if {[catch {set def1 [dict get $::apave::_Defaults $type]}]} { + if {$optatr eq {}} { + set err "[self method]: \"$type\" widget type not registered." + puts -nonewline stderr $err + return -code error $err + } + set def1 [list $opts $atrs $widget] + } + if {$optatr eq {}} {return [subst $def1]} + lassign $def1 defopts defatrs widget + if {[catch {set defopts [dict replace $defopts {*}$opts]}]} { + set defopts [string trim "$defopts $opts"] + } + if {[catch {set defatrs [dict replace $defatrs {*}$atrs]}]} { + set defatrs [string trim "$defatrs $atrs"] + } + set newval [list $defopts $defatrs $widget] + dict set ::apave::_Defaults $type $newval + return $newval + } + #_______________________ + + method MC {msg} { + # Gets localized message + # msg - the message + + # to use a preset namespace name, we need a fully qualified variable + set ::apave::_MC_TEXT_ [string trim $msg \{\}] + if {$::apave::MC_NS ne {}} { + namespace eval $::apave::MC_NS { + set ::apave::_MC_TEXT_ [msgcat::mc $::apave::_MC_TEXT_] + } + } else { + set ::apave::_MC_TEXT_ [msgcat::mc $::apave::_MC_TEXT_] + } + return $::apave::_MC_TEXT_ + } + #_______________________ + + method GetMC {attrs} { + # Gets localized -text attribute. + # attrs - list of attributes + + lassign [::apave::extractOptions attrs -t {} -text {}] t text + if {$t ne {} || $text ne {}} { + if {$text eq {}} {set text $t} + dict set attrs -t [my MC $text] + } + return $attrs + } + #_______________________ + + method SpanConfig {w rcnam rc rcspan opt val} { + # The method is used by *GetIntOptions* method to configure + # row/column for their *span* options. + + for {set i $rc} {$i < ($rc + $rcspan)} {incr i} { + eval [grid ${rcnam}configure $w $i $opt $val] + } + } + #_______________________ + + method GetIntOptions {w options row rowspan col colspan} { + # Gets specific integer options. Then expands other options. + # w - widget's name + # options - grid options + # row, rowspan - row and its span of thw widget + # col, colspan - column and its span of thw widget + # The options are set in grid options as "-rw ", "-cw " etc. + # Returns the resulting grid options. + + set opts {} + foreach {opt val} [list {*}$options] { + switch -exact -- $opt { + -rw {my SpanConfig $w row $row $rowspan -weight $val} + -cw {my SpanConfig $w column $col $colspan -weight $val} + -rsz {my SpanConfig $w row $row $rowspan -minsize $val} + -csz {my SpanConfig $w column $col $colspan -minsize $val} + -ro {my SpanConfig $w column $col $colspan -readonly $val} + default {append opts " $opt $val"} + } + } + # Get other grid options + return [my ExpandOptions $opts] + } + #_______________________ + + method GetAttrs {options {nam3 ""} {disabled 0} } { + # Expands attributes' values. + # options - list of attributes and values + # nam3 - first three letters (type) of widget's name + # disabled - flag of "disabled" state + # Returns expanded attributes. + + set opts [list] + foreach {opt val} [list {*}$options] { + switch -exact -- $opt { + -t - -text { + ;# these options need translating \\n to \n + # catch {set val [subst -nocommands -novariables $val]} + set val [string map [list \\n \n \\t \t] $val] + set opt -text + } + -st {set opt -sticky} + -com {set opt -command} + -w {set opt -width} + -h {set opt -height} + -var {set opt -variable} + -tvar {set opt -textvariable} + -lvar {set opt -listvariable} + -ro {set opt -readonly} + } + lappend opts $opt \{$val\} + } + if {$disabled} { + append opts [my NonTtkStyle $nam3 1] + } + return $opts + } + #_______________________ + + method menuTips {win tip {wpar {}}} { + # Makes tip(s) for menu and its items. + # win - menu's path + # tip - tip's text + # wpar - path to menu's parent (for opc widget) + # The tips for menu items are set by "-indexedtips ?idx tip...?" + # e.g., a tip can be "parent tip -indexedtips 0 1stItem 9 {10th Item}" + + if {$tip ne {}} { + set tip [my MC $tip] + if {[set i [string first {-indexedtips } $tip]]>-1} { + set indexedtips [string range $tip [string first { } $tip $i]+1 end] + set tip [string range $tip 0 $i-1] + } else { + set indexedtips {} + } + # \indexedtips to present -indexedtips in parent tip + set tip [string map "\\indexedtips -indexedtips" $tip] + catch { + # tips for indexed items of menu + while {$indexedtips ne {}} { + lassign $indexedtips idx itip + if {$idx eq {}} break + after idle [list ::baltip tip $win $itip -index $idx -ontop 1] + set indexedtips [lrange $indexedtips 2 end] + } + } + if {$tip ne {} && $wpar ne {}} { + after idle [list ::baltip tip $wpar $tip] ;# tip for the parent widget + } + } + } + + ## ________________________ Option cascade _________________________ ## + + method optionCascadeText {it} { + # Rids a tk_optionCascade item of braces. + # it - an item to be trimmed + # Reason: tk_optionCascade items shimmer between 'list' and 'string' + # so a multiline item is displayed with braces, if not got rid of them. + # Returns the item trimmed. + # See also: tk_optionCascade + + if {[string match "\{*\}" $it]} { + set it [string range $it 1 end-1] + } + return $it + } + #_______________________ + + method tk_optionCascade {w vname items {mbopts ""} {precom ""} args} { + # A bit modified tk_optionCascade widget made by Richard Suchenwirth. + # w - widget name + # vname - variable name for current selection + # items - list of items + # mbopts - ttk::menubutton options (e.g. "-width -4") + # precom - command to get entry's options (%a presents its label) + # args - additional options of entries + # Returns a path to the widget. + # See also: + # optionCascadeText + # [wiki.tcl-lang.org](https://wiki.tcl-lang.org/page/tk_optionCascade) + + set win $w.m + if {![info exists $vname]} { + set it [lindex $items 0] + while {[llength $it]>1} {set it [lindex $it 0]} + set it [my optionCascadeText $it] + set $vname $it + } + lassign [::apave::extractOptions mbopts -tip {} -tooltip {} -com {} -command {}] \ + tip tip2 com com2 + if {$tip eq {}} {set tip $tip2} + if {$com eq {}} {set com $com2} + if {$com ne {}} {lappend args -command $com} + ttk::menubutton $w -menu $win -text [set $vname] -style TMenuButtonWest {*}$mbopts + menu $win -tearoff 0 + my menuTips $win $tip $w + my OptionCascade_add $win $vname $items $precom {*}$args + trace add variable $vname write \ + "$w config -text \"\[[self] optionCascadeText \${$vname}\]\" ;\#" + lappend ::apave::_AP_VARS(_TRACED_$w) $vname + ::apave::bindToEvent $w focus $w + return $win + } + #_______________________ + + method OptionCascade_add {w vname argl precom args} { + # Adds tk_optionCascade items recursively. + # w - tk_optionCascade widget's name + # vname - variable name for current selection + # arg1 - list of items to be added + # precom - command to get entry's options (%a presents its label) + # args - additional options of entries + + set n [set colbreak 0] + foreach arg $argl { + if {$arg eq {--}} { + $w add separator + } elseif {$arg eq {|}} { + if {[tk windowingsystem] ne {aqua}} { set colbreak 1 } + continue + } elseif {[llength $arg] == 1} { + set label [my optionCascadeText [join $arg]] + if {$precom eq {}} { + set adds {} + } else { + set adds [eval {*}[string map [list \$ \\\$ \[ \\\[] \ + [string map [list %a $label] $precom]]] + } + $w add radiobutton -label $label -variable $vname {*}$args {*}$adds + } else { + set child [menu $w.[incr n] -tearoff 0] + $w add cascade -label [lindex $arg 0] -menu $child + my OptionCascade_add $child $vname [lrange $arg 1 end] $precom {*}$args + } + if $colbreak { + $w entryconfigure end -columnbreak 1 + set colbreak 0 + } + } + return + } + #_______________________ + + method ParentOpt {{w "."}} { + # Gets *-parent* option for choosers. + # w - parent window's name (path) + + if {$Modalwin ne {.}} {set w $Modalwin} + return "-parent $w" + } + + ## ________________________ Mega-widgets _________________________ ## + + method fillGutter {txt {canvas ""} {width ""} {shift ""} args} { + # Fills a gutter of text with the text's line numbers. + # txt - path to the text widget + # canvas - canvas of the gutter + # width - width of the gutter, in chars + # shift - addition to the width (to shift from the left side) + # args - additional arguments for tracing + # The code is borrowed from open source tedit project. + + set savedcont [namespace current]::gc$txt + if {![winfo exists $txt] || ![winfo ismapped $txt]} { + unset -nocomplain $savedcont + return + } + if {$canvas eq {}} { + catch {{*}[bind $txt ]} ;# update gutter + return + } + set oper [lindex $args 0 1] + if {![llength $args] || [lindex $args 0 4] eq {-elide} || \ + $oper in {configure delete insert see yview}} { + set i [$txt index @0,0] + set gcont [list] + while true { + set dline [$txt dlineinfo $i] + if {[llength $dline] == 0} break + set height [lindex $dline 3] + set y [expr {[lindex $dline 1]}] + set linenum [format "%${width}d" [lindex [split $i .] 0]] + set i [$txt index "$i +1 lines linestart"] + lappend gcont [list $y $linenum] + } + # update the gutter at changing its contents/config + if {[::apave::cs_Active]} { + lassign [my csGet] - - - bg - - - - fg + ::apave::setProperty _GUTTER_FGBG [list $fg $bg] + } else { + lassign [::apave::getProperty _GUTTER_FGBG] fg bg + } + set cwidth [expr {$shift + \ + [font measure apaveFontMono -displayof $txt [string repeat 0 $width]]}] + set newbg [expr {$bg ne [$canvas cget -background]}] + set newwidth [expr {$cwidth ne [$canvas cget -width]}] + if {![llength $args] || $newbg || $newwidth || ![info exists $savedcont] || \ + $gcont ne [set $savedcont]} { + if {$newbg} {$canvas config -background $bg} + if {$newwidth} {$canvas config -width $cwidth} + $canvas delete all + foreach g $gcont { + lassign $g y linenum + $canvas create text 2 $y -anchor nw -text $linenum -font apaveFontMono -fill $fg + } + set $savedcont $gcont + } + } + } + #_______________________ + + method bindGutter {txt canvas {width 5} {shift 3}} { + # Makes bindings for a text and its gutter. + # txt - path to the text widget + # canvas - canvas of the gutter + # width - width of the gutter, in chars + # shift - addition to the width (to shift from the left side) + + set bind [list [self] fillGutter $txt $canvas $width $shift] + bind $txt $bind + bind $txt [list after idle $bind] + if {[trace info execution $txt] eq {}} { + trace add execution $txt leave $bind + } + } + #_______________________ + + method gutterContents {txt} { + # Gets contents of a text's gutter + # txt - text's path + + set savedcont [namespace current]::gc$txt + if {[info exists $savedcont]} { + return [set $savedcont] + } + return {} + } + #_______________________ + + method AuxSetChooserGeometry {vargeo vargeo2 parent widname} { + # Auxiliary method to set some Tk choosers' geometry. + # vargeo - variable for geometry value + # vargeo2 - variable for geometry value with second type of dialogue + # parent - list containing a parent's path + # widname - name of the chooser + # If there is no saved geometry with *vargeo*, tries to get it with *vargeo2*. + # Returns a path to the chooser to be open. + + set wp [lindex $parent 1] + set wchooser $wp.$widname + set geom {} + if {[catch {lassign [set $vargeo] -> geom}] || $geom eq {}} { + # no saved geometry with *vargeo*, so get it with *vargeo2* + catch {lassign [set $vargeo2] -> geom} + } + if {![string match *x*+*+* $geom]} { + # chooser's default geometry centered in parent + if {![winfo exists $wp]} {set wp .} + set geom [set W 640]x[set H 470] + catch {append geom [my CenteredXY {*}[split [wm geometry $wp] x+] $W $H]} + } + if {[::isunix]} { + # the below equilibristics provides the smooth display + after idle "catch {wm withdraw $wchooser; wm geometry $wchooser 1x1}" + after 0 [list after idle \ + "catch {wm withdraw $wchooser; wm geometry $wchooser $geom; wm deiconify $wchooser; wm geometry $wchooser $geom}"] + } + return $wchooser + } + #_______________________ + + method validateColorChoice {lab {ent ""}} { + # Displays a current color of color chooser's entry. + # lab - color chooser's label (or apave name's clr1 / Clr1) + # ent - color chooser's entry + # Can be called as "validateColorChoice clr1 / Clr1". + + if {[string match -nocase clr* $lab]} { + set lab [string tolower [string index $lab 0]][string range $lab 1 end] + set ent Ent$lab + set lab Lab$lab + } + set ent [my [my ownWName $ent]] + set lab [my [my ownWName $lab]] + set val [$ent get] + catch {$lab configure -background $val} + catch {$ent selection clear} + return yes + } + #_______________________ + + method scrolledFrame {w args} { + # Retrieves the path where the scrollable contents of frame go. + # w - frame's path + + lassign [::apave::extractOptions args -toplevel no -anchor center -mode both] tl anc mode + ::apave::sframe new $w -toplevel $tl -anchor $anc -mode $mode + set path [::apave::sframe content $w] + return $path + } + #_______________________ + + method chooserGeomVars {{dirvar ""} {filevar ""}} { + # Sets/gets variables to save/restore geometry of Tcl/Tk dir/file choosers (in Linux). + # dirvar - variable's name for geometry of directory chooser + # filevar - variable's name for geometry of file chooser + # See also: chooser + + if {$dirvar eq {}} { + return [::apave::getProperty DirFilGeoVars] + } + ::apave::setProperty DirFilGeoVars [list $dirvar $filevar] + } + #_______________________ + + method chooser {nchooser tvar args} { + # Chooser (for all available types). + # nchooser - name of chooser + # tvar - name of variable containing an input/output value + # args - options of the chooser + # The chooser names are: + # tk_getOpenFile - choose a file to open + # tk_getSaveFile - choose a file to save + # tk_chooseDirectory - choose a directory + # fontChooser - choose a font + # dateChooser - choose a date + # colorChooser - choose a color + # ftx_OpenFile - (internal) choose a file for ftx widget + # Returns a selected value. + + set isfilename [set rootname 0] + lassign [apave::extractOptions args \ + -ftxvar {} -tname {} -bname {} -parent {}] ftxvar tname bname parent + if {$parent ne {}} { + set parent "-parent $parent" + } else { + set parent [my ParentOpt] + } + lassign $parent -> wpar + set wtoplist [my onTop $wpar 1] + my onTop $wpar 0 $wtoplist ;# do not overlap choosers + lassign [my chooserGeomVars] dirvar filvar + if {$dirvar eq {}} { + set [set dirvar ::apave::APaveDirVar] {} + set [set filvar ::apave::APaveFilVar] {} + my chooserGeomVars $dirvar $filvar + } + set vargeo {} + if {$nchooser eq {ftx_OpenFile}} { + set nchooser tk_getOpenFile + } + set widname {} + set choosname $nchooser + if {$choosname in {fontChooser colorChooser dateChooser}} { + set nchooser "my $choosname $tvar $parent $args" + if {$choosname eq {fontChooser}} { + append nchooser " -topmost [llength $wtoplist]" + } + } elseif {$choosname in {tk_getOpenFile tk_getSaveFile}} { + set vargeo $filvar + set widname [my AuxSetChooserGeometry $vargeo $dirvar $parent __tk_filedialog] + if {[catch {set fn [set $tvar]}]} {set fn {}} + if {$fn eq {}} { + set dn [pwd] + } else { + set dn [file dirname $fn] + set fn [file tail $fn] + } + lassign [apave::extractOptions args -initialdir $dn] dn + if {[string match -* $dn]} { + set rootname 1 + set dn [string range $dn 1 end] + } + set args [list -initialfile $fn -initialdir $dn {*}$parent {*}$args] + incr isfilename + } elseif {$nchooser eq {tk_chooseDirectory}} { + set vargeo $dirvar + set widname [my AuxSetChooserGeometry $vargeo $filvar $parent __tk_choosedir] + set args [list -initialdir [set $tvar] {*}$parent {*}$args] + incr isfilename + } + if {[::isunix] && $choosname ne {dateChooser}} { + my themeExternal *.foc.* *f1.demo ;# don't touch tkcc's boxes + } + set res [{*}$nchooser {*}$args] + my onTop $wpar 1 $wtoplist + if {"$res" ne {} && "$tvar" ne {}} { + if {$rootname} {set res [file rootname [file tail $res]]} + if {$isfilename} { + lassign [my SplitContentVariable $ftxvar] -> txtnam wid + if {[info exist $ftxvar] && \ + [file exist [set res [file nativename $res]]]} { + set $ftxvar [apave::readTextFile $res] + if {[winfo exist $txtnam]} { + my readonlyWidget $txtnam no + my displayTaggedText $txtnam $ftxvar + my readonlyWidget $txtnam yes + set wid [string range $txtnam 0 [string last . $txtnam]]$wid + $wid configure -text "$res" + ::tk::TextSetCursor $txtnam 1.0 + update + } + } + } + set $tvar $res + } + if {$vargeo ne {} && $widname ne {} && [::isunix]} { + catch { + set $vargeo [list $widname [wm geometry $widname]] ;# 1st item for possible usage only + } + } + if {$tname ne {}} { + set tname [my [my ownWName $tname]] + if {$bname ne {}} { + # re-focus to fire invalidation of the entry (esp. for Windows) + set ent [my ownWName $tname] + set but [my ownWName $bname] + set bname [string map [list .$ent .$but] $tname] + focus $bname + } + focus $tname + after idle "catch {$tname selection range 0 end ; $tname icursor end}" + } + return $res + } + #_______________________ + + method colorChooser {tvar args} { + # Color chooser. + # tvar - name of variable containing a color + # args - options of *tk_chooseColor* + # The *tvar* sets the value of *-initialcolor* option. Also + # it gets a color selected in the chooser. + # Returns a selected color. + + if {$Initialcolor eq {} && [::isunix]} { + source [file join $::apave::apaveDir pickers color clrpick.tcl] + } + lassign [apave::extractOptions args -entry {} -inifile {} -ontop 0] ent ini top + if {$ent ne {}} { + set ent [my [my ownWName $ent]] + set x [winfo rootx $ent] + set y [expr {[winfo rooty $ent]+32}] + dict set args -geometry +$x+$y ;# the same as with date picker + } + if {[set _ [string trim [set $tvar]]] ne {}} { + set ic $_ + set _ [. cget -background] + if {[catch {. configure -background $ic}]} { + set ic "#$ic" + if {[catch {. configure -background $ic}]} {set ic black} + } + set Initialcolor $ic + . configure -background $_ + } else { + set Initialcolor black + } + if {[catch {lassign [tk_chooseColor -moveall $Moveall \ + -initialcolor $Initialcolor {*}$args -inifile $ini -ontop $top] res Moveall}]} { + set args [apave::removeOptions $args -moveall -tonemoves -geometry] + set res [tk_chooseColor -initialcolor $Initialcolor {*}$args] + } + if {$res ne {}} { + set Initialcolor [set $tvar $res] + } + return $res + } + #_______________________ + + method sourceKlnd {{num ""}} { + # Loads klnd package at need. + # num - defines which name of package file to be used + + if {[info commands ::klnd::calendar$num] eq {}} { + # imo, it's more effective to source on request than to require on possibility + source [file join $::apave::apaveDir pickers klnd klnd$num.tcl] + } + } + #_______________________ + + method dateChooser {tvar args} { + # Date chooser (calendar widget). + # tvar - name of variable containing a date + # args - options of *::klnd::calendar* + # Returns a selected date. + + my sourceKlnd {} + if {![catch {set ent [my [my ownWName [apave::getOption -entry {*}$args]]]}]} { + dict set args -entry $ent + set res [::klnd::calendar {*}$args -tvar $tvar -parent [winfo toplevel $ent]] + } else { + set res [::klnd::calendar {*}$args -tvar $tvar] + } + return $res + } + #_______________________ + + method Replace_Tcl {r1 r2 r3 args} { + # Replaces Tcl code with its resulting items in *lwidgets* list. + # r1 - variable name for a current index in *lwidgets* list + # r2 - variable name for a length of *lwidgets* list + # r3 - variable name for *lwidgets* list + # args - "tcl" and "tcl code" for "tcl" type of widget + # The code should use the wildcard that goes first at a line: + # %C - a command for inserting an item into lwidgets list. + # The "tcl" widget type can be useful to automate the inserting + # a list of similar widgets to the list of widgets. + # See tests/test2_pave.tcl where the "tcl" fills "Color schemes" tab. + + lassign $args _name _code + if {[my ownWName $_name] ne {tcl}} {return $args} + upvar 1 $r1 _ii $r2 _lwlen $r3 _lwidgets + ; proc lwins {lwName i w} { + upvar 2 $lwName lw + set lw [linsert $lw $i $w] + } + set _lwidgets [lreplace $_lwidgets $_ii $_ii] ;# removes tcl item + set _inext [expr {$_ii-1}] + eval [string map {%C {lwins $r3 [incr _inext] }} $_code] + return {} + } + #_______________________ + + method Replace_chooser {r0 r1 r2 r3 args} { + # Replaces an item for a chooser with two items. + # r0 - variable name for a widget's name + # r1 - variable name for a current index in *lwidgets* list + # r2 - variable name for a length of *lwidgets* list + # r3 - variable name for *lwidgets* list + # args - the widget item of *lwidgets* list + # Choosers should contain 2 fields: entry + button. + # Here every chooser is replaced with these two widgets. + + upvar 1 $r0 w $r1 i $r2 lwlen $r3 lwidgets + lassign $args name neighbor posofnei rowspan colspan options1 attrs1 + lassign {} wpar view addattrs addattrs2 + lassign [::apave::parseOptions $attrs1 -tvar {-} -validatecommand {}] tvar validatecommand + lassign [::apave::extractOptions attrs1 -takefocus 0 -showcolor {} -filetypes {} \ + -initialdir {} -initialfile {} -defaultextension {} -multiple {}] \ + takefocus showcolor filetypes initialdir initialfile defaultextension multiple + lassign [::apave::extractOptions options1 -padx 0 -pady 0] padx pady + set takefocus "-takefocus $takefocus" + foreach atr {filetypes initialdir initialfile defaultextension multiple} { + set val [set $atr] + if {$val ne {}} { + lset args 6 $attrs1 + append addattrs2 " -$atr {$val}" + } + } + set an [set entname {}] + lassign [my LowercaseWidgetName $name] n + set ownname [my ownWName $n] + set wtyp [string range $ownname 0 2] + switch -exact $wtyp { + daT { ;# embed calendar widgets into $ownname frame + my sourceKlnd + my sourceKlnd 2 + set attrs1 [subst $attrs1] + set lwidgets2 [::klnd::calendar2 [self] $w $n {*}$attrs1] + set lwlen2 [llength $lwidgets2] + for {set i2 0} {$i2 < $lwlen2} {} { + set lst2 [lindex $lwidgets2 $i2] + if {[my Replace_Tcl i2 lwlen2 lwidgets2 {*}$lst2] ne {}} {incr i2} + } + incr lwlen [llength $lwidgets2] + set lwidgets [linsert $lwidgets [expr {$i+1}] {*}$lwidgets2] + lset args 6 [::klnd::clearArgs {*}$attrs1] + return $args + } + fil - fiL {set chooser tk_getOpenFile} + fis - fiS {set chooser tk_getSaveFile} + dir - diR {set chooser tk_chooseDirectory} + fon - foN {set chooser fontChooser} + clr - clR { + set chooser colorChooser + if {$showcolor eq {}} {set showcolor 1} ;# default is "show color label" + set showcolor [string is true -strict $showcolor] + set wpar "-parent $w" ;# specific for color chooser (parent of $w) + set entname {-entry } + } + dat {set chooser dateChooser; set entname {-entry }} + ftx { + set chooser [set view ftx_OpenFile] + if {$tvar ne {} && [info exist $tvar]} { + append addattrs " -t {[set $tvar]}" + } + set an tex + set txtnam [my Transname $an $name] + } + default { + return $args + } + } + set inname [my MakeWidgetName $w $name $an] + set name $n + if {$view ne {}} { + set tvname $inname + set inname [my WidgetNameFull $w $name] + } + set tvar [set vv [set addopt {}]] + set attmp [list] + foreach {nam val} $attrs1 { + if {$nam in {-title -parent -dateformat -weekday -modal -centerme}} { + append addopt " $nam \{$val\}" + } else { + lappend attmp $nam $val + } + } + set attrs1 $attmp + catch {array set a $attrs1; set tvar "-tvar [set vv $a(-tvar)]"} + catch {array set a $attrs1; set tvar "-tvar [set vv $a(-textvariable)]"} + if {$vv eq {}} { + set vv [namespace current]::$name + set tvar "-tvar $vv" + } + # make a frame in the widget list + set ispack 0 + if {![catch {set gm [lindex [lindex $lwidgets $i] 5]}]} { + set ispack [expr [string first pack $gm]==0] + } + if {$ispack} { + lassign [::apave::parseOptions $options1 -expand 0 -fill x] exp fil + set args [list $name - - - - \ + "pack -expand $exp -fill $fil [string range $gm 5 end]" $addattrs] + } else { + lassign [::apave::parseOptions $options1 -st ew -sticky {} -rw {} -cw {}] st st2 rw cw + if {$st2 ne {}} {set st $st2} + if {$rw ne {}} {set rw "-rw $rw"} + if {$cw ne {}} {set cw "-cw $cw"} + set args [list $name $neighbor $posofnei $rowspan $colspan \ + "-st $st $rw $cw" $addattrs] + } + lset lwidgets $i $args + set btTname [my Transname btT $name] + if {$view ne {}} { + append attrs1 " -callF2 {.texF .btTf .texf .btTf}" + set tvar [::apave::getOption -tvar {*}$attrs1] + set attrs1 [::apave::removeOptions $attrs1 -tvar] + if {$tvar ne {} && [file exist [set $tvar]]} { + set tcont [my SetContentVariable $tvar $tvname [my ownWName $name]] + set wpar "-ftxvar $tcont" + set $tcont [::apave::readTextFile [set $tvar]] + set attrs1 [::apave::putOption -rotext $tcont {*}$attrs1] + } + set entf [list $txtnam - - - - "pack -side top -expand 1 -fill both -in $inname" "$attrs1"] + } else { + if {$wtyp in {fiL fiS diR foN clR}} { + set field cbx + set tname [my Transname Cbx $name] + } else { + set tname [my Transname Ent $name] + set field ent + } + if {$entname ne {}} {append entname $tname} + append attrs1 " -callF2 {.$field .btT}" + append wpar " -tname $tname -bname $btTname" + if {$chooser eq {fontChooser}} { + append wpar " -parent \[[self] [my ownWName $tname]\]" + } + set entf [list $tname - - - - "pack -padx $padx -pady $pady -side left -expand 1 -fill x -in $inname" "$attrs1 $tvar"] + } + set icon folder + foreach ic {OpenFile SaveFile font color date} { + if {[string first $ic $chooser] >= 0} {set icon $ic; break} + } + set com "[self] chooser $chooser \{$vv\} $addopt $wpar $addattrs2 $entname" + if {$view ne {}} {set anc n} {set anc center} + set butf [list $btTname - - - - "pack -side right -anchor $anc -in $inname -padx 2" "-com \{$com\} -compound none -image [::apave::iconImage $icon small] -font \{-weight bold -size 5\} -fg $Fgbut -bg $Bgbut $takefocus"] + if {$view ne {}} { + set scrolv [list [my Transname sbv $name] $txtnam L - - "pack -in $inname -side bottom -after [my WidgetNameFull $w $btTname]" {}] + set lwidgets [linsert $lwidgets [expr {$i+1}] $butf] + set lwidgets [linsert $lwidgets [expr {$i+2}] $entf] + set lwidgets [linsert $lwidgets [expr {$i+3}] $scrolv] + incr lwlen 3 + set wrap [::apave::getOption -wrap {*}$attrs1] + if {$wrap eq {none}} { + set scrolh [list [my Transname sbh $name] $txtnam T - - "pack -in $inname -side bottom -after [my WidgetNameFull $w $txtnam]" {}] + set lwidgets [linsert $lwidgets [expr {$i+3}] $scrolh] + incr lwlen + } + } else { + if {$chooser eq {colorChooser} && $showcolor} { + set f0 [my Transname Lab $name] + set labf [list $f0 - - - - "pack -side right -in $inname -padx 2" \ + "-t \{ \} -relief raised"] + lassign $entf f1 - - - - f2 f3 + set com "[self] validateColorChoice $f0 $f1" + append f3 " -afteridle \"$com; bind \[string map \{.entclr .labclr\} %w\] \{eval \[string map \{.entclr .btTclr\} %w\] invoke\}\"" + append f3 " -validate all -validatecommand \{$com ; $validatecommand\}" + set entf [list $f1 - - - - $f2 $f3] + set lwidgets [linsert $lwidgets [expr {$i+1}] $entf $butf $labf] + incr lwlen 3 + } else { + set lwidgets [linsert $lwidgets [expr {$i+1}] $entf $butf] + incr lwlen 2 + } + } + return $args + } + #_______________________ + + method Replace_bar {r0 r1 r2 r3 args} { + # Replaces an item for a menu/tool/status bar with appropriate items. + # r0 - variable name for a widget's name + # r1 - variable name for a current index in *lwidgets* list + # r2 - variable name for a length of *lwidgets* list + # r3 - variable name for *lwidgets* list + # args - the widget item of *lwidgets* list + # Bar widgets should contain N fields of appropriate type + + upvar 1 $r0 w $r1 i $r2 lwlen $r3 lwidgets + if {[catch {set winname [winfo toplevel $w]}]} { + return $args + } + lassign $args name neighbor posofnei rowspan colspan options1 attrs1 + my MakeWidgetName $w $name + set name [lindex [my LowercaseWidgetName $name] 0] + set wpar {} + switch -glob -- [my ownWName $name] { + men* {set typ menuBar} + too* {set typ toolBar} + sta* {set typ statusBar} + default { + return $args + } + } + set attcur [list] + set namvar [list] + # get array of pairs (e.g. image-command for toolbar) + foreach {nam val} $attrs1 { + if {$nam eq {-array}} { + catch {set val [subst $val]} + set ind -1 + foreach {v1 v2} $val { + catch {set v1 [subst -nocommand -nobackslash $v1]} + catch {set v2 [subst -nocommand -nobackslash $v2]} + if {$name eq {menu}} {set v2 [list [my MC $v2]]} + lappend namvar [namespace current]::$typ[incr ind] $v1 $v2 + } + } else { + lappend attcur $nam $val + } + } + # make a frame in the widget list + if {$typ eq {menuBar}} { + if {[set fillmenu [lindex $args 7]] ne {}} { + after idle $fillmenu + } + set args {} + } else { + set ispack 0 + if {![catch {set gm [lindex [lindex $lwidgets $i] 5]}]} { + set ispack [expr [string first pack $gm]==0] + } + if {$ispack} { + set args [list $name - - - - "pack -expand 0 -fill x -side bottom [string range $gm 5 end]" $attcur] + } else { + set args [list $name $neighbor $posofnei $rowspan $colspan "-st ew" $attcur] + } + lset lwidgets $i $args + } + lassign [my csGet] fga fg bga bg + set fontB [my boldTextFont 16] + set fontS [my basicSmallFont] + set itmp $i + set k [set j [set j2 [set wasmenu 0]]] + foreach {nam v1 v2} $namvar { + if {[string first # $v1]==0} continue + if {$v1 eq {h_}} { ;# horisontal space + set ntmp [my Transname fra ${name}[incr j2]] + set wid1 [list $ntmp - - - - "pack -side left -in $w.$name -fill y"] + set wid2 [list $ntmp.[my ownWName [my Transname h_ $name$j]] - - - - "pack -fill y -expand 1 -padx $v2"] + } elseif {$v1 eq {sev}} { ;# vertical separator + set ntmp [my Transname fra ${name}[incr j2]] + set wid1 [list $ntmp - - - - "pack -side left -in $w.$name -fill y"] + set wid2 [list $ntmp.[my ownWName [my Transname sev $name$j]] - - - - "pack -fill y -expand 1 -padx $v2"] + } elseif {$typ eq {statusBar}} { ;# statusbar + my NormalizeName name i lwidgets + set dattr [lrange $v1 1 end] + if {[::apave::extractOptions dattr -expand 0]} { + set expand {-expand 1 -fill x} + } else { + set expand {} + } + set font " -font {$fontS}" + # status prompt + set wid1 [list .[my ownWName [my Transname Lab ${name}_[incr j]]] - - - - "pack -side left -in $w.$name" "-t {[lindex $v1 0]} $font $dattr"] + # status value + if {$::apave::_CS_(LABELBORDER)} {set relief sunken} {set relief flat} + set wid2 [list .[my ownWName [my Transname Lab $name$j]] - - - - "pack -side left $expand -in $w.$name" "-style TLabelSTD -relief $relief -w $v2 -t { } $font $dattr"] + } elseif {$typ eq {toolBar}} { ;# toolbar + set packreq {} + switch -nocase -glob -- $v1 { + lab* - laB* { ;# label + lassign $v2 txt packreq att + set v2 "-text {$txt} $att" + } + opc* { ;# tk_optionCascade + lset v2 2 "[lindex $v2 2] -takefocus 0" + } + spx* - chb* - ent* - cbx* { ;# spinbox etc. + set v2 "$v2 -takefocus 0" + } + default { + if {[string is lower [string index $v1 0]]} { ;# button with -image + set but buT + } else { + set but BuT + } + set v2 "[my toolbarItem_Attrs [string match _* $v1] $v1 $fontB \ + $fg $bg $fga $bga] -command $v2" + lassign [::apave::extractOptions v2 -method {}] ismeth + set v1 [my Transname $but _$v1] + if {[string is true -strict $ismeth]} { + # -method option forces making "WidgetName" method from "widgetName" + my MakeWidgetName $w.$name [string totitle $v1 0 0] + } + } + } + set wid1 [list $name.$v1 - - - - "pack -side left $packreq" $v2] + if {[incr wasseh]==1} { + ;# horiz.separator for multiline toolbar + set wid2 [list [my Transname seh $name$j] - - - - "pack -side top -fill x"] + } else { + ;# 1st line of toolbar + set lwidgets [linsert $lwidgets [incr itmp] $wid1] + continue + } + } elseif {$typ eq {menuBar}} { + ;# menubar: making it here; filling it outside of 'pave window' + if {[incr wasmenu]==1} { + set menupath [my MakeWidgetName $winname $name] + menu $menupath -tearoff 0 + } + set menuitem [my MakeWidgetName $menupath $v1] + menu $menuitem -tearoff 0 + set ampos [string first & [string trimleft $v2 \{]] + if {$ampos>=0} {append v2 " -underline $ampos"} + set v2 [string map {& {}} $v2] + $menupath add cascade -label [lindex $v2 0] {*}[lrange $v2 1 end] -menu $menuitem + continue + } else { + error "\npaveme.tcl: erroneous \"$v1\" for \"$nam\"\n" + } + set lwidgets [linsert $lwidgets [incr itmp] $wid1 $wid2] + incr itmp + } + if {$wasmenu} { + $winname configure -menu $menupath + } + incr lwlen [expr {$itmp - $i}] + return $args + } + #_______________________ + + method fontChooser {tvar args} { + # Font chooser. + # tvar - name of variable containing a font + # args - options of *tk fontchooser* + # The *tvar* sets the value of *-font* option. Also + # it gets a font selected in the chooser. + # Returns a selected font. + + set top [apave::extractOptions args -topmost 0] + set parw [apave::parseOptions $args -parent [::apave::rootModalWindow .]] + ; proc [namespace current]::applyFont {font} " \ + set $tvar \[font actual \$font\]; \ + focus -force $parw" + set font [set $tvar] + if {$font eq {}} { + catch {font create fontchoose {*}$::apave::FONTMAIN} + } else { + catch {font delete fontchoose} + catch {font create fontchoose {*}[font actual $font]} + } + tk fontchooser configure -font fontchoose {*}[my ParentOpt] \ + {*}$args -command [namespace current]::applyFont + tk fontchooser show + # core Tk font chooser is bad with focusing in and out, it isn't modal + if {[set foc [info commands *__tk__fontchooser.ok]] ne {}} { + after idle [list after 0 [list catch "focus -force $foc"]] + catch {wm attributes [winfo toplevel $foc] -topmost $top} + } + set $tvar + } + #_______________________ + + method toolbarItem_Attrs {istext img fontB fg bg fga bga} { + # Gets default attributes of toolbar button. + # istext - true if textual button + # img - image of button + # fontB - bold font + # fg - foreground + # bg - background + # fga - active foreground + # bga - active background + + if {$istext} { + set img "-font {$fontB} -foreground $fg -background $bg -width 2 -pady 0 -padx 2" + } else { + set img "-image $img -background $bg" + } + append img " -relief flat -overrelief raised -activeforeground $fga \ + -activebackground $bga -highlightthickness 0 -takefocus 0" + } + + ## ________________________ Widget names & methods _________________________ ## + + method chooserPath {W {w ent}} { + # Gets a path to chooser's entry or label. + # W - widget/method name (e.g. Fil, Dir) + # w - ent / lab for entry / label + + ::apave::precedeWidgetName [my $W] $w + } + #_______________________ + + method Transname {typ name} { + # Transforms *name* by adding *typ* (its type). + # typ - type of widget in *apave* terms (but, buT etc.) + # name - name (path) of widget + # Returns the transformed name. + + if {[set pp [string last . $name]]>-1} { + set name [string range $name 0 $pp]$typ[string range $name $pp+1 end] + } else { + set name $typ$name + } + return $name + } + #_______________________ + + method LowercaseWidgetName {name} { + # Makes the widget name lowercased. + # name - widget's name + # The widgets of widget list can have uppercased names which + # means that the appropriate methods will be created to access + # their full pathes with a command `my Name`. + # This method gets a "normal" name of widget accepted by Tk. + # See also: MakeWidgetName + + set root [my ownWName $name] + list [string range $name 0 [string last . $name]][string tolower $root 0 0] $root + } + #_______________________ + + method NormalizeName {refname refi reflwidgets} { + # Gets the real name of widget from *.name*. + # refname - variable name for widget name + # refi - variable name for index in widget list + # reflwidgets - variable name for widget list + # The *.name* means "child of some previous" and should be normalized. + # Example: + # If parent: fra.fra ..... + # child: .but + # => normalized: fra.fra.but + + upvar $refname name $refi i $reflwidgets lwidgets + set wname $name + if {[string index $name 0] eq {.}} { + for {set i2 [expr {$i-1}]} {$i2 >=0} {incr i2 -1} { + lassign [lindex $lwidgets $i2] name2 + if {[string index $name2 0] ne {.}} { + set name2 [lindex [my LowercaseWidgetName $name2] 0] + set wname "$name2$name" + set name [lindex [my LowercaseWidgetName $name] 0] + set name "$name2$name" + break + } + } + } + list $name $wname + } + #_______________________ + + method WidgetNameFull {w name {an {}}} { + # Gets a full name of a widget. + # w - name of root widget + # name - name of widget + # an - additional prefix for name + # See also: apave::sframe::content + + set wn [string trim [my parentWName $name].$an[my ownWName $name] .] + set wnamefull $w.$wn + set wcc canvas.container.content ;# sframe.tcl may be not sourced + if {[set i1 [string first .scf $wnamefull]]>0 && \ + [set i2 [string first . $wnamefull $i1+1]]>0 && \ + [string first .$wcc. $wnamefull]<0} { + # insert a container's name into a scrolled frame's child + set wend [string range $wnamefull $i2 end] + set wnamefull [string range $wnamefull 0 $i2] + append wnamefull $wcc $wend + } + return $wnamefull + } + #_______________________ + + method dlgPath {} { + # Gets a window name of apave open dialogue. + + if {[catch {set res $Dlgpath}] || $Dlgpath eq {}} { + set res $::apave::MODALWINDOW + } + return $res + } + #_______________________ + + method DiaWidgetName {w} { + # Gets a widget name of apave dialogue. + # w - name of widget + # The name of widget may be partial. In this case it's prepended + # the current dialogue's frame path. + # Useful in "input" dialogue when -method option is present + # or widget names are uppercased. + # See also: MakeWidgetName, input + + if {[string index $w 0] eq {.}} {return $w} + return $Dlgpath.fra.$w + } + #_______________________ + + method MakeWidgetName {w name {an {}}} { + # Makes an exported method named after root widget, if it's uppercased. + # w - name of root widget + # name - name of widget + # an - additional prefix for name (if "-", $w is full/partial name) + # The created method used for easy access to the widget's path. + # Example: + # fra1.fra2.fra3.Entry1 + # => method Entry1 {} {...} + # ... + # my Entry1 ;# instead of .win.fra1.fra2.fra3.Entry1 + + if {$an eq {-}} { + set wnamefull "\[my DiaWidgetName $w\]" + } else { + set wnamefull [my WidgetNameFull $w $name $an] + lassign [my LowercaseWidgetName $wnamefull] wnamefull + } + set method [my ownWName $name] + set root1 [string index $method 0] + if {[string is upper $root1]} { + oo::objdefine [self] "method $method {} {return $wnamefull} ; \ + export $method" + } + return $wnamefull + } + #_______________________ + + method AddPopupAttr {w attrsName atRO isRO args} { + # Adds the attribute to call a popup menu for an editable widget. + # w - widget's name + # attrsName - variable name for attributes of widget + # atRO - "readonly" attribute (internally used) + # isRO - flag of readonly widget + # args - widget states to be checked + + upvar 1 $attrsName attrs + lassign $args state state2 + if {$state2 ne {}} { + if {[::apave::getOption -state {*}$attrs] eq $state2} return + set isRO [expr {$isRO || [::apave::getOption -state {*}$attrs] eq $state}] + } + if {$isRO} {append atRO RO} + append attrs " $atRO $w" + } + #_______________________ + + method clearEntry {w clearcom} { + # Clears entry-like widget's value, after calling a command. + # w - widget's path + # clearcom - a command to call, can have %w for *w* (widget's path) + + if {$clearcom ne {}} { + {*}[string map [list %w $w %p [self]] $clearcom] + } + #! perhaps, needs refactoring: + if {[catch {$w delete 0 end}]} { ;# entry + if {[catch {$w set {}}]} { ;# combobox + # others + } + } + } + #_______________________ + + method makePopup {w {isRO no} {istext no} {tearoff no} {addpop ""} {clearcom ""}} { + # Makes a popup menu for an editable widget. + # w - widget's name + # isRO - flag for "is it readonly" + # istext - flag for "is it a text" + # tearoff - flag for "-tearoff" option + # addpop - additional commands for popup menu + # clearcom - command for "Clear" item + + set pop $w.popupMenu + catch {menu $pop -tearoff $tearoff} + $pop delete 0 end + if {$isRO || [$w cget -state] eq {disabled}} { + $pop add command {*}[my iconA copy] -accelerator Ctrl+C -label Copy \ + -command "event generate $w <>" + if {$istext} { + eval [my popupHighlightCommands $pop $w] + after idle [list [self] set_highlight_matches $w] + } + } else { + if {$istext} { + ::apave::bindToEvent $w <> ::apave::eventOnText $w <> + ::apave::bindToEvent $w <> ::apave::eventOnText $w <> + $pop add command {*}[my iconA cut] -accelerator Ctrl+X -label Cut \ + -command "event generate $w <>" + $pop add command {*}[my iconA copy] -accelerator Ctrl+C -label Copy \ + -command "event generate $w <>" + $pop add command {*}[my iconA paste] -accelerator Ctrl+V -label Paste \ + -command "::apave::eventOnText $w <>" + $pop add separator + $pop add command {*}[my iconA undo] -accelerator Ctrl+Z -label Undo \ + -command "::apave::eventOnText $w <>" + $pop add command {*}[my iconA redo] -accelerator Ctrl+Shift+Z -label Redo \ + -command "::apave::eventOnText $w <>" + catch { + eval [my popupBlockCommands $pop $w] + eval [my popupHighlightCommands $pop $w] + if {$addpop ne {}} { + lassign $addpop com par1 par2 + eval [my $com $pop $w {*}$par1 {*}$par2] + } + after idle [list [self] set_highlight_matches $w] + after idle [my setTextBinds $w] + } + } else { + if {$clearcom ne {}} { + $pop add command {*}[my iconA no] -label Clear \ + -command [list [self] clearEntry $w $clearcom] + $pop add separator + } + $pop add command {*}[my iconA cut] -accelerator Ctrl+X -label Cut \ + -command "event generate $w <>" + $pop add command {*}[my iconA copy] -accelerator Ctrl+C -label Copy \ + -command "event generate $w <>" + $pop add command {*}[my iconA paste] -accelerator Ctrl+V -label Paste \ + -command "event generate $w <>" + } + } + if {$istext} { + $pop add separator + $pop add command {*}[my iconA none] -accelerator Ctrl+A -label {Select All} \ + -command "$w tag add sel 1.0 end" + bind $w "$w tag add sel 1.0 end; break" + } + bind $w "[self] themePopup $w.popupMenu; tk_popup $w.popupMenu %X %Y" + } + #_______________________ + + method Pre {refattrs} { + # "Pre" actions for the text widget and similar + # which all require some actions before and after their creation e.g.: + # the text widget's text cannot be filled if disabled + # so, we must act this way: + # 1. call Pre - to get a text of widget + # 2. create the widget + # 3. call Post - to enable, then fill it with a text, then disable it + # It's only possible with Pre and Post methods. + # See also: Post + + upvar 1 $refattrs attrs + set attrs_ret [set Prepost [list]] + foreach {a v} $attrs { + switch -exact -- $a { + -disabledtext - -rotext - -lbxsel - -cbxsel - -notebazook - \ + -entrypop - -entrypopRO - -textpop - -textpopRO - -ListboxSel - \ + -callF2 - -timeout - -bartabs - -onReturn - -linkcom - -selcombobox - \ + -afteridle - -gutter - -propagate - -columnoptions - -selborderwidth - + -selected - -popup - -bindEC - -tags - -debug - -clearcom { + # attributes specific to apave, processed below in "Post" + set v2 [string trimleft $v \{] + set v2 [string range $v2 0 end-[expr {[string length $v]-[string length $v2]}]] + lappend Prepost [list $a $v2] + } + -myown { + lappend Prepost [list $a [subst $v]] + } + -labelwidget { ;# widget path as a method + set v [string trim $v \{\}] + catch {set v [my $v]} + lappend attrs_ret $a $v + } + default { + lappend attrs_ret $a $v + } + } + } + set attrs $attrs_ret + } + #_______________________ + + method Post {w attrs} { + # Performes "post" actions after creation a widget. + # w - widget's path + # attrs - widget's attributes + # Processes the same *apave* options that are processed in Pre method. + # See also: Pre + + if {[set i [lsearch -exact -index 0 $Prepost -tags]]>-1} { + set v [lindex $Prepost $i 1] + set tags [set $v] + } else { + set tags {} + } + foreach pp $Prepost { + lassign $pp a v + set v [string trim $v $::apave::UFF] + switch -exact -- $a { + -disabledtext { + $w configure -state normal + my displayTaggedText $w v $tags + $w configure -state disabled + my readonlyWidget $w no + } + -rotext { + if {[info exist v]} { + if {[info exist $v]} { + my displayTaggedText $w $v $tags + } else { + my displayTaggedText $w v $tags + } + } + my readonlyWidget $w yes + } + -lbxsel { + set v [lsearch -glob [$w get 0 end] "$v*"] + if {$v>=0} { + $w selection set $v + $w yview $v + $w activate $v + } + my UpdateSelectAttrs $w + } + -cbxsel { + set cbl [$w cget -values] + set v [lsearch -glob $cbl "$v*"] + if {$v>=0} { $w set [lindex $cbl $v] } + } + -ListboxSel { + bind $v <> [list [namespace current]::ListboxSelect %W] + } + -entrypop - -entrypopRO { + if {[winfo exists $v]} { + my makePopup $v [expr {$a eq {-entrypopRO}}] + } + } + -clearcom { + my makePopup $w no no no {} $v ;# popup menu with "Clear" command + } + -textpop - -textpopRO { + if {[winfo exists $v]} { + set ro [expr {$a eq {-textpopRO}}] + my makePopup $v $ro yes + set w $v + } elseif {[string length $v]>5} { + my makePopup $w no yes no $v + } + $w tag configure sel -borderwidth 1 + } + -notebazook { + foreach {fr attr} $v { + if {[string match -tr* $fr]} { + if {[string is boolean -strict $attr] && $attr} { + ttk::notebook::enableTraversal $w + } + } elseif {[string match -sel* $fr]} { + $w select $w.$attr + } elseif {![string match #* $fr]} { + set attr [my GetMC $attr] + set attr [subst $attr] + lassign [::apave::extractOptions attr -tip {} -tooltip {}] tip t2 + set wt [my MakeWidgetName $w $fr] + $w add [ttk::frame $wt] {*}$attr + catch {$wt config -takefocus 0} + if {[append tip $t2] ne {}} { + set tip [my MC $tip] + ::baltip::tip $w $tip -nbktab $wt + } + } + } + } + -gutter { + lassign [::apave::parseOptions $v -canvas Gut -width 5 -shift 6] canvas width shift + if {![winfo exists $canvas]} {set canvas [my $canvas]} + my bindGutter $w $canvas $width $shift + } + -onReturn { ;# makes a command run at Enter key pressing + lassign $v cmd from to + if {[set tvar [$w cget -textvariable]] ne {}} { + if {$from ne {}} { + set cmd "if {\$$tvar < $from} {set $tvar $from}; $cmd" + } + if {$to ne {}} { + set cmd "if {\$$tvar >$to} {set $tvar $to}; $cmd" + } + } + foreach k { } { + if {$v ne {}} {bind $w $k $cmd} + } + } + -linkcom { + lassign [my csGet] fg fg2 bg bg2 + my makeLabelLinked $w $v $fg $bg $fg2 $bg2 yes yes + } + -callF2 { + if {[llength $v]==1} {set w2 $v} {set w2 [string map $v $w]} + ::apave::bindToEvent $w $w2 invoke + } + -bindEC { + set v [string map [list %w $w] $v] + lassign $v ev com + ::apave::bindToEvent $w $ev {*}$com + switch -exact -- [winfo class $w] { + Treeview { + ::apave::bindToEvent $w selection clear + ::apave::bindToEvent $w selection clear + } + Listbox { + ::apave::bindToEvent $w selection clear + ::apave::bindToEvent $w selection clear + } + } + } + -timeout { + lassign $v timo lbl + after idle [list [self] timeoutButton $w $timo $lbl] + } + -myown { + eval {*}[string map [list %w $w] $v] + } + -bartabs { + after 10 [string map [list %w $w] $v] + } + -afteridle { + after idle [string map [list %w $w] $v] + } + -propagate { + if {[lindex $v 0] in {add pack}} { + pack propagate $w 0 + } else { + grid propagate $w 0 + } + } + -columnoptions { + foreach {col opts} $v { + $w column $col {*}$opts + } + } + -selborderwidth { + $w tag configure sel -borderwidth $v + } + -selcombobox { + bind $w <> $v + } + -selected { + if {[string is true $v]} { + after idle "$w selection range 0 end" + } + } + -popup { + after 50 "bind $w {$v}" ;# redefines other possible popups + } + -debug { + if {$v} { + # puts out the widget's name and (if exists) its method + set method [string toupper [my ownWName $w] 0] + if {$method in [info object methods [self]]} { + set method " METHOD: $method" + } else { + set method {} + } + puts "WIDGET: $w $method" + } + } + } + } + } + #_______________________ + + method CleanUps {{wr ""}} { + # Performs various clean-ups before and after showing a window. + # wr - window's path (to clean up at closing) + + # Cleans the unused widgets from _AP_VISITED list + for {set i [llength $::apave::_AP_VISITED(ALL)]} {[incr i -1]>=0} {} { + if {![winfo exists [lindex $::apave::_AP_VISITED(ALL) $i 0]]} { + set ::apave::_AP_VISITED(ALL) [lreplace $::apave::_AP_VISITED(ALL) $i $i] + } + } + if {$wr ne {}} { + for {set i [llength $::apave::_AP_VARS(TIMW)]} {[incr i -1]>=0} {} { + set w [lindex $::apave::_AP_VARS(TIMW) $i] + if {[string first $wr $w]==0 && ![catch {::baltip::hide $w}]} { + set ::apave::_AP_VARS(TIMW) [lreplace $::apave::_AP_VARS(TIMW) $i $i] + } + } + foreach {lst vars} [array get ::apave::_AP_VARS "_TRACED_${wr}*"] { + foreach v $vars { + ::apave::traceRemove $v + } + set ::apave::_AP_VARS($lst) [list] + } + } + } + #_______________________ + + method UpdateColors {} { + # Updates colors of widgets at changing CS. + + lassign [my csGet] fg fg2 bg bg2 - - - - - fg3 + # Visited labels: + my CleanUps + foreach lw $::apave::_AP_VISITED(ALL) { ;# mark the same links + lassign $lw w v inv + lassign [my makeLabelLinked $w $v $fg $bg $fg2 $bg2 no $inv] fg0 bg0 + if {[info exists ::apave::_AP_VISITED(FG,$w)]} { + set fg0 $fg3 + set ::apave::_AP_VISITED(FG,$w) $fg3 + } + $w configure -foreground $fg0 -background $bg0 + } + } + + ## ________________________ Links in labels _________________________ ## + + method initLinkFont {args} { + # Gets/sets font attributes of links (labels & text tags with -link). + # args - font attributes ("-underline 1" by default) + # Returns the current value of these attributes. + + if {[set ll [llength $args]]} { + if {$ll%2} { ;# clear the attributes, if called with "" + set ::apave::_AP_VARS(LINKFONT) [list] + } else { + lassign [::apave::extractOptions args -foreground {} -background {}] \ + ::apave::_AP_VARS(LINKFG) ::apave::_AP_VARS(LINKBG) + set ::apave::_AP_VARS(LINKFONT) $args + } + } + return $::apave::_AP_VARS(LINKFONT) + } + #_______________________ + + method labelFlashing {w1 w2 first args} { + # Options of 'flashing' label: + # -file (or -data) {list of image files (or data variables)} + # -label {list of labels' texts} + # -incr {increment for -alpha option} + # -pause {pause in seconds for -alpha 1.0} + # -after {interval for 'after'} + # -squeeze {value for *-big.png} + + if {![winfo exists $w1]} return + if {$first} { + lassign [::apave::parseOptions $args \ + -file {} -data {} -label {} -incr 0.01 -pause 3.0 -after 10 -squeeze {} -static 0] \ + ofile odata olabel oincr opause oafter osqueeze ostatic + if {$osqueeze ne {}} {set osqueeze "-subsample $osqueeze"} + lassign {0 -2 0 1} idx incev waitev direv + } else { + lassign $args ofile odata olabel oincr opause oafter osqueeze ostatic \ + idx incev waitev direv + } + set llf [llength $ofile] + set lld [llength $odata] + if {[set llen [expr {max($llf,$lld)}]]==0} return + incr incev $direv + set alphaev [expr {$oincr*$incev}] + if {$alphaev>=1} { + set alpha 1.0 + if {[incr waitev -1]<0} { + set direv -1 + } + } elseif {$alphaev<0} { + set alpha 0.0 + set idx [expr {$idx%$llen+1}] + set direv 1 + set incev 0 + set waitev [expr {int($opause/$oincr)}] + } else { + set alpha $alphaev + } + if {$llf} { + set png [list -file [lindex $ofile $idx-1]] + } elseif {[info exists [set datavar [lindex $odata $idx-1]]]} { + set png [list -data [set $datavar]] + } else { + set png [list -data $odata] + } + set NS [namespace current] + if {$ostatic} { + image create photo ${NS}::ImgT$w1 {*}$png + $w1 configure -image ${NS}::ImgT$w1 + } else { + image create photo ${NS}::ImgT$w1 {*}$png -format "png -alpha $alpha" + image create photo ${NS}::Img$w1 + ${NS}::Img$w1 copy ${NS}::ImgT$w1 {*}$osqueeze + $w1 configure -image ${NS}::Img$w1 + } + if {$w2 ne {}} { + if {$alphaev<0.33 && !$ostatic} { + set fg [$w1 cget -background] + } else { + if {[info exists ::apave::_AP_VISITED(FG,$w2)]} { + set fg $::apave::_AP_VISITED(FG,$w2) + } else { + set fg [$w1 cget -foreground] + } + } + $w2 configure -text [lindex $olabel $idx-1] -foreground $fg + } + after $oafter [list [self] labelFlashing $w1 $w2 0 \ + $ofile $odata $olabel $oincr $opause $oafter $osqueeze $ostatic \ + $idx $incev $waitev $direv] + } + #_______________________ + + method VisitedLab {w cmd {on ""} {fg ""} {bg ""}} { + # Marks a label as visited/not visited + # w - label's path + # cmd - command linked + # on - flag "the label visited" + # fg - foreground of label + # bg - background of label + + set styl [ttk::style configure TLabel] + if {$fg eq {}} {lassign [my csGet] - fg - bg} + if {[info exists ::apave::_AP_VARS(LINKFG)]} { + if {$::apave::_AP_VARS(LINKFG) ne {}} {set fg $::apave::_AP_VARS(LINKFG)} + if {$::apave::_AP_VARS(LINKBG) ne {}} {set bg $::apave::_AP_VARS(LINKBG)} + } + set vst [string map {{ } _} $cmd] + if {$on eq {}} { + set on [expr {[info exists ::apave::_AP_VISITED($vst)]}] + } + if {$on} { + set fg [lindex [my csGet] 9] + set ::apave::_AP_VISITED($vst) 1 + set ::apave::_AP_VISITED(FG,$w) $fg + foreach lw $::apave::_AP_VISITED(ALL) { ;# mark the same links + lassign $lw w2 cmd2 + if {[winfo exists $w2] && $cmd eq $cmd2} { + $w2 configure -foreground $fg -background $bg + set ::apave::_AP_VISITED(FG,$w2) $fg + } + } + } + $w configure -foreground $fg -background $bg + if {[set font [$w cget -font]] eq {}} { + set font $::apave::FONTMAIN + } else { + catch {set font [font actual $font]} + } + foreach {o v} [my initLinkFont] {dict set font $o $v} + $w configure -font $font + } + #_______________________ + + method HoverLab {w cmd on {fg ""} {bg ""}} { + # Actions on entering/leaving a linked label. + # w - label's path + # cmd - command linked + # on - flag "now hovering on the label" + # fg - foreground of label + # bg - background of label + + if {$on} { + if {$fg eq {}} {lassign [my csGet] fg - bg} + $w configure -background $bg + } else { + my VisitedLab $w $cmd {} $fg $bg + } + } + #_______________________ + + method textLink {w idx} { + # Gets a label's path of a link in a text widget. + # w - text's path + # idx - index of the link + + if {[info exists ::apave::__TEXTLINKS__($w)]} { + return [lindex $::apave::__TEXTLINKS__($w) $idx] + } + return {} + } + #_______________________ + + method makeLabelLinked {lab v fg bg fg2 bg2 {doadd yes} {inv no} } { + # Makes the linked label from a label. + # lab - label's path + # v - data of the link: command, tip, visited + # fg - foreground unhovered + # bg - background unhovered + # fg2 - foreground hovered + # bg2 - background hovered + # doadd - flag "register the label in the list of visited" + # inv - flag "invert the meaning of colors" + + set txt [$lab cget -text] + lassign [split [string map [list $Edge $::apave::UFF] $v] $::apave::UFF] v tt vz + set tt [string map [list %l $txt] $tt] + set v [string map [list %l $txt %t $tt] $v] + if {$tt ne {}} { + set tt [my MC $tt] + ::baltip tip $lab $tt + lappend ::apave::_AP_VARS(TIMW) $lab + } + if {$inv} { + set ft $fg + set bt $bg + set fg $fg2 + set bg $bg2 + set fg2 $ft + set bg2 $bt + } + my VisitedLab $lab $v $vz $fg $bg + bind $lab "::apave::obj EXPORT HoverLab $lab {$v} yes $fg2 $bg2" + bind $lab "::apave::obj EXPORT HoverLab $lab {$v} no $fg $bg" + bind $lab "::apave::obj EXPORT VisitedLab $lab {$v} yes $fg2 $bg2;$v" + if {$doadd} {lappend ::apave::_AP_VISITED(ALL) [list $lab $v $inv]} + list $fg $bg $fg2 $bg2 + } + #_______________________ + + method leadingSpaces {line} { + # Returns a number of leading spaces of a line + # line - the line + + expr {[string length $line]-[string length [string trimleft $line]]} + } + + ## ________________________ Text methods _________________________ ## + + method SetContentVariable {tvar txtnam name} { + # Sets an internal text variable combining its main attributes. + # tvar - external variable for text + # txtnam - full name of widget + # name - short (tail) name of widget + # The tricky thing is for further access to all of the text. + # See also: GetContentVariable + + set PV(textcont,$tvar) $tvar*$txtnam*$name + } + #_______________________ + + method GetContentVariable {tvar} { + # Gets an internal text variable. + # See also: SetContentVariable + + return $PV(textcont,$tvar) + } + #_______________________ + + method SplitContentVariable {ftxvar} { + # Gets parts of an internal text variable. + # See also: SetContentVariable + + split $ftxvar * + } + #_______________________ + + method getTextContent {tvar} { + # Gets text content. + # tvar - text variable + # Uses an internal text variable to extract the text contents. + # Returns the content of text. + + lassign [my SplitContentVariable [my GetContentVariable $tvar]] \ + -> txtnam wid + string trimright [$txtnam get 1.0 end] + } + #_______________________ + + method onKeyTextM {w K {s {}}} { + # Processes indents and braces at pressing keys. + # w - text's path + # K - key's name + # s - key's state + + set lindt [string length $::apave::_AP_VARS(INDENT)] + switch -exact $K { + Return - KP_Enter { + # at pressing Enter key, indent (and possibly add the right brace) + # but shift/ctrl+Enter acts by default - without indenting + if {$s & 1 || $s & 4} return + set idx1 [$w index {insert linestart}] + set idx2 [$w index {insert lineend}] + set line [$w get $idx1 $idx2] + set nchars [my leadingSpaces $line] + set indent [string range $line 0 $nchars-1] + set ch1 [string range $line $nchars $nchars+1] + set islist [expr {$ch1 in {{* } {- } {# }}}] + set ch2 [string index $line end] + set idx1 [$w index insert] + set idx2 [$w index "$idx1 +1 line"] + set st2 [$w get "$idx2 linestart" "$idx2 lineend"] + set ch3 [string index [string trimleft $st2] 0] + if {$indent ne {} || $ch2 eq "\{" || $K eq {KP_Enter} || $st2 ne {} || $islist} { + set st1 [$w get "$idx1" "$idx1 lineend"] + if {[string index $st1 0] in [list \t { }]} { + # if space(s) are at the right, remove them at cutting + set n1 [my leadingSpaces $st1] + $w delete $idx1 [$w index "$idx1 +$n1 char"] + } elseif {$ch2 eq "\{" && $st1 eq {}} { + # indent + closing brace + set nchars2 [my leadingSpaces $st2] + if {$st2 eq {} || $nchars>$nchars2 || ($nchars==$nchars2 && $ch3 ne "\}")} { + append indent $::apave::_AP_VARS(INDENT) \n $indent "\}" + } else { + append indent $::apave::_AP_VARS(INDENT) + } + incr nchars $lindt + } elseif {$indent eq {} && $st2 ne {}} { + # no indent of previous line, try to get it from the next + if {[string trim $st2] eq "\}"} { + # add indentation for the next brace + set st2 "$::apave::_AP_VARS(INDENT)$st2" + } + set nchars [my leadingSpaces $st2] + set indent [string range $st2 0 [expr {$nchars-1}]] + } + # a new line supplied with "list-like pattern" + if {$islist && ![string match *.0 $idx1] && \ + [string trim [$w get "$idx1 linestart" $idx1]] ne {}} { + if {$ch1 eq {# } && int($idx1)>1} { + # for comments: if only more than 1 of them, then add another + set idx0 [$w index "$idx1 -1 line"] + set st0 [string trimleft [$w get "$idx0 linestart" "$idx0 lineend"]] + if {[string index $st0 0] ne {#} && $ch3 ne {#}} { + set ch1 {} + } + } + set indent "$indent$ch1" + incr nchars [string length $ch1] + } + $w insert $idx1 \n$indent + ::tk::TextSetCursor $w [$w index "$idx2 linestart +$nchars char"] + return -code break + } + } + braceright - "\}" { + # right brace pressed: shift the brace to left + set idx1 [$w index insert] + set st [$w get "$idx1 linestart" "$idx1 lineend"] + set idx2 [$w index "$idx1 -1 line"] + set st2 [$w get "$idx2 linestart" "$idx2 lineend"] + set nchars [my leadingSpaces $st] + set nchars2 [my leadingSpaces $st2] + set st2 [string index $st2 end] + if {($st2 ne "\{" && $nchars2<=$nchars || $st2 eq "\{" && $nchars2<$nchars) \ + && [string trimright $st] eq {} && [string length $st]>=$lindt} { + if {$nchars>$nchars2} {set lindt [expr {$nchars-$nchars2}]} + $w delete "$idx1 lineend -$lindt char" "$idx1 lineend" + } + } + } + } + #_______________________ + + method setTextBinds {wt} { + # Returns bindings for a text widget. + # wt - the text's path + + if {[bind $wt <>] eq {}} { + set res " \ + ::apave::bindToEvent $wt <> [self] pasteText $wt ;\ + ::apave::bindToEvent $wt [self] onKeyTextM $wt %K %s ;\ + ::apave::bindToEvent $wt [self] onKeyTextM $wt %K %s ;\ + catch {::apave::bindToEvent $wt [self] onKeyTextM $wt %K}" + } + foreach k [::apave::getTextHotkeys CtrlD] { + append res " ; ::apave::bindToEvent $wt <$k> [self] doubleText $wt" + } + foreach k [::apave::getTextHotkeys CtrlY] { + append res " ; ::apave::bindToEvent $wt <$k> [self] deleteLine $wt" + } + foreach k [::apave::getTextHotkeys CtrlA] { + append res " ; ::apave::bindToEvent $wt <$k> $wt tag add sel 1.0 end {;} break" + } + foreach k [::apave::getTextHotkeys CtrlT] { + append res " ; ::apave::bindToEvent $wt <$k> ::apave::InsertChar $wt {\t} {;} break" + } + set lstart linestart + if {[::isunix]} {append lstart { +1c}} ;# don't use "break" + foreach k [::apave::getTextHotkeys CtrlB] { + append res " ; ::apave::bindToEvent $wt <$k> ::apave::CursorToBEOL $wt {$lstart}" + } + foreach k [::apave::getTextHotkeys CtrlE] { + append res " ; ::apave::bindToEvent $wt <$k> ::apave::CursorToBEOL $wt lineend" + } + append res " ;\ + ::apave::bindToEvent $wt [self] linesMove $wt -1 ;\ + ::apave::bindToEvent $wt [self] linesMove $wt +1" + } + #_______________________ + + method TextCommandForChange {w com on {com2 ""}} { + # Replaces a command of text widget for making changes + # w - text widget's name + # com - command for changes + # on - if "yes", replaces a text command; if "no", restores it + # In particular, when `com` is empty, the text widget becomes readonly. + + set newcom $w.internal + if {!$on} { + if {[info commands ::$newcom] ne {}} { + rename ::$w {} + rename ::$newcom ::$w + } + } elseif {[info commands ::$newcom] eq {}} { + rename $w ::$newcom + if {$com eq {}} { + # text to be readonly + ; proc ::$w {args} " + switch -exact -- \[lindex \$args 0\] \{ + insert \{\} + delete \{\} + replace \{\} + default \{ + return \[eval ::$newcom \$args\] + \} + \}" + } else { + # text to be sensible to changes + ; proc ::$w {args} " + set _res_of_TextCommandForChange \[eval ::$newcom \$args\] + switch -exact -- \[lindex \$args 0\] \{ + insert \{$com\} + delete \{$com\} + replace \{$com\} + \} + return \$_res_of_TextCommandForChange" + } + } + if {$com2 ne {}} { + {*}$com2 + } + } + #_______________________ + + method readonlyWidget {w {on yes} {popup yes}} { + # Switches on/off a widget's readonly state for a text widget. + # w - text widget's path + # on - "on/off" boolean flag + # popup - "make popup menu" boolean flag + # See also: + # [wiki.tcl-lang.org](https://wiki.tcl-lang.org/page/Read-only+text+widget) + + my TextCommandForChange $w {} $on + if {$popup} {my makePopup $w $on yes} + } + #_______________________ + + method GetOutputValues {} { + # Makes output values for some widgets (lbx, fco). + # Some i/o widgets need a special method to get their returned values. + + foreach aop $Widgetopts { + lassign $aop optnam vn v1 v2 + switch -glob -- $optnam { + -lbxname* { + # To get a listbox's value, its methods are used. + # The widget may not exist when an apave object is used for + # several dialogs which is a bad style (very very bad). + if {[winfo exists $vn]} { + lassign [$vn curselection] s1 + if {$s1 eq {}} {set s1 0} + set w [string range $vn [string last . $vn]+1 end] + if {[catch {set v0 [$vn get $s1]}]} {set v0 {}} + if {$optnam eq {-lbxnameALL}} { + # when -ALL option is set to 1, listbox returns + # a list of 3 items - sel index, sel contents and all contents + set $v1 [list $s1 $v0 [set $v1]] + } else { + set $v1 $v0 + } + } + } + -retpos { ;# a range to cut from -tvar/-lvar variable + lassign [split $v2 :] p1 p2 + set val1 [set $v1] + # there may be -list option for this widget + # then if the value is from the list, it's fully returned + foreach aop2 $Widgetopts { + lassign $aop2 optnam2 vn2 lst2 + if {$optnam2 eq {-list} && $vn eq $vn2} { + foreach val2 $lst2 { + if {$val1 eq $val2} { + set p1 0 + set p2 end + break + } + } + break + } + } + set $v1 [string range $val1 $p1 $p2] + } + } + } + } + #_______________________ + + method focusNext {w wnext {wnext0 ""}} { + # Sets focus on a next widget (possibly, defined as `my Widget`). + # w - parent window name + # wnext - next widget's name + # wnext0 - core next name (used internally, for recursive search) + + if {$wnext eq {}} return + if {[winfo exist $wnext]} { + focus $wnext ;# direct path to the next widget + return + } + # try to find the next widget in hierarchy of widgets + set ws $wnext + if {$wnext0 eq {}} { + # get the real next widget (wnext can be uppercased or calculated) + catch {set wnext [subst $wnext]} + if {![string match {my *} $wnext]} { + catch {set wnext [my [my ownWName $wnext]]} + } + my focusNext $w $wnext $wnext + } else { + set wnext $wnext0 + } + foreach wn [winfo children $w] { + my focusNext $wn $wnext $wnext0 + if {[string match "*.$wnext" $wn] || [string match "*.$ws" $wn]} { + focus $wn + return + } + } + } + #_______________________ + + method AdditionalCommands {w wdg attrsName} { + # Gets additional commands (for non-standard attributes). + # w - window name + # wdg - widget's full path + # attrsName - variable name for widget's attributes + + upvar $attrsName attrs + set addcomms {} + if {[set tooltip [::apave::getOption -tooltip {*}$attrs]] ne {} || + [set tooltip [::apave::getOption -tip {*}$attrs]] ne {}} { + ::apave::initBaltip + if {[set i [string first $Edge $tooltip]]>=0} { + set tooltip [string range $tooltip 1 end-1] + set tattrs [string range $tooltip [incr i -1]+[string length $Edge] end] + set tooltip "{[string range $tooltip 0 $i-1]}" + } else { + set tattrs {} + } + set tooltip [my MC $tooltip] + lappend addcomms [list ::baltip::tip $wdg $tooltip {*}$tattrs] + set attrs [::apave::removeOptions $attrs -tooltip -tip] + } + if {[::apave::getOption -ro {*}$attrs] ne {} || \ + [::apave::getOption -readonly {*}$attrs] ne {}} { + lassign [::apave::extractOptions attrs -ro 0 -readonly 0] ro readonly + lappend addcomms [list my readonlyWidget $wdg [expr $ro||$readonly]] + } + if {[set wnext [::apave::getOption -tabnext {*}$attrs]] ne {}} { + # two widgets for Tab & Shift/Tab (proc can be used to get them) + set wnext [string trim $wnext "\{\}"] + if {[string first \[ $wnext]==0} { ;# if [comm1] [comm2] for next/prev + set wprev {} + catch {lassign [subst $wnext] wnext wprev} + } else { + if {[catch {lassign [{*}$wnext] wnext wprev}]} { + lassign $wnext wnext wprev + } + } + if {$wnext eq {0}} {set wnext $wdg} ;# disables Tab on this widget + if {[::iswindows]} { + set i1 {{%s}==0} ;# in Windows: Shift+Tab doesn't work in text + } else { + set i1 1 + } + set c1 "[self] focusNext $w $wnext ; break" + set c2 "[self] focusNext $w $wprev ; break" + set i2 [expr {$wprev ne {}}] + after idle [list if "\[winfo exists $wdg\]" [list bind $wdg \ + [list + if {{%K} eq {Tab}} [list if $i1 $c1 elseif $i2 $c2]]]] + set attrs [::apave::removeOptions $attrs -tabnext] + } + return $addcomms + } + #_______________________ + + method DefineWidgetKeys {wname widget} { + # Sets some hotkeys for some widgets (e.g. Enter to work as Tab) + # wname - the widget's name + # widget - the widget's type + # This may be disabled by including "STD" in the widget's name. + + if {[string first STD $wname]>0} return + if {($widget in {ttk::entry entry})} { + bind $wname \ + "$wname selection clear ; \ + if {{$::tcl_platform(platform)} eq {windows}} { + event generate $wname + } else { + event generate $wname -keysym ISO_Left_Tab + }" + bind $wname \ + "$wname selection clear ; \ + event generate $wname -keysym Tab" + } elseif {$widget in {ttk::button button ttk::checkbutton checkbutton \ + ttk::radiobutton radiobutton "my tk_optionCascade"}} { + foreach k { } { + bind $wname $k [list \ + if {$::tcl_platform(platform) eq {windows}} [list \ + event generate $wname \ + ] else [list \ + event generate $wname -keysym ISO_Left_Tab] \ + ] + } + foreach k { } { + bind $wname $k \ + [list event generate $wname -keysym Tab] + } + } + if {$widget in {ttk::button button \ + ttk::checkbutton checkbutton ttk::radiobutton radiobutton}} { + foreach k { } { + bind $wname $k \ + [list event generate $wname -keysym space] + } + } + if {$widget in {ttk::entry entry spinbox ttk::spinbox ttk::combobox}} { + foreach k { } { + bind $wname $k \ + "+ $wname selection clear ; event generate $wname -keysym Tab" + } + } + } + + ## ________________________ Paving windows _________________________ ## + + method colorWindow {win args} { + # Initialize colors of a window. + # win - window's path + # args - arguments for csSet + + if {[my apaveTheme]} { + my csSet [my csCurrent] $win {*}$args + if {$args ne {-doit}} {my themeNonThemed $win} + } else { + my themeNonThemed $win + } + } + #_______________________ + + method ShowOption {name} { + # Gets a default show option, used in showModal. + # name - name of option + # See also: getShowOption, setShowOption + + return "_SHOWMODAL_$name" + } + #_______________________ + + method getShowOption {name {defval ""}} { + # Gets a default show option, used in showModal. + # name - name of option + # defval - default value + # See also: showModal + + ::apave::getProperty [my ShowOption $name] $defval + } + #_______________________ + + method setShowOption {name args} { + # Sets / gets a default show option, used in showModal. + # name - name of option + # args - value of option + # See also: showModal + + ::apave::setProperty [my ShowOption $name] {*}$args + } + #_______________________ + + method pavedPath {} { + # Gets the currently paved window's path. + + return $Modalwin + } + #_______________________ + + method Window {w inplists} { + # Paves the window with widgets. + # w - window's name (path) + # inplists - list of widget items (lists of widget data) + # Contents of a widget's item: + # name - widget's name (first 3 characters define its type) + # neighbor - top (T) or left (L) neighbor of the widget + # posofnei - position of neighbor: T (top) or L (left) + # rowspan - row span of the widget + # colspan - column span of the widget + # options - grid/pack options + # attrs - attributes of widget + # First 3 items are mandatory, others are set at need. + # Called by *paveWindow* method to process a portion of widgets. + # The "portion" refers to a separate block of widgets such as + # notebook's tabs or frames. + + set ::apave::_AP_VARS(WPAVE) [winfo toplevel $w] + set lwidgets [list] + # comments be skipped + foreach lst $inplists { + if {[string index $lst 0] ne {#}} { + lappend lwidgets $lst + } + } + set lused [list] + set lwlen [llength $lwidgets] + if {$lwlen<2 && [string trim $lwidgets "{} "] eq {}} { + set lwidgets [list {fra - - - - {pack -padx 99 -pady 99}}] + set lwlen 1 + } + for {set i 0} {$i < $lwlen} {} { + set lst1 [lindex $lwidgets $i] + if {[my Replace_Tcl i lwlen lwidgets {*}$lst1] ne {}} {incr i} + } + # firstly, normalize all names that are "subwidgets" (.lab for fra.lab) + # also, "+" for previous neighbors + set i [set lwlen [llength $lwidgets]] + while {$i>1} { + incr i -1 + set lst1 [lindex $lwidgets $i] + lassign $lst1 name neighbor + if {$neighbor eq {+}} {set neighbor [lindex $lwidgets $i-1 0]} + lassign [my NormalizeName name i lwidgets] name wname + set neighbor [lindex [my NormalizeName neighbor i lwidgets] 0] + set lst1 [lreplace $lst1 0 1 $wname $neighbor] + set lwidgets [lreplace $lwidgets $i $i $lst1] + } + for {set i 0} {$i < $lwlen} {} { + # List of widgets contains data per widget: + # widget's name, + # neighbor widget, position of neighbor (T, L), + # widget's rowspan and columnspan (both optional), + # grid options, widget's attributes (both optional) + set lst1 [lindex $lwidgets $i] + set lst1 [my Replace_chooser w i lwlen lwidgets {*}$lst1] + if {[set lst1 [my Replace_bar w i lwlen lwidgets {*}$lst1]] eq {}} { + incr i + continue + } + lassign $lst1 name neighbor posofnei rowspan colspan options1 attrs1 + lassign [my NormalizeName name i lwidgets] name wname + set wname [my MakeWidgetName $w $wname] + if {$colspan eq {} || $colspan eq {-}} { + set colspan 1 + if {$rowspan eq {} || $rowspan eq {-}} { + set rowspan 1 + } + } + foreach ao {attrs options} { + if {[catch {set $ao [uplevel 2 subst -nocommand -nobackslashes [list [set ${ao}1]]]}]} { + set $ao [set ${ao}1] + } + } + lassign [my widgetType $wname $options $attrs] widget options attrs nam3 dsbl + # The type of widget (if defined) means its creation + # (if not defined, it was created after "makewindow" call + # and before "window" call) + if { !($widget eq {} || [winfo exists $widget])} { + set attrs [my GetAttrs $attrs $nam3 $dsbl] + set attrs [my ExpandOptions $attrs] + # for scrollbars - set up the scrolling commands + if {$widget in {ttk::scrollbar scrollbar}} { + set neighbor [lindex [my LowercaseWidgetName $neighbor] 0] + set wneigb [my WidgetNameFull $w $neighbor] + if {$posofnei eq {L}} { + $wneigb config -yscrollcommand "$wname set" + set attrs "$attrs -com \\\{$wneigb yview\\\}" + append options { -side right -fill y} ;# -after $wneigb" + } elseif {$posofnei eq {T}} { + $wneigb config -xscrollcommand "$wname set" + set attrs "$attrs -com \\\{$wneigb xview\\\}" + append options { -side bottom -fill x} ;# -before $wneigb" + } + set options [string map [list %w $wneigb] $options] + } + my Pre attrs + set addcomms [my AdditionalCommands $w $wname attrs] + eval $widget $wname {*}$attrs + my Post $wname $attrs + foreach acm $addcomms {{*}$acm} + # for buttons and entries - set up the hotkeys (Up/Down etc.) + my DefineWidgetKeys $wname $widget + } + if {$neighbor eq {-} || $row < 0} { + set row [set col 0] + } + # check for simple creation of widget (without pack/grid) + if {$neighbor ne {#}} { + set options [my GetIntOptions $w $options $row $rowspan $col $colspan] + set pack [string trim $options] + if {[string first add $pack]==0} { + set comm "[winfo parent $wname] add $wname [string range $pack 4 end]" + {*}$comm + } elseif {[string first pack $pack]==0} { + set opts [string trim [string range $pack 5 end]] + if {[string first forget $opts]==0} { + pack forget {*}[string range $opts 6 end] + } else { + pack $wname {*}$opts + } + } else { + grid $wname -row $row -column $col -rowspan $rowspan \ + -columnspan $colspan -padx 1 -pady 1 {*}$options + } + } + lappend lused [list $name $row $col $rowspan $colspan] + if {[incr i] < $lwlen} { + lassign [lindex $lwidgets $i] name neighbor posofnei + set neighbor [lindex [my LowercaseWidgetName $neighbor] 0] + set row -1 + foreach cell $lused { + lassign $cell uname urow ucol urowspan ucolspan + if {[lindex [my LowercaseWidgetName $uname] 0] eq $neighbor} { + set col $ucol + set row $urow + if {$posofnei eq {T} || $posofnei eq {}} { + incr row $urowspan + } elseif {$posofnei eq {L}} { + incr col $ucolspan + } + } + } + } + } + return $lwidgets + } + #_______________________ + + method paveWindow {args} { + # Processes "win / list_of_widgets" pairs. + # args - list of pairs "win / lwidgets" + # The *win* is a window's path. The *lwidgets* is a list of widget items. + # Each widget item contains: + # name - widget's name (first 3 characters define its type) + # neighbor - top or left neighbor of the widget + # posofnei - position of neighbor: T (top) or L (left) + # rowspan - row span of the widget + # colspan - column span of the widget + # options - grid/pack options + # attrs - attributes of widget + # First 3 items are mandatory, others are set at need. + # This method calls *paveWindow* in a cycle, to process a current "win/lwidgets" pair. + + set res [list] + set wmain [set wdia {}] + foreach {w lwidgets} $args { + if {[lindex $lwidgets 0 0] eq {after}} { + # if 1st item is "after idle" or like "after 1000", layout the window after... + # (fit for "invisible independent" windows/frames/tabs) + set what [lindex $lwidgets 0 1] + if {$what eq {idle} || [string is integer -strict $what]} { + after $what [list [self] paveWindow $w [lrange $lwidgets 1 end]] + after $what [list [self] colorWindow $w -doit] + } + continue + } + lappend res {*}[my Window $w $lwidgets] + if {[set ifnd [regexp -indices -inline {[.]dia\d+} $w]] ne {}} { + set wdia [string range $w 0 [lindex $ifnd 0 1]] + } else { + set wmain .[lindex [split $w .] 1] + } + } + # add a system Menu binding for the created window + if {[winfo exists $wdia]} {::apave::initPOP $wdia} elseif { + [winfo exists $wmain]} {::apave::initPOP $wmain} + return $res + } + #_______________________ + + method window {args} { + # Obsolete version of paveWindow (remains for compatibility). + # See also: paveWindow + + return [uplevel 1 [list [self] paveWindow {*}$args]] + } + #_______________________ + + method WinVarname {win} { + # Gets a unique varname for a window. + # win - window's path + + return [namespace current]::PV(_WIN_,$win) + } + #_______________________ + + method waitWinVar {win var modal} { + # Tk waiting for variable's change. + # win - the window's path + # var - variable's name to receive a result (tkwait's variable) + # modal - yes at showing the window as modal + + # first of all, wait till the window be visible + after 1 ;# solves an issue with doubleclicking buttons + if {![winfo viewable $win]} { + tkwait visibility $win + } + set wmain [::apave::mainWindowOfApp] + if {$modal} { ;# for modal, grab the window + set wgr [grab current] + if {$wmain ne {} && $wmain ne $win} { + if {[catch {grab set $win} e]} { + catch {tkwait visibility $win} ;# 2nd attempt to get the window visible, by force + catch {grab set $win} ;# (not sure, where it can fire, still let it be) + puts stderr "\napave::waitWinVar - please send a note to apave developers on this catch. Error: $e" + catch {puts stderr "apave::waitWinVar - [info level -1]\n"} + } + } + } + # at need, wait till the window associated variable be changed + if {$var ne {}} { + tkwait variable $var + } + if {$modal} { ;# for modal, release the grab and restore the old one + catch {grab release $win} + if {$wgr ne {}} { + catch {grab set $wgr} + } + } + } + #_______________________ + + method showWindow {win modal ontop {var ""} {minsize ""} {waitvar 1} {waitme {}}} { + # Displays a windows and goes in tkwait cycle to interact with a user. + # win - the window's path + # modal - yes at showing the window as modal + # ontop - yes at showing the window as topmost + # var - variable's name to receive a result (tkwait's variable) + # minsize - list {minwidth minheight} or {} + # waitvar - if yes, force tkwait variable (mostly for non-modal windows) + # waitme - if empty, deiconify immediately, otherwise after waiting a variable or "timeout and/or idle" + + ::apave::InfoWindow [expr {[::apave::InfoWindow] + 1}] $win $modal $var yes + if {$waitme ne {}} { + if {[info exists $waitme]} { + vwait $waitme + ::apave::deiconify $win + catch {incr $waitme} ;# used to trigger chained events + } else { + after {*}$waitme ::apave::deiconify $win + } + } else { + ::apave::deiconify $win + } + if {$minsize eq {}} { + set minsize [list [winfo width $win] [winfo height $win]] + } + wm minsize $win {*}$minsize + bind $win "[namespace current]::WinResize $win" + if {$ontop} {wm attributes $win -topmost 1} + if {$modal} { + # modal window: + my waitWinVar $win $var $modal + ::apave::InfoWindow [expr {[::apave::InfoWindow] - 1}] $win $modal $var + } else { + # non-modal window: + if {[set wgr [grab current]] ne {}} { + # otherwise the non-modal window is irresponsive (in Windows even at WM level): + grab release $wgr + } + if {$waitvar && $var ne {}} { + my waitWinVar $win $var $modal ;# show and wait for closing the window + } + } + } + #_______________________ + + method showModal {win args} { + # Shows a window as modal. + # win - window's name + # args - attributes of window ("-name value" pairs) + + set ::apave::MODALWINDOW $win + ::apave::setAppIcon $win + set ontop [my getShowOption -ontop 0] + lassign [::apave::extractOptions args -centerme {} -ontop $ontop -modal yes \ + -minsize {} -themed {} -input 0 -variable {} -waitvar {} -transient {-} \ + -root {} -parent {} -waitme {}] \ + centerme ontop modal minsize themed input varname waitvar transient \ + root parent waitme + $win configure -bg [lindex [my csGet] 3] ;# removes blinking by default bg + if {$themed in {{} {0}} && [my csCurrent] != [apave::cs_Non]} { + my colorWindow $win + } + if {$centerme eq {}} { + # obsolete options: -root, -parent + if {$root ne {}} {set centerme $root} {set centerme $parent} + } + set root [winfo parent $win] + set rooted 1 + if {$centerme ne {}} { + ;# forced centering relative to a caller's window + lassign [::apave::splitGeometry $centerme] rw rh rx ry + set rooted [expr {![regexp {[+|-]+\d+\++} $centerme]}] + if {$rooted && [winfo exist $centerme]} { + set root $centerme + } + } + set decor [expr {$root in {{} .}}] + foreach {o v} [list -decor $decor -focus {} -onclose {} -geometry {} \ + -resizable {} -escape 1 -checkgeometry 1] { + set v [my getShowOption $o $v] + lappend defargs $o $v + set [string range $o 1 end] $v + } + if {$varname ne {}} { + set waitvar 1 + } else { + set waitvar [string is true $waitvar] ;# default 1: wait for closing the window + set varname [my WinVarname $win] + } + array set opt [list {*}$defargs {*}$args] + if {$ontop eq {}} { + if {$opt(-ontop)} { + set ontop yes + } else { + set ontop no + catch { + set ontop [wm attributes [winfo parent $win] -topmost] + } + if {!$ontop} { + # find if a window child of "." is topmost + # if so, let this one be topmost too + foreach w [winfo children .] { + catch {set ontop [wm attributes $w -topmost]} + if {$ontop} break + } + } + } + } + if {$rooted} { + lassign [::apave::splitGeometry [wm geometry [winfo toplevel $root]]] rw rh rx ry + } + if {$transient ne {-}} { + wm transient $win $transient + } elseif {!$opt(-decor)} { + wm transient $win $root + } + if {[set destroy [expr {$opt(-onclose) eq {destroy}}]]} { + set opt(-onclose) {} + } + if {$opt(-onclose) eq {}} { + set opt(-onclose) "set $varname 0" + } else { + set opt(-onclose) "$opt(-onclose) $varname" ;# $opt(-onclose) is a command + set opt(-onclose) [string map [list %w $win] $opt(-onclose)] + } + if {$destroy} {append opt(-onclose) " ; catch {destroy $win}"} + if {$opt(-resizable) ne {}} { + if {[string is boolean $opt(-resizable)]} { + set opt(-resizable) "$opt(-resizable) $opt(-resizable)" + } + wm resizable $win {*}$opt(-resizable) + } + if {!($modal || $waitvar)} { + append opt(-onclose) "; ::apave::obj EXPORT CleanUps $win" + } + foreach ev {KeyRelease ButtonRelease} { + after idle [list bind $Modalwin <$ev> "::apave::focusApp $Modalwin"] + } + if {$modal} {lappend ::apave::FOCUSED $win} + wm protocol $win WM_TAKE_FOCUS {after idle ::apave::focusApp} + wm protocol $win WM_DELETE_WINDOW $opt(-onclose) + # get the window's geometry from its requested sizes + set inpgeom $opt(-geometry) + if {$inpgeom eq {}} { + # this is for less blinking: + set opt(-geometry) [my CenteredXY $rw $rh $rx $ry \ + [winfo reqwidth $win] [winfo reqheight $win]] + } elseif {[string first pointer $inpgeom]==0} { + lassign [split $inpgeom+0+0 +] -> x y + set inpgeom +[expr {$x+[winfo pointerx .]}]+[expr {$y+[winfo pointery .]}] + set opt(-geometry) $inpgeom + } elseif {[string first root $inpgeom]==0} { + set root .[string trimleft [string range $inpgeom 5 end] .] + set opt(-geometry) [set inpgeom {}] + } + if {$opt(-geometry) ne {}} { + lassign [::apave::splitGeometry $opt(-geometry) {} {}] - - x y + if {$x ne {}} {wm geometry $win $x$y} + } + if {$opt(-focus) eq {}} { + set opt(-focus) $win + } + set $varname {-} + if {$opt(-escape)} {bind $win $opt(-onclose)} + update + if {![winfo exists $win]} { + return 0 ;# looks idiotic, yet possible at sporadic calls + } + set w [winfo reqwidth $win] + set h [winfo reqheight $win] + if {$inpgeom eq {}} { ;# final geometrizing with actual sizes + set geo [my CenteredXY $rw $rh $rx $ry $w $h] + set y [lindex [split $geo +] end] + if {!$rooted || $root ne {.} && (($h/2-$ry-$rh/2)>30 || [::iswindows] && $y>0)} { + # ::tk::PlaceWindow needs correcting in rare cases, namely: + # when 'root' is of less sizes than 'win' and at screen top + wm geometry $win $geo + } else { + ::tk::PlaceWindow $win widget $root + } + } else { + lassign [::apave::splitGeometry $inpgeom {} {}] - - x y + if {$x ne {} && $y ne {} && [string first x $inpgeom]<0 && $opt(-checkgeometry)} { + set inpgeom [my checkXY $w $h $x $y] + } elseif {$x eq {} && $y eq {} && $centerme ne {} && $opt(-geometry) ne {}} { + lassign [split $opt(-geometry) x+] w h + lassign [split [my CenteredXY $rw $rh $rx $ry $w $h] +] -> x y + set inpgeom ${w}x$h+$x+$y + } + set inpgeom [::apave::checkGeometry $inpgeom] + catch {wm geometry $win $inpgeom} + } + if {$opt(-focus) eq {Tab}} { + after 100 "catch {focus $win; event generate $win }" ;# to focus on 1st + } else { + after 100 "catch {focus -force $opt(-focus); apave::setProperty FOCW_$win $opt(-focus)}" + } + if {[info exists ::transpops::my::cntwait]} { + # this specific bind - for transpops package (to hide a demo message by keys) + bind $win {set ::transpops::my::cntwait 0} + } + my showWindow $win $modal $ontop $varname $minsize $waitvar $waitme + set res 0 + catch { + if {$modal || $waitvar} {my CleanUps $win} + if {[winfo exists $win]} { + if {$input} {my GetOutputValues} + set res [set [set _ $varname]] + } + } + return $res + } + #_______________________ + + method res {{win {}} {result get}} { + # Gets/sets a variable for *vwait* command. + # win - window's path + # result - value of variable + # This method is used when + # - an event cycle should be stopped with changing a variable's value + # - a result of event cycle (the variable's value) should be got + # In the first case, *result* is set to an integer. In *apave* dialogs + # the integer is corresponding a pressed button's index. + # In the second case, *result* is omitted or equal to "get". + # Returns a value of variable that controls an event cycle. + + if {$win eq {}} {set win [my dlgPath]} + set varname [my WinVarname $win] + if {$result eq {get}} { + return [set $varname] + } + my CleanUps $win + return [set $varname $result] + } + #_______________________ + + method makeWindow {w ttl args} { + # Creates a toplevel window that has to be paved. + # w - window's name + # ttl - window's title + # args - options for 'toplevel' command + # If $w matches "*.fra" then ttk::frame is created with name $w. + + my CleanUps + set w [set wtop [string trimright $w .]] + set withfr [expr {[set pp [string last . $w]]>0 && \ + [string match *.fra $w]}] + if {$withfr} { + set wtop [string range $w 0 $pp-1] + } + catch {destroy $wtop} + lassign [::apave::extractOptions args -type {}] type + set Modalwin [toplevel $wtop {*}$args] + ::apave::withdraw $wtop ;# nice to hide all gui manipulations + if {$type ne {} && [tk windowingsystem] eq {x11}} { + wm attributes $wtop -type $type + } + if {$withfr} { + pack [frame $w -background [lindex [my csGet] 3]] -expand 1 -fill both + } + wm title $wtop $ttl + return $wtop + } + #_______________________ + + method displayText {w conts {pos 1.0}} { + # Sets the text widget's contents. + # w - text widget's name + # conts - contents to be set in the widget + + if {[set state [$w cget -state]] ne {normal}} { + $w configure -state normal + } + $w replace 1.0 end $conts + $w edit reset; $w edit modified no + if {$state eq {normal}} { + ::tk::TextSetCursor $w $pos + } else { + $w configure -state $state + } + } + #_______________________ + + method resetText {w state {contsName {}}} { + # Resets a text widget to edit/view from scratch. + # w - text widget's name + # state - widget's final state (normal/disabled) + # contsName - variable name for contents to be set in the widget + + if {$contsName ne {}} { + upvar 1 $contsName conts + $w replace 1.0 end $conts + } + $w edit reset + $w edit modified no + $w configure -state $state + } + #_______________________ + + method displayTaggedText {w contsName {tags ""}} { + # Sets the text widget's contents using tags (ornamental details). + # w - text widget's name + # contsName - variable name for contents to be set in the widget + # tags - list of tags to be applied to the text + # The lines in *text contents* are divided by \n and can include + # *tags* like in a html layout, e.g. RED ARMY. + # The *tags* is a list of "name/value" pairs. 1st is a tag's name, 2nd + # is a tag's value. + # The tag's name is "pure" one (without <>) so e.g.for .. the tag + # list contains "b". + # The tag's value is a string of text attributes (-font etc.). + # If the tag's name is FG, FG2, BG or BG2, then it is really a link color. + + upvar $contsName conts + if {$tags eq {}} { + my displayText $w $conts + return + } + lassign [my csGet] fg fg2 bg bg2 + if { [set state [$w cget -state]] ne {normal}} { + $w configure -state normal + } + set taglist [set tagpos [set taglen [list]]] + foreach tagi $tags { + lassign $tagi tag opts + if {$tag in {FG FG2 BG BG2} } { + set [string tolower $tag] $opts + } elseif {![string match link* $tag]} { + $w tag config $tag {*}$opts + } + lappend tagpos 0 + lappend taglen [string length $tag] + } + set tLen [llength $tags] + set disptext {} + set irow 1 + foreach line [split $conts \n] { + if {$irow > 1} { + append disptext \n + } + set newline {} + while 1 { + set p [string first \< $line] + if {$p < 0} { + break + } + append newline [string range $line 0 $p-1] + set line [string range $line $p end] + set i 0 + set nrnc $irow.[string length $newline] + foreach tagi $tags pos $tagpos len $taglen { + lassign $tagi tag + if {[string first <$tag> $line]==0} { + if {$pos ne {0}} { + error "\napave: mismatched <$tag> in line $irow.\n" + } + lset tagpos $i $nrnc + set line [string range $line $len+2 end] + break + } elseif {[string first $line]==0} { + if {$pos eq {0}} { + error "\napave: mismatched in line $irow.\n" + } + lappend taglist [list $i $pos $nrnc] + lset tagpos $i 0 + set line [string range $line $len+3 end] + break + } + incr i + } + if {$i == $tLen} { + # tag not found after "<" - shift by 1 character + append newline [string index $line 0] + set line [string range $line 1 end] + } + } + append disptext $newline $line + incr irow + } + $w replace 1.0 end $disptext + set lfont [$w cget -font] + catch {set lfont [font actual $lfont]} + foreach {o v} [my initLinkFont] {dict set lfont $o $v} + set ::apave::__TEXTLINKS__($w) [list] + for {set it [llength $taglist]} {[incr it -1]>=0} {} { + set tagli [lindex $taglist $it] + lassign $tagli i p1 p2 + lassign [lindex $tags $i] tag opts + if {[string match link* $tag] && \ + [set ist [lsearch -exact -index 0 $tags $tag]]>=0} { + set txt [$w get $p1 $p2] + set lab ${w}l[incr ::apave::__linklab__] + ttk::label $lab -text $txt -font $lfont -foreground $fg -background $bg + set ::apave::__TEXTLINKS__($w) [linsert $::apave::__TEXTLINKS__($w) 0 $lab] + $w delete $p1 $p2 + $w window create $p1 -window $lab + set v [lindex $tags $ist 1] + my makeLabelLinked $lab $v $fg $bg $fg2 $bg2 + } else { + $w tag add $tag $p1 $p2 + } + } + my resetText $w $state + } + +# ________________________ EOC ::apave::APaveBase _________________________ # + +} + +# _____________________________ EOF _____________________________________ # diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apavecli.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apavecli.tcl new file mode 100644 index 00000000..fd7fd297 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apavecli.tcl @@ -0,0 +1,96 @@ +#! /usr/bin/env tclsh + +############################################################################ +# +# Runs pave dialogs from CLI. +# Scripted by Alex Plotnikov. +# +# After choosing 'OK' in a dialog, the dialog's result is written to stdout. +# The output would be sort of: +# #!/bin/bash +# export var1='value 1' +# export var2='value 2' +# ... +# export varN='value 3' +# The output may be redirected to temp file. After analizing the result of +# dialog (1 if 'OK', otherwise 0), the output temp file may be sourced to +# execute the "export ..." commands. So that the dialog's variable values +# would be assigned to the environment variables with appropriate names, +# within the current shell. +# +# Example: +# +# tclsh ~/UTILS/pave/pavecli.tcl "" "TEST OF pavecli" \ + { ent1 {" Find: "} {"$::EN1 2 3"} ent2 {"Replace: "} \ + {"$::EN2 $::EN4"} labo {{} {-anchor w} {-t "\\nOptions:" -font \ + {-weight bold}}} {} radA {{Match: }} {{RE } Exact "Glob" \ + {RE }} seh {{} {} {}} {} chb1 {{Match whole word only}} \ + {1} chb2 {{Match case }} {1} seh2 {{} {} {}} {} \ + v_ {{} {} {}} {} cbx1 {{Where: }} {{"in file"} {in file} \ + {in session} {in directory}} } -head "Enter data:" -weight bold \ + == EN1 EN2 V1 C1 C2 W1 > tmp.sh ; \ + if [ $? -eq 1 ]; then source tmp.sh; fi ; \ + rm tmp.sh ; \ + echo "EN1=$EN1, EN2=$EN2, V1=$V1, C1=$C1, C2=$C2, W1=$W1" +# +# The end of command looks like this: +# == EN1 EN2 V1 C1 C2 W1 > tmp.sh +# which sets the EN1, EN2, V1, C1, C2 and W1 output variables and redirects +# their assignment to tmp.sh file. After checking the command's result, the +# tmp.sh file is executed in the current shell, by 'source' command. +# +# So the EN1, EN2, V1, C1, C2 and W1 environment variables would correspond +# to the dialog's variables. +# +# See also: +# https://aplsimple.github.io/en/tcl/pave +# +############################################################################ + +if {[catch {package require apave}]} { + set ::apavedir [file dirname [info script]] + lappend auto_path $::apavedir + if {[catch {package require apave}]} { + lset auto_path end $::apavedir/pave + package require apave + } +} + +namespace eval apavecli { +} + +#=== Input dialog for getting data +proc ::apavecli::input {args} { + + ::apave::APave create dialog + set cmd [subst -nocommands -novariables [string range $args 1 end-1]] + set dp [string last " ==" $cmd] + if {$dp<0} {set dp 999999} + set data [string range $cmd $dp+3 end] + set data [split [string trim $data]] + set cmd "dialog input [string range $cmd 0 $dp-1]" + set res [eval $cmd] + set r [lindex $res 0] + if {$r && $data ne ""} { + set rind 0 + puts "#!/bin/bash" + foreach res [lrange $res 1 end] { + puts "export [lindex $data $rind]='$res'" + incr rind + } + } + return $r +} + +#=== Run dialog +proc ::apavecli::run {} { + + apave::initWM + set res [::apavecli::input $::argv] + ::apave::APave destroy + exit $res +} + +::apavecli::run + +#% DOCTEST SOURCE tests/apavecli.test diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apavedialog.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apavedialog.tcl new file mode 100644 index 00000000..ea0126c8 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apavedialog.tcl @@ -0,0 +1,1444 @@ +########################################################### +# Name: apavedialog.tcl +# Author: Alex Plotnikov (aplsimple@gmail.com) +# Date: 12/09/2021 +# Brief: Handles standard dialogs with advanced features. +# License: MIT. +########################################################### + +source [file join [file dirname [info script]] apavebase.tcl] + +# ________________________ apave NS _________________________ # + +namespace eval ::apave { + + variable querydlg {} + variable msgarray; array set msgarray [list] + set msgarray(savenot) {Don't save} + set msgarray(savetext) {Save text} + set msgarray(saveask) {Save changes made to the text?} + set msgarray(find) {Find: } + + proc dlgPath {} { + # Gets a current dialogue's path. + # In fact, it does the same as [my dlgPath], but it can be + # called outside of apave dialogue object (useful sometimes). + + return $::apave::querydlg + } + #_______________________ + + proc msgcatDialogs {} { + # Prepares localized messages used in dialogues. + + variable msgarray + foreach n [array names msgarray] { + set msgarray($n) [msgcat::mc $msgarray($n)] + } + } + + ## ________________________ EONS apave _________________________ ## + +} + +# ________________________ APaveDialog class _________________________ # + +oo::class create ::apave::APaveDialog { + + superclass ::apave::APaveBase + + variable HLstring Winpath CheckNomore Foundstr Dlgpath Defb1 Defb2 Indexdlg + + #_______________________ + + constructor {{win ""} args} { + # Creates APaveDialog object. + # win - window's name (path) + # args - additional arguments + + set Winpath $win ;# dialogs are bound to $win, default "" means . + set Dlgpath {} ;# current dialog's path + set Foundstr {} ;# current found string + set HLstring {} ;# current selected string + + # Actions on closing the editor + ; proc exitEditor {w resExit} { + upvar $resExit res + set wtxt [my TexM] + if {[my askForSave $wtxt] && [$wtxt edit modified]} { + set pdlg [::apave::APaveDialog new $w] + set r [$pdlg misc warn $::apave::msgarray(savetext) \ + "\n $::apave::msgarray(saveask) \n" \ + [list Save 1 $::apave::msgarray(savenot) Close Cancel 0] \ + 1 -focusback [my TexM] -centerme $w] + if {$r==1} { + set res 1 + } elseif {$r eq "Close"} { + set res 0 + } + $pdlg destroy + } else { + set res 0 + } + return + } + # end of APaveDialog constructor + if {[llength [self next]]} { next {*}$args } + } + #_______________________ + + destructor { + # Clears variables used in the object. + + if {[llength [self next]]} next + } + + ## ________________________ Standard dialogs _________________________ ## + + # ok - dialog with button OK + # okcancel - dialog with buttons OK, Cancel + # yesno - dialog with buttons YES, NO + # yesnocancel - dialog with buttons YES, NO, CANCEL + # retrycancel - dialog with buttons RETRY, CANCEL + # abortretrycancel - dialog with buttons ABORT, RETRY, CANCEL + # misc - dialog with miscellaneous buttons + # + # Called as: + # dialog icon ttl msg ?defb? ?args? + # + # Mandatory arguments of dialogs: + # icon - icon name (info, warn, err, ques) + # ttl - title + # msg - message + # Optional arguments: + # defb - default button (OK, YES, NO, CANCEL, RETRY, ABORT) + # args - options for Query + #_______________________ + + method PrepArgs {args} { + # Prepares a list of arguments. + # Returns the list (wrapped in list) and a command for OK button. + + lassign [::apave::parseOptions $args -modal {} -ch {} -comOK {} -onclose {}] \ + modal ch comOK onclose + if {[string is true -strict $modal]} { + set com 1 + } elseif {$ch ne {}} { + # some options are incompatible with -ch + if {[string match *destroy* $onclose]} {set onclose {}} + lappend args -modal 1 -onclose $onclose + set com 1 + } elseif {$comOK eq {}} { + set com destroy ;# non-modal without -ch option + } else { + set com $comOK + } + list [list $args] $com + } + #_______________________ + + method ok {icon ttl msg args} { + # Shows the *OK* dialog. + # icon - icon + # ttl - title + # msg - message + # args - options + + lassign [my PrepArgs {*}$args] args comOK + my Query $icon $ttl $msg "ButOK OK $comOK" ButOK {} $args + } + #_______________________ + + method okcancel {icon ttl msg {defb OK} args} { + # Shows the *OKCANCEL* dialog. + # icon - icon + # ttl - title + # msg - message + # defb - button to be selected + # args - options + + lassign [my PrepArgs {*}$args] args + my Query $icon $ttl $msg \ + {ButOK OK 1 ButCANCEL Cancel 0} But$defb {} $args + } + #_______________________ + + method yesno {icon ttl msg {defb YES} args} { + # Shows the *YESNO* dialog. + # icon - icon + # ttl - title + # msg - message + # defb - button to be selected + # args - options + + lassign [my PrepArgs {*}$args] args + my Query $icon $ttl $msg \ + {ButYES Yes 1 ButNO No 0} But$defb {} $args + } + #_______________________ + + method yesnocancel {icon ttl msg {defb YES} args} { + # Shows the *YESNOCANCEL* dialog. + # icon - icon + # ttl - title + # msg - message + # defb - button to be selected + # args - options + + lassign [my PrepArgs {*}$args] args + my Query $icon $ttl $msg \ + {ButYES Yes 1 ButNO No 2 ButCANCEL Cancel 0} But$defb {} $args + } + #_______________________ + + method retrycancel {icon ttl msg {defb RETRY} args} { + # Shows the *RETRYCANCEL* dialog. + # icon - icon + # ttl - title + # msg - message + # defb - button to be selected + # args - options + + lassign [my PrepArgs {*}$args] args + my Query $icon $ttl $msg \ + {ButRETRY Retry 1 ButCANCEL Cancel 0} But$defb {} $args + } + #_______________________ + + method abortretrycancel {icon ttl msg {defb RETRY} args} { + # Shows the *ABORTRETRYCANCEL* dialog. + # icon - icon + # ttl - title + # msg - message + # defb - button to be selected + # args - options + + lassign [my PrepArgs {*}$args] args + my Query $icon $ttl $msg \ + {ButABORT Abort 1 ButRETRY Retry 2 ButCANCEL \ + Cancel 0} But$defb {} $args + } + #_______________________ + + method misc {icon ttl msg butts {defb ""} args} { + # Shows the *MISCELLANEOUS* dialog. + # icon - icon + # ttl - title + # msg - message + # butts - list of buttons + # defb - button to be selected + # args - options + # The *butts* is a list of pairs "title of button" "number/ID of button" + + foreach {nam num} $butts { + set but But[namespace tail $num] ;# for "num" set as a command + lappend apave_msc_bttns $but "$nam" $num + if {$defb eq {}} { + set defb $num + } + } + lassign [my PrepArgs {*}$args] args + my Query $icon $ttl $msg $apave_msc_bttns But$defb {} $args + } + + ## ________________________ Progress for splash _________________________ ## + + method progress_Begin {type wprn ttl msg1 msg2 maxvalue args} { + # Creates and shows a progress window. Fit for splash screens. + # type - any word(s) + # wprn - parent window + # ttl - title message + # msg1 - top message + # msg2 - bottom message + # maxvalue - maximum value + # args - additional attributes of the progress bar + # If type={}, widgetType method participates too in progress_Go, and also + # progress_End puts out a little statistics. + # See also: APaveBase::widgetType, progress_Go, progress_End + + set ::apave::_AP_VARS(win) .proSplashScreen + set qdlg $::apave::_AP_VARS(win) + set atr1 "-maximum 100 -value 0 -mode determinate -length 300 -orient horizontal" + set widlist [list \ + "fra - - - - pack {-h 10}" \ + ".Lab1SplashScreen - - - - pack {-t {$msg1}}" \ + ".ProgSplashScreen - - - - pack {$atr1 $args}" \ + ".Lab2SplashScreen - - - - {pack -anchor w} {-t {$msg2}}" \ + ] + set win [my makeWindow $qdlg.fra $ttl] + set widlist [my paveWindow $qdlg.fra $widlist] + ::tk::PlaceWindow $win widget $wprn + my showWindow $win 0 1 + update + set ::apave::_AP_VARS(ProSplash,type) $type + set ::apave::_AP_VARS(ProSplash,win) $win + set ::apave::_AP_VARS(ProSplash,wid1) [my Lab1SplashScreen] + set ::apave::_AP_VARS(ProSplash,wid2) [my ProgSplashScreen] + set ::apave::_AP_VARS(ProSplash,wid3) [my Lab2SplashScreen] + set ::apave::_AP_VARS(ProSplash,val1) 0 + set ::apave::_AP_VARS(ProSplash,val2) 0 + set ::apave::_AP_VARS(ProSplash,value) 0 + set ::apave::_AP_VARS(ProSplash,curvalue) 0 + set ::apave::_AP_VARS(ProSplash,maxvalue) $maxvalue + set ::apave::_AP_VARS(ProSplash,after) [list] + # 'after' should be postponed, as 'update' messes it up + rename ::after ::ProSplash_after + ; proc ::after {args} { + lappend ::apave::_AP_VARS(ProSplash,after) $args + } + } + #_______________________ + + method progress_Go {value {msg1 ""} {msg2 ""}} { + # Updates a progress window. + # value - current value of the progress bar + # msg1 - top message + # msg2 - bottom message + # Returns current percents (value) of progress. + # If it reaches 100, the progress_Go may continue from 0. + # See also: progress_Begin + + set ::apave::_AP_VARS(ProSplash,val1) $value + incr ::apave::_AP_VARS(ProSplash,val2) + set val [expr {min(100,int(100*$value/$::apave::_AP_VARS(ProSplash,maxvalue)))}] + if {$val!=$::apave::_AP_VARS(ProSplash,value)} { + set ::apave::_AP_VARS(ProSplash,value) $val + catch { ;# there might be no splash widgets, then let it run dry + $::apave::_AP_VARS(ProSplash,wid2) configure -value $val + if {$msg1 ne {}} { + $::apave::_AP_VARS(ProSplash,wid1) configure -text $msg1 + } + if {$msg2 ne {}} { + $::apave::_AP_VARS(ProSplash,wid3) configure -text $msg2 + } + update + } + } + return $val + } + #_______________________ + + method progress_End {} { + # Destroys a progress window. + # See also: progress_Begin + + variable ::apave::_AP_VARS + catch { + destroy $::apave::_AP_VARS(ProSplash,win) + rename ::after {} + rename ::ProSplash_after ::after + foreach aftargs $::apave::_AP_VARS(ProSplash,after) { + after {*}$aftargs + } + if {$::apave::_AP_VARS(ProSplash,type) eq {}} { + puts "Splash statistics: \ + \n \"maxvalue\": $::apave::_AP_VARS(ProSplash,maxvalue) \ + \n curr.value: $::apave::_AP_VARS(ProSplash,val1) \ + \n steps made: $::apave::_AP_VARS(ProSplash,val2)" + } + unset ::apave::_AP_VARS(ProSplash,type) + unset ::apave::_AP_VARS(ProSplash,win) + unset ::apave::_AP_VARS(ProSplash,wid1) + unset ::apave::_AP_VARS(ProSplash,wid2) + unset ::apave::_AP_VARS(ProSplash,wid3) + unset ::apave::_AP_VARS(ProSplash,val1) + unset ::apave::_AP_VARS(ProSplash,val2) + unset ::apave::_AP_VARS(ProSplash,value) + unset ::apave::_AP_VARS(ProSplash,curvalue) + unset ::apave::_AP_VARS(ProSplash,maxvalue) + unset ::apave::_AP_VARS(ProSplash,after) + } + } + + ## ________________________ Text utilities _________________________ ## + + method pasteText {txt} { + # Removes a selection at pasting. + # txt - text's path + # The absence of this feature is very perpendicular of Tk's paste. + + set err [catch {$txt tag ranges sel} sel] + if {!$err && [llength $sel]==2} { + lassign $sel pos1 pos2 + set pos [$txt index insert] + if {[$txt compare $pos >= $pos1] && [$txt compare $pos <= $pos2]} { + $txt delete $pos1 $pos2 + } + } + } + #_______________________ + + method doubleText {txt {dobreak 1}} { + # Doubles a current line or a selection of text widget. + # txt - text's path + # dobreak - if true, means "return -code break" + # The *dobreak=true* allows to break the Tk processing of keypresses + # such as Ctrl+D. + # If not set, the text widget is identified as `my TexM`. + + if {$txt eq {}} {set txt [my TexM]} + set err [catch {$txt tag ranges sel} sel] + if {!$err && [llength $sel]==2} { + lassign $sel pos pos2 + set pos3 insert ;# single selection + } else { + lassign [my GetLinePosition $txt insert] pos pos2 ;# current line + set pos3 $pos2 + } + set duptext [$txt get $pos $pos2] + if {$pos3 ne {insert} && $pos2==[$txt index end]} { + # current line is the last one: duplicate it properly + set duptext \n[string range $duptext 0 end-1] + } + $txt insert $pos3 $duptext + if {$dobreak} {return -code break} + } + #_______________________ + + method deleteLine {txt {dobreak 1}} { + # Deletes a current line of text widget. + # txt - text's path + # dobreak - if true, means "return -code break" + # The *dobreak=true* allows to break the Tk processing of keypresses + # such as Ctrl+Y. + # If not set, the text widget is identified as `my TexM`. + + if {$txt eq {}} {set txt [my TexM]} + lassign [my GetLinePosition $txt insert] linestart lineend + $txt delete $linestart $lineend + if {$dobreak} {return -code break} + } + #_______________________ + + method linesMove {txt to {dobreak 1}} { + # Moves a current line or lines of selection up/down. + # txt - text's path + # to - direction (-1 means "up", +1 means "down") + # dobreak - if true, means "return -code break" + # The *dobreak=true* allows to break the Tk processing of keypresses + # such as Ctrl+Y. + # If not set, the text widget is identified as `my TexM`. + + ; proc NewRow {ind rn} { + set i [string first . $ind] + set row [string range $ind 0 $i-1] + return [incr row $rn][string range $ind $i end] + } + if {$txt eq {}} {set txt [my TexM]} + set err [catch {$txt tag ranges sel} sel] + lassign [$txt index insert] pos ;# position of caret + if {[set issel [expr {!$err && [llength $sel]==2}]]} { + lassign $sel pos1 pos2 ;# selection's start & end + set l1 [expr {int($pos1)}] + set l2 [expr {int($pos2)}] + set pos21 [$txt index "$pos2 linestart"] + if {[$txt get $pos21 $pos2] eq {}} {incr l2 -1} + set lfrom [expr {$to>0 ? $l2+1 : $l1-1}] + set lto [expr {$to>0 ? $l1-1 : $l2-1}] + } else { + set lcurr [expr {int($pos)}] + set lfrom [expr {$to>0 ? $lcurr+1 : $lcurr-1}] + set lto [expr {$to>0 ? $lcurr-1 : $lcurr-1}] + } + set lend [expr {int([$txt index end])}] + if {$lfrom>0 && $lfrom<$lend} { + incr lto + lassign [my GetLinePosition $txt $lfrom.0] linestart lineend + set duptext [$txt get $linestart $lineend] + ::apave::undoIn $txt + $txt delete $linestart $lineend + $txt insert $lto.0 $duptext + ::tk::TextSetCursor $txt [NewRow $pos $to] + if {$issel} { + $txt tag add sel [NewRow $pos1 $to] [NewRow $pos2 $to] + } + if {[lsearch -glob [$txt tag names] tagCOM*]>-1} { + catch {::hl_tcl::my::Modified $txt insert $lto.0 $lto.end} + } + ::apave::undoOut $txt + if {$dobreak} {return -code break} + } + } + #_______________________ + + method selectedWordText {txt} { + # Returns a word under the cursor or a selected text. + # txt - the text's path + + set seltxt {} + if {![catch {$txt tag ranges sel} seltxt]} { + if {[set forword [expr {$seltxt eq {}}]]} { + set pos [$txt index "insert wordstart"] + set pos2 [$txt index "insert wordend"] + set seltxt [string trim [$txt get $pos $pos2]] + if {![string is wordchar -strict $seltxt]} { + # when cursor just at the right of word: take the word at the left + set pos [$txt index "insert -1 char wordstart"] + set pos2 [$txt index "insert -1 char wordend"] + } + } else { + lassign $seltxt pos pos2 + } + catch { + set seltxt [$txt get $pos $pos2] + if {[set sttrim [string trim $seltxt]] ne {}} { + if {$forword} {set seltxt $sttrim} + } + } + } + return $seltxt + } + #_______________________ + + method InitFindInText { {ctrlf 0} {txt {}} } { + # Initializes the search in the text. + # ctrlf - "1" means that the method is called by Ctrl+F + # txt - path to the text widget + + if {$txt eq {}} {set txt [my TexM]} + if {$ctrlf} { ;# Ctrl+F moves cursor 1 char ahead + ::tk::TextSetCursor $txt [$txt index "insert -1 char"] + } + if {[set seltxt [my selectedWordText $txt]] ne {}} { + set Foundstr $seltxt + } + } + #_______________________ + + method findInText {{donext 0} {txt ""} {varFind ""} {dobell yes}} { + # Finds a string in text widget. + # donext - "1" means 'from a current position' + # txt - path to the text widget + # varFind - variable + # dobell - if yes, bells + # Returns yes, if found (or nothing to find), otherwise returns "no"; + # also, if there was a real search, the search string is added. + + if {$txt eq {}} { + set txt [my TexM] + set sel $Foundstr + } elseif {$donext && [set sel [my get_HighlightedString]] ne {}} { + # find a string got with alt+left/right + } elseif {$varFind eq {}} { + set sel $Foundstr + } else { + set sel [set $varFind] + } + if {$donext} { + set pos [$txt index insert] + if {{sel} in [$txt tag names $pos]} { + set pos [$txt index "$pos + 1 chars"] + } + set pos [$txt search -- $sel $pos end] + } else { + set pos {} + my set_HighlightedString {} + } + if {![string length "$pos"]} { + set pos [$txt search -- $sel 1.0 end] + } + if {[string length "$pos"]} { + ::tk::TextSetCursor $txt $pos + $txt tag add sel $pos [$txt index "$pos + [string length $sel] chars"] + focus $txt + set res yes + } else { + if {$dobell} bell + set res no + } + list $res $sel + } + #_______________________ + + method GetLinkLab {m} { + # Gets a link for label. + # m - label with possible link (between and ) + # Returns: list of "pure" message and link for label. + + if {[set i1 [string first "" $m]]<0} { + return [list $m] + } + set i2 [string first "" $m] + set link [string range $m $i1+6 $i2-1] + set m [string range $m 0 $i1-1][string range $m $i2+7 end] + list $m [list -link $link] + } + #_______________________ + + method popupFindCommands {pop {txt {}} {com1 ""} {com2 ""}} { + # Returns find commands for a popup menu on a text. + # pop - path to the menu + # txt - path to the text + # com1 - user's command "find first" + # com2 - user's command "find next" + + set accF3 [::apave::KeyAccelerator [::apave::getTextHotkeys F3]] + if {$com1 eq {}} {set com1 "[self] InitFindInText 0 $txt; focus \[[self] Entfind\]"} + if {$com2 eq {}} {set com2 "[self] findInText 1 $txt"} + return "\$pop add separator + \$pop add command [my iconA find] -accelerator Ctrl+F -label \"Find First\" \\ + -command {$com1} + \$pop add command [my iconA none] -accelerator $accF3 -label \"Find Next\" \\ + -command {$com2}" + } + #_______________________ + + method popupBlockCommands {pop {txt {}}} { + # Returns block commands for a popup menu on a text. + # pop - path to the menu + # txt - path to the text + + set accD [::apave::KeyAccelerator [::apave::getTextHotkeys CtrlD]] + set accY [::apave::KeyAccelerator [::apave::getTextHotkeys CtrlY]] + return "\$pop add separator + \$pop add command [my iconA add] -accelerator $accD -label \"Double Selection\" \\ + -command \"[self] doubleText {$txt} 0\" + \$pop add command [my iconA delete] -accelerator $accY -label \"Delete Line\" \\ + -command \"[self] deleteLine {$txt} 0\" + \$pop add command [my iconA up] -accelerator Alt+Up -label \"Line(s) Up\" \\ + -command \"[self] linesMove {$txt} -1 0\" + \$pop add command [my iconA down] -accelerator Alt+Down -label \"Line(s) Down\" \\ + -command \"[self] linesMove {$txt} +1 0\"" + } + #_______________________ + + method askForSave {wtxt {doask ""}} { + # For a text, sets/gets "ask for save changes" flag. + # wtxt - text's path + # doask - flag + # If the flag argument omitted, returns the flag else sets it. + # See also: constructor + + set prop _AskForSave_$wtxt + if {$doask eq {}} { + set res [::apave::getProperty $prop] + if {![string is false -strict $res]} {set res 1} + } else { + set res [::apave::setProperty $prop $doask] + } + return $res + } + + ## ________________________ Highlighting _________________________ ## + + method popupHighlightCommands {{pop ""} {txt ""}} { + # Returns highlighting commands for a popup menu on a text. + # pop - path to the menu + # txt - path to the text + + set accQ [::apave::KeyAccelerator [::apave::getTextHotkeys AltQ]] + set accW [::apave::KeyAccelerator [::apave::getTextHotkeys AltW]] + set res "\$pop add separator + \$pop add command [my iconA upload] -accelerator $accQ \\ + -label \"Highlight First\" -command \"[self] seek_highlight %w 2\" + \$pop add command [my iconA download] -accelerator $accW \\ + -label \"Highlight Last\" -command \"[self] seek_highlight %w 3\" + \$pop add command [my iconA previous] -accelerator Alt+Left \\ + -label \"Highlight Previous\" -command \"[self] seek_highlight %w 0\" + \$pop add command [my iconA next] -accelerator Alt+Right \\ + -label \"Highlight Next\" -command \"[self] seek_highlight %w 1\" + \$pop add command [my iconA none] -accelerator Dbl.Click \\ + -label \"Highlight All\" -command \"[self] highlight_matches %w\"" + if {$txt ne {}} {set res [string map [list %w $txt] $res]} + return $res + } + #_______________________ + + method set_HighlightedString {sel} { + # Saves a string got from highlighting by Alt+left/right/q/w. + # sel - the string to be saved + + set HLstring $sel + if {$sel ne {}} {set Foundstr $sel} + } + #_______________________ + + method get_HighlightedString {} { + # Returns a string got from highlighting by Alt+left/right/q/w. + + if {[info exists HLstring]} { + return $HLstring + } + return {} + } + #_______________________ + + method set_highlight_matches {w} { + # Creates bindings to highlight matches in a text. + # w - path to the text + + if {![winfo exists $w]} return + $w tag configure hilited -foreground #1f0000 -background #ffa073 + $w tag configure hilited2 -foreground #1f0000 -background #ff6b85 + $w tag lower hilited sel + bind $w [list [self] highlight_matches $w] + ::apave::bindToEvent $w [self] unhighlight_matches $w + bind $w "[self] seek_highlight $w 0 ; break" + bind $w "[self] seek_highlight $w 1 ; break" + foreach k [::apave::getTextHotkeys AltQ] { + bind $w <$k> [list [self] seek_highlight $w 2] + } + foreach k [::apave::getTextHotkeys AltW] { + bind $w <$k> [list [self] seek_highlight $w 3] + } + } + #_______________________ + + method get_highlighted {txt} { + # Gets a selected word after double-clicking on a text. + # w - path to the text + + set err [catch {$txt tag ranges sel} sel] + lassign $sel pos pos2 + if {!$err && [llength $sel]==2} { + set sel [$txt get $pos $pos2] ;# single selection + } else { + if {$err || [string trim $sel] eq {}} { + set pos [$txt index "insert wordstart"] + set pos2 [$txt index "insert wordend"] + set sel [string trim [$txt get $pos $pos2]] + if {![string is wordchar -strict $sel]} { + # when cursor just at the right of word: take the word at the left + # e.g. if "_" stands for cursor then "word_" means selecting "word" + set pos [$txt index "insert -1 char wordstart"] + set pos2 [$txt index "insert -1 char wordend"] + set sel [string trim [$txt get $pos $pos2]] + } + set slen [string length $sel] + if {!$slen} {incr slen; set pos2 [$txt index "$pos2 +1c"]} + set pos [$txt index "$pos2 -$slen char"] + set sel [string trim [$txt get $pos $pos2]] + } + } + list $sel $pos $pos2 + } + #_______________________ + + method highlight_matches {txt} { + # Highlights matches of selected word in a text. + # txt - path to the text + + lassign [my get_highlighted $txt] sel pos pos2 + if {$sel eq {}} return + after idle "[self] highlight_matches_real $txt $pos $pos2" + my set_HighlightedString $sel + set lenList {} + set posList [$txt search -all -count lenList -- "$sel" 1.0 end] + foreach pos2 $posList len $lenList { + if {$len eq {}} {set len [string length $sel]} + set pos3 [$txt index "$pos2 + $len chars"] + if {$pos2 == $pos} { + lappend matches2 $pos2 $pos3 + } else { + lappend matches1 $pos2 $pos3 + } + } + catch { + $txt tag remove hilited 1.0 end + $txt tag remove hilited2 1.0 end + $txt tag add hilited {*}$matches1 + $txt tag add hilited2 {*}$matches2 + } + set ::apave::_AP_VARS(HILI,$txt) yes + } + #_______________________ + + method unhighlight_matches {txt} { + # Unhighlights matches of selected word in a text. + # w - path to the text + + if {[info exists ::apave::_AP_VARS(HILI,$txt)] && $::apave::_AP_VARS(HILI,$txt)} { + $txt tag remove hilited 1.0 end + $txt tag remove hilited2 1.0 end + set ::apave::_AP_VARS(HILI,$txt) no + } + } + #_______________________ + + method seek_highlight {txt mode} { + # Seeks the selected word forward/backward/to first/to last in a text. + # w - path to the text + # mode - 0 (search backward), 1 (forward), 2 (first), 3 (last) + + my unhighlight_matches $txt + lassign [my get_highlighted $txt] sel pos pos2 + if {$sel eq {}} return + my set_HighlightedString $sel + switch $mode { + 0 { ;# backward + set nc [expr {[string length $sel] - 1}] + set pos [$txt index "$pos - $nc chars"] + set pos [$txt search -backwards -- $sel $pos 1.0] + } + 1 { ;# forward + set pos [$txt search -- $sel $pos2 end] + } + 2 { ;# to first + set pos [$txt search -- $sel 1.0 end] + } + 3 { ;# to last + set pos [$txt search -backwards -- $sel end 1.0] + } + } + if {[string length "$pos"]} { + ::tk::TextSetCursor $txt $pos + $txt tag add sel $pos [$txt index "$pos + [string length $sel] chars"] + } + } + #_______________________ + + method highlight_matches_real {txt pos1 pos2} { + # Highlights a selected word in a text, esp. fow Windows. + # Windows thinks a word is edged by spaces only: not in real case. + # txt - path to the text + # pos1 - starting position of real selection + # pos2 - ending position of real selection + + $txt tag remove sel 1.0 end + if {[$txt get $pos1] eq "\n"} { + # if a word at line start, Windows select an empty line above + lassign [split $pos1 .] l c + set pos1 [incr l].$c + } + catch {::tk::TextSetCursor $txt $pos1} + $txt tag add sel $pos1 $pos2 + } + + ## ________________________ Query's auxiliaries _________________________ ## + + method varName {wname} { + # Gets a variable name associated with a widget's name of "input" dialogue. + # wname - widget's name + + return [namespace current]::var$wname + } + #_______________________ + + method FieldName {name} { + # Gets a field name. + + return fraM.fra$name.$name + } + #_______________________ + + method GetVarsValues {lwidgets} { + # Gets values of entries passed (or set) in -tvar. + # lwidgets - list of widget items + + set res [set vars [list]] + foreach wl $lwidgets { + set ownname [my ownWName [lindex $wl 0]] + set vv [my varName $ownname] + set attrs [lindex $wl 6] + if {[string match "ra*" $ownname]} { + # only for widgets with a common variable (e.g. radiobuttons): + foreach t {-var -tvar} { + if {[set v [::apave::getOption $t {*}$attrs]] ne {}} { + array set a $attrs + set vv $v + } + } + } + if {[info exist $vv] && [lsearch $vars $vv]==-1} { + lappend res [set $vv] + lappend vars $vv + } + } + return $res + } + #_______________________ + + method SetGetTexts {oper w iopts lwidgets} { + # Sets/gets contents of text fields. + # oper - "set" to set, "get" to get contents of text field + # w - window's name + # iopts - equals to "" if no operation + # lwidgets - list of widget items + + if {$iopts eq {}} return + foreach widg $lwidgets { + set wname [lindex $widg 0] + set name [my ownWName $wname] + if {[string range $name 0 1] eq "te"} { + set vv [my varName $name] + if {$oper eq "set"} { + my displayText $w.$wname [set $vv] + } else { + set $vv [string trimright [$w.$wname get 1.0 end]] + } + } + } + } + #_______________________ + + method GetLinePosition {txt ind} { + # Gets a line's position. + # txt - text widget + # ind - index of the line + # Returns a list containing a line start and a line end. + + set linestart [$txt index "$ind linestart"] + set lineend [expr {$linestart + 1.0}] + list $linestart $lineend + } + #_______________________ + + method AppendButtons {widlistName buttons neighbor pos defb timeout win modal ONCLOSE} { + # Adds buttons to the widget list from a position of neighbor widget. + # widlistName - variable name for widget list + # buttons - buttons to add + # neighbor - neighbor widget + # pos - position of neighbor widget + # defb - default button + # timeout - timeout (to count down seconds and invoke a button) + # win - dialogue's path + # modal - yes if the window is modal + # ONCLOSE - command to run at closing the dialog + # Returns list of "Help" button's name and command. + + upvar $widlistName widlist + set Defb1 [set Defb2 [set bhlist {}]] + foreach {but txt res} $buttons { + set com "[self] res $Dlgpath" + if {[info commands $res] eq {}} { + set com "$com $res" + } else { + if {$res eq {destroy}} { + # for compatibility with old modal windows + if {$modal} {set res "$com 0"} {set res "destroy $win"} + } + set com $res ;# "res" is set as a command + } + if {$but eq {butHELP}} { + # Help button contains the command in "res" + set com [string map "%w $win" $res] + set bhlist [list $but $com] + } elseif {$Defb1 eq {}} { + set Defb1 $but + } elseif {$Defb2 eq {}} { + set Defb2 $but + } + if {$ONCLOSE ne {}} {append com " ; $ONCLOSE"} + if {[set _ [string first "::" $txt]]>-1} { + set tt " -tip {[string range $txt $_+2 end]}" + set txt [string range $txt 0 $_-1] + } else { + set tt {} + } + if {$timeout ne {} && ($defb eq $but || $defb eq {})} { + set tmo "-timeout {$timeout}" + } else { + set tmo {} + } + if {$but eq {butHELP}} { + set neighbor [lindex $widlist end 1] + set widlist [lreplace $widlist end end] + lappend widlist [list $but $neighbor T 1 1 {-st w} \ + "-t \"$txt\" -com \"$com\"$tt $tmo -tip F1"] + set h h_Help + lappend widlist [list $h $but L 1 94 {-st we}] + set neighbor $h + } else { + lappend widlist [list $but $neighbor $pos 1 1 {-st we} \ + "-t \"$txt\" -com \"$com\"$tt $tmo"] + set neighbor $but + } + set pos L + } + lassign [my LowercaseWidgetName $Dlgpath.fra.$Defb1] Defb1 + lassign [my LowercaseWidgetName $Dlgpath.fra.$Defb2] Defb2 + return $bhlist + } + + ## ________________________ Query the terrible _________________________ ## + + method Query {icon ttl msg buttons defb inopts argdia {precom ""} args} { + # Makes a query (or a message) and gets the user's response. + # icon - icon name (info, warn, ques, err) + # ttl - title + # msg - message + # buttons - list of triples "button name, text, ID" + # defb - default button (OK, YES, NO, CANCEL, RETRY, ABORT) + # inopts - options for input dialog + # argdia - list of dialog's options + # precom - command(s) performed before showing the dialog + # args - additional options (message's font etc.) + # The *argdia* may contain additional options of the query, like these: + # -checkbox text (-ch text) - makes the checkbox's text visible + # -geometry +x+y (-g +x+y) - sets the geometry of dialog + # -color cval (-c cval) - sets the color of message + # If "-geometry" option is set (even equaling "") the Query procedure + # returns a list with chosen button's ID and a new geometry. + # Otherwise it returns only the chosen button's ID. + # See also: + # [aplsimple.github.io](https://aplsimple.github.io/en/tcl/pave/index.html) + + set wdia $Winpath.dia + append wdia [lindex [split [self] :] end] ;# be unique per apave object + set qdlg [set Dlgpath $wdia[incr Indexdlg]] + # remember the focus (to restore it after closing the dialog) + set focusback [focus] + set focusmatch {} + # options of dialog + lassign {} chmsg geometry optsLabel optsMisc optsFont optsFontM optsHead \ + root rotext head hsz binds postcom onclose ONCLOSE timeout tab2 \ + tags cc themecolors optsGrid addpopup minsize savetext + set wasgeo [set textmode [set stay [set waitvar 0]]] + set readonly [set hidefind [set scroll [set modal 1]]] + set curpos {1.0} + set CheckNomore 0 + foreach {opt val} {*}$argdia { + if {$opt in {-c -color -fg -bg -fgS -bgS -cc -hfg -hbg}} { + # take colors by their variables + if {[info exist $val]} {set val [set $val]} + } + switch -- $opt { + -H - -head { + set head [string map {$ \$ \" \'\' \{ ( \} )} $val] + } + -help { + set buttons "butHELP Help {$val} $buttons" + } + -ch - -checkbox {set chmsg "$val"} + -g - -geometry { + set geometry $val + if {[set wasgeo [expr {[string first "pointer" $val]<0}]]} { + lassign [::apave::splitGeometry $geometry] - - gx gy + } + } + -c - -color {append optsLabel " -foreground {$val}"} + -a { ;# additional grid options of message labels + append optsGrid " $val" } + -onclose { + set ONCLOSE [string map [list %w $qdlg] $val] + lappend args $opt $ONCLOSE + } + -centerme - -ontop - -themed - -resizable - -checkgeometry - -comOK - -transient { + lappend args $opt $val ;# options delegated to showModal method + } + -parent - -root { ;# obsolete, used for compatibility + lappend args -centerme $val + } + -t - -text {set textmode $val} + -tags { + upvar 2 $val _tags + set tags $_tags + } + -ro - -readonly {set readonly [set hidefind $val]} + -rotext {set hidefind 0; set rotext $val} + -w - -width {set charwidth $val} + -h - -height {set charheight $val} + -fg {append optsMisc " -foreground {$val}"} + -bg {append optsMisc " -background {$val}"} + -fgS {append optsMisc " -selectforeground {$val}"} + -bgS {append optsMisc " -selectbackground {$val}"} + -cc {append optsMisc " -insertbackground {$val}"} + -my - -myown {append optsMisc " -myown {$val}"} + -pos {set curpos "$val"} + -hfg {append optsHead " -foreground {$val}"} + -hbg {append optsHead " -background {$val}"} + -hsz {append hsz " -size $val"} + -minsize {set minsize "-minsize {$val}"} + -focus {set focusmatch "$val"} + -theme {append themecolors " {$val}"} + -post {set postcom $val} + -popup {set addpopup [string map [list %w $qdlg.fra.texM] "$val"]} + -timeout - -focusback - -scroll - -tab2 - -stay - -modal - -waitvar { + set [string range $opt 1 end] $val + } + -savetext {set savetext $val} + default { + append optsFont " $opt $val" + if {$opt ne "-family"} { + append optsFontM " $opt $val" + } + } + } + } + if {[set wprev [::apave::InfoFind $wdia $modal]] ne {}} { + catch { + wm withdraw $wprev + wm deiconify $wprev + puts "$wprev already exists: selected now" + } + return 0 + } + set optsFont [string trim $optsFont] + set optsHeadFont $optsFont + set fs [my basicFontSize] + set textfont "-family {[my basicTextFont]}" + if {$optsFont ne {}} { + if {[string first "-size " $optsFont]<0} { + append optsFont " -size $fs" + } + if {[string first "-size " $optsFontM]<0} { + append optsFontM " -size $fs" + } + if {[string first "-family " $optsFont]>=0} { + set optsFont "-font \{$optsFont" + } else { + set optsFont "-font \{$optsFont -family {[my basicDefFont]}" + } + append optsFont "\}" + } else { + set optsFont "-font {[font actual apaveFontDef] -size $fs}" + set optsFontM "-size $fs" + } + set msgonly [expr {$readonly || $hidefind || $chmsg ne {}}] + if {!$textmode || $msgonly} { + set textfont "-family {[my basicDefFont]}" + if {!$textmode} { + set msg [string map [list \\ \\\\ \{ \\\\\{ \} \\\\\}] $msg] + } + } + set optsFontM [string trim $optsFontM] + set optsFontM "-font \{$optsFontM $textfont\}" + # layout: add the icon + if {$icon ni {{} -}} { + set widlist [list [list labBimg - - 99 1 \ + {-st n -pady 7} "-image [::apave::iconImage $icon]"]] + set prevl labBimg + } else { + set widlist [list [list labimg - - 99 1]] + set prevl labimg ;# this trick would hide the prevw at all + } + set prevw labBimg + if {$head ne {}} { + # set the dialog's heading (-head option) + if {$optsHeadFont ne {} || $hsz ne {}} { + if {$hsz eq {}} {set hsz "-size [::apave::obj basicFontSize]"} + set optsHeadFont [string trim "$optsHeadFont $hsz"] + set optsHeadFont "-font \"$optsHeadFont\"" + } + set optsFont {} + set prevp L + set head [string map {\\n \n} $head] + foreach lh [split $head "\n"] { + set labh "labheading[incr il]" + lappend widlist [list $labh $prevw $prevp 1 99 {-st we} \ + "-t \"$lh\" $optsHeadFont $optsHead"] + set prevw [set prevh $labh] + set prevp T + } + } else { + # add the upper (before the message) blank frame + lappend widlist [list h_1 $prevw L 1 1 {-pady 3}] + set prevw [set prevh h_1] + set prevp T + } + # add the message lines + set il [set maxw 0] + if {$readonly && $rotext eq {}} { + # only for messaging (not for editing/viewing texts): + set msg [string map {\\\\n \\n \\n \n} $msg] + } + foreach m [split $msg \n] { + set m [string map {$ \$ \" \'\'} $m] + if {[set mw [string length $m]] > $maxw} { + set maxw $mw + } + incr il + if {!$textmode} { + lassign [my GetLinkLab $m] m link + lappend widlist [list Lab$il $prevw $prevp 1 7 \ + "-st w -rw 1 $optsGrid" "-t \"$m \" $optsLabel $optsFont $link"] + } + set prevw Lab$il + set prevp T + } + if {$inopts ne {}} { + # here are widgets for input (in fraM frame) + set io0 [lindex $inopts 0] + lset io0 1 $prevh + lset inopts 0 $io0 + foreach io $inopts { + lappend widlist $io + } + set prevw fraM + } elseif {$textmode} { + # here is text widget (in fraM frame) + ; proc vallimits {val lowlimit isset limits} { + set val [expr {max($val,$lowlimit)}] + if {$isset} { + upvar $limits lim + lassign $lim l1 l2 + set val [expr {min($val,$l1)}] ;# forced low + if {$l2 ne {}} {set val [expr {max($val,$l2)}]} ;# forced high + } + return $val + } + set il [vallimits $il 1 [info exists charheight] charheight] + incr maxw + set maxw [vallimits $maxw 20 [info exists charwidth] charwidth] + rename vallimits {} + lappend widlist [list fraM $prevh T 10 12 {-st nswe -pady 3 -rw 1}] + lappend widlist [list TexM - - 1 12 {pack -side left -expand 1 -fill both -in \ + $qdlg.fra.fraM} [list -h $il -w $maxw {*}$optsFontM {*}$optsMisc \ + -wrap word -textpop 0 -tabnext "$qdlg.fra.[lindex $buttons 0] *but0"]] + if {$scroll} { + lappend widlist {sbv texM L 1 1 {pack -in $qdlg.fra.fraM}} + } + set prevw fraM + } + # add the lower (after the message) blank frame + lappend widlist [list h_2 $prevw T 1 1 {-pady 0 -ipady 0 -csz 0}] + # underline the message + lappend widlist [list seh $prevl T 1 99 {-st ew}] + # add left frames and checkbox (before buttons) + lappend widlist [list h_3 seh T 1 1 {-pady 0 -ipady 0 -csz 0}] + if {$textmode} { + # binds to the special popup menu of the text widget + set wt "\[[self] TexM\]" + set binds "set pop $wt.popupMenu + bind $wt \{[self] themePopup $wt.popupMenu; tk_popup $wt.popupMenu %X %Y \}" + if {$msgonly} { + append binds " + menu \$pop + \$pop add command [my iconA copy] -accelerator Ctrl+C -label \"Copy\" \\ + -command \"event generate $wt <>\"" + if {$hidefind || $chmsg ne {}} { + append binds " + \$pop configure -tearoff 0 + \$pop add separator + \$pop add command [my iconA none] -accelerator Ctrl+A \\ + -label \"Select All\" -command \"$wt tag add sel 1.0 end\" + bind $wt \"$wt tag add sel 1.0 end; break\"" + } + } + } + set appendHL no + if {$chmsg eq {}} { + if {$textmode} { + set noIMG "[my iconA none]" + if {$hidefind} { + lappend widlist [list h__ h_3 L 1 4 {-cw 1}] + } else { + lappend widlist [list labfnd h_3 L 1 1 "-st e" "-t {$::apave::msgarray(find)}"] + lappend widlist [list Entfind labfnd L 1 1 \ + {-st ew -cw 1} "-tvar [namespace current]::Foundstr -w 10"] + lappend widlist [list labfnd2 Entfind L 1 1 "-cw 2" "-t {}"] + lappend widlist [list h__ labfnd2 L 1 1] + append binds " + bind \[[self] Entfind\] {[self] findInText} + bind \[[self] Entfind\] {[self] findInText} + bind \[[self] Entfind\] {\[[self] Entfind\] selection range 0 end} + bind $qdlg {[self] findInText 1} + bind $qdlg \"[self] InitFindInText 1; focus \[[self] Entfind\]; break\" + bind $qdlg \"[self] InitFindInText 1; focus \[[self] Entfind\]; break\"" + } + if {$readonly} { + if {!$hidefind} { + append binds " + \$pop add separator + \$pop add command [my iconA find] -accelerator Ctrl+F -label \\ + \"Find First\" -command \"[self] InitFindInText; focus \[[self] Entfind\]\" + \$pop add command $noIMG -accelerator F3 -label \"Find Next\" \\ + -command \"[self] findInText 1\" + $addpopup + \$pop add separator + \$pop add command [my iconA exit] -accelerator Esc -label \"Close\" \\ + -command \"\[[self] paveoptionValue Defb1\] invoke\" + " + } else { + set appendHL yes + } + } else { + # make bindings and popup menu for text widget + after idle "[self] set_highlight_matches \[[self] TexM\]" + append binds " + [my setTextBinds $wt] + menu \$pop + \$pop add command [my iconA cut] -accelerator Ctrl+X -label \"Cut\" \\ + -command \"event generate $wt <>\" + \$pop add command [my iconA copy] -accelerator Ctrl+C -label \"Copy\" \\ + -command \"event generate $wt <>\" + \$pop add command [my iconA paste] -accelerator Ctrl+V -label \"Paste\" \\ + -command \"event generate $wt <>\" + [[self] popupBlockCommands \$pop $wt] + [[self] popupHighlightCommands \$pop $wt] + [[self] popupFindCommands \$pop $wt] + $addpopup + \$pop add separator + \$pop add command [my iconA SaveFile] -accelerator Ctrl+W \\ + -label \"Save and Close\" -command \"[self] res $qdlg 1\" + " + } + set onclose "[namespace current]::exitEditor $qdlg" + oo::objdefine [self] export InitFindInText + } else { + lappend widlist [list h__ h_3 L 1 4 {-cw 1}] + } + } else { + lappend widlist [list chb h_3 L 1 1 \ + {-st w} "-t {$chmsg} -var [namespace current]::CheckNomore"] + lappend widlist [list h_ chb L 1 1] + lappend widlist [list sev h_ L 1 1 {-st nse -cw 1}] + lappend widlist [list h__ sev L 1 1] + set appendHL $textmode + } + if {$appendHL} { + after idle "[self] set_highlight_matches $wt" + append binds " + [[self] popupHighlightCommands \$pop $wt]" + } + # add the buttons + lassign [my AppendButtons widlist $buttons h__ L $defb $timeout $qdlg $modal $ONCLOSE] \ + bhelp bcomm + # make the dialog's window + set wtop [my makeWindow $qdlg.fra $ttl] + if {$bhelp ne {}} { + bind $qdlg $bcomm + } + # pave the dialog's window + if {$tab2 eq {}} { + set widlist [my paveWindow $qdlg.fra $widlist] + } else { + # pave with the notebook tabs (titl1 title2 [title3...] widlist2 [widlist3...]) + lassign $tab2 ttl1 ttl2 widlist2 ttl3 widlist3 ttl4 widlist4 ttl5 widlist5 + foreach nt {3 4 5} { + set ttl ttl$nt + set wdl widlist$nt + if {[set _ [set $ttl]] ne {}} { + set $ttl [list f$nt "-t {$_}"] + set $wdl [list $qdlg.fra.nbk.f$nt "[set $wdl]"] + } + } + set widlist0 [list [list nbk - - - - {pack -side top -expand 1 -fill both} [list \ + f1 "-t {$ttl1}" \ + f2 "-t {$ttl2}" \ + {*}$ttl3 \ + {*}$ttl4 \ + {*}$ttl5 \ + ]]] + + set widlist1 [list] + foreach it $widlist { + lassign $it w nei pos r c opt atr + set opt [string map {$qdlg.fra $qdlg.fra.nbk.f1} $opt] + lappend widlist1 [list $w $nei $pos $r $c $opt $atr] + } + set widlist [my paveWindow $qdlg.fra $widlist0 \ + $qdlg.fra.nbk.f1 $widlist1 \ + $qdlg.fra.nbk.f2 $widlist2 \ + {*}$widlist3 \ + {*}$widlist4 \ + {*}$widlist5 \ + ] + set tab2 nbk.f1. + } + if {$precom ne {}} { + {*}$precom ;# actions before showModal + } + if {$themecolors ne {}} { + # themed colors are set as sequentional '-theme' args + if {[llength $themecolors]==2} { + # when only 2 main fb/bg colors are set (esp. for TKE) + lassign [::apave::parseOptions $optsMisc -foreground black \ + -background white -selectforeground black \ + -selectbackground gray -insertbackground black] v0 v1 v2 v3 v4 + # the rest colors should be added, namely: + # tfg2 tbg2 tfgS tbgS tfgD tbgD tcur bclr help fI bI fM bM fW bW bHL2 + lappend themecolors $v0 $v1 $v2 $v3 $v3 $v1 $v4 $v4 $v3 $v2 $v3 $v0 $v1 black #ffff9e $v1 + } + catch { + my themeWindow $qdlg $themecolors no + } + } + # after creating widgets - show dialog texts if any + my SetGetTexts set $qdlg.fra $inopts $widlist + lassign [my LowercaseWidgetName $qdlg.fra.$tab2$defb] focusnow + if {$textmode} { + set wtxt [my TexM] + my displayTaggedText $wtxt msg $tags + if {$defb eq "ButTEXT"} { + if {$readonly} { + lassign [my LowercaseWidgetName $Defb1] focusnow + } else { + set focusnow $wtxt + catch "::tk::TextSetCursor $focusnow $curpos" + foreach k {w W} \ + {catch "bind $focusnow {[self] res $qdlg 1; break}"} + } + } + if {$readonly} { + my readonlyWidget ::$wtxt true false + } + if {$savetext ne {}} { + my askForSave $wtxt $savetext + } + } + if {$focusmatch ne {}} { + foreach w $widlist { + lassign $w widname + lassign [my LowercaseWidgetName $widname] wn rn + if {[string match $focusmatch $rn]} { + lassign [my LowercaseWidgetName $qdlg.fra.$wn] focusnow + break + } + } + } + catch "$binds" + set args [::apave::removeOptions $args -focus] + set ::apave::querydlg $qdlg + my showModal $qdlg -modal $modal -waitvar $waitvar -onclose $onclose \ + -focus $focusnow -geometry $geometry {*}$minsize {*}$args + if {![winfo exists $qdlg] || (!$modal && !$waitvar)} { + return 0 + } + set pdgeometry [wm geometry $qdlg] + # the dialog's result is defined by "pave res" + checkbox's value + set res [set result [my res $qdlg]] + set chv $CheckNomore + if { [string is integer $res] } { + if {$res && $chv} { incr result 10 } + } else { + set res [expr {$result ne {} ? 1 : 0}] + if {$res && $chv} { append result 10 } + } + if {$textmode && !$readonly} { + set focusnow [my TexM] + set textcont [$focusnow get 1.0 end] + if {$res && $postcom ne {}} { + {*}$postcom textcont [my TexM] ;# actions after showModal + } + set textcont " [$focusnow index insert] $textcont" + } else { + set textcont {} + } + if {$res && $inopts ne {}} { + my SetGetTexts get $qdlg.fra $inopts $widlist + set inopts " [my GetVarsValues $widlist]" + } else { + set inopts {} + } + if {$textmode && $rotext ne {}} { + set $rotext [string trimright [[my TexM] get 1.0 end]] + } + if {!$stay} { + destroy $qdlg + update + # pause a bit and restore the old focus + if {$focusback ne {} && [winfo exists $focusback]} { + set w ".[lindex [split $focusback .] 1]" + after 50 [list if "\[winfo exist $focusback\]" "focus -force $focusback" elseif "\[winfo exist $w\]" "focus $w"] + } else { + after 50 list focus . + } + } + if {$wasgeo} { + lassign [::apave::splitGeometry $pdgeometry] w h x y + catch { + # geometry option can contain pointer/root etc. + if {abs($x-$gx)<30} {set x $gx} + if {abs($y-$gy)<30} {set y $gy} + } + return [list $result ${w}x$h$x$y $textcont [string trim $inopts]] + } + return "$result$textcont$inopts" + } + +# ________________________ EOC APaveDialog _________________________ # + +} + +# _____________________________ EOF _____________________________________ # diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apaveimg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apaveimg.tcl new file mode 100644 index 00000000..28dbf427 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apaveimg.tcl @@ -0,0 +1,819 @@ +# images for apave.tcl (base64) +# images for apavedialog.tcl (base64) + +namespace eval ::apave { + +set _AP_IMG(OpenFile) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABCFBMVEUAAAAAAAAAAAB1dnYAAAAA +AACCgYIwMS8nLC8ANIYAAAAAAAClpqiMk6IlJSwoKi4nKy4AAAA+PTkAGkQAKWo+PTkARLH///8A +RrUAX/YXev/I4P+01v/X5f+nw/9fqf9Sov9InP80PE/z/P/R4P/D1/+YyP+Hvf98uf9xs/9wsP9c +p//2/P++3P+32f+t0/+n0P+fyv+qxP+Owv+Evf92tP9ssP9mrP9XpP8yVuUlTuWAjaj8///s+v/o ++v/f8//V6//P6P/A4f+92P+v1f++0v+vzf+lv/+hvP9rr/9bof9Glf8yiP8gfv8SdP/s7u4AWOMA +L+Gcn7KSl6twgqQzRFcpLkwgLUuhtckxAAAAF3RSTlOPLwDdE3/i3ttoSSf+9fHm397NzINcT+9u +zlMAAADHSURBVBjTRchVdgJBEEDRCpkhAeLWRRPGHXd3d4f974RuDgfu33vgu/ryPzL+X/hDLiC8 +ED0e18kTIOHw57VlGEakwUaEI7gfSpI07j4D/l+QWk/KZkcdNjIFytXapmkOmh+ANiXcTo8y9XdA +jyYSyWR/uyLcG+CUplLpdOagadpRO30CzqhlWblc3im4lWIYAOfUtvOO4xZLckXmY0Fdz5uU5FhZ +qSp8LKkcY6GoqlpV2Qhg+Gaz/hZBCIpwJwbBJ4Qe7kLCGaXWHlJCffnJAAAAAElFTkSuQmCC} + +set _AP_IMG(SaveFile) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABgFBMVEUAAABMYcGKibcvbt5Ad9s6 +atE/bdEjY9VTetJEe9tPdtBLctBOY8MubN01cNw9dNs9bdRZido1WscrVsdOftluitZYes2Rj7mA +hLeFhLRJXrxQZMMmOawkMqQKHqULGZ7////2+f/s8f/n7v+d0/1zs/L8/P/x9P/u8//p7/89jP3/ +//zl5e36///2///y9v9ovP9CoP82hPy82PhbmvhVl/hPlPjy9PWy0fTw8PNnnPGqyfCuze/b4OzW +2evp6Orp5ubU0tjOzte8wNbLy9PGw9Ly/P/y9/+n4f+Tzv97xf9nxP9xwP9htv9Gnf87nP8zmP8n +l/89kP8qj/+Muf1fo/1mr/v//fr9+/r59/qg1Pr09Pnz8vlHj/nz+ve11Pf4+PVplPNUgvLu9fFt +oPA+bfBemu8hU+/++u7++u318e1elO3q6uzQ0uipxOjHy+e1wedys+fU2OYdQObv7eXd3+WHluWR +neHFyuBopeDS0d3NztxIf9za19tFYNqWoNdOzhemAAAAIHRSTlMA9fr9/f38/v78/Pz1/f39/fv7 ++/r6+vr6+vf10MK7qzyP5dwAAADdSURBVBjTY2CQF+KR5mEEAylhOQYGBlaPOAVdPTc9XQWF5EJ2 +oIBAlKWCorqSpoa+Wk4lSIBVBSygrKypr6PKDBYwV1ADi2joqPICBdiAAkARdw1NJaAKsECCtrZ2 +eERkdIw9RMDT2DjewsLG2tomL4wPKMDtFWpiYmpqZhZrFGTIDxLwscq1t7Wzsy1INzJkAQpwGaQ4 +lOVnZmUUpWr5QwSsqorLS0odKpK0AkACHL7ZrnX1tdWOzolawZwgAe80VxcXJydH5xC/wBqggKyg +mKQ4ExBIiIpwyjBgAADMAyrlg6b6vgAAAABJRU5ErkJggg==} + +set _AP_IMG(actions) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAASFBMVEUAAAAMfJ4IdpcRepsrkrMY +gKEIdJYLeZsKeZojmL0miKhDoMAZgqQYgKELdZc/nr4ag6QLeZsMc5RKpsdPqcksn8QqnsMnnMGd +dJ7zAAAAE3RSTlMAHicN/jQiGhj+sv6xMxP9swEBHrzVfAAAAFxJREFUGNONzkkOgCAQRNEWbEAE +J6b731SwTEjY6FtW0j9NfyixnQIUVXJJlhPMsg17cD7AM5CZJE1gqNF90GhkyxnQWIPj3hhPxiga +xfoCbyMeHKEOeP3qr3+7AQD9BbD+/il7AAAAAElFTkSuQmCC} + +set _AP_IMG(add) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAVFBMVEUAAABtlr10nMJVkchSj8lU +ks1ynMJPiL5Tlc56pcl1n8RblsxZlMxWlMxPisBwmL9ems9omshfmc1plb0aVpIrXI4XUYolVIe2 +/7ZJ20kkkiR9p8t0hVcKAAAAGHRSTlMA+fn7+/n5+f37+/n5+f7++/v5+dHHxbzcNh2KAAAAWklE +QVQY023MVw6AIBRE0WcBkWJv4P736QQhonI/TzJDtMvyjnMuVyLqj6QTUKTQRrDoDc55GL9QebAI +gCK40B/ykzk9rQFNHtADoQhdCgKwDZNSWhvDGBMLXV3SEdoitxLBAAAAAElFTkSuQmCC} + +set _AP_IMG(attach) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAk1BMVEUAAAAfHx8aGhoWFha0tLQi +IiKGhoZwcHBhYWF6enpiYmJlZWVERESYmJhqamo2NjY3NzeIiIiFhYVfX1+enp6ZmZmNjY2jo6N8 +fHyurq6ioqKKioqOjo6np6efn5+FhYWSkpKPj49mZmZ3d3deXl5RUVFtbW1dXV1KSkpgYGA9PT07 +Ozs+Pj4oKCgtLS0dHR0ZGRkOlEvxAAAAMXRSTlMAEg4G6xrZxqSZh10yznA4KdKxmP7y8vHr6unk +1cvLyL+nmpCNgH96d2NOTEEuIwoIfsVuzgAAAG1JREFUGNNdx0cCgyAQBdA/EJOYAqjpvdj7/U+n +Kxh9uweLVKrB7Bbf/03xbwFzJHYhgYd2p32B9kTsPrxlNvtG/MT0q7UEzOx4qunNFR9+1C95EOzw +zl0Y3O1Hod+XmtxB7yCOLpGEUyV5YzMAduYHWsNoQ2oAAAAASUVORK5CYII=} + +set _AP_IMG(box) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA1VBMVEUAAADs9/ywyta64vXl5ubL +6fbx+//i8/n8/f3d3Nunp6fO4OefvsvS7vy2ztrT7fjK7fvk8PTe6u/j7PD0/v/6///z+vz4+/3r +6unR0NBbjqVekKei2/SMtshajKOn1Of6wpug2fOx4vig2vSDze6ox9Snx9SnxtSl2/Sd2fNXi6L5 +w53S7fjN6vew4PWr3fTA4Oyu2OrC3unD3ujs+Py/5feY1fGQ0vCJz++Cze6l0+ao0+XK2+DE19/U +2NWYvs7n08OKrr/u0r6Jrr58pbdllKn8xZ/8m7tQAAAAGnRSTlMAneL+P9eqpm47Dfz37+Th37m3 +oZyVkHRKKNrqJ8QAAACiSURBVBjTfc/HEoIwEIDhKEizdw0hEqIGkGrvXd//kQyjjnLQ/7T7zexh +QZKmKnJOyMltUeObIlWseZ+3WtretAlA6cLiYEEE3/MF28kAkMUQ33azkBCyMeIEoK5DRghCyHB7 +bxhQlAD+B4TSFNjR/mx9wXBijswUjH/C58S8W4a75lC9YghZdNyGzqEgifw7sXZyGXWCYqMDXnXr ++XJLfc4PwloZiTHG2zEAAAAASUVORK5CYII=} + +set _AP_IMG(cancel) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABj1BMVEUAAAB8FhaGDg6XCAibAgLK +Q0O5NTXEISHKKCi0Hh65ExO1CQmqLCySIyOUBQWWBgakAwOCEBCNBQWLAwNwFhbFCgrCQ0PNOzvI +LCzJJCTMHBzBCwu2AQHCKCi3GBjHExOwAgK1IiK5ICDMPT2oNTXGMDC9KSnLHh6oJCTFExOxOTm3 +LCywJSXANDTBJSW9Li6wLS2pIyOyIyOpHh6VLS2AFhaVBgaWAQGGEBCEEBCiAACgAAD/q6v1TU3s +PDz/09P+lpboKSnfISHgAAD/7Oz/2Nj/xcX/wMD/tLT/oKD/lJT+h4f4cnL7aWn+Z2f4Xl7sWlr0 +RETqQkLvOzvnLy/mAADWAADMAAD/39//3t7/ycn/yMj/u7v9sLD/j4//jo7zi4v/hYXyhIT9gYH/ +d3f/bm70YmL1YWH8XFz1V1f5TU3xTEznNzfzNjbqNjb/MDDxLi7kLi76JSX1Hh77GhrwGBjjFhbX +ExPxEBDnDg7UCwvrCgrcBgb6BQXjBQXbAQH4AADxAADsAADrAADqAABPcJk8AAAAPHRSTlMAWktq +Wvfz+/b09PPQw2teXFArKR/9+/v7+/v7+/n5+Pj39/b29vb29PTy8vLf2tfVz83MyVVRTUVAODfk +bBrAAAAA70lEQVQY0y3O02IDURSF4X3azIRtVNu2MZ7YTm0bsfXgOTPJf/etqwXQ07WAQK5jZdMs +OeBTI9lq9922CXYCZxavBmFrPJbTmw2YeWRPWL9290D7xFqtVB8g0ndxbqNHJt7tNruL6ARAcy+U +45L5ohzUfX834NDUm8vJcU7OO4AtZRwL3l5du1+Vemh1OJnlQ6EPXrnf/rOcFGPxeE5gZhWyyf+G +GCsX0kKEnsaLkfyrRsVS73BK+A37CQMsfVfq0fy4fm+RjzDBBwJ0n8VaZgj/UcyHGdqzCibdT2IQ +Gy8q+nn9CMC8NYotZVCtHUMTbJ4t/RVw/dEAAAAASUVORK5CYII=} + +set _AP_IMG(categories) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABv1BMVEUAAAABBw8kkA0UHToPdwkn +jB4NLA0CGhQBBS4ECSAABgCcqNJpjcofRcR6w3giiANCW9UoWM0HNoJJwTAupBMomxEbiwwTggwx +SHkIFnoBBWopkx4uRs0OIntBVIYAGUATHqEMJHgldiElgxghdBYgfhUOG0cDBXQIKQgWbA4NEy4A +ASsAFRoPEzAQbgkAGRwME7YEBxcEBxICCCkAFQAAAJUADwAGRAMAAAACYwEAAAwAAKkAAAQAAAAA +AAD////h9v/C4/+j2//3//xelefk/uYsZd0oWNsUL7y837S56K1b2jw/rzVHsRcynBUbgAqo4P+Y +0f+Uzv+Xyv+Iwf+jwP+Cs/9wqP+ey/6Fvf2pzPxiq/lDgPhhhPdkqPZ6nPZLifTx/PJhoPK10fA7 +efC+0+6Zv+7q/exemuwrYOm3x+eGrudZhuRNfOPe/uAiSdYoWNUuWtAiSssbO8PO/8K817m75LEm +PrEIF6Zdpp2b3JwiZpCS44uL1IKE1n2W53iK4HNvxG+K51dg30FiwEBctj9Vrz0qhj1DlDpOpjlF +nDVLyjA5qzBL0Ss/pRxNuBk8pRcokRMchxAYhAURdAEfuUdYAAAAP3RSTlMAF/60/fzAp5VqAv7+ +/v7+/f39/Pv6+vr07+/t6Oji4t/f08zHxbqzsq2ppKOenpKOiIN8enBkUj84MyodEAY8CaUkAAAA +2UlEQVQY02MgDCz1VJVVNM25GKzVrcAC0t293s3erGYMBuXaYAHW2jqfHp9J7AwyuVI2IAGWUvsO +Fv8p+qY5LhUcIAFxT+euyRP9dRQiXTwkGYECYp6JnUx+/PICThnFHiAlTGXpbX59TELxAUlF+bJA +JaJerq0TfNsLo5ziCtx5jRkYRLzyWnz7q2MdA6Pd3DMVbRmES1zrmxrdQh0cIxJSYgQ5GZT4qmoa +KsPs7Z0dgkOCwtUYGE002NjY5bizUpPTsnkkjEBO4WJgYOTUZWZm1jK0sMPwLADDJDBHTo2+xwAA +AABJRU5ErkJggg==} + +set _AP_IMG(change) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAUVBMVEUAAABWVlarq6uurq7//5JJ +bbaB13EAoABom1sAiADY277Ly8vh5MXt5L7Fxr3EwaXuwpyX05eRkpHstYB8gHyKgW6EompZi1hB +n0FDqSgAhwC869ORAAAABHRSTlMA/vq1WZF2dAAAAExJREFUGNNjYGBFAQxAARYkgF+ACU1AUIQR +RYCNXUKIGSIA5UuJc0NVQPicHHwwM6B8LiRbeCU5OXiQrRUQFuNCcYcoP4bDSBHA8D4Aj+EE1ihU +k4UAAAAASUVORK5CYII=} + +set _AP_IMG(clock) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAY1BMVEUAAACVpaYTFRaRoaFzgIBv +e3x4hoY4Pj80OjuSoqOIlpeFk5R1g4M0SV6PmqODlJhkdoFVaHZPYXCOnqGMnZ+Jk5yAj5hWandD +R1dhcntbX25OYGxEWGo+UWEwQ1eYPTmJPz/fH7K4AAAADXRSTlMA/AnZmJadMi/ZxMCYkMwRswAA +AJlJREFUGNNNj1cSwyAMRKVQjAsdG/fk/qcMMmQm70PDrliNBETHGWLPO6i8JNothM2ifD16SMet +C/eRBnJkuopyrpQryZLHQG1jqAbsQFjdDMJyYO7fcD2gf/7O82KMWTwCZjL2ZmSskfW9hxphZSjp +VVesAFWGfH7aowLg8dSNM060+hh968exHsPRupydxYk0oQRDZELR+wsezQt3Mdjc7gAAAABJRU5E +rkJggg==} + +set _AP_IMG(color) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAB8lBMVEUAAABdAABiAQCTPQtyHAaH +Jwp/GwCHIgBnAACsPQB0DwCrWRvcrHbWoWqURhGcTAePQhKZURm0dl2SRxmPOgqXPwCwc1+pURDZ +m1zYmViJPROlWkCrWCF8Kw+PPjGfRxCTQjl6IglxHQyGMCSHLx19IBZrEAevPwBxDAByDgdVAgBc +BAJnAACEHgBTAAClNwCZLAB/GgCHHwCWMACUKQB+GQD/zmf/023/0Gr/02f/yWT/zWKlXhgzl/3/ +7qzs1J7HqHj/2nT/1XH/z2H/xV3msF3+xlLsrE72xU3rvUzzvUj0sj/tAABAjvlYoe1Qit85ctL/ +76H/65v/8JqCkJny0Zb/6JT+8ZP/54/kvo7/6I3lx4uUkor824H/6H/itH3/4nv83Xr/2njStXfw +znH/1W/5zG7py23FlGnszmf8yGf/1WbPsGb4wGX6zmP/ymP3umHatF//0V7Fj138wVzAg1rKmFny +wVj1slj3xFb5ylT/wlTrs1P/xk3Omk2/rEyqyUv/0Erxrkjxw0aatkXerUX64UTjkkTbhj7Acj3m +tDzmnDr/4Tn0yTj1ozeZsTamljLhljHlbTHLii67gCz95yfgmCWiWCXFYySdTR5NjhvFORsPuhhz +kxSeUhPKJxK9HxDLIQ9Njg7nFwq/FwkGqAC+5njqAAAANnRSTlMASxX2xK6MZjIvCfz7+vb28fDv +7u7u7e3s6+rj3t3c29PRz8nJu6GRgnd2al9dXVVQTDIpEQYEuIYYAAAA9ElEQVQY02MAAyZGNVkB +flEWRgiXS0el072q0SOnbKYWiM+hWpzS0O/l4O/rl8ytB+TLRSe0zFk6NyPA1tbBW4mBSTkyq6R+ +1qIJ1e4xITW1wgyapW29TRW5BVYuRd59bm6CDArxU3u6XR3Nra07Fi6e5CHFIBY6baJroqO5Wd5s +H58lk1kYhOzSYsOjkpwsLNvnL5hho80gbReXXmcf4WRh5Vxe2aXIxMBqXyiuLhmYapHv4tzMB3Sq +4XR5Tk6JIHMzK2svGw2Qu9mNGfR5wszMLD1t2BigwIA32DK7dR6bKUzARCbTc4qILgMCsDMzsxpB +mABpID1WGTLOxwAAAABJRU5ErkJggg==} + +set _AP_IMG(config) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABLFBMVEUAAACfn7EmJippaXbFxdCU +lKSsrL2GhpaRkaZhYWtPT1d/f5UfHyIXFxkKCgmDg5oAAACNjZy/v8ycnKyoqLeursGBgZKxscSt +rcFjY253d4Jvb4BfX2iWlqt1dYVhYW5dXWpdXWmcnLGPj6eSkqRGRk+YmK+CgpZiYm05OT1ycoCG +hpmPj6dwcHxGRk8rKy5cXGtxcX4hISOEhJqIiKIODg5paXNzc38REREKCgsAAACHh58AAAAAAAAA +AAD////s7PX9/f/39/37+/7h4ezS0uHKytvHx9q8vM/19fzu7vfk5PHg4O3b2+nS0t66usy0tMbp +6fPm5vLj4+7Y2Ofb2+bOzuDNzdyrq8Hz8/nw8Pjc3OnS0uXW1uTCwtS9vdK2ts2kpLiTk6WOjp0z +s8IJAAAAP3RSTlMA/VQO/fXz6N7LwW5iXD8qKf768+/n5OLi3NnW0tHJwbiysbCuqqOhoJ6QjImF +hH55dHBXUE9EPTEdGxkXDgaBq3f5AAAA1ElEQVQY022OxYLCQBQEOwnu6+7u7vJmJu7BWV/g//8B +csiNOnXVqTGR2ypOF7dvEn3Z7y4U57hYT8KOwW3NJspc7p7EruQsJohzIqYGRaC6ltGdT9/oNMfJ +3QAOflndMVY2s5ZGlK4BuT9dc6QanrdMlVKHD5jv/f/ULRlQZlQikcfTea/lNWev7s+mufrh7gHH +oe97jSDVtkXblEpQsqFhml8NxpgIli7eAVnqDyJd8/QucwuIKZXl9HcrGoadqXLyfjmyCpX86h0S +Hq+PKnh7jecIPZcmth4yaWwAAAAASUVORK5CYII=} + +set _AP_IMG(copy) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABHVBMVEVslLoAAAB9mrhVhbRpnMtS +jMJlmstvl71TjsFah7RsjrFojrSNsc9imcwGL2ZhjLdEd6grYpljnc+RtNGDn7t9p85AbpojVYYj +SXweWJEyYI8gSHoMO20EKWIALGAAK2P////x+P/9/v/7/v/n9P/2+//s9v/i8v/Y7P/k8v/h8P/e +7//a7v/y/f/v+v/p+v/h+f/s9//Y8f/R5//g9f7o8PXg7PTM2uaOqMF2nL1xmb32///k9//t9f/o +9f/q9P/b8//d8f/U6v/j7/XC2+231u2wx9+JpL/u/v/4+//3+//z+v/u9//w9Pjc7PXZ6/XY6vW6 +3vPQ4+7I3u282O3Q3OfI1+S2zePJ1uKqv9OVrcRznsODor6AnrptkbWDwz/rAAAAIHRSTlP5APH5 +8fnx+/r59fPx8XD7+fn08/Lx5dXT0sq3fmgvAZwe8ngAAADbSURBVBjTRczXeoJAEIbhIRFbTO8d +BNylCkq39/TYu97/ZbigPv5H870HAxT1dheD/WJPBM4mzGHXAbTDM819CSyXAur9tZ0OJ3yzpUIK +Xp4f1nPXdTtTjjUq6i0kG/Zo7DjObPWrVXg1Aje7b3bHMnhRi8ARCU5g1f7SyiApSyDsjDbwrLIk +BxA2bzS9higrxSiBT9Ko3PRspGAzANKijIb+Xw3Xq1FIMj88knCt5f8r9XzuFE6YkijJWGn5XZzf +QuEjWzT13sLUqzn9Cu7PE4ljsovLOE3T8ccNcdImisp3ZecAAAAASUVORK5CYII=} + +set _AP_IMG(cut) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABTVBMVEUAAAAhIiIpIiLHyMiJioq6 +U1OXNzdUVFRYICBMJydAHh46KCg4ODgqJycAEhIwHx8lJCQiGBhzc3O8DAx4eHi8JyfYa2uzS0uc +XFyWlpbkPz+wHh7QaWndJSWMjIy5Y2POX1+1EBDOUFCUMTGampq6Hh50Xl6mJCS4ExNzdHR/f396 +ZmacJCSXl5djY2OmDw+nUFCJISGFhoZZWVl7KChkZGR7CQlzLi5MTExRDAxKSkpGHR1XKipSUlJD +Q0NERERNHx88JSVPNDQ8PDw2ISFUFxc+LS0nKytlZWVEREQvLy83GhoyMjIrHR0ZGRkqHx87OzsV +FRU9PT0jJibf39/y8vK6vb2ysrKOjo7+/v7o6enj4+PQ0NC0zMy4uLitrq71rKypqamYmJjCkJD0 +fn7/aGjaXl7XV1fwTk7OJye5IiLUHx/3FhbJDw/fBgYTfUsnAAAAVHRSTlMACT/+/vbRrZiSamJU +TTQtKBb+/v39+/v6+fn5+Pf29PPz8fDt7ezs6efm5uXk5OTi3djQy8fHw7+wrKSjmpmOjYiAe3lt +aWliYVtaPDYgHh0MAgI6ZgJlAAAAsklEQVQY02OAg0BbER4GJMDIHqorgCzgHBJth8z3U4mU5EUW +sA8JMWVgDPDxBLIF/YHYKDTcyoNdK1GPgYGbjY2XwZE5KoIlnDlGjofBTVw529BaIiw+IiwuyZiJ +gcGAlc8sJzM5lkVI08IrCGgCqxinap6ldoKaO9QVnOkZWa4uSupMcBdycfhyyaRKeyO5gUlewURW +nx8h4JRizqejiCTAnSalkesQjORRG1FhDkYoBwAAERp6BHb/NAAAAABJRU5ErkJggg==} + +set _AP_IMG(date) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABpFBMVEUAAAAEAgEAAAA3NjuEiY8V +EQ0QDQwBAACAnr2Nn6goP3I8RV5ofodKbJYsOFeeoqV7iZeAgY1xc3QhKD2OkZJQYnpTXGGLi4se +IjGlpKQgHyRFSEpwcH9wcnQvNTczO05NUloXFBMlKTQwMTEjJCUyMzsPCwZnZnloaHUPDQp4eHg8 +PDxubW5oZ3oNDAwxLS0oIhsJAwAVFRVkY3QcFhABAAAvLCpqanoAAABzc3IgGhMTEAgAAAD////9 +///5///1///v8fL0/v/4/f/m/P/7+/r4+fnz9fb59vX+zcz+q6r2+/+16P+Lzv/i9P30+fns7vD8 +4eHZ29743N3+2dj+wcH9mJj9kJHV+//j+v/K7P+b3f+n2f9wu/9os//9/f623/5Mn/5Sm/3u9vn8 +9vfw8/T78fE6he/27e7Y5+7m6Ovf6Oskduuz0ur+6Oltrun45ebF2uJJg9zR19l7qtj41dbR0tOx +wtC6yM7Cxs0za8j3xsf9w8O5ucH8urqwtrhrjranqrX/tLMmV7BGaqs4Zqqdnqj8np7/kZExUY3/ +ion+goMDAXmeAAAAPXRSTlMAaA0F/LyXLv7+/v79/Pv6+vr29PPz8/Lq5uTi4d/e2dfRy8u+urKu +q6ehoaCUjId9dl9VVUtIPzcwJRsbbtwyWwAAAPNJREFUGNMlztOSg0EUBOBko7Vt29bM/FbstW1v +bOelM5P03fnqVFerSDRbC9OzPV2rqkrWpvpbMmEH+Bsrnzvz2rjf8UTTPN26TaD9m7aJNtGKIIjq +CTRdi7cC/+ay8+C5rwrDwCOEN7I7pMgQadUY5v4pKNkFSXEj4BvHsNlsgSwlRHLKB7B0GvCG4VfE +Gq1Op8d7h2oW8ctS9eG5kaGYbPEBfA7i2t2OC0gFPd6CCwKuntRO/HDsb0KWuKMTc0yHYb3BBJgD +k/ns6itVN0O2Db0fn17eB/KNvZPqfQLL6ZdkbduIfoMMJdkb7datGDSVowRNAzUK/16ZQAAAAABJ +RU5ErkJggg==} + +set _AP_IMG(delete) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA0lBMVEUAAABznMJtlr1VkchSj8lV +k811n8RYlMxPiL5Tlc56pclems5blsxPisBvmL9omshplb0aVpIrXI4XUYolVIf/trbTp6ncl5fS +jY7UfoH/eHfjZmbfPDzjMzPaFBXKAwXhAgJ9p8vWwcXMucH/vr3ctLX/srLgra3ZoqPgoaHWoKHZ +nJ3QmpzTmZnPlJfZkI/Oi43af3/aZGThVlnpTU7VTU3lPT74PDv/NTX/NTTXMDDlKyzgIyLgHh/n +Hx3XGxvdEBHSDA3cAQH7AADpAADaAAAhGFHKAAAAFXRSTlMA+fn7+/n7+fn9+/r5/vz7+dHHxbww +jlTcAAAAjElEQVQY03XIRRLCMAAF0GANpcX5dcPd3f3+VyIzmabZ8JaPkIaipGJKjRBSgqTJIi1H +4U+Y2zkwXplAmcep51pTt7MGMjyGvuN5zmYkAoPr8XCeIInuM4ruRhL9xycMb77BowIE7+9iFux3 +QJZFHli+bMC62CLQAtNGHAKPohwqi7qm6TqlNMeoVfIDeXUUG6b6pggAAAAASUVORK5CYII=} + +set _AP_IMG(diagram) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABEVBMVEV17AAA6QAA2AAZvgAyzgBV +AABkOgBhLQCWyQB5vAAAywDKyQC/wwBlZACBhgBLAABmAABfwABiSgDKdABiAAAAvgC/WgBatgBe +YAAAtABKZABPhAAArwB9ewBPLgAApgCDhwBMIwB6pAAUmwB6egBimQAnogATkwBXgAAAzAAAtQAA +rgAAlwBHJAAdkgBlkACWlgAAtAAirQBOAAC9xwCadAC7xgCPlwCLaQB9SAB2NwBxQQBycQApqABr +MgApqgBqbABTcABNewAAzQBXRgCRnABPAwBImQCFggCquABqVQBdBQBTswBZNgCtsQBVIQCEqgBt +rQBNAAAAoQAAvAB/AAB8XwDo9QDo9AD8vQBxegAqxjXDAAAAVXRSTlP79+jd3Efm4t3Zc+Xh5eJA +6ufn5uTj4uHh3d3Z1dPR0M/NzMzMycbGxXNqZ1xXVVRSUUsZ6+vp5OPU0c7NzMvKysbDc2JhYWBY +V1ZWVU5NTUtKQiwnvQvjpAAAAMRJREFUGNMdxodSwkAARdEHbBq7iQVFBFFUVFQ69l7ovWYD//8h +wJs5c+eiZhg7hjHdlGpoLha7dEA9FCzr3LLe4vEvzggF0zw1zddY7J0zQN33933/cbl84XTRljLt +umkpP1w3K2UZZaUynpdR6ieRyCo1REPrpyB40IG3Wj1r3UHJti/oN5nM2fYYJce5or9UKuc4E7SA +PTqiPopCfAvxKcQ1VVGMRC7phqrIh0KHdEwV5MPhEzqjCmbR27ut6P3W/3wN0FIfNaFB3vsAAAAA +SUVORK5CYII=} + +set _AP_IMG(double) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABoVBMVEUAAAAADzlFdc0+VIM8ctQw +UocAEjsTJ4MAAAAiVaZ0ls0yXbgoVbcWW84/csswb8gsaMdAc85OeMphh8dagsdSfsdKecc6cMcz +bcdCdcYkU7AbPncsVZNMYYcDKGQ3VIUYOGYcQ58UMF4cQaIQKVE9RWwVLooABBsRIHwAEjUDCRQB +BQ8AAAAAAAUAAAD////q7/ra6v/7+/339/rz8/fQ2u1Ri+L///7///p2tPpsrPrs8PnP3PPS3e7w +6+zF0ejd3ebR1+bI0Oa0xeatweZxoOakuOOnuuJWjuBLhuBShd1ej9wzctxpkNdEf9ZeidXi7//d +7P+y0P+r0P+CwP/O3v1ap/z+/Ptyr/pmqvpmqPr//flBmvnb5fjC1vb8+PX79/Tx8fTv7/PX4PO6 +0fPt7vLH1/KixPL38vHo6vH28vDf5fDo6e/i5O7c4e4vhu6Yue2zyezL1ut+q+u7zOqvxOrX2+lk +m+n27Oh1o+jL0uVrm+VomORjlONymN5IgN58n91Uid1Nhd1zmdtwmNtEeNmQqNhMfdVXg9NXgdIi +Xbl0UPLxAAAAL3RSTlMAvfnv/e/Eugn8+/v7+vr6+vn5+fj39/f39/T08vLw7+vo4d7czb2gkoqE +c2s/EktV+k0AAADhSURBVBjTY8AO1PglxCXFREWEuVQhAsphkVFWVhGWliGyIC67Ik+atbUBCIQy +gwSkYnxMLcLN9YEgACigwc6d4luSYGJsBBQwBAoI5LNkNjhnJAFFzPUN5RkY+NI7TJtd7HJSQWoM +WRkYhBJ97VucK+yy4qMt9AOBAkzZ/vbede5u7i6lhXHBMkCBPH+ntlYvr0YP76YuTiWgQFm7m2OV +o61tskGQtI4uA4OgQ6dPvaenmYeZn5+CHtBZLLkOTkWmNjaxBXLq2hxAAV6z2ppqV9fK4nIViMc0 +2RghgE0LJA8AX/UxMpYArY0AAAAASUVORK5CYII=} + +set _AP_IMG(down) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABNVBMVEUAAAAAJpMAHY9PbrZNa7Q0 +VKkUPZ4LMZgAIJAIKZUEJJMAJpQAI5MAI5EAHI9AYK5XcrlIZLE+V6o5W6s4TqYgRaE7W6w6Wasm +SKQWO54OPJ0CJZILMJgHKZQDIZACMpkCMZcAIZAAJZIALpYAL5YAIpL////9+fSAlsYBPqqy2v6o +z/bx6+vz7ers6erg4unX2uXQ1eTO0uMyheLBx+Atfdyzvdcsd9YkcNFXer42XK7G6P/z+v5ntP7x +9/zu8vja6fc7mPXo7fReqPSZw/KKue48kewyierK1emUu+mKtejn5efBzedZnOetxebLz+G3xOGB +quC7wt1Kjd2ls9dwmtZ9n9QtcMsoa8kcZclqjcgxbcRfg8IlZcIhY8J1isFvhb86ar5nfbsaWbha +c7YQUrYHTLbD80fwAAAAJnRSTlMAByX8/OPZuK2snpKCSCz8+vn49/bv7Ozk4c/Av6SYln1kWB0Z +GKGhezkAAAC1SURBVBjTY8AKFKyYWViYreThApwBajZ2ah4ycAFZE2tbZ21DdrgAl4mWo7srTECF +j4kjSMvN2MtfmolPGSggJcYqYqRtbB5oIMQqzgYUkPSxd1L3NLUI1THQNxIFCvAKqLn4BptHRCfG +6CYpAQUY5UIcTC3CY1M1zcw4GUGmqrLp+0XGJWtqeEswQezhFVQPS9O01E1RhLmDJ0E9ylJHg5sB +4bJ4PT0NDiTfMfII83MzYvc5AJ0TGYGslDrgAAAAAElFTkSuQmCC} + +set _AP_IMG(download) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAt1BMVEUAAACvQD+uTUjRAAC4AADY +AAB/FAD/ABj5ARexSEWtOznrAADlAADcAADLAACdRTeNKhmFFwXpABq3DBStJCfnBxSqMjCpKCjN +CBGqNTOqNDKUFw6aLyW1CASjDgbRAACuCQKqBwCZCwCOFwivBQCgCQCLEACIIA6qCQD/AAq/LEDF +QlPBMka9JTnDOkzAHDLJEinQDCTqAAjlAAjDO06/ITa7HzO8Bh7RABbZABTFABPMAArbAAgFzSYp +AAAAKXRSTlMAz62QV44M/v3Qz5CQkI6MX1/+7Onj4eHaz8+1s6WalpWAVk5GOBkXEQMjTDAAAACK +SURBVBjTVcxXFoIwFEXRh4HQm7339lATil3nPy6jyErYf/d8XPgJG0IIkn0QbJC0M2NMU8NRUIOT +CA5Ig5MwrBaNou6Vc96LY1qWcXJJs/vreRtBaddOH0VevFtb+FtlOSI2l/J0aiGaE5BoH7GzB8XG +MtdQs5iDpAfEIDPDCPQqEN9zXc8n3/ABGQwMieucjCoAAAAASUVORK5CYII=} + +set _AP_IMG(err) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA2FBMVEUAAADVCgrMAQHOAgLSDg7N +AQHNAQHXHBvNAQHlHh7qQD7OAwPkHBzVDAzaERHeFhbnHx/gFxflPTrnHx/ZDg7dHx/pLi3mKSjs +KCjeJCLfGRnPBQXNAQHQBgbUCgrMAQHqIyPWDAzaEhLMAADoIyP////qIiLmHh7oICDtJiblHBzi +GRnfFRXgNzXmLi3jGxvgFxf//PzpUE3oNjXlNTPhMjDgLizoLCvcKynlKinmJybeIyLmIiLdGRjp +ZWDnVFHoSkfnRkPlOzniJiXhISHfICD/+/veMS8TAW9CAAAAJXRSTlMABPeS9IUx/tDN/vf19c6Q +fyz99vb19PT09PT00dDOzpCEgy0suVGGcwAAAMNJREFUGNM9z9W2wkAMQNEwU8W5grt0SkuFuuLy +/39EU1jsp+Q8JYDWc/m3Lrc68FZp96vO4XD8GS4r5S53nbObJO7pOGhiafdOplpgzHT+FwCdejVU +FaSy8NwQoBW7qrItYLmkFJpmqHxD7E/gz8v2m499dqlBw8se38A8AtNrorGSplnXSAKax7qlFSxL +t02RwmoU3Gwd2fbNJwIAz/n3XelucDyePuOeQZrnaWBw4/czfE2MDCMSCY87EqhEiEQFnF8H5R9k +XuGdZAAAAABJRU5ErkJggg==} + +set _AP_IMG(exit) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABgFBMVEUAAACIDAqREhCNDQq8QD66 +NjC8NjSGDw6pIR51BQSkAgF5AACAAACiAABXAACIAACiAACAAACcIh+fGReqKyepJiN/Cwp7CQix +HRixIyFlAwNlBAOUCAiRBQRYAABYAAByAABxAABXAAD////jxMTlvb3aJiH18/P76+nu4+Px4eHw +3t7px8jwxsfouLnara7OoKDhm53kkZTkcnPaMjK0Mi/cMSnELSnDExHTEw3ACwi+CQbHBQG3AADw +8/Tu6Orx6Of75uT24+Ty1tjt0NLt0NDnzszuzMvoxMTuvrjdtLX6t7TksLD/rq3lqaXjpKHGoKHp +n5/DmprdlJTokpH8o5DpiYn5hoTJenrYdHTfd3PwcXLYZ2b6YmDJX17aX1zmXlrDWVnJVFDBT1DM +T0/3S0zWS0rYWEnsVj3CPT3IPD36WTzlTjzAODnXQDXzTTO7LzDWOC/QLy7ePC3MIyLVHx7NGxve +HxLQGBGzEw6ZDw3FGQvBFAuwCwi2CQe9AAAxuWMPAAAAI3RSTlMA/vz8+vr28Omql3d0ZzstKQT+ +/Pv78vLn5rOxn56HgzQyCjdKzSUAAADRSURBVBjTY8AKBLgkWVg4ZPlhfF42f0c3Pe8oUR5BCD9J +Q1krICjQN9yUG6yeTUPZ1UdFJdI4OlZYESjA5aesbxChoppokJJqwgkUkAj11NeKU1XN1PYqNWMH +CrBmF9oHG3vomMSoF1gwgQTy8zTjEwwN1Yockq1BAhwZZnZpNtU1tlnqudZiQAGZ9HI9l7J6Wwsd +97pKKaAAv0iOmrOmkZG2k7kVIx/IITymxWphurohJVZV8mCXCnILmVdYWtrUMsopQT2jwMnOzCwu +zYfV5wCrjSX8foi6IgAAAABJRU5ErkJggg==} + +set _AP_IMG(file) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAGFBMVEUAAABEebIcVpN6oMOFqMp5 +nsLb//9JbZKjfm3MAAAABnRSTlMA4bzy7uoa1GpmAAAALElEQVQI12NgdgGCAgYGBtY0IEgHMpjT +QKAAJAIWgomkCQBFIAwaiCiBgQAASzEka0FckdEAAAAASUVORK5CYII=} + +set _AP_IMG(find) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA81BMVEUAAAAeCAe7vLynrLGbm5pG +RUS2HQ2FhIICAgKzu8Lyuj7zxk7wxEy6v8ScoKKanZ+PkZPYXgTUVAePkpbLUgZ/gICsbSqtra12 +dnapqKiQfXSGMQaMS0OhoJ83NzZYV1WOjYucm5meJxErKiknDANQTk3UEwIbGRcJCAcHBgVVAgAA +BQW43f+azv++4v+r2P+o1f+h0v+c0P/t9//S7P/W6//M5v/H5v/A4P/v9Pi2xNC3v8ahrbr/yDXf +8f/c8f/I6f+63//C3/ut1PugzfmbyvnQ5vfP5PTV4u230+2szOvS3+q5wcqyuL6st7nlzIr/xTVz +yX6eAAAALHRSTlMAMff1xIhXRw7+/Pv7+vj07ufm5OHe3tHMv7i3oJx+dG1nYF5YT0Y5KiMiF+3X +WOEAAACZSURBVBjTbcvVEsIwFEXRtFAo7u5uSSV1w93//2t4aArTofvtrjsHBBWt0XSl97u7qZth +nO+t7z+2XUnSUjM7BMLXjaooKrcrsC6EDjzUdchjmyKwR6IgiEi0J2Ry4TFCWIDZhQujh8ZByK1N +BpAY6yTLR+tZH3syqGbSpXbzFY8Ar9mUBfOckyBCovJOsu+X4rsM/NIYgr8+A3cSTlFKMqoAAAAA +SUVORK5CYII=} + +set _AP_IMG(folder) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAdVBMVEUAAAAAAAAAAAAAAAAAAAAA +KWoANIYAAAAAGkQAKGgARLEAAAAARrX///8AX/YXev8+gdKizv93sPJkpO1Rk+CNwPoAUtS01v/H +4P+Yyf9hqv9Tov9Hm/+Mwv+Evf92tP9xsv8AWuh+uv9ssP9mrP1Un/dDkvE30MDyAAAADHRSTlMA +j5h/GoNoE8yGT03XI/hkAAAAdUlEQVQY02XKRw7DMAxEUSpyOkXXFBW3FN//iIY8gLTwA2bzMbRz +4+h0ToFNxMcihXdk8o9fm/zjeiyza0HclCaTO3ErNVhre9HEnTygH4aPKOJKGhin6YvQws85h9DB +33uPUMESQkB4wiwyXzSpg1JpStPOClXADK+BLrtjAAAAAElFTkSuQmCC} + +set _AP_IMG(font) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABUFBMVEUAAAAAEAAAAwM1g0FOpFkO +ShQidC4PVR8HPBU/k0QCLQwAJA0ABgYAFgIacRwABAQACAkABQIABgAJWgkABwgABAAAFwAAKgA3 +i0Iyljojey5isGcdYicKThtMqFQQZyQFPxoRYRcubjETUh8sizMiZigYfSsbaSkAHAMhYi5Llk8Z +Uh8QUhxCjUYiei4MRhoUVRsDKQ8AHw4jeCUBFAgqeCoXZRsACgMABgcUaRoUXRcHKQgACQIAAAIA +Hw4JZAkCSwUASQEASwEAAQEAAAAAAAAAQwAAXwBWq182mEA21DURciIQax/L/86m566d26OK4JSI +3o1/4YR834Fwx3114nluxHNv4HJlxXFmym1o3mtlu2th2Glbs2ZWvmFPyFVMuVVKnFRIlFNApU1G +y0tCwkk+iUdA2UM5oUI7x0E2jkAqgDgnjzUpozMoui0NYyDqzuOLAAAASHRSTlMACJz+/fz7+ujn +5OG9rKiPjHRXVD4lEw7+/v79/f38/Pz8+/j39/b18/Dt7Orp5eDZ1s7Mxbu6saemnZuXhIBhXFRK +SkUoJh2IRm5oAAAAs0lEQVQY02MgCtirWKMKmPppMyLzxbV8mYWANKOwgxhYQNgjIJqXgcHdmEXO +QBQkwMeSFcwhzsDnn+QRxwsS4ExjDWVzYTALYVWK4QIa5iQdkRyVYcPgqOiZEM8FNMUqVkZZMsWQ +wTJMQiqVm5HBTTeRx1U/nV2EM0hDNRMooBcYqWOn5pXHoRnumevlLcCgzpzNbiTv461gwpYj65PP +wyDExMQvIsjEJCAqaG7Lb+FM2KcAQKYa1t5ZafQAAAAASUVORK5CYII=} + +set _AP_IMG(gulls) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAArlBMVEUAAAAIVpYEWJhMh7UPYZ4e +ZZ8mc6kaaqR0qcoXZJ8GU5UqcqgDUpMvdKkIVpZLh7RLhrQ4eqw2eKs0fa9yq9BUmMax1eqTwN3f +9/vO6/VZnsUziLs1gLJJk8DJ6POKvdlrstNtrtBsp8tXpMtQnsZTmcI9lMAgfLEOcqsHbagAaKXV +5vGq0OOoyN2AudaNuNRysNFbqs5dmsJBl8I+i7okhrk8hrYWfrQRe7IGX52hRA3WAAAAFHRSTlMA +d193XxNfX+fnb1hYGhp3d29vX8JEz4cAAACFSURBVBjTbc5HEoMwEERRGSMyOIGjRM7OGe5/MagZ +lVa8Xf9VkymeNQOWh5uaxREUJoXg8CS5PThjP+ZAUPI4/qTX+4v1CobsWbdt1VR1g0HN/mX+vkTl +txOB+2l0Dk4jFUMg6RB0X9Iw7CQM2lbaQLDDgxDaeN3YCwYlwF0v56PFyiUTBk57Dsm+8ILHAAAA +AElFTkSuQmCC} + +set _AP_IMG(heart) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABO1BMVEUAAAASAAMLAAIAAACpBBaY +AxZSAQ1LEhc1AwoAAADeRnCqBBbVQWLXSnGjAhSzGTO5Lku7VVmJAhKtJS2GABDAYmCGGC6fNleS +ARODHSeOCyBzDBlGAAk+BhB4EidtFiJcGSs5Eh0sDRVrAA5kJyZjAAwQAwZQBA4bCA1KBhJTAAsd +BwxOFR1DAAg7AAgAAADNHim1ChvJOkPiNDPZKjDWJy/LIy/SIy3jOSzNIijCFyS/ESDzsqHee3Pm +OjjiNDbIKDXbLDPZLy/QJC/WKi7cMS3CHCrrQSe5FCXFFiTBFCG4Dh67Dx2wBxjxrJzjkI3wn4ft +kHjbcGvfd2rTXGHPU1rdQFbXYFXSME/gP0XGMT3aNTu/MjrVLznCKTfsQTXqPjHbLDDCFy3IHyzP +IirKGye7FyeqDh+xBhj8jU14AAAAMHRSTlMABAcf+9RRNBYQ/v738/Hu6+fm5M7MzL65n5yNgX99 +dm5pZF9RTU1KRT87LyomJiW0r6OoAAAAx0lEQVQY03WMRZICQRQFfzc67j64e7VAG+7u7g73PwEF +BMEGcpf5Ih5cQmVWEUA6lN6juj+qtc7b7xO1vftWY1e/BMt1OlsoSnmJUhAAulCw0hqnxRxCKFdS +Avw0Qk06ukCcn2WXcy3A35DuRwMJ/4xhImxXT4Bts05jjzHTSXh068InioKIuFgknMnw7a8bAHDK +pRWXjKd4vvdg3wcwySlRwGVwb5ARsMfySOUFIfBs9JFwxPNeKmY/rXg/Qf6/amSH+ZzgGjtGcR/1 +QFeuyQAAAABJRU5ErkJggg==} + +set _AP_IMG(help) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA51BMVEUAAACBq+ZZdcWDrulefsyF +sOpqjs5khs1bectZdsZzmNBvk89cesdnjNFZeLZPW7BFTY654f+85P9vrf8EBgnH6f+y4v+k3P9R +nv9PnP+23v4dIykAAADC4/+z3v+LyP+JxP9lrP9Uo/9Lnv9Jk/Z1nuZokuR9o8gBAgLK7P+t3/+U +0/+a0P+R0P9/w/95u/9zs/9urPrB4Pl/qOd7pOevzOZul+WUveOZu9qQrsh0nMNymsGHpL9hi7ts +kLN5kqhng51bc4hGZYg3V4NMZX1JXW0uSGxIWmo/UGA8RUsoN0cyPUYUHCSD+jNhAAAAEXRSTlMA ++uf67P7r6+fn7Ovq5M3NvlVtYH4AAACWSURBVBjTY8AGeFmNTVRVzdTU+KECzHKCYuLaeorKPFAB +RiEje0cXWwMJJpgKIU8ZdTsNZyVOmICUtIi5uI+ICgdci6mFmJUIkoCgqJCrhoybEidcQFZOWtrJ +UIIJISDloCMvLIkQELXxsFZAFtD0lvFCViEkaumuriAMN4NVTEpLXFdfUZkFKsDHxc3Gxs7OwiKA +zesADFUP6SoCRyIAAAAASUVORK5CYII=} + +set _AP_IMG(home) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABdFBMVEUAAAAAQwAmbClymndGa2Eq +U0UUYRcbXSQAQAAAIxIALgFcmF5XjF5xo3KDlI9FfVE8dkNBi0FTcmlFZV1AYlg7gD5Kgk07XlE1 +W0c3dzpKaVgiUz85cz5AaFMzYEMcUD83eDsabh8ZWR4lcSgiWjcMSxcVZxYVTyYmaCoNZhELSRMJ +XBQaWSUHXwcAKh4BTRMAUQAAIBAAYwAAKBcAIA0AIxA7bkNY2DZV1TbG2clMzTIruhr////t8fHn +6uzn7+nm7ufh6ePR8svM48vK4cnD3cPA1cPC673F8LzK+rq407jH+rfB9q+U3YmB23N322JevlxT +0DhK0Cw8xiMXrQn1//Lu+ezk5+zi4erk6ujg5eXa4ePj8OLZ3eHa5d/R683N5cvC1cXK8MO/z8O4 +zb204Le24ba36ayz76ap3KSbsqGXrJ+o55ua05eX24+Fo42EpItzxHBVvlJn1k1JukVHyi4zsi1C +xSw/xCk7wSk0vyAishMwxe2EAAAANnRSTlMAXKD57NeWlEs8Ffv7+vn39fTx7ejo5+Ph4NHNycS9 +vLu2trOxraSimJiVjYyAWldPS0RBMyw8LadyAAAA1klEQVQY02OAAEZpVlMwA8Y3i41gNUHmR3v6 +hItzIvhRnuZBGXYinDB+pLe5hVVwjp2wMZgv4OhjbhFoVWHt68BiyMBgIGbvDeKXV1qH5NkK6TGI +2tt4WASVBldZV4fk2tiyMChKMjsVpyd5uLtnlqXxScgzMHDJOPnHZBXkZzuWpEpxgUxViPd3VuLg +ULUscpUFW6uc4OeswcCgYxlgKQcWUHP1c2FiYGBPDHBTAQuwefmCBdwKU9TBArpeoQ5MQPG4sGQt +sICRIC+3JgODNg8zvz4DAwCitShbhcdSawAAAABJRU5ErkJggg==} + +set _AP_IMG(info) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABFFBMVEUAAAAAOHT///8AK2wAOHIA +OXQDOnMANXAANW8qYZgANnAGP3i8zt8ALWj///////95pMgAQ4QAQH9ai70FRHkHQHcxa6MHUJNv +m8QERoVcjLoAQ4UJQ3ldjbpKfKwANnAANXAAQYEAOHNIfKwTSoMDOnMAM3B/o8Rskrbu7u5ViL9I +f7pxnMxjksf///8AY70AX7cAV6t+pdJDe7YAXbMASZT8/f75+/2+0ui3zeagvdwAXNqLr9eHrNUA +ctR8pNAAa8pnlMU6fL5Kgrk5ebk6dbIMYrIAO6YDU6MAUKAAPn6kwN4AdtyVtdYAb8+ErM16os0A +ZsJPhLoqbrI2cLFCd64AWa0bYKQmYp4FT5sBTZgARIoo62o2AAAAKXRSTlMA/AMR/ujdoJl9OSgh +HgwH/v39+/r5+Pb19fHf38/FxcSsq4pzQ0I/OOXMICoAAADRSURBVBjTTcjVmsIwEIbhSVvc1t09 +2zRJDXeHXdzh/u+DAXrAezDzPx/sJeLRaDyhgEf5ebo7Gdw8fntFCV31Mul0Jnv+figfy2zeKhSs +/F8tBChyO2SslEqVGLOuIxjeZoZhsGSS4bNfMfjtX1Sp7G7tHkAltq7rnHMdjU9VULVpo1Gvc16t +TharMxXA567bzSal0jHbrg8AXjYdU0pKhZCm+4whTDqOoKgsTBIGFOzOR+Xif7Evu0HYC5CWk8uJ +FgmA58t/qWkXD59wJBbzxhYmAR+NAMoU4wAAAABJRU5ErkJggg==} + +set _AP_IMG(light) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAbFBMVEUAAAAhGAW6lgu4dg3ovA7p +lRGDUwmFaggoLCxNOATznBKosLONnJ3qlhHpvQ53g4SVmp2tiwqqbQyLcAiLWQpmQQdpVAbxxA/z +nBLvkxbtrhSir7GGlJXxlxPvuhHukBfOwIqzoXXsqBbushNU/qmVAAAAF3RSTlMAB6Cf29pgYCsn ++/f33d2rqoOCZ2Y8PKsd+FcAAAB0SURBVBjTfY5XEoQwDEMD7NJ7sxNIQrn/HekxzDDoy362NGLv +smrHrizagwQRIA3M/Y8bgN/14+IBwDuBg5zrScxgG6A1F5MwwEUpEZQCj0I5gqBQ1oQ7aKlIKaVS +xb3pOA7DaiD1fdexT5DFUc4e8v1zWACXkghKrBVwXQAAAABJRU5ErkJggg==} + +set _AP_IMG(lock) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEUAAAAAAAC1tbWgnZmPj4+w +ramampoAAAAAAAAAAABubm4AAAAAAADBwcGzs7OdnZ2QkJDCwsK8vLyWlpaqqqrQ0NDQngTe03jp +0FD74ivbpgOysrLyyBPJmATjswOvr6+pqan1yhHpvATmtAHTnwHMmAHPpjC6kCvouwSfn5/Zy3bm +y1bmykjjvDirgSSsgiLrvQLtvgDVoADIGy1BAAAAFnRSTlMANHN5eXgyKyMaExEI29u3t5iYiYhx +Ds8o1QAAAHZJREFUGNOFytUOhDAURdFOmcHHkCJFirv+/8ehKYQX9sNJ7soFWyyELDilYELw/7gh +0URRLXQKn++yvzcFn1n2iSng1wr+BRgKVZNmbZeldbmD6XjIRXZuGTcQHhBEKIlnuPvozxAnoz3s +IEsCzz3mOF6QZDABHzkMIlizoh4AAAAASUVORK5CYII=} + +set _AP_IMG(mail) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABmFBMVEUAAABpaawBASIAAABISaCS +ksMeHUUAABUTElAAAAI8PJLAwNm0s9dpa6XDw968u92ioc9DRH9+gbw7O4hEQ3WBhMVDQnMnLHBt +bqsdHVFvb51lZqUcHFNWVnxKSn4PEUFHRnVBQX4HBicEAyApKVo0NGkiIGUAAAcAAAZISJkcG1AA +AAsbG0wAABxISJkREUgREFcAAAAAAAAXF1kAAAAFBST////m5f/4+P/19f/b4f/v7//r7P/o5//P +3P/6+v/w7f/e6P/j5f/g4f/U4P/V2//Y1f/PzP7n5/S+vO+mreGQkNKWm892fM99gcdzc75fYLFj +Yq9TVKhVVqRXWKP9/P/z9f/d7P/q5//U4//N3//b3f/W3f/e3P/F3P/d2v/R2f/c2P/B1//M1v/N +0v/z8/zm5/zHw/vl6PrBzPrZ3/fAvfW/yPTa3fLEzfLIyfDQ0u+zwO+do+m8wea9vuaqp+W1s+Gl +oeGdnOCcn92TmN2epNl8g9OWmdKIitCIh855e8p1eclrbsB2dr9qa7hxdK5aW6lMTaNiQefyAAAA +NnRSTlMAurEU/OzimEtKIP7+/v39/fv5+fj38vHw6+Xj4dfTzMnIx7uzq4eGeW5qamhoZVpDPDco +KATYbzhXAAAA6UlEQVQY002MY3ODURgFn6BJU9u23XtfxzZq24ht/e14kv12dmYPVOBNbB1DC+s9 +qHN6t7k72hBCZNdMe0PwdMQ5xjLcN1dTO72ym7sHjfZNHxJuVwNWo/3yG7N2YcIzWwkCwaTV7nQW +HGmGGj0CGA7big5bzpoxf6JT1ybA5Ou7N25JmWM/iEBGPsDyn/REqvNF/hFJk/opAWyYGJYmiBeS +ZrDieVACh2MUpVRgFiuv1NyZRQww/8s93auvKblc9WFwlU9WDLePlyruO5rvH18QHwDsDVy4Td1D +osVViQCqLI2I+Gv79QEl5BUw3UUfxdwAAAAASUVORK5CYII=} + +set _AP_IMG(map) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA+VBMVEUAAACVmp0twmowkM88PT42 +ksyprK5+g4VwdHZ9gIBfYmRUV1lgYmI/QUMnJygcHR2bwtua1bYzw3A9wGWyqU9vvU13v0Wiujiu +ui7UuBzqtRWdoKCZnJx1eXtzdnknrmAuzHEpgLk0mNs9rFfxxA84y2s1rFqSxz7Pnx/TxR3Vnhzj +nReTxeZ8uuNlr+BOpN18pcByob9Pnr1emL1UlLxBi7s3hrqQ3rMvgLN52qNno6NNhZph1ZNxuJN+ +qYpliIZJ0YOztIJTtH5zinuWrnA1sGo/y2hYr2eNjWVSyl4qrV5LqlHcqVCEyEV/pj7DlTmaozPY +mCjsmxV81BjjAAAAH3RSTlMAqf7+JP6fhmdkXE1FMQkJ/v7+/v7+/v7+/v6EhHh4dLCKIwAAAJ9J +REFUGNNlz9USgkAAhWGlU+zWdQWk7O7u1vd/GBcRZxj+y+/mzAn4k0SOpnKsQIQIvsAgCK6uh+hy +OhpEZutd0IaKbsZKKAwA8AUgmykvADmz9wJIag7ILmCGiuB8t/6g3dRTQn8tfnBJG4qiZI9D6Mw+ +3/HtfNwmIXTAekzwMgp3YQOhF/rdVrhaqzfIXqdpA1Pk0S+BzVM0J0r+8x8Pmha5OfIPMQAAAABJ +RU5ErkJggg==} + +set _AP_IMG(minus) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAACVBMVEUAAAAAtv8ASZL9WxShAAAA +AXRSTlMAQObYZgAAABhJREFUCNdjwA8YQ0MdGBhXrYIQEC5eAADG1gUBfxXKWgAAAABJRU5ErkJg +gg==} + +set _AP_IMG(misc) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABWVBMVEUAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAADUAACcLAABAAAyCQEAAAAAAAAAAACMGBH7ugXnX1+1hQfSPz/vhQJmGgkAWiTI +AACwMgAzjhysNgAAOxnWbwylAACoKCgSXB2AHgACJxEmWBC0IiIdDgTKbBF4KgBXAwvpZRwSAgAw +CAhUIAGdExMAAQFvAADmURwAAAABPgQCWwiUBQUAAAAbAQEAGwgVAAD/AAAAkiz/agD/f3//cHCD +8ktYyjFn0i9czy0Fmi1HsSLOCAX/1AD/vAD/qQD/nQCE/Ir4h4ep/3+E/m//aGj/ZWX/WVr3U1T9 +TE5+7Ul44UdxfkX/Q0NZ1D9j1DNNxCxN0SsSnisBiStKvSoAgilcxygUlydAsSH/ISHtGB6MQxJz +RBGJQA15iAncCQm3VgWfhQOxXwP/9QH/2wD/tQD/rwD/fgDvcgD/ZAD/YADxeV1sAAAAOXRSTlMA +Cg8CSwZCOSX85XhWIRwWCP78+vj49vX07Orl397c2tbVycfDvLq2sZKRkI6GgnZtaWhlY2JYSDGW +pUU2AAAAzElEQVQY02MgCpjImzEyMzAYyPKAKAYBXSFbEW0mAU1BN1EdfqCIipeNr1+Ahlp2Tq67 +hzo/A0N6qI2tf5KYsKurm0e+NDsDA6dlYqBLSphzZp67dSEXC0jA0iXExy48Ia2gyBokoC9hmezp +HeTgGJ9lLanFxsDAxCOXGhlsZx8Vm6HIzcLBwMDMZKHsGGfvZBWtasrGywhyGKOxs0OMlZM4Nxsf +K8SpjEZSEVYyeiy8ED5Il7mCkiELB1A9TISRg52dD8hHAFYmJoh6AIvWH1iK6siLAAAAAElFTkSu +QmCC} + +set _AP_IMG(more) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAYFBMVEUAAAAkoloWZDceh0sUWzEG +IBEEFQsotWMmq14gklAei0wZcz8QSSgQSigqvGgrwmwqvWkhl1MVYDUUWTEUWzIJKhcJKhcuzHEt +y3Ds8PHQ5tyS3rRk1pU+yXkqvGgrxGzNWWQVAAAAF3RSTlMAqV+pVRAG4dCag4JEOPfXyLhbUU4a +FZsLGPgAAABoSURBVBjTZchXDoAgFETREQV7L+9Z2f8uFRME4knmYy7+liL6FBJQLXk6YKJADRGG +0YR9d0uecKzrYfeGc9tOuzfwdbHdEwYKJKjY/1xBZZq/qzMFyDIl0n1slBJGzo2AL09rBMQM5waT +5w7kE2ZACwAAAABJRU5ErkJggg==} + +set _AP_IMG(next) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABF1BMVEUAAAAATswBZPIHUc4APrEA +WeEAaPgYU8QGZvQAWt0BVtYMNJoKM5oLTMESXeAYYNUDZe4CM58AUM4RNpsCOLEBXeQCSdACZvcA +SccAMqYAYfEFNZoAY/AAZPUAXvYAK6IAQ8QAUeQANK8ASMsAZfQAY/AAJZcAP7oAZPYAUNoAUMwA +P7MAZPee1v8Pev8Jdv8Dcf9irv4dgf4We/4lif0jg/sTdPUIbvUIafEjS6nX/v99vf9suP8Xgf+/ +5P43lP6v2f2W0/2izPoPdfobf/kUePkFbfk7jfhDkfev0va+2fRepvI6hO9/r+0GZu1Ii+uMsOUt +fOURauSIuuOsxOKau+EUY94ibNxIftsLX9tMgc1WfMkkX8TqyjjpAAAALXRSTlMACt3ANSQP+/f3 +9/f38+/s6OXf3dPR0dDJycfHpaKVlZKIhndeXE9OSjwoFgEqnNDkAAAAlUlEQVQY02PAAqQthdVQ +BLhDQyzltZEEeIKtvKJF1BECglGOunYB7AqMMAEWyRhvG13PCDFNmAijEm+gvaGDL58iQpFEpLOR +tZOPFEyAlTnMzcDW0EMcqkWZ399U38SUQ44NzNdiDnc31jMxY9LQgSgQCjIy0HOxkGWDGcBlrm9s +xqSCcBinuauFDCuS00X9BFQZcAMArTUTZZN63UEAAAAASUVORK5CYII=} + +set _AP_IMG(next2) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABa1BMVEUAAAAAVtwQR7IANacAP7MA +Q7wQWswOYd0GW9oBQrcGLpgAQ74ARbwAP7gASsoAOLQAR8MvcdkcXsk4aMIbZdcwXbUBWdopY8ML +U8UoVLYUUb0GScMHXd0CU9EcTbgaWsMXS7QBP7AHO6gTUb4EWNkdTLoKRbwDVtkGNaAERMEKQ7AB +VNcAQsYATtYARswALZcEVtgCScAAPq4AUdcFLZcES8UAPLgAJJcBScYEOJ8AJZ4AK6UATMkAQbgA +Lq0AU9gYhP8ehv8lhPoohfQObesIXNnO9v+66f+o5f+i1/+Hz/+Qyv9vwP9Yr/8kif8TgP8Lef8A +b/+Av/4skv7S/Pw/mPxirfkig/UQc/Wz4PN+vfIefvGo2PBOm/Afe/CczO0cd+yNwOsGZuqow+k+ +iOkVb+mcu+cjeeY3fuUtfeVUjuSDqeN2oeIsduJkleGHuOBHid+KsdgaaNcYYtRLgs0IUcZbfb48 +Y7YXRaOle61eAAAAQHRSTlMACNYlGBD9/NulpYJvZD0yHf39+ff39vbz7Ovq6Ofh4ODf29nV0c3K +ycC9ua6rn4iHh4J/fHh4c2loZlhWT0IvvMaRkQAAAM5JREFUGNNtzcV2wlAAhOGJIC1S6u7u7pYE +qBd3d3d/fO4NS5jNf863GQyN3ZiQ+9i7GcB0cpejHa937mWY/8jsKShUXd0nCkuBz+IhkfPWl3/2 +mYBuyvNdOmHAH9R+QotvRO6a7t/KGQNuK/8XXaMPGrPoKFwD3KbpP75N4FZlt6QuAJ5N2MLrwMOk +JKRPGRjYnDW4rMfLjCTEjhkojsqCd+EVWPWJkX0euDILklIHYE407hhIx0xOpRZkKqP6HRSyDQ3o +1Ct6udr2JUauD3eLH4cEmGJDAAAAAElFTkSuQmCC} + +set _AP_IMG(no) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABXFBMVEUAAAB5FRWAAACAAACZODht +AACEIyN3ERFbAABmAABaAABcAABPAABmAABcAAAAAAAAAAC3Zma3ZWWtZGSqAACKAACnOzuZQECZ +NTWBAACPLy9yAAB1DAx2AABSAABLAABmAABQAAAAAAD////17+//BgbVAADiz8/8AQHwAADfAADK +AAD/7e3/wMD/s7P/aWn/Wlr/KCj2AADoAAD/z8//ycnYuLj/kpLFkZH/f3/gY2O8Y2P/VVX/SUm8 +SEj/ODjfMzO+MTHPGhrPFhb5AADrAADjAADcAADaAADSAADOAACgAAD/8PD/3t7/19f11tb/09P1 +ycn/xMT/uLjis7PPr6/iqqr/qan/oqL/mpr1lpb+jIzii4v/h4fPf3/Cf3//eHi8d3fFcnLib2+4 +b2+8a2vrZma8WVn/V1e8VlbiT0//R0f0LCzFHR3/GRniEhLCAAC/AAC1AACqAABxml+0AAAAI3RS +TlMAf+XMv7Kfj45vbGBHHxEMA+/v7+/i37+/sq+on391Vk88BslldtwAAADrSURBVBjTLcrVdgJB +EEXRwh3i7l097oNLIMGJu7u78P9r0ch+O7cKuiK+ydFhty8CA467nU1FUfZyjn57D7e2d+OJfVW9 +nOvdj+MJ9UA7OT1LXWTnAaIjmnZ99JS6yiWf859jUQic32aSBF/ekKQFsRmAmYyuPyBBJHy5UpWm +wa0bxmsWCeHXqWU3XDBlFAofq2zANUGscS7w5otF1jyyxW60ZiH0bppp9l9CciM1/4MAE+b3z32Z +CqVHmZOdMYClL0qpUBFtiZM3QsAEfy1LrNbqrBeGoCs8/ifVuVbbuci6Z2XZ7/H4wzFgOsZMKiSD +ST7nAAAAAElFTkSuQmCC} + +set _AP_IMG(none) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA1BMVEUAAACnej3aAAAAAXRSTlMA +QObYZgAAAAtJREFUCNdjIBEAAAAwAAFletZ8AAAAAElFTkSuQmCC} + +set _AP_IMG(ok) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABC1BMVEUAAAATZTMQZy8wkzsqckkA +ggYQYDUOaSoFfhMdXEJzx148lEM6sysxZFs5fE8enCYclSUQpw4grBwqmDALbionrBoXhCswZlUd +b0ALkBgZbzkWkCMQogwUhCUQeCghZ0QObjAIeCEJcigAhgsRaTEDdR8wT2AQdCcAeBQtR2IiTVIA +cxgkRlsAiAYiTVEAehUdVUcAiQAKgRgLaim37Yqo53p60FqU6VhzzVBtylBgwkdHuDbR+qHJ/JjF +85bI85XM+ZHG+YHB93y48nzK/nqv7HnQ/3Kz8m6j6G2Y42yCzmzS/2m+/GV/1V92zVyk9Vt00kxF +mkpp3URi0ERu1EJaxD9Tuz9GtDpHvi8uw4B3AAAANHRSTlMABSb272NGGxYS/v79+vn29u/t6eTj +4uDf1dDPxcTAvLerqZuajoaCfndxal5ORzY1KSENjzM5JQAAAJlJREFUGNNjwA8MZQRR+KyiQUJI +XA7lCH8eXQYjDihfXzLEx5qVgUFAmh3EZdTmN/e21gCyhINlORkYmBTD3d3CVEFS6ma+cgxsYpaO +LlZKjCABJmZbLhFmTwcnKwVjBrBmFS8bP1N7Z0spdqjpbNwmdiauFhJMMOsZ5c1MPSxYDBAO0go0 +D2DRQ3Ihp3gonw6KF9R4NfF4GAAeIhE6JbM0+wAAAABJRU5ErkJggg==} + +set _AP_IMG(other) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABR1BMVEUAAAAAF60AD6k6adpPeuNE +cd4KK7kAH7JSfuZKduA/bds3ZOECYxEHIrEAGK4CGqz////++vjt9fyyzPWXs+Gv5qad6oMcbBd/ +wP/w9v35+vn/+vhikfFSg+yjvOKfueGbteGTseEyad+x6Kqk4puR4HyF3V6C2lxNjlJq1Ddo0DYr +ay8lgSIAWgC30f+Tz/91uv9utv9nsf9grf9Zqf9Spf9LoP9Enf9Amf/3+/76+v3//vjs7/SMsfCG +sPCKr++FqO9aie5LfelHeuduneZCduU9cuQ5buIqYtzV5NcrXNa+2b5unrKoxaymw6qi25uh7YeM +y4d+z2snRmt70lppwkxJg0szYEUiej1iyDcrdTNTuS4ujysrgSopcSoWcignbCgrhyciWSUaSx0e +gxocchUcdBADZQ8jfQ4NZgYAgwAAfQAAaQAYAZcEAAAAEHRSTlMArXT9/Pywrvz8/OW+lHRcTZ1K +9QAAAL1JREFUGNNjIAJwyzjKyjo5u7q5Kyl58AIFZPQlJAwMjYxNTM3MLdiAAhxycvLyCgoiIoqK +Ii4gARYbQQiQlrYWZgcJSArAAViAE1mAESjAKgRkeWtohHkKCOjBBKRiVVT8tf18fUACXCCBGNXs +LN2EuPBgoAAzUMAqMSdQWVRUWVQXJGAJNEMnLShATExMVRso4GVna+8QlRGqpq6uFpIEFODnY2Ji +is+M1tTS0oxMhvmQJz0lVVxcXCeCAQBu/x2TbneLLwAAAABJRU5ErkJggg==} + +set _AP_IMG(paste) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABelBMVEUAAADiGQDbWiDJYSD9Yxz2 +aRzQWx/VWB7ldCLvbh7flSjbkSbYjibUiiT4HADBBgDBZSbqch84lk1mopiDs49vr3fgnizMhSji +lifNhCZIXyicNQx1dlDLTA78SBTONxb5SBPWOhP0PA7YMg3GIwb/OAY6PAthT0D////5/P/w+P/V +0oHl8v/g8P/b8P/T7P+DmdPSuWr6/v/o9f/Z3N/WzoDXxmsegC78/v/2+//1+//x+//r9v/i9f/X +7f/K6//b7P7e8v2htNOhrdKls9CcqtCInM7//4nv02/UvGs10z0zyTj/rTjVqjT3tC7+kwjQ7P/Z +2eHZ4dqYrNaMpNbX4tSjs9SDndR6kdSZp86Wpc6htc2Sr82SocyOncyitca//7y+/7eg9rKWlaqE +gaeW8aPt5IPt3oHQum9jk2jXvWDWu2DXu16vjV5Pbl2qgVzQr1TVt1A5rEfQoDMbeDIilS4VlCm6 +aCndeSgeiSXXUyP9Wx63fxmfaxC4I53OAAAAKHRSTlMAA/z7+/r7+/r67e3t7Q0N+/r18e/v7+/t +7eXh4N21tLCwq6uSjFpTEHWEGwAAAOhJREFUGNMtyGVDwkAAgOGbLWl3526yjTWCSIeAYHcH3Z3/ +nbvB++19ACAMBuJ4fmFx7ogwGgkAwOHWzt7Gz/fX/9r+7vYBgk4k1i2HwuFQvReLtBGMRXOpWktR +lGq+EB3BcPnmur8RxWvR6a8M4JMn1XhfEcN46RWSpAVaKdtdchJDxg1JHp5SJvsjp0LWCy34aZeZ +m0AwnfZCaD0z0U5mCPIDpNAzLGu+GEUwK7ttgkAz5+zVAKbkW0qwo3c4njgVgr8ej+/55f3D/xec +QdAMxE9wkiQlAg0Em0uaFY1Wq9Pp9avL66AP0K8vN9dCxhMAAAAASUVORK5CYII=} + +set _AP_IMG(people) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA8FBMVEUAAAAnLhSCzCSKyyVFlr4/ +kLjzsQCByyM5ibDfkwAzhKotfqRkszFRmb3YkwDQjgDCdwBKj7IjbY/jpwCIVgA8eZubcwCfaQB9 +YQJrSAB+yCV2wihPnsmJ0h12wihxvitpty8oeZ6N1B5wvStWpM5XpM+L0h1VoceO0ylgp87cmwDU +lgDcqAB/viXZpwBZpC97uSRUmy2XYQCVXQCgdwCedgBtqRdimBVjkhg9bIY/cItXgRV0ZyFaNwDx +qgDvpQDrnwBHmMBCkro7jLN8xiiI0CL6uQDomQDkkwDgjQBZqNM2h60wgaZuujB1wCyS2RtyyuLb +AAAAPnRSTlMABv6t8vLy693RzMnFr62pp4iAcmVcW1QoJ/vl19fV1NHJx8XAv7ivr6mppY6NjYaC +emlpZWViVkE9PDgjI1lsXjoAAACmSURBVBjTbchFDsJQAEXR91vcrYa7uzvUW3T/u+En0IQGzuAO +Ln5tOlt87Ng1bf3ScEbzWaXl8pwzVoUlkIy2okmQYZ9gzLbZATyyLHvAGwYPv67rDLyKongh+Xwi +/AzDZBFQVTWwX6TTc7GoaVoOJHQNkd6R6pLao0SA8C2M+ImKIXIvA0hVUoifqRgmkRHehKBpBgV8 +yVjWFK5h2zPXOCQSEv57Ae8YE5yIr6xfAAAAAElFTkSuQmCC} + +set _AP_IMG(pin) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAVFBMVEUAAAAhCwrnTDzAOSuBhYic +pqiwNCdSW1t8KCBeHBXTRTaWMSdNGRQ8EQ20eXSbpKfYRzjAPC7RRDapMiZ8JRx8JRtPV1iKLSNs +IBjnSzvAOSvSQjPGmWtPAAAAGXRSTlMACvn3df3EbE9Iw3AoJP3bycPBvHBwaGZfNPkidgAAAFVJ +REFUGNN9zzcSgDAMRNEVwQTb5CRz/3tS2AOzLvjdW1XCl4BzfbacyktbqM7CvoMRdkiLW6bo8vLx +bjW6A1I2M6ohc91swZCBfWUD/v1pPEAJ/nsA4rgE4S9X0yQAAAAASUVORK5CYII=} + +set _AP_IMG(plus) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAACVBMVEUAAABJ20kkkiTzPQnuAAAA +AXRSTlMAQObYZgAAACNJREFUCNdjQAesAUCCbQKUYAyb6sDAuGoVhABz4bIQxWgAAFHnCIWAE6Tk +AAAAAElFTkSuQmCC} + +set _AP_IMG(previous) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABFFBMVEUAAAAAKpcAR78AMpgEYucB +JZEAOq8AIpEANKQHUcYeQaAVOpwAZfIKP68NPKkMRrUFOqgbWsgPMpgDP7MDY+0AXOIBT8sPNZoB +O6sBavcFOaICLpYORrYALZUCVNUAU9YAQrgAM6wAJpIAII4ARscAScMAWeIAQrcAWuAAQ8AAUdEA +MJgALpcdhP8Sff8FdP+g2P9quP8IcPpgqPIPUsPY//+Cw/8Mev/A5P2W1P03lP0pjv0hgf2w2/sY +ffsUePgOdPY5jPUkhfUGbPUDa/W71vGtzeygxewTbuwcd+uLv+mdwOcSauNJhuKovt8teNwjddwk +btuIpNVPiNV7ms4UXs0nYsVAbbpRb7hDZLI3X7IkTqj+FXbOAAAALXRSTlMARw0I+87NkDf+/Pj3 +9/f29O/r6OTi2tnY1szMxsPCnpuMjIJ9WFdBLSkeEgGygVO1AAAAlUlEQVQY02PAAxjFo6WQuNrs +XH7efEjSrBGupl68MC6zEneQhYFlsDCUz8Ea6WZgaBzGpg6RVhYKsTW08udXZILIy0a5m+k6mLBx +wAyQDjfW1XcxkdGEm8guEGBtbuMrqMIEFdFhlAh10tNzDJTTgCliUuD01NPX9RBFOExVzMdO34gF +yela8iz2RjwonlMTcZbE4mcA0xgSk1dITiEAAAAASUVORK5CYII=} + +set _AP_IMG(previous2) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABcVBMVEUAAAAAQbwQeP8HPKsJN6ID +XeMBUNYBSscAQr0ALJ0AKZkAL58AR8cAXeYAR8IATMseefZBfdoyWq8yeN8Cbv8MVMYYZt0pUKkD +bP4KSbkCP68hQ6IFcP8PR7MGcf8RVcgYUb0WOZwXRKAVUcMIPKoHb/4PO54DZ/QMUscWS8EHQ8AC +YOgDW98AVdgCQb8BVtoAOrwAS84CNqYAUdEAO7wAU9kFNZoCYO4AUdgDOq0AJp8AaPoAJZoAPK8A +av8AN6kAZvUAN6cARMEjhv8Xg/8LZugqjP+Ewvscee4ygOkYbePW+v+95/+r5/+n2f+L0/91xP9g +t/8fhf8Pff8Abf+Wzf5Cm/4lhP4igP4tkPxksPsdf/fP9PYlhfYQdvUlgvQigPEyf++w2+4Pb+6m +xOwFZuwtfOqSw+kTbemm0OiRtOdQmeZLjuMJYuOXw+J7ouIgbuI7gOBtmN+Itt6Sut1djNtNgthT +jdcQXtNSdb4WR6ceEr0tAAAAQ3RSTlMAJf3hv4SAdGlHNSoZEAcF/Pv7+Pf38fHt7ebm5OHf3drZ +2NXV0dDNycnCwMC+ta6joaCYk4x7dnJvaGRcWTExJB8JDRUK+AAAAM5JREFUGNNtzcVywmAAReET +KFKgUHd3d/c2CVZ3d8HdeXryZ8lwNt/M3Vxqt1Ve15VGBnS3S9k6oWPqt0m42/waEINzOnzSolnf +8X1WWIbj+cSppx1sPaGL6OgRLKbPn5Ob2Ifilz6jHddq7u7eb4bxzNVP9wFY8x5ZXQOGIzd/fRJY +Uu5b1QTYjF7FNyjhXAoqj18b4qTrU/mfdOBa8F4/NO4Ae21viroCDTMvsqETLWvx6X0ObZmQ5VZE +Fv/HrPBwzG1Azxwz6e7391JdBR0hIVBYlkPFAAAAAElFTkSuQmCC} + +set _AP_IMG(print) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAApVBMVEUAAAArfJZcr8YYZH1mscYy +jalits5VrcYVZH1ZsswXZXwaZXwQZH0rocM4hJs2o8IRbIsKZoMkeZRHkKdKkacVdJQUc5NWZGqu +zdYlgLPW2NpfmsJGR0kbe7RgnbH////z9PWky+W30uTH3OPd3uCVweDA2N+gy9ilxtFwqc6au8db +nse+v8I5h7Frnq6Em6RJSk2pzueYw+Hn7eCpy9KnxYr+l1vkfTcIAAAAF3RSTlMACOXO993Hx8a+ +vLCgfWFEPAMB++tcXPp7OIwAAACGSURBVBjThcpHDoMwFEVRcOgd0kwqvbcU2P/SMB+EPEDizN7V +Y7aZiOOQSQU5SdNEpoIQ6nooUEHECGFxndaFfxH82YLpGMfaBfXJcEhg8Tv34/jrf/IBs3MonxO3 +7P9LCO4g+M2PzItuIPIyCEXVPUBXFRCa9rpomynYmqpIB0JSVM1m9o2alQ2dROhIVwAAAABJRU5E +rkJggg==} + +set _AP_IMG(ques) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAB2lBMVEUAAAAAGok5Z8QQOK4PNa4o +Wr0PL6QdTLEEEo4KIpMLMZsIMpwAAnsAIY4AAHUADH8AD4IAI44AAHYADIELJ6IKKKImUrcqWLcG +GJIQLqEPK5sHG5IDEIsUQKUJG5EEEIsNMJ0IIJMLKpkOOaAACoIBCoEAGIcAJY8OS8EBQbEAPazo +7vV6p+kAWOEAU9QNUMEARLUBPaq43f+01/////qZwfnt8fdon/eWvfaBrfI3eO3S2utrm+uLr+SU +sOJEfeGEpt+CpN9Zh9oYZdldiNU8ctUiYdIwaNEZWs4mYckXVMkARscCRsQCRsEAQb4MOLIAOaWm +y/+byP+As/+Ovf2Ftf1EkvwtgvtupvgxhPj2+Pf09faRvPQ2g/Pa5PLj5vDc4/DQ3+9+qe91qe9g +l+5Qiu3C0exnmexGgeyzy+vBz+kmdegIX+i5yueku+Y6fea7yuVllOVWieMjZeMLYOIzdeF4n99v +md9PhN+Oq95djd6Mqd1Ogd01c9xkjtoAV9lkkNgpZdgvbNdOf9ZWhdVDd9I4adAdUc8AT88AR89O +fc4pZs4aWMsMU8sAT8tKeMosXcQNTsQMTr8ISr4gTb0BRrsYUboARLkJSrgISbcCQrUAO7QAM64A +OKeQu73QAAAAKHRSTlMACfr6+vT059OwrqZrQTEqIh4TD/b18e/l3tbOzcvJyMTDvLZjWllKhA3n +ugAAAQhJREFUGNMdj9N2xAAUAO/axW5tN8mGa9uubdu2betfm5N5m3kbYOE11hby+QVVDRrgyJVf +9za3trWYz2uyOS/HdUbvvGt/wjxZzBaeAtdZtgYW7fbA7pitWgOqB30TPt0T8JnmgkHbRR0oRvRG +q3dnaXPcdBY+WikFSXunxepYdp9o+8OhWEQMoo7Z0WHHtmvQ4InEvikBiLoIYs290a313D7R2LMQ +JH3EAXnl00ZTbzTKUHkgX1glyfiNM/VBoxiDSEH1OHN5H18fOv1BscxXWgk82Z4/kZgyOH+xDIqU +qQFySo79yejh+x/ziRRlAbBF9hq6S75QSLqSdW6/vkIsEOZLlWpW/gEqpz0I+0yjQQAAAABJRU5E +rkJggg==} + +set _AP_IMG(redo) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABBVBMVEUAAAA8MjIAAACTgloyJiZA +MzMAAAByW0lOMzNSPzZZPzJROTFEMzMtJiYmHx8aFxc6MzOhjYWWd16FaVNxVEJPMzNjQi1LMjKC +UiRSQDhfUT9QPzZPQTdJMzM+KytAMzMYFRUAAAA6MzP/6ML/wVP/vkj/oRH/68f/3aT/2p3/1ov/ +z32rmWb/9ub/5brq0q7/4qz/4Kn02KfItaP/15fKrY//3Yzq4Yb/0oXf0YPVzH/03Xnq2XnIv3n/ +y3f/5HT/yHK+snL/3HD/xm2ypWzInmv/3GfKsmalmWb/22T/yFLfokz/w0T/uET/tD2neTb/ujT/ +rzH/qCG0cR+ZXx2+dRj0lgqypblZAAAAI3RSTlMAPwPyZy8I1L+yn49fX0wjH+/v79/f39LPyLKy +op+VTyYTD5rgu8kAAACkSURBVBjTVY9VEoMADERxK5S6Oy51d3fX+x+lSBnK/r3NbjIBHGUjKOAR +wQXpf85HK+UmVXKQDrc5TpKq+K9GrVuKIsv1WiMEmuw7LmcTTeupaqefMhh8Pu6Xs8Dz/GKeKRpG +TBRP04EuCEMYwczAW9ysSCZ+6OJ+yNrw2cMMBhDjNGufSNx25gQ14rZeo5zBrgJXuOD5AdySkNfQ +EResSpL18Bdr/RFcTtz9GAAAAABJRU5ErkJggg==} + +set _AP_IMG(replace) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA5FBMVEUAAAAeCAenrLGbm5qFhIIA +AwOzu8Lyuj7zxk7wxEy6v8S7vLycoKK6u7yanZ+PkZPYXgTUVAePkpbLUgZ/gICsbSqtra12dnap +qKiQfXSGMQaMS0NDQkNJSEY3NzaOjYucm5meJxErKiknDAO/HQ6tHQ1QTk3UEwIbGRcJCAcHBgVV +AgAGBQXbbW22SUnT7P+43f7t9//K5/+84f+q2P+c0P+azv/Q5fahrbr/yDXc8f+n1v+f0v/C3/ug +zfmbyvnw9fju8/fV4u230+2szOvS3+q4xM+1v8iyuL6st7nlzIr/xTXFb04cAAAALXRSTlMAMfXE +RxP+/Pv7+vn49fTu5+bk4d7e0cy/uLegjIR+bWdgXlhXV09GOSojIgwRQVYfAAAAkElEQVQY02PA +BlgkeLnFFHThfHkuV0cHJ109XZg8m62VoSGQDxNgdjE20gfxhXQgAkz2JgYgvqkFI1TAzgzEN7Ox +0IBqcTbRBcpbG/CzQgTUPIB8A2MjNxmYtbK65vr65u6ekuowESVxPh4ROWkvdhW427Q0WRm0BSw5 +VFF8wChoyamIKiLsLcqAKiKljOl1AP+wEjir8dMSAAAAAElFTkSuQmCC} + +set _AP_IMG(restricted) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABHVBMVEUAAABGAgLsIiLsCwtrBwdQ +ERHCFRW8DAwgBQWuIyN2FhbmMTHnKirkKSnlFBTlFBTxPDzpHh7iFhblDAz7enrHHBy6FhbUJibz +QkL8mproFBT4bW2qEhLVGhrwCwvlDAywFRXpDAz6mpqpBwfmQkLSDAwBAAABAACtXl7////7+/v5 ++fn9/f3hhITvR0frOzvvNTX97e364uL83Nzo0NDfiIjzWlryWFjvUVHvLy/29fX+9PT18/P+8fH2 +6+v85eXw2Nj61dX4zs7qzMz1yMjtxMTnw8Pnurr6tbXmsbHssLD1q6vuoKDin5/yk5PpkJDii4vo +iorif3/ieHjkdHT6c3P6bW3ia2vyamr5aWn3Xl7dWFjxUVHoNjbvDg4fyqZWAAAAKXRSTlMAA/6V +WU9IMi8kDf7+/v388e/i4NrY1dSxr6yjo6GhnJOHYllFPRAOB5xR5CoAAAC9SURBVBjTRY3VssJA +DEC3ONf94m5poS3u7u4u//8ZZHdhOC+Zc2aSEI7ZYDCTB76fzf4g//tvGrGu591Uqr9SHAIL9l1H +BEQcqx7qgUwzCpRq9vhqxGCZck9kloWtE8NHjXkyu5Cg/UXIkyIxP8Vwlt4xnOnFukwdpDdc+awA +NJS0yO58Y7CNoJXnDhM3huDLQDPjHtcYCaK9xPjjsuwlFMGVH8YBij1Vi8aK7vc5l1P/dAK5l7BJ +rzeFmF8Be54fo2Mun7YAAAAASUVORK5CYII=} + +set _AP_IMG(retry) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABR1BMVEUAAAAAKZMGNZoZR6IEM5kA +JpECKJIAJ5IwcMQIOJ4nUagZRqYJOZ0QPZ4DMpgHOZwFMZcALJUAJZIBJpAAJY8AJI8AIY4AK5UA +KJI6eswxbsJJfMEfX7wuV6wWSaggTKUoZbsJNZoxXK4sVqsQQKIFMJUdTKkZSKYPPZ0HNpsMOJkE +MZcFOJoALZQHNpoAL5cGKpMAMZcAMJcBJo8AMpkAIY4AM5kAHo0AJI8AJo9Krv9ftvs0kO2J2/9U +t/9Rsv9Epv9gu/6C1f1Kpf16xPeHyvar2/Eyi+hqqNpxpdhIh9REhM9Wj8wZS6eJ4P+P3f+G1/9Z +uP9Lsf9Yr/9Orv9Hqv9Jqf8/of9csv5atP1Zsvp8x/hcsvh1wPV2xvQ4lvJlsu85l+9Upu6Kx+lf +quk1juhToOeEwOZjn9UqccslacQiY8EoY7t5g7WDAAAAOnRSTlMAB9LNxHVzDf3v1tTMuravp4+A +a1Y+FwwD/vz59/b18/Lt6+jo4dnXx7y5rqKclIh7cWdgXFtORC8S2ic9xwAAANJJREFUGNNFjsWy +wlAQROfGsIfbc3fcIQnu7u6u/7/mUqQqZzWnFz0NAtYPxgQit0Bl8gq9RDDDP0m+pKupgsKDsCPb +aTPiuF4nWh8Ub3BAH6ONKc8nu212flDj4HNSuSNUsnFiJv0zAqac272ZgVqWlIZrp0un8wI4SB8C +ERRQagH8NOO+ulHzsMX9X6Vc+aJBzeuqNpRZqPtw4hm7/THLsrHkOsuzkb0WB0SxH2nFmvE4t5Cq +LuPN+p9CKpx+kst/GeFRiP7OZwgkARGT810tnGeArh57TkDvuwAAAABJRU5ErkJggg==} + +set _AP_IMG(run) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABelBMVEUAAABxAABmBAR3AQF6FRae +ISGSAwNkAQGAAABnAACvEhJ+RUnHLS2bDg7Hiom0TU2aNzeMAwKUXWK0W1yrRUV/QESQCAiTDw99 +ODypFxeuUVCqOTmKKiptHiB2CQmTBweRKyuBAQFnEhOVDxBzERF2HR+NAACNFxdbAgKCAACLAQGH +IiJXAACDAAD9///08vbh6/Ld4+7a3unb2uPqJST5///u/P/09fndw8b4YGH4Skr1RUXyPT3qOTng +NzfoNjbtNTXlLi7lGxvdGRnr///i9//v9/z9+vrh8fr8+fn4+fne7ffj7Pfx7vP37e3x5Ojg1N3M +0t3o1Nn0zs68wszlxcvmyMjvwMbGuMKwq7Tsp6zgmqCwkJjFkZfPlpbij5LsjZD0g4PwfX//enqW +b3Xfbm70a2viZ2v+YGDFX1/eU1buUFDoT0/mREXtPj7WOTzrMTHsLSzVKirmKCjdJyjhJibiHx/g +HR26GRnhFBTfEA+jDAzPCgrFAQBqOYheAAAALnRSTlMACG4bsqNeT0Yg/Pr29fPy8u7s4d7Z19TT +zsrHwrGvp5yLhXh1cWdkREE5MhUNPsDNvwAAAMpJREFUGNNjwAWYtVVkBJigHEZNdQWRzNS0bDkw +l41Vis8iODnDusBEXAckwO/nqWeqb2lj62jCxQ4SkHY3Ndc3S3KwL62sBRuiHKan72sWZeJU5ZzP +wggU0IrTM3dzCcpNj7YwEOIEWSjs5R+ekBPqamDoE6MBspQ10dKm0Cnew9jYMEIJZIianVWefVmW +gZGxkaEESICDx8rWsbwkwNsoMIQbJKArae1Q7FwTG5kiKgtxvLxdUUW1IIsqOzPUL2y8YoocnIw4 +vA0AlFElKlYRJ5cAAAAASUVORK5CYII=} + +set _AP_IMG(saveall) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAB0VBMVEUAAABKgN48btMrZthvhtRa +idw4bNVfjt1xh9KRkL+Njb40T7sTLq4DAoZMf9pDd9RTcMkpWMZEe9sgW89SfdhLd9M+ctdUhdwl +YdRzitVIc9V1i9Ntg8xof8pab8SIiryQjbtCTLI6Vb4rPKscK6MOI6MYIZwAAIUKAIIAAIr////o +7//+/v/y9v/h3OtgkOP3+f/s8v+y2/ufzftVnPp4tvPS3+/t6+13nOVqlOLLytT5///1/P/u8v+z +3f9ruf9js/9arf9Sqv9Ppf8/n/81mv8mkv/6+v7z9v1dn/r///n7+ffc6PW9ze6IrOzi4eZfjeDP +ztrHyNfJydbBwdHNyNCgnsaJyf91vP9euP9erf88lP8+jv+25f45iP6w3/1vrf0pev0yf/ykz/tm +pvtjpPv8/PlSmfmm0fji7Pff6/fY4/JunPL3+PF7t/Hn6fCZufDA0e+MsO85aO/7+e749O7o6O7H +1+59oO5rj+7d3+2xxu3o4OzE0exafOzz8et2o+pyrejM1eZWhObb2eVyr+WiruUlReTZ2eLX2OJ2 +k+Fujt+do951mt5VbNfPzNVqjtV0i9RoiNTVztOiptLUzdGFkM5Jasx4hceam8WDicKC/MQkAAAA +KnRSTlMA8fPw7/Dw9O/u7tG+B/7+/fn49vPz8fDw7+/v7+7u7u7c17qroIopHAtoCPwuAAABBUlE +QVQY02NgYOBVYZKSlefk4uJUkBNVBgpoCLpFF4VYBfeHTLWIZGdQ4+YWmDRx2sywsBnTZ1k4sjMw +uToXhE62CrYKtXSa0O3AyiDmFlMRFBgY1DfFwqm3y54VqCKussPfv7O9x88xoBkowOaSVGdeUlrf +1uIXFdAQLg4USCyuLvT1La/NcbDUs2NkYHM2STcx8fRMTUmIsKwBCjCbNpmZmWX7+GRlGuvrGQEF +8sw9PNx1tLS0vJIhAqb5htqGugY6WmnGUIEyXW2wiLexflWsEINEo7mBrba2ra67dwafopIqg3Br +rpaOtY2NtZZXPL86LwMDD5MMBwcLEEhKi/BoMjAAAGxvPzf9UxKDAAAAAElFTkSuQmCC} + +set _AP_IMG(share) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAApVBMVEUAhlIAhlIAAAAAhlIAhlIA +dUIAdUIAaz0AaT0AhlL39/fv8O/38/fv6+8AilL////n5efv8/fn5+9SrIzv7/fe4+dCo3vn6+/W +6ucpnnMpmmsVkmMNj1r/+//39//3+/fe7+fe3+fG597W497O497e397W297O39bG19at18a1z8al +072lz72lx72Muq1aspQxnnMhlmsclmPn7++929a91845onsG4EBdAAAACXRSTlPv9wDe1oR3a2Ms +8+JZAAAAvklEQVQY0z2PN4LDMAwEcfI5gGCSSGU555z9/6cZaDwVMM3uQjLq/f3oDRIYIaINx8Xi +GCyfA/hHrCvnJhPnqhoRAPA2deQZctObGDtzJmPy3LiZZXEdR8Pk3aOM4yuLveJv+S66xhi1Z7HS +RK0NS2L0isU2TdNPGyqKfGxZnEgzr6KttaYTi1BqxTy7h9JlkNhdpgRKVbaTWGw2PoqJftMgSvX7 +YT33fr4+3KXoUMYVl/P5Usi4PiRDwB/QT77pOBFLWggnJQAAAABJRU5ErkJggg==} + +set _AP_IMG(sound) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABUFBMVEUAAACHh44zMz6ZmaN7e4I2 +NjoQEBIODhMKCg9fX2lra3lbW2NFQ1Gdnaerq7FQUFWfn6d7e4VoaG1wcHp/f4hCQkpqZ3FSUlZi +Ym4eHiQpKTBVVVwpKTJhYWonJSsoKC9SUlpXV2dSUmBXV2UICApOTloxMThAQE1LS1ohISwBAgEM +DA0kJDAGBgcLCxRQUF/h4eLAwMC8vMCenbaLi6Z1dXbb2+nZ2d3S0tfNzdfGxtStrcGXl66Tk6ya +mqR/f5yWlpqPj5h5eJSQkJB0dIODg4FkZHf6+vzy8vnt7fPq6u/R0eDc3N7Pz9HCws66us3Kysy0 +tMm6usjHx8bFxcbCwsKiorm3t7itrbW0tLKiorCgoK2kpKuZmauioqmfn56IiJ2BgZp8fJeMjJWU +lJN0dJKFhYxycot0c4qGhod7e4dra4R/f35nZ25iYmdPT1p6fK9qAAAAMHRSTlMA7AT56a5wLh79 ++/v19O/r6uPj4d7e2tTS0s7NzcrDwLuqpZiPiIZqV1VRS0hCEwtBXW+CAAAAvElEQVQY02OAASZl +LkV9IA3nq7rYZWkgCagzJ8fFKCH4OrxGmeFGEnA+u4i7Q45hgDCMryfr6WXqGmrBAuFyaCqYm1nk +5hmaM4K4atKCzJZWgZZRafEGYAE+DzPvMFtrq1hHZ4iAgL+tjYmJsV+CW4oB2Awx49SkRHuTIJf8 +SB8hkACrjVN6hpO9talpsK84SEBXSkZejifb2NE1xIgV7jAtSbdoZ0MHNoTTOVQ47SL42RmQgLYo +NxsTkAYAntEe7OzK7N0AAAAASUVORK5CYII=} + +set _AP_IMG(tag) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAflBMVEUAAAAty3ATWDApu2cPRCUE +GAwkoVkko1oFGg4rwmstym8otWQrwmskoVkos2MlplwhllMmql4mql4ehUkYbj0TVi8SVC4PRCUK +MBsuzHHh7uns8PFY1I0tyW/T2dosxW3l6uvf5OW7w8SJ0KlUw4S1vr+vuLlWy4hD0H8+vXT64Ib1 +AAAAGXRSTlMA8DjvNQvBxQ365ubbu7m5taufgGBbNisjxmdpnQAAAHdJREFUGNNFyFcWwjAMRFER +eu9Fkm3sQCj73yAyio7ma96FA9YtGrChbtA4LHdzFYMrHBFDMEHcn1YYiExQJp2KSdRu2WQdtdvE +IheA2TS+qUjnjumzgb88qaT8yvyIWzDhTvo+HEHdeFKlbxdtl6+2S98u55ueHyvGDk6cjw2RAAAA +AElFTkSuQmCC} + +set _AP_IMG(tagoff) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAb1BMVEUAAAAUCRmaWLVCJk45HEWT +TbCBQZyCQZ2XUrOCQ5yZWLSQSq2UVa2ITqB6O5SBSpiBSphnOHtTMGJGIVU2G0EnEzCbWbbn5+2Z +VbTs8PGtesPT2dqlbb7l6uvf5OW9m8+7w8S1vr+pdMCvuLmcXLcsXkhfAAAAFnRSTlMAC/A4Ne/B +xf265ubbubWrn4BgWysjdZTnjgAAAHVJREFUGNNFyFcWgzAMRFElkATSq2TZ2KHtf43YCB3N17wL +Tyw7V6BD2b4yuNwbEYUvvBC9V0F8vK/oiVQwL3dIKk66Z5XWSfeBs9QAu5MbKeWOA1N3g1U6SiFO +kf+uBRUeSh9qWOVYZGsTaZNZ2qSRNvn85Cw4nAx17/AE1gAAAABJRU5ErkJggg==} + +set _AP_IMG(terminal) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA21BMVEUAAAAJCQmFhYWDg4O1tbWv +r6+ioqKampqUlJSdnZ2NjY2lpaWQkJBTU1Onp6d3d3d0dHQKMVSPk5YLQmwKOWCNkZQMVYgKN1wK +L1AKLEwNYZgMXJIJJ0Wmr7aWnKGPlZmMjpINWo6DhooMUIALTXsLSngLRXALP2gJIDvIycmiqrGe +pqyaoacNaKNchqINY5yTl5uIjpKHio4MWIwVSnILPGOSp7e1tba0tLVniqSSmp+RmJ1nhp1hg5xY +eZNifZJee5ItZo0zYYMzYIImWoAZVYAlTGskRmIJHDSZ70X0AAAAEXRSTlMACMPDqampqampqamp +cKleXkxo6LUAAAC/SURBVBjTZcvXEoIwFEVRFLG3mIQAglTBXij23v//i7zJkzPupzNr5kj/tRVF +KYhgtACKw95kPLIsazSeDJscFhrBgdo1umq/VxOAXgffnU/nbiCgYqPstE2MqeEGuyKHDlxWV3HZ +cyhRnV2OvpqofmhXODj6+xw+ZrNnH9slgPLS1FiU3m9pmFEB8UBHJMIYR2xZBqh7A1NHjBDCUMyh +6n1ANISQZnp1DhvHoR0epesqQEOW5bwIRkOCcj9J0heVPBUXyAgwsQAAAABJRU5ErkJggg==} + +set _AP_IMG(tools) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABmFBMVEUAAAA8PDoCAgIDAwQAAACb +m6XXmpSurrZhYmyFhY9+go19fYcyBgUmJik1NToXAwMPERIPEA8REBAGBgYHAAAAAAAICAgAAACx +srmpqrKLl6KGb3iGCQKFjJbJhYBVVl2NjpVISU6kpK2dnad2QD6np695eYPDVEp8fISJiZFUV11m +Zm2kWVZub3eOJhykpKRfX2YjFBQnAwEhISReXmJkZGseBAScnJ4nKCtxcnY7O0Bqam0NDQ8vAAAs +LTFnZ2tBQUYrLDAqKiw0NDeDg4R8FhUnKCt2dngSEhR6EhAfHyIODhB+EhEeHSECAgM2BQUAAAFq +AABnZ2cAAAFdXV48PDv////j4+zT097b3OjZ2+T8/f/z8v3e3+3c3OvZ2OfU1ePPztr/wrihoamg +WFy7Fgf19/v29/ry9ffx8vbu7vXr6/TX3Ona2t7O0djIyNLCw9LKytHExMy5usmqsLe4qbT7urP/ +uaqUlZ7voJuRkZrpnpmneny1ZGHpXlTYV1DsWEn9WkPzVkO6NTPiRzCdExCqFgulGQkBE4FeAAAA +VnRSTlMABIAWEf7+/f37+fjq4+GgamRbWzknIA3+/v7+/v37+/n5+Pj49/by7+zr6ejl4uHh3d3b +2tnX1NPOy8K4tbSvqqajopycmZeXkI+IgX1rYUtKRkEqDJjCmGQAAADoSURBVBjTRc3TYgNRAEXR +c2cas2Ft27bt3kGs2m7s/HYwD1kfsDeA1W5F/2YNysgVwTXWPih9X2ABXMz2mbE4ZVuvu6WKPQKM +PihP0MGNsSuvDlFPsBtQLtnR6eQHh32PvB5bYZ25lJr2cF5efBI086pJK0pMKq/L5fsWX/500gm1 +A80NjbHo13PbMSS2U0PXfyZ455AdQHI+FEnkgsINDeygbL/lJ940rha4e1q/YQe25f5kfoY1qt0c +75Qd4kjuT4e0FsCo8bjfWhn0/qZC2rPKrueznSEYyRYmLlFhmmMAWJYNVqCqCDzULeg/xTW3AAAA +AElFTkSuQmCC} + +set _AP_IMG(trash) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABDlBMVEUAAAAAAAA/AQG7Cwrgh4fi +d3enCQlsCwi4GxvHWVkAAAB9AwMAAAAAAAAAAACPNDTmLi7XICC+AwPMDw++AwO1KSmYJSXbMjHM +Dw+sISCOBgTLERC6AwLRLy/GLS2VBASdAgKMBASVAgKFBASMAgJwBAR3AQG+AwPbHR3MDw/rLCzB +BgbvLy/3NzffICDQExPUoqLhcHCxY2PrW1vQV1e/QUGoKiqSKip7Kiq1KSmQIyN+IyN5IyOjISHc +ICDKHh52Hh6OHByNFRX1xsbtwMDmqKjdnp7qm5vsfn7Re3vZamrDWlq6WFjlUlK0UlLMSkrxQ0Pz +NTXdMTHnKircKCjHJSWcISGTHx+SFRVyERFVnVBCAAAAJ3RSTlMANAjjemZVUU07KyMjGhEF+/v7 +8O7s7ObjsbGQjnd3Skg9OzAuFxUFTnydAAAAvUlEQVQY0y3NRQLCMBQA0VDc3V2TlFLcpYK72/0v +QvrpLN9mkJbXbjaZzHYv0stE3q9ebzoNpxFk+6rKqN8fKerHBmAZjuXJYDCRx0MLQJbezodW69SV +cA4gT8n9ys/qVYwLAEVK+JoAUAJwMrjMFxIDJ0CZwbrd3DKoAHCUdNqC2OlizCGIktVREJ8NHED/ +gmS33DQbexzSIcYu/INWsVGHpLYV2TaF9KzxqM9vTFgRxHncLoeB5XC5PRz6AXdwHEucrngJAAAA +AElFTkSuQmCC} + +set _AP_IMG(tree) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEUAAACj+voAkgDL9va2bQCS +SQBboBgfAAAAAXRSTlMAQObYZgAAAFNJREFUCNdFztENgCAQA1ATJujBAu0EMAKJI+j+q1hPCZf7 +eEn70WNfCQa7MYJiNQAQMEL0GxAlZERlJFp6IThdZXzliQRw/mhXYqDdqEYxZt8jHoA9CVlndi05 +AAAAAElFTkSuQmCC} + +set _AP_IMG(umbrella) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAY1BMVEUAAAA+kJg7YoYrZGkpRV4Y +PD8YJzcTIywWKTNJmK9Dfp04ZIE6YII7ipMpQ1wpYGYiOU5HiadKkK5FlKZDjqI2eIU4fIgmVlwk +VVsPJykRLTNgzedgx+VfuN9fst1fq9pg1OqOEhlvAAAAG3RSTlMA19ebm0FBOSb589rU05STZPv6 +9PDd1l5cMh78NwdqAAAATklEQVQY02XMxRHAMAwEwAuaIQwO9V9lvtJoC1gIW6iIsMNcjIF7GQeo +nlCQztQQSWMuzAT7MBY6tkTUkFRHHMD6UWXBeDMDsq8Jn0X5A4o2DHLax4J9AAAAAElFTkSuQmCC} + +set _AP_IMG(undo) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABAlBMVEUAAABJHx9LHBw0Jyc9LCw6 +MzOQUVF7ODhsNDRCICBIIiI2IyM6MzMwKiqVJiaaWVmAR0eDPz+BLCyFSEh+MjKBT0+BMjJcJiZq +GhpYLCxpKSlcHBxLFBRIFxc1ICA8GBgzHBxFJiYAAAD/ra3/hIT/1tb/urr/wcH/nJz/lJTEdnb/ +TEz17u7/7e3/7Oz/0dH/xsb1ubn/tLT/sbH1sLDiqqr1qan/qKjipqb/o6PioKD1nJzWnJzWk5P/ +kJDPjIzihYW2g4P/gYH/gID/enq2eXn/dHTrdHT/cnKqb2//bW3/YmKgYmLYYGD/VFSQRkb/RUX/ +PT3YNDTiMjK5KyuUISFooDWqAAAAI3RSTlMAgHBKMA/v0cFvXzkfE/Lv7+/l39jMzL+8tbW1nIxi +YlY/Can8mAAAAACfSURBVBjTVY7VDsJAFES3bhR3h24dd3d3/f9fAZY06Z63Obm5MwDh4ZLATYEt +Rd2ZmJcrQZFxIsO3VVWt9nzEP9OBek3XNa3RnMXQETnSFKXbNwxzsk0BZPYKhIvV5nC8PARkJH8L +7qxpZ2nfvDIyMj8ww1T6pNhPwSleR77vueE97nRTud9eFr6LwI04fkkAI3SmcEFaWVzQ1wzASeQ/ ++rYQ6qf8DSAAAAAASUVORK5CYII=} + +set _AP_IMG(up) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABTVBMVEUAAABje7oACotNVbAWMZ0M +KZcIIJMBAoYAAIUAB4kABopdYrRRXrFTU686OaJAQ6dSZLVQYrE0M6BOX7JIWa4gLZwdIJgXJpgR +FJMAEo4LL5cACIkIJpQHCY0AAIUDM5kAAIUCMJcAAIYAAIYABooAAIcAHZQAH5QABIoABYr//v/U +1uXCxt/HzN6p2f9Kp/72+Pz7+frw7u2fxOzp5+vb1+gwgN0ndNUUXMHn+P/N6f+k1P+b0v9Sq//9 +/fpjr/pFoPlPo/j/+/f18fY+mvb59/SSwfL59vFZo/BLm/BHme7K2+yUvOzh5OuryevX2+fHzOdA +kOdDkOUzhuSUt+Kct+DGyd45g969wN1xnNh3n9dBg9ewsNZ2m9JtldKbntE/fdAkcNAgasweaMtq +jspzkch6esB3dsAhYL1ubbpmZbcITbcbU7NHZ7FBZLAHS+23AAAAKnRSTlMA/DT53q+ei3QtBPz7 ++/f19PTz7Ozh3NPTu7arpp2cl4WDg1VJPyQhGRBD3t15AAAArUlEQVQY02PAATiE+JS4kPjsmc6G +aXJI8llaejZa6Qowviq/oZ6+i5sdrzKErylhaqXv6BXsZyKmATEg3tLWwTPILNE7RhZkMBOzlrW9 +R2B4dEKcO7cKUEA8wMDAycfMPNLI10hbFCjAIiDMrG1snhxlyiMiyAIUUGfilI4wTrKIDZPkZFKD +2MOmE2KRnaLLCmTCBEIzclKRBGR0XP21TXSl4AKKeYxAkCuP1d8AWFwbosNB+yQAAAAASUVORK5C +YII=} + +set _AP_IMG(upload) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAq1BMVEUAAAA5dB80hws5cyIsaCEm +Zh1LqglJpglGnwlClwhDejIzgwgvgAk8eSsqdwg2cSdwqUd0tkOJy1mDwlhblDpZjD9xtUtLgDNB +eyZqpktEeytAeCZRkThNiDlTj0AsaR0saR1Piz02hhJNjjZIhjZJizI4dgZzwTRmryxanCSD0UVj +ljlemy1Mhh5DgBJ9wUeI3ER8yz2A1DxutDZckTBjpS5hpypXlCZHhRUrWwTaAAAAJnRSTlMAz2Ot +Xwy+vr6+tHRiUjsY/v79++zp4+Hh2s/PpZqVjIuAaUY4EVkHtOMAAACASURBVBjTlczFEoNAEEXR +pjO4xd1lBIsn/P+XQcFUDbDjrPrdRUPJtS3TMEzLdqEWeIh4RvQCUE57aLlOxpfm1lfRY34DZXd/ +vqKt2v7wzRgb+SCFs+TLOf9NQxmc+PMXQiSxIz8SskjTPFsSooO0ziilGigb2gla/3AclA7VWQDB +bgtMrcKTYwAAAABJRU5ErkJggg==} + +set _AP_IMG(view) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABy1BMVEUAAAAAScAKUL8tRpoHRL0l +Q5sQVMEDTL9GU5pAUJo1S5oBTMUhV7gJQbUoVrQLQLAzVa0PPqw5VKgcXMFTXJsARL9MV5o7TZop +Y8Jhb6olUrAIQ7gtVrAaR61PYahAVKUAPqoOHHkRRqklJ3n////+/v34+fv7/v//9/3v8vjy8vWu +y/OsyPLs4eVRjORNiuT9/f/29//u8/+Axf9uu/9jtP////7/+/37+/zw8vn09fj/+/ez0vf+9vbu +7/P89fJPlfKnxPGyzPCrxu93puvr5elxoul4peVrnOXV3uHh1dzX0tHPt758iZbViG/hi2b1cSf3 +nQCh4f93v/9Zrv9Sqf9Fqf9Mpf9Hov8/nv/0+PtZoPtRm/r39/m40/WwzPRWmfNYmvH58u/17++h +we+vyO5rpO6Hse1Hi+3t4uxgnOxBiuygvOqpvuh+qej97ub05ebv4uVll+RlluHT2d7c2dW/x9DU +xdDdvsjow8XxxsPAu7zMrbvpxLrks7Tbtq/hrq3ZrKLZqJvfpJTmp5OMi4qIhYTuk4Hlk3byj3Tm +hnDpi2vgh2nuhmPsi1/nh1/YfVDXjE3cj0zcjj3ShjzvlgDslQDxaADxZwCaNOfbAAAAJHRSTlMA ++/r68fv6+vr6+vfx8fHx8fHx+/v6+vrz8/Lx8fHx8eHe3ddAp/aaAAABBElEQVQY02NQFhHj4ODk +FOfiYmZmZmVVZJAMMjYONjExNQ0JDY+IDJNikMvSS4xO0NPT13eIcdDPlmWQT9Vs8Gu01NS0rPNr +0tIRZBCK0+gLnKShomLQHTjZ1gYoYGPeGdBhoKKq3h7gbxvPzyDgpFLoo6uiaqGu6+NlrQMW8PQt +UbFQU/X0LbN25mWQ0TaraqlVV4uNqmyuT3bkZeDT1uifNtFQzcqoZ+qUTEdpoIB573R/Qysto64Z +E1xTWBh4dFQKKnTVtOzsvGrKXXOAAs5mpa3eqvZJ9t5t1fm5LAwSael57u4uLm5uHsVFHhncDErC +TGxsTEzs7IyM3IyijAoM6AAA2UY7l44fw8EAAAAASUVORK5CYII=} + +set _AP_IMG(warn) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAkFBMVEUAAACTAACyAACMAACPAAB2 +AACZAACLAAB1AAB2AAB3AAB3AAB3AAB1AABxAABwAABwAABwAABwAABwAABwAADu7u7WAACfAADs +7Ozw8PDq6enjq6vmpqZaWlrbOjrCAADbLS3t6url5eXh4eHhrq7mk5NoaGhNTU1DQ0PZQUFAQEDc +MzMxMTG8AAC4AAC7FBTG2r10AAAAFXRSTlMA+/76+bb+8uvd1cvAl2NYTUM6MRjtzZKZAAAAnUlE +QVQY01WKRRLDMBAEJTPzxmuZmZ3//y5KHHD6MtVdQ04iWY7IFTmO5auHYnUXw0uwhK4TrJ8H4tw0 +sxh8gymk25YK5sd9qWDLwgrJfwfjSNk4svQwTvf4geU54xfvFfQ9QxwGxGzXn+7StUZsW8R6pS4P +apkB4DQhQFaqhDi0ggQgz4FPRR2ilX2SJMDh05caUW5/KMSm8QVqPwAheA8OJkYEHwAAAABJRU5E +rkJggg==} + +set _AP_IMG(www) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABuVBMVEUAAABegUQAAAAAAAAEDx5P +ZhseWJ4jZ7BykCoNMF8rX4hYfjsZVqOpzkdmnWdIg3IqcZ+dxTwVTZo5mNdvkRIdWZcXTZkhWn99 +qmBtnzx/pEaHrTApecFukiJ6oCklarE/UwqNsUMRL0GPtjQUS5k4mdVukiI5cIlQgX4jYJh+nzgY +UZkLJD8hNCIBAgBRm5NHdm4AAAAAAAA1Sx4AAACHsCsgY7C65Uus10On0kCWvzaCqyyM4/Rewuhb +r8nn968+f5YVSZIaT5DA8njO9V3A609fjE6jzj6awz2gyjyYwjeUvjSMtDN+piiNuR6JtB6czBqt +6fJ42fF/2O530+xUvOfS8Oba9uRHq9xqytrU69ix7NdUrtVAndO66889mM6D2Mjq8cY/ksQ2iMFI +l7yc3rosc7Cp5Kzd8qgiY6i35J2Rx5zO5pqO05iW0pgWTpiNzJSHxIvU9YmDvYne+oeCv4TQ9IK8 +74A5bX5Ed3iKu3Wa0G+AsG1Jem295mjQ+mVon2JMe151o1u45Fm24VZklk2kz0eu2Eav2kVmkEVy +nDuNtjmQuDR+pjGOtzCGsCeEriR1myJ/pyBRnAfDAAAANXRSTlMACSkQBgX+8xQO/vrz8/Hw7+/k +29vY1NTS0srGxMC4s5mKiX98bFZTU0tEOTczMC8vHx0ZDhiiuEgAAADtSURBVBjTYwADRgNNDS1G +IAPKVeQttrOrEVRmhfA5JKqyg9Prmts9pDlAfFapmJDAsJwsF3PLHjmQgHqKrU1Uon2JS4uFla8a +UEA+1tYm3D6jqLygzcpaFijAHh8aVBYXnZpX6N7dxc3KwJmZHBHpXO+ckFvq4dPJZczAwpaWVG3u +6mre4d7U68YO1CLG5uBpaWFh6elt6lYrAxRQcazwsfLy8u4z9Z3ooAoU4BRybLS2NjXtnzCpVRjs +fG2efCenSn8/P38+fYjbdUTNzMwaAgIkdaGeM2FSEhfgF1HQY4Z5l4XZiInJkJkFxAYAkGUzLFL8 +cvgAAAAASUVORK5CYII=} + +set _AP_IMG(yes) {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABL1BMVEUAAABnoVlamz5ZmUigxZSO +vmxYmjpSlzFlok1WmjeYwI1lpjR0qWhWmjJ1qmxspWGBsXhloFdenj9bnD9wpmphnFhjnllMlCu3 +24pWnCpcoSlgpCjo6Oev1ntnqSpanypZnipSmSpPlipIkSpeoylipifs7Ovj5eO73Yms03ygzG6U +xmGby154s0NUmSr19fXv8O/N28vN5q2qxaHH46DE4ZqfwZGw1Yijz22m0Wx8q2uSwWqYyV+LwFKI +vVKMwVCPw057tz9nqDBjpitQlyttrihnqibk7eTd59zY3NfO38vF2cC0056z056/3Zy+3JyZwIWW +vYSx2HuVwXqbx3SFsXOm0myEtWeSwmOGuV6Rw1p2rFmDuVJ4sFFup05gnkFWlkF0sD1tqzl1szNj +pTPkjG39AAAAF3RSTlMAD6tA/v7+/ujo5+fOzqurpqampkBAP8VsnEgAAADrSURBVBjTJc9VgsJA +EATQJsHddklmNu6Ku+u6uxv3PwMMvK+u/qoCopiNB4PxbBH2AumLWqPZbNQu04FdTl4xjGmaDMNc +J8kn07YsjrvjuPsHq50BOAjZdqfTfer2j8/6dugQco4zGLiu+3ZePnl1XnIQHQ3Hn+PJ5KZceR6O +PqIQ9qa/1dvln1Fp/U89LwyRGf+l6626Xp0t+fk6AjFBnT8ebb3zPEZsDAqiiNSeYdQxVgWWLQCN +JFYUeqffgshKC0QDUKq8kPwf35fkEqJI9ZRW2lEULbUfQ62wrCgyXlEkE3Q+oWmJPE3uDZfvIv7r +Fi5JAAAAAElFTkSuQmCC} + +} ;# ::apave namespace diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apaveimg2.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apaveimg2.tcl new file mode 100644 index 00000000..7f96012f --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/apaveimg2.tcl @@ -0,0 +1,1591 @@ + +# images for apave.tcl (base64) +# images for apavedialog.tcl (base64) + +namespace eval ::apave { + +set _AP_IMG(OpenFile) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC+lBMVEUAAAAABBIPPm0AAhEAIZcA +AAEADY4AAW4AOLAAJpoAGpQAFJAlSG0ARrcAQLRikb8AKp0ACosAKJgoXJAAFzMAAhEASbgAIqAA +MKAAFnEAT7skWKAAMJoAFnwABVgQQHEhRmoHK1ApVoIAI4cAGTYATboJPXEHL1gAAAIABBEAAAAA +AQMAAAAABhj///+s0P8whP88h/+21/91nsfg8P/W6//9///3+/+82//7/v/5/P+iyv9Mkf9Ijv+a +xf6hu+X0+v/l8v9uqP9Vlv8ISePY6/+lzf+Vwf+Iuf97sP9in//N2vEHTuYpa8j0/f/e8P/X7f/S +6P/G4P+z1v+Yxf89iv+7z/F5rO8ITOUJUb0BRbQAQLHv+P/s9//j9f/o9P/b7f/Q5//M5f+33//B +3P+y3P+52f9/s/9lov9Ym//f6vm20PfM3fbD1fO0yfBGf85Gest3n8lHdsgLVcAITLkCSLkAOq4A +NaoAMKnd7P/I5P/B5P+94f/I3//C3/+u0v+Lvv+Mu/9yq/9nqf9Kk/8zhv8fef8LdP+PxvrE2vex +zfadwfW4zO+uxO6OteuZt+mDrOmBpug1gOgfY+himucPZeUgcuQGVuI5fdMrcdMabNE0ddAdZcoV +X8kBTMgtbcYARMYAPsQSW8MAL6b1//+IvP94sv9qr/9Unv9Fmv8xh/8ogf8rfP8AZ//n8/7O5P2q +0f1epfvk7vrg6/nU5vnV5flQkvhUnPdCgve70vYqd/anyPWgwPXP3vTH3PTU4PNKk/M0efNxs/J/ +sfG/0O+AsO9Aiu+gwe2Jr+pmnupnoOg1cOhUk+dJjOcAQOeowuY/heYse+Yqd+ZlnuV4puQpaOQJ +XeMEUN8Ybt4CS94BR90AQt1JcdsPZ9szZdtThdqIr9k9adlqidgHQNgFYddtndRkmNRNi9RDhdRo +iNMAVtIANs4gS80FNs0YZcxqmMoPWckJVMlGdcclYcMtYMIAO78ANL8dVb1PfbsGQrY1YLUiX7AA +PaoALaR5mCJ1AAAALnRSTlMAWbNZ9y724IX29va0hob39vb1om1bLvz27erm3MvBt7OdmpWMgVxc +SjwkHx8LbZrwYgAAAkZJREFUOMtiGIRAjb/QGA4K+dWBQmKqvLy8fHx8HEAgxiC8RA8OzPTiFIAK +pObn5xcUFBQVfSr6IqMr7AeTtbQyt4rjASoo7Ys1AQN/v14hViU/qDRQ3sEcouCUhREYBCf1i8tK ++yHkHcz9QQqipgTrQ4BF2MtHP2Kg5gMVxMRUMYEUnHGztrYDA30jo/frzMxA1gP1xzrGV4MVnA2x +O7mouDgyMrKk9Ofvffv3eoNA7pEcR0ewgugLDQ0z55+3h4DCLZs2Z2Vl5YRtzQ0zcawBK5iUvnzW +7ABXUxAIeOAaG+/oGN953D8nzN8EouBS08ZZc9zqwe6sf7repDLB1TS7P7CzJ6EyGaSgbFrG9ndz +QtysQcDtWZBrYGJSUldfVW6PawJEAWBTMw/Mnbs0xB0EQp4HJ9YG1QXtPlG3M8/UNBWioOXYog/L +Gj1AoPHFhqAUCwuL7glp2XmBEAXl10InFX9sTvcEgfQZbilpwFDtnhjc1ZsYCFEwvfVi5LzMJicw +mKFfCzJhz0SgCQEByfJgBaunlcxryfACgYzZl4+GA8GU+4cnXOnoOKQIVFBxve1GyYLQTGcw2DbT +FwQ+f8//JakiIqINVLD4ZvvdqAUGNrYQYAMGO04332HXgiSyxbfan0QvXBNqiARCD15d8ZCdFaLg +7+21r/4sbGs1QAKrdk1eeQ+moOL1uW8VX31AIAIIXMDg8dvJb2AKlIVYWDglBAQ4OVlYWLi4uLi5 +udnY2AQF2eSgChg0RRmRADMMiGroMAwSAABy+e8vrlNwxQAAAABJRU5ErkJggg==} + +set _AP_IMG(SaveFile) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACylBMVEUAAAAHGaJWVqFLYL8bQ8Mw +UMEiR8E1Q7AuP68oO68iN68VLq9HX8FBW8E8WME3VcFGXb9PU6QRKrAdM68ZMa8HGaQGG6YKHKYA +B5MAAIdKY8IVP8IrTcEpTMFIW7sNJq4sN6cFGKEtOKciKqIEFJ4aH5oACpYAAIoAAIn////n7v/1 ++P95vv/q8P/5+//y9v/3+f/t8v/U1Nr7/f/x9P/o6Ovw8//q7/8+lP/x8fH39Ozi4+e6uszu9P98 +wP9Jov9Pnv9Alf87kf83j/+wyeva2uPT09/IyNf9/v/r8f9ssv9grP9cqP9Wo/9Bl/8xjf98tPn/ ++/dylOmnt87s8v96v/94uf9wtv9osP9krv9LpP9Bnf9Imv9Tof6Nwf2Lv/yEu/qBuPru7/bz8/X8 ++fT39PRKi/StyO7/++379uxwkumWzP+Jxf+Cw/+Fwv9+vf9uvP9Wqf9SqP9Opv9GoP9EoP8+nv9F +mv8ui/8riP8jhP91tP5No/2Hvfzr7vdUkvZQj/X//fS1z/L7+fHu7/HK3PEpXfGxzPDr7e+uye8A +I+/E1+7z8Otzlunl5ui5zOazyOTv6uOvu+Pe3eDa2+BQb+Cptt/Y2N6mstnY1tfNy9aFlta1wtWv +vNPBv8ymq8y9vMszfcmXnsiZx/94v/97vP9Sn/99r/1zpft+qfpnmfpVlfpap/lSn/lbjvhwnPdY +m/dPg/dDePdijvY4bfUpZfXO3/RVqPRUgvRDhvNcovJFdfIaU/I3aPH08fB2rvAYSu8AHO+uye43 +g+7p6uzA0uy3zetTfuu+0eq7zumOtel4mOlxk+lgg+ng5Ojq5+YeOebg4eX38eTf4OTm4+LNzuLG +y+Li3+FCfODAxN5pgd6Yp91Ladzn4duJmtu6vtrc2tm7yNmzt9Z+pNbT0dWwv9OirtOusdKrus95 +ic6eqc2ktMurr8rGwskyXqcKAAAAKXRSTlMAz+zu8O/v6Obm5ubv7+/v7Ozm5ubc0tCfLfPx7+/s +6NXV0MHAvapHGFnvoLQAAAJFSURBVDjLYqAK0JAQExdnRAGKoqJiapIwBRI3wk8da2pqb+/sTE9P +P+QCAhMe1xxWgSmQz83ub9T00NMz0NfXNtAz9tDU1GwM3rVdGqZAyC5nQqqetr6Zoa6WlpauoZmJ +vkFq8MKFLEgK+lONDbRNzELMtbTMQSq0k1+vrYEr4LbLO5nioWegrW8LMSPETD852KcQWQFAJ1I0 +jfUMoLaYexqaJAf7FiEpyD2aoglUoa1vYmZoDjTC0zbphW8RG0yBSGh+d6CmJtgME9sQsBlJc2OL +MRRoAh0KdAfYjKSnSAqEdZa2ghVA3GECckfdHIcoWYSCMKgCTQ+gQ4DWeOqCFMjAFHDphG3b19LS +0XHEtK/P+uLlyVOmTJ/50MGeFUlBXFxcfHx8bW1CQkJiYmIAEFTHICkALLTaK8LHN3aZg0NMTLmf +o5NjuZ+fhUUUXAGnTnj46rOne4OA4ExWVlbv8T1bHf0s7PkRCry86q9mZGZkWoFBxqQDbY6OTigK +IuqvNZueM7UEg+ZJbVssLJxL+GAKOHQiIhtuZt66cLvHFAR6pu3dZOGEoiAysuH+pakH7020BoHz +03ZvdHL2L+VFKPD2Tns0cWrX7CuuIHB9xo51Tv4VCAXsIAXP797pmj3ZDQSmz9i8ytm/MpoHocDH +J23+k0Uv589yB4FZz9avcK5AVrDEt3Dnonnz3i6wAYMFr1Yu96+qKpOCKVDdX1Cw4c0DIxiYOXdx +tn102RoFmAJJZWZmOUEmBBBkZhYQYFZSZxgkAACfNtUCUYctdwAAAABJRU5ErkJggg==} + +set _AP_IMG(actions) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAApVBMVEUAAAARhakfhaYKeZsReJgc +g6QWgaIbhKQTe5wReZoTfJ0XgqMNd5gTf6EUgKEUgaMchKUafp0ReJgLiq8egqESeJkXfZ4hiKka +gaEghqYGdpgFdJYIh6sEc5UReJkahKYhhKQPkrlFq89yvt1vvdxIrM8Lj7QmkLIejq8vlrcujq4s +lrcdhac1nsI7nb8mi6tYrs1KpMQKfaBsu9tWrcxLpMUOgaQKknFfAAAAIXRSTlMAPz9PTyA+b2Nb +OQVKNSojFPpv/f1vGBYW/v78+flvGBhi5OLRAAAA3klEQVQ4y9XSxxKCMBCA4Q1gaCpg7wqEIqiI +7f0fzcBQsuPJGS58l1z2sPlnoTcMWZaHJphDGTGgcpy6rptooLnYbAFQGlyDIMgPoAZYMqgH7r7v +3yag+gi71AO2E8fxQwf9EiN7GyoWleiIvyMqCagF3RkTQgwAkxIRHUNlWXTI9J8Ozqrp4HlePgfV +Q/7osJxFUcQ7aFmEbFfNkrxDuaQk4kt2x+K/LlMTUZva3oVhyDvoIebYYod30QFrO7wYY0UHhjyb +Dqd1mqYffnLJWZRuFs3RKopSHq2CGNAXX4RaKODQPBMFAAAAAElFTkSuQmCC} + +set _AP_IMG(add) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAsVBMVEUAAAAWYKsnYJkNVp8aU4wD +RowvZ6AVYq4oYZsGSY4USYEGPXgAL2APWKEoZJ8bVY0FRYYHR4kVS4MAMGIALmCS/5Jt/217+HsA +kgAASQDQ6f4AfwAAVQAAbQAAXwCq2f+u3P+l1P+x3P+84/+23/+h1f8AiAAAdQAAXAAAUADU7f/P +7f/B5f+m1/+d0/8AeAAAaAAATADK6P8AgwDb9P9xufmn0vVvsu2axekAZQAASwAYluyOAAAAFXRS +TlMA6ebZz8/a7erSuq8029nSyMXDRicjv8DwAAAA3ElEQVQ4y63Sx47CMBSFYaZSZ6ih2cHGlCQQ +SEKH938wfIOJQD5IIPGvzuJb3MXNvaVWqfAJKjQqBpQPDmxXMqA6w2Dza8B3H4PZS6Bt5ThzG3TT +OtQDMNVlYPVvgzVj6wyoLxswz2MZkABErhthYO7z4ti7LA3EPWBU7PuDiAYALuVzzo80ABhQPEgC +nwYAnAqSUxLQILAAR/Z06bBBh7qAdN6BFQbDK/hRGEwyMHweUAjgh1neANAroCgwmPwZUN7PwzAc +6cY6pZSUUgght3UDKrX8ByhfbObe0RksFz9WcP9GsgAAAABJRU5ErkJggg==} + +set _AP_IMG(attach) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABHVBMVEUAAAApKSlPT08xMTEkJCR6 +enp1dXVwcHBxcXGvr69xcXGRkZGioqJ1dXWpqamrq6uUlJRKSkqwsLCcnJxiYmJQUFBFRUUtLS0n +JyednZ2MjIyjo6OUlJSMjIySkpKSkpKnp6eGhoaJiYloaGh2dnaPj49ra2tmZmZtbW1YWFhmZmZa +Wlo5OTk7Ozt5eXmhoaF4eHiDg4OsrKyZmZmoqKiHh4eMjIyUlJR5eXmurq6QkJCCgoKsrKxxcXGh +oaGCgoJ3d3eIiIidnZ16enqOjo59fX2AgIB2dnaFhYV+fn58fHxRUVFcXFxMTEyOjo68vLx+fn6N +jY2np6efn5+CgoK5ubmvr6+YmJi1tbWsrKyRkZGlpaWhoaF9fX2JiYkDpqYtAAAATnRSTlMADDgI +BfGPakH0wrD3Srq6/iT5y21EKQoD/v786eK8rquqk5GCgW5dUks8MxsX/Pf39vX08ebl4dnX18TB +wLi3tK6rpZuVhXtvWFVRQz1Tdv0CAAABA0lEQVQ4y63Px1ICQQCE4R5YxezmXXLOYM45ZxEdNgK+ +/2OoxUlqZvbCf+qq79RgZhOIejlT3b2bNo/jBcdxg8BNP3F87UOtKiSWH9IGxxcX8FdpdGiLHFbG +M0QOXHs6x1uTk0VZZ/vqpkYASAehwfaVr2UJwGO4L4k80UvV//v6lH/OR3usGeFzW+9i7y+R2TgK +Ef7sqELHsVMVetvfIWjxHQn/AtD4jge/BEJpl+eouHewkkmF56gHGpCjJ7V7tqOTHplQMp4sp5gO +5Ic5G93K5a3Bdii7tGhNZpPlQEP2sjWTdF6vxuNzAkZv2bD3PfhtoxwHM6Kfbg/6R2UTgogEVj/h +Pjkk3RcrNgAAAABJRU5ErkJggg==} + +set _AP_IMG(box) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABQVBMVEUAAAD////8/f7v+Pv+//79 +///7/f3////+/v79/v75/P38/f38/Pz7/Pz8/f38/f37/P38/v7+///s8fTv+Pvt9/v1+Pn3+/z6 ++/z4+vr+//79/f38/f39/f76/Pz+///7/Pz6+/z+///////9///9///8/v9ekKei2vOg2fOf2fNb +jqX5wpxYjKTk9fva7/lol6xajaS+3u35w56d2fOwzdqDzu6Gzu/C6Pjl4drS7PiHz+/o9Pq54/X/ +/v31+vzr9vqK0O+Fqrv6wZq04fWw4PSn3POc1/LQ5/GW1fDp4tr8/fzi8/nL6vjN7PfH6Pe/5fa9 +5PW24fSt3vPi6+3K2uGvzdqsxtGQssL72MDH5PGHz+7J4ezb5enW4+nW4ee41+TG2uPe5OK80Nme +vcp6orZ4orX80LJtm65mlav6yqiua1LBAAAAJ3RSTlMAwjv+p28wIA8G9NTRypqUe0op/Pf38Ovg +0r25rKSQamhoYVlFOBbCoAxgAAABW0lEQVQ4y92Sx3LCMBQACb2Emt57bCEMGDs2GBew6b2X9N7+ +/wMigWcITJx7sgcdtPsu0jPNYz/c966tev1Hdte8wO7At5wRJDLLcVlSEkTPri3onCrXmW0PO4Ac +z/PpNDo4jitLlqo7hLxVVlpFfuow2F6R7ZhSFQXRjIKl1+Gd2OiicX2yI2RkSyyZZ8NsbBJQkIbq +8EasF8rdZk1WavUOCAMASAD0gCAICGlCfZJFoV1ADstc8/6anQUY+BEtYocBlypBDcLzARGPhkkd +kKAIePFrQP/tAAD0joYBkqRUqrQMg1wpNf7UtKRRwFa0CMY4SEUYhvkHAeZtGgz0lXun4SzQmHGl +lAdoo2j4EN10oODU03+hoB70HpOTrWUTo/5WAGuMeftWpaD+F9jmG5kl27npGyFrb0TBScDmBMvO +sdO0iMO/8hyPFqWY23riMv2IM7CubPiCC7dfGc+U3vWkFBsAAAAASUVORK5CYII=} + +set _AP_IMG(cancel) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC6FBMVEUAAACPDg6NDw+cBASZBQWE +FBSKERGdDQ2iAQGgDw+LFBSjBQWAHR2UDg6MERGMERGcBweiAQGEFBSbBweIEhKHGhqKDg6eAwOe +AwOLLy+gCwueDQ2bCAirDAyHHByoBQWeBQWlAwOeBQWgERGsCQmqBgaRCQmaCwt5GxuPERGEFBSu +MzO6LS26HR2uJCSbHR2aJyefCwuPFBSOFRWnBgaEGRmREBCCICCCHx+LEhKRERF2Ghp9HR19HBz/ +iYnkAAD/v7//lJTbGRnrOTnnMjLrAAD/tLT/qqruQUH9MzPjKirgIyPyAADvAADoAADgAAD/4+P/ +1tb/y8v/trb/qKj/np7+m5v/goL+c3PNUVHtFRXWDw/cAADXAADPAAD/7e3/1dX/zMz/wcH/oKD/ +kJD9gYHda2v4ZGTfYGDHWVn7Vlb2UFDxSUnzRUXwPj7+PDziKCjrJSX0GhrYERHSDAzUCgrnCQni +BAT0AADfAADaAADUAAD//v7/8vL/2Nj/z8//sbH7pKT0j4/6iIj/hITxgYH/enrfc3P5bW3ua2v8 +aWn1ZGT3YGD3XV3OW1v1Wlr1S0vHS0v/SEjVSEj/RETyQ0PdPDzxOjr8OTnaOTnqNzfINzfHMTHZ +MDDmLy/ELy/wLS3+KyvJKir3JyfOJyfcISH3ICD1HR3xFBTJEhLtDQ3nDQ3WCAj4AADmAAD/5ub/ +2tr/x8f/uLj/rq74qKj/paX3nJz1m5v/lpb2lJT6kZH0iorxiIj4fX3wenr7eHj5dHT3dHTuc3P8 +bm7RZ2f8ZWXrYWHYYWH6X1/vWlrZWlryWVnhWVm4WFjcV1fNV1f1Vlb2VFTCU1O1U1PcUFD2TU3R +S0u2S0u5R0fbRUXdQkLMQkLVQUHEQUHHPj75PDzXOzvLOTnDOTnzNjbtNTXWNDTRNDTdMDD2LCzb +KyveISHWISHEICDLHR3pGRnlGRnUGBjCFhbcEBDFCgraCAjLBwf/AADsAACRxhwBAAAAPnRSTlMA +BwsgHRIDyRnOuLizrqKeFhIQEA62miQO2dLKysW5t7SzsrGvpqWelpAZ5eXh4N/cysPCvbOfnZya +mY6Ghgk6wgMAAAJ+SURBVDjLYqASYLKVtBBCEdDUNxNGcNk0bjjP5mFFCDDy3zsZycsEl7e+np/l +OYdHBC4gNj+rOSJSjRFqnMblGak1jcsWyWlBBET45uduqQmO6OMVAPNtzk5qqw2o3Va0RFQIrJ9v +0ePt8QHxDS1H1MEKJE9Piq9LCFy/c8VbUVag/ZZvFjQFBCYEBuxI0QYrMM8EaIpdXWJQ0IamqJVc +rIz8Hwv3BAK5CZvt2pXBClh5Mj1TEx0cHOp3ryox4loZ1Vqf5OCwsTEijZ2ZAaoicuH+pGA3t6TW +sq+fyw45uLm5OYR1ZbCzwLwlJHpt4YFg9xD3TfvK7TtBjIZdJzI4mREBoyV3e3FHSHJosnvnMSAV +urX54hVOceSgFTF9uKw71NHRMSwMROydcBNhPtQdXM+KelPswCDlYN40abj5cHcYL4nqtwsHgpaO +J3OlODAilBEwrjlR7y/0pKf39LsUPpVhwpDnn73cvyp2TWlJdLTTq+kPFARR5dnEHi22r4yJrY6L +Ky128i7IvaMkgeIJvrsv/Oz94Qq85mVP5uZA0s830fP7OqCCqurK8hKQApdZvee4heH2i02c4eMK +NqH8y5rV0SAFznldpxSh7mDiv5Rf4QtSUFX2SUom+h1YgUduxHF5iC2amVPW+oAUVK52MmSRUPpQ +uBSkIOdqapoqWIFB97cKsIJVS6WB4Suo8HpBAUhBdpajDliBVV8+yIR1Kwog8SfM/XL6PKCCCW3t +KmAFArznPYFuKHoOiz8O7rlTZ3lMPZwmCxVgVIv09Fk+ExF/Eoozs/OOZpgIwPMR7+T709iR4k9Q +/lb6GVmkkBJW11NGiX8BVV0ViAbKAQD7utruk+bbhgAAAABJRU5ErkJggg==} + +set _AP_IMG(categories) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC91BMVEUAAAAAAAAAABgAAAEAAAMA +AAIAFQAALQAAC0cAAwAPHqgOhAc0TJEbNIAALwAACgMACQAAVwAAAAAAAAMAAAIAAACDoepCrEI3 +oDgVlQsSjQkKegYFcQMJIbQniSAMLqsEFZoQJm0KEp0BDVkAC1MACJkAAioAFgAAAAwAAJEAAQAA +TwAAQQAAXAA5WcUYOtJErC0FDpZAp0AABIo8pig3WrsEPW8rkSM1miQiphkYfRQXmgsTV0wKI5o5 +WLUsRYoEE4IvRIkghBYOH1oGVwYCC2gMdAkANR8PJGwPYgoDC4gIfwcABS0FZwMANwAHFlIABjwA +CwAABqUAAR4AMgAAAUQAADEADKz+//+Jxv91rv8waOVBqCA8oh3c8f/X7/8uYN6R43A2nRorkRQb +fhASegfq9v+02v+cz/9QkvwqWtjG5cJMtCRJsCQruBwxmBkulhQljBMfhRDh8v/L6f+v1/+k1v+h +zv+Uw/90vv9pqfXl/+fg/+LZ/9soVNUmUNEkTM0iRsbC6rsULri+77YVLbMQIq24+Kuj2pek4pVt +5Eho40RHqUNmyTlGwDROuRwWhAjy+v/c7P+74v+l0f+Wyf9xq/9hk/5xufx+rfv5//rx//NKivPu +/+9pmO3p/+w8ceIlVeBOdtXS/9EvVs8fQsjH/MQdPsEaN7whO7mizJ6hz5uj1JpAmzlQuDVLtTJH +rx4jihEcjxAjmQ8bhAwkkwociwoIdALQ6//V6P/B4P+U1f+Qz/+Exv+Fw/92wf92wP+UvP7B0v2M +y/3K4Pynz/ltsfj1//f0//akxfVZm/WIt/KXtvI0cvJEgPBlou4hVO1HhusmXOhCfOVpjuIdR+FV +feAnW9va89k0Y9YdRdIeTtHQ481CY8wYOsgVNMYRP8Fzt7bA97Wr4Kmo9KMFDaC2/5wuco0mZoSC +y4CCz3lgw1BSqE5TxEpt5Uhs5UhMxD1f3Txa2Ttlyjljyis4vioojylEqyFBqxk6pBUishM0nhIh +sxGrObnnAAAAWHRSTlMACAQlMxwNsYcV/uXVxqp7dUY6Ny8h/vn05eXl5eTh4NfFwLWfd21rVEhF +Oy4g/v369/f19O7u7erp6eXi3tbT0s3Ix8LAv7y1rqOgmYaDgYBjYV1ZPicSJDmvaAAAAkRJREFU +OMtiGD6ATUdbUFBQW0cXJqAahiyt6+tkYbB+3br1JnKeIUwgEU0uFU4kBW59H7vfd73r6uru/rRZ +nZGBgUlpkbEGkgKr1x/yfv3Jy8v72te3iY8VaIDe+afKSEbIpK668fhlT0/Pm7Up29mZgQbMq+Iy +DEZSsH1VRMSdlJSU1NSUVKCCoJWHq9raXFnhCqRTV0dEZG/ZUgQEE9hZwxUW7a5qbeNSY4IrmLA6 +Ylb2xo2FQABUoNp6es+xla3NDswwBdzb1sw6np0MAgXb+EJl75ZFzmhsXtEcwARTsHXNidnZBQX5 +QLCJz+u+GFDBkhXLlyqwwBQAVNAxe25TEgjEbnWXXXK0LLLy5vLGxnscjBAFUr875s5vigWBmM1m ++lcmZ0RWLlja0FBvKwJV8LNjfnVTDAhs+Pag7iRQwYHLDfX1dbegRkj+6KyubvmeCwT9L65eK0nP +iNx/sS4rKytBXhiiYENnTU1LDhD0r7298MyO0ox9lXOyEoBgIcQI6/7OmtqWz729vV+eX1hwpCR9 +ytS9p6LBQB7sEcvER7W1yxKB4NX1szMnphXHxceXZwLBnHOXwEZ4v32ybPHi9vb2Zw+nR+2MSAOp +SJ8WBQLTeEHBCRinn4uchJG4uIS5zfTSiAiwEbsqKiqmlpfPVATbwcisFSjAzy+gruFvJ3Zo0qS4 +uPiS9NIpB+eZOvOLQkOTiZGNjY2RiVFETcWD15GHh8eeV1HZR0CLlQk9/TJyioqwCAsJCQmzMIuy +MTEMCgAAjRDhEHsnXm0AAAAASUVORK5CYII=} + +set _AP_IMG(change) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAA1VBMVEUAAAC8vLzb29vMzMz//7ZJ +bbb///8AmgABuAAAlAAAjQAAcADJzLDl6MmO3HyN2nxplVzv8tHQ0NDf4sS3t7e6vKP/vI9vmmBu +mmArKikkvR0knRshexjW1tbV1dXMzMzK2crE1MTExMTb3sDP0b7V2Lvk1rbe4rPLzrKusq7Dxqur +q6vAw6j8zKa1tqWenp7/wZfJtpbXtpW6sYr/t4fys4WFhYWCzoLEnn16enqI1neE0nS/t3JycnLA +rWZhYWFfil9bh1VVVVU7Ozs2NjYwMDABjgCxTjvzAAAABHRSTlMA/uvS2Z6hnwAAALJJREFUOMtj +oA5gxQHg8mw4ACtcAQtWQFsFTAQU6Dsx4ldg5urMiEeBuZSCraQLM04F/Bzs0or2lrK4FPBxsHNy +yWiKyGFXIAiW53YQEcLuBmErsLyjthAOX/CD5SX0lNDCAdV8CR4VeUwFCP0CWsLYg5rXGiKvo4wj +LtSlQPLiPLy4IkvXRtoNIY+pQM1AzE5GQFQVZ3QbiZmYGvPgSQ+SFoaiGoQTDP0VEM44hLMe5QAA +EaAXCDsBHCkAAAAASUVORK5CYII=} + +set _AP_IMG(clock) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAvVBMVEUAAACVpaaVpaaVpaaVpaaJ +mJlRWls4Pj6UpKUyNziVpaaUpKWMnJ2Fk5SDkZJhbGxIT1BJUVEoLC2Jl5hmcXJfampVXl+HlZZn +c3NjbW40SV6VpaZhcYC9w8eLm54sPlAzR1xYa3cxRlqfqK+FlZlzhYsxRFZ1h45AVGc7T2ItQFNt +Qkl3QUW/OSuGkp19jpR6jJJ7jJFre4ZPYG25v8SpsbdQYnNQYXNPYXN/W2E5S1u9v8Ktt7qtt7mA +QEJWCQoYAAAAGnRSTlMA++v2zJwpEO8M2NGim4lYJCIIkls2LpNcXLZUjyoAAAGSSURBVDjLbZPp +UsJAEIRnAwFUbgR1O9kcJAGicsvl8f6P5eSoHCTf3+6Z3uqtoZz2s97UhNCa+nObqrS6DWQ0uq07 ++WEiwKid7+8UGDF5KI0/AvCcmxVzczwAj4Ul0w6gDlYYuDbjBqF1UEBnms2z7gehKzPcMPDZ0Urz +ef/eSuXzObVYe05J3vHC86EtY06meZIxdugDkzhAQAWpLg3TNGTqCBREFNIFDq6sGqR7ALrcXwNe +IKsGJvDQaNMb4Nj1BtsBXqkHrGS9Qa4AnZpQhQL2prkv1KHQJA27POFynM+PhmMkLO0dNBJYyIz1 +3LLmPzATvuQCosbwWzZ0sMkN1+9ShNygEz0y098/r+v1ReZEj+wBy0z/kCWWgE4DwKjVGQMYxFXX +6gxXzR+uA0697kQJREMBxWX/VfSVghgS0we2soYt0KeI8RPgV3UfeBpTzEjjHau7/TyvjShlxg7l +lN6nWJ9RxohT4BnLtB/DA+/n+ZxxPzm9zWKxSU6vP6YyQ714vPqQqrQHveT8e4PC+f8DXolZFObY +9x8AAAAASUVORK5CYII=} + +set _AP_IMG(color) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC/VBMVEUAAAB/HQBgBwGFKxJ2EABY +AABpBwCAHACBHwB5GAmqQwBdAAFbAAByDABiAQCiQgWMMAZoEAizUgFhDAWEJAKNKQN+GABvDQBu +CABiAgGLJwCKJAB+GQCHIQBzDACLJQB6FwCZNQBgAAB4FQCwSgCJKQGeOAB9GABdAgOVMABYAAC0 +SgCzSwCXLwDAUgCIIgBcAAC6TwBYAABqCAD/z2n/y2X/x17/1nL/2Xf/0Wz/zmf/yWH/xFv/1HD/ +zVz/wVj/44P/3Hn/zmH+wFH/vVH/xFD/+cb/3nz/0m3/yV/wslLjn0w/lf//zWT/ymL/ylj/zFLp +qVH/zEf2vEC+iCarbiCaUxp7Ig+MNQ36AABYgtD/9b7/8rT/6JP/6Yn61Xj/33X/1m3/w1j/xlf+ +yFP3vUnhmUXRmyvUjCvaniKnYRyIMhUnsgUdmgDjAADLAABTsP9FnP84h/3++uL149QycNTv2bXk +ybD86qvw1KPfvpnsypTYr5HmvYbZuIL63H7ryGrRoGfyvF7eoluxeFb/11X+zk/dsk/VlE/qt0a+ +gUbxtEXmpUXYj0PupEH6sEDCj0CuYz/gnzz/6DnOfDfqtTTLdTPLazDZfy//9S7Ljyy8fCpxmyaT +dSW4gSSyeSS8VSKcXByQSBuuMhiPOhaXRgvrAAC6AABDrf9QoP8pjP8mb+Q9it///d5VhtBqhsT/ +/L6BjrD/7a5oeqzfuquBhqpAYKpWbab/8KH/3IbaxIa7m3nwynLkw2/muG7zxmqZd2rUrGn+4mW/ +imX30FvNkFLJnFHUuE//v0nHrkj0r0b/tUX/3ET9v0PZmkD/2j/4zDrIiDnqmzeubzfwtjbirjbx +ujWXhzOxhjP65TGeVDEbzzDZpzCdjS/LZC36vSz/0ys0sSuYSStEkyeVeCf23CTeiCLWTCI0xSG4 +RyAgwR7MQx71yB3McxmTSBa1aBUciRNOgxGuJRGUHxAcog3WlA2yFwu0EQhDewYRqAPZAwGaAgH/ +AADUAACnAAA2a66/AAAANHRSTlMAFM31oYdZMgrov7OSaEH49vTx29XU0cm+rayclYJ9YVFGOCIh +6NfEv7WglZCIeW9uaU8nmaY9awAAAqVJREFUOMtioDZgVDLg4WZiYpJkNWLEIs3HI84cNjs9MzPz +6/twJjZ0zWwSzJfbj7S2BrQFBaWmpmaE8yBLc/CK32qMT3Ays3dx9tq9NSpq48HuJVoccHl2iUd1 +sQnH58y565Xstb6oyMencJ2XczYrTF6B83CFg+fJh69ycj/2BJau8ilcWRDlHXBOUAkiDxAvc1WM +SZL949svcnJ+znVu2bbap2DF5n5n10UQI9iyyyrMPK1Mrn/4kpv746KZa3/X9jWlB064uM7WAMkr +c9bUTkoLDGwynTD3yQ1vGxv75JS+o72nnV1cZwmDFLBM3Pf05oXgU2lNiVampr6eNkn2yXYBAf4u +UAXszFsmzZx8PiilzzvRxMrUz8zMxs7r3uvnM4AmhDABFci1lGTMnHwm6NK0/eaWJiam1mZO3p+W +50X+mu5/NpQbZENNyds3D+4/m7LH0dzWA2iGtdPi/GWRkcu+91wD+0Ks3M172owpHfUOjhbmtpYm +pn5Oi/P+ROb9/bfgjiAfWAFg0Ynx8fVxDu7u7iAVVn5Oad/y85f//pyRBbKBQb3KzcTC3SEubkes +u6MFyAhPp8DpLxf0dqeH84F92bjWw8LBYe+xuuJYoCWWIGfa2fn7200Nk4SE88TinQkNE7KEhKqj +gQo8QAps7O2TroRyGoMVKKuWubVn8euo6DW7gU3wBSmwCZ4XDksxLF27wtQUGRgMm93AjgSZYBYc +ki0HTwsCSzVVgLR2bbQ50AYrYFgC5ZfIIFKTgiw45XBVxnjYgtxo7Tl1fgRcHpHouCo3mQDlTU3t +roZGyDJgAq7qGF9gSFulpC8U0MeWJ3Q7Ntj6mth1znsnqog107DzNxxq6wxZGCHNiCNbSS2dHxoW +ISqPO99Ji4hIyTNSOzsDALcj5cgYpydlAAAAAElFTkSuQmCC} + +set _AP_IMG(config) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACRlBMVEUAAAAAAAAlJSslJSoMDAwH +BwgAAAAAAAB0dIJpaXKDg5WSkqhRUVWHh5+Cgpc0NDaFhZwWFhYZGRmHh54GBgZ9fZF+fpF5eYht +bXlubn10dIOFhZtxcYJra3ZLS09nZ3RGRkiJiaI4ODs7O0JmZnAkJCMyMjYlJSl8fJB/f5MxMTQT +ExSGhp1mZnAEBARnZ3ACAgEBAQFycn2FhZlmZm2Vlax+fo2JiZ58fJJjY2xcXGKSkqlqanljY2x+ +fo6Li6NnZ3V/f5RVVVxqanyEhJhWVmJ6eo5OTlh5eYlpaXZLS1V5eYs8PEBsbHc+PkV8fI9jY208 +PENqanVHR094eIpBQUc7O0EhISF1dYZAQEhmZnFjY20mJisfHyKJiaIVFRURERB3d4cQEA+Li6Jb +W11+fpFXV1kCAgJmZnAAAAD////h4eze3uri4u3t7fb6+v/29vzk5O/v7/fr6/Pm5vDZ2ebJydn0 +9Pvp6fPn5/La2ufPz9/JydzAwNSbm7D4+P7y8vno6PLf3+vc3OnU1OLMzN3Ly9zFxdjBwda1tcy3 +t8qsrML9/f/X1+XFxda/v9K0tMqyssb8/P/w8Pjs7PXR0eHHx9e8vNC4uM65uc2zs8evr8alpbuh +obaVlaqRkaaLi5309Prz8/rr6/XV1eTHx9q5udC9vc27u8upqcGvr8Cnp76pqbqYmKyOjqGGhph3 +d4P4+PzY2OTExNS+vs23t8yzs8ixscOiorienrOUlKuTk6Z+fox8fIugoLeiorKZma5ubnkHkVSb +AAAAanRSTlMACgMGRC8ZFf7+/Prlureygm9dRj0eFP727+zi39fX0tHBrpaQj4x9emROTjYqKSIi +E/77+/n39vb08+zp6ejg4N/d18rJyMC5t7Szs66opZyZl5aSj4+Fg4N6eHVwbGJgVlZSNSUhHhQO +GLTrZwAAArRJREFUOMuVkkVbW0EUhifEcHd3L4W6u7u7e3Ml7u4GEUJccZfiWvlnvfdSskjZ8C5m +873nnGfODNgjH89mZOcV7Bq9qcnDzgyLwBk+mf1/3F4Tkqe1gPY0hMFgyi6SEvPsw3aUqVvPLAv+ +YDAYQ+XfE/K8dZOQpWRqbRIuA4N/rBV8br5bGM+TMsbNiFDIYnYzCPoX0q4cnQjdjAsFUYfT6BrA +muwoiEfEQCPP4kbmpMOGqgaESiYTU3bQxN4TaWHmpfNRM5vDcQm5OoFHCrH+CSxrVRIuNCtsekEP +l4uqYK/F77XbBVwiVy2lvibhDcqsErFYrBahyHJI8XvVKfcQRrf8YCMdYLREAloIYfPUqCD1RtOr +++cifoMO34aupAPgPFIE3DBuiJYu08gAfK2b9UtFmIDO1u3DhWthh9kr1SBsseVqElHyJCpgY0Lv +/NSR25hyZnzEZx6RQIjYdqqLEMjlTt72ZXnRxwBcn10Nmn1SCGJrN54DgnoFt7eXWOlME7bntjul +kyMyGIbYstQXZCzfXzXBYjJxQ7yVS1Q8nDbyJVoY4ulnKupf3iuZ4rJYSiWi4RmK84mnKLX29Gwb +0MLUrwkpZ0AlVKoFsuGfFzpx4UFk2YAb2BREPTjI4aAcV3+fXG40z+WQ8JFF1pWAVGeQu2ENsTFR +H8pRuSaTk+dqaQDjW8Wac2XU5HVYbHzcEItwg8U/8LSNSgY41OKQRe4L+scsbmwKxB/Sz/ehqsHw +LbBD7ua4oih5LWB3a2ENf3h4dEynho2xLHLcaDxd+za3csakH5LABrtjbHFRqg+n5yeBOFQaCbRu +moxGmX76T8r0qMekOJST+Pc/zZlkMkMwJedD+oZ1q/odDSTwJSWmsPpiWXTQUX2igYrVJ0JpyKo8 +TkymU+jYuQukTgqlC+yRv/PzGOg3rqHVAAAAAElFTkSuQmCC} + +set _AP_IMG(copy) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABaFBMVEUAAAAdVo0SVZsZSXwTSYUS +VJk6b6MALmIHOXQSSIUHQH0ALmEAKV4AMGQAMWQTWJwUSoc1aqERQngVRHgSVZoQUJMMQn8CNWoY +UIgCNW0cT4MRRHsAJFsAJVsAKl7////f7//9///s9v/u9//W7P/V6v/a7f/w+P/7/v/z+f/o9P/3 ++//q9f/h8P/n8v/1+//l8//b7v/S6f/i8f/Y7P/Q6P8qZZ/k8f/y+f/d7v/U4/HN5/+3xdL5/f/4 +//+u2/+UrMNIdaHj8v/R7P/K5v+Lp8Ko2f/t/P+33/+y3f+r2v/C4fq11OxNe6VLd6Tz///p+f/t +9//i9v/p9f/n9P/c8f/Y8P/W7v+k1v+73fp9qdWQqcJHdKHw/P/m+P+v1/u22vqy2fro7vKCrtlC +bJi+6P+s1vqh0fdzt/PW5PKqz/DF3O7L3u2KuN28yti3xNN4pcybrsNVhbNOfKo/cqI2aJkbWZQz +YZGT+K7zAAAAH3RSTlMA5+zt6entfO3p21s+gQTv7ezs6unp6eni39LKmzAtuJRGQgAAAeRJREFU +OMutkGd70lAcRyOildG698i6CQlNaEIgw9gkBQoWRbpoRaid7r2/vv97b3NbHvvO/t7Ak3POzeBO +aTNTt86cuLtFKhR+IFM4tsC2bRUhNHh/hwrT+/w/E7X5WXH1PBWmXkwwDdic7pdkfeMkQWRc8icF +dnTKpdJmKuwfP2H2kBvGCggzD4rF+/e+f36U7sueqFNerkjNy9z0n94z2ALZeDxe+HWwp5Uot+TH +Ge7qR15k06Io6h9842XKPQmEs+8m3nzOj3oJj3nZapgGFh4yDM8GR2/1EhH3Fc8RylQ44j6knV6i +kd4xhfWlVGC9UVn+mUS0F2wrFRhfs6xVN4kqpA/URiqI82nveURwcK/WnJgKR33DNAdu0vdIryKB +CIyXyY0H7qhPe6QEVMBvjzn0cH3DHW2ZhCPF7hKB9fjc2qY76gSkV6o1Kuh6aQV6D3dIabqLHdpX +67V2hrvygfdl2Uh7BQvLtK+HCggXnpIvbzm4xxUWgFeBh8pzLIgS64HXQ3fxJe3DVpUImrEOfUD7 +sNUCAXr8r1UnAg+PuEYcFSFyi46q0jNQ+yJ3+1PzCWw4HO7s7O5uv95+8/vrq6U4jrvddjt+m+cK ++UvZXDaXy5LBz42b16+dO1wmX+D+e38B1SqUt7aPlW0AAAAASUVORK5CYII=} + +set _AP_IMG(cut) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACmlBMVEUAAAArKionKSkmKyswGBgk +JCQnJiYqLS0mLi5nJCQmKysrICArKysnJSUmKyu6BgaRkZG5OTl1JCRKSkpnFBRjFRVZGBhOGBhJ +IyM9PT03ODg5OTlFHBw1FhY9Gxs6Hh40NDQvLy8xHR0wHBwfFhYmHx8sHR0dExMoKSkmJiYlISEh +HR0pLCzDT09iNja2TU2vBAStRESfjIxZWVmBgYGWLy+XHR2oLCyxSkpTU1OiJCSXRUWEhIRiYmKD +g4OICQlycnJlZWWFIiJwcHBdXV1sFhZ4eHhjY2Nzc3OCNjaPEBBgYGCJGxt4GRljJSVzFxdOTk56 +MTFkZGR3Ly9QUFBXV1dAQEBqLS1vExNcJCRfX19pEhJPT09DQ0NKSkpjFxdaHBxHGBhHGRk2NjZD +GRk7OztLS0s3NzcmGxszMzMsLCwvJiYnJycwFBQsNDQlKirU1NSzs7PNzc25ubmbm5v9/f3e3t7a +2trS2trGxsbBwcG9vb3/mZn/Ozv9Dw//BQX/AADu7u7p6enX19fIyMi3t7e1tbWxsbGwsLCjo6P/ +h4f/hoaEhISAf3//e3v6cnJxcXH/YGD/WlpaWlqyTU34Skr/NTXEMjK4LCz/GBjGERHQDAz////6 ++vr5+fn29vb19fXx8fHg6Ojj4+PV1dXKz8/EzMy9w8PbwMC/v7/Vubm3srKpqamfn5+VlZWUlJSo +kZH/j4+MjIyKior/g4P5eXn/dHR0dHT/cXGTb2/raGhoaGj/ZmbkZmbXZmb1ZWXtZWX6WFjaWFiz +VVXmUFDlTk62Tk7zS0vXSUmzR0fnRkaYOTnuODjiODj4Nzf/MDDmLy+ILi7vLCz4KCjgJCT/Hx/o +Hh7AHByoGBjKFhbZBATxAgLTAADIAAB2tKRnAAAAcHRSTlMABRkPdFBEDAfDaV1JOCL9+/vXzMzF +vaikop2VjImFe3ltamNcSz0sJxwWFAn+/v38+/r6+fn5+PXz8O/t7evq5+bl4+Pj4eDd2tnW1NPP +z87OzMvKwsC/vby7u7m5rq2spaOgn56XhIJgYFhANDAlQLPO/QAAAdFJREFUOMtioA3QUggNY8Ij +z+tdUCCJRz7HpnSOACtueXXnufOahRlxyjPGLJxfVqKI2wCu6tLyIkfcTtR0KF1c0CGF24D0gsYl +BSZsMC6GU/jcFpQXVAmD2Uy8mWmp6AoUq5qaC9ZzMTCzKcR5CBS3SsOCTi2XA0RzBDWVFbQYJ0fZ +lbRXFhW1uPOBpXXkPXUNJdiBLNaSxvKCzt3FlZVV1cUr22x5wPIafnuPXjh/VoJBW1yvoqygaMKm +6sL2wuK2zbEaYHlmzq2CsrL8M61UwqfvrOhd2zp5TWFhYWdPSJYOxH7AWPb1izMwiDRcO338+uql +E9b1bO8o6XWR5IH7kLP7gAwDg2h93bTZFysWLVs+2TJAmkcTyWdCXX1C6irmdQ0GclxGK1ZtkNJG +87rcoa5d1ha1t+25GZQEp15xzUMPG2axI3sm1s4W42NgOdl3SjQfM/iZZJzM/JXYGVj0t0y8kYE1 +htiZOIC+ObZxx6TaWYnsOKKRe0rN/hkzzly9I49dnjmwpl9ElS3yUkME9tSmdrjmhDIwMqbXx+NI +6lO6D/pys3Je5s/GYUXwtknnbs6qu5WCK62pmk6dNrP+bhIHztTIluDjFa3MyEB1AABQR4h7H+9S +lQAAAABJRU5ErkJggg==} + +set _AP_IMG(date) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC91BMVEUAAAA1NTULCwsAAAAGBgUC +AgIbGRgCAgIBAQFfX3BlZWU7Ni8kIBc5NzUHBgUEBARnZ3NsbHYMDAsKCgkAAABCPjlKSUhiYWFW +VVUsKCAvLCh8fIU7OTgWFA8RDwsNDApiYmI7ODQXFhMDAgIUExNfX3IyMCwFBQQtKyYAAABERlR4 +eINiaGs/Qk5kZ2lHRUN2dYWOjo5NT1x0c3JycXB2dnYyMC5+fZFycHBDQD9ubn5BQD5tbGswLSlP +Skh4eHhkZHV2dnYrJyVSUU5XVlRsbGxMSUQjISBDQDpuboFycXAEBQN4d3ccHBw7OjkCAgJBPzwA +AAD2+//7/v/6/P/0+//////4+//4///z+v/5///9///2/v/7///0///4/f/x/v/19/j/j5D7/P3y +9PTw8fLT1df+m5vo9//a8/+b2P/77+/739/e3t7O0NH5zM3+xsf+rK2ChIj/gYH/aWne8//P8f/I +6/+45f+n3v+L0P9Fkf9quv7y+/35+Pnq8fT38PLp6+vl5uj65uf90tP50NKdrLn/sK+nqq3/qamV +laOJi5V/h5CMjY7/d3hGS17p/P/u+f/j9v/M7v+/6P92xv9itP9Yn/84h/8ugP8gef+w4v6U1P5X +pv5Pmf58wftmq/v38/a12/ZjpvY9hvXj7vHs7e3K2uDX2NzDzdT9ycnAxcc0ZMb7v8EmV7uzt7n9 +uLj/tLWmr7T/p6j7pKX/oaGWmJyQkJx0ipn+lZVIX5T/jIz+iYk8UIVHUm7/bm1SWWzR7v+Dx/84 +kf+Cy/4Wbf7g8fvy+frT7vptsfrq9fmezPmEu/l0tvg1evX68/QhavQNXfPM4vIscu716uzi4+y5 +2epHjen65+j35+je3+gZYei81eb14+SJrtzMz9vG1NqhvNq3x9hGdtZvmdNAb9IdXtGTu9D9zMy8 +wcmYtsivtsRUgMT/wcL4vL+JmrU9aLR0irCrrq6doaudoKtedqRLZZ9edJZBWJBzeYtmb4Rmdn9Z +ZX9IfpK0AAAAUnRSTlMABRomEg2QRzgV7u3MsnFQTjwxIArz6Obd1tHOv7GmmpaFfXxlYFtYRiv+ +/f37+ff28e7n5OLg3d3X0s/Oyca+u7Sxr6qhoJ+Ylo+DenhtamNChV3GowAAAtlJREFUOMttk1VU +22AAhYtuYxs+YIMNho65u7tLPDVaWiju7u7u7u7uNnd3d3fXhyWHww8du4/5vpOb5OZniGfcOIaE +0m7NLdLgihhVMlimqbNuQb1drL7EaKqouLJ9VntURAUfwz5NlPwHG+xYHxXt1PbFzrwCwwRl1Rpj +xbnS/KiYts8v/e/z/YKChIF2pU57RnRIKO5cEt302t//FmZmG2hmLsQwZsTIjg2x9eWnWFcFfPMy +obkZhrFgFqtSfcywsOgBB8P4doH8QUoHK3XSVQXC4kqebZCZLZ+FcZiwQMDhwDCL16SlAoTV1cds +hSwMhjmC4BAHhxfWlMEsl1MAgk6EJcFCEIRp7RAe7ugY2WjNhDmuTrKgY0bsJQuY5o3hb21sGiJb +Q5gIwgvTkhoSJJc/sqSF81VVfgRxo1nkQAnEHTkj0LE5zB1FcNyEDhHcKrIhcJxzIkZWZkjYG12U +BEM4FRO/kObOyGDCBIcTwlYNd8g9dIMhOoRNtykVxwACJ67N1Qcdm957JCK0wC6sDbUX9Tg3sCHE +LWYb+Cv2/zxtSQu0wubeNHXuLmQjCa9WgElV1O+l4BA6GLavKM45gA2ZFM2WB5Nu/WhlgdOUSyXU +ub+FjaKwW8dGMKnhrzPJMEmiwlp7e8c4l54rXJLEec/VwKTSGk88IZTk2rv0u7jEtQRwSQjBedm/ +hz/F9q+HXHGSF9ppKnp315eNQIkHs628OtZIgT0Gij1wkuT5HkcJJmTh7pmTf7Yg/fsU8B4ya994 +WUAkdWc0yd3TK/9kcZ53yeM/wwJjeldaMoagrilWR3wK0r0zzj39NjBvqbYxEJQXXrey9MhJ9cnN +y8i8XNPVN2ny1F1GyqoMkIkffFLTcr0zsy7U/IinqJ6CsqTY8TLsKzmcdfR2XW/8+AnT9BSMpYco +mFTt2cW63pkUlR8jJUbBY8bPGT9Bm6IyjP9HRVd234HR9C+AcRex7f0pngAAAABJRU5ErkJggg==} + +set _AP_IMG(delete) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABy1BMVEUAAAAWYKsnYJkNVp8aU4wC +RowuZ58VYq4ISo0AL2ApYpwnYZowaaEPWKEoZJ8DSI4FRYYHR4kVS4MYTIMRRn4AO3kLP3YAMGIA +LmD0urri9v/Q6f6p2f//UFC44P+v3P+s2f+i1f+e0//qAgLvAADg9f/b8//S7f/B5f+94/+z3v+t +3P+m1//O6P6m1f7Vys//mZnATE/3R0W3QULNOjzXNDS7MzToMTH/KyvfJSXeGxrXEhHlCQnPAQHh +AADcAADXAADe8v+k0/7/2NjbzdDXvsL/v7//uLjHqbP/kZHFg43/d3fFdXf/c3P/b2/IYWe8WVv2 +T0/AOj2/NTjHNTfILi+/LC2+JyfkJCTIHyHRBATmAwPzAADjAADp+v/a8f/T7f/W7P/L7P/K6P+y +2f5xufmn0vVvsu2axenX1dnfz9LPv8zPw8rRv8b/w8PSucHKtMHQub7/s7PSpanSp6f6m5v/lJTB +Zmj6Z2b1YmHzYGDFVFq1TU7/S0vxQkLbQkK7P0HuQEDHP0DDPkDSPj+5PD/hPj7sPT3wNTXCNTXt +NDPgMjLSLi7/Kiv1JyfWJSXEJSXrIiLbIB/wGhrUFxflExPqDQ3RDQ37AADuHNeNAAAAGXRSTlMA +6ebZz8/Z7dE06urb29nSyMXDvrayq0YnWAYHIwAAAW9JREFUOMtioAqQEOFmwgK4hDihCsQy4qSQ +gaqqo6OaWrxqmjBUAUuiJFagxgNTII1dQQIbAQXqJCsogckUZ2FVYDbdECJfbtrkCqKT+VAUhFU5 +txmDGAH1zqUmIBXyzMgKfJTd89y7jYHypkVubpX+GAokJ/R5GhhYGtf0exqUVZjkA0UUUBVIhk/2 +8/adNAVIBIYWSqIpgKiYVisLAh2huZJYFUia2VhYWPRODNOHcGUwFADW4BBtYzPVKjgTh4Igu1gH +2yhry4gQiBE6cAW6YH6nsrKdva2ttaV5l0kOFgUhKirRsQ5mrVER5o1GLdkYCnxUZqgo2wdLShpa +m7cHGoECShGmgCMFyHOJjImxCwIZZWhVZ2TqgayAVQ8krh9p3wxxbLVVD1AeQ4Gkixcsur0KwJQS +qgJMgFDgRKkCfhnsChR5oQpE05M0NDQ0NTXlgEBLS0teXltbQUZGO1UQqoBTgJ0RC2DnEKdKzgYA +1CxrXm7p0xAAAAAASUVORK5CYII=} + +set _AP_IMG(diagram) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC6FBMVEUAAABs2QAz0wAA0wAAywAA +sQAAqQBMmQAmnQBEGwBukwCn3wBKNwCMkwBOAABRAACTkQBMSgBSbwBnAACWbQCalwB/OQAAkgBE +SQA2SQAAywAApgAAmABISgAAigA/fwC6vQBfYgAA2QBnawBqUABrNABsAACe0wBnzwAA1QBoTwBp +MwBqAAC5wwDJyQAA0QDPnADRZgCczwBlMgBYsgBhYQCItgAAxgAArwBhSQBiMABjAAAqrQAArAAp +qwCrrwAArwCuggCvVQBXAAAAnwBLlwBKOABLJQBMAAA/LwAApgBRPQBSKABSAAA1QAAAjwB/fAA5 +FwBHjwAAjAB1ewAghAAAhQBbeQAfgQBfLwBkSgAAcwAkLAA6cgAClgBFAACBggBEAAA6AAA02QBQ +bABlZQBcYwDV1QDK1QBq1QAz1QBcuQAwxwBGXgDR0QDH0QAz0QBatgCLugArtADDzQBmzQAyzQC0 +vgAAtQBlZQBlTQBjSwAAvwAAsgArsQC8xgCUxgBjxgAwxgCutwBdXQBVqgCCrgAAqACDrwBXrwCm +pgCZoQBGNACLiQBymQAlmQA4TABBRgBCQABBgwAopgCdnQCRmAAjkQCEiwCmpgCdpgB8pgBSpgB+ +XAAffwAAgABoiwA+LgAjkwAhiQAuPgA/PQBqLwBBgwAAewBdfAA8LAA4FwA9OwByeQCsuQA2FgAA +wAAAvgCOvQBevQAuvQBoUwBhAwBfAABudQAAeQCAsQBSrwA8eQBXdAAAagBraQAiiAAlrAAArQAu +IgAvLgBYJwAAZgAxJAAAqQApEQABeQBMZQAsEgAeeAA0ZwAbagBIYAAccQBGMQBBFwBJigBphwAm +jABDAAA6AABKAAAA/wB/AAB+PgB//wA+/wDy/wC//wDf6wB+YAB7XgDy8gD//wB+fgD/fAB3dwD/ +vwD6uwB2fwBefwBsdQAA7wB1WQB2OgB3AADj7wCz7wB37wA67wDk5ADR3ADiLyFgAAAA2nRSTlMA +9+/v59LKvLrGvPbOxI+PzMz1687MxsXEvOvTysm5sa6d9/f39/f08vHx8fHw7+3t7evp5eXk4eHh +4eHe3NLQ0NDQ0MvKycnJx8TEw8PCwMDAvr25tLKura2ro5qWjYqJhHL39/f38fHx8fHw8O3t7evq +6unp6enp6enp6OTk4eHh4eHh29rY0NDQ0M7NysnJycjFxMTExMTDw8PDwL++vbu6ubm5ubi4tLS0 +s7Kurq2tra2tra2trKupqaempqalpKOjoqKgn56enJqamZeVkpCMh4GBgH5uYU6g+PUAAAINSURB +VDjLjc1VV1VhGEVhsEEFFfUocfAICqIgIiAoIQooBl0SInZ3d3d3d3d3d3d3YAe2t67JHzjMi2e8 +Y4819mdhvoc2trY2WQ8wOxtbZ+Vpg480aP5E1aiHdnbYsCo2/oEHzA32a3DVSsXtwC3ry6tzcdyX +rOiOBs2equp1sXat96pBFe5G37FFfgYXSqiozbhqWVmVFsV9Zire1qDpa+URiIO9P6owV+7IXExj +8EZ5BOIQ708qzJU7Mhf3aWAqpWK3llbrYsupE7O5z07jeysNFr1VHfzeqUHduUNduJ1yuCtpMC9H +eY39oPy8uCe343b6y83AVFIlHsRtiWiKrqAyFnLzxOIXquMI7NsDQ10+K6ef3Pxh/ivlOQYHeOKU +9l/VrH/c2zW4aa02HcOUFLyytqLKWMl9T4MlL5XbSPTxwYltv6iZv7h3a2BdXPUej/7+OL1bGRXt +xn1Yg8yiyvlons6YuQGvx+NdDZY+U51GYT93nGSJEb9xjwbxlqrXOPT1xYguOMcdj2hwq5hKOomp +qXgtCW+sxvsazH2uOo/G/j0xpA3O+IN7NVhTQA0PwaAgXNAHl3fFUxpcLqJiktGYgOkGPB+OLTVo +8lhVq4P2NbF+ZXT8hrs0MBZUwxwwOAANA3GFPZ7WIL2wMhgxxoCHHPG4A5p9YqcGyYVUcDg6TMCE +ANw4FC9amO0/JLKNRScHM54AAAAASUVORK5CYII=} + +set _AP_IMG(double) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC/VBMVEUAAAAAAAAPHDUAJ2sXGi4I +LmsXPaAEK2sAAAAAAEQAPLMGNqRGTpY+S5UwQ5UnP5UNIk0SKlUDES8AAAAAAB0AProAOq0COKkh +PZc3R5UIIlIKEGkDB2cAAAAAAAAAAAAMPasJNqIZN5kRNXwBScJQVZggR6kAO64YNZcTL2cdRqkS +PqhDRZAMLWcAKG0JJloOGncPFmoOGnIDECwWFCoACRwLFnUABhQAH1oAAQYAAAACBWIFBB4AAAAA +AAD////7+/z9/f7///re5vbv7/SduOr9/f3/+/fz8/bq6vD5+fv4+Pv39/r19fghefTu7vLn5+2c +uOrs5edokt0VVMMcVL7///z29vn89/T69PL/9vD38u/37+1you307uzx6+p5pOlxn+jb2+WguOTl +3+Nsld38/P0lgPgwh/fy8vby8vX//PQxgvMrffLs7PF8qe14p+3M1uzl5OuArOvg4OnM1OmmvumF +q+l0ounl4uhnmehIiugAVOfI0OakvOZgk+bCzOXh3uQAXeQGYuO/yeLa2eGas+F5nuBRiOBymd5w +ltwAUtsJX9qMp9geXckkX8ab1P+Ex/94v/9tuf9Wr/85mv9SpP4rivz///c7j/crhPc7i/b++fVJ +mvXx8fTm6vQUb/Q4hvMZcvNEjvDt6u7N1+7r6OxuoOzi4uvv6urp5urv6OZkluZYj+ZPjuUAWORJ +h+MPZ+P06eLe3OK6x+FWjOG2w991m99ejt+Urd2zwNwAVtsBWtqvvNmIpNaDn9J+mtAYXMwtZ8kQ +T8IQR7at5P+j2f+Szv+My/9ltP9fsf9Vqv8wj/8IbPz29vpEkvhCkvdAkPc1ivczifcpgfVVnfQS +a/Onx/FSmvCPtu/68u08hu0meexDiOuqwepelepAfuUoduXn4eQzdeQgcuTX1+NEhON9ouJumeKS +reEgb+DJzd+fst4zed4dbN4AT94RZNsATtufstoYaNq9xNmquNeEodWGodSkstM5dNGbq9AaYdB3 +k8sVV8kLRrmL0t1XAAAAP3RSTlMAO6rSqtPi0iwF4eHh1dXVxsOoKAni4eHX1ch/ejUjH/Xw6Ojn +5ePh4N7c2tbVy8e0s7Gvm5mXj3huU01HQxX1oA1hAAACe0lEQVQ4y2IYbMBMQoKfn5+Pj09SkpeX +l4eHR1XHBlmeU23K6SmnTk6ePGnSxIknjk+YcOzodRMUBVrT/dLT02fNysi4fGn2zJkXL8wtZkGx +Qvt+cqArFAQCgWt5KkKBjIGRocJNJ6cweyTgglDAqTRt2tWQcncPHy8HN0eYAudguAIRtqnTrxwu +nzPPN9zbIc3REUMBA9vdF8GHiyNc5nmAVMAU7IAosJaWkVbMd4rqT4jMc8mCqHBEVqAx98a6IxXu +/v0J0Z7+LlkIdzhvZYIYP/VMxr9E9yX9CXEBQBWZvue8wSoQCm6v7TiSGLGsr2LlCpAKD1+oGc4d +EAUAcRc7xYRWRa7qqwgqKQrwzHPJhKhAKMh3WhJaFV3ZlxiUBFLhD1Vh77wBpsB9WWhVTOXBxJSn +SSVAW6B+gSsQL5izKnRNXOPBhE0pQavj46IjI9zdQaE+/xlMQURRSP3K1t+Pu4KDU1O7ujo7t29v +b29/3rkYokCsILIypD5o86H3H7u7u3fv3rOnp6fnw+d3rx6+FYIoiI1uDKlPSfry4+vevbt2bdu2 +ZUtLw6efmsZCQpZgBeqxcZtD1mxKiY+JisqeAY3y+dWCtvLydmAFgHHFxrf+ffBmZ1tbW3Jycl1d +XVlZ2b2X1YLCsJjkWh7UGlpTU7N+fVNTU3Nz88aNT+7k5iwW4EAoeJT068+BA/v3f9+3r7e3d+e3 +Q8pS+lLmcjAForGrG+NjbkVlZ8+A2O+wTsBKVlZYBK5g7euWloba2trS0tLCwsKlSxvA9iOAytlr +CxYsWuQHBLm5OTkLF84+D7IfASz0mCGAHQhYQUDXVA4lx3AwogMOmP0AD/IOn8BQ0ekAAAAASUVO +RK5CYII=} + +set _AP_IMG(down) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACalBMVEUAAAAALZYAMJgAJpMAKZQJ +MZkALpcALpcAM5kZP58DL5cALZYAJ5QBKZUAMJgAJJIAKJQAJ5QAKZUAKJQAK5YALJYALJYAL5cA +MZgAM5kAM5kPNpoAJZMALZYAKpUAMpkAJJEAM5kAKpUAJ5MAM5gAIZAAK5UAKJQALpcAL5cAM5kA +M5kAMpgAM5oANJmvv97////w8/j9+fb///stcs5Rc7kRTrAwUqj++/n28vLX3u3v6+vo5egxeNMo +bMkgYb8cW7sUPZ4TPJ7+/f369vPb4/BHlezS1+Xg3eMxf9yktNcyfNesudZaeLoAPqgWPp50uv61 +2PtKpPv7+vr39vj/+/fz9Pbp6vHw7/BAlvBKm+/y7e3x7ezU3Ow/kuvq5upmperv6ent5+jY3ejS +2eh0qudCj+Y7jebm4eW2xuPHz+I9iuI3h+Hb2OC0w+DW1N7Ayt5Eit45hN0/hdk2ftiGotKQpc82 +ds6HncpWhMklZ8QlZsRphsFkgr9FcLwRVLhKbbYZVrYRULRCZLE5Xq4xVakFQakjSaQSPp4PMplH +pf/7/P7F4fz6+fl0tviy0/f39vVwsfVOofVHnfVGnfXe5/Stz/Tt7/Pj6fOxz/Ly7vF8tPBsrPCL +ue12ru3a4OvP2evi5OpMlefm4ubP1uUsg+VknuRinuTc2uJJkOLI0eE0heHT09/Dy9+4w9usu9uZ +s9stfNvAxtmwvtk2ftenuNY8f9WfsNQtddIpc9GerdCYqM4qcM2CmcgkacgpacVSfcQbYMJjhMAd +Xr9cfr5eersaVrYYVbUjVrEMSq89WqwMR6ssTaYELpetzveLAAAAL3RSTlMA7D6HZf08Mwb+9PHr +6d3QqJqUg3ZwYFQwFgz75NfTzse/uq6loH9mXFIqJSAYAWo8PRQAAAG+SURBVDjLYhhUQFuemxEK +uPmYsChgaV+fpw8BeS3MWBSot3YbAIExEBj4YlPAYm7o3BMY2D9tZriRKS4FAV1BUyLdXENxKQgO +CJoUFbfIFacJvX2To9zSV1phVyBmbhgyMdItLacQqEAYRUqKjYmJiZ35jGHInLi0bM/iFJcGVXag +EJskVIFKh7+Tk1PnqbCwhPTsIu9t7i5HOx2BoEMRqkCpwdUqNjZl/oSIhJyikh3lS6KTs1ZlrU2u +lYMqYOPKNLAItjCynLXcs8R2T7l7vI2Nxwobd04xmCMAE26fYTF19rzU1EJvWxO7/ZWVB+p8POKb +BTjgrlSodbacu3S1J0i+2r6+ya9uTUyFjA7CH+y8XsbhyzZuAcs7NJ48sSmpQFoT2aci/lahC4p3 +mthV2TscMzu9K2NhqyBKUHAot0y3zDTZB5RvNGvb62Htyy+JGo66/DUW0RsOHnY4buZXkxtTwSOB +HtISPGVGNqX1TWZ+R/KtfVjFMeNC46yXy+JSs7ZD+YkFTmrYEqUo63bLDK/dudbrOIX0sCZbEday +iMQkax9/QQ4cCVuct3nrZl8uUdxJX0tIlk+AiWGwAQArb4QbA8NkNAAAAABJRU5ErkJggg==} + +set _AP_IMG(download) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABtlBMVEUAAADDAADLAAC5AADzAAGO +OSWkAQDYAACQOCWyAgC4AADqAAKNMh+KKxjHAwfcAATuAALNAAKFKBKPNSKMMBuIKBSSNybnAAWK +FQZ7EwB9IQiHCwCNNiGKFQOONiOfEQi1BQKvMTP/GTHlGSm1GR/XFB7KEhvZCxKxFxe2DAmNDgST +JhisCQCXCQCQKxyjBgChBACNCgCLCAB4DgB7EwByDwCNCgCBCgB6FQCIJBGPCwB/DwCJDgCLDgCB +DwCQDQCiCQCJFQN3HQJ2EwCdCwClAACIFAWKJxWeCgL/AAnFRFT/AAvEPU/COErAMUXALUHDOEzB +NEfhAAb/AAXkAAXEQFK+Jjr6AAXPYnDMWWi+Kz69Kj69Jzq8Izi8Ize6IDS8HzPAGjDFGTDXABHx +AAnrAAjKaW/IaG7LVWTITFzMFS29EinDESnMDyjzAAjVAAfLcHfKZ23OXWvKUWLGSFnFQVPHOkz/ +FDbYHzHsFi3RECr/AiTTCSP9ABXLABHeAAfRAAfKUF7EO07YMkb/HDf2HDb1Gja7HzW6HDLCGjC4 +Fiz/Ciy3ESf/ACDNAx7hABzDABS+AAZZegiIAAAASXRSTlMAHyIi/qA6/lwfBP6goP7+/v7AoKCf +XP7lwL+mXFw0EQn+/v7+/v79/Pfx7+/q5+LY0szBv7+/s6ifk46DdWVURUQ2NjAvIh8Z5OAZcgAA +AZFJREFUOMt90WVTAkEAxvG1OA8UBRW7u7u7PfCMEz1QUBokpTvsrm/sEjOEe/ze3Nw8/5md2QVp +LU2lAoGgFGpqASglNzqdzq7X6+03JehAIkyRMAVu92ncvqQKHTj2k+4c6KBKepRESsuQQZmUJI8T +DAyB4SDFUI0Mqp2HKU50UH57Dl1A1+Xo4Fomk51BMoagxiWXyy8huasGHQivIIXiWSGcz902Gvh8 +/ojwRal8ValUSk9dff3U9GZm0QDvgDxTqoxGy1eE+2M2fZCTINPuIPlmMhsDIbXNZovxuL+mgR2Q +pbldYbYE1BWUWExFsVikawXkmPNYQmqqVquxarTiqG8W5Gqtu1dTWitNEASt8Q/vgX/W+761ViIh +3LMKEBZ9muQuemwEKG3jT4QIziLvaCtA2uoPiuD+2bsGGCx3hmHRsQAYzTwQhHesjTnAh96DXBbI +o7nbvwTyapxgAxQ2jhckbLOSXxzPDlk8DL4Tp7IYquTUUhUYj5UdYPGVPkmg6WKOGMsO2EVQYRr8 +Sx3xB7pYbPmwceGrAAAAAElFTkSuQmCC} + +set _AP_IMG(err) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAB6VBMVEUAAAAAAAAOAABtAAC0GBim +AAAAAACiAQGmAwOoBQWtDg6mAACmAAClAAClAAAAAACkAAAAAAClAACiAAAuAAC8Gxu0EBClAQGs +CAi5HR2xFBSmAACOAABKAAALAAABAAAAAAAAAADLOjqtCQmoBwe3GxulAQGhAACfAACnAACmAACl +AACnAAClAACkAAClAAAMAAClAACmAACkAAAAAAAAAADQQ0PHMjK7FxewCQnBLy+9KiqwCgqfAACb +AACmAACbAACTAACgAACmAACNAACnAAB9AACBAABvAACmAACjAABqAABxAAAnAAAYAAA0AACCAACl +AACkAACkAACiAAD////UJSXUKSnAAADUJyfTIyO9AADDAADVKyvCAAC/AADPKCjSKSnOJia8AQHR +ISHTIiLOIiLTISHPICC9BgbPJCTFBATFAADfYWHYRkbVLCzPKSnNJCTEGBjeWFjbTk7ZQUHLGBjK +EhK2DQ3gY2PeXFzdVVXQRkbNPDzYOjrVOjq/HR2/FBS8ERG+DQ2/BgbaWFjdV1fWTU3US0vaRkbU +Pz/OMjLKKyvIIyPLHx/MHBzAGRnHDw/GCQnCCAjfXl7NPz/UOTnTOTnXNTXXNDTINDTWMTHPLCzQ +KCjGICDGGBjBFBS5Dw/IDAwYpLQIAAAAVXRSTlMAGAwC8vAc+Pf288iVWjwiIRIRCAX8+/r08/Po +ymo/ODIu/fn49fTz7da7pZBwYVBIRTkoJwj+/v78+PX04eDf3c/Nwbqwr6afnX9/bFtUOzc2NRwW +iGYnmAAAAhxJREFUOMttk/V32lAYQJPgFAp0uFNvV5e5u/tgQGk3ypAxZLgUKFB3mfv2l+5LUmCR ++8M7Obn3vCTvfEEoHJNPTHYgrIAcv83TiLn6bs3VkWdMzZEauJ3L+ffJQj6/cFYkoe8jH+CuJte/ +2e12pzOWLkbO9Eopvp3XWSiDBQ84HF9WlsVDnJYfF62l7C5XMwDSkZ7jrf15a+su4ChwEJQj+uEj +r7xYSr2mBR6PJ13QTpDBcE/SxQiA1IkB8vt5q58DjcAJED4W88Qi+lE8GNEVAwHmDkB0oQ0PBktl +9sARiwg74AnCpJMZQAHLig6Oa1Jb9Pl8rQB41SB6cggOkZvyAc/pVCBIlwYRRKqLBtmCjxBU8Lcc +5UaDwaCfEXyKx39UPkDwWBwF7/e/IfB6vS8J4nFYNr5eR5Cnoo1sNpvZhegdAAU0JLvfVXfgHAxb +f98ShA/2s5kdSHD8mf3wzKa4HQKJKjNDIRwOkxcHmzwOPizaOH5jlsmOihyJtsVfsy9YONwSyong +iWj7kMXPbaslCInk3M+lORpud2LR0Bht7Io6seSmAr73UWPk0Ifnu6jFfChxSnCPj5HBNN82Zuyu +/g7NN6nvqftMVhkEBAqZZeyWoKtWrYdw6tW9nMZ43zKFNv8MjG8zP7jRJzid+1Or5XJCwWWT2SpT +gG8yjcpsFtNN44X+/kvX7pqtU3wMNA0lpkBRPooqMOV/8h9ZKQVcoC2fdgAAAABJRU5ErkJggg==} + +set _AP_IMG(exit) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC7lBMVEUAAACCAABpAACbAAChAABt +AAB0AAB8AwNkAQFmAQCLAQB2AQGRAACjAABpAACXAABYAACdAABaAABfAAByAABqAAB8AACBAACM +AACUAACmAAB7AABeAACIAABtAACUAACoAACjAABeAAB0AACPAACWAACpAACnAACtDQqlAAClAABk +AABkAABaAABaAABgAAD////7///08fL5///WIR3FBQPr///v//7//f3/+vqqHxvFHhjLGhW/FAK9 +AgD17u7/7+3uhIW7cHDDaGj4eF7nVki9JSDNIh+9FRGWDwzRBgGxBgGnBgGsAwC1AgD2///y///r +/f396enz6Ojz4eH93932zc3rzMz8xMThsrT1np7TgYHqfX7hgn3ye3ytbGzSY2HHYGDuU1PTV1HT +PzveMzDNKSLMIRiyDg3JFgLOEALUBQHEFQDBAQDOAAD9///u+vr5+fn59fX/9fTw5eXjwsPmvLzo +t7j3t7f4srL9qqnvp6j2qKftrKbXoqLjn6D0mJnflpfYlZb0k5PmmZLJkJDhjo/yjY77i4vliYj1 +hH3Le33bfXqyc3PddHHGcXH7iG+5Z2ftZWXbZF/MX1/daV7pYF3YXlbLVlboWFXiSUnLR0C+QEDD +RD7pQDzCNzG7MDHYOS60LyrjKCjUKia4JyO0HRuzGRXIHxOkFROXFBKRFBKODgyICwmuCwZ2BATA +CwPLGgHtIADoIAC7EgCgAAD/8PH21dXlxsbwwsPxv8Dvra7Jra3trKzcqKjvoKL2n6HAnZ38qZjM +l5f/mZXNjY3mior/ln7De3v+dHTsc3PncHH1f3DidXDJamrWb2mzaGjpZGD/YF+4X1+tXFzvalng +YlihWFjfVVXfWlGqTk6+TU3tTE26TEztYUr/S0nJTUflRkbjU0LQQ0HjQEHgRj35OzzMOzrYOjnP +Nja6NjbpMTG6KirTNijkPiGlIh7cNRrDFhLOERDHDg7jKgnPHQagAwHVEgC4DQDIBwDTKbTyAAAA +MHRSTlMABNnPkjoO+/338/Hl3sq+vrm3r6yqqKWglo2BgXl5ZWRdSDAvIyIc/unozcyWlR3Wp9tz +AAACfElEQVQ4y2KgL1BXZBFkZuaXlFfFKq3Gwrv8wfmevoS5VjwSKpjyClrzW0KLLS0dQiOqzi7i +kmVElWaUWhfrYGBgWdobXxdRWXVkuqc4G4oCqYxaAwOLbUHxB/dcr66Jau64uEqMEdl8gDRA8sVB +23uLDOLbopod407OXCON5D7NWKC8ZUhomJO9wYXOhpi4U5MupbCzwhWwzHcwsLBovdIdAVQw0XHG +rTmTpiXdtxKBWaLO22JgaXDUqeREdL9RvnPyRPvWN0kPn6VyK0MVKC4/5GBQfrnIoO52v72h84LD +BvlO7vNez1stB7Nh9nGXIOcdhuF3j50zMnS+8arUsGTBYpuFVqJQBYLTJ2x61F1YmBgblWhknDhz +1hwjw2g777SlfFAFzFNdNnk1GZbNqHGcYmQ8ZVaS+z7DSF/vdDcmmAKAJrtszoo0bpp8wDHB3zDh +yR2TaOPwDN8VcAX8yWAFjemu0x63NT5PXbKhB6jAJ32ZNlSB5NwJX7zq/ctMszZm2tltsP3hV+9f +7u3jvlIYqkDequtddl+AUcrPjZk5ObZb/NKCAzp915mslYEqUOWZeu+7SYj5zk+mObZAedO95kYv +t3pYc8LDWmLRmQ95pwMKdr0wzbXLXbK7wLzd28fEUwgenypcyVe/ejWYBwZXx8TsDwk0rzT9ZuPB +oYSITlnPa66ZXnHBgWYgYNT+eetHm/W6yAkKMPFVN11XmC7uqggLq+hI9fOxsWEXQElSbGJrZru+ +tc3Ny87Os/P1MPFYL6CPliil2d+nPF2YZm1t7W5i7cmhB9OPAKwi3Kutlrq5LVu5llNICWvOUJYT +5WNi0hGWYWVkoCcAAOTi2xaCYJqcAAAAAElFTkSuQmCC} + +set _AP_IMG(file) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAM1BMVEUAAAAAAAAAAACFhYVnZ2da +Wlp3d3dfX18AAABtbW1SUlJWVlYAAACo5/9JSUltbW2SkpLQM+AxAAAADXRSTlMAPUHxzMzMzB/M +zs0RwBWEaAAAAFFJREFUOMvVzDkOwCAMBVE7q0liO/c/LS2b9AskBFM/Da3Tv2d5BS7NcwTUKwBE +UCAOBSI0gHF6mADc/YducE4AXgQeBAwBsUZCSR9vRSw0qggizRcsNzrDggAAAABJRU5ErkJggg==} + +set _AP_IMG(find) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEUAAABYWFhISEhfXVp4eHhw +cHCjAACFAAAAAQEJCQmCgH1/fn1SUU6Dg4NlZWQ0NDNsbGu8AACHAACvAACWAABEREVJSUlaWlpQ +UFBPT09GRkYfHx8TExMvLy9bGhp2dHN7enlOTk5xcXG3PhpoSEhqRUWnIgJsbGw9Pj6tNRWiHwRm +ZmdGRkZpampzc3RgYGBCREQhJiYWFhZLTEwaGhoQEBBcXFxUVVVgYGFNTU0xMTK4AACgAACaAQG/ +AAAcIiIOAAC1AADLAABFRkVTU1M3NzdHR0cNDQ0AAABHR0em0/+YzP/Z7v/T6/+53v/O6f+22/+v +2P+h0P+azf+Wy//h8//L5/+q1f/f8//V7P/F5P/F4/+73/+w2P//lhrd7//X7v/N6P/A4f+/4P+k +0v//tDH/fgrR6//P5//H5//C4P+23f+o1f+dz//n5eLLyse5uLatqqqsq6eIh4X/+mP/307/3kvj +9f/U7//Q6f/T5//K5//G5f/H4/+84P+z2v+s1/+y1f+h0v+f0v+czv96n/La4u5vi97f3NzDzNrV +1tXJx8K/vLiqrrK1squdo6WnpqOlo52fnZqDi5eVlJOQjYhycXD/92L+82H/sjDaZSrSYyrLYir+ +mxz/gQq/MgPU7P/M7P+u2/+30/+mzv+SyP+Ov/+Gvv+DvP+10/6u0f6xzP6ew/6EtP7P5PvC3/vN +6vrH5vrE2PrS6fnS6fjN5PbG4PWEqvWmwPTL4vN9o/HF2u2gx+2Vv+zn5+ve4eqcw+m71uiBrOZs +mua90+WHoOXe3+Skx+TW3eLO2eJhjeLm4t69xN19ld2Potvi39iRtNjJ0NfL1NRvidTU0MxehszS +0Mttk8tXeMjExcZzh8S+vr/Dwr6hsLuNmLvt7belqrCKna7ozqeNlKd7kqeMmaWnpqTT2KJ2gqLi +yKFsfZ59jJp8hZqYl5iKj5ePkpWDipKRj42MiYd/g4dqb29iYF/51VX/2UvfYzf/vDTUXTHCVBjF +MwPIMgPMNALQLABzRsNZAAAASnRSTlMApBP86NJ1dEs2/fz16eLe1614dnZsY0k6NSEhFAsH9fLs +6+vq6uXi4t7a1NDIx8S8u6+soZuamJeMi319d3VwbV5dWVhQQT49FRnBRQ0AAAJBSURBVDjLYiAW +MLlY6PHysjKKSmOXF2Mtyr+Wf/NOz0Q+Kxks2hknnD9z7mx7++Vb9wom6nCiy3vqdx872rq6KjS0 +avGuG4/7FN3RFDB2729dExkRH+/jk7Cg8dSLPg1pVPuf7du+pLo2LCMjI6w2uS778JtJJigOEMjb +scwvIDkrOjo6K9kvNrDp6ltmZGcA5FzUtjYlPDDAL8bPL6A+MDylecWrqaZICsyvbFqeG+QVHhgb +G9gQ7hUUHNJ8fQq/LEKB7umVS729c4NSvLy8UoJaQkJaFh16x4NkB0veKq8g75AQ7+DgYCAVHBRe +t3cyMweygsb6QKDJ3kAQnNuUE5iduQdFAWtHVkxyQGx4DtCKnIbYgJjo9AMfeDyQgil/XVJYVFKM +X3YA0CdJ0dWJFReK+ZEiRLSoza8yMSwzCghqMsMS/SMXPuEyQvImYFIsXevDfCv9QSDRPz09MuL4 +568cyEFpWXgiKTLBFwIiEyI2vi42RI1s7Z6TNQnxPmAQX77h4ccvDqixKalUcHFbRUQoEJRHHHw6 +teCSqqATigo39Qm3O3dv3bxl55G77z9N6+/qePTDDkWFFCP3pMLe3gf9U4qnGdirFHbenzHLGtUa +CTMBBS5ueT5jVzkGwZfPv5WVzBJGS1eykuLiEkwgluOvmXNnls6YDVOBCdj+p8WllpXMZsOpwuYf +UEVpyRzcKkT+zgOaMX2OLW4Vf0BmTFfGnReF5qfF/fyuiSe3ss+fN/c3O778LKSmxS5HONsDAIuI +1IvxpUiAAAAAAElFTkSuQmCC} + +set _AP_IMG(folder) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACClBMVEUAAAAAAgkAAAAADHMALKYA +J5QAJZMAIpAAG40AIqIALqQAOqwAEXcACnAAAAAAQrUAKaUARLQAAAAAIpEAII8AHo4ALJwAPrMA +ObAANa4AQbIAPrAANakAMqcAS7kAAwsAFVoAJqEAKpUAM68AJJAAIaAAD3oAMpoAF10AFk4AFU8A +U70ACCkADj8AJJIACyAAKKkAAADD3/+r0P+Gt/+Sv/95rv9spv9fnf9Tlf+fyP9Gjf86h/8sgf/U +4vYER9+y1f+HsfLW7P8DRN2ctuqkzP+Lqt6u0v+Yw/8vhP94qu8HU7wHT7oKNqys0v+Lu/9+sv9x +qv9lof9Ymf9KkP8+iv/U4PUFSuEAPrcGSLUANrMFQLAIO67K5P+pzv+dxv8de/+Iu/p5sfppp/pZ +nfpKk/o5ifoqf/oid/kSZPkdcPgYavfI2vSqwu0ddOoIaOWLruGLrOBLi98yfd4BV90gbNwrdtsO +YNsCTdcBRdQAPdIAM8UTXMQNVr0GTboESrkARbkIRLMCL63y/P/g8//X7f+32v+eyv9trv9Djv81 +jP8ohv8Oc/8Dbv8AYv9jpfxYnPnX5fdNk/aDtPVDi/SgwvFypvE4g/F4qvB7qu8tfe6cuO2ct+tD +jecyheOStOJnneIAO+A+gt4DU9klcdRHgc8gas8bZMs2ZspJaclEYskbVMUtWrwAOrTLRtJgAAAA +MnRSTlMAUzXdFvT09PTv7Ovk3C7z7+w39fT08/Ly8uvr6+vmKAz69PLo5eTPv5VpZl9bNSAXEHSK +B9IAAAGcSURBVDjL3ZBVUwJRHEdRBAsEu7u7sFvEAMRWyu7uQBq7u7v7O3rZ+1+HYfDVB8/Dnt/O +nNm9cyl/QWwAi8Xy9PTy8vYOjUy0EAQ83YyNjY+XGvmIthA43y4WY5YWXqMCbQiSgkyCieVCoPgz +2IPNZtsjwuNNAlFLi6gMIWoevrwoIRh+ZyaTgc/9SmvrAf+Uz+efFZEcvUXEJQRBMJlWfiwQCIRC +jVYi0etlMrlcXokwMJyIwHeGw7lSD+3lA42gxiGqCw6m01evBbzmFHN4TPwFx+mMnUlhe2GqOe0M +FxzMZu7OaDp42RhkUAfVGoKs/UdtZ3kaBhnUSQZTa4fPuq4qDgYZ1MXAgd9D7smLrrs6HYMM6qZC +MFdxrhL31GRgkGH2QOA/1zaiEvfWZmKQYfaSgaJtRC3uq8vCIMPsgzM4KDZHhV8D9TkYZJgDVAjm +t0Yl0sGGXIJ1ZJiDP8H2lEzaX5FHsIEMsx+u2kF5pzRIuU0FCC7XaHIy8VXHhLm60j1CaHRbWzd3 +Ozsa8URvNDr8ghJo9RtOlP/CNzJ7lXZYmZiKAAAAAElFTkSuQmCC} + +set _AP_IMG(font) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC/VBMVEUAAAAAAAAAAAAAJwIAAAAA +GgcAERQACQEAAAAAAgAAKAICTQ0AFBAACAUABgYABwMAJgcABgMAAAAAAAAYfStImlEAXxABShsA +TxQASRYifCsANgAAPgwAKBEHXhMAGBcAGQQAKQ0AIggBXAIAEAkAKAoABwMABAQACQMAWwAASgEA +FA4AVwcADQAAAAAAAAAAVwAASAcAWgBDpEwAXBQFZhUAOBxClEUbeS4edy0eeywPWRkAPRgAQxcx +gTsASBYARgA3iD0ETBkCVBgAUQUOcB0GaRMieCwAOQgAPwYAOBUsfzcWdSYBMh8OUhkPbxUWdBsV +aRsAOgQOUhgPVyMAQRQJXxUBMA8AOgMAIQ8ObRIDZgkEVSMBRAwBKSACSSAAHBYAIBsFYAsAFQAA +NQADZQYBMxoADBMAGRIAIAMAVgoADAIAExEDTQgAGgAAIwYANAcABAQAFRcAWwEAEgYAICAASQMB +VAEATwAAAwMAFgMAVQAAVgYALhEANRgAVAAAAAAAIgIAAAAAYQALcR9t32suwi8SficGZxzj/+C6 +9Lap7a2i66Kd75yZ8ZaP6419xYVuzXdstnJr2m1l0WtXu2dbsWVQt2JErFZFuFNK3UhBw0Ymkzs8 +1zokizc31DMklzM10TIejjIdhTIcijAgmy0SeicQciUPeCIOdh8GYR/T+9HA+8St5ras57Kq6K6i +4qim8Kef2aSe5KOW46KT3p+f756a7J2X6J2V0pqS6JOB1JCL24+J04+I5Y2M5ox+14eC1IeE6oN+ +3oN20n+A6n594X521n5rx3522Xt55Xh03HdovXZ45XVt1XVpv3VfvmZo4mVk3WNZx2NOs2Fe411F +s1tIsFpSx1hPwVdLuFZAqFRV4lNU31JMxlJS1lFKxU9Ly05ApU5BnEo/vEc2qEY7vUA4sj8wkj4o +jz4ziDwpmzospDkzuDg2xTctqTUikDMrszAruy0ZdSkXeicnuCUclCQOfSQVjCICUyAFWx8Ujh4S +iBwOgRkAVgY2N9W3AAAAhHRSTlMAKQoDGLq5nRsRBfi6fW5OQz4zIv79/fz5+Ozm49TPzs7Bs5yY +hoJ5ZF5XRj46OCsoIg3+/vv6+fn39/X19fPz8/Hx8PDv7+7t6+ro6OPj4N7e3tza2dfV1NHPzsvL +ysfHwLm5t6+tqampqKWdmJCPjo2Li4WDgYFycWlcRjw6MTAqJCAeXuxcAAABzUlEQVQ4y2IYYUDT +P1oXn7xR1NrbKSx4FOiIdu524cejQHnn6u7veUy4bZBat77reoQ+lMtcr1mh1YisoHrSiStdR8Q0 +mME8g1TzadMeuxZwwuWZkzbM+dKza4kS2JnNAZu2zpi+/XB7PtxKA8ctptwT+2bKCIJ4xRM6pzpI +PwJzoaB8wnTp5Bf9kztKuEAOPrPmWhC71aEbEnxcEHmAuAI3z7H2+3z67AJFYSBXwG2JmGew8al7 +ErxQO7REuw8cPzdlcusTe3BQqP57deHyzdbZkjAFWXtnrFi2bPmHS/dbVIAur3E/uO9ph8jFZzAF +ht47Vipks7M7Pby7VFafgVluT+8iDwXLq29t1SEKyiZN5FYT5mRSXTCrTZyPwVBq20kTdjWLOx9t ++JhBsZBr1zOVW1GAoS5t+dz5P3xLa336j4mEhzyf9Uk8ThuoIOz8xt79U16HCsa8f7dw4fyvq4pi +bx1tfTD7W9vctr+JHAwMci/nLV48r91LI759RUtLy8qf6VXOi94s7TBb9fvPL3k9oK8By2QFARUh +7QweHjYgqGThV5KN5CnMSZBnU28CxgMLIwgIMzFAGIwczAwsQrpCHJyMeg0cXAzDAgAAm92ewYnU +eLEAAAAASUVORK5CYII=} + +set _AP_IMG(gulls) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABNVBMVEUAAAA3eKsATpEIWpkEVpcc +bKUPYZ4KXJwBUpQXaKMUZaAVYZ0BT5IDUpMSXpsEUpQpbaUJV5czdqoKV5caYp4XYJxsrc+axuBr +ps3I5vO52+2p0OeLu9p6sNNcnchNlMPf9/vV8Pfg+Pw8jL5Hj7sAZKIAa6cqhLgUe7MBdKwBUZSQ +wtwAV5j///+Cvdpxt9ZstNRsrtAwfrAebqbw+PtssdF1rc1PnshTm8NAkMAzkL4jhLgAXp3b9frW +6PLA4++x0uanzeOhy+GYwtuMudV1s9Niqc51pchqosZDmcRJmsNamcJGk8EtiLo3irk1hLQQda0L +X57p8/jQ5vG41uiv0eV3u9lrqMphpMpioMY4k8BCkr41i705jrw5jbtHircag7YcgbUpea4rdqsZ +cakLa6YWZqL5f5NyAAAAFnRSTlMA7++/v7+/v7+/v83NpKGhaGdNTaSkl7F3MAAAARdJREFUOMu9 +ytVaAlEUQOFRSroUsAMZYVKni+4Gu1vf/xEcRf32Yc41/+1axOLEQ8uIUBztUUo4RAhUFPYkpaXm +aFQSDGEx5SCGweAWTmxNOk1fj8UpQ1HM56u4AoexLMtNjruqS423frv9NGUYBhlGxzb1w7KEU7bU +uOkr2rsFB9cDz/PD3LfRIPdjkkOG20v+hfxj3vUeJyTphkOXMwszRk0643qG8VxABrWbN1t0lW7V +2JKan0EG/Z6upOvnEsteDI9+ucDg0zN61jaoVrL/fHDYxYCDdwfDC4cMBjJsYwTAENjCgIM/jeGH +wyaGBwyeDQxkWMeAw1p536G8CoZEZ8+hkyCAiFI8QBSVCIGIBZcQwRixMF9JdErdTqbZMAAAAABJ +RU5ErkJggg==} + +set _AP_IMG(heart) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC/VBMVEUAAAAfAwYUAQQAAAAAAAAA +AAAmAQaCAxYAAAAAAACaABOLARMVAgUBAABoAhHkUoS4KkyeECiXABKUARSJAhSzTUiFABKBChkR +AwV6AxV9EBxeCRUAAAAAAABpAREHAAAAAABqAA4AAABVBxLMM1i5JESfKziNDh6dARWvMzW4M1eS +ABLAQ2q7P2W4VlZyAA+KGjKgMVKqO16RIjGHCRqZLU1gAhCoIkGJAROSLk1yHjRbAAyNCR6bNkKT +KjmLEB1LCRZrIDaRDyagNDZBDRmhOT1eGSyCARR+ABIYAweSLzolAAV+FiZLAAoAAAB7ABAWAgUA +AABnAA8AAADWJzDLGye9Dx61CRncLTLPJC/YKDDUJS/YLi7SIy3OICvFFiPhMzXcLzLMIy/RIiu/ +FCG6DBy2DBq3CRqyBRfNSVHpPTjmOTbfMDTbKzHeNS/dMy7iOCzlOyvSKCvGHSvRJirNHSjIGCbF +GCbIHiXCFyK8Ex+6Dx+0Cx2sBhmwBRasAhTrl4bRUVDmODvILjvDKDbIKDXoOzLkNzLgMTLZKjHI +IzC/ITDaMC7TJC7KICzQHyrCGyq9Gyq6FirOIyjLHyi+FSXDFCLCEyLAECC3Dx6uAxWoARSlART1 +uaj1tKH3rZPpmI3ijovznoHpj3/nUH7gg3vjh3fiSW/jfGzdQmjfdGbaa2TWZ2PSW2LZZVvSWFvd +QVnTNVbcPlDKP0nWNkjJOkXQLUPINkLJJD/ELjzGNjruQjioMDjiOTbdLjXBJjTrPjPKJjLiOjG0 +FjDUKi3mPCjxRifoPiW5ESW3EiPqQCGbBxmqBBefAxb5x7T1wLLtrqf5u6TxqpjroZjwpJLsV4jv +l4DjTXzadnfdeHTtjXPacnPWaWzObWrXPmfJYmPgRmPVOl/JWlzRW1CyRE7QTUnfQEjEP0LgP0G5 +IkDaNz/dOTzQJDnQKjfXMTa+HDXjNTTiNDLvRDHWLzHuQzDEIS/VLC66IC7IHCq0HCjBGCeXFibG +HCWsFCWlDR/ZvPE7AAAAVHRSTlMABQMHJBYKaDIO/shIQS/8+fb17+qilllNRkA/LighHRoYFBL+ +/v36+ffq5eLh3Nza0M/HwsDAvry3sq6moqKdnZmUi4uAgIByY1dTUVA8NC0tKR9NMDBfAAACmUlE +QVQ4y2KgF2CSchUVdRZXBrHl2J1sxDyCUOS99JYtWnRr1WNNez5Jc9XDtfVnZnNZ8MGlGW3vNsyf +f23Fuqe7fp5+OSkjPD09LTxjlgY7TIHd/QXzLl5Ztrpx18SZNeHpqalhQJAannFWHCLv82TpvHNz +F9xcv7V70onq6rAZ06fFx8dPD0uvE1YEKwDI+FHD3PMXFt7J3Nk9cerUlOnxZaGhpaWh8WHhc9xB +8spqaxouXV54Y+3mnfsnTCgvLwst7U9Ojk0OnZZayw1SIL1n9eLFS2+vzdze3FVc/AMo3RsdEhIV +klw244QgE1jBuhWr1qzP3Nrc2tXXFxcXGx2VGxGRGBESV7ZDAKSA7/fzxsbMzdubWw8mJUXG9kbl +JnZ0JCQk5Ma+2ajFCFTBpv73+/6WlhagfGRkdEhUbsfH9vbs7L05IdvumTIzAo0w+Xdy0sTur11g ++c6InPa2tgNZWU2JbzdedwMrYD9dc3LqhOK+JIj8h7YDXz7tzsr7vGUlfwAzyBFsgInUzqz6VT4F +5LyInITsrN3Hjh0vzHu1YYmlElgBA/vZmuqU8tC42JDOfQlNTdmFp04dL9y7aTk/jwIbJK65a9PD +poX290ZF7EtM7MkvOHq08NCzB1cdWaAKGOSEM1JnxIfGJZeUHIkBKigoOPRiwxIjDhZWRmh8SgnV +16VVVVZMBivIz8t7vWm5Do+sPCc8SUjCVBR9iwGCd1tW6krIsCgxItKUv/bsuvBqkIqiopLIbQ8N +JYAWMCOnOkXuObPCZ6b8mTKloniHihUvhyzUAYiEJ8ZVnwG0JiXlvYALLwcLJ2bS9hUBGpJWc9jA +0y8QpB0TyFtzzT4j6MArA5XGBMze+mY8wZxMeHIQJxsD/QEA0G4K5ZdSGNIAAAAASUVORK5CYII=} + +set _AP_IMG(help) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAB8lBMVEUAAABngsVAOYZIV5hJUpVK +TZJqhcZHXJtLSZFCO4gyLoBhfsRaeMFXVbRPcsVNSZE4UpMsKHsKOacBIWwCAnsAACQAAACaz/+D +t//A4v8shP+p1v/I5f9fn/+74P9mpv99uP9xr/+23f8GCQyq2P+Xzf+OyP9prf91dsC75v+w3P+b +zv+Tyv+Nxf+Iwf9ztf8uhv/H7P/C6f/M6P+t3v+i0v+Xzv+Wy/+LxP+Lw/+Gw/+CwP9/vv9lqf9p +qP9hof+KvO6HrM9ygMVze8N2mLcVGh3Q7v/E4/+t4f+63v+03v+03P+s2v+k2f+u2P+i1/+m1f+a +0/+cz/+vzv+Rzf+Fvf+Buv9/uP93uP99tv9usf9dpf9Snf9Jlv9fn/uXyPSOw/NWkeeVvN9xicmG +qchxhMdVaXkyUHlAUF8zQU0uPUwpOkwrNT4bJjIVHioPFBkMERXF5P/A5P+44/+14f+c1f+e0P+e +z/+Rxv94u/97uv92sf91sf9zsP9bo/9BkP8de/8Wd//M6v7D4Pqp0PSx1vOfzfFjofGs0Oxrpeuu +z+mcweKItNiDrteeus9xhch/pMdqlsWHobhahLZ2lLB3kKdui6c+Zp5Zep1vhpxqgJVUdJVabX1E +XHQ8SlgrP1cxQ1UnN0gwPEcmLzYhLDYOGCWopqx7AAAAFnRSTlMA8czV1dXz1tXOyffz8vHWy8eL +YF9SueqgGAAAAZVJREFUOMut0kVTw1AUhmGsuMuB4JAmhQqFukIVd3fXOu7u7u72P0nZheay6rt+ +5s65M5+Pt4oNGxg4HRoyGAxGozHHXUQ8DYRjJJ8UKFRqzUKrsL2do11pCKWBQIKoYNdKeXJSpRFy +Ojq71tpCaMA3kS0uwcoquJU1MmXLcmFRfpLfH5CSik2Iqvv1xzpSnZWRlswACg6e7C4zjlsvWwuZ +QPGJGXD9zpEFYITDANgbNgDQS6p6nQC3Wk9QuWmmwI2EV2cFcHQzvFA8DODsZ/Pq3gHwPoZfiLGL +60OutEbnQoBUTCQq55b2vAHAd3cyE0jPLh8cdgDViBYBcl/AnX23CAVGgep1n5OGBLjt+VwtzECC +j7HSaTIzCwkmr0xV/Dw0SN8ymXpkaIDtfQJ86RRIUPAAVI+NaHDvBndogG2PAVh6lf8cyR08qycQ +R1aLx7Gy7CmJVK5oXvIcbaBMUDtL8AUqzfzv6lfXW+izjyypn+ERcv6cQJnX1NSc2bbYEEMDcdFB +Qf5UAVQsFis4OCo0wcdL/QAftmvBghRUFAAAAABJRU5ErkJggg==} + +set _AP_IMG(home) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC+lBMVEUAAAAATxQAVQQATwoAUhYM +WxshbiYNViAAMR8AWgkAUBYbSjwiaykXbBgARwcASAsAOBwASx0ANhkAVwIAUBMAXwEAQxwARSAU +WiANPi4VahgWXB0HOicCMiMAWwEEVhQAOxkAKxUARhIAPwcAXgMALx4AUA4AOh0ANCYAPRwAVg4A +UhAAQCEpcysNRyoeWjEIOSoDShcATxocbyAYZRsiaCsTXhoASQEYWyAYbhgYXhwNUCMAUwUFYwcD +YgkARxYANSIATAEARRAALRsEaQUAXQABOysAXgAAQQkALBsALBwASR4AOREASx4AYAAANxUAVgAA +ORwAVgAAVAMANyj///8ATRv+9P7p7ezT3tdY1Dv/+//39/hU0ThLzDJIyTD//f+UtZ1Dxiz8/fz8 ++Pzz9fT08fPs8u3R3NbT5dS2x8Bc2D5c1j1PzjVGzCpAxCo7wScuuB8AURj88vv58vj29/Xy++/w +7O/o6une5uHj+d3T4Nii1p+j4paW2oyO0YdLcmRcy0tg2kA5qzhQzzZa2jVL0C03vyUzvCMfsREY +rgsCoAD/9//69Pr3/PXt8PDi6OTa5Nzg9NvK2c3V9MzD1MrM78Syzbejuq226augwKWVrKWcv6CT +s5uc3JGBqYqS1YlpjoCV6H57zHNZgG940Wt74F9oyltHd1tRj1Y3Y1RYv1Fv309l0U9QuktEhElV +yURBsD9Pxjxc2js1fTlZ1zhR1DE9ujE9xiQ1wR4doh0uvRoouhUitRIASBILpAgARwj9+/7s6+vt +++nn9ePa6tnU4tjL38rP9MXH4MW+2MLA4L2uwr2wwb3B7ba32bWnwbCbsqu68Kqew6GYtaGKpZqp +7JWTzpB/nY6Lt4x1k4qFyoF+r39yunJlk3Fgi2+I426B42RflmRYj2FdtF1Gbltu1VhRlVJLiVA7 +bU4zXE5o101i1Ug7eEZItUUvY0AnWj1JwTtV0zdX2DZCvTVU1jMzqTMtpy0lYy0qpSpBySc4wyEp +sxsmsRpNd0ykAAAAVXRSTlMAHiQZ5tns2FwQBv3s5aCcaWNUUzgmFwv87Ovl4djTyr60tK6Vf1dB +Oy8pFBL69fPx8fDv7+zs6+rq5eTh3NjUysbFw8C+rKmnpZyXj4V0clxMS0gqlqEJBwAAAnpJREFU +OMtioDbQVHBQxycfKHP1oiQHhrC4mqCgoAiQIaA3IzQ0i1uVC00Bo1FYWJg3A5fPh6mhfWWh1as8 +ddAUsAAV+Ooor6gMPfxg2aTQ/iXOIWgKisLClBTup4ZWLfu67fW00ORbshpoCgAq2rdvfkLoiTWf +s6PaWmYmhM6W5EBVcEDiQmjopaatOVGxLXk76lJATkUoYGY58GNqaPK1zZtB8nHxSTuXpodmvPIS +hynQMn97LLRsUWt2dlRsLlA+v2BP49HQCQ2KjFB5x8fpoVUPW5tyYPLtHXu/nI6OWQhxarDN/OTQ +KWtam7IR8oWFnX9rShJmGwCdKmwyKzQ0tGrR1hxk+T9dq09WlIee5RZgkJsTCgIzt31qy/u14/fO +3bv37O3s6uxaHB4TExN6RgYgBpUtK1+snxN6ru1NbW3tvHl1dQsW1NfXb99/OzrraUPDKjcGTuEA +Yb5HodPynqVEh0JBT/jq7uuhNxSFOITEwP5QWxk6JW9tacysuYlAMPdKRO+67pqEhf7wkApaf3BS +3Nq+CAllfj4+fg/DyJ513eejlwjAFYhsiTkS31gaYcoE4mmzR4a/2388fIUQXIGobnrZpg2lETxg +BWJABRt3TSx5qY6ILanK5MYNqVAFzOyRxRt3Teh/rwlXwGk7OWH5JmQFzT8PVeozIhQAJjc9dOnH +1Ao2iAJWoIJvaZOtxeAKuFwvhy7enhYBU5BR8r05PMueE5Ei3G+G1ixPq4ArSHtyN3yGkzhCgcqd +0JSU6HSYgom95eXRiUpIqd/veSYQnDIWhSiYXh2ZUX2PnwEBRF0seXl5pezA7taWN7OSlraQF6FS +dgYAY+T41r3zjP4AAAAASUVORK5CYII=} + +set _AP_IMG(info) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC9FBMVEUAAAAAGIsABoEAJJAABH4A +CIAAE4YAKZIAF4kAK5UAD4UABYABE4cABIEAHIwBD4QAKpQAII4AKZQAIo4AJpAAAHkAAHsAHIoA +LJQAEYYAAHsAGosACIEAIY4AL5YAAHwAAX4AMZgAAHkAAHkAIY4AAHoAIY0AAHoALZQALJQAEYcA +EYYAAH4AQrQAQLH///1Kf98tZtSjyv+ix//6+faErvMAVtk0bNYAUtEAPa6w1v+exPz49/WqxOoA +XOZfkORQg+BBd9pZiNhQhNg7cdgAVdZCds8nYM4ATssOTsgASsQKS8EWSL4AO6wBO6kAOaULKZus +0P+ny/+dyf/8/PuWvfmPuPeIsfT59u0yeetolulllOfm5eVZiuQwd+QCXeFCd9xgi9dLfdYoYdMg +W88AT84WWMwuacsRVcsvZ8cRU8UMTcQNUMMKRL0ARLgUO7ECP64OO6QAOaP///+axf9upftKlfuY +v/o+jvqSuvhLjvf//faMtPXq7/T++/P8+PHS3/F/qvDv7+92pe87g+7t7Ox7puxyoOxvnettoOrq +6emRr+JXieIAWeIaYeBklN9WjN81cd4AWN1Aedxwl9oUYtpLf9k9dtgAUtMfZNEnYNEYXdE2b9AC +T8wNU8kATccARsctYcIQScIpWsALS74APb0SSrsXRrsSQLgcSLQAO7QMMqwPQKcIKKMFNp8GHZkJ +J5gII5WOvP9+sf9inv9Unv9amP8+g/8we//y+f6Pvfxlpvzz9/vb6vv+/fhAjfey0fby8/U7iPVQ +kvTY4vN+qvN0ovPr7/InbfCqxeymwuxfkuwAWuzQ2Oo/fOrz7ujL1Oilv+e7yuZNh+WMreQma+MW +aOOovOGXs+FTiOGcteCKquA6d9+Hp92CpNwwcdx5nNt8ntonYNhsktc9c9cnaNcfXteHotZEetV3 +ltJFeNI6ctIzatI/ctEFVNAtZM86cMwARsgARcMAPLchVLYgVLYKSbUUOqsAMKgEFpEDEYwDEIzO +lLZZAAAALXRSTlMABNnPzKumki8iDv349/Px6eXevrm3r6CNgYF5eWVkSDscvr2WlpWVXV07OR36 +SNCtAAACa0lEQVQ4y2KgL1DUYBdhZhZWk+XEKs3JLrRm4SvnaW8XFwqKc2DKywl87d8VbGRUsmlz +qcFKPmlGVGlGiXXOwYFBxo2JTu1Hj5VucdnAxoWiQKKw0yrQ2Ljt+dkLL+07ok9vOxfAxohsPkDr +Oq2CjKwrH4YU6x9MjLbvcaiK3CiJ5D4BZ5B8uend4pAQ/cexsQ7TErY/4tGGK2D/EhxoZB0aVtN/ +SV//elKsg0GCy8Qd+awwSxSF7K2MgfLhps1OD6Yk9TgYOLqYvz/Rxw/zrOaa3SXGIPn2KHuDyY4G +QP3mhu7PrgbIwGxYuPVQeWW4afSU7tvdN24lOT4xN5yVsmRmPitUgcjrsjMtNaaNE+4d0d9XrZ9o +DpLP1ktbzgJVwOxYYWcX2dzWcfNFg02TjZOhYXKKt65elg8TTAFA04EKevsuR0VNv1jdZOKUnJyW +q6tbgFAgPGd/b3y8mdnU+4a2da0mzp7eebq6en5ZK2BWqCwui580yczVIvUjSIHbZ5C8pV/GajGo +AtnCw9fMzFxnWKQusK3vMnFblQeSL0hbLwULacHJka4geQ+oAl29At+iZYt4FWBBLb6yaqqFxVyP ++Z9ORsTYuFnqWfr6+2WsFYXHJwffm5Z3Hh7zvZaeAir48AMoX5STyy2PiE7pDXfi5np5ebk3nI+J +uLIMKL/E87cqcoICjC1gYty8pRP27qmtPb7zwDf/HM+fyihJiotto3vc7Jlz0tMzMzPTczJyfynp +oCVKSZ7v7k9nz8v29s72XLSWWx2mHwG0WPkD8pf7+KxYvZ5XVB5rzuCQYWVhYmIRk1JgZKAnAAA2 +GtqX4YhcmAAAAABJRU5ErkJggg==} + +set _AP_IMG(light) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAA0lBMVEUAAABCLwM3KANpTg3xww+N +cAiJWAmAXwh2UgfznBLxww/znBLxww/znBLktw7jkhDcsQ3Yiw/OpQzLgQ5YYWJ6YQd3TAhvUAc1 +OzvznBKTnqCGlJXuwA7vmRHmuQ7kkhBteHlseHjUqg3Shw+7lQu2dQ1zd3pqbW/znBLxxA+Vpaby +mRK9w8evubyNnJ1/jI3sjRnroRjwvRDmgCDrihvwlxTvuBLwwBDfw0zTn0TohB7ojR3qmxntjxjs +pxbvkxbtsBSTnqCGlJXbqFPOk0rqmRru19ABAAAAKHRSTlMABQEc9FBOKCL5+fTu7aCek5J4dlY1 +NCsc8uHhysitrJKSfnxfXVZVmkHxmwAAAQtJREFUOMutksdywjAQQGVswEACCaGl92QVp9gYcEtC +//9fYlfmgCzpAMO77pt5K82yI2P1KuWuZRxXWw0Azp1mVTsuPdcA4Uj9qaQRWiDggqZqXMCuwNvF +uVuThbpbEM5BFvhZYcPTonAib9EHxPPAAz7kUURGXxIqNE/TaegH4SzLyCgrwnjkh9M0m4XBeqII +PUBGgI0IG7+U6EqCRUv6Xr7kMKAlLfWZ479c+J+oz2R2gxpCEAXH1n01NbaFtnoKt3kjL9xojsK9 +FA1RcLQX8SoaovDCtNxTgwp3TI+dJKskXsaxzQx8IJ8IM/GDkGQUvpEvZG9BTRy8ZKdzvZhfvb0z +M4PHhwHbjw1MDTrBW9YqjQAAAABJRU5ErkJggg==} + +set _AP_IMG(lock) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABoVBMVEUAAAAAAAAAAAAAAAAAAACa +mpqRkZG4uLgAAAAAAAAAAAAAAAAAAAC+vr6zs7PY2NjBwcGtra2hoaGYmJi7u7urq6vJyckAAAAA +AAAAAAAAAAAAAAAAAACgoKC8vLy0tLSnp6eQkJDDw8Ovr6/Dw8O6urqqqqqYmJilpaWUlJSQkJCs +rKynp6eZmZmlpaWTk5PPz8/Cr2DXvFivr6/85Ej20B359pD+7lH61wTQnAPrugHGxsbwwgfKmQXU +oATMmQLywwXcqAXTogTltAPZpAPfrQH87FLouQTNmgLKlwLVowGoqKiZmZnbrAXIlwTOmwLSngH6 +40n31gfXpAXuxATvxALeqQLbpgLVoQLwxQHU1NS7u7ulpaWhoaH695D49Y/zzh/OnQviswXdrQPB +wcG+vr6jo6OdnZ2Li4vLqF+4lVuui1OdeUCSbTS/kA7Hlw3ToQvHlgb72QPmtQLXogLyxwDotgDh +qgC2tra0tLSxsbGbm5uJiYnp2YiAgIDZvGy/nGHu0l/bt12nhEyjgEiXczr0zx/Bkg3isQjJmAjr +wgVE4uQLAAAAMXRSTlMAJBwQBgL+mUYpIRULCDH++PDw8NmYl0pAPDcyGA7w8PDw2NjAwLCwqal0 +c0FBNTUv1c6jXwAAAY5JREFUOMtiIAnwsYsICIiI8uGQ5mVPsTaOSTPmj2LnxSqvmuKd7u0dE8OW +EaWCTQV7aqy3mo6srK56Wl2UGBb7o71jtSFMrfQMfgMMBaKpPhowtmaNNaYRypVsejC2PpuxEoYC +Y2M2VhiblS3WGosCYQRHsRqLgiohBEfYB4uCCkEERwibgmh5BEcBqwI5BEcQQ4FRY1NmQ1Z2S05u +bmtOc3ZWZn2tIaoCE1MHK9/E/Ly89vzEgo5QC3MzNAWAPskkB0EYCsOxYMLgXqZzKCQMAipgoqCg +4MYBL+CAegMTPbXPIjHRSrf9+k/pdKN7Y8c43Lf72M6T2XBNUBiMwsDSzL7tAtD5AXRv51gTAwNL +tbsiWQAQhGaR5g+wICr4WGEBCv9CvoC6kJrlRxkozFVSSAD8dwvYgQR8WpCGupVD4QxuQrLoYQuc +4VS2IC8ZZWkt4ANwvZyPX0s2SyDWrDAqKqD6w3SL4hHHsrIkCgzTbjOMIEoyy3KIp1o0fk4DQ/EK +QlwDHw4hhafglgaRJ/VHdZz/RDBtAAAAAElFTkSuQmCC} + +set _AP_IMG(mail) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC8VBMVEUAAAAICBUBAQUAAAIICBkE +BBALCyAAAAA9PKcAAE0AAD8AABUBARoAAAYAAAYAAAAAAARGRpgAAACQkMonJYIPD3AUFX0KCmIF +BFdtba84OJNQUJsCAjcyMooAAC0vL4BcXKIBAS8nJ24AAA5MTJ4WFmAUFE8AAAQAAAlHR5kQEEYJ +CDEAAABISJoPD4YwNJotK5U/PpqHh8YkI44WFYplZLmLi7+Kir5xcbhTUqWMjMFgYK8FBGNnZ6ta +WqkeH4FJSKMMDF5YWaUAADtDQ5kAACFZWaMAACYBAR1DQ4pAQIwBASQqKn1OTpwgIFYuLmtISJkR +EUUUFEr////Py//z8v/w7//r6v/p6f/n5v/g4f/V0v/Nyv/49//29P/x8f/u7v/t7P/Z3f/F0//+ +/f/6+f/29v/f3//Y3P/Q2f/N1/9PT57n6P/m5v/l5P/j4v/i4P/I1f9yc8BZWaf7+//r7P/O3v/f +3f/U2/+AgtKGh89+gMx7fchvcL1pa7dmaLRlZbNgYK5UVKP4+v/z9P/h6v/c6f/Y5f/h4v/Y4P/V +3P/c2v/S2v/P2f/a2P/K1v/X1f/B0f++0P+6z/+zyv/u9v75+f3Z3Pvu7fnV2/eZmterqtF1dsVt +bbljY7BdXaxcXKlRUaBHR5rV4//c3v/b3v/J2P/D1f/Rzv+3zP/f5P7Gw/7DwPzOzPbU1vS3tPTc +3fLZ2vCuquzBw+vExOitrue9v+ajoOWRnuTGxuGRmdyqq9qWlNqkpNl0f9mLjdhrccx+fcd4ecNm +acJdYb5QWL5naLtpaLVUVK/z+f/p8//l7f/S0P/Qzf+pxf/EyPrW4Pm9wfnHz/ituPja3/fo6PWr +s/Lk4/C6w/Di4u/Gye/V1e2vuuustuu4uurLy+W4uuXBweO5uuKamN6srd1/htygo9uUmdt2f9mO +jtihodeentOFiNNkbtJwd893d8mGhsdiacZ3ecV8e8FaXr5eX7dcW7VFRKtVVqZJSKMkKZxIvdtU +AAAAU3RSTlMABjUKJg8cFPzVtJiAbFZOQTEf/vXu7d/X0dDPwru7tLCbk4yHfHZ1YVtVOy0T/v39 +/Pr6+vj19fXs6ujn5eTi3dDOy8CysK2hm5ONgoFeWlhCPxvI5soAAALJSURBVDjLYkAAFU8WBnxA +0Oq+rRorHgVuN4On7ZbWYsYlrzk7GAhmCMtrY5fXlZwWHJxSkhK80UIJq1NUdganxsaFhiXExT20 +U2XFdKFZSlx8WGJ4RGR+fmL4XiktRjQFCtfjIiJy8wvKy7v7JkTnrTOS10ZzYRpM8szZkJiY6IIt +HGqMyC6cUQCSjF4RAgQxazbtKap/ai+AUOC7Mw9J8mBDU/aiysv6vHAjBM0jgVIxMavXPz7YsDB7 +YdOCHweSZh5VZIe7cEM0UHJ71fHi7Oym4vmN8xqPXAxu2eeoA5UPmL0WJrmgcV5DfV3dkWvNwak7 +xPihCpxmfV20aCFUcm5tbdGXHVODU1Nu/OKBxov03fO7Dp+YD5Gcc6jm465TKamxsauOcrFBFADk +9Sw0rfNO1bFjRZ9qaqqrDlROBYV6Wul+CSaIAv8POWGxJc0bdlfPqX6z/8W7q8GxsWmh8eFbxfgg +Clisp0ckhIWWBM/YMqty39vbwWlpLaFhpeFrOaCOYHTZHBGRGBYf2hw8bePzbcFxLaHxYeGRudMP +cwlBjFB6FdERGQ5UEh+amlIClE0oDc/tSM+oFIc6wq8oaklBXmR4aWJCYkJCAjjS05MquraaaEBC +m81yXWdGelRebmQOEETm5nVELc3oySq8xKEITTmy2zozK5KWpqdHgUD6kqSMnt7+5JXL3sMcAZjP +6/bCrMyeiq6MpKSkjK6KzKz+5OVl7VNfckIdETR31aTkwv6srN7MzMyswsLexe2t0+/VfNeTgypg +c5g5efKkiROTk5MnJpe1nb7yoPqEsY2zuzIfNMYZZR8tnzJlyspJyxa3tt6a9c1AlNNVmVeAhR2e +ZFSFy85NLmu7sHnvHENRThluXn4ddpQsFmh6sm3mk88/RSTkuNX5mYQw8h+r1KH5IuIyHup8TGzY +MyeTNzePhgALKyOGDACYix+/wCiOwgAAAABJRU5ErkJggg==} + +set _AP_IMG(map) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABqlBMVEUAAABwc3ZqbW8quGYtiMPx +qRHM0dRydXdQU1VZW1soKSozuGa9w8fs8PG9w8e9w8fs8PG9w8evtbman6KytbaQlZh6foF7fX5z +dXVdYGJYW10+QEJCREU7PD5Zncgzi8RYv4WJlnJTtVNuskyasTPWpSjIrCThqhnq7u/m6uu4vsK1 +u7/U19jLz9CZm5yQk5MnrmAuzHEpgLm9w8c0mNvznBLxxA/s8PHswxLvnBIuy3CCyEabxznMxSHn +mxnm7u5dq99GoNxHnMWtvsFKj7s2hrktgLVfoqw7gqlZ1I5liIZBz343y2s1sGpHymRSyl42rFlf +yldtyVBxp0OApj2KpTmwxi+ooi7rnBfQ4u251+qizOeLweR0tuLQ6t645s6jt8SPrsKFqsG+wcBy +ob+g4b5onL5Uk7wvgrmJ3a6PvKhDg6Jx2J7JuZxxuJN2p5JYhpFot4zDtIJTtH6OrXlKsniAjHBn +r2mNjmWmsl8qrV5MqlGokU9XqU1iqEm9uEZsp0W2k0R2pkF5pkCaozPOljDVvSy8xinYmCjCoCTN +nyDXxRvgnRnlxBQuyW1pAAAAMHRSTlMAVFT+/v79SyMaAv789/Xb2c2ihnp4XDo6MTEZCwn+/v7+ +/v7+/v7+ubmxsZqaWlorGT1xAAABaElEQVQ4y63TRVMDQRCGYSAECO4SwV0ns/TG3d0Fd3d3d/vP +sKlki91UzSnvsb/n2nm5q7SkuEnEPclaJJmpobamkipSKCqq+4frR5tE0pbGusGqcio/BQooamnn +8OCkzOPa3liZmzUoFEWUZXP3yMeCsyRADAnk6Tyudh9iYgG6VQE8MSCdAPEAuleBqosE0CNAn5cE +UBSEGiJAMeGXmghQNx0mg7IfnZoIBFo6xAERPvAr3/6Bqw/gA3mcDmRA8FkF2SBEx9Mg8g3w7s4C +ap3S7w2ENdpegOS5HfNAp0aro5U0kxAetjDmgmBCSLP1uDHmgsuoHv6A8vXu4njPYS7EPHDzCaDv +cJjH0/FBAgCunYWZORsAvOxjTAD6UzsmAifGZICZbK1GEwesW1lgW1tesDB/YZiYnJqeMZrarKuL +8xTFgvKqobpGsVTUPFY/MlBdwfxFZU1tQ3FJaQpIxLI8TqJmZspZv5UVjKLLx3FmAAAAAElFTkSu +QmCC} + +set _AP_IMG(minus) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABZVBMVEUAAAACQx4ARxQAXAAAVAAA +VwUAWwIATgAATA8AUAwAQgwAVAkASAYBQx4APg8ARQkASgMAPRYAXQAAVRQAZQQAPxYAPhgAVwAA +XQAAXAAAXAAAPxMAXAAAQBUAPBcAXQAAPxkAXgAAYgEAYwIARiAARiIARyEAZQX////7/fsanRoY +mBgVkhUPiA8Ngw2Nuo/x9/HA0smkwq2kxqmKtZACeQKkwK8MmAzF6MWkxKqLrpeKsJVvwm9tvG0c +nxwXoBcXlRcVgBUTjxMSjRIRixEMgAwLfgsKkwoHewcChgIAfgCKs5JptWlpsWlmrmZZtVlXsVdU +rFRSp1JPok8IjwgFiQUAggDD1cvB58GKsZSQvZNquWpUgWVculxaulo8b1AhdCMImggFjQUAdQAA +cgD2+/b1+fXu8vDj7uTa8NrV7tXN4M63y7+vxbmZwZ2FqJR9sIB5rX11qndxw3FXpFc2gjgXbhmS +29NkAAAAKHRSTlMA7+nK6ejo6Ojo6Ojo8ero6OXALxrz6eDVzczCu7e2raiXfnFTQzkReneJLAAA +AQlJREFUOMvtz0VTw2AUheEACbRJqOPut46FIsGltPGkFOrF3eX383FnmmERtqz6rN/FOVSTLTTW +QzM0TXcQPh/P814vy7Iez9A0hWYC9dfkIpIkqVBYI1aJ55o/iMHE1z04uq6NYjD4Bn949GPQV4RL +RVVVRZFluVRaJ0RRfBdv4bgTg7YkzAoX54KQzebzmczRWS6XTqdSpycw12IH24cH+4lEPL63uxOL +bUWjkcjG5vL/BvZIspGMJBt/j+wvwtWHZVmmaRqGoeu6pmnVSqV617gZeAEIOwB46MZgvH4DjsLl +YQxCvZ9PC2iFmEdLP8pdUxQKjrQTDMNwHOd2u10uVysamKSaGr4BP6FXYVglFIYAAAAASUVORK5C +YII=} + +set _AP_IMG(misc) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACqVBMVEUAAABiEgABAAAhBAAEAAEA +Yg2dAADufxupAACtAADDTAcAExM5CQEMAgQNAQODAACzKSn4dwcAWS3mPgCcISExhSbuYwAojBaw +BAQASy4mjx/MMQAflh20JyepZxadAACuJCTQXhnwXyEAOCJ9Dw8HTCVtDAyeCQkkLg8OaBIALCKW +GwAwHBDnWiZ7AAB+EgAJeg5+AACTNhJbAgKZBwdEAAAAIxduGwCZBARXCQDOTSo8AAB+KgJaCwAA +TBcAZQDlSipGBQAwNQprAACPAADlRjF+AAAACAqRAAA2DgQAPiHlSSkAWQeNAADiRS5lAAAPAQD/ +AABmzTMAmTP/bAD/bW3/Z2f/wwD/qQD/cAD/fn7/d3dz2kAAnDRs0DP/3AH/bgD/cHCc/2yA5kxt +0zVq0TUAljNKvzEAgjDaAQL/twD/qwD/pgD/aAD/XwD/lJT9Y2ON9FpozzQAoDMAlzNhyS7/0AD/ +tAD/cwDqAQCw/5L/j4//hYX/goKS91z5VlaJ7FCB6E5q1Tlk0jMAhzNHrSc3kSR6Xwr/+wD/7wD/ +5AD/0gD/rQD/nwD/lgC4AwD6AADQ/8Wu/bKS9Z7+mZm4/5Sa6n7/enrtd3fxaWmX+GhX12Nx71Xl +UVHJUVFEnVDST097207/SUnsR0fdR0f/Q0N53UJn1EFHzD9cyzs3qDhx1zUJnjUAkDXoNTUdpzQU +pjRSwjNEujM3tDMwlTMAeTNGvDIMjSovqiguoCg5iyFBcSFMYyEtmSD/HR3/HBzcGRrSFRb2uBQl +gw9/UA73rA2TKQx6MQtSdApEfgn/nQiBhgd3Xwf9uQT/AgLeiwGtDQHyAwH/1QD/xQD/vwD/vAD6 +nwD/mwDPkgD/hwCNfQD/dwD+UwD6UwDwSQDwAADTAADGAAC+AADgCRWwAAAAUXRSTlMAkwo8FAXv +7uzrz4VdRDMa/v36+vn4+Pf28fHx6ejo4uHd2dLR0M7My8jExLy4t7Cuq6qqqKSimpSSjYyLhYN4 +cnBlZGFgW1FNQ0I8NSwlJSQnSBcAAAAB1klEQVQ4y2IYSsBX3ZgFwfNWMmJBlXeRnTlXhRfGc2A/ +e4rLE0ma32RB7fTEAgFrJhDPT/fopfCsCEEbJpi8h8KM6qjo0LDQJWrMDAyu7PFdZeHl2T19XMwQ +eYt5U/JrQArCQgtEeKwOdXTGAxVE5GRHiPGAFUgsygcpSAQqqD9oqhgPVpAVEZF9PdIcrIAzcH9i +dW10YmjYusxHGnI5WfFd3eFZPTk3E/IYoQoCzy2NioquP5B5YfeKnaevZYd3X77aezs3EqqAIxAI +9hUsznxwfNWchpgdJ29ElF/pC8kNQVEQOCGzf8/spLrkmJT0w7dyenNDQuAK2CAKjs2fPDWpMDkm +KDVo74nzCSEhCRV3LMEKAHOTrwQqqNwyaWIVSEFRUFzT9jMJIZGR9/QDoAFp+BCooK1pGlBBY0xR +3MYNGe0JFbnSjoiwdma7f7GtuXThrLrGZambg2Mz2ivuavMhR5a/Xv+u5qDS1OSG5evTSmIzjgjb +MqHFt5NUahAQrFyTFhwc26LDjJkiZFKA8nHbgPLBxS3cmPKsBq0pQA+klwDl10q6M2BRYS9emgJU +EFu8VYsPe7Lz0WxdnR6bJsQNcx+mIXaimzKUefGlXS9VMxaGoQcAAfitC2SjL/EAAAAASUVORK5C +YII=} + +set _AP_IMG(more) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAqFBMVEUAAAAbeUMsxW0ptmUVYTYU +XDMdhkkOQiQnsGAdhkkuzHEnrmAnsmImrl8lplslqF0beEIZdEAbfEQSUS0WZzgSVS4JLhguzHEu +zHEnrmAty3Amql4sxGwqvWgnsWIjn1gimlUfjE0lp10imFQhk1EPRCUuzHHs8PEnrmAty3Aos2Ms +xGwqvWgtyW/f6+fJ6dmo48OP3rKKz6ly0Zxg1ZM7znksx24puWZgeS4iAAAAJnRSTlMAVL+qVDVY +FPxt+Pfx2aCIUEY8MC8kBObh4dDCtrCamI91aVRFCsRBYr0AAADeSURBVDjLrZDHjgIxEAV7AxPI +eZec7bHHQ2b4/z+jpUE0UuPmQl3eocqybPgM/VLzi9HsPvzqX71k2C78UvkorwHplZWXvw0GDSUQ +YDCWggYG31IwfRf8PILzWfGl4LLTendhS8FBIwe2FOw1smdLwUkjJ7YUuON2e3RsKchsktiMLz3T +pKlhS4H8UZN3QV0K6hjEud+nMQZhNfP5vBoCEkQuN9ya3EUBaqRVS+z9iE2eqLVQFnQWxZXR/Jfo +wBMl1MZVAmBQYK6DLghBZkchCEFqZ30Q6FViEAnbPnMD7FtjEAJv9ScAAAAASUVORK5CYII=} + +set _AP_IMG(next) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACPVBMVEUAAAAATc8AT8sAUNAAZvUA +Z/YAZfEAMJkAVtcAL5cANqEAUM8AY+8AUNAAZvQAUMsAXOIAZ/YAO6YATskAZvIAWdwAOqYAafgA +RcgAJpMANa0AVOEAY+8APbMAZfQAZPIAWtwAYOkANKcAKZMATc4ARMEAVNsAZPAAW+AAYu0ARr0A +MZgAOaYAaPcAYOcAZvMALJUARLsAUtQAUc0AM5kAS8UAPq0AM50AQ7cAUc4AX+cAZ/MAQrQAafgA +Uc0AQbAANJkAU9EAZvMARrsAM5kAavkAWNoAUM0Bbv8lif8UfP8EcP8AY+8vkf8ZgP8Qef8Ldf8A +a//S7P/F5v8riv8cg/8jgPYKbPMBUtMKOp7f8//M6v+94f+x2v+p1v+Vy/+Gxv97u/9wuf9frP9a +qf9Sof85lP8OeP8IdP8Hcv9Ln/0rjf0VefkVdfQCZfQAYvOezPEDZvEIau8PZeMAW+AbaNkBWNkL +WtUDRb8KPaYANKPW8P+04/+s4f+g2f+k1f+b0v+V0f+Hwv9krP9Emv8hhv+33f54svxBl/slh/sB +bPugyvptrfodgfoJcPrb7fm11vmAv/kbfffF3/bC3fVWmvUhfPWcz/QOcfSDtfNanvMRcvMPcPKW +ve5Ynu1gnO0ve+wAYewAYOykwegAWehak+YAXuVPi+M5hOMlc+Bsmd46edwvctyCotcDUtdVi9MA +SM4XWsxCdMsybchniscASMUUU75Qdb0FR7sfU7gAObUzWq4AN6wALZwFNpuBXfs1AAAASHRSTlMA +/Qnr054E7OjoxrqthG1SSjorIh4VEA/9/fr29fPw8Ozp5uXi4t/a2dHRz83Hx8PBvLm0tKKYkYV9 +fHVwZGFZVEg+NzYwJBvrXJ8iAAABcUlEQVQ4y2KgG3AxUTZwwKdAe9+W3ZLmYrgVsEdO6d++l0sI +pwLOyIKgqLWVSvZ4FNTERC3eKWXBhMOKyum1DXFBkzftMhTGqoCran1dY0J8cNCqClV+bAqEdKo2 +T0xISoytnrtRghebNWJme7bNS0pOjo+esHqDkRs2Q2xkd6xIyWpJjAleuk5NAJsKZ62K0o60kNS4 +6JnF0lZsWFSImm4tD/P0CmkK7l6whEcEmyF2zBG5Xh4BzbFtU330sSkAzJE5IjzDI9Mrpb4njwVT +momXcc00b4/0UF/fsDxdVwx5YW7G5e3+IPns8HxWcQx5fpXy+anegf6tvmGFcraYxlsyls5KC/Tw +98zO9WERxJB3N2ZcmeUX6O3l2YnVeAbuiOIQf5D8pEJ5Pmz+Yy7LCfDI9POcDTEeE3CU9Xln+PUW ++bCKMmBXUNIVEJrjI2PNhiPJKZQE+M1ZqO6EM9FqLJtRtAgRP5hAQE9Rk4+NYWAAAA3CZcGk/mKZ +AAAAAElFTkSuQmCC} + +set _AP_IMG(next2) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC+lBMVEUAAAAAQrUAScAARrwAN64A +Uc8ARboAOqUASL4AS8IATMUAO6YBM6gAQ7sARLwANq8AQ7gALpcAMJoAQrQANqUAMp0AOq8AOa4A +U9cARsIAOK0AOrIAQ7wAR8AARL0ALpkASMIASMAAUtMAT88AOqoAPq0ARboAWNsAMpoAPasAWdwA +Uc0AWNsCVdcASckARbsAMaIAS9AASswAVNYAO6oAUdUAObQAVtgAOqwAR7wALJgAVNgAUMsASsYA +L5wAQbwAVtkASsgAVNgAQboAN68AVNgASskAMZwASckAOq0APbcAQLgAVNkAP7EASsoAVtgAKJUA +VtgATcsAQ8AAQ7cAMZ8ASb4AVtkASsgANqQAOKEAV9kASL8AV9gASL8AVNUAP7AAQrQAPKcAMpkA +MpoAV9gARrsAWdspjf8Ndv8JdP8Uff8Se/8Ldv8Fcv/D5/8skP8mi/8Cb/8EWdnV/f/S/P/K6v++ +5P+t4v+RzP+KzP+Fxv+Bxf96wf9ptf9Vpv9Pov85lf8vk/8jiP8ZgP8Rev8Abf/B7/1Hmfosifgx +jvdTnfZElfYnhfUqg/IffPEadu4nge0FZeoVb+gCYeUOZN8bbd0HXdxSj9oCVtgOWdAOVskXXMcj +W8EES8ENTsABRr4LOaLg///M+P/X9P+z5/+13/+l3v+a0/9/v/9wuv9xtv9msP9dqf8ylv8hg/8f +g/8Aav/M9/46mP4ti/7o8vxcqPsQdvtTnPozkfpwtflgofhCk/ccevfM3vSAvfNkqfLA1vFlo+8u +hu+wy+5vre6jwu262eyUuesNa+p9quhcluglfOh0o+eiyuZimeYieOWlyeQUa+R8ruEecuGAseCW +vt9yp957pN5dmNyKsttclNsXaNoLXtl8qdgXZtgRYddsm9Upa9Usa9MfZdMHWdNfkNITXNA8eM8C +U89Ogs5Gfs5QfcktZ8hAcscJS8dDbsQuZsQHUMQMTMQTUMJYhMEyYcEZUsEeWb4HS7sdVLYbT68n +TacSP6GpU5BtAAAAaHRSTlMAJgIP0dBFHRENCQf49Oro5eXk4+PZ1M3Jx8W2saSejYZ4dGNgODQr +JiEeGwr9/Pz7+fnr5+Ph39/e3NLPzcvKwsLAvr60s7KurqyopaOem5mSkY2IhH98eXFrZ2JaV1NK +QTEoJyYiFU6+htUAAAHuSURBVDjLYhgcgI3Fkx2JG2Ulz42qQOrNBxdmOI9d9OufAFQFLDe2fpPm +hPGSBc8d/yvPhKxA/PaSfXO9YCo0BK8uurgwFMWEmxVlB7/LQTWlCF1eWnJtYSSSArEZFZVlR74E +Q1RoCF1fvqLkloEKQkHI/KNVK/OPfVYA87jdf++vriy9x4NQwe09/8Cq1fkn3kdAvGH3a1dddelD +ngS4Cg6Z2d31a/JP6SmDuZqiP7Y11Cx+xp+IUCE5q6dxbflZI4iKJJE5HY01m17xq8FVaEvO6txQ +X37eMB7MVRWZs2V9bftrMyQVtndb8hqWnTZNhagweZCdVdv+whmuADBOx+LMtry6Q8bqYC6jxdPc +jdlVM+xh8sxuj/a2ZTZP0I2GyIu93V7U2nyfjw0qz+XxeHdWbmH/TCWIN8Tf7SjKybjDC5Nn8nvS +DZYPhxgn9bEDKD+NNw5mQdDznszcwt7iQIi89Nw9eTkFV/RjYPJKL/syMzN6i/2ZwMb5/uzLyim4 +sEAR7gObKXmtGZ3TfXQgDhSekpXddAZJnoF1UnZG13RXoDxEwaSWponzFBiQFJws2DnVKR3KYxSY +vO7wPDkGZAUTNk+V0GKAK5jY9UmWC1mBxORL1lpwXprltNkyKPIMseYO6kjcMD5ZDobBBQDJSqj/ +eirWdQAAAABJRU5ErkJggg==} + +set _AP_IMG(no) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACW1BMVEUAAABmAAAVAAAAAABkAABf +AABmAABmAABgAABiAABJAABmAABmAAA8AABlAABeAABmAABmAABLAABmAAAAAAAdAAAAAABvBgZV +AABPAAA6AAA5AABmAAAfAABhAABkAABBAABVAABVAAD////Fn5/eAAD/AgLkAADUAADbAADPAAD1 +7++MMDD7AAD4AADnAAD/CwvhAADYAADLAAD/zc3/ubn/c3P/RET9AADxAADrAADFAAD/9PT/3t7/ +XFz/VFT/TEz/MzNvCQn/CAj2AQHtAABmAAD/4uL/19f/ycn/xsb/wsL/tbX/fX3/ZWX/IiL/Gxuf +AQHzAADpAADWAADIAADCAACaAAB3AAD/5ubiz8//v7//ra3/qan/nZ3/lJT/g4P/amr/YmL/OzuC +GRmfFxfiCwvvAADRAACQAAD/29v/1NT/0dH/vLz/sbH/paX/mZn/i4v/h4fFeXn/eHj/bW2oZWWf +X1//WFiyUVH/LCyMIiL/ExPiDw/iBQW9AAD/7e31w8P/oKD/kJD1amrFZWWoYGCyX1+oX1/FWFj/ +UFD/SEj/QUGMPz//PT2kPDyVPDyVNTWfLy+MLCz/KiqCJSWfJCTFEhL/ERGqAgK6AACzAAClAACB +AAB9AABxAAD1xsbYv7/rrq71pqb1nJz/mJj+k5Pik5PYkJC8j4/Yjo71gIDFfX3/bGz9ZWX4X1+y +XFziVlbFT0/iTU3YTU3vS0vFS0uoSUniRETiOzv/OjqoMzOVLi7FLCzfJyeMJyeyJCSCJCTvGhqo +FxePDw/PCgrFCQltAABsAAAHMZJ/AAAAI3RSTlMAoBkD48x/v45vWE8fDvG+r185LyIWCe+ZelJG +PzPYwmJMJmB7bb0AAALLSURBVDjLbY/1W1phGIY/EOzuXFHiJAww2AxqGOAApUzAqRhTZ7duOru7 +193dXX/W3u8crwsW90/nOvfzPu/3Ihf8fNwpHh4Udx8/9D98AqWL4/du3WnreScN9PlHh3gst6mG +TxCY88f6PEL+9O7Stvphs9l8CjgJNE1KvVw95fMI/K9XqRoaGlNTU/Py8kvvVlNc/OqlehVWefkF +BaVNosLCs2Vlo86E1+qIqhEkdqDKm5vPV7RU3nheHUR634grhCUkuOuVF1rPVanV4g8RvuSC8QKR +SFR4dWF2DAZBLs3OizusDx5+2aEQBVJRa0V5+bVEC4M5CZPtS0yG5W12WpFOwfp5DAKejyrb1eqq +eQuDwWC+EFvXmPBh2WTzdJkcoycEaDfFYnG7eIGBYb4/gz3j+Bqbn6HnSGhusKFFY+3ouP+4k0yQ +PnEwnV+rT+L+oqLY5SqbTaPR2J6SCdLXsHlyhYCVvHsUeb20dmdhul91Or0MNmRyWMUOL+Teo5nK +xkzlvO4iA4kDQna6vFaQxI03ekIgazoHM50G7yNg/pARN7CS6yAQ+7F7Jg0zQ3gyIeHJ8RPjE/a8 +UUi17Y3dPme3H9xHJgwZREGKKQYh5Wgu5uvBfRfJxJYAFxiUYQgFPllZ6e3tXST9QA2Z+AYnJKRo +A8IRCuqbKwLWmYQXCgcnwHcN4QWSvSgE0J6dxqzfhvuFMnY6a+Jy1zYrOT6hZJNGBQ8Vuf39/Rsb +37WDoHl8XbxxiMUFbzBFuSHM4U9CQCZjYy3PUAg42KdIHHQowIT5S9gg03mEzhQkQT94LS0OHRDs +b+Dx+Xy5DmtOEhfvl2j9o4kFZIK2o8+oVWTqQbO4xXUpJUOOQ9HhyAk1wLQlEHAIDfUl2v2AOJh3 +wc2bbjIauMlYbzv26Ueo6G/8giPpSuWuSamkR8ZQneOuLX7UUG/v0NAw1+W/AYaw3s2DTtK/AAAA +AElFTkSuQmCC} + +set _AP_IMG(none) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAQMAAABJtOi3AAAAA1BMVEUAAACnej3aAAAAAXRSTlMA +QObYZgAAAAtJREFUCNdjGOQAAACgAAH4BzM6AAAAAElFTkSuQmCC} + +set _AP_IMG(ok) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACTFBMVEUAAAAQfCEZcTMfZj8MdyIa +ajUdiTImbE0UlSMKlBoga0YPdCkJghoRcS0vSWMPcigHfxUvTF8GhRIfZEAeZT8kYUgva1UIoBMo +bE8QjyMWiCwSgioDkREIkhYha0cWdjQKogwcakEBkw0JhR0RhCMAmQMZbDswU2IcaT8XbDcAlAYv +UWANeiUDlwkWbjcAiQ0UbTIoVFcLeh8AkgAScC4jV04WazMQhB8sTFwBiwkqT1gLeh8fXkQBmQES +cSomUlMAlgAbZDsYajQmV04IgRQiW0kMexwGhRAWbDIAjgQhYEMSdSYoU1MGhw8DjggXbzEMgRoA +kgMwSmGU41vG8Zi77JLF8pG+75C874zG9Iiz6Yi774K07IKu6ICy7Xqt6Xmp5nm68XSh43TA9nGZ +32rU/2mU4miP4Wec62Gq9F6X5luH3VotdFKJ6FCJ5VB030k7mEhew0ZQuENBrEBXwD5EtDw3qDtS +0TouojgwsTEimTEopS/m/rfX9rTX+KzN96TE7qLR+5S06o657I2p5YDH93/A83627nql5HnG93jK ++nGw73Gh43Hb/2zC92ug6GrM/WnG+mfO/2XC/WO4/GOP22GR31+K4FmP5FaN31aR6lWK4VWK7lSR +5lR92VQ0elSI3FJvz1CC4U963E+B2kxozEx72Etr20dt20ZfykZWu0Q3lURKs0Jj10FTukFOy0Au +kEBLuT9LuD9d1D5Qxz1cxzkkjDlAtzgZfjZBzTQlnTM8wjEekTAkni8ily4ZmSkxvCgXoSMeryIZ +rhizD+3uAAAAU3RSTlMADwYCjTH+/fv28rKxraupcFdEIBUM/f35+fDw8Ovo5ubi4t/e3dzb2dTU +zszGxcS8uLSko6KgoJWRi4KAe3p5c2lnY15WVFFNS0c/ODYxKSccEylOq3oAAAFgSURBVDjLYhjc +gMlB1RaffKDx4Z0KeOQ9tQ7MKdfFKc1oKb55SrmSHy55X/1DualrZYRwuU5Adndmbz6nO8w4IUYU ++QCegysmpy7ndIEJmHPwIKtwU66cNWFSPocAXERlfaURXAUji+SWzK6JefutEVpYSnOruaEqvHWq +Fyd39i2qYmFGKGCVmp2xl18U5Do76e0ZrW3Jebv4keQZmHlLG9P3mTAx+PPuWdkdGZ04t4Ib1dmA +ebCl12RXmTnJl02PDItOnFFhIILmb71N9XXz2HZs7A8Lj2nPKtMURg8Zx21ptSELl8aFNMfEZRWr +sWIEnYjGqoiG8IjQqNj44GJFhDwC2GxIC22Kik1ICF7D5YUt9IXlCuNbOpJ6gou4XLHHj+nq7KSU +lJlF7M44ItBHonDa1AXr2O1xJQBmw4JlS0pyrHCnMEGxrSU5Fsy4FYhqF8znY8KXiAXV+YIYBikA +AGohXIBj7c0DAAAAAElFTkSuQmCC} + +set _AP_IMG(other) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC/VBMVEUAAAAAB5kAApEMPNgGWhwA +Dp8AC54QQNkFXhgGVCENOtQLNc4KMckILsYHKsEVVTgCHrUBGLEFJbonaT8GYhUGJ70mY0IfXT8B +GK4EIbYJUSsETSUCUxcCWRQNTzMAKnIBVRcCPi4CHbMFSSoAFqkAKMAAFacATBYATxYADJ4AUBgA +EaEAEaL////x8PTY4vPOzdlv0kA/uB+t8p2h6otgyi/Qztl711P///3h6ffM78mU43mI3WZInv+Y +0pN7vf9ss/9Vpf9Oof/5+/pXl/AQO9MQOccHLcIHKb6tyrOw3q64+ao4gkA2iDeHxP9msP9irf9d +qv9Bmv9Ilfk2fu0weuxyoeMNN84MM8rI7cUJMMUCK74DJrqrzKyY44aW5XqJ3mc9eVE+iEMtiisl +hCEWehKfyf+Nyf+YxP+Dwv+AwP+Iu/92uv9zuP95sv5uq/1govtYnvpRmfr29vVSlPN0pPFnnO9b +me5dlu48g+5QjuxKiut1o+NrnONnmuNkmONgluNclONZkeNVjuNRjOPSztnW8tLN8MoGJLi09qWo +4Z6m7ZGE0Hh3yGh82VJkvlA8fEs+hUZeukQ4hzxWszg0kjE0mh4hgRscfRYKbxMXfA6Vw/+Swf+O +vv+Yvf9ytv9wtv9ZqP9Zp/+DuP5/tf50r/1pqPxlpvuKtvr6+/fd5vXx8fTZ4/M+jfL08PF6p/F5 +p/FvofBsn/Bdm/A/gfBime5Zk+1Wke2/0OxHiuzM1ejn8edUkOVvn+NtnuNQiuEURNzT0NqttdEJ +Nsa+5Lu0zbi65La55bK04LKaubK//bAcZ62jyqQAIKGh15yu85mo7ZmVxJKJs5CY146g6I2l8Iqb +5IgXaIaa63eQ33aG1nCL4mSE2WRxw15401F/3VBPllA8ekk7dEggXkgJV0FszT8+iD88fD5z1j0s +cjxEsTo5jDoqdDdPqzFhyjBhyi9dxS9KrCorhyhGoiYpiCNEviA+th8oixYUdRUrsRMNdBMPpAYG +cQYCZwQHlwItArj5AAAALXRSTlMASkr4+ggI/vv6+Pj4+Pjw4OD++/r58PDg/Pv6+vrz6enc2cu/ +iHZQSkMpDwUwo5MDAAACC0lEQVQ4y2KgC1BlPsDOzu4KBOHh4REREVFR7u4eHh5CQh0dKtogBczz +0jJmz5mbnb14SV7e0vz8ZcsLCgoLi4qCg4PdNMEK0tL9/DKz7O1zcuc7OPj7BwQGLnJ0dHKytbV1 +YwQryEiHyi8AygcEBC6ESAcFBUEVrAirqQkL27uvtraurr6+oaGxsampubmlZf9aqIL1hw4aIAEz +KGht3XMYrIBrw65iPSxg9bryKIiC0jW6WIHFZneoAn0cCsohCrg34lLgEg1RsAm3AiawgjICCnhw +K4iBKABoK0zB7gfPkpKSJk58fgmioASqoAKmIDb5mBcQnDjzptgZCFZCFfAiFEw91ekNBJEvH05I +TEx8dN0DomAbQsH57itxcXFd5+xA4OKTsxAF22EKPJOv3krxBYLJk32AYILwY2WQAr4quIIvNya9 +bmu3goD2yCNtwmgKUm5PSe40hoELPZFiYAXVcAXT77/91G0CA9d6j4MVACZavQqq4OiMF59T4uOt +ISD+5t0ucbCCnTssIeBkqum06QkJNhCQcKf/MliB5JbKypCQkNDQ0NOzvn6f0WcOBX33JvXwgxSo +KQkICAgKSkgIyqf+nJVqCAdPp/SCFTDosAIBGxCo//r954fpO1MIeP/hYz9YAQJozPz3d6YRHHyb +9koOVYGWAoeMrIgIBwcLEHByckpLKRLOuQBjIfa5Z7z2KAAAAABJRU5ErkJggg==} + +set _AP_IMG(paste) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC91BMVEUAAADAPQa2OgWuNAT2LgD2 +JgCeLASTGgG6GACzFQClFQCeFQDJLQHtLgDmLgDYLgDQLgDKFQDDQgYObBqoMQSjLgTAGgCYGACr +FADeLgDCEgD+JwAEZwk6cmKVJAQydlEkcjsXcCaMGQTEHAA5f2+uFgDDKgT8MADhLwDCGgD+MQA1 +MQ9qRy1+BAG7GgEAWQktZmPbGgDCGwD/MwA3OBJdTzv////3+///3mf8///5/f///av6/v/1+v/p +9P/d7v/m8//l8v/j8f/a7f//3GqhhWny+f/X7P/M5v9B0kQOqR74+//r9f/f7//V6v/R6f+GqvH/ +/ap75nqgiWz5q1bw+P/s+P/f8P+mx/ymxfapxfWHrPJigNlrZYZsYYOIgHj71znz///t/P/0+v/Y +9//h9v/i8f/V8f+GrfN2lN5qiNu8+7yHg4NuXoD/0Fr1v1n2uVb7xFL3rVL4p1H8tk3+qUz85j77 +4j360jcQrB//nA7/jgDm+v/m9//c8//U7P+hv/KfvvJ+m+Bwjty2wcq5xcm5yMW5zcDB/r+50rr/ +8K1taYiB6ISIhoOHgnv/0Gn/0WD/0Vv0xVv80Vb6zlX2s1SHeVH7vVD8r0z9pEv+oUlH20j86kD7 +3jz72zr6fjHldjH/xi7/tCv/vCb/vB8RTR4BTxYBUhH/lgsBWgkAZQSIvf+LtP+jwPmlv/SVtvOi +wPLZ79rR6NXK68u4xMnI/8S+5sS+1MJLa8LA6ME7Trv/97n/9rj/+Kz/96ym2qhYdqJNgqBSX55v +vo83XY+CfoFpVn/113W5onCpiW+dim7642tp3GuefmjMqWeHf2f/2GXGnWNAsWJtXWBOrlz8tFv5 +1VlsVldsVVb6ylSGdVGFck5RdU3980P/y0P/uj4ruTw7gDv/ujn9hDnkezf7fzPuezL/rTD12S8O +jy/gbyzKYyz/rCuPgCneXyjuvCf/wSZqXiQTdSP+ZSEAPh7OfhcBTBfZhxL/og0HcgjKdAbUfgT/ +jwDfS0DFAAAANnRSTlMA8O/v3G3w4+Pj4+Pd3Nzc3G3w7+/v4+Pj3G1q9PPy8e/v6ejj4+Li3M69 +s6SejH1nZiwjGhGm/mh7AAACMklEQVQ4y2IgCRjIyisoCsvo45I3Vdm0cfPObfuFTdBljKVZgUBa +53BHdnZ2x9Yr2oaCgoJSUkZwBVqfH8+f//TVnZ4gEOg5s/T1swULnrzThCtQL72/oqrq7aXZnmAw +++XHH1UrHl1VhitgmfW8uvr3wwdeIFBZWem19Ff1nzchYkgKFn0/cPDTz1WrVq5cvnzZt2Vfjhz6 +ughZwczFt1fbbu/sbG9va2vd0tLSarfmxpIQDmQFtyLMUEDEdWQFvKUfpsEUWNpYmZsnW669vBBF +wUKgApi8t3mym+W6botiToSCGffORyL027qF2qxHUcA3Y3J8JEw/UD7MISkjFkVBycS+SJC8JVi/ +nWNaGFBBkSqSgry+SIh+sLyTb200UIEEXAFgGiV58VFmZjD9TuH2aAokp08EKgDrDwXpt3dOjY6z +mMqFpABkAsh/YQ4OQP3O7nWoCvgLL/RGmQG1+ziA9bv71QXEWRQgK3DpbTALDfOxg+j3808HKeBG +VpDTaOnjA7IfLO9RH5CLrEDgJlCBDVB/WjhEHqwgH0nBFJecDYkOjmm+UHkPf5ACcWQFRxvMEhOT +kmpqUlNTUtLTUzKOISvgmexyYkdTU2ZmZnNzVlZWDBDsOukyiR2h4Fr/hHOngkHAFQLOXpzQj6zg +9O6ufYEgYA0De7v2HEcoUHtxd86csrKy8vLyuXPnzUtISKioqEh4rwRXoMcoJMTIyMgEBMxAICIi +KsrGxiany0AVAABVSvaLl8YBKwAAAABJRU5ErkJggg==} + +set _AP_IMG(people) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAB8lBMVEUAAADvtgDHiAC4fQAuf6Vp +uCwmd5xOkrM+eJhYjhstYn1/yiJElL09jbZ/yiLcjQC1dwBQn8rhlQBBkbk5ibHilAB4xCbejwDa +iQDvtQDwrwCFzh1kszBsuyvzuQA0hKsqe6Amd5xcrTPtrgDUgwBRoMtbrTPKhABWoceN0iqEwih9 +uCZ6tyVJi62saQBan8XUoQCqZwBFi7LqpwDTngBIfBofT2a4hACnfQBKeRiJ0hx5xSWI0hx2wif2 +wACZ2Sr2wABpsddpsdeX2CnysgDuqwDYhwCM0SxUn8VUn8VMmsVxvSpMmsWL0CuI0R3vrQBvvCo1 +haw1haxfsDHrrgCP1COGzxxapc5bptBerDCIzCCGxiJ+vSLLkAB+xhy7hQJGj7dHkrp+xRt4vBpr +qBenbgB3sxtmnRuGzyHxqQDqngDvpgDupABToMdJmcJDlLtAkbg8jrU3ia+P1CiByiWEzCTsogDn +mABGl793wip7xih+xyeJ0SHyqwDomwCO1htYp9I6i7Itf6Rvuy9zvy36ugD5twDroQDllQDjkgDh +jwDfjADZhwCS2RtlsNhaqdVVpM9TosxGlr40hqszhaoxg6gwgqcqfKApep9mtDNjsjJsuDFptzF0 +wSmX2iT6wQD8uwD1swDxrgDtqwCQ1h2T2Rv3tXYsAAAAaHRSTlMAy1tTk4N7Xw8MCffm5dfLLfv5 +5eTi1tPTysewo6OioJOTk5GRiXxjX19fX1tZV1RPSDQwHx0aEwoG/ff39eHg3dnXz8/Lysm6uLCw +r6qZmZSTkIyMh3p4dm1oV1RMS0VDQkE6KCYZEnkqVzAAAAG2SURBVDjLrc5FV1thFIXh3RYSIrRo +W6C4u1vd3Q13TfAL5JIgN0gSLLi7/k/OPesbhayMeEZ7rfMODm6EPjdXj2vKa2t0YAGvlpZeB8CD +7s3R0Yt2nhX25WV7JTxUX7gvlX88k1fs9pVkePivuN3Kd54FwaurwQXw0PpUUR43gzV+/tqEa1qi +our5xWytNi1Nq83mN8vy8sr4xazMjPT0jMysDnzsET4BKHp5fPy8iMa3QeEDjL2CEUCM4+TEEUPj +bucY6zTAuDbC1kIBRDodDudbDgQDQvuEQACJp07n6Q81GBYMCOwX1KA08uzsXSmN+0PCE4QNCGFQ +FRYCamAbZbZn+CVJk0SSfuNvxC0WkQj/Q6uNWA+jgZJYicSWoOHcNM5M53Uo/mklX4pB/DbW1zf8 +gDvdJqHrNuA/Q6LBwdbm5pYaWLoEixpMk0ccxE2ROApc3YJLDQ729w84gGZne3tHQ4HZZWEuMwVV +e7u7e3840Gvi4zV6CmSzIFNQnpKQkKIDE9pC5AkmhwTBq6DUcJmEp/Ldq3uz5AGY92CO+AzmyUMf +wfsF4itIWiRJ8CE/JycfN+wKBbemPDUtGMAAAAAASUVORK5CYII=} + +set _AP_IMG(pin) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAhFBMVEUAAACbpafnTDzAOSuFKyK8 +wsZ/jI1dGxSdoqWSKyBibG3AOSvnTDzAOSuyOi6AJhyXMCZlHRbJQTOZLSJ9KSAzNjfRQjPNlJCY +a2ebpae7wcV7iImiMCTJQjSdLiO8PjCvOS2doaWgNCl9JRxia2yKj5JVXV5PUlMyEA3nTDzAOSvS +QTK1a9hNAAAAKXRSTlMA/ejfK/78IG1jW/3u7WIzMy2YgDoU/v369sS3kouJh3VtbGBbWUocAnoU +tCIAAACQSURBVDjLxdDHDoJQGEThX8WCBQTE3vvF938/M2zIjfGQsGG231mNNdk7MN5iOufg6mqK +k+Mi6DoV6CpidveZxexFoYJcBbsKdBVJ9d45TQ++97Jb5RZJfB+at4hdBbsKdhXk2mW1RB/1O+sJ +++Aeqsj++thMxR68LI7kKkJyFcmPP0qHbWv8tdk9jZbn1uq+0zEgEA0k86MAAAAASUVORK5CYII=} + +set _AP_IMG(plus) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAB+1BMVEUAAAAAXAABQh0OVyULVSIJ +TiQARhYASQcBVQkATgIAVAAAYQYAXA0HZBABXwMCUg8ASRcAShgAYQYAXwkASRwAXwwAVxIIUB0B +TxIAXAIAVAAAQxAAPBQAVAEARxoAShcARB4AVRAAXwgAXQoASxcASxkASBgAVhMAUxYAUAAFSB8C +WgoAWwUARg8AUgAAXgAAVAAARQ0APBUARgsAUgEAWwAAVAAAXgAAXwAAYQcATRr///8TjxMUkRQR +jRESiRLO584GjQaX0JcQiRAMiAzx9fLx9/HA1sYYnRgVkxURixHA0snE6MQbnxsNgw0GfAaqx7GN +uo8XlxcVoBUTfxMLfwsJfwkDeQP8/fzz9/Te6uDd6ODa7trH5sfE4MS+0cTD4sOlxqmjxKcMhgy+ +1cCnxqyp2qkYmRgXlRcOhw4Nig0LkQsKgwr5/Pnq9Ovm8ufX69fE1cvH4se/18LA4cCryLKq26qk +z6Se056Ou5B5nolRj1gXkxcWmxYVlRUOjQ4MlwwLmwsKjwoAdADx+vHb7tvX49vW69bO4M/K58rH +6MfB08e00Lav26+r1Kunz6el0KWizqKXs6KYuKGgz6COsJeJqZeVzpWQvJKGq5GHwodxnHx4wnhy +qHRsn3NoumhimWhYmFtPklFAiUIUWyoPkg8EWAcEgQQDiwMZoeZfAAAAO3RSTlMAy/D+/v3w8O/v +4C4E/PHvdT07Ny0fFv7w7eLX069sYVpVTEVAODUcD/379/Hp6Obl4svGwsC7o5krIs4i0wQAAAG0 +SURBVDjLYqAmEJblBAJ2IDBWxCrPUZ1aGgACpbPF5THleWSrreFgpqE6hgJ1riTr3BggaC1ws85j +EcRQICqVau1g72xjW9PkZB3JrIKhQIwr0drBOdnLzsbRydqVWRXVfktubmUDoAJ7FzsbW7ACeRER +EQ24+00l+SR1NJOQFLCwAYGMAkSeW39hT3FKSko+QkFEdzwQVGlBVFgsjoD6rh2ioALm2yojsALG +SuuIojggKJpinwVU0DSnMxYIulqsC5lgCtxCwv3DwnKSnb2ACjw964JqPTyCfay9oQoCiVHgHxrq +55cJUZARlO7h60uyAsDC8CsIb24OD/dfDlZQszQ7u6GhsRGhYIZ1bv/E8vIJfbOcQd7Mnt+bllZW +lpYH86b5IljAFKAF1DQZsAIhvrkdUVFR0ZFIQR0VHR3dNolVDhIZSox8vLy8y1KRImuJOCsrq7QA +LDo1uIWEFPVQYlNOVVBNDDPBINKDGpYkB1SQnJNVX79iOtYkJwpMtJEJJQkJCSX5QCsEMZO92QJE +sp+sa4WZMZS15xW7Q8BUZgFsWUvJhIODg5+fX0JCWoCHilkaAFyHpbBkQXs+AAAAAElFTkSuQmCC} + +set _AP_IMG(previous) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACW1BMVEUAAAAAQLEAL5gAL5cAM5kA +OKMAJ5MAPbEAZfMAOKcAKZQALZYAQrYAZvQAM5oAQrUARLoAMpsAM5kATccANZ4AVtYAM5kAPKgA +TccAM5kCP7YAT9AAKJMAJZIAOq4APKwAVNYAX+gANqUASckARr0AZO8AYesAO6wAaPYAP7IAN6IA +Wt8ATMYAPa0AMpgAXuQAScQAWd0AL5cAMZgAXuUAMpgAUc4AVtYARLYAM5kAQ7UAVdUAYu0AOqUA +avkARrkARLYARbgAWNsATMMAPaoAXOEDb/8TfP8liv8ReP8IdP8Aa/8BO60AJZIwlP8pi/8Wf/8M +d/8Hcf4MRK0CLZXX8f/R7//J6//B5P+14f+Zzf+Exv+Avv9vuP9bq/8yjv8fhf8chP8agf8Kdv8B +bf5Knv2e0fUObe4BYuwBX+gAW+EBS8VQeMIKUMIOSbMCQLEAOK4KM5rg9f/J6P+r4P+03f+m2v+t +2f+h2f+s2P+a0v+T0P+Nxv9ssf9jrf9erf9Ypf9Onv9Gm/85lf/c8P2CwvtCmPslhvvO5/rB3/px +r/q02vkPdfnH4fgtivjV6PcdffUBZ/SjzfNcofMvi/PA2fEWdvEAZfEIavCuze8ogO9coe4kf+4W +cu0bc+sMaemZvuhknecqf+YZceUreuSbtuA+heAQZd2NrNxblNwDWtwIXNsfaNcAVNd5n9ZYiNYd +a9Vnk9N5l845dc4gZc4AT84TXc1ojMoQVspihscvZcQGRb4YVr0gW7tHbLYAQLUKRbI4YLEyWq8t +U6snUqsAOaoHPaMZQqESPJ56vgIFAAAARnRSTlMACv68Shv17+rp4tjUzbmokop4Xz8nJBYPBv79 ++/j39O/s7Orq6Ojo4NrX0svIyMTEvrOvoqGWh3lwbGllWVdUQjs1Ly8YTzxaGwAAAXJJREFUOMti +GCjAwszFJ4JbmlFQ9vD2Y1o45cWYfff19wYr4TSeq3BTS9ikYE7s0pJCbMeXFkVEpuWpY5VnNfI9 +ODW0sqokLY8dq/HcITs7iqOiqytW5vNgM17mxIrQ0pjY6NbNBTyOmMYb+x6aGRZVFxc7e08BvziG +vAh3SE5nRExTatyyA3IWmOZbshWuCy9v8G9u2+Kj6YAhLW7qe2RBeE28u8es3KP8rJj6+ZhyuiNr +Pb3d5+bLW2HzH2B6TBvL6gO83Lzm+7DbYw//kL1T/BI83dzm7ZISkMAag0zBi0AqkrvW7zYQxWaI +LafPBj8Pdze3xoU7lIWxqXDR9dnWB1ThHT95jbQ5IzZrBPbnzvEPCPJ2T12y1hCrNcIq2Ys9gCoC +/dOz9LFGt7NO9vL2JK8UL89MRewJRsJs6+oJicluQRlquJKctcKqaYmBKRmqOBOtk3ZWelLgdA7c +yd7VJHNGz0QNfBnHhpeD146BXgAAqcpnwiU1/q0AAAAASUVORK5CYII=} + +set _AP_IMG(previous2) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC91BMVEUAAAAAWNoAbP8AZPAATMYD +NqAAN6cAU9gAR8EAN6IAPKsAOaUAP64AXeQARrsAY+4ASb8AWNwCVNQBOqYDMJwAVtgCUdEAQcEA +L5wAScwAJ5UASccAa/8AY/UAZvUAQ74AX+gAOasATcgAO6oAPq0ASsMAV9gAOaQAWd4AY+4AT8sB +Q8EBTc0AQrYARr0BXeIAQ8EAPa4AOKUENpsANaQAK5gAKZcAJ5YAWd8AM58AbP8ANaUAP7cFP7EA +J5YATtUAM6UATdIAQ8EAa/8ARL4AR8MAVdwAScUCWeIAUdgAN6gAav8AW+oAUtgAKpUAT84AQL0A +LJcAQb0AVdoAU9UAWd0AUM8AbP4ARcAAXeUATckAM5kANqgAWd4AOKcAbf8AVtgARrwAR8EAU9EA +OKUAQ7YAScIAN6MAW98AV9kAQrQAXeIARLoANJwATccANp4QeP8Wfv8Eb/8Hcf8ukP8qjf8ghP+L +zf85lf8Ldv8KdP8Abf8siv4ge/EFScTa///T7v/M6/+g2f+Vzv+Ozv+Cwv9qs/9grf9QpP80lP8x +kv8sj/8mi/8Zgf/P+f5yuv5Mmv1aqfxEmPwEbfwqifsoh/kEZ/ITZ+IFXd8UZd0SY9wKXdYXYc4m +X78yX7Hg///V/P/j+f/H6P/F5/+y5v+w4f+o3v+Gx/94uv9stv9wtf8vk/8bgv8UfP8RfP8Aaf/A +5P633v6U1P5FnP5YoPw8kvwUd/wLdPzH8vtDlPsjiPtqr/na6fiGw/jA7Pd5ufcXevcGa/e55vYi +gPYbd/YJb/Ywi/W84fPC1/IqhPCwyu+Wvu9vru9kpu+Mv+1wrO06gu2VxeyhwOyDuewaduyUt+om +fuoXcekDYekrd+gPaOeAqeYGYuYhd+Wpy+RVkuRwneJekd8dcN5Ui91JgtySt9pZjNobatiGrNQn +a9M6dtJJfNB3ns00bs0zac0hZMkkXckTXMhpkMcnZsYTU8UQUMVfisRdhMIUV8BEdb5LdLtAa7Ua +R6kanrESAAAAcHRSTlMACNoMAv7t1nJAPzkvGRMRBP7+/v79/O7e2tXTtLGjm49+WVBLRkArKB8Z +/Pv7+vf39vPz8vLx6unm5OTi4d7c3NnY19XNzMvJx8bAv7y4tqysop+YlpGOiomGenl3cG9pZmFe +XVxVR0E+Ozk3NSMh0PZKgQAAAfFJREFUOMtiGGRAQFEiWgDB5ZN3UkJVoPjnm3EunMcY8O6ZNIp8 +DOu946yccPmgD3tOSyLLx4k8nX8RroBF/suJheeRFaSIvKhfck4YpiDi66mGpWccEfLKpm8WNDVd +FuaCcDnqLjU0LztrD5dPN/tU39y6d64XH1T+amPr8v2zgmHy3Obf+1ra+uc6qIO5Sdq3G1es3D3T +lx8qz2P3q6+lY+Jna24wN83gwaJVHRNnevJC5dWlfu8or9j83gTiAFXxh4vbKiZNZ9eEyudLzdtX +XlYzh00FKv94Q3tZzXR2DZgDAucdKi9YN8sIIs/n+mRje3HhLYQ8A2B+PzeVra+czZYF5mlJ3++v +rK6848YLV8Aj8WNXYdH2t7Y5YK6SzvWeguptNz0QKrgtP5YWFk14bcMD5iaLXekpKNpywYcfroKL +bU53YfXOVy55YG6CYG1pQfGEWllmREAbPi8pLNr60l0LzI2dcRioYtIROUa4ilTdR6sLi6fO9odo +irwxtbSgqmZyOCKyEvXudvVWTRPKhES2wrQpJWuLi5jAPFj8Xetcc1RUDZr65A52lxSiKGCIEjvZ +eQCmgIFZdnJXSQGKApYwoWNTBDNgXH6ZqooysAKEipAZtfrZcC6zd0GvM2qqZgy1UGBEcDVlrOIZ +BgUAAJCNp/I8HBUpAAAAAElFTkSuQmCC} + +set _AP_IMG(print) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABdFBMVEUAAABFjKJUm7EYmb4GYoAj +dI4nnL4Ul70FY4IPkrgFYoALZYELZoMTmL0OcZAgmr0bmb4nfJYXmr8insEGZocacYwKY38LY34l +nsEpoMMLY34LY34/psMNaokHaokIaooXb4r////3+PldX2FLTE+gyuW2uLsDb6tBQkS+0uO10Nld +nrEzh70AYaLN4eepydKhw80pZ3tTa3MfeJXv8PKawtulxs82kcBWma0Vb6UiZ3rn6Oqx0urf4OO/ +19/Y2tyHt9qLx9iMvsxOkKQlZnstZ3pIaXRQanNXm8k2iL4heZXs9Pji7PSy1+Kv1uClztqcwdrQ +0dSbx9N6vM+Swc5/ssEvjL1fnLy3ubspibshhLlxorEIdbA5ga5pm6xCiqssfKsgeKlTlKgdc6c+ +i6URaaQAYaEgdI9LdYN9f4J7fYALZH7+m2BOT1L/+vf/9e7s8ueTv96Qvd3f6NbV38ZDkcO/0q66 +xpn+vZeQuXF7tlf9bBffo+QfAAAAIXRSTlMAEA+Pnw/vrZaPjmlM6+rp4t3Xv62of3VsX1s2IO/F +xK8B41GHAAABcUlEQVQ4y83Q11LCQBSA4YgFBJTesUQFNWA0AopUpffee+/Yuy9vJhJCMNx54Tez +Mzt7/tmLA/wpJZ2zhuLQldRzGtdxgXFwaZSBNAlNJKWUwXIEhm9QMBxZpg7CMMyXyfgwHF4QRG02 +AQAIbLbogiABQRt0+gYEJaiD9dTpRGqdOnCcTTh+ByyGcHszENBhArrNHSGDTQq2WtVyrd68wjTr +tXK1tQsQRDxjOlsq5DOXmEy+UMqmjTwRPl/SgCBo8Ktm+A3vo1vNEinwWVSP16gHlcVi8RlGX3ca +GinQ+rW4F5/W8PwGkoPYIUns4/OeHITanZOpTjv09Er6ARU8nhEEUURg3KNkJAK9Xh/PqWfk4ugT +ETTMZvX4iGSsNpsb0z04rdb+wZy+1erEg1Wn3T7YnzOw24mgWyn2PB6v93zC6/V4esVKdxUPhiYE +cZlMLsTtRtDzc0dMQzwAFGw5SyJmMhkrGAaTKZaw5GwF8E98AwEFYh9tMQZgAAAAAElFTkSuQmCC} + +set _AP_IMG(ques) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEUAAAACDIYAFogHIpMGG5QE +Fo4FGpAABIAABHwABH0AC4AAHowAG4oAEIUAGooDEIsKNqABCYYCE4kAL5kCIZAGL5kELZcBHYwA +K5UAK5QAJ5IAII0ADYMAGYoAFYgAK5QAL5UAG4sNLp4WSK0GHJQON6IMP6cGN58ABYEHL5oDFYoH +MZwBCIMALpcBFIgBKJMACYIAII0AAHoAAHsAKJEAH4wAAHoAMJYAAX3///8AQrQAQLEAP64APaum +y/8ARLdpmOopY9IARbsAWNwAVtgAPKkAOaScxv////yTvPnZ4e9gkuUAU9IAT8oRU8kASMECR70B +O6eiyP+Zwvz8+/jw8vf6+PX//PSJsvR/q/J7p+92o+5Sj+1wnuxjlOgEXeEkZthIfdc9c9YAVNUg +YNRRgtNDeNElX9ATWNAAUdAfW84VWssOUcQNTr8GSr4FP62u1P+sz/+mzf///vn19/lun/Brm+g6 +fucAXudimOYebORQhOIAWuFUh99AeNs2b9YwadN6mdIaXtKBnNEqaNF1ldBbhtA+c88bWM8aV80A +UM1ZgcwAS8woX8oYVsgUUMcAScYCTMQ8bMMMS78PQ7wISLmv0/+ozf9fov+HtP39/ftBjviNt/dQ +lPYzhfYncPbm7PX///SEr/Ti6vPd5vO71PN3qfNCifDN2+9qn+xaj+u8zeo4eekAW+hbjeW0xeRx +nuRGgOBAed+rvN4tcd5Kft0yatZHds46bswST8kPTcgrYMQcTsEAQ8ELS7wAOLEAPLAYSK8IKqYP +L6MIJaB8sP9vqP9Xlv8+hf8zfv98s/5Jlv5KjP6WxP2jxvyAs/tqn/vo8vl7rfQ5hvSpyfFMjvEX +cfDB1O0kae0hcuw/ferw7ejs6uhLieePs+aHruWFrOQ2cuRXiuFund96oN07c92cstwjYdxOgts3 +ctsPXtmLp9hei9dEeNY0c9URXtVmjtMjZc4NWM4RV8stZckgXMkZW8kORsEhT7ofVLcXQbYAPrQA +OqwVP6sSNqgEFpEetcNEAAAAOXRSTlMAyBPz7+fionJlVEkiDAT68OLV1NDLurSvppdmXUE6NzIq ++vbw7+vk4+Hc29u+vLmYi4WDfm5MGxtQldHvAAACwElEQVQ4y2KgKpA3kdAWENDUN+TmxSbNrauc +Vrns0rLSVUkHRaT50KXNJX6udC8Kcg/2nDnz6LGYHyJyqPIKwonu0+zs3CMioyIjo0svzHjKzIUi +r+5dUGhXtKG7tbmxe7tDmfeq47eUZBDyTMKVBdPtit40e1laWoZunlTrXVt9Zg0zwhaAJNOA8nYb +mi0t1zc+K7H0mlRdvXXTiQQhXpj3Dp4ttAtyT/XysGxNfNtqabn5y9a6pIcnf3HADPCeZhcUHJy6 +wtKy8VHp9lCPBZPqkuob5t/QYgLL86idKgwK9vSMbVv/Os3Bod3LY1b3tvoGx+fzD0PcKb17xvlz +nnMiFpUlvnCI896xOMSjraXBMb0zYQ87WIHUxtPX5ngCQyA6OjZuXX3brLDQHY6O6R0B2VmMYAVi +MbPX3lwUERUd61Cb1P5hQVjx6j7H9KzJ1rkpbGAFojHzKtZWrYyKdYhLW72kOCy8pD3LsTPPynpq +CgtcAUAVNfHlcQ7rUkPCwouXpHam9ztZWdlMbVKBWHH3ck18jbPLqy0bE0NLrj/p7evLs7eysrad +2sEKcWTd7HhnZ2eXZJ+elhCviXv985xA8jauuf0QR5runhsPlgcq8Fg80T/Ayd4eKG8b6DcF4k1F +1blVLkD5zC7f7AePEfL5GUc4wQr4xDcth8hP+Hjv/jd7J3troLyr2+SdghaQuJD9e7UqEyT/eUX4 +wqV5VlZg+fyMQ8aw6BbvXf6+x9d377uQO7cvfj0Alge6QAOednkAY3tZ/mnCRH+/peELrwTYgOTd +cnbxIyU6WeZt5U1A52WXVeYcALrPLd9v138OlDTP2rsmIcfp9/79f2xdA/MnZ3znR8hD/Kr3z3FL +QnZO7r59uX4ZOw/pmKFnDD5OocN7slJSmjr6pxwRNGJiwARMXAaMbCwsrIzsnDzUzNEAwUUPl7FH +9mAAAAAASUVORK5CYII=} + +set _AP_IMG(redo) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAB2lBMVEUAAAA6MzMAAAAAAAA2LS0h +HBwPDQ0AAABIMzM+MjI9MzMAAAA6MzMAAABIMjJCMzNCMzM9Ly87MzMrJiYoIyM7MzM6MzMAAAAA +AABEMTE/MDA1LCwzKiowKCgYFRU6MzM6MzNCMTFEMzM/MzM9MzMzLS06MzMAAABRMzP/pBZNMzP/ +5LVJMzP//5n/15P/04rf2IX/u0L/uT5YPzn/qR3/oRH/nQf/893/68n/5rv/4Kj/3qT/3KD/znz/ +ynT/xGH/wV1xWUb/nw3/7c3/6L//4rD/253/2pr/2pX/+5P/15D/1I7/0oH/6nzKv3n/zXehjF// +xF2Wf1n/wVR/ZkxmSj//tjpbPjdcOjL/siz/rSnAdRj/+Oz/4KvVvKDq5Yz/8Yn/0YX/z4DAsnL/ +yG7/32r/yGn/3Gb/1mb/xWb/x1b/ylH/vU16Zkz/vUn/uEX/xEJzUED/tDb/szOKVCbqkRD//vz/ +9OL06Nf03LXfy7T/25j08pLqyZH07In06Ij/24LKqYDVzH/Vrn+rjnr/43f/33b/5nShgnGrmWah +fmPfqmK1iVyKaVr/0FnfpVO1hU9/XEpvWUZnSUTfnUBXOTF6Ui9lPyxzRir/qyOWWyOhYB7VgA/0 +lQlx74ncAAAAKHRSTlMAPwMnslk8HO+wnxUPCfLfz8x/f3JvXy0N5dilmYtMLx/lv7+PWU8G8Tuy +bgAAAdhJREFUOMtiwADK/IwM+ACj1gQtUbwKNNyqQjl58ClwL6vo5ZfHo0AvJqa8RQeHNWKcHBr6 +5kAQF8GFxRohjskdcRZA4OzsXDlRQB7dcP7CZm0QsLS0dHFxseziEEORF9Xq0XOzsbG2trKKjXV1 +ddXWbgznQpLniujW1/f29tLT83B3hyqsLRTggVsf0W9n529rm5SUmAhU6OWl51Ht0VAfygqVV5s6 +xcHBPjMzLSUFrM7Hx8c/rc3AUZANIs/DEa0ZVZSfnxMMVGYfaB8YGByclZBsLCPOC3VAiammponJ +zKioyOKiMCNDw7ycDM8gPhFmJlgElYIVFPf56urqZoMUtMY7Sslxw1zIOcsJqCAyVdcvaJKWBtCE +rAQ/Y2mg8VAAmIJWKVBBtm5yqKS0iCxQQYZnAJ8wMxMihEvMnEzT40MUhZm5mRg1jHxrQqRY2ZHC +SCDazCndIJyFTQIcm55NxhAmwoa5ZgUG4bIQMxm1OnUgxiOieIaZSZ0jC0yQUxBiPAKozDZrDxAU +h2li4pZAi2al6EgDHTle3KlQZ05qiAw7Ax4FmgZ8bEz4knFBEAs+Axin+xqzquNTMM1PkhlvVsoN +YOHGr8BRhBevAmMdNga8QJUVnx8AecZkFWbl0sMAAAAASUVORK5CYII=} + +set _AP_IMG(replace) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEUAAABISEhYWFiAfn1fXVp4 +eHiEAABSUU6Dg4NlZWQ0NDNsbGtxcXC8AAAVFRW8AACiAACXAACKAACsAACcAABCQkM+Pz4AAAAH +BwdQUFAAAABGRkYTExNrOjoiIyN2dHN7enlOTk5xcXG3PhpoSEhqRUWnIgJsbGw9Pj6tNRWiHwRm +Zmdtbm5GRkZpampzc3RgYGBCREQhJiYWFhZLTExcXFxUVVVgYGFNTU0xMTKrAAAcIiIOAABJSUlN +TU21AADLAABTU1MAAwNZWVpbW1tHR0cXFxdHR0dXV1cxMTEJCQkAAAD/AACv2P/g8//L6P+83/+Y +zP/Z7v/T7P/H5v+43f+12/+m1P/V7P+/4f+p1f+k0v+h0f//lhrR6v/P6P+63v+bzf/e8P/X7v/O +6v/N6P/F4//E4/+w2f+u2P/n5eLg3du5uLasqqenpqOgnpqDipWQjouIh4X/307/3kv/tDL/sjD/ +fgrj9v/d9P/i8//U7//b7v/T5//L5f/B4P/A3/+r1v+z1f+f0v+dz/+Fvf/S6fl6n/Kexeu81edv +i97T0MzKycjJx8LBwL+qrrK1squsqqqXlpeSk5NycXD/+mL/92L+82HUXy3aZSrOYir+mxz/gQrH +MgO/MgPH4//H4v+64P+w2/+h1P+30/+mzv+dzv+Wy/+Wyv+SyP+Ov/+10/6u0f6xzP6ew/6EtP7P +5PvC3/vN6vrH5vrE2PrN5PbG4PWEqvWmwPTL4vN9o/Hd4/DF2u3X4eyVv+zn5+ve4eqBrOZsmuaH +oOXe3+Skx+TW3eLO2eJhjeLm4t69xN19ld3Gy9yPotuRtNjJ0NfAzNfT1tbX1dTL1NRvidRehsxt +k8tXeMjExcbNy8Vzh8ShsLuNmLvAvLrt7be+u7WlqrCKna6uq6nozqeNlKd7kqedoqWMmaWco6TT +2KJ2gqLiyKGnpZ9sfZ59jJp8hZqKj5eNioh/g4eDgH1qb2//+mRiYF/51VX/2UvfYzf/vDTKZSvC +VBj+fgrMNALQLADZZiw9AAAATHRSTlMAE6T8/Oh29eni3tfRrZ55eXh1dHRoVEk9OjYhFAkF9fLs +6+vq6uXi4t7a1NLQyMfEvLuvrJqYl4yLeXBtbGNeXVhPSkhBNzY1IyAMotrphwAAAkJJREFUOMti +IBYwOprrc3DwMIl6Ype348m92d1zo+/+G05LGSzamfKyT5093dV15dadnHxdNwx5g94jh9vX1vr5 +1S7Zdf3JBEUJNAVMvQfa10X4JdXUBCUHN514NUHDC0VeNG//9qX+8+vi41PrFjQEhB16n8+HYgF3 +1o5VCaEB9Wlp6fUBoRm+i69OYpFCUgCQWO7u9dFRvmGhCQmhYWG+PtHNrW8LkY0w697S2hIT3pjp +6+ubGeUDBM3XJnN5IxTonVy9MjCwJSY6PDw8GiS/bNHBD+xIdrBmrYmOCVyxPDAxMREkHxO1cF8B +iziygqYM3/CYxMDAQJB8VGZoSAeKAp3shoDIsIzGqHCQvG9YQHpcRwG7BFIw9WyI9E+PDAgFyQdE +poX4V58r4kKKENvcvQlx/v4hIPmQEP/UlIiUp5+NkbwJmDTrpY3+wfEg+ZTU+Li4iMqjn745IQel +xcRjkREg+WAgiEj22/yuyEgOJay17x4PSU7yCQKBpIpNDwu/2KDGprtSzvlt1X5+flVVFZWdzwtz +LqvyOqCocFXP67uwZ2tb287O25M/TnlxMfvxT34UFdJMzPkT+/sfPJtUNMXQWuXRmXvTZ6KqYJA0 +5VZgZpbnNBGTY+B9/fJ7ydeZwmjpStbDxVmSEcSyn1E2u6x4+gwrnHlA+H95bFnJ1FkCOFUI/Psb +W1o8dZYIThUic+fElpZM+y2IU4Xg3HKgGdOUcedFoXnlsb9+aOLJrWzz5sz+I8SAT4WaFpss4WwP +AC8d1Knb/13IAAAAAElFTkSuQmCC} + +set _AP_IMG(restricted) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACuFBMVEUAAAAAAAAIAADpJibnDQ3r +IyOdBwcGAAABAADwQEDmEBDRIyPgEhKGHh7xFhaDGxvsCwvmERFZEBAcBAT9nJzpDAz0R0fACgrc +IyPwNzfqHh7jEhL8lpa2CwvsFRX6c3P8mJjDDAzGHx/mDQ36fn6zGBjyOjr2Tk7vDAyYCwvpGhr+ +tLTtDAycDg7pDw/qDAyaBQXZGRnBGxvxCwvpDAzmDAz4ZmbnDAzzOzv0Ly+mDw9rDQ36gYFaCQn9 +qKi2CAjoDAzNGhr2RESjBQXlDAzYDAy1Cwv2T0+mCAj0OTnpDAz3WFjoEhKyEBDOCgr6iIjCExPr +KSnwLy8AAAAAAAAHAAD////+/v739/fwQkL+/f3w7+/7b2/wPT3oFBTtCwvmCwv8/Pzx8fH6aGj4 +X1/tGRnsERHxDQ3++fn19fX57Ozs7Ozl4eHheXnldHTWcHD5bGz5Zmb5Y2P1UlL0T0/xR0fvOjrt +ODjsNDTvMzPnMzPsLi7jLCzuKirrKSnrIiLoGBjpDAz++/v5+fn99vb98/Pz8/Pp6en15ubo5ubj +3t7Rqan5nJzSmJj2jIzaiIjWgYHPgYHTdnb7dXXzc3PZa2vyZ2fbX1/tXl73WlrkT0/xTEzxSUnz +R0fyRETwQEDmPj7qOzvkJSXyISHtICDjHh70HR3xGBj78PDy6enn4eH43t7y3t792dnh19f70NDl +zs77yMj1yMjqwcHTwcHVvr7Qtrb4s7Phrq7Oq6vuqanbp6fboKC/oKDyn5/Tn5/0mZngl5f1lJTR +kJD8jIzXjIzvi4vRi4vPh4f2hITmg4P7gID1f3/Qe3vzeXn1d3fOcHDvbW3sZmbZZmbiZGTnXl7v +XV3qXV31V1frVlbcVlboTk7mTEzmRUXrQEDjPT3jMjLfMTHnLy/3JyfbJSX0FhbuFRXpERGIG8x1 +AAAAVnRSTlMAAib++B8PDQcG/v3aqJyXk4d1RxgTDQT8+Pf29e3l5N7b2tjX1s7NzMzKx8XBvray +rq2sq6mono6LiIiGgnx4cm5oaGZiXUlJOTgxLi0pHxwZFxcVEUny848AAAI4SURBVDjLYiAJeDtZ +8vEJuvphlxWxkS9ILixMKVn4RNGeDUOa007m9OSYGKCSopSZxQ9lndG1ax+JiYnJPbq/u7t3wpUb +xXO5DVAM8VeYnFzQvyU7Iio8PDGifVv+7HkPNJFUiKkkF+VtzQwPg4LwpJ2zYqt0xeEKzIpScrui +wpBAYn9ZZY0VTN49ZWZeZziyfPi+yLKKWm5fqAL14hnrUOUPzIu9tfdRvRFE3rOkZHciivyh0vnT +u5on1EsEgBVYzL0ajSwf1TcncnpOeFhOTYMjWIFa5EFkBzYB5S8D5cMSp8YZguQZJWM3IMufLI2c +CnZy+I44HpCCoMp7SDZknCmdn98OcfIqLmmQAtbaOxFw+ZZzkbH52VAvRS/lAisArG5WM1x+SmzZ +JJh8WNvSBJCCwPoFMBNaL5ZXTIqGB0lSAwvYF1LMUDesuFRdfTYJEWRrEpTBCrRSN4P5WTPq6iYi +yYftSjAFKxBsyAsHyd9czDyxDTnArie4gBX4xC1aGRbWcXvZ4hOZyCG6Oo5FFBIZemm54R13ly8/ +jiIfNS3BHBqbXo1xe+6nPzscgRJj25+zsMIShEB8WnxaL4p82PoljQ6IJK0Tn34BVf/G2kYTBgQQ +1UhPPZWFkG/tSY3X50RO1mLG6U/Lj23KAMfX2p7ItHgBcbSc4Sa37HHVgmtTzk+bXbkklccDTZqR +g53JWmlRTdXC8opqZlVbplAORkZUFYzsIUzCQvy8vPxCwkzB7BxQacIAAIwiEsr1wPM9AAAAAElF +TkSuQmCC} + +set _AP_IMG(retry) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACo1BMVEUAAAAAMZgAMZgBMJcAKJMA +KpQFOJ0AK5QALZQAKJMAKJIAJ5IAKJMALpYAL5cAMJgAL5cAMpkAM5kAMpkAM5kKPZ4ALpYAKpIA +LpYAMJcALJUAK5QAL5YAL5cAMJgAL5cAMZgAM5kAMpkAM5kAM5kANJkAM5kHNJsCMJgEN5wEOJwC +NZsCL5gAK5UALJQAL5cAKpMALJQAL5cAKpUAMpkALpYAMpgALJYAJ5IALJUIOp0AK5QGOZwAJZEB +NJkAMZcAKpMAKpMALZMANJkAMZkAMZgAM5lBo/85nf83nP+G0/9Hp/88n/9+zv9ctP9Lqf87of9R +rv8DMpiO2f9xxv9swv9rvv9mu/8/pf+Ay/w6j+c9arMhUKYWRaOs8P+p6/+Cz/9xw/9vwf9Ysv9R +sf9PrP9EqP80mv96xfaKwe02hd1NgsckWq8bS6YMPqEOO5wFNZuQ3P+X2v95yv93xP9wxP9du/9W +tf9Ts/9Zsv9Qqf9DpP9nv/5fsf1brv1OrPvE6vduufeLzPBWpu1utexlrOpaoOU4iN9Jk95cmdVj +l80pYLg0Z7YxZbURSKsSRqcWSqYQQaIIO6Cv8v+38P+z7P+w6v+i5f+U3P+K1f9rwP9ivf9fuP9Z +tv9Hrf9Bpf8+pP99xf5+yv01nPyf4fuByvt2wvuZ3fpLo/a/5PSBwPQwkfN6wfJ5wfK33fGPxvFT +pvGc1/Cez/B3vPB+u+9osO9GnO6Z0u2cyuyAwew+lOxztumFvuI3ieJZmN9rqd1SkNs8iNsoetph +ntcufNZJh9VJitIrddFUi81NiMo9esgbYsdXiMVEfsU3dMUgZcRIeME/dsAyaL0gXrk1bLg1arhC +b7YkXLQaUbItX7AQTLAYT64eT6kkUagWS6YLN5oBLZRpFO9rAAAAR3RSTlMAOy/+rpT49e/ezsS4 +dFlGQSsZEwb64tjOmY6AbWJfUk4yJyIQDAr99fDs6OjTv7Spo52Qgnpx8vDt6+bk3L2toZyJfzMz +CH+5sR4AAAI7SURBVDjLYkAFIpK6fAz4AJPVmVgeAXwKtNY1XFB3UMKpQFB7x5Spmd0c0sIYUmqK +fLymvMYamcFeM4r29XHKqqLK8/Ow5+fGxMTc3VKcmJjou+xoHjc/snapBz371yyNBIKFfiAwJ7Qx +O99AEK7AKOhYTUWaOwjUeoNBtffstT26MHmzoIPz0tM9A0CgysMTDAIWH5pgD5UXEj9f4e+fUr8r +CgjqUv2BICVl7y0xGTeoApmCDbPCQ5tvMwNBUGtoeHhYSPNlDieETw26vRK8Mvq5FBgZZTVbvBKC +M86pGzIh+YHrZNz0uMMWTOCA2hm3vHMiN2poi+Ve7b1yT0wVHNQb99zhlFNDDSRnfRYWFn0TEFPJ +5qaOtAq+6JSXVsIb3YCp8vHjlZfnitV0ATHkJFlZWSXN0KRdefK7touCPSCRl5OTM0EHRVrZUeNi +0+QmNkYgW8X2bPyS+E5OJGlhXsvrrYUzvTazySkLKhoWtAR7FZ7iRqRVPvH+jpCQsLDSrUHsHBzs +kzpCwkLD+6TgqUVv0vH6uYGpgYGBte1ZWVntK8oDU8uPsDNC5U1ET6+O8ICAqvkRERELfDzT07bl +GcEMkOjNKKt2h4A6HzBIK2ubKAGPTkWe2BONNX7JlZXJySW+ILBod/Z9PWXUADpQUpyUlFS66lo0 +EMQEcfKKoASCioz1jbai4ASvTGYWKVZjUwUhjFAWYjW/tH5a/CY2RtzZjqUgu2ElUAFuoMCd2wWM +CzxARFbcDs12AE2arNSjGGkuAAAAAElFTkSuQmCC} + +set _AP_IMG(run) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC+lBMVEUAAACBAABsAABiAwNkAAB/ +AACRAwNxDA2HBwdrBweRBgZxAACRAABkAABnAACJAABuAAB+AACOAABgAABfAAB+AACXXmO7YGC6 +amu7ZWWyUVGlRUWkPDx+NzmMDAx0MDOsFxeMJiaFAgKkS0ugDw+QBwd7Ky5+NzqiMDCVCAihJSV7 +ISOOBARmEhObHR53BQWEGRmkKSmJFhaZDAyVBgZ6AQGPAwNmCgplAQGQAwOIAAB8AACLAABlAQF9 +AABtAwODAABdAAB1AACJAACYAQFpAACPAACLAACLAABbAABiAABcAAByAACMAACPAABgAABfAACP +AADz8/bx8fXZ2eT////19fjd3OXlLCzmMDDX1uLqNzfoNDTZ2OLwRkbsPDziJCT5/P76+vvu7vPb +4u3d3ufb2+X7VFT1Tk7ySUnzRETwQkLuPj7jKCjgIiLfHh7w+Pzr9fv29vnj7/jg6/Ph6PHh4Ojf +3+jV1eDrOTntNzfqNTXnMjLoLCzgJiXlIyPlHR3cGBjYDAz5///v+v74+Pru9Pnu8fbe7PXh5e3d +4Ont4+jCydTgv8bGucKlnqfVoqLxoaL+oaHkkZX9jIzvfH75cXLuV1iHUFX5UVHoTU7dQUPuQUHz +QEDuOzvaOjvpLi7rKCjiJibGJia2IyPVIiKnHBzcGxvgFxesFRXaFBS+EhLTERHbDw+cDg7p/P/1 +9/zk9Pz18fLs6/De5O/Z3Ofy4ub/4+Xs4OHO0dzr2drJzti8ztjxztK7xtLhytHoyc7bxc3uxsnl +xcW1usThw8PlwMDsu7/mub/WtLauqrPqparxp6nfo6iwlJ3ymJjbkZfRlJWvjZTqi47Ki4ydhozD +gYbchYXehIT0g4T/g4PZgoKTdn3ddXmaaW/5bW2/bW38a2vkZ2rEaGjcZWjAZWWNXmPDXl/jW134 +XFv3V1foVlfxT0+pPkHxPT3ROTnlODjgLi/WLi6TLC2+Hh66Hh7JGRnWFBWlEBDbDg2uDAzZAQGe +AQHIAACsSdcRAAAAUnRSTlMADgKQNCP6xbm2paF8b2ZbVk08KBsT/f37+ff19PPw6+vn5OPj4+Df +3dLQ0M/OzMvKx8bCu7Gtq56Yk4+LiIeFgoB5dXNybW1TUk9HPTQsIAsGPp35NQAAAi9JREFUOMti +GBjAyOLKac+ES1aYj9tA+vENRRFskqwC1kYyT6+fnzLt1TIvDHMFHTiUH9yeOGnK/TfRtQu/2KJI ++rpzaUhM2JW0/dbDjKx5VdWRtUvZkeRdDMUvHk4KDU3csO1lRmZcTmVNxKJ6OWGEAuNjoUDZorCg +oIKbWZnZ8dWRuXkNP/gQCngmhCa1FoWFBQe3nJkblxNdE1GXv2K1BUKBkCRQQVhYUHBwwaGsnPgY +oAHLV63RZ0S4UWsTyAKggrbu6VXRkREJ+Y1Nv9lYEEZwHQ0FygcFJycXTl0QE5Gw4mfT99lveREK +3K6EhoHlNxeeXljfUDf7yYWDxX3mCAV+Us0gF7S3F64/MOvR5N6yko6Urli1AIQKwPR2JAYVtLR1 +H7/8+sTG4pLO8vCQ2FIxb4QCy5PNwXsnTp1eVdswubisrDwcqGDLJUeEAv7nk6bNzHo3rzKm/kVp +Z3lqeFpI1NY+TiZENCqkp2cAwzA6MuHj/lKQfEhUVIg6IsoDTWalZ8TNqQR6sfFsSWp4SEhsVEXK +PU+EHTbv0zPngMNw7d2O8DSQgqiUc8wIBR5LZoIjYVH+2vldICsqdvbs69dFKBBVicuOj4kARUJT +b0rF7p4j/XdmyCOZwGA2PxsSCWv+Xttz6uozWXZmAX/khOu8eG71grql31b/+vN5hjY3Lwt6khRa ++eHT4q8r17EpmTr5iGLLC5pLlq1T5bATZMSVH3h0rPhZmRgGAgAA43LedPuyX/QAAAAASUVORK5C +YII=} + +set _AP_IMG(saveall) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC9FBMVEUAAAAULrI8PJwtOKoTLK9E +WLs6UrsqSLshQbsOKK8pOa0bMK0CD5oeIp0iNa0MDZAAAIgAAIQUObwzTbsZPLsNMLkvPa0SMrcS +NbUOG6UoMKMXHJkXOrcmMaUyQK4xPasKG6ctNqQKEZkCEZwACpYMDI0AAIkAAIn////q8P/n7v/w +9f/u9P/s8v////zZ2eLy9v9Po//h3O7h4eS8vMz3+f/1+P/BwdCCxf94uP9Nov9yuP7J3vb8/f/6 ++/93vf9ssP8niP91uf3//vj/+/HCwtJmZ698wv9/vP98uv91tf9orv88lP8yjf////Dg4Ofl4uPS +0t709/95wf+GwP9wtv9wsv9mq/9Upf9Al/9Ck/83kf87gPg/g/f9+fTM4PLv7u+4zu3n5+vGxdTJ +x9AzUbz5+/+Bv/9ps/9kr/9Qo/9Em/8ghf9RkvtMjfpEhvna5O/A1O+zyuieseiesOjk4+bT2eSZ +ueSGqduLlco9W8SOx/9zu/9ttf9arv9frP9iqv9fqP9Zpv9NoP8tiv9Pmv4+kP6QvP1bn/39/Pn2 +9/nQ5fnq7vjL4PZOnPb59vHX3+qsxenn5OLh3eHN1uCPsd9Wg9nPztZ7jdaZodSSmc9PZsRMY8No +d8L3+/+Kzv9Jnv9Jlv44jP54pv1Zmfnv8vg1dvjB1/XH2vMAIPLi6PE8afEXS/Ht7e1TmO1Li+0A +K+ufsuhzp+dyj+d6muaBoeXs6eTd2+PP0ePu6OBTbt3K0dzi3dvY19uaqtvV0takqdXEw9LDwc2v +ssmpq8hHYcRCXsRia7lEVrlKUrHn7/+fzP9Inv9jpf5qmPpbivl+tfhLevdzsfVsrPUsXvPx8fCX +we9Gh+2fwex4p+zp6Os1fuvU3+qZver89uiktuidsOhriuhjhOhgf+iNrOaJqeX17+S3wOS7xOOw +vuOrtuPD09+lr981hdxddNtOaduGltmmrdja09dYctXJx9SpsdSUntSepsgrd8YYLbo7SLRiYLC0 +30Y+AAAAKHRSTlMA39na4ebl5eXk4uK2rOKXJxbn5eXi4uDa08qy+e3j4tnZ1sCmdDUOw0xZIAAA +AwhJREFUOMuNzlVYU2Ecx/GjYqAomIjYydgGGz1GbAxkYxtOYAwGY6J0d3d3d4OUdElIl4Dd3d3d +3vies/GAd3wvz/M5v/cPLbC14kvgdi2eH/ggLSEE4nnq0RW0s/6DvoqzdX+vJoZ0SAvBFrwL2eV8 +/HMlYao2qmOBlmFmxktnwTkXMjnh+MmxY3DfbCYCx4eLeOFR2kuhA/tWg7bZgqanZw4KmvrzeyZ/ +hBceCYB4nlla2qX4oS+s7OyeHnk4xcLWq1fy/n52d4wAYIcZGOfEP1PSU0UatRm1Aa9HhUwVuTly +tJdB2/HkmBjwupIekurEz3EAwqNCS4vc6HQANjmRmczqC135h5GGv7YVDPywdIxklxa6OtCNAcDH +MJmuF7sG5ZEGTp0o6CvkOUawS0dcQ0kArMQzLSzcLndmH0LKAuDFEM8hIqTkoyvb1Hg9tNKJacFw +b3ycdecoXPeHtk8P3vEcODpBNx1IbH0A8BYMc8trT5qvH4Fr7n3ll/7GPZSuM3k72ISgv1wAapue +GhrqIhmCXrqzScTiXisNGKzBM8yda5sa29sf+fj4eHt7+3g/7HQjmhKLFeT4CHBiMMy53Liqqrg4 +LpdbWRkbG5tAJyGgnoYsmEdyOHQSiWRqagAiEGg0KpVqQCxRkPOk6q+AVqk738rv78/JyfHz87uX +kZHh4eHR0FAnBGoI8GelpKTU1CQlJSUmUhLlQJR6AnESAHsh8EWdQWExOBXlMi1NGThKHUHntIKc +tQBU+PtiZWVRKAzaSEVZICieAmCitgESUY/O9cWggMDOCStrmk6QAsULAfjoXBYaJRQ4WMwH68CC +Uy4Lh8XOCTtNAKgICC5fB4nizQJYKhjs/A0ZKy97bdvX/PvarWKQqDoAZWg0IPClWDTOSFkrPdNe +betuKamdeyUg0fe/ArLscDgMZm7DLj3TRG3zWghJNK0loA8crqmlrGKEBv/DN+hmBpfPArG7YR1v +k/l8fqqGoNTU5GSPG8YteyBBEmIbJReJiIgs+i/JjWL7oYX1D5+cQmwVLt+lAAAAAElFTkSuQmCC} + +set _AP_IMG(share) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABCFBMVEUAAAAAhlIAhlIAhlIAhlIA +hlIAcEIAhlIAhlIAhlIAhEoAhlIAhlIAhlIAhkoAgkoAdUIAhlL39/f////38/fv6+/v7+/n5+/v +7/fn6Ofn7O/e3+fn4+f/+//e394AilLe294Ijlrv8/et08ZjsZQYkmOUxbV7vqVzvJxSrIxCpnsp +mmsQj1oIilLe4+e1286t2sacyb2Exq05onshmWsIilr39//3+/fv9/fv8+/e7+fe5+fO4d7G49bG +3dbO19a9z86ty8alz72cz72Uz72cy7WMy7VzvqV7tqVrspxjtpRatpRaroxKqIRSpoQhkmMQkmPW +4+fW59691861086108Z7w6VzuqVsXQksAAAAEXRSTlMA3u+3xqUhmIR3UueMa1o5MS48SPwAAAHP +SURBVDjLdZPXWuMwEIUdQoBlq4QkS060WidOL6TSe++wu5T3fxNmFNkKH/Bf2DNnzowtWwqAhcXc +3AfkCj8DyxfyKYtY/+7z8fXw5GR4PfZKAeZ3XRyfb604ts5j4lgOllx0tbEyw8aVk/PB/LS9b3XK +pGTUhn03JMjZ+i5IWiqH1JDuxjOGVewOVUaIU1a9oQEpC9/AQGqkhuo69nse9+ACM9arznAGz+dR +Sjgi5CWKOLzH2dRgNrWWPKMCqok4l1pvGmtoab3m609tMHQwWtO6ZQ11ShlHjmrbO7dk3DTxAFNG +ad0ajiktC+AGXtd0hpFQkUDKlB5bQ4UxiYKB2c1tkSEZq6SGsgRwUUkkM8qp4RRj4H+7ems6Ncki +gSl2nVpDA6c5dlqkfWPiIwjxuQ1rGHEuWEbfLhMjwfnIGsxfXFIG/iPD7NJ7xhpIPQw59cDXeYYb +D8O6+xcPPaUE9ez9g4tQqvfgDCQplUrW4REgJX7DDCDls3UOwoB4Q/ewWCyWhG+H9HBCELdpu7Ui +ojigbFhzxyH4RqY093/PsN908nywQByT5OCP4yCZpOqPN0fz/u7y4uLy7t4r+QBYIu/xdeRX4etH +1bn8MhRfAWz3XLL36AkjAAAAAElFTkSuQmCC} + +set _AP_IMG(sound) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAB71BMVEUAAAACAgQiIieUlJ4FBgck +JCxOTlgDAwM3N0E2ND5LS1NhYWwjIyZERE9EREpPT11CQk44N0AVFRhERFEJCQpHR1YMDA8hISgB +AQMSEhgAAABPT14gIChZWWh1dX9XV2RKSlAfHyVsbHZxcXkwMDk+PkNZWmI4OD9UVGRKSlVDQ04u +LjVKSlkmJiwICAlQUF4zMz8aGhw+PkscHCJVVmUbFRsoKDMjIytCQlAXFx42NkM1NUEtLThUVGSk +pKPAwL98fJZ1dY6EhJ/Ly8+8vM3Dw8a3t714eJL9/f/39/vV1dfQ0NLHx8y9vb6cnLOHh5Rzc357 +e3vy8vbd3ejX1+Lb29rR0dTFxdTJycyoqL2goLetrbKZmbGOjqimpqeBgZ2SkpyOjphxcYqCgoFp +aWz////q6vHT09TCwtKzs8asrMCmprqpqbGkpLCZmaOEhJuDg5B/f4pqaoJTU1ZNTU4/P0zt7fXk +5Ozg4OvR0d3NzdvNzc+9vcawsMWysr+zs7eVla2RkaqLi6WenqOHh6Kfn5+Li5SPj4+Hh4uHh4Zk +ZH13d3lkZHVfXGtiYmdZWVpKSldISEsxMTr19fbc3OPOztXIyNW5uc64tMOurqynp6yPj52Skpd+ +fpF3d4V4eIRzc3Zra3ZYWG1gYGM9PUJRpvODAAAAPnRSTlMAGgX+JQzfaffx5OPi3NbTubKyg4J0 +cGJZQzUu+/Lx7Ozr6uXi4NXPzcvGwL2qqaWlo5+RjId/e1tYUi0fEtZkUkUAAAHhSURBVDjLtZHF +dttQEEAl24mThqmBMjMzCS1FZElmZoiZHWqYmcqMH1plJfdEyqq923vPO/NmgP9A3f0Tl48dFtwS +g9/aXqj7LrGYy2z0qPqeYPFrcFp7XaPin2q5H59zHvKUyhTPmszBdf90hhMfK/rnba/NogmCSW6p +S/GD7W9itl9SQHDzdxW85vYERRnLEQh2Oj3tCsHDbMxC+ysRyPgSJ68e9L2hmMVBL++uQkYWJ1oP ++CcnqVGDg17Z212EWZarr51N1/+oo6XwaiSZdNDCF7EM2+14TdB75WxoyjFmsabSkwmzMBWvLDJD ++BE5aKKp4VHrWMrnTbsMZiE/vhWx/RWco8YNEvzcDO9ODgulyajJxjhb5OBiPOV28/ws5pvxuuLC +mru8bGOIS3LQYfViWACbCyz4ZvmR0Bry+wPDkNfk4MF77yCCIHkkgC34LNqf1ShhH/LckIM+rQsd +lEClArOG9rYhmLXP35MDsP4dKhEOo9JDCX9lVVo1u3IUkOneqTY0NJ5v3AyjYdfE9v6x8Gh/7RUH +BnRgnUbXWd0o5d9G989NtIKAAvozO6VE0QQZyY+dgCK6m8c/pdf9HvK7NIIyfc3ZwlIu0wwCaoB3 +NgvZLT1wCPoLp7s1wD/kD8xRg9/PUDwvAAAAAElFTkSuQmCC} + +set _AP_IMG(tag) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAq1BMVEUAAAAPRyctym8ty3AVYzYL +MhsWZjgnr2Anr2Anr2Asx24uzHEnr2Amq14lqV0Xazorwmomql4lqFwkolkhlVIgkE8ZdUAuzHEt +yW8uzHEnrmAnrmAtym8sxGwko1olp1whlFESVC4SUS0uzHHs8PEsxW04znjB6NTl6usqvGjT2drA +4tGXoqMys2kotGO1vr+Jz6gotmTBycqLl5ijra4rwmt32qJzx5gnrmBA3g9dAAAAI3RSTlMADcb9 +Lggz6u7stPjwxL04+8G4pIV9XujY0MjGxaSEcGQmF3fzrSwAAAD4SURBVDjLfdHndoJAEIbhTUAS +McXEktjLAIJ9sd7/lbmwjrPOHP3+wOF9KOegpmENcLXBixILwd2rFHj/QwEghASePq8PJCTQjXar +6pEQoGWOfr2sSUKCgK/M/ss+m5EgEJoLI9ujiAQB+As72IUAO+xpygXry5w/g/VNxN9SFz2/f0s3 +Zn2zNMARwUcs+1X0K4X4LkSyMCDHPt9fxVih8FZG3PpuXpwfAYbKivcY4lLkTt8eAJrKLkCROn3t +QdZWXNz3z4qSYu9096cGVRSsc0H9BzvOR0Gdi7dS2P6F3yfFiXUhNOtCAGS/1KXQmXa63KTRa/L+ +fBfkTE5YCLQifgAAAABJRU5ErkJggg==} + +set _AP_IMG(tagoff) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAllBMVEUAAAA5IEOZWLRQJ2GORa2O +Ra1TKGaMQ6stFjaKQacnEy+bWbaORa2LQqmXVrJ1OY5XKWowGDqWUbOaWLZ7QJRqOICbWbaXVrGG +QKOVVa+DPp9/SZVZKmxEIVM9I0ibWbbs8PGYVLSUTrGfYbnazuPl6uvXyuHT2dqQR66XoqO9ms+1 +vr/BycqRSa+Ll5ijra66k8yyhsdekoq1AAAAH3RSTlMADsYu6+4zxQq5B/jxv7N/OAz71IVj6Lqo +pJ9wWiYXwDI28QAAAPFJREFUOMt90+tygkAMhuG0VFFssfVQzwYWUVTwcP83J7sasyaD3y9m3gd2 +GAZYxz2k9WZ/oBajv88PBej+RoGohQZVUaRNwvX5st9CFgr0ASAYuJplLBgE9mLo+mbDgsGkA7C4 +9ySRAu3+4yF1JZBne55LIfq+lM8Q/ZjIUwaql6+nhKnox30NPNH+TnUnEVnxa0W2rUFJfXd+iDGQ +SE0tnv20s9cXxBHcRYtE6fWDcR/JrU0i93qBaMYgxWsPI9Di7HX7mlqIzuLLCe4/8hcISIiuxKN3 +OAhxtb3LXYlKdCVEV8KYqhtB81bTcCT7+90A44dG5f6L5qIAAAAASUVORK5CYII=} + +set _AP_IMG(terminal) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABR1BMVEUAAAB7e3sTExNCQkJwcHBh +YWFpaWlaWlp1dXVCQkI3NzcYGBgQEBBBQUE/Pz9vb2/IyMjFxcUKOF4KNFgKLU3CwsIMV4rU1NQL +SHQMXJFWXmYKMFLS0tIKMlW/v78LRG8LQmwJKkjQ0NANYZkMWo4MUIALOmHLy8sLP2fOzs4MU4UL +PWULPGNWXGIKNlvo6+4LSngLQGoJJEDv7+/o6OgNXpUMUoMLRnEKLEsJJ0Ta2trW1tYOaaUNZZ8M +TXtQWWBLVFxGTVTy8vLl5eXg4ODd3d0MTn1bcHxZbHhYZ3IIGzTs7OwNZqAMVYdUY25QXmlJUVhE +SU8JITwJHjji4uKsu8Zbe5NUdY1IZXw3XntUYWtLWGKfoaMNZJ2Vl5hUepRAZ4NAY31CXnVNW2Ws +u8V2jZ5be5JJcY1JbYhJa4QlU3U3WHI7Vm1ldLU1AAAAEHRSTlMAVBCIVFRUVD2CYhoJREQ9Roe9 +ggAAAhdJREFUOMut0Fdv2mAUgGHSZidtscEL4z2xAZttZtgFwkggjMwm6R7//7qfB6tqpF70vbJ0 +Hh0df77/0uHOCx2683eFQqvZvGqk0+epVL1eT6XO0+nGVbPVKrhiF8OKgLjCnTcazVahUMR2XBDG +7kKhm2G32+103tt1Op1ud3i3AWIcGYB1NmdKGioShIhqkskMN8BZMCDrLF7JokTmvt+/Fwg0i/8B +4MU8ZwOhXCqVAdDwmyK264GwDX4ac9MG/VKp7wLMA/sOkPVrYy6tN2Tx0QrwANg3XhsfNDEjlMtC +RnRAeAn4M8v5CSDAlYKQIcSBlBuF16BqUXA0wTwaXwcikQFzNNtmRmHeAxG+ylFxWX8yvrXBO4DA +O1TYjzy/74C9SKRqP9Sz8R2vSNoARQea1DYTWyBPUs/GgsVNs9KWQG0TV28jEQ8oykU+SP5agCty +nz9Np9PHiokz+hZIWiS4QmXZpy+z2ewHjjOsfKsoHvArtSQXpAJwVAU7cFCOYVW4ugb+2jhvr7AF +y4DYhBoNVBX/3gpMwApbyLqqJhKqqsswdeH3wAEEXU6SeU/IUZAsw3FyC/TGybwFRCAeh+3iASpY +gyAPIMhlbzJ2dgDiRJEkV4OQDdBzCWcFnSyOS9YQ5MAFNP0QcwttFHug6RWgEQSBIMi/DHwjCL0E +bzfH2+SNA06Oj17/taPjE5/T6asXOvX9Q78By+51cKmaBI8AAAAASUVORK5CYII=} + +set _AP_IMG(tools) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEUAAAACAgIGBgYAAAADAwME +BAM4KCgvLzEBAQEBAQEBAQFUVFQrKywFBAQAAABwcHlubnVMTVFKSU5MTFAODAsFBQQAAAAGBgYA +AAAAAAANDQ1NTUwEBAMDAwN6FxarFQpra3NkZG1LEA9jY2pQVFoqKitnZ25LS1AuCgpGRkqIDQkn +Jyg7PD43NzmAgIB2dncJAgMWEBBOTlAAAQEAAAAHBwdrBAQAAAAAAAAAAAAFBQRoAABCQkFpAQF7 +e4V3O0BjZHNvJyaUEwpnc3x6IR+LjJhdXWWeNzNfFBJwcHY/QEampqZCCwtMTFE/EBCTk5VCQkaY +DAVycXVABQV7GxeLEQxWBQFkZGtjY2khDQ6Ojo6UEQpCQkWHh4ciIiM+PkFXV116CQcXFxgyMjMt +LS8GDAyBAABCQkUZGRpPT1F1dXUsLCw7Oz0gICADAQI4OTpvBwUBAgIjIyMHBwY3NzkqAAAhISE7 +AAAtLS1jY2IQEA8rAQIDAwLNzdrr6/PU1OHS0t78/P729vry8vXW1uOqqrjq6u/n5+/j4+zh4evc +3Ofb2+XZ2eTX2OTT0+DGxtSWl6b////v7/Tl5eve3ufX1+HIydi7vMq3uMeamqiRkp/xpp3y8/jt +7fXs7PHg4ObLzN3Ly9m9vs21r7Ken63uraaTlqOBg5HZdnD5+v/4+Prv7/fo6vPT1OX/5eDP0N7O +ztz/39nCw9XCws+trr6lp7eio7Tvsa3srqj7s6eKi5qDhJTekY10doDkd23qeWvwe2rFQj3iSzna +SDnPPDLrKA3fIw3XHw24GAu/GQrr7PTZ2ej/5uHR0uH/4t7T09nOztPLx8zDwMj4ycSus8OyssG8 +tcC2rbqvtLjut7SWmKnrqqWZk572qZ2SkpiQkZfjnZXmm5OEhI+hhIx6e4bWhoHSgXqccnn5hXHf +dW2AXGPNaV/8dV26XVfURjnpTTjxTzaPNjWWNTHGNi6EJiZ/IB32NxqAExOXGBHQGwrKFQm8EQer +CwSyCgSvBQKlAABwigSjAAAAfXRSTlMAJAoEKhcHo3kvEwvZHQ/54M3Hu7WrfGJcSzUzKCL9+/Xy +5eLW1NHR0M3Ew7Osq6qhkY2GcG5dUT02HxwUFP7+/f39+Pb07e3t6+jh3t3d0tLS0MzLy8jHx8bE +w7i3trSysq6pqaalpKKgm5iVkJCOjYiAcm9mZFtWUUI8GxYowoAAAAKpSURBVDjLYqAWkDYKFxBI +KJHFqUCtv6Ouvb5VuYwZSZDbBsHOaZ0zsbFxZdejIja4dKV/kBSEacPEwJe85FRTU9OqTn5xmKVR +F07vMuQCMz2FGRn42Ge2z5nU3LQ5gBOiIHbi3EVeHGAFRgv7NVmAKmZ1Tpo3qWNvMRvYAu/Va5eL +WICdBFBES9N0oAqmlC11bW11SzJYgWJsWZt3O/CYcIENE+htr5uhzsmQ39o+eXJ7axwjUL9+v4KI +sQQj1IsNnfM7rqqku/ZNmTKlc2YSIwO3Xj+/qDkrzEOZ07t6uns2Te/r7u3t6Zmpzcim168oKskE +D4OKZb19DQ0tLfUNQDC1a1a2/jQUeQYm4Rl9tRDQsH7qpKn3FrkZgOQRQEp5+tkNtQsX1m64fm3N +/MUznqiaM6PGRJX6zEXTFixY8PzTx8U3Wu+fn8DOhRZXALHk+irY8Tvb79nz9c6y+RPrZmGoYLIU +5zAxdLl986Dc4pXNjXNn6bKiRzgzQ3XI0x0rDv77cnFOc2PdBEwVZu5Lt6/4/Pf/90t1bc2Nqyfo +1KBIsxW8vbx9xZE/jq8et3R1tIHM0EE2wzbx2calL4/89khVudJS390xr3ni3AnxvHB5a60H52bv +e/dLTsRCSrC1vr57ctvkVXXLYqxg8qE71s3ed/jnj0gJJgYWwa0t9V2d02Y0rbnFzgcxHzCtpetm +7z98XF7DFGStjODW+qlTarfM692lDUleaQ/PzN5/6PgJPzGIkTJC29bW1/asX87DwQv23+uNdw8c +OnZSqZAFaiWj0La+7mm7ecQgKSZ6584D74+eVMrjZGaAq1iyCagfmqIC37z4cPSEjzFQHg5khfeq +csDyWbn8t2NOGmIsKFHMayrOCOeUhgUbSPCixw0TEpvRUgbKxQQA3pT5irz+NeQAAAAASUVORK5C +YII=} + +set _AP_IMG(trash) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACnVBMVEUAAADSHR0AAAAIAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAbAwLOFBTABwbcKSnVJSTBODjRdnbVcXHgb2/bIiLVQEDABQW/BATm +amq/BAS+AwLaJCTABATjXV3ABQXABQUAAAAAAABTCwjABQXBBQUAAAAAAADBBQUAAAAAAADfUlIA +AAC3IyO+AwOrNjbQe3vPe3vIDAzeMC/JHRu+AwPIDAy+AwPQMTCxFBLIDAzRIR6+AwOwBQLIDAy+ +AwPJDAy+AwOuKCaQDQu3BQLYLS3VLCyBHBlpCAXJDQ3BBgbBBga+AwO0GhabBwLZODjVODjDCAi+ +AwPECQm+AwPfICDXGRnQEhLECQnrLCzmJyfyMzP1NjbuLy/jJSXUFhbIDAzNEBDcHR28AwP5OTmg +ICDPOTngNTWMKip1KiqAJiZzIyNvICCUGxt9GxuHGhp6FhbJEhL9+vr17++uLCyLJSXaISGVICDV +HByLHByTFRX////79PT15eX229vgu7vTlpb5k5PdkJD2g4PDYmK8VlbeUVGfT0/tSkqISEh3QUFt +PT1pOzuUODjzNTXnNTWpNTW7Li6jLCyYLCyBLCzpKirkKCjhKCisKCiiKCiXKChuKCihJSWWJSWK +ISF+ISF4ICCgHR2fGhrIGBiHFhaeFRWHExOFEhKQERGCERHADw/HDAzu3t7o29vl2Njvzs7mzs7q +yMj2x8fbx8fbtrbgpKTUpKTooaHvlJTblJTqjIzqhobve3v3dna4cHDUb2/tbW3mbGzmZWX0YmLU +XV3JWlrBVlbkU1O7SkqzSEixRUXcQEDlPz/DOzvYODjtMjLFLy/BLy/vLi7WLS3ZJyepJCTNIiLb +HR3OGRmpGBhlFxfOFRW6Dw9gDQ1eCwuzAgIKcb/6AAAAU3RSTlMAAyIFQjkmGxURCwizCP7+/fDd +vLy4pZiUi355ZVtZTEpIQEAzMiwmHhgXDv78+/r69fT08ejk3t7c2djYz8vBvby7tJ6eh4aEgXRw +YF5AQBwYD9JZpfAAAAJLSURBVDjLjdNVVxtBFAdwNhsX3N217u7ubQIJpAS6TdLG3XB3KO7uUHd3 +d3f5LF0hPbPNC/+Hebm/uefcO2fcZp/ksEAfb68F8728fQLDkl3K+/3mmbV2aYfJ1PFJKjV5+u0j +laGt1l+TQ4PSns6mps4e6eDQ6OicLRAAQsZ/TzjUamtvV3NzV69VrXY4Jr6FAMD3++TYiNbeZz6G +xtxn146MjWt9AcBtHNDpNJp+haKlRaHo12h0uoFGLgD8bbK6bpVKqTyORqlUqbrrZF/9ARAwLZGX +l1VUVdfU1tZUV1WUlX8QIgEACJrOThU0VD64VVJUVHL3yethPoIgQQDYmZUmsbSLxEczRJlHJNlC +BA0/GAC7stJSBemtbzJE7RbbD72Qj2U3AEJxcNjZgQChAAj/B9osX5wgHAARM0B81ZB7xwkiABAz +A+7lXL9iePWTADEAiCWAPO98unveyacEiAVAAgEe5laKPK5dnCJAAgAOYOCz7EUDNoW+9DkODgLg +EAbenj5Xj4OzF/5ggAcACAPvDJfk+B4e55xA63PdwCxEQalRji3KNjx16jYKlpDAUhR4Gotv3Hwp +KC4sNGIdlpHAShS0PSo4k3//Y37B5WcIClaTwFp8zHrx+9ZMmZ7Y5DoSWO/6WBtIYIcrCCYBHvd/ +sJnnRs6eVSBYs5dchSAY5kRv27h8kbvH4hWbtkdzYBhy/iyYzWIyKPT4OBqNSo2KjIyiUmm0uHg6 +hcFksWH8Osxhp7CYSYxECoVCp6NHIiOJyUphc2C0yV9Ns/FUA+k5wwAAAABJRU5ErkJggg==} + +set _AP_IMG(tree) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAgMAAAAOFJJnAAAADFBMVEUAAACo5/8AkgCyWQB308k5 +AAAAAXRSTlMAQObYZgAAAIdJREFUGNON0LsNw0AIgOFz4czlEdJgSzTuWSIrpDlLcW9L/PtknoR7 +lC5M9QkQCNJFSI2UBtNs2zGlUXe383gGwLbc8fEG14J5wyk9MnNWzBkaMC14RN7IAXBjf6cRMAhI +gfXJLgFA3QMGorTS0nbBqnVXQKRA5NWx/O7gGxgapnLyGrj4xR+tW1/WTx4BkwAAAABJRU5ErkJg +gg==} + +set _AP_IMG(umbrella) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAn1BMVEUAAAAOIiQ9j5gbKzsOFyA6 +YYQIERUAAAA9e5M8aIkwWHEHDxILFxo+jZg4boY7Y4Y2foYxaXYwaHQvWG0dQUgcMT8YKTgbPkIL +GBwHEA8AAAA/fZRBk549i5U6eo06eIoyU3EcQUYaPkMYNTgDBAoAAAAAAABgzOdfwOJfst1eo9dh +3O1gx+VfuN9g1Opfq9pf2epao9BdzeNcy+FanM8y//w/AAAAJ3RSTlMAcPF6cPg2Efv44lk8+PXz +6uPf26CajHpjUw/8+fj19eqSkXdMFA3wFg9FAAAAi0lEQVQ4y83SRwKCMBAF0G9LIAm9Y6+IBUG9 +/9k8wQwLWfDO8DAAWUxIxQUQTnMntWuBsGKFWF5ZFlTNimDsG8MWgNQzUi4xDnt/SvIPQPxuGJ8Y +mwdrC/fJcpF0L0aXAKnyFpRdinE451l2JNJqCZhVy6R1DIKKFcDqSxvVLAXhfXvSlqc5SZf43w9r +Y0pG0PbONQAAAABJRU5ErkJggg==} + +set _AP_IMG(undo) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAB2lBMVEUAAAAwKiozLS0AAABEJSU9 +LCwtJyc7KSkyLCwxKysAAABMGxtQGBhCICA6MzMlISE6MzNRFRVLHh5CJiZIHx9HIyNDKChEIiJC +KSkvKSk8Ly8tJyc0Li42MDA6MzMpJCQAAAAAAABKHBxIICA+KCgzLS07JCQ5KCgsJyc+Kio2Ly81 +Ly8PDQ3/iYmMGxv/zc3/x8f/w8P/hob/b2//sLD/qqr/goKyZmb/RUX/Pj5kGBhVExP/2Nj/ysr/ +wMD1v7//vb3/ubn/trb/tLT/srL/mJj/k5PFfn7/cnL/TU3/Skr/QkJPGRn/5ub/2tr/vLz/p6f/ +paX/pKT/oKD/nZ3/m5vYmZn/jY3/enr/d3f/Xl7/VlafTEyTQUFwIiJgHR1SFhaHExP/8fH/3Nz/ +0dH/z8//xcX/ra3/oqLPjIz/fX3/dHT/aWn/ZGSoWVmyVlb/UlL/UVH/Ozv1NTWINDTYLCyyHx+B +FRX//Pz/4OD/09P109P/uLj1trbis7PrsrLira3ipaXrnp7/lZX1jo7Pfn68fn7/eHi8dnbYc3O8 +cnL1cHCcPj7rPT2cNTWJLy+MLS19LCzFKiqCJiZuJibFJSWTHh5wGRlqExN9ERFkERGVEBB/EBBk +EBAatIq6AAAALXRSTlMAmQ8E0Z41py0gDPLvzG9ZP/Lv3NzPv7+vh39vaVxPFhQJ5eLIsrKMfHJm +VjxKEXURAAAB1UlEQVQ4y2JABkxiwhwMeICAUF85Ix55Kes2Pz3cCpgk4uoqbHAr4BCJrU5KSsWp +gC/BvNLX19dAz0ecjwmL8axWYcnJfn42NjYNHSU+rJzoxov221elpKTq69va2hqkNfXw8KHIy/Lk +G9gaGKQZGtrZOfg71jg5d06XQLKH1arV0BAo4+/o5OxiYpJuahoQ2FLOglDh4+5sApIDSQUGZQSH +hLo2u4VPY2GGKdCMd3d0DQkMgMi5uYWH6xoZmXXPYYcboc0dY+hqZKQLAiC5iGyP3KiC3lmycBWc +LBPrA8yyIiI9jHNycqOioqMLPb0sJnHLw1Uws8ZnOuiCFOjr6zuFZoMVeCeqI3lVSzDPwA2oQM/a +KrbL3sEYpKCUGznAAGNjKbE3bTfWU+WXFLbOsw8qsPC2nCmNEtzsVmF2ZqDIUmRTsQpz8fS2nCqi +iBKiMgnm+hMYwW6SEXR38bIstmZDjRM25djJjFAmj3uwZVGiJFqsybPz8sOSn3VjVlGZODOaCmYF +eBRIxRlalCop4EmiouZmxQkc+NJ4fK3lXH58uUDM3DhRA58CuSkmsxkZ8AGhzDJGZnwKWGPy2bnw +2hFnzotXAYNPDAEFLDPU8CvglNZhBgDOxma2VxaO8gAAAABJRU5ErkJggg==} + +set _AP_IMG(up) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACglBMVEUAAAASOZwAFpAwSKcAHpEA +H5IAA4skPaMEBIsAAIkABYoAFZINDpAvSKcROZwAA4kAAIcAAosAA4oAAIoAJ5QAGZIAFpAAAYwA +D5AAD5AAB48ADpEPFJMJGZMGEZEJCY0FNJoBEI4DNZkABYsBH5QAAIcAEpAAHJMAEo8AC4sADI4A +KJUAF5AAD48AAIsAHJMAM5kAEJAAM5kAIZUAF5MAF5P///9Rq/////xCkehVqvz6+vv9+vX08/Xv +7/Lz8O4/jOQ7ht+7xtw2gNordtT8/P74+PlPo/f49PJMnfLv7O9HmO3o5+zv6+vl5evt6OnHzN5a +j9c0e9UocM8iZMNQarY1T6k1S6dLpv7B4P3X6/z29/vr8/t6uvn49vb39fbx8/Xx8/RKnPLr6+/b +3u7z7e3q6ezq5unk4ehloujh3+XN0+TIzeTa2uO+yuHDzeC9x940g97ByN21tt2mp9eYnNKWmNFl +kNBSh9AvddArbstpjMkmacZ6gMNwf8AbW7wTVLlQbbZOYrQwP6Rcr/9Oqf9Bov+32/6Dwv5suP5e +sP6Fwv2i0PzM5PtQp/uo0PlRo/dEnff89/bx8/bp6vZHn/X79PKYxPJ2s/L18vCgw+5QnO08ke1H +l+yxyerZ3OjF0ujT2efP1eU8ieNgmuI3h+Jclt6+wt20uds9hNo5gdovfNmiq9iIpdZUjNWgoNRL +htQ6fNE2d81PgctEe8smbMojasoyccmFh8gRX8eAgcYeY8Uva8Roh8NhhMIdYMAqZr8NVb0mYLtV +dLhUZ7dbZLdcYbciWrYNTrRVVbE/ZLASTK5LT60DRK04VapDQ6kqTqUoQqMwM6EhKJwaKJsVFpOx +2p6pAAAANnRSTlMA7FL9eV9b/vXckiP9+/Dh1bKAd2BXTkRBKhsJ/ff08Ofm3M7Cv76tpaONfnJo +YlVIOzAaEQbomLuQAAABv0lEQVQ4y2IYdEBKSICTSxK3vLjA+fUlJ/nZcMmzceyKNjNzLeMRxiVf +amYW1WthVnwVqwpxjjIzi8gW8/5JZsU8epjy3Jw7zMzazc37Jk63NSuRl0CXl1Y95moRaW5uNSFp +zqxpFrWcUmgKuC5NMYvqMrdy9/S2XDzPw/aMoDSqA2VyzGI6W4Hycy0dClcusEm5LITiAP5SM+uO +CLB+B8dVLhvm26yQM0TImwoeNbPoaYuYmgSSd3YJ3lmeYVOrbAJXoHslxSymOzZ2xmyQfFBgYMVm +p3S/Zi2YPGCSimvMrKPd4uJtM5cC9W9c6J+RlZubtlwW5leNJjNXa2s3t3i7zELnoOBNi3y9ktN8 +/Gzq1KAK1NnDmJl52Y/Y2i1ZHVS5dXu2Rx07LzMz80UVqAJjfSYmJjGu5sl2y1wqq0L2ZHs0aYoB +hUS5UYJCNDzBKzC4qmb/gZyZoTpYIos1PCF53baakPpDAfahLFgVJPpU7A6pbziOS0FYos+Wgw0n +zp4usm/ErsDOb215dfW+vQG+WBWInIvzSk319fdPz7I/jFXBhbz8oryCAicnp/xT2lgUGCnxMUIB +n4IBw2ACAKrPh6RB+w/vAAAAAElFTkSuQmCC} + +set _AP_IMG(upload) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABy1BMVEUAAAAhYBQaWw4wgwoZWg46 +jwk2hwgkYxw4jAkeXhYtfQkseQkoZR8iYRcdXhEwfQg7fSY1fhQ+gSeDt2JhmUk8dSwufwkpdAkf +XhcmcQhDgzAncwdMiTaRxm2HvmNrpktikEpil0Vwr09tqFJZk0U/fSwxbCQqaBxGhjI+eC9EhDM6 +dy08eDE6eC0ZWhMqaR4zcCkoZR8tbiEmZBwzdSYraiI2dSsygQg0dCgpZx09fC8saCIycyM9gCoz +cCYxbCNVmDo4dgZZjTBRhjBZjC9doSZXmCJJghtjlDtjqStQjR5ol0KC1z590Dp4yDd1xDZyvzRv +vDJrti9ioC9psy1krCpanSVWkiQ5eAeW02aT1l59sVWG0EqJ3kWH20SE1URmlkB4wT5pnT58zD15 +xT1zujtlmTtajDtvtjZmrS5cmSxhpSpUjiZVlSJOhyBKiRdGgBdCfRI/ew9exgpcxApbwQpZvQlX +uAlUtAlSrghPqQiZ0m2c3GqPyGOAp2OLx157o1t6plqMzViP3VKAvFCH1Ul5tEltmkhsmUeAzUOA +0T9ekDZttDRqrjRoqDRhmzFpsDBlpzBajzBblC1UiipcnihalyhKoAhJnwh0sSA1AAAAQXRSTlMA +XKDEn35+wH41xMTAn59+HxkR/vrwxMTAOjMqBv7+/v7+/frv6ufn4uLY0sy/v7OoqKOfk46DfnVl +XFxURUQiCratGZAAAAFkSURBVDjL1dHVVgJhFIbhsYZUxBawu7sTlJLuVOlOaezuzst1XLBcgD/D +sc/p9x7tDaWQSSQYhrHYsh9YLAzPkMhQpsavZCIei0bCoVA4Eo3FE8nPxqyAWk8g4OtK0urweEI9 +FQKqqoTQjQ7SUPf56qZptL2yU6PtoKAEQ7v6873+1bz7bLN+e2tTM5lvp9ScXCPBafsSeKcN7FvM +N3w+X9tbBQymqq1Gi1kgEAgPx0H7cs2FwyoWCYUikbFlEXDCPt3D/Z1DIhZLJNKzLvKfYOz4Ufbs +fJJLpXK5k6sbyd0XWjmvLpmby1UoFFw3U9Y2l3PC2ss3j+pD+c5EKJUslal2JSvAHPB4hhePystC +eF0mG+eoIXPHNRCJxO4rn28D4ffbejAYzDAOyjHBYyOCajWdUQGBlBvYgaCajmCUggNOYAdZ0QJk +TwXFwKDill4gYBQIStf/Q2BfS7ODA1zRr4w/fQNkhWUc/DEvJAAAAABJRU5ErkJggg==} + +set _AP_IMG(view) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC+lBMVEUAAAAFN54QD2UKDGUBNp4A +M5sMJIYGHIAGCmUDLZQUGngGEXEMMJMOK4wEJowSIH8IFXgWFnEXFWsJNJgMC2QLNpgFCmcAMpgA +AGEAMpkAAGL////+/f79/P36+vsaYdb08/fz8vX29vjX2+v4+Prv8PTb4/Ps7PHq6vB3mtl0l9ju +7vMDae4cZNfo6O8AXemRrOGOqt9aWl9PpP/7+/zk5u3r3+vh4OSTr+M7dtf7///x+v9ksP9aqv9V +p//2+/719fjx8fQPcO3b2+YabebZ1+DU090YY9lAedc3c9dIftb9//99wv9ttv9ps/9frf9Dmv88 +mP//9Pz69vPp5+42ie0vhO0nf+0feu0Ydu3f4evk4+rt6Onp5ecMZucSaeZYleV+pN9Fht5Oid1I +f9s6d9q0t7+lp7LgnZvWdnvNcnPNXlbZWkbFVEL9yRr0/v+W0P+PzP+Jyf+CxP9wuf9Jnv84k/// +//zw9vz0+Pv//fn++vdCk/Dt6+zn5evX2us2heoHY+hFjefe3eaWs+VMj+VhmeRrneIkceKbuOF2 +ouGEp9/azd2Iqd13oN1tm91jld1dkd1Wjt18oNwycNcaY9e6u8HssK+anKPgenxpaG3DaGXJaFxV +VFnOZVjBYVXhYkvhVUf7yDHuqynfTyjGVibXPiHHQxn/wBbtqhD+oA37mAb6hwOe2/94vf91u//+ +/Pzs9vz9+fv19fnc5Pbc4/T18fD07+9Rme7y7e3a3ezY3Ozl2emmxOdRkuVmm+NxoOICYeHd0eCQ +rd1znd1pl90/hduLpNnP0NbIytV+m9VrjNFpis81bcmOmMTjur2vrrXfsbGjpauSlJ2Sk53glZjX +hoXghoPFgoPogn52dnvbc3Vwb3XLZ23KcWnSbGfibWTOVVHQUUvZWUnOTkj1rkPmhTnpkzfdTzbd +SzTecC/gRCLWTCH/0R27TRv+qRm2RRnvhBf/uBHwrhDvfQ7+qQnmogn5jwTZiAPtiALneQD1dQDw +ZgDsWQBo6xNDAAAAG3RSTlMA7O3s7e3s7O3s7O3s7Ozs7Ozu6+Xu6Y5/e2Zkb+SDAAACoUlEQVQ4 +y2KgApASYUIBzDDAAQQSQAUi5zoPG/b2didO7us70t9/dMKEiRMnTUpOTk5KSjorBlQgtHdtQUFh +YVFRcbGPz7r1JSW+fjY2/ra2dnbGxjXcIAWdPr6+fiBBqKhxaWlAQEBgYFlZYANIgWBLh7wuGEyV +hwF3d/epIAqioPvMLuV6NTW1LWr1yhCgBgRbdytHneoQACkAKHGytLT09ex5uRnSUDD94bzcexvK +pVtcQAq4EjWlpWUePV30bT5YVkZGOvPZorx3ZpXlFhAFXSAFOatWrJwDlpaR9Z755VPeUrPKKgsX +driCl7+//8oGK5A18Z75d83q5WYVMAUHNIESNxcuyMkA6zeRs5oO5NzXVq22iAcp4G/XhDgNol9W +Tk7FXkZa1l5VHUWB+owZlxSlgfqB8nIK6ZevnFDUCzaAKNgPUmBuZDSrVhqsX0nO8ZaR0TSFkGCD +ODagAoDY2mBWAOVNgPJKCvb51tYVGqZwBVpAuYysrNkXpUH6HRTsz9/Nmn1Dz3SbQRwfSEECUIHM +k+eLf8z3Bssr5me+WrzywyHT7QaNIAW8YAWP3+d9nmMFlle1zvy44u3SHtOdhkgKXqxZ9TPbSkkJ +KK9tffvP6q/Le6JqDfU5QQr2gdzw4PWSZdesgPodtdU3Xl225E2us3MMRAFPqxbQ/5uCgoJUlIDy +quoaenpmZnuam12RFMjKaKelTdPeDDQfJG+alp5+0tktFqoAsCYtaEDFmoBt0NCIvjN37oUot1gD +fVagAuGm04qqqurm5uYaQLmQkLq66GhXNzdXZ9eY42AFojssvYAgJSXFAwgsgcDTMzU11XPKFE9d +HbAJx2pCQ0PDwsLCw8MjIiIiIyOdgEAHDA6CFEgyYgIWKGAVZ6ADAABtFPEkqyIbmgAAAABJRU5E +rkJggg==} + +set _AP_IMG(warn) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEUAAABkAQGKBwd7BQV0BASh +AACDBgaiAACkAABgAACZAACjAACdAACoCghpAgKaAwOQCAhqAgKiAQFtAwNmAwOkAACgAABeAACc +AACSAABbAACaAACeAACgAACYAACbAACDAACNAACHCAekBwWrBAOIAgKqAgGRCQmMAACWAgJwAgKR +AACnAACZAACXAABzAAB3AAClAAB/AACkAACWAABkAACGAACgAABqAACNAACUAABwAAB4AACHAABr +AAD////+/f35+fn/t7cAAADs7Oz/wMD+s7L/q6v/9/f39/fn6url5eTP0tL/xsb/pabKOC+3KSW4 +Gha0Eg+pBQPfHwHlFgCuAwD19PTw8/Pn8PHw8PDr7u7i4eHf3t7a2dj/0dD/n57/XFvSU0zZUEPO +SkLTRTrNOzC+NTDDNS/SPCzHMSntPB/AJR+rHRm3DgzYHQTkIAK9CwLQFgHDDwC3BgCiAgDz/v74 +/f77+/vw+Pjn5+f+4+Lc3t7/3t3X3d3/1dXT09L/zMz4ysq9vb2kpKSVlZX/g4P/d3f+cW/damPc +XFH/TU5NTU01NzfKPDbPPzX/MTG3Mi+xMC4rLC3DKiS6JSCuIh+9IBvCGRSnEhCTEQ+MDw/iLAyp +DgvdKAqtCgakAgHcHgDIEQC0BAD/8vLc6enz7Oj96Ojh5eXf4+TX4+TQ3N78ysvGysrCxcXMw8LA +wcHlxMD4w77/vb3Zv7y0t7j4ubezs7POtbCurq75sa35saulqanpr6TerqT0p6DEnpz/mJjznJb/ +lZb4l5Hul5H/iorRlIn9k4ftjIf7iYWBgYHme3XfcWnBbmn/aWlpaWn/aGhoaGjsbVzYYFnJYFnu +alXcV1LuZVHaY07eTkruXEbKT0L/RELmREHiWEDtVj/WSz/JRT//Pj7HPTbyUjLuNDLWOTDwSyvm +QSf0LSfSLiUjIyO0JCH/HB3MIxwZGRnoNxfGIRcSEhKtFhDtMA6eDw2/GAwKCgqICwmSCAe1Dwbq +KAXUDgO5CACaAQDFPEZ3AAAAP3RSTlMA5uXl5QjlYks8OCIE+fnr5+bm5eXQxMS1tbCfbUArGxMN ++vn08u3m5uDZ2dfVy8q+r6WakpCMioSAaV5YMB8kO7/MAAACVUlEQVQ4y2KgNuAQ1WHHJ8+tdqWT +lwuPAuOM2upHEjw45blUjtbGH+LlwKnAMKW+0dU1SY8Vlwvn7693dXI6MtMKuzyPWFK8r5O7n1+S +tgJWBexBu9c4NTUlHD6Va4lNnlW0s9HJtbLMre3YdQ15LApkAne5ulfb2y9va+/INcOUlxc66+vu +69nSGuF0vuOWqi2GAvOpbm7uHuucnfc4tCcmTjPCCGShM5sTfO03ODu32Lt1d99TQg9w6Qw3d78l +9g2fnZvtPS4+vvvWADXAAZJVPul0MN7e3uvNDx97e9cJE579tEHxosSTEwl+Hvb2Dr0fvO3tPRLf +vQrQV0Q2YOblr9mb7IGgZ3IFkNz2t/j5bGskA8RSnoa+XOYAlLrUAyQcPO+UfArQUkAEcu61P6F7 +yxyBKk5fAMo7lm8sLHk92wImr6ib8iL0fmRUOFCFSxVQ3jOi8mrY96mCdrBAnnajoGBfpAtQhWPz +9vAKzwiXyC1BYe9nmULDiL8rO/Tmqlhvr2j7nc7OrfZRLlUxS88F/87h4wQrAMwk4HZByI7VdSu9 +oh3X9k7eWh7ttaKmbv2XBTNmSYHk5fi7PoaEHPfxiauJ8XaJjXPxjomNa/A5MLc0eAbYCOn0ByEL +F+ZnZmampfn79/VlpKdPnDhp0tzS0v9530BGaCZnz5kzb15+flFR0aJFxcWFhf9KFi8OC5sfvCA4 +jxGoQDIgOflhampqfz/QgKysrClTcnKmTw8MDAwKyvslDnKDpIC6ABMQsLGxMQMBCxAICwuKiDAy +MopzMlAOABhv1YgF+LXmAAAAAElFTkSuQmCC} + +set _AP_IMG(www) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAC91BMVEUAAAAKExUEDRkBAgIXTpkA +AAAAAAAzjtE+ndd7oUoAAAAYU6GDqzAcXKkxfLsZVaOApS6dwj4AAAAAAAAAAABShGSezRkeXadh +gx97niwjWnIiUF2LrDtymSsVTJuWuzsDBACWuz6ApisaWaUAAABghzkAAAB0mCY1aYx/v1iTtjkm +b7GHrjAteqpwlSOBtDMlb7orcLJGXQ6UuzcUNkRadQ6LsjMaUo9ap51wnn0rfcNojCAuPQeJr0U8 +odsYQlxLf2YGEBRijmBCreMRMlBEi6xxliQzj84dQkuMvWhYeSIUTJs/p984mdV+oTmJsi6m0D+b +xTmQuTOGri2AqCm75k2w20Wexzt8oyciarcUSJC34UqVvjWTuzXV+2bI8VSy3Eit10SizT2NtjGF +ryhGqNsbWqcYU58WS5LP+FiYwjeJtB9+3fFozu1x0OweWJsVTJZHeGvE7lLA6k+n0kChyzyHsSVy +mCKYxxui0xqK4fJPuOVeveNMr+A5kckteLcrcrDh+41gkm5Vg1iq1EGh6vby+fN11/BVu+ZpyOWx +7dhSosg3i8Use8Xs9cEzgrwncbvs+bdkrLMeYK3p+6glZ6ccWaQ8d40mWYZxqYW06ISn2HGu3mNm +kkd/py54nyaCqyJ3nyB9ph+RvhyPvBvQ8vaU6Pas7fLJ8O1exuvd8OQ5ltBiuc6p58zd7sZEmMV+ +y7ya1bhrtrff8aXT4KQjYqSr5qG26p+/4J84bpDL9nrV93bM7HSDsW+x3W15rWDK9F9qnl2h0FqY +w1iPuFBrlD5hiTaMuByFrxu67feF5PVYwOl72eie6+XB7ONXtODj+NRwwNLJ9dBOocx1xcqY4snH +7MaU1sNSn7jR57dKkbFjp7A7hq+Gx65RmK6Q2aZprKXW8aGez6EybqGk5KDi95yBuZxinJrM6Zik +4ZfO95ZTjZVOio3W8owcUIyw2oTc+37H3X3b+nzc/HqTv3FFa1Wp1lKny0aGtT2Aqz2YvzmRxzht +kzPoh0ymAAAAT3RSTlMADARE/ggR/v39LRn8zpmRTCohGhYI/fv17OXcz8nHaGVbPTw4KSgb/v77 +7Orn5eTa0cvCwLm2s7Cuq6umpKKgnpF8d3Zsa2hnUTgyIxYUrkBa3gAAAwFJREFUOMuVkFVYWmEY +gA8g1tRtxkqdbsa6u7uDBpUGFURFQNBht7O7O6bO7u5ed3d3d1zsnIM+Y243e2/f9/v+5/+A/2Hi +nh06OjprNphM/KeeYcRmpUXE34h4Qsctm/D3tJEGi9Th5VVe7p3Wh6XQV84aM67R/+XjY6FQmM7M +zKCSwWL+TGVvohHfce7KfQ+PivY33UxXKpsj4GopFRPm3j4TFuoRfOz0u1c1nQ5MEiuIQsdMtRj1 +B6cGeHsJPYpLK0Mqm8PbGPCK79xsY+RIsPXFVc8wp6KS+uiQ6Dr/9wwHCYmMxeEJOTtHgiWRdoed +nYKPlNZHxyX6v2VIMlhwYLXQAPZmsT6KICQuLvGR/wfGw4vxfXDgrjjHeF84KDp/NrHu2r3mNsaz +zkyyIlgHB9pg4Hk09Phz/6cll8ObGtMzXHvBf0LBFMgjJ/tGqnufcHZqba8oDj9Vc/JWdW2ETEbT +yBanToHuOS7ZL6YMXCFsbGplMC6FOod52d2V4ejfxFm8T3vhIAla4XmH6QDSnV5Non6W9tPwBOIA +b7YFFPAa/GJ8LtRmukokTKbElUQlB3G6AjBEq8BkawBCxSXJL6aql0ylkkCoLHYQB0cLGCDmtCQs +hoPpUJHGkbLJZBaLzA7CynA0rlbLz8AH1msVdxCpuDS8FFA4WKlUisXKKAI6lwA+MJgSuwsO9on4 +fJcePE2Ao4DgBDQ8BvQ57oPWagcAxRt8Pl+sheHi6TQaHc/lYmyJRKs895SojYACMxUbG76YSCBg +YGxtbXPz8/OyotT3AyOMBwubQCsiMRuUbiC5ufl5N9W3AaMYaPPA5HVqqo04y80RYni45/pq4Dfj +tO15PBWRSOSS4jhUWFBQWDjUZWwAKIFYlZBgDzE5oOAQxJzNCEAZtOr2ebHWEFFfJ8nl8kW79RFI +JY9E6FuiNi0oU1NTq/ohl09agdLUgwLlDXqWKNMtyw2nTTNcut4Upamrigb+AIlW1dfVNEeBmGvq +6qkq5sc0SDQCBo1Usr8AyuQwIZtzIDYAAAAASUVORK5CYII=} + +set _AP_IMG(yes) {iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACfFBMVEUAAABGiz5Rkkx8rnNyqWFP +kUpCijBOkEpYllRenFFin05lolCBsXVno01XlVFNkUE8hTI/iSpRkkpPkUlSkk1ZlldSkkpRkkpi +nVpyp25ZmkNvpmOPuYhAiSw/iSxWlFNVlFJwpmdupWVanypPlivq6ulRmCpGjytXnSpgpClKkyte +oypdoSlTmStWmypMlCtUmirt7uzA4JVlqCpIkSpboCnw8O+63I9ipipsriep03Dn6Ofl5uWx13+j +0GmOwVVJkipvsSf5+fnk8dKu1X+iznGfzWqezWKSw1xoqipprCaDwST29vaz14iz2X6u1nem0HKX +x2RqomCYylthnFp+uEaCu0Vpqyl0tSb09PTj4+PY39fL5KrC3ai83Y212Ye324a12Yao0Xmcymuc +y2KWyVuTxlSJv06Ivk55s0dEjSphpSd4uCWAviR6uiTy8vLi4+HY6r69342Ptoys04KUwXmt1Xir +1Hh7qnSbyWxvpGaZyWOUxGOOwF2HvFaLwFSAt1NamE2MwUx0sEJvrEB2sj9sqzh2szc/iDBjpift +8e3V2tTe7srR5r/A07/D3bDL5aikw6LI46HH4p7B35m11pipzJagxZK43Iau1ISq0niXxXBnnWCU +xVxqpFp7slhfmVWRxFRuqFOHvVB+tVCEu0+CuU9fnE2KwEZlpEN5tT9pqDlVmjJpqzFipDBeoTD7 ++/vn7ubf5d/c39vJ08jH2cfX67680Luzy7LR57HQ57Gtyqyaupm83Ja725aVuJK53IaGsIGEr4CC +rH+BrnuAr3qp0Xl2qG2KvWB/tGBjn1BXlE1vqkp/t0lXmD1mpjlPkzlJkDBAii5wsC2/B6FDAAAA +I3RSTlMA6Lk/JL736K13Qj4YGP7+/v739+i5ra14d05CJP7+vr5OThyS4m0AAAL6SURBVDjLZdF1 +V9tQGAbwm1J8zAWbpgsNSUsZLbSDbS2DDTq60a5Ah8s23N3d3d3d5+7u+oX23tJTxuH3x73J+zw3 +yTlBmxztDuzfqdXu3H/AzhFtZ3JM2996Xq+1X3vUBG21w0LT3vLgcUdXd3dXx5PMlnaNxY4tx837 +MsN7Thn1hGf2mf/3kBN7I8I9QGRkVlZWZKQHFh6x97jx/L6I56qoqJiY6OiBVwPR0TExUVEq1YuI +fSaG95v3qnx8fM6Ayxjsn+E+R9VrvvEdFrmDsR+GhvLz8/KuYHn540/HAmNjYwdzLRBwqMzx9fUN +BKcNPnXeuq0phGFOpQMUTIfj4i7ond2gfu/t7d1UVBIXV5jLQYi7q1CtLi4uvg4u6o01QSGgqESt +LhnexUW2U6V+fn6jozfAVezb/QCQXQHT0tIpW8SpKCs/B8qnJydvgunsa6BtEY/KysY5iKiYm01I +iI9f1HyvqqpaWPjimp6e7jUfH5+QMDs3M0Og3YmJQUHBwUHvXAv8dTqd5KE7KKgPhlFQYmL1btRQ +U127tFS/Eubu+ppWKD7i/JFEofhbX1tbXVPTgP4s19Wthri9cQUvyZUw2O78UMhkIf5uq3XLPxvQ +4bU1WupGF3meBJ3ZeC0I0edShl1fP4IImmShwWhCcYa1CXCMc5LPEIjTyCdZhpYyIxmeel7z/jim +GQnJFyVzkCUr5JMShqFZ7V0v7BnpJoWYJUmhiJJYIq5TsghXWIacCAsNDQ37JaUhhuNCAUU7ceFn +ySiBiM8nSZacaM7IeEviFGIRxePJTBFCVnIlDypC6PArm+/9JiGFWEDxXJRyKwQOKVkeVKAjFH0d +gRWnELtIlIcQZkOkkC4u0KEoASUW4JAHsTM/hbBBetZmaazcGToGOBWLJWlm1sjA3ixNBiNnA7h0 +ksvSzOyRkTWhTG2UOxmJG1OVBJzfZHNQrEtV0AIoySlakaoTH7RBW1mZJiWnXNJLSU4ytULbcS05 +xJ6kpD0Ex5KLjP4B9nP9M1El7ycAAAAASUVORK5CYII=} + +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/baltip/README.md b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/baltip/README.md new file mode 100644 index 00000000..31cd0db2 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/baltip/README.md @@ -0,0 +1,356 @@ +It's a Tcl/Tk tip widget inspired by: + + * [https://wiki.tcl-lang.org/page/Tklib+tooltip](https://wiki.tcl-lang.org/page/Tklib+tooltip) + + * [https://wiki.tcl-lang.org/page/balloon+help](https://wiki.tcl-lang.org/page/balloon+help) + +The original code has been modified to make the tip: + + * be faded/destroyed after an interval defined by a caller + * be enabled/disabled for all or specific widgets + * be disabled for a while ("sleep") + * be usable with labels, menus, text/canvas tags, notebook tabs, listbox/treeview items etc. + * be displayed at the screen's edges + * be displayed under the host widget + * be displayed with a shift (on X and Y) relative to the mouse pointer + * be displayed as a stand-alone balloon message at given coordinates + * be displayed with given font, colors, paddings, border, relief, opacity, bell + * have `-image` and `-compound` options to display images + * have `-command` option to be displayed in a status bar instead of a balloon + * have `-command` option to be changed dynamically, with each tip's exposition + * have `-maxexp` option to limit the number of tip's expositions + * have configure/cget etc. wrapped in Tcl ensemble for convenience + +The video introduction to *baltip* is presented by + [baltip-1.3.1.mp4](https://github.com/aplsimple/baltip/releases/download/baltip-1.3.1/baltip-1.3.1.mp4) (17 Mb). + +Below are several pictures just to glance at *baltip*. + +*Under the mouse pointer*. By default, the tips are displayed just under the mouse pointer. + + + +*Under the widget*. This button's tip is configured to be just under the button. As well as the text's tip. This feature is well fit for widgets positioned in a row (e.g. in toolbar, tabbar etc.). + + + + + +*Tips of text tags*. The text tags can have their own tips. + + + +The *tags of canvas* have tips too. + + + +*Tips of menu items*. The menu items can have their own tips. The popup menus may be *tear-off* at that. + +The menu tips are useful e.g. when the items are displayed as short names, while +the tips are wanted to be full names. + + + +*Label of danger*. The labels are also tipped. This one is configured to be an alert shown "eternally" (i.e. till hovering over it). + + + +The *tabs of notebook* are also supplied with tips. + + + +The `listbox` can have tips per item as well as for a whole listbox widget. + + + +The `ttk::treeview` can have tips per item and/or column as well as for a whole treeview widget. + + + +The `-command` option allows to display tips in a status bar instead of a balloon. + + + +*Configurable tips*. The tip configuration can be global or local (for a specific tip). + +The configuring can include: font, colors, paddings, border, relief, exposition time, opacity, image (with `-compound` option), bell. + + + + + +*Balloon*. The balloon messages aren't related to any widgets. This one is configurated to appear at the top right corner, disappearing after a while. + + + +# Usage + +The *baltip* usage is rather straightforward. Firstly we need `package require`: + + lappend auto_path "dir_of_baltip" + package require baltip + +Then we set tips with `::baltip::tip` command for each appropriate widget: + + ::baltip::tip widgetpath text ?-option value? + # or this way: + ::baltip tip widgetpath text ?-option value? + +For example, having a button `.win.but1`, we can set its tip this way: + + ::baltip tip .win.but1 "It's a tip.\n2nd line of it.\n3rd." + +To get all or specific settings of *baltip*: + + ::baltip::cget ?-option? + # or this way: + ::baltip cget ?-option? + +To get a specific widget's tip option: + + ::baltip::cget widgetpath -option + # or this way: + ::baltip cget widgetpath -option + +To set some options: + + ::baltip::configure -option value ?-option value? + # or this way: + ::baltip config -option value ?-option value? + +To set a specific widget's tip option: + + ::baltip::configure widgetpath -option value ?-option value? + # or this way: + ::baltip config widgetpath -option value ?-option value? + +**Note**: the options set with `configure` command are *global*, i.e. active for all tips. +The options set with `tip` command are *local*, i.e. active for the specific tip. + +To disable all tips: + + ::baltip::configure -on false + +To disable some specific tip: + + ::baltip::tip widgetpath "" + # or this way: + ::baltip::tip widgetpath "old tip" -on false + +To hide some specific (suspended) tip forcedly: + + ::baltip::hide widgetpath + +To update a tip's text and options: + + ::baltip::update widgetpath text ?options? + +To show a tip for a widget that has no "normal" tip, still needs a tip (e.g. on clicking): + + ::baltip::showTip path text ?options? + +By default, `::baltip::showTip` displays the tip under the mouse pointer. At that it regards `-geometry` option and ignores `-under, -shiftX, -shiftY` options. + +When you click on a widget with its tip being displayed, the tip is hidden. It is the default behavior of *baltip*, but sometimes you need to re-display the hidden tip. If the widget is a button, you can include the following command in `-command` of the button: + + ::baltip::repaint widgetpath + +# Some special tips + +The "text" for `listbox` can contain `%i` wildcard - and in such cases the text means a callback receiving a current index of item to tip: + + proc ::lbxTip {idx} { + set item [lindex $::lbxlist $idx] + return "Tip for \"$item\"\nindex=$idx" + } + ::baltip tip .listbox {::lbxTip %i} + +The "text" for `ttk::treeview` can contain `%i` and/or `%c` wildcards - and in such cases the text means a callback receiving ID of item and/or column of item to tip: + + proc ::treTip {id c} { + set item [.treeview item $id -text] + return "Tip for \"$item\"\nID=$id, column=$c" + } + ::baltip::tip .treeview {::treTip %i %c} + +If a tip for listbox and treeview widgets doesn't contain `%i` nor `%c`, it means a usual tip for a whole widget. At that, if those wildcards still need to be displayed, use `%%i` and `%%c` instead. + +If you need to switch between "per item" and "per widget" tip of listbox and treeview , use `::baltip::tip` with `-reset yes` option: + + ::baltip::tip .treeview {Common tip} -reset yes ;# sets a usual tip + ::baltip::tip .treeview {::treTip %i %c} -reset yes ;# sets a callback + +Some GUI objects (notebook tabs, listbox items, treeview items) have not <Enter> nor <Leave> event bindings, so that those bindings are imitated by *baltip*. Hence a problem with popup menus: when you right-click those GUI objects, `baltip::tip` and `tk_popup` might both fire, which results in a mess. + +To avoid this, use `::baltip::sleep` before `tk_popup`, for example: + + ::baltip::sleep 1000 ;# disables tips for 1000 milliseconds + tk_popup $popupmenu $X $Y ;# calls a popup menu at $X $Y coordinates + +As for [tablelist](https://wiki.tcl-lang.org/page/tablelist) widget, I would like to cite an advice by [Csaba Nemethi](https://www.nemethi.de/) : + + The support for tablelist is a special case, don't waste your time with + it. I have already tested that the built-in tooltip support of + Tablelist will work just fine when replacing tklib's tooltip package + with baltip (after fixing the reported bugs), and I intend to extend the + description of the -tooltipaddcommand option by hints showing how to use + this option with baltip instead of BWidget and tklib's tooltip. + +# Balloon + +The *normal* tip has no `-geometry` option because it's calculated by *baltip*, to position the tip under its host widget. + +By means of `-geometry` option you get a balloon message unrelated to any visible widget: it's parented by the toplevel window. The `-geometry` option has +X+Y form where X and Y are coordinates of the balloon. + +For example: + + ::baltip::tip .win "It's a balloon at +1+100 (+X+Y) coordinates" \ + -geometry +1+100 -font {-weight bold -size 12} \ + -alpha 0.8 -fg white -bg black -per10 3000 -pause 1500 -fade 1500 + +The `-pause` and `-fade` options make the balloon fade at appearing and disappearing. + +The `-per10` option means "milliseconds per 10 characters", so it defines the balloon's duration: the more the longer. + +The `-per10` option is weird a little: while it is active (i.e. while *baltip*'s clock is counting down according to `-per10`), other tips are locked. So, `-per10 10000000` is a bad idea for balloons, use `-eternal 1` instead. If `-eternal 1` option is set, `-per10 1` is set by force to unlock other tips immediately. + +The `-geometry` value can include `W` and `H` *wildcards* meaning the width and the height of the balloon. This may be useful when you need to show a balloon at a window's edge and should use the balloon's dimensions which are available only after its creation. The X and Y coordinates are calculated by *baltip* as normal expressions. Of course, they should not include the "+" divider, but this restriction (if any) is easily overcome. + +For example: + + lassign [split [winfo geometry .win] x+] w h x y + set geom "+([expr {$w+$x}]-W-4)+$y" + set text "The balloon at the right edge of the window" + ::baltip tip .win $text -geometry $geom -pause 2000 -fade 2000 + +To show a balloon under the mouse pointer, e.g. on clicking, timeout, processing etc., the following call is used: + + ::baltip::showBalloon text ?options? + +By default, `::baltip::showBalloon` displays the balloon under the mouse pointer. At that it regards `-geometry` option and ignores `-under, -shiftX, -shiftY` options. + + +# Command + +The `-command` option allows to display tips in other places, for example in a status bar. At that, the command can include `%t` and `%w` wildcards, meaning "text" and "widget path". Such tips are well fit for menu items, as seen in *test.tcl*. + +The command of this option must return {}, if no tips should be displayed. + +Also, it can return a new tip to display as a usual balloon tip, which fits for "dynamic tips" that are changed *at each exposition* of a tip. + +For example: + + proc ::Status {tip} { + .labelstatus configure -text $tip + return {} ;# no redefining the tip + } + ::baltip::tip .menu "File actions" -index 0 -command {::Status %t} + ::baltip::tip .menu "Help, hints, Q&A, about etc." -index 1 -command {::Status %t} + +Also, this option can be used if you need to fire some code when the mouse pointer enters or leaves a GUI object. + +**Note**: the *baltip* is available for a few of GUI objects that have not <Enter> nor <Leave> bindings. + +The only line + + baltip::tip $w $tip -command $command + +might save you other lines to fire the command at entering/leaving a GUI object. E.g. the command might highlight a GUI object entered, save its ID and unhighlight the object at leaving it. + +For example: + + proc ::SomeProc {tip} { + lassign [split $tip] obj ID column + if {[info exists ::OBJsaved]} { + puts "$::OBJsaved object ID=[set ::IDsaved] is left... unhighlighted..." + unset ::OBJsaved + } + if {$obj eq {}} return + set ::OBJsaved $obj + set ::IDsaved $ID + puts "Now processing $obj object with ID=$ID column=$column" + return {} ;# means the proc executed and no tip needed + } + ::baltip::tip .listbox {Listbox %i} -command {::SomeProc {%t}} + ::baltip::tip .treeview {Treeview %i %c} -command {::SomeProc {%t}} + +# Options + +Below are listed the *baltip* options that are set with `tip` and `configure` and got with `cget`: + + * `-on` - switches all tips on/off; + * `-per10` - a time of exposition per 10 characters (in millisec.); + * `-fade` - a time of fading (in millisec.); + * `-pause` - a pause before displaying tips (in millisec.); + * `-alpha` - an opacity (from 0.0 to 1.0); + * `-fg` - foreground of tip; + * `-bg` - background of tip; + * `-bd` - borderwidth of tip; + * `-font` - font attributes; + * `-padx` - X padding for text; + * `-pady` - Y padding for text; + * `-padding` - padding for pack; + * `-under` - if >= 0, sets the tip under the widget, else under the pointer; + * `-shiftX` - a horizontal shift relative to the mouse pointer + * `-shiftY` - a vertical shift relative to the mouse pointer + * `-image` - image option; + * `-compound` - compound option; + * `-relief` - relief option; + * `-bell` - if true, rings at displaying; + * `-eternal` - if true, makes a tip "eternal", i.e. visible till clicking. + +The following options are special: + + * `-global` - if true, applies the settings to all registered tips; + * `-force` - if true, forces the display by 'tip' command; + * `-index` - index of menu item to tip; + * `-tag` - name of text tag to tip; + * `-ctag` - name of canvas tag to tip; + * `-nbktab` - path to ttk::notebook tab to tip; + * `-geometry` - geometry (+X+Y) of the balloon; + * `-reset` - "-reset true" may be useful to set a new tip (callback or text) for listbox and treeview; + * `-command` - a command to be executed, with `%t` (tip's text) and `%w` (widget's path) wildcards; + * `-maxexp` - maximum number of tip's expositions. + * `-focus` - path to widget to set focus on, after showing a tip + +If `-global yes` option is used alone, it applies all global options to all registered tips. If `-global yes` option is used along with other options, only those options are applied to all registered tips. + +Of course, all global options will be applied to all tips to be created after `::baltip configuration`. For example: + + ::baltip config -global yes ;# applies all global options to all registered and to-be-created tips + ::baltip config -global yes -per10 2000 ;# applies `-per10` to all registered and to-be-created tips + +The `-index` option may have numeric (0, 1, 2...) or symbolic form (active, end, none) to indicate a menu entry, e.g. in `-command` option. For example: + + ::baltip repaint .win.popupMenu -index active + ::baltip::tip .menu "File actions" -index 0 + +There may be useful to define options in *text* argument of *::baltip::tip*. + +For this, provide the *text* argument as a list of pairs of uppercased options' name / value including *-BALTIP* option for *tip*. For example: + + ::baltip tip .text "-BALTIP {Sort of diary, todos etc.} -MAXEXP 1" + +As seen in the above examples, *baltip* can be used as Tcl ensemble, so that the commands may be shortened. + +See more examples in *test.tcl* of [baltip.zip](https://chiselapp.com/user/aplsimple/repository/baltip/download). + +Also, you can test *baltip* with *test2_pave.tcl* of [apave package](https://chiselapp.com/user/aplsimple/repository/pave/download). + +# Acknowledgements + +The *baltip* package has been developed with help of these kind people: + + * [Nicolas Bats](https://github.com/sl1200mk2) prompted to add canvas tags' tips, baltip::show procedure and tested *baltip* in MacOS + + * [Csaba Nemethi](https://www.nemethi.de/) sent several bug fixes and advices, especially on listbox, treeview and menu tips + +# Links + + * [Source at chiselapp](https://chiselapp.com/user/aplsimple/repository/baltip/download) (baltip.zip) + + * [Source at github](https://github.com/aplsimple/baltip) + + * [Reference](https://aplsimple.github.io/en/tcl/baltip/baltip.html) + + * [Demo of baltip v1.3.1](https://github.com/aplsimple/baltip/releases/download/baltip-1.3.1/baltip-1.3.1.mp4) diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/baltip/baltip.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/baltip/baltip.tcl new file mode 100644 index 00000000..d71d2844 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/baltip/baltip.tcl @@ -0,0 +1,1196 @@ +########################################################### +# Name: baltip.tcl +# Author: Alex Plotnikov (aplsimple@gmail.com) +# Date: 12/01/2021 +# Brief: Handles Tcl/Tk tip widget. +# License: MIT. +########################################################### + +package provide baltip 1.6.2 + +# ________________________ Variables _________________________ # + +namespace eval ::baltip { + + namespace export configure cget tip update hide repaint \ + optionlist tippath clear sleep showBalloon showTip + namespace ensemble create + + namespace eval my { + variable ttdata; array set ttdata [list] + set ttdata(on) yes + set ttdata(per10) 1600 + set ttdata(fade) 300 + set ttdata(pause) 1000 + set ttdata(fg) black + set ttdata(bg) #FBFB95 + set ttdata(bd) 1 + set ttdata(padx) 4 + set ttdata(pady) 3 + set ttdata(padding) 0 + set ttdata(alpha) 1.0 + set ttdata(bell) no + set ttdata(font) [font actual TkTooltipFont] + set ttdata(under) -16 + set ttdata(image) {} + set ttdata(compound) {} + set ttdata(relief) {} + set ttdata(shiftX) {} + set ttdata(shiftY) {} + set ttdata(ontop) no + set ttdata(balloon) - + } +} + +# _________________________ UI ______________________ # + +proc ::baltip::configure {args} { + # Configurates the tip for all widgets or for a widget. + # args - options ("name value" pairs) + # If *args* begins with a widget path, then + # args is "w -opt val ?-opt val?", so the widget tip options are set. + # Returns the list of special options' values or a widget's tip options. + + variable my::ttdata + set w [lindex $args 0] + if {[winfo exists $w]} { + # configure a widget's tip + return [tip $w -BALTIPSET {*}[lrange $args 1 end]] + } + set force no + set index -1 + lassign {} geometry tag ctag nbktab reset command maxexp focus + set global [expr {[dict exists $args -global] && [dict get $args -global]}] + foreach {n v} $args { + set n1 [string range $n 1 end] + switch -glob -- $n { + -SPECTIP* - + -per10 - -fade - -pause - -fg - -bg - -bd - -alpha - -text - -relief - \ + -on - -padx - -pady - -padding - -bell - -under - -font - -image - -compound - \ + -shiftX - -shiftY - -ontop - -eternal { + set my::ttdata($n1) $v + } + -force - -geometry - -index - -tag - -global - -ctag - -nbktab - -reset - \ + -command - -maxexp - -focus { + set $n1 $v + } + default {return -code error "baltip: invalid option \"$n\""} + } + if {$global && ($n ne {-global} || [llength $args]==2)} { + foreach k [array names my::ttdata -glob on,*] { + set w [lindex [split $k ,] 1] + set my::ttdata($n1,$w) $v + } + } + } + return [list \ + $force $geometry $index $tag $ctag $nbktab $reset $command $maxexp $focus] +} +#_______________________ + +proc ::baltip::cget {args} { + # Gets global option values or a widget's option value. + # args - option names (if empty, returns all options) + # If *args* begins with a widget path, then args is "w -option", + # so the widget tip option's value is returned (e.g. for -text option). + # Returns a list of "name value" pairs or an option value of a widget's tip. + + variable my::ttdata + if {![llength $args]} { + lappend args {*}[optionlist] + } + set w [lindex $args 0] + if {[winfo exists $w]} { + set dic [tip $w -BALTIPGET] + if {[set opt [lindex $args 1]] ne {}} { + if {[dict exists $dic $opt]} { + return [dict get $dic $opt] + } + return {} + } + return $dic + } + set res [list] + foreach n $args { + set n [string range $n 1 end] + if {[info exists my::ttdata($n)]} { + lappend res -$n $my::ttdata($n) + } + } + return $res +} +#_______________________ + +proc ::baltip::optionlist {} { + # All options of baltip. + + return [list -on -per10 -fade -pause -fg -bg -bd -padx -pady -padding -font \ + -alpha -text -index -tag -bell -under -image -compound -relief -ctag \ + -nbktab -reset -command -maxexp -focus -shiftX -shiftY -ontop -eternal] +} +#_______________________ + +proc ::baltip::tippath {w} { + # Gets a tip window's path. + # w - widget's path + + return [string trimright $w .].w__BALTIP +} +#_______________________ + +proc ::baltip::tip {w {text "-BALTIPGET"} args} { + # Creates a tip for a widget. + # w - the parent widget's path + # text - the tip text + # args - options ("name value" pairs) + # If *text* is equal to "-BALTIPGET", returns options of widget's tip + # If *text* is equal to "-BALTIPSET", sets options of widget's tip + + variable my::ttdata + array unset my::ttdata winGEO* + if {[winfo exists $w] || $w eq {}} { + if {$text in {-BALTIPGET -BALTIPSET}} { + # "-BALTIPGET" is the same as "-BALTIPSET", just supposed not to include args + if {![info exists my::ttdata(optvals,$w)]} { + if {$text eq {-BALTIPGET}} {return {}} + set my::ttdata(optvals,$w) [dict create] + } + set my::ttdata(optvals,$w) [dict replace $my::ttdata(optvals,$w) {*}$args] + if {$text eq {-BALTIPGET}} { + return $my::ttdata(optvals,$w) + } + if {[catch {set text [dict get $my::ttdata(optvals,$w) -text]}]} { + return {} + } + } + set arrsaved [array get my::ttdata] + set optvals [::baltip::my::CGet {*}$args] + # block of related lines for special options + set specopt {forced geo index ttag ctag nbktab reset command maxexp focus} + lassign $optvals {*}$specopt + set optArgs [lrange $optvals [llength $specopt] end] ;# get rid of spec.options + if {[catch {set optvals $my::ttdata(optvals,$w)}]} { + set optvals $optArgs + } + # end of block + set my::ttdata(global,$w) no + # no redefining a command once set + if {[info exists ttdata(command,$w)] && [string is false $reset]} { + set command $my::ttdata(command,$w) + } else { + set my::ttdata(command,$w) $command + } + if {$command ne {}} {::baltip::update $w $text} + if {![info exists my::ttdata(maxexp,$w)]} { + set my::ttdata(maxexp,$w) $maxexp + } + if {[winfo exists $focus]} { + set my::ttdata(focus,$w) $focus + } + set text [my::OptionsFromText $w $text] ;# may reset -command and -maxexp + set ontags [string length $nbktab$ctag$ttag] + set onopt [expr {[string length $text] && $my::ttdata(on) || $ontags}] + set optArgs [dict replace $optArgs -text $text] + set optvals [dict replace $optvals -text $text] + set et 0 + catch {set et [dict get $args -eternal]} + if {[set my::ttdata(eternal,$w) $et]} {lappend optvals -per10 1} + set my::ttdata(optvals,$w) $optvals + set my::ttdata(on,$w) $onopt + if {$text ne {} || $ontags} { + if {$forced || $geo ne {}} {::baltip::my::Show $w $text yes $geo $optvals} + if {$geo ne {}} { + # balloon popup message + array set my::ttdata $arrsaved + set my::ttdata(balloon) $w + } else { + set widgetclass [winfo class $w] + set tags [bindtags $w] + if {[lsearch -exact $tags "Tooltip$w"] == -1} { + bindtags $w [linsert $tags end "Tooltip$w"] + } + bind Tooltip$w "::baltip::hide $w" + bind Tooltip$w "::baltip::hide $w" + bind Tooltip$w "::baltip::hide $w" + if {$index>-1} { + # tip for menu items + set my::ttdata(LASTMITEM) {} + set wt [my::Clonename $w] + foreach w2 [list $w $wt] { + set my::ttdata(on,$w2) $onopt + set my::ttdata($w2,$index) $optArgs + set my::ttdata(command,$w2) $command + set my::ttdata(global,$w2) no + } + my::BindToEvent Menu <> ::baltip::my::MenuTip %W + } elseif {$ttag ne {}} { + # tip for text tags + set my::ttdata($w,$ttag) $text + my::BindTextagToEvent $w $ttag ::baltip::my::TagTip $w $ttag $optArgs + foreach event {Leave KeyPress Button} { + my::BindTextagToEvent $w $ttag <$event> ::baltip::my::TagTip $w + } + } elseif {$ctag ne {}} { + # tip for canvas tags + set my::ttdata($w,$ctag) $text + my::BindCantagToEvent $w $ctag ::baltip::my::TagTip $w $ctag $optArgs + my::BindCantagToEvent $w $ctag ::baltip::my::TagTip $w + } elseif {$nbktab ne {}} { + # tip for notebook tabs + configure -SPECTIP$nbktab $text + bind Tooltip$w "::baltip::my::NbkInfo $w %x %y -" + bind Tooltip$w "::baltip::my::PrepareNbkTip $w %x %y" + } elseif {$widgetclass eq {Listbox}} { + # tip for listbox items + if {[cget -SPECTIP$w] eq {} || [string is true -strict $reset]} { + configure -SPECTIP$w $text + } + bind Tooltip$w \ + "::baltip hide $w; ::baltip configure -SPECTIPid$w {}" + bind Tooltip$w "::baltip::my::PrepareLbxTip $w %x %y" + } elseif {$widgetclass eq {Treeview}} { + # tip for treeview items + if {[cget -SPECTIP$w] eq {} || [string is true -strict $reset]} { + configure -SPECTIP$w $text + } + bind Tooltip$w \ + "::baltip hide $w; ::baltip configure -SPECTIPid$w {}" + bind Tooltip$w "::baltip::my::PrepareTreTip $w %x %y" + } else { + bind Tooltip$w [list ::baltip::my::Show %W $text no $geo $optvals] + } + } + } + } + return {} +} +#_______________________ + +proc ::baltip::update {w text args} { + # Updates tip's text and settings. + # w - widget's path + # text - tip's text + # args - tip's settings + + variable my::ttdata + set my::ttdata(text,$w) $text + foreach {k v} $args {set my::ttdata([string range $k 1 end],$w) $v} +} +#_______________________ + +proc ::baltip::repaint {w args} { + # Repaints a tip immediately. + # w - widget's path + # args - options (incl. -index/-tag) + + variable my::ttdata + if {[winfo exists $w] && [info exists my::ttdata(optvals,$w)] && \ + [dict exists $my::ttdata(optvals,$w) -text]} { + set optvals $my::ttdata(optvals,$w) + lappend optvals {*}$args + catch {after cancel $my::ttdata(after)} + set win [tippath $w] ;# the tip's window + if {[info exists my::ttdata(winGEO,$win)]} { + set geo $my::ttdata(winGEO,$win) + } else { + set geo {} + } + set my::ttdata(after) [after idle [list ::baltip::my::Show $w \ + [dict get $my::ttdata(optvals,$w) -text] yes $geo $optvals]] + } +} +#_______________________ + +proc ::baltip::hide {{w ""} {doit no}} { + # Destroys the tip's window. + # w - widget's path + # doit - yes, if do hide by force + # Returns 1, if the window was really hidden. + + variable my::ttdata + my::Command $w {} + set res 1 + if {(![my::Eternal $w] && $my::ttdata(balloon) ne $w) || $doit} { + set res [expr {![catch {destroy [tippath $w]}]}] + if {$w eq $my::ttdata(balloon)} {set my::ttdata(balloon) -} + } + return $res +} +#_______________________ + +proc ::baltip::clear {w args} { + # Removes tip bindings for a widget. + # w - widget's path + + variable my::ttdata + catch {unset my::ttdata(optvals,$w)} + catch {hide $w} + foreach ev {Any-Leave Any-KeyPress Any-Button Motion Any-Enter Leave Enter} { + catch {bind Tooltip$w <$ev> {}} + } +} +#_______________________ + +proc ::baltip::sleep {msec} { + # Disables tips for a while. + # msec - time to sleep, in msec + # This is useful esp. before calling a popup menu on listbox/treeview. + + configure -on no + after $msec "::baltip::configure -on yes" +} +#_______________________ + +proc ::baltip::showBalloon {tip args} { + # Shows a balloon under the pointer or according to -geometry option. + # tip - text of tip + # args - miscellaneous options of baltip + # Can be used to show tips on clicking, timeout, processing etc. + # If there is -geometry in args, shows the balloon + # with this geometry and a minimal pause. + + variable my::ttdata + set w . + if {[set isgeo [dict exists $args -geometry]]} { + lappend args -pause 10 + } else { + lassign [winfo pointerxy $w] x y + lappend args -geometry \ + +[expr {$x-int($my::ttdata(under)/2)}]+[expr {$y-$my::ttdata(under)}] + } + tip $w $tip -pause 100 -fade 100 {*}$args + if {$isgeo} { + after 20 + ::update + } +} +#_______________________ + +proc ::baltip::showTip {w tip args} { + # Shows a tip under the pointer, for a specific widget. + # tip - text of tip + # args - miscellaneous options of baltip + # Can be used to show tips on clicking the widget + # that has no "normal" tips on hovering it. + + my::BindToEvent $w ::baltip hide . + showBalloon $tip {*}$args +} + +# _____________________ Internals ____________________ # + +proc ::baltip::my::CGet {args} { + # Gets options' values, using local (args) and global (ttdata) settings. + # args - local settings ("name value" pairs) + # Returns the full list of settings ("name value" pairs, "name" without "-") \ + in which special options go first. + # See also: cget, configure + + variable ttdata + set saved [array get ttdata] + set res [::baltip::configure {*}$args] + lappend res {*}[::baltip::cget] + array set ttdata $saved + return $res +} +#_______________________ + +proc ::baltip::my::WidCoord {w} { + # Gets widget's coordinate data. + # w - path to the widget + # Returns a list of: + # x - X coordinate + # y - Y coordinate + # inside - flag "mouse pointer is inside the widget" + + set x [expr {[winfo pointerx $w]-[winfo rootx $w]}] + set y [expr {[winfo pointery $w]-[winfo rooty $w]}] + lassign [split [winfo geometry $w] x+] width height + set inside [expr {$x>-1 && $x<$width && $y>-1 && $y<$height}] + return [list $x $y $inside] +} +#_______________________ + +proc ::baltip::my::Clonename {mnu} { + # Gets a clone name of a menu. + # mnu - the menu's path + # This procedure is borrowed from BWidget's utils.tcl. + + set path [set menupath {}] + set found 0 + foreach widget [lrange [split $mnu .] 1 end] { + if {$found || [winfo class "$path.$widget"] eq {Menu}} { + set found 1 + append menupath # $widget + append path . $menupath + } else { + append menupath # $widget + append path . $widget + } + } + return $path +} +#_______________________ + +proc ::baltip::my::OptionsFromText {w txt} { + # Extracts options from "text" argument of baltip::tip. + # w - widget's path + # txt - "-text" option's value + # Options can be set in the "text" argument as uppercased-name / value pairs: + # "-BALTIP {True tip's text} -MAXEXP 1 -COMMAND {::mycom %i %c}" + # In this case, *txt* must be a correct list of name/value sequences. + # Returns an original *txt* or a value of -BALTIP option from *txt*. + + variable ttdata + if {[string first {-BALTIP } $txt] >-1 && \ + !([catch {set lst [list {*}$txt]}] || [expr {[llength $lst] % 2 }])} { + set ol [::baltip::optionlist] + lappend ol -baltip + foreach o $ol {lappend OL [string toupper $o]} + foreach {o v} $lst { + if {[set i [lsearch -exact $OL $o]]>-1} { + set n1 [string range [lindex $ol $i] 1 end] + set ttdata($n1,$w) $v + if {$o eq {-BALTIP}} {set txt $v} + } + } + } else { + if {[winfo exists ttdata(optvals,$w)]} { + catch { + set txt [dict get $ttdata(optvals,$w) -text] + } + } + } + return $txt +} +#_______________________ + +proc ::baltip::my::Eternal {w} { + # Checks if the tip is shown till clicking. + # w - tip/widget's path + + variable ttdata + set res no + if {[catch {set res $ttdata(eternal,$w)}]} { + catch {set res $ttdata(eternal,[winfo parent $w])} + } + return $res +} + +## ________________________ Binds _________________________ ## + +proc ::baltip::my::BindToEvent {w event args} { + # Binds an event on a widget to a command. + # w - the widget's path + # event - the event + # args - the command + # The command can be ended with " ; break". + + if {[catch {set bound [bind $w $event]}]} {set bound {}} + if {[string first $args $bound]<0} { + catch { + if {[lrange $args end-1 end] eq "{;} break"} { + set com [lrange $args 0 end-2] + bind $w $event "$com ; break" + } else { + bind $w $event [list + {*}$args] + } + } + } +} +#_______________________ + +proc ::baltip::my::BindTextagToEvent {w tag event args} { + # Binds an event on a text tag to a command. + # w - the widget's path + # tag - the tag + # event - the event + # args - the command + # The command can be ended with " ; break". + + if {[catch {set bound [$w tag bind $tag]}]} {set bound {}} + if {[string first $args $bound]<0} { + catch { + if {[lrange $args end-1 end] eq "{;} break"} { + set com [lrange $args 0 end-2] + $w tag bind $tag $event "$com ; break" + } else { + $w tag bind $tag $event [list + {*}$args] + } + } + } +} +#_______________________ + +proc ::baltip::my::BindCantagToEvent {w tag event args} { + # Binds an event on a canvas tag to a command. + # w - the widget's path + # tag - the tag + # event - the event + # args - the command + # The command can be ended with " ; break". + + if {[catch {set bound [$w bind $tag $event]}]} {set bound {}} + if {[string first $args $bound]<0} { + catch { + if {[lrange $args end-1 end] eq "{;} break"} { + set com [lrange $args 0 end-2] + $w bind $tag $event "$com ; break" + } else { + $w bind $tag $event [list + {*}$args] + } + } + } +} + +## ________________________ Shows _________________________ ## + +proc ::baltip::my::Command {w text} { + # Executes a command set for a window. + # w - the widget's path + # text - the tip text + # The command allows wildcards: + # %w - window's path + # %t - text of the tip + # Returns: list of "yes/no" and a result of the command. + # The result of the command can be a new tip if "yes" and the result ne {}. + + variable ttdata + if {![info exists ttdata(command,$w)] || $ttdata(command,$w) eq {}} {return no} + set com [string map [list %w $w %t "{$text}"] $ttdata(command,$w)] + if {[catch {set res [eval $com]} e]} {return no} + if {$text ne {}} { + set ttdata(text,$w) $res + } + return [list yes $res] +} +#_______________________ + +proc ::baltip::my::ShowWindow {win} { + # Shows a window of tip. + # win - the tip's window + + variable ttdata + if {![winfo exists $win] || ![info exists ttdata(winGEO,$win)]} return + set geo $ttdata(winGEO,$win) + set under $ttdata(winUNDER,$win) + set shiftX $ttdata(winSHIFTX,$win) + set shiftY $ttdata(winSHIFTY,$win) + set w [winfo parent $win] + set px [winfo pointerx .] + set py [winfo pointery .] + set width [winfo reqwidth $win.label] + set height [winfo reqheight $win.label] + set ady 0 + if {[catch {set wheight [winfo height $w]}]} { + set wheight 0 + } else { + for {set i 0} {$i<$wheight} {incr i} { ;# find the widget's bottom + incr py + incr ady + if {![string match $w* [winfo containing $px $py]]} break + } + } + if {$geo eq {}} { + if {$shiftX ne {}} { + set x [expr {$px + $shiftX}] + } else { + set x [expr {max(1,$px - round($width / 2.0))}] + } + set y [expr {$under>=0 ? ($py + $under) : ($py - $under - $ady)}] + if {$shiftY ne {}} {incr y $shiftY} + } else { + lassign [split $geo +] -> x y + set x [expr [string map "W $width" $x]] ;# W to shift horizontally + set y [expr [string map "H $height" $y]] ;# H to shift vertically + } + # check for edges of screen incl. decors + set scrw [winfo vrootwidth .] + set scrh [winfo vrootheight .] + if {($x + $width) > $scrw} {set x [expr {$scrw - $width - 1}]} + if {($y + $height) > $scrh} {set y [expr {$py - $height - 16}]} + set x [expr {max(0,$x)}] + set y [expr {max(0,$y)}] + wm geometry $win [join "$width x $height + $x + $y" {}] + catch {wm deiconify $win ; raise $win} +} +#_______________________ + +proc ::baltip::my::Show {args} { + # Calls DoShow catching errors. + + catch {DoShow {*}$args} +} +#_______________________ + +proc ::baltip::my::DoShow {w text force geo optvals} { + # Creates and shows the tip's window. + # w - the widget's path + # text - the tip text + # force - if true, re-displays the existing tip + # geo - being +X+Y, sets the tip coordinates + # optvals - settings ("option value" pairs) + # See also: Fade, ShowWindow, ::baltip::update + + variable ttdata + if {![winfo exists $w]} return + set win [::baltip::tippath $w] + # keep the label's colors untouched (for apave package) + catch {::apave::obj untouchWidgets $win.label} + set px [winfo pointerx .] + set py [winfo pointery .] + array set data $optvals + if {[info exists ttdata(optvals,$w)]} { + catch {array set data [list {*}$ttdata(optvals,$w) {*}$optvals]} + } + if {$geo ne {}} { + # balloons not related to widgets + } elseif {$ttdata(global,$w)} { ;# flag 'use global settings' + array set data [::baltip::cget] + } else { + foreach k [array names ttdata -glob *,$w] { + set n1 [lindex [split $k ,] 0] ;# settings set by 'update' + if {$n1 eq {text}} { + if {$ttdata($k) ne {}} { + set text $ttdata($k) ;# tip's text + } + } else { + set data(-$n1) $ttdata($k) ;# tip's options + } + } + } + if {[catch {set widgetclass [winfo class $w]}]} { + set widgetclass {} + } + if {!$force && $geo eq {}} { + if {![info exists ttdata(on,$w)] || !$ttdata(on,$w)} return + if {$widgetclass ne {Menu} && \ + ([winfo exists $win] || ![string match $w* [winfo containing $px $py]])} { + return + } + } + if {$geo eq {}} {::baltip::hide $w} + set icount [string length [string trim $text]] + if {!$icount || (!$ttdata(on) && !$data(-on))} return + lassign [Command $w $text] ans res + if {$ans} { + if {$res eq {}} { + # the command displayed the tip somewhere + return + } + # the command redefined the tip's text + set text $res + } + if {[info exists ttdata(maxexp,$w)] && \ + [string is integer -strict $ttdata(maxexp,$w)]} { + if {$ttdata(maxexp,$w)<=0} return + } + lappend ttdata(REGISTERED) $w + foreach wold [lrange $ttdata(REGISTERED) 0 end-1] {::baltip::hide $wold} + if {$data(-fg) eq {}} {set data(-fg) black} + if {$data(-bg) eq {}} {set data(-bg) #FBFB95} + catch {destroy $win} + toplevel $win -bg $data(-bg) -class Tooltip$w + catch {wm withdraw $win} + wm overrideredirect $win 1 + if {[info exists data(-ontop)] && $data(-ontop)} { + wm attributes $win -topmost 1 + } + if {$data(-relief) eq {}} {set data(-relief) solid} + if {[set imgoptions $data(-image)] ne {}} { + set imgoptions "-image $imgoptions" + } + if {[set cmpdoptions $data(-compound)] ne {}} { + set cmpdoptions "-compound $cmpdoptions" + } + if {$imgoptions ne {} && $cmpdoptions eq {}} { + set cmpdoptions {-compound left} + } + pack [label $win.label -text $text -justify left -relief $data(-relief) \ + -bd $data(-bd) -bg $data(-bg) -fg $data(-fg) -font $data(-font) \ + {*}$imgoptions {*}$cmpdoptions -padx $data(-padx) -pady $data(-pady)] \ + -padx $data(-padding) -pady $data(-padding) + if {[info exists ttdata(focus,$w)]} { + set foc $ttdata(focus,$w) + after idle "catch {focus -force \[winfo toplevel $foc\]}; catch {focus $foc}" + } + # defeat rare artifact by passing mouse over a tip to destroy it + bindtags $win "Tooltip$win" + if {$geo eq {}} { + # balloons are hidden on click or time-out + bind $win "::baltip::hide $w" + bind Tooltip$win "::baltip::hide $w" + } + bind $win "::baltip::hide $w 1" + bind Tooltip$win "::baltip::hide $w 1" + set aint 20 + set fint [expr {int($data(-fade)/$aint)}] + set icount [expr {int($data(-per10)/$aint*$icount/10.0)}] + set icount [expr {$data(-per10) ? max(1000/$aint+1,$icount) : 0}] ;# 1 sec. minimum + set ttdata(winGEO,$win) $geo + set ttdata(winUNDER,$win) $data(-under) + set ttdata(winSHIFTX,$win) $data(-shiftX) + set ttdata(winSHIFTY,$win) $data(-shiftY) + if {$icount} { + if {$geo eq {}} { + catch {wm attributes $win -alpha $data(-alpha)} + } else { + Fade $win $aint [expr {round(1.0*$data(-pause)/$aint)}] \ + 0 Un $data(-alpha) 1 $geo {} $w + } + if {$force} { + Fade $win $aint $fint $icount {} $data(-alpha) 1 $geo {} $w + } elseif {$widgetclass ne {TNotebook}} { + catch {after cancel $ttdata(after)} + set ttdata(after) [after $data(-pause) [list \ + ::baltip::my::Fade $win $aint $fint $icount {} $data(-alpha) 1 $geo {} $w]] + } + } else { + # just showing, no fading + catch {after cancel $ttdata(after)} + set ttdata(after) [after $data(-pause) \ + "::baltip::my::ShowWindow $win; catch {wm attributes $win -alpha $data(-alpha)}"] + } + if {$data(-bell)} [list after [expr {$data(-pause)/4}] bell] + array unset data +} + +## ________________________ Fade _________________________ ## + +proc ::baltip::my::Fade {win aint fint icount Un alpha show geo {geos ""} {w {}}} { + # Fades/unfades the tip's window. + # win - the tip's window + # aint - interval for 'after' + # fint - interval for fading + # icount - counter of intervals + # Un - if equal to "Un", unfades the tip + # alpha - value of -alpha option + # show - flag "show the window" + # geo - coordinates (+X+Y) of balloon + # geos - saved coordinates (+X+Y) of shown tip + # w - a host window + # See also: FadeNext, UnFadeNext + + variable ttdata + if {[winfo exists $win]} { + if {$show && [info exists ttdata(maxexp,$w)] && \ + [string is integer -strict $ttdata(maxexp,$w)]} { + incr ttdata(maxexp,$w) -1 + } + update + catch {after cancel $ttdata(after)} + set ttdata(after) [after idle [list after $aint \ + [list ::baltip::my::${Un}FadeNext $win $aint $fint $icount $alpha $show $geo $geos]]] + } +} +#_______________________ + +proc ::baltip::my::FadeNext {w aint fint icount alpha show geo {geos ""}} { + # A step to fade the tip's window. + # w - the tip's window + # aint - interval for 'after' + # fint - interval for fading + # icount - counter of intervals + # alpha - value of -alpha option + # show - flag "show the window" + # geo - coordinates (+X+Y) of balloon + # geos - saved coordinates (+X+Y) of shown tip + # See also: Fade + + variable ttdata + incr icount -1 + if {$show} {ShowWindow $w} + set show 0 + if {![winfo exists $w]} return + lassign [split [wm geometry $w] +] -> X Y + if {$geos ne {} && $geos ne "+$X+$Y"} return + if {$fint<=0} {set fint 10} + if {[catch {set al [expr {min($alpha,($fint+$icount*1.5)/$fint)}]}]} { + set al 0 + } + if {$icount<0} { + if {[Eternal $w]} return + if {$al>0} { + if {[catch {wm attributes $w -alpha $al}]} {set al 0} + } + if {$al<=0.001 || ![winfo exists $w]} { + ::baltip::hide + catch {destroy $w} + return + } + } elseif {$al>0 && $geo eq {}} { + if {![Eternal $ttdata(balloon)] && $ttdata(balloon) ne {-}} { + ::baltip::hide $ttdata(balloon) yes ;# non-eternal balloon be destroyed + } + catch {wm attributes $w -alpha $al} + } + Fade $w $aint $fint $icount {} $alpha $show $geo +$X+$Y +} +#_______________________ + +proc ::baltip::my::UnFadeNext {w aint fint icount alpha show geo {geos ""}} { + # A step to unfade the balloon's window. + # w - the tip's window + # aint - interval for 'after' + # fint - interval for fading + # icount - counter of intervals + # alpha - value of -alpha option + # show - not used (here just for compliance with Fade) + # geo - not used (here just for compliance with Fade) + # geos - not used (here just for compliance with Fade) + # See also: Fade + + incr icount + set al [expr {min($alpha,$icount*1.5/$fint)}] + if {$al<$alpha && [catch {wm attributes $w -alpha $al}]} {set al 1} + if {$show} { + ShowWindow $w + set show 0 + } + if {[winfo exists $w] && $al<$alpha} { + Fade $w $aint $fint $icount Un $alpha 0 $geo + } +} + +## ________________________ Specific widgets _________________________ ## + +### ________________________ Tags _________________________ ### + +proc ::baltip::my::TagTip {w {tag ""} {optvals ""}} { + # Shows a text tag's tip. + # w - the text's path + # tag - the tag's name + # optvals - settings of tip + + variable ttdata + ::baltip::hide $w + if {$tag eq {}} return + ::baltip::my::Show $w $ttdata($w,$tag) no {} $optvals +} + +### ________________________ Menu _________________________ ### + +proc ::baltip::my::MenuTip {wt} { + # Shows a menu's tip. + # wt - the menu's path (incl. cloned menu) + + variable ttdata + if {[string match .tearoff* $wt]} { + # not implemented for tear-offed menus + return + } + ::baltip::hide $wt + set index [$wt index active] + set mit "$wt/$index" + if {$index eq {none}} return + if {[info exists ttdata($wt,$index)] && ([::baltip::hide $wt] || \ + ![info exists ttdata(LASTMITEM)] || $ttdata(LASTMITEM) ne $mit)} { + set optvals $ttdata($wt,$index) + set text [dict get $optvals -text] + ::baltip::my::Show $wt $text no {} $optvals + } + set ttdata(LASTMITEM) $mit +} + +### ________________________ Notebook _________________________ ### + +proc ::baltip::my::NbkInfo {w x y {tab {}}} { + # Gets/sets a notebook tab's data. + # w - the notebook's path + # x - X coordinate of pointer + # y - Y coordinate of pointer + # tab - a current tab + # When getting, returns a list of a current tab and a saved tab. + + set optid -SPECTIP$w + if {$tab eq {}} { + set tab [$w identify tab $x $y] + set tab2 [lindex [::baltip cget $optid] 1] + return [list $tab $tab2] + } + ::baltip configure $optid $tab +} + +#_______________________ + +proc ::baltip::my::ShowNbkTip {w tip} { + # Shows a tip for a notebook tab. + # w - the notebook's path + # tip - text of tip + + catch { + set x [expr {[winfo pointerx $w]-[winfo rootx $w]}] + set y [expr {[winfo pointery $w]-[winfo rooty $w]}] + lassign [NbkInfo $w $x $y] tab tab2 + set wt [lindex [$w tabs] $tab] + if {$tab2 ne {-} && [lsearch -exact [$w tabs] $wt]>-1} { + ::baltip tip $w $tip -force yes + } else { + ::baltip hide $w + } + } +} + +#_______________________ + +proc ::baltip::my::PrepareNbkTip {w x y} { + # Prepares a tip for a notebook tab. + # w - the notebook's path + # x - X coordinate of pointer + # y - Y coordinate of pointer + # The baltip isn't directly usable with notebook tabs + # because they have not Enter/Leave event bindings. + # This proc tries to imitate those events, with binding to event. + + if {![string is integer -strict $x]} return + catch { + lassign [::baltip cget -pause] -> pause + lassign [NbkInfo $w $x $y] tab tab2 + set nbktab [lindex [$w tabs] $tab] + if {$tab ne {} && $tab2 ni "$tab -"} { + ::baltip hide $w + lassign [::baltip cget -SPECTIP$nbktab] -> tip + lassign [Command $w $tip] ans res + if {$ans} { + if {$res ne {}} { + # the command should be displayed here (not somewhere else) + set $ans no + } + # the command redefined the tip's text + set tip $res + } + if {!$ans} { + set optafter -SPECTIPafter$w + catch { + after cancel [lindex [::baltip cget $optafter] 1] + } + set aftid [after $pause "::baltip::my::ShowNbkTip $w {$tip}"] + ::baltip configure $optafter $aftid + } + } else { + NbkInfo $w $x $y -1 + } + NbkInfo $w $x $y $tab + } +} + +### ________________________ Listbox _________________________ ### + +proc ::baltip::my::LbxCoord {w} { + + # Gets listbox's coordinate data. + # w - path to the listbox + # Returns a list of: + # x - X coordinate + # y - Y coordinate + # idx - index of listbox's item + # inside - flag "mouse pointer is inside the listbox" + + lassign [WidCoord $w] x y inside + set idx [$w index @$x,$y] + return [list $x $y $idx $inside] +} +#_______________________ + +proc ::baltip::my::LbxTip {w idx whole} { + # Gets a text of a listbox' tip. + # w - the listbox's path + # idx - index of listbox's item + # whole - flag "tip for a whole listbox, not per item" + + lassign [::baltip cget -SPECTIP$w] - com + if {$whole} { + set tip [string map "%%i %i" $com] + } else { + set com [string map [list %i $idx] $com] + if {[catch {set tip [eval $com]}]} {set tip $com} + } + return $tip +} +#_______________________ + +proc ::baltip::my::ShowLbxTip {w optid idx whole} { + # Shows a tip for a listbox. + # w - the listbox's path + # optid - option name for saving *idx* + # idx - index of listbox's item + # whole - flag "tip for a whole listbox, not per item" + + catch { + lassign [LbxCoord $w] x y idx inside + if {$inside} { + set tip [LbxTip $w $idx $whole] + ::baltip configure $optid $idx + ::baltip tip $w $tip -force yes + } else { + ::baltip hide $w + ::baltip configure $optid {} + } + } +} +#_______________________ + +proc ::baltip::my::PrepareLbxTip {w x y} { + # Prepares a tip for a listbox. + # w - the listbox's path + # x - X coordinate of pointer + # y - Y coordinate of pointer + # Imitates Enter/Leave events per items, with binding to event. + # If "-text" of tip doesn't contain %i, the tip is for a whole listbox. + # If "-text" of tip contains %i, the tip is a callback with %i as item index. + + if {![string is integer -strict $x]} return + catch { + set idx [$w index @$x,$y] + lassign [::baltip cget -pause] -> pause + set optid -SPECTIPid$w + lassign [::baltip cget $optid] -> idx2 + lassign [LbxCoord $w] x y idx inside + if {$inside && $idx!=$idx2} { + lassign [::baltip cget -SPECTIP$w] - com + set com [string map "%%i \u0001" $com] + set whole [expr {[string first %i $com]==-1}] + set com [string map "\u0001 %i" $com] + set text [LbxTip $w $idx $whole] + if {$whole && $idx2 ne {}} { + Command $w $text + return ;# tip for a whole listbox at entering + } + ::baltip hide $w + lassign [Command $w $text] ans res + if {$ans} { + if {$res ne {}} { + # the command should be displayed here (not somewhere else) + set $ans no + } + # the command redefined the tip's text + set text $res + } + if {!$ans} { + set optafter -SPECTIPafter$w + catch {after cancel [lindex [::baltip cget $optafter] 1]} + set aftid [after $pause "::baltip::my::ShowLbxTip $w $optid $idx $whole"] + ::baltip configure $optafter $aftid + } + ::baltip configure $optid $idx + } + } +} + +### ________________________ Treeview _________________________ ### + +proc ::baltip::my::TreCoord {w whole} { + # Gets treeview's coordinate data. + # w - path to the treeview + # whole - flag "tip for a whole treeview, not per item" + # Returns a list of: + # x - X coordinate + # y - Y coordinate + # id - ID of item + # c - column of item + # inside - flag "mouse pointer is inside the treeview" + + lassign [WidCoord $w] x y inside + set id [$w identify item $x $y] + set c [$w identify column $x $y] + if {!$whole && [$w identify region $x $y] eq {heading}} { + set inside no + } + return [list $x $y $id $c $inside] +} +#_______________________ + +proc ::baltip::my::TreTip {w id c whole} { + # Gets a text of a treeview' tip. + # w - the treeview's path + # id - ID of item + # c - column of item + # whole - flag "tip for a whole treeview, not per item" + + lassign [::baltip cget -SPECTIP$w] - com + if {$whole} { + set tip [string map "%%i %i %%c %c" $com] + } else { + set tip {} + set com [string map [list %i $id %c $c] $com] + if {$id ne {} && [catch {set tip [eval $com]}]} {set tip $com} + } + return $tip +} +#_______________________ + +proc ::baltip::my::ShowTreTip {w optid id whole} { + # Shows a tip for a treeview. + # w - the treeview's path + # optid - option name for saving *id* + # id - ID of item + # whole - flag "tip for a whole treeview, not per item" + + catch { + lassign [TreCoord $w $whole] x y id c inside + if {$inside} { + set tip [TreTip $w $id $c $whole] + ::baltip configure $optid [list $id $c] + ::baltip tip $w $tip -force yes + } else { + ::baltip hide $w + ::baltip configure $optid {} + } + } +} +#_______________________ + +proc ::baltip::my::PrepareTreTip {w x y} { + # Prepares a tip for a treeview. + # w - the treeview's path + # x - X coordinate of pointer + # y - Y coordinate of pointer + # Imitates Enter/Leave events per items, with binding to event. + # If "-text" of tip doesn't contain %i, the tip is for a whole treeview. + # If "-text" of tip contains %i, the tip is a callback with %i as item index. + + if {![string is integer -strict $x]} return + catch { + set id [$w identify item $x $y] + lassign [::baltip cget -pause] -> pause + set optid -SPECTIPid$w + lassign [lindex [::baltip cget $optid] 1] id2 c2 + lassign [::baltip cget -SPECTIP$w] - com + set com [string map "%%i \u0001 %%c \u0002" $com] + set isid [expr {[string first %i $com]>-1}] + set isc [expr {[string first %c $com]>-1}] + set whole [expr {!$isid && !$isc}] + set com [string map "\u0001 %i \u0002 %c" $com] + lassign [TreCoord $w $whole] x y id c inside + if {$whole || ($inside && $id ne {} && $c ne {} && + (($isid && $id ne $id2) || ($isc && $c ne $c2)))} { + set text [TreTip $w $id $c $whole] + if {$whole && $id2 ne {}} { + Command $w $text + return ;# tip for a whole treeview at entering + } + lassign [Command $w $text] ans res + if {$ans} { + if {$res ne {}} { + # the command should be displayed here (not somewhere else) + set $ans no + } + # the command redefined the tip's text + set text $res + } + if {!$ans} { + ::baltip hide $w + set optafter -SPECTIPafter$w + catch {after cancel [lindex [::baltip cget $optafter] 1]} + set aftid [after $pause "::baltip::my::ShowTreTip $w $optid {$id} $whole"] + ::baltip configure $optafter $aftid + } + ::baltip configure $optid [list $id $c] + } elseif {$id eq {}} { + ::baltip hide $w + ::baltip configure $optid {} + } + } +} + +# ________________________________ EOF __________________________________ # diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/baltip/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/baltip/pkgIndex.tcl new file mode 100644 index 00000000..673f4b6c --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/baltip/pkgIndex.tcl @@ -0,0 +1,370 @@ +package ifneeded baltip 1.6.2 [list source [file join $dir baltip.tcl]] + +namespace eval ::baltip { + variable _ruff_preamble { +It's a Tcl/Tk tip widget inspired by: + + * [https://wiki.tcl-lang.org/page/Tklib+tooltip](https://wiki.tcl-lang.org/page/Tklib+tooltip) + + * [https://wiki.tcl-lang.org/page/balloon+help](https://wiki.tcl-lang.org/page/balloon+help) + +The original code has been modified to make the tip: + + * be faded/destroyed after an interval defined by a caller + * be enabled/disabled for all or specific widgets + * be disabled for a while ("sleep") + * be usable with labels, menus, text/canvas tags, notebook tabs, listbox/treeview items etc. + * be displayed at the screen's edges + * be displayed under the host widget + * be displayed with a shift (on X and Y) relative to the mouse pointer + * be displayed as a stand-alone balloon message at given coordinates + * be displayed with given font, colors, paddings, border, relief, opacity, bell + * have `-image` and `-compound` options to display images + * have `-command` option to be displayed in a status bar instead of a balloon + * have `-command` option to be changed dynamically, with each tip's exposition + * have `-maxexp` option to limit the number of tip's expositions + * have configure/cget etc. wrapped in Tcl ensemble for convenience + +The video introduction to *baltip* is presented by + [baltip-1.3.1.mp4](https://github.com/aplsimple/baltip/releases/download/baltip-1.3.1/baltip-1.3.1.mp4) (17 Mb). + +Below are several pictures just to glance at *baltip*. + +*Under the mouse pointer*. By default, the tips are displayed just under the mouse pointer. + + + +*Under the widget*. This button's tip is configured to be just under the button. As well as the text's tip. This feature is well fit for widgets positioned in a row (e.g. in toolbar, tabbar etc.). + + + + + +*Tips of text tags*. The text tags can have their own tips. + + + +The *tags of canvas* have tips too. + + + +*Tips of menu items*. The menu items can have their own tips. The popup menus may be *tear-off* at that. + +The menu tips are useful e.g. when the items are displayed as short names, while +the tips are wanted to be full names. + + + +*Label of danger*. The labels are also tipped. This one is configured to be an alert shown "eternally" (i.e. till hovering over it). + + + +The *tabs of notebook* are also supplied with tips. + + + +The `listbox` can have tips per item as well as for a whole listbox widget. + + + +The `ttk::treeview` can have tips per item and/or column as well as for a whole treeview widget. + + + +The `-command` option allows to display tips in a status bar instead of a balloon. + + + +*Configurable tips*. The tip configuration can be global or local (for a specific tip). + +The configuring can include: font, colors, paddings, border, relief, exposition time, opacity, image (with `-compound` option), bell. + + + + + +*Balloon*. The balloon messages aren't related to any widgets. This one is configurated to appear at the top right corner, disappearing after a while. + + + +## Usage + +The *baltip* usage is rather straightforward. Firstly we need `package require`: + + lappend auto_path "dir_of_baltip" + package require baltip + +Then we set tips with `::baltip::tip` command for each appropriate widget: + + ::baltip::tip widgetpath text ?-option value? + # or this way: + ::baltip tip widgetpath text ?-option value? + +For example, having a button `.win.but1`, we can set its tip this way: + + ::baltip tip .win.but1 "It's a tip.\n2nd line of it.\n3rd." + +To get all or specific settings of *baltip*: + + ::baltip::cget ?-option? + # or this way: + ::baltip cget ?-option? + +To get a specific widget's tip option: + + ::baltip::cget widgetpath -option + # or this way: + ::baltip cget widgetpath -option + +To set some options: + + ::baltip::configure -option value ?-option value? + # or this way: + ::baltip config -option value ?-option value? + +To set a specific widget's tip option: + + ::baltip::configure widgetpath -option value ?-option value? + # or this way: + ::baltip config widgetpath -option value ?-option value? + +**Note**: the options set with `configure` command are *global*, i.e. active for all tips. +The options set with `tip` command are *local*, i.e. active for the specific tip. + +To disable all tips: + + ::baltip::configure -on false + +To disable some specific tip: + + ::baltip::tip widgetpath "" + # or this way: + ::baltip::tip widgetpath "old tip" -on false + +To hide some specific (suspended) tip forcedly: + + ::baltip::hide widgetpath + +To update a tip's text and options: + + ::baltip::update widgetpath text ?options? + +To show a tip for a widget that has no "normal" tip, still needs a tip (e.g. on clicking): + + ::baltip::showTip path text ?options? + +By default, `::baltip::showTip` displays the tip under the mouse pointer. At that it regards `-geometry` option and ignores `-under, -shiftX, -shiftY` options. + +When you click on a widget with its tip being displayed, the tip is hidden. It is the default behavior of *baltip*, but sometimes you need to re-display the hidden tip. If the widget is a button, you can include the following command in `-command` of the button: + + ::baltip::repaint widgetpath + +## Some special tips + +The "text" for `listbox` can contain `%i` wildcard - and in such cases the text means a callback receiving a current index of item to tip: + + proc ::lbxTip {idx} { + set item [lindex $::lbxlist $idx] + return "Tip for \"$item\"\nindex=$idx" + } + ::baltip tip .listbox {::lbxTip %i} + +The "text" for `ttk::treeview` can contain `%i` and/or `%c` wildcards - and in such cases the text means a callback receiving ID of item and/or column of item to tip: + + proc ::treTip {id c} { + set item [.treeview item $id -text] + return "Tip for \"$item\"\nID=$id, column=$c" + } + ::baltip::tip .treeview {::treTip %i %c} + +If a tip for listbox and treeview widgets doesn't contain `%i` nor `%c`, it means a usual tip for a whole widget. At that, if those wildcards still need to be displayed, use `%%i` and `%%c` instead. + +If you need to switch between "per item" and "per widget" tip of listbox and treeview , use `::baltip::tip` with `-reset yes` option: + + ::baltip::tip .treeview {Common tip} -reset yes ;# sets a usual tip + ::baltip::tip .treeview {::treTip %i %c} -reset yes ;# sets a callback + +Some GUI objects (notebook tabs, listbox items, treeview items) have not <Enter> nor <Leave> event bindings, so that those bindings are imitated by *baltip*. Hence a problem with popup menus: when you right-click those GUI objects, `baltip::tip` and `tk_popup` might both fire, which results in a mess. + +To avoid this, use `::baltip::sleep` before `tk_popup`, for example: + + ::baltip::sleep 1000 ;# disables tips for 1000 milliseconds + tk_popup $popupmenu $X $Y ;# calls a popup menu at $X $Y coordinates + +As for [tablelist](https://wiki.tcl-lang.org/page/tablelist) widget, I would like to cite an advice by [Csaba Nemethi](https://www.nemethi.de/) : + + The support for tablelist is a special case, don't waste your time with + it. I have already tested that the built-in tooltip support of + Tablelist will work just fine when replacing tklib's tooltip package + with baltip (after fixing the reported bugs), and I intend to extend the + description of the -tooltipaddcommand option by hints showing how to use + this option with baltip instead of BWidget and tklib's tooltip. + +## Balloon + +The *normal* tip has no `-geometry` option because it's calculated by *baltip*, to position the tip under its host widget. + +By means of `-geometry` option you get a balloon message unrelated to any visible widget: it's parented by the toplevel window. The `-geometry` option has +X+Y form where X and Y are coordinates of the balloon. + +For example: + + ::baltip::tip .win "It's a balloon at +1+100 (+X+Y) coordinates" \ + -geometry +1+100 -font {-weight bold -size 12} \ + -alpha 0.8 -fg white -bg black -per10 3000 -pause 1500 -fade 1500 + +The `-pause` and `-fade` options make the balloon fade at appearing and disappearing. + +The `-per10` option means "milliseconds per 10 characters", so it defines the balloon's duration: the more the longer. + +The `-per10` option is weird a little: while it is active (i.e. while *baltip*'s clock is counting down according to `-per10`), other tips are locked. So, `-per10 10000000` is a bad idea for balloons, use `-eternal 1` instead. If `-eternal 1` option is set, `-per10 1` is set by force to unlock other tips immediately. + +The `-geometry` value can include `W` and `H` *wildcards* meaning the width and the height of the balloon. This may be useful when you need to show a balloon at a window's edge and should use the balloon's dimensions which are available only after its creation. The X and Y coordinates are calculated by *baltip* as normal expressions. Of course, they should not include the "+" divider, but this restriction (if any) is easily overcome. + +For example: + + lassign [split [winfo geometry .win] x+] w h x y + set geom "+([expr {$w+$x}]-W-4)+$y" + set text "The balloon at the right edge of the window" + ::baltip tip .win $text -geometry $geom -pause 2000 -fade 2000 + +To show a balloon under the mouse pointer, e.g. on clicking, timeout, processing etc., the following call is used: + + ::baltip::showBalloon text ?options? + +By default, `::baltip::showBalloon` displays the balloon under the mouse pointer. At that it regards `-geometry` option and ignores `-under, -shiftX, -shiftY` options. + + +## Command + +The `-command` option allows to display tips in other places, for example in a status bar. At that, the command can include `%t` and `%w` wildcards, meaning "text" and "widget path". Such tips are well fit for menu items, as seen in *test.tcl*. + +The command of this option must return {}, if no tips should be displayed. + +Also, it can return a new tip to display as a usual balloon tip, which fits for "dynamic tips" that are changed *at each exposition* of a tip. + +For example: + + proc ::Status {tip} { + .labelstatus configure -text $tip + return {} ;# no redefining the tip + } + ::baltip::tip .menu "File actions" -index 0 -command {::Status %t} + ::baltip::tip .menu "Help, hints, Q&A, about etc." -index 1 -command {::Status %t} + +Also, this option can be used if you need to fire some code when the mouse pointer enters or leaves a GUI object. + +**Note**: the *baltip* is available for a few of GUI objects that have not <Enter> nor <Leave> bindings. + +The only line + + baltip::tip $w $tip -command $command + +might save you other lines to fire the command at entering/leaving a GUI object. E.g. the command might highlight a GUI object entered, save its ID and unhighlight the object at leaving it. + +For example: + + proc ::SomeProc {tip} { + lassign [split $tip] obj ID column + if {[info exists ::OBJsaved]} { + puts "$::OBJsaved object ID=[set ::IDsaved] is left... unhighlighted..." + unset ::OBJsaved + } + if {$obj eq {}} return + set ::OBJsaved $obj + set ::IDsaved $ID + puts "Now processing $obj object with ID=$ID column=$column" + return {} ;# means the proc executed and no tip needed + } + ::baltip::tip .listbox {Listbox %i} -command {::SomeProc {%t}} + ::baltip::tip .treeview {Treeview %i %c} -command {::SomeProc {%t}} + +## Options + +Below are listed the *baltip* options that are set with `tip` and `configure` and got with `cget`: + + * `-on` - switches all tips on/off; + * `-per10` - a time of exposition per 10 characters (in millisec.); + * `-fade` - a time of fading (in millisec.); + * `-pause` - a pause before displaying tips (in millisec.); + * `-alpha` - an opacity (from 0.0 to 1.0); + * `-fg` - foreground of tip; + * `-bg` - background of tip; + * `-bd` - borderwidth of tip; + * `-font` - font attributes; + * `-padx` - X padding for text; + * `-pady` - Y padding for text; + * `-padding` - padding for pack; + * `-under` - if >= 0, sets the tip under the widget, else under the pointer; + * `-shiftX` - a horizontal shift relative to the mouse pointer + * `-shiftY` - a vertical shift relative to the mouse pointer + * `-image` - image option; + * `-compound` - compound option; + * `-relief` - relief option; + * `-bell` - if true, rings at displaying; + * `-eternal` - if true, makes a tip "eternal", i.e. visible till clicking. + +The following options are special: + + * `-global` - if true, applies the settings to all registered tips; + * `-force` - if true, forces the display by 'tip' command; + * `-index` - index of menu item to tip; + * `-tag` - name of text tag to tip; + * `-ctag` - name of canvas tag to tip; + * `-nbktab` - path to ttk::notebook tab to tip; + * `-geometry` - geometry (+X+Y) of the balloon; + * `-reset` - "-reset true" may be useful to set a new tip (callback or text) for listbox and treeview; + * `-command` - a command to be executed, with `%t` (tip's text) and `%w` (widget's path) wildcards; + * `-maxexp` - maximum number of tip's expositions. + * `-focus` - path to widget to set focus on, after showing a tip + +If `-global yes` option is used alone, it applies all global options to all registered tips. If `-global yes` option is used along with other options, only those options are applied to all registered tips. + +Of course, all global options will be applied to all tips to be created after `::baltip configuration`. For example: + + ::baltip config -global yes ;# applies all global options to all registered and to-be-created tips + ::baltip config -global yes -per10 2000 ;# applies `-per10` to all registered and to-be-created tips + +The `-index` option may have numeric (0, 1, 2...) or symbolic form (active, end, none) to indicate a menu entry, e.g. in `-command` option. For example: + + ::baltip repaint .win.popupMenu -index active + ::baltip::tip .menu "File actions" -index 0 + +There may be useful to define options in *text* argument of *::baltip::tip*. + +For this, provide the *text* argument as a list of pairs of uppercased options' name / value including *-BALTIP* option for *tip*. For example: + + ::baltip tip .text "-BALTIP {Sort of diary, todos etc.} -MAXEXP 1" + +As seen in the above examples, *baltip* can be used as Tcl ensemble, so that the commands may be shortened. + +See more examples in *test.tcl* of [baltip.zip](https://chiselapp.com/user/aplsimple/repository/baltip/download). + +Also, you can test *baltip* with *test2_pave.tcl* of [apave package](https://chiselapp.com/user/aplsimple/repository/pave/download). + +## Acknowledgements + +The *baltip* package has been developed with help of these kind people: + + * [Nicolas Bats](https://github.com/sl1200mk2) prompted to add canvas tags' tips, baltip::show procedure and tested *baltip* in MacOS + + * [Csaba Nemethi](https://www.nemethi.de/) sent several bug fixes and advices, especially on listbox, treeview and menu tips + +## Links + + * [Source at chiselapp](https://chiselapp.com/user/aplsimple/repository/baltip/download) (baltip.zip) + + * [Source at github](https://github.com/aplsimple/baltip) + + * [Reference](https://aplsimple.github.io/en/tcl/baltip/baltip.html) + + * [Demo of baltip v1.3.1](https://github.com/aplsimple/baltip/releases/download/baltip-1.3.1/baltip-1.3.1.mp4) + } +} + +namespace eval ::baltip::my { + variable _ruff_preamble { + The `::baltip::my` namespace contains procedures for the "internal" usage by *baltip* package. + + All of them are upper-cased, in contrast with the UI procedures of `baltip` namespace. + } +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/bartabs/README.md b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/bartabs/README.md new file mode 100644 index 00000000..40123f68 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/bartabs/README.md @@ -0,0 +1,127 @@ +# What's that + +The *bartabs* Tcl/Tk package provides a bar widget containing tabs that are + + - scrollable + - markable + - moveable + - closeable + - disabled and enabled + - static and changeable + - selectable and multi-selectable + - configureable + - enhanceable with popup menu + +The *bartabs* defines three TclOO classes: + - *Tab* deals with tabs + - *Bar* deals with a bar of tabs + - *Bars* deals with bars of tabs + +However, only the *Bars* class is used to create bars along with tabs. It can be also used to deal with any bars and tabs, providing all necessary interface. + +The *Bar* does not create a real TclOO object, rather it provides *syntax sugar* for a convenient access to the bar methods. + +The *Tab* does not create a real TclOO object as well. It serves actually for structuring *bartabs* code as for tab methods. Thus, its methods are accessible through the *Bars* ("real" TclOO) and *Bar* ("sugar") objects. + +# Work flow + +A common work flow with *bartabs* looks like this: + +Firstly, we create a *Bars* object, e.g. + + `bartabs::Bars create NS::bars` + +Then we create a *Bar* object, e.g. + + `NS::bars create NS::bar $barOptions` + +If a tab of the bar should be displayed (with its possible contents), we show the bar and select the current tab: + + `set TID [NS::bar tabID "tab label"] ;# get the tab's ID by its label` + + `NS::bar $TID show ;# show the bar and select the tab` + +or just draw the bar without mind-breaking about a tab: + + `NS::bar draw ;# show the bar without selecting a tab` + +The rest actions include: + + - responses to a selection of tab (through `-csel command` option of *Bar* object) + - responses to a deletion of tab (through `-cdel command` option of *Bar* object) + - responses to a reorganization of bar (through `-cmov command` option of *Bar* object) + - inserting and renaming tabs + - disabling and enabling tabs + - marking tabs with colors or icons + - processing the marked tabs + - processing multiple tabs selected with Ctrl+click + - scrolling tabs to left/right through key bindings + - calling other handlers through key bindings and *bartabs* menu + - using `cget` and `configure` methods to change the bar/tab appearance + - redrawing bars at some events + - removing and creating as much bars as required + +# Tab class + +The methods of *Tab* class are called from *Bars* or *Bar* object + and are passed: *tab ID (TID), method name, arguments*. Syntax: + +`OBJECT TID method arguments` + +For example: `NS::bars $TID close` or `NS::bar $TID show false` + +# Bar class + +The methods of *Bar* class are called from *Bar* object or (more wordy) from *Bars* object. Syntax: + +`BAR_OBJECT method arguments` + +`BARS_OBJECT BID method arguments` + +For example: `NS::bar popList $X $Y` or `NS::bars $BID popList $X $Y` + +# Bars class + +The methods of *Bars* class need no TID nor BID, though not protesting them passed before method name. Syntax: + +`BARS_OBJECT method arguments` + +For example: + +`NS::bars drawAll ;# good boy` + +`NS::bars tab11 drawAll ;# bad boy uses the useless tab11 (TID)` + +`NS::bars bar1 drawAll ;# bad boy's BID is useless as well` + +# Virtual methods + +There are three "virtual" methods: + +* `NS::bar create NS::tab $label` creates a tab object *NS::tab* for a tab labeled $label to access the tab methods, e.g. `NS::tab show` + +* `NS::tab cget $option` gets an option of tab, e.g. `NS::tab cget -text` + +* `NS::tab configure $option $value` sets an option of tab, e.g. `NS::tab configure -text "new label"` + +# BID and TID + +Few words about *BID* and *TID* mentioned throughout the *bartabs*. + +These are identifiers of bars and tabs, of form `bar` and `tab` where `` is integer increased from 0 in order of bar/tab creation. The bars and the tabs of all bars have unique IDs. + +You can use these literals freely, along with BIDs and TIDs gotten from *bartabs* methods. For example, if you know that "some tab" was created third, you can show it straightforward: + + `NS::bar tab2 show ;# show the 3rd tab (TID=tab2)` + +instead of + + `NS::bar [NS::bar tabID "some tab"] show ;# find and show the tab by its name` + +# Links + +[Documentation](https://aplsimple.github.io/en/tcl/bartabs) + +[Reference on bartabs](https://aplsimple.github.io/en/tcl/bartabs/bartabs.html) + +[Reference on baltip](https://aplsimple.github.io/en/tcl/baltip/baltip.html) (package used by *bartabs*) diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/bartabs/bartabs.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/bartabs/bartabs.tcl new file mode 100644 index 00000000..4ff5bec8 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/bartabs/bartabs.tcl @@ -0,0 +1,2296 @@ +########################################################### +# Name: bartabs.tcl +# Author: Alex Plotnikov (aplsimple@gmail.com) +# Date: 01/12/2023 +# Brief: Handles the tab bar widget. +# License: MIT. +########################################################### + +package provide bartabs 1.6.9 + +# ________________________ NS bartabs _________________________ # + +namespace eval ::bartabs { + + # IDs for new bars & tabs + variable NewBarID -1 NewTabID -1 NewTabNo -1 + variable NewAfterID; array set NewAfterID [list] + + # images made by base64 + image create photo bts_ImgLeft \ + -data {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEUAAABJSUmSkpJtbW22trbb +29vYK8X/AAAAAXRSTlMAQObYZgAAAEBJREFUCNdjAANGBigQhNKMjlCGEJTBqAplCIVCGIwqKopg +hrATjKGkZAiRMgIyIEJABlTIEGYDjMEoiGQp3BkAc58E+W1dC9QAAAAASUVORK5CYII=} + image create photo bts_ImgRight \ + -data {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEUAAABJSUmSkpJtbW22trbb +29vYK8X/AAAAAXRSTlMAQObYZgAAAEBJREFUCNdjYGAQYIACQRhDRADGUIQxggSgjFCokJCTkwCU +oWIIZggrKcEYygIQBlAAwgAKQBiCMLsE0C2FCAAAa1IEzBjs2sUAAAAASUVORK5CYII=} + image create photo bts_ImgNone \ + -data {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA1BMVEUAAACnej3aAAAAAXRSTlMA +QObYZgAAAAtJREFUCNdjIBEAAAAwAAFletZ8AAAAAElFTkSuQmCC} + image create photo bts_ImgClose \ + -data {iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAALVBMVEUAAAAAACTb29u2trbt4+Ll +4eHw4eD/6N/y3Nv85N/94t3m29vn0dPjz8/dyssim+gAAAAAAXRSTlMAQObYZgAAAEdJREFUCNdj +wAvaFZiWgWgORSUlYQcgg11QSFFQAchgUhQUFLoAkjskKKgNVqwkKKjHAJMCqeGEKWYzBGoPAMk5 +KTCp4rURAEWmB5A5tzUJAAAAAElFTkSuQmCC} + + variable BarsList [list] +; proc drawAll {} { + # Draws all bars. Used at updating themes etc. + foreach bars $::bartabs::BarsList {$bars drawAll} + } + #_______________________ + + proc messageBox {type ttl msg args} { + # Runs Tk's or apave's ok/yes/no/cancel dialogue. + # type - ok, yesno or yesnocancel + # ttl - title + # ttl - message + # args - additional arguments of tk_messageBox + # Returns 1 if 'yes' chosen, 2 if 'no', 0 otherwise. + + # try the apave package's dialogue + if {[catch {set res [::apave::obj $type ques $ttl $msg]}]} { + # or run the standard tk_messageBox + set res [tk_messageBox -title $ttl -message $msg -type $type \ + -icon question {*}$args] + set res [expr {$res eq {yes} ? 1 : ($res eq {no} ? 2 : 0)}] + } + return $res + } + + ## ____________ EONS bartabs ____________ ## + +} + +# ____________ bartabs class hierarchy ____________ # + +oo::class create ::bartabs::Tab { +} + +oo::class create ::bartabs::Bar { + superclass ::bartabs::Tab +} + +oo::class create ::bartabs::Bars { + superclass ::bartabs::Bar +} + +# ________________________ Tab _______________________ # + +## ____________ Private methods of Tab ____________ ## + +oo::define ::bartabs::Tab { + +method My {ID} { +# Creates a caller of method. +# ID - ID of caller + + set t [string range $ID 0 2] + oo::objdefine [self] "method $ID {args} { \ + set m \[lindex \$args 0\] ; \ + if {\$m in {{} -1}} {return {}} ; \ + if {\$m eq {create} && {$t} eq {bar} || \$m in {cget configure} && {$t} eq {tab}} { \ + set args \[lreplace \$args 0 0 Tab_\$m\]} ; \ + return \[my {*}\$args\]}" +} +#_______________________ + +method ID {} { +# Returns ID of caller. + + lindex [uplevel 1 {self caller}] 2 +} +#_______________________ + +method IDs {TID} { +# Returns a pair of TID and BID. + + list $TID [my $TID cget -BID] +} +#_______________________ + +method Tab_Create {BID TID w text} { +# Creates a tab widget (frame, label, button). +# w - parent frame +# text - tab's label +# Returns a list of created widgets of the tab. + + lassign [my $BID cget -relief -bd -padx -pady -BGMAIN] relief bd padx pady bgm + lassign [my $TID cget -wb -wb1 -wb2] wb wb1 wb2 + if {!$bd} {set relief flat} + if {![my Tab_Is $wb]} { + if {$wb eq {}} { + set ::bartabs::NewTabNo [expr {($::bartabs::NewTabNo+1)%1000000}] + set wb $w.$TID[format %06d $::bartabs::NewTabNo] + set wb1 $wb.l + set wb2 $wb.b + } + my $TID configure -wb $wb -wb1 $wb1 -wb2 $wb2 + ttk::frame $wb -borderwidth [expr {$bd? $bd : 2}] + ttk::label $wb1 + if {[my TtkTheme]} { + ttk::button $wb2 -style ClButton$BID -image bts_ImgNone \ + -command [list [self] $TID close yes -withicon yes] -takefocus 0 + } else { + button $wb2 -relief flat -borderwidth 0 -highlightthickness 0 -image bts_ImgNone \ + -command [list [self] $TID close yes -withicon yes] -takefocus 0 -background $bgm + } + } + $wb configure -relief $relief + $wb1 configure -relief flat -padding "$padx $pady $padx $pady" \ + {*}[my Tab_Font $BID] + lassign [my Tab_TextEllipsed $BID $text] text ttip + if {[set tip [my $TID cget -tip]] ne {}} { + my $TID configure -tip $tip ;# run baltip after creating $wb1 & $wb2 + } + $wb1 configure -text $text -background $bgm + if {[my Tab_Iconic $BID]} { + $wb2 configure -state normal + } else { + $wb2 configure -state disabled -image {} + } + list $wb $wb1 $wb2 +} +#_______________________ + +method Tab_create {tabCom label} { + # Creates tab method and registers it. Defined by "My". + + set BID [my ID] + if {[set TID [my $BID tabID $label]] eq {}} { + return -code error "No label {$label} in $BID" + } +; proc $tabCom {args} "return \[[self] $TID {*}\$args\]" + set lObj [my $BID cget -TABCOM] + my $BID configure -TABCOM [lappend lObj [list $TID $tabCom]] +} +#_______________________ + +method Tab_ExpandOption {BID expand} { + # Gets a real -expand option, counting that it may be set as a number>1 + # meaning "starting from this number do expanding, otherwise not" + # expand - original value of -expand option + + if {[string is digit $expand] && $expand>1} { + set tabs [my $BID cget -TABS] + set expand [expr {$expand<[llength $tabs]}] + } + return $expand +} +#_______________________ + +method Tab_cget {args} { +# Gets options of tab. +# args - list of options +# Returns a list of values or one value if args is one option. + + variable btData + lassign [my Tab_BID [set TID [my ID]]] BID i tab + lassign $tab tID tdata + set res [list] + foreach opt $args { + switch -- $opt { + -BID {lappend res $BID} + -text - -wb - -wb1 - -wb2 - -pf { + if {[catch {lappend res [dict get $tdata $opt]}]} { + lappend res {} + } + } + -index { + if {$i<([dict get $btData $BID -LLEN]-1)} { + lappend res $i + } else { + lappend res end + } + } + -width { ;# width of tab widget + lassign [my Tab_DictItem $tab] tID text wb wb1 wb2 + if {![my Tab_Is $wb]} { + lappend res 0 + } else { + set b1 [ttk::style configure TLabel -borderwidth] + if {$b1 eq {}} {set b1 0} + lassign [my $BID cget -bd -expand -static] bd expand static + set bd [expr {$bd?2*$b1:0}] + set b2 [expr {[my Aux_WidgetWidth $wb2]-3}] + set expand [my Tab_ExpandOption $BID $expand] + set expand [expr {$expand||![my Tab_Iconic $BID]?2:0}] + lappend res [expr {[my Aux_WidgetWidth $wb1]+$b2+$bd+$expand}] + } + } + default { ;# user's options + if {[catch {lappend res [dict get $tdata $opt]}]} {lappend res {}} + } + } + } + if {[llength $args]==1} {return [lindex $res 0]} + return $res +} +#_______________________ + +method Tab_configure {args} { +# Sets values of options for a tab. +# args - list of pairs "option value" + + lassign [my Tab_BID [set TID [my ID]]] BID i tab + lassign $tab tID data + foreach {opt val} $args { + dict set data $opt $val + if {$opt eq {-tip}} { ;# configure the tab's tip + lassign [my $TID cget -wb1 -wb2] wb1 wb2 + if {$wb1 ne {}} { + catch { + baltip::tip $wb1 $val -under 3 + baltip::tip $wb2 $val -under 3 + } + } + } + } + set tab [list $TID $data] + my $BID configure -TABS [lreplace [my $BID cget -TABS] $i $i $tab] +} +#_______________________ + +method Tab_DictItem {TID {data ""}} { +# Gets item data from a tab item (ID + data). +# TID - tab ID or the tab item (ID + data). +# data - tab's data (list of option-value) +# If 'data' omitted, TID is a tab item (ID + data). +# If the tab's attribute is absent, it's meant to be "". +# Returns a list of values: ID, text, wb, wb1, wb2, pf. + + if {$data eq {}} {lassign $TID TID data} + set res [list $TID] + foreach a {-text -wb -wb1 -wb2 -pf} { + if {[dict exists $data $a]} { + lappend res [dict get $data $a] + } else { + lappend res {} + } + } + return $res +} +#_______________________ + +method Tab_ItemDict {TID text {wb ""} {wb1 ""} {wb2 ""} {pf ""}} { +# Returns a tab item (ID + data) from item data. +# text - tab's text; +# wb - tab's frame widget +# wb1 - tab's label widget +# wb2 - tab's button widget +# pf - "p" for tab packed, "" for tab forgotten + + list $TID [list -text $text -wb $wb -wb1 $wb1 -wb2 $wb2 -pf $pf] +} +#_______________________ + +method Tab_Data {BID text} { +# Creates data of new tab. +# text - new tab's label +# The bar is checked for a duplicate of 'text'. +# Returns a tab item or "" (if duplicated). + + variable btData + if {[dict exists $btData $BID] && [my $BID tabID $text] ne {}} {return {}} + my My tab[incr ::bartabs::NewTabID] + my Tab_ItemDict tab$::bartabs::NewTabID $text +} +#_______________________ + +method Tab_BID {TID {act ""}} { +# Gets BID from TID. +# act - if "check", only checks the existance of TID +# If 'act' is "check" and a bar not found, -1 is returned, otherwise BID. +# Returns a list of 1. BID (or -1 if no bar found) 2. index of the tab in tab list 3. the tab data. + + variable btData + set BID {} + dict for {bID bInfo} $btData { + set tabs [my $bID cget -TABS] + if {[set i [my Aux_IndexInList $TID $tabs]] > -1} { + set BID $bID + break + } + } + if {$act eq {check}} {return $BID} + if {$BID eq {}} { + return -code error "bartabs: tab ID $TID not found in the bars" + } + list $BID $i [lindex $tabs $i] +} +#_______________________ + +method Tab_Bindings {BID} { +# Sets bindings on events of tabs. + + lassign [my $BID cget -static -FGOVER -BGOVER -WWID] static fgo bgo wwid + foreach tab [my $BID listTab] { + lassign $tab TID text wb wb1 wb2 + if {[my Tab_Is $wb]} { + set bar "[self] $BID" + set tab "[self] $TID" + set ctrlBP "$tab OnCtrlClick ; break" + foreach w [list $wb $wb1 $wb2] { + bind $w "$bar OnEnterTab $TID $wb1 $wb2 $fgo $bgo" + bind $w "[self] $TID OnLeaveTab $wb1 $wb2" + bind $w "[self] $TID OnPopup %X %Y" + bind $w $ctrlBP + } + bind $wb $ctrlBP + bind $wb "[self] $BID OnButtonPress $TID $wb1 {}" + bind $wb1 "[self] $BID OnButtonPress $TID $wb1 %x" + bind $wb1 "[self] $BID OnButtonRelease $wb1 %x" + bind $wb1 "[self] $BID OnButtonMotion $wb $wb1 %x %y" + } + } + bind [lindex $wwid 0] "[self] $BID OnPopup %X %Y $BID" +} +#_______________________ + +method Tab_Font {BID} { +# Gets a font attributes for tab label. + + set font [my $BID cget -font] + if {$font eq {}} { + if {[set font [ttk::style configure TLabel -font]] eq {}} { + set font TkDefaultFont + } + set font [font actual $font] + } + return "-font {$font}" +} +#_______________________ + +method Tab_MarkAttrs {BID TID {withbg yes} {wb2 ""}} { +# Gets image & mark attributes of marks. +# TID - ID of current tab +# withbg - if true, gets also background +# wb2 - tab's button +# Returns string of attributes if any. + + lassign [my $BID cget \ + -mark -imagemark -fgmark -bgmark -IMAGETABS -FGMAIN -BGMAIN -FGDSBL -BGDSBL] \ + marktabs imagemark fgm bgm imagetabs fgmain bgmain fgdsbl bgdsbl + set res {} + if {[my Disabled $TID]} { + set imagemark {} + if {$wb2 ne {}} {$wb2 configure -state disabled} + set res " -foreground $fgdsbl" + if {$withbg} {append res " -background $bgdsbl"} + } elseif {[lsearch $marktabs $TID]>-1} { + if {$imagemark eq {}} { + if {$fgm eq {}} {set fgm $fgmain} ;# empty value - no markable tabs + set res " -foreground $fgm" + if {$withbg} { + if {$bgm eq {}} {set bgm $bgmain} + append res " -background $bgm" + } + if {$wb2 ne {}} {$wb2 configure -image bts_ImgNone} + } + } else { + set imagemark {} + if {[set i [lsearch -index 0 $imagetabs $TID]]>-1} { + set imagemark [lindex $imagetabs $i 1] + } elseif {$wb2 ne {}} { + $wb2 configure -image bts_ImgNone + } + } + if {$imagemark ne {}} { + set res " -image $imagemark" + if {$wb2 ne {}} { + $wb2 configure {*}$res + catch {$wb2 configure -style ClButton$BID} + } + } + return $res +} +#_______________________ + +method Tab_SelAttrs {fnt fgsel bgsel} { +# Gets font attributes of selected tab. +# fnt - original font attributes +# fgsel - foreground for selection +# bgsel - background for selection +# If both set, fgsel and bgsel mean colors +# If bgsel=="", fgsel!="", fgsel is a widget to get attributes +# If fgsel=="", 'selection' is 'underlining' + + lassign $fnt opt val + if {$fgsel eq {}} { + dict set val -underline 1 + } else { + if {$bgsel eq {}} { + set bgsel [ttk::style configure $fgsel -selectbackground] + set fgsel [ttk::style configure $fgsel -selectforeground] + } + set opt "-foreground $fgsel -background $bgsel $opt" + } + return "$opt {$val}" +} +#_______________________ + +method Tab_MarkBar {BID {TID "-1"}} { +# Marks the tabs of a bar . +# TID - ID of the current tab + + lassign [my $BID cget -tabcurrent -fgsel -bgsel -select -FGMAIN -BGMAIN] \ + tID fgs bgs fewsel fgm bgm + if {$TID in {{} {-1}}} {set TID $tID} + foreach tab [my $BID listTab] { + lassign $tab tID text wb wb1 wb2 + if {[my Tab_Is $wb]} { + set font [my Tab_Font $BID] + set selected [expr {$tID == $TID || [lsearch $fewsel $tID]>-1}] + if {$selected} {set font [my Tab_SelAttrs $font $fgs $bgs]} + $wb1 configure {*}$font + set attrs [my Tab_MarkAttrs $BID $tID [expr {!$selected}] $wb2] + if {$attrs ne {} && {-image} ni $attrs } { + $wb1 configure {*}$attrs + } elseif {!$selected} { + $wb1 configure -foreground $fgm -background $bgm + } + } + } + my $BID configure -tabcurrent $TID +} +#_______________________ + +method Tab_MarkBars {{BID -1} {TID -1}} { +# Marks the tabs. +# BID - bar ID (if omitted, all bars are scanned) +# TID - ID of the current tab + + variable btData + if {$BID == -1} { + dict for {BID barOpts} $btData {my Tab_MarkBar $BID} + } else { + my Tab_MarkBar $BID $TID + } +} +#_______________________ + +method Tab_TextEllipsed {BID text {lneed -1}} { +# Returns a tab's label and tip. +# text - label +# lneed - label length anyway + + lassign [my $BID cget -lablen -ELLIPSE] lablen ellipse + if {$lneed ne -1} {set lablen $lneed} + if {$lablen && [string length $text]>$lablen} { + set ttip $text + set text [string range $text 0 $lablen-1] + append text $ellipse + } else { + set ttip {} + } + list $text $ttip +} +#_______________________ + +method Tab_Iconic {BID} { +# Gets a flag "tabs with icons". +# Returns "yes", if tabs are supplied with icons. + + expr {![my $BID cget -static]} +} +#_______________________ + +method Tab_Pack {BID TID wb wb1 wb2} { + +# Packs a tab widget. +# wb, wb1, wb2 - tab's widgets + lassign [my $BID cget -static -expand] static expand + if {[my Tab_Iconic $BID]} { + pack $wb1 -side left + pack $wb2 -side left + } else { + pack $wb1 -side left -fill x + pack forget $wb2 + } + set expand [my Tab_ExpandOption $BID $expand] + if {$expand} { + pack $wb -side left -fill x -expand 1 + } else { + pack $wb -side left + } + my $TID configure -pf "p" +} +#_______________________ + +method Tab_RemoveLinks {BID TID} { +# Removes a tab's links to lists. + + foreach o {-IMAGETABS -TABCOM -mark -disable -select} { + set l [my $BID cget $o] + for {set i 0} {$i>-1} {} { + if {[set i [lsearch -index 0 $l $TID]]>-1} { + set l [lreplace $l $i $i] + my $BID configure $o $l + } + } + } + my Tab_MarkBars $BID +} +#_______________________ + +method Tab_Is {wb} { +# Checks if 'wb' is an existing tab widget. +# wb - path + + expr {$wb ne {} && [winfo exists $wb]} +} +#_______________________ + +method Tab_CloseFew {{TID -1} {left no} args} { +# Closes tabs of bar. +# TID - ID of the current tab or -1 if to close all +# left - "yes" if to close all at left of TID, "no" if at right +# args - options (if contains -skipsel, selected tabs aren't closed) + + set BID [my ID] + if {$TID ne {-1}} {lassign [my Tab_BID $TID] BID icur} + set tabs [my $BID listTab] + set skipsel [expr {[lsearch $args -skipsel]>-1}] + set seltabs [my $BID cget -select] + set doupdate no + set first 1 + for {set i [llength $tabs]} {$i} {} { + incr i -1 + set tID [lindex $tabs $i 0] + if {!$skipsel || $tID ni $seltabs} { + if {$TID eq {-1} || ($left && $i<$icur) || (!$left && $i>$icur)} { + if {![set res [my $tID close no -first $first]]} break + if {$res==1} {set doupdate yes} + set first 0 ;# -first option is "1" for the very first closed tab + } + } + } + if {$doupdate} { + my $BID clear + if {$TID eq {-1}} { + my $BID Refill 0 yes + } else { + my $BID $TID show yes + } + } +} +#_______________________ + +method PrepareCmd {TID BID opt args} { +# Prepares a command bound to an action on a tab. +# opt - command option (-csel, -cmov, -cdel) +# args - additional argumens of the command +# The commands can include wildcards: %b for bar ID, %t for tab ID, %l for tab label. +# Returns "" or the command if 'opt' exists in 'args'. + + variable btData + if {[dict exists $btData $BID $opt]} { + set com [dict get $btData $BID $opt] + if {$TID>-1} { + set label [my $TID cget -text] + } else { + set label {} + } + set label [string map {\{ ( \} )} $label] + lappend com {*}$args + return [string map [list %b $BID %t $TID %l $label] $com] + } + return {} +} + +#_______________________ + +method Tab_Cmd {opt args} { +# Executes a command bound to an action on a tab. +# opt - command option (-csel, -cmov, -cdel) +# args - additional argumens of the command +# The commands can include wildcards: %b for bar ID, %t for tab ID, %l for tab label. +# Returns 1, if no command set; otherwise: 1 for Yes, 0 for No, -1 for Cancel. + + lassign [my IDs [my ID]] TID BID + if {[set com [my PrepareCmd $TID $BID $opt {*}$args]] ne {}} { + if {[catch {set res [{*}$com]}]} {set res yes} + if {$res eq {} || !$res} {return 0} + return $res + } + return 1 +} + +#_______________________ + +method Tab_BeCurrent {} { +# Makes the tab be currently visible. + + if {[set TID [my ID]] in {{} {-1}} || [my Disabled $TID]} return + set BID [my $TID cget -BID] + my $TID Tab_Cmd -csel ;# command before the selection shown + my Tab_MarkBar $BID $TID + if {[set wb2 [my $TID cget -wb2]] ne {} && \ + ![string match *bartabs::* [$wb2 cget -image]] && + $TID ni [my $BID listFlag "m"]} { + $wb2 configure -image bts_ImgNone + } + my $BID Bar_Cmd2 -csel2 $TID ;# command after the selection shown +} +#_______________________ + +method Disabled {TID} { + # Checks if the tab is disabled. + + set dsbltabs [my [my $TID cget -BID] cget -disable] + expr {[lsearch $dsbltabs $TID]>-1} +} + +## ____________ Event handlers ____________ ## + +method DestroyMoveWindow {} { + # Destroys the moving window zombi. + + set BID [my ID] + set movWin [lindex [my $BID cget -MOVWIN] 0] + catch {destroy $movWin} + my $BID configure -MOVX {} -wb1 {} +} +#_______________________ + +method OnEnterTab {TID wb1 wb2 fgo bgo} { +# Handles the mouse pointer entering a tab. +# wb1, wb2 - tab's widgets +# fgo, bgo - colors of "mouse over the tab" + + if {[my Disabled $TID]} return + $wb1 configure -foreground $fgo -background $bgo + if {[my Tab_Iconic [my ID]]} {$wb2 configure -image bts_ImgClose} +} +#_______________________ + +method OnLeaveTab {wb1 wb2} { +# Handles the mouse pointer leaving a tab. +# wb1, wb2 - tab's widgets + + lassign [my IDs [my ID]] TID BID + if {[my Disabled $TID]} return + if {![winfo exists $wb1]} return + lassign [my $BID cget -FGMAIN -BGMAIN] fgm bgm + $wb1 configure -foreground $fgm -background $bgm + my Tab_MarkBars $BID + if {"-image" ni [set attrs [my Tab_MarkAttrs $BID $TID 0 $wb2]] && \ + [my Tab_Iconic $BID]} { + $wb2 configure -image bts_ImgNone + catch {$wb2 configure -style ClButton$BID} + } +} +#_______________________ + +method OnButtonPress {TID wb1 x} { +# Handles the mouse clicking a tab. +# wb1 - tab's label +# x - x position of the mouse pointer + + if {[my Disabled $TID]} return + my [set BID [my ID]] configure -MOVX $x + if {$TID eq {}} {set TID [my $BID tabID [$wb1 cget -text]]} + my $TID Tab_BeCurrent +} +#_______________________ + +method OnButtonMotion {wb wb1 x y} { +# Handles the mouse moving over a tab. +# wb - tab's frame +# wb1 - tab's label +# x, y - positions of the mouse pointer + + lassign [my [set BID [my ID]] cget \ + -static -FGMAIN -FGOVER -BGOVER -MOVWIN -MOVX -MOVX0 -MOVX1 -MOVY0] \ + static fgm fgo bgo movWin movX movx movx1 movY0 + if {$movX eq {} || $static} return + # dragging the tab + if {![winfo exists $movWin]} { + # make the tab's replica to be dragged + toplevel $movWin + if {$::tcl_platform(platform) == "windows"} { + wm attributes $movWin -alpha 0.0 + } else { + wm withdraw $movWin + } + if {[tk windowingsystem] eq "aqua"} { + ::tk::unsupported::MacWindowStyle style $movWin help none + } else { + wm overrideredirect $movWin 1 + } + set movx [set movx1 $x] + set movX [expr {[winfo pointerx .]-$x}] + set movY0 [expr {[winfo pointery .]-$y}] + label $movWin.label -text [$wb1 cget -text] -relief solid \ + -foreground black -background #7eeeee {*}[my Tab_Font $BID] + pack $movWin.label -expand 1 -fill both -ipadx 1 + wm minsize $movWin [winfo reqwidth $movWin.label] [winfo reqheight $wb1] + set againstLooseFocus "[self] $BID DestroyMoveWindow" + bind $movWin $againstLooseFocus + bind $movWin $againstLooseFocus + $wb1 configure -foreground $fgm + my $BID configure -wb1 $wb1 -MOVX1 $movx1 -MOVY0 $movY0 + } + lassign [my $BID cget -WWID] wframe wlarr + lassign [split [winfo geometry $wframe] x+] wflen + lassign [split [winfo geometry $wlarr] x+] walen + lassign [split [winfo geometry $wb] x+] wbl - wbx + if {abs($x-$movx)>1 && ($wflen-$wbx+$movx1+$walen)>$x && ($wbx+$wbl-$movx1+$x)>0} { + wm geometry $movWin +$movX+$movY0 + if {$::tcl_platform(platform) == "windows"} { + if {[wm attributes $movWin -alpha] < 0.1} {wm attributes $movWin -alpha 1.0} + } else { + catch {wm deiconify $movWin ; raise $movWin} + } + } + my $BID configure -MOVX [expr {$movX+$x-$movx}] -MOVX0 $x +} +#_______________________ + +method OnButtonRelease {wb1o x} { +# Handles the mouse releasing a tab. +# wb1o - original tab's label +# x - x position of the mouse pointer + + lassign [my [set BID [my ID]] cget \ + -MOVWIN -MOVX -MOVX1 -MOVY0 -FGMAIN -wb1 -tleft -tright -wbar -static] \ + movWin movX movx1 movY0 fgm wb1 tleft tright wbar static + my $BID DestroyMoveWindow + if {$movX eq {} || $wb1o ne $wb1 || $static} return + # dropping the tab - find a tab being dropped at + $wb1 configure -foreground $fgm + lassign [my Aux_InitDraw $BID no] bwidth vislen bd arrlen llen + set vislen1 $vislen + set vlist [list] + set i 0 + set iw1 -1 + set tabssav [set tabs [my $BID cget -TABS]] + foreach tab $tabs { + lassign [my Tab_DictItem $tab] tID text _wb _wb1 _wb2 _pf + if {$_pf ne {}} { + if {$_wb1 eq $wb1} { + set vislen0 $vislen + set tab1 $tab + set iw1 $i + set TID $tID + } + set wl [expr {[winfo reqwidth $_wb1]+[winfo reqwidth $_wb2]}] + lappend vlist [list $i $vislen $wl] + incr vislen $wl + } + incr i + } + if {$iw1==-1} return ;# for sure + if {[my $TID Tab_Cmd -cmov] ni {"1" "yes" "true"}} return ;# chosen to not move + set vislen2 [expr {$vislen0+$x-$movx1}] + foreach vl $vlist { + lassign $vl i vislen wl + set rightest [expr {$i==$tright && $vislen2>(10+$vislen)}] + if {$iw1==($i+1) && $x<0} {incr vislen2 $wl} + if {($vislen>$vislen2 || $rightest)} { + set tabs [lreplace $tabs $iw1 $iw1] + set i [expr {$rightest||$iw1>$i?$i:$i-1}] + if {$rightest && $i<($llen-1) && $i==$iw1} {incr i} + set tabs [linsert $tabs $i $tab1] + set left yes + if {$rightest} { + set left no + set tleft $i + } elseif {$i<$tleft} { + set tleft $i + } + break + } + } + if {$tabssav ne $tabs} { + my $BID configure -TABS $tabs + my $BID Refill $tleft $left + my $BID Bar_Cmd2 -cmov2 $TID ;# command after the action + } +} +#_______________________ + +method OnCtrlClick {} { +# Handles a selection of tabs with Ctrl+click. + + lassign [my IDs [my ID]] TID BID + lassign [my $BID cget -static -select] static fewsel + if {$static} return + if {[set i [lsearch $fewsel $TID]]>-1} { + set fewsel [lreplace $fewsel $i $i] + } else { + lappend fewsel $TID + } + my $BID configure -select $fewsel + my Tab_MarkBar $BID + my $BID Bar_Cmd2 -csel3 $TID ;# command after the action +} +#_______________________ + +method OnPopup {X Y {BID "-1"} {TID "-1"} {textcur ""}} { +# Handles the mouse right-clicking on a tab. +# X, Y - positions of the mouse pointer + + if {$BID eq "-1"} { + lassign [my IDs [my ID]] TID BID + set textcur [my $TID cget -text] + } + lassign [my $BID cget -wbar -menu -USERMNU -UMNU -TABS -static -hidearrows -WWID] \ + wbar popup usermnu popup0 tabs static hidearr wwid + if {$static && $hidearr && !$usermnu} { + lassign $wwid wframe wlarr wrarr + if {[catch {pack info $wlarr}] && [catch {pack info $wrarr}]} { + return ;# static absolutely + } + } + set pop $wbar.popupMenu + if {[winfo exist $pop]} {destroy $pop} + my $BID configure -LOCKDRAW 1 + menu $pop -tearoff 0 + set ipops [set lpops [list]] + if {$TID eq "-1"} { + set popup [list [lindex $popup 0] s {*}$popup0] ;# let "List" be in + } + foreach p $popup { + lassign $p typ label comm menu dsbl tip var + if {$menu ne {}} {set popc $pop.$menu} {set popc $pop} + foreach opt {label comm menu dsbl} { + set $opt [string map [list %b $BID %t $TID %l $textcur] [set $opt]] + } + if {[info commands [lindex $dsbl 0]] ne {}} { + ;# 0/1/2 image label hotkey + lassign [{*}$dsbl $BID $TID $label] dsbl comimg comlabel hotk + } else { + lassign $dsbl dsbl comimg comlabel hotk + if {$dsbl ne {}} {set dsbl [expr $dsbl]} + set dsbl [expr {([string is boolean $dsbl] && $dsbl ne {})?$dsbl:0}] + } + if {$dsbl eq {2}} continue ;# 2 - "hide"; 1 - "disable"; 0 - "normal" + if {$dsbl} {set dsbl {-state disabled}} {set dsbl {}} + if {$comimg ne {}} {set comimg "-image $comimg"} + if {$comlabel ne {}} {set label $comlabel} + if {$comimg eq {}} {set comimg {-image bts_ImgNone}} + if {$hotk ne {}} {set hotk "-accelerator $hotk"} + switch [string index $typ 0] { + s {$popc add separator} + c { + switch [string index $typ 1] { + o - {} { ;# command + $popc add command -label $label -command $comm \ + {*}$dsbl -compound left {*}$comimg {*}$hotk + } + h { ;# checkbutton + if {$comm ne {}} {set comm [list -command $comm]} + $popc add checkbutton -label $label {*}$comm -variable $var + } + } + } + m { + if {$menu eq {bartabs_cascade} && !$usermnu && $static} { + set popc $pop ;# no user mnu & static: only list of tabs be shown + } else { + if {[winfo exist $popc]} {destroy $popc} + menu $popc -tearoff 0 + set popm [string range $popc 0 [string last . $popc]-1] + $popm add cascade -label $label -menu $popc \ + {*}$dsbl -compound left {*}$comimg {*}$hotk + } + if {[string match {bartabs_cascade*} $menu]} { + set popi $popc + lappend lpops $popi + set ipops [my $BID FillMenuList $BID $popi $TID $menu] + } + } + } + if {$tip ne {}} { + catch {baltip::tip $popc $tip -index [$popc index end]} + } + } + if {[llength $lpops]} { + catch {::apave::obj themePopup $pop} + my Bar_MenuList $BID $TID $pop ;# main menu + foreach popi $lpops {my Bar_MenuList $BID $TID $popi $ipops} + if {$TID ne {-1}} { + lassign [my $TID cget -wb1 -wb2] wb1 wb2 + bind $pop [list [self] $TID OnLeaveTab $wb1 $wb2] + } + my $BID DestroyMoveWindow + tk_popup $pop $X $Y + } else { + my $BID popList $X $Y + } + my $BID configure -LOCKDRAW {} +} + +## ____________ Public methods of Tab ____________ ## + +method show {{refill no} {lifo yes}} { +# Shows a tab in a bar and sets it current. +# refill - if "yes", update the bar +# lifo - if "yes", allows moving a tab to 0th position +# When refill=no and lifo=no, just shows a tab in its current position. + + lassign [my IDs [my ID]] TID BID + if {$refill} {my $BID clear} + set itab 0 + foreach tab [my $BID listTab] { + lassign $tab tID text wb wb1 wb2 pf + if {$TID eq $tID} { + set refill [expr {$pf eq {}}] ;# check if visible + break + } + incr itab + } + if {$refill && $lifo && [my $BID cget -lifo] && (![my $TID visible] || \ + [string is true -strict [my $BID cget -lifoest]])} { + my $BID moveTab $TID 0 + set itab 0 + } + if {$refill} {my $BID Refill $itab no yes} + my $TID Tab_BeCurrent +} +#_______________________ + +method close {{redraw yes} args} { +# Closes a tab and updates the bar. +# redraw - if "yes", update the bar and select the new tab +# args - additional argumens of the -cdel command +# Returns "1" if the deletion was successful, otherwise 0 (no) or -1 (cancel). + + lassign [my Tab_BID [set TID [my ID]]] BID icurr tabcurr + if {[my Disabled $TID]} { + set ttl [msgcat::mc Closing] + set t [my $TID cget -text] + set msg [msgcat::mc "Can't close the disabled\n\"%t\"\n\nClose others?"] + set msg [string map [list %t $t] $msg] + return [expr {[::bartabs::messageBox yesno $ttl $msg -icon question]==1}] + } + set cdel [my $BID cget -cdel] + if {$cdel eq {}} { + set res 1 + } else { + set cdel [my PrepareCmd $TID $BID -cdel {*}$args] + if {[catch {set res [{*}$cdel]}]} { + set res [my $TID Tab_Cmd -cdel {*}$args] + } + } + if {$res ni {1 yes true}} {return $res} + if {$redraw} {my $BID clear} + lassign [my $BID cget -TABS -tleft -tright -tabcurrent] tabs tleft tright tcurr + my Tab_RemoveLinks $BID $TID + destroy [my $TID cget -wb] + set tabs [lreplace $tabs $icurr $icurr] + oo::objdefine [self] [list deletemethod [lindex $tabcurr 0]] + my $BID configure -TABS $tabs + if {$redraw} { + if {$icurr>=$tleft && $icurr<[llength $tabs]} { + my $BID draw + my [lindex $tabs $icurr 0] Tab_BeCurrent + } else { + if {[set TID [lindex $tabs end 0]] ne {}} { + my $TID show yes ;# last tab deleted: show the new last if any + } + } + } + my $BID Bar_Cmd2 -cdel2 ;# command after the action + return 1 +} +#_______________________ + +method visible {} { +# Checks if a tab is visible. +# Returns yes if the tab is visible,. + + lassign [my IDs [my ID]] TID BID + lassign [my $BID cget -tleft -tright] tleft tright + set tabs [my $BID listTab] + for {set i $tleft} {$i<=$tright} {incr i} { + if {$TID eq [lindex $tabs $i 0]} { + return yes + } + } + return no +} + +## ________________________ EOC Tab _________________________ ## + +} + +# ________________________ Bar _________________________ # + +## ____________ Private methods of Bar ____________ ## + +oo::define ::bartabs::Bar { + +method Bar_Data {barOptions} { +# Puts data of new bar in btData. +# barOptions - new bar's options +# Returns BID of new bar. + + variable btData + set BID bar[incr ::bartabs::NewBarID] + # defaults: + set barOpts [dict create -wbar {} -wbase {} -wproc {} -static no -lowlist no \ + -hidearrows no -scrollsel yes -lablen 0 -tiplen 0 -tleft 0 -tright end \ + -disable [list] -select [list] -mark [list] -fgmark #800080 -fgsel "." \ + -relief groove -padx 1 -pady 1 -expand 0 -tabcurrent -1 -dotip no \ + -bd 0 -separator 1 -lifo 0 -fg {} -bg {} -popuptip {} -sortlist 0 -comlist {} \ + -ELLIPSE "\u2026" -MOVWIN {.bt_move} -ARRLEN 0 -USERMNU 0 -LLEN 0 -title Tabs] + set tabinfo [set imagetabs [set popup [list]]] + my Bar_DefaultMenu $BID popup + foreach {optnam optval} $barOptions { + switch -exact -- $optnam { + -tab - -imagetab { + if {$optnam eq "-imagetab"} {lassign $optval optval img} + # no duplicates allowed: + if {[lsearch -index {1 1} -exact $tabinfo $optval]==-1} { + lappend tabinfo [set tab [my Tab_Data $BID $optval]] + dict set barOpts -TABS $tabinfo + dict set barOpts -LLEN [llength $tabinfo] + if {$optnam eq "-imagetab"} { + lappend imagetabs [list [lindex $tab 0] $img] + dict set barOpts -IMAGETABS $imagetabs + } + } + } + -menu { + lappend popup {*}$optval + dict set barOpts -menu $popup + dict set barOpts -USERMNU 1 + lappend mnu {*}$optval + if {[string index [lindex $mnu 0] 0] eq "s"} {set mnu [lrange $mnu 1 end]} + dict set barOpts -UMNU $mnu + } + default { + dict set barOpts $optnam $optval + } + } + } + set wbar [dict get $barOpts -wbar] + if {$wbar eq {}} {return -code error {bartabs: -wbar option is obligatory}} + set wbase [dict get $barOpts -wbase] + set wproc [dict get $barOpts -wproc] + foreach o {-tleft -tright} { + set v [dict get $barOpts $o] + set v [expr [string map [list end [llength $tabinfo]-1] $v]] + dict set barOpts $o $v + } + if {$wbase ne {} && $wproc eq {}} { + dict set barOpts -wproc "expr {\[winfo width $wbase\]-80}" ;# 80 for ornithology + } + dict set btData $BID $barOpts + return $BID +} +#_______________________ + +method Bar_DefaultMenu {BID popName} { +# Creates default menu items. +# popName - variable name for popup's data + + upvar 1 $popName pop + set bar "[self] $BID" + set dsbl "{$bar CheckDsblPopup}" + lassign [my Mc_MenuItems] list behind close closeall closeleft closeright + foreach item [list \ + "m {$list} {} bartabs_cascade" \ + "s {} {} {} $dsbl" \ + "m {BHND} {} bartabs_cascade2 $dsbl" \ + "s {} {} {} $dsbl" \ + "c {$close} {[self] %t close yes -first -1} {} $dsbl" \ + "c {$closeall} {$bar closeAll $BID -1 1} {} $dsbl" \ + "c {$closeleft} {$bar closeAll $BID %t 2} {} $dsbl" \ + "c {$closeright} {$bar closeAll $BID %t 3} {} $dsbl"] { + lappend pop $item + } +} +#_______________________ + +method Bar_MenuList {BID TID popi {ilist ""} {pop ""}} { +# Tunes "List" menu item for colors & underlining. +# popi - menu of tab items +# ilist - list of "s" (separators) and TIDs +# pop - menu to be themed in apave package + + if {$pop eq {}} {set pop $popi} + catch {::apave::obj themePopup $pop} + lassign [my $BID cget -tabcurrent -select -FGOVER -BGOVER -lowlist] \ + tabcurr fewsel fgo bgo ll + if {$ll || [catch {set fs "-size [dict get [$pop cget -font] -size]"}]} { + if {$ll && [string is digit $ll] && $ll>1} { + set fs "-size $ll" + } else { + set fs {} + } + } + # ALERT: "font actual TkDefaultFont" may be wasteful with tclkits + set font [list -font "[font actual TkDefaultFont] $fs"] + set llen [llength $ilist] + if {[$popi cget -tearoff]} { + set ito 1 + set TID $tabcurr + } else { + set ito 0 + } + for {set i 0} {$i<$llen} {incr i} { + if {[set tID [lindex $ilist $i]] eq {s}} continue + set opts [my Tab_MarkAttrs $BID $tID no] + if {"-image" ni $opts} {append opts " -image bts_ImgNone"} + append opts " -compound left" + if {$tID==$tabcurr || [lsearch $fewsel $tID]>-1} { + set font2 [my Tab_SelAttrs $font {} {}] + } else { + set font2 $font + } + append opts " $font2" + if {$tID==$TID} {append opts " -foreground $fgo -background $bgo"} + if {[string match *bartabs_cascade2 $popi] && [my Disabled $tID]} { + append opts " -foreground [my $BID cget -FGMAIN]" ;# move behind any + } + catch {$popi entryconfigure [expr {$i+$ito}] {*}$opts} + } +} +#_______________________ + +method Bar_Cmd2 {comopt2 {TID ""}} { +# Executes a command after an action. +# comopt2 - the command's option (-csel2, -cdel2, -cmov2) + + set BID [my ID] + if {[set com2 [my $BID cget $comopt2]] ne {}} { + {*}[string map [list %t $TID] $com2] + } +} +#_______________________ + +method Mc_MenuItems {} { + # Returns localized menu items' label. + + namespace eval ::bartabs { + return [list [msgcat::mc List] \ + [msgcat::mc behind] \ + [msgcat::mc Close] \ + [msgcat::mc {... All}] \ + [msgcat::mc {... All at Left}] \ + [msgcat::mc {... All at Right}]] + } +} +#_______________________ + +method InitColors {} { +# Initializes colors of a bar. + + set BID [my ID] + if {[set fgmain [my $BID cget -fg]] eq {}} { + set fgmain [ttk::style configure . -foreground] + } + if {[set bgmain [my $BID cget -bg]] eq {}} { + set bgmain [ttk::style configure . -background] + } + if {[catch {set fgdsbl [dict get [ttk::style map . -foreground] disabled]}]} { + set fgdsbl $fgmain + } + if {[catch {set bgdsbl [dict get [ttk::style map . -background] disabled]}]} { + set bgdsbl $bgmain + } + if {[catch { + set fgo [ttk::style map TButton -foreground] + if {[dict exists $fgo active]} { + set fgo [dict get $fgo active] + } else { + set fgo $fgmain + } + set bgo [ttk::style map TButton -background] + if {[dict exists $bgo active]} { + set bgo [dict get $bgo active] + } else { + set bgo $bgmain + } + }]} { + set bgo $fgmain ;# reversed + set fgo $bgmain + if {$bgo in {black #000000}} {set bgo #444444; set fgo #FFFFFF} + } + my $BID configure -FGMAIN $fgmain -BGMAIN $bgmain \ + -FGDSBL $fgdsbl -BGDSBL $bgdsbl -FGOVER $fgo -BGOVER $bgo + my $BID Style +} +#_______________________ + +method Style {} { +# Sets styles a bar's widgets. + + set BID [my ID] + set bg [my $BID cget -BGMAIN] + ttk::style configure ClButton$BID {*}[ttk::style configure TButton] + ttk::style configure ClButton$BID -relief flat -padx 0 -bd 0 -highlightthickness 0 + ttk::style map ClButton$BID {*}[ttk::style map TButton] + ttk::style map ClButton$BID -background [list active $bg !active $bg] + ttk::style layout ClButton$BID [ttk::style layout TButton] +} +#_______________________ + +method ScrollCurr {dir} { +# Scrolls the current tab to the left/right. +# dir - 1/-1 for scrolling to the right/left + + lassign [my [set BID [my ID]] cget -scrollsel -tabcurrent] sccur tcurr + if {!$sccur || $tcurr eq {}} {return no} + set tabs [my $BID listFlag] + if {[set i [my Aux_IndexInList $tcurr $tabs]]==-1} {return no} + incr i $dir + set TID [lindex $tabs $i 0] + if {[lindex $tabs $i 2] eq "1" && ![my Disabled $TID]} { + my $TID Tab_BeCurrent ;# TID visible & enabled + return yes + } + return no +} +#_______________________ + +method ArrowsState {tleft tright sright} { +# Sets a state of scrolling arrows. +# tleft, tright - index of left/right tab +# sright - state of a right arrow ("no" for disabled) + + lassign [my [set BID [my ID]] cget -WWID -hidearrows -tiplen] wwid hidearr tiplen + lassign $wwid wframe wlarr wrarr + set tabs [my $BID listTab] + if {$tleft} { + if {$hidearr && [catch {pack $wlarr -before $wframe -side left}]} { + pack $wlarr -side left + } + set state normal + } else { + if {$hidearr} { + set state normal + pack forget $wlarr + } else { + catch {pack $wlarr -before $wframe -side left} + set state disabled + } + } + $wlarr configure -state $state + set tip {} + if {$state eq {normal} && $tiplen>=0} { + for {set i [expr {$tleft-1}]} {$i>=0} {incr i -1} { + if {$tiplen && [incr cntl]>$tiplen} { + append tip "..." + break + } + set text [lindex [my Tab_TextEllipsed $BID [lindex $tabs $i 1]] 0] + append tip "$text\n" + } + } + catch {::baltip::tip $wlarr [string trim $tip]} + if {$sright} { + if {$hidearr && [catch {pack $wrarr -after $wframe -side right -anchor e}]} { + pack $wrarr -side right -anchor e + } + set state normal + } else { + if {$hidearr} { + set state normal + pack forget $wrarr + } else { + catch {pack $wrarr -after $wframe -side right -anchor e} + set state disabled + } + } + $wrarr configure -state $state + set tip {} + if {$state eq {normal} && $tiplen>=0} { + for {set i [expr {$tright+1}]} {$i<[llength $tabs]} {incr i} { + if {$tiplen && [incr cntr]>$tiplen} { + append tip ... + break + } + set text [lindex [my Tab_TextEllipsed $BID [lindex $tabs $i 1]] 0] + append tip "$text\n" + } + } + catch {::baltip::tip $wrarr [string trim $tip]} +} +#_______________________ + +method FillMenuList {BID popi {TID -1} {mnu ""} {mustBeSorted {}}} { +# Fills "List of tabs" item of popup menu. +# popi - menu of tab items +# TID - clicked tab ID +# mnu - root menu +# mustBeSorted - flag "sorted list" +# Return a list of items types: s (separator) and TID. + + lassign [my $BID cget -tiplen -popuptip -sortlist -comlist] tiplen popuptip sortlist comlist + set vis [set seps 0] ;# flags for separators: before/after visible items + set idx [set icom -1] + set res [list] + set tabs [my [set BID [my ID]] listFlag] + if {$mustBeSorted ne {}} {set sortlist $mustBeSorted} + if {$sortlist} { + set tabs [lsort -index 1 -dictionary $tabs] + } + foreach tab $tabs { + incr icom + lassign $tab tID text vsbl + if {!$sortlist} { + if {$vsbl && !$seps || !$vsbl && $vis} { + incr idx + $popi add separator + lappend res s + incr seps + set vis 0 + } elseif {$vsbl} { + set vis 1 + } + if {!$seps && $vis} { ;# no invisible at left + incr idx + $popi add separator + lappend res s + incr seps + } + } + set dsbl {} + if {$TID == -1 || $mnu eq {bartabs_cascade}} { + if {$comlist eq {}} { + set comm "[self] $tID show yes" + } else { + set tip [my $tID cget -tip] + set comm [string map [list %ID $tID %i $icom %t $tip] $comlist] + } + if {[my Disabled $tID]} {set dsbl {-state disabled}} + } else { + set comm "[self] moveSelTab $TID $tID" + } + if {[set cbr [expr {$tiplen>0 && [incr ccnt]>$tiplen}]]} {set ccnt 0} + incr idx + if {$popuptip ne {}} { + # make a tip for menu items + $popuptip $popi $idx $tID + } + $popi add command -label $text -command $comm {*}$dsbl -columnbreak $cbr + lappend res $tID + } + if {$seps<2 && !$sortlist} { ;# no invisible at right + $popi add separator + lappend res s + } + return $res +} +#_______________________ + +method Width {} { +# Calculates and returns the bar width to place tabs. + + lassign [my [set BID [my ID]] cget \ + -tleft -tright -LLEN -wbase -wbar -ARRLEN -hidearrows -WWID -BWIDTH -wproc] \ + tleft tright llen wbase wb arrlen hidearrows wwid bwidth1 wproc + set iarr 2 + if {$hidearrows} { ;# how many arrows are visible? + if {!$tleft} {incr iarr -1} + if {$tright==($llen-1)} {incr iarr -1} + } + set minus2len [expr {-$iarr*$arrlen}] + set bwidth2 0 + if {$wproc ne {}} { + set bwidth2 [{*}[string map [list %b $BID] $wproc]] + } + if {$bwidth2<2 && [set wbase_exist [winfo exists $wbase]]} { + # 'wbase' is a base widget to get the bartabs' width from + set bwidth2 [my Aux_WidgetWidth $wbase] + } + incr bwidth2 $minus2len + set wbase_exist [expr {$bwidth2>1}] + if {$wbase_exist} { + set bwidth $bwidth2 + } else { + if {$bwidth1 eq {} || $bwidth1<=1} {set bwidth1 100} + set bwidth [expr {$wbase_exist ? min($bwidth1,$bwidth2) : $bwidth1}] + } + if {[set winw [winfo width .]]<2} {set winw [winfo reqwidth .]} + incr winw $minus2len + if {$bwidth<=0} { ;# last refuge + set bwidth [expr {max($winw,[winfo reqwidth $wb],[winfo width $wb])}] + } elseif {$wbase eq {} && $bwidth1 && $winw>1 && $bwidth1>$winw} { + set bwidth $winw + } + return $bwidth +} +#_______________________ + +method FillFromLeft {{ileft ""} {tright "end"}} { +# Fills a bar with tabs from the left to the right (as much tabs as possible). +# ileft - index of a left tab +# tright - index of a right tab + + lassign [my Aux_InitDraw [set BID [my ID]]] bwidth vislen bd arrlen llen tleft hidearr tabs wframe + if {$ileft ne {}} {set tleft $ileft} + for {set i $tleft} {$i<$llen} {incr i} { + lassign [my Tab_DictItem [lindex $tabs $i]] TID text wb wb1 wb2 pf + lassign [my Tab_Create $BID $TID $wframe $text] wb wb1 wb2 + if {[my Aux_CheckTabVisible $wb $wb1 $wb2 $i $tleft tright vislen \ + $llen $hidearr $arrlen $bd $bwidth tabs $TID $text]} { + my Tab_Pack $BID $TID $wb $wb1 $wb2 + } + } + my Aux_EndDraw $BID $tleft $tright $llen +} +#_______________________ + +method FillFromRight {tleft tright behind} { +# Fills a bar with tabs from the right to the left (as much tabs as possible). +# tleft, tright - index of left/right tab +# behind - flag "go behind the right tab" + + set llen [my [set BID [my ID]] cget -LLEN] + if {$tright eq "end" || $tright>=$llen} {set tright [expr {$llen-1}]} + my $BID configure -tleft $tright -tright $tright + lassign [my Aux_InitDraw $BID] bwidth vislen bd arrlen llen tleft hidearr tabs wframe + set totlen 0 + for {set i $tright} {$i>=0} {incr i -1} { + lassign [my Tab_DictItem [lindex $tabs $i]] TID text wb wb1 wb2 pf + lassign [my Tab_Create $BID $TID $wframe $text] wb wb1 wb2 + incr vislen [set wlen [my $TID cget -width]] + if {$i<$tright && ($vislen+($tright<($llen-1)||!$hidearr?$arrlen:0))>$bwidth} { + set pf {} + } else { + set tleft $i + set pf p + incr totlen $wlen + } + set tabs [lreplace $tabs $i $i [my Tab_ItemDict $TID $text $wb $wb1 $wb2 $pf]] + } + set i $tright + while {$behind && [incr i]<$llen && $totlen<$bwidth} { + # go behind the right tab as far as possible + lassign [my Tab_DictItem [lindex $tabs $i]] TID text wb wb1 wb2 pf + lassign [my Tab_Create $BID $TID $wframe $text] wb wb1 wb2 + incr totlen [my $TID cget -width] + if {($totlen+($i<($llen-1)||!$hidearr?$arrlen:0))>$bwidth} { + set pf {} + } else { + set tright $i + set pf p + } + set tabs [lreplace $tabs $i $i [my Tab_ItemDict $TID $text $wb $wb1 $wb2 $pf]] + } + for {set i $tleft} {$i<$llen} {incr i} { + lassign [my Tab_DictItem [lindex $tabs $i]] TID text wb wb1 wb2 pf + if {[my Tab_Is $wb] && $pf ne {}} {my Tab_Pack $BID $TID $wb $wb1 $wb2} + } + my Aux_EndDraw $BID $tleft $tright $llen +} +#_______________________ + +method Locked {BID} { +# Checks for "draw locked" mode: protects the menu. + + expr {[my $BID cget -LOCKDRAW] ne {}} +} +#_______________________ + +method Refill {itab left {behind false}} { +# Fills a bar with tabs. +# itab - index of tab +# left - if "yes", fill from left to right +# behind - flag "go behind the right tab" + + if {[my Locked [set BID [my ID]]]} return + my $BID clear + if {$itab eq "end" || $itab==([my $BID cget -LLEN]-1)} {set left 0} + if {$left} { + my $BID FillFromLeft $itab + } else { + my $BID FillFromRight 0 $itab $behind + } +} +#_______________________ + +method CheckDsblPopup {BID TID mnuit} { +# Controls disabling of Close* menu items. +# mnuit - menu label +# Returns "yes" for disabled menu item + + lassign [my Tab_BID $TID] BID icur + lassign [my $BID cget -static -LLEN] static llen + set dsbl [my Disabled $TID] + lassign [my Mc_MenuItems] list behind close closeall closeleft closeright + switch -exact -- $mnuit [list \ + BHND { + if {$static} {return 2} + if {[set slen [llength [my $BID listFlag "s"]]]>1} { + set mnuit [string map [list %n $slen] [msgcat::mc "%n tabs"]] + } else { + lassign [my Tab_TextEllipsed $BID [my $TID cget -text] 16] mnuit + set mnuit "\"$mnuit\"" + } + return [list [expr {$dsbl||$llen<2||$llen==2&&$icur==1}] {} "$mnuit $behind"] + } \ + $close - $closeall - {} { + if {$static} {return 2} + } \ + $closeleft { + if {$static} {return 2} + return [expr {$dsbl || !$icur}] + } \ + $closeright { + if {$static} {return 2} + return [expr {$dsbl || $icur==($llen-1)}] + } \ + ] + return $dsbl +} +#_______________________ + +method NeedDraw {} { +# Redraws a bar at need. + + set BID [my ID] + lassign [my $BID cget -wproc -BWIDTH -ARRLEN] wproc bwo arrlen + set bw [{*}[string map [list %b $BID] $wproc]] + if {$bwo eq {} || [set need [expr {abs($bwo-$bw)>$arrlen} && $bw>10]]} { + my $BID configure -BWIDTH $bw + } + if {$bwo ne {} && $need} { + catch {after cancel $::bartabs::NewAfterID($BID)} + set ::bartabs::NewAfterID($BID) [after 10 [list [self] $BID draw]] + } +} + +## ____________ Exported methods of Bar ____________ ## + +method _runBound_ {w ev args} { +# Runs a method bound to an event occuring at a widget. +# w - widget +# ev - event +# args - the bound method & its arguments + + if {[catch {my {*}$args}]} { ;# failed binding => remove it + foreach b [split [bind $w $ev] \n] { + if {[string first $args $b]==-1} { + if {[incr is1]==1} {bind $w $ev $b} {my bindToEvent $w $ev $b} + } + } + } +} + +export _runBound_ + +## ____________ Auxiliary methods of Bar ____________ ## + +method Aux_WidgetWidth {w} { +# Calculates a widget's width. + + if {![winfo exists $w]} {return 0} + set wwidth [winfo width $w] + if {$wwidth<2} {set wwidth [winfo reqwidth $w]} + return $wwidth +} +#_______________________ + +method Aux_InitDraw {BID {clearpf yes}} { +# Auxiliary method used before cycles drawing tabs. +# Returns a list of main options of drawing tabs. + + my $BID InitColors + lassign [my $BID cget \ + -tleft -hidearrows -LLEN -WWID -bd -wbase -wbar -ARRLEN -wproc] \ + tleft hidearr llen wwid bd wbase wbar arrlen wproc + lassign $wwid wframe wlarr + if {$arrlen eq {}} { + set arrlen [winfo reqwidth $wlarr] + my $BID configure -wbase $wbase -ARRLEN $arrlen + } + set bwidth [my $BID Width] + set vislen [expr {$tleft || !$hidearr ? $arrlen : 0}] + set tabs [my $BID cget -TABS] + if {$clearpf} {foreach tab $tabs {my [lindex $tab 0] configure -pf {}}} + list $bwidth $vislen $bd $arrlen $llen $tleft $hidearr $tabs $wframe +} +#_______________________ + +method Aux_CheckTabVisible {wb wb1 wb2 i tleft trightN vislenN llen hidearr arrlen bd bwidth tabsN TID text} { +# Auxiliary method used to check if a tab is visible. + + upvar 1 $trightN tright $tabsN tabs $vislenN vislen + incr vislen [my $TID cget -width] + if {$i>$tleft && ($vislen+(($i+1)<$llen||!$hidearr?$arrlen:0))>$bwidth} { + pack forget $wb + set pf {} + } else { + set tright $i + set pf p + } + my $TID configure -wb $wb -wb1 $wb1 -wb2 $wb2 -pf $pf + string length $pf +} +#_______________________ + +method Aux_EndDraw {BID tleft tright llen} { +# Auxiliary method used after cycles drawing tabs. + + my $BID ArrowsState $tleft $tright [expr {$tright < ($llen-1)}] + my $BID configure -tleft $tleft -tright $tright + my Tab_Bindings $BID + my Tab_MarkBar $BID +} +#_______________________ + +method Aux_IndexInList {ID lst} { +# Searches ID in list. + + set i 0 + foreach it $lst { + if {[lindex $it 0]==$ID} {return $i} + incr i + } + return -1 +} + +## ____________ Public methods of Bar ____________ ## + +method cget {args} { +# Gets values of options of bars & tabs. +# args - list of options, e.g. {-tabcurrent -MyOpt} +# Return a list of values or one value if args is one option. + + set BID [my ID] + variable btData + set res [list] + set llen [dict get $btData $BID -LLEN] + foreach opt $args { + if {$opt eq "-listlen"} { + lappend res $llen + } elseif {$opt eq "-width"} { + lassign [dict get [dict get $btData $BID] -wbar] wbar + lappend res [my Aux_WidgetWidth $wbar] + } elseif {[dict exists $btData $BID $opt] && ($llen || $opt ne "-tabcurrent")} { + lappend res [dict get $btData $BID $opt] + } else { + lappend res {} + } + } + if {[llength $args]==1} {return [lindex $res 0]} + return $res +} +#_______________________ + +method configure {args} { +# Sets values of options for bars & tabs. +# args - list of pairs "option value" + + set BID [my ID] + variable btData + foreach {opt val} $args { + dict set btData $BID $opt $val + if {$opt eq "-TABS"} {dict set btData $BID -LLEN [llength $val]} + } + if {[dict exists $args -static]} {my $BID Style} +} +#_______________________ + +method draw {{upd yes}} { +# Draws the bar tabs at slight changes. +# upd - if "yes", run "update" before redrawing + + if {[my Locked [set BID [my ID]]]} return + if {$upd} update + lassign [my Aux_InitDraw $BID] bwidth vislen bd arrlen llen tleft hidearr tabs wframe + set tright [expr {$llen-1}] + for {set i $tleft} {$i<$llen} {incr i} { + lassign [my Tab_DictItem [lindex $tabs $i]] TID text wb wb1 wb2 pf + lassign [my Tab_Create $BID $TID $wframe $text] wb wb1 wb2 + if {[my Aux_CheckTabVisible $wb $wb1 $wb2 $i $tleft tright vislen $llen $hidearr $arrlen $bd $bwidth tabs $TID $text]} { + my Tab_Pack $BID $TID $wb $wb1 $wb2 + } + } + my Aux_EndDraw $BID $tleft $tright $llen + my Tab_MarkBar $BID +} +#_______________________ + +method update {} { +# Updates the bar in hard way. + + if {[my Locked [set BID [my ID]]]} return + update + my $BID Refill 0 yes +} +#_______________________ + +method clear {} { +# Forgets (hides) the shown tabs. + + if {[my Locked [set BID [my ID]]]} return + set wlist [] + foreach tab [my $BID listTab] { + lassign $tab TID text wb wb1 wb2 pf + if {[my Tab_Is $wb] && $pf ne {}} { + lappend wlist $wb + my $TID configure -pf {} + } + } + if {[llength $wlist]} {pack forget {*}$wlist} +} +#_______________________ + +method scrollLeft {} { + # Scrolls tabs to the left. + + set BID [my ID] + lassign [my $BID cget -wbar -dotip] w dotip + set wlarr $w.larr ;# left arrow + if {[my $BID ScrollCurr -1]} { + if {$dotip} {catch {::baltip::repaint $wlarr}} + return + } + lassign [my $BID cget -tleft -LLEN -scrollsel] tleft llen sccur + if {![string is integer -strict $tleft]} {set tleft 0} + if {$tleft && $tleft<$llen} { + incr tleft -1 + set tID [lindex [my $BID listTab] $tleft 0] + my $BID configure -tleft $tleft + my $BID Refill $tleft yes + if {$sccur} {my $tID Tab_BeCurrent} + if {$dotip} {catch {::baltip::repaint $wlarr}} + } +} +#_______________________ + +method scrollRight {} { + # Scrolls tabs to the right. + + set BID [my ID] + lassign [my $BID cget -wbar -dotip] w dotip + set wrarr $w.rarr ;# left arrow + if {[my $BID ScrollCurr 1]} { + if {$dotip} {catch {::baltip::repaint $wrarr}} + return + } + lassign [my $BID cget -tright -LLEN -scrollsel] tright llen sccur + if {![string is integer -strict $tright]} {set tright [expr {$llen-2}]} + if {$tright<($llen-1)} { + incr tright + set tID [lindex [my $BID listTab] $tright 0] + my $BID configure -tright $tright + my $BID Refill $tright no + if {$sccur} {my $tID Tab_BeCurrent} + if {$dotip} {catch {::baltip::repaint $wrarr}} + } +} +#_______________________ + +method listTab {} { +# Gets a list of tabs. +# Returns a list of TID, text, wb, wb1, wb2, pf. + + set res [list] + foreach tab [my [my ID] cget -TABS] {lappend res [my Tab_DictItem $tab]} + return $res +} +#_______________________ + +method comparetext {it1 it2} { +# Compares items (by -text attribute) for sort method. +# it1 - 1st item to compare +# it2 - 2nd item to compare +# See also: sort + + catch {set it1 [dict get $it1 -text]} + catch {set it2 [dict get $it2 -text]} + string compare -nocase $it1 $it2 +} +#_______________________ + +method sort {{mode -increasing} {cmd ""}} { +# Sorts a list of tabs by the tab names. +# mode - option of sort +# cmd - command to compare two items + + set BID [my ID] + lassign [my $BID cget -tabcurrent -lifo] TID lifo + set tabs [my $BID cget -TABS] + if {$cmd eq {}} { + set tabs [lsort $mode -index 1 -dictionary -command "[self] comparetext" $tabs] + } else { + set tabs [lsort $mode -dictionary -command $cmd $tabs] + } + my $BID configure -TABS $tabs -lifo no + my $TID show yes + my $BID configure -lifo $lifo +} +#_______________________ + +method listFlag {{filter ""}} { +# Gets a list of TID + flags "visible", "marked", "selected", "disabled". +# filter - "" for all or "v","m","s","d" for visible, marked, selected, disabled +# Returns a list "TID, text, visible, marked, selected, disabled" for all or a list of TID for filtered. + + set BID [my ID] + lassign [my $BID cget -mark -disable -select -tabcurrent] mark dsbl fewsel tcurr + set res [list] + foreach tab [my $BID listTab] { + lassign $tab TID text wb wb1 wb2 pf + set visibl [expr {[my Tab_Is $wb] && $pf ne {}}] + set marked [expr {[lsearch $mark $TID]>=0}] + set dsbled [expr {[lsearch $dsbl $TID]>=0}] + set select [expr {$TID == $tcurr || [lsearch $fewsel $TID]>-1}] + if {$filter eq {}} { + lappend res [list $TID $text $visibl $marked $select $dsbled] + } elseif {$filter eq "v" && $visibl || $filter eq "m" && $marked || \ + $filter eq "d" && $dsbled || $filter eq "s" && $select} { + lappend res $TID + } + } + return $res +} +#_______________________ + +method insertTab {txt {pos "end"} {img ""}} { +# Inserts a new tab into a bar. +# txt - tab's label +# pos - tab's position in tab list +# img - tab's image +# Returns TID of new tab or "". + + set tabs [my [set BID [my ID]] cget -TABS] + set tab [my Tab_Data $BID $txt] + if {$tab eq {}} {return {}} + if {$pos eq {end}} { + lappend tabs $tab + } else { + set tabs [linsert $tabs $pos $tab] + } + if {$img ne {}} { + set imagetabs [my $BID cget -IMAGETABS] + lappend imagetabs [list [lindex $tab 0] $img] + my $BID configure -IMAGETABS $imagetabs + } + my $BID configure -TABS $tabs + my $BID Refill $pos [expr {$pos ne "end"}] + lindex $tab 0 +} +#_______________________ + +method tabID {txt} { +# Gets TID by tab's label. +# txt - label +# Returns TID or -1. + + set BID [my ID] + if {[catch {set ellipse [my $BID cget -ELLIPSE]}]} {return {}} + if {[string first $ellipse $txt]>0} { + set pattern [string map [list $ellipse "*"] $txt] + } else { + set pattern {} + } + foreach tab [my $BID listTab] { + lassign $tab tID ttxt + if {$txt eq $ttxt} {return $tID} + if {$pattern ne {} && [string match $pattern $ttxt]} {return $tID} + } + return {} +} +#_______________________ + +method popList {{X ""} {Y ""} {sortedList 0}} { +# Shows a menu of tabs. +# X - x coordinate of mouse pointer +# Y - y coordinate of mouse pointer +# sortedList - flag "sorted list" + + set BID [my ID] + my $BID DestroyMoveWindow + lassign [my $BID cget -wbar -title] wbar title + set popi $wbar.popupList + catch {destroy $popi} + menu $popi -tearoff 1 -title $title + if {[set plist [my $BID FillMenuList $BID $popi -1 {} $sortedList]] eq "s"} { + destroy $popi + } else { + my Bar_MenuList $BID -1 $popi $plist + if {$X eq {}} {lassign [winfo pointerxy .] X Y} + tk_popup $popi $X $Y + } +} +#_______________________ + +method remove {} { +# Removes a bar. +# Returns "yes" at success. + + set BID [my ID] + variable btData + if {[dict exists $btData $BID]} { + catch {bind [my $BID cget -wbase] {}} + lassign [my $BID cget -BINDWBASE] wb bnd + if {$wb ne {}} {bind $wb $bnd} + set bar [dict get $btData $BID] + foreach tab [dict get $bar -TABS] {my Tab_RemoveLinks $BID [lindex $tab 0]} + catch {destroy {*}[dict get $bar -WWID]} + catch {destroy [my $BID cget -UNDERWID]} + if {[set bc [my $BID cget -BARCOM]] ne {}} {catch {rename $bc {}}} + foreach tc [my $BID cget -TABCOM] {catch {rename [lindex $tc 1] {}}} + dict unset btData $BID + return yes + } + return no +} +#_______________________ + +method moveTab {TID pos} { + # Moves a tab to a new position in the bar. + # pos - the new position + + set BID [my ID] + set tabs [my $BID cget -TABS] + if {[set i [lsearch -index 0 $tabs $TID]]>-1} { + set tab [lindex $tabs $i] + set tabs [lreplace $tabs $i $i] + my $BID configure -TABS [linsert $tabs $pos $tab] + } +} +#_______________________ + +method checkDisabledMenu {BID TID func} { +# Checks whether the popup menu's items are disabled. +# func - close function +# *func* equals to: +# 1 - for "Close All" +# 2 - for "Close All at Left" +# 3 - for "Close All at Right" +# Returns "yes" if the menu's item is disabled. + + lassign [my Mc_MenuItems] list behind close closeall closeleft closeright + switch $func { + 1 {set item $closeall} + 2 {set item $closeleft} + 3 {set item $closeright} + default {set item $close} + } + my CheckDsblPopup $BID $TID $item +} +#_______________________ + +method closeAll {BID TID func args} { +# Closes tabs of bar. +# func - close function +# *func* equals to: +# 1 - for "Close All" +# 2 - for "Close All at Left" +# 3 - for "Close All at Right" + + switch $func { + 1 {my $BID Tab_CloseFew -1 no {*}$args} + 2 {my $BID Tab_CloseFew $TID yes} + 3 {my $BID Tab_CloseFew $TID no} + } +} +#_______________________ + +method bindToEvent {w event args} { + # Binds an event on a widget to a command. + # w - the widget's path + # event - the event + # args - the command + + if {[string first $args [bind $w $event]]<0} { + bind $w $event [list + {*}$args] + } +} + +## ____________ EOC Bar ____________ ## + +} + +# ________________________ Bars _________________________ # + +## ____________ Methods of Bars ____________ ## + +oo::define ::bartabs::Bars { + +variable btData + +constructor {args} { + set btData [dict create] + if {[llength [self next]]} { next {*}$args } + oo::objdefine [self] "method tab-1 {args} {return {-1}}" + lappend ::bartabs::BarsList [self] +} + +destructor { + my removeAll + unset btData + set i [lsearch -exact $::bartabs::BarsList [self]] + set ::bartabs::BarsList [lreplace $::bartabs::BarsList $i $i] + if {[llength [self next]]} next +} + +## ____________ Private methods of Bars ____________ ## + +method Bars_Method {mtd args} { +# Executes a method for all bars. +# mtd - method's name +# args - method's arguments + + foreach BID [lsort -decreasing [dict keys $btData]] {my $BID $mtd {*}$args} +} +#_______________________ + +method MarkTab {opt args} { +# Sets option of tab(s). +# opt - option +# args - list of TID + + foreach TID $args { + if {$TID ni {{} -1}} { + set BID [lindex [my Tab_BID $TID] 0] + set marktabs [my $BID cget $opt] + if {[lsearch $marktabs $TID]<0} { + lappend marktabs $TID + my $BID configure $opt $marktabs + } + } + } + my Tab_MarkBars +} +#_______________________ + +method UnmarkTab {opt args} { +# Unsets option of tab(s). +# opt - option +# args - list of TID + + if {![llength $args]} {my Bars_Method configure $opt [list]} + foreach TID $args { + if {$TID ni {{} -1}} { + set BID [lindex [my Tab_BID $TID] 0] + set marktabs [my $BID cget $opt] + if {[set i [lsearch $marktabs $TID]]>=0} { + my $BID configure $opt [lreplace $marktabs $i $i] + } + } + } + my Tab_MarkBars +} +#_______________________ + +method TtkTheme {} { + # Checks if a standard ttk theme is used. + + expr {[ttk::style theme use] in {clam alt classic default awdark awlight}} +} + +## ____________ Public methods of Bars ____________ ## + +method create {barCom {barOpts ""} {tab1 ""}} { +# Creates a bar. +# barCom - bar command's name or barOpts +# barOpts - list of bar's options +# tab1 - tab to show after creating the bar +# Returns BID. + + if {[set noComm [expr {$barOpts eq {}}]]} {set barOpts $barCom} + set w [dict get $barOpts -wbar] ;# parent window + set wframe $w.frame ;# frame + set wlarr $w.larr ;# left arrow + set wrarr $w.rarr ;# right arrow + lappend barOpts -WWID [list $wframe $wlarr $wrarr] + my My [set BID [my Bar_Data $barOpts]] + my $BID InitColors + set bgm [my $BID cget -BGMAIN] + if {[my TtkTheme]} { + ttk::button $wlarr -style ClButton$BID -image bts_ImgLeft \ + -command [list [self] $BID scrollLeft] -takefocus 0 + ttk::button $wrarr -style ClButton$BID -image bts_ImgRight \ + -command [list [self] $BID scrollRight] -takefocus 0 + } else { + button $wlarr -image bts_ImgLeft -borderwidth 0 -highlightthickness 0 \ + -command [list [self] $BID scrollLeft] -takefocus 0 -background $bgm + button $wrarr -image bts_ImgRight -borderwidth 0 -highlightthickness 0 \ + -command [list [self] $BID scrollRight] -takefocus 0 -background $bgm + } + if {$bgm eq {}} {set style {}} {set style "-background $bgm"} + frame $wframe -relief flat {*}$style + pack $wlarr -side left -padx 0 -pady 0 -anchor e + pack $wframe -after $wlarr -side left -padx 0 -pady 0 -fill x -expand 1 + pack $wrarr -after $wframe -side right -padx 0 -pady 0 -anchor w + if {[my $BID cget -separator]} { + if {![winfo exists $w.under]} { + ttk::separator $w.under -orient horizontal + my $BID configure -UNDERWID $w.under + } + pack $w.under -before $wlarr -side bottom -fill x -expand 1 -padx 0 -pady 2 + } + foreach w {wlarr wrarr} { + bind [set $w] "[self] $BID popList %X %Y" + } + set wbase [my $BID cget -wbase] + if {$wbase ne {}} { + after 1 [list \ + my $BID configure -BINDWBASE [list $wbase [bind $wbase ]] ; \ + my $BID bindToEvent $wbase [self] _runBound_ $wbase $BID NeedDraw] + } + if {!$noComm} { + ; proc $barCom {args} "return \[[self] $BID {*}\$args\]" + my $BID configure -BARCOM $barCom + } + if {$tab1 eq {}} { + after 50 [list [self] $BID NeedDraw ; [self] $BID draw] + } else { + set tab1 [my $BID tabID $tab1] + if {$tab1 ne {}} {after 100 "[self] $BID clear; [self] $BID $tab1 show yes"} + } + return $BID +} +#_______________________ + +method updateAll {} { +# Updates all bars in hard way. + + my Bars_Method Refill 0 yes +} +#_______________________ + +method drawAll {{upd yes}} { +# Redraws all bars. +# upd - if "yes", run "update" before redrawing + + if {$upd} update + my Bars_Method draw no +} +#_______________________ + +method removeAll {} { +# Removes all bars. + + my Bars_Method remove +} +#_______________________ + +method markTab {args} { +# Marks tab(s). +# args - list of TID + + my MarkTab -mark {*}$args +} +#_______________________ + +method unmarkTab {args} { +# Unmarks tab(s). +# args - list of TID or {} + + my UnmarkTab -mark {*}$args +} +#_______________________ + +method onSelectCmd {args} { + # Runs a command (set by "-csel3") on a list of tabs. + # args - list of TID + + foreach TID $args { + if {$TID ni {{} -1}} { + set BID [lindex [my Tab_BID $TID] 0] + my $BID Bar_Cmd2 -csel3 $TID ;# command after the action + } + } +} +#_______________________ + +method selectTab {args} { +# Selects tab(s). +# args - list of TID + + my MarkTab -select {*}$args + my onSelectCmd {*}$args +} +#_______________________ + +method unselectTab {args} { +# Unselects tab(s). +# args - list of TID or {} + + my UnmarkTab -select {*}$args + my onSelectCmd {*}$args +} +#_______________________ + +method enableTab {args} { +# Enables tab(s). +# args - list of TID or {} + + my UnmarkTab -disable {*}$args +} +#_______________________ + +method disableTab {args} { +# Disables tab(s). +# args - list of TID + + my MarkTab -disable {*}$args +} +#_______________________ + +method isTab {TID} { +# Checks if a tab exists. +# TID - tab ID +# Returns true if the tab exists. + + expr {[my Tab_BID $TID check] ne {}} +} +#_______________________ + +method MoveTab {TID1 TID2} { +# Changes a tab's position in bar. +# TID1 - TID of the moved tab +# TID2 - TID of a tab to move TID1 behind +# TID1 and TID2 must be of the same bar. + + lassign [my Tab_BID $TID1] BID1 i1 + lassign [my Tab_BID $TID2] BID2 i2 + if {$i1!=$i2 && $BID1 eq $BID2} { + set tabs [my $BID1 cget -TABS] + set tab [lindex $tabs $i1] + set tabs [lreplace $tabs $i1 $i1] + set i [expr {$i1>$i2?($i2+1):$i2}] + my $BID1 configure -TABS [linsert $tabs $i $tab] + # let a neighbor be shown if possible + set TID [lindex $tabs $i1 0] + if {[catch {my $TID show yes}]} { + my $TID1 show yes ;# old way: show 1st moved tab + } + } +} + +#_______________________ + +method moveSelTab {TID1 TID2} { +# Changes a tab's or selected tabs' position in bar. +# TID1 - TID of the moved tab +# TID2 - TID of a tab to move TID1 behind +# TID1 and TID2 must be of the same bar. + + if {[my $TID1 Tab_Cmd -cmov] ni {"1" "yes" "true"}} return ;# chosen to not move + set BID [my Tab_BID $TID1 check] + # -lifo option prevents moving, so it has to be temporarily disabled + set lifo [my $BID cget -lifo] + my $BID configure -lifo no + set seltabs [my $BID listFlag "s"] + if {[set i [llength $seltabs]]>1} { + for {incr i -1} {$i>=0} {incr i -1} { + set tid [lindex $seltabs $i] + if {$tid ne $TID2} {my MoveTab $tid $TID2} + } + my $BID Bar_Cmd2 -cmov3 + } else { + my MoveTab $TID1 $TID2 + my $BID Bar_Cmd2 -cmov3 $TID1 ;# command after the action + } + my $BID configure -lifo $lifo ;# restore -lifo option +} + +## ____________ EOC Bars ____________ ## + +} + +# ________________________________ EOF __________________________________ # diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/bartabs/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/bartabs/pkgIndex.tcl new file mode 100644 index 00000000..05bc0469 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/bartabs/pkgIndex.tcl @@ -0,0 +1,138 @@ + +package ifneeded bartabs 1.6.9 [list source [file join $dir bartabs.tcl]] + +# short intro (for Ruff! docs generator) + +namespace eval bartabs { + + set _ruff_preamble { +## What's that + +The *bartabs* Tcl/Tk package provides a bar widget containing tabs that are + + - scrollable + - markable + - moveable + - closeable + - disabled and enabled + - static and changeable + - selectable and multi-selectable + - configureable + - enhanceable with popup menu + +The *bartabs* defines three TclOO classes: + - *Tab* deals with tabs + - *Bar* deals with a bar of tabs + - *Bars* deals with bars of tabs + +However, only the *Bars* class is used to create bars along with tabs. It can be also used to deal with any bars and tabs, providing all necessary interface. + +The *Bar* does not create a real TclOO object, rather it provides *syntax sugar* for a convenient access to the bar methods. + +The *Tab* does not create a real TclOO object as well. It serves actually for structuring *bartabs* code as for tab methods. Thus, its methods are accessible through the *Bars* ("real" TclOO) and *Bar* ("sugar") objects. + +## Work flow + +A common work flow with *bartabs* looks like this: + +Firstly, we create a *Bars* object, e.g. + + `bartabs::Bars create NS::bars` + +Then we create a *Bar* object, e.g. + + `NS::bars create NS::bar $barOptions` + +If a tab of the bar should be displayed (with its possible contents), we show the bar and select the current tab: + + `set TID [NS::bar tabID "tab label"] ;# get the tab's ID by its label` + + `NS::bar $TID show ;# show the bar and select the tab` + +or just draw the bar without mind-breaking about a tab: + + `NS::bar draw ;# show the bar without selecting a tab` + +The rest actions include: + + - responses to a selection of tab (through `-csel command` option of *Bar* object) + - responses to a deletion of tab (through `-cdel command` option of *Bar* object) + - responses to a reorganization of bar (through `-cmov command` option of *Bar* object) + - inserting and renaming tabs + - disabling and enabling tabs + - marking tabs with colors or icons + - processing the marked tabs + - processing multiple tabs selected with Ctrl+click + - scrolling tabs to left/right through key bindings + - calling other handlers through key bindings and *bartabs* menu + - using `cget` and `configure` methods to change the bar/tab appearance + - redrawing bars at some events + - removing and creating as much bars as required + +## Tab class + +The methods of *Tab* class are called from *Bars* or *Bar* object + and are passed: *tab ID (TID), method name, arguments*. Syntax: + +`OBJECT TID method arguments` + +For example: `NS::bars $TID close` or `NS::bar $TID show false` + +## Bar class + +The methods of *Bar* class are called from *Bar* object or (more wordy) from *Bars* object. Syntax: + +`BAR_OBJECT method arguments` + +`BARS_OBJECT BID method arguments` + +For example: `NS::bar popList $X $Y` or `NS::bars $BID popList $X $Y` + +## Bars class + +The methods of *Bars* class need no TID nor BID, though not protesting them passed before method name. Syntax: + +`BARS_OBJECT method arguments` + +For example: + +`NS::bars drawAll ;# good boy` + +`NS::bars tab11 drawAll ;# bad boy uses the useless tab11 (TID)` + +`NS::bars bar1 drawAll ;# bad boy's BID is useless as well` + +## Virtual methods + +There are three "virtual" methods: + +* `NS::bar create NS::tab $label` creates a tab object *NS::tab* for a tab labeled $label to access the tab methods, e.g. `NS::tab show` + +* `NS::tab cget $option` gets an option of tab, e.g. `NS::tab cget -text` + +* `NS::tab configure $option $value` sets an option of tab, e.g. `NS::tab configure -text "new label"` + +## BID and TID + +Few words about *BID* and *TID* mentioned throughout the *bartabs*. + +These are identifiers of bars and tabs, of form `bar` and `tab` where `` is integer increased from 0 in order of bar/tab creation. The bars and the tabs of all bars have unique IDs. + +You can use these literals freely, along with BIDs and TIDs gotten from *bartabs* methods. For example, if you know that "some tab" was created third, you can show it straightforward: + + `NS::bar tab2 show ;# show the 3rd tab (TID=tab2)` + +instead of + + `NS::bar [NS::bar tabID "some tab"] show ;# find and show the tab by its name` + +## Links + +[Documentation](https://aplsimple.github.io/en/tcl/bartabs) + +[Reference on bartabs](https://aplsimple.github.io/en/tcl/bartabs/bartabs.html) + +[Reference on baltip](https://aplsimple.github.io/en/tcl/baltip/baltip.html) (package used by *bartabs*) + } + +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/README.md b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/README.md new file mode 100644 index 00000000..a3346a52 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/README.md @@ -0,0 +1,192 @@ +# hl_tcl + +The *hl_tcl* package is a syntax highlighter for Tcl/Tk code. + +It can be applied to a *Tk text* widget or to a static html page. + +The *Tk text* widget may be made read-only or editable. Also, the *hl_tcl* may take an argument, sort of command to watch the viewing / editing. + +When applied to html pages, the *hl_tcl* highlights Tcl/Tk code snippets embedded between <code> </code> tags. + +The *hl_tcl* has highlighted its own code in [Reference](https://aplsimple.github.io/en/tcl/hl_tcl/hl_tcl.html). + +# Some of blah-blah + +The Tcl being incredibly dynamic language sets a lot of problems before any Tcl syntax highlighter. Probably, the usage of quotes and esp. the strings spanning several lines are the main challenges. + +Below is a line that brings most (not *hl_tcl*, as seen in [Reference](https://aplsimple.github.io/en/tcl/hl_tcl/hl_tcl.html)) of Tcl highlighters in a stupor: + + if {[set i [string first {"} $line $i]]==-1} {return no} + +... as well as this one: + + regsub -all {(([^A-Z@]|\\@)[.?!]("|'|'')?([])])?) } $fieldText {\1 } fieldText + +Good luck for a highlighter when the second line (or similar) follows the first, giving it a matching quote and thus bringing it out of the stupor. + +Those orphan quotes are often used in `regexp` and `regsub` Tcl commands, so that when a honest Tcl highlighter (like Geany) stumbles upon an orphan quote, it tries its best to highlight the rest of code as a string, till the next unmatched quote. + +Thus, we have + + + +... instead of + + + +There are "tricky" highlighters (like Gedit) that behave more wisely at the stumbling an orphan quote: they permit only a one-line Tcl strings (if not continued with \\), so that the string highlighting would be most likely finished in the same line it started. No problems except for this silly line. And no delays due to the highlighting the rest of code... + +... as seen in: + + + +# Some of editors + +Geany. Probably, the best Tcl highlighter. And the great programming tool at that. Still, it has few drawbacks: + + * doesn't highlight the above mentioned Tcl lines properly + * doesn't highlight `${var}` in contrast with `$var` + * tries to highlight any (even hexidecimal) number it encounters, thus `set a 1fix` or `set b #abxxx` looks a bit peculiar + * `set c {{#000} #FFF}` is quite a legal Tcl command as well as `set c {#000 #FFF}`, not for Geany + * no highlighting TclOO (`method`, `my`, `mixin` etc.) + +Vim. Probably, the fastest Tcl highlighter. Great and awful. Nonetheless: + + * tricky with those above mentioned Tcl lines + * doesn't highlight ttk commands (Tk only) and TclOO + * tries to highlight every bit of Tcl, e.g. `set set set` is highlighted as three `set` commands ;) + * as a result, much more florid than most of others + +Kate. As nearly good as Geany. As nearly florid as Vim (`set set set`). Doesn't highlight ttk and TclOO. + +TKE. Written in Tcl/Tk, it might be the best of all to highlight the Tcl/Tk. In spite of its suspended state it still can. Issues with highlighting strings and the performance. + +Pluma and Gedit seem to use the same Tcl highlighting engine that gives rather good results. Still, the mentioned above drawbacks are here too. And no highlighting of tk, ttk, TclOO. + +Notepad++. Very fast Tcl highlighter. And very basic. All the same drawbacks. No highlighting of tk, ttk, TclOO. *Plus* an obsolete version of Tcl, i.e. no highlighting `lset`, `lassign` etc. + +# What can we do? + +To develop an ideal (correct and fast) Tcl/Tk highlighter, we would have to dive into Tcl core. Though, no hopes to achieve the ideal through repeating the core in Tcl/Tk or massively using the regular expressions. + +That said, while implementing Tcl/Tk highlighter *in pure Tcl/Tk*, we might hope to achieve a reasonable compromise between the performance and the elimination of blunders. + +It seems *hl_tcl* got close to this compromise. Specifically, it provides: + + * special highlighting for Tcl and TclOO commands + * special highlighting for Tk and ttk commands + * allowing additional commands to highlight (as Tk ones) + * special highlighting for declarations `proc`, `method`, `oo::class` etc. as well as `return`, `yield` + * special highlighting for `#comments`, `$variables`, `"strings"`, `-options` + * in-line comments being recognized and thus highlighted only after `;#` + * proper handling of most `regexp` and `regsub` expressions containing a quote + * highlighting the multi-line strings, with possible switching this mode off (a-la Gedit) to improve the performance + * customizing colors of the highlighting + * highlighting viewable/editable *Tk text* widget and static html pages + * good performance at editing 1000-4000 LOC and rather acceptable for 4000-9000 LOC + * even monstrous 10000 LOC and more are handled fast at the "tricky" mode a-la Gedit + +The *hl_tcl* doesn't provide the following: + + * highlighting *numbers* + * highlighting *brackets*, except for matched ones and inside the strings + +These are in no way critical drawbacks. A little less florid Tcl code might be even preferable for other tastes. + +The Tcl can arrange its pitfalls for *hl_tcl* (I know where). Also, tricky practices or tastes can make a fool of *hl_tcl*. Still hopefully these pranks are few and rare to encounter. + +# Use for text widget + +The code below: + + package require hl_tcl + + proc ::stub {args} {puts "stub: $args"} + + ::hl_tcl::hl_init $::txt -readonly yes -cmd ::stub + + #... inserting a text into the text widget + + ::hl_tcl::hl_text $::txt + +sets an example of *hl_tcl* usage. Here are the details: + + * *::stub* is a procedure to watch the text editing; here it simply puts out the text's last index; + + * *hl_init* is called *before* filling the text widget with a Tcl code; it sets the highlighting options and disables the highlighting till *hl_text* runs; + + * *hl_text* runs to highlight the Tcl code of the text widget and to view/edit it. + +The *hl_init* takes arguments: + + * *txt* is the text widget's path + * *args* contains options of text widget (omittable) + +The *args* is a list of `-option "value"` where `-option` may be: + + * `-colors` - list of colors: clrCOM, clrCOMTK, clrSTR, clrVAR, clrCMN, clrPROC, clrOPT + * `-dark` - flag "dark background of text", i.e. simplified `-colors` (default "no") + * `-font` - attributes of text font + * `-readonly` - flag "text is read-only" (default "no") + * `-multiline` - flag "multi-line strings" (default "yes") + * `-cmd` - command to watch editing/viewing (default "") + * `-cmdpos` - command to watch cursor positioning (default "") + * `-seen` - number of first lines seen at start (default 500) + * `-optRE` - flag "use a regular expression to highlight options" (default "yes") + * `-keywords` - additional commands to highlight (as Tk ones) + * `-dobind` - if `true`, forces keys binding at repeating calls of hl_init + * `-plaintext` - `true` for plain texts with no highlighting + * `-plaincom` - a command for plain highlighting line by line + +**Note**: `-seen 500` and `-multiline no` can improve the performance a lot. It's recommended to use `-seen 500` (or any other reasonable limit, e.g. `-seen 200`) at any rate, except for static html pages. + +A command for `-plaincom` option has two arguments: a current text's path and a current line's number. It should highlight the current line and return `true`, otherwise (if the current line is Tcl code) it returns `false`. An example of its usage is presented by [alited editor](https://github.com/aplsimple/alited) (**lib/addon** directory). + +The rest of *hl_tcl* procedures are: + + * `hl_all` updates all highlighted existing text widgets, e.g. at changing a color scheme of application + * `hl_readonly` gets/sets a read-only mode and/or a command to watch a text widget at viewing/editing it + * `hl_colors` gets a list of colors for highlighting + +See details in [Reference](https://aplsimple.github.io/en/tcl/hl_tcl/hl_tcl.html). + + +# Use for static html + +In the [hl_tcl.zip](https://chiselapp.com/user/aplsimple/repository/hl_tcl/download), there is a Tcl script named *tcl_html.tcl* that highlights Tcl snippets of static html page(s). + +It runs as follows: + + tclsh tcl_html.tcl "glob-pattern-of-html-files" + +For example: + + tclsh ~/UTILS/hl_tcl/tcl_html.tcl "~/UTILS/mulster/tasks/ruff/src/*" + +In this example, the html files are located in `~/UTILS/mulster/tasks/ruff/src`. + +Perhaps, you would want to modify the *tcl_html.tcl*, this way: + + * replace `"no"` with `"yes"` for dark html pages + + * replace `` with html tags *starting* the Tcl code in your html files + + * replace `` with html tags *finishing* the Tcl code in your html files + +These are arguments of `::hl_tcl_html::highlight` procedure. + +The tag pairs can be multiple if the html pages contain them, e.g. + + ::hl_tcl_html::highlight $fhtml "no" \ + {} {} \ + {
} {
} + +# Links + + * [Reference](https://aplsimple.github.io/en/tcl/hl_tcl/hl_tcl.html) + + * [Source](https://chiselapp.com/user/aplsimple/repository/hl_tcl/download) (hl_tcl.zip) + + * [Demo of hl_tcl v0.6.1](https://github.com/aplsimple/hl_tcl/releases/download/hl_tcl-0.6.1/hl_tcl-0.6.1.mp4) (25 Mb) + +Note that [hl_tcl](https://aplsimple.github.io/en/tcl/hl_tcl/hl_tcl.html) is still disposed to update. diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/hl_c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/hl_c.tcl new file mode 100644 index 00000000..6cecacc7 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/hl_c.tcl @@ -0,0 +1,759 @@ +########################################################### +# Name: hl_c.tcl +# Author: Alex Plotnikov (aplsimple@gmail.com) +# Date: 06/16/2021 +# Brief: Handles highlighting C code. +# License: MIT. +########################################################### + +# ______________________ Common data ____________________ # + +namespace eval ::hl_c { + + namespace eval my { + + variable data; array set data [list] + + # C reserved words + set data(PROC_C) [lsort [list goto return]] + set data(CMD_C1) [list \ + auto break case char const continue default do double else enum extern \ + float for if inline int long register restrict short signed sizeof \ + static struct switch typedef union unsigned void volatile while \ + ] + # other C token + set data(CMD_C2) [list \ + ifdef endif \ + ] + set data(CMD_C) [lsort [concat $data(CMD_C1) $data(CMD_C2)]] + + # C++ reserved words + set data(CMD_CPP1) [list \ + and and_eq asm bitand bitor bool catch class compl const_cast delete \ + dynamic_cast explicit false friend inline mutable namespace new \ + not not_eq operator or or_eq private public protected \ + reinterpret_cast static_cast template this throw true try typeid \ + typename using virtual wchar_t xor xor_eq \ + ] + + # C++ predefined identifiers + set data(CMD_CPP2) [list \ + cin cout endl include INT_MAX INT_MIN iomanip iostream main MAX_RAND \ + npos NULL std string FALSE TRUE \ + ] + + # C++ united + set data(CMD_CPP) [lsort [concat $data(CMD_CPP1) $data(CMD_CPP2)]] + + # regexp for key words and punctuation + set data(RE0) {\w+} + set data(RE1) {[<>(){};=!%&^*+-.,\|:/\\#]+} + + # characters of multiline comment, string and char and their counterparts + set data(PAIR1) [list /* \" ' //] + set data(PAIR2) [list */ \" '] + set data(PAIR_COMMENT) 0 ;# indices for multiline comment/ string/ char + set data(PAIR_STRING) 1 + set data(PAIR_CHAR) 2 + set data(PAIR_COMMENT1) 3 + } +} + +# _________________________ STATIC highlighting _________________________ # + +proc ::hl_c::my::HighlightCmd {txt line ln pri i} { + # Highlights C commands. + # txt - text widget's path + # line - line to be highlighted + # ln - line number + # pri - column number to highlighted from + # i - current position in 'line' + + variable data + $txt tag add tagSTD "$ln.$pri" "$ln.$i" + set st [string range $line $pri $i] + set lcom [regexp -inline -all -indices $data(RE0) $st] + foreach lc $lcom { + lassign $lc i1 i2 + set word [string range $st $i1 $i2] + if {$word in $data(CMD_C)} { + $txt tag add tagCOM "$ln.$pri +$i1 char" "$ln.$pri +[incr i2] char" + } elseif {$word in $data(PROC_C)} { + $txt tag add tagPROC "$ln.$pri +$i1 char" "$ln.$pri +[incr i2] char" + } elseif {$word in $data(CMD_CPP)} { + $txt tag add tagCOMTK "$ln.$pri +$i1 char" "$ln.$pri +[incr i2] char" + } elseif {$word in $data(KEYWORDS,$txt)} { + $txt tag add tagOPT "$ln.$pri +$i1 char" "$ln.$pri +[incr i2] char" + } + } + set lcom [regexp -inline -all -indices $data(RE1) $st] + foreach lc $lcom { + lassign $lc i1 i2 + $txt tag add tagVAR "$ln.$pri +$i1 char" "$ln.$pri +[incr i2] char" + } +} +#_______________________ + +proc ::hl_c::my::HighlightLine {txt ln currQtd} { + # Highlightes a line in text. + # txt - text widget's path + # ln - line's number + # currQtd - 0, 1 or 2 referring to comment/string/char + # Returns currQtd for the end of the line. + + variable data + set line [$txt get $ln.0 $ln.end] + set i1 [set i0 0] + set i2 [set llen [string length $line]] + while {$i1<$llen} { + if {$currQtd>-1} { + # if quoted then there follows a multiline comment or a string/char + # => find its pair + if {$currQtd==$data(PAIR_COMMENT)} { + set tag tagCMN ;# comment + } else { + set tag tagSTR ;# string/char + } + set ch [lindex $data(PAIR2) $currQtd] + set i2 [string first $ch $line $i1] + while {$i2!=-1} { + if {[::hl_tcl::my::NotEscaped $line $i2]} break + set i2 [string first $ch $line $i2+1] + } + if {$i2==-1} { + # a pair not found - the comment/string/char is not ended + if {$currQtd!=$data(PAIR_COMMENT) && \ + ($currQtd==$data(PAIR_CHAR) || [string index $line end] ne "\\")} { + set currQtd -1 ;# char or string not ended properly + } + $txt tag add $tag $ln.$i0 $ln.end + return $currQtd + } + # the pair found - highlight an appropriate part of the line + set lp [string length [lindex $data(PAIR2) $currQtd]] + $txt tag add $tag $ln.[incr i1 -$lp] $ln.[incr i2 $lp] + set i1 $i2 + set currQtd -1 + continue + } + # not quoted - find a nearest "quote" (comment/string/char) + set i0 $llen + set i 0 + foreach par $data(PAIR1) { + if {[set p [string first $par $line $i1]]>-1 && $p<$i0 && [::hl_tcl::my::NotEscaped $line $p]} { + set i0 $p + set ip $i + } + incr i + } + if {$i0<$llen} { + HighlightCmd $txt $line $ln $i1 [expr {$i0-1}] + # a comment/string/char was found + if {$ip==$data(PAIR_COMMENT1)} { + if {[regexp -start $i0 {\s*//\s*(!|TODO)} $line]} { + $txt tag add tagCMN2 $ln.$i0 $ln.end + } else { + $txt tag add tagCMN1 $ln.$i0 $ln.end + } + return -1 ;# it was a one-line comment + } + set currQtd $ip + set lp [string length [lindex $data(PAIR2) $currQtd]] + set i1 [expr {$i0+$lp}] + if {$i1>=($llen-1)} { + if {$currQtd==$data(PAIR_COMMENT)} { + set tag tagCMN ;# comment + } else { + set tag tagSTR ;# string/char + } + $txt tag add $tag $ln.$i0 $ln.end + } + continue + } + HighlightCmd $txt $line $ln $i1 [expr {$llen-1}] + set currQtd -1 + break + } + return $currQtd +} +#_______________________ + +proc ::hl_c::my::HighlightAll {txt} { + # Highlights all of a text. + # txt - text widget's path + # Makes a coroutine from this. + # See also: CoroHighlightAll + + # let them work one by one: + set coroNo [expr {[incr ::hl_c::my::data(CORALL)] % 10000000}] + coroutine co_HlAll$coroNo ::hl_c::my::CoroHighlightAll $txt +} +#_______________________ + +proc ::hl_c::my::CoroHighlightAll {txt} { + # Highlights all of a text as a coroutine. + # txt - text widget's path + # See also: HighlightAll + + variable data + catch { ;# $txt may be destroyed, so catch this + if {!$data(PLAINTEXT,$txt)} { + set tlen [lindex [split [$txt index end] .] 0] + RemoveTags $txt 1.0 end + set maxl [expr {min($::hl_c::my::data(SEEN,$txt),$tlen)}] + set maxl [expr {min($::hl_c::my::data(SEEN,$txt),$tlen)}] + set currQtd -1 + for {set ln [set lnseen 0]} {$ln<=$tlen} {} { + set currQtd [HighlightLine $txt $ln $currQtd] + incr ln + if {[incr lnseen]>$::hl_c::my::data(SEEN,$txt)} { + set lnseen 0 + after idle after 1 [info coroutine] + yield + } + } + } + } + set ::hl_c::my::data(REG_TXT,$txt) {1} + return +} + +# _________________________ DYNAMIC highlighting ________________________ # + +proc ::hl_c::my::RemoveTags {txt from to} { + # Removes tags in text. + # txt - text widget's path + # from - starting index + # to - ending index + + foreach tag {tagCOM tagCOMTK tagSTR tagVAR tagCMN tagCMN1 tagCMN2 tagPROC tagOPT} { + $txt tag remove $tag $from $to + } +} +#_______________________ + +proc ::hl_c::my::CountQSH {txt ln} { + # Counts quotes, slashes, comments in a line + # txt - text widget's path + # ln - line's index + + set ln [expr {int($ln)}] + set st [$txt get $ln.0 $ln.end] + set quotes 0 + foreach spch {"\"" '} { + incr quotes [::hl_tcl::my::CountChar $st $spch] + } + set slashes [::hl_tcl::my::CountChar $st "\\"] + set comments 0 + foreach spch {/ *} { + incr comments [::hl_tcl::my::CountChar $st $spch] + } + list $quotes $slashes $comments +} +#_______________________ + +proc ::hl_c::my::MemPos1 {txt {donorm yes} {K ""} {s ""}} { + # Checks and sets the cursor's width, depending on its position. + # txt - text widget's path + # donorm - if yes, forces "normal" cursor + # K - key (%K of bind) + # s - state (%s of bind) + # This fixes an issue with text cursor: less width at 0th column. + + variable data + if {$K eq "Home" && [string is digit -strict $s] && \ + [expr {$s & 4}]==0 && [expr {$s & 1}]==0} { + # Ctrl-Home & Shift-Home are passed + set p1 [$txt index insert] + set line [$txt get "$p1 linestart" "$p1 lineend"] + set p [expr {[string length $line]-[string length [string trimleft $line]]}] + set p2 [expr {int($p1)}].$p + if {$p && $p2 ne $p1} { + after idle "::tk::TextSetCursor $txt $p2" + return + } + } + if {$data(INSERTWIDTH,$txt)==1} { + if {[$txt cget -insertwidth]!=1} {$txt configure -insertwidth 1} + return 0 + } + set insLC [$txt index insert] + lassign [split $insLC .] L C + if {$data(_INSPOS_,$txt) eq ""} { + set L2 [set C2 0] + } else { + lassign [split $data(_INSPOS_,$txt) .] L2 C2 + } + if {$L!=$L2 || $C==0 || $C2==0} { + if {$C || $donorm} { + $txt configure -insertwidth $data(INSERTWIDTH,$txt) + } else { + $txt configure -insertwidth [expr {$data(INSERTWIDTH,$txt)*2-1}] + } + } + return $insLC +} + +proc ::hl_c::my::MemPos {txt {doit no}} { + # Remembers the state of current line. + # txt - text widget's path + # doit - argument for ShowCurrentLine + # See also: ShowCurrentLine + + variable data + set data(_INSPOS_,$txt) [MemPos1 $txt no] + set ln [ShowCurrentLine $txt $doit] + set data(CURPOS,$txt) $ln + set data(CUR_LEN,$txt) [$txt index {end -1 char}] + lassign [CountQSH $txt $ln] \ + data(CNT_QUOTE,$txt) data(CNT_SLASH,$txt) data(CNT_COMMENT,$txt) + if {[$txt tag ranges tagBRACKET] ne {}} {$txt tag remove tagBRACKET 1.0 end} + if {[$txt tag ranges tagBRACKETERR] ne {}} {$txt tag remove tagBRACKETERR 1.0 end} + if {[set cmd $data(CMDPOS,$txt)] ne {}} { + # run a command after changing position (with the state as arguments) + append cmd " $txt $data(CUR_LEN,$txt) $ln $data(CNT_QUOTE,$txt) \ + $data(CNT_SLASH,$txt) $data(CNT_COMMENT,$txt)" + catch {after cancel $data(CMDATFER,$txt)} + set data(CMDATFER,$txt) [after idle $cmd] + } +} +#_______________________ + +proc ::hl_c::my::Modified {txt oper pos1 args} { + # Handles modifications of text. + # txt - text widget's path + # Makes a coroutine from this. + # See also: CoroModified + + variable data + set ar2 [lindex $args 0] + set posins [$txt index insert] + if {[catch {set pos1 [set pos2 [$txt index $pos1]]}]} { + set pos1 [set pos2 $posins] + } + switch $oper { + insert { + set pos2 [expr {$pos1 + [llength [split $ar2 \n]]}] + } + delete { + if {$ar2 eq {} || [catch {set pos2 [$txt index $ar2]}]} { + set pos2 $posins + } + } + } + after idle "::hl_c::my::CoroRun $txt $pos1 $pos2 $args" +} +#_______________________ + +proc ::hl_c::my::CoroRun {txt pos1 pos2 args} { + + variable data + if {![info exist data(REG_TXT,$txt)] || $data(REG_TXT,$txt) eq {} || \ + ![info exist data(CUR_LEN,$txt)]} { + return ;# skip changes till the highlighting done + } + # let them work one by one + set i1 [expr {int($pos1)}] + set i2 [expr {int($pos2)}] + set coroNo [expr {[incr ::hl_c::my::data(CORMOD)] % 10000000}] + coroutine CoModified$coroNo ::hl_c::my::CoroModified $txt $i1 $i2 {*}$args +} +#_______________________ + +proc ::hl_c::my::CoroModified {txt {i1 -1} {i2 -1} args} { + # Handles modifications of text. + # txt - text widget's path + # See also: Modified + + catch { + variable data + # current line: + set ln [expr {int([$txt index insert])}] + # ending line: + set endl [expr {int([$txt index {end -1 char}])}] + # range of change: + if {$i1!=-1} { + set dl [expr {abs($i2-$i1)}] + set ln $i1 + } else { + set dl [expr {abs(int($data(CUR_LEN,$txt)) - $endl)}] + } + # begin and end of changes: + set ln1 [set lno1 [expr {max(($ln-$dl),1)}]] + set ln2 [set lno2 [expr {min(($ln+$dl),$endl)}]] + lassign [CountQSH $txt $ln] cntq cnts ccmnt + # flag "highlight to the end": + set bf1 [expr {abs($ln-int($data(CURPOS,$txt)))>1 || $dl>1 \ + || $cntq!=$data(CNT_QUOTE,$txt) \ + || $ccmnt!=$data(CNT_COMMENT,$txt)}] + set bf2 [expr {$cnts!=$data(CNT_SLASH,$txt)}] + if {$bf1 && !$data(MULTILINE,$txt) || $bf2} { + set lnt1 $ln + set lnt2 [expr {$ln+1}] + while {$ln2<$endl && $lnt1<$endl && $lnt2<=$endl && ( \ + [$txt get "$lnt1.end -1 char" $lnt1.end] in {\\ \"} || + [$txt get "$lnt2.end -1 char" $lnt2.end] in {\\ \"}) || $bf2} { + incr lnt1 ;# next lines be handled too, if ended with "\\" + incr lnt2 + incr ln2 + set bf2 0 + } + } + set tSTR [$txt tag ranges tagSTR] + set tCMN [$txt tag ranges tagCMN] + if {$ln1==1} { + set currQtd -1 + } else { + set currQtd [LineState $txt $tSTR $tCMN "$ln1.0 -1 chars"] + } + if {!$data(PLAINTEXT,$txt)} { + set lnseen 0 + $txt tag add tagSTD $ln1.0 $ln2.end + while {$ln1<=$ln2} { + if {$ln1==$ln2} { + set bf2 [LineState $txt $tSTR $tCMN "$ln1.end +1 chars"] + } + RemoveTags $txt $ln1.0 $ln1.end + set currQtd [HighlightLine $txt $ln1 $currQtd] + if {$ln1==$ln2 && ($bf1 || $bf2!=$currQtd) && $data(MULTILINE,$txt)} { + set ln2 $endl ;# run to the end + } + if {[incr lnseen]>$::hl_c::my::data(SEEN,$txt)} { + set lnseen 0 + catch {after cancel $data(COROATFER,$txt)} + set data(COROATFER,$txt) [after idle after 1 [info coroutine]] + yield + } + incr ln1 + } + } + if {[set cmd $data(CMD,$txt)] ne {}} { + # run a command after changes done (its arguments are txt, ln1, ln2) + append cmd " $txt $lno1 $lno2 $args" + after idle $cmd + } + MemPos $txt + return + } +} +#_______________________ + +proc ::hl_c::my::LineState {txt tSTR tCMN l1} { + # Gets an initial state of line. + # txt - text widget's path + # tSTR - ranges of string tags + # tCMN - ranges of comment tags + # l1 - the line's index + # Returns: a flag of 'quoted' line or -1. + + set i1 [$txt index $l1] + if {[set prev [string first -1 $l1]]>-1} { + set i1 [$txt index "$i1 -1 chars"] + } + if {[::hl_tcl::my::SearchTag $tCMN [$txt index "$i1 -1 chars"]]!=-1} { + if {[$txt get "$i1 -1 chars" "$i1 +1 chars"] eq {*/}} { + return -1 + } + return 0 + } + set ch [$txt get "$i1" "$i1 +1 chars"] + if {[::hl_tcl::my::SearchTag $tSTR [$txt index "$i1 -1 chars"]]!=-1} { + if {$ch eq "\\"} {return 1} + } + return -1 +} +#_______________________ + +proc ::hl_c::my::ShowCurrentLine {txt {doit no}} { + # Shows the current line. + # txt - text widget's path + # doit - if yes, forces updating current line's background + + variable data + set pos [$txt index insert] + lassign [split $pos .] ln cn + if {[::hl_tcl::my::IsCurline $txt]} { + if {$doit || ![info exists data(CURPOS,$txt)] || int($data(CURPOS,$txt))!=$ln || $cn<2} { + $txt tag remove tagCURLINE 1.0 end + $txt tag add tagCURLINE [list $pos linestart] [list $pos lineend]+1displayindices + } + } + return $pos +} + +# _________________________ INTERFACE procedures ________________________ # + +proc ::hl_c::hl_readonly {txt {ro -1} {com2 ""}} { + # Makes the text widget be readonly or gets its 'read-only' state. + # txt - text widget's path + # ro - flag "the text widget is readonly" + # com2 - command to be called at viewing and after changes + # If 'ro' argument is omitted, returns the widget's 'read-only' state. + + if {$ro==-1} { + return [expr {[info exists ::hl_c::my::data(READONLY,$txt)] && $::hl_c::my::data(READONLY,$txt)}] + } + set ::hl_c::my::data(READONLY,$txt) $ro + if {$com2 ne {}} {set ::hl_c::my::data(CMD,$txt) $com2} + set newcom "::$txt.internal" + if {[info commands $newcom] eq ""} {rename $txt $newcom} + set com "[namespace current]::my::Modified $txt" + #if {$com2 ne ""} {append com " ; $com2"} + if {$ro} {proc ::$txt {args} " + if {!\[winfo exists $txt\]} {return 0} + switch -exact -- \[lindex \$args 0\] \{ + insert \{$com2\} + delete \{$com2\} + replace \{$com2\} + default \{ return \[eval $newcom \$args\] \} + \}" + } else {proc ::$txt {args} " + if {!\[winfo exists $txt\]} {return 0} + switch -exact -- \[lindex \$args 0\] \{ + delete \{$com {*}\$args\} + insert \{$com {*}\$args\} + replace \{$com {*}\$args\} + \} + set _res_ \[eval $newcom \$args\] + return \$_res_" + } +} +#_______________________ + +proc ::hl_c::hl_init {txt args} { + # Initializes highlighting. + # txt - text widget's path + # args - dict of options + # The 'args' options include: + # -- - means that only args' options will be initialized (defaults skipped) + # -dark - flag "the text widget has dark background" + # -readonly - flag "read-only" + # -optRE - flag "use of RE to highlight options" + # -multiline - flag "allowed multi-line strings" + # -cmd - command to watch editing/viewing + # -cmdpos - command to watch cursor positioning + # -colors - list of colors: clrCOM, clrCOMTK, clrSTR, clrVAR, clrCMN, clrPROC + # -font - attributes of font + # -seen - lines seen at start + # This procedure has to be called before writing a text in the text widget. + + if {[set setonly [expr {[lindex $args 0] eq {--}}]]} { + set args [lrange $args 1 end] + } + ::hl_tcl::iscurline $txt 1 + set ::hl_c::my::data(REG_TXT,$txt) {} ;# disables Modified at changing the text + set ::hl_c::my::data(KEYWORDS,$txt) {} + # get default options from text's ones + set defopts [list -insertwidth] + foreach defopt $defopts { + set opt [::hl_tcl::OptName $txt $defopt] + if {![info exists ::hl_c::my::data($opt)]} { + set ::hl_c::my::data($opt,DEFAULT) [$txt cget $defopt] + } + } + foreach {opt val} {-dark 0 -readonly 0 -cmd {} -cmdpos {} -optRE 1 \ + -multiline 1 -seen 500 -plaintext no -insertwidth {} -keywords {}} { + if {[dict exists $args $opt]} { + set val [dict get $args $opt] + } elseif {$setonly} { + continue ;# only those set in args are taken into account + } + set ::hl_c::my::data([::hl_tcl::OptName $txt $opt]) $val + } + # reget default options from text's ones + foreach defopt $defopts { + set opt [::hl_tcl::OptName $txt $defopt] + if {[info exists ::hl_c::my::data($opt)] && $::hl_c::my::data($opt) eq {}} { + set ::hl_c::my::data($opt) $::hl_c::my::data($opt,DEFAULT) + } + } + set ::hl_c::my::data(KEYWORDS,$txt) [lsort $::hl_c::my::data(KEYWORDS,$txt)] + if {[dict exists $args -colors]} { + set ::hl_c::my::data(COLORS,$txt) [dict get $args -colors] + set ::hl_c::my::data(SETCOLORS,$txt) 1 + } else { + if {![info exists ::hl_c::my::data(COLORS,$txt)]} { + set clrCURL {} + catch {set clrCURL [lindex [::apave::obj csGet] 16]} + if {$::hl_c::my::data(DARK,$txt)} { + if {$clrCURL eq {}} {set clrCURL #29383c} + set ::hl_c::my::data(COLORS,$txt) [list {*}[hl_colors $txt] $clrCURL] + } else { + if {$clrCURL eq {}} {set clrCURL #efe0cd} + set ::hl_c::my::data(COLORS,$txt) [list {*}[hl_colors $txt] $clrCURL] + } + } + } + if {!$setonly} { + if {[dict exists $args -font]} { + set ::hl_c::my::data(FONT,$txt) [dict get $args -font] + } else { + set ::hl_c::my::data(FONT,$txt) [font actual TkFixedFont] + } + } + if {!$setonly || [dict exists $args -readonly]} { + hl_readonly $txt $::hl_c::my::data(READONLY,$txt) + } + if {[string first ::hl_c:: [bind $txt]]<0} { + ::hl_tcl::my::BindToEvent $txt ::hl_c::my::ShowCurrentLine $txt + } + set ::hl_c::my::data(_INSPOS_,$txt) {} + my::MemPos $txt +} +#_______________________ + +proc ::hl_c::hl_text {txt} { + # Highlights C code of a text widget. + # txt - text widget's path + + set font0 $::hl_c::my::data(FONT,$txt) + set font1 [set font2 $font0] + $txt tag configure tagSTD -font "$font0" + $txt tag add tagSTD 1.0 end + dict set font1 -weight bold + dict set font2 -slant italic + lassign $::hl_c::my::data(COLORS,$txt) \ + clrCOM clrCOMTK clrSTR clrVAR clrCMN clrPROC clrOPT clrBRA clrCURL clrCMN2 + $txt tag configure tagCOM -font "$font1" -foreground $clrCOM + $txt tag configure tagCOMTK -font "$font1" -foreground $clrCOMTK + $txt tag configure tagSTR -font "$font0" -foreground $clrSTR + $txt tag configure tagVAR -font "$font0" -foreground $clrVAR + $txt tag configure tagCMN -font "$font2" -foreground $clrCMN + $txt tag configure tagCMN1 -font "$font2" -foreground $clrCMN + $txt tag configure tagCMN2 -font "$font2" -foreground $clrCMN2 ;#red + $txt tag configure tagPROC -font "$font1" -foreground $clrPROC + $txt tag configure tagOPT -font "$font1" -foreground $clrOPT + $txt tag configure tagBRACKET -font "$font0" -foreground $clrBRA + $txt tag configure tagBRACKETERR -font "$font0" -foreground white -background red + $txt tag configure tagCURLINE -background $clrCURL + $txt tag raise sel + $txt tag raise tagBRACKETERR + catch {$txt tag raise hilited; $txt tag raise hilited2} ;# for apave package + my::HighlightAll $txt + ::hl_tcl::my::BindToEvent $txt ::hl_c::my::MemPos $txt + ::hl_tcl::my::BindToEvent $txt ::hl_c::my::MemPos1 $txt yes %K %s + ::hl_tcl::my::BindToEvent $txt ::hl_c::my::MemPos $txt + ::hl_tcl::my::BindToEvent $txt ::hl_c::my::MemPos $txt + foreach ev {Enter KeyRelease ButtonRelease-1} { + ::hl_tcl::my::BindToEvent $txt <$ev> ::hl_tcl::my::HighlightBrackets $txt + } + set ro $::hl_c::my::data(READONLY,$txt) + set com2 $::hl_c::my::data(CMD,$txt) + set txtattrs [list $txt $ro $com2] + if {![info exists ::hl_c::my::data(LIST_TXT)] || \ + [set i [lsearch -index 0 -exact $::hl_c::my::data(LIST_TXT) $txt]]==-1} { + lappend ::hl_c::my::data(LIST_TXT) $txtattrs + } else { + set ::hl_c::my::data(LIST_TXT) [lreplace $::hl_c::my::data(LIST_TXT) $i $i $txtattrs] + } + hl_readonly $txt $ro $com2 +} +#_______________________ + +proc ::hl_c::hl_all {args} { + # Updates ("rehighlights") all highlighted and existing text widgets. + # args - dict of options + # See also: hl_init + + if {[info exists ::hl_c::my::data(LIST_TXT)]} { + foreach wattrs $::hl_c::my::data(LIST_TXT) { + lassign $wattrs txt ro com2 + if {[winfo exists $txt]} { + if {![info exists ::hl_c::my::data(SETCOLORS,$txt)]} { + unset ::hl_c::my::data(COLORS,$txt) ;# colors defined by DARK + } + # args (if set) override the appropriate settings for $txt + hl_init $txt -- {*}$args + hl_text $txt + } + } + } +} +#_______________________ + +proc ::hl_c::hl_colors {txt {dark ""}} { + # Gets the main colors for highlighting (except for "curr.line"). + # txt - text widget's path or {} or an index of default colors + # dark - flag "dark scheme" + # Returns a list of colors for COM COMTK STR VAR CMN PROC OPT BRAC \ + or, if the colors aren't initialized, "standard" colors. + + if {[info exists ::hl_c::my::data(COLORS,$txt)]} { + return $::hl_c::my::data(COLORS,$txt) + } + if {$dark eq {}} {set dark $::hl_c::my::data(DARK,$txt)} + if {![string is integer -strict $txt] || $txt<0 || $txt>3} {set txt 0} + if {$dark} {set dark 1} {set dark 0} + set res [lindex $::hl_tcl::my::data(SYNTAXCOLORS,$txt) $dark] + # user keywords' color + set res [lreplace $res 6 6 [lindex $res 1]] + return $res +} +#_______________________ + +proc ::hl_c::hl_line {txt} { + # Updates a current line's highlighting. + # txt - text's path + + if {!$::hl_c::my::data(PLAINTEXT,$txt)} { + set ln0 [expr {int([$txt index insert])}] + set ln2 [expr {int([$txt index end])}] + set ln1 [expr {max (1,$ln0-1)}] + set ln2 [expr {min ($ln2,$ln0+1)}] + # update lines: previous, current, next + after idle "::hl_c::my::CoroRun $txt $ln1 $ln2" + } + ::hl_c::my::MemPos $txt yes + $txt configure -insertwidth $::hl_c::my::data(INSERTWIDTH,$txt) +} +#_______________________ + +proc ::hl_c::isdone {txt} { + # Checks if the highlighting of the text is done. + # txt - text's path + + variable my::data + return [expr {[info exist my::data(REG_TXT,$txt)] && $my::data(REG_TXT,$txt) ne {}}] +} +#_______________________ + +proc ::hl_c::clearup {txt} { + # Clears data related to text (esp. at deleting it). + # txt - text's path + + variable my::data + foreach key [array names my::data *,$txt] { + unset my::data($key) + } + foreach i [lsearch -all -exact -index 0 $my::data(LIST_TXT) $txt] { + set my::data(LIST_TXT) [lreplace $my::data(LIST_TXT) $i $i] + } +} +#_______________________ + +proc ::hl_c::cget {txt opt} { + # Gets a highlighting option's value. + # txt - text's path + # opt - option's name + + variable my::data + set opt [string toupper [string trimleft $opt -]] + if {[info exists my::data($opt,$txt)]} { + return $my::data($opt,$txt) + } + return {} +} +#_______________________ + +proc ::hl_c::configure {txt opt val} { + # Sets a highlighting option's value. + # txt - text's path + # opt - option's name + # val - option's value + + variable my::data + set opt [string toupper [string trimleft $opt -]] + set my::data($opt,$txt) $val +} + +# _________________________________ EOF _________________________________ # diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/hl_tcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/hl_tcl.tcl new file mode 100644 index 00000000..b22990fe --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/hl_tcl.tcl @@ -0,0 +1,1358 @@ +########################################################### +# Name: hl_tcl.tcl +# Author: Alex Plotnikov (aplsimple@gmail.com) +# Date: 06/16/2021 +# Brief: Handles highlighting Tcl code. +# License: MIT. +########################################################### + +package provide hl_tcl 1.1.6 + +# ______________________ Common data ____________________ # + +namespace eval ::hl_tcl { + + namespace eval my { + + variable data; array set data [list] + + # Tcl commands + set data(PROC_TCL) [lsort [list \ + return proc method self my coroutine yield yieldto constructor destructor \ + break continue namespace oo::define oo::class oo::objdefine oo::object test + ]] + set data(CMD_TCL) [lsort [list \ + set incr if else elseif string expr list lindex lrange llength lappend \ + lreplace lsearch lassign append split info array dict foreach for while \ + switch default linsert lsort lset lmap lrepeat catch variable \ + concat format scan regexp regsub upvar uplevel try finally throw read eval \ + after update error global puts file chan open close eof seek flush mixin \ + msgcat gets rename glob fconfigure fblocked fcopy cd pwd mathfunc then \ + mathop apply fileevent unset join next exec refchan package source \ + exit vwait binary lreverse registry auto_execok subst encoding load \ + auto_load tell auto_mkindex memory trace time clock timerate auto_qualify \ + auto_reset socket bgerror oo::copy unload history tailcall \ + interp parray pid transchan nextto unknown dde pkg_mkIndex zlib auto_import \ + pkg::create tcl::prefix \ + http::config http::geturl http::formatQuery http::reset http::wait \ + http::status http::size http::code http::ncode http::meta http::data \ + http::error http::cleanup http::register http::unregister * \ + ]] + + # Ttk commands + set data(CMD_TTK) [list \ + ttk::button ttk::frame ttk::label ttk::entry ttk::checkbutton \ + ttk::radiobutton ttk::combobox ttk::labelframe ttk::scrollbar \ + tk_optionMenu ttk::menubutton ttk::style ttk::notebook ttk::panedwindow \ + ttk::separator ttk::progressbar ttk::scale ttk::sizegrip ttk::spinbox \ + ttk::treeview ttk::intro ttk::widget tk_focusNext tk_getOpenFile \ + ] + + # Tk commands + set data(CMD_TK2) [list \ + tk_popup tk tkwait tkerror tk_setPalette tk_textCut tk_textCopy tk_bisque \ + tk_chooseDirectory tk_textPaste ttk_vsapi tk_focusPrev tk_messageBox \ + tk_focusFollowsMouse tk_getSaveFile tk_menuSetFocus tk_dialog tk_chooseColor \ + ] + + # Tk/ttk commands united + set data(CMD_TK) [concat $data(CMD_TTK) $data(CMD_TK2) [list \ + button entry checkbutton radiobutton label menubutton menu wm winfo bind \ + grid pack event bell text canvas frame listbox grab scale scrollbar \ + labelframe focus font bindtags image selection toplevel destroy \ + option options spinbox bitmap photo keysyms send lower clipboard colors \ + console message cursors panedwindow place raise \ + ]] + + # allowed edges of string (as one and only) + set data(S_LEFT) [list \{ \[] + set data(S_RIGHT) [list \} \]] + # allowed edges of string (as one or both) + set data(S_SPACE) [list {} { } \t {;}] + set data(S_SPACE2) [concat $data(S_SPACE) [list \{]] + set data(S_BOTH) [concat $data(S_SPACE) [list \" \}]] + +# set data(RE0) {(^|[\{\}\[;]+)\s*([:\w*]+)(\s|\]|\}|\\|$|;)} +# set data(RE0) {(^|[\{\}\[;]+)\s*([:\w*]+)(\s|\]|\}|\\|$|;)?} + set data(RE0) {(^|[\{\}\[;]+)\s*([:\w*]+)(\s|\]|\}|\\|$|;){0}} ;# test: pwd;pwd;pwd + set data(RE1) {([\{\}\[;])+\s*([:\w*]+)(\s|\]|\}|\\|$)} + set data(RE5) {(^|[^\\])(\[|\]|\$|\{|\})} + set data(RETODO) {^\s*#\s*(!|TODO)} + + set data(LBR) {\{(\[\"} + set data(RBR) {\})\]\"} + + # default syntax colors arrays (for a light & black themes) + # COM COMTK STR VAR CMN PROC OPT BRAC + set data(SYNTAXCOLORS,0) { + {#121212 #000000 #0c560c #4A181B #606060 #923B23 #463e11 #FF0000} + {#e0e0e0 #efefef #b1fabd #eebabf #888888 #ffa500 #c2ba8d #ff33ff} + } + set data(SYNTAXCOLORS,1) { + {#923B23 #7d1c00 #035103 #4A181B #4b5d50 #ca14ca #463e11 #FF0000} + {#ffa500 #ff7e00 #90ee90 #f1b479 #76a396 #fe6efe #b9b96e #ff33ff} + } + set data(SYNTAXCOLORS,2) { + {#3a6797 #134070 #8b2a0e #1b1baa #4b5d50 #ca14ca #653760 #FF0000} + {#95c2f2 #73a0d0 #ffc27e #a9a9f7 #76a396 #fe6efe #e2b4dd #ff33ff} + } + set data(SYNTAXCOLORS,3) { + {#2b6b2b #0b4b0b #8e0e8e #004080 #606060 #8a3407 #463e11 #FF0000} + {#aad5ab #86c686 #ff86ff #96c5f8 #888888 #fab481 #b1a97c #ff33ff} + } + } +} + +# _________________________ STATIC highlighting _________________________ # + +proc ::hl_tcl::my::AuxEnding {kName lineName iName} { + # Auxiliary procedure to process the ending comments in the line. + # kName - variable's name for 'k' + # lineName - variable's name for 'line' + # iName - variable's name for 'i' + # See also: HighlightLine + + upvar 1 $kName k $lineName line $iName i + if {[set k [string first # $line $i]]>-1 && \ + [string index [string trimleft $line] 0] eq {#}} { + return 1 + } + # not found a full line comment => try to find "good" ending comments i.e. ";# ..." + # at that even proper comments like + # if {cond} { #... + # } + # are skipped as "bad" + set k [lindex [regexp -inline -indices {;\s*#} [string range $line $i end]] 0 0] + if {$k eq {}} { + set k -1 + return 0 + } + set k [expr {$k+$i+1}] + return 1 +} +#_______________________ + +proc ::hl_tcl::my::NotEscaped {line i} { + # Checks if a character escaped in a line. + # line - line + # i - the character's position in 'line' + # Returns "1" if the character not escaped. + + set cntq 0 + while {$i>0} { + if {[string index $line [incr i -1]] ne "\\"} { + return [expr {($cntq%2)==0}] + } + incr cntq + } + return [expr {($cntq%2)==0}] +} +#_______________________ + +proc ::hl_tcl::my::RemoveTags {txt from to} { + # Removes tags in text. + # txt - text widget's path + # from - starting index + # to - ending index + + foreach tag {tagCOM tagCOMTK tagSTR tagVAR tagCMN tagCMN2 tagPROC tagOPT} { + $txt tag remove $tag $from $to + } +} +#_______________________ + +proc ::hl_tcl::my::HighlightCmd {txt line ln pri i} { + # Highlights Tcl/Tk commands. + # txt - text widget's path + # line - line to be highlighted + # ln - line number + # pri - column number to highlighted from + # i - current position in 'line' + + variable data + $txt tag add tagSTD "$ln.$pri" "$ln.$i +1 chars" + if {$pri} { + incr pri -1 + set RE $data(RE1) + } else { + set RE $data(RE0) + } + set st [string range $line $pri $i-1] + set lcom [regexp -inline -all -indices $RE $st] + # commands + foreach {- - lc -} $lcom { + lassign $lc i1 i2 + set c [string trim [string range $st $i1 $i2] "\{\}\[;\t "] + set ik [expr {$i2-$i1+1-[string length $c]}] + if {$c ne {}} { + incr i1 $ik + incr i2 + if {[lsearch -exact -sorted $data(CMD_TCL) $c]>-1} { + $txt tag add tagCOM "$ln.$pri +$i1 char" "$ln.$pri +$i2 char" + } elseif {[lsearch -exact -sorted $data(PROC_TCL) $c]>-1} { + if {$c eq {namespace} && + ![regexp {^namespace[\s]+eval([\s]|$)+} [string range $st $i1 end]]} { + set tag tagCOM ;# let "namespace eval" only be highlighted as proc/return + } else { + set tag tagPROC + } + $txt tag add $tag "$ln.$pri +$i1 char" "$ln.$pri +$i2 char" + } elseif {[lsearch -exact -sorted $data(CMD_TK_EXP) $c]>-1} { + $txt tag add tagCOMTK "$ln.$pri +$i1 char" "$ln.$pri +$i2 char" + } + } + } + # $variables: + set dlist [list] + set slen [expr {[string length $st]-1}] + set cnt [CountChar $st \$ dlist no] + foreach dl $dlist { + if { [string index $st $dl+1] eq "\{" } { + if {[set br2 [string first \} $st $dl+2]]!=-1} { + $txt tag add tagVAR "$ln.$pri +$dl char" "$ln.$pri +[incr br2] char" + } + continue + } + for {set i [set dl2 $dl]} {$i<$slen} {} { + incr i + set ch [string index $st $i] + if {[string is wordchar $ch] || $ch eq {:}} { + set dl2 $i + continue + } elseif {$ch eq {(}} { + if {[set br2 [string first {)} $st $i+1]]>-1} { + set dl2 $br2 + } + } + break + } + if {$dl2>$dl} { + $txt tag add tagVAR "$ln.$pri +$dl char" "$ln.$pri +[incr dl2] char" + } + } + # -options + set dl -1 + while {[set dl [string first - $st [incr dl]]]>-1} { + if {[string index $st $dl-1] ni $data(S_SPACE2)} continue + set idx1 "$ln.$pri +$dl char" + if {[string index $st $dl+1] eq {-}} { + incr dl ;# for --longoption + } + set i $dl + set ch [string index $st $i+1] + if {![string is alpha -strict $ch]} { ;# || ![string is ascii -strict $ch] + continue ;# first, a Latin letter + } + set dl2 -1 + while {$i<$slen} { + incr i + set ch [string index $st $i] + if {![string is wordchar $ch] && $ch ne {-}} break + set dl2 $i + } + if {$dl2>-1} { + $txt tag add tagOPT $idx1 "$ln.$pri +[incr dl2] char" + set dl $dl2 + } + } +} +#_______________________ + +proc ::hl_tcl::my::HighlightStr {txt p1 p2} { + # Highlights strings. + # txt - text widget's path + # p1 - starting index of the string in 'txt' + # p2 - ending index of the string in 'txt' + + variable data + set p1 [$txt index $p1] + set p2 [$txt index $p2] + $txt tag add tagSTR $p1 $p2 + set st [$txt get $p1 $p2] + set lcom [regexp -inline -all -indices $data(RE5) $st] + foreach {lc g1 g2} $lcom { + lassign $lc i1 i2 + incr i2 + while {$i1<$i2} { + incr i1 + if {[string first [string index $st $i1] "\[\]\$\{\}"]>-1} { + set i12 [expr {$i1+1}] + $txt tag add tagVAR "$p1 +$i1 char" "$p1 +$i12 char" + } + } + } +} +#_______________________ + +proc ::hl_tcl::my::FirstQtd {lineName iName currQtd} { + # Searches the quote characters in line. + # lineName - variable's name for 'line' + # iName - variable's name for 'i' + # currQtd - yes, if searching inside the quoted + # Returns "yes" if a quote character was found. + + variable data + upvar 1 $lineName line $iName i + while {1} { + if {[set i [string first \" $line $i]]==-1} {return no} + if {[NotEscaped $line $i]} { + if {$currQtd||$i==0} {return yes} + set i1 [expr {$i-1}] + set i2 [expr {$i+1}] + if {[NotEscaped $line $i1]} { + set c1 [string index $line $i1] ;# check the string ends + set c2 [string index $line $i2] + # not needed: $c1 in $data(S_BOTH) && $c2 ni $data(S_BOTH) || + if {$c1 in $data(S_LEFT) && $c2 ni $data(S_RIGHT) + || $c1 ni $data(S_LEFT) && $c2 in $data(S_RIGHT)} { + return yes + } + # last reverence: for braced expression + set i1 $i + while {$i1>0} { + set c1 [string index $line $i1-1] + set c2 [string index $line $i1] + if {$c1 in $data(S_SPACE)} {return [expr { $c2 ne "\{" }]} + incr i1 -1 + } + return no + } + return yes + } + incr i + } +} +#_______________________ + +proc ::hl_tcl::my::HighlightComment {txt line ln k} { + # Highlights comments. + # txt - text widget's path + # line - current line + # ln - line's number + # k - comment's starting position in line + + variable data + set stcom [string range $line $k end] + if {[regexp $data(RETODO) $stcom]} { + $txt tag add tagCMN2 $ln.$k $ln.end ;# "!" and TODO comments + } else { + $txt tag add tagCMN $ln.$k $ln.end + } +} +#_______________________ + +proc ::hl_tcl::my::HighlightLine {txt ln prevQtd} { + # Highlights a line in text. + # txt - text widget's path + # ln - line's number + # prevQtd - flag of "being quoted" from the previous line + + variable data + if {$data(ISPLAINCOM,$txt)} { + # plain highlighting: for the current line + set res [{*}$data(PLAINCOM,$txt) $txt $ln $prevQtd] + if {$res in {-1 0 1}} { + return $res ;# to be continued in a next line with prevQtd + } + # if the line was highlighted okay, skip the highlighting as Tcl code + if {$res} {return 0} + # otherwise highlight it below as Tcl code + } + set line [$txt get $ln.0 $ln.end] + if {$prevQtd==-1} { ;# comments continued + HighlightComment $txt $line $ln 0 + if {[string index $line end] ne "\\"} {set prevQtd 0} + return $prevQtd + } + set currQtd $prevQtd ;# current state of being quoted + set i [set pri [set lasti 0]] + set k -1 + while {1} { + if {![FirstQtd line i $currQtd]} break + set lasti $i + if {$currQtd} { + HighlightStr $txt $ln.$pri "$ln.$i +1 char" + set currQtd 0 + incr lasti + if {[AuxEnding j line lasti]} { + set i $lasti + set st [string range $line $i $j] + set it 0 + if {[FirstQtd st it $currQtd]} continue ;# there is a quote yet + set k $j + break + } + } else { + if {[AuxEnding j line pri] && $j<$i} { + set lasti $pri + set k $j + break + } + HighlightCmd $txt $line $ln $pri $i + set currQtd 1 + } + set pri $i + incr i + } + if {$currQtd} { + HighlightStr $txt $ln.$pri $ln.end + } elseif {$k>-1 || [AuxEnding k line lasti]} { + HighlightCmd $txt $line $ln $lasti $k + HighlightComment $txt $line $ln $k + if {[string index $line end] eq "\\"} {set currQtd -1} + } else { + HighlightCmd $txt $line $ln $lasti [string length $line] + } + if {!$data(MULTILINE,$txt) && $currQtd && [string index $line end] ne "\\"} { + set currQtd 0 + } + return $currQtd +} +#_______________________ + +proc ::hl_tcl::my::HighlightAll {txt} { + # Highlights all of a text. + # txt - text widget's path + # Makes a coroutine from this. + # See also: CoroHighlightAll + + # let them work one by one: + set coroNo [expr {[incr ::hl_tcl::my::data(CORALL)] % 10000000}] + coroutine co_HlAll$coroNo ::hl_tcl::my::CoroHighlightAll $txt +} +#_______________________ + +proc ::hl_tcl::my::CoroHighlightAll {txt} { + # Highlights all of a text as a coroutine. + # txt - text widget's path + # See also: HighlightAll + + variable data + catch { ;# $txt may be destroyed, so catch this + if {!$data(PLAINTEXT,$txt)} { + set tlen [lindex [split [$txt index end] .] 0] + RemoveTags $txt 1.0 end + set maxl [expr {min($data(SEEN,$txt),$tlen)}] + set maxl [expr {min($data(SEEN,$txt),$tlen)}] + for {set currQtd [set ln [set lnseen 0]]} {$ln<$tlen} {} { + incr ln + set currQtd [HighlightLine $txt $ln $currQtd] + if {[incr lnseen]>$data(SEEN,$txt)} { + set lnseen 0 + after idle after 1 [info coroutine] + yield + } + } + } + } + set data(REG_TXT,$txt) {1} +} +#_______________________ + +proc ::hl_tcl::my::BindToEvent {w event args} { + # Binds an event on a widget to a command. + # w - the widget's path + # event - the event + # args - the command + + if {[string first $args [bind $w $event]]<0} { + bind $w $event [list + {*}$args] + } + return +} + +# _________________________ DYNAMIC highlighting ________________________ # + +proc ::hl_tcl::my::CountQSH {txt ln} { + # Counts quotes, slashes, hashes in a line + # txt - text widget's path + # ln - line's index + + set ln [expr {int($ln)}] + set st [$txt get $ln.0 $ln.end] + list [CountChar $st \"] [CountChar $st \\] [CountChar $st #] +} +#_______________________ + +proc ::hl_tcl::my::IsCurline {txt {flag ""}} { + # Sets / gets "highlight a current line" flag for a text. + # txt - the text's path + # flag - the flag + + variable data + if {$flag eq {}} { + if {[info exists data(HL_CURLINE,$txt)]} { + set flag $data(HL_CURLINE,$txt) + } else { + set flag 0 + } + return $flag + } + set data(HL_CURLINE,$txt) $flag +} +#_______________________ + +proc ::hl_tcl::my::ShowCurrentLine {txt {doit no}} { + # Shows the current line. + # txt - text widget's path + # doit - if yes, forces updating current line's background + # Returns a current position of cursor. + + variable data + set pos [$txt index insert] + set nlines [expr {int([$txt index end])}] + lassign [split $pos .] ln cn + if {[catch {lassign [split $data(CURPOS,$txt) .] ln2 cn2}]} { + set ln2 $ln + set cn2 $cn + set data(CURPOS,$txt) [set data(NLINES,$txt) 0] + } + if {[IsCurline $txt]} { + if {$doit || int($data(CURPOS,$txt))!=$ln || $data(NLINES,$txt)!=$nlines \ + || $ln!=$ln2 || abs($cn-$cn2)>1 || $cn<2} { + $txt tag remove tagCURLINE 1.0 end + $txt tag add tagCURLINE [list $pos linestart] [list $pos lineend]+1displayindices + } + } + set data(NLINES,$txt) $nlines + set data(CURPOS,$txt) $pos + return $pos +} +#_______________________ + +proc ::hl_tcl::my::MemPos1 {txt {donorm yes} {K ""} {s ""}} { + # Checks and sets the cursor's width, depending on its position. + # txt - text widget's path + # donorm - if yes, forces "normal" cursor + # K - key (%K of bind) + # s - state (%s of bind) + # This fixes an issue with text cursor: less width at 0th column. + + variable data + if {$K eq {Home} && [string is digit -strict $s] && \ + [expr {$s & 4}]==0 && [expr {$s & 1}]==0} { + # Ctrl-Home & Shift-Home are passed + set p1 [$txt index insert] + set line [$txt get "$p1 linestart" "$p1 lineend"] + set p [expr {[string length $line]-[string length [string trimleft $line]]}] + set p2 [expr {int($p1)}].$p + if {$p && $p2 ne $p1} { + after idle "::tk::TextSetCursor $txt $p2" + return 0 + } + } + if {$data(INSERTWIDTH,$txt)==1} { + if {[$txt cget -insertwidth]!=1} {$txt configure -insertwidth 1} + return 0 + } + set insLC [$txt index insert] + lassign [split $insLC .] L C + if {$data(_INSPOS_,$txt) eq {}} { + set L2 [set C2 0] + } else { + lassign [split $data(_INSPOS_,$txt) .] L2 C2 + } + if {$L!=$L2 || $C==0 || $C2==0} { + if {$C || $donorm} { + $txt configure -insertwidth $data(INSERTWIDTH,$txt) + } else { + $txt configure -insertwidth [expr {$data(INSERTWIDTH,$txt)*2-1}] + } + } + return $insLC +} +#_______________________ + +proc ::hl_tcl::my::MemPos {txt {doit no}} { + # Remembers the state of current line. + # txt - text widget's path + # doit - argument for ShowCurrentLine + # See also: ShowCurrentLine + + variable data + catch { + set data(_INSPOS_,$txt) [MemPos1 $txt no] + set ln [ShowCurrentLine $txt $doit] + set data(CUR_LEN,$txt) [$txt index {end -1 char}] + lassign [CountQSH $txt $ln] \ + data(CNT_QUOTE,$txt) data(CNT_SLASH,$txt) data(CNT_COMMENT,$txt) + if {[$txt tag ranges tagBRACKET] ne {}} {$txt tag remove tagBRACKET 1.0 end} + if {[$txt tag ranges tagBRACKETERR] ne {}} {$txt tag remove tagBRACKETERR 1.0 end} + if {[set cmd $data(CMDPOS,$txt)] ne {}} { + # run a command after changing position (with the state as arguments) + append cmd " $txt $data(CUR_LEN,$txt) $ln $data(CNT_QUOTE,$txt) \ + $data(CNT_SLASH,$txt) $data(CNT_COMMENT,$txt)" + catch {after cancel $data(CMDATFER,$txt)} + set data(CMDATFER,$txt) [after idle $cmd] + } + } +} +#_______________________ + +proc ::hl_tcl::my::RunCoroAfterIdle {txt pos1 pos2 wait args} { + # Runs a "modified" corotine after idle. + + variable data + if {$wait} { + catch { + after cancel $data(COROAFTER,$txt) + if {$data(COROPOS1,$txt) < $pos1} {set pos1 $data(COROPOS1,$txt)} + if {$data(COROPOS2,$txt) > $pos2} {set pos2 $data(COROPOS2,$txt)} + } + set data(COROPOS1,$txt) $pos1 + set data(COROPOS2,$txt) $pos2 + } + set data(COROAFTER,$txt) [after idle "::hl_tcl::my::CoroRun $txt $pos1 $pos2 $args"] +} +#_______________________ + +proc ::hl_tcl::my::Modified {txt oper pos1 args} { + # Handles modifications of text. + # txt - text widget's path + # Makes a coroutine from this. + # See also: CoroModified + + variable data + set ar2 [lindex $args 0] + set posins [$txt index insert] + if {[catch {set pos1 [set pos2 [$txt index $pos1]]}]} { + set pos1 [set pos2 $posins] + } + switch $oper { + insert { + set pos2 [expr {$pos1 + [llength [split $ar2 \n]]}] + } + delete { + if {$ar2 eq {} || [catch {set pos2 [$txt index $ar2]}]} { + set pos2 $posins + } + } + } + RunCoroAfterIdle $txt $pos1 $pos2 no {*}$args +} +#_______________________ + +proc ::hl_tcl::my::CoroRun {txt pos1 pos2 args} { + + variable data + if {![info exist data(REG_TXT,$txt)] || $data(REG_TXT,$txt) eq {} || \ + ![info exist data(CUR_LEN,$txt)]} { + # skip changes till the highlighting done + after 10 [list ::hl_tcl::my::RunCoroAfterIdle $txt $pos1 $pos2 yes {*}$args] + return + } + # let them work one by one + set i1 [expr {int($pos1)}] + set i2 [expr {int($pos2)}] + set coroNo [expr {[incr data(CORMOD)] % 10000000}] + coroutine CoModified$coroNo ::hl_tcl::my::CoroModified $txt $i1 $i2 {*}$args +} +#_______________________ + +proc ::hl_tcl::my::CoroModified {txt {i1 -1} {i2 -1} args} { + # Handles modifications of text. + # txt - text widget's path + # i1 - 1st index of changes + # i2 - 2nd index of changes + # args - arguments for a command called after the modifications + # See also: Modified + + catch { + variable data + # current line: + set ln [expr {int([$txt index insert])}] + # ending line: + set endl [expr {int([$txt index {end -1 char}])}] + # range of change: + if {$i1!=-1} { + set dl [expr {abs($i2-$i1)}] + set ln $i1 + } else { + set dl [expr {abs(int($data(CUR_LEN,$txt)) - $endl)}] + } + # begin and end of changes: + set ln1 [set lno1 [expr {max(($ln-$dl),1)}]] + set ln2 [set lno2 [expr {min(($ln+$dl),$endl)}]] + lassign [CountQSH $txt $ln] cntq cnts ccmnt + # flag "highlight to the end": + set bf1 [expr {abs($ln-int($data(CURPOS,$txt)))>1 || $dl>1 \ + || $cntq!=$data(CNT_QUOTE,$txt) \ + || $ccmnt!=$data(CNT_COMMENT,$txt)}] + set bf2 [expr {$cnts!=$data(CNT_SLASH,$txt)}] + if {$bf1 && !$data(MULTILINE,$txt) || $bf2} { + set lnt1 $ln + set lnt2 [expr {$ln+1}] + while {$ln2<$endl && $lnt1<$endl && $lnt2<=$endl && ( \ + [$txt get "$lnt1.end -1 char" $lnt1.end] in {\\ \"} || + [$txt get "$lnt2.end -1 char" $lnt2.end] in {\\ \"}) || $bf2} { + incr lnt1 ;# next lines be handled too, if ended with "\\" + incr lnt2 + incr ln2 + set bf2 0 + } + } + set tSTR [$txt tag ranges tagSTR] + set tCMN [$txt tag ranges tagCMN] + lappend tCMN {*}[$txt tag ranges tagCMN2] + if {$ln1==1} { + set currQtd 0 + } else { + set currQtd [LineState $txt $tSTR $tCMN "$ln1.0 -1 chars"] + } + $txt tag add tagSTD $ln1.0 $ln2.end + if {!$data(PLAINTEXT,$txt)} { + set lnseen 0 + while {$ln1<=$ln2} { + if {$ln1==$ln2} { + set bf2 [LineState $txt $tSTR $tCMN "$ln1.end +1 chars"] + } + RemoveTags $txt $ln1.0 $ln1.end + set currQtd [HighlightLine $txt $ln1 $currQtd] + if {$ln1==$ln2 && ($bf1 || $bf2!=$currQtd) && $data(MULTILINE,$txt)} { + set ln2 $endl ;# run to the end + } + if {[incr lnseen]>$data(SEEN,$txt)} { + set lnseen 0 + catch {after cancel $data(COROATFER,$txt)} + set data(COROATFER,$txt) [after idle after 1 [info coroutine]] + yield + } + incr ln1 + } + } + if {[set cmd $data(CMD,$txt)] ne {}} { + # run a command after changes done (its arguments are txt, ln1, ln2) + append cmd { } $txt { } $lno1 { } $lno2 { } $args + after idle $cmd + } + MemPos $txt + } +} +#_______________________ + +proc ::hl_tcl::my::InRange {p1 p2 l {c -1}} { + # Checks if a text position is in a range of text positions. + # p1 - 1st position of range + # p2 - 2nd position of range + # l - line position to check (or 'l.c' if 'c' not set) + # c - column position to check + + if {$c==-1} {lassign [split $l .] l c} + lassign [split $p1 .] l1 c1 + lassign [split $p2 .] l2 c2 + incr c2 -1 ;# text ranges are not right-inclusive + return [expr { \ + ($l>=$l1 && $l<$l2 && $c>=$c1) || ($l>$l1 && $l<=$l2 && $c<=$c2) || + ($l==$l1 && $l1==$l2 && $c>=$c1 && $c<=$c2) || ($l>$l1 && $l<$l2)}] +} +#_______________________ + +proc ::hl_tcl::my::SearchTag {tagpos l1} { + # Searches a position in tag ranges. + # tagpos - tag position ranges + # l1 - the position to find + # Returns a found range's index of -1 if not found. + + lassign [split $l1 .] l c + set i 0 + foreach {p1 p2} $tagpos { + if {[InRange $p1 $p2 $l $c]} {return $i} + incr i 2 + } + return -1 +} +#_______________________ + +proc ::hl_tcl::my::LineState {txt tSTR tCMN l1} { + # Gets an initial state of line. + # txt - text widget's path + # tSTR - ranges of string tags + # tCMN - ranges of comment tags + # l1 - the line's index + # Returns: 0 if no tags for the line; 1 if the line is a string's continuation; -1 if the line is a comment's continuation. + + variable data + set i1 [$txt index $l1] + if {[set prev [string first -1 $l1]]>-1} { + set i1 [$txt index "$i1 -1 chars"] + } + set ch [$txt get "$i1" "$i1 +1 chars"] + if {[SearchTag $tCMN [$txt index "$i1 -1 chars"]]!=-1} { ;# is a comment continues? + if {$ch eq "\\"} {return -1} + } elseif {$data(MULTILINE,$txt) || $ch eq "\\"} { ;# is a string continues? + set nl [lindex [split $l1 .] 0] + if {$prev>-1} { + # is the start of line quoted? + # Tk tag ranges refer only to non-empty lines + # => previous two non-empty chars' coordinates are needed + # to analize whether they: + # - end the range + # - are inside of the range + # - begin the range + set co1 [set co2 {}] + while {$nl>1} { + incr nl -1 + if {[set line [$txt get $nl.0 $nl.end]] ne {}} { + if {$co2 eq {}} { + set co2 [$txt index "$nl.end -1 char"] + if {[string length $line]>1} { + set co1 [$txt index "$nl.end -2 char"] + break + } + } else { + set co1 [$txt index "$nl.end -1 char"] + break + } + } + } + if {$co2 eq {}} {return 0} {set f2 [expr {[SearchTag $tSTR $co2]!=-1}]} + if {$co1 eq {}} {set f1 $f2} {set f1 [expr {[SearchTag $tSTR $co1]!=-1}]} + set ch [$txt get $co2 "$co2 +1 chars"] + set c [lindex [split [$txt index $co2] .] 1] + if {![NotEscaped $line $c]} {set ch {}} + return [expr {$ch ne {"} && $f2 || $ch eq {"} && !$f1}] + } + # is the end of line quoted? + set line {} + set nltot [lindex [split [$txt index end] .] 0] + while {$nl<$nltot} { + incr nl + if {[set line [$txt get $nl.0 $nl.end]] ne {}} break + } + set i1 $nl.0 + set ch [$txt get $i1 "$i1 +1 chars"] + set c [lindex [split [$txt index $i1] .] 1] + if {![NotEscaped $line $c]} {set ch {}} + set f1 [expr {[SearchTag $tSTR [$txt index $i1]]!=-1}] + set f2 [expr {[SearchTag $tSTR [$txt index "$i1 +1 chars"]]!=-1}] + return [expr {$ch ne {"} && $f1 || $ch eq {"} && !$f2}] + } + return 0 +} + +# __________ HEROIC EFFORTS to highlight the matching brackets __________ # + +proc ::hl_tcl::my::MergePosList {none args} { + # Merges lists of numbers that are not-coinciding and sorted. + # none - a number to be not allowed in the lists (e.g. less than minimal) + # args - list of the lists to be merged + # Returns a list of pairs: index of list + item of list. + + set itot [set ilist 0] + set lind [set lout [list]] + foreach lst $args { + incr ilist + incr itot [set llen [llength $lst]] + lappend lind [list 0 $llen] + } + for {set i 0} {$i<$itot} {incr i} { + set min $none + set ind -1 + for {set k 0} {$k<$ilist} {incr k} { + lassign [lindex $lind $k] li llen + if {$li < $llen} { + set e [lindex [lindex $args $k] $li] + if {$min == $none || $min > $e} { + set ind $k + set min $e + set savli [incr li] + set savlen $llen + } + } + } + if {$ind == -1} {return -code error {Error: probably in the input data}} + lset lind $ind [list $savli $savlen] + lappend lout [list $ind $min] + } + return $lout +} +#_______________________ + +proc ::hl_tcl::my::CountChar {str ch {plistName ""} {escaped yes}} { + # Counts a character in a string. + # str - the string + # ch - the character + # plistName - variable name for a list of positions of *ch* + # escaped - true, if the character is escaped. + # Returns a number of any occurences of character *ch* in string *str* + # if the character is escaped, but if it is not escaped, only non-escaped + # characters are counted. + + if {$plistName ne {}} { + upvar 1 $plistName plist + set plist [list] + } + set icnt [set begidx 0] + while {[set idx [string first $ch $str]] >= 0} { + set nidx $idx + if {$escaped || ![Escaped $str $idx]} { + incr icnt + if {$plistName ne {}} {lappend plist [expr {$begidx+$idx}]} + } + incr begidx [incr idx] + set str [string range $str $idx end] + } + return $icnt +} +#_______________________ + +proc ::hl_tcl::my::Escaped {line curpos} { + # Checks if a character is escaped in a string. + # line - the string + # curpos - position of the character in the line + # Returns 1 if the character is escaped in the string. + + set line [string range $line 0 $curpos-1] + set linetrim [string trimright $line \\] + return [expr {([string length $line]-[string length $linetrim])%2}] +} +#_______________________ + +proc ::hl_tcl::my::MatchedBrackets {w inplist curpos schar dchar dir} { + # Finds a match of characters (dchar for schar). + # w - text widget's path + # inplist - list of strings where to find a match + # curpos - position of schar in nl.nc form where nl=1.., nc=0.. + # schar - source character + # dchar - destination character + # dir - search direction: 1 to the end, -1 to the beginning of list + + lassign [split $curpos .] nl nc + if {$schar eq {"}} { + set npos $nl.$nc + set hlpr [$w tag prevrange tagSTR $npos] + if {[llength $hlpr] && [$w compare "$npos +1 char" == [lindex $hlpr 1]]} { + set dir -1 ;# <- quotes are scanned depending on their range (for tcl/c) + } else { + set hlpr [$w tag nextrange tagSTR $npos] + if {![llength $hlpr] || [$w compare $npos != [lindex $hlpr 0]]} { + # for plain texts: + if {[$w search -exact \" "$npos +1 char" end] eq {}} { + set dir -1 + } else { + set lfnd [$w search -backwards -all -exact \" $npos 1.0] + if {[llength $lfnd] % 2} { + set dir -1 + } + } + } + } + incr nc $dir + } + set escaped [Escaped [lindex $inplist $nl-1] $nc] + if {$dir==1} {set rng1 "$nc end"} else {set rng1 "0 $nc"; set nc 0} + set retpos {} + set scount [set dcount 0] + incr nl -1 + set inplen [llength $inplist] + while {$nl>=0 && $nl<$inplen} { + set line [lindex $inplist $nl] + set line [string range $line {*}$rng1] + set sc [CountChar $line $schar slist $escaped] + set dc [CountChar $line $dchar dlist $escaped] + set plen [llength [set plist [MergePosList -1 $slist $dlist]]] + for {set i [expr {$dir>0?0:($plen-1)}]} {$i>=0 && $i<$plen} {incr i $dir} { + lassign [lindex $plist $i] src pos + if {$src} {incr dcount} {incr scount} + if {$scount <= $dcount} { + set retpos [incr nl].[incr pos $nc] + break + } + } + if {$retpos ne {}} break + set nc 0 + set rng1 {0 end} + incr nl $dir + } + return $retpos +} +#_______________________ + +proc ::hl_tcl::my::HighlightBrackets {w} { + # Highlights matching brackets if any. + # w - text widget's path + + variable data + set curpos [ShowCurrentLine $w] + set curpos2 [$w index {insert -1 chars}] + set ch [$w get $curpos] + set il [string first $ch $data(LBR)] + set ir [string first $ch $data(RBR)] + set txt [split [$w get 1.0 end] \n] + if {$il>-1} { + set brcpos [MatchedBrackets $w $txt $curpos \ + [string index $data(LBR) $il] [string index $data(RBR) $il] 1] + } elseif {$ir>-1} { + set brcpos [MatchedBrackets $w $txt $curpos \ + [string index $data(RBR) $ir] [string index $data(LBR) $ir] -1] + } elseif {[set il [string first [$w get $curpos2] $data(LBR)]]>-1} { + set curpos $curpos2 + set brcpos [MatchedBrackets $w $txt $curpos \ + [string index $data(LBR) $il] [string index $data(RBR) $il] 1] + } elseif {[set ir [string first [$w get $curpos2] $data(RBR)]]>-1} { + set curpos $curpos2 + set brcpos [MatchedBrackets $w $txt $curpos \ + [string index $data(RBR) $ir] [string index $data(LBR) $ir] -1] + } else { + return + } + if {$brcpos ne {}} { + $w tag add tagBRACKET $brcpos + $w tag add tagBRACKET $curpos + } else { + $w tag add tagBRACKETERR $curpos + } + return +} + +# _________________________ INTERFACE procedures ________________________ # + +proc ::hl_tcl::hl_readonly {txt {ro -1} {com2 ""}} { + # Makes the text widget be readonly or gets its 'read-only' state. + # txt - text widget's path + # ro - flag "the text widget is readonly" + # com2 - command to be called at viewing and after changes + # If 'ro' argument is omitted, returns the widget's 'read-only' state. + + if {$ro==-1} { + return [expr {[info exists ::hl_tcl::my::data(READONLY,$txt)] && $::hl_tcl::my::data(READONLY,$txt)}] + } + set ::hl_tcl::my::data(READONLY,$txt) $ro + if {$com2 ne {}} {set ::hl_tcl::my::data(CMD,$txt) $com2} + set newcom "::$txt.internal" + if {[info commands $newcom] eq ""} {rename $txt $newcom} + set com "[namespace current]::my::Modified $txt" + #if {$com2 ne ""} {append com " ; $com2"} + if {$ro} {proc ::$txt {args} " \ + if {!\[winfo exists $txt\]} {return 0} ; \ + switch -exact -- \[lindex \$args 0\] \{ \ + insert \{$com2\} \ + delete \{$com2\} \ + replace \{$com2\} \ + default \{ return \[eval $newcom \$args\] \} \ + \}" + } else {proc ::$txt {args} " \ + if {!\[winfo exists $txt\]} {return 0} ; \ + switch -exact -- \[lindex \$args 0\] \{ \ + delete \{$com {*}\$args\} \ + insert \{$com {*}\$args\} \ + replace \{$com {*}\$args\} \ + \} ; \ + set _res_ \[eval $newcom \$args\] ; \ + return \$_res_" + } +} +#_______________________ + +proc ::hl_tcl::hl_init {txt args} { + # Initializes highlighting. + # txt - text widget's path + # args - dict of options + # The 'args' options include: + # -- - means that only args' options will be initialized (defaults skipped) + # -dark - flag "the text widget has dark background" + # -readonly - flag "read-only" + # -optRE - flag "use of RE to highlight options" + # -multiline - flag "allowed multi-line strings" + # -cmd - command to watch editing/viewing + # -cmdpos - command to watch cursor positioning + # -colors - list of colors as set in hl_tcl::hl_colorNames + # -font - attributes of font + # -seen - lines seen at start + # -keywords - additional commands to highlight (as Tk ones) + # This procedure has to be called before writing a text in the text widget. + # See also: hl_colorNames + + if {[set setonly [expr {[lindex $args 0] eq {--}}]]} { + set args [lrange $args 1 end] + } + iscurline $txt 1 + set ::hl_tcl::my::data(REG_TXT,$txt) {} ;# disables Modified at changing the text + set ::hl_tcl::my::data(KEYWORDS,$txt) {} + # get default options from text's ones + set defopts [list -insertwidth] + foreach defopt $defopts { + set opt [OptName $txt $defopt] + if {![info exists ::hl_tcl::my::data($opt)]} { + set ::hl_tcl::my::data($opt,DEFAULT) [$txt cget $defopt] + } + } + foreach {opt val} {-dark 0 -readonly 0 -cmd {} -cmdpos {} -optRE 1 \ + -multiline 1 -seen 500 -plaintext no -plaincom {} -insertwidth {} -keywords {}} { + if {[dict exists $args $opt]} { + set val [dict get $args $opt] + } elseif {$setonly} { + continue ;# only those set in args are taken into account + } + set ::hl_tcl::my::data([OptName $txt $opt]) $val + } + # reget default options from text's ones + foreach defopt $defopts { + set opt [OptName $txt $defopt] + if {[info exists ::hl_tcl::my::data($opt)] && $::hl_tcl::my::data($opt) eq {}} { + set ::hl_tcl::my::data($opt) $::hl_tcl::my::data($opt,DEFAULT) + } + } + set ::hl_tcl::my::data(CMD_TK_EXP) [lsort [list \ + {*}$::hl_tcl::my::data(CMD_TK) {*}$::hl_tcl::my::data(KEYWORDS,$txt)]] + unset ::hl_tcl::my::data(KEYWORDS,$txt) + if {[dict exists $args -colors]} { + set colors [dict get $args -colors] + lassign [addingColors $::hl_tcl::my::data(DARK,$txt)] clrCURL clrCMN2 + if {[set llen [llength $colors]]==8} { + lappend colors $clrCURL ;# add curr.line color if omitted + } + if {$llen==9} { + lappend colors $clrCMN2 ;# add #TODO color if omitted + } + set ::hl_tcl::my::data(COLORS,$txt) $colors + set ::hl_tcl::my::data(SETCOLORS,$txt) 1 + } else { + if {![info exists ::hl_tcl::my::data(COLORS,$txt)]} { + addingColors $::hl_tcl::my::data(DARK,$txt) $txt + } + } + if {!$setonly} { + if {[dict exists $args -font]} { + set ::hl_tcl::my::data(FONT,$txt) [dict get $args -font] + } else { + set ::hl_tcl::my::data(FONT,$txt) [font actual TkFixedFont] + } + set ::hl_tcl::my::data(ISPLAINCOM,$txt) [expr {$::hl_tcl::my::data(PLAINCOM,$txt) ne {}}] + } + if {!$setonly || [dict exists $args -readonly]} { + hl_readonly $txt $::hl_tcl::my::data(READONLY,$txt) + } + if {[string first ::hl_tcl:: [bind $txt]]<0} { + my::BindToEvent $txt ::hl_tcl::my::ShowCurrentLine $txt + } + set ::hl_tcl::my::data(_INSPOS_,$txt) {} + my::MemPos $txt +} +#_______________________ + +proc ::hl_tcl::hl_text {txt} { + # Highlights Tcl code of a text widget. + # txt - text widget's path + + set font0 $::hl_tcl::my::data(FONT,$txt) + set font1 [set font2 $font0] + $txt tag configure tagSTD -font "$font0" + $txt tag add tagSTD 1.0 end + dict set font1 -weight bold + dict set font2 -slant italic + lassign $::hl_tcl::my::data(COLORS,$txt) \ + clrCOM clrCOMTK clrSTR clrVAR clrCMN clrPROC clrOPT clrBRA clrCURL clrCMN2 + $txt tag configure tagCOM -font "$font1" -foreground $clrCOM + $txt tag configure tagCOMTK -font "$font1" -foreground $clrCOMTK + $txt tag configure tagSTR -font "$font0" -foreground $clrSTR + $txt tag configure tagVAR -font "$font0" -foreground $clrVAR + $txt tag configure tagCMN -font "$font2" -foreground $clrCMN + $txt tag configure tagCMN2 -font "$font2" -foreground $clrCMN2 ;#red + $txt tag configure tagPROC -font "$font1" -foreground $clrPROC + $txt tag configure tagOPT -font "$font0" -foreground $clrOPT + $txt tag configure tagBRACKET -font "$font0" -foreground $clrBRA + $txt tag configure tagBRACKETERR -font "$font0" -foreground white -background red + $txt tag configure tagCURLINE -background $clrCURL + $txt tag raise sel + $txt tag raise tagBRACKETERR + catch {$txt tag raise hilited; $txt tag raise hilited2} ;# for apave package + my::HighlightAll $txt + my::BindToEvent $txt ::hl_tcl::my::MemPos $txt + my::BindToEvent $txt ::hl_tcl::my::MemPos1 $txt yes %K %s + my::BindToEvent $txt ::hl_tcl::my::MemPos $txt + my::BindToEvent $txt ::hl_tcl::my::MemPos $txt + foreach ev {Enter KeyRelease ButtonRelease-1} { + my::BindToEvent $txt <$ev> ::hl_tcl::my::HighlightBrackets $txt + } + set ro $::hl_tcl::my::data(READONLY,$txt) + set com2 $::hl_tcl::my::data(CMD,$txt) + set txtattrs [list $txt $ro $com2] + if {![info exists ::hl_tcl::my::data(LIST_TXT)] || \ + [set i [lsearch -index 0 -exact $::hl_tcl::my::data(LIST_TXT) $txt]]==-1} { + lappend ::hl_tcl::my::data(LIST_TXT) $txtattrs + } else { + set ::hl_tcl::my::data(LIST_TXT) [lreplace $::hl_tcl::my::data(LIST_TXT) $i $i $txtattrs] + } + hl_readonly $txt $ro $com2 +} +#_______________________ + +proc ::hl_tcl::hl_all {args} { + # Updates ("rehighlights") all highlighted and existing text widgets. + # args - dict of options + # See also: hl_init + + if {[info exists ::hl_tcl::my::data(LIST_TXT)]} { + foreach wattrs $::hl_tcl::my::data(LIST_TXT) { + lassign $wattrs txt ro com2 + if {[winfo exists $txt]} { + if {![info exists ::hl_tcl::my::data(SETCOLORS,$txt)]} { + unset ::hl_tcl::my::data(COLORS,$txt) ;# colors defined by DARK + } + # args (if set) override the appropriate settings for $txt + hl_init $txt -- {*}$args + hl_text $txt + } + } + } +} +#_______________________ + +proc ::hl_tcl::hl_colorNames {} { + # Returns a list of color names for syntax highlighting. + + list clrCOM clrCOMTK clrSTR clrVAR clrCMN clrPROC clrOPT clrBRA +} + +#_______________________ + +proc ::hl_tcl::hl_colors {txt {dark ""} args} { + # Gets/sets the main colors for highlighting (except for "curr.line"). + # txt - text widget's path or {} or an index of default colors + # dark - flag "dark scheme" + # args - a list of colors to set for *txt* + # Returns a list of colors for COM COMTK STR VAR CMN PROC OPT BRAC \ + or, if the colors aren't initialized, "standard" colors. + + if {[llength $args]} { + set ::hl_tcl::my::data(COLORS,$txt) $args + return + } + if {[info exists ::hl_tcl::my::data(COLORS,$txt)]} { + return $::hl_tcl::my::data(COLORS,$txt) + } + if {$dark eq {}} {set dark $::hl_tcl::my::data(DARK,$txt)} + if {![string is integer -strict $txt] || $txt<0 || $txt>3} {set txt 0} + if {$dark} {set dark 1} {set dark 0} + return [lindex $::hl_tcl::my::data(SYNTAXCOLORS,$txt) $dark] +} +#_______________________ + +proc ::hl_tcl::hl_line {txt} { + # Updates a current line's highlighting. + # txt - text's path + + if {!$::hl_tcl::my::data(PLAINTEXT,$txt)} { + set ln0 [expr {int([$txt index insert])}] + set ln2 [expr {int([$txt index end])}] + set ln1 [expr {max (1,$ln0-1)}] + set ln2 [expr {min ($ln2,$ln0+1)}] + # update lines: previous, current, next + ::hl_tcl::my::RunCoroAfterIdle $txt $ln1 $ln2 no + } + ::hl_tcl::my::MemPos $txt yes + $txt configure -insertwidth $::hl_tcl::my::data(INSERTWIDTH,$txt) +} +#_______________________ + +proc ::hl_tcl::addingColors {{dark ""} {txt ""} {cs ""}} { + # Sets/gets colors for a text syntax highlighting. + # dark - yes, if the current theme is dark + # txt - path to the text or {} + # cs - color scheme + # If *txt* omitted, returns a list of resting colors. + # The resting colors are: + # - current line's background + # - #TODO and #! comment's foreground + + variable my::data + # try to get color options from current apave settings + if {[catch {set clrCURL [lindex [::apave::obj csGet $cs] 16]}]} { + set clrCURL {} + } + if {$dark eq {}} { + if {[catch {set dark [::apave::obj csDark]}]} { + set dark no + } + } + if {$dark} { + if {$clrCURL eq {}} {set clrCURL #29383c} + set clrCMN2 #ff7272 + } else { + if {$clrCURL eq {}} {set clrCURL #efe0cd} + set clrCMN2 #ff0000 + } + if {$txt eq {}} { + return [list $clrCURL $clrCMN2] + } + set my::data(COLORS,$txt) [list {*}[hl_colors $txt] $clrCURL $clrCMN2] +} +#_______________________ + +proc ::hl_tcl::hl_commands {} { + # Lists all Tcl/Tk commands registered here. + + variable my::data + list {*}$my::data(PROC_TCL) {*}$my::data(CMD_TCL) {*}$my::data(CMD_TK) +} +#_______________________ + +proc ::hl_tcl::iscurline {txt {flag ""}} { + # Sets / gets "highlight a current line" flag for a text. + # txt - the text's path + # flag - the flag + + return [my::IsCurline $txt $flag] +} +#_______________________ + +proc ::hl_tcl::isdone {txt} { + # Checks if the highlighting of the text is done. + # txt - text's path + + variable my::data + return [expr {[info exist my::data(REG_TXT,$txt)] && $my::data(REG_TXT,$txt) ne {}}] +} +#_______________________ + +proc ::hl_tcl::clearup {txt} { + # Clears data related to text (esp. at deleting it). + # txt - text's path + + variable my::data + foreach key [array names my::data *,$txt] { + unset my::data($key) + } + foreach i [lsearch -all -exact -index 0 $my::data(LIST_TXT) $txt] { + set my::data(LIST_TXT) [lreplace $my::data(LIST_TXT) $i $i] + } +} +#_______________________ + +proc ::hl_tcl::cget {txt opt} { + # Gets a highlighting option's value. + # txt - text's path + # opt - option's name + + variable my::data + set opt [string toupper [string trimleft $opt -]] + if {[info exists my::data($opt,$txt)]} { + return $my::data($opt,$txt) + } + return {} +} +#_______________________ + +proc ::hl_tcl::configure {txt opt val} { + # Sets a highlighting option's value. + # txt - text's path + # opt - option's name + # val - option's value + + variable my::data + set opt [string toupper [string trimleft $opt -]] + set my::data($opt,$txt) $val +} + +# ________________________ Helpers _________________________ # + +proc ::hl_tcl::OptName {txt opt} { + # Gets hl_tcl option's name. + # txt - text's path + # opt - option + + return [string toupper [string range $opt 1 end]],$txt +} + +# _________________________________ EOF _________________________________ # diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/hl_tcl_html.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/hl_tcl_html.tcl new file mode 100644 index 00000000..8537c443 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/hl_tcl_html.tcl @@ -0,0 +1,146 @@ +# _______________________________________________________________________ # +# +# Highlighting Tcl code with html tags. +# +# Scripted by Alex Plotnikov (aplsimple@gmail.com). +# License: MIT. +# _______________________________________________________________________ # + +package require Tk +source [file join [file dirname [info script]] hl_tcl.tcl] + +namespace eval ::hl_tcl_html { +} + +proc ::hl_tcl_html::insertTag {pN tN lcodeN} { + # Inserts a html tag into Tcl code. + # pN - variable's name for a position of the tag + # tN - variable's name for the tag + # lcodeN - variable's name for the list of code lines + + upvar 1 $pN p $tN t $lcodeN lcode + lassign [split $p .] l c + incr l -1 + set line [lindex $lcode $l] + set line1 [string range $line 0 $c-1] + set line2 [string range $line $c end] + set lcode [lreplace $lcode $l $l "$line1$t$line2"] +} + +proc ::hl_tcl_html::highlight {htmlfile darkedit args} { + # Processes html file to find and highlight embedded Tcl code. + # htmlfile - file name + # darkedit - flag "the text widget has dark background" ("no" by default) + # args - list of tag pairs + # A tag pair consists of: + # tag1 - opening tag(s) of Tcl code snippet + # tag2 - ending tag(s) of Tcl code snippet + + set txt .t + text $txt + set chan [open $htmlfile] + chan configure $chan -encoding utf-8 + set text [read $chan] + close $chan + lassign [::hl_tcl::hl_colors 1 $darkedit] clrCOM clrCOMTK clrSTR clrVAR clrCMN clrPROC clrOPT + lassign [::hl_tcl::addingColors $darkedit] -> clrCMN2 + set cs {} + foreach {tag1 tag2} $args { + if {[string match -nocase cs $tag1]} { + lassign [split $tag2 ,] clrCOM clrCOMTK clrSTR clrVAR clrCMN clrPROC clrOPT + continue + } + set ic [set ic2 0] + while {$ic>=0 && $ic2>=0} { + set ic [string first $tag1 $text $ic] + if {$ic>=0} { + incr ic [string length $tag1] + set ic2 [string first $tag2 $text $ic] + if {$ic2>=0} { + set code [string range $text $ic $ic2-1] + if {[regexp "" $code]} { + set ic [expr {$ic2+[string length $tag2]}] + continue ;# already processed + } + set code [string map [list """ \" "&" & < "<" > ">"] $code] + ::hl_tcl::hl_init $txt -dark $darkedit -seen 99999999 + $txt replace 1.0 end $code + ::hl_tcl::hl_text $txt + set taglist [list] + foreach tag {tagCOM tagCOMTK tagSTR tagVAR tagCMN tagCMN2 tagPROC tagOPT} { + foreach {p1 p2} [$txt tag ranges $tag] { + lassign [split $p1 .] l1 c1 + lassign [split $p2 .] l2 c2 + lappend taglist [list [format %06d $l1][format %06d $c1] $tag 1 $p1] + lappend taglist [list [format %06d $l2][format %06d $c2] $tag 2 $p2] + } + } + set taglist [lsort -decreasing $taglist] + set lcode [split $code \n] + foreach tagdat $taglist { + lassign $tagdat -> tag typ pos + switch -exact $tag { + tagCOM { + set t1 "" + set t2 "" + } + tagCOMTK { + set t1 "" + set t2 "" + } + tagPROC { + set t1 "" + set t2 "" + } + tagSTR { + set t1 "" + set t2 "" + } + tagVAR { + set t1 "" + set t2 "" + } + tagCMN { + set t1 "" + set t2 "" + } + tagCMN2 { + set t1 "" + set t2 "" + } + tagOPT { + set t1 "" + set t2 "" + } + } + if {$typ==1} { + insertTag pos t1 lcode + } else { + insertTag pos t2 lcode + } + } + set code "" + foreach lc $lcode { + if {$code ne ""} {append code \n} + append code $lc + } + set code [string map [list \" """] $code] + set text1 [string range $text 0 $ic-1] + set text2 [string range $text $ic2 end] + set text "$text1$code" + set ic [string length $text] + set text "$text$text2" + } + } + } + } + set chan [open $htmlfile w] + chan configure $chan -encoding utf-8 + puts -nonewline $chan $text + close $chan +} +after idle exit +# _________________________________ EOF _________________________________ # +#% file copy -force .bak/index-SRC.html .bak/index.html +#% exec tclsh ./tcl_html.tcl .bak/index.html +#% exec opera .bak/index.html diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/pkgIndex.tcl new file mode 100644 index 00000000..de17d6e2 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/pkgIndex.tcl @@ -0,0 +1,209 @@ + +package ifneeded hl_tcl 1.1.6 [list source [file join $dir hl_tcl.tcl]] + +# short intro (for Ruff! docs generator) + +namespace eval ::hl_tcl { + + set _ruff_preamble { +The *hl_tcl* package is a syntax highlighter for Tcl/Tk code. + +It can be applied to a *Tk text* widget or to a static html page. + +The *Tk text* widget may be made read-only or editable. Also, the *hl_tcl* may take an argument, sort of command to watch the viewing / editing. + +When applied to html pages, the *hl_tcl* highlights Tcl/Tk code snippets embedded between <code> </code> tags. + +The *hl_tcl* has highlighted its own code in [Reference](https://aplsimple.github.io/en/tcl/hl_tcl/hl_tcl.html). + +## Some of blah-blah + +The Tcl being incredibly dynamic language sets a lot of problems before any Tcl syntax highlighter. Probably, the usage of quotes and esp. the strings spanning several lines are the main challenges. + +Below is a line that brings most (not *hl_tcl*, as seen in [Reference](https://aplsimple.github.io/en/tcl/hl_tcl/hl_tcl.html)) of Tcl highlighters in a stupor: + + if {[set i [string first {"} $line $i]]==-1} {return no} + +... as well as this one: + + regsub -all {(([^A-Z@]|\\@)[.?!]("|'|'')?([])])?) } $fieldText {\1 } fieldText + +Good luck for a highlighter when the second line (or similar) follows the first, giving it a matching quote and thus bringing it out of the stupor. + +Those orphan quotes are often used in `regexp` and `regsub` Tcl commands, so that when a honest Tcl highlighter (like Geany) stumbles upon an orphan quote, it tries its best to highlight the rest of code as a string, till the next unmatched quote. + +Thus, we have + + + +... instead of + + + +There are "tricky" highlighters (like Gedit) that behave more wisely at the stumbling an orphan quote: they permit only a one-line Tcl strings (if not continued with \\), so that the string highlighting would be most likely finished in the same line it started. No problems except for this silly line. And no delays due to the highlighting the rest of code... + +... as seen in: + + + +## Some of editors + +Geany. Probably, the best Tcl highlighter. And the great programming tool at that. Still, it has few drawbacks: + + * doesn't highlight the above mentioned Tcl lines properly + * doesn't highlight `${var}` in contrast with `$var` + * tries to highlight any (even hexidecimal) number it encounters, thus `set a 1fix` or `set b #abxxx` looks a bit peculiar + * `set c {{#000} #FFF}` is quite a legal Tcl command as well as `set c {#000 #FFF}`, not for Geany + * no highlighting TclOO (`method`, `my`, `mixin` etc.) + +Vim. Probably, the fastest Tcl highlighter. Great and awful. Nonetheless: + + * tricky with those above mentioned Tcl lines + * doesn't highlight ttk commands (Tk only) and TclOO + * tries to highlight every bit of Tcl, e.g. `set set set` is highlighted as three `set` commands ;) + * as a result, much more florid than most of others + +Kate. As nearly good as Geany. As nearly florid as Vim (`set set set`). Doesn't highlight ttk and TclOO. + +TKE. Written in Tcl/Tk, it might be the best of all to highlight the Tcl/Tk. In spite of its suspended state it still can. Issues with highlighting strings and the performance. + +Pluma and Gedit seem to use the same Tcl highlighting engine that gives rather good results. Still, the mentioned above drawbacks are here too. And no highlighting of tk, ttk, TclOO. + +Notepad++. Very fast Tcl highlighter. And very basic. All the same drawbacks. No highlighting of tk, ttk, TclOO. *Plus* an obsolete version of Tcl, i.e. no highlighting `lset`, `lassign` etc. + +## What can we do? + +To develop an ideal (correct and fast) Tcl/Tk highlighter, we would have to dive into Tcl core. Though, no hopes to achieve the ideal through repeating the core in Tcl/Tk or massively using the regular expressions. + +That said, while implementing Tcl/Tk highlighter *in pure Tcl/Tk*, we might hope to achieve a reasonable compromise between the performance and the elimination of blunders. + +It seems *hl_tcl* got close to this compromise. Specifically, it provides: + + * special highlighting for Tcl and TclOO commands + * special highlighting for Tk and ttk commands + * allowing additional commands to highlight (as Tk ones) + * special highlighting for declarations `proc`, `method`, `oo::class` etc. as well as `return`, `yield` + * special highlighting for `#comments`, `$variables`, `"strings"`, `-options` + * in-line comments being recognized and thus highlighted only after `;#` + * proper handling of most `regexp` and `regsub` expressions containing a quote + * highlighting the multi-line strings, with possible switching this mode off (a-la Gedit) to improve the performance + * customizing colors of the highlighting + * highlighting viewable/editable *Tk text* widget and static html pages + * good performance at editing 1000-4000 LOC and rather acceptable for 4000-9000 LOC + * even monstrous 10000 LOC and more are handled fast at the "tricky" mode a-la Gedit + +The *hl_tcl* doesn't provide the following: + + * highlighting *numbers* + * highlighting *brackets*, except for matched ones and inside the strings + +These are in no way critical drawbacks. A little less florid Tcl code might be even preferable for other tastes. + +The Tcl can arrange its pitfalls for *hl_tcl* (I know where). Also, tricky practices or tastes can make a fool of *hl_tcl*. Still hopefully these pranks are few and rare to encounter. + +## Use for text widget + +The code below: + + package require hl_tcl + + proc ::stub {args} {puts "stub: $args"} + + ::hl_tcl::hl_init $::txt -readonly yes -cmd ::stub + + #... inserting a text into the text widget + + ::hl_tcl::hl_text $::txt + +sets an example of *hl_tcl* usage. Here are the details: + + * *::stub* is a procedure to watch the text editing; here it simply puts out the text's last index; + + * *hl_init* is called *before* filling the text widget with a Tcl code; it sets the highlighting options and disables the highlighting till *hl_text* runs; + + * *hl_text* runs to highlight the Tcl code of the text widget and to view/edit it. + +The *hl_init* takes arguments: + + * *txt* is the text widget's path + * *args* contains options of text widget (omittable) + +The *args* is a list of `-option "value"` where `-option` may be: + + * `-colors` - list of colors: clrCOM, clrCOMTK, clrSTR, clrVAR, clrCMN, clrPROC, clrOPT + * `-dark` - flag "dark background of text", i.e. simplified `-colors` (default "no") + * `-font` - attributes of text font + * `-readonly` - flag "text is read-only" (default "no") + * `-multiline` - flag "multi-line strings" (default "yes") + * `-cmd` - command to watch editing/viewing (default "") + * `-cmdpos` - command to watch cursor positioning (default "") + * `-seen` - number of first lines seen at start (default 500) + * `-optRE` - flag "use a regular expression to highlight options" (default "yes") + * `-keywords` - additional commands to highlight (as Tk ones) + * `-dobind` - if `true`, forces keys binding at repeating calls of hl_init + * `-plaintext` - `true` for plain texts with no highlighting + * `-plaincom` - a command for plain highlighting line by line + +**Note**: `-seen 500` and `-multiline no` can improve the performance a lot. It's recommended to use `-seen 500` (or any other reasonable limit, e.g. `-seen 200`) at any rate, except for static html pages. + +A command for `-plaincom` option has two arguments: a current text's path and a current line's number. It should highlight the current line and return `true`, otherwise (if the current line is Tcl code) it returns `false`. An example of its usage is presented by [alited editor](https://github.com/aplsimple/alited) (**lib/addon** directory). + +The rest of *hl_tcl* procedures are: + + * `hl_all` updates all highlighted existing text widgets, e.g. at changing a color scheme of application + * `hl_readonly` gets/sets a read-only mode and/or a command to watch a text widget at viewing/editing it + * `hl_colors` gets a list of colors for highlighting + +See details in [Reference](https://aplsimple.github.io/en/tcl/hl_tcl/hl_tcl.html). + + +## Use for static html + +In the [hl_tcl.zip](https://chiselapp.com/user/aplsimple/repository/hl_tcl/download), there is a Tcl script named *tcl_html.tcl* that highlights Tcl snippets of static html page(s). + +It runs as follows: + + tclsh tcl_html.tcl "glob-pattern-of-html-files" + +For example: + + tclsh ~/UTILS/hl_tcl/tcl_html.tcl "~/UTILS/mulster/tasks/ruff/src/*" + +In this example, the html files are located in `~/UTILS/mulster/tasks/ruff/src`. + +Perhaps, you would want to modify the *tcl_html.tcl*, this way: + + * replace `"no"` with `"yes"` for dark html pages + + * replace `` with html tags *starting* the Tcl code in your html files + + * replace `` with html tags *finishing* the Tcl code in your html files + +These are arguments of `::hl_tcl_html::highlight` procedure. + +The tag pairs can be multiple if the html pages contain them, e.g. + + ::hl_tcl_html::highlight $fhtml "no" \ + {} {} \ + {
} {
} + +## Links + + * [Reference](https://aplsimple.github.io/en/tcl/hl_tcl/hl_tcl.html) + + * [Source](https://chiselapp.com/user/aplsimple/repository/hl_tcl/download) (hl_tcl.zip) + + * [Demo of hl_tcl v0.6.1](https://github.com/aplsimple/hl_tcl/releases/download/hl_tcl-0.6.1/hl_tcl-0.6.1.mp4) (25 Mb) + +Note that [hl_tcl](https://aplsimple.github.io/en/tcl/hl_tcl/hl_tcl.html) is still disposed to update. + } +} + +namespace eval ::hl_tcl::my { + + set _ruff_preamble { + The `::hl_tcl::my` namespace contains procedures for the "internal" usage by *hl_tcl* package. + + All of them are upper-cased, in contrast with the UI procedures of `hl_tcl` namespace. + } +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/tcl_html.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/tcl_html.tcl new file mode 100644 index 00000000..61674581 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/hl_tcl/tcl_html.tcl @@ -0,0 +1,26 @@ +#! /usr/bin/env tclsh +############################################################# +# Name: tcl_html.tcl +# Author: Alex Plotnikov (aplsimple@gmail.com) +# Date: Mar 08, 2024 +# Brief: Highlights Tcl code snippets in html files. +# Runs from CLI as follows: +# tclsh tcl_html.tcl ?cs=CS? file.html ?file.html? +# where CS is c1,c2,c3,c4,c5,c6,c7 (color list). +# License: MIT. +############################################################# + +source [file join [file dirname [info script]] hl_tcl_html.tcl] +set cs {} +foreach ghtml $::argv { + if {[string match -nocase cs=* $ghtml]} { + set cs [split $ghtml =] + } else { + foreach fhtml [glob $ghtml] { + ::hl_tcl_html::highlight $fhtml no {*}$cs \ + {} \ + {
} 
\ + + } + } +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/obbit.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/obbit.tcl new file mode 100644 index 00000000..0ac427a8 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/obbit.tcl @@ -0,0 +1,2318 @@ +# _______________________________________________________________________ # +# +# This script contains a bunch of oo::classes. A bit of it. +# +# The ObjectProperty class allows to mix-in into +# an object the getter and setter of properties. +# +# The ObjectTheming class allows to change the ttk widgets' style. +# +# _______________________________________________________________________ # + +namespace eval ::apave { + +# ________________________ apave's global variables _________________________ # + + variable FGMAIN #000000 ;# base fg/bg + variable BGMAIN #d9d9d9 + variable FGMAIN2 #000000 ;# field fg/bg + variable BGMAIN2 #ffffff + + variable FONTMAIN [font actual TkDefaultFont] + variable FONTMAINBOLD [list {*}$::apave::FONTMAIN -weight bold] + + # - common options/constants of apave utils + variable _PU_opts; array set _PU_opts [list -NONE =NONE=] + variable _AP_Properties; array set _AP_Properties [list] + set _PU_opts(_ERROR_) {} + set _PU_opts(_EOL_) {} + set _PU_opts(_LOGFILE_) {} + set _PU_opts(_MODALWIN_) [list] + # - main color scheme data + variable _C_ + array set _C_ [list] + # - localized messages + variable _MC_ + array set _MC_ [list] + namespace eval ::tk { ; # just to get localized messages + foreach m {&Abort &Cancel &Copy Cu&t &Delete E&xit &Filter &Ignore &No \ + OK Open P&aste &Quit &Retry &Save {Save As} &Yes Close {To clipboard} \ + Zoom Size} { + set m2 [string map {& {}} $m] + set ::apave::_MC_($m2) [string map {& {}} [msgcat::mc $m]] + } + } + +# ________________________ CS - color schemes _________________________ # + + ## ________________________ CS variables _________________________ ## + + variable _CS_ + array set _CS_ [list] + # - current color scheme data + set _CS_(initall) 1 + set _CS_(initWM) 1 + set _CS_(isActive) 1 + set _CS_(!FG) #000000 + set _CS_(!BG) #b7b7b7 ;#a8bcd2 #c3c3c3 #9cb0c6 #4a6984 + set _CS_(expo,tfg1) "-" + set _CS_(defFont) [font actual TkDefaultFont -family] + set _CS_(textFont) [font actual TkFixedFont -family] + set _CS_(smallFont) [font actual TkSmallCaptionFont] + set _CS_(fs) [font actual TkDefaultFont -size] + set _CS_(untouch) [list] + set _CS_(NONCS) -2 + set _CS_(MINCS) -1 + set _CS_(old) -3 + set _CS_(TONED) [list -2 no] + set _CS_(HUE) 0 + set _CS_(LABELBORDER) 0 + set _CS_(CURSORWIDTH) 2 + + ## ________________________ CS list _________________________ ## + +# Colors for : 1. meanings 2. code names + +# itemfg mainfg itembg mainbg itemsHL actbg actfg cursor greyed hot \ + emfg embg - menubg winfg winbg itemHL2 tabHL chkHL #005...reserved... #007 + +# clrtitf clrinaf clrtitb clrinab clrhelp clractb clractf clrcurs clrgrey clrhotk \ + fI bI --12-- bM fW bW itemHL2 tabHL chkHL #005...reserved... #007 + + set ::apave::_CS_(ALL) { +{{ 0: AwLight} "#141414" #151616 #dfdfde #d1d1d0 #28578a #85b4e7 #000 #444 grey #4776a9 #000 #97c6f9 - #bebebd #000 #FBFB96 #cacaca #a20000 #76b2f1 #005 #006 #007} + +{{ 1: AzureLight} "#050b0d" #050b0d #ffffff #e1e1e1 #00516b #a2f2ff #000 #444 grey #007f99 #000 #92e2ef - #cccccc #000 #FBFB95 #e2e2e0 #ad0000 #76b2f1 #005 #006 #007} + +{{ 2: ForestLight} "#050b0d" #050b0d #ffffff #e1e1e1 #1d5d1d #A8CCA8 #000 #185818 grey #328457 #000 #b6cbb6 - #cccccc #000 #FBFB95 #e2e2e0 #ad0000 #76b2f1 #005 #006 #007} + +{{ 3: SunValleyLight} "#050b0d" #050b0d #ffffff #e1e1e1 #1056af #74c9ff #000 #444 grey #1574cd #000 #84d9ff - #cccccc #000 #FBFB95 #e2e2e0 #950000 #76b2f1 #005 #006 #007} + +{{ 4: LightBrown} "#00002f" #00001a #f6f4f2 #f6f4f2 #7b3e30 #edc89b #000 #682800 grey #d59e6d #000000 #deb98c - #dfdddb #000 #FBFB95 #e3e2e0 #a30000 #900000 #005 #006 #007} + +{{ 5: Grey1} "#050b0d" #050b0d #F8F8F8 #dadad8 #933232 #b8b8b8 #000 #444 grey #843e3e #000 #AFAFAF - #caccd0 #000 #FBFB95 #e0e0d8 #a20000 #76b2f1 #005 #006 #007} + +{{ 6: Grey2} "#050b0d" #050b0d #f4f4f4 #F8F8F8 #5c1616 #c8c8c8 #000 #444 grey #933232 #000 #c1c1c1 - #e7e7e7 #000 #FBFB95 #e5e5e5 #a20000 #76b2f1 #005 #006 #007} + +{{ 7: Rosy} "#2B122A" #000000 #FFFFFF #F6E6E9 #712371 #d0b8d3 #000 #630063 grey #954799 #000 #ceb6d1 - #e3d3d6 #000 #FBFB95 #e5e3e1 #a20000 #76b2f1 #005 #006 #007} + +{{ 8: Clay} "#000000" #000000 #fdf4ed #e6dbd4 #6e300d #bcaea2 #000 #444 grey #813b3b #000 #c6b4ac - #d5c9c1 #000 #FBFB95 #e1dfde #a20000 #76b2f1 #005 #006 #007} + +{{ 9: Dawn} "#08085D" #030358 #FFFFFF #e4fafa #794545 #a3dce5 #000 #195999 grey #ae4d4d #000 #99d2db - #d3e9e9 #000 #FBFB96 #dbe9ed #a20000 #76b2f1 #005 #006 #007} + +{{10: Sky} "#102433" #0A1D33 #d0fdff #bdf6ff #713d3d #95ced7 #000 #195999 grey #a94848 #000 #9ad3dc - #b1eaf3 #000 #FBFB95 #c0e9ef #a20000 #76b2f1 #005 #006 #007} + +{{11: Florid} "#000000" #004000 #e4fce4 #fff #8b4545 #93e493 #0F2D0F #185818 grey #9a481a #004000 #a7f8a7 - #d8e7d8 #000 #FBFB96 #d7e6d7 #a20000 #76b2f1 #005 #006 #007} + +{{12: LightGreen} "#122B05" #091900 #edffed #DEF8DE #764242 #A8CCA8 #000 #185818 grey #a34242 #000 #A8CCA8 - #cde7cd #000 #FBFB96 #dee9de #a20000 #76b2f1 #005 #006 #007} + +{{13: InverseGreen} "#122B05" #091900 #e5ffe1 #d7f1d7 #6d3939 #a7cba7 #000 #185818 grey #a94848 #000 #afd3af - #c9e3c9 #000 #FBFB96 #d6e8d5 #a20000 #76b2f1 #005 #006 #007} + +{{14: GreenPeace} "#001000" #001000 #e1ffdd #cfe4cf #733f3f #a5c3a1 #000 #185818 grey #af4e4e #000 #9cb694 - #c1dbc1 #000 #FBFB96 #d2e1d2 #a20000 #76b2f1 #005 #006 #007} + +{{15: African} "#000000" #000000 #ffffff #ffffe7 #8a4444 #ffd797 #000 #682800 #7e7e7e #a44a2d #000 #f7bf91 - #e7e7cf #000 #fbfb74 #ededd5 #a20000 #76b2f1 #005 #006 #007} + +{{16: African1} "#000000" #000000 #ffffff #ebebd3 #8a4444 #ebc383 #000 #682800 #7e7e7e #9d4326 #000 #f7bf91 - #dbdbc3 #000 #fbfb74 #ededd5 #a20000 #76b2f1 #005 #006 #007} + +{{17: African2} "#000000" #000000 #f7f7dc #dedbb4 #8e4848 #f2b482 #000 #682800 grey #9f4528 #000 #e6ae80 - #ccc9a2 #000 #fbfb74 #e7e7cb #a20000 #76b2f1 #005 #006 #007} + +{{18: African3} "#000000" #000000 #e2deb5 #ccc9a6 #813b3b #e1a97b #000 #682800 grey #a44a2d #000 #e6ae80 - #bbb895 #000 #fbfb74 #c9c9b0 #c10000 #76b2f1 #005 #006 #007} + +{{19: Notebook} "#000000" #000000 #e9e1c8 #d2ccb8 #692323 #d59d6f #000 #682800 #7e7e7e #92381b #000 #c09c77 - #dbd5c1 #000 #eded89 #dad2b9 #a20000 #76b2f1 #005 #006 #007} + +{{20: Notebook1} "#000000" #000000 #dad2b9 #bfb9a5 #692323 #d59d6f #000 #682800 #707070 #92381b #000 #ba9671 - #c5bfab #000 #eded89 #ccc4ab #a20000 #76b2f1 #005 #006 #007} + +{{21: Notebook2} "#000000" #000000 #d1c9b0 #b1ab97 #692323 #d59d6f #000 #682800 #606060 #92381b #000 #c38b5d - #bdb7a3 #000 #e3e37f #c1b9a0 #980000 #76b2f1 #005 #006 #007} + +{{22: Notebook3} "#000000" #000000 #c2baa1 #a6a08c #793333 #cb9365 #000 #682800 #505050 #973d20 #000 #d59d6f - #b3ad99 #000 #dada76 #b2aa91 #7b1010 #76b2f1 #005 #006 #007} + +{{23: Dusk} "#ececec" #ececec #1a1f21 #262b2d #90afca #4a6984 #FFF #f4f49f #585d5f #7897b2 #fff #41607b - #363b3d #000 #9d9d60 #23282a #ffc341 #8cabc6 #005 #006 #007} + +{{24: SunValleyDeep} "#dfdfdf" #dddddd #131313 #323232 #aae2ff #2a627f #FFF #f4f49f #6f6f6f #7db5d2 #fff #245c79 - #3e3e3e #000 #9d9d60 #2a2a2a #efaf6f #4273eb #005 #006 #007} + +{{25: AwDark} "#F0E8E8" #E7E7E7 #1f2223 #232829 #77b3f2 #215d9c #fff #f4f49f grey #5793d2 #fff #0d4988 - #313637 #000 #9d9d60 #292e2f #ffc341 #76b2f1 #005 #006 #007} + +{{26: AzureDark} "#ececec" #c7c7c7 #272727 #393939 #56d5ff #0a89c1 #FFF #f4f49f grey #36b5ed #ffffff #0069a1 - #4a4a4a #000 #aaaa6d #383838 #ffc341 #76b2f1 #005 #006 #007} + +{{27: ForestDark} "#ececec" #c7c7c7 #272727 #393939 #a3cda3 #217346 #FFF #42ff42 grey #84ae84 #fff #247649 - #4a4a4a #000 #aaaa6d #383838 #efaf6f #99dd99 #005 #006 #007} + +{{28: SunValleyDark} "#ececec" #c7c7c7 #272727 #323232 #aae2ff #2a627f #fff #f4f49f grey #7cb4d1 #fff #245c79 - #444444 #000 #aaaa6d #343434 #ffc341 #76b2f1 #005 #006 #007} + +{{29: DarkBrown} "#e0e0e0" #e0e0e0 #171717 #232323 #de9e5e #6d4d29 #fff #f4f49f #616161 #aa7d3d #dfdfdf #62421e - #303030 #000 #9d9d60 #292929 #ffc341 #76b2f1 #005 #006 #007} + +{{30: Dark1} "#E0D9D9" #C4C4C4 #212121 #292929 #de9e5e #6c6c6c #fff #f4f49f #606060 #ba8d4d #000 #767676 - #363636 #000 #9d9d60 #292929 #ffc341 #76b2f1 #005 #006 #007} + +{{31: Dark2} "#bebebe" #bebebe #1f1f1f #262626 #de9e5e #6b6b6b #fff #f4f49f #616161 #b28545 #000 #767676 - #323232 #000 #9d9d60 #262626 #ffc341 #76b2f1 #005 #006 #007} + +{{32: Oscuro} "#f1f1f1" #ffffff #314242 #3e5959 #f1b479 #6c8787 #fff #42ff42 #afafaf #d3a051 #fff #5b7676 - #4d6868 #000 #aaaa6d #425353 #ffc341 #94e2b8 #005 #006 #007} + +{{33: Oscuro1} "#e3e3e3" #f7f7f7 #233434 #304b4b #e3a66b #5e7979 #fff #42ff42 #a1a1a1 #d6a354 #fff #4e6969 - #3f5a5a #000 #aaaa6d #344545 #ffcb8b #86d4aa #005 #006 #007} + +{{34: Oscuro2} "#d5d5d5" #f1f1f1 #152626 #223d3d #d5985d #506b6b #fff #42ff42 #939393 #c69344 #fff #435e5e - #314c4c #000 #9d9d60 #263737 #ffc585 #78c69c #005 #006 #007} + +{{35: Oscuro3} "#c7c7c7" #eaeaea #071818 #142f2f #dfa267 #425d5d #fff #42ff42 #858585 #ba8738 #fff #324d4d - #233e3e #000 #9d9d60 #182929 #e9ae6e #6ab88e #005 #006 #007} + +{{36: MildDark} "#d2d2d2" #ffffff #223142 #2D435B #3ddbdb #517997 #fff #00ffff grey #18b6b6 #fff #3e6684 - #3a5068 #000 #aaaa6d #324152 #ffc341 #76b2f1 #005 #006 #007} + +{{37: MildDark1} "#c8c8c8" #f7f7f7 #1a2937 #24384f #3cdada #466e8c #fff #00ffff #757575 #19b7b7 #fff #3a6280 - #31455c #000 #aaaa6d #2b3a48 #f1b171 #76b2f1 #005 #006 #007} + +{{38: MildDark2} "#e2e2e2" #f1f1f1 #0e1d2c #1B3048 #3edddd #426a88 #fff #00ffff #6c6c6c #0ba9a9 #fff #355d7b - #2a3f57 #000 #9d9d60 #1d2c3b #f4b474 #76b2f1 #005 #006 #007} + +{{39: MildDark3} "#dbdbdb" #eaeaea #000c1b #031830 #35d4d4 #375f7d #fff #00ffff #6c6c6c #019f9f #fff #2f5775 - #162b43 #000 #9d9d60 #0a1f37 #e5a565 #76b2f1 #005 #006 #007} + +{{40: Inkpot} "#d3d3ff" #AFC2FF #16161f #1E1E27 #e39f51 #525293 #fff #f4f49f #6e6e6e #b57535 #fff #4d4d8e - #292936 #000 #9d9d60 #202029 #e7b070 #7a7abb #005 #006 #007} + +{{41: Quiverly} "#cdd8d8" #cdd8d8 #2b303b #333946 #69daff #2a627f #fff #f4f49f #757575 #46b7ee #fff #306885 - #414650 #000 #aaaa6d #323742 #ffc341 #76b2f1 #005 #006 #007} + +{{42: Monokai} "#f8f8f2" #f8f8f2 #353630 #4e5044 #ffbb6d #707070 #fff #f4f49f #9a9a9a #db9e63 #000 #777777 - #46473d #000 #b7b77a #3c3d37 #ffc888 #cd994b #005 #006 #007} + +{{43: TKE Default} "#dbdbdb" #dbdbdb #000000 #282828 #d3a85a #0a0acc #fff #f4f49f #6a6a6a #c58545 #fff #0000d3 - #383838 #000 #9d9d60 #1b1c1c #e5a565 #76b2f1 #005 #006 #007} + +{{44: Magenta} "#E8E8E8" #F0E8E8 #381e44 #4A2A4A #ffbb6d #846484 #fff #f4f49f grey #d6995e #000 #ad8dad - #573757 #000 #9d9d60 #42284e #ffc888 #ffafff #005 #006 #007} + +{{45: Red} "#ffffff" #e9e9e6 #340202 #440702 #ffbb6d #b05e5e #fff #f4f49f #828282 #ce9156 #000 #ba6868 - #521514 #000 #9d9d60 #461414 #ffcf8f #ff9a9a #005 #006 #007} + +{{46: Chocolate} "#d6d1ab" #d6d1ab #251919 #402020 #ebb474 #664D4D #fff #f4f49f #828282 #c08040 #fff #583f3f - #432a2a #000 #aaaa6d #2d2121 #eeb777 #cf9292 #005 #006 #007} + +{{47: Desert} "#ffffff" #ffffff #47382d #5a4b40 #ffbb6d #85766b #fff #f4f49f #a2a2a2 #d4975c #fff #7f7065 - #695a4f #000 #aaaa6d #503f34 #ffc341 #ead79b #005 #006 #007} +} + + set ::apave::_CS_(STDCS) [expr {[llength $::apave::_CS_(ALL)] - 1}] + +} + +# _____________________________ Common procs ________________________________ # + + proc ::apave::mc {msg} { + # Gets a localized version of a message. + # msg - the message + + variable _MC_ + if {[info exists _MC_($msg)]} {return $_MC_($msg)} + return $msg + } + +## ________________________ Inits _________________________ ## + +proc ::apave::initWM {args} { + # Initializes Tcl/Tk session. Used to be called at the beginning of it. + # args - options ("name value" pairs) + # If args eq "?", return a flag "need to call initWM" + + if {$args eq {?}} {return $::apave::_CS_(initWM)} + if {!$::apave::_CS_(initWM)} return + ::apave::withdraw . + ::apave::place . 0 0 center + lassign [parseOptions $args -cursorwidth $::apave::cursorwidth -theme default \ + -buttonwidth -8 -buttonborder 1 -labelborder 0 -padding 1 -cs -2 -isbaltip yes] \ + cursorwidth theme buttonwidth buttonborder labelborder padding cs ::apave::ISBALTIP + initBaltip + if {$theme eq {}} {set theme default} + if {$cs<-2 || $cs>47} {set cs -2} + set ::apave::_CS_(initWM) 0 + set ::apave::_CS_(CURSORWIDTH) $cursorwidth + set ::apave::_CS_(LABELBORDER) $labelborder + # for default theme: only most common settings + set tfg1 $::apave::_CS_(!FG) + set tbg1 $::apave::_CS_(!BG) + if {$theme ne {} && [catch {ttk::style theme use $theme}]} { + catch {ttk::style theme use default} + } + ttk::style map . \ + -selectforeground [list !focus $tfg1 {focus active} $tfg1] \ + -selectbackground [list !focus $tbg1 {focus active} $tbg1] + ttk::style configure . -selectforeground $tfg1 -selectbackground $tbg1 + + # configure separate widget types + ttk::style configure TButton -anchor center -width $buttonwidth \ + -relief raised -borderwidth $buttonborder -padding $padding + ttk::style configure TMenubutton -width 0 -padding 0 + # TLabel's standard style saved for occasional uses + initStyle TLabelSTD TLabel -anchor w + # ... TLabel new style + ttk::style configure TLabel -borderwidth $labelborder -padding $padding + # ... Treeview colors + set twfg [ttk::style map Treeview -foreground] + set twfg [putOption selected $tfg1 {*}$twfg] + set twbg [ttk::style map Treeview -background] + set twbg [putOption selected $tbg1 {*}$twbg] + ttk::style map Treeview -foreground $twfg + ttk::style map Treeview -background $twbg + # ... TCombobox colors + ttk::style map TCombobox -fieldforeground [list {active focus} $tfg1 readonly $tfg1 disabled grey] + ttk::style map TCombobox -fieldbackground [list {active focus} $tbg1 {readonly focus} $tbg1 {readonly !focus} white] + initStyles + initPOP . + if {$cs!=-2} {obj csSet $cs} +} +#_______________________ + +proc ::apave::endWM {args} { + # Finishes the window management by apave, closing and clearing all. + # args - if any set, means "ask if apave's WM is finished" + + if {[llength $args]} {return [info exists ::apave::_CS_(endWM)]} + set ::apave::_CS_(endWM) yes +} +#_______________________ + +proc ::apave::initPOP {w} { + # Initializes system popup menu (if possible) to call it in a window. + # w - window's name + + bind $w { + if {"%K" eq "Menu"} { + if {[winfo exists [set w [focus]]]} { + event generate $w -rootx [winfo pointerx .] \ + -rooty [winfo pointery .] + } + } + } +} +#_______________________ + +proc ::apave::ttkToolbutton {} { + # Initializes Toolbutton's style, depending on CS. + # Creates also btt / brt / blt widget types to be paved, + # with images top / right / left accordingly. + + lassign [obj csGet] fg1 - bg1 + ttk::style map Toolbutton {*}[dict replace [ttk::style map Toolbutton] \ + -foreground "pressed $fg1 active $fg1" -background "pressed $bg1 active $bg1"] + defaultAttrs btt {} {-style Toolbutton -compound top -takefocus 0} ttk::button + defaultAttrs brt {} {-style Toolbutton -compound right -takefocus 0} ttk::button + defaultAttrs blt {} {-style Toolbutton -compound left -takefocus 0} ttk::button +} +#_______________________ + +proc ::apave::initStyle {wt wbase args} { + # Initializes a style for a widget type, e.g. button's. + # wt - target widget type + # wbase - base widget type + # args - options of the style + + ttk::style configure $wt {*}[ttk::style configure $wbase] + ttk::style configure $wt {*}$args + ttk::style map $wt {*}[ttk::style map $wbase] + ttk::style layout $wt [ttk::style layout $wbase] +} +#_______________________ + +proc ::apave::initStyles {} { + # Initializes miscellaneous styles, e.g. button's. + + obj create_Fonts + initStyle TButtonWest TButton -anchor w -font $::apave::FONTMAIN + initStyle TButtonBold TButton -font $::apave::FONTMAINBOLD + initStyle TButtonWestBold TButton -anchor w -font $::apave::FONTMAINBOLD + initStyle TButtonWestHL TButton -anchor w -foreground [lindex [obj csGet] 4] + initStyle TMenuButtonWest TMenubutton -anchor w -font $::apave::FONTMAIN -relief raised + initStyle TreeNoHL Treeview -borderwidth 0 + lassign [obj csGet] - - - - thlp tbgS tfgS - - bclr + ttk::style map TreeNoHL {*}[ttk::style map Treeview] \ + -foreground [list {selected focus} $tfgS {selected !focus} $tfgS] \ + -background [list {selected focus} $tbgS {selected !focus} $tbgS] +} +#_______________________ + +proc ::apave::initStylesFS {args} { + # Initializes miscellaneous styles, e.g. button's. + # args - font options ("name value" pairs) + + ::apave::obj create_Fonts + set font "$::apave::FONTMAIN $args" + set fontB "$::apave::FONTMAINBOLD $args" + + initStyle TLabelFS TLabel -font $font + initStyle TCheckbuttonFS TCheckbutton -font $font + initStyle TComboboxFS TCombobox -font $font + initStyle TRadiobuttonFS TRadiobutton -font $font + initStyle TButtonWestFS TButton -anchor w -font $font + initStyle TButtonBoldFS TButton -font $fontB + initStyle TButtonWestBoldFS TButton -anchor w -font $fontB +} +#_______________________ + +proc ::apave::InitAwThemesPath {libdir} { + # Initializes the path to awthemes package. + # libdir - root directory of themes (where 'theme' subdirectory is) + + global auto_path + set awpath [file join $libdir theme awthemes-10.4.0] + if {[lindex $auto_path 0] ne $awpath} { + set auto_path [linsert $auto_path 0 $awpath] + } +} +#_______________________ + +proc ::apave::InitTheme {intheme libdir} { + # Initializes app's theme. + # intheme - name of the theme + # libdir - root directory of themes (where 'theme' subdirectory is) + # Returns a list of theme name and label's border (for status bar). + # The returned values are used in ::apave::initWM procedure. + + set theme {} + switch -glob -- $intheme { + azure* - sun-valley* { + set i [string last - $intheme] + set name [string range $intheme 0 $i-1] + set type [string range $intheme $i+1 end] + catch {source [file join $libdir theme $name $name.tcl]} + catch { + set_theme $type + set theme $intheme + } + set lbd 0 + } + forest* { + set i [string last - $intheme] + set name [string range $intheme 0 $i-1] + set type [string range $intheme $i+1 end] + catch { + source [file join $libdir theme $name $intheme.tcl] + set theme $intheme + } + set lbd 0 + } + awdark - awlight { + catch {package forget ttk::theme::$intheme} + catch {namespace delete ttk::theme::$intheme} + catch {package forget awthemes} + catch {namespace delete awthemes} + InitAwThemesPath $libdir + package require awthemes + package require ttk::theme::$intheme + set theme $intheme + set lbd 1 + } + plastik - lightbrown - darkbrown { + set path [file join $libdir theme $intheme] + source [file join $path $intheme.tcl] + set theme $intheme + set lbd 1 + } + default { + set theme $intheme + set lbd 1 + } + } + list $theme $lbd +} +#_______________________ + +proc ::apave::iconifyOption {args} { + # Gets/sets "-iconify" option. + # args - if contains no arguments, gets "-iconify" option; otherwise sets it + # Option values mean: + # none - do nothing: no withdraw/deiconify + # Linux - do withdraw/deiconify for Linux + # Windows - do withdraw/deiconify for Windows + # default - do withdraw/deiconify depending on the platform + # See also: withdraw, deiconify + + if {[llength $args]} { + set iconify [::apave::obj setShowOption -iconify $args] + } else { + set iconify [::apave::obj getShowOption -iconify] + } + return $iconify +} +#_______________________ + +proc ::apave::withdraw {w} { + # Does 'withdraw' for a window. + # w - the window's path + # See also: iconifyOption + + switch -- [iconifyOption] { + none { ; # no withdraw/deiconify actions + } + Linux { ; # do it for Linux + wm withdraw $w + } + Windows { ; # do it for Windows + wm withdraw $w + wm attributes $w -alpha 0.0 + } + default { ; # do it depending on the platform + wm withdraw $w + if {[::iswindows]} { + wm attributes $w -alpha 0.0 + } + } + } +} +#_______________________ + +proc ::apave::deiconify {w} { + # Does 'deiconify' for a window. + # w - the window's path + # See also: iconifyOption + + switch -- [iconifyOption] { + none { ; # no withdraw/deiconify actions + } + Linux { ; # do it for Linux + catch {wm deiconify $w ; raise $w} + } + Windows { ; # do it for Windows + if {[wm attributes $w -alpha] < 0.1} {wm attributes $w -alpha 1.0} + catch {wm deiconify $w ; raise $w} + } + default { ; # do it depending on the platform + if {[::iswindows]} { + if {[wm attributes $w -alpha] < 0.1} {wm attributes $w -alpha 1.0} + } + catch {wm deiconify $w ; raise $w} + } + } +} +#_______________________ + +proc ::apave::cs_Active {{flag ""}} { + # Gets/sets "is changing CS possible" flag for a whole application. + + if {[string is boolean -strict $flag]} { + set ::apave::_CS_(isActive) $flag + } + return $::apave::_CS_(isActive) +} + +## ________________________ Property _________________________ ## + +proc ::apave::setProperty {name args} { + # Sets a property's value as "application-wide". + # name - name of property + # args - value of property + # If *args* is omitted, the method returns a property's value. + # If *args* is set, the method sets a property's value as $args. + + variable _AP_Properties + switch -exact [llength $args] { + 0 {return [getProperty $name]} + 1 {return [set _AP_Properties($name) [lindex $args 0]]} + } + puts -nonewline stderr \ + "Wrong # args: should be \"::apave::setProperty propertyname ?value?\"" + return -code error +} +#_______________________ + +proc ::apave::getProperty {name {defvalue ""}} { + # Gets a property's value as "application-wide". + # name - name of property + # defvalue - default value + # If the property had been set, the method returns its value. + # Otherwise, the method returns the default value (`$defvalue`). + + variable _AP_Properties + if {[info exists _AP_Properties($name)]} { + return $_AP_Properties($name) + } + return $defvalue +} + +## ________________________ CS procs _________________________ ## + +proc ::apave::cs_Non {} { + # Gets non-existent CS index + + return -3 +} +#_______________________ + +proc ::apave::cs_Min {} { + # Gets a minimum index of available color schemes + + return $::apave::_CS_(MINCS) +} + +proc ::apave::cs_Max {} { + # Gets a maximum index of available color schemes + + expr {[llength $::apave::_CS_(ALL)] - 1} +} + +proc ::apave::cs_MaxBasic {} { + # Gets a maximum index of basic color schemes + + return $::apave::_CS_(STDCS) +} + +## ________________________ Opfions _________________________ ## + +proc ::apave::parseOptionsFile {strict inpargs args} { + # Parses argument list containing options and (possibly) a file name. + # strict - if 0, 'args' options will be only counted for, + # other options are skipped + # strict - if 1, only 'args' options are allowed, + # all the rest of inpargs to be a file name + # - if 2, the 'args' options replace the + # appropriate options of 'inpargs' + # inpargs - list of options, values and a file name + # args - list of default options + # + # The inpargs list contains: + # - option names beginning with "-" + # - option values following their names (may be missing) + # - "--" denoting the end of options + # - file name following the options (may be missing) + # + # The *args* parameter contains the pairs: + # - option name (e.g., "-dir") + # - option default value + # + # If the *args* option value is equal to =NONE=, the *inpargs* option + # is considered to be a single option without a value and, + # if present in inpargs, its value is returned as "yes". + # + # If any option of *inpargs* is absent in *args* and strict==1, + # the rest of *inpargs* is considered to be a file name. + # + # The proc returns a list of two items: + # - an option list got from args/inpargs according to 'strict' + # - a file name from inpargs or {} if absent + # + # Examples see in tests/obbit.test. + + variable _PU_opts + set actopts true + array set argarray "$args yes yes" ;# maybe, tail option without value + if {$strict==2} { + set retlist $inpargs + } else { + set retlist $args + } + set retfile {} + for {set i 0} {$i < [llength $inpargs]} {incr i} { + set parg [lindex $inpargs $i] + if {$actopts} { + if {$parg eq "--"} { + set actopts false + } elseif {[catch {set defval $argarray($parg)}]} { + if {$strict==1} { + set actopts false + append retfile $parg " " + } else { + incr i + } + } else { + if {$strict==2} { + if {$defval == $_PU_opts(-NONE)} { + set defval yes + } + incr i + } else { + if {$defval == $_PU_opts(-NONE)} { + set defval yes + } else { + set defval [lindex $inpargs [incr i]] + } + } + set ai [lsearch -exact $retlist $parg] + incr ai + set retlist [lreplace $retlist $ai $ai $defval] + } + } else { + append retfile $parg " " + } + } + list $retlist [string trimright $retfile] +} +#_______________________ + +proc ::apave::parseOptions {opts args} { + # Parses argument list containing options. + # opts - list of options and values + # args - list of "option / default value" pairs + # It's the same as parseOptionsFile, excluding the file name stuff. + # Returns a list of options' values, according to args. + # See also: parseOptionsFile + + lassign [::apave::parseOptionsFile 0 $opts {*}$args] tmp + foreach {nam val} $tmp { + lappend retlist $val + } + return $retlist +} +#_______________________ + +proc ::apave::extractOptions {optsVar args} { + # Gets options' values and removes the options from the input list. + # optsVar - variable name for the list of options and values + # args - list of "option / default value" pairs + # Returns a list of options' values, according to args. + # See also: parseOptions + + upvar 1 $optsVar opts + set retlist [::apave::parseOptions $opts {*}$args] + foreach {o v} $args { + set opts [::apave::removeOptions $opts $o] + } + return $retlist +} +#_______________________ + +proc ::apave::getOption {optname args} { + # Extracts one option from an option list. + # optname - option name + # args - option list + # Returns an option value or "". + # Example: + # set options [list -name some -value "any value" -tip "some tip"] + # set optvalue [::apave::getOption -tip {*}$options] + + set optvalue [lindex [::apave::parseOptions $args $optname ""] 0] + return $optvalue +} +#_______________________ + +proc ::apave::putOption {optname optvalue args} { + # Replaces or adds one option to an option list. + # optname - option name + # optvalue - option value + # args - option list + # Returns an updated option list. + + set optlist {} + set doadd true + foreach {a v} $args { + if {$a eq $optname} { + set v $optvalue + set doadd false + } + lappend optlist $a $v + } + if {$doadd} {lappend optlist $optname $optvalue} + return $optlist +} +#_______________________ + +proc ::apave::removeOptions {opts args} { + # Removes some options from a list of options. + # opts - list of options and values + # args - list of option names to remove + # The `opts` may contain "key value" pairs and "alone" options + # without values. + # To remove "key value" pairs, `key` should be an exact name. + # To remove an "alone" option, `key` should be a glob pattern with `*`. + + foreach key $args { + while {[incr maxi]<99} { + if {[set i [lsearch -exact $opts $key]]>-1} { + catch { + # remove a pair "option value" + set opts [lreplace $opts $i $i] + set opts [lreplace $opts $i $i] + } + } elseif {[string first * $key]>=0 && \ + [set i [lsearch -glob $opts $key]]>-1} { + # remove an option only + set opts [lreplace $opts $i $i] + } else { + break + } + } + } + return $opts +} + +## ________________________ Text file _________________________ ## + +proc ::apave::error {{fileName ""}} { + # Gets the error's message at reading/writing. + # fileName - if set, return a full error messageat opening file + + variable _PU_opts + if {$fileName eq ""} { + return $_PU_opts(_ERROR_) + } + return "Error of access to\n\"$fileName\"\n\n$_PU_opts(_ERROR_)" +} +#_______________________ + +proc ::apave::textsplit {textcont} { + # Splits a text's contents by EOLs. Those inventors of EOLs... + # textcont - text's contents + + split [string map [list \r\n \n \r \n] $textcont] \n +} +#_______________________ + +proc ::apave::textEOL {{EOL "-"}} { + # Gets/sets End-of-Line for text reqding/writing. + # EOL - LF, CR, CRLF or {} + # If EOL omitted or equals to {} or "-", return the current EOL. + # If EOL equals to "translation", return -translation option or {}. + + variable _PU_opts + if {$EOL eq "-"} {return $_PU_opts(_EOL_)} + if {$EOL eq "translation"} { + if {$_PU_opts(_EOL_) eq ""} {return ""} + return "-translation $_PU_opts(_EOL_)" + } + set _PU_opts(_EOL_) [string trim [string tolower $EOL]] +} +#_______________________ + +proc ::apave::textChanConfigure {channel {coding {}} {eol {}}} { + # Configures a channel for text file. + # channel - the channel + # coding - if set, defines encoding of the file + # eol - if set, defines EOL of the file + + if {$coding eq {}} { + chan configure $channel -encoding utf-8 + } else { + chan configure $channel -encoding $coding + } + if {$eol eq {}} { + chan configure $channel {*}[::apave::textEOL translation] + } else { + chan configure $channel -translation $eol + } +} +#_______________________ + +proc ::apave::logName {fname} { + # Sets a log file's name. + # fname - file name + # If fname is {}, disables logging. + + variable _PU_opts; + set _PU_opts(_LOGFILE_) [file normalize $fname] +} +#_______________________ + +proc ::apave::logMessage {msg {lev 16}} { + # Logs messages to a log file. + # msg - the message + # lev - maximum level for [info level] to introspect calls + # A log file's name is set by _PU_opts(_LOGFILE_). If it's blank, + # no logging is made. + + variable _PU_opts; + if {$_PU_opts(_LOGFILE_) eq {}} return + set chan [open $_PU_opts(_LOGFILE_) a] + set dt [clock format [clock seconds] -format {%d%b'%y %T}] + set msg "$dt $msg" + for {set i $lev} {$i>0} {incr i -1} { + catch { + lassign [info level -$i] p1 p2 + if {$p1 eq {my}} {append p1 " $p2"} + append msg " / $p1" + } + } + puts $chan $msg + close $chan + puts "$_PU_opts(_LOGFILE_) - $msg" +} +#_______________________ + +proc ::apave::readTextFile {fname {varName ""} {doErr 0} args} { + # Reads a text file. + # fname - file name + # varName - variable name for file content or "" + # doErr - if 'true', exit at errors with error message + # Returns file contents or "". + + variable _PU_opts + if {$varName ne {}} {upvar $varName fvar} + if {[catch {set chan [open $fname]} _PU_opts(_ERROR_)]} { + if {$doErr} {error [::apave::error $fname]} + set fvar {} + } else { + set enc [::apave::getOption -encoding {*}$args] + set eol [string tolower [::apave::getOption -translation {*}$args]] + if {$eol eq {}} {set eol auto} ;# let EOL be autodetected by default + ::apave::textChanConfigure $chan $enc $eol + set fvar [read $chan] + close $chan + logMessage "read $fname" + } + return $fvar +} +#_______________________ + +proc ::apave::writeTextFile {fname {varName ""} {doErr 0} {doSave 1} args} { + # Writes to a text file. + # fname - file name + # varName - variable name for file content or "" + # doErr - if 'true', exit at errors with error message + # doSave - if 'true', saves an empty file, else deletes it + # Returns "yes" if the file was saved successfully. + + variable _PU_opts + if {$varName ne {}} { + upvar $varName contents + } else { + set contents {} + } + set res yes + if {!$doSave && [string trim $contents] eq {}} { + if {[catch {file delete $fname} _PU_opts(_ERROR_)]} { + set res no + } else { + logMessage "delete $fname" + } + } elseif {[catch {set chan [open $fname w]} _PU_opts(_ERROR_)]} { + set res no + } else { + set enc [::apave::getOption -encoding {*}$args] + set eol [string tolower [::apave::getOption -translation {*}$args]] + ::apave::textChanConfigure $chan $enc $eol + puts -nonewline $chan $contents + close $chan + logMessage "write $fname" + } + if {!$res && $doErr} {error [::apave::error $fname]} + return $res +} +#_______________________ + +proc ::apave::undoIn {wtxt} { + # Enters a block of undo/redo for a text widget. + # wtxt - text widget's path + # Run before massive changes of the text, to have Undo/Redo done at one blow. + # See also: undoOut + + $wtxt configure -autoseparators no + $wtxt edit separator +} +#_______________________ + +proc ::apave::undoOut {wtxt} { + # Exits a block of undo/redo for a text widget. + # wtxt - text widget's path + # Run after massive changes of the text, to have Undo/Redo done at one blow. + # See also: undoIn + + $wtxt edit separator + $wtxt configure -autoseparators yes +} + +## ________________________ Binds _________________________ ## + +proc ::apave::bindToEvent {w event args} { + # Binds an event on a widget to a command. + # w - the widget's path + # event - the event + # args - the command + + ::baltip::my::BindToEvent $w $event {*}$args +} +#_______________________ + +proc ::apave::bindTextagToEvent {w tag event args} { + # Binds an event on a text tag to a command. + # w - the widget's path + # tag - the tag + # event - the event + # args - the command + + ::baltip::my::BindTextagToEvent $w $tag $event {*}$args +} +#_______________________ + +proc ::apave::bindCantagToEvent {w tag event args} { + # Binds an event on a canvas tag to a command. + # w - the widget's path + # tag - the tag + # event - the event + # args - the command + + ::baltip::my::BindCantagToEvent $w $tag $event {*}$args +} + +## ________________________ Helpers _________________________ ## + +proc ::apave::InfoWindow {{val ""} {w .} {modal no} {var ""} {regist no}} { + # Registers/unregisters windows. Also sets/gets 'count of open modal windows'. + # val - current number of open modal windows + # w - root window's path + # modal - yes, if the window is modal + # var - variable's name for tkwait + # regist - yes or no for registering/unregistering + # See also: APaveBase::showWindow + + variable _PU_opts + if {$modal || $regist} { + set info [list $w $var $modal] + set i [lsearch -exact $_PU_opts(_MODALWIN_) $info] + catch {set _PU_opts(_MODALWIN_) [lreplace $_PU_opts(_MODALWIN_) $i $i]} + if {$regist} { + lappend _PU_opts(_MODALWIN_) $info + } + set res [IntStatus . MODALS $val] + } else { + set res [IntStatus . MODALS] + } + return $res +} +#_______________________ + +proc ::apave::InfoFind {w modal} { + # Searches data of a window in a list of registered windows. + # w - root window's path + # modal - yes, if the window is modal + # Returns: the window's path or "" if not found. + # See also: InfoWindow + + variable _PU_opts + foreach winfo [lrange $_PU_opts(_MODALWIN_) 1 end] { ;# skip 1st window + incr i + lassign $winfo w1 var1 modal1 + if {[winfo exists $w1]} { + if {$w eq $w1 && ($modal && $modal1 || !$modal && !$modal1)} { + return $w1 + } + } else { + catch {set _PU_opts(_MODALWIN_) [lreplace $_PU_opts(_MODALWIN_) $i $i]} + } + } + return {} +} +#_______________________ + +proc ::apave::TreSelect {w idx} { + # Selects a treeview item. + # w - treeview's path + # idx - item index + + set items [$w children {}] + catch { + set it [lindex $items $idx] + $w see $it + $w focus $it + $w selection set $it ;# generates <> + } +} +#_______________________ + +proc ::apave::LbxSelect {w idx} { + # Selects a listbox item. + # w - listbox's path + # idx - item index + + $w activate $idx + $w see $idx + if {[$w cget -selectmode] in {single browse}} { + $w selection clear 0 end + $w selection set $idx + event generate $w <> + } +} +#_______________________ + +proc ::apave::InsertChar {wt ch} { + # Inserts character(s) into a text at cursor's position. + # wt - text's path + # ch - character(s) + + $wt insert [$wt index insert] $ch +} +#_______________________ + +proc ::apave::CursorToBEOL {wt where} { + # Sets the cursor to the real start/end of text line. + # wt - text's path + # where - where to set + + set idx [$wt index insert] + ::tk::TextSetCursor $wt [$wt index "$idx $where"] +} +#_______________________ + +proc ::apave::DefaultCS {} { + # Gets default color scheme counting current background of Tk root window. + + if {[catch {set ib [ttk::style config . -background]}] || + [lindex [InvertBg $ib B] 0] eq {B}} { + set res 5 ;# light + } else { + set res 23 ;# dark + } + return $res +} + +# ________________________ ObjectProperty _________________________ # +# +# 1st bit: Set/Get properties of object. +# +# Call of setter: +# oo::define SomeClass { +# mixin ObjectProperty +# } +# SomeClass create someobj +# ... +# someobj setProperty Prop1 100 +# +# Call of getter: +# oo::define SomeClass { +# mixin ObjectProperty +# } +# SomeClass create someobj +# ... +# someobj getProperty Alter 10 +# someobj getProperty Alter + +oo::class create ::apave::ObjectProperty { + + variable _OP_Properties + + constructor {args} { + array set _OP_Properties {} + # ObjectProperty can play solo or be a mixin + if {[llength [self next]]} { next {*}$args } + } + + destructor { + array unset _OP_Properties * + if {[llength [self next]]} next + } + +# _______________________________________________________________________ # + + method setProperty {name args} { + # Sets a property's value as "object-wide". + # name - name of property + # args - value of property + # If *args* is omitted, the method returns a property's value. + # If *args* is set, the method sets a property's value as $args. + + switch -exact [llength $args] { + 0 {return [my getProperty $name]} + 1 {return [set _OP_Properties($name) [lindex $args 0]]} + } + puts -nonewline stderr \ + "Wrong # args: should be \"[namespace current] setProperty propertyname ?value?\"" + return -code error + } + #_______________________ + + method getProperty {name {defvalue ""}} { + # Gets an property's value as "object-wide". + # name - name of property + # defvalue - default value + # If the property had been set, the method returns its value. + # Otherwise, the method returns the default value (`$defvalue`). + + if {[info exists _OP_Properties($name)]} { + return $_OP_Properties($name) + } + return $defvalue + } + + ## _________________ EONS ObjectProperty _________________ ## + +} + +# ________________________ ObjectTheming _________________________ # + +oo::class create ::apave::ObjectTheming { + + ## ________________________ Obj theming Inits _________________________ ## + + constructor {args} { + + my InitCS + # ObjectTheming can play solo or be a mixin + if {[llength [self next]]} { next {*}$args } + } + #_______________________ + + destructor { + if {[llength [self next]]} next + } + #_______________________ + + method InitCS {} { + # Initializes the color scheme processing. + + if {$::apave::_CS_(initall)} { + my basicFontSize 10 ;# initialize main font size + my basicTextFont $::apave::_CS_(textFont) ;# initialize main font for text + my ColorScheme ;# initialize default colors + my untouchWidgets *_untouch_* + set ::apave::_CS_(initall) 0 + } + } + + ## ________________________ Fonts _________________________ ## + + method create_FontsType {type args} { + # Creates fonts used in apave, with additional options. + # type - type of the created fonts + # args - pairs "option value" + # Returns a list of two created font names (default & mono). + + set name1 apaveFontDefTyped$type + set name2 apaveFontMonoTyped$type + catch {font delete $name1} + catch {font delete $name2} + font create $name1 -family $::apave::_CS_(defFont) -size $::apave::_CS_(fs) {*}$args + font create $name2 -family $::apave::_CS_(textFont) -size $::apave::_CS_(fs) {*}$args + list $name1 $name2 + } + #_______________________ + + method create_Fonts {} { + # Creates fonts used in apave. + + catch {font delete apaveFontMono} + catch {font delete apaveFontDef} + catch {font delete apaveFontMonoBold} + catch {font delete apaveFontDefBold} + font create apaveFontMono -family $::apave::_CS_(textFont) -size $::apave::_CS_(fs) + font create apaveFontDef -family $::apave::_CS_(defFont) -size $::apave::_CS_(fs) + font create apaveFontMonoBold {*}[my boldTextFont] + font create apaveFontDefBold {*}[my boldDefFont] + set ::apave::FONTMAIN "[font actual apaveFontDef]" + set ::apave::FONTMAINBOLD "[font actual apaveFontDefBold]" + } + #_______________________ + + method basicFontSize {{fs 0} {ds 0}} { + # Gets/Sets a basic size of font used in apave + # fs - font size + # ds - incr/decr of size + # If 'fs' is omitted or ==0, this method gets it. + # If 'fs' >0, this method sets it. + + if {$fs} { + set ::apave::_CS_(fs) [expr {$fs + $ds}] + my create_Fonts + return $::apave::_CS_(fs) + } else { + return [expr {$::apave::_CS_(fs) + $ds}] + } + } + #_______________________ + + method basicDefFont {{deffont ""}} { + # Gets/Sets a basic default font. + # deffont - font + # If 'deffont' is omitted or =="", this method gets it. + # If 'deffont' is set, this method sets it. + + if {$deffont ne ""} { + return [set ::apave::_CS_(defFont) $deffont] + } else { + return $::apave::_CS_(defFont) + } + } + #_______________________ + + method basicTextFont {{textfont ""}} { + # Gets/Sets a basic font used in editing/viewing text widget. + # textfont - font + # If 'textfont' is omitted or =="", this method gets it. + # If 'textfont' is set, this method sets it. + + if {$textfont ne ""} { + return [set ::apave::_CS_(textFont) $textfont] + } else { + return $::apave::_CS_(textFont) + } + } + #_______________________ + + method basicSmallFont {{smallfont ""}} { + # Gets/Sets a basic small font used in status bar etc. + # smallfont - font + # If 'smallfont' is omitted or =="", this method gets it. + # If 'smallfont' is set, this method sets it. + + if {$smallfont ne ""} { + return [set ::apave::_CS_(smallFont) $smallfont] + } else { + return $::apave::_CS_(smallFont) + } + } + #_______________________ + + method boldDefFont {{fs 0}} { + # Returns a bold default font. + # fs - font size + + if {$fs == 0} {set fs [my basicFontSize]} + set bf [font actual basicDefFont] + dict replace $bf -family [my basicDefFont] -weight bold -size $fs + } + #_______________________ + + method boldTextFont {{fs 0}} { + # Returns a bold fixed font. + # fs - font size + + if {$fs == 0} {set fs [expr {2+[my basicFontSize]}]} + set bf [font actual TkFixedFont] + dict replace $bf -family [my basicTextFont] -weight bold -size $fs + } + + ## ________________________ Color schemes _________________________ ## + + method csFont {fontname} { + # Returns attributes of CS font. + + if {[catch {set font [font configure $fontname]}]} { + my create_Fonts + set font [font configure $fontname] + } + return $font + } + #_______________________ + + method csFontMono {} { + # Returns attributes of CS monotype font. + + my csFont apaveFontMono + } + #_______________________ + + method csFontDef {} { + # Returns attributes of CS default font. + + my csFont apaveFontDef + } + #_______________________ + + method csDark {{cs ""}} { + # Returns a flag "a color scheme is dark" + # cs - the color scheme to be checked (the current one, if not set) + + if {$cs eq {} || $cs==-3} {set cs [my csCurrent]} + lassign $::apave::_CS_(TONED) csbasic cstoned + if {$cs==$cstoned} {set cs $csbasic} + expr {$cs>22} + } + #_______________________ + + method csExport {} { + # TODO + + set theme "" + foreach arg {tfg1 tbg1 tfg2 tbg2 tfgS tbgS tfgD tbgD tcur bclr args} { + if {[catch {set a "$::apave::_CS_(expo,$arg)"}] || $a==""} { + break + } + append theme " $a" + } + return $theme + } + #_______________________ + + method csCurrent {} { + + # Gets an index of current color scheme + + return $::apave::_CS_(index) + } + #_______________________ + + method csGetName {{ncolor 0}} { + + # Gets a color scheme's name + # ncolor - index of color scheme + + if {$ncolor < $::apave::_CS_(MINCS)} { + return "-2: None" + } elseif {$ncolor == $::apave::_CS_(MINCS)} { + return "-1: Basic" + } + lindex [my ColorScheme $ncolor] 0 + } + #_______________________ + + method csGet {{ncolor ""}} { + + # Gets a color scheme's colors + # ncolor - index of color scheme + + if {$ncolor eq ""} {set ncolor [my csCurrent]} + lrange [my ColorScheme $ncolor] 1 end + } + #_______________________ + + method csSet {{ncolor 0} {win .} args} { + + # Sets a color scheme and applies it to Tk/Ttk widgets. + # ncolor - index of color scheme + # win - window's name + # args - list of colors if ncolor="" + # + # The `args` can be set as "-doit". In this case the method does set + # the `ncolor` color scheme (otherwise it doesn't set the CS if it's + # already of the same `ncolor`). + + # The clrtitf, clrinaf etc. had been designed for e_menu. And as such, + # they can be used directly, outside of this "color scheming" UI. + # They set pairs of related fb/bg: + # clrtitf/clrtitb is item's fg/bg + # clrinaf/clrinab is main fg/bg + # clractf/clractb is active (selection) fg/bg + # and separate colors: + # clrhelp is "help" foreground + # clrcurs is "caret" background + # clrgrey is "shadowing" background + # clrhotk is "hotkey/border" foreground + # + # In color scheming, these colors are transformed to be consistent + # with Tk/Ttk's color mechanics. + # + # Additionally, "grey" color is used as "border color/disabled foreground". + # + # Returns a list of colors used by the color scheme. + + if {$ncolor == -2} { + ttk::style map Treeview -foreground [list readonly grey disabled grey selected black] + return {} + } + if {$ncolor eq {}} { + lassign $args \ + clrtitf clrinaf clrtitb clrinab clrhelp clractb clractf clrcurs clrgrey clrhotk tfgI tbgI fM bM tfgW tbgW tHL2 tbHL chkHL res5 res6 res7 + } else { + foreach cs [list $ncolor $::apave::_CS_(MINCS)] { + lassign [my csGet $cs] \ + clrtitf clrinaf clrtitb clrinab clrhelp clractb clractf clrcurs clrgrey clrhotk tfgI tbgI fM bM tfgW tbgW tHL2 tbHL chkHL res5 res6 res7 + if {$clrtitf ne ""} break + set ncolor $cs + } + set ::apave::_CS_(index) $ncolor + } + # colors can be passed in args as -clrtitf "color" -clrinaf "color" ... + if {$ncolor>=0} { + foreach nclr {clrtitf clrinaf clrtitb clrinab clrhelp clractb clractf clrcurs clrgrey clrhotk tfgI tbgI fM bM tfgW tbgW tHL2 tbHL chkHL} { + incr ic + if {[set i [lsearch $args -$nclr]]>-1} { + set $nclr [lindex $args $i+1] + set chcs [lreplace [lindex $::apave::_CS_(ALL) $ncolor] $ic $ic [set $nclr]] + set ::apave::_CS_(ALL) [lreplace $::apave::_CS_(ALL) $ncolor $ncolor $chcs] + } + } + } + set fg $clrinaf ;# main foreground + set bg $clrinab ;# main background + set fE $clrtitf ;# fieldforeground foreground + set bE $clrtitb ;# fieldforeground background + set fS $clractf ;# active/selection foreground + set bS $clractb ;# active/selection background + set hh $clrhelp ;# (not used in cs' theming) title color + set gr $clrgrey ;# (not used in cs' theming) shadowing color + set cc $clrcurs ;# caret's color + set ht $clrhotk ;# hotkey color + set grey $gr ;# #808080 + if {$::apave::_CS_(old) != $ncolor || "-doit" in $args} { + set ::apave::_CS_(old) $ncolor + my themeWindow $win [list $fg $bg $fE $bE $fS $bS $grey $bg $cc $ht $hh $tfgI $tbgI $fM $bM $tfgW $tbgW $tHL2 $tbHL $chkHL $res5 $res6 $res7] + my UpdateColors + my initTooltip + } + set ::apave::FGMAIN $fg + set ::apave::BGMAIN $bg + set ::apave::FGMAIN2 $fE + set ::apave::BGMAIN2 $bE + catch { + if {[my csDark $ncolor]} {::baltip::configure -relief groove} + } + list $fg $bg $fE $bE $fS $bS $hh $grey $cc $ht $tfgI $tbgI $fM $bM $tfgW $tbgW $tHL2 $tbHL $chkHL $res5 $res6 $res7 + } + #_______________________ + + method csAdd {newcs {setnew true}} { + # Registers new color scheme in the list of CS. + # newcs - CS item + # setnew - if true, sets the CS as current + # Does not register the CS, if it is already registered. + # Returns an index of current CS. + # See also: themeWindow + + if {[llength $newcs]<4} { + set newcs [my ColorScheme] ;# CS should be defined + } + lassign $newcs name tfg2 tfg1 tbg2 tbg1 tfhh - - tcur grey bclr + set found $::apave::_CS_(NONCS) + set maxcs [::apave::cs_Max] + for {set i $::apave::_CS_(MINCS)} {$i<=$maxcs} {incr i} { + lassign [my csGet $i] cfg2 cfg1 cbg2 cbg1 cfhh - - ccur + if {$cfg2 eq $tfg2 && $cfg1 eq $tfg1 && $cbg2 eq $tbg2 && \ + $cbg1 eq $tbg1 && $cfhh eq $tfhh && $ccur eq $tcur} { + set found $i + break + } + } + if {$found == $::apave::_CS_(MINCS) && [my csCurrent] == $::apave::_CS_(NONCS)} { + set setnew false ;# no moves from default CS to 'basic' + } elseif {$found == $::apave::_CS_(NONCS)} { + lappend ::apave::_CS_(ALL) $newcs + set found [expr {$maxcs+1}] + } + if {$setnew} {set ::apave::_CS_(index) [set ::apave::_CS_(old) $found]} + my csCurrent + } + #_______________________ + + method csDeleteExternal {} { + # Removes all external CS. + + set ::apave::_CS_(ALL) [lreplace $::apave::_CS_(ALL) 48 end] + + } + #_______________________ + + method csToned {cs hue {doit no}} { + # Make an external CS that has tones (hues) of colors for a CS. + # cs - internal apave CS to be toned + # hue - a percent to get light (> 0) or dark (< 0) tones + # doit - flag "do it anyway" + # This method allows only one external CS, eliminating others. + # Returns: "yes" if the CS was toned + + if {!$doit && [my csCurrent] > $::apave::_CS_(NONCS)} { + puts [set msg "\napave method csToned must be run before csSet!\n"] + return -code error $msg + } + if {$cs <= $::apave::_CS_(NONCS) || $cs > $::apave::_CS_(STDCS)} { + return no + } + my csDeleteExternal + set CS [my csGet $cs] + set mainc [my csMainColors] + set ::apave::_CS_(HUE) $hue + set hue [expr {(100.0+$hue)/100.0}] + foreach i [my csMapTheme] { + set color [lindex $CS $i] + if {$i in $mainc} { + catch { ;# for CS=-1 not working + set clr [string map {black #000000 white #ffffff grey #808080 \ + red #ff0000 yellow #ffff00 \ + orange #ffa500 #000 #000000 #fff #ffffff} $color] + scan $clr #%2x%2x%2x R G B + foreach valname {R G B} { + set val [expr {int([set $valname]*$hue)}] + set $valname [expr {max(min($val,255),0)}] + } + set color [format #%02x%02x%02x $R $G $B] + } + } + lappend TWargs $color + } + set ::apave::_CS_(TONED) [list $cs [my csNewIndex]] + my themeWindow . $TWargs no + my csSet [my csCurrent] . ;# resets new CS's data + return yes + } + #_______________________ + + method csMainColors {} { + # Returns a list of main colors' indices of CS. + # See also: csMapTheme + + list 0 1 2 3 5 10 11 13 16 + } + #_______________________ + + method csMapTheme {} { + # Returns a map of CS / themeWindow method colors. + # The map is a list of indices in CS corresponding to themeWindow's args. + # See also: themeWindow + + list 1 3 0 2 6 5 8 3 7 9 4 10 11 1 13 14 15 16 17 18 19 20 21 + } + #_______________________ + + method csNewIndex {} { + # Gets a next available CS's index. + + expr {[::apave::cs_Max]+1} + } + #_______________________ + + method ColorScheme {{ncolor ""}} { + # Gets a full record of color scheme from a list of available ones + # ncolor - index of color scheme + + if {$ncolor eq {} || $ncolor<0} { + # basic color scheme: get colors from a current ttk::style colors + set fW black + set bW #FBFB95 + set bg2 #e4e4e4 + if {[info exists ::apave::_CS_(def_fg)]} { + if {$ncolor == $::apave::_CS_(NONCS)} {set bg2 #e5e5e5} + set fg $::apave::_CS_(def_fg) + set fg2 #2b3f55 + set bg $::apave::_CS_(def_bg) + set fS $::apave::_CS_(def_fS) + set bS $::apave::_CS_(def_bS) + set bA $::apave::_CS_(def_bA) + } else { + set ::apave::_CS_(index) $::apave::_CS_(NONCS) + lassign [::apave::parseOptions [ttk::style configure .] \ + -foreground #000000 -background #d9d9d9 -troughcolor #c3c3c3] fg bg tc + set fS $::apave::_CS_(!FG) + set bS $::apave::_CS_(!BG) + lassign [::apave::parseOptions [ttk::style map . -background] \ + disabled #d9d9d9 active #ececec] bD bA + if {$bA eq {#ececec}} {set bA #ffffff} + lassign [::apave::parseOptions [ttk::style map . -foreground] \ + disabled #a3a3a3] fD + lassign [::apave::parseOptions [ttk::style map . -selectbackground] \ + !focus #9e9a91] bclr + set ::apave::_CS_(def_fg) [set fg2 $fg] + set ::apave::_CS_(def_bg) $bg + set ::apave::_CS_(def_fS) $fS + set ::apave::_CS_(def_bS) $bS + set ::apave::_CS_(def_fD) $fD + set ::apave::_CS_(def_bD) $bD + set ::apave::_CS_(def_bA) $bA + set ::apave::_CS_(def_tc) $tc + set ::apave::_CS_(def_bclr) $bclr + } + return [list default \ + $fg $fg $bA $bg $fg2 $bS $fS #444 grey #4f6379 $fS $bS - $bg $fW $bW $bg2 #a20000 #76b2f1 #005 #006 #007] + # clrtitf clrinaf clrtitb clrinab clrhelp clractb clractf clrcurs clrgrey clrhotk fI bI fM bM fW bW + } + lindex $::apave::_CS_(ALL) $ncolor + } + +# ________________________ Theming _________________________ # + + ## ________________________ Common _________________________ ## + + method apaveTheme {{theme {}}} { + # Checks if apave color scheme is used (always for standard ttk themes). + # theme - a theme to be checked (if omitted, a current ttk theme) + + if {$theme eq {}} {set theme [ttk::style theme use]} + expr {$theme in {clam alt classic default awdark awlight plastik}} + } + #_______________________ + + method initTooltip {args} { + # Configurates colors and other attributes of tooltip. + # args - options of ::baltip::configure + + ::apave::initBaltip + lassign [lrange [my csGet] 14 15] fW bW + ::baltip config -fg $fW -bg $bW -global yes + ::baltip config {*}$args + } + #_______________________ + + method thDark {theme} { + # Checks if a theme is dark, light or neutral. + # theme - theme's name + # Returns 1 for dark, 0 for light, -1 for neutral. + + if {$theme in {alt classic default clam}} { + return -1 + } + string match -nocase *dark* $theme + } + + ## ________________________ Theme methods _________________________ ## + + method themeWindow {win {clrs ""} {isCS true} args} { + # Changes a Tk style (theming a bit) + # win - window's name + # clrs - list of colors + # isCS - true, if the colors are taken from a CS + # args - other options + # + # The clrs contains: + # tfg1 - foreground for themed widgets (main stock) + # tbg1 - background for themed widgets (main stock) + # tfg2 - foreground for themed widgets (enter data stock) + # tbg2 - background for themed widgets (enter data stock) + # tfgS - foreground for selection + # tbgS - background for selection + # tfgD - foreground for disabled themed widgets + # tbgD - background for disabled themed widgets + # tcur - insertion cursor color + # bclr - hotkey/border color + # thlp - help color + # tfgI - foreground for external CS + # tbgI - background for external CS + # tfgM - foreground for menus + # tbgM - background for menus + # + # The themeWindow can be used outside of "color scheme" UI. + # E.g., in TKE editor, e_menu and add_shortcuts plugins use it to + # be consistent with TKE theme. + + if {![::apave::cs_Active]} { + my themeMandatory $win {*}$args + return + } + lassign $clrs tfg1 tbg1 tfg2 tbg2 tfgS tbgS tfgD tbgD tcur bclr \ + thlp tfgI tbgI tfgM tbgM twfg twbg tHL2 tbHL chkHL res5 res6 res7 + if {$tfg1 eq {-}} return + if {!$isCS} { + # if 'external scheme' is used, register it in _CS_(ALL) + # and set it as the current CS + +# itemfg mainfg itembg mainbg itemsHL actbg actfg cursor greyed hot \ + emfg embg - menubg winfg winbg itemHL2 #003...reserved... + + my csAdd [list CS-[my csNewIndex] $tfg2 $tfg1 $tbg2 $tbg1 \ + $thlp $tbgS $tfgS $tcur $tfgD $bclr $tfgI $tbgI $tfgM $tbgM \ + $twfg $twbg $tHL2 $tbHL $chkHL $res5 $res6 $res7] + } + if {$tfgI eq {}} {set tfgI $tfg2} + if {$tbgI eq {}} {set tbgI $tbg2} + if {$tfgM in {{} -}} {set tfgM $tfg1} + if {$tbgM eq {}} {set tbgM $tbg1} + my Main_Style $tfg1 $tbg1 $tfg2 $tbg2 $tfgS $tbgS $tfgD $tbg1 $tfg1 $tbg2 $tbg1 + foreach arg {tfg1 tbg1 tfg2 tbg2 tfgS tbgS tfgD tbgD tcur bclr \ + thlp tfgI tbgI tfgM tbgM twfg twbg tHL2 tbHL chkHL res5 res6 res7 args} { + if {$win eq {.}} { + set ::apave::_C_($win,$arg) [set $arg] + } + set ::apave::_CS_(expo,$arg) [set $arg] + } + if {[set darkCS [my csDark]]} {set aclr #ff9dff} {set aclr #890970} + set fontdef [font actual apaveFontDef] + # configuring themed widgets + foreach ts {TLabel TButton TCheckbutton TRadiobutton TMenubutton} { + my Ttk_style configure $ts -font $fontdef + my Ttk_style configure $ts -foreground $tfg1 + my Ttk_style configure $ts -background $tbg1 + my Ttk_style map $ts -background [list pressed $tbg2 active $tbg2 focus $tbgS alternate $tbg2] + my Ttk_style map $ts -foreground [list disabled $tfgD pressed $tfgS active $aclr focus $tfgS alternate $tfg2 focus $tfg2 selected $tfg1] + my Ttk_style map $ts -bordercolor [list focus $bclr pressed $bclr] + my Ttk_style map $ts -lightcolor [list focus $bclr] + my Ttk_style map $ts -darkcolor [list focus $bclr] + } + ttk::style configure TLabelframe.Label -foreground $thlp -background $tbg1 -font $fontdef + foreach ts {TNotebook TFrame} { + my Ttk_style configure $ts -background $tbg1 + my Ttk_style map $ts -background [list focus $tbg1 !focus $tbg1] + } + ttk::style configure TNotebook.Tab -font $fontdef + ttk::style map TNotebook.Tab -foreground [list {selected !active} $tfgS \ + {!selected !active} $tfgM active $aclr {selected active} $aclr] \ + -background [list {selected !active} $tbgS {!selected !active} $tbgM \ + {!selected active} $tbg2 {selected active} $tbg2] + foreach ts {TEntry Treeview TSpinbox TCombobox TCombobox.Spinbox TMatchbox TNotebook.Tab TScale} { + my Ttk_style map $ts -lightcolor [list focus $bclr active $bclr] + my Ttk_style map $ts -darkcolor [list focus $bclr active $bclr] + } + ttk::style configure TScrollbar -arrowcolor $tfg1 + ttk::style map TScrollbar -troughcolor [list !active $tbg1 active $tbg2] \ + -background [list !active $tbg1 disabled $tbg1 {!selected !disabled active} $tbgS] + ttk::style map TProgressbar -troughcolor [list !active $tbg2 active $tbg1] + ttk::style configure TProgressbar -background $tbgS + if {[set cs [my csCurrent]]<20} { + ttk::style conf TSeparator -background #a2a2a2 + } elseif {$cs<23} { + ttk::style conf TSeparator -background #656565 + } elseif {$cs<28} { + ttk::style conf TSeparator -background #3c3c3c + } elseif {$cs>35 && $cs<39} { + ttk::style conf TSeparator -background #313131 + } elseif {$cs==43 || $cs>44} { + ttk::style conf TSeparator -background #2e2e2e + } + foreach ts {TEntry Treeview TSpinbox TCombobox TCombobox.Spinbox TMatchbox} { + my Ttk_style configure $ts -font $fontdef + my Ttk_style configure $ts -selectforeground $tfgS + my Ttk_style configure $ts -selectbackground $tbgS + my Ttk_style map $ts -selectforeground [list !focus $::apave::_CS_(!FG)] + my Ttk_style map $ts -selectbackground [list !focus $::apave::_CS_(!BG)] + my Ttk_style configure $ts -fieldforeground $tfg2 + my Ttk_style configure $ts -fieldbackground $tbg2 + my Ttk_style configure $ts -insertcolor $tcur + my Ttk_style map $ts -bordercolor [list focus $bclr active $bclr] + my Ttk_style configure $ts -insertwidth $::apave::_CS_(CURSORWIDTH) + if {$ts eq {TCombobox}} { + # combobox is sort of individual + ttk::style configure $ts -foreground $tfg1 -background $tbg1 -arrowcolor $tfg1 + ttk::style map $ts -background [list {readonly focus} $tbg2 {active focus} $tbg2] \ + -foreground [list {readonly focus} $tfg2 {active focus} $tfg2] \ + -fieldforeground [list {active focus} $tfg2 readonly $tfg2 disabled $tfgD] \ + -fieldbackground [list {active focus} $tbg2 {readonly focus} $tbg2 {readonly !focus} $tbg1 disabled $tbgD] \ + -focusfill [list {readonly focus} $tbgS] -arrowcolor [list disabled $tfgD] + } else { + my Ttk_style configure $ts -foreground $tfg2 + my Ttk_style configure $ts -background $tbg2 + if {$ts eq {Treeview}} { + ttk::style map $ts -foreground [list readonly $tfgD disabled $tfgD {selected focus} $tfgS {selected !focus} $thlp] \ + -background [list readonly $tbgD disabled $tbgD {selected focus} $tbgS {selected !focus} $tbg1] + } else { + my Ttk_style map $ts -foreground [list readonly $tfgD disabled $tfgD selected $tfgS] + my Ttk_style map $ts -background [list readonly $tbgD disabled $tbgD selected $tbgS] + my Ttk_style map $ts -fieldforeground [list readonly $tfgD disabled $tfgD] + my Ttk_style map $ts -fieldbackground [list readonly $tbgD disabled $tbgD] + my Ttk_style map $ts -arrowcolor [list disabled $tfgD] + my Ttk_style configure $ts -arrowcolor $tfg1 + } + } + } + ttk::style configure Heading -font $fontdef -relief raised -padding 1 -background $tbg1 + ttk::style map Heading -foreground [list active $aclr] + option add *Listbox.font $fontdef + option add *Menu.font $fontdef + ttk::style configure TMenubutton -foreground $tfgM -background $tbgM -arrowcolor $tfg1 + ttk::style map TMenubutton -arrowcolor [list disabled $tfgD] + ttk::style configure TButton -foreground $tfgM -background $tbgM + foreach {nam clr} {back tbg2 fore tfg2 selectBack tbgS selectFore tfgS} { + option add *Listbox.${nam}ground [set $clr] + } + foreach {nam clr} {back tbgM fore tfgM selectBack tbgS selectFore tfgS} { + option add *Menu.${nam}ground [set $clr] + } + foreach ts {TRadiobutton TCheckbutton} { + ttk::style map $ts -background [list focus $tbg2 !focus $tbg1] + } + if {$darkCS} { + # esp. for default/alt/classic themes and dark CS: + # checked buttons to be lighter + foreach ts {TCheckbutton TRadiobutton} { + ttk::style configure $ts -indicatorcolor $tbgM + ttk::style map $ts -indicatorcolor [list pressed $tbg2 selected $chkHL] + } + } + # non-themed widgets of button and entry types + foreach ts [my NonThemedWidgets button] { + set ::apave::_C_($ts,0) 6 + set ::apave::_C_($ts,1) "-background $tbg1" + set ::apave::_C_($ts,2) "-foreground $tfg1" + set ::apave::_C_($ts,3) "-activeforeground $tfg2" + set ::apave::_C_($ts,4) "-activebackground $tbg2" + set ::apave::_C_($ts,5) "-font {$fontdef}" + set ::apave::_C_($ts,6) "-highlightbackground $tfgD" + switch -exact -- $ts { + checkbutton - radiobutton { + set ::apave::_C_($ts,0) 8 + set ::apave::_C_($ts,7) "-selectcolor $tbg1" + set ::apave::_C_($ts,8) "-highlightbackground $tbg1" + } + frame - scrollbar - scale { + set ::apave::_C_($ts,0) 8 + set ::apave::_C_($ts,4) "-activebackground $tbgS" + set ::apave::_C_($ts,7) "-troughcolor $tbg1" + set ::apave::_C_($ts,8) "-elementborderwidth 2" + } + menu { + set ::apave::_C_($ts,0) 9 + set ::apave::_C_($ts,1) "-background $tbgM" + set ::apave::_C_($ts,3) "-activeforeground $tfgS" + set ::apave::_C_($ts,4) "-activebackground $tbgS" + set ::apave::_C_($ts,5) "-disabledforeground $tfgD" + set ::apave::_C_($ts,6) "-font {$fontdef}" + if {[::iswindows]} { + set ::apave::_C_($ts,0) 6 + } elseif {[my apaveTheme]} { + set ::apave::_C_($ts,7) {-borderwidth 2} + set ::apave::_C_($ts,8) {-relief raised} + } else { + set ::apave::_C_($ts,7) {-borderwidth 1} + set ::apave::_C_($ts,8) {-relief groove} + } + if {$darkCS} {set c white} {set c black} + set ::apave::_C_($ts,9) "-selectcolor $c" + } + canvas { + set ::apave::_C_($ts,1) "-background $tbg2" + } + } + } + foreach ts [my NonThemedWidgets entry] { + set ::apave::_C_($ts,0) 3 + set ::apave::_C_($ts,1) "-foreground $tfg2" + set ::apave::_C_($ts,2) "-background $tbg2" + set ::apave::_C_($ts,3) "-highlightbackground $tfgD" + switch -exact -- $ts { + tcombobox - listbox - tmatchbox { + set ::apave::_C_($ts,0) 8 + set ::apave::_C_($ts,4) "-disabledforeground $tfgD" + set ::apave::_C_($ts,5) "-disabledbackground $tbgD" + set ::apave::_C_($ts,6) "-highlightcolor $bclr" + set ::apave::_C_($ts,7) "-font {$fontdef}" + set ::apave::_C_($ts,8) "-insertbackground $tcur" + } + text - entry - tentry { + set ::apave::_C_($ts,0) 11 + set ::apave::_C_($ts,4) "-selectforeground $tfgS" + set ::apave::_C_($ts,5) "-selectbackground $tbgS" + set ::apave::_C_($ts,6) "-disabledforeground $tfgD" + set ::apave::_C_($ts,7) "-disabledbackground $tbgD" + set ::apave::_C_($ts,8) "-highlightcolor $bclr" + if {$ts eq {text}} { + set ::apave::_C_($ts,0) 12 + set ::apave::_C_($ts,9) "-font {[font actual apaveFontMono]}" + set ::apave::_C_($ts,12) "-inactiveselectbackground $tbgS" + } else { + set ::apave::_C_($ts,9) "-font {$fontdef}" + } + set ::apave::_C_($ts,10) "-insertwidth $::apave::_CS_(CURSORWIDTH)" + set ::apave::_C_($ts,11) "-insertbackground $tcur" + } + spinbox - tspinbox - tablelist { + set ::apave::_C_($ts,0) 12 + set ::apave::_C_($ts,4) "-insertbackground $tcur" + set ::apave::_C_($ts,5) "-buttonbackground $tbg2" + set ::apave::_C_($ts,6) "-selectforeground $::apave::_CS_(!FG)" + set ::apave::_C_($ts,7) "-selectbackground $::apave::_CS_(!BG)" + set ::apave::_C_($ts,8) "-disabledforeground $tfgD" + set ::apave::_C_($ts,9) "-disabledbackground $tbgD" + set ::apave::_C_($ts,10) "-font {$fontdef}" + set ::apave::_C_($ts,11) "-insertwidth $::apave::_CS_(CURSORWIDTH)" + set ::apave::_C_($ts,12) "-highlightcolor $bclr" + } + } + } + foreach ts {disabled} { + set ::apave::_C_($ts,0) 4 + set ::apave::_C_($ts,1) "-foreground $tfgD" + set ::apave::_C_($ts,2) "-background $tbgD" + set ::apave::_C_($ts,3) "-disabledforeground $tfgD" + set ::apave::_C_($ts,4) "-disabledbackground $tbgD" + } + foreach ts {readonly} { + set ::apave::_C_($ts,0) 2 + set ::apave::_C_($ts,1) "-foreground $tfg1" + set ::apave::_C_($ts,2) "-background $tbg1" + } + my themeMandatory $win {*}$args + } + #_______________________ + + method Ttk_style {oper ts opt val} { + # Sets a new style options. + # oper - command of ttk::style ("map" or "configure") + # ts - type of style to be configurated + # opt - option's name + # val - option's value + + if {![catch {set oldval [ttk::style $oper $ts $opt]}]} { + catch {ttk::style $oper $ts $opt $val} + if {$oldval eq {} && $oper eq {configure}} { + switch -exact -- $opt { + -foreground - -background { + set oldval [ttk::style $oper . $opt] + } + -fieldbackground { + set oldval white + } + -insertcolor { + set oldval black + } + } + } + } + } + #_______________________ + + method Main_Style {tfg1 tbg1 tfg2 tbg2 tfgS tbgS bclr tc fA bA bD} { + # Sets main colors of application + # tfg1 - main foreground + # tbg1 - main background + # tfg2 - not used + # tbg2 - not used + # tfgS - selectforeground + # tbgS - selectbackground + # bclr - bordercolor + # tc - troughcolor + # fA - foreground active + # bA - background active + # bD - background disabled + # The *foreground disabled* is set as `grey`. + + my create_Fonts + if {[ttk::style theme use] eq {classic}} { + set hlc "-highlightcolor $tbg1" + } else { + set hlc {} + } + ttk::style configure "." \ + -foreground $tfg1 -background $tbg1 -bordercolor $bclr -darkcolor $tbg1 \ + -lightcolor $tbg1 -troughcolor $tc -arrowcolor $tfg1 \ + -selectforeground $tfgS -selectbackground $tbgS {*}$hlc + ttk::style map "." \ + -background [list disabled $bD active $bA] \ + -foreground [list disabled grey active $fA] + } + #_______________________ + + method themeMandatory {win args} { + # Themes all that must be themed. + # win - window's name + # args - options + + # set the new options for nested widgets (menu e.g.) + my themeNonThemed $win + # other options per widget type + foreach {typ v1 v2} $args { + if {$typ eq "-"} { + # config of non-themed widgets + set ind [incr ::apave::_C_($v1,0)] + set ::apave::_C_($v1,$ind) "$v2" + } else { + # style maps of themed widgets + my Ttk_style map $typ $v1 [list {*}$v2] + } + } + ::apave::initStyles + my ThemeChoosers + } + #_______________________ + + method untouchWidgets {args} { + # Makes non-ttk widgets to be untouched by coloring or gets their list. + # args - list of widget globs (e.g. {.em.fr.win.* .em.fr.h1 .em.fr.h2}) + # If args not set, returns the list of untouched widgets. + # Items of *args* can have 2 components: + # - widget glob + # - list of option+value pairs, e.g. "*.textWidget {-fg white -bg black}" + # 2nd component defines additional attributes that override the defaults. + # If 1st item of *args* is "clear", removes all items set with glob patterns + # (e.g.: my untouchWidgets clear *BALTIP* - clears all baltip's references). + # See also: + # touchWidgets + # themeNonThemed + + if {[llength $args]==0} {return $::apave::_CS_(untouch)} + if {[lindex $args 0] eq {clear}} { + foreach u [lrange $args 1 end] { + set ii [lsearch -all -glob $::apave::_CS_(untouch) $u] + foreach i [lsort -decreasing -integer $ii] { + set ::apave::_CS_(untouch) [lreplace $::apave::_CS_(untouch) $i $i] + } + } + } else { + foreach u $args { + if {[lsearch -exact $::apave::_CS_(untouch) $u]==-1} { + lappend ::apave::_CS_(untouch) $u + } + } + } + } + #_______________________ + + method touchWidgets {args} { + # Makes non-ttk widgets to be touched again. + # args - list of widget globs (e.g. {.em.fr.win.* .em.fr.h1 .em.fr.h2}) + # If args not set, returns the list of untouched widgets. + # See also: + # untouchWidgets + # themeNonThemed + + if {[llength $args]==0} {return $::apave::_CS_(untouch)} + foreach u $args { + set u [lindex $u 0] + if {[set i [lsearch -index 0 -exact $::apave::_CS_(untouch) $u]]>-1} { + set ::apave::_CS_(untouch) [lreplace $::apave::_CS_(untouch) $i $i] + } + } + } + #_______________________ + + method themeExternal {args} { + # Configures an external dialogue so that its colors accord with a current CS. + # args - list of untouched widgets + + if {[set cs [my csCurrent]] != -2} { + foreach untw $args {my untouchWidgets $untw} + after idle [list [self] csSet $cs . -doit] ;# theme the dialogue to be run + } + } + #_______________________ + + method themeNonThemed {win {addwid {}}} { + # Updates the appearances of currently used widgets (non-themed). + # win - window path whose children will be touched + # addwid - additional widget(s) to be touched + # + # See also: + # untouchWidgets + + set wtypes [my NonThemedWidgets all] + set lwid [winfo children $win] + lappend lwid {*}$addwid + foreach w1 $lwid { + set ts [string tolower [winfo class $w1]] + if {$ts ni {tcombobox tlabel tscrollbar tcheckbutton tradiobutton}} { + my themeNonThemed $w1 + } + set tch 1 + foreach u $::apave::_CS_(untouch) { + lassign $u u addopts + if {[string match $u $w1]} {set tch 0; break} + } + if {[info exist ::apave::_C_($ts,0)] && [lsearch -exact $wtypes $ts]>-1} { + set i 0 + if {$tch} { + set tch $::apave::_C_($ts,0) + set addopts {} + } else { + if {$addopts ne {}} { + set tch $::apave::_C_($ts,0) + } + } + while {[incr i] <= $tch} { + lassign $::apave::_C_($ts,$i) opt val + catch { + if {[string first __tooltip__.label $w1]<0} { + $w1 configure $opt $val {*}$addopts + switch -exact -- [$w1 cget -state] { + disabled { + $w1 configure {*}[my NonTtkStyle $w1 1] + } + readonly { + $w1 configure {*}[my NonTtkStyle $w1 2] + } + } + } + set nam3 [string range [my ownWName $w1] 0 2] + if {$nam3 in {lbx tbl flb enT spX}} { + my UpdateSelectAttrs $w1 + } + } + } + } + } + } + #_______________________ + + method NonThemedWidgets {selector} { + # Lists the non-themed widgets to process in apave. + # selector - sets a widget group to return as a list + # The `selector` can be `entry`, `button` or `all`. + + switch -exact -- $selector { + entry { + return [list tspinbox tcombobox tentry entry text listbox spinbox tablelist tmatchbox] + } + button { + return [list label button menu menubutton checkbutton radiobutton frame labelframe scale scrollbar canvas] + } + } + return [list tspinbox tcombobox tentry entry text listbox spinbox label button \ + menu menubutton checkbutton radiobutton frame labelframe scale \ + scrollbar canvas tablelist tmatchbox] + } + #_______________________ + + method NonTtkTheme {win} { + # Calls themeWindow to color non-ttk widgets. + # win - window's name + + if {[info exists ::apave::_C_(.,tfg1)] && + $::apave::_CS_(expo,tfg1) ne "-"} { + my themeWindow $win [list \ + $::apave::_C_(.,tfg1) \ + $::apave::_C_(.,tbg1) \ + $::apave::_C_(.,tfg2) \ + $::apave::_C_(.,tbg2) \ + $::apave::_C_(.,tfgS) \ + $::apave::_C_(.,tbgS) \ + $::apave::_C_(.,tfgD) \ + $::apave::_C_(.,tbgD) \ + $::apave::_C_(.,tcur) \ + $::apave::_C_(.,bclr) \ + $::apave::_C_(.,thlp) \ + $::apave::_C_(.,tfgI) \ + $::apave::_C_(.,tbgI) \ + $::apave::_C_(.,tfgM) \ + $::apave::_C_(.,tbgM) \ + $::apave::_C_(.,twfg) \ + $::apave::_C_(.,twbg) \ + $::apave::_C_(.,tHL2)] \ + false {*}$::apave::_C_(.,args) + } + } + #_______________________ + + method NonTtkStyle {typ {dsbl 0}} { + # Makes styling for non-ttk widgets. + # typ - widget's type (the same as in "APaveBase::widgetType" method) + # dsbl - `1` for disabled; `2` for readonly; otherwise for all widgets + # See also: APaveBase::widgetType + + if {$dsbl} { + set disopt {} + if {$dsbl==1 && [info exist ::apave::_C_(disabled,0)]} { + set typ [string range [lindex [split $typ .] end] 0 2] + switch -exact -- $typ { + frA - lfR { + append disopt { } $::apave::_C_(disabled,2) + } + enT - spX { + append disopt { } $::apave::_C_(disabled,1) \ + { } $::apave::_C_(disabled,2) \ + { } $::apave::_C_(disabled,3) \ + { } $::apave::_C_(disabled,4) + } + laB - tex - chB - raD - lbx - scA { + append disopt { } $::apave::_C_(disabled,1) \ + { } $::apave::_C_(disabled,2) + } + } + } elseif {$dsbl==2 && [info exist ::apave::_C_(readonly,0)]} { + append disopt { } \ + $::apave::_C_(readonly,1) { } $::apave::_C_(readonly,2) \ + } + return $disopt + } + set opts {-foreground -foreground -background -background} + lassign "" ts2 ts3 opts2 opts3 + switch -exact -- $typ { + buT {set ts TButton} + chB {set ts TCheckbutton + lappend opts -background -selectcolor + } + enT { + set ts TEntry + set opts {-foreground -foreground -fieldbackground -background \ + -insertbackground -insertcolor} + } + tex { + set ts TEntry + set opts {-foreground -foreground -fieldbackground -background \ + -insertcolor -insertbackground \ + -selectforeground -selectforeground -selectbackground -selectbackground + } + } + frA {set ts TFrame; set opts {-background -background}} + laB {set ts TLabel} + lbx {set ts TLabel} + lfR {set ts TLabelframe} + raD {set ts TRadiobutton} + scA {set ts TScale} + sbH - + sbV {set ts TScrollbar; set opts {-background -background}} + spX {set ts TSpinbox} + default { + return {} + } + } + set att {} + for {set i 1} {$i<=3} {incr i} { + if {$i>1} { + set ts [set ts$i] + set opts [set opts$i] + } + foreach {opt1 opt2} $opts { + if {[catch {set val [ttk::style configure $ts $opt1]}]} { + return $att + } + if {$val eq {}} { + catch { set val [ttk::style $oper . $opt2] } + } + if {$val ne {}} { + append att " $opt2 $val" + } + } + } + return $att + } + #_______________________ + + method UpdateSelectAttrs {w} { + # Updates attributes for selection. + # w - window's name + # Some widgets (e.g. listbox) need a work-around to set + # attributes for selection in run-time, namely at focusing in/out. + + set fD $::apave::_CS_(!FG) + set bD $::apave::_CS_(!BG) + set f -selectforeground + set b -selectbackground + lassign [::apave::parseOptions [ttk::style configure .] $f $fD $b $bD] fS bS + ::apave::bindToEvent $w $w configure $f $fS $b $bS + ::apave::bindToEvent $w $w configure $f $fD $b $bD + } + + ## ________________________ Popup menus _________________________ ## + + method ThemePopup {mnu args} { + # Recursively configures popup menus. + # mnu - menu's name (path) + # args - options of configuration + # See also: themePopup + + if {[set last [$mnu index end]] ne {none}} { + $mnu configure {*}$args + for {set i 0} {$i <= $last} {incr i} { + switch -exact -- [$mnu type $i] { + cascade { + my ThemePopup [$mnu entrycget $i -menu] {*}$args + } + command { + $mnu entryconfigure $i {*}$args + } + } + } + } + } + #_______________________ + + method themePopup {mnu} { + # Configures a popup menu so that its colors accord with a current CS. + # mnu - menu's name (path) + + if {[my csCurrent] == $::apave::_CS_(NONCS)} return + lassign [my csGet] - fg - bg2 - bgS fgS - tfgD - - - - bg + if {$bg eq {}} {set bg $bg2} + set opts "-foreground $fg -background $bg -activeforeground $fgS \ + -activebackground $bgS -font {[font actual apaveFontDef]}" + if {[catch {my ThemePopup $mnu {*}$opts -disabledforeground $tfgD}]} { + my ThemePopup $mnu {*}$opts + } + my themeNonThemed $mnu $mnu + } + + ## ________________________ Tk choosers _________________________ ## + + method ThemeChoosers {} { + # Configures file/dir choosers so that its colors accord with a current CS. + + if {[info commands ::apave::_TK_TOPLEVEL] ne ""} return + rename ::toplevel ::apave::_TK_TOPLEVEL + ; proc ::toplevel {args} { + set res [eval ::apave::_TK_TOPLEVEL $args] + set w [lindex $args 0] + rename $w ::apave::_W_TOPLEVEL$w + ; proc ::$w {args} " \ + set cs \[::apave::obj csCurrent\] ;\ + if {{configure -menu} eq \$args} {set args {configure}} ;\ + if {\$cs>-2 && \[string first {configure} \$args\]==0} { \ + lassign \[::apave::obj csGet \$cs\] fg - bg ;\ + lappend args -background \$bg \ + } ;\ + return \[eval ::apave::_W_TOPLEVEL$w \$args\] + " + return $res + } + rename ::canvas ::apave::_TK_CANVAS + ; proc ::canvas {args} { + set res [eval ::apave::_TK_CANVAS $args] + set w [lindex $args 0] + if {[string match "*cHull.canvas" $w]} { + rename $w ::apave::_W_CANVAS$w + ; proc ::$w {args} " \ + set cs \[::apave::obj csCurrent\] ;\ + lassign \[::apave::obj csGet \$cs\] fg - bg ;\ + if {\$cs>-2} { \ + if {\[string first {create text} \$args\]==0 || \ + \[string first {itemconfigure} \$args\]==0 && \ + \[string first {-fill black} \$args\]>0} { \ + dict set args -fill \$fg ;\ + dict set args -font apaveFontDef \ + } \ + } ;\ + ::apave::_W_CANVAS$w configure -bg \$bg ;\ + return \[eval ::apave::_W_CANVAS$w \$args\] + " + } + return $res + } + } + + ## __________________ EONS ObjectTheming ___________________ ## + +} + +# ________________________ EOF _________________________ # diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/clrpick.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/clrpick.tcl new file mode 100644 index 00000000..6944ab27 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/clrpick.tcl @@ -0,0 +1,900 @@ +# clrpick.tcl -- +# +# Color selection dialog for platforms that do not support a +# standard color selection dialog. +# +# Copyright (c) 1996 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# ToDo: +# +# (1): Find out how many free colors are left in the colormap and +# don't allocate too many colors. +# (2): Implement HSV color selection. +# + +# Make sure namespaces exist +namespace eval ::tk {} +namespace eval ::tk::dialog {} +namespace eval ::tk::dialog::color { + namespace import ::tk::msgcat::* +} +::msgcat::mcload [file join [file dirname [info script]] msgs] + +# ::tk::dialog::color:: -- +# +# Create a color dialog and let the user choose a color. This function +# should not be called directly. It is called by the tk_chooseColor +# function when a native color selector widget does not exist +# +proc ::tk::dialog::color:: {args} { + + variable ::tk::Priv + set dataName __tk__color + upvar ::tk::dialog::color::$dataName data + set w .$dataName + + # The lines variables track the start and end indices of the line + # elements in the colorbar canvases. + set data(lines,red,start) 0 + set data(lines,red,last) -1 + set data(lines,green,start) 0 + set data(lines,green,last) -1 + set data(lines,blue,start) 0 + set data(lines,blue,last) -1 + + # This is the actual number of lines that are drawn in each color strip. + # Note that the bars may be of any width. + # However, NUM_COLORBARS must be a number that evenly divides 256. + # Such as 256, 128, 64, etc. + set data(NUM_COLORBARS) 32 ;#16 + + # BARS_WIDTH is the number of pixels wide the color bar portion of the + # canvas is. This number must be a multiple of NUM_COLORBARS + set data(BARS_WIDTH) [expr $data(NUM_COLORBARS)*14] + + # PLGN_WIDTH is the number of pixels wide of the triangular selection + # polygon. This also results in the definition of the padding on the + # left and right sides which is half of PLGN_WIDTH. Make this number even. + set data(PLGN_HEIGHT) 16 ;#10 + + # PLGN_HEIGHT is the height of the selection polygon and the height of the + # selection rectangle at the bottom of the color bar. No restrictions. + set data(PLGN_WIDTH) 12 ;#10 + + Config $dataName $args + InitValues $dataName + + set sc [winfo screen $data(-parent)] + set winExists [winfo exists $w] + if {!$winExists || $sc ne [winfo screen $w]} { + if {$winExists} { + destroy $w + } + toplevel $w -class TkColorDialog -screen $sc + if {[tk windowingsystem] eq "x11"} {wm attributes $w -type dialog} + BuildDialog $w + } + + # Dialog boxes should be transient with respect to their parent, + # so that they will always stay on top of their parent window. However, + # some window managers will create the window as withdrawn if the parent + # window is withdrawn or iconified. Combined with the grab we put on the + # window, this can hang the entire application. Therefore we only make + # the dialog transient if the parent is viewable. + + if {[winfo viewable [winfo toplevel $data(-parent)]] } { + wm transient $w $data(-parent) + } + + # 5. Withdraw the window, then update all the geometry information + # so we know how big it wants to be, then center the window in the + # display (Motif style) and de-iconify it. + + wm title $w $data(-title) + if {[info exists data(-geometry)] && $data(-geometry) ne {-}} { + if {[set geo $data(-geometry)] eq {}} { + set X [winfo rootx $data(-parent)] + set Y [expr {[winfo rooty $data(-parent)]+32}] + set geo +$X+$Y + } elseif {[string match pointer+*+* $geo]} { ;# e.g. pointer+10+10 + lassign [split $geo +] -> X Y + set geo +[expr {[winfo pointerx .]+$X}]+[expr {[winfo pointery .]+$Y}] + } + lassign [lrange [split $geo +] end-1 end] X Y + after idle [list after 0 [list ::tk::dialog::color::ShowAtXY $w $X $Y]] + unset data(-geometry) + } else { + ::tk::PlaceWindow $w widget $data(-parent) + wm deiconify $w + } + if {$data(-ontop)} {wm attributes $w -topmost 1} + + # 6. Set a grab and claim the focus too. + + ::tk::SetFocusGrab $w $data(okBtn) + + # 7. Wait for the user to respond, then restore the focus and + # return the index of the selected button. Restore the focus + # before deleting the window, since otherwise the window manager + # may take the focus away so we can't redirect it. Finally, + # restore any grab that was in effect. + + vwait ::tk::Priv(selectColor) + set result $Priv(selectColor) + set ::tk::dialog::color::fgsel [$data(finalCanvas) cget -text] + set ::tk::dialog::color::bgsel $result + ::tk::RestoreFocusGrab $w $data(okBtn) + unset data + + # for backward compatibility: + # if any of new options (-tonemoves, -moveall) present + # then return a list: color + values of these options + if {[lsearch -regexp $args "(\[-\]tonemoves|\[-\]moveall)"] > -1} { + return [list $result $::tk::dialog::color::moveall \ + $::tk::dialog::color::tonemoves] + } + return $result +} + +proc ::tk::dialog::color::GetOptions {} { + # Gets current settings of options. + # Returns a list of selected color options: + # moveall - value of moveall option + # fgcolor - value of foreground (inverse) color + # bgcolor - value of background (selected) color + + return [list $::tk::dialog::color::moveall $::tk::dialog::color::fgsel $::tk::dialog::color::bgsel] +} + +proc ::tk::dialog::color::ShowAtXY {win x y} { + # Shows the picker at X,Y coordinates, checking the coordinates against the screen, incl. decors + # win - window's path + # x - window's X coordinate + # y - window's Y coordinate + + set w [winfo reqwidth $win] + set h [winfo reqheight $win] + set scrw [expr {[winfo vrootwidth .] - 12}] + set scrh [expr {[winfo vrootheight .] - 36}] + if {($x + $w) > $scrw } { + set x [expr {$scrw - $w}] + } + if {($y + $h) > $scrh } { + set y [expr {$scrh - $h}] + } + if {![string match -* $x]} {set x +[string trimleft $x +]} + if {![string match -* $y]} {set y +[string trimleft $y +]} + wm geometry $win $x$y + wm deiconify $win +} + +# ::tk::dialog::color::InitValues -- +# +# Get called during initialization or when user resets NUM_COLORBARS +# +proc ::tk::dialog::color::InitValues {dataName} { + upvar ::tk::dialog::color::$dataName data + + # IntensityIncr is the difference in color intensity between a colorbar + # and its neighbors. + set data(intensityIncr) [expr {256 / $data(NUM_COLORBARS)}] + + # ColorbarWidth is the width of each colorbar + set data(colorbarWidth) [expr {$data(BARS_WIDTH) / $data(NUM_COLORBARS)}] + + # Indent is the width of the space at the left and right side of the + # colorbar. It is always half the selector polygon width, because the + # polygon extends into the space. + set data(indent) [expr {$data(PLGN_WIDTH) / 2}] + + set data(colorPad) 2 + set data(selPad) [expr {$data(PLGN_WIDTH) / 2}] + + # + # minX is the x coordinate of the first colorbar + # + set data(minX) $data(indent) + + # + # maxX is the x coordinate of the last colorbar + # + set data(maxX) [expr {$data(BARS_WIDTH) + $data(indent)-1}] + + # + # canvasWidth is the width of the entire canvas, including the indents + # + set data(canvasWidth) [expr {$data(BARS_WIDTH) + $data(PLGN_WIDTH)}] + + # Set the initial color, specified by -initialcolor, or the + # color chosen by the user the last time. + set data(selection) $data(-initialcolor) + set data(finalColor) $data(-initialcolor) + set rgb [winfo rgb . $data(selection)] + + set data(red,intensity) [expr {[lindex $rgb 0]/0x100}] + set data(green,intensity) [expr {[lindex $rgb 1]/0x100}] + set data(blue,intensity) [expr {[lindex $rgb 2]/0x100}] +} + +# ::tk::dialog::color::Config -- +# +# Parses the command line arguments to tk_chooseColor +# +proc ::tk::dialog::color::Config {dataName argList} { + variable ::tk::Priv + upvar ::tk::dialog::color::$dataName data + + # 1: the configuration specs + # + if {[info exists Priv(selectColor)] && $Priv(selectColor) ne ""} { + set defaultColor $Priv(selectColor) + } else { + set defaultColor [. cget -background] + } + + set specs [list \ + [list -moveall {} {} 0] \ + [list -tonemoves {} {} 1] \ + [list -geometry {} {} -] \ + [list -initialcolor {} {} $defaultColor] \ + [list -parent {} {} .] \ + [list -title {} {} [mc "Color"]] \ + [list -inifile {} {} {}] \ + [list -ontop {} {} 0] \ + ] + + # 2: parse the arguments + # + tclParseConfigSpec ::tk::dialog::color::$dataName $specs "" $argList + + if {$data(-title) eq ""} { + set data(-title) " " + } + if {[catch {winfo rgb . $data(-initialcolor)} err]} { + return -code error -errorcode \ + [list TK LOOKUP COLOR $data(-initialcolor)] $err + } + + if {![winfo exists $data(-parent)]} { + return -code error -errorcode [list TK LOOKUP WINDOW $data(-parent)] \ + "bad window path name \"$data(-parent)\"" + } +} + +# ::tk::dialog::color::BuildDialog -- +# +# Build the dialog. +# +proc ::tk::dialog::color::BuildDialog {w} { + + upvar ::tk::dialog::color::[winfo name $w] data + + wm withdraw $w + + # let the dialog's background = the app's + $w configure -background [ttk::style lookup "." -background] + + # TopFrame contains the color strips and the color selection + # + set topFrame [ttk::frame $w.top -relief flat] + + # StripsFrame contains the colorstrips and the individual RGB entries + set stripsFrame [ttk::frame $topFrame.colorStrip] + + set maxWidth [::tk::mcmaxamp &Red &Green &Blue] + set maxWidth [expr {$maxWidth<6 ? 6 : $maxWidth}] + set colorList { + red "Red" + green "Green" + blue "Blue" + } + foreach {color l} $colorList { + # each f frame contains an [R|G|B] entry and the equiv. color strip. + set f [ttk::frame $stripsFrame.$color] + + # The box frame contains the label and entry widget for an [R|G|B] + set box [ttk::frame $f.box] + ttk::label $box.label {*}[ttk::style config TLabel] -text "[mc $l]:" \ + -width $maxWidth -anchor ne + bind $box.label <> [list focus $box.entry] + + ttk::entry $box.entry -textvariable \ + ::tk::dialog::color::[winfo name $w]($color,intensity) -width 4 + pack $box.label -side left -fill both -pady 6 + pack $box.entry -side left -anchor n -pady 4 -padx 2 + pack $box -side left -fill both + + set height [expr { [winfo reqheight $box.entry] + 1}] + + catch {::apave::obj untouchWidgets $f.sel} + canvas $f.color -height [expr $height-2] \ + -width $data(BARS_WIDTH) -relief sunken -bd 3 + canvas $f.sel -height [expr $data(PLGN_HEIGHT)+2] \ + -width $data(canvasWidth) -highlightthickness 0 \ + -bg [ttk::style lookup . -background] + pack $f.color -expand yes -fill both + pack $f.sel -expand yes -fill both + + pack $f -side top -fill x -pady 1 + + set data($color,entry) $box.entry + set data($color,col) $f.color + set data($color,sel) $f.sel + + set data(cbc1) red + set data(cbc2) [ttk::style lookup . -bordercolor] + if {$data(cbc2) eq {}} {set data(cbc2) grey} + bind $data($color,col) \ + [list tk::dialog::color::DrawColorScale $w $color 1] + bind $data($color,col) \ + [list tk::dialog::color::EnterLeaveColorBar $w $color $data(cbc1)] + bind $data($color,col) \ + [list tk::dialog::color::EnterLeaveColorBar $w $color $data(cbc2)] + + bind $data($color,sel) \ + [list tk::dialog::color::EnterLeaveColorBar $w $color $data(cbc1)] + bind $data($color,sel) \ + [list tk::dialog::color::EnterLeaveColorBar $w $color $data(cbc2)] + + bind $box.entry [list tk::dialog::color::HandleRGBEntry $w] + } + + set mainentry ::tk::dialog::color::[winfo name $w](selection) + + # for setting the mutual move of selectors: + set ::tk::dialog::color::tonemoves $data(-tonemoves) + set ::tk::dialog::color::moveall $data(-moveall) + set ::tk::dialog::color::fgsel {} + set ::tk::dialog::color::bgsel {} + pack [ttk::checkbutton $stripsFrame.moveallColorSel -text "[mc {Move all}] " \ + -variable ::tk::dialog::color::moveall -command \ + "::tk::dialog::color::StickSelectors $w 1"] -padx 2 -side left + set foc [ttk::frame $stripsFrame.foc] + foreach l { 804000 004000 004080 008080 800080 808000 \ + ffff00 ff00ff 00ffff 0000ff 00ff00 ff0000} { + set fl [frame $stripsFrame.foc.$l -bd 3 -relief raised -height 24 -width 24] + $fl configure -bg #$l + bind $fl [list tk::dialog::color::LittleSwatch $w $mainentry #$l] + pack $fl -expand yes -anchor nw -padx 2 -side left + } + pack $foc -expand yes -anchor nw -fill both -pady 4 -side right + + pack $stripsFrame -side left -fill both -pady 4 + + # The selFrame contains a frame that demonstrates the currently + # selected color + # + set selFrame [ttk::frame $topFrame.sel] + set lab [ttk::label $selFrame.lab {*}[ttk::style config TLabel] \ + -text [mc "Selection:"]] + set ent [ttk::entry $selFrame.ent -textvariable $mainentry -width 14] + set f1 [ttk::frame $selFrame.f1 -relief sunken] + set data(finalCanvas) [label $f1.demo -bd 1 -width 6 -height 6] + + pack $lab -side top -padx 4 -anchor sw + pack $ent -side top -padx 4 -pady 2 -anchor n + pack $f1 -expand yes -anchor nw -fill both -padx 4 -pady 4 + pack $data(finalCanvas) -expand yes -fill both -anchor s + + bind $ent [list tk::dialog::color::HandleSelEntry $w] + bind $data(finalCanvas) [list tk::dialog::color::ReverseFinalFg $w] + + pack $selFrame -side left -fill none -anchor nw + pack $topFrame -side top -expand yes -fill both -anchor nw + + # the botFrame frame contains the buttons + # + set botFrame [ttk::frame $w.bot -relief raised] + + ttk::button $botFrame.ok0 -text [mc "From clipboard"] \ + -command [list tk::dialog::color::OkCmd0 $w] + if {[set aloupe [info commands ::aloupe::run]] ne ""} { + ttk::button $botFrame.loupe -text [mc "Loupe"] \ + -command [list tk::dialog::color::Loupe $w] + } + ttk::button $botFrame.ok -text [string map {& ""} [mc "OK"]] \ + -command [list tk::dialog::color::OkCmd $w] + ttk::button $botFrame.cancel -text [string map {& ""} [mc "Cancel"]] \ + -command [list tk::dialog::color::CancelCmd $w] + + if {![catch {set clb [clipboard get]}] && \ + [regexp {^(#*\d{3,6}|[[:alnum:] ]{3,})$} $clb]} { + set data(okBtn) $botFrame.ok0 + } else { + set data(okBtn) $botFrame.ok + } + set data(cancelBtn) $botFrame.cancel + + if {$aloupe eq ""} { + grid $botFrame.ok0 x x x $botFrame.ok $botFrame.cancel -sticky ew + } else { + grid $botFrame.ok0 $botFrame.loupe x x x $botFrame.ok $botFrame.cancel -sticky ew -padx 2 + } + grid configure $botFrame.ok $botFrame.cancel -padx 2 -pady 4 + grid columnconfigure $botFrame 2 -weight 2 -uniform space + pack $botFrame -side bottom -fill x + + # Accelerator bindings + bind $lab <> [list focus $ent] + bind $w [list $data(cancelBtn) invoke] + bind $w [list tk::AltKeyInDialog $w %A] + + wm protocol $w WM_DELETE_WINDOW [list tk::dialog::color::CancelCmd $w] + bind $lab [list tk::dialog::color::CancelCmd $w] + + ::tk::dialog::color::StickSelectors $w 1 + wm resizable $w 0 0 +} + +# ::tk::dialog::color::SetRGBValue -- +# +# Sets the current selection of the dialog box +# +proc ::tk::dialog::color::SetRGBValue {w color} { + upvar ::tk::dialog::color::[winfo name $w] data + + set data(red,intensity) [lindex $color 0] + set data(green,intensity) [lindex $color 1] + set data(blue,intensity) [lindex $color 2] + + RedrawColorBars $w all + + # Now compute the new x value of each colorbars pointer polygon + foreach color {red green blue} { + set x [RgbToX $w $data($color,intensity)] + MoveSelector $w $data($color,sel) $color $x 0 + } +} + +# ::tk::dialog::color::XToRgb -- +# +# Converts a screen coordinate to intensity +# +proc ::tk::dialog::color::XToRgb {w x} { + upvar ::tk::dialog::color::[winfo name $w] data + + set x [expr {round(1.0 * ($x * $data(intensityIncr))/ $data(colorbarWidth))}] + if {$x > 255} {set x 255} + return $x +} + +# ::tk::dialog::color::RgbToX +# +# Converts an intensity to screen coordinate. +# +proc ::tk::dialog::color::RgbToX {w color} { + upvar ::tk::dialog::color::[winfo name $w] data + return [expr {($color * $data(colorbarWidth)/ $data(intensityIncr))}] +} + +# ::tk::dialog::color::DrawColorScale -- +# +# Draw color scale is called whenever the size of one of the color +# scale canvases is changed. +# +proc ::tk::dialog::color::DrawColorScale {w c {create 0}} { + upvar ::tk::dialog::color::[winfo name $w] data + + # col: color bar canvas + # sel: selector canvas + set col $data($c,col) + set sel $data($c,sel) + + # First handle the case that we are creating everything for the first time. + if {$create} { + # First remove all the lines that already exist. + if { $data(lines,$c,last) > $data(lines,$c,start)} { + for {set i $data(lines,$c,start)} {$i <= $data(lines,$c,last)} {incr i} { + $sel delete $i + } + } + # Delete the selector if it exists + if {[info exists data($c,index)]} { + $sel delete $data($c,index) + } + + # Draw the selection polygons + CreateSelector $w $sel $c + $sel bind $data($c,index) \ + [list tk::dialog::color::StartMove $w $sel $c %x $data(selPad) 1] + $sel bind $data($c,index) \ + [list tk::dialog::color::MoveSelector $w $sel $c %x $data(selPad)] + $sel bind $data($c,index) \ + [list tk::dialog::color::ReleaseMouse $w $sel $c %x $data(selPad)] + + set height [winfo height $col] + # Create an invisible region under the colorstrip to catch mouse clicks + # that aren't on the selector. + set data($c,clickRegion) [$sel create rectangle 0 0 \ + $data(canvasWidth) $height -fill {} -outline {}] + + bind $col \ + [list tk::dialog::color::StartMove $w $sel $c %x $data(colorPad)] + bind $col \ + [list tk::dialog::color::MoveSelector $w $sel $c %x $data(colorPad)] + bind $col \ + [list tk::dialog::color::ReleaseMouse $w $sel $c %x $data(colorPad)] + + $sel bind $data($c,clickRegion) \ + [list tk::dialog::color::StartMove $w $sel $c %x $data(selPad)] + $sel bind $data($c,clickRegion) \ + [list tk::dialog::color::MoveSelector $w $sel $c %x $data(selPad)] + $sel bind $data($c,clickRegion) \ + [list tk::dialog::color::ReleaseMouse $w $sel $c %x $data(selPad)] + } else { + # l is the canvas index of the first colorbar. + set l $data(lines,$c,start) + } + + # Draw the color bars. + set highlightW [expr {[$col cget -highlightthickness] + [$col cget -bd]}] + for {set i 0} { $i < $data(NUM_COLORBARS)} { incr i} { + set intensity [expr {$i * $data(intensityIncr)}] + set startx [expr {$i * $data(colorbarWidth) + $highlightW}] + if {$c eq "red"} { + set color [format "#%02x%02x%02x" \ + $intensity $data(green,intensity) $data(blue,intensity)] + } elseif {$c eq "green"} { + set color [format "#%02x%02x%02x" \ + $data(red,intensity) $intensity $data(blue,intensity)] + } else { + set color [format "#%02x%02x%02x" \ + $data(red,intensity) $data(green,intensity) $intensity] + } + + if {$create} { + incr startx 4 + set index [$col create rect $startx $highlightW \ + [expr {$startx +$data(colorbarWidth)}] \ + [expr {[winfo height $col] + $highlightW}] \ + -fill $color -outline $color] + } else { + $col itemconfigure $l -fill $color -outline $color + incr l + } + } + $sel raise $data($c,index) + + if {$create} { + set data(lines,$c,last) $index + set data(lines,$c,start) [expr {$index - $data(NUM_COLORBARS) + 1}] + } + + RedrawFinalColor $w +} + +# ::tk::dialog::color::CreateSelector -- +# +# Creates and draws the selector polygon at the position +# $data($c,intensity). +# +proc ::tk::dialog::color::CreateSelector {w sel c } { + upvar ::tk::dialog::color::[winfo name $w] data + set data($c,index) [$sel create polygon \ + 0 $data(PLGN_HEIGHT) \ + $data(PLGN_WIDTH) $data(PLGN_HEIGHT) \ + $data(indent) 0] + set data($c,x) [RgbToX $w $data($c,intensity)] + $sel move $data($c,index) $data($c,x) 0 + EnterLeaveColorBar $w $c $data(cbc2) +} + +# Gets fg color (white/black) for a bg color. +# color - bg color + +proc ::tk::dialog::color::InvertBg {color} { + lassign [winfo rgb . $color] r g b + if {($r%256+$b%256)<15 && ($g%256)>180} { + set res black + } elseif {$r+1.5*$g+0.5*$b > 100000} { + set res black + } else { + set res white + } + return $res +} + +proc ::tk::dialog::color::ReverseFinalFg {w} { + upvar ::tk::dialog::color::[winfo name $w] data + set testcolors [list 000000 FFFFFF 804000 004000 004080 008080 800080 808000 \ + ffff00 ff00ff 00ffff 0000ff 00ff00 ff0000] + if {[incr data(idxFinalColor)]>=[llength $testcolors]} {set data(idxFinalColor) 0} + set fg #[lindex $testcolors $data(idxFinalColor)] + $data(finalCanvas) configure -fg $fg -text $fg +} + +# ::tk::dialog::color::RedrawFinalColor +# +# Combines the intensities of the three colors into the final color +# +proc ::tk::dialog::color::RedrawFinalColor {w} { + upvar ::tk::dialog::color::[winfo name $w] data + + set color [format "#%02x%02x%02x" $data(red,intensity) \ + $data(green,intensity) $data(blue,intensity)] + + #$data(finalCanvas) configure -bg $color + set fg [InvertBg $color] + $data(finalCanvas) configure -bg $color -fg $fg -text $fg -font {-weight bold} + set data(idxFinalColor) [expr {$fg ne "#000000"}] + set data(finalColor) $color + set data(selection) $color + set data(finalRGB) [list \ + $data(red,intensity) \ + $data(green,intensity) \ + $data(blue,intensity)] +} + +# ::tk::dialog::color::RedrawColorBars -- +# +# Only redraws the colors on the color strips that were not manipulated. +# Params: color of colorstrip that changed. If color is not [red|green|blue] +# Then all colorstrips will be updated +# +proc ::tk::dialog::color::RedrawColorBars {w colorChanged} { + upvar ::tk::dialog::color::[winfo name $w] data + + switch $colorChanged { + red { + DrawColorScale $w green + DrawColorScale $w blue + } + green { + DrawColorScale $w red + DrawColorScale $w blue + } + blue { + DrawColorScale $w red + DrawColorScale $w green + } + default { + DrawColorScale $w red + DrawColorScale $w green + DrawColorScale $w blue + } + } + RedrawFinalColor $w +} + +# ::tk::dialog::color::DrawOthers +# +# Draws other selectors if the "Move all" mode is set +# +proc ::tk::dialog::color::DrawOthers {w color} { + upvar ::tk::dialog::color::[winfo name $w] data + if {$::tk::dialog::color::moveall} { + set dif1 [expr {$data($color,intensity) - $data($color,stickypos)}] + foreach c {red green blue} { + if {$c!=$color && [set pos1 $data($c,stickypos)] > -1} { + set intens [expr {$pos1 + $dif1}] + set data($c,intensity) [expr {max(0,min(255,$intens))}] + RedrawColorBars $w $c + } + } + } +} + +# ::tk::dialog::color::StickSelectors +# +# Saves (sticks) all selectors' positions +# in order to restore (unstick) them if possible +# +proc ::tk::dialog::color::StickSelectors {w {clear 0}} { + upvar ::tk::dialog::color::[winfo name $w] data + if {$::tk::dialog::color::moveall} { + foreach c {red green blue} { + set data($c,stickypos) [expr {$clear ? -1 : $data($c,intensity)}] + } + } +} + +# ::tk::dialog::color::LittleSwatch +# +# Swatching a color +# +proc ::tk::dialog::color::LittleSwatch {w e c} { + upvar ::tk::dialog::color::[winfo name $w] data + set $e $c + HandleSelEntry $w +} + +#---------------------------------------------------------------------- +# Event handlers +#---------------------------------------------------------------------- + +# ::tk::dialog::color::StartMove -- +# +# Handles a mousedown button event over the selector polygon. +# Adds the bindings for moving the mouse while the button is +# pressed. Sets the binding for the button-release event. +# +# Params: sel is the selector canvas window, color is the color of the strip. +# +proc ::tk::dialog::color::StartMove {w sel color x delta {dontMove 0}} { + upvar ::tk::dialog::color::[winfo name $w] data + StickSelectors $w + if {!$dontMove} { + MoveSelector $w $sel $color $x $delta + } +} + +# ::tk::dialog::color::MoveSelector -- +# +# Moves the polygon selector so that its middle point has the same +# x value as the specified x. If x is outside the bounds [0,255], +# the selector is set to the closest endpoint. +# +# Params: sel is the selector canvas, c is [red|green|blue] +# x is a x-coordinate. +# +proc ::tk::dialog::color::MoveSelector {w sel color x delta} { + upvar ::tk::dialog::color::[winfo name $w] data + + incr x -$delta + + if { $x < 0 } { + set x 0 + } elseif { $x > $data(BARS_WIDTH)} { + set x $data(BARS_WIDTH) + } + set diff [expr {$x - $data($color,x) + 1}] + $sel move $data($color,index) $diff 0 + set data($color,x) [expr {$data($color,x) + $diff}] + + if {$::tk::dialog::color::tonemoves} { + set data($color,intensity) [XToRgb $w $x] + RedrawColorBars $w $color + # Move other selectors if "Move all" mode is set + DrawOthers $w $color + } + + # Return the x value that it was actually set at + return $x +} + +# ::tk::dialog::color::ReleaseMouse +# +# Removes mouse tracking bindings, updates the colorbars. +# +# Params: sel is the selector canvas, color is the color of the strip, +# x is the x-coord of the mouse. +# +proc ::tk::dialog::color::ReleaseMouse {w sel color x delta} { + upvar ::tk::dialog::color::[winfo name $w] data + + set x [MoveSelector $w $sel $color $x $delta] + + # Determine exactly what color we are looking at. + set data($color,intensity) [XToRgb $w $x] + RedrawColorBars $w $color + + if {!$::tk::dialog::color::tonemoves} { + DrawOthers $w $color + } + StickSelectors $w + + HandleSelEntry $w +} +# ::tk::dialog::color::ResizeColorbars -- +# +# Completely redraws the colorbars, including resizing the +# colorstrips +# +proc ::tk::dialog::color::ResizeColorBars {w} { + upvar ::tk::dialog::color::[winfo name $w] data + + if {($data(BARS_WIDTH) < $data(NUM_COLORBARS)) || + (($data(BARS_WIDTH) % $data(NUM_COLORBARS)) != 0)} { + set data(BARS_WIDTH) $data(NUM_COLORBARS) + } + InitValues [winfo name $w] + foreach color {red green blue} { + $data($color,col) configure -width $data(canvasWidth) + DrawColorScale $w $color 1 + } +} + +# ::tk::dialog::color::HandleSelEntry -- +# +# Handles the return keypress event in the "Selection:" entry +# +proc ::tk::dialog::color::HandleSelEntry {w} { + upvar ::tk::dialog::color::[winfo name $w] data + + StickSelectors $w 1 + set text [string trim $data(selection)] + # Check to make sure that the color is valid + if {[catch {set color [winfo rgb . $text]} ]} { + set data(selection) $data(finalColor) + return + } + + set R [expr {[lindex $color 0]/0x100}] + set G [expr {[lindex $color 1]/0x100}] + set B [expr {[lindex $color 2]/0x100}] + + SetRGBValue $w "$R $G $B" + set data(selection) $text +} + +# ::tk::dialog::color::HandleRGBEntry -- +# +# Handles the return keypress event in the R, G or B entry +# +proc ::tk::dialog::color::HandleRGBEntry {w} { + upvar ::tk::dialog::color::[winfo name $w] data + + StickSelectors $w 1 + foreach c {red green blue} { + if {[catch { + set data($c,intensity) [expr {int($data($c,intensity))}] + }]} { + set data($c,intensity) 0 + } + if {$data($c,intensity) < 0} { + set data($c,intensity) 0 + } + if {$data($c,intensity) > 255} { + set data($c,intensity) 255 + } + } + SetRGBValue $w "$data(red,intensity) \ + $data(green,intensity) $data(blue,intensity)" +} + +# mouse cursor enters/leaves a color bar +# +proc ::tk::dialog::color::EnterLeaveColorBar {w color fill} { + upvar ::tk::dialog::color::[winfo name $w] data + $data($color,sel) itemconfigure $data($color,index) -fill $fill +} + +# user hits "From clipboard" button +# +proc ::tk::dialog::color::OkCmd0 {w {clb ""}} { + set mainentry ".[winfo name $w].top.sel.ent" + if {$clb eq ""} { + if {[catch {set clb [clipboard get]}]} return + } + # try #RGB and RGB + foreach c {"" "#"} { + catch { + $mainentry delete 0 end + $mainentry insert 0 "$c$clb" + tk::dialog::color::HandleSelEntry $w + } + } +} + +# user hits "Loupe" button +# +proc ::tk::dialog::color::Loupe {w} { + upvar ::tk::dialog::color::[winfo name $w] data + if {$data(-inifile) ne {}} { + set inifile [list -inifile $data(-inifile)] + } else { + set inifile [] + } + ::aloupe::run -exit no -parent $w -commandname [mc "Color"] \ + -command "::tk::dialog::color::OkCmd0 $w %c" {*}$inifile +} + +# user hits OK button +# +proc ::tk::dialog::color::OkCmd {w} { + variable ::tk::Priv + upvar ::tk::dialog::color::[winfo name $w] data + set Priv(selectColor) $data(finalColor) +} + +# user hits Cancel button or destroys window +# +proc ::tk::dialog::color::CancelCmd {w} { + variable ::tk::Priv + set Priv(selectColor) "" +} +# _________________________________ EOF _________________________________ # +#RUNF1: ~/PG/github/pave/tests/test2_pave.tcl 23 9 12 "small icons" diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/msgs/de.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/msgs/de.msg new file mode 100644 index 00000000..0982b36c --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/msgs/de.msg @@ -0,0 +1,25 @@ +namespace eval ::tk { + ::msgcat::mcset de "&Blue" " Blau" + ::msgcat::mcset de "Blue" "Blau" + ::msgcat::mcset de "Cancel" "Abbruch" + ::msgcat::mcset de "&Cancel" "Abbruch" + ::msgcat::mcset de "Color" "Farbe" + ::msgcat::mcset de "&Green" " Grün" + ::msgcat::mcset de "Green" "Grün" + ::msgcat::mcset de "&OK" "&OK" + ::msgcat::mcset de "OK" "OK" + ::msgcat::mcset de "&Red" " Rot" + ::msgcat::mcset de "Red" "Rot" + ::msgcat::mcset de "&Selection:" " Auswahl:" + ::msgcat::mcset de "Selection:" "Auswahl:" + ::msgcat::mcset de "Move all" "Alle bewegen" + ::msgcat::mcset de "From clipboard" "Aus Zwischenablage" + ::msgcat::mcset de "To clipboard" "Zu Zwischenablage" + ::msgcat::mcset de "Loupe" "Lupe" + ::msgcat::mcset de "Close" "Schließen" + ::msgcat::mcset de "Size" "Größe" + ::msgcat::mcset de "Zoom" "Zoom" + ::msgcat::mcset de "blue" "blau" + ::msgcat::mcset de "green" "grün" + ::msgcat::mcset de "red" "rot" +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/msgs/es.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/msgs/es.msg new file mode 100644 index 00000000..2f35bfd8 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/msgs/es.msg @@ -0,0 +1,25 @@ +namespace eval ::tk { + ::msgcat::mcset es "&Blue" " Azul" + ::msgcat::mcset es "Blue" "Azul" + ::msgcat::mcset es "Cancel" "Cancelar" + ::msgcat::mcset es "&Cancel" "Cancelar" + ::msgcat::mcset es "Color" "Color" + ::msgcat::mcset es "&Green" " Verde" + ::msgcat::mcset es "Green" "Verde" + ::msgcat::mcset es "&OK" "OK" + ::msgcat::mcset es "OK" "OK" + ::msgcat::mcset es "&Red" " Rojo" + ::msgcat::mcset es "Red" "Rojo" + ::msgcat::mcset es "&Selection:" " Selección:" + ::msgcat::mcset es "Selection:" "Selección:" + ::msgcat::mcset es "Move all" "Mover todo" + ::msgcat::mcset es "From clipboard" "Desde portapapeles" + ::msgcat::mcset es "To clipboard" "Hacia portapapeles" + ::msgcat::mcset es "Loupe" "Lupa" + ::msgcat::mcset es "Close" "Cerrar" + ::msgcat::mcset es "Size" "Tamaño" + ::msgcat::mcset es "Zoom" "Zoom" + ::msgcat::mcset es "blue" "azul" + ::msgcat::mcset es "green" "verde" + ::msgcat::mcset es "red" "rojo" +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/msgs/ru.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/msgs/ru.msg new file mode 100644 index 00000000..cb7d4014 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/msgs/ru.msg @@ -0,0 +1,25 @@ +namespace eval ::tk { + ::msgcat::mcset ru "&Blue" " &\u0413\u043e\u043b\u0443\u0431\u043e\u0439" + ::msgcat::mcset ru "Blue" "\u0413\u043e\u043b\u0443\u0431\u043e\u0439" + ::msgcat::mcset ru "Cancel" "\u041e\u0442\u043c\u0435\u043d\u0430" + ::msgcat::mcset ru "&Cancel" "\u041e\u0442&\u043c\u0435\u043d\u0430" + ::msgcat::mcset ru "Color" "\u0426\u0432\u0435\u0442" + ::msgcat::mcset ru "&Green" " &\u0417\u0435\u043b\u0435\u043d\u044b\u0439" + ::msgcat::mcset ru "Green" "\u0417\u0435\u043b\u0435\u043d\u044b\u0439" + ::msgcat::mcset ru "&OK" "&\u041e\u041a" + ::msgcat::mcset ru "OK" "\u041e\u041a" + ::msgcat::mcset ru "&Red" " &\u041a\u0440\u0430\u0441\u043d\u044b\u0439" + ::msgcat::mcset ru "Red" "\u041a\u0440\u0430\u0441\u043d\u044b\u0439" + ::msgcat::mcset ru "&Selection:" "\u041e\u0442\u0431\u043e\u0440:" + ::msgcat::mcset ru "Selection:" "\u041e\u0442\u0431\u043e\u0440:" + ::msgcat::mcset ru "Move all" "\u0414\u0432\u0438\u0433\u0430\u0442\u044c\u0020\u0432\u0441\u0435" + ::msgcat::mcset ru "From clipboard" "\u0418\u0437\u0020\u0431\u0443\u0444\u0435\u0440\u0430" + ::msgcat::mcset ru "To clipboard" "\u0412\u0020\u0431\u0443\u0444\u0435\u0440" + ::msgcat::mcset ru "Loupe" "\u041b\u0443\u043f\u0430" + ::msgcat::mcset ru "Close" "\u0417\u0430\u043a\u0440\u044b\u0442\u044c" + ::msgcat::mcset ru "Size" "\u0420\u0430\u0437\u043c\u0435\u0440" + ::msgcat::mcset ru "Zoom" "\u041c\u0430\u0441\u0448\u0442\u0430\u0431" + ::msgcat::mcset ru "blue" " \u0433\u043e\u043b\u0443\u0431\u043e\u0439" + ::msgcat::mcset ru "green" " \u0437\u0435\u043b\u0435\u043d\u044b\u0439" + ::msgcat::mcset ru "red" " \u043a\u0440\u0430\u0441\u043d\u044b\u0439" +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/msgs/uk.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/msgs/uk.msg new file mode 100644 index 00000000..becec507 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/color/msgs/uk.msg @@ -0,0 +1,25 @@ +namespace eval ::tk { + ::msgcat::mcset uk "&Blue" " Блакитний" + ::msgcat::mcset uk "Blue" "Блакитний" + ::msgcat::mcset uk "Cancel" "Відміна" + ::msgcat::mcset uk "&Cancel" "Відміна" + ::msgcat::mcset uk "Color" "Колір" + ::msgcat::mcset uk "&Green" " Зелений" + ::msgcat::mcset uk "Green" "Зелений" + ::msgcat::mcset uk "&OK" "&OK" + ::msgcat::mcset uk "OK" "OK" + ::msgcat::mcset uk "&Red" " Червоний" + ::msgcat::mcset uk "Red" "Червоний" + ::msgcat::mcset uk "&Selection:" " Вибір:" + ::msgcat::mcset uk "Selection:" "Вибір:" + ::msgcat::mcset uk "Move all" "Рухати вÑе" + ::msgcat::mcset uk "From clipboard" "З буферу" + ::msgcat::mcset uk "To clipboard" "До буферу" + ::msgcat::mcset uk "Loupe" "Лупа" + ::msgcat::mcset uk "Close" "Закрити" + ::msgcat::mcset uk "Size" "Розмір" + ::msgcat::mcset uk "Zoom" "МаÑштаб" + ::msgcat::mcset uk "blue" "блакитний" + ::msgcat::mcset uk "green" "зелений" + ::msgcat::mcset uk "red" "червоний" +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/README.md b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/README.md new file mode 100644 index 00000000..2017bb6c --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/README.md @@ -0,0 +1,104 @@ +The *klnd* package provides a calendar widget to use along with [apave](../pave/index.html) package. + + Features: + + - displays localized days' and months' names + - gets a chosen day through `-value` or `-tvar` (variable name) option + - uses arrow keys to navigate through days, months and years + - provides hot keys to navigate through months and years + - provides buttons to navigate through months and years + - provides a button and a hot key to set a current date + - buttons' tips + - shown at +X+Y coordinates / under a widget / in a parent's center / in a screen's center or under the mouse pointer + - customizable title, date format, first week day (Sunday/Monday) + - themeable (with ttk and [apave](../pave/index.html) themes) + - may be a modal (by default) or non-modal window + + The calendar looks like this: + + + +# Synopsis + + To directly call the calendar, use the following commands: + + package require klnd + klnd::calendar ?-option value ... ? + + # or this way + source [file join $::apave::apaveDir pickers klnd klnd.tcl] + klnd::calendar ?-option value ... ? + + where `-option` may be: + + -value - sets an input date (omittable) + -tvar - sets a variable name to hold the input/output value (omittable) + -dateformat - sets the input/output date format (%D by default) + -weekday - sets a first week day: %w for Sunday, %u for Monday (default) + -modal - `yes` if the calendar should be a modal window (default) + -title - sets the calendar's title + -geometry - sets the calendar's geometry + -entry - sets a widget's path to show the calendar under + -parent - sets a parent toplevel window to center the calendar in + -centerme - `yes` if the calendar should be centered in the screen + + If `-value` and `-tvar` options are both set, the `-tvar` is preferred. If both omitted, a current system date is used as input. + + The calendar returns a chosen date (setting also the `-tvar` variable if any) or "" at no choice. + + The priority of geometry options: `-geometry, -entry, -parent, -centerme`. At no geometry option given, the calendar is shown under the mouse pointer. + + The `-parent` option may be used along with `-geometry, -entry`, as it allows a child window to inherit the parent's attributes. + +# Hot keys + + The calendar provides the hotkeys Left, Right, Up, Down, PageUp, PageDown, Home, End and F3 to navigate through days, months and years. + + The Enter / Space keys or Double-Click are used to pick a date. + +# Usage in apave package + + With [apave](../pave/index.html) package, the calendar can be used in two forms: date picker and embedded calendar: + + * date picker presents an entry field to hold an input/output date and a button to choose a date from the picker + + * embedded calendar presents a full set of widgets to display a selected month of year + + An example of using date picker for [apave](../pave/index.html) layout: + + {dat1 labDat1 L 1 1 {} {-tvar ::N::dat1 -title {Date of the event} -dateformat %d.%m.%Y -weekday %w}} + + This example includes `-tvar` option meaning a variable name to hold the date. + +The embedded calendar differs from this with `daT` type of widget used instead of `dat`. Also, this form of calendar doesn't allow using the keyboard; only the mouse is used in it. + + The below example is taken from [alited](../alited/index.html)'s source: + + {.daT - - - - {pack -fill both} {-tvar alited::project::klnddata(date) -com {alited::project::KlndUpdate} -dateformat $alited::project::klnddata(dateformat) -tip {alited::project::KlndTip %W %D}}} + + This example includes `-com` option to run a command at clicking a day. This command can use `::klnd::update` to highlight some days in the calendar. In [alited](../alited/index.html) these days contain reminders of TODOs being dead-lines. + + Options of embedded calendar: + + -com, -command - a command to run at left-click + -popup - a command to run at right-click + -currentmonth - a current month to display, in form of "year/month" + -united - if yes, means "united" calendars + -daylist - a list of selected days for "united" calendars + -hllist - a list of highlighted days + -tip - a command to get a day's tip + +A command of `-com, -command, -popup` options can use wildcards: `%y`, `%m`, `%d` for year, month, day, `%X`, `%Y` for mouse pointer's coordinates. + +A command of `-tip` option can use wildcards: `%W` for a day widget's path, `%D` for a day. + + UI procedures of embedded calendar: + + * `::klnd::labelPath` - gets a title label's path, to change its attributes + * `::klnd::selectedDay` - gets a selected day + * `::klnd::getDaylist` - gets a list of selected days (for united calendars) + * `::klnd::update` - redraws a calendar for a month + + The procedures use `obj` argument, which is just an index of a calendar (beginning with 1). If omitted or equal to {}, `obj` means a last created calendar. + + The multiple embedded calendars may be united with `-united yes` option, so that a user can select a list of days inside them. diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/klnd.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/klnd.tcl new file mode 100644 index 00000000..706c6e66 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/klnd.tcl @@ -0,0 +1,607 @@ +########################################################### +# Name: klnd.tcl +# Author: Alex Plotnikov (aplsimple@gmail.com) +# Date: 01/18/2022 +# Brief: Handles calendar picker for apave package. +# License: MIT. +########################################################### + +package require Tk +package provide klnd 1.4 + +# ________________________ klnd _________________________ # + +namespace eval ::klnd { + namespace export calendar + namespace eval my { + variable msgdir [file normalize [file join [file dirname [info script]] msgs]] + variable p + variable locales + # locale 1st day of week: %u means Mon (default), %w means Sun + array set locales [list \ + en_uk %u \ + en_us %w \ + ru %u \ + ru_ru %u \ + ru_ua %u \ + uk %u \ + ua %u \ + uk_ua %u \ + ua_ua %u \ + by %u \ + be_by %u \ + ] + } +} + + +# ________________________ my _________________________ # + +## ________________________ Go month/year _________________________ ## + +proc ::klnd::my::TrimN {n} { + # Strips day/month of leading 0 and space. + # n - day/month + + return [string trimleft $n { 0}] +} +#_______________________ + +proc ::klnd::my::IsDay {i} { + # Check if a button shows a day. + # i - button index + + variable p + return [expr {![catch {set w [$p(obj) BuT_KLNDSTD$i]}] && [$w cget -takefocus]}] +} +#_______________________ + +proc ::klnd::my::GoYear {i {dobreak no}} { + # Shifts the year backward/forward. + # i - increment for the current year + # dobreak - yes when called from 'bind' + + variable p + ShowMonth $p(mvis) [expr {$p(yvis)+($i)}] yes + if {$dobreak} {return -code break} +} +#_______________________ + +proc ::klnd::my::GoMonth {i {dobreak no}} { + # Shifts the month backward/forward. + # i - increment for the current month + # dobreak - yes when called from 'bind' + + variable p + set m [expr {$p(mvis)+($i)}] + if {$m>12} {set m 1; incr p(yvis)} + if {$m<1} {set m 12; incr p(yvis) -1} + ShowMonth $m $p(yvis) yes + if {$dobreak} {return -code break} +} +#_______________________ + +proc ::klnd::my::WeekNumbers {day1st ttls} { + # Gets the list of week numbers for a month. + # day1st - 1st day of months + # ttls - list of calender button's titles + + variable p + set res [list] + set secw $day1st + set incd 0 + for {set i 1} {$i<7} {incr i} { + set dtext [clock format $secw -format %V] + if {$p(weeks)==2} { + # 2nd (vulgar) mode of week numeration + set month [clock format $secw -format %m] + if {[clock format $secw -format %Y]>[clock format $day1st -format %Y]} { + set dtext {} + } elseif {$i==1 && $month eq {01} && $dtext ne {01}} { + set dtext {01} + set incd 1 + } elseif {$month==12 && $dtext eq {01}} { + set dtext [incr dtextprev] + } else { + set dtext [string range 0[expr {[string trimleft $dtext 0]+$incd}] end-1 end] + } + set dtextprev $dtext + } + if {$i==5 && [lindex $ttls 28] eq {} || $i==6 && [lindex $ttls 35] eq {}} { + set dtext {} + } + lappend res $dtext + set w [clock format $secw -format %w] + if {$w} {set w [expr {8-$w}]} {set w 1} + set secw [clock add $secw $w days] + } + return $res +} +#_______________________ + +proc ::klnd::my::ShowMonth {m y {dopopup no}} { + # Displays a month's days. + # m - month + # y -year + # dopopup - yes, if bind a popup menu + + variable p + set sec [CurrentDate] + set y [expr {max($y,1753)}] + ::baltip::tip [$p(obj) BuT_IM_KLND_0] \ + "[::msgcat::mc {Current date}]: [clock format $sec -format $p(dformat) -locale $p(loc)]\n(F3)" -under 5 + # display month & year + [$p(obj) LabMonth] configure -text "[lindex $p(months) [expr {$m-1}]] $y" \ + -font [::apave::obj boldDefFont [expr {[::apave::obj basicFontSize]+2}]] + # display day names + for {set i 1} {$i<8} {incr i} { + [$p(obj) LabDay$i] configure -text " [lindex $p(days) $i-1] " + } + # 1st day of the month's first week: + set day1st [clock scan "$m/1/$y" -format %D] + set i0 [clock format $day1st -format %w] + if {$p(weekday) eq "%u"} {if {$i0} {incr i0 -1} {set i0 6}} + # get the last day of month + if {[set yl $y] && [set ml $m]==12} {set ml 1; incr yl} + set lday [clock format [clock scan "[incr ml]/1/$yl 1 day ago"] -format %d] + set iday [set p(icurr) 0] + for {set i 1} {$i<38} {incr i} { + if {$i<=$i0 || $iday>=$lday} { + set ttl { } + set att "-takefocus 0 -activebackground $p(bg1) -overrelief flat" + set script {} + } else { + set ttl [incr iday] + set att "-takefocus 1 -activeforeground $p(fg0) -activebackground $p(bg0) -overrelief raised" + if {$iday==$p(dvis) || ($iday==$lday && $iday<$p(dvis))} { + if {[info exists p(after)]} {set af 20} {set af 200} ;# less at key pressing tight + catch {after cancel $p(after)} + set p(after) [after $af "::klnd::my::Enter $i; ::klnd::my::HighlightCurrentDay"] + } + if {$iday==1} {set p(d1st) $i} + if {$y==$p(y) && $m==$p(m) && $iday==$p(d)} { + set p(icurr) $i ;# button's index of the current date + } + if {$dopopup} { + set script [MapYMD $p(popup) $y $m $iday] + } + } + lappend ttls [string trim $ttl] + set wbut [$p(obj) BuT_KLNDSTD$i] + $wbut configure {*}$att -fg $p(fg1) -bg $p(bg1) -relief flat -text $ttl + if {$dopopup && $p(popup) ne {}} { + bind $wbut $script + } + } + set wnums [WeekNumbers $day1st $ttls] + for {set i 0} {$i<6} {} { + set wnum [lindex $wnums $i] + set wbut [$p(obj) BuTW[incr i]] + $wbut configure {*}$::klnd::TMPATTW -text $wnum + } + set p(mvis) $m ;# month & year currently visible + set p(yvis) $y +} + +#_______________________ + +proc ::klnd::my::MapYMD {script y m d} { + # Gets a script with %y, %m, %d wildcards. + + string map [list %y $y %m $m %d $d] $script +} + +## ________________________ Current day _________________________ ## + +proc ::klnd::my::CurrentDate {} { + + # Gets the current date. + + variable p + set sec [clock seconds] + lassign [split [clock format $sec -format $p(FINT)] /] p(y) p(m) p(d) + return $sec +} +#_______________________ + +proc ::klnd::my::SetCurrentDay {} { + # Goes to the current date. + + variable p + set p(dvis) 0 + ShowMonth $p(m) $p(y) + Enter $p(icurr) +} +#_______________________ + +proc ::klnd::my::HighlightCurrentDay {} { + # Highlights the current day's button. + + variable p + catch {[$p(obj) BuT_KLNDSTD$p(icurr)] configure -fg $p(fg2) -bg $p(bg2)} +} +#_______________________ + +proc ::klnd::my::ChosenDay {{show no}} { + # Formats a chosen day and displays it at need. + # show - if yes, displays the result + + variable p + set res {} + if {$p(dvis)} { + set res [clock format [clock scan $p(mvis)/$p(dvis)/$p(yvis) -format %D] -format $p(dformat)] + if {$show} {[$p(obj) ButOK] configure -text $res} + } + return $res +} + +## ________________________ Event handlers _________________________ ## + +proc ::klnd::my::PickDay {{i -1} {ret ""}} { + # Processes choosing a button. + # i - button index + # ret - returned "-code break", for double-click + + variable p + if {$i==-1} {set i $p(ienter)} + if {[IsDay $i]} {$p(obj) res $p(win) 1} + return {*}$ret +} +#_______________________ + +proc ::klnd::my::KeyPress {i K s} { + # Processes the key presses on buttons. + # i - button index + # K - pressed key + # s - key's state + + variable p + Leave $i + switch -glob $K { + Left {incr i -1} + Right {incr i} + Up {incr i -7} + Down {incr i 7} + Enter - Return - space {$p(obj) res $p(win) 1} + F3 {SetCurrentDay; return -code break} + *Tab* { + if {$s%2} {set b Close} {set b OK} + focus [$p(obj) But$b] + return -code break + } + default {Enter $i; return} + } + if {[IsDay $i]} { + Enter $i + } elseif {$K in {Left Up}} { + GoMonth -1 + } else { + GoMonth 1 + } + return -code break +} +#_______________________ + +proc ::klnd::my::Enter {i {focusin 0} {ret ""}} { + # Highlights a button and makes it current. + # i - button index + # focusin - yes, if the button is clicked and focused + # ret - "return -code" + + variable p + if {![IsDay $i]} {return {*}$ret} + Leave + [set w [$p(obj) BuT_KLNDSTD$i]] configure -fg $p(fgsel) -bg $p(bgsel) + set p(ienter) $i + set p(dvis) [$w cget -text] + catch {after cancel $p(after2)} + set p(after2) [after 10 "if \[winfo exists $w\] {focus -force $w}"] + if {$focusin && $p(com) ne {}} { + eval [MapYMD $p(com) $p(yvis) $p(mvis) $p(dvis)] + } +} +#_______________________ + +proc ::klnd::my::Leave {{i 0}} { + # Unhighlights a button. + # i - button index + + variable p + if {$i && ![[$p(obj) BuT_KLNDSTD$i] cget -takefocus]} return + foreach n [list $i $p(ienter)] { + if {$n} {[$p(obj) BuT_KLNDSTD$n] configure -fg $p(fg1) -bg $p(bg1)} + } + HighlightCurrentDay +} + +## ________________________ Initializing _________________________ ## + +proc ::klnd::my::InitSettings {} { + # Gets initial settings, once only. + + variable p + variable msgdir + array set p [list FINT %Y/%N/%e days {} months {} \ + d 0 m 0 y 0 dvis 0 mvis 0 yvis 0 icurr 0 ienter 0 weekday {} \ + d1st 1 width 2 loc en_uk] + if {![info exists :klnd::my::prevY]} { + foreach {i icon} {0 date 1 previous2 2 previous 3 next 4 next2} { + image create photo IM_KLND_$i -data [::apave::iconData $icon small] + } + lassign [::apave::obj csGet] p(fg0) p(fg1) p(bg0) p(bg1) - p(bgsel) p(fgsel) - - p(fgh) - - - - p(fg2) p(bg2) + # localized stuff + catch {::msgcat::mcload $msgdir} + set ::klnd::my::prevY [::msgcat::mc {Previous year}] + set ::klnd::my::prevM [::msgcat::mc {Previous month}] + set ::klnd::my::nextY [::msgcat::mc {Next year}] + set ::klnd::my::nextM [::msgcat::mc {Next month}] + set ::klnd::my::Close [::msgcat::mc Close] + } +} +#_______________________ + +proc ::klnd::my::InitCalendar {args} { + # Initializes the settings of the calendar. + + variable p + variable locales + InitSettings + lassign [::apave::parseOptions $args -locale [::msgcat::mclocale] \ + -title {} -value {} -tvar {} -parent {} -dateformat %D -weeks 0 \ + -weekday {} -centerme {} -geometry {} -entry {} -com {} -command {} \ + -currentmonth {} -united no -daylist {-} -hllist {} -popup {} -tip {} -width 2] \ + loc title datevalue tvar parent p(dformat) p(weeks) \ + p(weekday) centerme geo entry com1 com2 \ + p(currentmonth) p(united) p(daylist) p(hllist) p(popup) p(tip) p(width) + if {$com2 eq {}} {set p(com) $com1} {set p(com) $com2} + # get localized week day names + lassign [::klnd::weekdays $loc] p(days) p(weekday) + # get localized month names + set p(months) [::klnd::months $loc] + set p(loc) $loc + set p(tvar) $tvar + if {$tvar ne {}} { + set datevalue [set $tvar] + } elseif {$p(daylist) ne {-}} { + set datevalue [lindex $p(daylist) 0] + } + catch {unset p(after)} ;# to pause more at start + # colors to be used + CurrentDate + set p(yvis) $p(y) ;# by default, the selected date = the current date + set p(mvis) $p(m) + set p(dvis) $p(d) + if {$title eq {}} {set title [::msgcat::mc Calendar]} + catch {set p(dformat) [subst $p(dformat)]} + # get the day to display at start + if {![catch {set ym [clock scan $datevalue -format $p(dformat)]}]} { + set p(m) [clock format $ym -format %N] + set p(y) [clock format $ym -format %Y] + set p(dvis) [clock format $ym -format %e] + } + ::apave::obj untouchWidgets *KLND* + list $title $datevalue $tvar $parent $centerme $geo $entry +} +#_______________________ + +proc ::klnd::my::MainWidgets {} { + # Forms main widgets of calendar. + + variable p + if {$p(tip) eq {}} { + set ::klnd::TMPTIP {} + } else { + set tip [string map [list \{ ( \} )] $p(tip)] ;# for a possible bad list + set ::klnd::TMPTIP "-tip {$tip}" + } + if {$p(weeks)} {set ::klnd::TMPPACKW {}} {set ::klnd::TMPPACKW forget} + if {[::iswindows]} {set pady 2} {set pady 1} + set ::klnd::TMPATTW "-font {$::apave::FONTMAIN} -padx 0 -pady $pady \ + -activeforeground $p(fgh) -activebackground $p(bg1) -foreground $p(fgh) \ + -relief flat -overrelief flat -takefocus 0 -highlightthickness 0 -width 2" + return { + {fra - - 1 7 {-st new} {}} \ + {.frATool - - 1 7 {-st new} {-bg $::klnd::my::p(bg1)}} + {.frATool.tool - - - - {pack -side top} {-array { + IM_KLND_0 {::klnd::my::SetCurrentDay} sev 2 + IM_KLND_1 {{::klnd::my::GoYear -1} -tip "$::klnd::my::prevY\n(Home)@@-under 5"} h_ 1 + IM_KLND_2 {{::klnd::my::GoMonth -1} -tip "$::klnd::my::prevM\n(PageUp)@@-under 5"} h_ 2 + LabMonth {"" {-fill x -expand 1} {-anchor center -w 14}} h_ 1 + IM_KLND_3 {{::klnd::my::GoMonth 1} -tip "$::klnd::my::nextM\n(PageDown)@@-under 5"} h_ 2 + IM_KLND_4 {{::klnd::my::GoYear 1} -tip "$::klnd::my::nextY\n(End)@@-under 5"} + }}} + {.frAW .frATool T - - {-padx 0} {-bg $::klnd::my::p(bg1) -w 0 -borderwidth 0}} + {.frAW.labw - - 1 1 {pack -pady 1}} + {.frAW.BuTW1 + T 1 1 {pack $::klnd::TMPPACKW -pady 1} {$::klnd::TMPATTW}} + {.frAW.BuTW2 + T 1 1 {pack $::klnd::TMPPACKW -pady 1} {$::klnd::TMPATTW}} + {.frAW.BuTW3 + T 1 1 {pack $::klnd::TMPPACKW -pady 1} {$::klnd::TMPATTW}} + {.frAW.BuTW4 + T 1 1 {pack $::klnd::TMPPACKW -pady 1} {$::klnd::TMPATTW}} + {.frAW.BuTW5 + T 1 1 {pack $::klnd::TMPPACKW -pady 1} {$::klnd::TMPATTW}} + {.frAW.BuTW6 + T 1 1 {pack $::klnd::TMPPACKW -pady 1} {$::klnd::TMPATTW}} + {.frADays .frAW L 1 1 {-st nsew} {-bg $::klnd::my::p(bg1)}} + {.frADays.tcl { + # make headers and buttons of days + if {$::tcl_platform(platform) eq {windows}} { + set att {-highlightthickness 1} + } else { + set att {-highlightthickness 0} + } + set wt - + for {set i 1} {$i<45} {incr i} { + if {$i<8} {set cur ".frADays.LabDay$i"} {set cur ".frADays.BuT_KLNDSTD[expr {$i-7}]"} + if {($i%7)!=1} {set p L; set pw $pr} {set p T; set pw $wt; set wt $cur} + if {$i<8} { + set lwid "$cur $pw $p 1 1 {-st ew} {-anchor center -foreground $::klnd::my::p(fgh) -background $::klnd::my::p(bg1)}" + } else { + set lwid "$cur $pw $p 1 1 {-st ew} {-relief flat -overrelief raised -takefocus 0 -padx 8 -pady 1 -font {$::apave::FONTMAIN} -com {::klnd::my::Enter [expr {$i-7}] 1} $::klnd::TMPTIP $att -w 2 -background $::klnd::my::p(bg1)}" + } + %C $lwid + set pr $cur + } + }} + } +} +#_______________________ + +proc ::klnd::my::DefaultLocale {} { + # Gets a default locale currently used in a system. + + return [lindex [::msgcat::mcpreferences] 0] +} + +# ________________________ UI _________________________ # + +proc ::klnd::minYear {} { + # Gets minimal year that is correct. + + return 1753 +} +#_______________________ + +proc ::klnd::maxYear {} { + # Gets maximal year that is correct. + + return 9999 +} +#_______________________ + +proc ::klnd::currentYearMonthDay {} { + # Gets current year, month, day. + # Returns a list of current year, month, day. + + set cl [clock seconds] + foreach d {Y N e} {lappend res {*}[clock format $cl -format %$d]} + return $res +} +#_______________________ + +proc ::klnd::months {{loc ""}} { + # Gets a list of months according to a locale. + # loc - the locale + + if {$loc eq {}} {set loc [my::DefaultLocale]} + set months [list] + foreach i {01 02 03 04 05 06 07 08 09 10 11 12} { + lappend months [clock format [clock scan "$i/01/2021" \ + -format %D -locale $loc] -format %B -locale $loc] + } + return $months +} +#_______________________ + +proc ::klnd::weekdays {{loc ""}} { + # Gets a list of week days according to a locale. + # loc - the locale + # Return list of weekdays and week format (%u or %w) + + variable my::locales + if {$loc eq {}} {set loc [my::DefaultLocale]} + if {[array names my::locales $loc] ne {}} { + set wformat $my::locales($loc) + } else { + set wformat %u ;# by default, 1st day of week is Monday + } + if {$wformat eq {%u}} { ;# Sunday be the last day of week + set wdays {1 2 3 4 5 6 7} + } else { + set wdays {0 1 2 3 4 5 6} + } + set days [list] + foreach i $wdays { + lappend days [clock format [clock scan "03/[expr {14+$i}]/2021" \ + -format %D -locale $loc] -format %a -locale $loc] + } + list $days $wformat +} +#_______________________ + +proc ::klnd::clearup {} { + # Clearance for klnd data (variable my::p). + + variable my::p + array unset my::p * +} +#_______________________ + +proc ::klnd::clearArgs {args} { + # Removes specific options from args. + # args - list of options + + ::apave::removeOptions $args -title -value -tvar -locale -parent -dateformat -weekday -com -command -currentmonth -united -daylist -hllist -popup -tip -weeks +} +#_______________________ + +proc ::klnd::calendar {args} { + # The main procedure of the calendar's toplevel. + # args - options of the calendar + + variable my::p + set my::p(isWidget) no + # get options and initialize the calendar's settings + lassign [my::InitCalendar {*}$args] title datevalue tvar parent centerme geo entry + set args [clearArgs {*}$args] + # priority of geometry options: -geometry, -entry, -parent, -centerme + # if no geometry option, show the calendar under the mouse pointer + if {$geo ne {}} { + set geo "-geometry $geo" + } elseif {$entry ne {}} { + set x [winfo rootx $entry] + set y [expr {[winfo rooty $entry]+32}] + set geo "-geometry +$x+$y" + } elseif {$parent ne {}} { + set geo "-centerme $parent" ;# to center in a toplevel window + } elseif {$centerme ne {}} { + set geo "-centerme $centerme" ;# it's an option of apave's + } else { + set geo "-geometry +[expr {[winfo pointerx .]+10}]+[expr {[winfo pointery .]+10}]" + } + set parent [string trimright $parent .] + set win [set my::p(win) "$parent._apave_CALENDAR_"] + catch {$my::p(obj) destroy} + # create apave object and layout its window + set my::p(obj) [::apave::APave create APAVE_CLND $win] + $my::p(obj) makeWindow $win.fra $title + $my::p(obj) paveWindow $win.fra [list \ + {*}[my::MainWidgets] \ + {seh fra T 1 7 {-pady 0}} \ + {fraBottom seh T 1 7 {-st ew -pady 1}} \ + {fraBottom.h_ - - - - {pack -fill both -expand 1 -side left} {}} \ + {fraBottom.ButOK - - - - {pack -side left} {-t OK -com ::klnd::my::PickDay}} \ + {fraBottom.ButClose - - - - {pack -side left} {-t "$my::Close" -com "$my::p(obj) res $win 0"}} \ + ] + unset -nocomplain ::klnd::TMPTIP + unset -nocomplain ::klnd::TMPPACKW + # binds for day buttons and 'Close' + foreach {ev prc} { "::klnd::my::GoYear -1 yes" "::klnd::my::GoYear 1 yes" \ + "::klnd::my::GoMonth -1 yes" "::klnd::my::GoMonth 1 yes"} { + for {set i 1} {$i<38} {incr i} { + set but [$my::p(obj) BuT_KLNDSTD$i] + bind $but $ev $prc + bind $but "::klnd::my::Enter $i" + bind $but "::klnd::my::Enter $i 0 {-code break}" + bind $but "::klnd::my::KeyPress $i %K %s" + bind $but "::klnd::my::PickDay $i {-code break}" + } + catch {bind [$my::p(obj) ButClose] $ev $prc} + } + bind $win ::klnd::my::SetCurrentDay + bind $win "::klnd::my::Leave" + set bok [$my::p(obj) ButOK] + bind $bok {::klnd::my::ChosenDay yes} + bind $bok "$bok configure -text OK" + # show and work with the calendar + after idle "::klnd::my::ShowMonth $my::p(m) $my::p(y) yes" + set res [$my::p(obj) showModal $win -resizable no {*}$args {*}$geo] + # get the result of the selection if any + if {$res && $my::p(dvis)} { + set res [my::ChosenDay] + if {$tvar ne {}} {set $tvar $res} + } else { + set res {} + } + catch {$my::p(obj) destroy} + catch {destroy $win} + return $res +} + +# _________________________________ EOF _________________________________ # diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/klnd2.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/klnd2.tcl new file mode 100644 index 00000000..800762f0 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/klnd2.tcl @@ -0,0 +1,524 @@ +########################################################### +# Name: klnd2.tcl +# Author: Alex Plotnikov (aplsimple@gmail.com) +# Date: 01/18/2022 +# Brief: Handles calendar widget for apave package. +# License: MIT. +########################################################### + +package require Tk + +# ________________________ my _________________________ # + +namespace eval ::klnd { + namespace export calendar2 + namespace eval my {} +} + +## ________________________ Go month/year _________________________ ## + +proc ::klnd::my::IsDay2 {obj i} { + # Check if a button shows a day. + # obj - index of calendar + # i - button index + + variable p + return [expr {![catch {set w [$p($obj) BuT$obj-${i}KLND]}] && \ + [string length [TrimN [$w cget -text]]]}] +} +#_______________________ + +proc ::klnd::my::GoYear2 {obj i {dobreak no}} { + # Shifts the year backward/forward. + # obj - index of calendar + # i - increment for the current year + # dobreak - yes when called from 'bind' + + variable p + ShowMonth2 $obj $p(mvis$obj) [expr {$p(yvis$obj)+($i)}] yes yes + if {$dobreak} {return -code break} +} +#_______________________ + +proc ::klnd::my::GoMonth2 {obj i {dobreak no}} { + # Shifts the month backward/forward. + # obj - index of calendar + # i - increment for the current month + # dobreak - yes when called from 'bind' + + variable p + set m [expr {$p(mvis$obj)+($i)}] + if {$m>12} {set m 1; incr p(yvis$obj)} + if {$m<1} {set m 12; incr p(yvis$obj) -1} + ShowMonth2 $obj $m $p(yvis$obj) yes yes + if {$dobreak} {return -code break} +} +#_______________________ + +proc ::klnd::my::fgMayHL {obj fg y m d} { + # Gets a foreground color (possibly highlighting). + # fg - default foreground color + # y - year + # m - month + # d - day + + variable p + foreach item $p(hllist$obj) { + # date format for highlighting is %Y/%m/%d + lassign [split [lindex $item 0] /] yh mh dh + set dh [TrimN $dh] + set mh [TrimN $mh] + if {$y==$yh && $m==$mh && $d==$dh} { + set fg red + break + } + } + return $fg +} +#_______________________ + +proc ::klnd::my::ShowMonth2 {obj m y {doenter yes} {dopopup no}} { + # Displays a month's days. + # obj - index of calendar + # m - month + # y - year + # doenter - yes, if perform Enter2 proc + # dopopup - yes, if bind a popup menu + + variable p + set y [expr {max($y,[::klnd::minYear])}] + set m [TrimN $m] + # if calendars are linked with united, no display of year in a title + if {$p(united$obj)} {set yd {}} {set yd " $y"} + [$p($obj) LabMonth$obj] configure -text "[lindex $p(months$obj) [expr {$m-1}]]$yd" \ + -font [::apave::obj boldDefFont [expr {[::apave::obj basicFontSize]+2}]] + # highlight color + set hlcolor red ;#[lindex [::apave::obj csGet] 17] + # display day names + for {set i 1} {$i<8} {incr i} { + [$p($obj) LabDay$obj$i] configure -text " [lindex $p(days$obj) $i-1]" + } + # 1st day of the month's first week: + set day1st [clock scan "$m/1/$y" -format %D] + set i0 [clock format $day1st -format %w] + if {$p(weekday$obj) eq {%u}} {if {$i0} {incr i0 -1} {set i0 6}} + # get the last day of month + if {[set yl $y] && [set ml $m]==12} {set ml 1; incr yl} + set lday [clock format [clock scan "[incr ml]/1/$yl 1 day ago"] -format %d] + set iday [set p(icurr$obj) 0] + for {set i 1} {$i<38} {incr i} { + set fg $p(fg1) + set bg $p(bg1) + set wbut [$p($obj) BuT$obj-${i}KLND] + if {$i<=$i0 || $iday>=$lday} { + set ttl { } + set att "-takefocus 0 -activebackground $p(bg1) -overrelief flat" + set script {} + } else { + set ttl [incr iday] + set att "-takefocus 0 -activeforeground $p(fg0) -activebackground $p(bg0) -overrelief raised" + if {$doenter && ($iday==$p(dvis$obj) || ($iday==$lday && $iday<$p(dvis$obj)))} { + catch {after cancel $p(after$obj)} + set p(after$obj) [after idle "::klnd::my::Enter2 $obj $i"] + } + if {$iday==1} {set p(d1st) $i} + if {$y==$p(y) && $m==$p(m) && $iday==$p(d)} { + set p(icurr$obj) $i ;# button's index of the current date + } + set dt [FormatDay2 $obj $y $m $iday] + if {[lsearch -exact $p(daylist$obj) $dt]>-1} { + set fg $p(fgsel) + set bg $p(bgsel) + } elseif {$p(currentdate) eq "$y/$m/$iday"} { + set fg $p(fg2) + set bg $p(bg2) + } + if {$dopopup} { + set script [MapYMD $p(popup$obj) $y $m $iday] + } + } + if {$dopopup && $p(popup$obj) ne {}} { + bind $wbut $script + } + lappend ttls [string trim $ttl] + # as last refuge: highlighting fg by hllist + set fg [fgMayHL $obj $fg $y $m $iday] + $wbut configure {*}$att -relief flat -fg $fg -bg $bg -text $ttl + } + set wnums [WeekNumbers $day1st $ttls] + for {set i 0} {$i<6} {} { + set wnum [lindex $wnums $i] + set wbut [$p($obj) BuTW[incr i]] + $wbut configure {*}$::klnd::TMPATTW -text $wnum + } + set p(mvis$obj) $m ;# month & year currently visible + set p(yvis$obj) $y +} + +## ________________________ Current day _________________________ ## + +proc ::klnd::my::SetCurrentDay2 {obj} { + # Goes to the current date. + # obj - index of calendar + + variable p + set p(dvis$obj) 0 + ShowMonth2 $obj $p(m) $p(y) + Enter2 $obj $p(icurr$obj) 1 +} +#_______________________ + +proc ::klnd::my::HighlightCurrentDay2 {obj} { + # Highlights the current day's button. + # obj - index of calendar + + variable p + if {$p(currentmonth) eq "$p(yvis$obj)/[TrimN $p(mvis$obj)]"} { + if {![info exists p(wcurr$obj)]} { + catch {set p(wcurr$obj) [$p($obj) BuT$obj-$p(icurr$obj)KLND]} + } + catch { + set day [$p(wcurr$obj) cget -text] + if {[$p(wcurr$obj) cget -bg] ne $p(bgsel) && [TrimN $day] ne {}} { + set fg [fgMayHL $obj $p(fg2) $p(yvis$obj) $p(mvis$obj) $day] + $p(wcurr$obj) configure -fg $fg -bg $p(bg2) + } + if {$p(united$obj)} { + # if calendars are linked with united, one COMMON day selected for all + set p(wcurrdate) $p(wcurr$obj) + } + } + return [expr {[info exists p(wunited$obj)] && [info exists p(wcurr$obj)] && \ + $p(wunited$obj) eq $p(wcurr$obj)}] + } + return no +} +#_______________________ + +proc ::klnd::my::FormatDay2 {obj y m d} { + # Gets a date formatted according to a current format. + # obj - index of calendar + # y - year of the date + # m - month of the date + # d - day of the date + + variable p + return [clock format [clock scan $m/$d/$y -format %D] -format $p(dformat$obj) -locale $p(loc$obj)] +} + +## ________________________ Event handlers _________________________ ## + +proc ::klnd::my::Enter2 {obj i {focusin 0}} { + # Highlights a button and makes it current. + # obj - index of calendar + # i - button index + # focusin - yes, if the button is clicked and focused + + variable p + if {[catch {set isday [IsDay2 $obj $i]}]} {set isday no} + if {!$isday} {return -code break} + set w [$p($obj) BuT$obj-${i}KLND] + set p(dvis$obj) [$w cget -text] + set date [FormatDay2 $obj $p(yvis$obj) $p(mvis$obj) $p(dvis$obj)] + if {$focusin} { + if {$p(daylist$obj) ne {-}} { + # add/delete the date to/from the list of selected days + if {[set di [lsearch -exact $p(daylist$obj) $date]]>-1} { + set p(daylist$obj) [lreplace $p(daylist$obj) $di $di] + ShowMonth2 $obj $p(mvis$obj) $p(yvis$obj) no + return + } else { + lappend p(daylist$obj) $date + } + } + } + ShowMonth2 $obj $p(mvis$obj) $p(yvis$obj) no + if {$focusin} { + catch {set $p(tvar$obj) $date} + set p(olddate$obj) $date + if {$p(united$obj)} { + # if calendars are linked with united, unselect previously selected COMMON day + # and then highlight the current date + catch { + if {$p(daylist$obj) eq {-}} { + $p(wunited) configure -fg $p(fg1) -bg $p(bg1) + } + if {[$p(wcurr$obj) cget -bg] ne $p(bgsel)} { + set fg [fgMayHL $obj $p(fg2) $p(yvis$obj) $p(mvis$obj) $p(dvis$obj)] + $p(wcurr$obj) configure -fg $fg -bg $p(bg2) + } + } + } + } + set p(ienter) $i + if {$p(tvar$obj) ne {}} { + set $p(tvar$obj) $date + if {$p(olddate$obj) eq $date} { + if {$p(daylist$obj) ne {-}} { + ShowMonth2 $obj $p(mvis$obj) $p(yvis$obj) no + } else { + catch { + # unselect previously selected day of THIS month + if {![HighlightCurrentDay2 $obj]} { + $p(wunited$obj) configure -fg $p(fg1) -bg $p(bg1) + } + } + # show selected day + set fg [fgMayHL $obj $p(fgsel) $p(yvis$obj) $p(mvis$obj) $p(dvis$obj)] + $w configure -fg $fg -bg $p(bgsel) + } + # save the selected widget for THIS month + # and as COMMON for calendars linked with united + set p(wunited$obj) $w + if {$p(united$obj)} {set p(wunited) $w} + } + } + if {$focusin && $p(com$obj) ne {}} { + eval [MapYMD $p(com$obj) $p(yvis$obj) $p(mvis$obj) $p(dvis$obj)] + } + HighlightCurrentDay2 $obj +} +#_______________________ + +proc ::klnd::my::BindButtons2 {obj} { + # Binds events to buttons of a calendar. + # obj - index of calendar + + variable p + for {set i 1} {$i<38} {incr i} { + set but [$p($obj) BuT$obj-${i}KLND] + bind $but "::klnd::my::Enter2 $obj $i 1" + } +} +#_______________________ + +proc ::klnd::my::ButtonTip {obj tipcom w} { + # Gets a button's tip. + # obj - index of calendar + # tipcom - a caller's command returning a tip + # w - current day button's path + # The tipcom command can include wildcards: + # %W - a current day button's path + # %D - a current day's value as Y/M/D + + variable p + set res {} + catch { + set y $p(yvis$obj) + set m $p(mvis$obj) + set d [TrimN [$w cget -text]] + set d [clock format [clock scan $m/$d/$y -format %D] -format %Y/%m/%d] + set tipcom [string map [list %W $w %D $d] $tipcom] + set res [eval {*}$tipcom] + } + return $res +} + +## ________________________ Widgets _________________________ ## + +proc ::klnd::my::MainWidgets2 {obj ownname} { + # Forms main widgets of calendar. + # obj - index of calendar + # ownname - frame for calendar + + variable p + set ::klnd::TMPTIP {} + catch { + if {$p(tip$obj) ne {}} { + set tipcom [list $p(tip)] ;# possible bad list + set ::klnd::TMPTIP \ + "-tip { -BALTIP %W -COMMAND {::klnd::my::ButtonTip $obj {$tipcom} %w} }" + } + } + set p(tipF3$obj) \ + "[::msgcat::mc {Current date}]: \ + [clock format [CurrentDate] -format $p(dformat$obj) -locale $p(loc$obj)]" + set res [list "$ownname.laB - - 1 10 {-st nsew} {-bg $p(bg1)}"] + # if calendars are united, no display of tool bar + if {$p(united$obj)} { + lappend res \ + "$ownname.laB.LabMonth$obj - - - - {pack -fill x -expand 1} {-anchor center -w 18}" + } else { + lappend res \ + "$ownname.laB.tool - - - - {pack -side top} {-array { \ + IM_KLND_0 {{::klnd::my::SetCurrentDay2 $obj} -tip {$p(tipF3$obj)@@-under 5}} sev 3 \ + IM_KLND_1 {{::klnd::my::GoYear2 $obj -1} -tip {$::klnd::my::prevY\n(Home)@@-under 5}} h_ 1 \ + IM_KLND_2 {{::klnd::my::GoMonth2 $obj -1} -tip {$::klnd::my::prevM\n(PageUp)@@-under 5}} h_ 2 \ + LabMonth$obj {{} {-fill x -expand 1} {-anchor center -w 18}} h_ 1 \ + IM_KLND_3 {{::klnd::my::GoMonth2 $obj 1} -tip {$::klnd::my::nextM\n(PageDown)@@-under 5}} h_ 2 \ + IM_KLND_4 {{::klnd::my::GoYear2 $obj 1} -tip {$::klnd::my::nextY\n(End)@@-under 5}} \ + }}" + } + set ::klnd::TMPATTW "-font {$::apave::FONTMAIN} -padx 0 -pady 0 \ + -activeforeground $p(fgh) -activebackground $p(bg1) -foreground $p(fgh) \ + -relief flat -overrelief flat -takefocus 0 -highlightthickness 0 -width 2" + if {$p(weeks)} {set ::klnd::TMPPACKW {}} {set ::klnd::TMPPACKW forget} + lappend res "$ownname.frAW $ownname.laB T - - {-padx 0} {-bg $p(bg1) -w 0 -borderwidth 0}" + lappend res "$ownname.frAW.labw - - 1 1 {pack $::klnd::TMPPACKW -pady 0}" + # 1st day of the month's first week: + for {set i 1} {$i<7} {incr i} { + lappend res "$ownname.frAW.BuTW$i + T 1 1 {pack $::klnd::TMPPACKW -pady 1} {$::klnd::TMPATTW}" + } + lappend res "$ownname.laBDays $ownname.frAW L - - {-st nsew} {-bg $p(bg1)}" + lappend res \ + [list $ownname.laBDays.tcl " \ + set wt - ; \ + for {set i 1} {\$i<45} {incr i} { \ + if {\$i<8} {set cur $ownname.laBDays.LabDay$obj\$i} {set cur $ownname.laBDays.BuT$obj-\[expr {\$i-7}\]KLND} ; \ + if {(\$i%7)!=1} {set p L; set pw \$pr} {set p T; set pw \$wt; set wt \$cur} ; \ + if {\$i<8} { \ + set lwid \"\$cur \$pw \$p 1 1 {-st ew -pady 0} {-anchor center -foreground $p(fgh) -background $p(bg1)}\" \ + } else { \ + set lwid \"\$cur \$pw \$p 1 1 {-st ew -pady 1} {-relief flat -overrelief raised -takefocus 0 -padx 8 -pady 0 -font {$::apave::FONTMAIN} -com {::klnd::my::Enter2 $obj \[expr {\$i-7}\]} $::klnd::TMPTIP -highlightthickness 0 -w $p(width) -background $p(bg1)}\" \ + } ; \ + %C \$lwid ; \ + set pr \$cur \ + }" + ] + return $res +} + +# ________________________ UI _________________________ # + +proc ::klnd::labelPath {{obj {}}} { + # Gets a title label path. + # obj - index of the calendar + # Useful to change the label's attributes. + # If *obj* omitted, returns a path of last created label. + + variable my::p + if {$obj eq {}} {set obj $my::p(objNUM)} + return [$my::p($obj) LabMonth$obj] +} +#_______________________ + +proc ::klnd::blinking {doit} { + # Makes a calendar label blink. + # doit - if yes, starts blinking, else stops it + + lassign [::apave::obj csGet] - fgnorm - bgnorm + lassign [::apave::obj csGet 45] - - - - - bgblink fgblink + set lab [::klnd::labelPath] + if {$doit} { + after idle "::apave::blinkWidget $lab $fgnorm $bgnorm $fgblink $bgblink 100 4" + } else { + ::apave::blinkWidget $lab $fgnorm $bgnorm + } +} +#_______________________ + +proc ::klnd::update {{obj {}} {year {}} {month {}} {hllist {}}} { + # Redraws a calendar. + # obj - index of the calendar + # year - year to redraw + # month - month to redraw + + variable my::p + if {$obj eq {}} { + set obj $my::p(objNUM) + set year $my::p(yvis$obj) + set month $my::p(mvis$obj) + set my::p(hllist$obj) $hllist + } + my::ShowMonth2 $obj $month $year yes yes +} +#_______________________ + +proc ::klnd::selectedDay {{obj {}} {y {}} {m {}} {d {}} {doblink yes}} { + # Gets a selected day. + # obj - index of the calendar + # y - year + # m - month + # d - day + # doblink - if yes, make the month blink + # If y/m/d are set, they define currently selected date. + # Returns a list of year, month, day + + variable my::p + if {$obj eq {}} {set obj $my::p(objNUM)} + if {$y ne {}} { + set my::p(yvis$obj) $y + set my::p(mvis$obj) $m + set my::p(dvis$obj) $d + if {$my::p(tvar$obj) ne {}} { + set p(olddate$obj) [my::FormatDay2 $obj $y $m $d] + set $my::p(tvar$obj) $p(olddate$obj) + } + after idle "::klnd::my::ShowMonth2 $obj $m $y yes yes; ::klnd::blinking $doblink" + } + list $my::p(yvis$obj) $my::p(mvis$obj) $my::p(dvis$obj) +} +#_______________________ + +proc ::klnd::getDaylist {pobj {min 0} {max 9999999}} { + # Gets a day list which was set initially and possibly changed by a user. + # pobj - apave object + # min - minimal index of calendar widget + # max - maximal index of calendar widget + # The pobj is the same as passed to klnd::calendar2. + # See also: calendar2 + + variable my::p + set res [list] + if {![catch {set objNUM $my::p(objNUM)}]} { + for {set obj 0} {$obj<$objNUM} {} { + incr obj + if {$my::p($obj) eq $pobj && [info exist my::p(daylist$obj)]} { + if {$my::p(daylist$obj) ne {-} && $min<=$obj && $obj<=$max} { + foreach d $my::p(daylist$obj) { + if {[lsearch -exact $res $d]<0} { + lappend res $d + } + } + } + } + } + } + return $res +} +#_______________________ + +proc ::klnd::calendar2 {pobj w ownname args} { + # The main procedure of the calendar embedded widget. + # pobj - apave object + # w - container widget for *ownname* + # ownname - frame widget for calendar + # args - options of the calendar + # Returns a list of widgets for apave layout. + + variable my::p + set obj [incr my::p(objNUM)] + set my::p($obj) $pobj + my::InitSettings + my::InitCalendar {*}$args + if {$my::p(currentmonth) eq {}} { + lassign [::klnd::currentYearMonthDay] year month day + set my::p(currentmonth) "$year/$month" + set my::p(currentdate) "$year/$month/$day" + } + # save options for current calendar + foreach opt {weekday months days loc yvis mvis dvis \ + com tvar dformat united currentmonth daylist popup hllist tip} { + set my::p($opt$obj) $my::p($opt) + } + if {$my::p(daylist) ne {-} && $my::p(united)} { + # for calendars united, initialize day lists per month + set my::p(daylist$obj) [list] + foreach date $my::p(daylist) { + set d [clock format [clock scan $date -format $my::p(dformat)] -format %Y/%N/%d] + lassign [split $d /] y m + set m [my::TrimN $m] + lappend my::p(daylist$obj) $date + } + } + # if calendars are united, it's selected at start + # and saved as previously selected one + set my::p(olddate$obj) {} + # binds for day buttons and show and work with the calendar + after idle "::klnd::my::BindButtons2 $obj; \ + ::klnd::my::ShowMonth2 $obj $my::p(m) $my::p(y) yes yes" + set res [my::MainWidgets2 $obj $ownname] + return $res +} + +# _________________________________ EOF _________________________________ # diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/msgs/de.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/msgs/de.msg new file mode 100644 index 00000000..efb62071 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/msgs/de.msg @@ -0,0 +1,11 @@ +namespace eval ::klnd::my { + ::msgcat::mcmset de { + {Calendar} {Kalender} + {Current date} {Aktuelles Datum} + {Previous year} {Vorjahr} + {Previous month} {Vorheriger Monat} + {Next year} {Nächstes Jahr} + {Next month} {Nächster Monat} + Close Schließen + } +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/msgs/es.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/msgs/es.msg new file mode 100644 index 00000000..43f6246d --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/msgs/es.msg @@ -0,0 +1,11 @@ +namespace eval ::klnd::my { + ::msgcat::mcmset es { + {Calendar} {Calendario} + {Current date} {Fecha actual} + {Previous year} {Año anterior} + {Previous month} {Mes anterior} + {Next year} {Año siguiente} + {Next month} {Mes siguiente} + Close Cerrar + } +} \ No newline at end of file diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/msgs/ru.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/msgs/ru.msg new file mode 100644 index 00000000..a1fb906a --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/msgs/ru.msg @@ -0,0 +1,11 @@ +namespace eval ::klnd::my { + ::msgcat::mcmset ru { + {Calendar} {Календарь} + {Current date} {Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð´Ð°Ñ‚Ð°} + {Previous year} {Предыдущий год} + {Previous month} {Предыдущий меÑÑц} + {Next year} {Следующий год} + {Next month} {Следующий меÑÑц} + Close Закрыть + } +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/msgs/uk.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/msgs/uk.msg new file mode 100644 index 00000000..e8ef9804 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pickers/klnd/msgs/uk.msg @@ -0,0 +1,11 @@ +namespace eval ::klnd::my { + ::msgcat::mcmset uk { + {Calendar} {Календар} + {Current date} {Поточна дата} + {Previous year} {Попередній рік} + {Previous month} {Попередній міÑÑць} + {Next year} {ÐаÑтупний рік} + {Next month} {ÐаÑтупний міÑÑць} + Close Закрити + } +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pkgIndex.tcl new file mode 100644 index 00000000..105828b2 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/pkgIndex.tcl @@ -0,0 +1,67 @@ +package ifneeded apave 4.4.10 [list source [file join $dir apave.tcl]] + +# A short intro (for Ruff! docs generator:) + +namespace eval apave { + + set _ruff_preamble { + + The *apave* software provides a sort of geometry manager for Tcl/Tk. + + The *apave* isn't designed to replace the existing Tk geometry managers (place, pack, grid). Rather the apave tries to simplify the window layout by using their best, by means of: + + - joining the power of grid and pack + - uniting a creation of widgets with their layout (and mostly their configuration) + - minimizing a coder's efforts at creating / modifying / removing widgets + - setting a natural tab order of widgets + - providing 'mega-widgets' + - providing 'mega-attributes', right up to the user-defined ones + - centralizing things like icons or popup menus + - theming both ttk and non-ttk widgets + + The *apave* is implemented as *APaveBase oo::class*, so that you can enhance it with your own inherited / mixin-ed class. + + While *APaveBase oo::class* allows to layout highly sophisticated windows, you can also employ its more 'earthy' descendants: + + *APaveDialog oo::class* and *APave oo::class* that allow you: + + - to call a variety of dialogs, optionally using a "Don't show again" checkbox and a tagged text + - to use a variety of widgets in dialogs, with entry, text (incl. readonly and stand-alone), combobox (incl. file content), spinbox, listbox, file listbox, option cascade, tablelist, checkbutton, radiobutton and label (incl. title) + - to resize windows neatly (however strange, not done in Tk standard dialogs) + + The theming facility of *apave* is enabled by *ObjectTheming oo::class* which embraces both ttk and non-ttk widgets. + + Along with standard widgets, the mentioned *apave* classes provide a batch of following 'mega-widgets': + + - file picker + - saved file picker + - directory picker + - font picker + - color picker + - date picker + - menubar + - toolbar + - statusbar + - file combobox + - file listbox + - file viewer/editor + - option cascade + - e_menu + - bartabs + - link + - baltip + - gutter + - scrolled frame + - switch + + At last, a CLI stand-alone dialog allows not only to ask "OK/Cancel" or "Yes/No" returning 1/0 but also to set environment variables to use in shell scripts. + + The **apave** originates from the old **pave** package, to comply with [How to build good packages](https://wiki.tcl-lang.org/page/How+to+build+good+packages) ("avoid simple, obvious names for your namespace"). + + Let it be a sort of **a-pave**. + + The details are in [Description](https://aplsimple.github.io/en/tcl/pave). + + } + +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/sframe.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/sframe.tcl new file mode 100644 index 00000000..b042098f --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/apave4.4.10/sframe.tcl @@ -0,0 +1,235 @@ +############################################################################# +# Name: sframe.tcl +# Authors: main code by Paul Walton, portions by Alex Plotnikov +# Date: 07/04/2022 +# Brief: Handles a ttk-compatible, scrollable frame widget. +# License: Tcl/Tk. +# +# Usage: +# sframe new ?-toplevel true? ?-anchor nsew? ?-mode x|y|xy|both? +# -> +# +# sframe content +# -> +############################################################################# + +# ________________________ sframe NS _________________________ # + +namespace eval sframe { + namespace ensemble create + namespace export * + + ## ________________________ sframe::procedures _________________________ ## + + proc new {path args} { + # Creates a scrollable frame or window. + # path - path to the frame/window + # args - options + + # Use the ttk theme's background for the canvas and toplevel + set bg [ttk::style lookup TFrame -background] + if { [ttk::style theme use] eq "aqua" } { + # Use a specific color on the aqua theme as 'ttk::style lookup' is not accurate. + set bg "#e9e9e9" + } + + # Create the main frame or toplevel. + if { [dict exists $args -toplevel] && [dict get $args -toplevel] } { + toplevel $path -bg $bg + } else { + ttk::frame $path + } + + # Create a scrollable canvas with scrollbars which will always be the same size as the main frame. + set mode both + if { [dict exists $args -mode] } { + set mode [dict get $args -mode] + } + switch -- [string tolower $mode] { + both - xy - yx { + set canvas [canvas $path.canvas -bg $bg -bd 0 -highlightthickness 0 -yscrollcommand [list $path.scrolly set] -xscrollcommand [list $path.scrollx set]] + ttk::scrollbar $path.scrolly -orient vertical -command [list $canvas yview] + ttk::scrollbar $path.scrollx -orient horizontal -command [list $canvas xview] + } + y { + set canvas [canvas $path.canvas -bg $bg -bd 0 -highlightthickness 0 -yscrollcommand [list $path.scrolly set]] + ttk::scrollbar $path.scrolly -orient vertical -command [list $canvas yview] + } + x { + set canvas [canvas $path.canvas -bg $bg -bd 0 -highlightthickness 0 -xscrollcommand [list $path.scrollx set]] + ttk::scrollbar $path.scrollx -orient horizontal -command [list $canvas xview] + } + default { + return -code error "-mode option is invalid: \"$mode\" (valid are x, y, xy, yx, both)" + } + } + + # Create a container frame which will always be the same size as the canvas or content, whichever is greater. + # This allows the child content frame to be properly packed and also is a surefire way to use the proper ttk background. + set container [ttk::frame $canvas.container] + pack propagate $container 0 + + # Create the content frame. Its size will be determined by its contents. This is useful for determining if the + # scrollbars need to be shown. + set content [ttk::frame $container.content] + + # Pack the content frame and place the container as a canvas item. + set anchor "n" + if { [dict exists $args -anchor] } { + set anchor [dict get $args -anchor] + } + pack $content -fill both -expand 1 -anchor $anchor + $canvas create window 0 0 -window $container -anchor nw + + # Grid the scrollable canvas sans scrollbars within the main frame. + grid $canvas -row 0 -column 0 -sticky nsew + grid rowconfigure $path 0 -weight 1 + grid columnconfigure $path 0 -weight 1 + + # Make adjustments when the sframe is resized or the contents change size. + bind $path.canvas [list [namespace current]::resize $path] + + # Mousewheel bindings for scrolling + set w [winfo toplevel $path] + catch { + if {$::tcl_platform(platform) eq {unix}} { + ::apave::bindToEvent $w \ + [namespace current]::wheelDelta $w 1 + ::apave::bindToEvent $w \ + [namespace current]::wheelDelta $w -1 + ::apave::bindToEvent $w \ + [namespace current]::wheelDelta $w 1 + ::apave::bindToEvent $w \ + [namespace current]::wheelDelta $w -1 + } + } + ::apave::bindToEvent $w \ + [namespace current]::wheelScroll $w [namespace current] scroll $path yview %D + ::apave::bindToEvent $w \ + [namespace current]::wheelScroll $w [namespace current] scroll $path xview %D + return $path + } + #_______________________ + + proc content {{path ""}} { + # Gets the path of the child frame suitable for content. + # path - path to the scrollable window/frame + + return $path.canvas.container.content + } + #_______________________ + + proc resize {path} { + # Makes adjustments when the the sframe is resized or the contents change size. + # path - path to the scrollable window/frame + + set canvas $path.canvas + set container $canvas.container + set content $container.content + + # Set the size of the container. At a minimum use the same width & height as the canvas. + set width [winfo width $canvas] + set height [winfo height $canvas] + + # If the requested width or height of the content frame is greater then use that width or height. + if { [winfo reqwidth $content] > $width } { + set width [winfo reqwidth $content] + } + if { [winfo reqheight $content] > $height } { + set height [winfo reqheight $content] + } + $container configure -width $width -height $height + + # Configure the canvas's scroll region to match the height and width of the container. + set bg [lindex [::apave::obj csGet] 3] + $canvas configure -scrollregion [list 0 0 $width $height] -bg $bg + + # Show or hide the scrollbars as necessary. + # Horizontal scrolling. + if {[winfo exists $path.scrollx]} { + if { [winfo reqwidth $content] > [winfo width $canvas] } { + grid $path.scrollx -row 1 -column 0 -sticky ew + } else { + grid forget $path.scrollx + } + } + # Vertical scrolling. + if {[winfo exists $path.scrolly]} { + if { [winfo reqheight $content] > [winfo height $canvas] } { + grid $path.scrolly -row 0 -column 1 -sticky ns + } else { + grid forget $path.scrolly + } + } + return + } + #_______________________ + + proc scroll {path view D} { + # Handles mousewheel scrolling. + # path - path to the scrollable window/frame + # view - xview or yview + # D - scrolling units + + if { [winfo exists $path.canvas] } { + $path.canvas $view scroll [expr {-$D}] units + } + return + } + #_______________________ + + proc checkScroll {w} { + # Checks whether the scrolling is possible. + # w - window + + set res yes + catch { + lassign [winfo pointerxy $w] rootX rootY + if {[set win [winfo containing $rootX $rootY]] eq {}} { + set win [focus] + } + if {[winfo exists $win]} { + set ts [string tolower [winfo class $win]] + } else { + set ts - + } + if {$ts in {tablelist text listbox treeview}} { + set res no + } + } + return $res + } + #_______________________ + + proc wheelScroll {w args} { + # Scrolls a window. + # w - window + + catch { + if {[checkScroll $w]} { + {*}$args + } + } + } + #_______________________ + + proc wheelDelta {w ev delval} { + # Generate mouse wheel events with deltas (for Linux). + # w - window + # ev - event + # delval - delta + + catch { + if {[checkScroll $w]} { + event generate $w $ev -delta $delval + } + } + } + + ## ________________________ EONS sframe _________________________ ## + +} + +# _____________________________ EOF _____________________________________ # +#RUNF1: C:/PG/github/pave/tests/test2_pave.tcl alt 0 9 12 "small icons" +#RUNF1: ../../../src/alited.tcl LOG=~/TMP/alited-DEBUG.log DEBUG diff --git a/src/vfs/punk9win.vfs/lib_tcl9/cffi2.0.3/LICENSE b/src/vfs/punk9wintk903.vfs/lib_tcl9/cffi2.0.3/LICENSE similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/cffi2.0.3/LICENSE rename to src/vfs/punk9wintk903.vfs/lib_tcl9/cffi2.0.3/LICENSE diff --git a/src/vfs/punk9win.vfs/lib_tcl9/cffi2.0.3/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/cffi2.0.3/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/cffi2.0.3/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/cffi2.0.3/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/cffi2.0.3/win32-x86_64/tcl9cffi203.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/cffi2.0.3/win32-x86_64/tcl9cffi203.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/cffi2.0.3/win32-x86_64/tcl9cffi203.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/cffi2.0.3/win32-x86_64/tcl9cffi203.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/imgjp20.1.1/imgjp2011.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/imgjp20.1.1/imgjp2011.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/imgjp20.1.1/imgjp2011.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/imgjp20.1.1/imgjp2011.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/imgjp20.1.1/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/imgjp20.1.1/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/imgjp20.1.1/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/imgjp20.1.1/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/imgtools0.3.1/imgtools031.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/imgtools0.3.1/imgtools031.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/imgtools0.3.1/imgtools031.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/imgtools0.3.1/imgtools031.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/imgtools0.3.1/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/imgtools0.3.1/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/imgtools0.3.1/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/imgtools0.3.1/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/LICENSE b/src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/LICENSE similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/LICENSE rename to src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/LICENSE diff --git a/src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/README.md b/src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/README.md similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/README.md rename to src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/README.md diff --git a/src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/bt.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/bt.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/bt.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/bt.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/btnames.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/btnames.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/btnames.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/btnames.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/btsdr.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/btsdr.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/btsdr.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/btsdr.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/win32-x86_64/tcl9iocp202.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/win32-x86_64/tcl9iocp202.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/iocp2.0.2/win32-x86_64/tcl9iocp202.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/iocp2.0.2/win32-x86_64/tcl9iocp202.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/parse_args0.5.1/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/parse_args0.5.1/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/parse_args0.5.1/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/parse_args0.5.1/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/parse_args0.5.1/tcl9parse_args051.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/parse_args0.5.1/tcl9parse_args051.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/parse_args0.5.1/tcl9parse_args051.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/parse_args0.5.1/tcl9parse_args051.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/sqlite3.47.2/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/sqlite3.47.2/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/sqlite3.47.2/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/sqlite3.47.2/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/sqlite3.47.2/tcl9sqlite3472.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/sqlite3.47.2/tcl9sqlite3472.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/sqlite3.47.2/tcl9sqlite3472.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/sqlite3.47.2/tcl9sqlite3472.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/sqlite3.51.0/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/sqlite3.51.0/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/sqlite3.51.0/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/sqlite3.51.0/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/sqlite3.51.0/sqlite3.n b/src/vfs/punk9wintk903.vfs/lib_tcl9/sqlite3.51.0/sqlite3.n similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/sqlite3.51.0/sqlite3.n rename to src/vfs/punk9wintk903.vfs/lib_tcl9/sqlite3.51.0/sqlite3.n diff --git a/src/vfs/punk9win.vfs/lib_tcl9/sqlite3.51.0/tcl9sqlite3510.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/sqlite3.51.0/tcl9sqlite3510.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/sqlite3.51.0/tcl9sqlite3510.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/sqlite3.51.0/tcl9sqlite3510.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/Tpt_NoPage.pdf b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/Tpt_NoPage.pdf similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/Tpt_NoPage.pdf rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/Tpt_NoPage.pdf diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/class_Doc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/class_Doc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/class_Doc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/class_Doc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/class_Page.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/class_Page.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/class_Page.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/class_Page.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/class_TextSearch.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/class_TextSearch.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/class_TextSearch.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/class_TextSearch.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/mupdf.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/mupdf.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/mupdf.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/mupdf.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/tclMuPDF-license.terms b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/tclMuPDF-license.terms similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/tclMuPDF-license.terms rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/tclMuPDF-license.terms diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tclMuPDF86.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tclMuPDF86.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tclMuPDF86.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tclMuPDF86.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tclMuPDF90.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tclMuPDF90.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tclMuPDF90.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tclMuPDF90.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tkMuPDF86.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tkMuPDF86.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tkMuPDF86.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tkMuPDF86.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tkMuPDF90.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tkMuPDF90.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tkMuPDF90.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclMuPDF-win64-2.5.1/win-x64/tkMuPDF90.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclcmark1.1/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcmark1.1/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclcmark1.1/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclcmark1.1/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclcmark1.1/tcl9tclcmark11.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcmark1.1/tcl9tclcmark11.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclcmark1.1/tcl9tclcmark11.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclcmark1.1/tcl9tclcmark11.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclcmark1.1/tclcmark.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcmark1.1/tclcmark.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclcmark1.1/tclcmark.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclcmark1.1/tclcmark.html diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/LICENSE b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/LICENSE new file mode 100644 index 00000000..024c3fa1 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/LICENSE @@ -0,0 +1,29 @@ +Copyright (c) 2016-2018, Ashok P. Nadkarni +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- The name of the copyright holder and any other contributors may not +be used to endorse or promote products derived from this software +without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/README.md b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/README.md new file mode 100644 index 00000000..6237c1ab --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/README.md @@ -0,0 +1,20 @@ +# Tclcsv extension for Tcl + +Tclcsv is a binary extension for reading and writing CSV format files. +It also includes a Tk widget for configuring CSV formats. + +## Documentation + +See for documentation. + +## Downloads + +Downloads are available from +. + +The file tclcsv-VERSION.zip contains 32- and 64-bit Windows binaries +for both Tcl 8.6 and Tcl 9. + +The files tclcsv-VERSION-src.zip and tclcsv-VERSION-src.tar.gz +contain source distributions. + diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/csv.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/csv.tcl new file mode 100644 index 00000000..8bcea49a --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/csv.tcl @@ -0,0 +1,366 @@ +# +# Copyright (c) 2015, Ashok P. Nadkarni +# All rights reserved. +# +# See the file license.terms for license +# + +namespace eval tclcsv { + variable script_dir + set script_dir [file dirname [info script]] +} + +# Like _sniff above but only considers delimiters +proc tclcsv::_sniff {chan delimiters} { + set seek_pos [chan tell $chan] + if {$seek_pos == -1} { + error "Channel is not seekable" + } + + # TBD - what if delimiters or quotes is empty? + # TBD - what if no rows ? + + set escapes [list \\ ""] + set quotes [list \" '] + set combinations {} + foreach delimiter $delimiters { + unset -nocomplain width_frequencies + try { + set nrows 0 + while {[gets $chan line] >= 0} { + if {$line eq ""} continue + set row [split $line $delimiter] + set n [llength $row] + incr width_frequencies($n) + incr nrows + if {$nrows > 100} break + } + } finally { + chan seek $chan $seek_pos + } + if {![info exists width_frequencies]} continue + set sorted_frequencies [lsort -stride 2 -decreasing -integer -index 1 [array get width_frequencies]] + set mode [lindex $sorted_frequencies 0] + # Fraction of the occurences where the mode frequency occurs + set mode_frac [expr {[lindex $sorted_frequencies 1] / double($nrows)}] + lappend combinations [list $delimiter $mode $mode_frac] + } + + # Sort the candidates such that + # - those where the mode fraction is higher are preferred under + # the assumption that the more lines that have the same number + # of occurences of that character, the greater the likelihood + # that character is the delimiter + # - those where the mode is higher is preferred under the assumption + # that greater occurences of a character within a line are + # less likely to be by chance + set comparator { + {a b} { + lassign $a adelim amode afrac + lassign $b bdelim bmode bfrac + + #return [expr {(sqrt($amode)*$afrac) > (sqrt($bmode)*$bfrac)}] + set aweight [expr {(sqrt($amode)*$afrac)}] + set bweight [expr {(sqrt($bmode)*$bfrac)}] + if {$aweight > $bweight} { + return 1 + } elseif {$aweight < $bweight} { + return -1 + } else { + return 0 + } + } + } + set winner [lindex [lsort -decreasing -command [list apply $comparator] $combinations] 0] + set delimiter [lindex $winner 0] + set nfields [lindex $winner 1] + + # We have picked a delimiter. Now figure out whether + # quotes are in use. By default " is assumed to be the quote char + # If we find sufficient number of fields beginning with and ending + # with ' then we assume that is the quote character. + # Along the way we also check if + # - initial spaces are to be skipped + # - quotes are doubled + # - an escape character is in use + # - comment character + try { + set nrows 0 + while {[gets $chan line] >= 0} { + if {$line eq ""} continue + set row [split $line $delimiter] + set n [llength $row] + if {$n == $nfields} { + lappend good $row + } elseif {$n < $nfields} { + lappend short $row + } else { + lappend long $row + } + incr nrows + if {$nrows > 100} break + } + set ngood [llength $good] + if {$ngood == 0} { + error "Failed to find lines with expected number of fields" + } + foreach row $good { + set findex 0 + set doublequotecount 0 + set singlequotecount 0 + foreach field $row { + # Check for quotes + if {[regexp {^\s*".*"$} $field]} { + incr doublequotecount + } elseif {[regexp {^\s*'.*'$} $field]} { + incr singlequotecount + } + # Keep track of leading spaces per column + if {[string index $field 0] eq " "} { + incr nspaces($findex) + } + incr findex + } + if {$singlequotecount > $doublequotecount} { + set quotechar ' + } else { + # Note even though double quote is the default do not + # explicitly mark as such unless we have actually seen it + if {$doublequotecount > 0} { + set quotechar \" + } + } + } + + # Check if quotes are doubled + if {[info exists quotechar]} { + set ch $quotechar + } else { + set ch \"; # Default quote char + } + + foreach row $good { + foreach field $row { + # TBD - how to check if quotes are doubled? + if {[regexp "\\s*${ch}\[^${ch}\]*${ch}${ch}" $field]} { + incr doublequote + } elseif {[regexp "\\s*${ch}\[^${ch}\]*(\[^\[:alnum:\]\])${ch}" $field -> esc]} { + incr esc_chars($esc) + } + } + if {(![info exists doublequote]) && [info exists esc_chars]} { + set esc_list [lsort -decreasing -integer -stride 2 -index 1 [array get esc_chars]] + set escape [lindex $esc_list 0] + } + } + + # If every column that had a field beginning with a space also + # had all fields in that column beginning with a space then + # we assume leading spaces are to be skipped. + if {[info exists nspaces]} { + set skipleadingspace 1 + foreach {col space_count} [array get nspaces] { + if {$space_count != $ngood} { + set skipleadingspace 0 + break + } + } + } + # If the bulk of short lines begin with the same character, + # assume it is the comment character + if {[info exists short]} { + foreach row $short { + set line [string trim [join $row $delimiter]] + incr comment([string index $line 0]) + } + set nshort [llength $short] + foreach {ch count} [array get comment] { + if {[expr {double($count)/$nshort}] > 0.8} { + set commentchar $ch + break + } + } + } + + # TBD - perhaps long lines can also be used since long lines + # can result from delimiters embedded within quotes + + } finally { + chan seek $chan $seek_pos + } + + set dialect [list -delimiter $delimiter] + if {[info exists skipleadingspace]} { + lappend dialect -skipleadingspace $skipleadingspace + } + if {[info exists quotechar]} { + lappend dialect -quote $quotechar + } + if {[info exists commentchar]} { + lappend dialect -comment $commentchar + } + if {[info exists doublequote]} { + lappend dialect -doublequote 1 + } else { + if {[info exists escape]} { + lappend dialect -escape $escape + } + } + + + return $dialect +} + +proc tclcsv::sniff_header {args} { + if {[llength $args] == 0} { + error "wrong # args: should be \"sniff_header ?options? channel\"" + } + set chan [lindex $args end] + + set seek_pos [chan tell $chan] + if {$seek_pos == -1} { + error "Channel is not seekable" + } + + try { + set rows [csv_read {*}[lrange $args 0 end-1] -nrows 100 $chan] + if {[llength $rows] < 2} { + error "Insufficient rows in CSV data to sniff headers." + } + set width [llength [lindex $rows 0]] + set types {} + for {set findex 0} {$findex < $width} {incr findex} { + dict set types $findex type unknown + dict set types $findex length [string length [lindex $rows 1 $findex]] + } + foreach row [lrange $rows 1 end] { + if {[llength $row] != $width} continue + for {set findex 0} {$findex < $width} {incr findex} { + set val [lindex $row $findex] + if {[string length $val] != [dict get $types $findex length]} { + dict set types $findex length -1 + } + set field_type [dict get $types $findex type] + if {$field_type eq "string"} continue + # Note values starting with 0 treated as strings (eg. zip codes) + # Exceptions are 0 and 0.something + if {[string index $val 0] eq "0" && + [string length $val] > 1 && + [string index $val 1] ne "."} { + dict set types $findex type string + continue + } + if {$field_type eq "real"} { + if {![string is double -strict $val]} { + dict set types $findex type string + } + continue + } + # field_type is integer or unknown. Our check for + # integer is not [string is wide] because we want to + # treat as decimal numbers and not parse as octals or hex + if {[regexp {^\d+$} $val]} { + dict set types $findex type integer + } elseif {[string is double -strict $val]} { + dict set types $findex type real + } else { + dict set types $findex type string + } + } + } + } finally { + chan seek $chan $seek_pos + } + + # If we could determine that any one column was a non-string type + # (integer or real) but the header field for that column is not + # of that type, we immediately conclude the first row is a header. + # In addition, in the case of columns that are of fixed width, + # we take a vote, where every time the field in first row of the + # fixed width column is of a different width we raise the probability + # of header existence and if of the same width, we lower the probability. + set probably_header 0 + set row [lindex $rows 0] + for {set findex 0} {$findex < $width} {incr findex} { + set field [lindex $row $findex] + set type [dict get $types $findex type] + if {($type eq "integer" && ![string is wide -strict $field]) || + ($type eq "real" && ![string is double -strict $field]) + } { + # The type of the first row field is different. Assume header + set probably_header 1 + break + } + set len [dict get $types $findex length] + if {$len >= 0} { + if {$len == [string length $field]} { + incr probably_header -1 + } else { + incr probably_header 1 + } + } + } + + set field_types {} + for {set findex 0} {$findex < $width} {incr findex} { + set type [dict get $types $findex type] + # $type can be unknown if the loop above did a continue right + # at the top for every line + if {$type eq "unknown"} { + set type string + } + lappend field_types $type + } + + if {$probably_header > 0} { + return [list $field_types $row] + } else { + return [list $field_types] + } +} + +proc tclcsv::dialect {dialect {direction read}} { + variable dialects + set dialects [dict create] + dict set dialects excel [list \ + -delimiter , \ + -quote \" \ + -doublequote 1 \ + -skipleadingspace 0] + dict set dialects excel-tab [dict merge [dict get $dialects excel] [list -delimiter \t]] + proc [namespace current]::dialect {dialect {direction read}} { + variable dialects + set opts [dict get $dialects $dialect] + if {$direction eq "write"} { + # Remove options not understood by writes + dict unset opts -skipleadingspace + } + return $opts + } + return [dialect $dialect $direction] +} + +proc tclcsv::sniff {args} { + if {[llength $args] == 0} { + error "wrong # args: should be \"sniff ?options? channel\"" + } + set chan [lindex $args end] + + array set opts [dict merge [dict create \ + -delimiters [list "," ";" ":" "\t"] \ + ] \ + [lrange $args 0 end-1]] + + return [_sniff $chan $opts(-delimiters)] +} + +proc tclcsv::dialectpicker args { + variable script_dir + uplevel #0 {package require Tk; package require snit} + uplevel #0 [list source [file join $script_dir widgets.tcl]] + uplevel 1 tclcsv::dialectpicker $args +} + +namespace eval tclcsv { + namespace export csv_read csv_write sniff sniff_header dialect +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/pkgIndex.tcl new file mode 100644 index 00000000..f893651b --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/pkgIndex.tcl @@ -0,0 +1,32 @@ +# +# Tcl package index file +# +package ifneeded tclcsv 2.4.3 \ +[list apply [list {dir} { + package require platform + set package_ns ::tclcsv + set initName [string totitle tclcsv] + if {[package vsatisfies [package require Tcl] 9]} { + set fileName "tcl9tclcsv243.dll" + } else { + set fileName "tclcsv243t.dll" + } + set platformId [platform::identify] + set searchPaths [list [file join $dir $platformId] \ + {*}[lmap platformId [platform::patterns $platformId] { + file join $dir $platformId + }] \ + $dir] + foreach path $searchPaths { + set lib [file join $path $fileName] + if {[file exists $lib]} { + uplevel #0 [list load $lib $initName] + # Load was successful + set ${package_ns}::dll_path $lib + set ${package_ns}::package_dir $dir + uplevel #0 [list source [file join $dir csv.tcl]] + return + } + } + error "Could not locate $fileName in directories [join $searchPaths {, }]" +}] $dir] diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/widgets.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/widgets.tcl new file mode 100644 index 00000000..99beb21e --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/widgets.tcl @@ -0,0 +1,890 @@ +# +# Copyright (c) 2015, Ashok P. Nadkarni +# All rights reserved. +# +# See the file license.terms for license +# + +package require msgcat + +namespace eval tclcsv { + namespace import ::msgcat::* + # critcl TEA install does not copy message files. So for now + # keep root strings here. + ::msgcat::mcmset "" { + encoding_l "Character encoding" + + header_line_l "First line contains a header" + skip_empty_l "Skip lines that are empty" + quote_doubled_l "Quotes are represented by doubling" + ignore_leading_space_l "Ignore leading space in fields" + + delimiter_char_l Delimiter + comment_char_l "Comment character" + quote_char_l "Quote character" + escape_char_l "Escape character" + + none_l None + space_l Space + tab_l Tab + hash_l "Hash (#)" + semicolon_l "Semicolon (;)" + comma_l Comma + dquote_l "Double quote (\")" + squote_l "Single quote (')" + backslash_l "Backslash (\)" + other_l Other + + include_l Include + heading_l Heading + type_l Type + } +} +# TBD ::msgcat::mcload [file join [file dirname [info script]] msgs] + +namespace eval tclcsv::sframe { + # sframe.tcl - from http://wiki.tcl.tk/9223 + # Paul Walton + # Create a ttk-compatible, scrollable frame widget. + # Usage: + # sframe new ?-toplevel true? ?-anchor nsew? + # -> + # + # sframe content + # -> + + namespace ensemble create + namespace export * + + # Create a scrollable frame or window. + proc new {path args} { + # Use the ttk theme's background for the canvas and toplevel + set bg [ttk::style lookup TFrame -background] + if { [ttk::style theme use] eq "aqua" } { + # Use a specific color on the aqua theme as 'ttk::style lookup' is not accurate. + set bg "#e9e9e9" + } + + # Create the main frame or toplevel. + if { [dict exists $args -toplevel] && [dict get $args -toplevel] } { + toplevel $path -bg $bg + } else { + ttk::frame $path + } + + # Create a scrollable canvas with scrollbars which will always be the same size as the main frame. + set canvas [canvas $path.canvas -bg $bg -bd 0 -highlightthickness 0 -yscrollcommand [list $path.scrolly set] -xscrollcommand [list $path.scrollx set]] + ttk::scrollbar $path.scrolly -orient vertical -command [list $canvas yview] + ttk::scrollbar $path.scrollx -orient horizontal -command [list $canvas xview] + + # Create a container frame which will always be the same size as the canvas or content, whichever is greater. + # This allows the child content frame to be properly packed and also is a surefire way to use the proper ttk background. + set container [ttk::frame $canvas.container] + pack propagate $container 0 + + # Create the content frame. Its size will be determined by its contents. This is useful for determining if the + # scrollbars need to be shown. + set content [ttk::frame $container.content] + + # Pack the content frame and place the container as a canvas item. + set anchor "n" + if { [dict exists $args -anchor] } { + set anchor [dict get $args -anchor] + } + pack $content -anchor $anchor + $canvas create window 0 0 -window $container -anchor nw + + # Grid the scrollable canvas sans scrollbars within the main frame. + grid $canvas -row 0 -column 0 -sticky nsew + grid rowconfigure $path 0 -weight 1 + grid columnconfigure $path 0 -weight 1 + + # Make adjustments when the sframe is resized or the contents change size. + bind $path.canvas [list [namespace current]::resize $path] + + # Mousewheel bindings for scrolling. + bind [winfo toplevel $path] [list +[namespace current] scroll $path yview %W %D] + bind [winfo toplevel $path] [list +[namespace current] scroll $path xview %W %D] + + return $path + } + + + # Given the toplevel path of an sframe widget, return the path of the child frame suitable for content. + proc content {path} { + return $path.canvas.container.content + } + + + # Make adjustments when the the sframe is resized or the contents change size. + proc resize {path} { + set canvas $path.canvas + set container $canvas.container + set content $container.content + + # Set the size of the container. At a minimum use the same width & height as the canvas. + set width [winfo width $canvas] + set height [winfo height $canvas] + + # If the requested width or height of the content frame is greater then use that width or height. + if { [winfo reqwidth $content] > $width } { + set width [winfo reqwidth $content] + } + if { [winfo reqheight $content] > $height } { + set height [winfo reqheight $content] + } + $container configure -width $width -height $height + + # Configure the canvas's scroll region to match the height and width of the container. + $canvas configure -scrollregion [list 0 0 $width $height] + + # Show or hide the scrollbars as necessary. + # Horizontal scrolling. + if { [winfo reqwidth $content] > [winfo width $canvas] } { + grid $path.scrollx -row 1 -column 0 -sticky ew + } else { + grid forget $path.scrollx + } + # Vertical scrolling. + if { [winfo reqheight $content] > [winfo height $canvas] } { + grid $path.scrolly -row 0 -column 1 -sticky ns + } else { + grid forget $path.scrolly + } + return + } + + + # Handle mousewheel scrolling. + proc scroll {path view W D} { + if { [winfo exists $path.canvas] && [string match $path.canvas* $W] } { + $path.canvas $view scroll [expr {-$D}] units + } + return + } +} + +#------------------------------------------------------------------------------ +# Copied from Csaba Nemethi's tablelist package +# tablelist::strRange +# +# Gets the largest initial (for alignment = left or center) or final (for +# alignment = right) range of characters from str whose width, when displayed +# in the given font, is no greater than pixels decremented by the width of +# snipStr. Returns a string obtained from this substring by appending (for +# alignment = left or center) or prepending (for alignment = right) (part of) +# snipStr to it. +#------------------------------------------------------------------------------ +proc tclcsv::fit_text {win str font pixels alignment snipStr} { + if {$pixels < 0} { + return "" + } + + set width [font measure $font -displayof $win $str] + if {$width <= $pixels} { + return $str + } + + set snipWidth [font measure $font -displayof $win $snipStr] + if {$pixels <= $snipWidth} { + set str $snipStr + set snipStr "" + } else { + incr pixels -$snipWidth + } + + if {[string compare $alignment "right"] == 0} { + set idx [expr {[string length $str]*($width - $pixels)/$width}] + set subStr [string range $str $idx end] + set width [font measure $font -displayof $win $subStr] + if {$width < $pixels} { + while 1 { + incr idx -1 + set subStr [string range $str $idx end] + set width [font measure $font -displayof $win $subStr] + if {$width > $pixels} { + incr idx + set subStr [string range $str $idx end] + return $snipStr$subStr + } elseif {$width == $pixels} { + return $snipStr$subStr + } + } + } elseif {$width == $pixels} { + return $snipStr$subStr + } else { + while 1 { + incr idx + set subStr [string range $str $idx end] + set width [font measure $font -displayof $win $subStr] + if {$width <= $pixels} { + return $snipStr$subStr + } + } + } + + } else { + set idx [expr {[string length $str]*$pixels/$width - 1}] + set subStr [string range $str 0 $idx] + set width [font measure $font -displayof $win $subStr] + if {$width < $pixels} { + while 1 { + incr idx + set subStr [string range $str 0 $idx] + set width [font measure $font -displayof $win $subStr] + if {$width > $pixels} { + incr idx -1 + set subStr [string range $str 0 $idx] + return $subStr$snipStr + } elseif {$width == $pixels} { + return $subStr$snipStr + } + } + } elseif {$width == $pixels} { + return $subStr$snipStr + } else { + while 1 { + incr idx -1 + set subStr [string range $str 0 $idx] + set width [font measure $font -displayof $win $subStr] + if {$width <= $pixels} { + return $subStr$snipStr + } + } + } + } +} + +# +# And finally, my own code + +# format text in a label, truncating and adding ellipsis as necessary. +# Also show "" as for better visual display +proc tclcsv::format_label {win text {align left} {font TkDefaultFont}} { + # Window has not been mapped yet. + if {$text eq ""} { + set text + } + set nchars [string length $text] + if {$nchars > 10} { + set nchars 10 + set width [font measure $font -displayof $win [string repeat a $nchars]] + set text [fit_text $win $text $font $width $align \u2026]; # Ellipsis + } + $win configure -text $text +} + +# A megawidget to permit various options for parsing CSV to be configured +snit::widget tclcsv::dialectpicker { + hulltype ttk::frame + + # + # Options related to parsing the CSV. These can be specified by the + # caller to initialize the settings for reading CSV data. They can + # then be changed interactively by the user through the various + # displayed widgets which are attached to them via -textvariable or + # -variable + + # File encoding + option -encoding -default utf-8 -readonly 1 -configuremethod SetOptEncoding + + # Special character settings + option -delimiter -default \t -configuremethod SetOptDelimiter -readonly 1 + option -comment -default "" -configuremethod SetOptCharPicker -readonly 1 + option -escape -default "" -configuremethod SetOptCharPicker -readonly 1 + option -quote -default \" -configuremethod SetOptCharPicker -readonly 1 + # Holds the "Other" entry content for specifying special characters + # Array indexed by option + variable _other; # Array contents of "Other" entry boxes indexed by option + + option -skipblanklines -default 1 -readonly 1 + option -skipleadingspace -default 0 -readonly 1 + option -doublequote -default 1 -readonly 1 + option -headerpresent -default 0 -readonly 1 + + # + # The three main data frames containing the options, the special + # character configuration and the sample data + variable _optf; # Option frame + variable _charf; # Character picker frame + variable _dataf; # Data frame + + + # If specified, the column metadata widgets are displayed + # (name, type etc.). The value must be a dictionary keyed by a + # data type token, with nested keys align and display (both optional) + option -columntypes -default "" -readonly 1 -configuremethod SetOptColumnTypes + # Array mapping display strings to column type tokens + variable _column_type_display_to_token + + # Stores display strings of column types. Array indexed by col number + variable _column_type_display_strings + + # Stores information whether a column is included or not and column heading, + # Only used if caller specified the -columntypes option + # Arrays indexed by column number + variable _included_columns + variable _column_headings + + # Store state information about the channel we are reading from + # path - path to file - ONLY PRESENT IF PASSED IN PATH INSTEAD OF CHANNEL + # name - channel name + # original_position - original seek position + # original_encoding - encoding to be restored + variable _channel + + variable _max_data_lines 6; # How many sample lines to read + variable _num_data_lines; # Number actually read + variable _data_grid_first_data_row; # First row that contains actual values + variable _data_grid_first_data_col; # First col that contains actual values + + constructor {args} { + if {[llength $args] == 0} { + error "wrong # args: should be \"dialectpicker ?options? channel\"" + } + set chan [lindex $args end] + set args [lrange $args 0 end-1] + + $hull configure -borderwidth 0 + + array set _included_columns {} + + # Init channel and remember original settings for restoring in + # destructor + $self ChanInit $chan + + # The three main frames + set _optf [ttk::frame $win.f-opt -padding 4] + set _charf [ttk::frame $win.f-char] + set _dataf [tclcsv::sframe new $win.f-data -anchor w] + + # File character encoding + ttk::frame $_optf.f-encoding + ttk::label $_optf.f-encoding.l -text [mc encoding_l] + ttk::combobox $_optf.f-encoding.cb -textvariable [myvar options(-encoding)] -values [lsort [encoding names]] -state readonly + bind $_optf.f-encoding.cb <> [mymethod Redisplay] + pack $_optf.f-encoding.l $_optf.f-encoding.cb -side left -fill both -expand n + # Data processing objects + foreach {opt text} { + -headerpresent header_line_l + -doublequote quote_doubled_l + -skipblanklines skip_empty_l + -skipleadingspace ignore_leading_space_l + } { + ttk::checkbutton $_optf.cb$opt -variable [myvar options($opt)] -text [mc $text] -command [mymethod Redisplay] + } + + # Delimiter selection + set delimiterf [$self MakeCharPickerFrame -delimiter delimiter_char_l \ + [list tab_l \t space_l { } comma_l , semicolon_l ";"] \ + \t] + + # Comment char + set commentf [$self MakeCharPickerFrame -comment comment_char_l \ + [list none_l "" hash_l "#"]] + + # Quote char + set quotef [$self MakeCharPickerFrame -quote quote_char_l \ + [list none_l "" dquote_l "\"" squote_l "'"] \"] + + # Escape char + set escapef [$self MakeCharPickerFrame -escape escape_char_l \ + [list none_l "" backslash_l "\\"]] + + # Start laying out the widgets + + # Options + grid $_optf.f-encoding - -sticky ew + grid $_optf.cb-headerpresent $_optf.cb-skipblanklines -sticky ew + grid $_optf.cb-doublequote $_optf.cb-skipleadingspace -sticky ew + grid columnconfigure $_optf all -weight 1 -uniform width + + pack $_optf -fill none -expand n -pady 4 -anchor w + + # Special characters + grid $delimiterf $commentf $quotef $escapef -padx 2 -pady 2 -sticky news + grid columnconfigure $_charf all -uniform width -weight 1 + pack $_charf -fill none -expand n -pady 4 -anchor w + + # Sample data frame + pack [ttk::separator $win.sep] -fill x -expand n -pady 4 + pack $_dataf -fill both -expand y -anchor nw + + $self configurelist $args + + $self Redisplay + } + + destructor { + # Restore channel to its initial state if it is still open + if {[info exists _channel(name)] && + $_channel(name) in [chan names]} { + if {[info exists _channel(path)]} { + # We opened the channel ourselves so close it. + close $_channel(name) + } else { + chan configure $_channel(name) -encoding $_channel(original_encoding) + chan seek $_channel(name) $_channel(original_position) + } + } + } + + # -columntypes option handler + method SetOptColumnTypes {opt val} { + # Make sure the types returned by sniff_header are included + if {![dict exists $val string]} { + dict set val string {display String align left} + } + if {![dict exists $val real]} { + dict set val real {display {Real number} align right} + } + if {![dict exists $val integer]} { + dict set val integer {display Integer align right} + } + set options(-columntypes) $val + + dict for {tok meta} $options(-columntypes) { + # Fill in any display strings that are not set + if {![dict exists $meta display] || + [dict get $meta display] eq ""} { + dict set options(-columntypes) $tok display $tok + } + # Likewise, fill in alignment + if {![dict exists $meta align] || + [dict get $meta align] ni {left right center centre}} { + dict set options(-columntypes) $tok align left + } + + # Build map of display strings to tokens + set _column_type_display_to_token([dict get $options(-columntypes) $tok display]) $tok + } + } + + # -encoding handler + method SetOptEncoding {opt val} { + if {$val ni [encoding names]} { + error "Unknown encoding \"$val\"." + } + set options($opt) $val + $_optf.cb-encoding set $options(-encoding) + } + + # -delimiter handler. Unlike other special characters this cannot be "" + method SetOptDelimiter {opt val} { + if {[string length $val] != 1} { + error "Invalid value for option $opt. Must be a single character." + } + if {$val in [list \t { } "," ";"]} { + set options($opt) $val + } else { + set _other($opt) $val + set options($opt) "other" + } + } + + # Handler for special character related option. + method SetOptCharPicker {opt val} { + if {[string length $val] > 1} { + error "Invalid value for option $opt. Must be a single character or the empty string." + } + set predefs [dict create \ + -comment [list # ""] \ + -quote [list \" ' ""] \ + -escape [list \\ ""]] + if {$val in [dict get $predefs $opt]} { + set options($opt) $val + } else { + set _other($opt) $val + set options($opt) "other" + } + } + + # Creates a "Other" entry widget $e that enforces max one character + # and is tied to a set of radio buttons + # $opt is the associated option. + method MakeCharPickerEntry {opt {default_rb_value {}}} { + set e $_charf.f${opt}.e-other + ttk::entry $e -textvariable [myvar _other($opt)] -width 2 -validate all -validatecommand [mymethod ValidateCharPickerEntry %d $opt %s %P $default_rb_value] + return $e + } + + # Validation callback for the "Other" entry fields. Ensures no more + # than one char and also configures radio buttons based on content + method ValidateCharPickerEntry {validation_type opt old new {default_rb_value {}}} { + if {$validation_type == -1} { + # Revalidation + } else { + # Prevalidation + # Don't allow more than one char in field + if {[string length $new] > 1} { + return 0 + } + } + if {[string length $new] == 0} { + if {$options($opt) eq "other"} { + # "Other" radio selected and empty field, reset radio button + # We used to reset to the default button but that does not work + # well when changing the content of the Other entry field + if {0} { + set options($opt) $default_rb_value + } + } + } else { + set options($opt) "other" + } + after idle after 0 [mymethod Redisplay] + return 1 + } + + # Make a labelled frame containing the radiobuttons for selecting + # characters used for special purposes. + method MakeCharPickerFrame {opt title rblist {default_rb_value {}}} { + set f [ttk::labelframe $_charf.f$opt -text [mc $title]] + set rbi -1 + foreach {label value} $rblist { + set w [ttk::radiobutton $f.rb[incr rbi] -text [mc $label] -value $value -variable [myvar options($opt)] -command [mymethod Redisplay]] + grid $w - -sticky ew + } + set w [ttk::radiobutton $f.rb-other -text Other -value "other" -variable [myvar options($opt)] -command [mymethod Redisplay]] + set e [$self MakeCharPickerEntry $opt $default_rb_value] + grid $w $e -sticky w + grid columnconfigure $f all -uniform width + return $f + } + + # Called when entire display has to be redone, for example when the + # delimiter is changed + method Redisplay {} { + if {$options(-delimiter) eq "other" && + (![info exists _other(-delimiter)] || $_other(-delimiter) eq "")} { + focus $_charf.f-delimiter.e-other + return + } + + set rows [$self ChanRead] + set nrows [llength $rows] + # Find the max number of columns + set ncols 0 + foreach row $rows { + if {[llength $row] > $ncols} { + set ncols [llength $row] + } + } + set f [tclcsv::sframe content $_dataf] + destroy {*}[winfo children $f] + array unset _included_columns * + + if {$nrows == 0 || $ncols == 0} { + grid [ttk::label $f.l-nodata -text "No data to display"] -sticky nw + return + } + + if {[dict size $options(-columntypes)]} { + set _data_grid_first_data_row 4 + set _data_grid_first_data_col 1 + grid [ttk::label $f.l-colname -text [mc heading_l]] -sticky ew -padx 1 -row 1 -column 0 + grid [ttk::label $f.l-coltype -text [mc type_l]] -sticky ew -padx 1 -row 2 -column 0 + grid [ttk::separator $f.sep-0 -orient horizontal] -sticky ew -padx 1 -row 3 -column 0 -pady 4 + } else { + set _data_grid_first_data_row 2 + set _data_grid_first_data_col 0 + } + set grid_col $_data_grid_first_data_col + set type_display_strings [$self ColumnTypeDisplayStrings] + for {set j 0} {$j < $ncols} {incr j; incr grid_col} { + # Widget for whether to include the column when reading data + set _included_columns($j) 1 + set cb [ttk::checkbutton $f.cb-colinc-$j -text [mc include_l] -variable [myvar _included_columns($j)] -command [mymethod IncludeColumn $j]] + grid $cb -sticky ew -padx 1 -row 0 -column $grid_col + + if {[dict size $options(-columntypes)]} { + # Entry boxes for column heading + set e [ttk::entry $f.e-heading-$j -textvariable [myvar _column_headings($j)]] + grid $e -sticky ew -padx 1 -row 1 -column $grid_col + + # Widget for specifying type of the column (for alignment) + set combo [ttk::combobox $f.cb-type-$j -width 8 -textvariable [myvar _column_type_display_strings($j)] -values $type_display_strings -state readonly] + bind $combo <> [mymethod ChangeColumnType $j] + grid $combo -sticky ew -padx 1 -row 2 -column $grid_col + + } + # Separate the meta fields from data + grid [ttk::separator $f.sep-$grid_col -orient horizontal] -sticky ew -padx 1 -row [expr {$_data_grid_first_data_row-1}] -column $grid_col -pady 4 + } + + # grid_row tracks the row in the display widget + # i tracks the data row index + set grid_row $_data_grid_first_data_row + set grid_col $_data_grid_first_data_col + set i 0 + if {$options(-headerpresent)} { + # If we are displaying the column metadata, the header + # (or its substitute) is displayed there so won't display it here. + # Instead fill in the column meta header entries if they are + # not defined or are empty. + if {[dict size $options(-columntypes)]} { + for {set j 0} {$j < $ncols} {incr j; incr grid_col} { + if {![info exists _column_headings($j)] || + $_column_headings($j) eq ""} { + set _column_headings($j) [lindex $rows $i $j] + } + } + } else { + for {set j 0} {$j < $ncols} {incr j; incr grid_col} { + set l [ttk::label $f.l-$grid_row-$j -font [list {*}[font configure TkDefaultFont] -weight bold]] + tclcsv::format_label $l [lindex $rows $i $j] + grid $l -row $grid_row -column $grid_col -sticky ew -padx 1 + } + incr grid_row + } + incr i; # Skip first line of data + } + for {} {$i < $nrows} {incr i; incr grid_row} { + set grid_col $_data_grid_first_data_col + for {set j 0} {$j < $ncols} {incr j; incr grid_col} { + if {[$self ColumnAlignment $j] eq "right"} { + set anchor e + } else { + set anchor w + } + set l [ttk::label $f.l-$grid_row-$j -background white -anchor $anchor] + tclcsv::format_label $l [lindex $rows $i $j] + grid $l -row $grid_row -column $grid_col -sticky ew -padx 1 + } + } + after 0 after idle [list tclcsv::sframe resize $_dataf] + return + } + + method DataGridRowIndexStart {} { + return $_data_grid_first_data_row + } + + method DataGridRowIndexLimit {} { + # The last data grid row depends on whether a header is marked + # present and if it is displayed as part of column metadata + # in the "Heading" line + set first [$self DataGridRowIndexStart] + set limit [expr {$first + $_num_data_lines}] + if {[dict size $options(-columntypes)] && $options(-headerpresent)} { + incr limit -1 + } + return $limit + } + + # Handler when user clicks on the include column checkboxes + method IncludeColumn {ci} { + set f [tclcsv::sframe content $_dataf] + set ri [$self DataGridRowIndexStart] + set limit [$self DataGridRowIndexLimit] + if {$_included_columns($ci)} { + while {$ri < $limit} { + $f.l-$ri-$ci configure -state enabled + incr ri + } + } else { + while {$ri < $limit} { + $f.l-$ri-$ci configure -state disabled + incr ri + } + } + return + } + + # Handler for changing a column's type. Changes the sample alignment + method ChangeColumnType {ci} { + set f [tclcsv::sframe content $_dataf] + set ri [$self DataGridRowIndexStart] + set limit [$self DataGridRowIndexLimit] + if {[$self ColumnAlignment $ci] eq "right"} { + set anchor e + } else { + set anchor w + } + while {$ri < $limit} { + $f.l-$ri-$ci configure -anchor $anchor + incr ri + } + return + } + + # Constructs the list of display strings corresponding to column + # type tokens. + method ColumnTypeDisplayStrings {} { + set l {} + # Note we do not just get the keys from _column_type_display_to_token + # because that would be in random order + dict for {key meta} $options(-columntypes) { + lappend l [dict get $meta display] + } + return $l + } + + # Returns the alignment for a column (left or right) + method ColumnAlignment {ci} { + if {[info exists _column_type_display_strings($ci)]} { + set display $_column_type_display_strings($ci) + set coltype $_column_type_display_to_token($display) + return [dict get $options(-columntypes) $coltype align] + } + return "left" + } + + # Save the channel settings and initialize it. Sniffs likely + # CSV format + method ChanInit {chan} { + # See if we were passed in a channel or a path + if {$chan ni [chan names]} { + # Not a channel. Presume it is a file. + set _channel(path) $chan + set chan [open $chan r] + } + + set _channel(original_encoding) [chan configure $chan -encoding] + set _channel(original_position) [chan tell $chan] + if {$_channel(original_position) == -1} { + error "Channel does not support seeking." + } + set _channel(name) $chan + + # Guess the format of the CSV + array set options [tclcsv::sniff $chan] + if {[llength [tclcsv::sniff_header $chan]] > 1} { + set options(-headerpresent) 1 + } else { + set options(-headerpresent) 0 + } + # Note above setting will be overwritten by options passed by app + + return + } + + # Parse CSV from the channel based on the current option settings. + # Sets up the header and type by sniffing the channel + method ChanRead {} { + set opts [$self CollectCsvOptions] + if {[dict get $opts -delimiter] eq ""} { + error "Delimiter must be specified." + } + + lappend opts -nrows $_max_data_lines + + # Rewind the file to where we started from + chan seek $_channel(name) $_channel(original_position) + chan configure $_channel(name) -encoding $options(-encoding) + + # Figure out the header if necessary but only overwrite existing + # headers if number of columns has changed + if {[dict size $options(-columntypes)]} { + set headers [tclcsv::sniff_header {*}$opts $_channel(name)] + set types [lindex $headers 0] + if {![info exists _column_type_display_strings] || + [array size _column_type_display_strings] != [llength $types]} { + array unset _column_type_display_strings * + for {set i 0} {$i < [llength $types]} {incr i} { + set coltype [lindex $types $i] + set _column_type_display_strings($i) [dict get $options(-columntypes) $coltype display] + } + } + if {[llength $headers] > 1} { + set headings [lindex $headers 1] + if {![info exists _column_headings] || + [array size _column_headings] != [llength $headings]} { + array unset _column_headings * + for {set i 0} {$i < [llength $headings]} {incr i} { + set _column_headings($i) [lindex $headings $i] + } + } + } + } + set rows [tclcsv::csv_read {*}$opts $_channel(name)] + chan seek $_channel(name) $_channel(original_position) + set _num_data_lines [llength $rows] + return $rows + } + + method CollectCsvOptions {} { + foreach opt {-delimiter -comment -escape -quote -skipleadingspace -skipblanklines -doublequote} { + if {$options($opt) ne "other"} { + lappend opts $opt $options($opt) + } elseif {[info exists _other($opt)]} { + lappend opts $opt $_other($opt) + } else { + lappend opts $opt "" + } + } + return $opts + } + + # Returns the channel + method channel {} { + return $_channel(name) + } + + # Returns the current setting of -encoding + method encoding {} { + # Not part of dialectsettings because that can be passed directly + # to csv_read + return $options(-encoding) + } + + # Returns the settings related to the CSV dialect and fields to be + # included. Can be passed + # to cvs_read + method dialect {} { + set opts [$self CollectCsvOptions] + if {[dict get $opts -delimiter] eq ""} { + dict unset opts -delimiter + } + if {$options(-headerpresent)} { + lappend opts -startline 1 + } + set ncols [array size _included_columns] + set included {} + for {set i 0} {$i < $ncols} {incr i} { + if {[info exists _included_columns($i)] && $_included_columns($i)} { + lappend included $i + } + } + if {[llength $included] == 0} { + # Exclude all + lappend opts -excludefields [lsort -integer [array names _included_columns]] + } elseif {[llength $included] != $ncols} { + # Only subset of columns included + lappend opts -includefields $included + } + return $opts + } + + # Returns the current settings related to column types and names + method columnsettings {} { + if {[dict size $options(-columntypes)] == 0} { + error "Option -columntypes was not specified." + } + set ncols [array size _included_columns] + set header {} + for {set i 0} {$i < $ncols} {incr i} { + # Note some rows may have extra fields so always check if + # corresponding array entry actually exists + + if {![info exists _included_columns($i)] || + !$_included_columns($i)} { + continue; # Skip this columns + } + if {[info exists _column_headings($i)] && $_column_headings($i) ne ""} { + set heading $_column_headings($i) + } else { + set heading "Column_$i" + } + if {[info exists _column_type_display_strings($i)]} { + set display $_column_type_display_strings($i) + set type $_column_type_display_to_token($display) + } else { + set type "string" + } + lappend header [list heading $heading type $type] + } + return $header + } +} + diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/win32-x86_64/tcl9tclcsv243.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/win32-x86_64/tcl9tclcsv243.dll new file mode 100644 index 00000000..6187dbe5 Binary files /dev/null and b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclcsv2.4.3/win32-x86_64/tcl9tclcsv243.dll differ diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/0compatibility/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/0compatibility/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/0compatibility/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/0compatibility/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/aes/aes.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/aes/aes.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/aes/aes.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/aes/aes.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/aes/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/aes/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/aes/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/aes/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/amazon-s3/S3.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/amazon-s3/S3.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/amazon-s3/S3.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/amazon-s3/S3.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/amazon-s3/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/amazon-s3/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/amazon-s3/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/amazon-s3/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/amazon-s3/xsxp.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/amazon-s3/xsxp.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/amazon-s3/xsxp.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/amazon-s3/xsxp.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/asn/asn.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/asn/asn.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/asn/asn.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/asn/asn.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/asn/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/asn/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/asn/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/asn/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32_c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32_c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32_c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32_c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32_tcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32_tcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32_tcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32_tcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32core.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32core.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32core.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32core.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32hex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32hex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32hex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32hex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32hex_c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32hex_c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32hex_c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32hex_c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32hex_tcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32hex_tcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/base32hex_tcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/base32hex_tcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base32/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base32/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base64/ascii85.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base64/ascii85.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base64/ascii85.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base64/ascii85.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base64/base64.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base64/base64.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base64/base64.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base64/base64.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base64/base64c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base64/base64c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base64/base64c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base64/base64c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base64/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base64/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base64/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base64/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base64/uuencode.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base64/uuencode.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base64/uuencode.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base64/uuencode.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base64/yencode.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base64/yencode.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/base64/yencode.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/base64/yencode.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bee/bee.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bee/bee.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bee/bee.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bee/bee.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bee/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bee/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bee/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bee/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bench/bench.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bench/bench.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bench/bench.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bench/bench.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bench/bench_read.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bench/bench_read.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bench/bench_read.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bench/bench_read.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bench/bench_wcsv.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bench/bench_wcsv.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bench/bench_wcsv.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bench/bench_wcsv.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bench/bench_wtext.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bench/bench_wtext.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bench/bench_wtext.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bench/bench_wtext.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bench/libbench.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bench/libbench.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bench/libbench.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bench/libbench.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bench/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bench/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bench/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bench/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bibtex/bibtex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bibtex/bibtex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bibtex/bibtex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bibtex/bibtex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bibtex/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bibtex/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/bibtex/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/bibtex/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/blowfish/blowfish.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/blowfish/blowfish.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/blowfish/blowfish.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/blowfish/blowfish.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/blowfish/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/blowfish/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/blowfish/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/blowfish/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/cache/async.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/cache/async.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/cache/async.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/cache/async.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/cache/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/cache/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/cache/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/cache/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/clay/clay.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/clay/clay.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/clay/clay.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/clay/clay.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/clay/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/clay/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/clay/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/clay/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/clock/iso8601.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/clock/iso8601.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/clock/iso8601.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/clock/iso8601.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/clock/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/clock/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/clock/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/clock/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/clock/rfc2822.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/clock/rfc2822.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/clock/rfc2822.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/clock/rfc2822.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/cmdline/cmdline.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/cmdline/cmdline.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/cmdline/cmdline.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/cmdline/cmdline.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/cmdline/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/cmdline/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/cmdline/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/cmdline/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/comm/comm.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/comm/comm.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/comm/comm.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/comm/comm.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/comm/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/comm/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/comm/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/comm/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/ascaller.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/ascaller.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/ascaller.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/ascaller.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/assert.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/assert.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/assert.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/assert.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/control.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/control.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/control.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/control.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/do.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/do.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/do.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/do.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/no-op.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/no-op.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/no-op.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/no-op.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/tclIndex b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/tclIndex similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/control/tclIndex rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/control/tclIndex diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/coroutine/coro_auto.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/coroutine/coro_auto.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/coroutine/coro_auto.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/coroutine/coro_auto.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/coroutine/coroutine.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/coroutine/coroutine.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/coroutine/coroutine.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/coroutine/coroutine.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/coroutine/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/coroutine/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/coroutine/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/coroutine/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/counter/counter.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/counter/counter.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/counter/counter.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/counter/counter.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/counter/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/counter/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/counter/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/counter/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/cksum.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/cksum.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/cksum.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/cksum.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/crc16.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/crc16.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/crc16.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/crc16.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/crc32.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/crc32.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/crc32.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/crc32.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/crc32c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/crc32c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/crc32c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/crc32c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/sum.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/sum.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/sum.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/sum.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/sumc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/sumc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/crc/sumc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/crc/sumc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/cron/cron.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/cron/cron.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/cron/cron.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/cron/cron.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/cron/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/cron/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/cron/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/cron/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/csv/csv.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/csv/csv.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/csv/csv.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/csv/csv.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/csv/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/csv/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/csv/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/csv/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/debug/caller.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/debug/caller.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/debug/caller.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/debug/caller.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/debug/debug.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/debug/debug.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/debug/debug.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/debug/debug.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/debug/heartbeat.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/debug/heartbeat.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/debug/heartbeat.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/debug/heartbeat.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/debug/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/debug/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/debug/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/debug/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/debug/timestamp.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/debug/timestamp.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/debug/timestamp.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/debug/timestamp.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/defer/defer.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/defer/defer.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/defer/defer.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/defer/defer.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/defer/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/defer/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/defer/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/defer/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/des/des.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/des/des.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/des/des.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/des/des.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/des/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/des/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/des/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/des/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/des/tcldes.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/des/tcldes.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/des/tcldes.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/des/tcldes.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/des/tcldesjr.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/des/tcldesjr.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/des/tcldesjr.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/des/tcldesjr.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dicttool/dicttool.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dicttool/dicttool.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dicttool/dicttool.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dicttool/dicttool.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dicttool/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dicttool/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dicttool/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dicttool/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/dns.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/dns.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/dns.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/dns.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/ip.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/ip.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/ip.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/ip.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/ipMore.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/ipMore.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/ipMore.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/ipMore.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/ipMoreC.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/ipMoreC.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/ipMoreC.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/ipMoreC.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/msgs/en.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/msgs/en.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/msgs/en.msg rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/msgs/en.msg diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/resolv.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/resolv.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/resolv.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/resolv.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/spf.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/spf.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dns/spf.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dns/spf.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/docstrip/docstrip.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/docstrip/docstrip.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/docstrip/docstrip.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/docstrip/docstrip.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/docstrip/docstrip_util.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/docstrip/docstrip_util.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/docstrip/docstrip_util.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/docstrip/docstrip_util.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/docstrip/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/docstrip/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/docstrip/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/docstrip/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/api.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/api.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/api.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/api.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/api_idx.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/api_idx.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/api_idx.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/api_idx.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/api_toc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/api_toc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/api_toc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/api_toc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/changelog.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/changelog.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/changelog.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/changelog.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/checker.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/checker.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/checker.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/checker.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/checker_idx.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/checker_idx.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/checker_idx.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/checker_idx.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/checker_toc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/checker_toc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/checker_toc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/checker_toc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/cvs.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/cvs.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/cvs.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/cvs.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/docidx.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/docidx.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/docidx.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/docidx.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/doctoc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/doctoc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/doctoc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/doctoc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/doctools.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/doctools.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/doctools.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/doctools.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_common.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_common.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_common.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_common.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_html.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_html.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_html.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_html.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_idx_common.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_idx_common.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_idx_common.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_idx_common.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_markdown.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_markdown.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_markdown.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_markdown.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_nroff.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_nroff.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_nroff.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_nroff.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_bullets.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_bullets.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_bullets.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_bullets.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_ccore.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_ccore.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_ccore.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_ccore.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_cstack.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_cstack.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_cstack.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_cstack.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_dlist.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_dlist.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_dlist.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_dlist.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_margin.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_margin.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_margin.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_margin.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_para.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_para.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_para.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_para.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_state.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_state.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_state.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_state.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_utils.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_utils.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_utils.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_text_utils.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_toc_common.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_toc_common.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_toc_common.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_toc_common.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_xml.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_xml.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_xml.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_xml.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_xref.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_xref.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_xref.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/_xref.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/c.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/c.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/c.msg rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/c.msg diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/de.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/de.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/de.msg rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/de.msg diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/en.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/en.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/en.msg rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/en.msg diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.desc b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.desc similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.desc rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.desc diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.latex b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.latex similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.latex rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.latex diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.list b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.list similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.list rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.list diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.markdown b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.markdown similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.markdown rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.markdown diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.nroff b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.nroff similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.nroff rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.nroff diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.null b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.null similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.null rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.null diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.text b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.text similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.text rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.text diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.tmml b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.tmml similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.tmml rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.tmml diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.wiki b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.wiki similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.wiki rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fmt.wiki diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fr.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fr.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fr.msg rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/fr.msg diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.markdown b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.markdown similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.markdown rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.markdown diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.nroff b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.nroff similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.nroff rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.nroff diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.null b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.null similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.null rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.null diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.text b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.text similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.text rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.text diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.wiki b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.wiki similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.wiki rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/idx.wiki diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/man.macros b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/man.macros similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/man.macros rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/man.macros diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.markdown b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.markdown similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.markdown rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.markdown diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.nroff b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.nroff similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.nroff rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.nroff diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.null b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.null similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.null rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.null diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.text b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.text similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.text rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.text diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.tmml b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.tmml similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.tmml rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.tmml diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.wiki b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.wiki similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.wiki rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/mpformats/toc.wiki diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/html.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/html.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/html.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/html.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/html_cssdefaults.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/html_cssdefaults.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/html_cssdefaults.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/html_cssdefaults.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/msgcat.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/msgcat.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/msgcat.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/msgcat.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/nroff_manmacros.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/nroff_manmacros.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/nroff_manmacros.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/nroff_manmacros.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/tcl_parse.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/tcl_parse.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/tcl_parse.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/tcl_parse.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/text.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/text.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2base/text.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2base/text.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/container.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/container.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/container.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/container.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_docidx.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_docidx.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_docidx.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_docidx.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_html.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_html.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_html.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_html.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_json.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_json.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_json.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_json.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_nroff.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_nroff.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_nroff.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_nroff.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_text.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_text.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_text.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_text.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_wiki.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_wiki.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_wiki.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/export_wiki.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/import.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/import.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/import.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/import.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/import_docidx.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/import_docidx.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/import_docidx.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/import_docidx.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/import_json.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/import_json.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/import_json.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/import_json.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_de.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_de.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_de.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_de.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_en.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_en.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_en.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_en.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_fr.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_fr.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_fr.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/msgcat_fr.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/parse.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/parse.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/parse.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/parse.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/structure.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/structure.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2idx/structure.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2idx/structure.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/container.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/container.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/container.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/container.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_doctoc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_doctoc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_doctoc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_doctoc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_html.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_html.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_html.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_html.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_json.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_json.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_json.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_json.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_nroff.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_nroff.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_nroff.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_nroff.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_text.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_text.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_text.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_text.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_wiki.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_wiki.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_wiki.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/export_wiki.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/import.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/import.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/import.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/import.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/import_doctoc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/import_doctoc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/import_doctoc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/import_doctoc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/import_json.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/import_json.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/import_json.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/import_json.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_de.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_de.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_de.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_de.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_en.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_en.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_en.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_en.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_fr.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_fr.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_fr.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/msgcat_fr.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/parse.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/parse.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/parse.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/parse.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/structure.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/structure.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/doctools2toc/structure.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/doctools2toc/structure.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dtplite/dtplite.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dtplite/dtplite.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dtplite/dtplite.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dtplite/dtplite.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dtplite/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dtplite/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/dtplite/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/dtplite/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/decode.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/decode.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/decode.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/decode.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/fileutil.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/fileutil.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/fileutil.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/fileutil.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/multi.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/multi.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/multi.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/multi.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/multiop.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/multiop.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/multiop.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/multiop.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/paths.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/paths.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/paths.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/paths.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/traverse.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/traverse.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fileutil/traverse.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fileutil/traverse.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ftp/ftp.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ftp/ftp.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ftp/ftp.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ftp/ftp.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ftp/ftp_geturl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ftp/ftp_geturl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ftp/ftp_geturl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ftp/ftp_geturl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ftp/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ftp/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ftp/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ftp/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ftpd/ftpd.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ftpd/ftpd.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ftpd/ftpd.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ftpd/ftpd.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ftpd/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ftpd/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ftpd/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ftpd/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fumagic/cfront.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fumagic/cfront.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fumagic/cfront.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fumagic/cfront.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fumagic/cgen.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fumagic/cgen.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fumagic/cgen.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fumagic/cgen.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fumagic/filetypes.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fumagic/filetypes.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fumagic/filetypes.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fumagic/filetypes.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fumagic/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fumagic/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fumagic/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fumagic/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fumagic/rtcore.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fumagic/rtcore.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/fumagic/rtcore.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/fumagic/rtcore.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/generator/generator.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/generator/generator.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/generator/generator.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/generator/generator.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/generator/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/generator/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/generator/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/generator/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/gpx/gpx.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/gpx/gpx.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/gpx/gpx.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/gpx/gpx.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/gpx/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/gpx/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/gpx/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/gpx/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_aycock/aycock-build.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_aycock/aycock-build.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_aycock/aycock-build.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_aycock/aycock-build.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_aycock/aycock-debug.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_aycock/aycock-debug.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_aycock/aycock-debug.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_aycock/aycock-debug.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_aycock/aycock-runtime.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_aycock/aycock-runtime.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_aycock/aycock-runtime.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_aycock/aycock-runtime.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_aycock/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_aycock/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_aycock/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_aycock/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_fa/dacceptor.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_fa/dacceptor.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_fa/dacceptor.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_fa/dacceptor.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_fa/dexec.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_fa/dexec.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_fa/dexec.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_fa/dexec.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_fa/fa.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_fa/fa.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_fa/fa.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_fa/fa.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_fa/faop.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_fa/faop.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_fa/faop.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_fa/faop.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_fa/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_fa/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_fa/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_fa/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_me/gasm.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_me/gasm.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_me/gasm.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_me/gasm.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_me/me_cpu.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_me/me_cpu.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_me/me_cpu.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_me/me_cpu.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_me/me_cpucore.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_me/me_cpucore.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_me/me_cpucore.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_me/me_cpucore.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_me/me_tcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_me/me_tcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_me/me_tcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_me/me_tcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_me/me_util.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_me/me_util.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_me/me_util.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_me/me_util.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_me/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_me/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_me/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_me/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_peg/peg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_peg/peg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_peg/peg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_peg/peg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_peg/peg_interp.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_peg/peg_interp.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_peg/peg_interp.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_peg/peg_interp.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_peg/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_peg/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/grammar_peg/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/grammar_peg/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/hook/hook.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/hook/hook.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/hook/hook.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/hook/hook.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/hook/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/hook/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/hook/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/hook/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/html/html.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/html/html.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/html/html.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/html/html.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/html/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/html/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/html/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/html/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/htmlparse/htmlparse.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/htmlparse/htmlparse.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/htmlparse/htmlparse.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/htmlparse/htmlparse.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/htmlparse/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/htmlparse/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/htmlparse/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/htmlparse/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/http/autoproxy.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/http/autoproxy.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/http/autoproxy.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/http/autoproxy.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/http/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/http/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/http/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/http/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/httpd/httpd.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/httpd/httpd.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/httpd/httpd.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/httpd/httpd.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/httpd/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/httpd/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/httpd/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/httpd/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/httpwget/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/httpwget/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/httpwget/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/httpwget/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/httpwget/wget.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/httpwget/wget.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/httpwget/wget.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/httpwget/wget.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ident/ident.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ident/ident.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ident/ident.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ident/ident.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ident/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ident/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ident/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ident/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/imap4/imap4.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/imap4/imap4.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/imap4/imap4.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/imap4/imap4.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/imap4/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/imap4/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/imap4/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/imap4/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/inifile/ini.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/inifile/ini.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/inifile/ini.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/inifile/ini.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/inifile/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/inifile/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/inifile/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/inifile/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/interp/deleg_method.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/interp/deleg_method.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/interp/deleg_method.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/interp/deleg_method.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/interp/deleg_proc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/interp/deleg_proc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/interp/deleg_proc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/interp/deleg_proc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/interp/interp.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/interp/interp.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/interp/interp.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/interp/interp.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/interp/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/interp/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/interp/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/interp/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/irc/irc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/irc/irc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/irc/irc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/irc/irc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/irc/picoirc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/irc/picoirc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/irc/picoirc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/irc/picoirc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/irc/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/irc/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/irc/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/irc/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/javascript/javascript.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/javascript/javascript.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/javascript/javascript.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/javascript/javascript.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/javascript/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/javascript/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/javascript/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/javascript/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/jpeg/jpeg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/jpeg/jpeg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/jpeg/jpeg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/jpeg/jpeg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/jpeg/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/jpeg/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/jpeg/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/jpeg/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/json/json.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/json/json.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/json/json.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/json/json.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/json/json_tcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/json/json_tcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/json/json_tcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/json/json_tcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/json/json_write.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/json/json_write.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/json/json_write.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/json/json_write.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/json/jsonc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/json/jsonc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/json/jsonc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/json/jsonc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/json/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/json/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/json/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/json/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/lambda/lambda.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/lambda/lambda.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/lambda/lambda.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/lambda/lambda.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/lambda/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/lambda/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/lambda/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/lambda/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/lazyset/lazyset.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/lazyset/lazyset.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/lazyset/lazyset.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/lazyset/lazyset.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/lazyset/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/lazyset/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/lazyset/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/lazyset/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ldap/ldap.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ldap/ldap.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ldap/ldap.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ldap/ldap.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ldap/ldapx.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ldap/ldapx.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ldap/ldapx.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ldap/ldapx.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ldap/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ldap/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ldap/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ldap/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/log/log.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/log/log.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/log/log.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/log/log.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/log/logger.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/log/logger.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/log/logger.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/log/logger.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/log/loggerAppender.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/log/loggerAppender.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/log/loggerAppender.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/log/loggerAppender.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/log/loggerUtils.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/log/loggerUtils.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/log/loggerUtils.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/log/loggerUtils.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/log/msgs/en.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/log/msgs/en.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/log/msgs/en.msg rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/log/msgs/en.msg diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/log/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/log/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/log/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/log/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/map_geocode_nominatim.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/map_geocode_nominatim.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/map_geocode_nominatim.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/map_geocode_nominatim.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/map_slippy.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/map_slippy.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/map_slippy.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/map_slippy.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/map_slippy_c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/map_slippy_c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/map_slippy_c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/map_slippy_c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/map_slippy_cache.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/map_slippy_cache.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/map_slippy_cache.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/map_slippy_cache.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/map_slippy_fetcher.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/map_slippy_fetcher.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/map_slippy_fetcher.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/map_slippy_fetcher.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/map_slippy_tcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/map_slippy_tcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/map_slippy_tcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/map_slippy_tcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/map/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/map/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mapproj/mapproj.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mapproj/mapproj.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mapproj/mapproj.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mapproj/mapproj.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mapproj/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mapproj/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mapproj/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mapproj/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/markdown/markdown.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/markdown/markdown.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/markdown/markdown.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/markdown/markdown.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/markdown/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/markdown/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/markdown/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/markdown/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/bessel.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/bessel.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/bessel.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/bessel.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/bigfloat2.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/bigfloat2.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/bigfloat2.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/bigfloat2.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/bignum.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/bignum.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/bignum.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/bignum.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/calculus.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/calculus.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/calculus.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/calculus.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/changepoint.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/changepoint.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/changepoint.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/changepoint.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/classic_polyns.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/classic_polyns.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/classic_polyns.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/classic_polyns.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/combinatorics.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/combinatorics.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/combinatorics.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/combinatorics.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/combinatoricsExt.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/combinatoricsExt.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/combinatoricsExt.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/combinatoricsExt.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/constants.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/constants.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/constants.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/constants.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/decimal.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/decimal.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/decimal.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/decimal.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/elliptic.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/elliptic.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/elliptic.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/elliptic.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/exact.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/exact.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/exact.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/exact.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/exponential.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/exponential.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/exponential.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/exponential.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/figurate.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/figurate.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/figurate.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/figurate.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/filtergen.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/filtergen.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/filtergen.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/filtergen.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/fourier.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/fourier.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/fourier.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/fourier.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/fuzzy.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/fuzzy.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/fuzzy.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/fuzzy.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/geometry.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/geometry.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/geometry.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/geometry.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/geometry_circle.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/geometry_circle.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/geometry_circle.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/geometry_circle.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/geometry_ext.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/geometry_ext.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/geometry_ext.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/geometry_ext.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/interpolate.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/interpolate.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/interpolate.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/interpolate.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/kruskal.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/kruskal.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/kruskal.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/kruskal.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/linalg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/linalg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/linalg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/linalg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/liststat.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/liststat.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/liststat.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/liststat.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/machineparameters.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/machineparameters.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/machineparameters.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/machineparameters.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/math.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/math.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/math.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/math.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/misc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/misc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/misc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/misc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/mvlinreg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/mvlinreg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/mvlinreg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/mvlinreg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/numtheory.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/numtheory.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/numtheory.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/numtheory.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/optimize.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/optimize.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/optimize.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/optimize.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/pca.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/pca.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/pca.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/pca.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/pdf_stat.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/pdf_stat.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/pdf_stat.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/pdf_stat.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/plotstat.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/plotstat.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/plotstat.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/plotstat.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/polynomials.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/polynomials.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/polynomials.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/polynomials.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/primes.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/primes.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/primes.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/primes.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/probopt.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/probopt.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/probopt.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/probopt.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/probopt_diffev.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/probopt_diffev.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/probopt_diffev.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/probopt_diffev.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/probopt_lipo.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/probopt_lipo.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/probopt_lipo.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/probopt_lipo.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/probopt_pso.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/probopt_pso.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/probopt_pso.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/probopt_pso.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/probopt_sce.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/probopt_sce.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/probopt_sce.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/probopt_sce.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/qcomplex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/qcomplex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/qcomplex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/qcomplex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/quasirandom.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/quasirandom.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/quasirandom.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/quasirandom.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/rational_funcs.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/rational_funcs.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/rational_funcs.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/rational_funcs.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/romannumerals.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/romannumerals.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/romannumerals.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/romannumerals.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/rootfind.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/rootfind.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/rootfind.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/rootfind.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/special.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/special.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/special.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/special.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/stat_kernel.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/stat_kernel.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/stat_kernel.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/stat_kernel.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/stat_logit.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/stat_logit.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/stat_logit.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/stat_logit.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/stat_wasserstein.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/stat_wasserstein.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/stat_wasserstein.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/stat_wasserstein.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/statistics.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/statistics.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/statistics.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/statistics.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/symdiff.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/symdiff.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/symdiff.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/symdiff.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/tclIndex b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/tclIndex similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/tclIndex rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/tclIndex diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/trig.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/trig.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/trig.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/trig.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/wilcoxon.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/wilcoxon.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/math/wilcoxon.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/math/wilcoxon.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md4/md4.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md4/md4.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md4/md4.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md4/md4.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md4/md4c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md4/md4c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md4/md4c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md4/md4c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md4/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md4/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md4/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md4/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5/md5.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5/md5.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5/md5.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5/md5.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5/md5c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5/md5c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5/md5c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5/md5c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5/md5x.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5/md5x.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5/md5x.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5/md5x.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5c/critcl-rt.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5c/critcl-rt.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5c/critcl-rt.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5c/critcl-rt.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5c/license.terms b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5c/license.terms similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5c/license.terms rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5c/license.terms diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5c/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5c/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5c/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5c/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5c/teapot.txt b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5c/teapot.txt similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5c/teapot.txt rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5c/teapot.txt diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5c/win32-x86_64/md5c.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5c/win32-x86_64/md5c.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5c/win32-x86_64/md5c.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5c/win32-x86_64/md5c.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5crypt/md5crypt.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5crypt/md5crypt.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5crypt/md5crypt.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5crypt/md5crypt.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5crypt/md5cryptc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5crypt/md5cryptc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5crypt/md5cryptc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5crypt/md5cryptc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5crypt/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5crypt/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/md5crypt/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/md5crypt/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mime/mime.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mime/mime.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mime/mime.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mime/mime.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mime/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mime/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mime/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mime/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mime/smtp.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mime/smtp.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mime/smtp.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mime/smtp.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mkdoc/mkdoc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mkdoc/mkdoc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mkdoc/mkdoc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mkdoc/mkdoc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mkdoc/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mkdoc/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/mkdoc/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/mkdoc/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/multiplexer/multiplexer.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/multiplexer/multiplexer.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/multiplexer/multiplexer.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/multiplexer/multiplexer.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/multiplexer/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/multiplexer/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/multiplexer/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/multiplexer/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/namespacex/namespacex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/namespacex/namespacex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/namespacex/namespacex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/namespacex/namespacex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/namespacex/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/namespacex/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/namespacex/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/namespacex/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ncgi/ncgi.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ncgi/ncgi.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ncgi/ncgi.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ncgi/ncgi.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ncgi/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ncgi/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ncgi/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ncgi/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nettool/nettool.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nettool/nettool.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nettool/nettool.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nettool/nettool.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nettool/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nettool/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nettool/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nettool/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nmea/nmea.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nmea/nmea.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nmea/nmea.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nmea/nmea.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nmea/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nmea/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nmea/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nmea/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nns/common.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nns/common.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nns/common.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nns/common.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nns/nns.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nns/nns.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nns/nns.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nns/nns.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nns/nns_auto.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nns/nns_auto.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nns/nns_auto.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nns/nns_auto.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nns/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nns/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nns/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nns/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nns/server.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nns/server.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nns/server.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nns/server.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nntp/nntp.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nntp/nntp.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nntp/nntp.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nntp/nntp.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nntp/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nntp/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/nntp/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/nntp/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ntp/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ntp/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ntp/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ntp/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ntp/time.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ntp/time.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ntp/time.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ntp/time.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oauth/oauth.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oauth/oauth.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oauth/oauth.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oauth/oauth.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oauth/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oauth/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oauth/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oauth/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oodialect/oodialect.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oodialect/oodialect.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oodialect/oodialect.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oodialect/oodialect.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oodialect/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oodialect/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oodialect/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oodialect/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oometa/oometa.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oometa/oometa.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oometa/oometa.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oometa/oometa.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oometa/oooption.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oometa/oooption.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oometa/oooption.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oometa/oooption.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oometa/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oometa/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/oometa/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/oometa/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ooutil/ooutil.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ooutil/ooutil.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ooutil/ooutil.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ooutil/ooutil.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ooutil/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ooutil/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ooutil/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ooutil/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/otp/otp.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/otp/otp.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/otp/otp.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/otp/otp.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/otp/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/otp/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/otp/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/otp/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_emodes.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_emodes.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_emodes.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_emodes.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_minimize.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_minimize.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_minimize.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_minimize.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_reachable.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_reachable.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_reachable.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_reachable.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_realizable.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_realizable.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_realizable.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/analysis_peg_realizable.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/compiler_peg_mecpu.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/compiler_peg_mecpu.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/compiler_peg_mecpu.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/compiler_peg_mecpu.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_canon.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_canon.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_canon.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_canon.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_cpkg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_cpkg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_cpkg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_cpkg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_hb.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_hb.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_hb.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_hb.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_me.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_me.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_me.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_me.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_me.template b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_me.template similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_me.template rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_me.template diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_mecpu.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_mecpu.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_mecpu.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_mecpu.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_mecpu.template b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_mecpu.template similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_mecpu.template rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_mecpu.template diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_ser.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_ser.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_peg_ser.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_peg_ser.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_tree_text.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_tree_text.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/gen_tree_text.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/gen_tree_text.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/parse_lemon.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/parse_lemon.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/parse_lemon.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/parse_lemon.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/parse_peg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/parse_peg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/parse_peg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/parse_peg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/parse_peghb.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/parse_peghb.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/parse_peghb.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/parse_peghb.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/parse_pegser.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/parse_pegser.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/parse_pegser.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/parse_pegser.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/peg_grammar.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/peg_grammar.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/peg_grammar.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/peg_grammar.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/pluginmgr.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/pluginmgr.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/pluginmgr.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/pluginmgr.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/config_peg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/config_peg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/config_peg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/config_peg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_hb.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_hb.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_hb.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_hb.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_lemon.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_lemon.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_lemon.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_lemon.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_peg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_peg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_peg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_peg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_ser.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_ser.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_ser.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_ser.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_treeser.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_treeser.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_treeser.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/reader_treeser.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/transform_mecpu.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/transform_mecpu.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/transform_mecpu.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/transform_mecpu.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/transform_reachable.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/transform_reachable.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/transform_reachable.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/transform_reachable.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/transform_realizable.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/transform_realizable.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/transform_realizable.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/transform_realizable.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_hb.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_hb.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_hb.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_hb.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_identity.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_identity.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_identity.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_identity.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_me.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_me.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_me.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_me.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_mecpu.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_mecpu.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_mecpu.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_mecpu.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_null.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_null.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_null.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_null.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_peg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_peg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_peg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_peg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_ser.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_ser.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_ser.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_ser.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_tpc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_tpc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_tpc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_tpc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_tree.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_tree.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_tree.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/plugins/writer_tree.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/util_flow.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/util_flow.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/util_flow.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/util_flow.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/util_norm_lemon.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/util_norm_lemon.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/util_norm_lemon.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/util_norm_lemon.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/util_norm_peg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/util_norm_peg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/util_norm_peg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/util_norm_peg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/util_peg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/util_peg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/util_peg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/util_peg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/util_quote.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/util_quote.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/page/util_quote.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/page/util_quote.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pki/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pki/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pki/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pki/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pki/pki.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pki/pki.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pki/pki.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pki/pki.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pluginmgr/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pluginmgr/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pluginmgr/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pluginmgr/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pluginmgr/pluginmgr.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pluginmgr/pluginmgr.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pluginmgr/pluginmgr.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pluginmgr/pluginmgr.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/png/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/png/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/png/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/png/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/png/png.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/png/png.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/png/png.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/png/png.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pop3/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pop3/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pop3/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pop3/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pop3/pop3.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pop3/pop3.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pop3/pop3.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pop3/pop3.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pop3d/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pop3d/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pop3d/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pop3d/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pop3d/pop3d.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pop3d/pop3d.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pop3d/pop3d.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pop3d/pop3d.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pop3d/pop3d_dbox.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pop3d/pop3d_dbox.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pop3d/pop3d_dbox.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pop3d/pop3d_dbox.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pop3d/pop3d_udb.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pop3d/pop3d_udb.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pop3d/pop3d_udb.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pop3d/pop3d_udb.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/practcl/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/practcl/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/practcl/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/practcl/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/practcl/practcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/practcl/practcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/practcl/practcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/practcl/practcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/processman/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/processman/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/processman/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/processman/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/processman/processman.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/processman/processman.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/processman/processman.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/processman/processman.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/profiler/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/profiler/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/profiler/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/profiler/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/profiler/profiler.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/profiler/profiler.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/profiler/profiler.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/profiler/profiler.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/char.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/char.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/char.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/char.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_astree.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_astree.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_astree.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_astree.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_cparam_config_critcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_cparam_config_critcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_cparam_config_critcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_cparam_config_critcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_cparam_config_tea.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_cparam_config_tea.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_cparam_config_tea.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_cparam_config_tea.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_parse_peg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_parse_peg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_parse_peg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_parse_peg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_parse_peg_c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_parse_peg_c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_parse_peg_c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_parse_peg_c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_parse_peg_tcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_parse_peg_tcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_parse_peg_tcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_parse_peg_tcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_container.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_container.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_container.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_container.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_container_peg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_container_peg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_container_peg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_container_peg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export_container.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export_container.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export_container.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export_container.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export_json.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export_json.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export_json.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export_json.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export_peg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export_peg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export_peg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_export_peg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_from_json.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_from_json.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_from_json.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_from_json.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_from_peg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_from_peg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_from_peg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_from_peg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_import.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_import.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_import.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_import.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_import_json.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_import_json.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_import_json.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_import_json.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_import_peg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_import_peg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_import_peg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_import_peg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_interp.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_interp.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_interp.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_interp.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_op.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_op.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_op.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_op.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_container.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_container.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_container.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_container.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_cparam.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_cparam.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_cparam.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_cparam.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_json.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_json.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_json.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_json.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_param.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_param.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_param.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_param.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_peg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_peg.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_peg.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_peg.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_tclparam.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_tclparam.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_tclparam.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_peg_to_tclparam.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_pegrammar.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_pegrammar.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_pegrammar.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_pegrammar.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_pexpr_op.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_pexpr_op.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_pexpr_op.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_pexpr_op.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_pexpression.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_pexpression.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_pexpression.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_pexpression.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_pgen.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_pgen.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_pgen.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_pgen.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_nx.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_nx.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_nx.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_nx.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_oo.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_oo.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_oo.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_oo.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_tcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_tcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_tcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_rdengine_tcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_tclparam_config_nx.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_tclparam_config_nx.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_tclparam_config_nx.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_tclparam_config_nx.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_tclparam_config_snit.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_tclparam_config_snit.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_tclparam_config_snit.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_tclparam_config_snit.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_tclparam_config_tcloo.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_tclparam_config_tcloo.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_tclparam_config_tcloo.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_tclparam_config_tcloo.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_util.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_util.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/pt_util.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/pt_util.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/m.c b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/m.c similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/m.c rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/m.c diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/m.h b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/m.h similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/m.h rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/m.h diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ms.c b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ms.c similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ms.c rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ms.c diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ms.h b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ms.h similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ms.h rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ms.h diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ot.c b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ot.c similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ot.c rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ot.c diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ot.h b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ot.h similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ot.h rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/ot.h diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/p.c b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/p.c similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/p.c rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/p.c diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/p.h b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/p.h similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/p.h rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/p.h diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/pInt.h b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/pInt.h similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/pInt.h rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/pInt.h diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/param.c b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/param.c similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/param.c rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/param.c diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/param.h b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/param.h similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/param.h rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/param.h diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/stack.c b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/stack.c similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/stack.c rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/stack.c diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/stack.h b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/stack.h similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/stack.h rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/stack.h diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/tc.c b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/tc.c similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/tc.c rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/tc.c diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/tc.h b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/tc.h similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/tc.h rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/tc.h diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/util.c b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/util.c similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/util.c rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/util.c diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/util.h b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/util.h similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/util.h rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/rde_critcl/util.h diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/text_write.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/text_write.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/pt/text_write.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/pt/text_write.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rc4/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rc4/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rc4/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rc4/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rc4/rc4.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rc4/rc4.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rc4/rc4.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rc4/rc4.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rc4/rc4c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rc4/rc4c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rc4/rc4c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rc4/rc4c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rcs/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rcs/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rcs/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rcs/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rcs/rcs.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rcs/rcs.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rcs/rcs.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rcs/rcs.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/report/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/report/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/report/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/report/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/report/report.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/report/report.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/report/report.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/report/report.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rest/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rest/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rest/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rest/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rest/rest.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rest/rest.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/rest/rest.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/rest/rest.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ripemd/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ripemd/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ripemd/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ripemd/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ripemd/ripemd128.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ripemd/ripemd128.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ripemd/ripemd128.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ripemd/ripemd128.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ripemd/ripemd160.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ripemd/ripemd160.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/ripemd/ripemd160.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/ripemd/ripemd160.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sasl/gtoken.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sasl/gtoken.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sasl/gtoken.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sasl/gtoken.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sasl/ntlm.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sasl/ntlm.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sasl/ntlm.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sasl/ntlm.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sasl/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sasl/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sasl/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sasl/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sasl/sasl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sasl/sasl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sasl/sasl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sasl/sasl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sasl/scram.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sasl/scram.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sasl/scram.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sasl/scram.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha1.c b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha1.c similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha1.c rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha1.c diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha1.h b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha1.h similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha1.h rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha1.h diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha1.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha1.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha1.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha1.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha1c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha1c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha1c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha1c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha1v1.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha1v1.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha1v1.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha1v1.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha256.c b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha256.c similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha256.c rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha256.c diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha256.h b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha256.h similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha256.h rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha256.h diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha256.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha256.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha256.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha256.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha256c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha256c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/sha1/sha256c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/sha1/sha256c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/simulation/annealing.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/simulation/annealing.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/simulation/annealing.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/simulation/annealing.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/simulation/montecarlo.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/simulation/montecarlo.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/simulation/montecarlo.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/simulation/montecarlo.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/simulation/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/simulation/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/simulation/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/simulation/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/simulation/random.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/simulation/random.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/simulation/random.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/simulation/random.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/smtpd/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/smtpd/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/smtpd/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/smtpd/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/smtpd/smtpd.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/smtpd/smtpd.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/smtpd/smtpd.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/smtpd/smtpd.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/snit/main1.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/snit/main1.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/snit/main1.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/snit/main1.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/snit/main2.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/snit/main2.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/snit/main2.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/snit/main2.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/snit/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/snit/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/snit/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/snit/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/snit/snit.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/snit/snit.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/snit/snit.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/snit/snit.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/snit/snit2.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/snit/snit2.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/snit/snit2.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/snit/snit2.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/snit/validate.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/snit/validate.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/snit/validate.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/snit/validate.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/soundex/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/soundex/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/soundex/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/soundex/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/soundex/soundex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/soundex/soundex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/soundex/soundex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/soundex/soundex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stooop/mkpkgidx.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stooop/mkpkgidx.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stooop/mkpkgidx.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stooop/mkpkgidx.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stooop/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stooop/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stooop/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stooop/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stooop/stooop.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stooop/stooop.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stooop/stooop.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stooop/stooop.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stooop/switched.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stooop/switched.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stooop/switched.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stooop/switched.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stooop/xifo.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stooop/xifo.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stooop/xifo.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stooop/xifo.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/string/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/string/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/string/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/string/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/string/token.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/string/token.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/string/token.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/string/token.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/string/token_shell.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/string/token_shell.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/string/token_shell.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/string/token_shell.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stringprep/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stringprep/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stringprep/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stringprep/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stringprep/stringprep.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stringprep/stringprep.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stringprep/stringprep.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stringprep/stringprep.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stringprep/stringprep_data.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stringprep/stringprep_data.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stringprep/stringprep_data.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stringprep/stringprep_data.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stringprep/unicode.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stringprep/unicode.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stringprep/unicode.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stringprep/unicode.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stringprep/unicode_data.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stringprep/unicode_data.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/stringprep/unicode_data.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/stringprep/unicode_data.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/disjointset.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/disjointset.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/disjointset.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/disjointset.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/graph.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/graph.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/graph.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/graph.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/graph1.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/graph1.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/graph1.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/graph1.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/graph_c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/graph_c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/graph_c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/graph_c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/graph_tcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/graph_tcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/graph_tcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/graph_tcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/graphops.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/graphops.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/graphops.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/graphops.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/list.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/list.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/list.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/list.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/list.test.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/list.test.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/list.test.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/list.test.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/map.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/map.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/map.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/map.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/matrix.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/matrix.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/matrix.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/matrix.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/pool.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/pool.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/pool.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/pool.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/prioqueue.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/prioqueue.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/prioqueue.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/prioqueue.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/queue.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/queue.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/queue.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/queue.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/queue_c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/queue_c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/queue_c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/queue_c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/queue_oo.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/queue_oo.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/queue_oo.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/queue_oo.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/queue_tcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/queue_tcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/queue_tcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/queue_tcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/record.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/record.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/record.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/record.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/sets.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/sets.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/sets.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/sets.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/sets_c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/sets_c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/sets_c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/sets_c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/sets_tcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/sets_tcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/sets_tcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/sets_tcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/skiplist.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/skiplist.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/skiplist.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/skiplist.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/stack.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/stack.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/stack.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/stack.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/stack_c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/stack_c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/stack_c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/stack_c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/stack_oo.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/stack_oo.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/stack_oo.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/stack_oo.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/stack_tcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/stack_tcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/stack_tcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/stack_tcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/struct.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/struct.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/struct.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/struct.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/struct1.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/struct1.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/struct1.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/struct1.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/tree.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/tree.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/tree.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/tree.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/tree1.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/tree1.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/tree1.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/tree1.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/tree_c.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/tree_c.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/tree_c.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/tree_c.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/tree_tcl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/tree_tcl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/struct/tree_tcl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/struct/tree_tcl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tar/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tar/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tar/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tar/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tar/tar.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tar/tar.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tar/tar.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tar/tar.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tcllibc/critcl-rt.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tcllibc/critcl-rt.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tcllibc/critcl-rt.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tcllibc/critcl-rt.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tcllibc/license.terms b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tcllibc/license.terms similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tcllibc/license.terms rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tcllibc/license.terms diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tcllibc/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tcllibc/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tcllibc/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tcllibc/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tcllibc/teapot.txt b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tcllibc/teapot.txt similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tcllibc/teapot.txt rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tcllibc/teapot.txt diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tcllibc/win32-x86_64/tcllibc.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tcllibc/win32-x86_64/tcllibc.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tcllibc/win32-x86_64/tcllibc.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tcllibc/win32-x86_64/tcllibc.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tepam/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tepam/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tepam/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tepam/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tepam/tepam.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tepam/tepam.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tepam/tepam.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tepam/tepam.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tepam/tepam_doc_gen.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tepam/tepam_doc_gen.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tepam/tepam_doc_gen.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tepam/tepam_doc_gen.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ansi/code.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ansi/code.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ansi/code.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ansi/code.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ansi/code/attr.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ansi/code/attr.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ansi/code/attr.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ansi/code/attr.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ansi/code/ctrl.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ansi/code/ctrl.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ansi/code/ctrl.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ansi/code/ctrl.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ansi/code/macros.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ansi/code/macros.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ansi/code/macros.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ansi/code/macros.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ansi/ctrlunix.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ansi/ctrlunix.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ansi/ctrlunix.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ansi/ctrlunix.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ansi/send.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ansi/send.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ansi/send.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ansi/send.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/bind.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/bind.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/bind.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/bind.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/imenu.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/imenu.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/imenu.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/imenu.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ipager.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ipager.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/ipager.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/ipager.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/receive.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/receive.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/receive.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/receive.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/send.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/send.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/send.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/send.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/term.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/term.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/term/term.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/term/term.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/adjust.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/adjust.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/adjust.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/adjust.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/dehypht.tex b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/dehypht.tex similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/dehypht.tex rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/dehypht.tex diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/eshyph_vo.tex b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/eshyph_vo.tex similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/eshyph_vo.tex rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/eshyph_vo.tex diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/expander.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/expander.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/expander.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/expander.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/ithyph.tex b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/ithyph.tex similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/ithyph.tex rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/ithyph.tex diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/patch.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/patch.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/patch.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/patch.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/repeat.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/repeat.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/repeat.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/repeat.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/split.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/split.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/split.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/split.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/string.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/string.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/string.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/string.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/tabify.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/tabify.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/tabify.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/tabify.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/textutil.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/textutil.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/textutil.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/textutil.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/trim.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/trim.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/trim.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/trim.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/wcswidth.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/wcswidth.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/textutil/wcswidth.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/textutil/wcswidth.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie_array.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie_array.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie_array.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie_array.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie_dsource.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie_dsource.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie_dsource.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie_dsource.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie_file.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie_file.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie_file.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie_file.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie_growfile.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie_growfile.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie_growfile.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie_growfile.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie_log.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie_log.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie_log.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie_log.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie_rarray.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie_rarray.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tie/tie_rarray.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tie/tie_rarray.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tiff/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tiff/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tiff/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tiff/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tiff/tiff.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tiff/tiff.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tiff/tiff.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tiff/tiff.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tool/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tool/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tool/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tool/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tool/tool.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tool/tool.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/tool/tool.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/tool/tool.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/connect.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/connect.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/connect.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/connect.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/copyops.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/copyops.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/copyops.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/copyops.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/ddest.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/ddest.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/ddest.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/ddest.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/dsource.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/dsource.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/dsource.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/dsource.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/receiver.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/receiver.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/receiver.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/receiver.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/tqueue.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/tqueue.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/tqueue.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/tqueue.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/transmitter.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/transmitter.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/transfer/transmitter.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/transfer/transmitter.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/treeql/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/treeql/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/treeql/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/treeql/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/treeql/treeql.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/treeql/treeql.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/treeql/treeql.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/treeql/treeql.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/treeql/treeql84.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/treeql/treeql84.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/treeql/treeql84.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/treeql/treeql84.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/treeql/treeql85.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/treeql/treeql85.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/treeql/treeql85.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/treeql/treeql85.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/try/fhome.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/try/fhome.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/try/fhome.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/try/fhome.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/try/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/try/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/try/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/try/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/try/throw.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/try/throw.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/try/throw.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/try/throw.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/try/try.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/try/try.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/try/try.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/try/try.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/udpcluster/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/udpcluster/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/udpcluster/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/udpcluster/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/udpcluster/udpcluster.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/udpcluster/udpcluster.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/udpcluster/udpcluster.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/udpcluster/udpcluster.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uev/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uev/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uev/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uev/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uev/uevent.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uev/uevent.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uev/uevent.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uev/uevent.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uev/uevent_onidle.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uev/uevent_onidle.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uev/uevent_onidle.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uev/uevent_onidle.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/units/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/units/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/units/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/units/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/units/units.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/units/units.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/units/units.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/units/units.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uri/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uri/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uri/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uri/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uri/uri.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uri/uri.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uri/uri.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uri/uri.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uri/urn-scheme.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uri/urn-scheme.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uri/urn-scheme.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uri/urn-scheme.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uuid/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uuid/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uuid/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uuid/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uuid/uuid.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uuid/uuid.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/uuid/uuid.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/uuid/uuid.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/cc_amex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/cc_amex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/cc_amex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/cc_amex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/cc_discover.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/cc_discover.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/cc_discover.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/cc_discover.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/cc_mastercard.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/cc_mastercard.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/cc_mastercard.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/cc_mastercard.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/cc_visa.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/cc_visa.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/cc_visa.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/cc_visa.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/ean13.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/ean13.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/ean13.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/ean13.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/iban.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/iban.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/iban.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/iban.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/imei.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/imei.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/imei.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/imei.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/isbn.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/isbn.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/isbn.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/isbn.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/luhn.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/luhn.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/luhn.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/luhn.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/luhn5.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/luhn5.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/luhn5.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/luhn5.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/usnpi.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/usnpi.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/usnpi.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/usnpi.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/valtype.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/valtype.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/valtype.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/valtype.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/verhoeff.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/verhoeff.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/valtype/verhoeff.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/valtype/verhoeff.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/cat.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/cat.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/cat.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/cat.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/facade.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/facade.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/facade.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/facade.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/fifo.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/fifo.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/fifo.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/fifo.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/fifo2.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/fifo2.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/fifo2.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/fifo2.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/halfpipe.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/halfpipe.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/halfpipe.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/halfpipe.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/memchan.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/memchan.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/memchan.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/memchan.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/null.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/null.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/null.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/null.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/nullzero.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/nullzero.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/nullzero.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/nullzero.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/random.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/random.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/random.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/random.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/randseed.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/randseed.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/randseed.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/randseed.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/std.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/std.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/std.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/std.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/string.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/string.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/string.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/string.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/textwindow.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/textwindow.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/textwindow.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/textwindow.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/variable.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/variable.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/variable.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/variable.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/zero.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/zero.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_base/zero.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_base/zero.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_core/core.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_core/core.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_core/core.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_core/core.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_core/events.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_core/events.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_core/events.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_core/events.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_core/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_core/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_core/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_core/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_core/transformcore.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_core/transformcore.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_core/transformcore.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_core/transformcore.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/adler32.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/adler32.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/adler32.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/adler32.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/base64.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/base64.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/base64.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/base64.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/counter.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/counter.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/counter.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/counter.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/crc32.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/crc32.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/crc32.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/crc32.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/hex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/hex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/hex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/hex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/identity.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/identity.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/identity.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/identity.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/limitsize.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/limitsize.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/limitsize.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/limitsize.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/observe.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/observe.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/observe.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/observe.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/otp.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/otp.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/otp.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/otp.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/rot.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/rot.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/rot.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/rot.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/spacer.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/spacer.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/spacer.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/spacer.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/zlib.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/zlib.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/zlib.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/virtchannel_transform/zlib.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/websocket/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/websocket/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/websocket/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/websocket/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/websocket/websocket.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/websocket/websocket.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/websocket/websocket.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/websocket/websocket.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/wip/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/wip/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/wip/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/wip/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/wip/wip.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/wip/wip.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/wip/wip.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/wip/wip.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/wip/wip2.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/wip/wip2.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/wip/wip2.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/wip/wip2.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/yaml/huddle.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/yaml/huddle.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/yaml/huddle.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/yaml/huddle.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/yaml/huddle_types.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/yaml/huddle_types.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/yaml/huddle_types.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/yaml/huddle_types.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/yaml/json2huddle.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/yaml/json2huddle.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/yaml/json2huddle.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/yaml/json2huddle.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/yaml/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/yaml/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/yaml/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/yaml/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/yaml/yaml.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/yaml/yaml.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/yaml/yaml.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/yaml/yaml.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/zip/decode.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/zip/decode.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/zip/decode.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/zip/decode.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/zip/encode.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/zip/encode.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/zip/encode.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/zip/encode.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/zip/mkzip.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/zip/mkzip.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/zip/mkzip.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/zip/mkzip.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/zip/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/zip/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcllib2.0/zip/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcllib2.0/zip/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclparser1.9/parse.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclparser1.9/parse.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclparser1.9/parse.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclparser1.9/parse.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclparser1.9/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclparser1.9/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclparser1.9/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclparser1.9/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tclparser1.9/tcl9tclparser19.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tclparser1.9/tcl9tclparser19.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tclparser1.9/tcl9tclparser19.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tclparser1.9/tcl9tclparser19.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcltls1.7.23/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcltls1.7.23/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcltls1.7.23/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcltls1.7.23/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcltls1.7.23/tcltls.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcltls1.7.23/tcltls.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcltls1.7.23/tcltls.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcltls1.7.23/tcltls.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcltls1.7.23/tls.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcltls1.7.23/tls.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcltls1.7.23/tls.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcltls1.7.23/tls.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/demos/broadcast.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/demos/broadcast.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/demos/broadcast.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/demos/broadcast.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/demos/bug1158628.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/demos/bug1158628.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/demos/bug1158628.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/demos/bug1158628.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/demos/chat.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/demos/chat.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/demos/chat.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/demos/chat.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/demos/multicast.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/demos/multicast.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/demos/multicast.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/demos/multicast.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/demos/udpcat.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/demos/udpcat.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/demos/udpcat.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/demos/udpcat.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/tcl9udp1013.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/tcl9udp1013.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/tcl9udp1013.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/tcl9udp1013.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/udp.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/udp.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/udp.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/udp.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/udp1013t.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/udp1013t.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tcludp1.0.13/udp1013t.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tcludp1.0.13/udp1013t.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbc1.1.10/libtdbcstub.a b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbc1.1.10/libtdbcstub.a similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbc1.1.10/libtdbcstub.a rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbc1.1.10/libtdbcstub.a diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbc1.1.10/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbc1.1.10/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbc1.1.10/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbc1.1.10/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbc1.1.10/tcl9tdbc1110.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbc1.1.10/tcl9tdbc1110.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbc1.1.10/tcl9tdbc1110.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbc1.1.10/tcl9tdbc1110.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbc1.1.10/tdbc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbc1.1.10/tdbc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbc1.1.10/tdbc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbc1.1.10/tdbc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbc1.1.10/tdbcConfig.sh b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbc1.1.10/tdbcConfig.sh similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbc1.1.10/tdbcConfig.sh rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbc1.1.10/tdbcConfig.sh diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbcmysql1.1.10/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcmysql1.1.10/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbcmysql1.1.10/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcmysql1.1.10/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbcmysql1.1.10/tcl9tdbcmysql1110.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcmysql1.1.10/tcl9tdbcmysql1110.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbcmysql1.1.10/tcl9tdbcmysql1110.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcmysql1.1.10/tcl9tdbcmysql1110.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbcmysql1.1.10/tdbcmysql.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcmysql1.1.10/tdbcmysql.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbcmysql1.1.10/tdbcmysql.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcmysql1.1.10/tdbcmysql.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbcodbc1.1.10/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcodbc1.1.10/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbcodbc1.1.10/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcodbc1.1.10/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbcodbc1.1.10/tcl9tdbcodbc1110.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcodbc1.1.10/tcl9tdbcodbc1110.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbcodbc1.1.10/tcl9tdbcodbc1110.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcodbc1.1.10/tcl9tdbcodbc1110.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbcodbc1.1.10/tdbcodbc.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcodbc1.1.10/tdbcodbc.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbcodbc1.1.10/tdbcodbc.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcodbc1.1.10/tdbcodbc.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbcpostgres1.1.10/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcpostgres1.1.10/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbcpostgres1.1.10/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcpostgres1.1.10/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbcpostgres1.1.10/tcl9tdbcpostgres1110.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcpostgres1.1.10/tcl9tdbcpostgres1110.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbcpostgres1.1.10/tcl9tdbcpostgres1110.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcpostgres1.1.10/tcl9tdbcpostgres1110.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdbcpostgres1.1.10/tdbcpostgres.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcpostgres1.1.10/tdbcpostgres.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdbcpostgres1.1.10/tdbcpostgres.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdbcpostgres1.1.10/tdbcpostgres.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/category-index.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/category-index.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/category-index.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/category-index.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/dom.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/dom.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/dom.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/dom.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/domDoc.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/domDoc.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/domDoc.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/domDoc.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/domNode.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/domNode.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/domNode.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/domNode.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/expat.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/expat.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/expat.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/expat.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/expatapi.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/expatapi.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/expatapi.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/expatapi.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/index.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/index.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/index.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/index.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/keyword-index.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/keyword-index.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/keyword-index.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/keyword-index.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/manpage.css b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/manpage.css similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/manpage.css rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/manpage.css diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/pullparser.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/pullparser.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/pullparser.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/pullparser.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/schema.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/schema.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/schema.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/schema.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/tcl9tdom096.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/tcl9tdom096.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/tcl9tdom096.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/tcl9tdom096.dll diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/tdom.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/tdom.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/tdom.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/tdom.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/tdomcmd.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/tdomcmd.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/tdomcmd.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/tdomcmd.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/tdomstub.lib b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/tdomstub.lib similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/tdomstub.lib rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/tdomstub.lib diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/tnc.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/tnc.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/tnc.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/tnc.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/xpathFunc.html b/src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/xpathFunc.html similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tdom0.9.6/xpathFunc.html rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tdom0.9.6/xpathFunc.html diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tjson1.0.25/LICENSE b/src/vfs/punk9wintk903.vfs/lib_tcl9/tjson1.0.25/LICENSE similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tjson1.0.25/LICENSE rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tjson1.0.25/LICENSE diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tjson1.0.25/pkgIndex.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tjson1.0.25/pkgIndex.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tjson1.0.25/pkgIndex.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tjson1.0.25/pkgIndex.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tjson1.0.25/readme.md b/src/vfs/punk9wintk903.vfs/lib_tcl9/tjson1.0.25/readme.md similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tjson1.0.25/readme.md rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tjson1.0.25/readme.md diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tjson1.0.25/tcl9tjson1025.dll b/src/vfs/punk9wintk903.vfs/lib_tcl9/tjson1.0.25/tcl9tjson1025.dll similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tjson1.0.25/tcl9tjson1025.dll rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tjson1.0.25/tcl9tjson1025.dll diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/bgerror.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/bgerror.tcl new file mode 100644 index 00000000..a54daf74 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/bgerror.tcl @@ -0,0 +1,282 @@ +# bgerror.tcl -- +# +# Implementation of the bgerror procedure. It posts a dialog box with +# the error message and gives the user a chance to see a more detailed +# stack trace, and possible do something more interesting with that +# trace (like save it to a log). This is adapted from work done by +# Donal K. Fellows. +# +# Copyright © 1998-2000 Ajuba Solutions. +# Copyright © 2007 ActiveState Software Inc. +# Copyright © 2007 Daniel A. Steffen +# Copyright © 2009 Pat Thoyts + +namespace eval ::tk::dialog::error { + namespace import -force ::tk::msgcat::* + namespace export bgerror + option add *ErrorDialog.function.text [mc "Save To Log"] \ + widgetDefault + option add *ErrorDialog.function.command [namespace code SaveToLog] + option add *ErrorDialog*Label.font TkCaptionFont widgetDefault + if {[tk windowingsystem] eq "aqua"} { + option add *ErrorDialog*background systemAlertBackgroundActive \ + widgetDefault + option add *ErrorDialog*info.text.background \ + systemTextBackgroundColor widgetDefault + option add *ErrorDialog*Button.highlightBackground \ + systemAlertBackgroundActive widgetDefault + } +} + +proc ::tk::dialog::error::Return {which code} { + variable button + + .bgerrorDialog.$which state {active selected focus} + update idletasks + after 100 + set button $code +} + +proc ::tk::dialog::error::Details {} { + set w .bgerrorDialog + set caption [option get $w.function text {}] + set command [option get $w.function command {}] + if {($caption eq "") || ($command eq "")} { + grid forget $w.function + } + lappend command [$w.top.info.text get 1.0 end-1c] + $w.function configure -text $caption -command $command + grid $w.top.info - -sticky nsew -padx 3m -pady 3m +} + +proc ::tk::dialog::error::SaveToLog {text} { + if {$::tcl_platform(platform) eq "windows"} { + set allFiles *.* + } else { + set allFiles * + } + set types [list \ + [list [mc "Log Files"] .log] \ + [list [mc "Text Files"] .txt] \ + [list [mc "All Files"] $allFiles] \ + ] + set filename [tk_getSaveFile -title [mc "Select Log File"] \ + -filetypes $types -defaultextension .log -parent .bgerrorDialog] + if {$filename ne {}} { + set f [open $filename w] + puts -nonewline $f $text + close $f + } + return +} + +proc ::tk::dialog::error::Destroy {w} { + if {$w eq ".bgerrorDialog"} { + variable button + set button -1 + } +} + +proc ::tk::dialog::error::DeleteByProtocol {} { + variable button + set button 1 +} + +proc ::tk::dialog::error::ReturnInDetails w { + bind $w {}; # Remove this binding + $w invoke + return -code break +} + +# ::tk::dialog::error::bgerror -- +# +# This is the default version of bgerror. +# It tries to execute tkerror, if that fails it posts a dialog box +# containing the error message and gives the user a chance to ask +# to see a stack trace. +# +# Arguments: +# err - The error message. +# +proc ::tk::dialog::error::bgerror {err {flag 1}} { + global errorInfo + variable button + + set info $errorInfo + + set ret [catch {::tkerror $err} msg]; + if {$ret != 1} {return -code $ret $msg} + + # The application's tkerror either failed or was not found + # so we use the default dialog. But on Aqua we cannot display + # the dialog if the background error occurs in an idle task + # being processed inside of [NSView drawRect]. In that case + # we post the dialog as an after task instead. + set windowingsystem [tk windowingsystem] + if {$windowingsystem eq "aqua"} { + if $flag { + set errorInfo $info + after 500 [list bgerror "$err" 0] + return + } + } + + set ok [mc OK] + # Truncate the message if it is too wide (>maxLine characters) or + # too tall (>maxRows lines). Truncation occurs at the first point at + # which one of those conditions is met. No trailing newline. + set displayedErr "" + set lines 0 + set maxLine 45 + set maxRows 5 + foreach line [split $err \n] { + if {$lines > $maxRows - 1} { + # No more lines. Append to previous line. + append displayedErr { ...} + break + } + if {[string length $line] > $maxLine} { + append displayedErr "[string range $line 0 $maxLine-3]..." + break + } + if {$lines > $maxRows - 2 && [string length $line] > $maxLine-4} { + append displayedErr "[string range $line 0 $maxLine-3]..." + break + } elseif {$lines > $maxRows - 2} { + # Last line, but no break or newline. Room to add 4 chars. + append displayedErr "${line}" + } else { + append displayedErr "${line}\n" + } + incr lines + } + set displayedErr [string trim $displayedErr] + + set title [mc "Application Error"] + set text [mc "Error: %1\$s" $displayedErr] + set buttons [list ok $ok dismiss [mc "Skip Messages"] \ + function [mc "Details >>"]] + + # 1. Create the top-level window and divide it into top + # and bottom parts. + + set dlg .bgerrorDialog + set bg [ttk::style lookup . -background] + destroy $dlg + toplevel $dlg -class ErrorDialog -background $bg + wm withdraw $dlg + wm title $dlg $title + wm iconname $dlg ErrorDialog + wm protocol $dlg WM_DELETE_WINDOW [namespace code DeleteByProtocol] + + if {$windowingsystem eq "aqua"} { + ::tk::unsupported::MacWindowStyle style $dlg moveableAlert {} + } elseif {$windowingsystem eq "x11"} { + wm attributes $dlg -type dialog + } + + ttk::frame $dlg.bot + ttk::frame $dlg.top + pack $dlg.bot -side bottom -fill both + pack $dlg.top -side top -fill both -expand 1 + + set W [ttk::frame $dlg.top.info] + text $W.text -setgrid 0 -height 10 -wrap char \ + -yscrollcommand [list $W.scroll set] + if {$windowingsystem ne "aqua"} { + $W.text configure -width 40 + } + + ttk::scrollbar $W.scroll -command [list $W.text yview] + pack $W.scroll -side right -fill y + pack $W.text -side left -expand yes -fill both + $W.text insert 0.0 "$err\n$info" + $W.text mark set insert 0.0 + bind $W.text {focus %W} + $W.text configure -state disabled + + # 2. Fill the top part with bitmap and message + + # Max-width of message is the width of the screen... + set wrapwidth [winfo screenwidth $dlg] + # ...minus the width of the icon, padding and a fudge factor for + # the window manager decorations and aesthetics. + set wrapwidth [expr {$wrapwidth-60-[winfo pixels $dlg 9m]}] + ttk::label $dlg.msg -justify left -text $text -wraplength $wrapwidth + ttk::label $dlg.bitmap -image ::tk::icons::error + + grid $dlg.bitmap $dlg.msg -in $dlg.top -row 0 -padx 3m -pady 3m + grid configure $dlg.bitmap -sticky ne + grid configure $dlg.msg -sticky nsw -padx {0 3m} + grid rowconfigure $dlg.top 1 -weight 1 + grid columnconfigure $dlg.top 1 -weight 1 + + # 3. Create a row of buttons at the bottom of the dialog. + + set i 0 + foreach {name caption} $buttons { + ttk::button $dlg.$name -text $caption -default normal \ + -command [namespace code [list set button $i]] + grid $dlg.$name -in $dlg.bot -column $i -row 0 -sticky ew -padx 7.5p + grid columnconfigure $dlg.bot $i -weight 1 + # We boost the size of some Mac buttons for l&f + if {$windowingsystem eq "aqua"} { + if {($name eq "ok") || ($name eq "dismiss")} { + grid columnconfigure $dlg.bot $i -minsize 90 + } + grid configure $dlg.$name -pady 7 + } + incr i + } + # The "OK" button is the default for this dialog. + $dlg.ok configure -default active + + bind $dlg [namespace code {Return ok 0}] + bind $dlg [namespace code {Return dismiss 1}] + bind $dlg [namespace code {Destroy %W}] + bind $dlg.function [namespace code {ReturnInDetails %W}] + $dlg.function configure -command [namespace code Details] + + # 6. Withdraw the window, then update all the geometry information + # so we know how big it wants to be, then center the window in the + # display (Motif style) and de-iconify it. + + ::tk::PlaceWindow $dlg + + # 7. Set a grab and claim the focus too. + + ::tk::SetFocusGrab $dlg $dlg.ok + + # 8. Ensure that we are topmost. + + raise $dlg + if {[tk windowingsystem] eq "win32"} { + # Place it topmost if we aren't at the top of the stacking + # order to ensure that it's seen + if {[lindex [wm stackorder .] end] ne "$dlg"} { + wm attributes $dlg -topmost 1 + } + } + + # 9. Wait for the user to respond, then restore the focus and + # return the index of the selected button. Restore the focus + # before deleting the window, since otherwise the window manager + # may take the focus away so we can't redirect it. Finally, + # restore any grab that was in effect. + + vwait [namespace which -variable button] + set copy $button; # Save a copy... + + ::tk::RestoreFocusGrab $dlg $dlg.ok destroy + + if {$copy == 1} { + return -code break + } +} + +namespace eval :: { + # Fool the indexer + proc bgerror err {} + rename bgerror {} + namespace import ::tk::dialog::error::bgerror +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/button.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/button.tcl new file mode 100644 index 00000000..03d70c58 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/button.tcl @@ -0,0 +1,782 @@ +# button.tcl -- +# +# This file defines the default bindings for Tk label, button, +# checkbutton, and radiobutton widgets and provides procedures +# that help in implementing those bindings. +# +# Copyright © 1992-1994 The Regents of the University of California. +# Copyright © 1994-1996 Sun Microsystems, Inc. +# Copyright © 2002 ActiveState Corporation. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +#------------------------------------------------------------------------- +# The code below creates the default class bindings for buttons. +#------------------------------------------------------------------------- + +if {[tk windowingsystem] eq "aqua"} { + + bind Radiobutton { + tk::ButtonEnter %W + } + bind Radiobutton { + tk::ButtonDown %W + } + bind Radiobutton { + tk::ButtonUp %W + } + bind Checkbutton { + tk::ButtonEnter %W + } + bind Checkbutton { + tk::ButtonDown %W + } + bind Checkbutton { + tk::ButtonUp %W + } + bind Checkbutton { + tk::ButtonLeave %W + } +} +if {"win32" eq [tk windowingsystem]} { + bind Checkbutton <=> { + tk::CheckRadioInvoke %W select + } + bind Checkbutton <+> { + tk::CheckRadioInvoke %W select + } + bind Checkbutton { + tk::CheckRadioInvoke %W deselect + } + bind Checkbutton { + tk::CheckRadioDown %W + } + bind Checkbutton { + tk::ButtonUp %W + } + bind Checkbutton { + tk::CheckRadioEnter %W + } + bind Checkbutton { + tk::ButtonLeave %W + } + + bind Radiobutton { + tk::CheckRadioDown %W + } + bind Radiobutton { + tk::ButtonUp %W + } + bind Radiobutton { + tk::CheckRadioEnter %W + } +} +if {"x11" eq [tk windowingsystem]} { + bind Checkbutton { + if {!$tk_strictMotif} { + tk::CheckInvoke %W + } + } + bind Radiobutton { + if {!$tk_strictMotif} { + tk::CheckRadioInvoke %W + } + } + bind Checkbutton { + tk::CheckInvoke %W + } + bind Radiobutton { + tk::CheckRadioInvoke %W + } + bind Checkbutton { + tk::CheckEnter %W + } + bind Radiobutton { + tk::ButtonEnter %W + } + bind Checkbutton { + tk::CheckLeave %W + } +} + +bind Button { + tk::ButtonInvoke %W +} +bind Checkbutton { + tk::CheckRadioInvoke %W +} +bind Radiobutton { + tk::CheckRadioInvoke %W +} +bind Button <> { + tk::ButtonInvoke %W +} +bind Checkbutton <> { + tk::CheckRadioInvoke %W +} +bind Radiobutton <> { + tk::CheckRadioInvoke %W +} + +bind Button {} +bind Button { + tk::ButtonEnter %W +} +bind Button { + tk::ButtonLeave %W +} +bind Button { + tk::ButtonDown %W +} +bind Button { + tk::ButtonUp %W +} + +bind Checkbutton {} + +bind Radiobutton {} +bind Radiobutton { + tk::ButtonLeave %W +} + +if {"win32" eq [tk windowingsystem]} { + +######################### +# Windows implementation +######################### + +# ::tk::ButtonEnter -- +# The procedure below is invoked when the mouse pointer enters a +# button widget. It records the button we're in and changes the +# state of the button to active unless the button is disabled. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonEnter w { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + + # If the mouse button is down, set the relief to sunken on entry. + # Overwise, if there's an -overrelief value, set the relief to that. + + set Priv($w,relief) [$w cget -relief] + if {$Priv(buttonWindow) eq $w} { + $w configure -relief sunken -state active + set Priv($w,prelief) sunken + } elseif {[set over [$w cget -overrelief]] ne ""} { + $w configure -relief $over + set Priv($w,prelief) $over + } + } + set Priv(window) $w +} + +# ::tk::ButtonLeave -- +# The procedure below is invoked when the mouse pointer leaves a +# button widget. It changes the state of the button back to inactive. +# Restore any modified relief too. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonLeave w { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + $w configure -state normal + } + + # Restore the original button relief if it was changed by Tk. + # That is signaled by the existence of Priv($w,prelief). + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + set Priv(window) "" +} + +# ::tk::ButtonDown -- +# The procedure below is invoked when the mouse button is pressed in +# a button widget. It records the fact that the mouse is in the button, +# saves the button's relief so it can be restored later, and changes +# the relief to sunken. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonDown w { + variable ::tk::Priv + + # Only save the button's relief if it does not yet exist. If there + # is an overrelief setting, Priv($w,relief) will already have been set, + # and the current value of the -relief option will be incorrect. + + if {![info exists Priv($w,relief)]} { + set Priv($w,relief) [$w cget -relief] + } + + if {[$w cget -state] ne "disabled"} { + set Priv(buttonWindow) $w + $w configure -relief sunken -state active + set Priv($w,prelief) sunken + + # If this button has a repeatdelay set up, get it going with an after + after cancel $Priv(afterId) + set delay [$w cget -repeatdelay] + set Priv(repeated) 0 + if {$delay > 0} { + set Priv(afterId) [after $delay [list tk::ButtonAutoInvoke $w]] + } + } +} + +# ::tk::ButtonUp -- +# The procedure below is invoked when the mouse button is released +# in a button widget. It restores the button's relief and invokes +# the command as long as the mouse hasn't left the button. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonUp w { + variable ::tk::Priv + if {$Priv(buttonWindow) eq $w} { + set Priv(buttonWindow) "" + + # Restore the button's relief if it was cached. + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + # Clean up the after event from the auto-repeater + after cancel $Priv(afterId) + + if {$Priv(window) eq $w && [$w cget -state] ne "disabled"} { + $w configure -state normal + + # Only invoke the command if it wasn't already invoked by the + # auto-repeater functionality + if { $Priv(repeated) == 0 } { + uplevel #0 [list $w invoke] + } + } + } +} + +# ::tk::CheckRadioEnter -- +# The procedure below is invoked when the mouse pointer enters a +# checkbutton or radiobutton widget. It records the button we're in +# and changes the state of the button to active unless the button is +# disabled. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::CheckRadioEnter w { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + if {$Priv(buttonWindow) eq $w} { + $w configure -state active + } + if {[set over [$w cget -overrelief]] ne ""} { + set Priv($w,relief) [$w cget -relief] + set Priv($w,prelief) $over + $w configure -relief $over + } + } + set Priv(window) $w +} + +# ::tk::CheckRadioDown -- +# The procedure below is invoked when the mouse button is pressed in +# a button widget. It records the fact that the mouse is in the button, +# saves the button's relief so it can be restored later, and changes +# the relief to sunken. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::CheckRadioDown w { + variable ::tk::Priv + if {![info exists Priv($w,relief)]} { + set Priv($w,relief) [$w cget -relief] + } + if {[$w cget -state] ne "disabled"} { + set Priv(buttonWindow) $w + set Priv(repeated) 0 + $w configure -state active + } +} + +} + +if {"x11" eq [tk windowingsystem]} { + +##################### +# Unix implementation +##################### + +# ::tk::ButtonEnter -- +# The procedure below is invoked when the mouse pointer enters a +# button widget. It records the button we're in and changes the +# state of the button to active unless the button is disabled. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonEnter {w} { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + # On unix the state is active just with mouse-over + $w configure -state active + + # If the mouse button is down, set the relief to sunken on entry. + # Overwise, if there's an -overrelief value, set the relief to that. + + set Priv($w,relief) [$w cget -relief] + if {$Priv(buttonWindow) eq $w} { + $w configure -relief sunken + set Priv($w,prelief) sunken + } elseif {[set over [$w cget -overrelief]] ne ""} { + $w configure -relief $over + set Priv($w,prelief) $over + } + } + set Priv(window) $w +} + +# ::tk::ButtonLeave -- +# The procedure below is invoked when the mouse pointer leaves a +# button widget. It changes the state of the button back to inactive. +# Restore any modified relief too. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonLeave w { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + $w configure -state normal + } + + # Restore the original button relief if it was changed by Tk. + # That is signaled by the existence of Priv($w,prelief). + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + set Priv(window) "" +} + +# ::tk::ButtonDown -- +# The procedure below is invoked when the mouse button is pressed in +# a button widget. It records the fact that the mouse is in the button, +# saves the button's relief so it can be restored later, and changes +# the relief to sunken. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonDown w { + variable ::tk::Priv + + # Only save the button's relief if it does not yet exist. If there + # is an overrelief setting, Priv($w,relief) will already have been set, + # and the current value of the -relief option will be incorrect. + + if {![info exists Priv($w,relief)]} { + set Priv($w,relief) [$w cget -relief] + } + + if {[$w cget -state] ne "disabled"} { + set Priv(buttonWindow) $w + $w configure -relief sunken + set Priv($w,prelief) sunken + + # If this button has a repeatdelay set up, get it going with an after + after cancel $Priv(afterId) + set delay [$w cget -repeatdelay] + set Priv(repeated) 0 + if {$delay > 0} { + set Priv(afterId) [after $delay [list tk::ButtonAutoInvoke $w]] + } + } +} + +# ::tk::ButtonUp -- +# The procedure below is invoked when the mouse button is released +# in a button widget. It restores the button's relief and invokes +# the command as long as the mouse hasn't left the button. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonUp w { + variable ::tk::Priv + if {$w eq $Priv(buttonWindow)} { + set Priv(buttonWindow) "" + + # Restore the button's relief if it was cached. + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + # Clean up the after event from the auto-repeater + after cancel $Priv(afterId) + + if {$Priv(window) eq $w && [$w cget -state] ne "disabled"} { + # Only invoke the command if it wasn't already invoked by the + # auto-repeater functionality + if { $Priv(repeated) == 0 } { + uplevel #0 [list $w invoke] + } + } + } +} + +} + +if {[tk windowingsystem] eq "aqua"} { + +#################### +# Mac implementation +#################### + +# ::tk::ButtonEnter -- +# The procedure below is invoked when the mouse pointer enters a +# button widget. It records the button we're in and changes the +# state of the button to active unless the button is disabled. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonEnter {w} { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + + # If there's an -overrelief value, set the relief to that. + + if {$Priv(buttonWindow) eq $w} { + $w configure -state active + } elseif {[set over [$w cget -overrelief]] ne ""} { + set Priv($w,relief) [$w cget -relief] + set Priv($w,prelief) $over + $w configure -relief $over + } + } + set Priv(window) $w +} + +# ::tk::ButtonLeave -- +# The procedure below is invoked when the mouse pointer leaves a +# button widget. It changes the state of the button back to +# inactive. If we're leaving the button window with a mouse button +# pressed (Priv(buttonWindow) == $w), restore the relief of the +# button too. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonLeave w { + variable ::tk::Priv + if {$w eq $Priv(buttonWindow)} { + $w configure -state normal + } + + # Restore the original button relief if it was changed by Tk. + # That is signaled by the existence of Priv($w,prelief). + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + set Priv(window) "" +} + +# ::tk::ButtonDown -- +# The procedure below is invoked when the mouse button is pressed in +# a button widget. It records the fact that the mouse is in the button, +# saves the button's relief so it can be restored later, and changes +# the relief to sunken. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonDown w { + variable ::tk::Priv + + if {[$w cget -state] ne "disabled"} { + set Priv(buttonWindow) $w + $w configure -state active + + # If this button has a repeatdelay set up, get it going with an after + after cancel $Priv(afterId) + set Priv(repeated) 0 + if { ![catch {$w cget -repeatdelay} delay] } { + if {$delay > 0} { + set Priv(afterId) [after $delay [list tk::ButtonAutoInvoke $w]] + } + } + } +} + +# ::tk::ButtonUp -- +# The procedure below is invoked when the mouse button is released +# in a button widget. It restores the button's relief and invokes +# the command as long as the mouse hasn't left the button. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonUp w { + variable ::tk::Priv + if {$Priv(buttonWindow) eq $w} { + set Priv(buttonWindow) "" + $w configure -state normal + + # Restore the button's relief if it was cached. + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + # Clean up the after event from the auto-repeater + after cancel $Priv(afterId) + + if {$Priv(window) eq $w && [$w cget -state] ne "disabled"} { + # Only invoke the command if it wasn't already invoked by the + # auto-repeater functionality + if { $Priv(repeated) == 0 } { + uplevel #0 [list $w invoke] + } + } + } +} + +} + +################## +# Shared routines +################## + +# ::tk::ButtonInvoke -- +# The procedure below is called when a button is invoked through +# the keyboard. It simulate a press of the button via the mouse. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonInvoke w { + if {[winfo exists $w] && [$w cget -state] ne "disabled"} { + set oldRelief [$w cget -relief] + set oldState [$w cget -state] + $w configure -state active -relief sunken + after 100 [list ::tk::ButtonInvokeEnd $w $oldState $oldRelief] + } +} + +# ::tk::ButtonInvokeEnd -- +# The procedure below is called after a button is invoked through +# the keyboard. It simulate a release of the button via the mouse. +# +# Arguments: +# w - The name of the widget. +# oldState - Old state to be set back. +# oldRelief - Old relief to be set back. + +proc ::tk::ButtonInvokeEnd {w oldState oldRelief} { + if {[winfo exists $w]} { + $w configure -state $oldState -relief $oldRelief + uplevel #0 [list $w invoke] + } +} + +# ::tk::ButtonAutoInvoke -- +# +# Invoke an auto-repeating button, and set it up to continue to repeat. +# +# Arguments: +# w button to invoke. +# +# Results: +# None. +# +# Side effects: +# May create an after event to call ::tk::ButtonAutoInvoke. + +proc ::tk::ButtonAutoInvoke {w} { + variable ::tk::Priv + after cancel $Priv(afterId) + set delay [$w cget -repeatinterval] + if {$Priv(window) eq $w} { + incr Priv(repeated) + uplevel #0 [list $w invoke] + } + if {$delay > 0} { + set Priv(afterId) [after $delay [list tk::ButtonAutoInvoke $w]] + } +} + +# ::tk::CheckRadioInvoke -- +# The procedure below is invoked when the mouse button is pressed in +# a checkbutton or radiobutton widget, or when the widget is invoked +# through the keyboard. It invokes the widget if it +# isn't disabled. +# +# Arguments: +# w - The name of the widget. +# cmd - The subcommand to invoke (one of invoke, select, or deselect). + +proc ::tk::CheckRadioInvoke {w {cmd invoke}} { + if {[$w cget -state] ne "disabled"} { + uplevel #0 [list $w $cmd] + } +} + +# Special versions of the handlers for checkbuttons on Unix that do the magic +# to make things work right when the checkbutton indicator is hidden; +# radiobuttons don't need this complexity. + +# ::tk::CheckInvoke -- +# The procedure below invokes the checkbutton, like ButtonInvoke, but handles +# what to do when the checkbutton indicator is missing. Only used on Unix. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::CheckInvoke {w} { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + # Additional logic to switch the "selected" colors around if necessary + # (when we're indicator-less). + + if {![$w cget -indicatoron] && [info exist Priv($w,selectcolor)]} { + if {[$w cget -selectcolor] eq $Priv($w,aselectcolor)} { + $w configure -selectcolor $Priv($w,selectcolor) + } else { + $w configure -selectcolor $Priv($w,aselectcolor) + } + } + uplevel #0 [list $w invoke] + } +} + +# ::tk::CheckEnter -- +# The procedure below enters the checkbutton, like ButtonEnter, but handles +# what to do when the checkbutton indicator is missing. Only used on Unix. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::CheckEnter {w} { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + # On unix the state is active just with mouse-over + $w configure -state active + + # If the mouse button is down, set the relief to sunken on entry. + # Overwise, if there's an -overrelief value, set the relief to that. + + set Priv($w,relief) [$w cget -relief] + if {$Priv(buttonWindow) eq $w} { + $w configure -relief sunken + set Priv($w,prelief) sunken + } elseif {[set over [$w cget -overrelief]] ne ""} { + $w configure -relief $over + set Priv($w,prelief) $over + } + + # Compute what the "selected and active" color should be. + + if {![$w cget -indicatoron] && [$w cget -selectcolor] ne ""} { + set Priv($w,selectcolor) [$w cget -selectcolor] + lassign [winfo rgb $w [$w cget -selectcolor]] r1 g1 b1 + lassign [winfo rgb $w [$w cget -activebackground]] r2 g2 b2 + set Priv($w,aselectcolor) \ + [format "#%04x%04x%04x" [expr {($r1+$r2)/2}] \ + [expr {($g1+$g2)/2}] [expr {($b1+$b2)/2}]] + # use uplevel to work with other var resolvers + if {[uplevel #0 [list set [$w cget -variable]]] + eq [$w cget -onvalue]} { + $w configure -selectcolor $Priv($w,aselectcolor) + } + } + } + set Priv(window) $w +} + +# ::tk::CheckLeave -- +# The procedure below leaves the checkbutton, like ButtonLeave, but handles +# what to do when the checkbutton indicator is missing. Only used on Unix. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::CheckLeave {w} { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + $w configure -state normal + } + + # Restore the original button "selected" color; but only if the user + # has not changed it in the meantime. + + if {![$w cget -indicatoron] && [info exist Priv($w,selectcolor)]} { + if {[$w cget -selectcolor] eq $Priv($w,selectcolor) + || ([info exist Priv($w,aselectcolor)] && + [$w cget -selectcolor] eq $Priv($w,aselectcolor))} { + $w configure -selectcolor $Priv($w,selectcolor) + } + } + unset -nocomplain Priv($w,selectcolor) Priv($w,aselectcolor) + + # Restore the original button relief if it was changed by Tk. That is + # signaled by the existence of Priv($w,prelief). + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + set Priv(window) "" +} + +return + +# Local Variables: +# mode: tcl +# fill-column: 78 +# End: diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/choosedir.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/choosedir.tcl new file mode 100644 index 00000000..b7225b6c --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/choosedir.tcl @@ -0,0 +1,310 @@ +# choosedir.tcl -- +# +# Choose directory dialog implementation for Unix/Mac. +# +# Copyright © 1998-2000 Scriptics Corporation. +# All rights reserved. + +# Make sure the tk::dialog namespace, in which all dialogs should live, exists +namespace eval ::tk::dialog {} +namespace eval ::tk::dialog::file {} + +# Make the chooseDir namespace inside the dialog namespace +namespace eval ::tk::dialog::file::chooseDir { + namespace import -force ::tk::msgcat::* +} + +# ::tk::dialog::file::chooseDir:: -- +# +# Implements the TK directory selection dialog. +# +# Arguments: +# args Options parsed by the procedure. +# +proc ::tk::dialog::file::chooseDir:: {args} { + variable ::tk::Priv + set dataName __tk_choosedir + upvar ::tk::dialog::file::$dataName data + Config $dataName $args + + if {$data(-parent) eq "."} { + set w .$dataName + } else { + set w $data(-parent).$dataName + } + + # (re)create the dialog box if necessary + # + if {![winfo exists $w]} { + ::tk::dialog::file::Create $w TkChooseDir + } elseif {[winfo class $w] ne "TkChooseDir"} { + destroy $w + ::tk::dialog::file::Create $w TkChooseDir + } else { + set data(dirMenuBtn) $w.contents.f1.menu + set data(dirMenu) $w.contents.f1.menu.menu + set data(upBtn) $w.contents.f1.up + set data(icons) $w.contents.icons + set data(ent) $w.contents.f2.ent + set data(okBtn) $w.contents.f2.ok + set data(cancelBtn) $w.contents.f2.cancel + set data(hiddenBtn) $w.contents.f2.hidden + } + if {$::tk::dialog::file::showHiddenBtn} { + $data(hiddenBtn) configure -state normal + grid $data(hiddenBtn) + } else { + $data(hiddenBtn) configure -state disabled + grid remove $data(hiddenBtn) + } + + # When using -mustexist, manage the OK button state for validity + $data(okBtn) configure -state normal + if {$data(-mustexist)} { + $data(ent) configure -validate key \ + -validatecommand [list ::tk::dialog::file::chooseDir::IsOK? $w %P] + } else { + $data(ent) configure -validate none + } + + # Dialog boxes should be transient with respect to their parent, + # so that they will always stay on top of their parent window. However, + # some window managers will create the window as withdrawn if the parent + # window is withdrawn or iconified. Combined with the grab we put on the + # window, this can hang the entire application. Therefore we only make + # the dialog transient if the parent is viewable. + + if {[winfo viewable [winfo toplevel $data(-parent)]] } { + wm transient $w $data(-parent) + } + + trace add variable data(selectPath) write \ + [list ::tk::dialog::file::SetPath $w] + $data(dirMenuBtn) configure \ + -textvariable ::tk::dialog::file::${dataName}(selectPath) + + set data(filter) "*" + set data(previousEntryText) "" + ::tk::dialog::file::UpdateWhenIdle $w + + # Withdraw the window, then update all the geometry information + # so we know how big it wants to be, then center the window in the + # display (Motif style) and de-iconify it. + + ::tk::PlaceWindow $w widget $data(-parent) + wm title $w $data(-title) + + # Set a grab and claim the focus too. + + ::tk::SetFocusGrab $w $data(ent) + $data(ent) delete 0 end + $data(ent) insert 0 $data(selectPath) + $data(ent) selection range 0 end + $data(ent) icursor end + + # Wait for the user to respond, then restore the focus and + # return the index of the selected button. Restore the focus + # before deleting the window, since otherwise the window manager + # may take the focus away so we can't redirect it. Finally, + # restore any grab that was in effect. + + vwait ::tk::Priv(selectFilePath) + + ::tk::RestoreFocusGrab $w $data(ent) withdraw + + # Cleanup traces on selectPath variable + # + + foreach trace [trace info variable data(selectPath)] { + trace remove variable data(selectPath) [lindex $trace 0] [lindex $trace 1] + } + if {[winfo exists $data(dirMenuBtn)]} { + $data(dirMenuBtn) configure -textvariable {} + } + + # Return value to user + # + + return $Priv(selectFilePath) +} + +# ::tk::dialog::file::chooseDir::Config -- +# +# Configures the Tk choosedir dialog according to the argument list +# +proc ::tk::dialog::file::chooseDir::Config {dataName argList} { + upvar ::tk::dialog::file::$dataName data + + # 0: Delete all variable that were set on data(selectPath) the + # last time the file dialog is used. The traces may cause troubles + # if the dialog is now used with a different -parent option. + # + foreach trace [trace info variable data(selectPath)] { + trace remove variable data(selectPath) [lindex $trace 0] [lindex $trace 1] + } + + # 1: the configuration specs + # + set specs { + {-mustexist "" "" 0} + {-initialdir "" "" ""} + {-parent "" "" "."} + {-title "" "" ""} + } + + # 2: default values depending on the type of the dialog + # + if {![info exists data(selectPath)]} { + # first time the dialog has been popped up + set data(selectPath) [pwd] + } + + # 3: parse the arguments + # + tclParseConfigSpec ::tk::dialog::file::$dataName $specs "" $argList + + if {$data(-title) eq ""} { + set data(-title) "[mc "Choose Directory"]" + } + + # Stub out the -multiple value for the dialog; it doesn't make sense for + # choose directory dialogs, but we have to have something there because we + # share so much code with the file dialogs. + set data(-multiple) 0 + + # 4: set the default directory and selection according to the -initial + # settings + # + if {$data(-initialdir) ne ""} { + # Ensure that initialdir is an absolute path name. + if {[file isdirectory $data(-initialdir)]} { + set old [pwd] + cd $data(-initialdir) + set data(selectPath) [pwd] + cd $old + } else { + set data(selectPath) [pwd] + } + } + + if {![winfo exists $data(-parent)]} { + return -code error -errorcode [list TK LOOKUP WINDOW $data(-parent)] \ + "bad window path name \"$data(-parent)\"" + } +} + +# Gets called when user presses Return in the "Selection" entry or presses OK. +# +proc ::tk::dialog::file::chooseDir::OkCmd {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + # This is the brains behind selecting non-existant directories. Here's + # the flowchart: + # 1. If the icon list has a selection, join it with the current dir, + # and return that value. + # 1a. If the icon list does not have a selection ... + # 2. If the entry is empty, do nothing. + # 3. If the entry contains an invalid directory, then... + # 3a. If the value is the same as last time through here, end dialog. + # 3b. If the value is different than last time, save it and return. + # 4. If entry contains a valid directory, then... + # 4a. If the value is the same as the current directory, end dialog. + # 4b. If the value is different from the current directory, change to + # that directory. + + set selection [$data(icons) selection get] + if {[llength $selection] != 0} { + set iconText [$data(icons) get [lindex $selection 0]] + set iconText [file join $data(selectPath) $iconText] + Done $w $iconText + } else { + set text [$data(ent) get] + if {$text eq ""} { + return + } + set text [file join {*}[file split [string trim $text]]] + if {![file exists $text] || ![file isdirectory $text]} { + # Entry contains an invalid directory. If it's the same as the + # last time they came through here, reset the saved value and end + # the dialog. Otherwise, save the value (so we can do this test + # next time). + if {$text eq $data(previousEntryText)} { + set data(previousEntryText) "" + Done $w $text + } else { + set data(previousEntryText) $text + } + } else { + # Entry contains a valid directory. If it is the same as the + # current directory, end the dialog. Otherwise, change to that + # directory. + if {$text eq $data(selectPath)} { + Done $w $text + } else { + set data(selectPath) $text + } + } + } + return +} + +# Change state of OK button to match -mustexist correctness of entry +# +proc ::tk::dialog::file::chooseDir::IsOK? {w text} { + upvar ::tk::dialog::file::[winfo name $w] data + + set ok [file isdirectory $text] + $data(okBtn) configure -state [expr {$ok ? "normal" : "disabled"}] + + # always return 1 + return 1 +} + +proc ::tk::dialog::file::chooseDir::DblClick {w} { + upvar ::tk::dialog::file::[winfo name $w] data + set selection [$data(icons) selection get] + if {[llength $selection] != 0} { + set filenameFragment [$data(icons) get [lindex $selection 0]] + set file $data(selectPath) + if {[file isdirectory $file]} { + ::tk::dialog::file::ListInvoke $w [list $filenameFragment] + return + } + } +} + +# Gets called when user browses the IconList widget (dragging mouse, arrow +# keys, etc) +# +proc ::tk::dialog::file::chooseDir::ListBrowse {w text} { + upvar ::tk::dialog::file::[winfo name $w] data + + if {$text eq ""} { + return + } + + set file [::tk::dialog::file::JoinFile $data(selectPath) $text] + $data(ent) delete 0 end + $data(ent) insert 0 $file +} + +# ::tk::dialog::file::chooseDir::Done -- +# +# Gets called when user has input a valid filename. Pops up a +# dialog box to confirm selection when necessary. Sets the +# Priv(selectFilePath) variable, which will break the "vwait" +# loop in tk_chooseDirectory and return the selected filename to the +# script that calls tk_getOpenFile or tk_getSaveFile +# +proc ::tk::dialog::file::chooseDir::Done {w {selectFilePath ""}} { + upvar ::tk::dialog::file::[winfo name $w] data + variable ::tk::Priv + + if {$selectFilePath eq ""} { + set selectFilePath $data(selectPath) + } + if {$data(-mustexist) && ![file isdirectory $selectFilePath]} { + return + } + set Priv(selectFilePath) $selectFilePath +} diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/clrpick.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/clrpick.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/clrpick.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/clrpick.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/comdlg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/comdlg.tcl new file mode 100644 index 00000000..25e1b1fd --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/comdlg.tcl @@ -0,0 +1,322 @@ +# comdlg.tcl -- +# +# Some functions needed for the common dialog boxes. Probably need to go +# in a different file. +# +# Copyright © 1996 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# tclParseConfigSpec -- +# +# Parses a list of "-option value" pairs. If all options and +# values are legal, the values are stored in +# $data($option). Otherwise an error message is returned. When +# an error happens, the data() array may have been partially +# modified, but all the modified members of the data(0 array are +# guaranteed to have valid values. This is different than +# Tk_ConfigureWidget() which does not modify the value of a +# widget record if any error occurs. +# +# Arguments: +# +# w = widget record to modify. Must be the pathname of a widget. +# +# specs = { +# {-commandlineswitch resourceName ResourceClass defaultValue verifier} +# {....} +# } +# +# flags = a list of flags. Currently supported flags are: +# DONTSETDEFAULTS = skip default values setting +# +# argList = The list of "-option value" pairs. +# +proc tclParseConfigSpec {w specs flags argList} { + upvar #0 $w data + + # 1: Put the specs in associative arrays for faster access + # + foreach spec $specs { + if {[llength $spec] < 4} { + return -code error -errorcode {TK VALUE CONFIG_SPEC} \ + "\"spec\" should contain 5 or 4 elements" + } + set cmdsw [lindex $spec 0] + set cmd($cmdsw) "" + set rname($cmdsw) [lindex $spec 1] + set rclass($cmdsw) [lindex $spec 2] + set def($cmdsw) [lindex $spec 3] + set verproc($cmdsw) [lindex $spec 4] + } + + if {[llength $argList] & 1} { + set cmdsw [lindex $argList end] + if {![info exists cmd($cmdsw)]} { + return -code error -errorcode [list TK LOOKUP OPTION $cmdsw] \ + "bad option \"$cmdsw\": must be [tclListValidFlags cmd]" + } + return -code error -errorcode {TK VALUE_MISSING} \ + "value for \"$cmdsw\" missing" + } + + # 2: set the default values + # + if {"DONTSETDEFAULTS" ni $flags} { + foreach cmdsw [array names cmd] { + set data($cmdsw) $def($cmdsw) + } + } + + # 3: parse the argument list + # + foreach {cmdsw value} $argList { + if {![info exists cmd($cmdsw)]} { + return -code error -errorcode [list TK LOOKUP OPTION $cmdsw] \ + "bad option \"$cmdsw\": must be [tclListValidFlags cmd]" + } + set data($cmdsw) $value + } + + # Done! +} + +proc tclListValidFlags {v} { + upvar $v cmd + + set len [llength [array names cmd]] + set i 1 + set separator "" + set errormsg "" + foreach cmdsw [lsort [array names cmd]] { + append errormsg "$separator$cmdsw" + incr i + if {$i == $len} { + set separator ", or " + } else { + set separator ", " + } + } + return $errormsg +} + +#---------------------------------------------------------------------- +# +# Focus Group +# +# Focus groups are used to handle the user's focusing actions inside a +# toplevel. +# +# One example of using focus groups is: when the user focuses on an +# entry, the text in the entry is highlighted and the cursor is put to +# the end of the text. When the user changes focus to another widget, +# the text in the previously focused entry is validated. +# +#---------------------------------------------------------------------- + + +# ::tk::FocusGroup_Create -- +# +# Create a focus group. All the widgets in a focus group must be +# within the same focus toplevel. Each toplevel can have only +# one focus group, which is identified by the name of the +# toplevel widget. +# +proc ::tk::FocusGroup_Create {t} { + variable ::tk::Priv + if {[winfo toplevel $t] ne $t} { + return -code error -errorcode [list TK LOOKUP TOPLEVEL $t] \ + "$t is not a toplevel window" + } + if {![info exists Priv(fg,$t)]} { + set Priv(fg,$t) 1 + set Priv(focus,$t) "" + bind $t [list tk::FocusGroup_In $t %W %d] + bind $t [list tk::FocusGroup_Out $t %W %d] + bind $t [list tk::FocusGroup_Destroy $t %W] + } +} + +# ::tk::FocusGroup_BindIn -- +# +# Add a widget into the "FocusIn" list of the focus group. The $cmd will be +# called when the widget is focused on by the user. +# +proc ::tk::FocusGroup_BindIn {t w cmd} { + variable FocusIn + variable ::tk::Priv + if {![info exists Priv(fg,$t)]} { + return -code error -errorcode [list TK LOOKUP FOCUS_GROUP $t] \ + "focus group \"$t\" does not exist" + } + set FocusIn($t,$w) $cmd +} + + +# ::tk::FocusGroup_BindOut -- +# +# Add a widget into the "FocusOut" list of the focus group. The +# $cmd will be called when the widget loses the focus (User +# types Tab or click on another widget). +# +proc ::tk::FocusGroup_BindOut {t w cmd} { + variable FocusOut + variable ::tk::Priv + if {![info exists Priv(fg,$t)]} { + return -code error -errorcode [list TK LOOKUP FOCUS_GROUP $t] \ + "focus group \"$t\" does not exist" + } + set FocusOut($t,$w) $cmd +} + +# ::tk::FocusGroup_Destroy -- +# +# Cleans up when members of the focus group is deleted, or when the +# toplevel itself gets deleted. +# +proc ::tk::FocusGroup_Destroy {t w} { + variable FocusIn + variable FocusOut + variable ::tk::Priv + + if {$t eq $w} { + unset Priv(fg,$t) + unset Priv(focus,$t) + + foreach name [array names FocusIn $t,*] { + unset FocusIn($name) + } + foreach name [array names FocusOut $t,*] { + unset FocusOut($name) + } + } else { + if {[info exists Priv(focus,$t)] && ($Priv(focus,$t) eq $w)} { + set Priv(focus,$t) "" + } + unset -nocomplain FocusIn($t,$w) FocusOut($t,$w) + } +} + +# ::tk::FocusGroup_In -- +# +# Handles the event. Calls the FocusIn command for the newly +# focused widget in the focus group. +# +proc ::tk::FocusGroup_In {t w detail} { + variable FocusIn + variable ::tk::Priv + + if {$detail ne "NotifyNonlinear" && $detail ne "NotifyNonlinearVirtual"} { + # This is caused by mouse moving out&in of the window *or* + # ordinary keypresses some window managers (ie: CDE [Bug: 2960]). + return + } + if {![info exists FocusIn($t,$w)]} { + set FocusIn($t,$w) "" + return + } + if {![info exists Priv(focus,$t)]} { + return + } + if {$Priv(focus,$t) eq $w} { + # This is already in focus + # + return + } else { + set Priv(focus,$t) $w + eval $FocusIn($t,$w) + } +} + +# ::tk::FocusGroup_Out -- +# +# Handles the event. Checks if this is really a lose +# focus event, not one generated by the mouse moving out of the +# toplevel window. Calls the FocusOut command for the widget +# who loses its focus. +# +proc ::tk::FocusGroup_Out {t w detail} { + variable FocusOut + variable ::tk::Priv + + if {$detail ne "NotifyNonlinear" && $detail ne "NotifyNonlinearVirtual"} { + # This is caused by mouse moving out of the window + return + } + if {![info exists Priv(focus,$t)]} { + return + } + if {![info exists FocusOut($t,$w)]} { + return + } else { + eval $FocusOut($t,$w) + set Priv(focus,$t) "" + } +} + +# ::tk::FDGetFileTypes -- +# +# Process the string given by the -filetypes option of the file +# dialogs. Similar to the C function TkGetFileFilters() on the Mac +# and Windows platform. +# +proc ::tk::FDGetFileTypes {string} { + foreach t $string { + if {[llength $t] < 2 || [llength $t] > 3} { + return -code error -errorcode {TK VALUE FILE_TYPE} \ + "bad file type \"$t\", should be \"typeName {extension ?extensions ...?} ?{macType ?macTypes ...?}?\"" + } + lappend fileTypes([lindex $t 0]) {*}[lindex $t 1] + } + + set types {} + foreach t $string { + set label [lindex $t 0] + set exts {} + + if {[info exists hasDoneType($label)]} { + continue + } + + # Validate each macType. This is to agree with the + # behaviour of TkGetFileFilters(). This list may be + # empty. + foreach macType [lindex $t 2] { + if {[string length $macType] != 4} { + return -code error -errorcode {TK VALUE MAC_TYPE} \ + "bad Macintosh file type \"$macType\"" + } + } + + set name "$label \(" + set sep "" + set doAppend 1 + foreach ext $fileTypes($label) { + if {$ext eq ""} { + continue + } + regsub {^[.]} $ext "*." ext + if {![info exists hasGotExt($label,$ext)]} { + if {$doAppend} { + if {[string length $sep] && [string length $name]>40} { + set doAppend 0 + append name $sep... + } else { + append name $sep$ext + } + } + lappend exts $ext + set hasGotExt($label,$ext) 1 + } + set sep "," + } + append name "\)" + lappend types [list $name $exts] + + set hasDoneType($label) 1 + } + + return $types +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/console.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/console.tcl new file mode 100644 index 00000000..37a06538 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/console.tcl @@ -0,0 +1,1148 @@ +# console.tcl -- +# +# This code constructs the console window for an application. It +# can be used by non-unix systems that do not have built-in support +# for shells. +# +# Copyright © 1995-1997 Sun Microsystems, Inc. +# Copyright © 1998-2000 Ajuba Solutions. +# Copyright © 2007-2008 Daniel A. Steffen +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# TODO: history - remember partially written command + +namespace eval ::tk::console { + variable blinkTime 500 ; # msecs to blink braced range for + variable blinkRange 1 ; # enable blinking of the entire braced range + variable magicKeys 1 ; # enable brace matching and proc/var recognition + variable maxLines 600 ; # maximum # of lines buffered in console + variable showMatches 1 ; # show multiple expand matches + variable useFontchooser [llength [info command ::tk::fontchooser]] + variable inPlugin [info exists embed_args] + variable defaultPrompt ; # default prompt if tcl_prompt1 isn't used + + if {$inPlugin} { + set defaultPrompt {subst {[history nextid] % }} + } else { + set defaultPrompt {subst {([file tail [pwd]]) [history nextid] % }} + } +} + +# simple compat function for tkcon code added for this console +interp alias {} EvalAttached {} consoleinterp eval + +# ::tk::ConsoleInit -- +# This procedure constructs and configures the console windows. +# +# Arguments: +# None. + +proc ::tk::ConsoleInit {} { + if {![consoleinterp eval {set tcl_interactive}]} { + wm withdraw . + } + + if {[tk windowingsystem] eq "aqua"} { + set mod "Cmd" + } else { + set mod "Ctrl" + } + + if {[catch {menu .menubar} err]} { + bgerror "INIT: $err" + } + AmpMenuArgs .menubar add cascade -label [mc &File] -menu .menubar.file + AmpMenuArgs .menubar add cascade -label [mc &Edit] -menu .menubar.edit + + menu .menubar.file -tearoff 0 + AmpMenuArgs .menubar.file add command -label [mc "&Source..."] \ + -command {tk::ConsoleSource} + AmpMenuArgs .menubar.file add command -label [mc "&Hide Console"] \ + -command {wm withdraw .} + AmpMenuArgs .menubar.file add command -label [mc "&Clear Console"] \ + -command {.console delete 1.0 "promptEnd linestart"} + if {[tk windowingsystem] ne "aqua"} { + AmpMenuArgs .menubar.file add command -label [mc E&xit] -command {exit} + } + + menu .menubar.edit -tearoff 0 + AmpMenuArgs .menubar.edit add command -label [mc Cu&t] -accel "$mod+X"\ + -command {event generate .console <>} + AmpMenuArgs .menubar.edit add command -label [mc &Copy] -accel "$mod+C"\ + -command {event generate .console <>} + AmpMenuArgs .menubar.edit add command -label [mc P&aste] -accel "$mod+V"\ + -command {event generate .console <>} + + if {[tk windowingsystem] ne "win32"} { + AmpMenuArgs .menubar.edit add command -label [mc Cl&ear] \ + -command {event generate .console <>} + } else { + AmpMenuArgs .menubar.edit add command -label [mc &Delete] \ + -command {event generate .console <>} -accel "Del" + + AmpMenuArgs .menubar add cascade -label [mc &Help] -menu .menubar.help + menu .menubar.help -tearoff 0 + AmpMenuArgs .menubar.help add command -label [mc &About...] \ + -command tk::ConsoleAbout + } + + AmpMenuArgs .menubar.edit add separator + if {$::tk::console::useFontchooser} { + if {[tk windowingsystem] eq "aqua"} { + .menubar.edit add command -label tk_choose_font_marker + set index [.menubar.edit index tk_choose_font_marker] + .menubar.edit entryconfigure $index \ + -label [mc "Show Fonts"]\ + -accelerator "$mod-T"\ + -command [list ::tk::console::FontchooserToggle] + bind Console <> \ + [list ::tk::console::FontchooserVisibility $index] + ::tk::console::FontchooserVisibility $index + } else { + AmpMenuArgs .menubar.edit add command -label [mc "&Font..."] \ + -command [list ::tk::console::FontchooserToggle] + } + bind Console [list ::tk::console::FontchooserFocus %W 1] + bind Console [list ::tk::console::FontchooserFocus %W 0] + } + AmpMenuArgs .menubar.edit add command -label [mc "&Increase Font Size"] \ + -accel "$mod++" -command {event generate .console <>} + AmpMenuArgs .menubar.edit add command -label [mc "&Decrease Font Size"] \ + -accel "$mod+-" -command {event generate .console <>} + AmpMenuArgs .menubar.edit add command -label [mc "Fit To Screen Width"] \ + -command {event generate .console <>} + + if {[tk windowingsystem] eq "aqua"} { + .menubar add cascade -label [mc Window] -menu [menu .menubar.window] + .menubar add cascade -label [mc Help] -menu [menu .menubar.help] + } + + . configure -menu .menubar + + # See if we can find a better font than the TkFixedFont + catch {font create TkConsoleFont {*}[font configure TkFixedFont]} + set families [font families] + switch -exact -- [tk windowingsystem] { + aqua { set preferred {Monaco 10} } + win32 { set preferred {ProFontWindows 8 Consolas 8} } + default { set preferred {} } + } + foreach {family size} $preferred { + if {$family in $families} { + font configure TkConsoleFont -family $family -size $size + break + } + } + + # Provide the right border for the text widget (platform dependent). + ::ttk::style layout ConsoleFrame { + Entry.field -sticky news -border 1 -children { + ConsoleFrame.padding -sticky news + } + } + ::ttk::frame .consoleframe -style ConsoleFrame + + set con [text .console -yscrollcommand [list .sb set] -setgrid 1 \ + -borderwidth 0 -highlightthickness 0 -font TkConsoleFont] + if {[tk windowingsystem] eq "aqua"} { + scrollbar .sb -command [list $con yview] + } else { + ::ttk::scrollbar .sb -command [list $con yview] + } + pack .sb -in .consoleframe -fill both -side right -padx 1 -pady 1 + pack $con -in .consoleframe -fill both -expand 1 -side left -padx 1 -pady 1 + pack .consoleframe -fill both -expand 1 -side left + + ConsoleBind $con + + if {[tk windowingsystem] eq "aqua"} { + $con tag configure stdin -foreground systemLinkColor + } else { + $con tag configure stdin -foreground blue + } + + $con tag configure stderr -foreground red + $con tag configure prompt -foreground \#8F4433 + $con tag configure proc -foreground \#008800 + $con tag configure var -background \#FFC0D0 + $con tag raise sel + $con tag configure blink -background \#FFFF00 + $con tag configure find -background \#FFFF00 + + focus $con + + # Avoid listing this console in [winfo interps] + if {[info command ::send] eq "::send"} {rename ::send {}} + + wm protocol . WM_DELETE_WINDOW { wm withdraw . } + wm title . [mc "Console"] + flush stdout + $con mark set output [$con index "end - 1 char"] + tk::TextSetCursor $con end + $con mark set promptEnd insert + $con mark gravity promptEnd left + + # A variant of ConsolePrompt to avoid a 'puts' call + set w $con + set temp [$w index "end - 1 char"] + $w mark set output end + if {![consoleinterp eval "info exists tcl_prompt1"]} { + set string [EvalAttached $::tk::console::defaultPrompt] + $w insert output $string stdout + } + $w mark set output $temp + ::tk::TextSetCursor $w end + $w mark set promptEnd insert + $w mark gravity promptEnd left + + if {[tk windowingsystem] ne "aqua"} { + # Subtle work-around to erase the '% ' that tclMain.c prints out + after idle [subst -nocommand { + if {[$con get 1.0 output] eq "% "} { $con delete 1.0 output } + }] + } +} + +# ::tk::ConsoleSource -- +# +# Prompts the user for a file to source in the main interpreter. +# +# Arguments: +# None. + +proc ::tk::ConsoleSource {} { + set filename [tk_getOpenFile -defaultextension .tcl -parent . \ + -title [mc "Select a file to source"] \ + -filetypes [list \ + [list [mc "Tcl Scripts"] .tcl] \ + [list [mc "All Files"] *]]] + if {$filename ne ""} { + set cmd [list source -encoding utf-8 $filename] + if {[catch {consoleinterp eval $cmd} result]} { + ConsoleOutput stderr "$result\n" + } + } +} + +# ::tk::ConsoleInvoke -- +# Processes the command line input. If the command is complete it +# is evaled in the main interpreter. Otherwise, the continuation +# prompt is added and more input may be added. +# +# Arguments: +# None. + +proc ::tk::ConsoleInvoke {args} { + set ranges [.console tag ranges input] + set cmd "" + if {[llength $ranges]} { + set pos 0 + while {[lindex $ranges $pos] ne ""} { + set start [lindex $ranges $pos] + set end [lindex $ranges [incr pos]] + append cmd [.console get $start $end] + incr pos + } + } + if {$cmd eq ""} { + ConsolePrompt + } elseif {[info complete $cmd]} { + .console mark set output end + .console tag delete input + set result [consoleinterp record $cmd] + if {$result ne ""} { + puts $result + } + ConsoleHistory reset + ConsolePrompt + } else { + ConsolePrompt partial + } + .console yview -pickplace insert +} + +# ::tk::ConsoleHistory -- +# This procedure implements command line history for the +# console. In general is evals the history command in the +# main interpreter to obtain the history. The variable +# ::tk::HistNum is used to store the current location in the history. +# +# Arguments: +# cmd - Which action to take: prev, next, reset. + +set ::tk::HistNum 1 +proc ::tk::ConsoleHistory {cmd} { + variable HistNum + + switch $cmd { + prev { + incr HistNum -1 + if {$HistNum == 0} { + set cmd {history event [expr {[history nextid] -1}]} + } else { + set cmd "history event $HistNum" + } + if {[catch {consoleinterp eval $cmd} cmd]} { + incr HistNum + return + } + .console delete promptEnd end + .console insert promptEnd $cmd {input stdin} + .console see end + } + next { + incr HistNum + if {$HistNum == 0} { + set cmd {history event [expr {[history nextid] -1}]} + } elseif {$HistNum > 0} { + set cmd "" + set HistNum 1 + } else { + set cmd "history event $HistNum" + } + if {$cmd ne ""} { + catch {consoleinterp eval $cmd} cmd + } + .console delete promptEnd end + .console insert promptEnd $cmd {input stdin} + .console see end + } + reset { + set HistNum 1 + } + } +} + +# ::tk::ConsolePrompt -- +# This procedure draws the prompt. If tcl_prompt1 or tcl_prompt2 +# exists in the main interpreter it will be called to generate the +# prompt. Otherwise, a hard coded default prompt is printed. +# +# Arguments: +# partial - Flag to specify which prompt to print. + +proc ::tk::ConsolePrompt {{partial normal}} { + set w .console + if {$partial eq "normal"} { + set temp [$w index "end - 1 char"] + $w mark set output end + if {[consoleinterp eval "info exists tcl_prompt1"]} { + consoleinterp eval "eval \[set tcl_prompt1\]" + } else { + puts -nonewline [EvalAttached $::tk::console::defaultPrompt] + } + } else { + set temp [$w index output] + $w mark set output end + if {[consoleinterp eval "info exists tcl_prompt2"]} { + consoleinterp eval "eval \[set tcl_prompt2\]" + } else { + puts -nonewline "> " + } + } + flush stdout + $w mark set output $temp + ::tk::TextSetCursor $w end + $w mark set promptEnd insert + $w mark gravity promptEnd left + ::tk::console::ConstrainBuffer $w $::tk::console::maxLines + $w see end +} + +# Copy selected text from the console +proc ::tk::console::Copy {w} { + if {![catch {set data [$w get sel.first sel.last]}]} { + clipboard clear -displayof $w + clipboard append -displayof $w $data + } +} +# Copies selected text. If the selection is within the current active edit +# region then it will be cut, if not it is only copied. +proc ::tk::console::Cut {w} { + if {![catch {set data [$w get sel.first sel.last]}]} { + clipboard clear -displayof $w + clipboard append -displayof $w $data + if {[$w compare sel.first >= output]} { + $w delete sel.first sel.last + } + } +} +# Paste text from the clipboard +proc ::tk::console::Paste {w} { + catch { + set clip [::tk::GetSelection $w CLIPBOARD] + set list [split $clip \n\r] + tk::ConsoleInsert $w [lindex $list 0] + foreach x [lrange $list 1 end] { + $w mark set insert {end - 1c} + tk::ConsoleInsert $w "\n" + tk::ConsoleInvoke + tk::ConsoleInsert $w $x + } + } +} + +# Fit TkConsoleFont to window width +proc ::tk::console::FitScreenWidth {w} { + set width [winfo screenwidth $w] + set cwidth [$w cget -width] + set s -50 + set fit 0 + array set fi [font configure TkConsoleFont] + while {$s < 0} { + set fi(-size) $s + set f [font create {*}[array get fi]] + set c [font measure $f "eM"] + font delete $f + if {$c * $cwidth < 1.667 * $width} { + font configure TkConsoleFont -size $s + break + } + incr s 2 + } +} + +# ::tk::ConsoleBind -- +# This procedure first ensures that the default bindings for the Text +# class have been defined. Then certain bindings are overridden for +# the class. +# +# Arguments: +# None. + +proc ::tk::ConsoleBind {w} { + bindtags $w [list $w Console PostConsole [winfo toplevel $w] all] + + ## Get all Text bindings into Console + foreach ev [bind Text] { + bind Console $ev [bind Text $ev] + } + ## We really didn't want the newline insertion... + bind Console {} + ## ...or any Control-v binding (would block <>) + bind Console {} + + # For the moment, transpose isn't enabled until the console + # gets and overhaul of how it handles input -- hobbs + bind Console {} + + # Ignore all Alt, Meta, Control, Command, and Fn keypresses unless explicitly bound. + # Otherwise, if a widget binding for one of these is defined, the + # class binding will also fire and insert the character + # which is wrong. + + bind Console {# nothing } + bind Console {# nothing} + bind Console {# nothing} + bind Console {# nothing} + bind Console {# nothing} + + foreach {ev key} { + <> + <> + <> + <> + + <> + <> + <> + <> + <> + <> + <> + <> + <> + + <> + <> + <> + <> + <> + <> + <> + <> + <> + } { + event add $ev $key + bind Console $key {} + } + if {$::tk::console::useFontchooser} { + bind Console [list ::tk::console::FontchooserToggle] + } + bind Console <> { + if {[%W compare insert > promptEnd]} { + ::tk::console::Expand %W + } + } + bind Console <> { + if {[%W compare insert > promptEnd]} { + ::tk::console::Expand %W path + } + } + bind Console <> { + if {[%W compare insert > promptEnd]} { + ::tk::console::Expand %W proc + } + } + bind Console <> { + if {[%W compare insert > promptEnd]} { + ::tk::console::Expand %W var + } + } + bind Console <> { + %W mark set insert {end - 1c} + tk::ConsoleInsert %W "\n" + tk::ConsoleInvoke + break + } + bind Console { + if {{} ne [%W tag nextrange sel 1.0 end] \ + && [%W compare sel.first >= promptEnd]} { + %W delete sel.first sel.last + } elseif {[%W compare insert >= promptEnd]} { + %W delete insert + %W see insert + } + } + bind Console { + if {{} ne [%W tag nextrange sel 1.0 end] \ + && [%W compare sel.first >= promptEnd]} { + %W delete sel.first sel.last + } elseif {[%W compare insert != 1.0] && \ + [%W compare insert > promptEnd]} { + %W delete insert-1c + %W see insert + } + } + bind Console [bind Console ] + + bind Console <> { + if {[%W compare insert < promptEnd]} { + tk::TextSetCursor %W {insert linestart} + } else { + tk::TextSetCursor %W promptEnd + } + } + bind Console <> { + tk::TextSetCursor %W {insert lineend} + } + bind Console { + if {[%W compare insert < promptEnd]} { + break + } + %W delete insert + } + bind Console <> { + if {[%W compare insert < promptEnd]} { + break + } + if {[%W compare insert == {insert lineend}]} { + %W delete insert + } else { + %W delete insert {insert lineend} + } + } + bind Console <> { + ## Clear console display + %W delete 1.0 "promptEnd linestart" + } + bind Console <> { + ## Clear command line (Unix shell staple) + %W delete promptEnd end + } + bind Console { + if {[%W compare insert >= promptEnd]} { + %W delete insert {insert wordend} + } + } + bind Console { + if {[%W compare {insert -1c wordstart} >= promptEnd]} { + %W delete {insert -1c wordstart} insert + } + } + bind Console { + if {[%W compare insert >= promptEnd]} { + %W delete insert {insert wordend} + } + } + bind Console { + if {[%W compare {insert -1c wordstart} >= promptEnd]} { + %W delete {insert -1c wordstart} insert + } + } + bind Console { + if {[%W compare insert >= promptEnd]} { + %W delete insert {insert wordend} + } + } + bind Console <> { + tk::ConsoleHistory prev + } + bind Console <> { + tk::ConsoleHistory next + } + bind Console { + catch {tk::ConsoleInsert %W [::tk::GetSelection %W PRIMARY]} + } + bind Console { + tk::ConsoleInsert %W %A + } + bind Console { + destroy {*}[winfo children .] + source -encoding utf-8 [file join $tk_library console.tcl] + } + bind Console { + exit + } + bind Console <> { ::tk::console::Cut %W } + bind Console <> { ::tk::console::Copy %W } + bind Console <> { ::tk::console::Paste %W } + + bind Console <> { + set size [font configure TkConsoleFont -size] + if {$size < 0} {set sign -1} else {set sign 1} + set size [expr {(abs($size) + 1) * $sign}] + font configure TkConsoleFont -size $size + if {$::tk::console::useFontchooser} { + tk fontchooser configure -font TkConsoleFont + } + } + bind Console <> { + set size [font configure TkConsoleFont -size] + if {abs($size) < 2} { return } + if {$size < 0} {set sign -1} else {set sign 1} + set size [expr {(abs($size) - 1) * $sign}] + font configure TkConsoleFont -size $size + if {$::tk::console::useFontchooser} { + tk fontchooser configure -font TkConsoleFont + } + } + bind Console <> { + ::tk::console::FitScreenWidth %W + } + + ## + ## Bindings for doing special things based on certain keys + ## + bind PostConsole <)> { + if {"\\" ne [%W get insert-2c]} { + ::tk::console::MatchPair %W \( \) promptEnd + } + } + bind PostConsole { + if {"\\" ne [%W get insert-2c]} { + ::tk::console::MatchPair %W \[ \] promptEnd + } + } + bind PostConsole { + if {"\\" ne [%W get insert-2c]} { + ::tk::console::MatchPair %W \{ \} promptEnd + } + } + bind PostConsole { + if {"\\" ne [%W get insert-2c]} { + ::tk::console::MatchQuote %W promptEnd + } + } + + bind PostConsole { + if {"%A" ne ""} { + ::tk::console::TagProc %W + } + } +} + +# ::tk::ConsoleInsert -- +# Insert a string into a text at the point of the insertion cursor. +# If there is a selection in the text, and it covers the point of the +# insertion cursor, then delete the selection before inserting. Insertion +# is restricted to the prompt area. +# +# Arguments: +# w - The text window in which to insert the string +# s - The string to insert (usually just a single character) + +proc ::tk::ConsoleInsert {w s} { + if {$s eq ""} { + return + } + catch { + if {[$w compare sel.first <= insert] \ + && [$w compare sel.last >= insert]} { + $w tag remove sel sel.first promptEnd + $w delete sel.first sel.last + } + } + if {[$w compare insert < promptEnd]} { + $w mark set insert end + } + $w insert insert $s {input stdin} + $w see insert +} + +# ::tk::ConsoleOutput -- +# +# This routine is called directly by ConsolePutsCmd to cause a string +# to be displayed in the console. +# +# Arguments: +# dest - The output tag to be used: either "stderr" or "stdout". +# string - The string to be displayed. + +proc ::tk::ConsoleOutput {dest string} { + set w .console + $w insert output $string $dest + ::tk::console::ConstrainBuffer $w $::tk::console::maxLines + $w see insert +} + +# ::tk::ConsoleExit -- +# +# This routine is called by ConsoleEventProc when the main window of +# the application is destroyed. Don't call exit - that probably already +# happened. Just delete our window. +# +# Arguments: +# None. + +proc ::tk::ConsoleExit {} { + destroy . +} + +# ::tk::ConsoleAbout -- +# +# This routine displays an About box to show Tcl/Tk version info. +# +# Arguments: +# None. + +proc ::tk::ConsoleAbout {} { + tk_messageBox -type ok -message "[mc {Tcl for Windows}] + +Tcl $::tcl_patchLevel +Tk $::tk_patchLevel" +} + +# ::tk::console::Fontchooser* -- +# Let the user select the console font (TIP 324). + +proc ::tk::console::FontchooserToggle {} { + if {[tk fontchooser configure -visible]} { + tk fontchooser hide + } else { + tk fontchooser show + } +} +proc ::tk::console::FontchooserVisibility {index} { + if {[tk fontchooser configure -visible]} { + .menubar.edit entryconfigure $index -label [::tk::msgcat::mc "Hide Fonts"] + } else { + .menubar.edit entryconfigure $index -label [::tk::msgcat::mc "Show Fonts"] + } +} +proc ::tk::console::FontchooserFocus {w isFocusIn} { + if {$isFocusIn} { + tk fontchooser configure -parent $w -font TkConsoleFont \ + -command [namespace code [list FontchooserApply]] + } else { + tk fontchooser configure -parent $w -font {} -command {} + } +} +proc ::tk::console::FontchooserApply {font args} { + catch {font configure TkConsoleFont {*}[font actual $font]} +} + +# ::tk::console::TagProc -- +# +# Tags a procedure in the console if it's recognized +# This procedure is not perfect. However, making it perfect wastes +# too much CPU time... +# +# Arguments: +# w - console text widget + +proc ::tk::console::TagProc w { + if {!$::tk::console::magicKeys} { + return + } + set exp "\[^\\\\\]\[\[ \t\n\r\;{}\"\$\]" + set i [$w search -backwards -regexp $exp insert-1c promptEnd-1c] + if {$i eq ""} { + set i promptEnd + } else { + append i +2c + } + regsub -all "\[\[\\\\\\?\\*\]" [$w get $i "insert-1c wordend"] {\\\0} c + if {[llength [EvalAttached [list info commands $c]]]} { + $w tag add proc $i "insert-1c wordend" + } else { + $w tag remove proc $i "insert-1c wordend" + } + if {[llength [EvalAttached [list info vars $c]]]} { + $w tag add var $i "insert-1c wordend" + } else { + $w tag remove var $i "insert-1c wordend" + } +} + +# ::tk::console::MatchPair -- +# +# Blinks a matching pair of characters +# c2 is assumed to be at the text index 'insert'. +# This proc is really loopy and took me an hour to figure out given +# all possible combinations with escaping except for escaped \'s. +# It doesn't take into account possible commenting... Oh well. If +# anyone has something better, I'd like to see/use it. This is really +# only efficient for small contexts. +# +# Arguments: +# w - console text widget +# c1 - first char of pair +# c2 - second char of pair +# +# Calls: ::tk::console::Blink + +proc ::tk::console::MatchPair {w c1 c2 {lim 1.0}} { + if {!$::tk::console::magicKeys} { + return + } + if {{} ne [set ix [$w search -back $c1 insert $lim]]} { + while { + [string match {\\} [$w get $ix-1c]] && + [set ix [$w search -back $c1 $ix-1c $lim]] ne {} + } {} + set i1 insert-1c + while {$ix ne {}} { + set i0 $ix + set j 0 + while {[set i0 [$w search $c2 $i0 $i1]] ne {}} { + append i0 +1c + if {[string match {\\} [$w get $i0-2c]]} { + continue + } + incr j + } + if {!$j} { + break + } + set i1 $ix + while {$j && [set ix [$w search -back $c1 $ix $lim]] ne {}} { + if {[string match {\\} [$w get $ix-1c]]} { + continue + } + incr j -1 + } + } + if {[string match {} $ix]} { + set ix [$w index $lim] + } + } else { + set ix [$w index $lim] + } + if {$::tk::console::blinkRange} { + Blink $w $ix [$w index insert] + } else { + Blink $w $ix $ix+1c [$w index insert-1c] [$w index insert] + } +} + +# ::tk::console::MatchQuote -- +# +# Blinks between matching quotes. +# Blinks just the quote if it's unmatched, otherwise blinks quoted string +# The quote to match is assumed to be at the text index 'insert'. +# +# Arguments: +# w - console text widget +# +# Calls: ::tk::console::Blink + +proc ::tk::console::MatchQuote {w {lim 1.0}} { + if {!$::tk::console::magicKeys} { + return + } + set i insert-1c + set j 0 + while {[set i [$w search -back \" $i $lim]] ne {}} { + if {[string match {\\} [$w get $i-1c]]} { + continue + } + if {!$j} { + set i0 $i + } + incr j + } + if {$j&1} { + if {$::tk::console::blinkRange} { + Blink $w $i0 [$w index insert] + } else { + Blink $w $i0 $i0+1c [$w index insert-1c] [$w index insert] + } + } else { + Blink $w [$w index insert-1c] [$w index insert] + } +} + +# ::tk::console::Blink -- +# +# Blinks between n index pairs for a specified duration. +# +# Arguments: +# w - console text widget +# i1 - start index to blink region +# i2 - end index of blink region +# dur - duration in usecs to blink for +# +# Outputs: +# blinks selected characters in $w + +proc ::tk::console::Blink {w args} { + eval [list $w tag add blink] $args + after $::tk::console::blinkTime [list $w] tag remove blink $args +} + +# ::tk::console::ConstrainBuffer -- +# +# This limits the amount of data in the text widget +# Called by Prompt and ConsoleOutput +# +# Arguments: +# w - console text widget +# size - # of lines to constrain to +# +# Outputs: +# may delete data in console widget + +proc ::tk::console::ConstrainBuffer {w size} { + if {[$w index end] > $size} { + $w delete 1.0 [expr {int([$w index end])-$size}].0 + } +} + +# ::tk::console::Expand -- +# +# Arguments: +# ARGS: w - text widget in which to expand str +# type - type of expansion (path / proc / variable) +# +# Calls: ::tk::console::Expand(Pathname|Procname|Variable) +# +# Outputs: The string to match is expanded to the longest possible match. +# If ::tk::console::showMatches is non-zero and the longest match +# equaled the string to expand, then all possible matches are +# output to stdout. Triggers bell if no matches are found. +# +# Returns: number of matches found + +proc ::tk::console::Expand {w {type ""}} { + set exp "\[^\\\\\]\[\[ \t\n\r\\\{\"\\\\\$\]" + set tmp [$w search -backwards -regexp $exp insert-1c promptEnd-1c] + if {$tmp eq ""} { + set tmp promptEnd + } else { + append tmp +2c + } + if {[$w compare $tmp >= insert]} { + return + } + set str [$w get $tmp insert] + switch -glob $type { + path* { + set res [ExpandPathname $str] + } + proc* { + set res [ExpandProcname $str] + } + var* { + set res [ExpandVariable $str] + } + default { + set res {} + foreach t {Pathname Procname Variable} { + if {![catch {Expand$t $str} res] && ($res ne "")} { + break + } + } + } + } + set len [llength $res] + if {$len} { + set repl [lindex $res 0] + $w delete $tmp insert + $w insert $tmp $repl {input stdin} + if {($len > 1) && ($::tk::console::showMatches) && ($repl eq $str)} { + puts stdout [lsort [lreplace $res 0 0]] + } + } else { + bell + } + return [incr len -1] +} + +# ::tk::console::ExpandPathname -- +# +# Expand a file pathname based on $str +# This is based on UNIX file name conventions +# +# Arguments: +# str - partial file pathname to expand +# +# Calls: ::tk::console::ExpandBestMatch +# +# Returns: list containing longest unique match followed by all the +# possible further matches + +proc ::tk::console::ExpandPathname str { + set pwd [EvalAttached pwd] + if {[catch {EvalAttached [list cd [file dirname $str]]} err opt]} { + return -options $opt $err + } + set dir [file tail $str] + ## Check to see if it was known to be a directory and keep the trailing + ## slash if so (file tail cuts it off) + if {[string match */ $str]} { + append dir / + } + if {[catch {lsort [EvalAttached [list glob $dir*]]} m]} { + set match {} + } else { + if {[llength $m] > 1} { + if { $::tcl_platform(platform) eq "windows" } { + ## Windows is screwy because it's case insensitive + set tmp [ExpandBestMatch [string tolower $m] \ + [string tolower $dir]] + ## Don't change case if we haven't changed the word + if {[string length $dir]==[string length $tmp]} { + set tmp $dir + } + } else { + set tmp [ExpandBestMatch $m $dir] + } + if {[string match ?*/* $str]} { + set tmp [file dirname $str]/$tmp + } elseif {[string match /* $str]} { + set tmp /$tmp + } + regsub -all { } $tmp {\\ } tmp + set match [linsert $m 0 $tmp] + } else { + ## This may look goofy, but it handles spaces in path names + eval append match $m + if {[file isdir $match]} { + append match / + } + if {[string match ?*/* $str]} { + set match [file dirname $str]/$match + } elseif {[string match /* $str]} { + set match /$match + } + regsub -all { } $match {\\ } match + ## Why is this one needed and the ones below aren't!! + set match [list $match] + } + } + EvalAttached [list cd $pwd] + return $match +} + +# ::tk::console::ExpandProcname -- +# +# Expand a tcl proc name based on $str +# +# Arguments: +# str - partial proc name to expand +# +# Calls: ::tk::console::ExpandBestMatch +# +# Returns: list containing longest unique match followed by all the +# possible further matches + +proc ::tk::console::ExpandProcname str { + set match [EvalAttached [list info commands $str*]] + if {[llength $match] == 0} { + set ns [EvalAttached \ + "namespace children \[namespace current\] [list $str*]"] + if {[llength $ns]==1} { + set match [EvalAttached [list info commands ${ns}::*]] + } else { + set match $ns + } + } + if {[llength $match] > 1} { + regsub -all { } [ExpandBestMatch $match $str] {\\ } str + set match [linsert $match 0 $str] + } else { + regsub -all { } $match {\\ } match + } + return $match +} + +# ::tk::console::ExpandVariable -- +# +# Expand a tcl variable name based on $str +# +# Arguments: +# str - partial tcl var name to expand +# +# Calls: ::tk::console::ExpandBestMatch +# +# Returns: list containing longest unique match followed by all the +# possible further matches + +proc ::tk::console::ExpandVariable str { + if {[regexp {([^\(]*)\((.*)} $str -> ary str]} { + ## Looks like they're trying to expand an array. + set match [EvalAttached [list array names $ary $str*]] + if {[llength $match] > 1} { + set vars $ary\([ExpandBestMatch $match $str] + foreach var $match { + lappend vars $ary\($var\) + } + return $vars + } elseif {[llength $match] == 1} { + set match $ary\($match\) + } + ## Space transformation avoided for array names. + } else { + set match [EvalAttached [list info vars $str*]] + if {[llength $match] > 1} { + regsub -all { } [ExpandBestMatch $match $str] {\\ } str + set match [linsert $match 0 $str] + } else { + regsub -all { } $match {\\ } match + } + } + return $match +} + +# ::tk::console::ExpandBestMatch -- +# +# Finds the best unique match in a list of names. +# The extra $e in this argument allows us to limit the innermost loop a little +# further. This improves speed as $l becomes large or $e becomes long. +# +# Arguments: +# l - list to find best unique match in +# e - currently best known unique match +# +# Returns: longest unique match in the list + +proc ::tk::console::ExpandBestMatch {l {e {}}} { + set ec [lindex $l 0] + if {[llength $l]>1} { + set e [expr {[string length $e] - 1}] + set ei [expr {[string length $ec] - 1}] + foreach l $l { + while {$ei>=$e && [string first $ec $l]} { + set ec [string range $ec 0 [incr ei -1]] + } + } + } + return $ec +} + +# now initialize the console +::tk::ConsoleInit diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/README b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/README similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/README rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/README diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/anilabel.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/anilabel.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/anilabel.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/anilabel.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/aniwave.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/aniwave.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/aniwave.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/aniwave.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/arrow.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/arrow.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/arrow.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/arrow.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/bind.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/bind.tcl new file mode 100644 index 00000000..5c4206ba --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/bind.tcl @@ -0,0 +1,78 @@ +# bind.tcl -- +# +# This demonstration script creates a text widget with bindings set +# up for hypertext-like effects. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +set w .bind +catch {destroy $w} +toplevel $w +wm title $w "Text Demonstration - Tag Bindings" +wm iconname $w "bind" +positionWindow $w + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +text $w.text -yscrollcommand "$w.scroll set" -setgrid 1 \ + -width 60 -height 24 -font $font -wrap word +ttk::scrollbar $w.scroll -command "$w.text yview" +pack $w.scroll -side right -fill y +pack $w.text -expand yes -fill both + +# Set up display styles. + +if {[winfo depth $w] > 1} { + set bold "-background #43ce80 -relief raised -borderwidth 1" + set normal "-background {} -relief flat" +} else { + set bold "-foreground white -background black" + set normal "-foreground {} -background {}" +} + +# Add text to widget. + +$w.text insert 0.0 {\ +The same tag mechanism that controls display styles in text widgets can also be used to associate Tcl commands with regions of text, so that mouse or keyboard actions on the text cause particular Tcl commands to be invoked. For example, in the text below the descriptions of the canvas demonstrations have been tagged. When you move the mouse over a demo description the description lights up, and when you press button 1 over a description then that particular demonstration is invoked. + +} +$w.text insert end \ +{1. Samples of all the different types of items that can be created in canvas widgets.} d1 +$w.text insert end \n\n +$w.text insert end \ +{2. A simple two-dimensional plot that allows you to adjust the positions of the data points.} d2 +$w.text insert end \n\n +$w.text insert end \ +{3. Anchoring and justification modes for text items.} d3 +$w.text insert end \n\n +$w.text insert end \ +{4. An editor for arrow-head shapes for line items.} d4 +$w.text insert end \n\n +$w.text insert end \ +{5. A ruler with facilities for editing tab stops.} d5 +$w.text insert end \n\n +$w.text insert end \ +{6. A grid that demonstrates how canvases can be scrolled.} d6 + +# Create bindings for tags. + +foreach tag {d1 d2 d3 d4 d5 d6} { + $w.text tag bind $tag "$w.text tag configure $tag $bold" + $w.text tag bind $tag "$w.text tag configure $tag $normal" +} +# Main widget program sets variable tk_demoDirectory +$w.text tag bind d1 {source -encoding utf-8 [file join $tk_demoDirectory items.tcl]} +$w.text tag bind d2 {source -encoding utf-8 [file join $tk_demoDirectory plot.tcl]} +$w.text tag bind d3 {source -encoding utf-8 [file join $tk_demoDirectory ctext.tcl]} +$w.text tag bind d4 {source -encoding utf-8 [file join $tk_demoDirectory arrow.tcl]} +$w.text tag bind d5 {source -encoding utf-8 [file join $tk_demoDirectory ruler.tcl]} +$w.text tag bind d6 {source -encoding utf-8 [file join $tk_demoDirectory cscroll.tcl]} + +$w.text mark set insert 0.0 +$w.text configure -state disabled diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/bitmap.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/bitmap.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/bitmap.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/bitmap.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/browse b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/browse new file mode 100644 index 00000000..44fef331 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/browse @@ -0,0 +1,66 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" ${1+"$@"} + +# browse -- +# This script generates a directory browser, which lists the working +# directory and allows you to open files or subdirectories by +# double-clicking. + +package require tk + +# Create a scrollbar on the right side of the main window and a listbox +# on the left side. + +scrollbar .scroll -command ".list yview" +pack .scroll -side right -fill y +listbox .list -yscroll ".scroll set" -relief sunken -width 20 -height 20 \ + -setgrid 1 +pack .list -side left -fill both -expand yes +wm minsize . 1 1 + +# The procedure below is invoked to open a browser on a given file; if the +# file is a directory then another instance of this program is invoked; if +# the file is a regular file then the Mx editor is invoked to display +# the file. + +set browseScript [file join [pwd] $argv0] +proc browse {dir file} { + global env browseScript + if {[string compare $dir "."] != 0} {set file $dir/$file} + switch [file type $file] { + directory { + exec [info nameofexecutable] $browseScript $file & + } + file { + if {[info exists env(EDITOR)]} { + eval exec $env(EDITOR) $file & + } else { + exec xedit $file & + } + } + default { + puts stdout "\"$file\" isn't a directory or regular file" + } + } +} + +# Fill the listbox with a list of all the files in the directory. + +if {$argc>0} {set dir [lindex $argv 0]} else {set dir "."} +foreach i [lsort [glob * .* *.*]] { + if {[file type $i] eq "directory"} { + # Safe to do since it is still a directory. + append i / + } + .list insert end $i +} + +# Set up bindings for the browser. + +bind all {destroy .} +bind .list {foreach i [selection get] {browse $dir $i}} + +# Local Variables: +# mode: tcl +# End: diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/button.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/button.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/button.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/button.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/check.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/check.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/check.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/check.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/clrpick.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/clrpick.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/clrpick.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/clrpick.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/colors.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/colors.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/colors.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/colors.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/combo.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/combo.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/combo.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/combo.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/cscroll.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/cscroll.tcl new file mode 100644 index 00000000..0463cec0 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/cscroll.tcl @@ -0,0 +1,134 @@ +# cscroll.tcl -- +# +# This demonstration script creates a simple canvas that can be +# scrolled in two dimensions. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +set w .cscroll +catch {destroy $w} +toplevel $w +wm title $w "Scrollable Canvas Demonstration" +wm iconname $w "cscroll" +positionWindow $w +set c $w.c + +label $w.msg -font $font -wraplength 4i -justify left -text "This window displays a canvas widget that can be scrolled by using the scrollbars, by dragging with button 2 in the canvas, by using a mouse wheel, or with the two-finger gesture on a touchpad. If you click button 1 on one of the rectangles, its indices will be printed on stdout." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.grid +scrollbar $w.hscroll -orient horizontal -command "$c xview" +scrollbar $w.vscroll -command "$c yview" +canvas $c -relief sunken -borderwidth 2 -scrollregion {-11c -11c 50c 20c} \ + -xscrollcommand "$w.hscroll set" \ + -yscrollcommand "$w.vscroll set" +pack $w.grid -expand yes -fill both -padx 1 -pady 1 +grid rowconfig $w.grid 0 -weight 1 -minsize 0 +grid columnconfig $w.grid 0 -weight 1 -minsize 0 + +grid $c -padx 1 -in $w.grid -pady 1 \ + -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky news +grid $w.vscroll -in $w.grid -padx 1 -pady 1 \ + -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news +grid $w.hscroll -in $w.grid -padx 1 -pady 1 \ + -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news + + +set bg [lindex [$c config -bg] 4] +for {set i 0} {$i < 20} {incr i} { + set x [expr {-10 + 3*$i}] + for {set j 0; set y -10} {$j < 10} {incr j; incr y 3} { + $c create rect ${x}c ${y}c [expr {$x+2}]c [expr {$y+2}]c \ + -fill $bg -tags rect + $c create text [expr {$x+1}]c [expr {$y+1}]c -text "$i,$j" \ + -anchor center -tags text + } +} + +$c bind all "scrollEnter $c" +$c bind all "scrollLeave $c" +$c bind all "scrollButton $c" +bind $c "$c scan mark %x %y" +bind $c "$c scan dragto %x %y" + +# We must make sure that positive and negative movements are rounded +# equally to integers, avoiding the problem that +# (int)1/-40 = -1, +# but +# (int)-1/-40 = 0 +# The following code ensures equal +/- behaviour. +bind $c { + if {%D >= 0} { + %W yview scroll [expr {%D/-40}] units + } else { + %W yview scroll [expr {(%D-39)/-40}] units + } +} +bind $c { + if {%D >= 0} { + %W yview scroll [expr {%D/-12}] units + } else { + %W yview scroll [expr {(%D-11)/-12}] units + } +} +bind $c { + if {%D >= 0} { + %W xview scroll [expr {%D/-40}] units + } else { + %W xview scroll [expr {(%D-39)/-40}] units + } +} +bind $c { + if {%D >= 0} { + %W xview scroll [expr {%D/-12}] units + } else { + %W xview scroll [expr {(%D-11)/-12}] units + } +} +bind $c { + lassign [tk::PreciseScrollDeltas %D] deltaX deltaY + if {$deltaX != 0 || $deltaY != 0} { + tk::ScrollByPixels %W $deltaX $deltaY + } +} + +proc scrollEnter canvas { + global oldFill + set id [$canvas find withtag current] + if {[lsearch [$canvas gettags current] text] >= 0} { + set id [expr {$id-1}] + } + set oldFill [lindex [$canvas itemconfig $id -fill] 4] + if {[winfo depth $canvas] > 1} { + if {[tk windowingsystem] eq "aqua"} { + $canvas itemconfigure $id -fill systemSelectedTextBackgroundColor + } else { + $canvas itemconfigure $id -fill LightSeaGreen + } + } +} + +proc scrollLeave canvas { + global oldFill + set id [$canvas find withtag current] + if {[lsearch [$canvas gettags current] text] >= 0} { + set id [expr {$id-1}] + } + $canvas itemconfigure $id -fill $oldFill +} + +proc scrollButton canvas { + set id [$canvas find withtag current] + if {[lsearch [$canvas gettags current] text] < 0} { + set id [expr {$id+1}] + } + puts stdout "You buttoned at [lindex [$canvas itemconf $id -text] 4]" +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ctext.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ctext.tcl new file mode 100644 index 00000000..57fbb137 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ctext.tcl @@ -0,0 +1,172 @@ +# ctext.tcl -- +# +# This demonstration script creates a canvas widget with a text +# item that can be edited and reconfigured in various ways. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +set w .ctext +catch {destroy $w} +toplevel $w +wm title $w "Canvas Text Demonstration" +wm iconname $w "Text" +positionWindow $w +set c $w.c + +label $w.msg -font $font -wraplength 5i -justify left -text "This window displays a string of text to demonstrate the text facilities of canvas widgets. You can click in the boxes to adjust the position of the text relative to its positioning point or change its justification, and on a pie slice to change its angle. The text also supports the following simple bindings for editing: + 1. You can point, click, and type. + 2. You can also select with button 1. + 3. You can copy the selection to the mouse position with button 2. + 4. Backspace and Control+h delete the selection if there is one; + otherwise they delete the character just before the insertion cursor. + 5. Delete deletes the selection if there is one; otherwise it deletes + the character just after the insertion cursor." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +canvas $c -relief flat -borderwidth 0 -width 375p -height 262.5p +pack $w.c -side top -expand yes -fill both + +set textFont {Helvetica 24} + +$c create rectangle 183.75p 122.25p 191.25p 129.75p -outline black -fill red + +# First, create the text item and give it bindings so it can be edited. + +$c addtag text withtag [$c create text 187.5p 126p -text "This is just a string of text to demonstrate the text facilities of canvas widgets. Bindings have been defined to support editing (see above)." -width 330p -anchor n -font $textFont -justify left] +$c bind text "textB1Press $c %x %y" +$c bind text "textB1Move $c %x %y" +$c bind text "$c select adjust current @%x,%y" +$c bind text "textB1Move $c %x %y" +$c bind text "textInsert $c %A" +$c bind text "textInsert $c \\n" +$c bind text "textBs $c" +$c bind text "textBs $c" +$c bind text "textDel $c" +$c bind text "textPaste $c @%x,%y" + +# Next, create some items that allow the text's anchor position +# to be edited. + +proc mkTextConfigBox {w x y option value color} { ;# x, y are in points + set item [$w create rect ${x}p ${y}p [expr {$x+22.5}]p [expr {$y+22.5}]p \ + -outline black -fill $color -width 0.75p] + $w bind $item "$w itemconf text $option $value" + $w addtag config withtag $item +} +proc mkTextConfigPie {w x y a option value color} { ;# x, y are in points + set item [$w create arc ${x}p ${y}p [expr {$x+67.5}]p [expr {$y+67.5}]p \ + -start [expr {$a-15}] -extent 30 -outline black -fill $color \ + -width 0.75p] + $w bind $item "$w itemconf text $option $value" + $w addtag config withtag $item +} + +set x 37.5 ;# in points +set y 37.5 ;# in points +set color LightSkyBlue1 +mkTextConfigBox $c $x $y -anchor se $color +mkTextConfigBox $c [expr {$x+22.5}] [expr {$y }] -anchor s $color +mkTextConfigBox $c [expr {$x+45 }] [expr {$y }] -anchor sw $color +mkTextConfigBox $c [expr {$x }] [expr {$y+22.5}] -anchor e $color +mkTextConfigBox $c [expr {$x+22.5}] [expr {$y+22.5}] -anchor center $color +mkTextConfigBox $c [expr {$x+45 }] [expr {$y+22.5}] -anchor w $color +mkTextConfigBox $c [expr {$x }] [expr {$y+45 }] -anchor ne $color +mkTextConfigBox $c [expr {$x+22.5}] [expr {$y+45 }] -anchor n $color +mkTextConfigBox $c [expr {$x+45 }] [expr {$y+45 }] -anchor nw $color +set item [$c create rect \ + [expr {$x+30}]p [expr {$y+30}]p [expr {$x+37.5}]p [expr {$y+37.5}]p \ + -outline black -fill red] +$c bind $item "$c itemconf text -anchor center" +$c create text [expr {$x+33.75}]p [expr {$y-3.75}]p \ + -text {Text Position} -anchor s -font {Times 20} -fill brown + +# Now create some items that allow the text's angle to be changed. + +set x 153.75 ;# in points +set y 37.5 ;# in points +set color Yellow +mkTextConfigPie $c $x $y 0 -angle 90 $color +mkTextConfigPie $c $x $y 30 -angle 120 $color +mkTextConfigPie $c $x $y 60 -angle 150 $color +mkTextConfigPie $c $x $y 90 -angle 180 $color +mkTextConfigPie $c $x $y 120 -angle 210 $color +mkTextConfigPie $c $x $y 150 -angle 240 $color +mkTextConfigPie $c $x $y 180 -angle 270 $color +mkTextConfigPie $c $x $y 210 -angle 300 $color +mkTextConfigPie $c $x $y 240 -angle 330 $color +mkTextConfigPie $c $x $y 270 -angle 0 $color +mkTextConfigPie $c $x $y 300 -angle 30 $color +mkTextConfigPie $c $x $y 330 -angle 60 $color +$c create text [expr {$x+33.75}]p [expr {$y-3.75}]p \ + -text {Text Angle} -anchor s -font {Times 20} -fill brown + +# Lastly, create some items that allow the text's justification to be +# changed. + +set x 262.5 ;# in points +set y 37.5 ;# in points +set color SeaGreen2 +mkTextConfigBox $c $x $y -justify left $color +mkTextConfigBox $c [expr {$x+22.5}] $y -justify center $color +mkTextConfigBox $c [expr {$x+45}] $y -justify right $color +$c create text [expr {$x+33.75}]p [expr {$y-3.75}]p \ + -text {Justification} -anchor s -font {Times 20} -fill brown + +$c bind config "textEnter $c" +$c bind config "$c itemconf current -fill \$textConfigFill" + +set textConfigFill {} + +proc textEnter {w} { + global textConfigFill + set textConfigFill [lindex [$w itemconfig current -fill] 4] + $w itemconfig current -fill black +} + +proc textInsert {w string} { + if {$string == ""} { + return + } + catch {$w dchars text sel.first sel.last} + $w insert text insert $string +} + +proc textPaste {w pos} { + catch { + $w insert text $pos [selection get] + } +} + +proc textB1Press {w x y} { + $w icursor current @$x,$y + $w focus current + focus $w + $w select from current @$x,$y +} + +proc textB1Move {w x y} { + $w select to current @$x,$y +} + +proc textBs {w} { + if {![catch {$w dchars text sel.first sel.last}]} { + return + } + set char [expr {[$w index text insert] - 1}] + if {$char >= 0} {$w dchar text $char} +} + +proc textDel {w} { + if {![catch {$w dchars text sel.first sel.last}]} { + return + } + $w dchars text insert +} diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/dialog1.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/dialog1.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/dialog1.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/dialog1.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/dialog2.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/dialog2.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/dialog2.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/dialog2.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/en.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/en.msg similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/en.msg rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/en.msg diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/entry1.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/entry1.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/entry1.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/entry1.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/entry2.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/entry2.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/entry2.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/entry2.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/entry3.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/entry3.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/entry3.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/entry3.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/filebox.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/filebox.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/filebox.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/filebox.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/floor.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/floor.tcl new file mode 100644 index 00000000..4bf3ce45 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/floor.tcl @@ -0,0 +1,1379 @@ +# floor.tcl -- +# +# This demonstration script creates a canvas widet that displays the +# floorplan for DEC's Western Research Laboratory. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +# floorDisplay -- +# Recreate the floorplan display in the canvas given by "w". The +# floor given by "active" is displayed on top with its office structure +# visible. +# +# Arguments: +# w - Name of the canvas window. +# active - Number of active floor (1, 2, or 3). + +proc floorDisplay {w active} { + global floorLabels floorItems colors activeFloor + + if {$activeFloor == $active} { + return + } + + $w delete all + set activeFloor $active + + # First go through the three floors, displaying the backgrounds for + # each floor. + + bg1 $w $colors(bg1) $colors(outline1) + bg2 $w $colors(bg2) $colors(outline2) + bg3 $w $colors(bg3) $colors(outline3) + + # Raise the background for the active floor so that it's on top. + + $w raise floor$active + + # Create a dummy item just to mark this point in the display list, + # so we can insert highlights here. + + $w create rect 0 100 1 101 -fill {} -outline {} -tags marker + + # Add the walls and labels for the active floor, along with + # transparent polygons that define the rooms on the floor. + # Make sure that the room polygons are on top. + + catch {unset floorLabels} + catch {unset floorItems} + fg$active $w $colors(offices) + $w raise room + + # Rescale the coordinates in pixels of all of the + # items according to the display's DPI scaling level. + + set scaleFactor [expr {$tk::scalingPct / 100.0}] + $w scale all 0 0 $scaleFactor $scaleFactor + + # Offset the floors diagonally from each other. + + $w move floor1 2c 2c + $w move floor2 1c 1c + + # Create items for the room entry and its label. + + $w create window 450p 75p -anchor w -window $w.entry + $w create text 450p 75p -anchor e -text "Room: " + + # Configure the canvas. + + set bbox [$w bbox all] + lassign $bbox x1 y1 x2 y2 + set morePx [expr {round(20 * $tk::scalingPct / 100.0)}] + set width [expr {$x2 - $x1 + $morePx}] + set height [expr {$y2 - $y1 + $morePx}] + $w configure -scrollregion $bbox -width $width -height $height +} + +# newRoom -- +# This procedure is invoked whenever the mouse enters a room +# in the floorplan. It changes tags so that the current room is +# highlighted. +# +# Arguments: +# w - The name of the canvas window. + +proc newRoom w { + global currentRoom floorLabels + + set id [$w find withtag current] + if {$id != ""} { + set currentRoom $floorLabels($id) + } + update idletasks +} + +# roomChanged -- +# This procedure is invoked whenever the currentRoom variable changes. +# It highlights the current room and unhighlights any previous room. +# +# Arguments: +# w - The canvas window displaying the floorplan. +# args - Not used. + +proc roomChanged {w args} { + global currentRoom floorItems colors + $w delete highlight + if {[catch {set item $floorItems($currentRoom)}]} { + return + } + set new [eval \ + "$w create polygon [$w coords $item] -fill $colors(active) \ + -outline {} -tags highlight"] + $w raise $new marker +} + +# bg1 -- +# This procedure represents part of the floorplan database. When +# invoked, it instantiates the background information for the first +# floor. +# +# Arguments: +# w - The canvas window. +# fill - Fill color to use for the floor's background. +# outline - Color to use for the floor's outline. + +proc bg1 {w fill outline} { + $w create polygon 347 80 349 82 351 84 353 85 363 92 375 99 386 104 \ + 386 129 398 129 398 162 484 162 484 129 559 129 559 133 725 \ + 133 725 129 802 129 802 389 644 389 644 391 559 391 559 327 \ + 508 327 508 311 484 311 484 278 395 278 395 288 400 288 404 \ + 288 409 290 413 292 418 297 421 302 422 309 421 318 417 325 \ + 411 330 405 332 397 333 344 333 340 334 336 336 335 338 332 \ + 342 331 347 332 351 334 354 336 357 341 359 340 360 335 363 \ + 331 365 326 366 304 366 304 355 258 355 258 387 60 387 60 391 \ + 0 391 0 337 3 337 3 114 8 114 8 25 30 25 30 5 93 5 98 5 104 7 \ + 110 10 116 16 119 20 122 28 123 32 123 68 220 68 220 34 221 \ + 22 223 17 227 13 231 8 236 4 242 2 246 0 260 0 283 1 300 5 \ + 321 14 335 22 348 25 365 29 363 39 358 48 352 56 337 70 \ + 344 76 347 80 \ + -tags {floor1 bg} -fill $fill -outline {} + $w create line 386 129 398 129 -fill $outline -tags {floor1 bg} + $w create line 258 355 258 387 -fill $outline -tags {floor1 bg} + $w create line 60 387 60 391 -fill $outline -tags {floor1 bg} + $w create line 0 337 0 391 -fill $outline -tags {floor1 bg} + $w create line 60 391 0 391 -fill $outline -tags {floor1 bg} + $w create line 3 114 3 337 -fill $outline -tags {floor1 bg} + $w create line 258 387 60 387 -fill $outline -tags {floor1 bg} + $w create line 484 162 398 162 -fill $outline -tags {floor1 bg} + $w create line 398 162 398 129 -fill $outline -tags {floor1 bg} + $w create line 484 278 484 311 -fill $outline -tags {floor1 bg} + $w create line 484 311 508 311 -fill $outline -tags {floor1 bg} + $w create line 508 327 508 311 -fill $outline -tags {floor1 bg} + $w create line 559 327 508 327 -fill $outline -tags {floor1 bg} + $w create line 644 391 559 391 -fill $outline -tags {floor1 bg} + $w create line 644 389 644 391 -fill $outline -tags {floor1 bg} + $w create line 559 129 484 129 -fill $outline -tags {floor1 bg} + $w create line 484 162 484 129 -fill $outline -tags {floor1 bg} + $w create line 725 133 559 133 -fill $outline -tags {floor1 bg} + $w create line 559 129 559 133 -fill $outline -tags {floor1 bg} + $w create line 725 129 802 129 -fill $outline -tags {floor1 bg} + $w create line 802 389 802 129 -fill $outline -tags {floor1 bg} + $w create line 3 337 0 337 -fill $outline -tags {floor1 bg} + $w create line 559 391 559 327 -fill $outline -tags {floor1 bg} + $w create line 802 389 644 389 -fill $outline -tags {floor1 bg} + $w create line 725 133 725 129 -fill $outline -tags {floor1 bg} + $w create line 8 25 8 114 -fill $outline -tags {floor1 bg} + $w create line 8 114 3 114 -fill $outline -tags {floor1 bg} + $w create line 30 25 8 25 -fill $outline -tags {floor1 bg} + $w create line 484 278 395 278 -fill $outline -tags {floor1 bg} + $w create line 30 25 30 5 -fill $outline -tags {floor1 bg} + $w create line 93 5 30 5 -fill $outline -tags {floor1 bg} + $w create line 98 5 93 5 -fill $outline -tags {floor1 bg} + $w create line 104 7 98 5 -fill $outline -tags {floor1 bg} + $w create line 110 10 104 7 -fill $outline -tags {floor1 bg} + $w create line 116 16 110 10 -fill $outline -tags {floor1 bg} + $w create line 119 20 116 16 -fill $outline -tags {floor1 bg} + $w create line 122 28 119 20 -fill $outline -tags {floor1 bg} + $w create line 123 32 122 28 -fill $outline -tags {floor1 bg} + $w create line 123 68 123 32 -fill $outline -tags {floor1 bg} + $w create line 220 68 123 68 -fill $outline -tags {floor1 bg} + $w create line 386 129 386 104 -fill $outline -tags {floor1 bg} + $w create line 386 104 375 99 -fill $outline -tags {floor1 bg} + $w create line 375 99 363 92 -fill $outline -tags {floor1 bg} + $w create line 353 85 363 92 -fill $outline -tags {floor1 bg} + $w create line 220 68 220 34 -fill $outline -tags {floor1 bg} + $w create line 337 70 352 56 -fill $outline -tags {floor1 bg} + $w create line 352 56 358 48 -fill $outline -tags {floor1 bg} + $w create line 358 48 363 39 -fill $outline -tags {floor1 bg} + $w create line 363 39 365 29 -fill $outline -tags {floor1 bg} + $w create line 365 29 348 25 -fill $outline -tags {floor1 bg} + $w create line 348 25 335 22 -fill $outline -tags {floor1 bg} + $w create line 335 22 321 14 -fill $outline -tags {floor1 bg} + $w create line 321 14 300 5 -fill $outline -tags {floor1 bg} + $w create line 300 5 283 1 -fill $outline -tags {floor1 bg} + $w create line 283 1 260 0 -fill $outline -tags {floor1 bg} + $w create line 260 0 246 0 -fill $outline -tags {floor1 bg} + $w create line 246 0 242 2 -fill $outline -tags {floor1 bg} + $w create line 242 2 236 4 -fill $outline -tags {floor1 bg} + $w create line 236 4 231 8 -fill $outline -tags {floor1 bg} + $w create line 231 8 227 13 -fill $outline -tags {floor1 bg} + $w create line 223 17 227 13 -fill $outline -tags {floor1 bg} + $w create line 221 22 223 17 -fill $outline -tags {floor1 bg} + $w create line 220 34 221 22 -fill $outline -tags {floor1 bg} + $w create line 340 360 335 363 -fill $outline -tags {floor1 bg} + $w create line 335 363 331 365 -fill $outline -tags {floor1 bg} + $w create line 331 365 326 366 -fill $outline -tags {floor1 bg} + $w create line 326 366 304 366 -fill $outline -tags {floor1 bg} + $w create line 304 355 304 366 -fill $outline -tags {floor1 bg} + $w create line 395 288 400 288 -fill $outline -tags {floor1 bg} + $w create line 404 288 400 288 -fill $outline -tags {floor1 bg} + $w create line 409 290 404 288 -fill $outline -tags {floor1 bg} + $w create line 413 292 409 290 -fill $outline -tags {floor1 bg} + $w create line 418 297 413 292 -fill $outline -tags {floor1 bg} + $w create line 421 302 418 297 -fill $outline -tags {floor1 bg} + $w create line 422 309 421 302 -fill $outline -tags {floor1 bg} + $w create line 421 318 422 309 -fill $outline -tags {floor1 bg} + $w create line 421 318 417 325 -fill $outline -tags {floor1 bg} + $w create line 417 325 411 330 -fill $outline -tags {floor1 bg} + $w create line 411 330 405 332 -fill $outline -tags {floor1 bg} + $w create line 405 332 397 333 -fill $outline -tags {floor1 bg} + $w create line 397 333 344 333 -fill $outline -tags {floor1 bg} + $w create line 344 333 340 334 -fill $outline -tags {floor1 bg} + $w create line 340 334 336 336 -fill $outline -tags {floor1 bg} + $w create line 336 336 335 338 -fill $outline -tags {floor1 bg} + $w create line 335 338 332 342 -fill $outline -tags {floor1 bg} + $w create line 331 347 332 342 -fill $outline -tags {floor1 bg} + $w create line 332 351 331 347 -fill $outline -tags {floor1 bg} + $w create line 334 354 332 351 -fill $outline -tags {floor1 bg} + $w create line 336 357 334 354 -fill $outline -tags {floor1 bg} + $w create line 341 359 336 357 -fill $outline -tags {floor1 bg} + $w create line 341 359 340 360 -fill $outline -tags {floor1 bg} + $w create line 395 288 395 278 -fill $outline -tags {floor1 bg} + $w create line 304 355 258 355 -fill $outline -tags {floor1 bg} + $w create line 347 80 344 76 -fill $outline -tags {floor1 bg} + $w create line 344 76 337 70 -fill $outline -tags {floor1 bg} + $w create line 349 82 347 80 -fill $outline -tags {floor1 bg} + $w create line 351 84 349 82 -fill $outline -tags {floor1 bg} + $w create line 353 85 351 84 -fill $outline -tags {floor1 bg} +} + +# bg2 -- +# This procedure represents part of the floorplan database. When +# invoked, it instantiates the background information for the second +# floor. +# +# Arguments: +# w - The canvas window. +# fill - Fill color to use for the floor's background. +# outline - Color to use for the floor's outline. + +proc bg2 {w fill outline} { + $w create polygon 559 129 484 129 484 162 398 162 398 129 315 129 \ + 315 133 176 133 176 129 96 129 96 133 3 133 3 339 0 339 0 391 \ + 60 391 60 387 258 387 258 329 350 329 350 311 395 311 395 280 \ + 484 280 484 311 508 311 508 327 558 327 558 391 644 391 644 \ + 367 802 367 802 129 725 129 725 133 559 133 559 129 \ + -tags {floor2 bg} -fill $fill -outline {} + $w create line 350 311 350 329 -fill $outline -tags {floor2 bg} + $w create line 398 129 398 162 -fill $outline -tags {floor2 bg} + $w create line 802 367 802 129 -fill $outline -tags {floor2 bg} + $w create line 802 129 725 129 -fill $outline -tags {floor2 bg} + $w create line 725 133 725 129 -fill $outline -tags {floor2 bg} + $w create line 559 129 559 133 -fill $outline -tags {floor2 bg} + $w create line 559 133 725 133 -fill $outline -tags {floor2 bg} + $w create line 484 162 484 129 -fill $outline -tags {floor2 bg} + $w create line 559 129 484 129 -fill $outline -tags {floor2 bg} + $w create line 802 367 644 367 -fill $outline -tags {floor2 bg} + $w create line 644 367 644 391 -fill $outline -tags {floor2 bg} + $w create line 644 391 558 391 -fill $outline -tags {floor2 bg} + $w create line 558 327 558 391 -fill $outline -tags {floor2 bg} + $w create line 558 327 508 327 -fill $outline -tags {floor2 bg} + $w create line 508 327 508 311 -fill $outline -tags {floor2 bg} + $w create line 484 311 508 311 -fill $outline -tags {floor2 bg} + $w create line 484 280 484 311 -fill $outline -tags {floor2 bg} + $w create line 398 162 484 162 -fill $outline -tags {floor2 bg} + $w create line 484 280 395 280 -fill $outline -tags {floor2 bg} + $w create line 395 280 395 311 -fill $outline -tags {floor2 bg} + $w create line 258 387 60 387 -fill $outline -tags {floor2 bg} + $w create line 3 133 3 339 -fill $outline -tags {floor2 bg} + $w create line 3 339 0 339 -fill $outline -tags {floor2 bg} + $w create line 60 391 0 391 -fill $outline -tags {floor2 bg} + $w create line 0 339 0 391 -fill $outline -tags {floor2 bg} + $w create line 60 387 60 391 -fill $outline -tags {floor2 bg} + $w create line 258 329 258 387 -fill $outline -tags {floor2 bg} + $w create line 350 329 258 329 -fill $outline -tags {floor2 bg} + $w create line 395 311 350 311 -fill $outline -tags {floor2 bg} + $w create line 398 129 315 129 -fill $outline -tags {floor2 bg} + $w create line 176 133 315 133 -fill $outline -tags {floor2 bg} + $w create line 176 129 96 129 -fill $outline -tags {floor2 bg} + $w create line 3 133 96 133 -fill $outline -tags {floor2 bg} + $w create line 315 133 315 129 -fill $outline -tags {floor2 bg} + $w create line 176 133 176 129 -fill $outline -tags {floor2 bg} + $w create line 96 133 96 129 -fill $outline -tags {floor2 bg} +} + +# bg3 -- +# This procedure represents part of the floorplan database. When +# invoked, it instantiates the background information for the third +# floor. +# +# Arguments: +# w - The canvas window. +# fill - Fill color to use for the floor's background. +# outline - Color to use for the floor's outline. + +proc bg3 {w fill outline} { + $w create polygon 159 300 107 300 107 248 159 248 159 129 96 129 96 \ + 133 21 133 21 331 0 331 0 391 60 391 60 370 159 370 159 300 \ + -tags {floor3 bg} -fill $fill -outline {} + $w create polygon 258 370 258 329 350 329 350 311 399 311 399 129 \ + 315 129 315 133 176 133 176 129 159 129 159 370 258 370 \ + -tags {floor3 bg} -fill $fill -outline {} + $w create line 96 133 96 129 -fill $outline -tags {floor3 bg} + $w create line 176 129 96 129 -fill $outline -tags {floor3 bg} + $w create line 176 129 176 133 -fill $outline -tags {floor3 bg} + $w create line 315 133 176 133 -fill $outline -tags {floor3 bg} + $w create line 315 133 315 129 -fill $outline -tags {floor3 bg} + $w create line 399 129 315 129 -fill $outline -tags {floor3 bg} + $w create line 399 311 399 129 -fill $outline -tags {floor3 bg} + $w create line 399 311 350 311 -fill $outline -tags {floor3 bg} + $w create line 350 329 350 311 -fill $outline -tags {floor3 bg} + $w create line 350 329 258 329 -fill $outline -tags {floor3 bg} + $w create line 258 370 258 329 -fill $outline -tags {floor3 bg} + $w create line 60 370 258 370 -fill $outline -tags {floor3 bg} + $w create line 60 370 60 391 -fill $outline -tags {floor3 bg} + $w create line 60 391 0 391 -fill $outline -tags {floor3 bg} + $w create line 0 391 0 331 -fill $outline -tags {floor3 bg} + $w create line 21 331 0 331 -fill $outline -tags {floor3 bg} + $w create line 21 331 21 133 -fill $outline -tags {floor3 bg} + $w create line 96 133 21 133 -fill $outline -tags {floor3 bg} + $w create line 107 300 159 300 159 248 107 248 107 300 \ + -fill $outline -tags {floor3 bg} +} + +# fg1 -- +# This procedure represents part of the floorplan database. When +# invoked, it instantiates the foreground information for the first +# floor (office outlines and numbers). +# +# Arguments: +# w - The canvas window. +# color - Color to use for drawing foreground information. + +proc fg1 {w color} { + global floorLabels floorItems + set i [$w create polygon 375 246 375 172 341 172 341 246 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 101 + set {floorItems(101)} $i + $w create text 358 209 -text 101 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 307 240 339 240 339 206 307 206 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) {Pub Lift1} + set {floorItems(Pub Lift1)} $i + $w create text 323 223 -text {Pub Lift1} -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 339 205 307 205 307 171 339 171 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) {Priv Lift1} + set {floorItems(Priv Lift1)} $i + $w create text 323 188 -text {Priv Lift1} -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 42 389 42 337 1 337 1 389 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 110 + set {floorItems(110)} $i + $w create text 21.5 363 -text 110 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 59 389 59 385 90 385 90 337 44 337 44 389 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 109 + set {floorItems(109)} $i + $w create text 67 363 -text 109 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 51 300 51 253 6 253 6 300 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 111 + set {floorItems(111)} $i + $w create text 28.5 276.5 -text 111 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 98 248 98 309 79 309 79 248 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 117B + set {floorItems(117B)} $i + $w create text 88.5 278.5 -text 117B -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 51 251 51 204 6 204 6 251 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 112 + set {floorItems(112)} $i + $w create text 28.5 227.5 -text 112 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 6 156 51 156 51 203 6 203 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 113 + set {floorItems(113)} $i + $w create text 28.5 179.5 -text 113 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 85 169 79 169 79 192 85 192 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 117A + set {floorItems(117A)} $i + $w create text 82 180.5 -text 117A -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 77 302 77 168 53 168 53 302 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 117 + set {floorItems(117)} $i + $w create text 65 235 -text 117 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 51 155 51 115 6 115 6 155 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 114 + set {floorItems(114)} $i + $w create text 28.5 135 -text 114 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 95 115 53 115 53 168 95 168 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 115 + set {floorItems(115)} $i + $w create text 74 141.5 -text 115 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 87 113 87 27 10 27 10 113 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 116 + set {floorItems(116)} $i + $w create text 48.5 70 -text 116 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 89 91 128 91 128 113 89 113 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 118 + set {floorItems(118)} $i + $w create text 108.5 102 -text 118 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 178 128 178 132 216 132 216 91 163 91 163 112 149 112 149 128 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 120 + set {floorItems(120)} $i + $w create text 189.5 111.5 -text 120 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 79 193 87 193 87 169 136 169 136 192 156 192 156 169 175 169 175 246 79 246 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 122 + set {floorItems(122)} $i + $w create text 131 207.5 -text 122 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 138 169 154 169 154 191 138 191 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 121 + set {floorItems(121)} $i + $w create text 146 180 -text 121 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 99 300 126 300 126 309 99 309 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 106A + set {floorItems(106A)} $i + $w create text 112.5 304.5 -text 106A -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 128 299 128 309 150 309 150 248 99 248 99 299 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 105 + set {floorItems(105)} $i + $w create text 124.5 278.5 -text 105 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 174 309 174 300 152 300 152 309 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 106B + set {floorItems(106B)} $i + $w create text 163 304.5 -text 106B -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 176 299 176 309 216 309 216 248 152 248 152 299 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 104 + set {floorItems(104)} $i + $w create text 184 278.5 -text 104 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 138 385 138 337 91 337 91 385 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 108 + set {floorItems(108)} $i + $w create text 114.5 361 -text 108 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 256 337 140 337 140 385 256 385 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 107 + set {floorItems(107)} $i + $w create text 198 361 -text 107 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 300 353 300 329 260 329 260 353 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) Smoking + set {floorItems(Smoking)} $i + $w create text 280 341 -text Smoking -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 314 135 314 170 306 170 306 246 177 246 177 135 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 123 + set {floorItems(123)} $i + $w create text 245.5 190.5 -text 123 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 217 248 301 248 301 326 257 326 257 310 217 310 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 103 + set {floorItems(103)} $i + $w create text 259 287 -text 103 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 396 188 377 188 377 169 316 169 316 131 396 131 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 124 + set {floorItems(124)} $i + $w create text 356 150 -text 124 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 397 226 407 226 407 189 377 189 377 246 397 246 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 125 + set {floorItems(125)} $i + $w create text 392 217.5 -text 125 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 399 187 409 187 409 207 474 207 474 164 399 164 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 126 + set {floorItems(126)} $i + $w create text 436.5 185.5 -text 126 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 409 209 409 229 399 229 399 253 486 253 486 239 474 239 474 209 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 127 + set {floorItems(127)} $i + $w create text 436.5 231 -text 127 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 501 164 501 174 495 174 495 188 490 188 490 204 476 204 476 164 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) MShower + set {floorItems(MShower)} $i + $w create text 488.5 184 -text MShower -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 497 176 513 176 513 204 492 204 492 190 497 190 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) Closet + set {floorItems(Closet)} $i + $w create text 502.5 190 -text Closet -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 476 237 476 206 513 206 513 254 488 254 488 237 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) WShower + set {floorItems(WShower)} $i + $w create text 494.5 230 -text WShower -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 486 131 558 131 558 135 724 135 724 166 697 166 697 275 553 275 531 254 515 254 515 174 503 174 503 161 486 161 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 130 + set {floorItems(130)} $i + $w create text 638.5 205 -text 130 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 308 242 339 242 339 248 342 248 342 246 397 246 397 276 393 276 393 309 300 309 300 248 308 248 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 102 + set {floorItems(102)} $i + $w create text 367.5 278.5 -text 102 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 397 255 486 255 486 276 397 276 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 128 + set {floorItems(128)} $i + $w create text 441.5 265.5 -text 128 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 510 309 486 309 486 255 530 255 552 277 561 277 561 325 510 325 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 129 + set {floorItems(129)} $i + $w create text 535.5 293 -text 129 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 696 281 740 281 740 387 642 387 642 389 561 389 561 277 696 277 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 133 + set {floorItems(133)} $i + $w create text 628.5 335 -text 133 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 742 387 742 281 800 281 800 387 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 132 + set {floorItems(132)} $i + $w create text 771 334 -text 132 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 800 168 800 280 699 280 699 168 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 134 + set {floorItems(134)} $i + $w create text 749.5 224 -text 134 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 726 131 726 166 800 166 800 131 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 135 + set {floorItems(135)} $i + $w create text 763 148.5 -text 135 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 340 360 335 363 331 365 326 366 304 366 304 312 396 312 396 288 400 288 404 288 409 290 413 292 418 297 421 302 422 309 421 318 417 325 411 330 405 332 397 333 344 333 340 334 336 336 335 338 332 342 331 347 332 351 334 354 336 357 341 359 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) {Ramona Stair} + set {floorItems(Ramona Stair)} $i + $w create text 368 323 -text {Ramona Stair} -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 30 23 30 5 93 5 98 5 104 7 110 10 116 16 119 20 122 28 123 32 123 68 220 68 220 87 90 87 90 23 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) {University Stair} + set {floorItems(University Stair)} $i + $w create text 155 77.5 -text {University Stair} -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 282 37 295 40 312 49 323 56 337 70 352 56 358 48 363 39 365 29 348 25 335 22 321 14 300 5 283 1 260 0 246 0 242 2 236 4 231 8 227 13 223 17 221 22 220 34 260 34 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) {Plaza Stair} + set {floorItems(Plaza Stair)} $i + $w create text 317.5 28.5 -text {Plaza Stair} -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 220 34 260 34 282 37 295 40 312 49 323 56 337 70 350 83 365 94 377 100 386 104 386 128 220 128 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) {Plaza Deck} + set {floorItems(Plaza Deck)} $i + $w create text 303 81 -text {Plaza Deck} -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 257 336 77 336 6 336 6 301 77 301 77 310 257 310 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 106 + set {floorItems(106)} $i + $w create text 131.5 318.5 -text 106 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 146 110 162 110 162 91 130 91 130 115 95 115 95 128 114 128 114 151 157 151 157 153 112 153 112 130 97 130 97 168 175 168 175 131 146 131 -fill {} -outline {} -tags {floor1 room}] + set floorLabels($i) 119 + set {floorItems(119)} $i + $w create text 143.5 133 -text 119 -fill $color -anchor c -tags {floor1 label} + $w create line 155 191 155 189 -fill $color -tags {floor1 wall} + $w create line 155 177 155 169 -fill $color -tags {floor1 wall} + $w create line 96 129 96 169 -fill $color -tags {floor1 wall} + $w create line 78 169 176 169 -fill $color -tags {floor1 wall} + $w create line 176 247 176 129 -fill $color -tags {floor1 wall} + $w create line 340 206 307 206 -fill $color -tags {floor1 wall} + $w create line 340 187 340 170 -fill $color -tags {floor1 wall} + $w create line 340 210 340 201 -fill $color -tags {floor1 wall} + $w create line 340 247 340 224 -fill $color -tags {floor1 wall} + $w create line 340 241 307 241 -fill $color -tags {floor1 wall} + $w create line 376 246 376 170 -fill $color -tags {floor1 wall} + $w create line 307 247 307 170 -fill $color -tags {floor1 wall} + $w create line 376 170 307 170 -fill $color -tags {floor1 wall} + $w create line 315 129 315 170 -fill $color -tags {floor1 wall} + $w create line 147 129 176 129 -fill $color -tags {floor1 wall} + $w create line 202 133 176 133 -fill $color -tags {floor1 wall} + $w create line 398 129 315 129 -fill $color -tags {floor1 wall} + $w create line 258 352 258 387 -fill $color -tags {floor1 wall} + $w create line 60 387 60 391 -fill $color -tags {floor1 wall} + $w create line 0 337 0 391 -fill $color -tags {floor1 wall} + $w create line 60 391 0 391 -fill $color -tags {floor1 wall} + $w create line 3 114 3 337 -fill $color -tags {floor1 wall} + $w create line 258 387 60 387 -fill $color -tags {floor1 wall} + $w create line 52 237 52 273 -fill $color -tags {floor1 wall} + $w create line 52 189 52 225 -fill $color -tags {floor1 wall} + $w create line 52 140 52 177 -fill $color -tags {floor1 wall} + $w create line 395 306 395 311 -fill $color -tags {floor1 wall} + $w create line 531 254 398 254 -fill $color -tags {floor1 wall} + $w create line 475 178 475 238 -fill $color -tags {floor1 wall} + $w create line 502 162 398 162 -fill $color -tags {floor1 wall} + $w create line 398 129 398 188 -fill $color -tags {floor1 wall} + $w create line 383 188 376 188 -fill $color -tags {floor1 wall} + $w create line 408 188 408 194 -fill $color -tags {floor1 wall} + $w create line 398 227 398 254 -fill $color -tags {floor1 wall} + $w create line 408 227 398 227 -fill $color -tags {floor1 wall} + $w create line 408 222 408 227 -fill $color -tags {floor1 wall} + $w create line 408 206 408 210 -fill $color -tags {floor1 wall} + $w create line 408 208 475 208 -fill $color -tags {floor1 wall} + $w create line 484 278 484 311 -fill $color -tags {floor1 wall} + $w create line 484 311 508 311 -fill $color -tags {floor1 wall} + $w create line 508 327 508 311 -fill $color -tags {floor1 wall} + $w create line 559 327 508 327 -fill $color -tags {floor1 wall} + $w create line 644 391 559 391 -fill $color -tags {floor1 wall} + $w create line 644 389 644 391 -fill $color -tags {floor1 wall} + $w create line 514 205 475 205 -fill $color -tags {floor1 wall} + $w create line 496 189 496 187 -fill $color -tags {floor1 wall} + $w create line 559 129 484 129 -fill $color -tags {floor1 wall} + $w create line 484 162 484 129 -fill $color -tags {floor1 wall} + $w create line 725 133 559 133 -fill $color -tags {floor1 wall} + $w create line 559 129 559 133 -fill $color -tags {floor1 wall} + $w create line 725 149 725 167 -fill $color -tags {floor1 wall} + $w create line 725 129 802 129 -fill $color -tags {floor1 wall} + $w create line 802 389 802 129 -fill $color -tags {floor1 wall} + $w create line 739 167 802 167 -fill $color -tags {floor1 wall} + $w create line 396 188 408 188 -fill $color -tags {floor1 wall} + $w create line 0 337 9 337 -fill $color -tags {floor1 wall} + $w create line 58 337 21 337 -fill $color -tags {floor1 wall} + $w create line 43 391 43 337 -fill $color -tags {floor1 wall} + $w create line 105 337 75 337 -fill $color -tags {floor1 wall} + $w create line 91 387 91 337 -fill $color -tags {floor1 wall} + $w create line 154 337 117 337 -fill $color -tags {floor1 wall} + $w create line 139 387 139 337 -fill $color -tags {floor1 wall} + $w create line 227 337 166 337 -fill $color -tags {floor1 wall} + $w create line 258 337 251 337 -fill $color -tags {floor1 wall} + $w create line 258 328 302 328 -fill $color -tags {floor1 wall} + $w create line 302 355 302 311 -fill $color -tags {floor1 wall} + $w create line 395 311 302 311 -fill $color -tags {floor1 wall} + $w create line 484 278 395 278 -fill $color -tags {floor1 wall} + $w create line 395 294 395 278 -fill $color -tags {floor1 wall} + $w create line 473 278 473 275 -fill $color -tags {floor1 wall} + $w create line 473 256 473 254 -fill $color -tags {floor1 wall} + $w create line 533 257 531 254 -fill $color -tags {floor1 wall} + $w create line 553 276 551 274 -fill $color -tags {floor1 wall} + $w create line 698 276 553 276 -fill $color -tags {floor1 wall} + $w create line 559 391 559 327 -fill $color -tags {floor1 wall} + $w create line 802 389 644 389 -fill $color -tags {floor1 wall} + $w create line 741 314 741 389 -fill $color -tags {floor1 wall} + $w create line 698 280 698 167 -fill $color -tags {floor1 wall} + $w create line 707 280 698 280 -fill $color -tags {floor1 wall} + $w create line 802 280 731 280 -fill $color -tags {floor1 wall} + $w create line 741 280 741 302 -fill $color -tags {floor1 wall} + $w create line 698 167 727 167 -fill $color -tags {floor1 wall} + $w create line 725 137 725 129 -fill $color -tags {floor1 wall} + $w create line 514 254 514 175 -fill $color -tags {floor1 wall} + $w create line 496 175 514 175 -fill $color -tags {floor1 wall} + $w create line 502 175 502 162 -fill $color -tags {floor1 wall} + $w create line 475 166 475 162 -fill $color -tags {floor1 wall} + $w create line 496 176 496 175 -fill $color -tags {floor1 wall} + $w create line 491 189 496 189 -fill $color -tags {floor1 wall} + $w create line 491 205 491 189 -fill $color -tags {floor1 wall} + $w create line 487 238 475 238 -fill $color -tags {floor1 wall} + $w create line 487 240 487 238 -fill $color -tags {floor1 wall} + $w create line 487 252 487 254 -fill $color -tags {floor1 wall} + $w create line 315 133 304 133 -fill $color -tags {floor1 wall} + $w create line 256 133 280 133 -fill $color -tags {floor1 wall} + $w create line 78 247 270 247 -fill $color -tags {floor1 wall} + $w create line 307 247 294 247 -fill $color -tags {floor1 wall} + $w create line 214 133 232 133 -fill $color -tags {floor1 wall} + $w create line 217 247 217 266 -fill $color -tags {floor1 wall} + $w create line 217 309 217 291 -fill $color -tags {floor1 wall} + $w create line 217 309 172 309 -fill $color -tags {floor1 wall} + $w create line 154 309 148 309 -fill $color -tags {floor1 wall} + $w create line 175 300 175 309 -fill $color -tags {floor1 wall} + $w create line 151 300 175 300 -fill $color -tags {floor1 wall} + $w create line 151 247 151 309 -fill $color -tags {floor1 wall} + $w create line 78 237 78 265 -fill $color -tags {floor1 wall} + $w create line 78 286 78 309 -fill $color -tags {floor1 wall} + $w create line 106 309 78 309 -fill $color -tags {floor1 wall} + $w create line 130 309 125 309 -fill $color -tags {floor1 wall} + $w create line 99 309 99 247 -fill $color -tags {floor1 wall} + $w create line 127 299 99 299 -fill $color -tags {floor1 wall} + $w create line 127 309 127 299 -fill $color -tags {floor1 wall} + $w create line 155 191 137 191 -fill $color -tags {floor1 wall} + $w create line 137 169 137 191 -fill $color -tags {floor1 wall} + $w create line 78 171 78 169 -fill $color -tags {floor1 wall} + $w create line 78 190 78 218 -fill $color -tags {floor1 wall} + $w create line 86 192 86 169 -fill $color -tags {floor1 wall} + $w create line 86 192 78 192 -fill $color -tags {floor1 wall} + $w create line 52 301 3 301 -fill $color -tags {floor1 wall} + $w create line 52 286 52 301 -fill $color -tags {floor1 wall} + $w create line 52 252 3 252 -fill $color -tags {floor1 wall} + $w create line 52 203 3 203 -fill $color -tags {floor1 wall} + $w create line 3 156 52 156 -fill $color -tags {floor1 wall} + $w create line 8 25 8 114 -fill $color -tags {floor1 wall} + $w create line 63 114 3 114 -fill $color -tags {floor1 wall} + $w create line 75 114 97 114 -fill $color -tags {floor1 wall} + $w create line 108 114 129 114 -fill $color -tags {floor1 wall} + $w create line 129 114 129 89 -fill $color -tags {floor1 wall} + $w create line 52 114 52 128 -fill $color -tags {floor1 wall} + $w create line 132 89 88 89 -fill $color -tags {floor1 wall} + $w create line 88 25 88 89 -fill $color -tags {floor1 wall} + $w create line 88 114 88 89 -fill $color -tags {floor1 wall} + $w create line 218 89 144 89 -fill $color -tags {floor1 wall} + $w create line 147 111 147 129 -fill $color -tags {floor1 wall} + $w create line 162 111 147 111 -fill $color -tags {floor1 wall} + $w create line 162 109 162 111 -fill $color -tags {floor1 wall} + $w create line 162 96 162 89 -fill $color -tags {floor1 wall} + $w create line 218 89 218 94 -fill $color -tags {floor1 wall} + $w create line 218 89 218 119 -fill $color -tags {floor1 wall} + $w create line 8 25 88 25 -fill $color -tags {floor1 wall} + $w create line 258 337 258 328 -fill $color -tags {floor1 wall} + $w create line 113 129 96 129 -fill $color -tags {floor1 wall} + $w create line 302 355 258 355 -fill $color -tags {floor1 wall} + $w create line 386 104 386 129 -fill $color -tags {floor1 wall} + $w create line 377 100 386 104 -fill $color -tags {floor1 wall} + $w create line 365 94 377 100 -fill $color -tags {floor1 wall} + $w create line 350 83 365 94 -fill $color -tags {floor1 wall} + $w create line 337 70 350 83 -fill $color -tags {floor1 wall} + $w create line 337 70 323 56 -fill $color -tags {floor1 wall} + $w create line 312 49 323 56 -fill $color -tags {floor1 wall} + $w create line 295 40 312 49 -fill $color -tags {floor1 wall} + $w create line 282 37 295 40 -fill $color -tags {floor1 wall} + $w create line 260 34 282 37 -fill $color -tags {floor1 wall} + $w create line 253 34 260 34 -fill $color -tags {floor1 wall} + $w create line 386 128 386 104 -fill $color -tags {floor1 wall} + $w create line 113 152 156 152 -fill $color -tags {floor1 wall} + $w create line 113 152 156 152 -fill $color -tags {floor1 wall} + $w create line 113 152 113 129 -fill $color -tags {floor1 wall} +} + +# fg2 -- +# This procedure represents part of the floorplan database. When +# invoked, it instantiates the foreground information for the second +# floor (office outlines and numbers). +# +# Arguments: +# w - The canvas window. +# color - Color to use for drawing foreground information. + +proc fg2 {w color} { + global floorLabels floorItems + set i [$w create polygon 748 188 755 188 755 205 758 205 758 222 800 222 800 168 748 168 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 238 + set {floorItems(238)} $i + $w create text 774 195 -text 238 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 726 188 746 188 746 166 800 166 800 131 726 131 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 237 + set {floorItems(237)} $i + $w create text 763 148.5 -text 237 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 497 187 497 204 559 204 559 324 641 324 643 324 643 291 641 291 641 205 696 205 696 291 694 291 694 314 715 314 715 291 715 205 755 205 755 190 724 190 724 187 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 246 + set {floorItems(246)} $i + $w create text 600 264 -text 246 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 694 279 643 279 643 314 694 314 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 247 + set {floorItems(247)} $i + $w create text 668.5 296.5 -text 247 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 232 250 308 250 308 242 339 242 339 246 397 246 397 255 476 255 476 250 482 250 559 250 559 274 482 274 482 278 396 278 396 274 232 274 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 202 + set {floorItems(202)} $i + $w create text 285.5 260 -text 202 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 53 228 53 338 176 338 233 338 233 196 306 196 306 180 175 180 175 169 156 169 156 196 176 196 176 228 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 206 + set {floorItems(206)} $i + $w create text 143 267 -text 206 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 51 277 6 277 6 338 51 338 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 212 + set {floorItems(212)} $i + $w create text 28.5 307.5 -text 212 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 557 276 486 276 486 309 510 309 510 325 557 325 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 245 + set {floorItems(245)} $i + $w create text 521.5 300.5 -text 245 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 560 389 599 389 599 326 560 326 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 244 + set {floorItems(244)} $i + $w create text 579.5 357.5 -text 244 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 601 389 601 326 643 326 643 389 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 243 + set {floorItems(243)} $i + $w create text 622 357.5 -text 243 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 688 316 645 316 645 365 688 365 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 242 + set {floorItems(242)} $i + $w create text 666.5 340.5 -text 242 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 802 367 759 367 759 226 802 226 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) {Barbecue Deck} + set {floorItems(Barbecue Deck)} $i + $w create text 780.5 296.5 -text {Barbecue Deck} -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 755 262 755 314 717 314 717 262 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 240 + set {floorItems(240)} $i + $w create text 736 288 -text 240 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 755 316 689 316 689 365 755 365 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 241 + set {floorItems(241)} $i + $w create text 722 340.5 -text 241 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 755 206 717 206 717 261 755 261 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 239 + set {floorItems(239)} $i + $w create text 736 233.5 -text 239 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 695 277 643 277 643 206 695 206 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 248 + set {floorItems(248)} $i + $w create text 669 241.5 -text 248 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 676 135 676 185 724 185 724 135 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 236 + set {floorItems(236)} $i + $w create text 700 160 -text 236 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 675 135 635 135 635 145 628 145 628 185 675 185 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 235 + set {floorItems(235)} $i + $w create text 651.5 160 -text 235 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 626 143 633 143 633 135 572 135 572 143 579 143 579 185 626 185 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 234 + set {floorItems(234)} $i + $w create text 606 160 -text 234 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 557 135 571 135 571 145 578 145 578 185 527 185 527 131 557 131 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 233 + set {floorItems(233)} $i + $w create text 552.5 158 -text 233 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 476 249 557 249 557 205 476 205 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 230 + set {floorItems(230)} $i + $w create text 516.5 227 -text 230 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 476 164 486 164 486 131 525 131 525 185 476 185 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 232 + set {floorItems(232)} $i + $w create text 500.5 158 -text 232 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 476 186 495 186 495 204 476 204 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 229 + set {floorItems(229)} $i + $w create text 485.5 195 -text 229 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 474 207 409 207 409 187 399 187 399 164 474 164 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 227 + set {floorItems(227)} $i + $w create text 436.5 185.5 -text 227 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 399 228 399 253 474 253 474 209 409 209 409 228 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 228 + set {floorItems(228)} $i + $w create text 436.5 231 -text 228 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 397 246 397 226 407 226 407 189 377 189 377 246 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 226 + set {floorItems(226)} $i + $w create text 392 217.5 -text 226 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 377 169 316 169 316 131 397 131 397 188 377 188 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 225 + set {floorItems(225)} $i + $w create text 356.5 150 -text 225 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 234 198 306 198 306 249 234 249 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 224 + set {floorItems(224)} $i + $w create text 270 223.5 -text 224 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 270 179 306 179 306 170 314 170 314 135 270 135 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 223 + set {floorItems(223)} $i + $w create text 292 157 -text 223 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 268 179 221 179 221 135 268 135 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 222 + set {floorItems(222)} $i + $w create text 244.5 157 -text 222 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 177 179 219 179 219 135 177 135 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 221 + set {floorItems(221)} $i + $w create text 198 157 -text 221 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 299 327 349 327 349 284 341 284 341 276 299 276 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 204 + set {floorItems(204)} $i + $w create text 324 301.5 -text 204 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 234 276 297 276 297 327 257 327 257 338 234 338 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 205 + set {floorItems(205)} $i + $w create text 265.5 307 -text 205 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 256 385 256 340 212 340 212 385 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 207 + set {floorItems(207)} $i + $w create text 234 362.5 -text 207 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 210 340 164 340 164 385 210 385 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 208 + set {floorItems(208)} $i + $w create text 187 362.5 -text 208 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 115 340 162 340 162 385 115 385 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 209 + set {floorItems(209)} $i + $w create text 138.5 362.5 -text 209 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 89 228 89 156 53 156 53 228 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 217 + set {floorItems(217)} $i + $w create text 71 192 -text 217 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 89 169 97 169 97 190 89 190 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 217A + set {floorItems(217A)} $i + $w create text 93 179.5 -text 217A -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 89 156 89 168 95 168 95 135 53 135 53 156 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 216 + set {floorItems(216)} $i + $w create text 71 145.5 -text 216 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 51 179 51 135 6 135 6 179 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 215 + set {floorItems(215)} $i + $w create text 28.5 157 -text 215 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 51 227 6 227 6 180 51 180 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 214 + set {floorItems(214)} $i + $w create text 28.5 203.5 -text 214 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 51 275 6 275 6 229 51 229 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 213 + set {floorItems(213)} $i + $w create text 28.5 252 -text 213 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 114 340 67 340 67 385 114 385 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 210 + set {floorItems(210)} $i + $w create text 90.5 362.5 -text 210 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 59 389 59 385 65 385 65 340 1 340 1 389 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 211 + set {floorItems(211)} $i + $w create text 33 364.5 -text 211 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 393 309 350 309 350 282 342 282 342 276 393 276 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 203 + set {floorItems(203)} $i + $w create text 367.5 292.5 -text 203 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 99 191 91 191 91 226 174 226 174 198 154 198 154 192 109 192 109 169 99 169 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 220 + set {floorItems(220)} $i + $w create text 132.5 208.5 -text 220 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 339 205 307 205 307 171 339 171 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) {Priv Lift2} + set {floorItems(Priv Lift2)} $i + $w create text 323 188 -text {Priv Lift2} -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 307 240 339 240 339 206 307 206 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) {Pub Lift 2} + set {floorItems(Pub Lift 2)} $i + $w create text 323 223 -text {Pub Lift 2} -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 175 168 97 168 97 131 175 131 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 218 + set {floorItems(218)} $i + $w create text 136 149.5 -text 218 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 154 191 111 191 111 169 154 169 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 219 + set {floorItems(219)} $i + $w create text 132.5 180 -text 219 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 375 246 375 172 341 172 341 246 -fill {} -outline {} -tags {floor2 room}] + set floorLabels($i) 201 + set {floorItems(201)} $i + $w create text 358 209 -text 201 -fill $color -anchor c -tags {floor2 label} + $w create line 641 186 678 186 -fill $color -tags {floor2 wall} + $w create line 757 350 757 367 -fill $color -tags {floor2 wall} + $w create line 634 133 634 144 -fill $color -tags {floor2 wall} + $w create line 634 144 627 144 -fill $color -tags {floor2 wall} + $w create line 572 133 572 144 -fill $color -tags {floor2 wall} + $w create line 572 144 579 144 -fill $color -tags {floor2 wall} + $w create line 398 129 398 162 -fill $color -tags {floor2 wall} + $w create line 174 197 175 197 -fill $color -tags {floor2 wall} + $w create line 175 197 175 227 -fill $color -tags {floor2 wall} + $w create line 757 206 757 221 -fill $color -tags {floor2 wall} + $w create line 396 188 408 188 -fill $color -tags {floor2 wall} + $w create line 727 189 725 189 -fill $color -tags {floor2 wall} + $w create line 747 167 802 167 -fill $color -tags {floor2 wall} + $w create line 747 167 747 189 -fill $color -tags {floor2 wall} + $w create line 755 189 739 189 -fill $color -tags {floor2 wall} + $w create line 769 224 757 224 -fill $color -tags {floor2 wall} + $w create line 802 224 802 129 -fill $color -tags {floor2 wall} + $w create line 802 129 725 129 -fill $color -tags {floor2 wall} + $w create line 725 189 725 129 -fill $color -tags {floor2 wall} + $w create line 725 186 690 186 -fill $color -tags {floor2 wall} + $w create line 676 133 676 186 -fill $color -tags {floor2 wall} + $w create line 627 144 627 186 -fill $color -tags {floor2 wall} + $w create line 629 186 593 186 -fill $color -tags {floor2 wall} + $w create line 579 144 579 186 -fill $color -tags {floor2 wall} + $w create line 559 129 559 133 -fill $color -tags {floor2 wall} + $w create line 725 133 559 133 -fill $color -tags {floor2 wall} + $w create line 484 162 484 129 -fill $color -tags {floor2 wall} + $w create line 559 129 484 129 -fill $color -tags {floor2 wall} + $w create line 526 129 526 186 -fill $color -tags {floor2 wall} + $w create line 540 186 581 186 -fill $color -tags {floor2 wall} + $w create line 528 186 523 186 -fill $color -tags {floor2 wall} + $w create line 511 186 475 186 -fill $color -tags {floor2 wall} + $w create line 496 190 496 186 -fill $color -tags {floor2 wall} + $w create line 496 205 496 202 -fill $color -tags {floor2 wall} + $w create line 475 205 527 205 -fill $color -tags {floor2 wall} + $w create line 558 205 539 205 -fill $color -tags {floor2 wall} + $w create line 558 205 558 249 -fill $color -tags {floor2 wall} + $w create line 558 249 475 249 -fill $color -tags {floor2 wall} + $w create line 662 206 642 206 -fill $color -tags {floor2 wall} + $w create line 695 206 675 206 -fill $color -tags {floor2 wall} + $w create line 695 278 642 278 -fill $color -tags {floor2 wall} + $w create line 642 291 642 206 -fill $color -tags {floor2 wall} + $w create line 695 291 695 206 -fill $color -tags {floor2 wall} + $w create line 716 208 716 206 -fill $color -tags {floor2 wall} + $w create line 757 206 716 206 -fill $color -tags {floor2 wall} + $w create line 757 221 757 224 -fill $color -tags {floor2 wall} + $w create line 793 224 802 224 -fill $color -tags {floor2 wall} + $w create line 757 262 716 262 -fill $color -tags {floor2 wall} + $w create line 716 220 716 264 -fill $color -tags {floor2 wall} + $w create line 716 315 716 276 -fill $color -tags {floor2 wall} + $w create line 757 315 703 315 -fill $color -tags {floor2 wall} + $w create line 757 325 757 224 -fill $color -tags {floor2 wall} + $w create line 757 367 644 367 -fill $color -tags {floor2 wall} + $w create line 689 367 689 315 -fill $color -tags {floor2 wall} + $w create line 647 315 644 315 -fill $color -tags {floor2 wall} + $w create line 659 315 691 315 -fill $color -tags {floor2 wall} + $w create line 600 325 600 391 -fill $color -tags {floor2 wall} + $w create line 627 325 644 325 -fill $color -tags {floor2 wall} + $w create line 644 391 644 315 -fill $color -tags {floor2 wall} + $w create line 615 325 575 325 -fill $color -tags {floor2 wall} + $w create line 644 391 558 391 -fill $color -tags {floor2 wall} + $w create line 563 325 558 325 -fill $color -tags {floor2 wall} + $w create line 558 391 558 314 -fill $color -tags {floor2 wall} + $w create line 558 327 508 327 -fill $color -tags {floor2 wall} + $w create line 558 275 484 275 -fill $color -tags {floor2 wall} + $w create line 558 302 558 275 -fill $color -tags {floor2 wall} + $w create line 508 327 508 311 -fill $color -tags {floor2 wall} + $w create line 484 311 508 311 -fill $color -tags {floor2 wall} + $w create line 484 275 484 311 -fill $color -tags {floor2 wall} + $w create line 475 208 408 208 -fill $color -tags {floor2 wall} + $w create line 408 206 408 210 -fill $color -tags {floor2 wall} + $w create line 408 222 408 227 -fill $color -tags {floor2 wall} + $w create line 408 227 398 227 -fill $color -tags {floor2 wall} + $w create line 398 227 398 254 -fill $color -tags {floor2 wall} + $w create line 408 188 408 194 -fill $color -tags {floor2 wall} + $w create line 383 188 376 188 -fill $color -tags {floor2 wall} + $w create line 398 188 398 162 -fill $color -tags {floor2 wall} + $w create line 398 162 484 162 -fill $color -tags {floor2 wall} + $w create line 475 162 475 254 -fill $color -tags {floor2 wall} + $w create line 398 254 475 254 -fill $color -tags {floor2 wall} + $w create line 484 280 395 280 -fill $color -tags {floor2 wall} + $w create line 395 311 395 275 -fill $color -tags {floor2 wall} + $w create line 307 197 293 197 -fill $color -tags {floor2 wall} + $w create line 278 197 233 197 -fill $color -tags {floor2 wall} + $w create line 233 197 233 249 -fill $color -tags {floor2 wall} + $w create line 307 179 284 179 -fill $color -tags {floor2 wall} + $w create line 233 249 278 249 -fill $color -tags {floor2 wall} + $w create line 269 179 269 133 -fill $color -tags {floor2 wall} + $w create line 220 179 220 133 -fill $color -tags {floor2 wall} + $w create line 155 191 110 191 -fill $color -tags {floor2 wall} + $w create line 90 190 98 190 -fill $color -tags {floor2 wall} + $w create line 98 169 98 190 -fill $color -tags {floor2 wall} + $w create line 52 133 52 165 -fill $color -tags {floor2 wall} + $w create line 52 214 52 177 -fill $color -tags {floor2 wall} + $w create line 52 226 52 262 -fill $color -tags {floor2 wall} + $w create line 52 274 52 276 -fill $color -tags {floor2 wall} + $w create line 234 275 234 339 -fill $color -tags {floor2 wall} + $w create line 226 339 258 339 -fill $color -tags {floor2 wall} + $w create line 211 387 211 339 -fill $color -tags {floor2 wall} + $w create line 214 339 177 339 -fill $color -tags {floor2 wall} + $w create line 258 387 60 387 -fill $color -tags {floor2 wall} + $w create line 3 133 3 339 -fill $color -tags {floor2 wall} + $w create line 165 339 129 339 -fill $color -tags {floor2 wall} + $w create line 117 339 80 339 -fill $color -tags {floor2 wall} + $w create line 68 339 59 339 -fill $color -tags {floor2 wall} + $w create line 0 339 46 339 -fill $color -tags {floor2 wall} + $w create line 60 391 0 391 -fill $color -tags {floor2 wall} + $w create line 0 339 0 391 -fill $color -tags {floor2 wall} + $w create line 60 387 60 391 -fill $color -tags {floor2 wall} + $w create line 258 329 258 387 -fill $color -tags {floor2 wall} + $w create line 350 329 258 329 -fill $color -tags {floor2 wall} + $w create line 395 311 350 311 -fill $color -tags {floor2 wall} + $w create line 398 129 315 129 -fill $color -tags {floor2 wall} + $w create line 176 133 315 133 -fill $color -tags {floor2 wall} + $w create line 176 129 96 129 -fill $color -tags {floor2 wall} + $w create line 3 133 96 133 -fill $color -tags {floor2 wall} + $w create line 66 387 66 339 -fill $color -tags {floor2 wall} + $w create line 115 387 115 339 -fill $color -tags {floor2 wall} + $w create line 163 387 163 339 -fill $color -tags {floor2 wall} + $w create line 234 275 276 275 -fill $color -tags {floor2 wall} + $w create line 288 275 309 275 -fill $color -tags {floor2 wall} + $w create line 298 275 298 329 -fill $color -tags {floor2 wall} + $w create line 341 283 350 283 -fill $color -tags {floor2 wall} + $w create line 321 275 341 275 -fill $color -tags {floor2 wall} + $w create line 375 275 395 275 -fill $color -tags {floor2 wall} + $w create line 315 129 315 170 -fill $color -tags {floor2 wall} + $w create line 376 170 307 170 -fill $color -tags {floor2 wall} + $w create line 307 250 307 170 -fill $color -tags {floor2 wall} + $w create line 376 245 376 170 -fill $color -tags {floor2 wall} + $w create line 340 241 307 241 -fill $color -tags {floor2 wall} + $w create line 340 245 340 224 -fill $color -tags {floor2 wall} + $w create line 340 210 340 201 -fill $color -tags {floor2 wall} + $w create line 340 187 340 170 -fill $color -tags {floor2 wall} + $w create line 340 206 307 206 -fill $color -tags {floor2 wall} + $w create line 293 250 307 250 -fill $color -tags {floor2 wall} + $w create line 271 179 238 179 -fill $color -tags {floor2 wall} + $w create line 226 179 195 179 -fill $color -tags {floor2 wall} + $w create line 176 129 176 179 -fill $color -tags {floor2 wall} + $w create line 182 179 176 179 -fill $color -tags {floor2 wall} + $w create line 174 169 176 169 -fill $color -tags {floor2 wall} + $w create line 162 169 90 169 -fill $color -tags {floor2 wall} + $w create line 96 169 96 129 -fill $color -tags {floor2 wall} + $w create line 175 227 90 227 -fill $color -tags {floor2 wall} + $w create line 90 190 90 227 -fill $color -tags {floor2 wall} + $w create line 52 179 3 179 -fill $color -tags {floor2 wall} + $w create line 52 228 3 228 -fill $color -tags {floor2 wall} + $w create line 52 276 3 276 -fill $color -tags {floor2 wall} + $w create line 155 177 155 169 -fill $color -tags {floor2 wall} + $w create line 110 191 110 169 -fill $color -tags {floor2 wall} + $w create line 155 189 155 197 -fill $color -tags {floor2 wall} + $w create line 350 283 350 329 -fill $color -tags {floor2 wall} + $w create line 162 197 155 197 -fill $color -tags {floor2 wall} + $w create line 341 275 341 283 -fill $color -tags {floor2 wall} +} + +# fg3 -- +# This procedure represents part of the floorplan database. When +# invoked, it instantiates the foreground information for the third +# floor (office outlines and numbers). +# +# Arguments: +# w - The canvas window. +# color - Color to use for drawing foreground information. + +proc fg3 {w color} { + global floorLabels floorItems + set i [$w create polygon 89 228 89 180 70 180 70 228 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 316 + set {floorItems(316)} $i + $w create text 79.5 204 -text 316 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 115 368 162 368 162 323 115 323 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 309 + set {floorItems(309)} $i + $w create text 138.5 345.5 -text 309 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 164 323 164 368 211 368 211 323 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 308 + set {floorItems(308)} $i + $w create text 187.5 345.5 -text 308 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 256 368 212 368 212 323 256 323 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 307 + set {floorItems(307)} $i + $w create text 234 345.5 -text 307 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 244 276 297 276 297 327 260 327 260 321 244 321 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 305 + set {floorItems(305)} $i + $w create text 270.5 301.5 -text 305 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 251 219 251 203 244 203 244 219 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 324B + set {floorItems(324B)} $i + $w create text 247.5 211 -text 324B -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 251 249 244 249 244 232 251 232 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 324A + set {floorItems(324A)} $i + $w create text 247.5 240.5 -text 324A -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 223 135 223 179 177 179 177 135 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 320 + set {floorItems(320)} $i + $w create text 200 157 -text 320 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 114 368 114 323 67 323 67 368 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 310 + set {floorItems(310)} $i + $w create text 90.5 345.5 -text 310 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 23 277 23 321 68 321 68 277 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 312 + set {floorItems(312)} $i + $w create text 45.5 299 -text 312 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 23 229 68 229 68 275 23 275 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 313 + set {floorItems(313)} $i + $w create text 45.5 252 -text 313 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 68 227 23 227 23 180 68 180 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 314 + set {floorItems(314)} $i + $w create text 45.5 203.5 -text 314 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 95 179 95 135 23 135 23 179 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 315 + set {floorItems(315)} $i + $w create text 59 157 -text 315 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 99 226 99 204 91 204 91 226 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 316B + set {floorItems(316B)} $i + $w create text 95 215 -text 316B -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 91 202 99 202 99 180 91 180 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 316A + set {floorItems(316A)} $i + $w create text 95 191 -text 316A -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 97 169 109 169 109 192 154 192 154 198 174 198 174 226 101 226 101 179 97 179 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 319 + set {floorItems(319)} $i + $w create text 141.5 209 -text 319 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 65 368 58 368 58 389 1 389 1 333 23 333 23 323 65 323 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 311 + set {floorItems(311)} $i + $w create text 29.5 361 -text 311 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 154 191 111 191 111 169 154 169 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 318 + set {floorItems(318)} $i + $w create text 132.5 180 -text 318 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 175 168 97 168 97 131 175 131 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 317 + set {floorItems(317)} $i + $w create text 136 149.5 -text 317 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 274 194 274 221 306 221 306 194 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 323 + set {floorItems(323)} $i + $w create text 290 207.5 -text 323 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 306 222 274 222 274 249 306 249 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 325 + set {floorItems(325)} $i + $w create text 290 235.5 -text 325 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 263 179 224 179 224 135 263 135 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 321 + set {floorItems(321)} $i + $w create text 243.5 157 -text 321 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 314 169 306 169 306 192 273 192 264 181 264 135 314 135 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 322 + set {floorItems(322)} $i + $w create text 293.5 163.5 -text 322 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 307 240 339 240 339 206 307 206 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) {Pub Lift3} + set {floorItems(Pub Lift3)} $i + $w create text 323 223 -text {Pub Lift3} -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 339 205 307 205 307 171 339 171 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) {Priv Lift3} + set {floorItems(Priv Lift3)} $i + $w create text 323 188 -text {Priv Lift3} -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 350 284 376 284 376 276 397 276 397 309 350 309 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 303 + set {floorItems(303)} $i + $w create text 373.5 292.5 -text 303 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 272 203 272 249 252 249 252 230 244 230 244 221 252 221 252 203 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 324 + set {floorItems(324)} $i + $w create text 262 226 -text 324 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 299 276 299 327 349 327 349 284 341 284 341 276 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 304 + set {floorItems(304)} $i + $w create text 324 301.5 -text 304 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 375 246 375 172 341 172 341 246 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 301 + set {floorItems(301)} $i + $w create text 358 209 -text 301 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 397 246 377 246 377 185 397 185 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 327 + set {floorItems(327)} $i + $w create text 387 215.5 -text 327 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 316 131 316 169 377 169 377 185 397 185 397 131 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 326 + set {floorItems(326)} $i + $w create text 356.5 150 -text 326 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 308 251 242 251 242 274 342 274 342 282 375 282 375 274 397 274 397 248 339 248 339 242 308 242 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 302 + set {floorItems(302)} $i + $w create text 319.5 261 -text 302 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 70 321 242 321 242 200 259 200 259 203 272 203 272 193 263 180 242 180 175 180 175 169 156 169 156 196 177 196 177 228 107 228 70 228 70 275 107 275 107 248 160 248 160 301 107 301 107 275 70 275 -fill {} -outline {} -tags {floor3 room}] + set floorLabels($i) 306 + set {floorItems(306)} $i + $w create text 200.5 284.5 -text 306 -fill $color -anchor c -tags {floor3 label} + $w create line 341 275 341 283 -fill $color -tags {floor3 wall} + $w create line 162 197 155 197 -fill $color -tags {floor3 wall} + $w create line 396 247 399 247 -fill $color -tags {floor3 wall} + $w create line 399 129 399 311 -fill $color -tags {floor3 wall} + $w create line 258 202 243 202 -fill $color -tags {floor3 wall} + $w create line 350 283 350 329 -fill $color -tags {floor3 wall} + $w create line 251 231 243 231 -fill $color -tags {floor3 wall} + $w create line 243 220 251 220 -fill $color -tags {floor3 wall} + $w create line 243 250 243 202 -fill $color -tags {floor3 wall} + $w create line 155 197 155 190 -fill $color -tags {floor3 wall} + $w create line 110 192 110 169 -fill $color -tags {floor3 wall} + $w create line 155 192 110 192 -fill $color -tags {floor3 wall} + $w create line 155 177 155 169 -fill $color -tags {floor3 wall} + $w create line 176 197 176 227 -fill $color -tags {floor3 wall} + $w create line 69 280 69 274 -fill $color -tags {floor3 wall} + $w create line 21 276 69 276 -fill $color -tags {floor3 wall} + $w create line 69 262 69 226 -fill $color -tags {floor3 wall} + $w create line 21 228 69 228 -fill $color -tags {floor3 wall} + $w create line 21 179 75 179 -fill $color -tags {floor3 wall} + $w create line 69 179 69 214 -fill $color -tags {floor3 wall} + $w create line 90 220 90 227 -fill $color -tags {floor3 wall} + $w create line 90 204 90 202 -fill $color -tags {floor3 wall} + $w create line 90 203 100 203 -fill $color -tags {floor3 wall} + $w create line 90 187 90 179 -fill $color -tags {floor3 wall} + $w create line 90 227 176 227 -fill $color -tags {floor3 wall} + $w create line 100 179 100 227 -fill $color -tags {floor3 wall} + $w create line 100 179 87 179 -fill $color -tags {floor3 wall} + $w create line 96 179 96 129 -fill $color -tags {floor3 wall} + $w create line 162 169 96 169 -fill $color -tags {floor3 wall} + $w create line 173 169 176 169 -fill $color -tags {floor3 wall} + $w create line 182 179 176 179 -fill $color -tags {floor3 wall} + $w create line 176 129 176 179 -fill $color -tags {floor3 wall} + $w create line 195 179 226 179 -fill $color -tags {floor3 wall} + $w create line 224 133 224 179 -fill $color -tags {floor3 wall} + $w create line 264 179 264 133 -fill $color -tags {floor3 wall} + $w create line 238 179 264 179 -fill $color -tags {floor3 wall} + $w create line 273 207 273 193 -fill $color -tags {floor3 wall} + $w create line 273 235 273 250 -fill $color -tags {floor3 wall} + $w create line 273 224 273 219 -fill $color -tags {floor3 wall} + $w create line 273 193 307 193 -fill $color -tags {floor3 wall} + $w create line 273 222 307 222 -fill $color -tags {floor3 wall} + $w create line 273 250 307 250 -fill $color -tags {floor3 wall} + $w create line 384 247 376 247 -fill $color -tags {floor3 wall} + $w create line 340 206 307 206 -fill $color -tags {floor3 wall} + $w create line 340 187 340 170 -fill $color -tags {floor3 wall} + $w create line 340 210 340 201 -fill $color -tags {floor3 wall} + $w create line 340 247 340 224 -fill $color -tags {floor3 wall} + $w create line 340 241 307 241 -fill $color -tags {floor3 wall} + $w create line 376 247 376 170 -fill $color -tags {floor3 wall} + $w create line 307 250 307 170 -fill $color -tags {floor3 wall} + $w create line 376 170 307 170 -fill $color -tags {floor3 wall} + $w create line 315 129 315 170 -fill $color -tags {floor3 wall} + $w create line 376 283 366 283 -fill $color -tags {floor3 wall} + $w create line 376 283 376 275 -fill $color -tags {floor3 wall} + $w create line 399 275 376 275 -fill $color -tags {floor3 wall} + $w create line 341 275 320 275 -fill $color -tags {floor3 wall} + $w create line 341 283 350 283 -fill $color -tags {floor3 wall} + $w create line 298 275 298 329 -fill $color -tags {floor3 wall} + $w create line 308 275 298 275 -fill $color -tags {floor3 wall} + $w create line 243 322 243 275 -fill $color -tags {floor3 wall} + $w create line 243 275 284 275 -fill $color -tags {floor3 wall} + $w create line 258 322 226 322 -fill $color -tags {floor3 wall} + $w create line 212 370 212 322 -fill $color -tags {floor3 wall} + $w create line 214 322 177 322 -fill $color -tags {floor3 wall} + $w create line 163 370 163 322 -fill $color -tags {floor3 wall} + $w create line 165 322 129 322 -fill $color -tags {floor3 wall} + $w create line 84 322 117 322 -fill $color -tags {floor3 wall} + $w create line 71 322 64 322 -fill $color -tags {floor3 wall} + $w create line 115 322 115 370 -fill $color -tags {floor3 wall} + $w create line 66 322 66 370 -fill $color -tags {floor3 wall} + $w create line 52 322 21 322 -fill $color -tags {floor3 wall} + $w create line 21 331 0 331 -fill $color -tags {floor3 wall} + $w create line 21 331 21 133 -fill $color -tags {floor3 wall} + $w create line 96 133 21 133 -fill $color -tags {floor3 wall} + $w create line 176 129 96 129 -fill $color -tags {floor3 wall} + $w create line 315 133 176 133 -fill $color -tags {floor3 wall} + $w create line 315 129 399 129 -fill $color -tags {floor3 wall} + $w create line 399 311 350 311 -fill $color -tags {floor3 wall} + $w create line 350 329 258 329 -fill $color -tags {floor3 wall} + $w create line 258 322 258 370 -fill $color -tags {floor3 wall} + $w create line 60 370 258 370 -fill $color -tags {floor3 wall} + $w create line 60 370 60 391 -fill $color -tags {floor3 wall} + $w create line 0 391 0 331 -fill $color -tags {floor3 wall} + $w create line 60 391 0 391 -fill $color -tags {floor3 wall} + $w create line 307 250 307 242 -fill $color -tags {floor3 wall} + $w create line 273 250 307 250 -fill $color -tags {floor3 wall} + $w create line 258 250 243 250 -fill $color -tags {floor3 wall} +} + +# Below is the "main program" that creates the floorplan demonstration. + +set w .floor +global c currentRoom colors activeFloor +catch {destroy $w} +toplevel $w +wm title $w "Floorplan Canvas Demonstration" +wm iconname $w "Floorplan" +wm geometry $w +20+20 +wm minsize $w 75p 75p + +label $w.msg -font $font -wraplength 8i -justify left -text "This window contains a canvas widget showing the floorplan of Digital Equipment Corporation's Western Research Laboratory. It has three levels. At any given time one of the levels is active, meaning that you can see its room structure. To activate a level, click the left mouse button anywhere on it. As the mouse moves over the active level, the room under the mouse lights up and its room number appears in the \"Room:\" entry. You can also type a room number in the entry and the room will light up." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +set f [frame $w.frame] +pack $f -side top -fill both -expand yes +set h [ttk::scrollbar $f.hscroll -orient horizontal] +set v [ttk::scrollbar $f.vscroll -orient vertical] +set f1 [frame $f.f1 -borderwidth 2 -relief sunken] +set c [canvas $f1.c -highlightthickness 0 \ + -xscrollcommand [list $h set] -yscrollcommand [list $v set]] +pack $c -expand yes -fill both +grid $f1 -padx 1 -pady 1 -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky news +grid $v -padx 1 -pady 1 -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news +grid $h -padx 1 -pady 1 -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news +grid rowconfig $f 0 -weight 1 -minsize 0 +grid columnconfig $f 0 -weight 1 -minsize 0 +pack $f -expand yes -fill both -padx 1 -pady 1 + +$v configure -command [list $c yview] +$h configure -command [list $c xview] + +# Create an entry for displaying and typing in current room. + +entry $c.entry -width 10 -textvariable currentRoom + +# Choose colors, then fill in the floorplan. + +if {[winfo depth $c] > 1} { + set colors(bg1) #a9c1da + set colors(outline1) #77889a + set colors(bg2) #9ab0c6 + set colors(outline2) #687786 + set colors(bg3) #8ba0b3 + set colors(outline3) #596673 + set colors(offices) Black + set colors(active) #c4d1df +} else { + set colors(bg1) white + set colors(outline1) black + set colors(bg2) white + set colors(outline2) black + set colors(bg3) white + set colors(outline3) black + set colors(offices) Black + set colors(active) black +} +set activeFloor "" +floorDisplay $c 3 + +# Set up event bindings for canvas: + +$c bind floor1 "floorDisplay $c 1" +$c bind floor2 "floorDisplay $c 2" +$c bind floor3 "floorDisplay $c 3" +$c bind room "newRoom $c" +$c bind room {set currentRoom ""} +bind $c "$c scan mark %x %y" +bind $c "$c scan dragto %x %y" +bind $c "unset currentRoom" +set currentRoom "" +trace add variable currentRoom write "roomChanged $c" diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/fontchoose.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/fontchoose.tcl new file mode 100644 index 00000000..6ae54797 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/fontchoose.tcl @@ -0,0 +1,67 @@ +# fontchoose.tcl -- +# +# Show off the stock font selector dialog + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +set w .fontchoose +catch {destroy $w} +toplevel $w +wm title $w "Font Selection Dialog" +wm iconname $w "fontchooser" +positionWindow $w + +catch {font create FontchooseDemoFont {*}[font actual TkDefaultFont]} + +# The font chooser needs to be configured and then shown. +proc SelectFont {parent} { + tk fontchooser configure -font FontchooseDemoFont \ + -command ApplyFont -parent $parent + tk fontchooser show +} + +proc ApplyFont {font} { + font configure FontchooseDemoFont {*}[font actual $font] +} + +# When the visibility of the fontchooser changes, the following event is fired +# to the parent widget. +# +bind $w <> { + if {[tk fontchooser configure -visible]} { + %W.f.font state disabled + } else { + %W.f.font state !disabled + } +} + + +set f [ttk::frame $w.f -relief sunken -padding 1.5p] + +text $f.msg -font FontchooseDemoFont -width 40 -height 6 -borderwidth 0 \ + -yscrollcommand [list $f.vs set] +ttk::scrollbar $f.vs -command [list $f.msg yview] + +$f.msg insert end "Press the buttons below to choose a new font for the\ + text shown in this window.\n" {} + +ttk::button $f.font -text "Set font ..." -command [list SelectFont $w] + +grid $f.msg $f.vs -sticky news +grid $f.font - -sticky e +grid columnconfigure $f 0 -weight 1 +grid rowconfigure $f 0 -weight 1 + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] + +grid $f -sticky news +grid $btns -sticky ew +grid columnconfigure $w 0 -weight 1 +grid rowconfigure $w 0 -weight 1 +update idletasks +grid propagate $f 0 diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/form.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/form.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/form.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/form.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/goldberg.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/goldberg.tcl new file mode 100644 index 00000000..5323ccea --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/goldberg.tcl @@ -0,0 +1,1970 @@ +##+################################################################# +# +# TkGoldberg.tcl +# by Keith Vetter, March 13, 2003 +# +# "Man will always find a difficult means to perform a simple task" +# Rube Goldberg +# +# Reproduced here with permission. +# +##+################################################################# +# +# Keith Vetter 2003-03-21: this started out as a simple little program +# but was so much fun that it grew and grew. So I apologize about the +# size but I just couldn't resist sharing it. +# +# This is a whizzlet that does a Rube Goldberg type animation, the +# design of which comes from an New Years e-card from IncrediMail. +# That version had nice sound effects which I eschewed. On the other +# hand, that version was in black and white (actually dark blue and +# light blue) and this one is fully colorized. +# +# One thing I learned from this project is that drawing filled complex +# objects on a canvas is really hard. More often than not I had to +# draw each item twice--once with the desired fill color but no +# outline, and once with no fill but with the outline. Another trick +# is erasing by drawing with the background color. Having a flood fill +# command would have been extremely helpful. +# +# Two wiki pages were extremely helpful: Drawing rounded rectangles +# which I generalized into Drawing rounded polygons, and regular +# polygons which allowed me to convert ovals and arcs into polygons +# which could then be rotated (see Canvas Rotation). I also wrote +# Named Colors to aid in the color selection. +# +# I could comment on the code, but it's just 26 state machines with +# lots of canvas create and move calls. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +set w .goldberg +catch {destroy $w} +toplevel $w +wm title $w "Tk Goldberg (demonstration)" +wm iconname $w "goldberg" +wm resizable $w 0 0 +#positionWindow $w + +proc StartMessage {w} { + set msg1 "This\ + is a demonstration of just how complex you can make your animations\ + become. Close this dialog and click the ball to start things\ + moving!\n\n\"Man will always find a difficult means to perform a\ + simple task\"\n - Rube Goldberg" + PlacedDialog $w.c.messframe $msg1 {Helvetica 12} +} +###--- End of Boilerplate ---### + +array set BaseDimensions { + CanX 675 + CanY 540 + ScrX 750 + ScrY 750 + MsgX 338 + MsgY 573 + MovX 10 + MovY -45 +} + +# The original value was 1.0 but this can make the demo +# too large for the screen. Try a smaller value. +set overallFactor 0.75 + +foreach el [array names BaseDimensions] { + set Dims($el) [expr {$BaseDimensions($el) * $overallFactor}]p +} + +set scaleFactor [expr {$::tk::scalingPct / 100.0 * $overallFactor}] + +# Ensure that this is an array +array set animationCallbacks {} +bind $w { + if {"%W" eq [winfo toplevel %W]} { + unset S C delays + } +} + +set S(title) "Tk Goldberg" +set S(speed) 5 +set S(cnt) 0 +set S(message) "\\nWelcome\\nto\\nTcl/Tk!" +array set delays \ + {1 500 2 400 3 300 4 200 5 150 6 100 7 80 8 50 9 20 10 10} + +set MSTART 0; set MGO 1; set MPAUSE 2; set MSSTEP 3; set MBSTEP 4; set MDONE 5 +set S(mode) $::MSTART + +# Colors for everything +set C(fg) black +set C(bg) cornflowerblue + +set C(0) white; set C(1a) darkgreen; set C(1b) yellow +set C(2) red; set C(3a) green; set C(3b) darkblue +set C(4) $C(fg); set C(5a) brown; set C(5b) white +set C(6) magenta; set C(7) green; set C(8) $C(fg) +set C(9) blue4; set C(10a) white; set C(10b) cyan +set C(11a) yellow; set C(11b) mediumblue; set C(12) tan2 +set C(13a) yellow; set C(13b) red; set C(14) white +set C(15a) green; set C(15b) yellow; set C(16) gray65 +set C(17) \#A65353; set C(18) $C(fg); set C(19) gray50 +set C(20) cyan; set C(21) gray65; set C(22) $C(20) +set C(23a) blue; set C(23b) red; set C(23c) yellow +set C(24a) red; set C(24b) white; +set C(24c) black; set C(26) $C(0); + +proc DoDisplay {w} { + global S C Dims + + ttk::frame $w.ctrl -relief ridge -borderwidth 1 -padding 3p + pack [frame $w.screen -bd 1 -relief raised] \ + -side left -fill both -expand 1 + + canvas $w.c -width $Dims(CanX) -height $Dims(CanY) -bg $C(bg) \ + -highlightthickness 0 + $w.c config -scrollregion [list 0 0 $Dims(ScrX) $Dims(ScrY)] + $w.c yview moveto .06 ;# Kludge: move everything up + pack $w.c -in $w.screen -side top -fill both -expand 1 + + bind $w.c { %W yview moveto .06 } + bind $w.c [list $w.pause invoke] + bind $w.c { + after cancel $animationCallbacks(goldberg) + unset animationCallbacks(goldberg) + } + DoCtrlFrame $w + DoDetailFrame $w + if {[tk windowingsystem] ne "aqua"} { + ttk::button $w.show -text "â–¶" -command [list ShowCtrl $w] -width 2 + } else { + button $w.show -text "â–¶" -command [list ShowCtrl $w] -width 1 \ + -borderwidth 1 -highlightthickness 0 -padx 0 -pady 0 \ + -highlightbackground $C(bg) + } + place $w.show -in $w.c -relx 1 -rely 0 -anchor ne + update +} + +proc DoCtrlFrame {w} { + global S + ttk::button $w.start -text "Start" -command [list DoButton $w 0] + ttk::checkbutton $w.pause -text "Pause" -command [list DoButton $w 1] \ + -variable S(pause) + ttk::button $w.step -text "Single Step" -command [list DoButton $w 2] + ttk::button $w.bstep -text "Big Step" -command [list DoButton $w 4] + ttk::button $w.reset -text "Reset" -command [list DoButton $w 3] + ttk::labelframe $w.details + raise $w.details + set S(details) 0 + ttk::checkbutton $w.details.cb -text "Details" -variable S(details) + ttk::labelframe $w.message -text "Message" + ttk::entry $w.message.e -textvariable S(message) -justify center + ttk::labelframe $w.speed -text "Speed: 0" + ttk::scale $w.speed.scale -orient horizontal -from 1 -to 10 \ + -variable S(speed) + ttk::button $w.about -text About -command [list About $w] + + grid $w.start -in $w.ctrl -row 0 -sticky ew + grid rowconfigure $w.ctrl 1 -minsize 3p + grid $w.pause -in $w.ctrl -row 2 -sticky ew + grid $w.step -in $w.ctrl -sticky ew -pady 1.5p + grid $w.bstep -in $w.ctrl -sticky ew + grid $w.reset -in $w.ctrl -sticky ew -pady 1.5p + grid rowconfigure $w.ctrl 10 -minsize 3p + grid $w.details -in $w.ctrl -row 11 -sticky ew + grid rowconfigure $w.ctrl 11 -minsize 3p + $w.details configure -labelwidget $w.details.cb + grid [ttk::frame $w.details.b -height 1] ;# Work around minor bug + raise $w.details + raise $w.details.cb + grid rowconfigure $w.ctrl 50 -weight 1 + trace add variable ::S(mode) write [list ActiveGUI $w] + trace add variable ::S(details) write [list ActiveGUI $w] + trace add variable ::S(speed) write [list ActiveGUI $w] + + grid $w.message -in $w.ctrl -row 98 -sticky ew -pady {0 3p} + grid $w.message.e -sticky nsew + grid $w.speed -in $w.ctrl -row 99 -sticky ew -pady {0 3p} + pack $w.speed.scale -fill both -expand 1 + grid $w.about -in $w.ctrl -row 100 -sticky ew + bind $w.reset {set S(mode) -1} ;# Debugging + + ## See Code / Dismiss buttons hack! + grid [ttk::separator $w.ctrl.sep] -sticky ew -pady {3p 1.5p} + set btns {} + foreach b [winfo children [addSeeDismiss $w.ctrl.buttons $w]] { + if {[winfo class $b] eq "TButton"} { + set btns [linsert $btns 0 $b] ;# Prepend + } + } + set i 0 + foreach b $btns { + grid [set b2 [ttk::button $w.ctrl.b[incr i]]] -sticky ew -pady {1.5p 0} + foreach b3 [$b configure] { + set b3 [lindex $b3 0] + # Some options are read-only; ignore those errors + catch {$b2 configure $b3 [$b cget $b3]} + } + } + destroy $btns +} + +proc DoDetailFrame {w} { + set w2 $w.details.f + ttk::frame $w2 + + ttk::label $w2.l -textvariable S(cnt) -background white + grid $w2.l - - - -sticky ew -row 0 + for {set i 1} {1} {incr i} { + if {[info procs "Move$i"] eq ""} break + ttk::label $w2.l$i -text $i -anchor e -width 2 -background white + ttk::label $w2.ll$i -textvariable STEP($i) -width 5 -background white + set row [expr {($i + 1) / 2}] + set col [expr {(($i + 1) & 1) * 2}] + grid $w2.l$i -sticky ew -row $row -column $col + grid $w2.ll$i -sticky ew -row $row -column [incr col] + } + grid columnconfigure $w2 1 -weight 1 +} + +# Map or unmap the ctrl window +proc ShowCtrl {w} { + if {[winfo ismapped $w.ctrl]} { + pack forget $w.ctrl + $w.show config -text "â–¶" + } else { + pack $w.ctrl -side right -fill both -ipady 5 + $w.show config -text "â—€" + } +} + +proc DrawAll {w} { + global scaleFactor + ResetStep + $w.c delete all + for {set i 0} {1} {incr i} { + set p "Draw$i" + if {[info procs $p] eq ""} break + $p $w + } + + $w.c scale all 0 0 $scaleFactor $scaleFactor + + # Tile the strike box with a 4x4 bitmap image derived + # from Tk's built-in 16x16 bitmap gray25. Adjust + # x1, y2 to make dimensions multiples of 4 pixels. + + image create bitmap smallGray25 -data { + #define smallGray25_width 4 + #define smallGray25_height 4 + static unsigned char smallGray25_bits[] = { + 0x08, 0x02, 0x08, 0x02}; + } -foreground $::C(fg) + + lassign [$w.c coords StrikeBox] x1 y1 x2 y2 + set oldMidY [expr {round(($y1 + $y2) / 2.0)}] + + set rowCount [expr {round(($y2 - $y1) / 4.0)}] + set colCount [expr {round(($x2 - $x1) / 4.0)}] + set x2 [expr {round($x2)}] + set x1 [expr {$x2 - $colCount * 4}] + set y1 [expr {round($y1)}] + set y2 [expr {$y1 + $rowCount * 4}] + + set newMidY [expr {round(($y1 + $y2) / 2.0)}] + set deltaY [expr {$oldMidY - $newMidY}] + incr y1 $deltaY; incr y2 $deltaY + $w.c coords StrikeBox $x1 $y1 $x2 $y2 + + for {set row 0; set y $y1} {$row < $rowCount} {incr row; incr y 4} { + for {set col 0; set x $x1} {$col < $colCount} {incr col; incr x 4} { + $w.c create image $x $y -image smallGray25 -anchor nw + } + } +} + +proc ActiveGUI {w var1 var2 op} { + global S MGO MSTART MDONE + array set z {0 disabled 1 normal} + + set m $S(mode) + set S(pause) [expr {$m == 2}] + $w.start config -state $z([expr {$m != $MGO}]) + $w.pause config -state $z([expr {$m != $MSTART && $m != $MDONE}]) + $w.step config -state $z([expr {$m != $MGO && $m != $MDONE}]) + $w.bstep config -state $z([expr {$m != $MGO && $m != $MDONE}]) + $w.reset config -state $z([expr {$m != $MSTART}]) + + if {$S(details)} { + grid $w.details.f -sticky ew + } else { + grid forget $w.details.f + } + set S(speed) [expr {round($S(speed))}] + $w.speed config -text "Speed: $S(speed)" +} + +proc Start {} { + global S MGO + set S(mode) $MGO +} + +proc DoButton {w what} { + global S MDONE MGO MSSTEP MBSTEP MPAUSE + + if {$what == 0} { ;# Start + if {$S(mode) == $MDONE} { + Reset $w + } + set S(mode) $MGO + } elseif {$what == 1} { ;# Pause + set S(mode) [expr {$S(pause) ? $MPAUSE : $MGO}] + } elseif {$what == 2} { ;# Step + set S(mode) $MSSTEP + } elseif {$what == 3} { ;# Reset + Reset $w + } elseif {$what == 4} { ;# Big step + set S(mode) $MBSTEP + } +} + +proc Go {w {who {}}} { + global S delays animationCallbacks MGO MPAUSE MSSTEP MBSTEP + + set now [clock clicks -milliseconds] + catch {after cancel $animationCallbacks(goldberg)} + if {$who ne ""} { ;# Start here for debugging + set S(active) $who + set S(mode) $MGO + } + if {$S(mode) == -1} return ;# Debugging + set n 0 + if {$S(mode) != $MPAUSE} { ;# Not paused + set n [NextStep $w] ;# Do the next move + } + if {$S(mode) == $MSSTEP} { ;# Single step + set S(mode) $MPAUSE + } + if {$S(mode) == $MBSTEP && $n} { ;# Big step + set S(mode) $MSSTEP + } + + set elapsed [expr {[clock click -milliseconds] - $now}] + set delay [expr {$delays($S(speed)) - $elapsed}] + if {$delay <= 0} { + set delay 1 + } + set animationCallbacks(goldberg) [after $delay [list Go $w]] +} + +# NextStep: drives the next step of the animation +proc NextStep {w} { + global S MSTART MDONE + set rval 0 ;# Return value + + if {$S(mode) != $MSTART && $S(mode) != $MDONE} { + incr S(cnt) + } + set alive {} + foreach {who} $S(active) { + set n ["Move$who" $w] + if {$n & 1} { ;# This guy still alive + lappend alive $who + } + if {$n & 2} { ;# Next guy is active + lappend alive [expr {$who + 1}] + set rval 1 + } + if {$n & 4} { ;# End of puzzle flag + set S(mode) $MDONE ;# Done mode + set S(active) {} ;# No more animation + return 1 + } + } + set S(active) $alive + return $rval +} + +proc About {w} { + set msg "$::S(title)\nby Keith Vetter, March 2003\n(Reproduced by kind\ + permission of the author)\n\n\"Man will always find a difficult\ + means to perform a simple task.\"\n - Rube Goldberg" + PlacedDialog $w.c.messframe $msg {Helvetica 12 bold} + return +} +################################################################ +# +# All the drawing and moving routines +# + +# START HERE! banner +proc Draw0 {w} { + set color $::C(0) + set xy {699 119} + $w.c create text $xy -text "START HERE!" -fill $color -anchor e \ + -tag {I0 I0_0} -font {Times 12 italic bold} + set xy {719 119 763 119} + $w.c create line $xy -tag {I0 I0_1} -fill $color -width 3.75p -arrow last \ + -arrowshape {13.5p 13.5p 3.75p} + $w.c bind I0 Start +} +proc Move0 {w {step {}}} { + set step [GetStep 0 $step] + + if {$::S(mode) > $::MSTART} { ;# Start the ball rolling + MoveAbs $w I0 {-100 -100} ;# Hide the banner + return 2 + } + + set pos [scl { + {719 119} {724 119} {729 119} {734 119} + {739 119} {734 119} {729 119} {724 119} + }] + set step [expr {$step % [llength $pos]}] + lassign [lindex $pos $step] x y + $w.c coords I0_0 [expr {$x - [scl 20]}] $y + $w.c coords I0_1 $x $y [expr {$x + [scl 44]}] $y + return 1 +} + +# Dropping ball +proc Draw1 {w} { + set color $::C(1a) + set color2 $::C(1b) + set xy {844 133 800 133 800 346 820 346 820 168 844 168 844 133} + $w.c create poly $xy -width 2.25p -fill $color -outline {} + set xy {771 133 685 133 685 168 751 168 751 346 771 346 771 133} + $w.c create poly $xy -width 2.25p -fill $color -outline {} + + set xy [box 812 122 9] + $w.c create oval $xy -tag I1 -fill $color2 -outline {} + $w.c bind I1 Start +} +proc Move1 {w {step {}}} { + set step [GetStep 1 $step] + set pos [scl { + {807 122} {802 122} {797 123} {793 124} {789 129} {785 153} + {785 203} {785 278 x} {785 367} {810 392} {816 438} {821 503} + {824 585 y} {838 587} {848 593} {857 601} {-100 -100} + }] + if {$step >= [llength $pos]} { + return 0 + } + set where [lindex $pos $step] + MoveAbs $w I1 $where + + if {[lindex $where 2] eq "y"} { + Move15a $w + } + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# Lighting the match +proc Draw2 {w} { + set color red + set color $::C(2) + set xy {750 369 740 392 760 392} ;# Fulcrum + $w.c create poly $xy -fill $::C(fg) -outline $::C(fg) + set xy {628 335 660 383} ;# Strike box + $w.c create rect $xy -fill {} -outline $::C(fg) -tag StrikeBox + + set xy {702 366 798 366} ;# Lever + $w.c create line $xy -fill $::C(fg) -width 5.25p -tag I2_0 + set xy {712 363 712 355} ;# R strap + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I2_1 + set xy {705 363 705 355} ;# L strap + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I2_2 + set xy {679 356 679 360 717 360 717 356 679 356} ;# Match stick + $w.c create line $xy -fill $::C(fg) -tag I2_3 + + #set xy {662 352 680 365} ;# Match head + set xy { + 671 352 677.4 353.9 680 358.5 677.4 363.1 671 365 664.6 363.1 + 662 358.5 664.6 353.9 + } + $w.c create poly $xy -fill $color -outline $color -tag I2_4 +} +proc Move2 {w {step {}}} { + set step [GetStep 2 $step] + + set stages {0 0 1 2 0 2 1 0 1 2 0 2 1} + set xy(0) [scl { + 686 333 692 323 682 316 674 309 671 295 668 307 662 318 662 328 + 671 336 + }] + set xy(1) [scl { + 687 331 698 322 703 295 680 320 668 297 663 311 661 327 671 335}] + set xy(2) [scl { + 686 331 704 322 688 300 678 283 678 283 674 298 666 309 660 324 + 672 336 + }] + + if {$step >= [llength $stages]} { + $w.c delete I2 + return 0 + } + + if {$step == 0} { ;# Rotate the match + set beta 20 + lassign [Anchor $w I2_0 s] Ox Oy ;# Where to pivot + for {set i 0} {[$w.c find withtag I2_$i] ne ""} {incr i} { + RotateItem $w I2_$i $Ox $Oy $beta + } + $w.c create poly -tag I2 -smooth 1 -fill $::C(2) ;# For the flame + return 1 + } + $w.c coords I2 $xy([lindex $stages $step]) + return [expr {$step == 7 ? 3 : 1}] +} + +# Weight and pulleys +proc Draw3 {w} { + set color $::C(3a) + set color2 $::C(3b) + + set xy {602 296 577 174 518 174} + foreach {x y} $xy { ;# 3 Pulleys + $w.c create oval [box $x $y 13] -fill $color -outline $::C(fg) \ + -width 2.25p + $w.c create oval [box $x $y 2] -fill $::C(fg) -outline $::C(fg) + } + + set xy {750 309 670 309} ;# Wall to flame + $w.c create line $xy -tag I3_s -width 2.25p -fill $::C(fg) -smooth 1 + set xy {670 309 650 309} ;# Flame to pulley 1 + $w.c create line $xy -tag I3_0 -width 2.25p -fill $::C(fg) + set xy {650 309 600 309} ;# Flame to pulley 1 + $w.c create line $xy -tag I3_1 -width 2.25p -fill $::C(fg) + set xy {589 296 589 235} ;# Pulley 1 half way to 2 + $w.c create line $xy -tag I3_2 -width 2.25p -fill $::C(fg) + set xy {589 235 589 174} ;# Pulley 1 other half to 2 + $w.c create line $xy -width 2.25p -fill $::C(fg) + set xy {577 161 518 161} ;# Across the top + $w.c create line $xy -width 2.25p -fill $::C(fg) + set xy {505 174 505 205} ;# Down to weight + $w.c create line $xy -tag I3_w -width 2.25p -fill $::C(fg) + + # Draw the weight as 2 circles, two rectangles and 1 rounded rectangle + set xy {515 207 495 207} + foreach {x1 y1 x2 y2} $xy { + $w.c create oval [box $x1 $y1 6] -tag I3_ -fill $color2 \ + -outline $color2 + $w.c create oval [box $x2 $y2 6] -tag I3_ -fill $color2 \ + -outline $color2 + incr y1 -6; incr y2 6 + $w.c create rect $x1 $y1 $x2 $y2 -tag I3_ -fill $color2 \ + -outline $color2 + } + set xy {492 220 518 263} + set xy [RoundRect $w $xy 15] + $w.c create poly $xy -smooth 1 -tag I3_ -fill $color2 -outline $color2 + set xy {500 217 511 217} + $w.c create line $xy -tag I3_ -fill $color2 -width 7.5p + + set xy {502 393 522 393 522 465} ;# Bottom weight target + $w.c create line $xy -tag I3__ -fill $::C(fg) -join miter -width 7.5p +} +proc Move3 {w {step {}}} { + set step [GetStep 3 $step] + + set pos [scl {{505 247} {505 297} {505 386.5} {505 386.5}}] + set rope(0) [scl {750 309 729 301 711 324 690 300}] + set rope(1) [scl {750 309 737 292 736 335 717 315 712 320}] + set rope(2) [scl {750 309 737 309 740 343 736 351 725 340}] + set rope(3) [scl {750 309 738 321 746 345 742 356}] + + if {$step >= [llength $pos]} { + return 0 + } + + $w.c delete "I3_$step" ;# Delete part of the rope + MoveAbs $w I3_ [lindex $pos $step] ;# Move weight down + $w.c coords I3_s $rope($step) ;# Flapping rope end + $w.c coords I3_w [concat [scl {505 174}] [lindex $pos $step]] + if {$step == 2} { + $w.c move I3__ 0 30 + return 2 + } + return 1 +} + +# Cage and door +proc Draw4 {w} { + set color $::C(4) + lassign {527 356 611 464} x0 y0 x1 y1 + + for {set y $y0} {$y <= $y1} {incr y 12} { ;# Horizontal bars + $w.c create line $x0 $y $x1 $y -fill $color -width 0.75p + } + for {set x $x0} {$x <= $x1} {incr x 12} { ;# Vertical bars + $w.c create line $x $y0 $x $y1 -fill $color -width 0.75p + } + + set xy {518 464 518 428} ;# Swing gate + $w.c create line $xy -tag I4 -fill $color -width 2.25p +} +proc Move4 {w {step {}}} { + set step [GetStep 4 $step] + + set angles {-10 -20 -30 -30} + if {$step >= [llength $angles]} { + return 0 + } + RotateItem $w I4 [scl 518] [scl 464] [lindex $angles $step] + $w.c raise I4 + return [expr {$step == 3 ? 3 : 1}] +} + +# Mouse +proc Draw5 {w} { + set color $::C(5a) + set color2 $::C(5b) + set xy {377 248 410 248 410 465 518 465} ;# Mouse course + lappend xy 518 428 451 428 451 212 377 212 + $w.c create poly $xy -fill $color2 -outline $::C(fg) -width 2.25p + + set xy { + 534.5 445.5 541 440 552 436 560 436 569 440 574 446 575 452 574 454 + 566 456 554 456 545 456 537 454 530 452 + } + $w.c create poly $xy -tag {I5 I5_0} -fill $color + set xy {573 452 592 458 601 460 613 456} ;# Tail + $w.c create line $xy -tag {I5 I5_1} -fill $color -smooth 1 -width 2.25p + set xy [box 540 446 2] ;# Eye + set xy {540 444 541 445 541 447 540 448 538 447 538 445} + #.c create oval $xy -tag {I5 I5_2} -fill $::C(bg) -outline {} + $w.c create poly $xy -tag {I5 I5_2} -fill $::C(bg) -outline {} -smooth 1 + set xy {538 454 535 461} ;# Front leg + $w.c create line $xy -tag {I5 I5_3} -fill $color -width 1.5p + set xy {566 455 569 462} ;# Back leg + $w.c create line $xy -tag {I5 I5_4} -fill $color -width 1.5p + set xy {544 455 545 460} ;# 2nd front leg + $w.c create line $xy -tag {I5 I5_5} -fill $color -width 1.5p + set xy {560 455 558 460} ;# 2nd back leg + $w.c create line $xy -tag {I5 I5_6} -fill $color -width 1.5p +} +proc Move5 {w {step {}}} { + set step [GetStep 5 $step] + + set pos [scl { + {553 452} {533 452} {513 452} {493 452} {473 452} + {463 442 30} {445.5 441.5 30} {425.5 434.5 30} {422 414} {422 394} + {422 374} {422 354} {422 334} {422 314} {422 294} + {422 274 -30} {422 260.5 -30 x} {422.5 248.5 -28} {425 237} + }] + if {$step >= [llength $pos]} { + return 0 + } + + lassign [lindex $pos $step] x y beta next + MoveAbs $w I5 [list $x $y] + if {$beta ne ""} { + lassign [Centroid $w I5_0] Ox Oy + foreach id {0 1 2 3 4 5 6} { + RotateItem $w I5_$id $Ox $Oy $beta + } + } + if {$next eq "x"} { + return 3 + } + return 1 +} + +# Dropping gumballs +array set XY6 { + -1 {366 207} -2 {349 204} -3 {359 193} -4 {375 192} -5 {340 190} + -6 {349 177} -7 {366 177} -8 {380 176} -9 {332 172} -10 {342 161} + -11 {357 164} -12 {372 163} -13 {381 149} -14 {364 151} -15 {349 146} + -16 {333 148} 0 {357 219} + 1 {359 261} 2 {359 291} 3 {359 318} 4 {361 324} 5 {365 329} 6 {367 334} + 7 {367 340} 8 {366 346} 9 {364 350} 10 {361 355} 11 {359 370} 12 {359 391} + 13,0 {360 456} 13,1 {376 456} 13,2 {346 456} 13,3 {330 456} + 13,4 {353 444} 13,5 {368 443} 13,6 {339 442} 13,7 {359 431} + 13,8 {380 437} 13,9 {345 428} 13,10 {328 434} 13,11 {373 424} + 13,12 {331 420} 13,13 {360 417} 13,14 {345 412} 13,15 {376 410} + 13,16 {360 403} +} +proc Draw6 {w} { + set color $::C(6) + set xy {324 130 391 204} ;# Ball holder + set xy [RoundRect $w $xy 10] + $w.c create poly $xy -smooth 1 -outline $::C(fg) -width 2.25p -fill $color + set xy {339 204 376 253} ;# Below the ball holder + $w.c create rect $xy -fill {} -outline $::C(fg) -width 2.25p -fill $color \ + -tag I6c + set xy [box 346 339 28] + $w.c create oval $xy -fill $color -outline {} ;# Rotor + $w.c create arc $xy -outline $::C(fg) -width 1.5p -style arc \ + -start 80 -extent 205 + $w.c create arc $xy -outline $::C(fg) -width 1.5p -style arc \ + -start -41 -extent 85 + + set xy [box 346 339 15] ;# Center of rotor + $w.c create oval $xy -outline $::C(fg) -fill $::C(fg) -tag I6m + set xy {352 312 352 254 368 254 368 322} ;# Top drop to rotor + $w.c create poly $xy -fill $color -outline {} + $w.c create line $xy -fill $::C(fg) -width 1.5p + + set xy {353 240 367 300} ;# Poke bottom hole + $w.c create rect $xy -fill $color -outline {} + set xy {341 190 375 210} ;# Poke another hole + $w.c create rect $xy -fill $color -outline {} + + set xy {368 356 368 403 389 403 389 464 320 464 320 403 352 403 352 366} + $w.c create poly $xy -fill $color -outline {} -width 1.5p ;# Below rotor + $w.c create line $xy -fill $::C(fg) -width 1.5p + set xy [box 275 342 7] ;# On/off rotor + $w.c create oval $xy -outline $::C(fg) -fill $::C(fg) + set xy {276 334 342 325} ;# Fan belt top + $w.c create line $xy -fill $::C(fg) -width 2.25p + set xy {276 349 342 353} ;# Fan belt bottom + $w.c create line $xy -fill $::C(fg) -width 2.25p + + set xy {337 212 337 247} ;# What the mouse pushes + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I6_ + set xy {392 212 392 247} + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I6_ + set xy {337 230 392 230} + $w.c create line $xy -fill $::C(fg) -width 5.25p -tag I6_ + + set who -1 ;# All the balls + set colors {red cyan orange green blue darkblue} + lappend colors {*}$colors {*}$colors + + for {set i 0} {$i < 17} {incr i} { + set loc [expr {-1 * $i}] + set color [lindex $colors $i] + $w.c create oval [box {*}$::XY6($loc) 5] -fill $color \ + -outline $color -tag I6_b$i + } + Draw6a $w 12 ;# The wheel +} +proc Draw6a {w beta {scale 0}} { + $w.c delete I6_0 + if {$scale} { + lassign [scl {346 339}] Ox Oy + } else { + lassign {346 339} Ox Oy + } + for {set i 0} {$i < 4} {incr i} { + set b [expr {$beta + $i * 45}] + if {$scale} { + lassign [RotateC [scl 28] 0 0 0 $b] x y + } else { + lassign [RotateC 28 0 0 0 $b] x y + } + set xy [list [expr {$Ox+$x}] [expr {$Oy+$y}] \ + [expr {$Ox-$x}] [expr {$Oy-$y}]] + $w.c create line $xy -tag I6_0 -fill $::C(fg) -width 1.5p + } +} +proc Move6 {w {step {}}} { + set step [GetStep 6 $step] + if {$step > 62} { + return 0 + } + + if {$step < 2} { ;# Open gate for balls to drop + $w.c move I6_ -5.25p 0 + if {$step == 1} { ;# Poke a hole + set xy [scl {348 226 365 240}] + $w.c create rect $xy -fill [$w.c itemcget I6c -fill] -outline {} + } + return 1 + } + + set s [expr {$step - 1}] ;# Do the gumball drop dance + for {set i 0} {$i <= int(($s-1) / 3)} {incr i} { + set tag "I6_b$i" + if {[$w.c find withtag $tag] eq ""} break + set loc [expr {$s - 3 * $i}] + + if {[info exists ::XY6($loc,$i)]} { + MoveAbs $w $tag [scl $::XY6($loc,$i)] + } elseif {[info exists ::XY6($loc)]} { + MoveAbs $w $tag [scl $::XY6($loc)] + } + } + if {($s % 3) == 1} { + set first [expr {($s + 2) / 3}] + for {set i $first} {1} {incr i} { + set tag "I6_b$i" + if {[$w.c find withtag $tag] eq ""} break + set loc [expr {$first - $i}] + MoveAbs $w $tag [scl $::XY6($loc)] + } + } + if {$s >= 3} { ;# Rotate the motor + set idx [expr {$s % 3}] + #Draw6a $w [lindex {12 35 64} $idx] + Draw6a $w [expr {12 + $s * 15}] 1 + } + return [expr {$s == 3 ? 3 : 1}] +} + +# On/off switch +proc Draw7 {w} { + set color $::C(7) + set xy {198 306 277 374} ;# Box + $w.c create rect $xy -outline $::C(fg) -width 1.5p -fill $color -tag I7z + $w.c lower I7z + set xy {275 343 230 349} + $w.c create line $xy -tag I7 -fill $::C(fg) -arrow last \ + -arrowshape {17.25p 17.25p 6p} -width 4.5p + set xy {225 324} ;# On button + $w.c create oval [box {*}$xy 3] -fill $::C(fg) -outline $::C(fg) + set xy {218 323} ;# On text + set font {Times 8} + $w.c create text $xy -text "on" -anchor e -fill $::C(fg) -font $font + set xy {225 350} ;# Off button + $w.c create oval [box {*}$xy 3] -fill $::C(fg) -outline $::C(fg) + set xy {218 349} ;# Off button + $w.c create text $xy -text "off" -anchor e -fill $::C(fg) -font $font +} +proc Move7 {w {step {}}} { + set step [GetStep 7 $step] + set numsteps 30 + if {$step > $numsteps} { + return 0 + } + set beta [expr {30.0 / $numsteps}] + RotateItem $w I7 [scl 275] [scl 343] $beta + + return [expr {$step == $numsteps ? 3 : 1}] +} + +# Electricity to the fan +proc Draw8 {w} { + Sine $w 271 248 271 306 5 8 -tag I8_s -fill $::C(8) -width 2.25p +} +proc Move8 {w {step {}}} { + set step [GetStep 8 $step] + + if {$step > 3} { + return 0 + } + if {$step == 0} { + Sparkle $w [Anchor $w I8_s s] I8 + return 1 + + } elseif {$step == 1} { + MoveAbs $w I8 [Anchor $w I8_s c] + } elseif {$step == 2} { + MoveAbs $w I8 [Anchor $w I8_s n] + } else { + $w.c delete I8 + } + return [expr {$step == 2 ? 3 : 1}] +} + +# Fan +proc Draw9 {w} { + set color $::C(9) + set xy {266 194 310 220} + $w.c create oval $xy -outline $color -fill $color + set xy {280 209 296 248} + $w.c create oval $xy -outline $color -fill $color + set xy {288 249 252 249 260 240 280 234 296 234 316 240 324 249 288 249} + $w.c create poly $xy -fill $color -smooth 1 + + set xy {248 205 265 214 264 205 265 196} ;# Spinner + $w.c create poly $xy -fill $color + + set xy {255 206 265 234} ;# Fan blades + $w.c create oval $xy -fill {} -outline $::C(fg) -width 2.25p -tag I9_0 + set xy {255 176 265 204} + $w.c create oval $xy -fill {} -outline $::C(fg) -width 2.25p -tag I9_0 + set xy {255 206 265 220} + $w.c create oval $xy -fill {} -outline $::C(fg) -width 0.75p -tag I9_1 + set xy {255 190 265 204} + $w.c create oval $xy -fill {} -outline $::C(fg) -width 0.75p -tag I9_1 +} +proc Move9 {w {step {}}} { + set step [GetStep 9 $step] + + if {$step & 1} { + $w.c itemconfig I9_0 -width 3p + $w.c itemconfig I9_1 -width 0.75p + $w.c lower I9_1 I9_0 + } else { + $w.c itemconfig I9_0 -width 0.75p + $w.c itemconfig I9_1 -width 3p + $w.c lower I9_0 I9_1 + } + if {$step == 0} { + return 3 + } + return 1 +} + +# Boat +proc Draw10 {w} { + set color $::C(10a) + set color2 $::C(10b) + set xy {191 230 233 230 233 178 191 178} ;# Sail + $w.c create poly $xy -fill $color -width 2.25p -outline $::C(fg) -tag I10 + set xy [box 209 204 31] ;# Front + $w.c create arc $xy -outline {} -fill $color -style pie \ + -start 120 -extent 120 -tag I10 + $w.c create arc $xy -outline $::C(fg) -width 2.25p -style arc \ + -start 120 -extent 120 -tag I10 + set xy [box 249 204 31] ;# Back + $w.c create arc $xy -outline {} -fill $::C(bg) -width 2.25p -style pie \ + -start 120 -extent 120 -tag I10 + $w.c create arc $xy -outline $::C(fg) -width 2.25p -style arc \ + -start 120 -extent 120 -tag I10 + + set xy {200 171 200 249} ;# Mast + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I10 + set xy {159 234 182 234} ;# Bow sprit + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I10 + set xy {180 234 180 251 220 251} ;# Hull + $w.c create line $xy -fill $::C(fg) -width 4.5p -tag I10 + + set xy {92 255 221 255} ;# Waves + Sine $w {*}$xy 2 25 -fill $color2 -width 0.75p -tag I10w + + set xy [lrange [$w.c coords I10w] 4 end-4] ;# Water + set xy [concat $xy 222 266 222 277 99 277] + $w.c create poly $xy -fill $color2 -outline $color2 + set xy {222 266 222 277 97 277 97 266} ;# Water bottom + $w.c create line $xy -fill $::C(fg) -width 2.25p + + set xy [box 239 262 17] + $w.c create arc $xy -outline $::C(fg) -width 2.25p -style arc \ + -start 95 -extent 103 + set xy [box 76 266 21] + $w.c create arc $xy -outline $::C(fg) -width 2.25p -style arc -extent 190 +} +proc Move10 {w {step {}}} { + set step [GetStep 10 $step] + set pos [scl { + {195 212} {193 212} {190 212} {186 212} {181 212} {176 212} + {171 212} {166 212} {161 212} {156 212} {151 212} {147 212} {142 212} + {137 212} {132 212 x} {127 212} {121 212} {116 212} {111 212} + }] + + if {$step >= [llength $pos]} { + return 0 + } + set where [lindex $pos $step] + MoveAbs $w I10 $where + + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# 2nd ball drop +proc Draw11 {w} { + set color $::C(11a) + set color2 $::C(11b) + set xy {23 264 55 591} ;# Color the down tube + $w.c create rect $xy -fill $color -outline {} + set xy [box 71 460 48] ;# Color the outer loop + $w.c create oval $xy -fill $color -outline {} + + set xy {55 264 55 458} ;# Top right side + $w.c create line $xy -fill $::C(fg) -width 2.25p + set xy {55 504 55 591} ;# Bottom right side + $w.c create line $xy -fill $::C(fg) -width 2.25p + set xy [box 71 460 48] ;# Outer loop + $w.c create arc $xy -outline $::C(fg) -width 2.25p -style arc \ + -start 110 -extent -290 -tag I11i + set xy [box 71 460 16] ;# Inner loop + $w.c create oval $xy -outline $::C(fg) -fill {} -width 2.25p -tag I11i + $w.c create oval $xy -outline $::C(fg) -fill $::C(bg) -width 2.25p + + set xy {23 264 23 591} ;# Left side + $w.c create line $xy -fill $::C(fg) -width 2.25p + set xy [box 1 266 23] ;# Top left curve + $w.c create arc $xy -outline $::C(fg) -width 2.25p -style arc -extent 90 + + set xy [box 75 235 9] ;# The ball + $w.c create oval $xy -fill $color2 -outline {} -width 2.25p -tag I11 +} +proc Move11 {w {step {}}} { + set step [GetStep 11 $step] + set pos [scl { + {75 235} {70 235} {65 237} {56 240} {46 247} {38 266} {38 296} + {38 333} {38 399} {38 475} {74 496} {105 472} {100 437} {65 423} + {-100 -100} {38 505} {38 527 x} {38 591} + }] + + if {$step >= [llength $pos]} { + return 0 + } + set where [lindex $pos $step] + MoveAbs $w I11 $where + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# Hand +proc Draw12 {w} { + set xy {20 637 20 617 20 610 20 590 40 590 40 590 60 590 60 610 60 610} + lappend xy 60 610 65 620 60 631 ;# Thumb + lappend xy 60 631 60 637 60 662 60 669 52 669 56 669 50 669 50 662 50 637 + + set y0 637 ;# Bumps for fingers + set y1 645 + for {set x 50} {$x > 20} {incr x -10} { + set x1 [expr {$x - 5}] + set x2 [expr {$x - 10}] + lappend xy $x $y0 $x1 $y1 $x2 $y0 + } + $w.c create poly $xy -fill $::C(12) -outline $::C(fg) -smooth 1 -tag I12 \ + -width 2.25p +} +proc Move12 {w {step {}}} { + set step [GetStep 12 $step] + set pos [scl {{42 641 x}}] + if {$step >= [llength $pos]} { + return 0 + } + + set where [lindex $pos $step] + MoveAbs $w I12 $where + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# Fax +proc Draw13 {w} { + set color $::C(13a) + set xy {86 663 149 663 149 704 50 704 50 681 64 681 86 671} + set xy2 {784 663 721 663 721 704 820 704 820 681 806 681 784 671} + set radii {2 9 9 8 5 5 2} + + RoundPoly $w.c $xy $radii -width 2.25p -outline $::C(fg) -fill $color + RoundPoly $w.c $xy2 $radii -width 2.25p -outline $::C(fg) -fill $color + + set xy {56 677} + $w.c create rect [box {*}$xy 4] -fill {} -outline $::C(fg) -width 2.25p \ + -tag I13 + set xy {809 677} + $w.c create rect [box {*}$xy 4] -fill {} -outline $::C(fg) -width 2.25p \ + -tag I13R + + set xy {112 687} ;# Label + $w.c create text $xy -text "FAX" -fill $::C(fg) -font {Times 12 bold} + set xy {762 687} + $w.c create text $xy -text "FAX" -fill $::C(fg) -font {Times 12 bold} + + set xy {138 663 148 636 178 636} ;# Paper guide + $w.c create line $xy -smooth 1 -fill $::C(fg) -width 2.25p + set xy {732 663 722 636 692 636} + $w.c create line $xy -smooth 1 -fill $::C(fg) -width 2.25p + + Sine $w 149 688 720 688 5 15 -tag I13_s -fill $::C(fg) -width 2.25p +} +proc Move13 {w {step {}}} { + set step [GetStep 13 $step] + set numsteps 7 + + if {$step == $numsteps+2} { + MoveAbs $w I13_star {-100 -100} + $w.c itemconfig I13R -fill $::C(13b) -width 1.5p + return 2 + } + if {$step == 0} { ;# Button down + $w.c delete I13 + Sparkle $w {-100 -100} I13_star ;# Create off screen + return 1 + } + lassign [Anchor $w I13_s w] x0 y0 + lassign [Anchor $w I13_s e] x1 y1 + set x [expr {$x0 + ($x1-$x0) * ($step - 1) / double($numsteps)}] + MoveAbs $w I13_star [list $x $y0] + return 1 +} + +# Paper in fax +proc Draw14 {w} { + set color $::C(14) + set xy {102 661 113 632 130 618} ;# Left paper edge + $w.c create line $xy -smooth 1 -fill $color -width 2.25p -tag I14L_0 + set xy {148 629 125 640 124 662} ;# Right paper edge + $w.c create line $xy -smooth 1 -fill $color -width 2.25p -tag I14L_1 + Draw14a $w L + + set xy { + 768.0 662.5 767.991316225 662.433786215 767.926187912 662.396880171 + } + $w.c create line $xy -smooth 1 -fill $color -width 2.25p -tag I14R_0 + $w.c lower I14R_0 + # NB. these numbers are VERY sensitive, you must start with final size + # and shrink down to get the values + set xy { + 745.947897349 662.428358855 745.997829056 662.452239237 746.0 662.5 + } + $w.c create line $xy -smooth 1 -fill $color -width 2.25p -tag I14R_1 + $w.c lower I14R_1 +} +proc Draw14a {w side} { + set color $::C(14) + set xy [$w.c coords I14${side}_0] + set xy2 [$w.c coords I14${side}_1] + lassign $xy x0 y0 x1 y1 x2 y2 + lassign $xy2 x3 y3 x4 y4 x5 y5 + set zz [concat \ + $x0 $y0 $x0 $y0 $xy $x2 $y2 $x2 $y2 \ + $x3 $y3 $x3 $y3 $xy2 $x5 $y5 $x5 $y5] + $w.c delete I14$side + $w.c create poly $zz -tag I14$side -smooth 1 -fill $color -outline $color \ + -width 2.25p + $w.c lower I14$side +} +proc Move14 {w {step {}}} { + set step [GetStep 14 $step] + + # Paper going down + set sc [expr {.9 - .05*$step}] + if {$sc < .3} { + $w.c delete I14L + return 0 + } + + lassign [$w.c coords I14L_0] Ox Oy + $w.c scale I14L_0 $Ox $Oy $sc $sc + lassign [lrange [$w.c coords I14L_1] end-1 end] Ox Oy + $w.c scale I14L_1 $Ox $Oy $sc $sc + Draw14a $w L + + # Paper going up + set sc [expr {.35 + .05*$step}] + set sc [expr {1 / $sc}] + + lassign [$w.c coords I14R_0] Ox Oy + $w.c scale I14R_0 $Ox $Oy $sc $sc + lassign [lrange [$w.c coords I14R_1] end-1 end] Ox Oy + $w.c scale I14R_1 $Ox $Oy $sc $sc + Draw14a $w R + + return [expr {$step == 10 ? 3 : 1}] +} + +# Light beam +proc Draw15 {w} { + set color $::C(15a) + set xy {824 599 824 585 820 585 829 585} + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I15a + set xy {789 599 836 643} + $w.c create rect $xy -fill $color -outline $::C(fg) -width 2.25p + set xy {778 610 788 632} + $w.c create rect $xy -fill $color -outline $::C(fg) -width 2.25p + set xy {766 617 776 625} + $w.c create rect $xy -fill $color -outline $::C(fg) -width 2.25p + + set xy {633 600 681 640} + $w.c create rect $xy -fill $color -outline $::C(fg) -width 2.25p + set xy {635 567 657 599} + $w.c create rect $xy -fill $color -outline $::C(fg) -width 2.25p + set xy {765 557 784 583} + $w.c create rect $xy -fill $color -outline $::C(fg) -width 2.25p + + Sine $w 658 580 765 580 3 15 -tag I15_s -fill $::C(fg) -width 2.25p +} +proc Move15a {w} { + set color $::C(15b) + $w.c scale I15a [scl 824] [scl 599] 1 .3 ;# Button down + set xy [scl {765 621 681 621}] + $w.c create line $xy -dash "-" -width 2.25p -fill $color -tag I15 +} +proc Move15 {w {step {}}} { + set step [GetStep 15 $step] + set numsteps 6 + + if {$step == $numsteps+2} { + MoveAbs $w I15_star {-100 -100} + return 2 + } + if {$step == 0} { ;# Break the light beam + Sparkle $w {-100 -100} I15_star + set xy [scl {765 621 745 621}] + $w.c coords I15 $xy + return 1 + } + lassign [Anchor $w I15_s w] x0 y0 + lassign [Anchor $w I15_s e] x1 y1 + set x [expr {$x0 + ($x1-$x0) * ($step - 1) / double($numsteps)}] + MoveAbs $w I15_star [list $x $y0] + return 1 +} + +# Bell +proc Draw16 {w} { + set color $::C(16) + set xy {722 485 791 556} + $w.c create rect $xy -fill {} -outline $::C(fg) -width 2.25p + set xy [box 752 515 25] ;# Bell + $w.c create oval $xy -fill $color -outline black -tag I16b -width 1.5p + set xy [box 752 515 5] ;# Bell button + $w.c create oval $xy -fill black -outline black -tag I16b + + set xy {784 523 764 549} ;# Clapper + $w.c create line $xy -width 2.25p -tag I16c -fill $::C(fg) + set xy [box 784 523 4] + $w.c create oval $xy -fill $::C(fg) -outline $::C(fg) -tag I16d +} +proc Move16 {w {step {}}} { + set step [GetStep 16 $step] + + # Note: we never stop + lassign [scl {760 553}] Ox Oy + if {$step & 1} { + set beta 12 + $w.c move I16b 2.25p 0 + } else { + set beta -12 + $w.c move I16b -2.25p 0 + } + RotateItem $w I16c $Ox $Oy $beta + RotateItem $w I16d $Ox $Oy $beta + + return [expr {$step == 1 ? 3 : 1}] +} + +# Cat +proc Draw17 {w} { + set color $::C(17) + + set xy {584 556 722 556} + $w.c create line $xy -fill $::C(fg) -width 2.25p + set xy {584 485 722 485} + $w.c create line $xy -fill $::C(fg) -width 2.25p + + set xy {664 523 717 549} ;# Body + $w.c create arc $xy -outline $::C(fg) -fill $color -width 2.25p \ + -style chord -start 128 -extent -260 -tag I17 + + set xy {709 554 690 543} ;# Paw + $w.c create oval $xy -outline $::C(fg) -fill $color -width 2.25p -tag I17 + set xy {657 544 676 555} + $w.c create oval $xy -outline $::C(fg) -fill $color -width 2.25p -tag I17 + + set xy [box 660 535 15] ;# Lower face + $w.c create arc $xy -outline $::C(fg) -width 2.25p -style arc \ + -start 150 -extent 240 -tag I17_ + $w.c create arc $xy -outline {} -fill $color -width 0.75p -style chord \ + -start 150 -extent 240 -tag I17_ + set xy {674 529 670 513 662 521 658 521 650 513 647 529} ;# Ears + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I17_ + $w.c create poly $xy -fill $color -outline {} -width 0.75p -tag {I17_ I17_c} + set xy {652 542 628 539} ;# Whiskers + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I17_ + set xy {652 543 632 545} + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I17_ + set xy {652 546 632 552} + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I17_ + + set xy {668 543 687 538} + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag {I17_ I17w} + set xy {668 544 688 546} + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag {I17_ I17w} + set xy {668 547 688 553} + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag {I17_ I17w} + + set xy {649 530 654 538 659 530} ;# Left eye + $w.c create line $xy -fill $::C(fg) -width 1.5p -smooth 1 -tag I17 + set xy {671 530 666 538 661 530} ;# Right eye + $w.c create line $xy -fill $::C(fg) -width 1.5p -smooth 1 -tag I17 + set xy {655 543 660 551 665 543} ;# Mouth + $w.c create line $xy -fill $::C(fg) -width 1.5p -smooth 1 -tag I17 +} +proc Move17 {w {step {}}} { + set step [GetStep 17 $step] + + if {$step == 0} { + $w.c delete I17 ;# Delete most of the cat + set xy [scl {655 543 660 535 665 543}] ;# Mouth + $w.c create line $xy -fill $::C(fg) -width 2.25p -smooth 1 -tag I17_ + set xy [box [scl 654] [scl 530] [scl 4]] ;# Left eye + $w.c create oval $xy -outline $::C(fg) -width 2.25p -fill {} -tag I17_ + set xy [box [scl 666] [scl 530] [scl 4]] ;# Right eye + $w.c create oval $xy -outline $::C(fg) -width 2.25p -fill {} -tag I17_ + + $w.c move I17_ 0 -15p ;# Move face up + set xy [scl {652 528 652 554}] ;# Front leg + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I17_ + set xy [scl {670 528 670 554}] ;# 2nd front leg + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I17_ + + set xy [scl { + 675 506 694 489 715 513 715 513 715 513 716 525 716 525 716 525 + 706 530 695 530 679 535 668 527 668 527 668 527 675 522 676 517 + 677 512 + }] ;# Body + $w.c create poly $xy -fill [$w.c itemcget I17_c -fill] \ + -outline $::C(fg) -width 2.25p -smooth 1 -tag I17_ + set xy [scl {716 514 716 554}] ;# Back leg + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I17_ + set xy [scl {694 532 694 554}] ;# 2nd back leg + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I17_ + set xy [scl {715 514 718 506 719 495 716 488}] ;# Tail + $w.c create line $xy -fill $::C(fg) -width 2.25p -smooth 1 -tag I17_ + + $w.c raise I17w ;# Make whiskers visible + $w.c move I17_ -3.75p 0 ;# Move away from wall a bit + return 2 + } + return 0 +} + +# Sling shot +proc Draw18 {w} { + set color $::C(18) + set xy {721 506 627 506} ;# Sling hold + $w.c create line $xy -width 3p -fill $::C(fg) -tag I18 + + set xy {607 500 628 513} ;# Sling rock + $w.c create oval $xy -fill $color -outline {} -tag I18a + + set xy {526 513 606 507 494 502} ;# Sling band + $w.c create line $xy -fill $::C(fg) -width 3p -tag I18b + set xy { 485 490 510 540 510 575 510 540 535 491 } ;# Sling + $w.c create line $xy -fill $::C(fg) -width 4.5p +} +proc Move18 {w {step {}}} { + set step [GetStep 18 $step] + + set pos [scl { + {587 506} {537 506} {466 506} {376 506} {266 506 x} {136 506} + {16 506} {-100 -100} + }] + + set b(0) [scl {490 502 719 507 524 512}] ;# Band collapsing + set b(1) [scl { + 491 503 524 557 563 505 559 496 546 506 551 525 553 536 538 534 + 532 519 529 499 + }] + set b(2) [scl {491 503 508 563 542 533 551 526 561 539 549 550 530 500}] + set b(3) [scl {491 503 508 563 530 554 541 562 525 568 519 544 530 501}] + + if {$step >= [llength $pos]} { + return 0 + } + + if {$step == 0} { + $w.c delete I18 + $w.c itemconfig I18b -smooth 1 + } + if {[info exists b($step)]} { + $w.c coords I18b $b($step) + } + + set where [lindex $pos $step] + MoveAbs $w I18a $where + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# Water pipe +proc Draw19 {w} { + set color $::C(19) + set xx {249 181 155 118 86 55 22 0} + foreach {x1 x2} $xx { + $w.c create rect $x1 453 $x2 467 -fill $color -outline {} -tag I19 + $w.c create line $x1 453 $x2 453 -fill $::C(fg) -width 0.75p;# Pipe top + $w.c create line $x1 467 $x2 467 -fill $::C(fg) -width 0.75p;# Pipe btm + } + $w.c raise I11i + + set xy [box 168 460 16] ;# Bulge by the joint + $w.c create oval $xy -fill $color -outline {} + $w.c create arc $xy -outline $::C(fg) -width 0.75p -style arc \ + -start 21 -extent 136 + $w.c create arc $xy -outline $::C(fg) -width 0.75p -style arc \ + -start -21 -extent -130 + + set xy {249 447 255 473} ;# First joint 26x6 + $w.c create rect $xy -fill $color -outline $::C(fg) -width 0.75p + + set xy [box 257 433 34] ;# Bend up + $w.c create arc $xy -outline {} -fill $color -width 0.75p \ + -style pie -start 0 -extent -91 + $w.c create arc $xy -outline $::C(fg) -width 0.75p \ + -style arc -start 0 -extent -90 + set xy [box 257 433 20] + $w.c create arc $xy -outline {} -fill $::C(bg) -width 1 \ + -style pie -start 0 -extent -92 + $w.c create arc $xy -outline $::C(fg) -width 0.75p \ + -style arc -start 0 -extent -90 + set xy [box 257 421 34] ;# Bend left + $w.c create arc $xy -outline {} -fill $color -width 0.75p \ + -style pie -start 1 -extent 91 + $w.c create arc $xy -outline $::C(fg) -width 0.75p \ + -style arc -start 0 -extent 90 + set xy [box 257 421 20] + $w.c create arc $xy -outline {} -fill $::C(bg) -width 0.75p \ + -style pie -start 0 -extent 90 + $w.c create arc $xy -outline $::C(fg) -width 0.75p \ + -style arc -start 0 -extent 90 + set xy [box 243 421 34] ;# Bend down + $w.c create arc $xy -outline {} -fill $color -width 0.75p \ + -style pie -start 90 -extent 90 + $w.c create arc $xy -outline $::C(fg) -width 0.75p \ + -style arc -start 90 -extent 90 + set xy [box 243 421 20] + $w.c create arc $xy -outline {} -fill $::C(bg) -width 0.75p \ + -style pie -start 90 -extent 90 + $w.c create arc $xy -outline $::C(fg) -width 0.75p \ + -style arc -start 90 -extent 90 + + set xy {270 427 296 433} ;# 2nd joint bottom + $w.c create rect $xy -fill $color -outline $::C(fg) -width 0.75p + set xy {270 421 296 427} ;# 2nd joint top + $w.c create rect $xy -fill $color -outline $::C(fg) -width 0.75p + set xy {249 382 255 408} ;# Third joint right + $w.c create rect $xy -fill $color -outline $::C(fg) -width 0.75p + set xy {243 382 249 408} ;# Third joint left + $w.c create rect $xy -fill $color -outline $::C(fg) -width 0.75p + set xy {203 420 229 426} ;# Last joint + $w.c create rect $xy -fill $color -outline $::C(fg) -width 0.75p + + set xy [box 168 460 6] ;# Handle joint + $w.c create oval $xy -fill $::C(fg) -outline {} -tag I19a + set xy {168 460 168 512} ;# Handle bar + $w.c create line $xy -fill $::C(fg) -width 3.75p -tag I19b +} +proc Move19 {w {step {}}} { + set step [GetStep 19 $step] + + set angles {30 30 30} + if {$step == [llength $angles]} { + return 2 + } + + RotateItem $w I19b {*}[Centroid $w I19a] [lindex $angles $step] + return 1 +} + +# Water pouring +proc Draw20 {w} { +} +proc Move20 {w {step {}}} { + set step [GetStep 20 $step] + + set pos [scl {451 462 473 484 496 504 513 523 532}] + set freq {20 40 40 40 40 40 40 40 40} + set pos [scl { + {451 20} {462 40} {473 40} {484 40} {496 40} {504 40} {513 40} + {523 40} {532 40 x} + }] + if {$step >= [llength $pos]} { + return 0 + } + + $w.c delete I20 + set where [lindex $pos $step] + lassign $where y f + H2O $w $y $f + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} +proc H2O {w y f} { + set color $::C(20) + $w.c delete I20 + + Sine $w [scl 208] [scl 428] [scl 208] $y 4 $f -tag {I20 I20s} \ + -width 2.25p -fill $color -smooth 1 + $w.c create line [$w.c coords I20s] -width 2.25p -fill $color -smooth 1 \ + -tag {I20 I20a} + $w.c create line [$w.c coords I20s] -width 2.25p -fill $color -smooth 1 \ + -tag {I20 I20b} + $w.c move I20a 6p 0 + $w.c move I20b 12p 0 +} + +# Bucket +proc Draw21 {w} { + set color $::C(21) + set xy {217 451 244 490} ;# Right handle + $w.c create line $xy -fill $::C(fg) -width 1.5p -tag I21_a + set xy {201 467 182 490} ;# Left handle + $w.c create line $xy -fill $::C(fg) -width 1.5p -tag I21_a + + set xy {245 490 237 535} ;# Right side + set xy2 {189 535 181 490} ;# Left side + $w.c create poly [concat $xy $xy2] -fill $color -outline {} \ + -tag {I21 I21f} + $w.c create line $xy -fill $::C(fg) -width 1.5p -tag I21 + $w.c create line $xy2 -fill $::C(fg) -width 1.5p -tag I21 + + set xy {182 486 244 498} ;# Top + $w.c create oval $xy -fill $color -outline {} -width 1.5p -tag {I21 I21f} + $w.c create oval $xy -fill {} -outline $::C(fg) -width 1.5p -tag {I21 I21t} + set xy {189 532 237 540} ;# Bottom + $w.c create oval $xy -fill $color -outline $::C(fg) -width 1.5p \ + -tag {I21 I21b} +} +proc Move21 {w {step {}}} { + set step [GetStep 21 $step] + + set numsteps 30 + if {$step >= $numsteps} { + return 0 + } + + lassign [$w.c coords I21b] x1 y1 x2 y2 + #lassign [$w.c coords I21t] X1 Y1 X2 Y2 + lassign [scl {183 492 243 504}] X1 Y1 X2 Y2 + + set f [expr {$step / double($numsteps)}] + set y2 [expr {$y2 - [scl 3]}] + set xx1 [expr {$x1 + ($X1 - $x1) * $f}] + set yy1 [expr {$y1 + ($Y1 - $y1) * $f}] + set xx2 [expr {$x2 + ($X2 - $x2) * $f}] + set yy2 [expr {$y2 + ($Y2 - $y2) * $f}] + #H2O $w $yy1 40 + + $w.c itemconfig I21b -fill $::C(20) + $w.c delete I21w + $w.c create poly $x2 $y2 $x1 $y1 $xx1 $yy1 $xx2 $yy1 -tag {I21 I21w} \ + -outline {} -fill $::C(20) + $w.c lower I21w I21 + $w.c raise I21b + $w.c lower I21f + + return [expr {$step == $numsteps-1 ? 3 : 1}] +} + +# Bucket drop +proc Draw22 {w} { +} +proc Move22 {w {step {}}} { + set step [GetStep 22 $step] + set pos [scl {{213 513} {213 523} {213 543 x} {213 583} {213 593}}] + + if {$step == 0} {$w.c itemconfig I21f -fill $::C(22)} + if {$step >= [llength $pos]} { + return 0 + } + set where [lindex $pos $step] + MoveAbs $w I21 $where + H2O $w [lindex $where 1] 40 + $w.c delete I21_a ;# Delete handles + + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# Blow dart +proc Draw23 {w} { + set color $::C(23a) + set color2 $::C(23b) + set color3 $::C(23c) + + set xy {185 623 253 650} ;# Block + $w.c create rect $xy -fill black -outline $::C(fg) -width 1.5p -tag I23a + set xy {187 592 241 623} ;# Balloon + $w.c create oval $xy -outline {} -fill $color -tag I23b + $w.c create arc $xy -outline $::C(fg) -width 2.25p -tag I23b \ + -style arc -start 12 -extent 336 + set xy {239 604 258 589 258 625 239 610} ;# Balloon nozzle + $w.c create poly $xy -outline {} -fill $color -tag I23b + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I23b + + set xy {285 611 250 603} ;# Dart body + $w.c create oval $xy -fill $color2 -outline $::C(fg) -width 2.25p -tag I23d + set xy {249 596 249 618 264 607 249 596} ;# Dart tail + $w.c create poly $xy -fill $color3 -outline $::C(fg) -width 2.25p -tag I23d + set xy {249 607 268 607} ;# Dart detail + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I23d + set xy {285 607 305 607} ;# Dart needle + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I23d +} +proc Move23 {w {step {}}} { + set step [GetStep 23 $step] + + set pos [scl { + {277 607} {287 607} {307 607 x} {347 607} {407 607} {487 607} + {587 607} {687 607} {787 607} {-100 -100} + }] + + if {$step >= [llength $pos]} { + return 0 + } + if {$step <= 1} { + $w.c scale I23b {*}[Anchor $w I23a n] .9 .5 + } + set where [lindex $pos $step] + MoveAbs $w I23d $where + + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# Balloon +proc Draw24 {w} { + set color $::C(24a) + set xy {366 518 462 665} ;# Balloon + $w.c create oval $xy -fill $color -outline $::C(fg) -width 2.25p -tag I24 + set xy {414 666 414 729} ;# String + $w.c create line $xy -fill $::C(fg) -width 2.25p -tag I24 + set xy {410 666 404 673 422 673 418 666} ;# Nozzle + $w.c create poly $xy -fill $color -outline $::C(fg) -width 2.25p -tag I24 + + set xy {387 567 390 549 404 542} ;# Reflections + $w.c create line $xy -fill $::C(fg) -smooth 1 -width 1.5p -tag I24 + set xy {395 568 399 554 413 547} + $w.c create line $xy -fill $::C(fg) -smooth 1 -width 1.5p -tag I24 + set xy {403 570 396 555 381 553} + $w.c create line $xy -fill $::C(fg) -smooth 1 -width 1.5p -tag I24 + set xy {408 564 402 547 386 545} + $w.c create line $xy -fill $::C(fg) -smooth 1 -width 1.5p -tag I24 +} +proc Move24 {w {step {}}} { + global S Dims + set step [GetStep 24 $step] + + if {$step > 4} { + return 0 + } elseif {$step == 4} { + return 2 + } + + if {$step == 0} { + $w.c delete I24 ;# Exploding balloon + set xy [scl { + 347 465 361 557 271 503 272 503 342 574 259 594 259 593 362 626 + 320 737 320 740 398 691 436 738 436 739 476 679 528 701 527 702 + 494 627 548 613 548 613 480 574 577 473 577 473 474 538 445 508 + 431 441 431 440 400 502 347 465 347 465 + }] + $w.c create poly $xy -tag I24 -fill $::C(24b) -outline $::C(24a) \ + -width 7.5p -smooth 1 + set msg [subst $S(message)] + $w.c create text [Centroid $w I24] -text $msg -tag {I24 I24t} \ + -fill $::C(24c) -justify center -font {Times 18 bold} + return 1 + } + + $w.c itemconfig I24t -font [list Times [expr {18 + 6*$step}] bold] + $w.c move I24 $Dims(MovX) $Dims(MovY) + $w.c scale I24 {*}[Centroid $w I24] 1.25 1.25 + return 1 +} + +# Displaying the message +proc Move25 {w {step {}}} { + global S + set step [GetStep 25 $step] + if {$step == 0} { + set ::XY(25) [clock clicks -milliseconds] + return 1 + } + set elapsed [expr {[clock clicks -milliseconds] - $::XY(25)}] + if {$elapsed < 5000} { + return 1 + } + return 2 +} + +# Collapsing balloon +proc Move26 {w {step {}}} { + global S Dims + set step [GetStep 26 $step] + + if {$step >= 3} { + $w.c delete I24 I26 + $w.c create text $Dims(MsgX) $Dims(MsgY) -anchor s -tag I26 \ + -fill $::C(26) -text "click to continue" -font {Times 24 bold} + bind $w.c [list Reset $w] + return 4 + } + + $w.c scale I24 {*}[Centroid $w I24] .8 .8 + $w.c move I24 0 45p + $w.c itemconfig I24t -font [list Times [expr {30 - 6*$step}] bold] + return 1 +} + +################################################################ +# +# Helper functions +# + +proc box {x y r} { + return [list [expr {$x-$r}] [expr {$y-$r}] [expr {$x+$r}] [expr {$y+$r}]] +} + +proc MoveAbs {w item xy} { + lassign $xy x y + lassign [Centroid $w $item] Ox Oy + set dx [expr {$x - $Ox}] + set dy [expr {$y - $Oy}] + $w.c move $item $dx $dy +} + +proc RotateItem {w item Ox Oy beta} { + set xy [$w.c coords $item] + set xy2 {} + foreach {x y} $xy { + lappend xy2 {*}[RotateC $x $y $Ox $Oy $beta] + } + $w.c coords $item $xy2 +} + +proc RotateC {x y Ox Oy beta} { + # rotates vector (Ox,Oy)->(x,y) by beta degrees clockwise + + set x [expr {$x - $Ox}] ;# Shift to origin + set y [expr {$y - $Oy}] + + set beta [expr {$beta * atan(1) * 4 / 180.0}] ;# Radians + set xx [expr {$x * cos($beta) - $y * sin($beta)}] ;# Rotate + set yy [expr {$x * sin($beta) + $y * cos($beta)}] + + set xx [expr {$xx + $Ox}] ;# Shift back + set yy [expr {$yy + $Oy}] + + return [list $xx $yy] +} + +proc Reset {w} { + global S + DrawAll $w + bind $w.c {} + set S(mode) $::MSTART + set S(active) 0 +} + +# Each Move## keeps its state info in STEP, this retrieves and increments it +proc GetStep {who step} { + global STEP + if {$step ne ""} { + set STEP($who) $step + } elseif {![info exists STEP($who)] || $STEP($who) eq ""} { + set STEP($who) 0 + } else { + incr STEP($who) + } + return $STEP($who) +} + +proc ResetStep {} { + global STEP + set ::S(cnt) 0 + foreach a [array names STEP] { + set STEP($a) "" + } +} + +proc Sine {w x0 y0 x1 y1 amp freq args} { + set PI [expr {4 * atan(1)}] + set step 2 + set xy {} + if {$y0 == $y1} { ;# Horizontal + for {set x $x0} {$x <= $x1} {incr x $step} { + set beta [expr {($x - $x0) * 2 * $PI / $freq}] + set y [expr {$y0 + $amp * sin($beta)}] + lappend xy $x $y + } + } else { + for {set y $y0} {$y <= $y1} {incr y $step} { + set beta [expr {($y - $y0) * 2 * $PI / $freq}] + set x [expr {$x0 + $amp * sin($beta)}] + lappend xy $x $y + } + } + return [$w.c create line $xy {*}$args] +} + +proc RoundRect {w xy radius args} { + lassign $xy x0 y0 x3 y3 + set r [winfo pixels $w.c $radius] + set d [expr {2 * $r}] + + # Make sure that the radius of the curve is less than 3/8 size of the box! + set maxr 0.75 + if {$d > $maxr * ($x3 - $x0)} { + set d [expr {$maxr * ($x3 - $x0)}] + } + if {$d > $maxr * ($y3 - $y0)} { + set d [expr {$maxr * ($y3 - $y0)}] + } + + set x1 [expr { $x0 + $d }] + set x2 [expr { $x3 - $d }] + set y1 [expr { $y0 + $d }] + set y2 [expr { $y3 - $d }] + + set xy [list $x0 $y0 $x1 $y0 $x2 $y0 $x3 $y0 $x3 $y1 $x3 $y2] + lappend xy $x3 $y3 $x2 $y3 $x1 $y3 $x0 $y3 $x0 $y2 $x0 $y1 + return $xy +} + +proc RoundPoly {canv xy radii args} { + set lenXY [llength $xy] + set lenR [llength $radii] + if {$lenXY != 2*$lenR} { + error "wrong number of vertices and radii" + } + + set knots {} + lassign [lrange $xy end-1 end] x0 y0 + lassign $xy x1 y1 + lappend xy {*}[lrange $xy 0 1] + + for {set i 0} {$i < $lenXY} {incr i 2} { + set radius [lindex $radii [expr {$i/2}]] + set r [winfo pixels $canv $radius] + + lassign [lrange $xy [expr {$i + 2}] [expr {$i + 3}]] x2 y2 + set z [_RoundPoly2 $x0 $y0 $x1 $y1 $x2 $y2 $r] + lappend knots {*}$z + + lassign [list $x1 $y1] x0 y0 + lassign [list $x2 $y2] x1 y1 + } + set n [$canv create polygon $knots -smooth 1 {*}$args] + return $n +} + +proc _RoundPoly2 {x0 y0 x1 y1 x2 y2 radius} { + set d [expr {2 * $radius}] + set maxr 0.75 + + set v1x [expr {$x0 - $x1}] + set v1y [expr {$y0 - $y1}] + set v2x [expr {$x2 - $x1}] + set v2y [expr {$y2 - $y1}] + + set vlen1 [expr {sqrt($v1x*$v1x + $v1y*$v1y)}] + set vlen2 [expr {sqrt($v2x*$v2x + $v2y*$v2y)}] + if {$d > $maxr * $vlen1} { + set d [expr {$maxr * $vlen1}] + } + if {$d > $maxr * $vlen2} { + set d [expr {$maxr * $vlen2}] + } + + lappend xy [expr {$x1 + $d * $v1x/$vlen1}] [expr {$y1 + $d * $v1y/$vlen1}] + lappend xy $x1 $y1 + lappend xy [expr {$x1 + $d * $v2x/$vlen2}] [expr {$y1 + $d * $v2y/$vlen2}] + + return $xy +} + +proc Sparkle {w Oxy tag} { + set xy {299 283 298 302 295 314 271 331 239 310 242 292 256 274 281 273} + foreach {x y} $xy { + $w.c create line 271 304 $x $y -fill white -width 3 -tag $tag + } + MoveAbs $w $tag $Oxy +} + +proc Centroid {w item} { + return [Anchor $w $item c] +} + +proc Anchor {w item where} { + lassign [$w.c bbox $item] x1 y1 x2 y2 + if {[string match *n* $where]} { + set y $y1 + } elseif {[string match *s* $where]} { + set y $y2 + } else { + set y [expr {($y1 + $y2) / 2.0}] + } + if {[string match *w* $where]} { + set x $x1 + } elseif {[string match *e* $where]} { + set x $x2 + } else { + set x [expr {($x1 + $x2) / 2.0}] + } + return [list $x $y] +} + +proc scl {lst} { + global scaleFactor + set lst2 {} + foreach elem $lst { + set elem2 {} + set idx 0 + foreach val $elem { + if {$idx < 2} { + set val [expr {round($val * $scaleFactor)}] + } + lappend elem2 $val + incr idx + } + + lappend lst2 $elem2 + } + + return $lst2 +} + +# Simple placed dialog - stacked dialogs are not allowed, +# the command does nothing if another grab already exists. + +proc PlacedDialog {w msg {labelFnt {Helvetica 10}}} { + if {[grab current] ne {}} { + return + } + destroy $w + + frame $w -relief raised -bd 3p + label $w.lab -font $labelFnt -wraplength 3i -justify left -text $msg + ttk::button $w.but -text "OK" -underline 0 \ + -command [list ClosePlacedDialog $w] + + foreach key {Escape Return o O} { + bind $w.but "" { ClosePlacedDialog [winfo parent %W] } + } + foreach child {{} .but .lab} { + bind $w$child <> break + bind $w$child <> break + } + + pack $w.lab -padx 10p -pady {10p 5p} + pack $w.but -padx 10p -pady {0p 10p} + place $w -anchor center -relx 0.5 -rely 0.5 + + set tl [winfo toplevel $w] + set ::PlacedDialogOldFocus [focus -lastfor $tl] + focus $w.but + grab set $w + return +} + +proc ClosePlacedDialog {w} { + set tl [winfo toplevel $w] + if {![winfo exists $::PlacedDialogOldFocus]} { + set ::PlacedDialogOldFocus $tl + } + focus $::PlacedDialogOldFocus + set ::PlacedDialogOldFocus {} + grab release $w + destroy $w + return +} + + +DoDisplay $w +Reset $w +Go $w ;# Start everything going +StartMessage $w ;# Message box at startup diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/hello b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/hello similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/hello rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/hello diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/hscale.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/hscale.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/hscale.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/hscale.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/icon.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/icon.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/icon.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/icon.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/image1.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/image1.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/image1.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/image1.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/image2.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/image2.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/image2.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/image2.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/Tcl.svg b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/Tcl.svg new file mode 100644 index 00000000..05dd9a46 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/Tcl.svg @@ -0,0 +1,75 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/Tk_feather.png b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/Tk_feather.png similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/Tk_feather.png rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/Tk_feather.png diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/earth.gif b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/earth.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/earth.gif rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/earth.gif diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/earthmenu.png b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/earthmenu.png similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/earthmenu.png rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/earthmenu.png diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/earthris.gif b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/earthris.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/earthris.gif rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/earthris.gif diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/flagdown.xbm b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/flagdown.xbm similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/flagdown.xbm rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/flagdown.xbm diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/flagup.xbm b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/flagup.xbm similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/flagup.xbm rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/flagup.xbm diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/gray25.xbm b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/gray25.xbm similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/gray25.xbm rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/gray25.xbm diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/letters.xbm b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/letters.xbm similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/letters.xbm rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/letters.xbm diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/noletter.xbm b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/noletter.xbm similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/noletter.xbm rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/noletter.xbm diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/ouster.png b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/ouster.png similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/ouster.png rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/ouster.png diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/pattern.xbm b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/pattern.xbm similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/pattern.xbm rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/pattern.xbm diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/plowed_field.png b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/plowed_field.png similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/plowed_field.png rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/plowed_field.png diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/starry_night.png b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/starry_night.png similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/starry_night.png rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/starry_night.png diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/tcllogo.gif b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/tcllogo.gif similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/tcllogo.gif rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/tcllogo.gif diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/teapot.ppm b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/teapot.ppm similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/images/teapot.ppm rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/images/teapot.ppm diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/items.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/items.tcl new file mode 100644 index 00000000..7b45cf55 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/items.tcl @@ -0,0 +1,307 @@ +# items.tcl -- +# +# This demonstration script creates a canvas that displays the +# canvas item types. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +set w .items +catch {destroy $w} +toplevel $w +wm title $w "Canvas Item Demonstration" +wm iconname $w "Items" +positionWindow $w +set c $w.frame.c + +label $w.msg -font $font -wraplength 5i -justify left -text "This window contains a canvas widget with examples of the various kinds of items supported by canvases. The following operations are supported:\n Left-Button drag:\tmoves item under pointer.\n Middle-Button drag:\trepositions view.\n Right-Button drag:\tstrokes out area.\n Ctrl+f:\t\tprints items under area." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.frame +pack $w.frame -side top -fill both -expand yes + +canvas $c -scrollregion {0c 0c 30c 24c} -width 15c -height 10c \ + -relief sunken -borderwidth 2 \ + -xscrollcommand "$w.frame.hscroll set" \ + -yscrollcommand "$w.frame.vscroll set" +ttk::scrollbar $w.frame.vscroll -command "$c yview" +ttk::scrollbar $w.frame.hscroll -orient horizontal -command "$c xview" + +bind $c { + lassign [tk::PreciseScrollDeltas %D] deltaX deltaY + if {$deltaX != 0 || $deltaY != 0} { + tk::ScrollByPixels %W $deltaX $deltaY + } +} + +grid $c -in $w.frame \ + -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky news +grid $w.frame.vscroll \ + -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news +grid $w.frame.hscroll \ + -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news +grid rowconfig $w.frame 0 -weight 1 -minsize 0 +grid columnconfig $w.frame 0 -weight 1 -minsize 0 + +# Display a 3x3 rectangular grid. + +$c create rect 0c 0c 30c 24c -width 1.5p +$c create line 0c 8c 30c 8c -width 1.5p +$c create line 0c 16c 30c 16c -width 1.5p +$c create line 10c 0c 10c 24c -width 1.5p +$c create line 20c 0c 20c 24c -width 1.5p + +set font1 {Helvetica 12} +set font2 {Helvetica 24 bold} +if {[winfo depth $c] > 1} { + set blue DeepSkyBlue3 + set red red + set bisque bisque3 + set green SeaGreen3 +} else { + set blue black + set red black + set bisque black + set green black +} + +# Set up demos within each of the areas of the grid. + +$c create text 5c .2c -text Lines -anchor n +$c create line 1c 1c 3c 1c 1c 4c 3c 4c -width 2m -fill $blue \ + -cap butt -join miter -tags item +$c create line 4.67c 1c 4.67c 4c -arrow last -tags item +$c create line 6.33c 1c 6.33c 4c -arrow both -tags item +$c create line 5c 6c 9c 6c 9c 1c 8c 1c 8c 4.8c 8.8c 4.8c 8.8c 1.2c \ + 8.2c 1.2c 8.2c 4.6c 8.6c 4.6c 8.6c 1.4c 8.4c 1.4c 8.4c 4.4c \ + -width 2.25p -fill $red -tags item +# Main widget program sets variable tk_demoDirectory +$c create line 1c 5c 7c 5c 7c 7c 9c 7c -width .5c \ + -stipple @[file join $tk_demoDirectory images gray25.xbm] \ + -arrow both -arrowshape {15 15 7} -tags item +$c create line 1c 7c 1.75c 5.8c 2.5c 7c 3.25c 5.8c 4c 7c -width .5c \ + -cap round -join round -tags item + +$c create text 15c .2c -text "Curves (smoothed lines)" -anchor n +$c create line 11c 4c 11.5c 1c 13.5c 1c 14c 4c -smooth on \ + -fill $blue -tags item +$c create line 15.5c 1c 19.5c 1.5c 15.5c 4.5c 19.5c 4c -smooth on \ + -arrow both -width 2.25p -tags item +$c create line 12c 6c 13.5c 4.5c 16.5c 7.5c 18c 6c \ + 16.5c 4.5c 13.5c 7.5c 12c 6c -smooth on -width 3m -cap round \ + -stipple @[file join $tk_demoDirectory images gray25.xbm] \ + -fill $red -tags item + +$c create text 25c .2c -text Polygons -anchor n +$c create polygon 21c 1.0c 22.5c 1.75c 24c 1.0c 23.25c 2.5c \ + 24c 4.0c 22.5c 3.25c 21c 4.0c 21.75c 2.5c -fill $green \ + -outline {} -width 3p -tags item +$c create polygon 25c 4c 25c 4c 25c 1c 26c 1c 27c 4c 28c 1c \ + 29c 1c 29c 4c 29c 4c -fill $red -outline {} -smooth on -tags item +$c create polygon 22c 4.5c 25c 4.5c 25c 6.75c 28c 6.75c \ + 28c 5.25c 24c 5.25c 24c 6.0c 26c 6c 26c 7.5c 22c 7.5c \ + -stipple @[file join $tk_demoDirectory images gray25.xbm] \ + -fill $blue -outline {} -tags item + +$c create text 5c 8.2c -text Rectangles -anchor n +$c create rectangle 1c 9.5c 4c 12.5c -outline $red -width 3m -tags item +$c create rectangle 0.5c 13.5c 4.5c 15.5c -fill $green -tags item +$c create rectangle 6c 10c 9c 15c -outline {} \ + -stipple @[file join $tk_demoDirectory images gray25.xbm] \ + -fill $blue -tags item + +$c create text 15c 8.2c -text Ovals -anchor n +$c create oval 11c 9.5c 14c 12.5c -outline $red -width 3m -tags item +$c create oval 10.5c 13.5c 14.5c 15.5c -fill $green -tags item +$c create oval 16c 10c 19c 15c -outline {} \ + -stipple @[file join $tk_demoDirectory images gray25.xbm] \ + -fill $blue -tags item + +$c create text 25c 8.2c -text Text -anchor n +$c create rectangle 22.4c 8.9c 22.6c 9.1c +$c create text 22.5c 9c -anchor n -font $font1 -width 4c \ + -text "A short string of text, word-wrapped, justified left, and anchored north (at the top). The rectangles show the anchor points for each piece of text." -tags item +$c create rectangle 25.4c 10.9c 25.6c 11.1c +$c create text 25.5c 11c -anchor w -font $font1 -fill $blue \ + -text "Several lines,\n each centered\nindividually,\nand all anchored\nat the left edge." \ + -justify center -tags item +$c create rectangle 24.9c 13.9c 25.1c 14.1c +catch { +$c create text 25c 14c -font $font2 -anchor c -fill $red -angle 15 \ + -text "Angled characters" -tags item +} + +$c create text 5c 16.2c -text Arcs -anchor n +$c create arc 0.5c 17c 7c 20c -fill $green -outline black \ + -start 45 -extent 270 -style pieslice -tags item +$c create arc 6.5c 17c 9.5c 20c -width 4m -style arc \ + -outline $blue -start -135 -extent 270 -tags item \ + -outlinestipple @[file join $tk_demoDirectory images gray25.xbm] +$c create arc 0.5c 20c 9.5c 24c -width 4m -style pieslice \ + -fill {} -outline $red -start 225 -extent -90 -tags item +$c create arc 5.5c 20.5c 9.5c 23.5c -width 4m -style chord \ + -fill $blue -outline {} -start 45 -extent 270 -tags item + +$c create text 15c 16.2c -text "Bitmaps and Images" -anchor n +catch { +image create photo items.ousterhout \ + -file [file join $tk_demoDirectory images ouster.png] +image create photo items.ousterhout.active -format "png -alpha 0.5" \ + -file [file join $tk_demoDirectory images ouster.png] +set zoomFactor [expr {$tk::scalingPct / 100}] +foreach img {items.ousterhout items.ousterhout.active} { + image create photo ${img}2 + ${img}2 copy $img -zoom $zoomFactor +} +$c create image 13c 20c -tags item -image items.ousterhout2 \ + -activeimage items.ousterhout.active2 +} +$c create bitmap 17c 18.5c -tags item \ + -bitmap @[file join $tk_demoDirectory images noletter.xbm] +$c create bitmap 17c 21.5c -tags item \ + -bitmap @[file join $tk_demoDirectory images letters.xbm] + +$c create text 25c 16.2c -text Windows -anchor n +button $c.button -text "Press Me" -command "butPress $c $red" +$c create window 21c 18c -window $c.button -anchor nw -tags item +entry $c.entry -width 20 -relief sunken +$c.entry insert end "Edit this text" +$c create window 21c 21c -window $c.entry -anchor nw -tags item +scale $c.scale -from 0 -to 100 -length 6c -sliderlength .4c \ + -width .5c -tickinterval 0 +$c create window 28.5c 17.5c -window $c.scale -anchor n -tags item +$c create text 21c 17.9c -text Button: -anchor sw +$c create text 21c 20.9c -text Entry: -anchor sw +$c create text 28.5c 17.4c -text Scale: -anchor s + +# Set up event bindings for canvas: + +$c bind item "itemEnter $c" +$c bind item "itemLeave $c" +bind $c "$c scan mark %x %y" +bind $c "$c scan dragto %x %y" +bind $c "itemMark $c %x %y" +bind $c "itemStroke $c %x %y" +bind $c <> "itemsUnderArea $c" +bind $c "itemStartDrag $c %x %y" +bind $c "itemDrag $c %x %y" + +# Utility procedures for highlighting the item under the pointer: + +proc itemEnter {c} { + global restoreCmd + + if {[winfo depth $c] == 1} { + set restoreCmd {} + return + } + set type [$c type current] + if {$type == "window" || $type == "image"} { + set restoreCmd {} + return + } elseif {$type == "bitmap"} { + set bg [lindex [$c itemconf current -background] 4] + set restoreCmd [list $c itemconfig current -background $bg] + $c itemconfig current -background SteelBlue2 + return + } elseif {$type == "image"} { + set restoreCmd [list $c itemconfig current -state normal] + $c itemconfig current -state active + return + } + set fill [lindex [$c itemconfig current -fill] 4] + if {(($type == "rectangle") || ($type == "oval") || ($type == "arc")) + && ($fill == "")} { + set outline [lindex [$c itemconfig current -outline] 4] + set restoreCmd "$c itemconfig current -outline $outline" + $c itemconfig current -outline SteelBlue2 + } else { + set restoreCmd "$c itemconfig current -fill $fill" + $c itemconfig current -fill SteelBlue2 + } +} + +proc itemLeave {c} { + global restoreCmd + + eval $restoreCmd +} + +# Utility procedures for stroking out a rectangle and printing what's +# underneath the rectangle's area. + +proc itemMark {c x y} { + global areaX1 areaY1 + set areaX1 [$c canvasx $x] + set areaY1 [$c canvasy $y] + $c delete area +} + +proc itemStroke {c x y} { + global areaX1 areaY1 areaX2 areaY2 + set x [$c canvasx $x] + set y [$c canvasy $y] + if {($areaX1 != $x) && ($areaY1 != $y)} { + $c delete area + $c addtag area withtag [$c create rect $areaX1 $areaY1 $x $y \ + -outline black] + set areaX2 $x + set areaY2 $y + } +} + +proc itemsUnderArea {c} { + global areaX1 areaY1 areaX2 areaY2 + set area [$c find withtag area] + set items "" + foreach i [$c find enclosed $areaX1 $areaY1 $areaX2 $areaY2] { + if {[lsearch [$c gettags $i] item] >= 0} { + lappend items $i + } + } + puts stdout "Items enclosed by area: $items" + set items "" + foreach i [$c find overlapping $areaX1 $areaY1 $areaX2 $areaY2] { + if {[lsearch [$c gettags $i] item] >= 0} { + lappend items $i + } + } + puts stdout "Items overlapping area: $items" +} + +set areaX1 0 +set areaY1 0 +set areaX2 0 +set areaY2 0 + +# Utility procedures to support dragging of items. + +proc itemStartDrag {c x y} { + global lastX lastY + set lastX [$c canvasx $x] + set lastY [$c canvasy $y] +} + +proc itemDrag {c x y} { + global lastX lastY + set x [$c canvasx $x] + set y [$c canvasy $y] + $c move current [expr {$x-$lastX}] [expr {$y-$lastY}] + set lastX $x + set lastY $y +} + +# Procedure that's invoked when the button embedded in the canvas +# is invoked. + +proc butPress {w color} { + set i [$w create text 25c 18.1c -text "Oooohhh!!" -fill $color -anchor n] + after 500 "$w delete $i" +} diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ixset b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ixset similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ixset rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ixset diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/knightstour.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/knightstour.tcl new file mode 100644 index 00000000..0d632dfa --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/knightstour.tcl @@ -0,0 +1,274 @@ +# Copyright © 2008 Pat Thoyts +# +# Calculate a Knight's tour of a chessboard. +# +# This uses Warnsdorff's rule to calculate the next square each +# time. This specifies that the next square should be the one that +# has the least number of available moves. +# +# Using this rule it is possible to get to a position where +# there are no squares available to move into. In this implementation +# this occurs when the starting square is d6. +# +# To solve this fault an enhancement to the rule is that if we +# have a choice of squares with an equal score, we should choose +# the one nearest the edge of the board. +# +# If the call to the Edgemost function is commented out you can see +# this occur. +# +# You can drag the knight to a specific square to start if you wish. +# If you let it repeat then it will choose random start positions +# for each new tour. + +package require tk + +# Return a list of accessible squares from a given square +proc ValidMoves {square} { + set moves {} + foreach pair {{-1 -2} {-2 -1} {-2 1} {-1 2} {1 2} {2 1} {2 -1} {1 -2}} { + set col [expr {($square % 8) + [lindex $pair 0]}] + set row [expr {($square / 8) + [lindex $pair 1]}] + if {$row >= 0 && $row < 8 && $col >= 0 && $col < 8} { + lappend moves [expr {$row * 8 + $col}] + } + } + return $moves +} + +# Return the number of available moves for this square +proc CheckSquare {square} { + variable visited + set moves 0 + foreach test [ValidMoves $square] { + if {[lsearch -exact -integer $visited $test] < 0} { + incr moves + } + } + return $moves +} + +# Select the next square to move to. Returns -1 if there are no available +# squares remaining that we can move to. +proc Next {square} { + variable visited + set minimum 9 + set nextSquare -1 + foreach testSquare [ValidMoves $square] { + if {[lsearch -exact -integer $visited $testSquare] < 0} { + set count [CheckSquare $testSquare] + if {$count < $minimum} { + set minimum $count + set nextSquare $testSquare + } elseif {$count == $minimum} { + # to remove the enhancement to Warnsdorff's rule + # remove the next line: + set nextSquare [Edgemost $nextSquare $testSquare] + } + } + } + return $nextSquare +} + +# Select the square nearest the edge of the board +proc Edgemost {a b} { + set colA [expr {3-int(abs(3.5-($a%8)))}] + set colB [expr {3-int(abs(3.5-($b%8)))}] + set rowA [expr {3-int(abs(3.5-($a/8)))}] + set rowB [expr {3-int(abs(3.5-($b/8)))}] + return [expr {($colA * $rowA) < ($colB * $rowB) ? $a : $b}] +} + +# Display a square number as a standard chess square notation. +proc N {square} { + return [format %c%d [expr {97 + $square % 8}] [expr {$square / 8 + 1}]] +} + +# Perform a Knight's move and schedule the next move. +proc MovePiece {dlg last square} { + variable visited + variable delay + variable continuous + set line [format "%2d. %s .. %s" [llength $visited] [N $last] [N $square]] + $dlg.f.txt insert end $line\n + $dlg.f.txt see end + $dlg.f.c itemconfigure [expr {1+$last}] -state normal -outline black + $dlg.f.c itemconfigure [expr {1+$square}] -state normal -outline red + $dlg.f.c moveto knight {*}[lrange [$dlg.f.c coords [expr {1+$square}]] 0 1] + lappend visited $square + set next [Next $square] + if {$next ne -1} { + variable aid [after $delay [list MovePiece $dlg $square $next]] + } else { + $dlg.tf.b1 configure -state normal + if {[llength $visited] == 64} { + variable initial + if {$initial == $square} { + $dlg.f.txt insert end "Closed tour!" + } else { + $dlg.f.txt insert end "Success" + if {$continuous} { + after [expr {$delay * 2}] [namespace code \ + [list Tour $dlg [expr {int(rand() * 64)}]]] + } + } + } else { + $dlg.f.txt insert end "FAILED!" + } + } +} + +# Begin a new tour of the board given a random start position +proc Tour {dlg {square {}}} { + variable visited {} + $dlg.f.txt delete 1.0 end + $dlg.tf.b1 configure -state disabled + for {set n 0} {$n < 64} {incr n} { + $dlg.f.c itemconfigure $n -state disabled -outline black + } + if {$square eq {}} { + set coords [lrange [$dlg.f.c coords knight] 0 1] + set square [expr {[$dlg.f.c find closest {*}$coords 0 65]-1}] + } + variable initial $square + after idle [list MovePiece $dlg $initial $initial] +} + +proc Stop {} { + variable aid + catch {after cancel $aid} +} + +proc Exit {dlg} { + Stop + destroy $dlg +} + +proc SetDelay {newSpeed} { + variable speed [expr {int($newSpeed)}] + variable delay [expr {2000 - $speed}] +} + +proc DragStart {w x y} { + $w dtag selected + $w addtag selected withtag current + variable dragging [list $x $y] +} +proc DragMotion {w x y} { + variable dragging + if {[info exists dragging]} { + $w move selected [expr {$x - [lindex $dragging 0]}] \ + [expr {$y - [lindex $dragging 1]}] + variable dragging [list $x $y] + } +} +proc DragEnd {w x y} { + set square [$w find closest $x $y 0 65] + $w moveto selected {*}[lrange [$w coords $square] 0 1] + $w dtag selected + variable dragging ; unset dragging +} + +proc CreateGUI {} { + catch {destroy .knightstour} + set dlg [toplevel .knightstour] + wm title $dlg "Knight's Tour" + wm withdraw $dlg + set f [ttk::frame $dlg.f] + set c [canvas $f.c -width 192p -height 192p] + text $f.txt -width 12 -height 1 -padx 3p \ + -yscrollcommand [list $f.vs set] -font TkFixedFont + ttk::scrollbar $f.vs -command [list $f.txt yview] + + variable speed 1400 + variable delay [expr {2000 - $speed}] + variable continuous 0 + ttk::frame $dlg.tf + ttk::label $dlg.tf.ls -text Speed + ttk::scale $dlg.tf.sc -from 0 -to 1992 -command [list SetDelay] \ + -variable [namespace which -variable speed] + ttk::checkbutton $dlg.tf.cc -text Repeat \ + -variable [namespace which -variable continuous] + ttk::button $dlg.tf.b1 -text Start -command [list Tour $dlg] + ttk::button $dlg.tf.b2 -text Exit -command [list Exit $dlg] + set square 0 + for {set row 7} {$row >= 0} {incr row -1} { + for {set col 0} {$col < 8} {incr col} { + if {(($col & 1) ^ ($row & 1))} { + set fill tan3 ; set dfill tan4 + } else { + set fill bisque ; set dfill bisque3 + } + set coords [list [expr {$col * 24 + 3}]p \ + [expr {$row * 24 + 3}]p \ + [expr {$col * 24 + 24}]p \ + [expr {$row * 24 + 24}]p] + $c create rectangle $coords -fill $fill -disabledfill $dfill \ + -width 1.5p -state disabled -outline black + } + } + if {[tk windowingsystem] ne "x11"} { + catch {eval font create KnightFont -size 18} + $c create text 0 0 -font KnightFont -text "♞" \ + -anchor nw -tags knight -fill black -activefill "#600000" + } else { + # On X11 we cannot reliably tell if the ♞ glyph is available + # so just use a polygon + set pts { + 2 25 24 25 21 19 20 8 14 0 10 0 0 13 0 16 + 2 17 4 14 5 15 3 17 5 17 9 14 10 15 5 21 + } + $c create polygon $pts -tag knight -offset 8 \ + -fill black -activefill "#600000" + set scaleFactor [expr {$tk::scalingPct / 100.0}] + $c scale knight 0 0 $scaleFactor $scaleFactor + } + $c moveto knight {*}[lrange [$c coords [expr {1 + int(rand() * 64)}]] 0 1] + $c bind knight [namespace code [list DragStart %W %x %y]] + $c bind knight [namespace code [list DragMotion %W %x %y]] + $c bind knight [namespace code [list DragEnd %W %x %y]] + + grid $c $f.txt $f.vs -sticky news + grid rowconfigure $f 0 -weight 1 + grid columnconfigure $f 1 -weight 1 + + grid $f - - - - - -sticky news + set things [list $dlg.tf.b1 $dlg.tf.cc $dlg.tf.sc $dlg.tf.ls] + if {![info exists ::widgetDemo]} { + set things [linsert $things 0 $dlg.tf.b2] + if {[tk windowingsystem] ne "aqua"} { + set things [linsert $things 0 [ttk::sizegrip $dlg.tf.sg]] + } + } + pack {*}$things -side right -padx 1.5p -pady 1.5p + if {[tk windowingsystem] eq "aqua"} { + pack configure {*}$things -padx {4 4} -pady {12 12} + pack configure [lindex $things 0] -padx {4 24} + pack configure [lindex $things end] -padx {16 4} + } + grid $dlg.tf - - - - - -sticky ew + if {[info exists ::widgetDemo]} { + grid [addSeeDismiss $dlg.buttons $dlg] - - - - - -sticky ew + } + + grid rowconfigure $dlg 0 -weight 1 + grid columnconfigure $dlg 0 -weight 1 + + bind $dlg {console show} + bind $dlg [list $dlg.tf.b1 invoke] + bind $dlg [list $dlg.tf.b2 invoke] + bind $dlg [namespace code [list Stop]] + wm protocol $dlg WM_DELETE_WINDOW [namespace code [list Exit $dlg]] + + wm deiconify $dlg + tkwait window $dlg +} + +if {![winfo exists .knightstour]} { + if {![info exists widgetDemo]} { wm withdraw . } + set r [catch [linsert $argv 0 CreateGUI] err] + if {$r} { + tk_messageBox -icon error -title "Error" -message $err + } + if {![info exists widgetDemo]} { exit $r } +} diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/label.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/label.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/label.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/label.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/labelframe.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/labelframe.tcl new file mode 100644 index 00000000..0f400ed7 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/labelframe.tcl @@ -0,0 +1,76 @@ +# labelframe.tcl -- +# +# This demonstration script creates a toplevel window containing +# several labelframe widgets. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +set w .labelframe +catch {destroy $w} +toplevel $w +wm title $w "Labelframe Demonstration" +wm iconname $w "labelframe" +positionWindow $w + +# Some information + +label $w.msg -font $font -wraplength 4i -justify left -text "Labelframes are\ + used to group related widgets together. The label may be either \ + plain text or another widget." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +# Demo area + +frame $w.f +pack $w.f -side bottom -fill both -expand 1 +set w $w.f + +# A group of radiobuttons in a labelframe + +labelframe $w.f -text "Value" -padx 1.5p -pady 1.5p +grid $w.f -row 0 -column 0 -pady 2m -padx 2m + +foreach value {1 2 3 4} { + radiobutton $w.f.b$value -text "This is value $value" \ + -variable lfdummy -value $value + pack $w.f.b$value -side top -fill x -pady 1.5p +} + + +# Using a label window to control a group of options. + +proc lfEnableButtons {w} { + foreach child [winfo children $w] { + if {$child == "$w.cb"} continue + if {$::lfdummy2} { + $child configure -state normal + } else { + $child configure -state disabled + } + } +} + +labelframe $w.f2 -pady 1.5p -padx 1.5p +checkbutton $w.f2.cb -text "Use this option." -variable lfdummy2 \ + -command "lfEnableButtons $w.f2" -padx 0 +$w.f2 configure -labelwidget $w.f2.cb +grid $w.f2 -row 0 -column 1 -pady 2m -padx 2m + +set t 0 +foreach str {Option1 Option2 Option3} { + checkbutton $w.f2.b$t -text $str + pack $w.f2.b$t -side top -fill x -pady 1.5p + incr t +} +lfEnableButtons $w.f2 + + +grid columnconfigure $w {0 1} -weight 1 diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/license.terms b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/license.terms similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/license.terms rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/license.terms diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/mac_styles.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/mac_styles.tcl new file mode 100644 index 00000000..d301f8a1 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/mac_styles.tcl @@ -0,0 +1,266 @@ +# mac_styles.tcl -- +# +# This demonstration script creates a toplevel window containing a notebook +# whose pages provide examples of the various mac-specific widgets that are +# provided via special values for the -style option. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +set w .mac_styles +catch {destroy $w} +toplevel $w +package require tk +wm title $w "Tk Aqua Widgets" +wm iconname $w "mac_styles" +positionWindow $w +## +# System images we use in our buttons + +set featherImg [file join $tk_demoDirectory images Tk_feather.png] +set starryImg [file join $tk_demoDirectory images starry_night.png] +set fieldImg [file join $tk_demoDirectory images plowed_field.png] +image create nsimage action -source NSAction -width 48 -height 48 +image create nsimage bonjour -source NSBonjour -width 48 -height 48 +image create nsimage bonjour1 -source NSBonjour -width 48 -height 48 -pressed 1 +image create nsimage tkfeather -source $featherImg -as file -width 48 -height 48 +image create nsimage tkfeather1 -source $featherImg -as file -width 48 -height 48 -pressed 1 +image create nsimage starry -source $starryImg -as file -width 96 -radius 10 +image create nsimage starry1 -source $starryImg -as file -width 96 -radius 10 -pressed 1 +image create nsimage starry2 -source $starryImg -as file -width 96 -radius 10 -ring 3 +image create nsimage field -source $fieldImg -as file -width 96 -radius 10 +image create nsimage field1 -source $fieldImg -as file -width 96 -radius 10 -pressed 1 +image create nsimage field2 -source $fieldImg -as file -width 96 -radius 10 -ring 3 +image create nsimage add -source NSAddTemplate -width 20 -height 20 +image create nsimage remove -source NSRemoveTemplate -width 18 -height 4 + +# Off state and variables for checkbuttons and radio buttons +set off {!selected !alternate} +variable $w.checkVar +variable $w.radioVar +variable $w.triangleVar +variable $w.popupVar +variable $w.stepVar +variable $w.comboVar + +# Make a disclosure triangle change state when clicked. +proc toggleTriangle {tri} { + $tri instate {user1} { + $tri state {!user1} + return + } + $tri instate {!user1} { + $tri state {user1} + } +} + +proc popupButton {win varName firstValue args} { + upvar #0 $varName var + if {![info exists var]} { + set var $firstValue + } + ttk::menubutton $win -textvariable $varName -menu $win.menu -direction flush + menu $win.menu -tearoff 0 + $win.menu add radiobutton -label $firstValue -variable $varName + foreach i $args { + $win.menu add radiobutton -label $i -variable $varName + } + return $win.menu +} + +set mag [encoding convertfrom utf-8 "\xf0\x9f\x94\x8d"] + +proc searchFocusOut {e} { + global mag + if {[$e get] eq ""} { + $e configure -foreground gray60 + $e insert 0 "Search" + } +} + +proc searchFocusIn {e} { + if {[$e cget -foreground] == {gray60}} { + $e delete 0 end + $e configure -foreground black + } +} + +## Make the notebook and set up Ctrl+Tab traversal +ttk::notebook $w.notebook +ttk::notebook::enableTraversal $w.notebook + +# Frames pane +set framesFrame [ttk::frame $w.notebook.frames -padding {40 35 40 50}] +$w.notebook add $framesFrame -text "Frames" +pack [ttk::labelframe $framesFrame.darker -text Darker -padding {50 30 50 50}] \ + -fill both -expand 1 +pack [ttk::label $framesFrame.darker.label -padding {0 0 0 6} \ + -text "This Group Box is nested to depth 2"] \ + -fill x +pack [ttk::labelframe $framesFrame.darker.darker -text "Darker Still" -padding 24] \ + -fill both -expand 1 +pack [ttk::label $framesFrame.darker.darker.label \ + -text "This Group Box is nested to depth 3"] -fill x +pack [button $framesFrame.darker.darker.tkbutton -text "Tk Button" -width 7 \ + -highlightbackground systemWindowBackgroundColor3] -pady 10 +pack [ttk::button $framesFrame.darker.darker.ttkbutton -text "Ttk Button" \ + -width 7 -padding {-4 0 -4 0}] \ + -pady 3 +# Button pane +set buttonFrame [ttk::frame $w.notebook.buttons -padding {100 20 0 20}] +$w.notebook add $buttonFrame -text "Buttons" +grid columnconfigure $buttonFrame 0 -minsize 100 +grid columnconfigure $buttonFrame 1 -minsize 100 + +set plain [ttk::button $buttonFrame.plain -text Button -padding {-12 0}] +popupButton $buttonFrame.options .popupVar "Item 1" "Item 2" "Item 3" +set options $buttonFrame.options +set check [ttk::checkbutton $buttonFrame.check -text Check -variable .checkVar] +set radio [ttk::frame $buttonFrame.radio] +pack [ttk::radiobutton $radio.r1 -text "Radio 1" -variable .radioVar -value 1] -pady 4 +pack [ttk::radiobutton $radio.r2 -text "Radio 2" -variable .radioVar -value 2] -pady 4 +set triangle [ttk::checkbutton $buttonFrame.triangle -style Item -variable TriangleVar] +bind $triangle {toggleTriangle %W} +set bonjour [ttk::button $buttonFrame.bonjour -style ImageButton -text Bonjour \ + -image {bonjour pressed bonjour1}] +set feather [ttk::button $buttonFrame.feather -style ImageButton -text Tk \ + -image {tkfeather pressed tkfeather1}] +set gradient [ttk::frame $buttonFrame.gradient] +pack [ttk::button $buttonFrame.gradient.add -style GradientButton \ + -image add -padding {2 0}] -side left +pack [ttk::button $buttonFrame.gradient.remove -style GradientButton \ + -image remove -padding {2 8}] -side left +set disclosure [ttk::checkbutton $buttonFrame.disclosure -style DisclosureButton] +set help [ttk::button $buttonFrame.help -style HelpButton]; + +$check state $off +$radio.r1 state $off +$radio.r2 state $off + +grid [ttk::label $buttonFrame.plainLabel -text "Push Button:"]\ + -row 0 -column 0 -padx 4 -sticky e +grid $plain -pady 4 -row 0 -column 1 -sticky w +grid [ttk::label $buttonFrame.optionsLabel -text "Pop-up Button:"]\ + -row 1 -column 0 -padx 4 -sticky e +grid $options -pady 4 -row 1 -column 1 -sticky w +grid [ttk::label $buttonFrame.checkLabel -text "Check Button:"]\ + -row 2 -column 0 -padx 4 -sticky e +grid $check -pady 4 -row 2 -column 1 -sticky w +grid [ttk::label $buttonFrame.radioLabel -text "Radio Buttons:"]\ + -row 3 -column 0 -padx 4 -sticky e +grid $radio -pady 4 -row 3 -column 1 -sticky w +grid [ttk::label $buttonFrame.triangleLabel -text "Disclosure Triangle:"]\ + -row 4 -column 0 -padx 4 -sticky e +grid $triangle -pady 4 -row 4 -column 1 -sticky w +grid [ttk::label $buttonFrame.disclosureLabel -text "Disclosure Button:"]\ + -row 5 -column 0 -padx 4 -sticky e +grid $disclosure -row 5 -column 1 -sticky w +grid [ttk::label $buttonFrame.imageLabel -text "Image Buttons:"]\ + -row 7 -column 0 -padx 4 -sticky e +grid $bonjour -pady 4 -row 6 -rowspan 4 -column 1 -sticky w +grid $feather -padx 10 -pady 4 -row 6 -rowspan 4 -column 2 +grid [ttk::label $buttonFrame.gradentLabel -text "Gradient Buttons:"]\ +-row 10 -column 0 -padx 4 -sticky e +grid $gradient -pady 4 -row 10 -column 1 -sticky w +grid [ttk::label $buttonFrame.helpLabel -text "Help Button:"]\ +-row 11 -column 0 -padx 4 -sticky e +grid $help -row 11 -column 1 -sticky w + +#ttk::button .f.b1 -style Toolbutton -image action +#pack $buttonFrame + +# Entries Frame +set entryFrame [ttk::frame $w.notebook.entries -padding {0 30 80 0}] +grid columnconfigure $entryFrame 0 -minsize 200 +$w.notebook add $entryFrame -text "Entries" + +set textfield [ttk::entry $entryFrame.text -width 17] +set searchfield [ttk::entry $entryFrame.search -width 1] +set combo [ttk::combobox $entryFrame.combo -width 1 -textvariable comboVar \ + -values {"Item 1" "Item 2" "Item 3"}] +set stepper [ttk::spinbox $entryFrame.stepper -width 1 -textvariable stepVar \ + -from 99000 -to 101000 -increment 1] +set stepVar 100000 +searchFocusOut $searchfield +bind $searchfield {searchFocusIn %W} +bind $searchfield {searchFocusOut %W} + +grid [ttk::label $entryFrame.l0 -text "Text Field"] -row 0 -column 0 -padx 20 -sticky e +grid $textfield -sticky ew -row 0 -column 1 -pady 13 +grid [ttk::label $entryFrame.l1 -text "Search Field"] -row 1 -column 0 -padx 20 -sticky e +grid $searchfield -sticky ew -row 1 -column 1 -pady 13 +grid [ttk::label $entryFrame.l2 -text "Combo Box"] -row 2 -column 0 -padx 20 -sticky e +grid $combo -sticky ew -row 2 -column 1 -pady 13 +grid [ttk::label $entryFrame.l3 -text "Stepper"] -row 3 -column 0 -padx 20 -sticky e +grid $stepper -sticky ew -row 3 -column 1 -pady 13 + +#Scales Frame +set scaleFrame [ttk::frame $w.notebook.scales -padding {0 40 0 80}] +$w.notebook add $scaleFrame -text "Scales" + +variable topVar 50 +set topSlider [ttk::scale $scaleFrame.topSlider -from 0 -to 100 \ + -length 280 -variable topVar] +set topProgress [ttk::progressbar $scaleFrame.topProgress \ + -maximum 100 -variable topVar] + +variable bottomVar 50 +set bottomSlider [ttk::scale $scaleFrame.bottomSlider -from 0 -to 100 \ + -length 280 -variable bottomVar] +$bottomSlider state alternate +set bottomProgress [ttk::progressbar $scaleFrame.bottomProgress \ + -maximum 100 -variable bottomVar] + + +grid $topSlider -padx 80 -pady 12 -sticky ew -row 0 -column 0 -columnspan 2 +grid $topProgress -padx 120 -pady 15 -sticky ew -row 1 -column 0 -columnspan 2 +grid [ttk::frame $scaleFrame.spacer] -row 2 -column 0 -columnspan 2 -pady 32 + +grid $bottomSlider -padx 80 -sticky new -row 3 -column 0 -columnspan 2 +grid [ttk::label $scaleFrame.low -text Low -padding {70 0 0 0}] \ + -row 4 -column 0 -sticky sw +grid [ttk::label $scaleFrame.high -text High -padding {0 0 70 0}] \ + -row 4 -column 1 -sticky se +grid $bottomProgress -padx 120 -pady 15 -sticky ew -row 5 -column 0 -columnspan 2 + +#Appearance Frame +set appearanceFrame [ttk::frame $w.notebook.appearance -padding {0 40 0 80}] +grid [ttk::label $w.notebook.appearance.info -justify left -padding {0 20 0 40}\ + -text "Use the image buttons below to view this demo in light or dark mode."] \ + -row 0 -column 0 -columnspan 3 +set light [ttk::button $appearanceFrame.light -style ImageButton -text Light \ + -image {field pressed field1 selected field2} \ + -command "beLight $appearanceFrame $w"] +grid columnconfigure $appearanceFrame 1 -minsize 10 +grid $light -row 1 -column 0 -sticky e +set dark [ttk::button $appearanceFrame.dark -style ImageButton -text Dark \ + -image {starry pressed starry1 selected starry2} \ + -command "beDark $appearanceFrame $w"] +grid $dark -row 1 -column 2 -sticky w +if { [wm attributes $w -isdark] } { + $dark state selected +} else { + $light state selected +} +proc beLight {f w} { + wm attributes $w -appearance aqua + # A small delay is needed for the appearance change to complete. + after 20 [list $f.dark state !selected] + after 20 [list $f.light state selected] +} + +proc beDark {f w} { + wm attributes $w -appearance darkaqua + # A small delay is needed for the appearance change to complete. + after 20 [list $f.light state !selected] + after 20 [list $f.dark state selected] +} +$w.notebook add $appearanceFrame -text "Appearance" + +## See Code / Dismiss +pack [addSeeDismiss $w.buttons $w] -side bottom -fill x + +## Notebook +pack $w.notebook -side bottom -fill both -expand 1 -padx 16 -pady 16 + diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/mac_tabs.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/mac_tabs.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/mac_tabs.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/mac_tabs.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/mac_wm.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/mac_wm.tcl new file mode 100644 index 00000000..eba4f03a --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/mac_wm.tcl @@ -0,0 +1,227 @@ +# mac_window_styles.tcl -- +# +# This demonstration script creates a toplevel window containing a notebook +# whose pages provide examples of the various mac-specific widgets that are +# provided via special values for the -style option. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +set w .mac_wm +catch {destroy $w} +toplevel $w +wm title $w "Tk Aqua Window Styles" +wm iconname $w "mac_wm" +positionWindow $w +set suffix 0 +set winlist {} +## + +## See Code / Dismiss +pack [addSeeDismiss $w.buttons $w] -side bottom -fill x + +proc launch {name windowInfo class} { + if {[winfo exists $name]} { + wm deiconify $name + focus -force $name + return + } + wm attributes $name -class $class; toplevel $name + wm title $name $class + set f $name.f + ttk::frame $f + set t $f.t + text $t -background systemWindowBackgroundColor \ + -highlightcolor systemWindowBackgroundColor \ + -font systemDefaultFont\ + -wrap word -width 50 -height 6 + $t insert insert $windowInfo + $t configure -state disabled + grid columnconfigure $f 0 -weight 1 + grid $t -row 0 -column 0 -columnspan 2 -sticky NSEW + ttk::labelframe $f.stylemask -text "styleMask bits" + # titled + if {$class == "nswindow"} { + ttk::checkbutton $f.stylemask.titled -text titled -variable $name.titled \ + -command [list setbit $name $f.stylemask.titled titled] + $f.stylemask.titled state selected + grid $f.stylemask.titled -row 0 -column 0 -sticky w + } + # closable + ttk::checkbutton $f.stylemask.closable -text closable -variable $name.closable \ + -command [list setbit $name $f.stylemask.closable closable] + $f.stylemask.closable state selected + grid $f.stylemask.closable -row 1 -column 0 -sticky w + # miniaturizableable + ttk::checkbutton $f.stylemask.miniaturizable -text miniaturizable \ + -variable $name.miniaturizable \ + -command [list setbit $name $f.stylemask.miniaturizable miniaturizable] + if {$class == "nswindow"} { + $f.stylemask.miniaturizable state selected + } else { + $f.stylemask.miniaturizable state !alternate + } + grid $f.stylemask.miniaturizable -row 2 -column 0 -sticky w + # resizable + ttk::checkbutton $f.stylemask.resizable -text resizable -variable $name.resizable \ + -command [list setbit $name $f.stylemask.resizable resizable] + $f.stylemask.resizable state selected + grid $f.stylemask.resizable -row 3 -column 0 -sticky w + # docmodal + ttk::checkbutton $f.stylemask.docmodal -text docmodal -variable $name.docmodal \ + -command [list setbit $name $f.stylemask.docmodal docmodal] + $f.stylemask.docmodal state !alternate + grid $f.stylemask.docmodal -row 4 -column 0 -sticky w + + grid $f.stylemask -row 1 -column 0 + pack $name.f -side bottom -fill both -expand 1 -padx 16 -pady 16 +} + +set info "The command wm attributes window -stylemask ?bitnames? can \ +be used to modify bits in the stylemask property of the NSWindow or \ +NSPanel underlying a Tk Window. Changing these bits causes the \ +style of the window to change. This demo allows you to see the \ +effects of changing the bits. (Note that buttons in the title bar \ +can also be enabled or disabled with the ::tk::unsupported::MacWindowStyle \ +command.)" + +set panelInfo "A toplevel based on an NSPanel has a narrower title bar\ +than one based on an NSWindow. In addition the panel remains above all\ +windows on the screen, regardless of which app is active. These are\ +intended to be used as modal windows." + +set windowInfo "This is a standard Apple document window, based on an\ +NSWindow. It has a larger title bar and behaves normally with respect\ +to other windows from the same or another app." + +## background frame +set f $w.f +ttk::frame $f +set t $f.t +text $t -background systemWindowBackgroundColor \ + -highlightcolor systemWindowBackgroundColor \ + -font systemDefaultFont\ + -wrap word -width 50 -height 8 +$t insert insert $info +$t configure -state disabled +grid columnconfigure $f 0 -weight 1 +grid $t -row 0 -column 0 -columnspan 2 -sticky NSEW +ttk::labelframe $f.stylemask -text "styleMask" +grid $f.stylemask -row 1 -column 0 +grid [ttk::button $f.wbw -text "Open an NSWindow" -width 20 \ + -command [list launch .nswindow $windowInfo nswindow]] -row 2 -column 0 +grid [ttk::button $f.wbp -text "Open an NSPanel" -width 20 \ + -command [list launch .nspanel $panelInfo nspanel]] -row 3 -column 0 +grid [ttk::button $f.wbm -text "Open a modern window" -width 20 \ + -command launchModernWindow] -row 4 -column 0 +pack $w.f -side bottom -fill both -expand 1 -padx 16 -pady 16 + +proc setbit {win cb bitname} { + set state [$cb instate selected] + set bits [wm attributes $win -stylemask] + set index [lsearch $bits $bitname] + if {$index >= 0 && !$state} { + set bits [lreplace $bits $index $index] + } + if {$index < 0 && $state} { + lappend bits $bitname + } + wm attributes $win -stylemask $bits +} + +set aboutText \ +"Most of the apps which ship with a contemporary version of macOS \ +feature a window similar to this one, with a left sidebar that \ +allows selecting the content to be shown on the right hand side of \ +the window. These windows do not have a (visible) titlebar.\ +\n\nApps that use such windows include the Finder and the App Store as \ +well as Notes, Messages, Books, Maps and many others.\ +\n\nTo create a window like this one in Tk simply set the fullsizecontent bit \ +in the stylemask. For example:\n\n" + +set aboutCode \ +"wm attributes .t -stylemask {titled \\\ +\nfullsizecontent closable miniaturizable \\\ +\nresizable}\n\n" + +set detailsText \ +"(1) In the Apple API, setting the fullsizecontent bit in the stylemask \ +only allows content to be drawn in the part of the window covered by \ +the titlebar. In order for that content to be visible the title bar \ +must be transparent. Since it would be pointless to draw content under \ +an opaque title bar, Tk makes the title bar transparent whenever the \ +fullsizecontent bit is set.\ + +\n\n\(2) Each radio button in the sidebar is a standard ttk::radiobutton \ +but created with a special value for its -style option. The value of the \ +-style option used to create these buttons is SidebarButton.\n" + +set whichPage 1 +trace add variable whichPage write "flipPage whichPage" +proc flipPage {varname args} { + global whichPage + set newpage [set $varname] + grid remove [grid content .mod.right -row 0 -column 0] + switch $newpage\ + 1 {grid .mod.right.about -padx 30 -pady 30 -row 0 -column 0 -sticky nsew}\ + 2 {grid .mod.right.details -padx 30 -pady 30 -row 0 -column 0 -sticky nsew} + update idletasks +} + +proc launchModernWindow {} { + global whichPage + global aboutText + global aboutCode + global detailsText + if {[winfo exists .mod]} { + wm deiconify .mod + focus -force .mod + return + } + toplevel .mod + wm title .mod {} + wm attributes .mod -stylemask {titled fullsizecontent closable \ + miniaturizable resizable} + .mod configure -background white + grid columnconfigure .mod 0 -weight 0 + grid columnconfigure .mod 1 -weight 1 + grid rowconfigure .mod 0 -weight 1 + frame .mod.left -width 220 -height 400 -background systemWindowBackgroundColor + catch { + font create leftFont -family .AppleSystemUIFont -size 11 + font create rightFont -family .AppleSystemUIFont -size 16 + font create codeFont -family Courier -size 16 + } + grid [ttk::label .mod.left.spacer -padding {220 30 0 0}] -row 0 -column 0 + grid [ttk::radiobutton .mod.left.about -text About -style SidebarButton \ + -variable whichPage -value 1] \ + -row 1 -column 0 -sticky nsew -padx 14 + grid [ttk::radiobutton .mod.left.details -text Details -style SidebarButton \ + -variable whichPage -value 2] \ + -row 2 -column 0 -sticky nsew -padx 14 + grid .mod.left -row 0 -column 0 -sticky nsew + frame .mod.right -width 500 -background systemTextBackgroundColor + grid rowconfigure .mod.right 0 -weight 0 + text .mod.right.about -highlightcolor systemTextBackgroundColor \ + -background systemTextBackgroundColor -font rightFont \ + -highlightthickness 0 -wrap word -width 40 + .mod.right.about tag configure code -font codeFont + .mod.right.about insert end $aboutText + .mod.right.about insert end $aboutCode code + .mod.right.about configure -state disabled + + text .mod.right.details -highlightcolor systemTextBackgroundColor \ + -background systemTextBackgroundColor -font rightFont\ + -highlightthickness 0 -wrap word -width 40 + .mod.right.details insert end $detailsText + .mod.right.details configure -state disabled + + grid .mod.right.about -padx 30 -pady 30 -row 0 -column 0 -sticky nsew + grid .mod.right -row 0 -column 1 -sticky nsew + wm geometry .mod 800x500 + update idletasks +} + diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/mclist.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/mclist.tcl new file mode 100644 index 00000000..53354901 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/mclist.tcl @@ -0,0 +1,170 @@ +# mclist.tcl -- +# +# This demonstration script creates a toplevel window containing a Ttk +# tree widget configured as a multi-column listbox. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +set w .mclist +catch {destroy $w} +toplevel $w -class MCList +wm title $w "Multi-Column List" +wm iconname $w "mclist" +positionWindow $w + +## Explanatory text +ttk::label $w.msg -font $font -wraplength 4i -justify left -anchor n -padding {10 2 10 6} -text "Ttk is the new Tk themed widget set. One of the widgets it includes is a tree widget, which can be configured to display multiple columns of informational data without displaying the tree itself. This is a simple way to build a listbox that has multiple columns. Clicking on the heading for a column will sort the data by that column. You can also change the width of the columns by dragging the boundary between them." +pack $w.msg -fill x + +## See Code / Dismiss +pack [addSeeDismiss $w.seeDismiss $w {} { + ttk::checkbutton $w.seeDismiss.cb1 -text Grid -variable mclistGrid -command tglGrid +}] -side bottom -fill x + + +ttk::frame $w.container +ttk::treeview $w.tree -columns {country capital currency} -show headings \ + -yscroll "$w.vsb set" -xscroll "$w.hsb set" +ttk::scrollbar $w.vsb -orient vertical -command "$w.tree yview" +ttk::scrollbar $w.hsb -orient horizontal -command "$w.tree xview" +pack $w.container -fill both -expand 1 +grid $w.tree $w.vsb -in $w.container -sticky nsew +grid $w.hsb -in $w.container -sticky nsew +grid column $w.container 0 -weight 1 +grid row $w.container 0 -weight 1 + +set upArrowData { + + + + +} + +set downArrowData { + + + + +} + +proc createArrowImages {} { + set fgColor [ttk::style lookup . -foreground {} black] + lassign [winfo rgb . $fgColor] r g b + set fgColor [format "#%02x%02x%02x" \ + [expr {$r >> 8}] [expr {$g >> 8}] [expr {$b >> 8}]] + + foreach dir {up down} { + upvar ${dir}ArrowData imgData + set idx1 [string first "#000000" $imgData] + set idx2 [expr {$idx1 + 6}] + set data [string replace $imgData $idx1 $idx2 $fgColor] + + image create photo ${dir}Arrow -format $::tk::svgFmt -data $data] + } +} + +createArrowImages +foreach event {<> <> <>} { + bind MCList $event { createArrowImages } +} +unset event + +image create photo noArrow -format $tk::svgFmt -data { + + + +} + +## The data we're going to insert +set data { + Argentina {Buenos Aires} ARS + Australia Canberra AUD + Brazil Brazilia BRL + Canada Ottawa CAD + China Beijing CNY + France Paris EUR + Germany Berlin EUR + India {New Delhi} INR + Italy Rome EUR + Japan Tokyo JPY + Mexico {Mexico City} MXN + Russia Moscow RUB + {South Africa} Pretoria ZAR + {United Kingdom} London GBP + {United States} {Washington, D.C.} USD +} + +## Code to insert the data nicely +set font [ttk::style lookup Heading -font {} TkDefaultFont] +set morePx [expr {[image width noArrow] + round(4 * $tk::scalingPct / 100.0)}] +foreach col {country capital currency} name {Country Capital Currency} { + $w.tree heading $col -text $name -image noArrow -anchor w \ + -command [list SortBy $w.tree $col 0] + $w.tree column $col -width [expr {[font measure $font $name] + $morePx}] +} +set font [ttk::style lookup Treeview -font {} TkDefaultFont] +foreach {country capital currency} $data { + $w.tree insert {} end -values [list $country $capital $currency] + foreach col {country capital currency} { + set len [font measure $font "[set $col] "] + if {[$w.tree column $col -width] < $len} { + $w.tree column $col -width $len + } + } +} + +## Code to do the sorting of the tree contents when clicked on +proc SortBy {tree col direction} { + # Determine currently sorted column and its sort direction + foreach c {country capital currency} { + set s [$tree heading $c state] + if {("selected" in $s || "alternate" in $s) && $col ne $c} { + # Sorted column has changed + $tree heading $c -image noArrow state {!selected !alternate !user1} + set direction [expr {"alternate" in $s}] + } + } + + # Build something we can sort + set data {} + foreach row [$tree children {}] { + lappend data [list [$tree set $row $col] $row] + } + + set dir [expr {$direction ? "-decreasing" : "-increasing"}] + set r -1 + + # Now reshuffle the rows into the sorted order + foreach info [lsort -dictionary -index 0 $dir $data] { + $tree move [lindex $info 1] {} [incr r] + } + + # Switch the heading so that it will sort in the opposite direction + $tree heading $col -command [list SortBy $tree $col [expr {!$direction}]] \ + state [expr {$direction?"!selected alternate":"selected !alternate"}] + if {[ttk::style theme use] eq "aqua"} { + # Aqua theme displays native sort arrows when user1 state is set + $tree heading $col state "user1" + } else { + $tree heading $col -image [expr {$direction?"upArrow":"downArrow"}] + } +} + +set mclistGrid 0 +proc tglGrid {} { + if {$::mclistGrid} { + .mclist.tree configure -stripe 1 + foreach col [.mclist.tree cget -columns] { + .mclist.tree column $col -separator 1 + } + } else { + .mclist.tree configure -stripe 0 + foreach col [.mclist.tree cget -columns] { + .mclist.tree column $col -separator 0 + } + } +} diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/menu.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/menu.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/menu.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/menu.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/menubu.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/menubu.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/menubu.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/menubu.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/msgbox.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/msgbox.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/msgbox.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/msgbox.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/nl.msg b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/nl.msg new file mode 100644 index 00000000..60ca47c8 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/nl.msg @@ -0,0 +1,132 @@ +::msgcat::mcset nl "Widget Demonstration" "Demonstratie van widgets" +::msgcat::mcset nl "tkWidgetDemo" +::msgcat::mcset nl "&File" "&Bestand" +::msgcat::mcset nl "About..." "Info..." +::msgcat::mcset nl "&About..." "&Info..." +::msgcat::mcset nl "" "" +::msgcat::mcset nl "&Quit" "&Einde" +::msgcat::mcset nl "Meta+Q" "Meta+E" ;# Displayed hotkey +::msgcat::mcset nl "Meta-q" "Meta-e" ;# Actual binding sequence +::msgcat::mcset nl "Ctrl+Q" "Ctrl+E" ;# Displayed hotkey +::msgcat::mcset nl "Control-q" "Control-e" ;# Actual binding sequence +::msgcat::mcset nl "See Variables" "Bekijk Variabelen" +::msgcat::mcset nl "Variable values" "Waarden variabelen" +::msgcat::mcset nl "Variable values:" "Waarden variabelen" +::msgcat::mcset nl "OK" +::msgcat::mcset nl "Run the \"%s\" sample program" "Start voorbeeld \"%s\"" +::msgcat::mcset nl "Dismiss" "Sluiten" +::msgcat::mcset nl "Rerun Demo" "Herstart Demo" ;# This is also button text! +::msgcat::mcset nl "Print Code" "Code Afdrukken" +::msgcat::mcset nl "Demo code: %s" "Code van Demo %s" +::msgcat::mcset nl "About Widget Demo" "Over deze demonstratie" +::msgcat::mcset nl "Tk widget demonstration" "Demonstratie van Tk widgets" +::msgcat::mcset nl "Copyright © %s" + +::msgcat::mcset nl "Tk Widget Demonstrations" "Demonstratie van Tk widgets" +::msgcat::mcset nl "This application provides a front end for several short scripts" \ + "Dit programma is een schil rond enkele korte scripts waarmee" +::msgcat::mcset nl "that demonstrate what you can do with Tk widgets. Each of the" \ + "gedemonstreerd wordt wat je kunt doen met Tk widgets. Elk van de" +::msgcat::mcset nl "numbered lines below describes a demonstration; you can click on" \ + "genummerde regels hieronder omschrijft een demonstratie; je kunt de" +::msgcat::mcset nl "it to invoke the demonstration. Once the demonstration window" \ + "demonstratie starten door op de regel te klikken." +::msgcat::mcset nl "appears, you can click the" \ + "Zodra het nieuwe venster verschijnt, kun je op de knop" +::msgcat::mcset nl "See Code" "Bekijk Code" ;# This is also button text! +::msgcat::mcset nl "button to see the Tcl/Tk code that created the demonstration. If" \ + "drukken om de achterliggende Tcl/Tk code te zien. Als je dat wilt," +::msgcat::mcset nl "you wish, you can edit the code and click the" \ + "kun je de code wijzigen en op de knop" +::msgcat::mcset nl "button in the code window to reinvoke the demonstration with the" \ + "drukken in het codevenster om de demonstratie uit te voeren met de" +::msgcat::mcset nl "modified code." \ + "nieuwe code." + +::msgcat::mcset nl "Labels, buttons, checkbuttons, and radiobuttons" \ + "Labels, knoppen, vinkjes/aankruishokjes en radioknoppen" +::msgcat::mcset nl "Labels (text and bitmaps)" "Labels (tekst en plaatjes)" +::msgcat::mcset nl "Labels and UNICODE text" "Labels en tekst in UNICODE" +::msgcat::mcset nl "Buttons" "Buttons (drukknoppen)" +::msgcat::mcset nl "Check-buttons (select any of a group)" \ + "Check-buttons (een of meer uit een groep)" +::msgcat::mcset nl "Radio-buttons (select one of a group)" \ + "Radio-buttons (een van een groep)" +::msgcat::mcset nl "A 15-puzzle game made out of buttons" \ + "Een schuifpuzzel van buttons" +::msgcat::mcset nl "Iconic buttons that use bitmaps" \ + "Buttons met pictogrammen" +::msgcat::mcset nl "Two labels displaying images" \ + "Twee labels met plaatjes in plaats van tekst" +::msgcat::mcset nl "A simple user interface for viewing images" \ + "Een eenvoudige user-interface voor het bekijken van plaatjes" +::msgcat::mcset nl "Labelled frames" \ + "Kaders met bijschrift" + +::msgcat::mcset nl "Listboxes" "Keuzelijsten" +::msgcat::mcset nl "The 50 states" "De 50 staten van de VS" +::msgcat::mcset nl "Colors: change the color scheme for the application" \ + "Kleuren: verander het kleurenschema voor het programma" +::msgcat::mcset nl "A collection of famous and infamous sayings" \ + "Beroemde en beruchte citaten en gezegden" + +::msgcat::mcset nl "Entries and Spin-boxes" "Invulvelden en Spinboxen" +::msgcat::mcset nl "Entries without scrollbars" "Invulvelden zonder schuifbalk" +::msgcat::mcset nl "Entries with scrollbars" "Invulvelden met schuifbalk" +::msgcat::mcset nl "Validated entries and password fields" \ + "Invulvelden met controle of wachtwoorden" +::msgcat::mcset nl "Spin-boxes" "Spinboxen" +::msgcat::mcset nl "Simple Rolodex-like form" "Simpel kaartsysteem" + +::msgcat::mcset nl "Text" "Tekst" +::msgcat::mcset nl "Basic editable text" "Voorbeeld met te wijzigen tekst" +::msgcat::mcset nl "Text display styles" "Tekst met verschillende stijlen" +::msgcat::mcset nl "Hypertext (tag bindings)" \ + "Hypertext (verwijzingen via \"tags\")" +::msgcat::mcset nl "A text widget with embedded windows" \ + "Tekstwidget met windows erin" +::msgcat::mcset nl "A search tool built with a text widget" \ + "Zoeken in tekst met behulp van een tekstwidget" + +::msgcat::mcset nl "Canvases" "Canvaswidgets" +::msgcat::mcset nl "The canvas item types" "Objecten in een canvas" +::msgcat::mcset nl "A simple 2-D plot" "Eenvoudige 2D-grafiek" +::msgcat::mcset nl "Text items in canvases" "Tekstobjecten in een canvas" +::msgcat::mcset nl "An editor for arrowheads on canvas lines" \ + "Editor voor de vorm van de pijl (begin/eind van een lijn)" +::msgcat::mcset nl "A ruler with adjustable tab stops" \ + "Een meetlat met aanpasbare ruiters" +::msgcat::mcset nl "A building floor plan" "Plattegrond van een gebouw" +::msgcat::mcset nl "A simple scrollable canvas" "Een schuifbaar canvas" + +::msgcat::mcset nl "Scales" "Schaalverdelingen" +::msgcat::mcset nl "Horizontal scale" "Horizontale schaal" +::msgcat::mcset nl "Vertical scale" "Verticale schaal" + +::msgcat::mcset nl "Paned Windows" "Vensters opgedeeld in stukken" +::msgcat::mcset nl "Horizontal paned window" "Horizontaal gedeeld venster" +::msgcat::mcset nl "Vertical paned window" "Verticaal gedeeld venster" +::msgcat::mcset nl "Menus" "Menu's" +::msgcat::mcset nl "Menus and cascades (sub-menus)" \ + "Menu's en cascades (submenu's)" +::msgcat::mcset nl "Menu-buttons" "Menu-buttons" +::msgcat::mcset nl "Common Dialogs" "Veel voorkomende dialoogvensters" +::msgcat::mcset nl "Message boxes" "Mededeling (message box)" +::msgcat::mcset nl "File selection dialog" "Selectie van bestanden" +::msgcat::mcset nl "Color picker" "Kleurenpalet" +::msgcat::mcset nl "Font selection dialog" "Selectie van fonts" +::msgcat::mcset nl "System tray icon and notification" "Systeemvakpictogram en melding" +::msgcat::mcset nl "Printing from canvas and text widgets" "Afdrukken van canvas en tekst widgets" +::msgcat::mcset nl "Animation" "Animaties" +::msgcat::mcset nl "Animated labels" "Geanimeerde labels" +::msgcat::mcset nl "Animated wave" "Geanimeerde golf" +::msgcat::mcset nl "Pendulum simulation" "Pendulum simulatie" +::msgcat::mcset nl "A celebration of Rube Goldberg" "Een viering van Rube Goldberg" +::msgcat::mcset nl "Miscellaneous" "Diversen" +::msgcat::mcset nl "The built-in bitmaps" "Ingebouwde plaatjes" +::msgcat::mcset nl "A dialog box with a local grab" \ + "Een dialoogvenster met een locale \"grab\"" +::msgcat::mcset nl "A dialog box with a global grab" \ + "Een dialoogvenster met een globale \"grab\"" +::msgcat::mcset nl "Window icons and badges" "Vensterpictogrammen en badges" + diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/paned1.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/paned1.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/paned1.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/paned1.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/paned2.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/paned2.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/paned2.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/paned2.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/pendulum.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/pendulum.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/pendulum.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/pendulum.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/plot.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/plot.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/plot.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/plot.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/print.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/print.tcl new file mode 100644 index 00000000..e8f7fb12 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/print.tcl @@ -0,0 +1,91 @@ +# print.tcl -- +# +# This demonstration script showcases the tk print commands. +# + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +set w .print +destroy $w +toplevel $w +wm title $w "Printing Demonstration" +positionWindow $w + +pack [label $w.l -text "This demonstration showcases +the tk print command. Clicking the buttons below +prints the data from the canvas and text widgets +using platform-native dialogs."] -side top + +## See Code / Dismiss buttons +pack [addSeeDismiss $w.buttons $w] -side bottom -fill x + +frame $w.m + +image create photo logo -data { +R0lGODlhMABLAPUAAP//////zP//mf//AP/MzP/Mmf/MAP+Zmf+ZZv+ZAMz//8zM/8zMzMyZzMyZ +mcyZZsyZAMxmZsxmM8xmAMwzM8wzAJnMzJmZzJmZmZlmmZlmZplmM5kzZpkzM5kzAGaZzGZmzGZm +mWYzZmYzMzNmzDNmmTMzmTMzZgAzmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH+BSAtZGwtACH5BAEKAAIALAAAAAAw +AEsAAAb+QIFwSCwahY9HRMI8Op/JJVNSqVqv2OvjyRU8slbIJGwYg60S5ZR6jRi/4ITBOhkYIOd8 +dltEnAdmFQMJeoVXCEd/VnKGjRVOZ3NVgHlsjpBxVRCEYBIEAAARl4lgZmVgEQAKFx8Mo0ZnpqgA +Fyi2JqKGmGebWRIAILbCIo27cYFWASTCtievRXqSVwQfzLYeeYESxlnSVRIW1igjWHJmjBXbpKXe +FQTizlh1eJNVHbYf0LGc39XW2PIoVZE0whasWPSqFBBHrkKEA3QG0DFTEMXBUsjCWesg4oMFAGwg +tKsiwqA+jGiCiRPGAM6pLCVLGKHQ6EGJlc0IuDxzAgX+CCOW9DjAaUsEyAoT+GHpeSRoHgxEUWgA +UEUpFhMWgTbKEPUBAU15TBZxekYD0RMEqCDLIpYIWTAcmGEd9rWQBxQyjeQqdK/ZTWEO3mK5l+9N +o75SrcHhm9WwnlzNoA5zdM+JHz0HCPQdUauZowoFnSw+c2CBvw6dUXT4LMKE6EIHUqMexgCiIREk +nOwl7Q+FhNQoLuzOc6Kw3kIIVOLqjYKBYCwinmgo9CBEswfMAziK7mRDoQhcUZxwoBKFibq3n3jX +I0GyCPLC0DrS8GR1oaEoRBRYVhT99/qG4DcCA/yNU4Ajbjhhnx4P2DJggR3YZog6RyyYxwM9PSgM +BaP+sQdgIRL0JAKBwnTooRMAFWLdiPyJ8JwvTnyQoh5midCASh149ZkTIFAmHnzOZOBfIU6U4Mhd +4zF34DNEoDAhARGY50BvJkioyxFOGkKAShGkFsJwejiR5Xf8aZAaBp89coQJjuDXAQOApekEm45A +NaAtIbyYxREf0OlICCK841uaahZBQjyfjXCACYjuaASjhFagRKSFNtloHg+hYWIxRohnBQWCSSAh +BVZ+hkgRnlbxwJIVgIqGlaU6wkeTxHxjm6gVLImrFbHWVEQ1taZjWxJX7KqqnqgUEUxDwtqajrOa +RkqhEDcxWwECbEjxTYe9gojqOJQ6JO231ob72bSqAjh4RgfsjiDCCfDCK8K8I9TL7r33nvGtCO7C +O1dUAONk3LcBFxzwwEMwZ/DC4iAsRIE+CWNCbzeV8FfEtoDwVwnlacxMkcKQYIE/F5TQ2QcedUZC +agyc3NsFGrXVZMipWVBCzKv4Q0JvCviDsjAwf4ylxBeX0KcwGs81ccgqGS3MBxc3RjDDVAvdBRcf +eFy1MFd3bcQHJEQdlddkP5E1Cf9yXfbaV2d9RBAAOw== +} + +# Create a copy of the image just created, magnified according to the +# display's DPI scaling level. Since the zooom factor must be an integer, +# the copy will only be effectively magnified if $tk::scalingPct >= 200. +image create photo logo2 +logo2 copy logo -zoom [expr {$tk::scalingPct / 100}] + +set c [canvas $w.m.c -bg white] +pack $c -fill both -expand yes -fill both -side left + +# For scaling-awareness specify the coordinates of the canvas items in points +# rather than pixels. Create the items with a left and top padding of 15 pt. +$c create rectangle 15p 15p 165p 60p -fill blue -outline black ;# 150p x 45p +$c create oval 15p 75p 165p 120p -fill green ;# 150p x 45p +set imgId [$c create image 90p 135p -image logo2 -anchor n] + +# Compute the scaled y coordinate of the next canvas item's top edge in pixels +lassign [$c bbox $imgId] x1 y1 x2 y2 ;# x1, y1, x2, y2 are in pixels +incr y2 [expr {round(15 * [tk scaling])}] ;# convert 15 pt to pixels + +$c create text 15p $y2 -anchor nw -font {Helvetica 12} \ + -fill black \ + -text "A short demo of simple canvas elements." + +set txt { +Tcl, or Tool Command Language, is an open-source multi-purpose C library which includes a powerful dynamic scripting language. Together they provide ideal cross-platform development environment for any programming project. It has served for decades as an essential system component in organizations ranging from NASA to Cisco Systems, is a must-know language in the fields of EDA, and powers companies such as FlightAware and F5 Networks. + +Tcl is fit for both the smallest and largest programming tasks, obviating the need to decide whether it is overkill for a given job or whether a system written in Tcl will scale up as needed. Wherever a shell script might be used Tcl is a better choice, and entire web ecosystems and mission-critical control and testing systems have also been written in Tcl. Tcl excels in all these roles due to the minimal syntax of the language, the unique programming paradigm exposed at the script level, and the careful engineering that has gone into the design of the Tcl internals. +} + +set t [text $w.m.t -wrap word] +pack $t -side right -expand yes -fill both +$t insert end $txt + +frame $w.f + +pack [button $w.f.c -text "Print Canvas" -command [list tk print $w.m.c]] \ + -side left -anchor w -padx 3p +pack [button $w.f.t -text "Print Text" -command [list tk print $w.m.t]] \ + -side right -anchor e -padx 3p + +pack $w.f -side bottom -fill x +pack $w.m -expand yes -fill both -side top diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/puzzle.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/puzzle.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/puzzle.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/puzzle.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/radio.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/radio.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/radio.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/radio.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/rmt b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/rmt new file mode 100644 index 00000000..e03d4bae --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/rmt @@ -0,0 +1,210 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" ${1+"$@"} + +# rmt -- +# This script implements a simple remote-control mechanism for +# Tk applications. It allows you to select an application and +# then type commands to that application. + +package require tk + +wm title . "Tk Remote Controller" +wm iconname . "Tk Remote" +wm minsize . 1 1 + +# The global variable below keeps track of the remote application +# that we're sending to. If it's an empty string then we execute +# the commands locally. + +set app "local" + +# The global variable below keeps track of whether we're in the +# middle of executing a command entered via the text. + +set executing 0 + +# The global variable below keeps track of the last command executed, +# so it can be re-executed in response to !! commands. + +set lastCommand "" + +# Create menu bar. Arrange to recreate all the information in the +# applications sub-menu whenever it is cascaded to. + +. configure -menu [menu .menu] +menu .menu.file +menu .menu.file.apps -postcommand fillAppsMenu +.menu add cascade -label "File" -underline 0 -menu .menu.file +.menu.file add cascade -label "Select Application" -underline 0 \ + -menu .menu.file.apps +.menu.file add command -label "Quit" -command "destroy ." -underline 0 + +# Create text window and scrollbar. + +text .t -yscrollcommand ".s set" -setgrid 1 +scrollbar .s -command ".t yview" +grid .t .s -sticky nsew +grid rowconfigure . 0 -weight 1 +grid columnconfigure . 0 -weight 1 + +# Create a binding to forward commands to the target application, +# plus modify many of the built-in bindings so that only information +# in the current command can be deleted (can still set the cursor +# earlier in the text and select and insert; just can't delete). + +bindtags .t {.t Text . all} +bind .t { + .t mark set insert {end - 1c} + .t insert insert \n + invoke + break +} +bind .t { + catch {.t tag remove sel sel.first promptEnd} + if {[.t tag nextrange sel 1.0 end] eq ""} { + if {[.t compare insert < promptEnd]} { + break + } + } +} +bind .t { + catch {.t tag remove sel sel.first promptEnd} + if {[.t tag nextrange sel 1.0 end] eq ""} { + if {[.t compare insert <= promptEnd]} { + break + } + } +} +bind .t { + if {[.t compare insert < promptEnd]} { + break + } +} +bind .t { + if {[.t compare insert < promptEnd]} { + .t mark set insert promptEnd + } +} +bind .t { + if {[.t compare insert < promptEnd]} { + break + } +} +bind .t { + if {[.t compare insert < promptEnd]} { + break + } +} +bind .t { + if {[.t compare insert <= promptEnd]} { + break + } +} +bind .t { + if {[.t compare insert <= promptEnd]} { + break + } +} +### This next bit *isn't* nice - DKF ### +auto_load tk::TextInsert +proc tk::TextInsert {w s} { + if {$s eq ""} { + return + } + catch { + if { + [$w compare sel.first <= insert] && [$w compare sel.last >= insert] + } then { + $w tag remove sel sel.first promptEnd + $w delete sel.first sel.last + } + } + $w insert insert $s + $w see insert +} + +.t configure -font {Courier 12} +.t tag configure bold -font {Courier 12 bold} + +# The procedure below is used to print out a prompt at the +# insertion point (which should be at the beginning of a line +# right now). + +proc prompt {} { + global app + .t insert insert "$app: " + .t mark set promptEnd {insert} + .t mark gravity promptEnd left + .t tag add bold {promptEnd linestart} promptEnd +} + +# The procedure below executes a command (it takes everything on the +# current line after the prompt and either sends it to the remote +# application or executes it locally, depending on "app". + +proc invoke {} { + global app executing lastCommand + set cmd [.t get promptEnd insert] + incr executing 1 + if {[info complete $cmd]} { + if {$cmd eq "!!\n"} { + set cmd $lastCommand + } else { + set lastCommand $cmd + } + if {$app eq "local"} { + set result [catch [list uplevel #0 $cmd] msg] + } else { + set result [catch [list send $app $cmd] msg] + } + if {$result != 0} { + .t insert insert "Error: $msg\n" + } elseif {$msg ne ""} { + .t insert insert $msg\n + } + prompt + .t mark set promptEnd insert + } + incr executing -1 + .t yview -pickplace insert +} + +# The following procedure is invoked to change the application that +# we're talking to. It also updates the prompt for the current +# command, unless we're in the middle of executing a command from +# the text item (in which case a new prompt is about to be output +# so there's no need to change the old one). + +proc newApp appName { + global app executing + set app $appName + if {!$executing} { + .t mark gravity promptEnd right + .t delete "promptEnd linestart" promptEnd + .t insert promptEnd "$appName: " + .t tag add bold "promptEnd linestart" promptEnd + .t mark gravity promptEnd left + } + return +} + +# The procedure below will fill in the applications sub-menu with a list +# of all the applications that currently exist. + +proc fillAppsMenu {} { + set m .menu.file.apps + catch {$m delete 0 last} + foreach i [lsort [winfo interps]] { + $m add command -label $i -command [list newApp $i] + } + $m add command -label local -command {newApp local} +} + +set app [winfo name .] +prompt +focus .t + +# Local Variables: +# mode: tcl +# End: diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/rolodex b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/rolodex similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/rolodex rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/rolodex diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ruler.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ruler.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ruler.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ruler.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/sayings.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/sayings.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/sayings.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/sayings.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/search.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/search.tcl new file mode 100644 index 00000000..a34b2faa --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/search.tcl @@ -0,0 +1,139 @@ +# search.tcl -- +# +# This demonstration script creates a collection of widgets that +# allow you to load a file into a text widget, then perform searches +# on that file. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +# textLoadFile -- +# This procedure below loads a file into a text widget, discarding +# the previous contents of the widget. Tags for the old widget are +# not affected, however. +# +# Arguments: +# w - The window into which to load the file. Must be a +# text widget. +# file - The name of the file to load. Must be readable. + +proc textLoadFile {w file} { + set f [open $file] + $w delete 1.0 end + while {![eof $f]} { + $w insert end [read $f 10000] + } + close $f +} + +# textSearch -- +# Search for all instances of a given string in a text widget and +# apply a given tag to each instance found. +# +# Arguments: +# w - The window in which to search. Must be a text widget. +# string - The string to search for. The search is done using +# exact matching only; no special characters. +# tag - Tag to apply to each instance of a matching string. + +proc textSearch {w string tag} { + $w tag remove search 0.0 end + if {$string == ""} { + return + } + set cur 1.0 + while 1 { + set cur [$w search -count length $string $cur end] + if {$cur == ""} { + break + } + $w tag add $tag $cur "$cur + $length char" + set cur [$w index "$cur + $length char"] + } +} + +# textToggle -- +# This procedure is invoked repeatedly to invoke two commands at +# periodic intervals. It normally reschedules itself after each +# execution but if an error occurs (e.g. because the window was +# deleted) then it doesn't reschedule itself. +# +# Arguments: +# cmd1 - Command to execute when procedure is called. +# sleep1 - Ms to sleep after executing cmd1 before executing cmd2. +# cmd2 - Command to execute in the *next* invocation of this +# procedure. +# sleep2 - Ms to sleep after executing cmd2 before executing cmd1 again. + +proc textToggle {cmd1 sleep1 cmd2 sleep2} { + catch { + eval $cmd1 + after $sleep1 [list textToggle $cmd2 $sleep2 $cmd1 $sleep1] + } +} + +set w .search +catch {destroy $w} +toplevel $w +wm title $w "Text Demonstration - Search and Highlight" +wm iconname $w "search" +positionWindow $w + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.file +label $w.file.label -text "File name:" -width 13 -anchor w +entry $w.file.entry -width 40 -textvariable fileName +button $w.file.button -text "Load File" \ + -command "textLoadFile $w.text \$fileName" +pack $w.file.label $w.file.entry -side left +pack $w.file.button -side left -pady 3p -padx 7.5p +bind $w.file.entry " + textLoadFile $w.text \$fileName + focus $w.string.entry +" +focus $w.file.entry + +frame $w.string +label $w.string.label -text "Search string:" -width 13 -anchor w +entry $w.string.entry -width 40 -textvariable searchString +button $w.string.button -text "Highlight" \ + -command "textSearch $w.text \$searchString search" +pack $w.string.label $w.string.entry -side left +pack $w.string.button -side left -pady 3p -padx 7.5p +bind $w.string.entry "textSearch $w.text \$searchString search" + +text $w.text -yscrollcommand "$w.scroll set" -setgrid 1 +ttk::scrollbar $w.scroll -command "$w.text yview" +pack $w.file $w.string -side top -fill x +pack $w.scroll -side right -fill y +pack $w.text -expand yes -fill both + +# Set up display styles for text highlighting. + +if {[winfo depth $w] > 1} { + textToggle "$w.text tag configure search -background \ + #ce5555 -foreground white" 800 "$w.text tag configure \ + search -background {} -foreground {}" 200 +} else { + textToggle "$w.text tag configure search -background \ + black -foreground white" 800 "$w.text tag configure \ + search -background {} -foreground {}" 200 +} +$w.text insert 1.0 \ +{This window demonstrates how to use the tagging facilities in text +widgets to implement a searching mechanism. First, type a file name +in the top entry, then type or click on "Load File". Then +type a string in the lower entry and type or click on +"Load File". This will cause all of the instances of the string to +be tagged with the tag "search", and it will arrange for the tag's +display attributes to change to make all of the strings blink.} +$w.text mark set insert 0.0 + +set fileName "" +set searchString "" diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/spin.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/spin.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/spin.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/spin.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/square b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/square similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/square rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/square diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/states.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/states.tcl new file mode 100644 index 00000000..e25ee81c --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/states.tcl @@ -0,0 +1,54 @@ +# states.tcl -- +# +# This demonstration script creates a listbox widget that displays +# the names of the 50 states in the United States of America. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +set w .states +catch {destroy $w} +toplevel $w +wm title $w "Listbox Demonstration (50 states)" +wm iconname $w "states" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "A listbox containing the 50 states is displayed below, along with a scrollbar. You can scan the list either using the scrollbar or by scanning. To scan, press button 2 in the widget and drag up or down." +pack $w.msg -side top + +labelframe $w.justif -text Justification +foreach c {Left Center Right} { + set lower [string tolower $c] + radiobutton $w.justif.$lower -text $c -variable just \ + -relief flat -value $lower -anchor w \ + -command "$w.frame.list configure -justify \$just" \ + -tristatevalue "multi" + pack $w.justif.$lower -side left -pady 1.5p -fill x +} +pack $w.justif + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.frame -borderwidth .5c +pack $w.frame -side top -expand yes -fill y + +ttk::scrollbar $w.frame.scroll -command "$w.frame.list yview" +listbox $w.frame.list -yscroll "$w.frame.scroll set" -setgrid 1 -height 12 +pack $w.frame.scroll -side right -fill y +pack $w.frame.list -side left -expand 1 -fill both + +$w.frame.list insert 0 Alabama Alaska Arizona Arkansas California \ + Colorado Connecticut Delaware Florida Georgia Hawaii Idaho Illinois \ + Indiana Iowa Kansas Kentucky Louisiana Maine Maryland \ + Massachusetts Michigan Minnesota Mississippi Missouri \ + Montana Nebraska Nevada "New Hampshire" "New Jersey" "New Mexico" \ + "New York" "North Carolina" "North Dakota" \ + Ohio Oklahoma Oregon Pennsylvania "Rhode Island" \ + "South Carolina" "South Dakota" \ + Tennessee Texas Utah Vermont Virginia Washington \ + "West Virginia" Wisconsin Wyoming diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/style.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/style.tcl new file mode 100644 index 00000000..8f6fc623 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/style.tcl @@ -0,0 +1,155 @@ +# style.tcl -- +# +# This demonstration script creates a text widget that illustrates the +# various display styles that may be set for tags. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +set w .style +catch {destroy $w} +toplevel $w +wm title $w "Text Demonstration - Display Styles" +wm iconname $w "style" +positionWindow $w + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +# Only set the font family in one place for simplicity and consistency + +set family Courier + +text $w.text -yscrollcommand "$w.scroll set" -setgrid 1 \ + -width 70 -height 32 -wrap word -font "$family 12" +ttk::scrollbar $w.scroll -command "$w.text yview" +pack $w.scroll -side right -fill y +pack $w.text -expand yes -fill both + +# Set up display styles + +$w.text tag configure bold -font "$family 12 bold italic" +$w.text tag configure big -font "$family 14 bold" +$w.text tag configure verybig -font "Helvetica 24 bold" +$w.text tag configure tiny -font "Times 8 bold" +if {[winfo depth $w] > 1} { + $w.text tag configure color1 -background #a0b7ce + $w.text tag configure color2 -foreground red + $w.text tag configure raised -relief raised -borderwidth 1 + $w.text tag configure sunken -relief sunken -borderwidth 1 +} else { + $w.text tag configure color1 -background black -foreground white + $w.text tag configure color2 -background black -foreground white + $w.text tag configure raised -background white -relief raised \ + -borderwidth 1 + $w.text tag configure sunken -background white -relief sunken \ + -borderwidth 1 +} +$w.text tag configure bgstipple -background black -borderwidth 0 \ + -bgstipple gray12 +$w.text tag configure fgstipple -fgstipple gray50 +$w.text tag configure underline -underline 1 +$w.text tag configure overstrike -overstrike 1 +$w.text tag configure right -justify right +$w.text tag configure center -justify center +$w.text tag configure super -offset 4p -font "$family 10" +$w.text tag configure sub -offset -2p -font "$family 10" +$w.text tag configure margins -lmargin1 12m -lmargin2 6m -rmargin 10m +$w.text tag configure spacing -spacing1 10p -spacing2 2p \ + -lmargin1 12m -lmargin2 6m -rmargin 10m + +$w.text insert end {Text widgets like this one allow you to display information in a +variety of styles. Display styles are controlled using a mechanism +called } +$w.text insert end tags bold +$w.text insert end {. Tags are just textual names that you can apply to one +or more ranges of characters within a text widget. You can configure +tags with various display styles. If you do this, then the tagged +characters will be displayed with the styles you chose. The +available display styles are: +} +$w.text insert end "\n1. Font." big +$w.text insert end " You can choose any system font, " +$w.text insert end large verybig +$w.text insert end " or " +$w.text insert end "small" tiny ".\n" +$w.text insert end "\n2. Color." big +$w.text insert end " You can change either the " +$w.text insert end background color1 +$w.text insert end " or " +$w.text insert end foreground color2 +$w.text insert end "\ncolor, or " +$w.text insert end both {color1 color2} +$w.text insert end ".\n" +$w.text insert end "\n3. Stippling." big +$w.text insert end " You can cause either the " +$w.text insert end background bgstipple +$w.text insert end " or " +$w.text insert end foreground fgstipple +$w.text insert end { +information to be drawn with a stipple fill instead of a solid fill. +} +$w.text insert end "\n4. Underlining." big +$w.text insert end " You can " +$w.text insert end underline underline +$w.text insert end " ranges of text.\n" +$w.text insert end "\n5. Overstrikes." big +$w.text insert end " You can " +$w.text insert end "draw lines through" overstrike +$w.text insert end " ranges of text.\n" +$w.text insert end "\n6. 3-D effects." big +$w.text insert end { You can arrange for the background to be drawn +with a border that makes characters appear either } +$w.text insert end raised raised +$w.text insert end " or " +$w.text insert end sunken sunken +$w.text insert end ".\n" +$w.text insert end "\n7. Justification." big +$w.text insert end " You can arrange for lines to be displayed\n" +$w.text insert end "left-justified,\n" +$w.text insert end "right-justified, or\n" right +$w.text insert end "centered.\n" center +$w.text insert end "\n8. Superscripts and subscripts." big +$w.text insert end " You can control the vertical\n" +$w.text insert end "position of text to generate superscript effects like 10" +$w.text insert end "n" super +$w.text insert end " or\nsubscript effects like X" +$w.text insert end "i" sub +$w.text insert end ".\n" +$w.text insert end "\n9. Margins." big +$w.text insert end " You can control the amount of extra space left" +$w.text insert end " on\neach side of the text:\n" +$w.text insert end "This paragraph is an example of the use of " margins +$w.text insert end "margins. It consists of a single line of text " margins +$w.text insert end "that wraps around on the screen. There are two " margins +$w.text insert end "separate left margin values, one for the first " margins +$w.text insert end "display line associated with the text line, " margins +$w.text insert end "and one for the subsequent display lines, which " margins +$w.text insert end "occur because of wrapping. There is also a " margins +$w.text insert end "separate specification for the right margin, " margins +$w.text insert end "which is used to choose wrap points for lines.\n" margins +$w.text insert end "\n10. Spacing." big +$w.text insert end " You can control the spacing of lines with three\n" +$w.text insert end "separate parameters. \"Spacing1\" tells how much " +$w.text insert end "extra space to leave\nabove a line, \"spacing3\" " +$w.text insert end "tells how much space to leave below a line,\nand " +$w.text insert end "if a text line wraps, \"spacing2\" tells how much " +$w.text insert end "space to leave\nbetween the display lines that " +$w.text insert end "make up the text line.\n" +$w.text insert end "These indented paragraphs illustrate how spacing " spacing +$w.text insert end "can be used. Each paragraph is actually a " spacing +$w.text insert end "single line in the text widget, which is " spacing +$w.text insert end "word-wrapped by the widget.\n" spacing +$w.text insert end "Spacing1 is set to 10 points for this text, " spacing +$w.text insert end "which results in relatively large gaps between " spacing +$w.text insert end "the paragraphs. Spacing2 is set to 2 points, " spacing +$w.text insert end "which results in just a bit of extra space " spacing +$w.text insert end "within a pararaph. Spacing3 isn't used " spacing +$w.text insert end "in this example.\n" spacing +$w.text insert end "To see where the space is, select ranges of " spacing +$w.text insert end "text within these paragraphs. The selection " spacing +$w.text insert end "highlight will cover the extra space." spacing diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/systray.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/systray.tcl new file mode 100644 index 00000000..3406f0c1 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/systray.tcl @@ -0,0 +1,89 @@ +# systray.tcl -- +# +# This demonstration script showcases the tk systray and tk sysnotify commands. +# + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +set w .systray +destroy $w +toplevel $w +wm title $w "System Tray Demonstration" +positionWindow $w + +## See Code / Dismiss buttons +pack [addSeeDismiss $w.buttons $w] -side bottom -fill x + +catch {tk systray destroy} +set trayIconExists false + +set iconmenu .menubar +destroy $iconmenu +menu $iconmenu +$iconmenu add command -label "Status" -command { puts "status icon clicked" } +$iconmenu add command -label "Exit" -command exit + +pack [label $w.l -text "This demonstration showcases + the tk systray and tk sysnotify commands. + Running this demo creates the systray icon. + Clicking the buttons below modifies and destroys the icon + and displays the notification."] + +image create photo book -data R0lGODlhDwAPAKIAAP//////AP8AAMDAwICAgAAAAAAAAAAAACwAAAAADwAPAAADSQhA2u5ksPeKABKSCaya29d4WKgERFF0l1IMQCAKatvBJ0OTdzzXI1xMB3TBZAvATtB6NSLKleXi3OBoLqrVgc0yv+DVSEUuFxIAOw== + +labelframe $w.f -text "Tray Icon" +button $w.f.b0 -text "Create" -command create +button $w.f.b1 -text "Modify" -command modify +button $w.f.b2 -text "Destroy" -command remove +pack $w.f.b0 $w.f.b1 $w.f.b2 -padx 3p -pady 3p -side left -expand true -fill x + +button $w.b3 -text "Display Notification" -command notify +pack $w.f $w.b3 -fill x -padx 3p -pady 3p + +proc create {} { + global trayIconExists + if {$trayIconExists} { + tk_messageBox -message "Systray icon already exists" + return + } + tk systray create -image book -text "Systray sample" \ + -button1 {puts "foo"} \ + -button3 {tk_popup $iconmenu [winfo pointerx .] [winfo pointery .]} + set trayIconExists true +} + +proc modify {} { + global trayIconExists + if {!$trayIconExists} { + tk_messageBox -message "Please create systray icon first" + return + } + image create photo page -data R0lGODlhCwAPAKIAAP//////AMDAwICAgAAA/wAAAAAAAAAAACwAAAAACwAPAAADMzi6CzAugiAgDGE68aB0RXgRJBFVX0SNpQlUWfahQOvSsgrX7eZJMlQMWBEYj8iQchlKAAA7 + tk systray configure -image page + tk systray configure -text "Modified text" + tk systray configure -button1 {puts "this is a different output"} + tk systray configure -button3 {puts "hello yall"} +} + +proc notify {} { + global trayIconExists + if {!$trayIconExists} { + tk_messageBox -message "Please create systray icon first" + return + } + tk sysnotify "Alert" "This is an alert" +} + +proc remove {} { + global trayIconExists + if {!$trayIconExists} { + tk_messageBox -message "Systray icon was already destroyed" + return + } + tk systray destroy + set trayIconExists false +} + +create diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/tclIndex b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/tclIndex similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/tclIndex rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/tclIndex diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/tcolor b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/tcolor similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/tcolor rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/tcolor diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/text.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/text.tcl new file mode 100644 index 00000000..189cb2d8 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/text.tcl @@ -0,0 +1,113 @@ +# text.tcl -- +# +# This demonstration script creates a text widget that describes +# the basic editing functions. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +set w .text +catch {destroy $w} +toplevel $w +wm title $w "Text Demonstration - Basic Facilities" +wm iconname $w "text" +positionWindow $w + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w {} \ + {ttk::button $w.buttons.fontchooser -command fontchooserToggle}] +pack $btns -side bottom -fill x + +text $w.text -yscrollcommand [list $w.scroll set] -setgrid 1 \ + -height 30 -undo 1 -autosep 1 +ttk::scrollbar $w.scroll -command [list $w.text yview] +pack $w.scroll -side right -fill y +pack $w.text -expand yes -fill both + +# TIP 324 Demo: [tk fontchooser] +proc fontchooserToggle {} { + tk fontchooser [expr {[tk fontchooser configure -visible] ? + "hide" : "show"}] +} +proc fontchooserVisibility {w} { + $w configure -text [expr {[tk fontchooser configure -visible] ? + "Hide Font Dialog" : "Show Font Dialog"}] +} +proc fontchooserFocus {w} { + tk fontchooser configure -font [$w cget -font] \ + -command [list fontchooserFontSel $w] +} +proc fontchooserFontSel {w font args} { + $w configure -font [font actual $font] +} +tk fontchooser configure -parent $w +bind $w.text [list fontchooserFocus $w.text] +fontchooserVisibility $w.buttons.fontchooser +bind $w <> [list \ + fontchooserVisibility $w.buttons.fontchooser] +focus $w.text + +$w.text insert 0.0 \ +{This window is a text widget. It displays one or more lines of text +and allows you to edit the text. Here is a summary of the things you +can do to a text widget: + +1. Scrolling. Use the scrollbar to adjust the view in the text window. + +2. Scanning. Press the middle mouse button in the text window and drag up +or down. This will drag the text at high speed to allow you to scan its +contents. + +3. Insert text. Press mouse button 1 to set the insertion cursor, then +type text. What you type will be added to the widget. + +4. Select. Press mouse button 1 and drag to select a range of characters. +Once you've released the button, you can adjust the selection by pressing +button 1 with the shift key down. This will reset the end of the +selection nearest the mouse cursor and you can drag that end of the +selection by dragging the mouse before releasing the mouse button. +You can double-click to select whole words or triple-click to select +whole lines. + +5. Delete and replace. To delete text, select the characters you'd like +to delete and type Backspace or Delete. Alternatively, you can type new +text, in which case it will replace the selected text. + +6. Copy the selection. To copy the selection into this window, select +what you want to copy (either here or in another application), then +click the middle mouse button to copy the selection to the point of the +mouse cursor. + +7. Edit. Text widgets support the standard Motif editing characters +plus many Emacs editing characters. Backspace and Control-h erase the +character to the left of the insertion cursor. Delete and Control-d +erase the character to the right of the insertion cursor. Meta-backspace +deletes the word to the left of the insertion cursor, and Meta-d deletes +the word to the right of the insertion cursor. Control-k deletes from +the insertion cursor to the end of the line, or it deletes the newline +character if that is the only thing left on the line. Control-o opens +a new line by inserting a newline character to the right of the insertion +cursor. Control-t transposes the two characters on either side of the +insertion cursor. Control-z undoes the last editing action performed, +and } + +switch [tk windowingsystem] { + "aqua" - "x11" { + $w.text insert end "Control-Shift-z" + } + "win32" { + $w.text insert end "Control-y" + } +} + +$w.text insert end { redoes undone edits. + +7. Resize the window. This widget has been configured with the "setGrid" +option on, so that if you resize the window it will always resize to an +even number of characters high and wide. Also, if you make the window +narrow you can see that long lines automatically wrap around onto +additional lines so that all the information is always visible.} +$w.text mark set insert 0.0 diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/textpeer.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/textpeer.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/textpeer.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/textpeer.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/timer b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/timer similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/timer rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/timer diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/toolbar.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/toolbar.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/toolbar.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/toolbar.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/tree.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/tree.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/tree.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/tree.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ttkbut.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttkbut.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ttkbut.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttkbut.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ttkmenu.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttkmenu.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ttkmenu.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttkmenu.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ttknote.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttknote.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ttknote.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttknote.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttkpane.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttkpane.tcl new file mode 100644 index 00000000..87c7b6dc --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttkpane.tcl @@ -0,0 +1,112 @@ +# ttkpane.tcl -- +# +# This demonstration script creates a Ttk pane with some content. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +set w .ttkpane +catch {destroy $w} +toplevel $w +wm title $w "Themed Nested Panes" +wm iconname $w "ttkpane" +positionWindow $w + +ttk::label $w.msg -font $font -wraplength 4i -justify left -text "This demonstration shows off a nested set of themed paned windows. Their sizes can be changed by grabbing the area between each contained pane and dragging the divider." +pack $w.msg [ttk::separator $w.msgSep] -side top -fill x + +## See Code / Dismiss +pack [addSeeDismiss $w.seeDismiss $w] -side bottom -fill x + +ttk::frame $w.f +pack $w.f -fill both -expand 1 +set w $w.f +ttk::panedwindow $w.outer -orient horizontal +$w.outer add [ttk::panedwindow $w.outer.inLeft -orient vertical] +$w.outer add [ttk::panedwindow $w.outer.inRight -orient vertical] +$w.outer.inLeft add [ttk::labelframe $w.outer.inLeft.top -text Button] +$w.outer.inLeft add [ttk::labelframe $w.outer.inLeft.bot -text Clocks] +$w.outer.inRight add [ttk::labelframe $w.outer.inRight.top -text Progress] +$w.outer.inRight add [ttk::labelframe $w.outer.inRight.bot -text Text] +if {[tk windowingsystem] eq "aqua"} { + foreach i [list inLeft.top inLeft.bot inRight.top inRight.bot] { + $w.outer.$i configure -padding 3 + } +} + +# Fill the button pane +ttk::button $w.outer.inLeft.top.b -text "Press Me" -command { + tk_messageBox -type ok -icon info -message "Ouch!" -detail "That hurt..." \ + -parent .ttkpane -title "Button Pressed" +} +pack $w.outer.inLeft.top.b -padx 1.5p -pady 3p + +# Fill the clocks pane +set i 0 +proc every {delay script} { + uplevel #0 $script + after $delay [list every $delay $script] +} +set testzones { + :Europe/Berlin + :America/Argentina/Buenos_Aires + :Africa/Johannesburg + :Europe/London + :America/Los_Angeles + :Europe/Moscow + :America/New_York + :Asia/Singapore + :Australia/Sydney + :Asia/Tokyo +} +# Force a pre-load of all the timezones needed; otherwise can end up +# poor-looking synch problems! +set zones {} +foreach zone $testzones { + if {![catch {clock format 0 -timezone $zone}]} { + lappend zones $zone + } +} +if {[llength $zones] < 2} { lappend zones -0200 :GMT :UTC +0200 } +foreach zone $zones { + set city [string map {_ " "} [regexp -inline {[^/]+$} $zone]] + if {$i} { + pack [ttk::separator $w.outer.inLeft.bot.s$i] -fill x + } + ttk::label $w.outer.inLeft.bot.l$i -text $city -anchor w + ttk::label $w.outer.inLeft.bot.t$i -textvariable time($zone) -anchor w + pack $w.outer.inLeft.bot.l$i $w.outer.inLeft.bot.t$i -fill x + every 1000 "set time($zone) \[clock format \[clock seconds\] -timezone $zone -format %T\]" + incr i +} + +# Fill the progress pane +ttk::progressbar $w.outer.inRight.top.progress -mode indeterminate +pack $w.outer.inRight.top.progress -fill both -expand 1 +$w.outer.inRight.top.progress start + +# Fill the text pane +if {[tk windowingsystem] ne "aqua"} { + # The trick with the ttk::frame makes the text widget look like it fits with + # the current Ttk theme despite not being a themed widget itself. It is done + # by styling the frame like an entry, turning off the border in the text + # widget, and putting the text widget in the frame with enough space to allow + # the surrounding border to show through (2 pixels seems to be enough). + ttk::frame $w.outer.inRight.bot.f -style TEntry + text $w.txt -wrap word -yscroll "$w.sb set" -width 30 -borderwidth 0 + pack $w.txt -fill both -expand 1 -in $w.outer.inRight.bot.f -pady 1.5p -padx 1.5p + ttk::scrollbar $w.sb -orient vertical -command "$w.txt yview" + pack $w.sb -side right -fill y -in $w.outer.inRight.bot + pack $w.outer.inRight.bot.f -fill both -expand 1 + pack $w.outer -fill both -expand 1 +} else { + text $w.txt -wrap word -yscroll "$w.sb set" -width 30 -borderwidth 0 + ttk::scrollbar $w.sb -orient vertical -command "$w.txt yview" + pack $w.sb -side right -fill y -in $w.outer.inRight.bot + pack $w.txt -fill both -expand 1 -in $w.outer.inRight.bot + pack $w.outer -fill both -expand 1 -padx 10 -pady {6 10} +} + diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ttkprogress.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttkprogress.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ttkprogress.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttkprogress.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ttkscale.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttkscale.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ttkscale.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttkscale.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ttkspin.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttkspin.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/ttkspin.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/ttkspin.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/twind.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/twind.tcl new file mode 100644 index 00000000..e84f694f --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/twind.tcl @@ -0,0 +1,358 @@ +# twind.tcl -- +# +# This demonstration script creates a text widget with a bunch of +# embedded windows. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require tk + +# Make an Aqua button's fill color match its parent's background +proc blend {bt} { + if {[tk windowingsystem] eq "aqua"} { + $bt configure -highlightbackground [[winfo parent $bt] cget -background] + } + return $bt +} + +set w .twind +catch {destroy $w} +toplevel $w +wm title $w "Text Demonstration - Embedded Windows and Other Features" +wm iconname $w "Embedded Windows" +positionWindow $w + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.f -highlightthickness 1 -borderwidth 1 -relief sunken +set t $w.f.text +text $t -yscrollcommand "$w.scroll set" -font $font -width 70 \ + -height 35 -wrap word -highlightthickness 0 -borderwidth 0 +pack $t -expand yes -fill both +ttk::scrollbar $w.scroll -command "$t yview" +pack $w.scroll -side right -fill y +panedwindow $w.pane +pack $w.pane -expand yes -fill both +$w.pane add $w.f -stretch always +# Import to raise given creation order above +raise $w.f + +$t tag configure center -justify center -spacing1 5m -spacing3 5m +$t tag configure buttons -lmargin1 1c -lmargin2 1c -rmargin 1c \ + -spacing1 3m -spacing2 0 -spacing3 0 + +button $t.on -text "Turn On" -command "textWindOn $w" \ + -cursor top_left_arrow +button $t.off -text "Turn Off" -command "textWindOff $w" \ + -cursor top_left_arrow + +$t insert end "A text widget can contain many different kinds of items, " +$t insert end "both active and passive. It can lay these out in various " +$t insert end "ways, with wrapping, tabs, centering, etc. In addition, " +$t insert end "when the contents are too big for the window, smooth " +$t insert end "scrolling in all directions is provided.\n\n" + +$t insert end "A text widget can contain other widgets embedded " +$t insert end "it. These are called \"embedded windows\", " +$t insert end "and they can consist of arbitrary widgets. " +$t insert end "For example, here are two embedded button " +$t insert end "widgets. You can click on the first button to " +$t window create end -window [blend $t.on] +$t insert end " horizontal scrolling, which also turns off " +$t insert end "word wrapping. Or, you can click on the second " +$t insert end "button to\n" +$t window create end -window [blend $t.off] +$t insert end " horizontal scrolling and turn back on word wrapping.\n\n" + +$t insert end "Or, here is another example. If you " +$t window create end -create { + button %W.click -text "Click Here" -command "textWindPlot %W" \ + -cursor top_left_arrow + blend %W.click +} + +$t insert end " a canvas displaying an x-y plot will appear right here." +$t mark set plot insert +$t mark gravity plot left +$t insert end " You can drag the data points around with the mouse, " +$t insert end "or you can click here to " +$t window create end -create { + button %W.delete -text "Delete" -command "textWindDel %W" \ + -cursor top_left_arrow + blend %W.delete +} +$t insert end " the plot again.\n\n" + +$t insert end "You can also create multiple text widgets each of which " +$t insert end "display the same underlying text. Click this button to " +$t window create end \ + -create {button %W.peer -text "Make A Peer" -command "textMakePeer %W" \ + -cursor top_left_arrow + blend %W.peer} -padx 3p +$t insert end " widget. Notice how peer widgets can have different " +$t insert end "font settings, and by default contain all the images " +$t insert end "of the 'parent', but that the embedded windows, " +$t insert end "such as buttons may not appear in the peer. To ensure " +$t insert end "that embedded windows appear in all peers you can set the " +$t insert end "'-create' option to a script or a string containing %W. " +$t insert end "(The plot above and the 'Make A Peer' button are " +$t insert end "designed to show up in all peers.) A good use of " +$t insert end "peers is for " +$t window create end \ + -create {button %W.split -text "Split Windows" -command "textSplitWindow %W" \ + -cursor top_left_arrow + blend %W.split} -padx 3p +$t insert end " \n\n" + +$t insert end "Users of previous versions of Tk will also be interested " +$t insert end "to note that now cursor movement is now by visual line by " +$t insert end "default, and that all scrolling of this widget is by pixel.\n\n" + +$t insert end "You may also find it useful to put embedded windows in " +$t insert end "a text without any actual text. In this case the " +$t insert end "text widget acts like a geometry manager. For " +$t insert end "example, here is a collection of buttons laid out " +$t insert end "neatly into rows by the text widget. These buttons " +$t insert end "can be used to change the background color of the " +$t insert end "text widget (\"Default\" restores the color to " +$t insert end "its default). If you click on the button labeled " +$t insert end "\"Short\", it changes to a longer string so that " +$t insert end "you can see how the text widget automatically " +$t insert end "changes the layout. Click on the button again " +$t insert end "to restore the short string.\n" + +$t insert end "\nNOTE: these buttons will not appear in peers!\n" "peer_warning" +button $t.default -text Default -command "embDefBg $t" \ + -cursor top_left_arrow +$t window create end -window $t.default -padx 3p +global embToggle +set embToggle Short +checkbutton $t.toggle -textvariable embToggle -indicatoron 0 \ + -variable embToggle -onvalue "A much longer string" \ + -offvalue "Short" -cursor top_left_arrow -pady 3p -padx 1.5p +$t window create end -window $t.toggle -padx 3p -pady 1.5p +set i 1 +foreach color {AntiqueWhite3 Bisque1 Bisque2 Bisque3 Bisque4 + SlateBlue3 RoyalBlue1 SteelBlue2 DeepSkyBlue3 LightBlue1 + DarkSlateGray1 Aquamarine2 DarkSeaGreen2 SeaGreen1 + Yellow1 IndianRed1 IndianRed2 Tan1 Tan4} { + button $t.color$i -text $color -cursor top_left_arrow -command \ + "changeBg $t $color" + $t window create end -window [blend $t.color$i] -padx 3p -pady 1.5p + incr i +} +$t tag add buttons [blend $t.default] end + +button $t.bigB -text "Big borders" -command "textWindBigB $t" \ + -cursor top_left_arrow +button $t.smallB -text "Small borders" -command "textWindSmallB $t" \ + -cursor top_left_arrow +button $t.bigH -text "Big highlight" -command "textWindBigH $t" \ + -cursor top_left_arrow +button $t.smallH -text "Small highlight" -command "textWindSmallH $t" \ + -cursor top_left_arrow +button $t.bigP -text "Big pad" -command "textWindBigP $t" \ + -cursor top_left_arrow +button $t.smallP -text "Small pad" -command "textWindSmallP $t" \ + -cursor top_left_arrow + +set text_normal(border) [$t cget -borderwidth] +set text_normal(highlight) [$t cget -highlightthickness] +set text_normal(pad) [$t cget -padx] + +$t insert end "\nYou can also change the usual border width and " +$t insert end "highlightthickness and padding.\n" +$t window create end -window [blend $t.bigB] +$t window create end -window [blend $t.smallB] +$t window create end -window [blend $t.bigH] +$t window create end -window [blend $t.smallH] +$t window create end -window [blend $t.bigP] +$t window create end -window [blend $t.smallP] + +$t insert end "\n\nFinally, images fit comfortably in text widgets too:" + +image create photo img -file [file join $tk_demoDirectory images ouster.png] + +# Create a copy of the image just created, magnified according to the +# display's DPI scaling level. Since the zooom factor must be an integer, +# the copy will only be effectively magnified if $tk::scalingPct >= 200. +image create photo img2 +img2 copy img -zoom [expr {$tk::scalingPct / 100}] + +$t image create end -image img2 + +proc textWindBigB w { + $w configure -borderwidth 12p +} + +proc textWindBigH w { + $w configure -highlightthickness 12p +} + +proc textWindBigP w { + $w configure -padx 12p -pady 12p +} + +proc textWindSmallB w { + $w configure -borderwidth $::text_normal(border) +} + +proc textWindSmallH w { + $w configure -highlightthickness $::text_normal(highlight) +} + +proc textWindSmallP w { + $w configure -padx $::text_normal(pad) -pady $::text_normal(pad) +} + +proc textWindOn w { + catch {destroy $w.scroll2} + set t $w.f.text + ttk::scrollbar $w.scroll2 -orient horizontal -command "$t xview" + pack $w.scroll2 -after $w.buttons -side bottom -fill x + $t configure -xscrollcommand "$w.scroll2 set" -wrap none +} + +proc textWindOff w { + catch {destroy $w.scroll2} + set t $w.f.text + $t configure -xscrollcommand {} -wrap word +} + +proc textWindPlot t { + set c $t.c + if {[winfo exists $c]} { + return + } + + while {[string first [$t get plot] " \t\n"] >= 0} { + $t delete plot + } + $t insert plot "\n" + + $t window create plot -create {createPlot %W} + $t tag add center plot + $t insert plot "\n" +} + +proc createPlot {t} { + set c $t.c + + canvas $c -relief sunken -width 450 -height 300 -cursor top_left_arrow + + set font {Helvetica 18} + + $c create line 100 250 400 250 -width 2 + $c create line 100 250 100 50 -width 2 + $c create text 225 20 -text "A Simple Plot" -font $font -fill brown + + for {set i 0} {$i <= 10} {incr i} { + set x [expr {100 + ($i*30)}] + $c create line $x 250 $x 245 -width 2 + $c create text $x 254 -text [expr {10*$i}] -anchor n -font $font + } + for {set i 0} {$i <= 5} {incr i} { + set y [expr {250 - ($i*40)}] + $c create line 100 $y 105 $y -width 2 + $c create text 96 $y -text [expr {$i*50}].0 -anchor e -font $font + } + + foreach point { + {12 56} {20 94} {33 98} {32 120} {61 180} {75 160} {98 223} + } { + set x [expr {100 + (3*[lindex $point 0])}] + set y [expr {250 - (4*[lindex $point 1])/5}] + set item [$c create oval [expr {$x-6}] [expr {$y-6}] \ + [expr {$x+6}] [expr {$y+6}] -width 1 -outline black \ + -fill SkyBlue2] + $c addtag point withtag $item + } + + $c bind point "$c itemconfig current -fill red" + $c bind point "$c itemconfig current -fill SkyBlue2" + $c bind point "embPlotDown $c %x %y" + $c bind point "$c dtag selected" + bind $c "embPlotMove $c %x %y" + return $c +} + +set embPlot(lastX) 0 +set embPlot(lastY) 0 + +proc embPlotDown {w x y} { + global embPlot + $w dtag selected + $w addtag selected withtag current + $w raise current + set embPlot(lastX) $x + set embPlot(lastY) $y +} + +proc embPlotMove {w x y} { + global embPlot + $w move selected [expr {$x-$embPlot(lastX)}] [expr {$y-$embPlot(lastY)}] + set embPlot(lastX) $x + set embPlot(lastY) $y +} + +proc textWindDel t { + if {[winfo exists $t.c]} { + $t delete $t.c + while {[string first [$t get plot] " \t\n"] >= 0} { + $t delete plot + } + $t insert plot " " + } +} + +proc changeBg {t c} { + $t configure -background $c + if {[tk windowingsystem] eq "aqua"} { + foreach b [$t window names] { + if {[winfo class $b] eq "Button"} { + $b configure -highlightbackground $c + } + } + } +} + +proc embDefBg t { + set bg [lindex [$t configure -background] 3] + changeBg $t $bg +} + +proc textMakePeer {parent} { + set n 1 + while {[winfo exists .peer$n]} { incr n } + set w [toplevel .peer$n] + wm title $w "Text Peer #$n" + frame $w.f -highlightthickness 1 -borderwidth 1 -relief sunken + set t [$parent peer create $w.f.text -yscrollcommand "$w.scroll set" \ + -borderwidth 0 -highlightthickness 0] + $t tag configure peer_warning -font boldFont + pack $t -expand yes -fill both + ttk::scrollbar $w.scroll -command "$t yview" + pack $w.scroll -side right -fill y + pack $w.f -expand yes -fill both +} + +proc textSplitWindow {textW} { + if {$textW eq ".twind.f.text"} { + if {[winfo exists .twind.peer]} { + destroy .twind.peer + } else { + set parent [winfo parent $textW] + set w [winfo parent $parent] + set t [$textW peer create $w.peer \ + -yscrollcommand "$w.scroll set"] + $t tag configure peer_warning -font boldFont + $w.pane add $t -stretch always + } + } else { + return + } +} diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/unicodeout.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/unicodeout.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/unicodeout.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/unicodeout.tcl diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/vscale.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/vscale.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/demos/vscale.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/vscale.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/widget b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/widget new file mode 100644 index 00000000..b3a1c618 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/widget @@ -0,0 +1,713 @@ +#!/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 tk 9.0 +package require msgcat + +destroy {*}[winfo children .] +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"] +} + +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 + } +} + +set widgetDemo 1 +set font mainFont + +# The SVG images used below are based on some icons provided by the +# official open source SVG icon library for the Bootstrap project, +# licensed under the MIT license (https://opensource.org/licenses/MIT). +# +# See https://github.com/twbs/icons. + +set viewData { + + + + +} + +set refreshData { + + + + +} + +set printData { + + + + + +} + +proc images {arg} { + set fgColor [ttk::style lookup . -foreground {} black] + lassign [winfo rgb . $fgColor] r g b + set fgColor [format "#%02x%02x%02x" \ + [expr {$r >> 8}] [expr {$g >> 8}] [expr {$b >> 8}]] + + foreach action {view refresh print} { + upvar ${action}Data imgData + for {set data $imgData; set startIdx 0} \ + {[set idx1 [string first "#000000" $data $startIdx]] >= 0} \ + {set startIdx [expr {$idx1 + 7}]} { + set idx2 [expr {$idx1 + 6}] + set data [string replace $data $idx1 $idx2 $fgColor] + } + + switch $arg { + create { + image create photo ::img::$action -format $::tk::svgFmt \ + -data $data + } + configure { ::img::$action configure -data $data } + } + } +} + +images create +set mainClass [winfo class .] +foreach event {<> <> <>} { + bind $mainClass $event { images configure } +} +unset mainClass event + +image create photo ::img::delete -format $::tk::svgFmt -data { + + + + +} + +#---------------------------------------------------------------- +# The code below creates 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 + +# On Aqua, just use the default menu. +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 ""] + bind . {tkAboutDialog} + .menuBar.file add sep + if {[tk windowingsystem] eq "win32"} { + # 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} + } + . configure -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 1.5p -expand yes -fill both +if {[tk windowingsystem] ne "aqua"} { + ttk::sizegrip .statusBar.foo + pack .statusBar.foo -side left -padx 1.5p +} +pack .statusBar -side bottom -fill x -pady 1.5p + +set textheight 30 +catch { + set textheight [expr { + ([winfo screenheight .] * 0.7) / + [font metrics mainFont -displayof . -linespace] + }] +} + +ttk::frame .textFrame +ttk::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 3p -pady 1.5p -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 +} + +# 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 +} + +# 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 + +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 + if {[tk windowingsystem] eq "aqua"} { + .t tag configure demo -foreground systemLinkColor + .t tag configure visited -foreground purple + } + .t tag configure hot -foreground red -underline 1 +} + +# The tag "new" must be the one having the highest priority. +# +.t tag configure new -foreground #c00000 -underline 0 -font boldFont + +.t tag bind demo { + invoke [.t index {@%x,%y}] +} +set lastLine "" +.t tag bind demo { + 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 { + .t tag remove hot 1.0 end + .t config -cursor [::ttk::cursor text] + .statusBar.lab config -text "" +} +.t tag bind demo { + 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}] +} + +############################################################################## +# 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 insert end " [mc NEW]" new + 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 + } +} + +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 +} + +if {[tk windowingsystem] eq "aqua"} { + addFormattedText { + @@subtitle Mac-Specific Widgets and Window Styles + @@new + @@demo mac_styles Special widgets for macOS + @@new + @@demo mac_wm Window styles for macOS + @@new + @@demo mac_tabs Tabbed Windows on macOS + } +} + +addFormattedText { + @@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 ttkspin Themed 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 + @@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 + @@new + @@demo systray System tray icon and notification + @@new + @@demo print Printing from canvas and text widgets + + @@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 + @@new + @@demo windowicons Window icons and badges +} + +############################################################################## + +.t configure -state disabled +focus .s + +# 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::frame $w.sep -height 2 -relief sunken + ttk::separator $w.sep + grid $w.sep -columnspan 4 -row 0 -sticky ew -pady 1.5p + 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 3p -pady 3p + 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 +} + +# 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 +} + +# 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 1.5p -pady 1.5p -sticky w + } + ttk::button $b.ok -text [mc "OK"] \ + -command [list destroy $w] -default active + bind $w [list $b.ok invoke] + bind $w [list $b.ok invoke] + + grid $f -sticky news -padx 3p + grid $b.ok -sticky e -padx 3p -pady {4.5p 3p} + 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 -encoding utf-8 [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 -padx 3p -pady 1.5p \ + -tabstyle wordprocessor] + ttk::scrollbar $t.xscroll -command [list $t.text xview] \ + -orient horizontal + ttk::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 1.5p + 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 3p -pady 3p + 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 { + if {[winfo class %W] ne "Text"} { .code.btns.dismiss invoke } + } + bind $top [bind $top ] + } 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]] + fconfigure $id -encoding utf-8 -eofchar "\032 {}" + $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} { + tk print $w +} + +# 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 © %s" {1996-1997 Sun Microsystems, Inc.}] +[mc "Copyright © %s" {1997-2000 Ajuba Solutions, Inc.}] +[mc "Copyright © %s" {2001-2009 Donal K. Fellows}] +[mc "Copyright © %s" {2002-2007 Daniel A. Steffen}] +[mc "Copyright © %s" {2021 Kevin Walzer}]" +} + +# Local Variables: +# mode: tcl +# End: diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/windowicons.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/windowicons.tcl new file mode 100644 index 00000000..13c514d8 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/demos/windowicons.tcl @@ -0,0 +1,108 @@ +# windowicons.tcl -- +# +# This demonstration script showcases the wm iconphoto and wm iconbadge commands. +# + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +set w .windowicons +destroy $w +toplevel $w +wm title $w "Window Icon Demonstration" +positionWindow $w + +## See Code / Dismiss buttons +pack [addSeeDismiss $w.buttons $w] -side bottom -fill x + +image create photo icon -data { + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGP + C/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3Cc + ulE8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAArQNAAK0DQEdFIm+AAAJ + QElEQVRYw+WXW2xdV5nHf/ty7lcf2/FxYsdOnMSNC0HTpDiRKJWAQjWCEQNU + SEAFfUOiQqrEC2+IxwpemDLSzNBBCCQeQEKqRJgBSikiuGlN22TqhsR27OPL + 8eWc43Pdt7X22osHHydOm4FBPM6Slr69paX9/32Xtb614f/7MP6vC3O5f8L3 + G7HJyZPHBwfz5wrF7HQ6nRwxLTOhQuU4PW+z3eq9Xa+33rq9cms7k8pHjvfS + 3w8wOfk52u1u8oHpiUff897JJ8+dO/nI6LHho6OjQ3ahkMYwTTZ2O2zXutS3 + G/7ayubq7Vtr/7Ve2f7RytLam4ViXq1t/vRvB0ilPsjzz3+LZ5/9j7MzM5Nf + /8hj5//5H97/YNbK5hkfTFLMxAEQQvD766v0yBGIEBEEuPUGi9dv7lx77cb3 + Vm9vfqc0WNi9evUKWr/xLh3rfuLj45+l0bjM7m768U98/OJ/fulLH/3wiemx + eCafxRcKw7TJxKC+12RpbYdAx7HsOCrSRNpg+sQQj1w8nS0N5h8JAvm+rWr9 + 9ZmZB2qWdZq9vWt/GWBm5im+9rUn6HRGPv7EE4/++2P/eOFkV0FkJTDQgCaX + TbO1tcV2R2EmCxBJQixs2+R9EwV00MFAceJE2ZiZOT7VaTsPLyxU5orFTK1c + fphq9bX7A8zOfoV8Ps3c3NsXPvWpD37vc5//0ETNt8gNjDAzlsdAE0vliTCR + xEhnC2CaRIZNMmZiaonv9mh1PcrDJQZzCfK5OGNjQ8e2tvZO37y5+ctk0naq + 1fn7A4yOnmd5uVp4/PGHn/vylz8xe+zoEIP5JAMpA0OHeK6DG4TEk2li8Tha + QxRpIg0q6DGUNjg6UuLYSInhYoYoigiCgHQ6TrGYnlpd3Q1ffvk3L128+ITe + 2Hj1XoBLl55menqcbDb1haeeevyrDz102tJaE7ctLBMqG1X23Ag7kcKOJzAA + DSilCVWEZdmMDaXJJCxSiRimaaK1RkqJ7/uUSlk6Hed0oxG9HI9bm+Pjs2xs + vIp5AKC15oUX/lA8f/7MF2dnz8YADMNASslypYqrUxSHyqSy+f31hzaRZRpM + DKVYr+7y4usVri1WWavWCWSIZZkYhoFSIRcuTI1MTAw9OTf33Tu7zz54SCRi + nD17/Pzs7AMPFQqZPlTE8vo2DlmGhgbo12BffD/8SmukitiuNxHKoDwyzPJG + nTdXmtiWwdnRNCN5GxWGDA/nOH26/NGpqSfHgPU7AJcuPc0nP/kBrl698YGZ + mYmMEIJmx6Hn+my0DUZGC6gIzEOnhu4Lh2GEbRocGyxRSO/7c3QgiRuEVOtd + EvEQrSN8IVEq5MSJ4YlSKX3OMKJ14G4KnnnmM9bkZPk92VyKy3M3eentJjd3 + FUYyjxuEeELt7/NoP+eBVAipCFXEsYE4xcydYFIeSHKynOXhUwM0mh32egH1 + tsdL16oo007kcskHs7kYly49fRcALqby+fQopklkZ4jHY3g6gQgjHF/QcgQd + V+7DHJoGmnzSQuvD0QGlIsJQkU4luLXR4kgxxcRgjM1mQCyZHrv0sUe4JwKF + XMmu7/VSXV9xaXqI0YzC8328QOJ4gq4raHQDGt2AtitwfIEbSAwibOvdJ7pS + CiElR3IxGh2X5Y0GV66v0wnAsq3MN5759L1FqKMoCkQoX19u0QkkD47lKSYi + Th1NoSLYafu0ehrTNNBaE2mNUop2z+DEUJKBbPxecSEIgoAoUjwwmmZpdZPl + muL4oIFWkbx8rXIvQMfZ9p2e1xBCstOJcFe6nB1NcWokhW1ZHMkazK90qXXD + fZFII0NFIBW/XQiZHraoNbsU81mmjhbxfZ8gCAiCgELKQitJGCoIQ6SQO//2 + ze/fm4Kf/Px50dzr3Aoch1Ap2o4kn8tgW/sHynAxzcVTBQYzFp4v6boBjidw + fcFCpcmPf7/Oz+ZrvPBalb12D9/370DUGk1evr6NacWIfD/yveDmXq3F3Nxz + dwH+5dkfUq8155rb9dA2QcqQcjFx57DRGgaySR47d4RHZ0pYeh/C9QSOJ3EE + CGWw3fJZ323j+x6e5xH4Pgu3d6g0FMWUjdvu7bo9/5oK1d0IzM09hwhCGrvN + ubXFylI2pum4AZXtDqEURFGE1hoNxGMW5ZyB22nS8wQ9r1+QvsDzBc1uQGW7 + jee6eN4+RMfxMdHkYgatWmtur9ZaOnD8TgQMA27c+uH68s3KT8O9BoYBv3pj + kxuVGo7Tw+1/MAh83lreYm1P9r3fT4XjSVxf4voC1/NwHAfXdXFcB891KGVj + hO2e16q3fzR2cjQwDPPeZrSx8SqXL2/RqDU2EnH7I8dPjQ8v7Tqs1RwmSzEs + QoQQSBHw1lKVha0AEUb4IiQQIb4I8YUkkCHTQwa5WIjne9xY2mT+VouRfI7N + xfVfrK8sfTuRSAavXP3Xd7fjavWPRq1+3TeiQTVcGnh0oHwktlZzmBq0SNsR + QgiuXLvNL/+nQU/aBFL1xSW+kAghEb5PEkE5q3Bdl7dv72LGCrTXdzf+9Nb8 + N5dXfrG6Wf1jeNDP3nkjigOFWm2xpvx0+tjI8LnMYMnMxQT5eIjruVye36LS + TRAqRSD3vZdCIqUgEj5R4CEDj2O5kMZei3rHoLXV6Sy88cp3Fhf/ew6IAAGE + 9wOIARmtw9Tu7vKa1yY+Wiqeee+ZYdsi4HdvrjK/HiKUiZQhoZREQhDJAC18 + tPSIhEfouwSuQ9cx2VxpNK/PX/n+4uKvXwQdAAHgA/J+AAaQABJRJOydnVsr + zZ1O13eMcSuezC61LJzQRgY+KvCJhI+WPpH0IAywIkEhaVIupAhdHS0t3F66 + Nv/iD9bW/nAFtAM4QA9wAXX3RnEvQBoYODSL+fzEmalTsx+emjl3YWjsaMlM + pcwg0ggZEimFoSNsI8JSCtF1wtpmdWt1aeGVSuW133leYwNoA01gr297BzVw + v/8CA0gBBaDYtzkw87ns6PhI+czM0JHjp/PFUjmZSmUM07RCKUPP6XVae/Vq + fbdys1ZbvOX5ja2+ULcP0Opbt18H/G8Ah+shDWQPzVQ/RSnLTGRsO5U0TMuM + VKjC0PUjLd1+fgPAOxTybl9YcvdC9VcBDobV3x0JINm3MfYbmdX/hu57FfZF + Dgot6Fe8eqfw3wLwzvVmX9jsvx8AHEAcnn91/BlySEFKTpuCtgAAABN0RVh0 + QXV0aG9yAHdhcnN6YXdpYW5rYQy+S5cAAABYdEVYdENvcHlyaWdodABDQzAg + UHVibGljIERvbWFpbiBEZWRpY2F0aW9uIGh0dHA6Ly9jcmVhdGl2ZWNvbW1v + bnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC/G4735AAAAIXRFWHRDcmVh + dGlvbiBUaW1lADIwMTAtMDMtMjlUMDg6MDg6MzD47LxwAAAAJXRFWHRkYXRl + OmNyZWF0ZQAyMDIxLTA4LTE1VDIwOjU0OjM5LTA0OjAwNBT3DQAAACV0RVh0 + ZGF0ZTptb2RpZnkAMjAyMS0wOC0xNVQyMDo1NDoxMS0wNDowMDSDBqsAAADI + elRYdERlc2NyaXB0aW9uAAAY042OwQqCQBCGn6B3GOy+Cl0qTAjEc1HRJVhW + HXUrd2pmLXr7tDrVpcMP838w/F+wxxxyprsgB2ALclAxtRAbaBirRdB4f5mH + oTeuJlUxYoly8nRRxHW4HahO30SvmI5Y+CCBF4dPhzg0CYwOLs45GdKfG+sK + hBuy2H4xUlM1i76+BhcBwwirLj/bAlJqjXXzP9UyxmuHzp8feiknLPW6Q/H9 + moy3yK1oqvROUE2yH99suX45PwEyf2MTOoCNrQAAABl0RVh0U29mdHdhcmUA + d3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABWdEVYdFNvdXJjZQBodHRwczovL29w + ZW5jbGlwYXJ0Lm9yZy9kZXRhaWwvMzUyMzMvdGFuZ28taW5ldHJuZXQtd2Vi + LWJyb3dzZXItYnktd2Fyc3phd2lhbmth5nAuRgAAACB0RVh0VGl0bGUAdGF + uZ28gaW5ldHJuZXQgd2ViIGJyb3dzZXLyr62TAAAAAElFTkSuQmCC +} + +set ::tk::icons::base_icon(.) icon + +# Create a copy of the image just created, magnified according to the +# display's DPI scaling level. Since the zooom factor must be an integer, +# the copy will only be effectively magnified if $tk::scalingPct >= 200. +image create photo icon2 +icon2 copy icon -zoom [expr {$tk::scalingPct / 100}] + +pack [button $w.i -text "Set Window Icon to Globe" -image icon2 \ + -compound top -command {wm iconphoto . icon}] -fill x -padx 3p +pack [button $w.b -text "Set Badge to 3" -command {wm iconbadge . 3}] \ + -fill x -padx 3p +pack [button $w.e -text "Set Badge to 11" -command {wm iconbadge . 11}] \ + -fill x -padx 3p +pack [button $w.f -text "Reset Badge" -command {wm iconbadge . ""}] \ + -fill x -padx 3p diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/dialog.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/dialog.tcl new file mode 100644 index 00000000..f5a771a5 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/dialog.tcl @@ -0,0 +1,175 @@ +# dialog.tcl -- +# +# This file defines the procedure tk_dialog, which creates a dialog +# box containing a bitmap, a message, and one or more buttons. +# +# Copyright © 1992-1993 The Regents of the University of California. +# Copyright © 1994-1997 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# +# ::tk_dialog: +# +# This procedure displays a dialog box, waits for a button in the dialog +# to be invoked, then returns the index of the selected button. If the +# dialog somehow gets destroyed, -1 is returned. +# +# Arguments: +# w - Window to use for dialog top-level. +# title - Title to display in dialog's decorative frame. +# text - Message to display in dialog. +# bitmap - Bitmap to display in dialog (empty string means none). +# default - Index of button that is to display the default ring +# (-1 means none). +# args - One or more strings to display in buttons across the +# bottom of the dialog box. + +proc ::tk_dialog {w title text bitmap default args} { + variable ::tk::Priv + + # Check that $default was properly given + if {[string is integer -strict $default]} { + if {$default >= [llength $args]} { + return -code error -errorcode {TK DIALOG BAD_DEFAULT} \ + "default button index greater than number of buttons\ + specified for tk_dialog" + } + } elseif {"" eq $default} { + set default -1 + } else { + set default [lsearch -exact $args $default] + } + + set windowingsystem [tk windowingsystem] + + # 1. Create the top-level window and divide it into top + # and bottom parts. + + destroy $w + toplevel $w -class Dialog + wm title $w $title + wm iconname $w Dialog + wm protocol $w WM_DELETE_WINDOW { } + + # Dialog boxes should be transient with respect to their parent, + # so that they will always stay on top of their parent window. However, + # some window managers will create the window as withdrawn if the parent + # window is withdrawn or iconified. Combined with the grab we put on the + # window, this can hang the entire application. Therefore we only make + # the dialog transient if the parent is viewable. + # + if {[winfo viewable [winfo toplevel [winfo parent $w]]] } { + wm transient $w [winfo toplevel [winfo parent $w]] + } + + if {$windowingsystem eq "aqua"} { + ::tk::unsupported::MacWindowStyle style $w moveableModal {} + } elseif {$windowingsystem eq "x11"} { + wm attributes $w -type dialog + } + + frame $w.bot + frame $w.top + if {$windowingsystem eq "x11"} { + $w.bot configure -relief raised -bd 1 + $w.top configure -relief raised -bd 1 + } + pack $w.bot -side bottom -fill both + pack $w.top -side top -fill both -expand 1 + grid anchor $w.bot center + + # 2. Fill the top part with bitmap and message (use the option + # database for -wraplength and -font so that they can be + # overridden by the caller). + + option add *Dialog.msg.wrapLength 3i widgetDefault + option add *Dialog.msg.font TkCaptionFont widgetDefault + + label $w.msg -justify left -text $text + pack $w.msg -in $w.top -side right -expand 1 -fill both -padx 3m -pady 3m + if {$bitmap ne ""} { + if {$windowingsystem eq "aqua" && $bitmap eq "error"} { + set bitmap "stop" + } + label $w.bitmap -bitmap $bitmap + pack $w.bitmap -in $w.top -side left -padx 3m -pady 3m + } + + # 3. Create a row of buttons at the bottom of the dialog. + + set i 0 + foreach but $args { + button $w.button$i -text $but -command [list set ::tk::Priv(button) $i] + if {$i == $default} { + $w.button$i configure -default active + } else { + $w.button$i configure -default normal + } + grid $w.button$i -in $w.bot -column $i -row 0 -sticky ew \ + -padx 7.5p -pady 3p + grid columnconfigure $w.bot $i + # We boost the size of some Mac buttons for l&f + if {$windowingsystem eq "aqua"} { + set tmp [string tolower $but] + if {$tmp eq "ok" || $tmp eq "cancel"} { + grid columnconfigure $w.bot $i -minsize 90 + } + grid configure $w.button$i -pady 7 + } + incr i + } + + # 4. Create a binding for on the dialog if there is a + # default button. + # Convention also dictates that if the keyboard focus moves among the + # the buttons that the binding affects the button with the focus. + + if {$default >= 0} { + bind $w [list $w.button$default invoke] + } + bind $w <> [list bind $w {[tk_focusPrev %W] invoke}] + bind $w <> [list bind $w {[tk_focusNext %W] invoke}] + + # 5. Create a binding for the window that sets the + # button variable to -1; this is needed in case something happens + # that destroys the window, such as its parent window being destroyed. + + bind $w {set ::tk::Priv(button) -1} + + # 6. Withdraw the window, then update all the geometry information + # so we know how big it wants to be, then center the window in the + # display (Motif style) and de-iconify it. + + ::tk::PlaceWindow $w + tkwait visibility $w + + # 7. Set a grab and claim the focus too. + + if {$default >= 0} { + set focus $w.button$default + } else { + set focus $w + } + tk::SetFocusGrab $w $focus + + # 8. Wait for the user to respond, then restore the focus and + # return the index of the selected button. Restore the focus + # before deleting the window, since otherwise the window manager + # may take the focus away so we can't redirect it. Finally, + # restore any grab that was in effect. + + vwait ::tk::Priv(button) + + catch { + # It's possible that the window has already been destroyed, + # hence this "catch". Delete the Destroy handler so that + # Priv(button) doesn't get reset by it. + + bind $w {} + } + tk::RestoreFocusGrab $w $focus + return $Priv(button) +} diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/entry.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/entry.tcl new file mode 100644 index 00000000..bdd9fdaf --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/entry.tcl @@ -0,0 +1,720 @@ +# entry.tcl -- +# +# This file defines the default bindings for Tk entry widgets and provides +# procedures that help in implementing those bindings. +# +# Copyright © 1992-1994 The Regents of the University of California. +# Copyright © 1994-1997 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +#------------------------------------------------------------------------- +# Elements of tk::Priv that are used in this file: +# +# afterId - If non-null, it means that auto-scanning is underway +# and it gives the "after" id for the next auto-scan +# command to be executed. +# mouseMoved - Non-zero means the mouse has moved a significant +# amount since the button went down (so, for example, +# start dragging out a selection). +# pressX - X-coordinate at which the mouse button was pressed. +# selectMode - The style of selection currently underway: +# char, word, or line. +# x, y - Last known mouse coordinates for scanning +# and auto-scanning. +# data - Used for Cut and Copy +#------------------------------------------------------------------------- + +#------------------------------------------------------------------------- +# The code below creates the default class bindings for entries. +#------------------------------------------------------------------------- +bind Entry <> { + if {![catch {tk::EntryGetSelection %W} tk::Priv(data)]} { + clipboard clear -displayof %W + clipboard append -displayof %W $tk::Priv(data) + %W delete sel.first sel.last + unset tk::Priv(data) + } +} +bind Entry <> { + if {![catch {tk::EntryGetSelection %W} tk::Priv(data)]} { + clipboard clear -displayof %W + clipboard append -displayof %W $tk::Priv(data) + unset tk::Priv(data) + } +} +bind Entry <> { + catch { + if {[tk windowingsystem] ne "x11"} { + catch { + %W delete sel.first sel.last + } + } + %W insert insert [::tk::GetSelection %W CLIPBOARD] + tk::EntrySeeInsert %W + } +} +bind Entry <> { + # ignore if there is no selection + catch {%W delete sel.first sel.last} +} +bind Entry <> { + if {$tk_strictMotif || ![info exists tk::Priv(mouseMoved)] + || !$tk::Priv(mouseMoved)} { + tk::EntryPaste %W %x + } +} + +bind Entry <> { + %W selection range 0 end + %W icursor end +} + +# Standard Motif bindings: + +bind Entry { + tk::EntryButton1 %W %x + %W selection clear +} +bind Entry { + set tk::Priv(x) %x + tk::EntryMouseSelect %W %x +} +bind Entry { + set tk::Priv(selectMode) word + tk::EntryMouseSelect %W %x + catch {%W icursor sel.last} +} +bind Entry { + set tk::Priv(selectMode) line + tk::EntryMouseSelect %W %x + catch {%W icursor sel.last} +} +bind Entry { + set tk::Priv(selectMode) char + %W selection adjust @%x +} +bind Entry { + set tk::Priv(selectMode) word + tk::EntryMouseSelect %W %x +} +bind Entry { + set tk::Priv(selectMode) line + tk::EntryMouseSelect %W %x +} +bind Entry { + set tk::Priv(x) %x + tk::EntryAutoScan %W +} +bind Entry { + tk::CancelRepeat +} +bind Entry { + tk::CancelRepeat +} +bind Entry { + %W icursor @%x +} + +bind Entry <> { + tk::EntrySetCursor %W [tk::EntryPreviousChar %W insert] +} +bind Entry <> { + tk::EntrySetCursor %W [tk::EntryNextChar %W insert] +} +bind Entry <> { + tk::EntryKeySelect %W [tk::EntryPreviousChar %W insert] + tk::EntrySeeInsert %W +} +bind Entry <> { + tk::EntryKeySelect %W [tk::EntryNextChar %W insert] + tk::EntrySeeInsert %W +} +bind Entry <> { + tk::EntrySetCursor %W [tk::EntryPreviousWord %W insert] +} +bind Entry <> { + tk::EntrySetCursor %W [tk::EntryNextWord %W insert] +} +bind Entry <> { + tk::EntryKeySelect %W [tk::EntryPreviousWord %W insert] + tk::EntrySeeInsert %W +} +bind Entry <> { + tk::EntryKeySelect %W [tk::EntrySelectNextWord %W insert] + tk::EntrySeeInsert %W +} +bind Entry <> { + tk::EntrySetCursor %W 0 +} +bind Entry <> { + tk::EntryKeySelect %W 0 + tk::EntrySeeInsert %W +} +bind Entry <> { + tk::EntrySetCursor %W end +} +bind Entry <> { + tk::EntryKeySelect %W end + tk::EntrySeeInsert %W +} + +bind Entry { + if {[%W selection present]} { + %W delete sel.first sel.last + } else { + %W delete [tk::startOfCluster [%W get] [%W index insert]] \ + [tk::endOfCluster [%W get] [%W index insert]] + } +} +bind Entry { + tk::EntryBackspace %W +} + +bind Entry { + %W selection from insert +} +bind Entry { + tk::ListboxBeginSelect %W [%W index active] +} +bind Listbox { + tk::ListboxBeginExtend %W [%W index active] +} +bind Listbox { + tk::ListboxBeginExtend %W [%W index active] +} +bind Listbox { + tk::ListboxCancel %W +} +bind Listbox <> { + tk::ListboxSelectAll %W +} +bind Listbox <> { + if {[%W cget -selectmode] ne "browse"} { + %W selection clear 0 end + tk::FireListboxSelectEvent %W + } +} + +# Additional Tk bindings that aren't part of the Motif look and feel: + +bind Listbox { + %W scan mark %x %y +} +bind Listbox { + %W scan dragto %x %y +} +bind Listbox { + tk::MouseWheel %W y %D -40.0 units +} +bind Listbox { + tk::MouseWheel %W y %D -12.0 units +} +bind Listbox { + tk::MouseWheel %W x %D -40.0 units +} +bind Listbox { + tk::MouseWheel %W x %D -12.0 units +} +bind Listbox { + if {%# %% 5 == 0} { + lassign [tk::PreciseScrollDeltas %D] tk::Priv(deltaX) tk::Priv(deltaY) + if {$tk::Priv(deltaX) != 0} { + %W xview scroll [expr {-$tk::Priv(deltaX)}] units + } + if {$tk::Priv(deltaY) != 0} { + %W yview scroll [expr {-$tk::Priv(deltaY)}] units + } + } +} + +# ::tk::ListboxBeginSelect -- +# +# This procedure is typically invoked on button-1 presses. It begins +# the process of making a selection in the listbox. Its exact behavior +# depends on the selection mode currently in effect for the listbox; +# see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. + +proc ::tk::ListboxBeginSelect {w el {focus 1}} { + variable ::tk::Priv + if {[$w cget -selectmode] eq "multiple"} { + if {[$w selection includes $el]} { + $w selection clear $el + } else { + $w selection set $el + } + } else { + $w selection clear 0 end + $w selection set $el + $w selection anchor $el + set Priv(listboxSelection) {} + set Priv(listboxPrev) $el + } + tk::FireListboxSelectEvent $w + # check existence as ListboxSelect may destroy us + if {$focus && [winfo exists $w] && [$w cget -state] eq "normal"} { + focus $w + } +} + +# ::tk::ListboxMotion -- +# +# This procedure is called to process mouse motion events while +# button 1 is down. It may move or extend the selection, depending +# on the listbox's selection mode. +# +# Arguments: +# w - The listbox widget. +# el - The element under the pointer (must be a number). + +proc ::tk::ListboxMotion {w el} { + variable ::tk::Priv + if {$el == $Priv(listboxPrev)} { + return + } + set anchor [$w index anchor] + switch [$w cget -selectmode] { + browse { + $w selection clear 0 end + $w selection set $el + set Priv(listboxPrev) $el + tk::FireListboxSelectEvent $w + } + extended { + set i $Priv(listboxPrev) + if {$i < 0} { + set i $el + $w selection set $el + } + if {[$w selection includes anchor]} { + $w selection clear $i $el + $w selection set anchor $el + } else { + $w selection clear $i $el + $w selection clear anchor $el + } + if {![info exists Priv(listboxSelection)]} { + set Priv(listboxSelection) [$w curselection] + } + while {($i < $el) && ($i < $anchor)} { + if {$i in $Priv(listboxSelection)} { + $w selection set $i + } + incr i + } + while {($i > $el) && ($i > $anchor)} { + if {$i in $Priv(listboxSelection)} { + $w selection set $i + } + incr i -1 + } + set Priv(listboxPrev) $el + tk::FireListboxSelectEvent $w + } + } +} + +# ::tk::ListboxBeginExtend -- +# +# This procedure is typically invoked on shift-button-1 presses. It +# begins the process of extending a selection in the listbox. Its +# exact behavior depends on the selection mode currently in effect +# for the listbox; see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. + +proc ::tk::ListboxBeginExtend {w el} { + if {[$w cget -selectmode] eq "extended"} { + if {[$w selection includes anchor]} { + ListboxMotion $w $el + } else { + # No selection yet; simulate the begin-select operation. + ListboxBeginSelect $w $el + } + } +} + +# ::tk::ListboxBeginToggle -- +# +# This procedure is typically invoked on control-button-1 presses. It +# begins the process of toggling a selection in the listbox. Its +# exact behavior depends on the selection mode currently in effect +# for the listbox; see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. + +proc ::tk::ListboxBeginToggle {w el} { + variable ::tk::Priv + if {[$w cget -selectmode] eq "extended"} { + set Priv(listboxSelection) [$w curselection] + set Priv(listboxPrev) $el + $w selection anchor $el + if {[$w selection includes $el]} { + $w selection clear $el + } else { + $w selection set $el + } + tk::FireListboxSelectEvent $w + } +} + +# ::tk::ListboxAutoScan -- +# This procedure is invoked when the mouse leaves an entry window +# with button 1 down. It scrolls the window up, down, left, or +# right, depending on where the mouse left the window, and reschedules +# itself as an "after" command so that the window continues to scroll until +# the mouse moves back into the window or the mouse button is released. +# +# Arguments: +# w - The entry window. + +proc ::tk::ListboxAutoScan {w} { + variable ::tk::Priv + if {![winfo exists $w]} return + set x $Priv(x) + set y $Priv(y) + if {$y >= [winfo height $w]} { + $w yview scroll 1 units + } elseif {$y < 0} { + $w yview scroll -1 units + } elseif {$x >= [winfo width $w]} { + $w xview scroll 2 units + } elseif {$x < 0} { + $w xview scroll -2 units + } else { + return + } + ListboxMotion $w [$w index @$x,$y] + set Priv(afterId) [after 50 [list tk::ListboxAutoScan $w]] +} + +# ::tk::ListboxUpDown -- +# +# Moves the location cursor (active element) up or down by one element, +# and changes the selection if we're in browse or extended selection +# mode. +# +# Arguments: +# w - The listbox widget. +# amount - +1 to move down one item, -1 to move back one item. + +proc ::tk::ListboxUpDown {w amount} { + variable ::tk::Priv + $w activate [expr {[$w index active] + $amount}] + $w see active + switch [$w cget -selectmode] { + browse { + $w selection clear 0 end + $w selection set active + tk::FireListboxSelectEvent $w + } + extended { + $w selection clear 0 end + $w selection set active + $w selection anchor active + set Priv(listboxPrev) [$w index active] + set Priv(listboxSelection) {} + tk::FireListboxSelectEvent $w + } + } +} + +# ::tk::ListboxExtendUpDown -- +# +# Does nothing unless we're in extended selection mode; in this +# case it moves the location cursor (active element) up or down by +# one element, and extends the selection to that point. +# +# Arguments: +# w - The listbox widget. +# amount - +1 to move down one item, -1 to move back one item. + +proc ::tk::ListboxExtendUpDown {w amount} { + variable ::tk::Priv + if {[$w cget -selectmode] ne "extended"} { + return + } + set active [$w index active] + if {![info exists Priv(listboxSelection)]} { + $w selection set $active + set Priv(listboxSelection) [$w curselection] + } + $w activate [expr {$active + $amount}] + $w see active + ListboxMotion $w [$w index active] +} + +# ::tk::ListboxDataExtend +# +# This procedure is called for key-presses such as Shift-KEndData. +# If the selection mode isn't multiple or extend then it does nothing. +# Otherwise it moves the active element to el and, if we're in +# extended mode, extends the selection to that point. +# +# Arguments: +# w - The listbox widget. +# el - An integer element number. + +proc ::tk::ListboxDataExtend {w el} { + set mode [$w cget -selectmode] + if {$mode eq "extended"} { + $w activate $el + $w see $el + if {[$w selection includes anchor]} { + ListboxMotion $w $el + } + } elseif {$mode eq "multiple"} { + $w activate $el + $w see $el + } +} + +# ::tk::ListboxCancel +# +# This procedure is invoked to cancel an extended selection in +# progress. If there is an extended selection in progress, it +# restores all of the items between the active one and the anchor +# to their previous selection state. +# +# Arguments: +# w - The listbox widget. + +proc ::tk::ListboxCancel w { + variable ::tk::Priv + if {[$w cget -selectmode] ne "extended"} { + return + } + set first [$w index anchor] + set last $Priv(listboxPrev) + if {$last < 0} { + # Not actually doing any selection right now + return + } + if {$first > $last} { + set tmp $first + set first $last + set last $tmp + } + $w selection clear $first $last + while {$first <= $last} { + if {$first in $Priv(listboxSelection)} { + $w selection set $first + } + incr first + } + tk::FireListboxSelectEvent $w +} + +# ::tk::ListboxSelectAll +# +# This procedure is invoked to handle the "select all" operation. +# For single and browse mode, it just selects the active element. +# Otherwise it selects everything in the widget. +# +# Arguments: +# w - The listbox widget. + +proc ::tk::ListboxSelectAll w { + set mode [$w cget -selectmode] + if {$mode eq "single" || $mode eq "browse"} { + $w selection clear 0 end + $w selection set active + } else { + $w selection set 0 end + } + tk::FireListboxSelectEvent $w +} + +# ::tk::FireListboxSelectEvent +# +# Fire the <> event if the listbox is not in disabled +# state. +# +# Arguments: +# w - The listbox widget. + +proc ::tk::FireListboxSelectEvent w { + if {[$w cget -state] eq "normal"} { + event generate $w <> + } +} diff --git a/src/vfs/punk9win.vfs/lib_tcl9/tk9.0/megawidget.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/megawidget.tcl similarity index 100% rename from src/vfs/punk9win.vfs/lib_tcl9/tk9.0/megawidget.tcl rename to src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/megawidget.tcl diff --git a/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/menu.tcl b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/menu.tcl new file mode 100644 index 00000000..15058f46 --- /dev/null +++ b/src/vfs/punk9wintk903.vfs/lib_tcl9/tk9.0/menu.tcl @@ -0,0 +1,1376 @@ +# menu.tcl -- +# +# This file defines the default bindings for Tk menus and menubuttons. +# It also implements keyboard traversal of menus and implements a few +# other utility procedures related to menus. +# +# Copyright © 1992-1994 The Regents of the University of California. +# Copyright © 1994-1997 Sun Microsystems, Inc. +# Copyright © 1998-1999 Scriptics Corporation. +# Copyright © 2007 Daniel A. Steffen +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +#------------------------------------------------------------------------- +# Elements of tk::Priv that are used in this file: +# +# cursor - Saves the -cursor option for the posted menubutton. +# focus - Saves the focus during a menu selection operation. +# Focus gets restored here when the menu is unposted. +# grabGlobal - Used in conjunction with tk::Priv(oldGrab): if +# tk::Priv(oldGrab) is non-empty, then tk::Priv(grabGlobal) +# contains either an empty string or "-global" to +# indicate whether the old grab was a local one or +# a global one. +# inMenubutton - The name of the menubutton widget containing +# the mouse, or an empty string if the mouse is +# not over any menubutton. +# menuBar - The name of the menubar that is the root +# of the cascade hierarchy which is currently +# posted. This is null when there is no menu currently +# being pulled down from a menu bar. +# oldGrab - Window that had the grab before a menu was posted. +# Used to restore the grab state after the menu +# is unposted. Empty string means there was no +# grab previously set. +# popup - If a menu has been popped up via tk_popup, this +# gives the name of the menu. Otherwise this +# value is empty. +# postedMb - Name of the menubutton whose menu is currently +# posted, or an empty string if nothing is posted +# A grab is set on this widget. +# relief - Used to save the original relief of the current +# menubutton. +# window - When the mouse is over a menu, this holds the +# name of the menu; it's cleared when the mouse +# leaves the menu. +# tearoff - Whether the last menu posted was a tearoff or not. +# This is true always for unix, for tearoffs for Mac +# and Windows. +# activeMenu - This is the last active menu for use +# with the <> virtual event. +# activeItem - This is the last active menu item for +# use with the <> virtual event. +#------------------------------------------------------------------------- + +#------------------------------------------------------------------------- +# Overall note: +# This file is tricky because there are five different ways that menus +# can be used: +# +# 1. As a pulldown from a menubutton. In this style, the variable +# tk::Priv(postedMb) identifies the posted menubutton. +# 2. As a torn-off menu copied from some other menu. In this style +# tk::Priv(postedMb) is empty, and menu's type is "tearoff". +# 3. As an option menu, triggered from an option menubutton. In this +# style tk::Priv(postedMb) identifies the posted menubutton. +# 4. As a popup menu. In this style tk::Priv(postedMb) is empty and +# the top-level menu's type is "normal". +# 5. As a pulldown from a menubar. The variable tk::Priv(menubar) has +# the owning menubar, and the menu itself is of type "normal". +# +# The various binding procedures use the state described above to +# distinguish the various cases and take different actions in each +# case. +#------------------------------------------------------------------------- + +#------------------------------------------------------------------------- +# The code below creates the default class bindings for menus +# and menubuttons. +#------------------------------------------------------------------------- + +bind Menubutton {} +bind Menubutton { + tk::MbEnter %W +} +bind Menubutton { + tk::MbLeave %W +} +bind Menubutton { + if {$tk::Priv(inMenubutton) ne ""} { + tk::MbPost $tk::Priv(inMenubutton) %X %Y + } +} +bind Menubutton { + tk::MbMotion %W up %X %Y +} +bind Menubutton { + tk::MbMotion %W down %X %Y +} +bind Menubutton { + tk::MbButtonUp %W +} +bind Menubutton { + tk::MbPost %W + tk::MenuFirstEntry [%W cget -menu] +} +bind Menubutton <> { + tk::MbPost %W + tk::MenuFirstEntry [%W cget -menu] +} + +# Must set focus when mouse enters a menu, in order to allow +# mixed-mode processing using both the mouse and the keyboard. +# Don't set the focus if the event comes from a grab release, +# though: such an event can happen after as part of unposting +# a cascaded chain of menus, after the focus has already been +# restored to wherever it was before menu selection started. + +bind Menu {} + +bind Menu { + set tk::Priv(window) %W + if {[%W cget -type] eq "tearoff"} { + if {"%m" ne "NotifyUngrab"} { + if {[tk windowingsystem] eq "x11"} { + tk_menuSetFocus %W + } + } + } + tk::MenuMotion %W %x %y %s +} + +bind Menu { + tk::MenuLeave %W %X %Y %s +} +bind Menu { + tk::MenuMotion %W %x %y %s +} +bind Menu