summaryrefslogtreecommitdiff
path: root/lib/line.tcl
blob: a026de954c3d9cbfd03d4dec9a73a74647bf74ba (plain)
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
# goto line number
# based on code from gitk, Copyright (C) Paul Mackerras

class linebar {

field w
field ctext

field linenum   {}

constructor new {i_w i_text args} {
	global use_ttk NS
	set w      $i_w
	set ctext  $i_text

	${NS}::frame  $w
	${NS}::label  $w.l       -text [mc "Goto Line:"]
	tentry  $w.ent \
		-textvariable ${__this}::linenum \
		-background lightgreen \
		-validate key \
		-validatecommand [cb _validate %P]
	${NS}::button $w.bn      -text [mc Go] -command [cb _goto]

	pack   $w.l   -side left
	pack   $w.bn  -side right
	pack   $w.ent -side left -expand 1 -fill x

	eval grid conf $w -sticky we $args
	grid remove $w

	trace add variable linenum write [cb _goto_cb]
	bind $w.ent <Return> [cb _goto]
	bind $w.ent <Escape> [cb hide]

	bind $w <Destroy> [list delete_this $this]
	return $this
}

method show {} {
	if {![visible $this]} {
		grid $w
	}
	focus -force $w.ent
}

method hide {} {
	if {[visible $this]} {
		$w.ent delete 0 end
		focus $ctext
		grid remove $w
	}
}

method visible {} {
	return [winfo ismapped $w]
}

method editor {} {
	return $w.ent
}

method _validate {P} {
	# only accept numbers as input
	string is integer $P
}

method _goto_cb {name ix op} {
	after idle [cb _goto 1]
}

method _goto {{nohide {0}}} {
	if {$linenum ne {}} {
		$ctext see $linenum.0
		if {!$nohide} {
			hide $this
		}
	}
}

}