[JOB] 16-08-22 Modified the source of the helpviewer package - based on Tkhtml2. Please see code below. ****Some notes:**** * Tkhtml3 html widget command has a different interface compared to Thktml2 and is not very well documented, which makes it hard to do any development, so for the moment Tkhtml2.0 - although not actively developed any more - is still an option to choose. * There are various dependencies in order to run the helpviewer, which are non included here. [WikiDbImage HelpViewer.png] * helpviewer.tcl ====== # ############################################################################# # This software is copyrighted by Ramon Ribó (RAMSAN) ramsan@cimne.upc.es. # (http://gid.cimne.upc.es/ramsan) The following terms apply to all files # associated with the software unless explicitly disclaimed # in individual files. # The authors hereby grant permission to use, copy, modify, distribute, # and license this software and its documentation for any purpose, provided # that existing copyright notices are retained in all copies and that this # notice is included verbatim in any distributions. No written agreement, # license, or royalty fee is required for any of the authorized uses. # Modifications to this software may be copyrighted by their authors # and need not follow the licensing terms described here, provided that # the new terms are clearly indicated on the first page of each file where # they apply. # IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY # FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES # ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY # DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE # IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE # NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR # MODIFICATIONS. # ############################################################################# # ----------------------------------------------------------------------------- # (c) 2016, Johann Oberdorfer - Engineering Support | CAD | Software # johann.oberdorfer [at] gmail.com # www.johann-oberdorfer.eu # # helpviewer modified to work with actual BWidget packages # and some various improvements done, respectively: # - search dialog behavior # - pan package added, ... # - changes to implement tiled widget set, ... # ----------------------------------------------------------------------------- # TO-DO: # - Implement breadcrumps navigation info for a better # user experience when browsing through various help files ... # - zoom font size up/down (stylemanager) # ----------------------------------------------------------------------------- lappend auto_path [file dirname [info script]] package provide helpviewer 2.0 # requiring exactly 2.0 to avoid getting the one from Activestate package require -exact Tkhtml 2.0 package require -exact BWidget 1.9.10 package require BWidget_patch Widget::theme 1 package require fileutil # package is optional catch { package require Pan } if { [info command tkTabToWindow] == "" } { proc tkTabToWindow {w} { focus $w after 100 { set w [focus] if {[string equal [winfo class $w] Entry]} { $w selection range 0 end $w icursor end } } } } set comms [list tkButtonInvoke tkTextSelectTo tkEntryInsert tkEntryBackspace \ tk_textCut tk_textCopy tk_textPaste tk_focusNext tk_focusPrev tkTextClosestGap \ tkTextAutoScan tkCancelRepeat] foreach i $comms { auto_load $i if {![llength [info commands $i]]} { tk::unsupported::ExposePrivateCommand $i } } namespace eval History { variable list "" variable pos variable menu proc Add { name } { variable list variable pos variable menu lappend list $name set pos [expr [llength $list]-1] if { $pos == 0 } { if { [info exists menu] && [winfo exists $menu] } { $menu entryconf Backward -state disabled } } else { if { [info exists menu] && [winfo exists $menu] } { $menu entryconf Backward -state normal } } if { [info exists menu] && [winfo exists $menu] } { $menu entryconf Forward -state disabled } } proc GoHome { w } { variable list variable pos variable menu set pos 0 if { [info exists menu] && [winfo exists $menu] } { $menu entryconf Backward -state disabled } if { [info exists menu] && [winfo exists $menu] } { $menu entryconf Forward -state normal } # HelpViewer::LoadRef $w [lindex $list $pos] 0 HelpViewer::LoadRef $w [file join $HelpViewer::HelpBaseDir index.htm] 0 } proc GoBackward { w } { variable list variable pos variable menu incr pos -1 if { $pos == 0 } { if { [info exists menu] && [winfo exists $menu] } { $menu entryconf Backward -state disabled } } if { [info exists menu] && [winfo exists $menu] } { $menu entryconf Forward -state normal } HelpViewer::LoadRef $w [lindex $list $pos] 0 } proc GoForward { w } { variable list variable pos variable menu incr pos 1 if { $pos == [expr [llength $list]-1] } { if { [info exists menu] && [winfo exists $menu] } { $menu entryconf Forward -state disabled } } if { [info exists menu] && [winfo exists $menu] } { $menu entryconf Backward -state normal } HelpViewer::LoadRef $w [lindex $list $pos] 0 } } namespace eval HelpPrefs { variable tttrick 0 variable RunningAlone 0 } # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- namespace eval HelpViewer { variable HelpBaseDir variable LastFileList # These images are used in place of GIFs or of form elements # if { [lsearch [image names] biggray] == -1 } { image create photo biggray -data { R0lGODdhPAA+APAAALi4uAAAACwAAAAAPAA+AAACQISPqcvtD6OctNqLs968+w+G4kiW5omm 6sq27gvH8kzX9o3n+s73/g8MCofEovGITCqXzKbzCY1Kp9Sq9YrNFgsAO/// } image create photo smgray -data { R0lGODdhOAAYAPAAALi4uAAAACwAAAAAOAAYAAACI4SPqcvtD6OctNqLs968+w+G4kiW5omm 6sq27gvH8kzX9m0VADv/ } image create photo nogifbig -data { R0lGODdhJAAkAPEAAACQkADQ0PgAAAAAACwAAAAAJAAkAAACmISPqcsQD6OcdJqKM71PeK15 AsSJH0iZY1CqqKSurfsGsex08XuTuU7L9HywHWZILAaVJssvgoREk5PolFo1XrHZ29IZ8oo0 HKEYVDYbyc/jFhz2otvdcyZdF68qeKh2DZd3AtS0QWcDSDgWKJXY+MXS9qY4+JA2+Vho+YPp FzSjiTIEWslDQ1rDhPOY2sXVOgeb2kBbu1AAADv/ } image create photo nogifsm -data { R0lGODdhEAAQAPEAAACQkADQ0PgAAAAAACwAAAAAEAAQAAACNISPacHtD4IQz80QJ60as25d 3idKZdR0IIOm2ta0Lhw/Lz2S1JqvK8ozbTKlEIVYceWSjwIAO/// } } if { [lsearch [image names] imatge_fletxa_e] == -1 } { image create photo imatge_fletxa_e -data { R0lGODlhJwAeAJECAE5qmoWh0f///wAAACH5BAEAAAIALAAAAAAnAB4AAAJb lI+py+0Po5y00mBzCCDf3XnRBooQWZoNmqoK27oHTNc2Y+c69+4+HJr9hqSg gIjkIZJDo4Hpcz6hOemUSrNeUYCu9wsOdx1AGY5rPsfSyzVbqH0r34s4/Y4v AAA7 } image create photo imatge_fletxa_d -data { R0lGODlhJwAeAJECAE5qmoWh0f///wAAACH5BAEAAAIALAAAAAAnAB4AAAJa lI+py+0Po5y0WhfuDVlT3nkRGIoYaT4klzYr677yPMf0fTP4Ti/8/1IAh6AE cQgAII6/pJGJcz6hM6kiic1qtwCZtWV4fcGC1ZhMOqM56nUb/SYLlPK63VAA ADs= } image create photo imatge_quit -data { R0lGODlhIAAeAJECAE5qmoWh0f///wAAACH5BAEAAAIALAAAAAAgAB4AAAJm lI+py+0Powq02kulwNwC2YVfVAHmiaYgNWpP6QYvG8sNrFU3nesLHgr+eEFh AlgMHYlJ5QHZxJiezKintalaA1METpAKm64T3oqLpXJr3fI613anIXPvtmet D/MasT/uEig4eFAAADs= } image create photo imatge_save -data { R0lGODlhIAAeAOcAAEdjk05qmktnl1VxoWuHt2yIuUhklUlllVJunmSAsHuX x4ik1Iml1YSg0EhklE9rm197q3aSwoai0oej04Wh0YSg0V57q01pmVt3p3GN vYGez3yazpuy2YGe0XWRwVdzo2yIuIGdzYKf0IGe0KC229Lc7vz9/v///4Og 0FFtnUpmllNvn2eDs32ZyX2bzn+cz5ev2MfU6vT3+6W63YSh02N/r1BsnGJ+ rnmVxYSh0X6cz4+o1bvL5uzw+Njh8HqWxkpnl4Cdz4ij0rDC4eLp9P7+/1Rw oExomIKezoKg0miEtEdklGmFtY2o1Pj6/H6by4ql04+p1Yej1Fh0pNvj8evw +L/N54mk022JuWSAsYOh06i83vT2+8bT6pau14Kez/r7/fv8/dHc7qC123iY zVx4qHaTw36c0NDb7dzk8qq933mYzXuZz4ah0aK11ZSs04Kf0XKOvmB8rIWi 1J602ufs9rXG44ul03qZzXmYzoOf0Zmv1LvH2Nbb3OPk3b/K2X+d0Pn6/fH1 +sDP55Kr1niYzoCd0JKq07PC19HX297g3d3f3djc3Nfb3Iai0WF9rXGOvoOg 0pCq1X+dz3uZzn2bz42n07LD3MvT2tzf3d3g3dnd3KG11XiUxMXP2tXY16Kp p8vPz9vf39ve3MPN2X+c0MnT4H+Kiic5PomTluLl5drd3Iul0mWBsaK32b7D wDlKTlRjZt3h4eXl3qm61oqm1tne4FNiZTpKT7rAwd3h4Nre3MTO2aO21Yei 0V56qsLO4Y6Xlig7P3mFh+Pl5Kq71oum0oCe0YSi1Jmw1svOzIaPj8fLyLLB 15Gq04Oh1Iek1H6aylNvoM3U2sPP4Jyy14Kg04ej1YOg0YCe0oaj1XeTw3yY yIWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh 0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh0YWh 0YWh0YWh0YWh0YWh0YWh0SH5BAEAAP8ALAAAAAAgAB4AAAj+AP8JHEiwoEEA AQwqXHhQwAACBQwwnFjwAIIEChYwaJCQIkMHDyBEkMBgAoUKDCx4NOjgAoYM DUpS0LCBAocOHg6s/AdAwAcQIRgsoCBiwwgSJUycQCEhhUcVK1i0WLBAAgoX L2DEkHGi64kZNGowPGDjBo4JDCTk0OFiB48eXuP60PEDiMIUESjIDLJByBAi cQOfKCJkghGFR5BIKIpiho8igiMPSaJkCUsmDJqUcBK58wkiOp4cUThgAhTP qKNImaJQgAIdVFALrmLlCgMsDg5m0bJFdlcuXbywrUDhywWFCCRUAOM5jJgx GsiIoEBdbxmFB8ycQRM5jRoKa9j+tHHzBk71BXF0GpQzh07cOnbu4MmjZw+f Pn7+AKpO3YbCBw1oEIgggxCyQSGGHIJIIooswggjjTjCHwOPYAdJJJJMQkkl llyCSSaabPLgg4pwMkJ1E3SigkIYMECdI558Akoooow44iik7IciAgpdEIIE FJRiyimopKKKjSOuwgpx1DHQCgAsFTBUB668AksssiDJyCiz0NIBdRPUosBo Bn0wFAU52HILLrno8uAuiuzCSy++oCWBB78EcJxBR7QAJCDABCPMMMRokgkm xRhzDDIT/FBDCuotBAALLsKRjDLLMJNIM8508Aw00ShhxIorSWMSBXBMQ001 elhzDRI1WExxBJQ7/aPCWRRgQ0E22lAQRxkX5FYrQTekVdI2cjwQ6bAEpbAA N60gQCqziK0gAK3UBgQAOw== } image create photo appbook16 -data { R0lGODlhEAAQAIQAAPwCBAQCBDyKhDSChGSinFSWlEySjCx+fHSqrGSipESO jCR6dKTGxISytIy6vFSalBxydAQeHHyurAxubARmZCR+fBx2dDyKjPz+/MzK zLTS1IyOjAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAVkICCOZGmK QXCWqTCoa0oUxnDAZIrsSaEMCxwgwGggHI3E47eA4AKRogQxcy0mFFhgEW3M CoOKBZsdUrhFxSUMyT7P3bAlhcnk4BoHvb4RBuABGHwpJn+BGX1CLAGJKzmK jpF+IQAh/mhDcmVhdGVkIGJ5IEJNUFRvR0lGIFBybyB2ZXJzaW9uIDIuNQ0K qSBEZXZlbENvciAxOTk3LDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQpo dHRwOi8vd3d3LmRldmVsY29yLmNvbQA7 } image create photo appbookopen16 -data { R0lGODlhEAAQAIUAAPwCBAQCBExCNGSenHRmVCwqJPTq1GxeTHRqXPz+/Dwy JPTq3Ny+lOzexPzy5HRuVFSWlNzClPTexIR2ZOzevPz29AxqbPz6/IR+ZDyK jPTy5IyCZPz27ESOjJySfDSGhPTm1PTizJSKdDSChNzWxMS2nIR6ZKyijNzO rOzWtIx+bLSifNTGrMy6lIx+ZCRWRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAae QEAAQCwWBYJiYEAoGAFIw0E5QCScAIVikUgQqNargtFwdB9KSDhxiEjMiUlg HlB3E48IpdKdLCxzEAQJFxUTblwJGH9zGQgVGhUbbhxdG4wBHQQaCwaTb10e mB8EBiAhInp8CSKYIw8kDRSfDiUmJ4xCIxMoKSoRJRMrJyy5uhMtLisTLCQk C8bHGBMj1daARgEjLyN03kPZc09FfkEAIf5oQ3JlYXRlZCBieSBCTVBUb0dJ RiBQcm8gdmVyc2lvbiAyLjUNCqkgRGV2ZWxDb3IgMTk5NywxOTk4LiBBbGwg cmlnaHRzIHJlc2VydmVkLg0KaHR0cDovL3d3dy5kZXZlbGNvci5jb20AOw== } image create photo filedocument16 -data { R0lGODlhEAAQAIUAAPwCBFxaXNze3Ly2rJSWjPz+/Ozq7GxqbJyanPT29HRy dMzOzDQyNIyKjERCROTi3Pz69PTy7Pzy7PTu5Ozm3LyqlJyWlJSSjJSOhOzi 1LyulPz27PTq3PTm1OzezLyqjIyKhJSKfOzaxPz29OzizLyidIyGdIyCdOTO pLymhOzavOTStMTCtMS+rMS6pMSynMSulLyedAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAaQ QIAQECgajcNkQMBkDgKEQFK4LFgLhkMBIVUKroWEYlEgMLxbBKLQUBwc52Hg AQ4LBo049atWQyIPA3pEdFcQEhMUFYNVagQWFxgZGoxfYRsTHB0eH5UJCJAY ICEinUoPIxIcHCQkIiIllQYEGCEhJicoKYwPmiQeKisrKLFKLCwtLi8wHyUl MYwM0tPUDH5BACH+aENyZWF0ZWQgYnkgQk1QVG9HSUYgUHJvIHZlcnNpb24g Mi41DQqpIERldmVsQ29yIDE5OTcsMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZl ZC4NCmh0dHA6Ly93d3cuZGV2ZWxjb3IuY29tADs= } image create photo viewmag16 -data { R0lGODlhEAAQAIUAAPwCBCQmJDw+PAwODAQCBMza3NTm5MTW1HyChOTy9Mzq 7Kze5Kzm7OT29Oz6/Nzy9Lzu7JTW3GTCzLza3NTy9Nz29Ize7HTGzHzK1AwK DMTq7Kzq9JTi7HTW5HzGzMzu9KzS1IzW5Iza5FTK1ESyvLTa3HTK1GzGzGzG 1DyqtIzK1AT+/AQGBATCxHRydMTCxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAZ8 QIAQEBAMhkikgFAwHAiC5FCASCQUCwYiKiU0HA9IRAIhSAcTSuXBsFwwk0wy YNBANpyOxPMxIzMgCyEiHSMkGCV+SAQQJicoJCllUgBUECEeKhAIBCuUSxMK IFArBIpJBCxmLQQuL6eUAFCusJSzr7GLArS5Q7O1tmZ+QQAh/mhDcmVhdGVk IGJ5IEJNUFRvR0lGIFBybyB2ZXJzaW9uIDIuNQ0KqSBEZXZlbENvciAxOTk3 LDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQpodHRwOi8vd3d3LmRldmVs Y29yLmNvbQA7 } } } proc HelpViewer::GiveLastFile { w } { variable LastFileList set retval "" catch { set w [winfo toplevel $w] set retval $LastFileList($w) } return $retval } proc HelpViewer::EnterLastFile { w file } { variable LastFileList set w [winfo toplevel $w] set LastFileList($w) $file } # A font chooser routine. # # $base.h.h config -fontcommand pickFont proc HelpViewer::pickFont {size attrs} { global tcl_platform if { [lsearch [font names] HelpFont] != -1 } { set family [font conf HelpFont -family] set fsize [font conf HelpFont -size] } else { set family "Helvetica" switch $::tcl_platform(platform) { windows { set fsize 12 } default { set fsize 15 } } } if { $HelpPrefs::tttrick } { set a [expr {-1<[lsearch $attrs fixed]?{Symbol}:"$family"}] } else { set a [expr {-1<[lsearch $attrs fixed]?{Courier}:"$family"}] } set b [expr {-1<[lsearch $attrs italic]?{italic}:{roman}}] set c [expr {-1<[lsearch $attrs bold]?{bold}:{normal}}] set d [expr int($fsize*pow(1.2,$size-4))] # if { $tcl_platform(platform) != "windows"} { # set d [expr {3+int(12*pow(1.2,$size-4))}] # } else { # set d [expr {3+int(12*pow(1.2,$size-6))}] # } list $a $d $b $c } # This routine is called for each form element # proc HelpViewer::FormCmd {n cmd args} { # puts "FormCmd: $n $cmd $args" switch $cmd { select - textarea - input { set w [lindex $args 0] label $w -image nogifsm } } } proc HelpViewer::ImageCmd {args} { global OldImages Images showImages if {!$showImages} { return smgray } set fn [lindex $args 0] set list [file split $fn] if { [lindex $list 0] == "." } { set list [lrange $list 1 end] } set fn [eval [concat "file join $list"]] if { [file dirname $fn] == "." } { set fn [file tail $fn] } if {[info exists OldImages($fn)]} { set Images($fn) $OldImages($fn) unset OldImages($fn) return $Images($fn) } if {[catch {image create photo -file $fn} img]} { return smgray } if {[image width $img]*[image height $img]>20000} { global BigImages set b [image create photo -width [image width $img] \ -height [image height $img]] set BigImages($b) $img set img $b after idle "HelpViewer::MoveBigImage $b" } set Images($fn) $img return $img } proc HelpViewer::MoveBigImage b { global BigImages if {![info exists BigImages($b)]} return $b copy $BigImages($b) image delete $BigImages($b) unset BigImages($b) update } # This routine is called for every