FM This is another megawidget framework.
It uses the typedlist package. It's a class which creates a megawidget as an ensemble command.
There is a two examples below.
It should look like this :
Here's a screen shot of its possible use :
package require Tk package require tkpath package require Tktable package require typedlist oo::class create megawidget { variable path variable myOptions variable WidgetTree variable rootPath variable returnCommand constructor {tree} { my variable WidgetTree my variable instance my variable OptionListe my variable returnCommand set returnCommand {} set instance 0 set OptionListe [list widget mwidget wOptions myOption bScripts \ handler hMethods hVars hVal hPostConfig\ gmPack gmNotebook gmPane gmText gmCanvas gmTable \ gmGrid \ CanvasItem TkpItem spanTable textIsPeer scTable default \ top geometry title attributes resizable minsize maxsize \ overrideredirect protocol howToReturn] ::set WidgetTree(script) $tree foreach o [list {*}$OptionListe < > ^ v @] { typedlist create $o } } method getTreeScript {} { my variable WidgetTree my variable instance return $WidgetTree(script) } method setTreeScript {script} { my variable WidgetTree set WidgetTree(script) $script } method getTree {} { my variable WidgetTree my variable instance return $WidgetTree(tree) } method lappendPostConfig {post} { my variable instance variable rootPath lappend ::${rootPath}::hPostConfig $post return } method getPostConfig {} { my variable instance variable rootPath if {[info exist ::${rootPath}::hPostConfig]} { return [set ::${rootPath}::hPostConfig] } else { return } } method getOptions {args} { my variable myOptions my variable instance set e [lindex $args 0] if {(![catch {info object class $e}]) && ([info object class $e] eq "::typedlist") && ([$e type] eq "default")} { set default [$e get] set args [lassign $args dummy] } else { set default [] } if {[dict exist $myOptions {*}$args]} { return [dict get $myOptions {*}$args] } else { return $default } } method createHandler {handler path {typeHandler meta}} { variable rootPath my variable instance # Déterminer si le raccourci pointe une métafenêtre ? # Cela a-t-il du sens qu'elle n'en soit pas une ? En théorie, oui. # Par exemple, un ajout d'une série de fenêtre à un endroit précis. namespace eval ::${rootPath}::$handler {} namespace eval ::${rootPath}::get::$path {} proc ::${rootPath}::${handler}::path {} "return ${path}_" proc ::${rootPath}::${handler}::obj {args} [subst { if {\$args eq {}} { return [list ${path}] } else { [list $path] {*}\$args } }] proc ::${rootPath}::${handler}::configure {args} "[list ${path}_] configure {*}\$args" proc ::${rootPath}::${handler}::do {args} "[list ${path}_] {*}\$args" proc ::${rootPath}::${handler}::bind {event script} [subst { ::bind [list ${path}_] \$event \$script }] proc ::${rootPath}::${handler}::parent {args} [subst { return \[winfo parent [list ${path}_]] }] proc ::${rootPath}::${handler}::brother {args} [subst { return \[winfo children \[winfo parent [list ${path}_]]] }] proc ::${rootPath}::get::${path}::handler {args} [subst { return [list $handler] }] proc ::${rootPath}::${handler}::space {args} [subst { return [list ::${rootPath}::${handler}] }] namespace eval ::${rootPath}::$handler namespace export * namespace eval ::${rootPath}::$handler namespace ensemble create namespace eval ::${rootPath}::get::$path namespace export * namespace eval ::${rootPath}::get::$path namespace ensemble create namespace eval ::${rootPath} namespace export * namespace eval ::${rootPath} namespace ensemble create lappend ::${rootPath}::get::Handlers $handler lappend ::${rootPath}::get::Objects $handler lappend ::${rootPath}::get::mwidgets $path return $handler } method getSpace {} { return [self namespace] } method unknown {w args} { my variable myOptions my variable instance my variable WidgetTree my variable howToReturn my variable rootPath if {[string match .* $w]} { if {[winfo exist $w]} { return -code error -message "$w already exist" } if {[winfo exist ${w}_]} { return -code error -message "${w}_ already exist" } if {[string last . $w] == 0} { # la fenêtre parente . existe toujours if {$w ne "."} { # ! créer un nouvel objet, sinon les données se confondent ! # pour (version 0,4), ou bien calculer l'instance si ce n'est pas possible (mais il faudra aussi la repérer) incr instance if {$instance > 1} { # An object is already created; create a new one set newObj [megawidget create [self]:$instance $WidgetTree(script)] set res [$newObj $w {*}$args] return $res } set myOptions $args my _build $w if {[set ::${rootPath}::returnCommand] ne {}} { return [eval {*}[set ::${rootPath}::returnCommand]] } else { return $w } } else { return -code error -message "$w is the toplevel window !" } } elseif {[set lastdot [string last . $w]] > 0} { # la fenêtre parent doit exister if {[set ParentWindow [winfo exist [string range $w 0 ${lastdot}-1]]]} { incr instance if {$instance > 1} { # An object is already created; create a new one set newObj [megawidget create [self]:$instance $WidgetTree(script)] set res [$newObj $w {*}$args] return $res } # Options set myOptions $args my _build $w if {[set ::${rootPath}::returnCommand] ne {}} { return [eval {*}[set ::${rootPath}::returnCommand]] } else { return $w } } else { return -code error -message "window $ParentWindow doesn't exist" } } } else { return -code error -message "Bad widget path name $w" } } method _build {w} { my variable WidgetTree variable path variable rootPath my variable instance set rootPath $w set path ${w}_ flush stdout namespace eval ::${rootPath} [list namespace eval get [list]] namespace eval ::${rootPath}::get [list variable Handlers []] namespace eval ::${rootPath}::get [list variable Widgets []] namespace eval ::${rootPath}::get [list variable MWidgets []] namespace eval ::${rootPath}::get [list variable Objects []] namespace eval ::${rootPath}::get [list variable Listes []] set ::${rootPath}::hPostConfig [] set ::${rootPath}::returnCommand [] set Tree [regsub -all -- %MW $WidgetTree(script) [list ${rootPath}]]; # substitution MegaWidget set Tree [regsub -all -- ***=%${rootPath} $Tree %MW]; # unsubstitute protected MegaWidget set Tree [regsub -all -- %O $Tree [list [self]]]; # substitution Object set Tree [regsub -all -- %[self] $Tree %O]; # unsubstitute protected Object ::set WidgetTree(tree) [my eval $Tree] set tree [my makeToplevel $WidgetTree(tree)] my make $tree proc ::${rootPath}::rootpath {args} [subst { return [list ${rootPath}_] }] proc ::${rootPath}::get::widgets {{pattern {*}}} { variable Widgets return [lsearch -inline -all $Widgets $pattern] } set S [] foreach o [list caller class filter method namespace next object target] { catch {lappend S $o [self $o]} } proc ::${rootPath}::get::my {{option {}}} [subst { if {\$option in {namespace caller class filter method namespace next object target}} { return \[dict get [list $S] \$option] } }] unset S proc ::${rootPath}::get::mwidgets {{pattern {*}}} { variable MWidgets return [lsearch -inline -all $MWidgets $pattern] } proc ::${rootPath}::get::handlers {{pattern {*}}} { variable Handlers return [lsearch -inline -all $Handlers $pattern] } proc ::${rootPath}::get::objects {{pattern {*}}} { variable Objects return [lsearch -inline -all $Objects $pattern] } proc ::${rootPath}::get::typedlists {{pattern {*}}} { variable Listes return [lsearch -inline -all $Listes $pattern] } namespace eval ::${rootPath} namespace export * namespace eval ::${rootPath} namespace ensemble create namespace eval ::${rootPath}::get namespace export * namespace eval ::${rootPath}::get namespace ensemble create foreach e [my getPostConfig] { if {[catch { eval {*}$e } err]} { puts stderr [list megawidget get $err when evaluating $e in postconfiguration step] } } } method makeToplevel {tree} { my variable WidgetTree variable path variable rootPath my variable myOptions my variable instance my variable returnCommand if {(![catch {info object class $tree}]) && ([info object class $tree] eq "::typedlist") \ && ([$tree type] eq "top")} { # create a new toplevel lappend ::${rootPath}::get::Listes $tree set i -1 set Top [toplevel $path] set WidgetTree($path,wtype) "toplevel" # A voir pour que la destruction soit complète wm protocol $Top WM_DELETE_WINDOW [subst { foreach l \[[list $rootPath] get typedlists\] { if {\[catch {\$l destroy} err\]} { puts stderr "erreur de destruction de la liste \$l message: \$err, rootpath [list $rootPath] dans la procédure megawidget makeToplevel, protocol WM_DELETE_WINDOW " } } namespace delete $rootPath if {$instance > 1} { # A voir [self] destroy } destroy $Top }] foreach o [$tree get] { if {(![catch {info object class $o}]) && ([info object class $o] eq "::typedlist")} { lappend ::${rootPath}::get::Listes $o switch -- [$o type] { wOptions { # Options de création de la fenêtre $Top configure {*}[$o get] } grid { wm grid $Top {*}[$o get] } title { wm title $Top [$o get] } resizeable { wm resizeable $Top {*}[$o get] } geometry { wm geometry $Top [$o get] } attributes { foreach {attr val} [$o get] { wm attributes $Top $attr $val } } protocol { set script [lassign [$o get] p] if {$p eq "WM_DELETE_WINDOW"} { append script \n namespace\ delete\ $rootPath \n append script destroy\ $Top wm protocol $Top $p "eval $script" } } minsize { lassign [$o get] W H wm minsize $Top $W $H } maxsize { lassign [$o get] W H wm maxsize $Top $W $H } overrideredirect { wm overrideredirect $Top [$o get] } howToReturn { # commande à retourner set ::${rootPath}::returnCommand [$o get] } > - < - v - ^ - @ { return $o }} } } } else { frame $path return $tree } } method make {tree} { my variable WidgetTree variable path variable rootPath variable myOptions my variable OptionListe set isWidgetCreated 0 lassign [lrepeat [llength $OptionListe] []] {*}$OptionListe if {(![catch {info object class $tree}]) && ([info object class $tree] eq "::typedlist") \ && ([$tree type] in {> < v ^ @})} { set SIDE [dict get [dict create > left v top ^ bottom < right @ {}] [$tree type]] set P $path foreach e [$tree get] { if {(![catch {info object class $e}]) && ([info object class $e] eq "::typedlist")} { lappend ::${rootPath}::get::Listes $e switch -- [$e type] { mwidget { lassign [lrepeat [llength $OptionListe] []] {*}$OptionListe set mwCommand [lindex [$e get] 0] set path ${path}.[regsub -all {::} [string tolower $mwCommand 0 0] {_}][incr id] set WidgetTree($path,wtype) "mwidget" set WidgetTree(${path}_,gm) Pack; #pack en valeur par défault foreach o [lrange [$e get] 1 end] { if {(![catch {info object class $o}]) && ([info object class $o] eq "::typedlist")} { lappend ::${rootPath}::get::Listes $o switch -- [$o type] { wOptions { set wOptions [$o get] } gmPack { set gmPack [$o get] set WidgetTree(${path}_,gm) Pack } gmGrid { set gmGrid [$o get] set WidgetTree(${path}_,gm) Grid } gmNotebook { set gmNotebook [$o get] set WidgetTree(${path}_,gm) Notebook set WidgetTree(${path},gm) Notebook } gmTable { set gmTable [$o get] set WidgetTree(${path}_,gm) Table set WidgetTree(${path},gm) Table } gmPane { set gmPane [$o get] set WidgetTree(${path}_,gm) Panewindow set WidgetTree(${path},gm) Panewindow } gmCanvas { set gmCanvas [$o get] set WidgetTree(${path}_,gm) Canvas set WidgetTree(${path},gm) Canvas } gmText { set gmText [$o get] set WidgetTree(${path}_,gm) Text set WidgetTree(${path},gm) Text } handler { set handler [lindex [$o get] 0] lappend ::${rootPath}::get::Objects $handler lappend ::${rootPath}::get::Handlers $handler # création du raccourci namespace eval ::${rootPath}::$handler {} namespace eval ::${rootPath}::get::$path {} proc ::${rootPath}::${handler}::path {} "return ${path}_" proc ::${rootPath}::${handler}::obj {args} [subst { if {\$args eq {}} { return [list $path] } else { [list $path] {*}\$args } }] proc ::${rootPath}::${handler}::configure {args} "[list ${path}_] configure {*}\$args" proc ::${rootPath}::${handler}::do {args} "[list ${path}_] {*}\$args" proc ::${rootPath}::${handler}::bind {event script} [subst { ::bind [list ${path}_] \$event \$script }] proc ::${rootPath}::${handler}::parent {args} [subst { return \[winfo parent [list ${path}_]] }] proc ::${rootPath}::${handler}::brother {args} [subst { return \[winfo children \[winfo parent [list ${path}_]]] }] proc ::${rootPath}::get::${path}::handler {args} [subst { return [list $handler] }] proc ::${rootPath}::${handler}::space {args} [subst { return [list ::${rootPath}::${handler}] }] foreach mv [lrange [$o get] 1 end] { if {([info object class $mv] eq "::typedlist")} { lappend ::${rootPath}::get::Listes $mv if {[$mv type] eq "hMethods"} { foreach {Name Args Body} [$mv get] { proc ::${rootPath}::${handler}::$Name $Args $Body } } elseif {[$mv type] eq "hVars"} { foreach v [$mv get] { if {(![catch {info object class $v}]) \ && ([info object class $v] eq "::typedlist")\ && ([$v type] eq "hVal")} { namespace eval ::${rootPath}::${handler} [list set $var $v] } else { namespace eval ::${rootPath}::${handler} [list variable [set var $v]] } } } elseif {[$mv type] eq "hPostConfig"} { # Un script à évaluer après création # Création de tout ou bien juste du handler ? A voir ... set hPC [$mv get] my lappendPostConfig $hPC } else { # puts "unknown option" } } else { continue } } namespace eval ::${rootPath}::$handler namespace export * namespace eval ::${rootPath}::$handler namespace ensemble create namespace eval ::${rootPath}::get::$path namespace export * namespace eval ::${rootPath}::get::$path namespace ensemble create }} } } set isWidgetCreated 0 } widget { # widget command en 0 lassign [lrepeat [llength $OptionListe] []] {*}$OptionListe set wCommand [lindex [$e get] 0] set path ${path}.[regsub -all -- {::} $wCommand {_}][incr id] set WidgetTree($path,wtype) "widget" set WidgetTree($path,gm) Pack; #pack en valeur par défault foreach o [lrange [$e get] 1 end] { if {(![catch {info object class $o}]) && ([info object class $o] eq "::typedlist")} { lappend ::${rootPath}::get::Listes $o switch -- [$o type] { wOptions { set wOptions [$o get] } gmPack { set gmPack [$o get] set WidgetTree($path,gm) Pack } gmGrid { set gmGrid [$o get] set WidgetTree(${path},gm) Grid } gmNotebook { set gmNotebook [$o get] set WidgetTree($path,gm) Notebook } gmTable { set gmTable [$o get] set WidgetTree($path,gm) Table } gmPane { set gmPane [$o get] set WidgetTree($path,gm) Panewindow } gmCanvas { set gmCanvas [$o get] set WidgetTree($path,gm) Canvas } gmText { set gmText [$o get] set WidgetTree($path,gm) Text } textIsPeer { set textIsPeer [$o get] if {![info exist WidgetTree(peer,$textIsPeer)]} { if {[winfo exist $textIsPeer]} { # probablement un texte externe set WidgetTree(peer,$path) $textIsPeer set WidgetTree(peer,$textIsPeer) $textIsPeer } else { # première création : normal set WidgetTree(peer,$textIsPeer) $path } } else { set WidgetTree(peer,$path) $textIsPeer } } bScripts { set bScripts [] foreach {bSeq bSc} [$o get] { lappend bScripts $bSeq $bSc } } handler { set handler [lindex [$o get] 0] lappend ::${rootPath}::get::Handlers $handler # création du raccourci namespace eval ::${rootPath}::$handler {} namespace eval ::${rootPath}::get::$path {} proc ::${rootPath}::${handler}::path {} "return [list $path]" proc ::${rootPath}::${handler}::configure {args} "[list $path] configure {*}\$args" proc ::${rootPath}::${handler}::do {args} "[list $path] {*}\$args" proc ::${rootPath}::${handler}::bind {event script} [subst { ::bind [list $path] \$event \$script }] proc ::${rootPath}::${handler}::parent {args} [subst { return \[winfo parent [list $path]] }] proc ::${rootPath}::${handler}::brother {args} [subst { return \[winfo children \[winfo parent [list $path]]] }] proc ::${rootPath}::get::${path}::handler {args} [subst { return [list $handler] }] proc ::${rootPath}::${handler}::space {args} [subst { return [list ::${rootPath}::${handler}] }] foreach mv [lrange [$o get] 1 end] { if {([info object class $mv] eq "::typedlist")} { lappend ::${rootPath}::get::Listes $mv if {[$mv type] eq "hMethods"} { foreach {Name Args Body} [$mv get] { proc ::${rootPath}::${handler}::$Name $Args $Body } } elseif {[$mv type] eq "hVars"} { foreach v [$mv get] { if {(![catch {info object class $v}]) \ && ([info object class $v] eq "::typedlist")\ && ([$v type] eq "hVal")} { lappend ::${rootPath}::get::Listes $v namespace eval ::${rootPath}::${handler} [list variable $var [$v get]] } else { namespace eval ::${rootPath}::${handler} [list variable [set var $v]] } } } elseif {[$mv type] eq "hPostConfig"} { # Un script à évaluer après création # Création de tout ou bien juste du handler ? A voir ... set hPC [$mv get] my lappendPostConfig $hPC } else { # "unknow type" } } else { # "unknow type" continue } } namespace eval ::${rootPath}::$handler {namespace export *} namespace eval ::${rootPath}::$handler {namespace ensemble create} namespace eval ::${rootPath}::get::$path {namespace export *} namespace eval ::${rootPath}::get::$path {namespace ensemble create} } > - < - v - ^ - @ { if {! $isWidgetCreated} { # SubWidgets # 1. créer la widget parent if {[catch {set WidgetTree(peer,$path)} res]} { if {$WidgetTree($path,wtype) eq "widget"} { if {![winfo exist $path]} { $wCommand $path {*}$wOptions set isWidgetCreated 1 lappend ::${rootPath}::get::Widgets $path } else { if {[llength $wOptions] > 0} { $path conf {*}$wOptions } } } elseif {$WidgetTree($path,wtype) eq "mwidget"} { if {![info exist ${path}]} { lappend ::${rootPath}::get::MWidgets $path $mwCommand $path {*}$wOptions set isWidgetCreated 1 set path [$path rootpath] } else { # To do } } } else { if {![winfo exist $path]} { $WidgetTree(peer,$res) peer create $path {*}$wOptions } else { # To do } } # 2. geometry management switch -- $WidgetTree($path,gm) { Canvas { [winfo parent $path] create window {*}$gmCanvas -window $path } Pack { pack $path -expand 1 -fill both {*}[expr {($SIDE ne "") ? [list -side $SIDE] : ""}] {*}$gmPack } Grid { # not realy done. To be seen catch {grid $path {*}$gmGrid} catch {grid ${path}_ {*}$gmGrid} } Notebook { switch $SIDE { "right" { [winfo parent $path] insert 0 $path {*}$gmNotebook } "left" - default { [winfo parent $path] add $path {*}$gmNotebook } } } Panewindow { switch $SIDE { "right" - bottom { [winfo parent $path] insert 0 $path {*}$gmPane } "left" - "top" - default { [winfo parent $path] add $path {*}$gmPane } } } Table { # not realy done. To be seen [winfo parent $path] window configure {*}$gmTable -window $path } Text { [winfo parent $path] window create end -window $path } default {} } # 3. gestion des évènements foreach {bSeq bSc} $bScripts { bind $path $bSeq $bSc } } # continuation du processus my make $o }} } else { # On assume que ce sont des options # tk_messageBox -message $o lappend wOptions $o } } } TkpItem { $path create {*}[$e get] continue } spanTable { $path span {*}[$e get] continue } scTable { $path {*}[$e get] continue }} if {! $isWidgetCreated} { # SubWidgets # 1. créer la widget parent if {[catch {set WidgetTree(peer,$path)} res]} { if {$WidgetTree($path,wtype) eq "widget"} { if {![winfo exist $path]} { $wCommand $path {*}$wOptions set isWidgetCreated 1 lappend ::${rootPath}::get::Widgets $path } else { if {[llength $wOptions] > 0} { $path conf {*}$wOptions } } } elseif {$WidgetTree($path,wtype) eq "mwidget"} { if {![info exist ${path}]} { $mwCommand $path {*}$wOptions set isWidgetCreated 1 lappend ::${rootPath}::get::MWidgets $path set path [$path rootpath] } else { # To do } } } else { if {![winfo exist $path]} { $WidgetTree(peer,$res) peer create $path {*}$wOptions } else { # To do } } # 2. geometry management switch -- $WidgetTree($path,gm) { Canvas { [winfo parent $path] create window {*}$gmCanvas -window $path } Grid { # not realy done. To be seen catch {grid $path {*}$gmGrid} catch {grid ${path}_ {*}$gmGrid} } Notebook { switch $SIDE { "right" { [winfo parent $path] insert 0 $path {*}$gmNotebook } "left" - default { [winfo parent $path] add $path {*}$gmNotebook } } } Pack { pack $path -expand 1 -fill both {*}[expr {($SIDE ne "") ? [list -side $SIDE] : ""}] {*}$gmPack } Panewindow { switch $SIDE { "right" - bottom { [winfo parent $path] insert 0 $path {*}$gmPane } "left" - "top" - default { [winfo parent $path] add $path {*}$gmPane } } } Table { # not realy done. To be seen [winfo parent $path] window configure {*}$gmTable -window $path } Text { [winfo parent $path] window create end -window $path } default {} } # 3. gestion des évènements foreach {bSeq bSc} $bScripts { bind $path $bSeq $bSc } } } # réinitilisation du chemin au chemin parent set path $P set isWidgetCreated 0 }; # fin foreach } } } package provide megawidget 0.3
# look of default style (when no options are set, default configuration)
megawidget create SearchBox { top \ [title {*}[my getOptions [default -- Search] -title]]\ [attributes -toolwindow 1 -topmost 1]\ [v \ [widget ttk::frame [gmPack {*}[set Pad [list -padx 5 -pady 3]]]\ [> \ [widget ttk::label \ -text [my getOptions [default -- Find what] -findLabel]\ {*}[set labelWidth [list -width [my getOptions [default -- 10] -labelWidth]]]\ [set fillNone [gmPack -expand 0 -fill none {*}$Pad]]]\ [widget ttk::entry \ [set fillX [gmPack -expand 1 -fill x {*}$Pad]]\ [handler findEntry\ [hPostConfig {focus [%MW findEntry path]}]]]\ [widget ttk::button \ [wOptions \ -text [my getOptions [default -- find next] -findButtonLabel] \ -command [my getOptions [default -- {}] -findButtonCommand]\ -image [my getOptions [default -- [set ImgVide [image create photo -data {}]]] -findButtonImage] \ -compound [my getOptions [default -- text] -findButtonCompound]\ {*}[set buttonWidth [list -width [my getOptions [default -- 10] -buttonWidth]]]] \ [handler findButton]\ $fillNone]]]\ [widget ttk::frame [gmPack {*}$Pad]\ [> \ [widget ttk::label \ -text [my getOptions [default -- Replace with] -replaceLabel]\ {*}$labelWidth\ $fillNone]\ [widget ttk::entry \ $fillX\ [handler replaceEntry] ]\ [widget ttk::checkbutton \ [wOptions \ -text [my getOptions [default -- all] -replaceAllMatchLabel]\ -variable \ [my getOptions [default -- ::%MW::replaceAllMatchVariable] -replaceAllMatchVariable]]\ [gmPack -expand 0 -fill x -padx 3]\ [handler replaceAllMatch \ [hPostConfig { set [%MW replaceAllMatch do cget -variable] 0 }]\ [hMethods 0 {} { set [%MW replaceAllMatch do cget -variable] 0 } 1 {} { set [%MW replaceAllMatch do cget -variable] 1 } swap {} { if {[set [%MW replaceAllMatch do cget -variable]] eq [%MW replaceAllMatch do cget -onvalue]} { set [%MW replaceAllMatch do cget -variable] [%MW replaceAllMatch do cget -offvalue] } else { set [%MW replaceAllMatch do cget -variable] [%MW replaceAllMatch do cget -onvalue] } } get {} { return [set [%MW replaceAllMatch do cget -variable]] } ask {} { if {[set [%MW replaceAllMatch do cget -variable]]} { return } else { return "" } }]]]\ [widget ttk::button \ [wOptions \ -text [my getOptions [default -- replace] -replaceButtonLabel] \ -command [my getOptions [default -- replace] -replaceCommand]\ -image [my getOptions [default -- $ImgVide] -replaceButtonImage] \ -compound [my getOptions [default -- text] -replaceButtonCompound]\ {*}$buttonWidth] \ [handler replaceButton]\ $fillNone]]]\ [widget ttk::frame [gmPack {*}$Pad]\ [> \ [widget ttk::frame $fillNone\ [v \ [widget ttk::checkbutton \ [wOptions \ -text [my getOptions [default -- Match whole word only] -wholeWordMatchLabel]\ -variable \ [my getOptions [default -- ::%MW::wholeWordMatchVariable] -wholeWordMatchVariable]]\ [handler matchWholeWord \ [hPostConfig { set [%MW matchWholeWord do cget -variable] 0 }]\ [hMethods 0 {} { set [%MW matchWholeWord do cget -variable] 0 } 1 {} { set [%MW matchWholeWord do cget -variable] 1 } swap {} { if {[set [%MW matchWholeWord do cget -variable]] eq [%MW matchWholeWord do cget -onvalue]} { set [%MW matchWholeWord do cget -variable] [%MW matchWholeWord do cget -offvalue] } else { set [%MW matchWholeWord do cget -variable] [%MW matchWholeWord do cget -onvalue] } } get {} { return [set [%MW matchWholeWord do cget -variable]] }]]]\ [widget ttk::checkbutton \ [wOptions \ -text [my getOptions [default -- Match case] -matchCaseLabel]\ -variable [my getOptions [default -- ::%MW::matchCaseVariable] -matchCaseVariable]\ -onvalue [my getOptions [default -- 1] -matchCaseOnValue]\ -offvalue [my getOptions [default -- 0] -matchCaseOffValue]]\ [handler matchCase \ [hPostConfig { set [%MW matchCase do cget -variable] 0 }]\ [hMethods 0 {} { set [%MW matchCase do cget -variable] 0 } 1 {} { set [%MW matchCase do cget -variable] 1 } swap {} { if {[set [%MW matchCase do cget -variable]] eq [%MW matchCase do cget -onvalue]} { set [%MW matchCase do cget -variable] [%MW matchCase do cget -offvalue] } else { set [%MW matchCase do cget -variable] [%MW matchCase do cget -onvalue] } } get {} { return [set [%MW matchCase do cget -variable]] } ask {} { if {[set [%MW matchCase do cget -variable]] == [%MW matchCase do cget -offvalue]} { return -nocase } else { return "" } }]]]]]\ [widget ttk::frame $fillNone\ [v \ [widget ttk::checkbutton \ [wOptions \ -text [my getOptions [default -- use regular expression] -useRegularExpressionLabel]\ -variable \ [my getOptions [default -- ::%MW::useRegularExpressionVariable] -useRegularExpressionVariable]]\ [handler useRegularExpression \ [hPostConfig { set [%MW useRegularExpression do cget -variable] 0 }]\ [hMethods 0 {} { set [%MW useRegularExpression do cget -variable] 0 } 1 {} { set [%MW useRegularExpression do cget -variable] 1 } swap {} { if {[set [%MW useRegularExpression do cget -variable]] eq [%MW useRegularExpression do cget -onvalue]} { set [%MW useRegularExpression do cget -variable] [%MW useRegularExpression do cget -offvalue] } else { set [%MW useRegularExpression do cget -variable] [%MW useRegularExpression do cget -onvalue] } } get {} { return [set [%MW useRegularExpression do cget -variable]] } ask {} { if {[set [%MW useRegularExpression do cget -variable]] == [%MW useLineAnchor do cget -onvalue]} { return -regexp } else { return "" } }]]]\ [widget ttk::checkbutton \ [wOptions \ -text [my getOptions [default -- Use line anchor] -useLineAnchorLabel]\ -variable [my getOptions [default -- ::%MW::useLineAnchorVariable] -useLineAnchorVariable]\ -onvalue [my getOptions [default -- 1] -useLineAnchorOnValue]\ -offvalue [my getOptions [default -- 0] -useLineAnchorOffValue]]\ [handler useLineAnchor \ [hPostConfig { set [%MW useLineAnchor do cget -variable] 0 }]\ [hMethods 0 {} { set [%MW useLineAnchor do cget -variable] 0 } 1 {} { set [%MW useLineAnchor do cget -variable] 1 } swap {} { if {[set [%MW useLineAnchor do cget -variable]] eq [%MW useLineAnchor do cget -onvalue]} { set [%MW useLineAnchor do cget -variable] [%MW useLineAnchor do cget -offvalue] } else { set [%MW useLineAnchor do cget -variable] [%MW useLineAnchor do cget -onvalue] } } get {} { return [set [%MW useLineAnchor do cget -variable]] } ask {} { if {[set [%MW useLineAnchor do cget -variable]] == [%MW useLineAnchor do cget -onvalue]} { return "" } else { return -nolinestop } }]]]]]\ [widget ttk::labelframe \ -text [my getOptions [default -- Direction] -directionLabel]\ $fillX \ [handler direction \ [hMethods up {} { set [%MW up do cget -variable] [%MW up do cget -value] } down {} { set [%MW down do cget -variable] [%MW down do cget -value] } swap {} { if {[set [%MW down do cget -variable]] eq [%MW up do cget -value]} { set [%MW down do cget -variable] [%MW down do cget -value] } else { set [%MW down do cget -variable] [%MW up do cget -value] } } get {} { return [set [%MW down do cget -variable]] } ask {} { if {[set [%MW down do cget -variable]] eq [%MW down do cget -value]} { return "-forwards" } else { return "-backwards" } }]]\ [> \ [widget ttk::radiobutton \ [wOptions \ -text [my getOptions [default -- Backward] -upLabel] \ -value [my getOptions [default -- -1] -upValue]\ -variable \ [my getOptions [default -- ::%MW::directionVariable] -directionVariable]]\ $fillX\ [handler up\ [hPostConfig {set ::%MW::directionVariable 1}]]]\ [widget ttk::radiobutton \ [wOptions \ -text [my getOptions [default -- Forward] -downLabel]\ -value [my getOptions [default -- 1] -downValue]\ -variable \ [my getOptions [default -- ::%MW::directionVariable] -directionVariable]]\ $fillX\ [handler down]]]]\ [widget ttk::button \ [wOptions \ -text [my getOptions [default -- Cancel] -cancelButtonLabel]\ -command [my getOptions \ [default -- eval {wm withdraw [list [%MW rootpath]]}] -cancelButtonCommand]\ -image [my getOptions [default -- $ImgVide] -cancelButtonImage] \ -compound [my getOptions [default -- text] -cancelButtonCompound]\ {*}$buttonWidth] \ [handler cancelButton]\ [gmPack -expand 0 -fill y {*}$Pad]]]]]} #SearchBox .sb; # no need to pack since the 'top' typedlist creates a toplevel window
megawidget create scrollText { {*}[package require stext; list] \ > \ [widget frame \ [@ \ [widget scrollbar \ [wOptions -orient v -command {%MW text do yview}]\ [gmPack -expand 0 -fill y -padx 0 -pady 0 -side right]\ [handler sy]\ ]\ [widget scrollbar \ [handler sx]\ [wOptions -orient h -command {%MW text do xview}]\ [gmPack -expand 0 -fill x -side bottom]\ ]\ [widget [my getOptions [default text] -type]\ [wOptions -yscrollcommand {%MW sy do set} \ -xscrollcommand {%MW sx do set} \ -font {Times 12} -padx 4 -undo yes ]\ [handler text\ [hPostConfig [list eval set ::%MW::mwHasFocus %MW]]]\ [gmPack -expand 1 -fill both]\ [bScripts \ <Control-KeyPress-f> { if {![catch {.sb0 rootpath} path]} { if {[winfo exist $path]} { wm deiconify $path } } else { if {![info exist SearchBox]} { if {![catch {source SearchBox.tcl.oo}]} { break } } SearchBox .sb0 \ -title "Rechercher / remplacer " \ -labelWidth 15\ -findLabel [list Rechercher : ]\ -findButtonLabel " Suivant"\ -findButtonImage [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBI WXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1gQFEiQGzcQw7QAAAB10RVh0Q29tbWVudABDcmVhdGVk IHdpdGggVGhlIEdJTVDvZCVuAAABuElEQVQ4y5WQT2sTQRxAn+LJiMRK4oRAJH4AQ4QQpBcFLRIR W0IVrGHTgyyBgBShCJ6DYRGkRO1FGwnopabJpSDWQw9ewnrJZ9hLsmQ3uWQJLNnxVC3d/LEP5jL8 fo95c4Z/LJa10i/mc/fl5qufvtuyVpKe5/mO67rSdV3pOI50XVeWtZIsa6U7R3tnT4ps28ayLKye Ra/Xw+7b/NZ1vv/Yp2t2ebGxCXBwJPEJpJRIKfGQeFIiPUn8Wpx+v0/gfICu2eXpmgJwAHDOJ/Ak 1c9VvuzWAVhbzZLL5bgQuMhecxfHcRgOh0xN2KnuYBgGbb1FW29hGAa1Wo1k8gZXY3ES15PcW7r/ d973gq/f9mjrLTqdDgCVSoVEKk0mkyEUCjEajQgGg9MFs1i4dBmAaDQ6PWH14QNUVUUIgRCCYrHI 7cWbjMfjiVKfIJ/PE4vFSKTSJFJpBoMBC+ErKM9UTNP0CSYmKIqCoigAmKbJulogu7LMulpge+vt 7ISThMNhPm2/p95okl1ZpvB8Y3bCJIQQfPzwjnqjyZPHj+YnTCISibDfqM//g+N9/8NxwaH25vWt U+weAvwBJMy7D74rFGYAAAAASUVORK5CYII=}]\ -findButtonCompound left \ -replaceLabel "Remplacer par :"\ -replaceButtonLabel "Remplacer"\ -replaceButtonImage [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBI WXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1gQFEiUq5gdtTwAAAB10RVh0Q29tbWVudABDcmVhdGVk IHdpdGggVGhlIEdJTVDvZCVuAAACIklEQVQ4y42SX0hTURzHP7uZQZMQH+ZgOrCX3jTmVGJgRfUY FeKTd2kPMYSJSCCKUEmMxujNSoRaEAaBmHsRwlVIJIH/qNFL1EvewZjujy+7FLfdXw+y2+aM/MLh XM45nw+Xc742/sYXjoQ+8P9cGhudeFO1Go6ExDTNqmEYhhiGIbqui2EYEo6EJBwJXSxxyn5RLpcj m82SzWTJZDLk8jnW19Z4vbRIejvNrZFRgHhJUiUQEUQEE8EUQUyh5WQL+Xwe+3E76e00al8/QByg Zr8gGo3yYm4egL7eHq77/QhQZz/Bq9gcuq5TKBSs87byO8A8QjKZZGpqCoChoSGamppQ/Sq6rrO1 9YPa2lrqZs6WML9lSiQS0urtFBGRVColqVRKRERavZ2iJTXRNE0+Jz7JpooUviC/F7plU0UUDhPZ m4qR05wag2Pfuvm1+r7yFYrFIud9ZwgGgzidTpxOJ4FAgN4rlwHYGW+ugL9qANxWADY2NqT/ZoAG RyO7u7u0dXTR1tGF2+1mYGDgQPh74wU8s9yrWVlZkRuBQXquXWV+IcazmWkcDof19wfB7sBzlj5q wFubMjg8YsFPpx9VwKWUw/XBRRp8KuVNvDu/EOPJ44e0t7dXgDvjzXhmYfjlTws+6mq1CgdITWJ9 dRKYfLccF6/XWyHwzMKmCvXBOxZoFci2V6GqJrpcLuvbNM1/vmxpr1ywHHlw/xyHjKIoywB/AHbf HIE0q/ujAAAAAElFTkSuQmCC}]\ -replaceButtonCompound left \ -replaceAllMatchLabel "Tout"\ -replaceAllMatchVariable [set ::replaceAllMatchVariable 0;list ::replaceAllMatchVariable]\ -wholeWordMatchLabel "Ne rechercher que les mots entiers"\ -wholeWordMatchVariable [set ::wholeWordMatchVariable 1; list ::wholeWordMatchVariable]\ -matchCaseLabel "Respecter la casse"\ -matchCaseVariable [set ::matchCaseVariable 0; list ::matchCaseVariable] \ -useLineAnchorLabel "Utiliser les ancres de ligne"\ -useRegularExpressionLabel "Utiliser les expressions régulières"\ -directionLabel "Sens : "\ -upLabel " En arrière"\ -upvalue -1\ -downLabel " En avant"\ -downValue 1\ -directionVariable [set ::directionVariable 1; list ::directionVariable] \ -cancelButtonLabel Annuler\ -cancelButtonImage [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAA CxEAAAsRAX9kX5EAAAAHdElNRQfWBAUULRDsX0JHAAAA7ElEQVQoz72QMUvDUBSFv5qCg6PgLLhU MlToLDg4pdTxDM7S/APHtH8j/0DeKPqydPEHZHx0kKCQITo4SdWlPIeXlOoqeJbL5Tvcc7jwV0Vh KIvzeN89tNvspDiOug2A69c7L69ZwPK3Xk+B7ITxfPCFYA7A/IoXOAyk355ITX7GBazgkpoFpAH0 uhAl3J+zB6xYwNjYHxFgbGRr+uxSE9kObxk0WCdDPvy7H7JONPhl0JSlqCg+i7cKwVLTLYMyclFR wojTkgpBrmxTUr7FY2ND3RFHGEyv/WTcuEkDqbkBcI9x00wcpK7kP/QN44JSLNJT/ssAAAAASUVO RK5CYII=}]\ -cancelButtonCompound top .sb0 findButton configure -command ::%MW::searchrep'next .sb0 replaceButton configure -command ::%MW::searchrep'rep .sb0 cancelButton configure -command [subst -noc { event generate [[set ::%MW::mwHasFocus] text path] <<HiliteRemove>> wm withdraw .sb0_ }] wm protocol .sb0_ WM_DELETE_WINDOW [subst -noc { event generate [[set ::%MW::mwHasFocus] text path] <<HiliteRemove>> namespace delete .sb0 destroy .sb0_ }] %W tag config hilite -background yellow proc ::%MW::searchrep'next {} { set mw [set ::%MW::mwHasFocus] # set mw [string range [[winfo parent [%MW rootpath]] select] 0 end-1] $mw text do tag config hilite -background yellow foreach {from to} [$mw text do tag ranges hilite] { $mw text do tag remove hilite $from $to } expr {[.sb0 matchWholeWord get] ? [list [.sb0 matchWholeWord ask]] : ""} set cmd [list $mw text do search -count ::%MW::n \ {*}[expr {[.sb0 useRegularExpression get] ? \ [list [.sb0 useRegularExpression ask] {*}[.sb0 useLineAnchor ask]] : ""}]\ {*}[.sb0 matchCase ask]\ {*}[.sb0 direction ask]\ -- [.sb0 findEntry do get] insert[expr {[.sb0 direction get] < 0 ? "-" : "+"}]2c] set pos [eval $cmd] if {$pos ne ""} { $mw text do mark set insert $pos $mw text do see insert $mw text do tag add hilite $pos $pos+${::%MW::n}c } set pos } #-- Replace the current instance, and find the next proc ::%MW::searchrep'rep {} { if {[.sb0 replaceAllMatch get]} { ::%MW::searchrep'all return } set mw [set ::%MW::mwHasFocus] #set mw [string range [[winfo parent [%MW rootpath]] select] 0 end-1] $mw text do tag config hilite -background yellow set pos 0 if {[$mw text do tag ranges hilite] ne ""} { $mw text do delete {*}[$mw text do tag ranges hilite] $mw text do insert insert [.sb0 replaceEntry do get] set pos [searchrep'next] } } proc ::%MW::searchrep'all {} { set mw [set ::%MW::mwHasFocus] #set mw [string range [[winfo parent [%MW rootpath]] select] 0 end-1] $mw text do tag config hilite -background yellow set pos 0 while {[$mw text do tag ranges hilite] ne ""} { $mw text do delete {*}[$mw text do tag ranges hilite] $mw text do insert insert [.sb0 replaceEntry do get] set pos [searchrep'next] } } } } <<HiliteRemove>> { %W tag remove hilite 0.0 end }]]]]}
# The toolbar definition, a big typedlist whose :
# first type is toolbar,
# second type is barre
# third is groupe
# forth is element (the second member of it is a wegawidget to be evaluated)
set toolbar { toolbar \ [barre "fichier-impression-édition" \ [groupe fichier \ [element "Créer un nouveau fichier" { [widget ttk::button \ [handler nouveau]\ [wOptions \ -text "Nouveau" \ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBI WXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1gcYDTY4hvhMSgAAAB10RVh0Q29tbWVudABDcmVhdGVk IHdpdGggVGhlIEdJTVDvZCVuAAABz0lEQVQ4y6WRTWsTURiFn/femQlpzRdtDDJprJsKdicFF10o uOpPUPBfiODCZbEEwf+gG11WN7qrmI0FcSGiTelCqR8EnWYQkjTJ3NfFtLRji58HLtzNee655wip Fleayy0yckzmBpyciqhXtylORFQrnZeTeffa2hNPrV9pWa/0WQBWmst64/rNrH0cMe4/J/n+gFHv BcnwPQBiy7t+UNnygtpD6xXve4dNURShqpAMMboB0VXQXcBRPvsNgO7GVG7Y754bDj7cKlQudzIA VUWdA/qIbqE6pjT3EUH3QFCe+4QC8WbDgl40GYBTFAc6wLgdQPfOsRJEzmQATh3OgapBxSdXWCRu 10HkUEqI2yEThfMjES9njnxBFed8EmbA1AGD2OpBFhEQi/VKPTBfjwUkEjByMwzNAohFk4i43SBu NxDxAIuY3BsR08qW6Fz6khrGVBG3QFC6S7c9S75yDVDizdNsd68wP71zD1j/qYM0QSqfESEDd4Fx 8RE9XaKnS5Rmn/Dq3SmAx8Bbj1/KJ5FpEsqINtIWgpBO9Azgi1dbdb8BABggQPfnlDxODV5t1QH8 AeBg9nQEOYL/L2UShGH4z4C15p3bl/7Ct7Z/+QEaBsWReLF9uwAAAABJRU5ErkJggg== }] \ -compound top \ -style Toolbutton]] }]\ [element "Ouvrir un fichier" { [widget ttk::button \ [handler ouvrir]\ [wOptions \ -text "Ouvrir"\ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gkWFgcEIFayvAAAAB10RVh0Q29tbWVudABDcmVhdGVk IHdpdGggVGhlIEdJTVDvZCVuAAABsElEQVQ4y6WSS2sTURzFf3c6giWktRql7roLqIv5CA1FtBtd pC+6cVGQItFvIz6w0l1F+gG6qa0WxFUIgQhu0hJd9arptJ1mHr33uhgbcjsJFjybC//nOf97xJPK 8q6UcoJzKBQKX188f3Wbf8CVUk5UKo9wnKFu8CTo8GZl7RYXgAsQxyG7e00wBmMMN67fBGB2vmwG NY6NXdl+/XKl5AKEYUQQnKQZA99/tJgp3yOKIwQOCGE1x3HCxsanyS6DXjQae/h+ANT7bh4fv4rn 3bEl9ML3A96/Wx+oeW5hJnsDpRRJEluHbLd/9dF9DYAkSewBWmvSV3UTtVotM6BUmiK9WcceEEUh nU5oFXuex4W/ceiSSxwlVmJn5yNvV1dRSmWaNje/kMvlWFicWxOz82WTz+eRUlpFDx/cpVgsMjKS 50zmqTrFGDBa8WHrM9VqPWXw7OkSxmQ9c3zs02w2EOd8ADB9f4pqtS7d1DuGVutbX42O42RiWmsO DnyAIxeg/fsno6MFi8XZVpuY+RsTHB76AL54vLy0tb8vJ9PJA62P44geBobh4ctHWutF/hd/AExB ukCW3MYjAAAAAElFTkSuQmCC }] \ -compound top \ -style Toolbutton]] }]\ [element "Sauver le fichier en cours" { [widget ttk::button \ [handler sauver]\ [wOptions \ -text "Sauver" \ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gkMFDIjG02m9AAAAWJJREFUOMud0T1LQmEUwPH/vdwX UIS4i0XXEAqHhCCqtQ8gTU3imIhfoKGWIBeD6AX3hCAqGpqCBqeWlhpqsSUKvQ0JJbdueikTW9K6 vteZnuc55/x4Dkfwh5IHQBjgWFumn5gvJuvHQwkIp9eiuFSJiexpX0B6NArAwtJOWKo/Hp3nmIxk +gJO9rPMTQ0DIDUnC4VC12av1+u4OwBZltE0rStQqVQ6AwCGYXQFfD5fd6C5oFe0AC6X6//A4u41 fw0HYD/neDcfOharAzrB8SB3hbcOwOsTkdkAbrcbAF3XURQF0zTJGwZ7Z/fcPo4wNuhpDwif5Ubz dmoTgI31LYrFItRqSLUPhKZfiQ7gO6vrestaFUVpO5YIcHWTJzDkaTTLsuwoqlarWJbVEUikdjOU X0wEQBRFTNMkFo0Ti8YplUrYto2qqoiigCCAJP4MIgD4Q8lVYGXGc9lzbRfW9O9r4gssDGODbsmD UwAAAABJRU5ErkJggg== }] \ -compound top \ -style Toolbutton]] }]\ [element "Sauver le fichier en cours sous un autre nom" { [widget ttk::button \ [handler sauverSous]\ [wOptions \ -text "Sauver Sous" \ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gkMFDMPMI77VgAAAepJREFUOMuVkT9oE3EUxz+/H3cX TIhI8C9eNKAUaUGoWkQQN5fiIDoYu1iMobPgoCCCXaKIxkZwEQtFoRoTJ8GhS0NrFx2slhY0KNdT 6tEknsY0akzOKbGXP4pve7zv5/ve4ytC/bFxIAzwOHCBdpWpSgB2iRqbJBwrxOqjBwoQHr0SwetR 2D3/tAW+lZzm1Mg0xtQjJlMjHD5+kNEdEQBOn78bVurC5IxB78CEC749uIbBxDPMzD1mF5YBWOq+ ypOZjxzZuxUA2bzRsiwsy3LBr97m+Tyfpu9EnI2hPTiO09Arq2FVVQkEAgAYcj+vJ6cw3iyTm0tz 9GKGDdt7qVQqroUtF5imyZ3oWrJLeR6mUuTm0hw4k+S7XI9pmjiOgxCi/QUAwWCQs+M14iezja1/ qxYDr9dLrVbrCDTPXAbnxmb533IZlPMGP+wPHcWedTo93T28s751MPiaY+BQFz6fDwBd19E0Ddu2 WTRN7mfek/20jZ2b/e0NxK+VBnwzcQOA69fiFAoFcBwU5yei6SpXjPV0dF13xQqgaVrbtyTAy4VF urb4G7Cqqi5RtVqlWCx2NBhOjE2w8sVGAFJKbNsmGhkiGhmiVCpRLpfxeDxIKRACFPnnEQEQ6o9d Bi71+V/8M7bnxX2r2+HfvP+vtN9RGaQAAAAASUVORK5CYII= }] \ -compound top \ -style Toolbutton]] }]]\ [groupe impression \ [element "Imprimer" { [widget ttk::button \ [handler imprimer]\ [wOptions \ -text "Imprimer" \ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gESDwQidZMg6wAAADV0RVh0Q29tbWVudAAoYykgMjAw NCBKYWt1YiBTdGVpbmVyCgpDcmVhdGVkIHdpdGggVGhlIEdJTVCQ2YtvAAABcUlEQVQ4y8WSvy9D URTHP7feky4o/0AxsWHBLFEkFokI6dqkERIWEbsEC4nJJhGrsUOlxIQQHZmkGFvt6/B+0OcdQ5VX T5AYfJM73HPP93u+95sDf4TyX9KZ1Dqw9ANnZ3hoLPnlSzqTEsex5TukMynxc7TPIka5TKl0Szgc DgxoaW4N1EJ/zSDgwLItTMukUqkEm7XGYG1tY7UN6DOM8qFC4TgOruvivXj1VhtC2LYNwPLKkkQi LRPASQiYy+XuDuMzcUzLpJDPUywWKTwW6o5RMrBMC4D4TJxc7u4AmFPJ2YRsbW6jlGJvf9cRTxp0 XUdv1HVN8/1Q4Pn5iabmJkZj44gIC4vz1Qw0TePy8oKpyenwWy+Ih0iNKyAKlAcC2ewVPT29HyG6 boWOznYs2/xV8h2d7bUxVYH7+wfOzk/r7AbhKyrFQP/gh8BV9gJE6Oru/k7hHTfXN1WOfw9iI7Ff L080GuX4+KhqJjmbEP4Tr7/OtONaCDS8AAAAAElFTkSuQmCC }] \ -compound top \ -style Toolbutton]] }]]\ [groupe edition \ [element "couper" { [widget ttk::button \ [handler couper]\ [wOptions \ -text "couper"\ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAKABpAOmWInXJAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gcRDwEkfHIr1QAAAWFJREFUOMutk79LAnEYh59CbBF0 KMqQqCESkrgM1Dl3oc7zCnIKrKSlpTEIK/8Bs4ZaqiG5HByi/gQVySVoadDS1KOtmq/lDDs8Hepd vu/7ft73+f6G/zRJFp2SLGommibJomDMDxridb1YMDS349V+gETyIAFQNuTLycQewG4/AENWK8HF 4M+skiwKnlkPX58fXbdtBNy3WirCnAeHw9FeRTm+EaNSeQXI9QOkr5UbHHY77hk3kiwKAX8AVa3z XKkBnPcDlKovVWw2G1MTLoByJLyE2myQL+QBSj0BSibbAMb3D49wjg0D8N6skz67eAPmdf2XDZjc +RqwA3iBGpBUMtl0t1qLoelSDx+Ax63N+NPJaVoVl8Mx4FjXokome9X1pS0seEOapvklWdSKxUIK oFgspIya6Rnc3eYKwDSAz+ff7hw7NVPAyKhr0uyfmGmWDj8aWQnndT9kqOul/c2+AYM5e2TGPMA+ AAAAAElFTkSuQmCC }] \ -compound top \ -style Toolbutton]] }]\ [element "copier" { [widget ttk::button \ [handler copier]\ [wOptions \ -text "copier"\ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gETCToqhryocwAAAK1JREFUOMutkk0KwjAQhZ+QCxXE AwgueiB/0IXJIhLjgVwIHkCayZHqpglSJtO0+FaBDC9fPmblvL0C0JCjT4eLYW+ct/1UnLd9qVml w+v9ZAd221ZEywXrZoMlyQVd/PyPIFCHQAEAQCFmV5xYloAo4rg/iy/fHzcNwLAE6dUasaKDGrGK a00ENWIVAD38ZxnBsKJmvJ1zCIqZ5YDLmIArFAumtlAqKIr9nQGAL0ezaR+0HlviAAAAAElFTkSu QmCC }]\ -compound top \ -style Toolbutton]] }]\ [element "coller" { [widget ttk::button \ [handler coller]\ [wOptions \ -text "coller"\ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsRAAALEQF/ZF+RAAAAB3RJTUUH1gQFEjM27p6E1wAAAYtJREFUOMuNk79r02EQxj/33Gua SWqlILaCiCiIOImhsV+UdHVUtEIhIOgmdBChf4BBKnSug2vaRZTiFGjtkEJjJNEt4j9QzBIwFKv9 MaRfTZvYfp/p7rh77u557zUO4dr1G4+B+a7Qk6/Vymv+A5ub1H1gIQ68+XyGtx9WSafTtNttHt27 xd2rP7prHkwXdxZjR8BCvlAmXyjTPP+U3YEhdrb/8L1RR4IWw5zOzRLndDeLCQDYahRZKq2xUnrH 9u8Wg4Mn+dnaYKX0nlfzi2w1in1XCN3OVG6UiTsPe5KmcqMcpcFuvlA+0GHp2ymamykS4GPoF21u pnj+bObY6pezL26HoxJq9U+YHHchOe6OTMjFxQuXejU4DA+BWq2OScgMmTAZY2PZ/iL2KBwCmUwG lyMXMnWmkCck8BNUq1UkYWaYOlOMj0fJJ8jezOLqaCD5vq1kBB6cynoFMyEZURT9JUm4QiCKos5L KN5f/QlSlyf/VX5ZBmDk7Lljb6HnNwL8ujINA0NJLnFjDzcHYFcB8qBPAAAAAElFTkSuQmCC }] \ -compound top \ -style Toolbutton]] }]]\ [groupe undo-redo \ [element "défaire" { [widget ttk::button \ [handler undo]\ [wOptions \ -text "undo"\ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAuHAAALhwGTQIdTAAAAB3RJTUUH1gQFExU5vD1wVQAAAcBJREFUOMulk81LVFEYxn/33DvR KERWgrSRkDYG0ipo0R+Q4SJcKIncgTDJHGJWLachaHuJIXAcwnu1iDYKiS0icSEELYwIMkYRmhAE myimr4tzPa+Laa4z6shE7+58PL/3fTjPgTrlOggNlPof8YEA10HskTeN6rH2iW/OA8G+SVYi6tz9 Ub3MYZ7FXxAppkR+PxMpfRDZWhIpfRQpXBbXQVJpdWuvzqjp7D+vMtcG5unyNJELECzjZfrIW2o0 GdcPK9dM10HsoSxsLdai5SfID1AnQRfgSBfnO0t8ervU3dmjni6+kK8AVt5Sw152KGMP9rCWmz3Q XseZFmh5DNFrBEGWJlMGgGRoIZVWN9oDnbEHr7CWm6Pj7CU42vvXygkwmtEolHkc/Gm8iTSxRFlr VLpUQ9BFvCe7lrSGfvsR0egxUBbe2NUQEOYgGdfjeUsNe1NzYJ4CIJbAiCUwfpm8e/3qOsgfEL9+ kELI5EzNpU1T3VnfAIxm2F4/PIkVSPXevbh+WX6ZIoUv3+onsRoCjIfrtOoj0LD9mdXV9/hwl38p 10Hke0Jk86Ls/WhWI4AN03jgTTi3AXIR1Qo6PNsBOQfAIQY63fcAAAAASUVORK5CYII= }] \ -compound top \ -style Toolbutton]] }]\ [element "refaire" { [widget ttk::button \ [handler redo]\ [wOptions \ -text "redo"\ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAuHAAALhwGTQIdTAAAAB3RJTUUH1gQFExQJg/9xuAAAAahJREFUOMuNkz9oE1Ecxz8XQ9Rk k1zcFUJpoY5BcFFB6NKCS+CCdmi5WLTg5h9QcHErKEQsASkoqCgiOdNFJKWC0KHQILHQhraoJEaj IeaKFy65PgebeMkl4d74vu/zfb+/4OKMJ32in+bB5eln4trgweRKTxNvn9+GgU/2OyE1uXcxA5wR mmpKg0K9PJ70iScVRZQbeVE0P4ofjQ2RM1JiSZ8TO/UPwh6J1A0DibsXXiJ7wxQaa3jwUtsrsWuV 2++GDp7j6uOzaKopSTY4DGxMRWc56VcpNXNYosEvawdz748j0qPNE9x5pXTUICb0w4weOk/V+spi 7SbF7UrPNCOywnxGAYjbDW5fmr4CwKPPMcKeMULBTjD7c5FIUOFF5iFAXFPNZEcXjvlOka5dJ+wZ I5V+DQGjrU2cVv7BS/9hxxw0qeOvHie/tQkBI6upptRqmf/AEQfsMPhtfQNg/csqwDW79uxdwgE7 DBaWbxGSQwBoqvm2q3YOuNtgpFzQqQu91dZoS9hPJTlwFzTVXAeofjeYid4AeO5mR7p3QX7z/mlr 5O67MfgLr36xHQjcVi8AAAAASUVORK5CYII= }] \ -compound top \ -style Toolbutton]] }]]]\ [barre "style" \ [groupe police\ [element "Selecteur de police" { [widget ttk::combobox \ [handler policeName]\ [wOptions \ -width 30 \ -values [font families]]\ ] }]\ [element "Sélecteur de taille de caractère" { [widget ttk::combobox \ [handler policeSize]\ [wOptions \ -width 3 \ -values [list 6 7 8 9 10 11 12 13 14 15 16 18 20 22 24 26 28 32 36 40 44 48 54 60 66 72 80 88 96]]\ ] }]]\ [groupe justifier\ [element "centrer" { [widget ttk::button \ [handler centrer]\ [wOptions \ -text "centrer" \ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gQFEjYX34BgzAAAAB10RVh0Q29tbWVudABDcmVhdGVk IHdpdGggVGhlIEdJTVDvZCVuAAABLklEQVQ4y6WTv04CQRDGf99wlj7JhRdRSPTwT+SuwlBIY2JB SIiVISEklmKhvWBj8JTnMMFLfByLPQ7UlYBOstmd3Z3vm292RwD9Qe8aaALbrG/NTrt7H/QHvVZl p3oRhmU2sSyb3QFbAXAThmXeP968F2VCMgSYSkggGWFY5mWaDoPvAa/pdCVz7SBCssL/AVCp7oIJ wxw7QhJmbkb6HcDMAJFOUi/74fERAj+AmTkmGfvRHpLyYcXaTAjnewEmT89rvUCcJD6AElEtwgrm pQxy/ZanLvNKcOnNAcbjxy+sSZIguXO8EmSwpPekXkdy+676hmlRaK8ESYweRiv1NxqnyAcw1xjH MTJDyKVrjlnY4n8s4gmAqyybXf6hFwDOlXfjGTBkM2t12t1b/mufptE0XTWKobMAAAAASUVORK5C YII= }] \ -style Toolbutton]] }]\ [element "aligner à gauche" { [widget ttk::button \ [handler aligner_A_gauche]\ [wOptions \ -text "à gauche" \ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gQFEjcdJk64kwAAAB10RVh0Q29tbWVudABDcmVhdGVk IHdpdGggVGhlIEdJTVDvZCVuAAABKklEQVQ4y6WTwUqCQRSFv3O0ZU/y44tYmhhpaGAbF7kJWogg rUIQoWW2qAdIoqIsnyMwocdpMaZmU2gdGIZh7nz3nssdAXR7nXOgDmyyuuqtZvs63e11GtvZ3EmS ZFhHk8n4CthIAxdJkuHt/TUaKAvJCLBSSCCZJMnwPBr204vBL8PRN8BOIT97hIQVgJ/6AtjKZREC C+OQHSEJO+z8BohVsKxSuRQH2CZfyGEZSQtrfraFCOco4PHhKZq1vF8OEIwdbEQAKYq7xWmTliqY +ve0dDlqQdzd3q80A7XaYQQgs1cuLVRgJGY9QcYKVuEHC4ObweyielCdeV5upmIASVQqlRBgI8LQ 4JBZeD4f8/ekgbPJZHz6h78AcKzpbzwC+qynRqvZvuS/+gD+wTRHRQnRRwAAAABJRU5ErkJggg== }] \ -style Toolbutton]] }]\ [element "aligner à droite" { [widget ttk::button \ [handler aligner_A_droite]\ [wOptions \ -text "à droite" \ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gQFEjctAJeIPwAAAB10RVh0Q29tbWVudABDcmVhdGVk IHdpdGggVGhlIEdJTVDvZCVuAAABL0lEQVQ4y6WTz0oCURjFf+c4LXuSwReJIgP/QYKluchN0EIE aRWCCC2zRW1cm0EoPUdgQo/T4k5j5AhaBwbunTvf73xn7r0CGAz7d0AL2Gd7tbqd3lM0GPbbhwdH 13GcZxctl4tHYC8C7uM4z8fne+aHspCMACuHBJKJ4zzzt9ko2uQgCSFmr/O1tWKpmI7XAEJgYYws CicFJGELBXskZwNsZzr+VqVaXQfYRhKFk+PQfvo4HdtChPkGQFi0BDLTyXNmB6e1WhYghwjF346V SjlAk/xOssvOAojp5GWrM1Cvn2UAZEqV8o8OjBTeK4lkhaigDRGSbXJSLJxu33g8TouajYt1gNJC ITv9Hzg4N86bq/OxaoAIuF0uFzd/uAsAV0pu4yUwYje1u53eA//VF0RwNHxq/wS4AAAAAElFTkSu QmCC }] \ -style Toolbutton]] }]]\ [groupe indenter \ [element "indenter moins" { [widget ttk::button \ [handler indenter_moins]\ [wOptions \ -text "moins" \ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gQFEisIreQBJQAAAB10RVh0Q29tbWVudABDcmVhdGVk IHdpdGggVGhlIEdJTVDvZCVuAAABXklEQVQ4y6WTu0oDYRCFvzOupb0JVoJRWBZ8BsFC0UbFQCR2 FqYRBDXGC5J4iRFLtdAHULygKD6HEFds0kl8DYvdrAlZxeBp9sI/35wz/COAcmXvGFgAevi7FvKr GxdOubKXmxifXHZdj07k+9VzoNsBTlzX4/X9pe3QZ/2TZF8SyRBg6kICyXBdj6fnx1On+XCc6h/1 2P8D/UMARIBEMgGAEJgwDJkQQhJmwRMJySKQ00w1M3a2ixRLO8jE/d3DjzNYWym0AhrFjXdJTM9M BfnV5ILgu81Bo7gBQMbt9c3fHezul9gsbAWAsGs6PRs4CPNbmF0WMwMzcVDeZz1fiBxcXV62dM1m 57FwkO0ABUWVo8Mws5GZy0RukGEK4xEDqNVqHd3E0ZGxVkAqNRh1kxlC+G9VPG8YEwj7vh/fBnCA ku9Xt+J2Idnb99suACwp3MZF4JTOlMuvbpzxX30Be85KsJbNCAcAAAAASUVORK5CYII= }] \ -style Toolbutton]] }]\ [element "indenter d'avantage" { [widget ttk::button \ [handler indenter_plus]\ [wOptions \ -text "plus" \ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gQFEisjAVj4ZQAAAB10RVh0Q29tbWVudABDcmVhdGVk IHdpdGggVGhlIEdJTVDvZCVuAAABYklEQVQ4y6WTTStEYRiGr/txLO2ZZqV81OmU36AsiA2iiJ0F G6UwGR9jmHFMWWLBDyAfEfkdahzZzE7jb1icM2dmmkMm9+bt/eh67vvpfQTglwonwBLQxd+1lNnI Xjp+qbAyPjax5roe7SgIyhdApwOcuq7H28dry6Ov6hepdArJEGDqQALJcF2P55enM6fxcZKqn9XE 877eQQBiQE+qBwAhMGEYMiGEJMzCFQnJYpDTSM3nDsnl9zAJmXi4f/yxB5vrW80As5Ca293nsJBH ElPTk2F+Nbgg3Lc4qAEAtrO7FP0idze37TjoiC99v4gkZmdnQgdRfouyyyzJQWjr+PgoapZxfXXV VHVhYRGLGtkKkOGX/DivZMzNz2FRD5BhqkVNAFQqlbZ+4sjwaDOgv38griYzhAjey3jeECYQVv8f dQM4wEEQlHeSZiHVnf5tFgBWFU3jMnBGe1rJbGTP+a++ATGdSuStbu4kAAAAAElFTkSuQmCC }] \ -style Toolbutton]] }]]\ [groupe formater \ [element "gras" { [widget ttk::button \ [handler formater_gras]\ [wOptions \ -text gras \ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gQFEjkA28v5xAAAAB10RVh0Q29tbWVudABDcmVhdGVk IHdpdGggVGhlIEdJTVDvZCVuAAABl0lEQVQ4y6WTv06TYRTGf8/z1qWJSa+BFpYvvYf+czE6Sq+A QRYSMYSEOBkSQuIoDnoBOCuMaEKnDv3LB94AMFCCDmrJ18GhpWL4SESf8eSc3znnfZ8jgI3N9VfA AnCfv9fC6srau8zG5vrio4ePn0VRkbsojvtvgXsZ4HUUFTn40klNlIVkBFgBCSQTRUU+7n7YytzW QRJCWJ4WIWGNgVe6ARACi/3P++ztfQKg9qBGpVJCY9IfAF8vto1sfn7/Qa/Xm8a7nQ7D4SVywDJO A9hGEsHm9OSUweCcXC5HNpvl7GzA8fEJwSI4EHwLwA7IptvrA5Av5JnJzwDQbrW4HCbTKVMA4/G+ XXzl6PAIgNlCgbnZOQD6/QNGoxGSsFMe0RbCxPEhSZIAsL39fpqYJAndbpdyqQRSCkAGmVa7DUC5 XKZaqxAc2NnZpdFo0Gw2qVYrQBrAAUksP1/+/fcYW8zPP6Fer4+9MfHHDYB0ZRohe2IigY0nMCyM r29ABngZx/0X/3ALAEuaXONTYIu7aXF1Ze0N/6tf6mBso7lqg2QAAAAASUVORK5CYII= }] \ -style Toolbutton]] }]\ [element "italique" { [widget ttk::button \ [handler formater_italique]\ [wOptions \ -text italique \ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gQFEjoBh+GakQAAAB10RVh0Q29tbWVudABDcmVhdGVk IHdpdGggVGhlIEdJTVDvZCVuAAABpklEQVQ4y6WTsWqTYRiFn3O+SJuCS2hChZhewE/WrAbsJHoZ HYxixKEUipMUSopjk0HvQhHsUA2CBeMgxICQO0gTaaM0SVOoQ2Kq+BesPvN7nu/l47wC2KpsPgVW gav8PavraxvPE1uVzdLtW3ceRVGey9BqNZ8BVxLAThTl+fzlU+ygLCQjwApIIJkoyvPy1Ytq4qIX JCGE5VkICWsi/MkfAiGwMEYWtZ0aZ2fwoHwfTUy/Cfxr2DayCTIOovGhwXwyyeHRIcPhEDlgGccJ bCOJYGOb/tE36m/rFIs3mJ+bo9//TrAIDgRfILADmgoajY8sLV3jei5HKpXia6+HCLMtYwST9YLM QeeA/ff7rKzcJOHAYjpNt9fj9HSMJOyYT7SFMIPjY+r1d4xGI6rV2mywUChwcjJmIbkAUoxABplu t0ez2aT8sEw6vUhwoN1us7f3hvF4jIOBOIEDkni9u0uxWGR5OYcwtshms3Q6HQaDwbRUMQJpUpp7 pRKypyUS2GQyGbYr2+f9OM+TAJ60Ws3H/3ALAGVNr/EuUOVylNbXNmr8Lz8A/spwXbbDEEoAAAAA SUVORK5CYII= }] \ -style Toolbutton]] }]\ [element "souligné" { [widget ttk::button \ [handler formater_souligner]\ [wOptions \ -text souligné \ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gQFEww7yTO4YQAAAB10RVh0Q29tbWVudABDcmVhdGVk IHdpdGggVGhlIEdJTVDvZCVuAAABuklEQVQ4y6WTQWtTURBGzzf3VaEPIVJ3LQaEbHx5ae2yLkUQ Mf6LGFsUwWIpFFdSiC0urWK6yH9Q/BEB28SXxLTUnSVkl4UNiSHURdKKNJEWD9zVHc58AzMCyG2s vwEywBXOT2Z1ZW3by22sLz24n34eBCEXoVqN8sCEB7wNgpBKvTSyUCYkQ4DJIYFkBEHIp88ft7xx HZrNJh/e5/G8CZ48XWRq6hpImAbCE+xMR4TMqFW+cXwMvV6PWrWOmeHM0PCNFNjws/3ziCiqEI9f JxaLUSqV6XS6yBwmw0YlMDMk4cw4/HFIq9UimUwSpkKazSaNRoNf3Q7OHM7GCMwcR+025fJXnHPc TAakZlMA7HzZweSdpjzB+yNwCNHr9qjX9+j3+2y+3jwtjKIK6fRDJI0TCGHUajX6/T7Zx1lmpqeR xMHBdwqFAuVymdsLC1y67I0YQYNou7slYldjJBIJJv1JfN9nbm4W3/cpFouYM2zsCBLLL5YHMoGw QTKJXC43iC8hdFYgif29ffL57X+u8KNMlvn5W38JXlWr0csgCInP3ODunXvnvQWAZxpe4yKwxcVY Wl1Ze8f/8hukRn9/TCvn/wAAAABJRU5ErkJggg== }] \ -style Toolbutton]] }]]\ [groupe "unicode"\ [element "caractères unicodes" { [widget ttk::button \ [handler unicode]\ [wOptions \ -text "\u221bx" \ -style Toolbutton]] }]]\ ]\ [barre "Tcl/Tk" \ [groupe "Tcl"\ [element "console" { [widget ttk::button\ [handler console]\ [wOptions \ -command {console show}\ -style Toolbutton\ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH1wIBCh8lilrtPQAAAqBJREFUSMe9lUtIVFEYx393Xt6Z OyOU7QIFk7ZlEbWsNhWUltCmojAhhBSsTSS9H2Na7XrZE6Jd9FAJDCyqbahLbZOQYAaTY3Nn7rnv 00IbmkYjG+uDj3PPg+93/n/47oF/HArAvfu3zzqO0y6lDC1KUUVxw+FwsungodMhAMdx2ut21IdU VV2UW5umGert62kHZgBSypCqqjx4+AgjZ5RUPKbFaNy/jx9uFFiSSqWIxbSSAKlUqmBeADByBmVq tCTArw4UAoSBMh0sDSAKAYGfJ7kS/Z+rRoECIQRfp6ZYWVPDtq1buH6rG9d1FwQQQsyvIJ1OIyXs 2lnP2tpaWpqbUZQAUvLHmU6n51fwcWyMqW8ZWtuOcufmDdbUrubA3j1c6OwioCgogZn7SN/H832Q Es/3cF0P27ZxHIfpqa/zKwCIqiqGYdDadoRP4+Ns3rSRtpbDZLNZ9EwGPZMhm80iDAMhBLZl43se oWCQ6ByNWvRrEKY5M1oWUkoAXM/Nry80igCRSITyRILuG9eoqqzk5cAAly5fJRKJLA7Atm2S589S U13Nm7fvOH7iFBUVFRxqasyfudDR+feAYDBI9917CCE4duIkABVLl7K7oSF/pqPryt8DPM9jcGiY waHh/NrI6Cir1q0v3aJEXEMYuZI6ORHXigGKorimaYb6X/QVdeJCIxqNYpomiqK4eUA4HE729vUs +os23375xeS5x897npqfJyd8XdelZZnStm1pWZa0LGv225S6rsvPkxP+s+dPrDPnTvYAVUC86E3+ VSWwrK5++4bqFdV1mqatKCuLLFdVdUlcmzE4m8saQohpIcxJXdfHRkc+9L8aeP0e+AKkAP93gB8R BtRZoAZogUAgDgR83xdADjBm05xNn/8d3wFA7k6pX+fnmwAAAABJRU5ErkJggg== }]]] }]\ [element "NamespaceExplore" { [widget ttk::button\ [handler NamespaceExplore]\ [wOptions \ -style Toolbutton\ -text namespace]] }]]\ [groupe "Tk"\ [element "WidgetsExplore" { [widget ttk::button\ [handler widgets]\ [wOptions \ -style Toolbutton\ -text widgets]] }]\ [element "ImagesExplore" { [widget ttk::button\ [handler images]\ [wOptions \ -style Toolbutton\ -text Images]] }]]]}
# Then the toolbar megawidget itself
megawidget create ToolBar { v \ {*}[ typedlist create toolbar typedlist create barre typedlist create groupe typedlist create element set pseudoWidget [lindex [info level -1] end] set is [list {type obj} { return [expr {(![catch {info object class $obj} class]) \ && ($class eq "::typedlist") \ && ([$obj type] eq "$type")}] }] interp alias {} is {} apply $is set tree [namespace eval [namespace current] [my getOptions [default --] -toolbar]] set B [] menu .toolBarMenu -tearoff false if {[is toolbar $tree]} { foreach barre [$tree get] { incr b if {[is barre $barre]} { set Barre [lassign [$barre get] barreName] .toolBarMenu add cascade \ -label $barreName \ -menu [menu .toolBarMenu[incr m] -tearoff false] lappend B \ [widget ttk::frame \ [gmPack -expand 0 -fill x]\ [handler $barreName \ [hVars PackInfo [hVal ""]]\ [hMethods show {} [string map [list {${barreName}} [list $barreName]] { # protéger les variables barreName en cas d'espace dans le nom set L [%MW ${barreName} brother] set index [lsearch $L [%MW ${barreName} path]] if {$index == 0} { pack [%MW ${barreName} path] {*}[set %MW::${barreName}::PackInfo] \ -before [lindex $L $index+2] # séparateur pack [lindex $L $index+1] \ -before [lindex $L $index+2] -expand 0 -fill x -padx 2 -pady 2 -side top } else { # rechercher les fenêtres gérées par le manager (pack slaves) set i [expr {$index-1}] foreach w [lreverse [lrange $L 0 $index-1]] { if {$w in [pack slaves [winfo parent [%MW ${barreName} path]]]} { break } incr i -1 } pack [%MW ${barreName} path] {*}[set %MW::${barreName}::PackInfo] \ {*}[expr {($i > 0) ? [list -after [lindex $L $i]]:""}] # séparateur pack [lindex $L $index+1] \ -after [%MW ${barreName} path] -expand 0 -fill x -padx 2 -pady 2 -side top } }] hide {} [string map [list {${barreName}} [list $barreName]] { if {[winfo manager [%MW ${barreName} path]] eq "pack"} { set %MW::${barreName}::PackInfo [pack info [%MW ${barreName} path]] set L [%MW ${barreName} brother] set index [lsearch $L [%MW ${barreName} path]] pack forget [%MW ${barreName} path] [lindex $L [expr {$index+1}]] } }]]]\ [> {*}[set G [] if {$b!=1} { .toolBarMenu$m add command \ -label "cacher la barre"\ -command [list $pseudoWidget $barreName hide] .toolBarMenu$m add command \ -label "montrer la barre"\ -command [list $pseudoWidget $barreName show] } foreach groupe $Barre { if {[is groupe $groupe]} { set Groupe [lassign [$groupe get] groupeName] .toolBarMenu$m add cascade \ -label $groupeName \ -menu [menu .toolGroupMenu[incr g] -tearoff false] lappend G \ [widget ttk::frame \ [gmPack -expand 0 -fill x]\ [handler $groupeName \ [hVars PackInfo [hVal ""]]\ [hMethods show {} [string map [list {${groupeName}} [list $groupeName]] { set L [%MW ${groupeName} brother] set index [lsearch $L [%MW ${groupeName} path]] if {[llength [pack slaves [winfo parent [%MW ${groupeName} path]]]]==0} { pack [%MW ${groupeName} path] {*}[set %MW::${groupeName}::PackInfo] pack [lindex $L $index+1] \ -after [%MW ${groupeName} path] -expand 0 -fill y -padx 2 -pady 2 -side left return } if {$index == 0} { # $b prend en compte que la première barre comprend un menu de configuration pack [%MW ${groupeName} path] {*}[set %MW::${groupeName}::PackInfo] \ {*}[expr {$b!=1 ? [list -before [lindex $L $index+2]]:""}] # séparateur pack [lindex $L $index+1] \ {*}[expr {$b!=1 ? [list -before [lindex $L $index+2]]:""}]\ -expand 0 -fill y -padx 2 -pady 2 -side left } else { # rechercher les fenêtres gérées par le manager (pack slaves) set i [expr {$index-1}] foreach w [lreverse [lrange $L 0 $index-1]] { if {$w in [pack slaves [winfo parent [%MW ${groupeName} path]]]} { break } incr i -1 } if {$i == 0} { set i [expr {$index+2}] foreach w [lrange $L $i end] { if {$w in [pack slaves [winfo parent [%MW ${groupeName} path]]]} { break } incr i } pack [%MW ${groupeName} path] {*}[set %MW::${groupeName}::PackInfo] \ -before [lindex $L $i] # séparateur pack [lindex $L $index+1] \ -before [lindex \$L \$i] -expand 0 -fill y -padx 2 -pady 2 -side left } else { pack [%MW ${groupeName} path] {*}[set %MW::${groupeName}::PackInfo] \ -after [lindex $L $i] # séparateur pack [lindex $L $index+1] \ -after [%MW ${groupeName} path] -expand 0 -fill y -padx 2 -pady 2 -side left } } }] hide {} [string map [list {${groupeName}} [list $groupeName]] { if {[winfo manager [%MW ${groupeName} path]] eq "pack"} { set %MW::${groupeName}::PackInfo [pack info [%MW ${groupeName} path]] set L [%MW ${groupeName} brother] set index [lsearch $L [%MW ${groupeName} path]] pack forget [%MW ${groupeName} path] [lindex $L [expr {$index+1}]] } }]]]\ [> {*}[set E [] .toolGroupMenu$g add command \ -label "cacher le groupe"\ -command [list $pseudoWidget $groupeName hide] .toolGroupMenu$g add command \ -label "montrer le groupe"\ -command [list $pseudoWidget $groupeName show] foreach element $Groupe { if {[is element $element]} { set Element [lassign [$element get] elementName] set Element [subst {[subst $Element]}] set w {*}[join $Element] $w lappend [gmPack -padx 2 -pady 2 -expand 0 -fill y] foreach e [$w get] { if {[is handler $e]} { set handler [lindex [$e get] 0] .toolGroupMenu$g add checkbutton \ -label $elementName\ -onvalue 1 -offvalue 0\ -variable [namespace current]::$elementName \ -command [subst { if {\[set [list [namespace current]::$elementName]] == 1} { %MW [list $handler] show } else { %MW [list $handler] hide } }] set [namespace current]::$elementName 1 $e lappend [hVars PackInfo [hVal ""]] $e lappend [hMethods hide {} [string map [list {${handler}} [list $handler]] { if {[winfo manager [%MW ${handler} path]] eq "pack"} { set %MW::${handler}::PackInfo [pack info [%MW ${handler} path]] set L [%MW ${handler} brother] set index [lsearch $L [%MW ${handler} path]] pack forget [%MW ${handler} path] } }] show {} [string map [list {${handler}} [list $handler]] { set L [%MW ${handler} brother] set index [lsearch $L [%MW ${handler} path]] if {[llength [pack slaves [winfo parent [%MW $handler path]]]]==0} { pack [%MW ${handler} path] {*}[set %MW::${handler}::PackInfo] return } if {$index == 0} { # $b prend en compte que la première barre comprend un menu de configuration pack [%MW ${handler} path] {*}[set %MW::${handler}::PackInfo] } else { # rechercher les fenêtres gérées par le manager (pack slaves) set i [expr {$index-1}] foreach w [lreverse [lrange $L 0 $index-1]] { if {$w in [pack slaves [winfo parent [%MW ${handler} path]]]} { break } incr i -1 } if {$i == 0} { set i [expr {$index+1}] foreach w [lrange $L $i end] { if {$w in [pack slaves [winfo parent [%MW ${handler} path]]]} { break } incr i } pack [%MW ${handler} path] {*}[set %MW::${handler}::PackInfo] -before [lindex $L $i] } else { pack [%MW ${handler} path] {*}[set %MW::${handler}::PackInfo] -after [lindex $L $i] } } }]] break } } lappend E $w } } set E]]] lappend G [widget ttk::separator -orient vertical\ [gmPack -padx 2 -pady 2 -expand 0 -fill y]] } } set G]]] lappend B [widget ttk::separator -orient horizontal\ [gmPack -padx 2 -pady 2 -expand 0 -fill x]] } } } if {[is > [set childBarre0 [lindex [[lindex $B 0] get] end]]]} { # est toujours vrai. $childBarre0 lappend [widget ttk::menubutton -menu .toolBarMenu [gmPack -side right -expand 0 -fill y]] } set B]} # pack [ToolBar .tb -toolbar $toolbar]_ -expand 0 -fill x
typedlist create Unicode::node typedlist create Unicode::data namespace eval Unicode { package require msgcat namespace path ::msgcat proc traductions {langref args} { # format de dictionnaire src0 {langage0 trad0 langage1 trad1 langage2 trad2} src1 {l0 t0 l1 t1} set D [dict create {*}$args] set Langues $langref dict for {src trad} $args { dict for {langue traduction} $trad { lappend $langue $src $traduction lappend Langues $langue } lappend $langref $src $src } foreach langue $Langues { mcmset $langue [set $langue] } } traductions en \ {European Scripts} {fr {Scripts européens} de Eüropeisher} \ Armenian {fr Arménien de Armenisher} \ {Armenian Ligatures} {fr {Ligatures arméniennes}} \ {Latin-1 Supplement} {fr {Suppléments latin}}\ {Latin Extended-A} {fr {1ère extension du latin}}\ {Latin Extended-B} {fr {2nde extension du latin}}\ {Latin Extended-C} {fr {3ème extension du latin}}\ {Latin Extended-D} {fr {4ème extension du latin}}\ {Latin Extended Additional} {fr {Extensions du latin additionnelles}}\ {Latin Ligatures} {fr {Ligatures du latin}}\ {Fullwidth Latin Letters} {fr {Lettres latines en pleine largeur}}\ Greek {fr {Caractères grecs}}\ {Greek Extended} {fr {Caractères grecs étendus}}\ {Mathemathical Symbols} {fr {Symboles mathématiques}} \ {Arrows} {fr {Flêches}}\ {Supplemental Arrows-A} {fr {Flêches supplémentaires A}}\ {Supplemental Arrows-B} {fr {Flêches supplémentaires B}}\ {Additionnal Arrows} {fr {Flêches aditionnelles}}\ {Mathemathical Alphanumerics Symbols} {fr {Symboles alphanumériques mathématiques}}\ {Letterlike Symbols} {fr {Symboles mathématiques lettromorphes}}\ {Mathemathical Operators} {fr {Opérateurs mathématiques}}\ {Supplemental Mathemathical Operators} {fr {Opérateurs mathématiques supplémentaires}}\ {Miscellaneaous Mathematical Symbols-A} {fr {Symboles mathématiques divers A}}\ {Miscellaneaous Mathematical Symbols-B} {fr {Symboles mathématiques divers B}}\ {Geometrical shape} {fr {Formes géométriques}}\ {Additional shape} {fr {Formes additionnelles}}\ {Box Drawing} {fr {Dessin de boîtes}} \ {Blocks elements} {fr {Éléments blocs}} \ {other Symbols} {fr {Autres symboles}}\ {Miscellaneous Symbols} {fr {Symboles divers}}\ {Number and digits} {fr {Chiffres et nombres}}\ {Superscript and Subscript} {fr {Exposants et indices}} proc uI {args} { foreach a $args { if {[llength $a]>1} { lassign $a debut fin for {set i [format %i $debut]} {$i <= [format %i $fin]} {incr i} { lappend res [format %c $i] } } else { lappend res [format %c $a] } } return [data {*}$res] } set CharTree [node root\ [node [mc {European Scripts}] \ [node [mc Latin] \ [node [mc {Latin-1 Supplement}] [uI {0x00A1 0x00AC} {0x00AE 0x00FF}]]\ [node [mc {Latin Extended-A}] [uI {0x0100 0x017F}]]\ [node [mc {Latin Extended-B}] [uI {0x0180 0x024F}]]\ [node [mc {Latin Extended-C}] [uI {0x2C60 0x2C6C} {0x2C74 0x2C77}]]\ [node [mc {Latin Extended Additional}] [uI {0x1E00 0x1EFF}]]\ [node [mc {Latin Ligatures}]\ [uI {0xFB00 0xFB06} {0xFB13 0xFB17}\ {0xFB1D 0xFB36} {0xFB38 0xFB3C} \ 0xFB3E 0xFB40 0xFB41 0xFB43 0xFB44 \ {0xFB46 0xFB4F}]]\ [node [mc {Fullwidth Latin Letters}]\ [uI {0xFF01 0xFF9F} {0xFFA1 0xFFBE}\ {0xFFC2 0xFFC7} {0xFFCA 0xFFCF}\ {0xFFD2 0xFFD7} {0xFFDA 0xFFD9}\ {0xFFE0 0xFFE6} {0xFFE8 0xFFEF}]]]\ [node [mc Greek] \ [uI {0x0370 0x0377} {0x037A 0x037E} {0x0384 0x0389} 0x038C {0x038E 0x03FF}]\ [node [mc {Greek Extended}] \ [uI {0x1F00 0x1F15} {0x1F18 0x1F1D} {0x1F20 0x1F35} {0x1F38 0x1F3D}\ {0x1F50 0x1F57} 0x1F59 0x1F5B 0x1F5D {0x1F5F 0x1F7D}\ {0x1F80 0x1FB4} {0x1FB6 0x1FC4} {0x1FC6 0x1FD3} {0x1FD6 0x1FDB} \ {0x1FDD 0x1FEF} {0x1FF2 0x1FF4} {0x1FF6 0x1FFE}]]]]\ [node [mc {Mathemathical Symbols}]\ [node [mc Arrows] [uI {0x2190 0x21FF}]\ [node [mc {Supplemental Arrows-A}] [uI {0x27F0 0x27FF}]]\ [node [mc {Supplemental Arrows-B}] [uI {0x2900 0x297F}]]\ [node [mc {Additionnal Arrows}] [uI {0x2B00 0x2B4C} {0X2B50 0x2B59}]]]\ [node [mc {Mathemathical Alphanumerics Symbols}] \ [node [mc {Letterlike Symbols}] [uI {0x2100 0x214F}]]]\ [node [mc {Mathemathical Operators}] [uI {0x2200 0x22FF}]\ [node [mc {Supplemental Mathemathical Operators}] [uI {0x2A00 0x2AFF}]]\ [node [mc {Miscellaneaous Mathematical Symbols-A}] [uI {0x27C0 0x27CA} {0x27D0 0x27EF}]]\ [node [mc {Miscellaneaous Mathematical Symbols-B}] [uI {0x2980 0x29FF}]]]\ [node [mc {Geometrical shape}] [uI {0x25A0 0X25FF}]\ [node [mc {Additional shape}] [uI {0x2B00 0x2B4C} {0x2B50 0x2B59}]]\ [node [mc {Box Drawing}] [uI {0x2500 0x257F}]]\ [node [mc {Blocks elements}] [uI {0x2580 0x259F}]]]]\ [node [mc {other Symbols}] \ [node [mc {Miscellaneous Symbols}] [uI {0x2600 0x26CD} {0x26CF 0x26E1} 0x26E3 {0x26E8 0x26FF}]]]\ [node [mc {Number and digits}] \ [node [mc {Superscript and Subscript}] [uI 0x2070 0x00B9 0x00B2 0x00B3 {0x2074 0x207F}\ 0x2071 {0x2080 0x208E} {0x2090 0x2094}]]]] proc TreeView {w tree {parent {}}} { if {![catch {$tree type} T] && $T eq "node"} { set SubTree [lassign [$tree get] Node] set values [lindex $SubTree 0] $w insert $parent end -id $Node -text $Node \ {*}[expr {![catch {$values type} T] && $T eq "data" ? [list -values [$values get]] : ""}] foreach e $SubTree { if {![catch {$e type} T] && $T eq "node"} { lappend LNode {*}[TreeView $w $e $Node] } } } } } megawidget create ::Mega::CharTree { > \ [widget ttk::panedwindow \ -orient vertical\ [v \ [widget ttk::treeview -height 6\ [handler tree\ [hPostConfig [list %MW tree do heading \#0 -text {Caractères unicodes}]]]\ [bScripts <<TreeviewSelect>> { %MW view chars [%W focus] }]\ [gmPane -weight 1 ]]\ [widget frame -width 364 \ [gmPane -weight 8]\ [handler view \ [hVars Path [hVal [my getOptions [default {}] -path]]]\ [hMethods \ chars {item} { catch {destroy {*}[winfo children [%MW view path]]} catch {::Mega::CharView destroy} catch { ttk::style layout CButton { Toolbutton.border -sticky nswe -children { Toolbutton.padding -sticky nswe -children { Toolbutton.label -sticky nswe } } } set Font0 [font create -family helvetica -size 14] ttk::style conf CButton -font $Font0 -padding {2 1} } megawidget create ::Mega::CharView { v \ {*}[set L [] set nb 0 set pad [list -padx 1 -pady 1] foreach char [%MW tree do item [%MW tree do focus] -values ] { lappend L [widget ttk::button \ [wOptions \ -text $char\ -style CButton\ -width 2\ -command [subst -noc { ::tk::TextInsert [set {::%MW::view::Path}] [%%MW b$nb do cget -text] focus [set {::%MW::view::Path}] }]]\ [gmPack -expand 0 -fill none {*}$pad]\ [handler b$nb]] incr nb } set M [] set nbButton [my getOptions [default 14] -nbButton] for {set n 0} {$n<= $nb/$nbButton} {incr n} { lappend M [widget ttk::frame \ [gmPack -expand 0 -fill both {*}$pad -anchor nw]\ [> -- {*}[lrange $L [expr {$n*$nbButton}] [expr {($n+1)*$nbButton-1}]]]] } set M] } pack [[::Mega::CharView [%MW view path].chars] rootpath] -expand 1 -fill both }\ target {path} { set ::%MW::view::Path $path }]]]]] }
# Assemble all previous megawidgets in one
megawidget create Editeur { top\ [title Editeur]\ [v \ [widget frame \ [gmPack -expand 0 -fill x -padx 5 -pady 5]\ [v \ [mwidget ToolBar \ [wOptions -toolbar $toolbar]\ [handler toolbar]]]] \ [widget ttk::panedwindow \ -orient horizontal\ [gmPack -expand 1 -fill both]\ [handler pane]\ [> \ [widget frame\ [gmPane -weight 1]\ [handler leftpane \ [hMethods \ close {} { %MW pane do sashpos 0 0 }\ open {{pos 300}} { %MW pane do sashpos 0 $pos }]\ [hPostConfig {update; ::%MW leftpane close}]]\ [v \ [widget frame -relief solid -border 1\ [gmPack -expand 0 -fill x]\ [> \ [widget ttk::label\ [gmPack -expand 1 -fill both -pady 2 -padx 10]\ [handler leftpanelabel]]\ [widget ttk::button \ [gmPack -expand 0 -fill none]\ [wOptions \ -image [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAA CxEAAAsRAX9kX5EAAAAHdElNRQfWBAUULRDsX0JHAAAA7ElEQVQoz72QMUvDUBSFv5qCg6PgLLhU MlToLDg4pdTxDM7S/APHtH8j/0DeKPqydPEHZHx0kKCQITo4SdWlPIeXlOoqeJbL5Tvcc7jwV0Vh KIvzeN89tNvspDiOug2A69c7L69ZwPK3Xk+B7ITxfPCFYA7A/IoXOAyk355ITX7GBazgkpoFpAH0 uhAl3J+zB6xYwNjYHxFgbGRr+uxSE9kObxk0WCdDPvy7H7JONPhl0JSlqCg+i7cKwVLTLYMyclFR wojTkgpBrmxTUr7FY2ND3RFHGEyv/WTcuEkDqbkBcI9x00wcpK7kP/QN44JSLNJT/ssAAAAASUVO RK5CYII= }] \ -style Toolbutton\ -command { %MW leftpane close }]]]]\ [widget frame \ [gmPack -expand 1 -fill both]\ [handler leftpanecontent]]]]\ [widget frame\ [gmPane -weight 4]\ [handler contentpane]\ [v \ [widget ttk::notebook \ [wOptions -padding 0]\ [gmPack -expand 1 -fill both -padx 5 -pady 0]\ [handler notebook \ [hVars Files [hVal {}] NumTab [hVal 1] \ ImgClose [hVal [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBI WXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1gQFFCUoDIRw0QAAAaJJREFUOMulk0FLG0EYhp9ZV9zp KnFbgzSbo80PEA8RLbSXQv5DjulRf0x7bI/5Dx5bQSh4UrxIPJq0DdsQ4kLWZZP5euhszBpzqQMD wzvzvXzf+74Dz1zqMdCGEDgCGkDNwh3gBPjchN5Sgja0gE/1MNQlrREAEYwx3N0nnP/6nQDHTfi6 QNCG1ivP+7JXrfIniojjmIkxCLDiOKz7Pi+DgMt+n0GafsxJ1FzbNx92dvTP21uSNEWgsAHWVld5 vb3NabebAG+a0HPs3VG9UtGDKCJJU+oi7IvMCg9FOBQhyTIGwyF75bK2OpETNDa05i6OZ0UAByIc yANigNF4jHZdrMgzgpoSYWpnPlML5vBdKQSYymyoGoCbPxARTH5+wu+CJuYBzzvoTI3gOA4CvJVF ivdWE6UU5h9DZ57gJL5PWPd9zKO2v82NI8CG5zGeTLDBKtr4rlrV3X6fJMsK9okV0HNdwiDgRxQV bbTxPL6KIirlMiXfR1nRDIBSlLQmDDa5Ho2waewtjfLu1pZ+4a6AgCCIwDjLuBgOl0f5fz/Ts9df Scq9YFxk3JAAAAAASUVORK5CYII=}]] \ ImgTabNew [hVal [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gcYDhsksJX0swAAAB10RVh0Q29tbWVudABDcmVhdGVk IHdpdGggVGhlIEdJTVDvZCVuAAACE0lEQVQ4y3WSwU4UQRCGv+rumZWFxQVEXcTVGAU86Ekvhmy8 ePEJfALeQg8mJIQ34Gg8+QjevZp44cCaiIkISxDYAXaXmdnp8sCMTDZYyZ9OulNf/VXVwn/i7Mei ERPeRvWZ9+ev1McPQJ2Yyq61E59tMPXFuut7ArC2vroCbJQB1co5zUaHpeYmU+PbONkDwLp63wbT P11465N1kx9lbX11ZWnp8UZruXWZrQnGb5HtvwbOAaW+eAhAd2sGEJSAg/TtbwdstJZbHJ8c0R/0 AMVIj5r7SpWU+sIugoLGANQXdlEg+t7kYTMZd4AH6A96UhgwpBqYUwPKha6OYdoJTQ4YkVEl0MrE C6L2PIhcdqcQte8wVnuOoGKA4ai8hlnq5zIvcwoGsbOXXkRALNbNKlIbGiAuKQFJPWES+0Yy8E9S FYvPjojaTaJ2ExELaugcVv23zd6JAwaAlARYSbIZc8pTW6u+z7rte2OV+psscI6ofd+O3XyXhPIo rjfuHjigD5iixRxilMDEWUO8VkwQfjgL4q4jUfy1lxxF08PUTyaZt8cOiP4N/yKkACnOJv6GT31d ROatoCjivQYKJgXTdcB+UTXfgikBFQxKKKpagDMQmw/8jwM6pWVrCVYM3l6ARUvuyAE7DtjOE+SK v1Lc+SvcJUDHAb9GetdSYtEWI2cBiBywU7KvJftFso68DfMCHuj/Bd7S7JLHRwjTAAAAAElFTkSu QmCC }]]]\ [hMethods \ add {name} { variable Files variable NumTab variable ImgClose set nbTab [%MW notebook do index end] if {[file extension $name] eq ".tcl" || [file extension $name] eq ".oo"} { %MW notebook do insert [expr {$nbTab-1}] \ [[set mPath [scrollText [%MW notebook path].scrollText[incr NumTab] -type stext]] rootpath] \ -text "[file tail $name] " -image $ImgClose -compound right %MW notebook do select [expr {$nbTab-1}] [%MW notebook objSelected] text do margin configure number -visible yes [%MW notebook objSelected] text do margin configure fold -visible yes [%MW notebook objSelected] text do lexer set tcl } elseif {[file extension $name] eq ".htnstw"} { namespace eval :: { catch { source htnstw.tcl.oo } } %MW notebook do insert [expr {$nbTab-1}] \ [[set mPath [scrollText [%MW notebook path].scrollText[incr NumTab] -type text]] rootpath] \ -text "[file tail $name] " -image $ImgClose -compound right %MW notebook do select [expr {$nbTab-1}] } elseif {[file extension $name] eq ".c" || [file extension $name] eq ".cpp"} { %MW notebook do insert [expr {$nbTab-1}] \ [[set mPath [scrollText [%MW notebook path].scrollText[incr NumTab] -type stext]] rootpath] \ -text "[file tail $name] " -image $ImgClose -compound right %MW notebook do select [expr {$nbTab-1}] [%MW notebook objSelected] text do margin configure number -visible yes [%MW notebook objSelected] text do margin configure fold -visible yes [%MW notebook objSelected] text do lexer set cpp } else { %MW notebook do insert [expr {$nbTab-1}] \ [[set mPath [scrollText [%MW notebook path].scrollText[incr NumTab] -type text]] rootpath] \ -text "[file tail $name] " -image $ImgClose -compound right } # %MW notebook do select [expr {$nbTab-1}] lappend Files $name return [%O createHandler text$NumTab $mPath] }\ objSelected {} { return [string range [%MW notebook do select] 0 end-1] }\ Reperer {} { set nbTab [%MW notebook do index end] set nb 0 for {set i 10} {$nb ne {}} {incr i 1} { set nb2 [%MW notebook do index @$i,20] if {$nb2 !=$nb} { set ::%MW::croix($nb) [list [expr {$i-20}] [expr {$i-8}] 10 22] set nb $nb2 } } }] [hPostConfig {::%MW notebook do tab 0 -image ${::%MW::notebook::ImgTabNew}}]]\ [bScripts <ButtonPress> { %MW notebook Reperer update set nbTab [%MW notebook do index end] for {set i 0} {$i<$nbTab-1} {incr i} { if {"%x" > [lindex [set ::%MW::croix($i)] 0] && "%x" < [lindex [set ::%MW::croix($i)] 1] \ && "%y" > [lindex [set ::%MW::croix($i)] 2] && "%y" < [lindex [set ::%MW::croix($i)] 3]} { # On peut fermer l'onget %MW notebook do forget $i # detruire la fenêtre ? Comment # recalculer les positions %MW notebook Reperer } } } <<NotebookTabChanged>> { event generate %W <<HiliteRemove>> } <<HiliteRemove>> { set wSelected [%W select] set mwSelected [string range $wSelected 0 end-1] foreach w [%W tabs] { set mw [string range $w 0 end-1] $mw text do tag remove hilite 0.0 end set ::${mw}::mwHasFocus $mwSelected } focus [$mwSelected text path] }]\ [> \ [mwidget scrollText\ [handler text]\ [gmNotebook -text *]]]]]]]]]}
# Test
Editeur .edit wm protocol [.edit rootpath] WM_DELETE_WINDOW { destroy . exit } wm withdraw . # console show .edit toolbar obj ouvrir config -command { if {[set F [tk_getOpenFile]] ne {}} { set cursor [.edit_ cget -cursor] .edit_ conf -cursor wait [.edit notebook path] conf -cursor wait [set NBS [[string range [.edit notebook do select] 0 end-1] text path]] conf -cursor wait set Hand [.edit notebook add $F] set fid [open $F r] [.edit $Hand obj] text do delete 0.0 end if {[file extension $F] eq ".htnstw"} { ::htnstw insert [[.edit $Hand obj] text path] end [read $fid] [.edit $Hand obj] text do tag raise sel } else { [.edit $Hand obj] text do insert end [read $fid] } close $fid set wSelected [.edit notebook do select] set mwSelected [string range $wSelected 0 end-1] tk::TextSetCursor [$mwSelected text path] 0.0 focus [$mwSelected text path] .edit_ conf -cursor $cursor [.edit notebook path] conf -cursor $cursor $NBS conf -cursor $cursor } } .edit toolbar obj sauverSous config -command { if {[file extension [set f [string trim [.edit notebook do tab [.edit notebook do select] -text]]]] eq ".htnstw"} { set F [tk_getSaveFile -defaultextension ".htnstw" -initialdir [pwd] -initialfile $f ] if {$F ne {}} { set wSelected [.edit notebook do select] set mwSelected [string range $wSelected 0 end-1] ::htnstw::save [$mwSelected text path] $F } } else { set F [tk_getSaveFile -initialdir [pwd] -initialfile $f ] if {$F ne {}} { set wSelected [.edit notebook do select] set mwSelected [string range $wSelected 0 end-1] set fid [open $F w] puts $fid [$mwSelected text do get 0.0 end] close $fid } } } .edit toolbar obj imprimer config -command { #don't work if {$::tcl_platform(platform) ne "windows"} { error "printing is only supported under Windows" } set filename c:/temp/[file tail [wm title .]] set f [open $filename w] chan configure $f -encoding utf-8 -blocking 0 chan puts $f \ufeff[[string range [.edit notebook do select] 0 end-1] text do get 1.0 end] chan close $f exec cmd /c start /min notepad /p $filename & file delete $filename } .edit toolbar obj undo config -command { [.edit notebook objSelected] text do edit undo } .edit toolbar obj redo config -command { [.edit notebook objSelected] text do edit redo } .edit toolbar obj coller config -command { event generate [[.edit notebook objSelected] text path] <<Paste>> } .edit toolbar obj couper config -command { event generate [[.edit notebook objSelected] text path] <<Cut>> } .edit toolbar obj copier config -command { event generate [[.edit notebook objSelected] text path] <<Copy>> } [.edit toolbar obj] unicode config -command { set wSelected [.edit notebook do select] set mwSelected [string range $wSelected 0 end-1] destroy [winfo child [.edit leftpanecontent path]] catch {pack [[::Mega::CharTree [.edit leftpanecontent path].uc -path [$mwSelected text path]] rootpath] -expand 1 -fill both} .edit leftpanelabel config -text "Charactères unicodes" [.edit leftpanecontent path].uc tree config -show tree bind [.edit notebook path] <<NotebookTabChanged>> +[subst -noc -nov { set wSelected [.edit notebook do select] set mwSelected [string range $wSelected 0 end-1] [.edit leftpanecontent path].uc view target [$mwSelected text path] puts [$mwSelected text path] }] ::Unicode::TreeView [[.edit leftpanecontent path].uc tree path] $::Unicode::CharTree .edit leftpane open 364 } .edit toolbar obj policeName do set [lindex [[.edit text obj] text do cget -font] 0] .edit toolbar obj policeSize do set [lindex [[.edit text obj] text do cget -font] end] .edit toolbar obj policeSize config -postcommand { #don't work .edit text obj text config -font [font create -family [lindex [[.edit text obj] text do cget -font] 0]\ -size [lindex [[.edit text obj] text do cget -font] end]] }
megawidget create ListText { v \ [widget ttk::frame \ [@ \ [widget ttk::scrollbar \ [wOptions \ -orient vertical \ -command {%MW listText do yview}]\ [handler sy]\ [gmPack -side right -expand 0 -fill y]]\ [widget ttk::scrollbar \ [wOptions -orient horizontal \ -command {%MW listText do xview}]\ [handler sx]\ [gmPack -side bottom -expand 0 -fill x]]\ [widget text \ [wOptions \ -width [my getOptions [default 50] -nb]\ -xscrollcommand {%MW sx do set}\ -yscrollcommand {%MW sy do set}\ -cursor arrow\ -wrap none]\ [handler listText \ [hPostConfig [subst -nov { proc ::%MW::updatelist {} { set ::%MW::i -1 %MW listText do delete 0.0 end set ::%MW::colors [list [my getOptions [default yellow white] -alternativebackground]] set alterner \[llength ${::%MW::colors}\] foreach e \[set [my getOptions [default {}] -listvariable]\] { lassign $e img text set ::%MW::BG \[lindex ${::%MW::colors} \[expr {${::%MW::i}%$alterner}\]\] set IMG \[%MW listText do image create end -image $img -align center -padx 5\] %MW listText do tag conf $IMG -background ${::%MW::BG} %MW listText do insert end \\t$text\\n e\[incr {::%MW::i}\] %MW listText do tag conf e${::%MW::i} -background ${::%MW::BG} %MW listText do tag bind e${::%MW::i} <Any-Enter> "%MW listText do tag conf e\${::%MW::i} -background \[%MW listText do cget -selectbackground\] -foreground \[%MW listText do cget -selectforeground\]; " %MW listText do tag bind e${::%MW::i} <Any-Leave> "%MW listText do tag conf e\${::%MW::i} -background ${::%MW::BG} -foreground \[%MW listText do cget -foreground\]" %MW listText do tag bind e${::%MW::i} <ButtonPress-1> " event generate \[%MW rootpath\] <<ListTextSelect>> -data \\\"\[%MW listText do get {*}\[%MW listText do tag range e\${::%MW::i}\]-1c\]\\\" " } } proc ::%MW::vartrace {n0 n1 op} { ::%MW::updatelist } trace add variable [my getOptions [default {}] -listvariable] write ::%MW::vartrace ::%MW::updatelist }]]]\ [gmPack -expand 1 -fill both]]\ ]] } megawidget create Filtre { v \ [set ::%MW::Liste [set [my getOptions [default {}] -listvariable]] widget ttk::frame \ [gmPack -fill x -expand 0 -padx 5 -pady 5]\ [> \ [widget ttk::entry \ [handler pattern]\ [gmPack -expand 1 -fill x -padx {0 5}]\ [bScripts <KeyPress-Return> {%MW filtrer do invoke}] ]\ [widget ttk::button \ -text [my getOptions [default {Filtrer}] -text] \ -command { %MW filtrer liste }\ [gmPack -expand 0]\ [handler filtrer\ [hMethods liste {args} [subst { set ::%MW::Liste \[lsearch -index 1 -glob -all -inline \ \[set [my getOptions [default {}] -listvariable]\] *\[%MW pattern do get\]*\] }]]\ [hPostConfig {trace add variable [my getOptions [default {}] -listvariable] write ::%MW::filtrer::liste}]]]]]\ [mwidget ListText \ [handler liste]\ [wOptions -listvariable ::%MW::Liste -alternativebackground [list AntiqueWhite1 AntiqueWhite3 ]]]} set ::L []
# let's try it with the currents images known by Tk
foreach i [image names] { lappend L [list $i $i] } pack [[Filtre .lt -listvariable ::L] rootpath] -expand 1 -fill both
LV Once it has stablized, it would be great if it were contributed to the tklib for general access.
FM Thanks for the invitation. Do you understand how it works ? Do you try to play with it at home ? I hope so. You should know that every suggestion is welcome.
For the stabilisation, I 'm not sure right now. I'm still exploring the possibilities. If I could get some goods critics, some goods advices, and a some little help, it will stabilize.
PYK 2014-11-06: In an attempt to remedy the corruption mentioned on analogy between html markup and typedlist, I've made some modifications to the code above, basically, going through and making sure values are properly enclosed in a list where code is being generated, until it got to the point that opening the example on that page , saving it, opening that saved file and saving it again produces identical data. FM, does that fix the corruption you were talking about?