Eskil

Check-in [f01668f775]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Initial experiment
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: f01668f775c463765495ba9f90c69ae2e43ebbd0
User & Date: peter 2007-12-09 18:42:26.000
Context
2007-12-10
06:56
Rewrote as snidget check-in: 507ba476ff user: peter tags: trunk
2007-12-09
18:42
Initial experiment check-in: f01668f775 user: peter tags: trunk
08:00
Support command line "-" to read patch from stdin. check-in: 1bdf9b7152 user: peter tags: trunk
Changes
Unified Diff Ignore Whitespace Patch
Added dirdifftest.tcl.














































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#!/home/peter/tcl/install/bin/tclsh8.5
lappend auto_path [pwd]/eskil.vfs/lib/

package require Tk
package require Ttk
package require tile
package require snit

set dirdiff(leftDir) /home/peter/tcl/tcl
set dirdiff(rightDir) /home/peter/tcl/tclmaster

snit::widget DirCompare {
    component tree
    component hsb
    component vsb

    option -leftdir
    option -rightdir

    variable AfterId
    variable IdleQueue
    variable IdleQueueArr

    constructor {args} {
        install tree using ttk::treeview %AUTO%
        $self configurelist $args
        set AfterId ""
        set IdleQueue {}
    }
    destructor {

    }

    method AddNodeToIdle {node} {
        if {[info exists IdleQueueArr($node)]} { return }
        lappend IdleQueue $node
        set IdleQueueArr($node) 1

        if {$AfterId eq ""} {
            set AfterId [after idle [list UpdateIdle $tree]]
        }
    }
}

proc InitIdleHandler {tree} {
    if {![info exists ::IdleHandler($tree,afterid)]} {
        set ::IdleHandler($tree,afterid) ""
    }
    if {$::IdleHandler($tree,afterid) ne ""} {
        after cancel $::IdleHandler($tree,afterid)
        set ::IdleHandler($tree,afterid) ""
    }
    #array unset ::IdleHandler $tree,*
    set ::IdleHandler($tree) {}
}

proc AddNodeToIdle {tree node} {
    if {[info exists ::IdleHandler($tree,$node)]} { return }
    lappend ::IdleHandler($tree) $node
    set ::IdleHandler($tree,$node) 1

    if {$::IdleHandler($tree,afterid) eq ""} {
        set ::IdleHandler($tree,afterid) [after idle [list UpdateIdle $tree]]
    }
}

proc UpdateIdle {tree} {
    set ::IdleHandler($tree,afterid) {}

    if {[llength $::IdleHandler($tree)] > 0} {
        set node [lindex $::IdleHandler($tree) 0]
        set ::IdleHandler($tree) [lrange $::IdleHandler($tree) 1 end]
        unset ::IdleHandler($tree,$node)

        UpdateDirNode $tree $node
    }

    if {[llength $::IdleHandler($tree)] > 0} {
        set ::IdleHandler($tree,afterid) [after idle [list UpdateIdle $tree]]
    }
}

proc UpdateDirNode {tree node} {
    if {[$tree set $node type] ne "directory"} {
	return
    }
    if {[$tree set $node status] ne "empty"} {
        puts "Dir [$tree set $node leftfull] already done"
	return
    }
    $tree delete [$tree children $node]

    set leftfull [$tree set $node leftfull]
    set leftall [lsort -dictionary [glob -nocomplain -dir $leftfull *]]
    foreach f $leftall {
	set type [file type $f]
	set id [$tree insert $node end -text [file tail $f] \
		-values [list $type unknown $f [file tail $f] 0 0 $f [file tail $f] 0 0]]
	if {$type eq "directory"} {
	    ## Make it so that this node is openable
            $tree set $id status empty
	    $tree insert $id 0 -text dummy ;# a dummy
	    $tree item $id -text [file tail $f]/
            AddNodeToIdle $tree $id
        }
    }

    $tree set $node status unknown
    $tree set $node leftfull
    $tree set $node leftname
    $tree set $node rightfull
    $tree set $node rightname
}

proc makeWin {} {

    set top .dirdiff
    toplevel $top

    set w [frame $top.f]
    ## Create the tree and set it up
    ttk::treeview $w.tree \
            -columns {type status leftfull leftname leftsize leftdate rightfull rightname rightsize rightdate} \
            -displaycolumns {leftname leftsize leftdate rightname rightsize rightdate} \
            -yscroll "$w.vsb set" -xscroll "$w.hsb set"
    if {[tk windowingsystem] ne "aqua"} {
        ttk::scrollbar $w.vsb -orient vertical -command "$w.tree yview"
        ttk::scrollbar $w.hsb -orient horizontal -command "$w.tree xview"
    } else {
        scrollbar $w.vsb -orient vertical -command "$w.tree yview"
        scrollbar $w.hsb -orient horizontal -command "$w.tree xview"
    }
    $w.tree heading \#0 -text "Directory"
    $w.tree heading leftname -text "Name"
    $w.tree heading leftsize -text "Size"
    $w.tree heading leftdate -text "Date"
    $w.tree heading rightname -text "Name"
    $w.tree heading rightsize -text "Size"
    $w.tree heading rightdate -text "Date"

    $w.tree column leftsize  -stretch 0 -width 70
    $w.tree column rightsize -stretch 0 -width 70
    $w.tree column leftdate  -stretch 0 -width 70
    $w.tree column rightdate -stretch 0 -width 70

    # Fill in root data
    $w.tree set {} type       directory
    $w.tree set {} status     empty
    $w.tree set {} leftfull   $::dirdiff(leftDir)
    $w.tree set {} leftname   [file tail $::dirdiff(leftDir)]
    $w.tree set {} rightfull  $::dirdiff(leftDir)
    $w.tree set {} rightname  [file tail $::dirdiff(leftDir)]

    InitIdleHandler $w.tree
    UpdateDirNode $w.tree {}
    bind $w.tree <<TreeviewOpen>> {UpdateDirNode %W [%W focus]}

    pack $w -fill both -expand 1
    grid $w.tree $w.vsb -sticky nsew
    grid $w.hsb         -sticky nsew
    grid columnconfigure $w 0 -weight 1
    grid rowconfigure    $w 0 -weight 1
}

makeWin