summaryrefslogtreecommitdiff
path: root/ipl/gprogs/browser.icn
blob: 691f418b1c425ef26b9aa5dc3c29fc92911e60e1 (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
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
############################################################################
#
#	File:     browser.icn
#
#	Subject:  Program to demonstrate file-navigation "dialog"
#
#	Author:   Ralph E. Griswold
#
#	Date:     July 10, 2002
#
############################################################################
#
#  This file is in the public domain.
#
############################################################################
#
#  Requires:  Version 9 graphics
#
############################################################################
#
#  Links:  navitrix, vsetup
#
############################################################################

link navitrix
link vsetup

global pat_window
global vidgets

$define LineLength  75
$define FileLength 500

procedure main()
   local root, root_cur

   nav_init()
   vidgets := ui()
   pat_window := &window

   root := vidgets["root"]

   repeat {
      root_cur := case Active() of {
         pat_window   :  root
         nav_window   :  nav_root
         }
      ProcessEvent(root_cur, , shortcuts)
      case nav_state of {
         &null   :  next
         "Okay"  :  process_file()
         }
      nav_state := &null
      }

end

procedure process_file()
   local input, file_list
   static list_vidget

   initial list_vidget := vidgets["list"]

   if nav_file[-1] == "/" then {	# directory
      chdir(nav_file)
      nav_refresh()
      }

   else {				# "plain" file
      input := open(nav_file) | {
         Notice("Cannot open " || image(nav_file) || ".")
         fail
         }
      file_list := []
      every put(file_list, left(entab(!input), LineLength)) \ FileLength
      VSetItems(list_vidget, file_list)
      close(input)
      WAttrib(nav_window, "canvas=hidden")
      }

   return

end

procedure file_cb(vidget, value)

   case value[1] of {
      "find  @F"  :  find_file()
      "quit  @Q"  :  exit()
      }

   return

end

procedure list_cb(vidget, value)

   if /value then return		# deselection; no action

   return

end

procedure find_file()

   WAttrib(nav_window, "canvas=normal")

   return

end

procedure shortcuts(e)

   if &meta then case map(e) of {
      "f"  :  find_file()
      "q"  :  exit()
      }

   return

end

#===<<vib:begin>>===	modify using vib; do not remove this marker line
procedure ui_atts()
   return ["size=587,402", "bg=pale gray", "label=Browser"]
end

procedure ui(win, cbk)
return vsetup(win, cbk,
   [":Sizer:::0,0,587,402:Browser",],
   ["file:Menu:pull::0,3,36,21:File",file_cb,
      ["find  @F","quit  @Q"]],
   ["list:List:r::17,44,557,343:",list_cb],
   ["menubar:Line:::0,26,585,26:",],
   )
end
#===<<vib:end>>===	end of section maintained by vib