link navitrix
July 10, 2002; Ralph E. Griswold
Requires: Version 9 graphics, UNIX
This file is in the public domain.
This package provides an interface for file navigation. It is
intended for use with another application with a visual interface.
____________________________________________________________
The code is based on Unix but may work in other Unix-like environments.
Directories are shown with a trailing slash. Clicking on a directory
moves there. Clicking on a file name selects it. The text of the
button used to dismiss the navigator is put in the global variable
nav_state, while the name of the selected file is put in the global
variable nav_file.
nav_keyboard() processes keyboard shortcuts. A return character is
equivalent to clicking on the Okay button. Other characters cause
the top list entry to be positioned at a name that starts with or is
close to the character.
The other application needs only to know this:
The navigator is initialized by calling nav_init(). This opens a
hidden window, assigned to the global variable nav_window, for
the navigator. It also assigns the navigator root vidget to the
global variable nav_root.
To use the navigator, the other application needs to change the
canvas status nav_window to normal so it can accept user events
and hide it again when it has been "dismissed". The navigator
puts the selected file in nav_file as mentioned above.
If the application wants to support the navigator's keyboard
shortcuts, it needs to set the shortcut procedure to nav_keyboard
when the navigator window is active.
A typical event loop for using the navigator is:
repeat { # event loop
case Active() of {
&window : { # application window
root_cur := root
shortcuts_cur := shortcuts
}
nav_window : { # navigation window
root_cur := nav_root
shortcuts_cur := nav_keyboard
}
}
ProcessEvent(root_cur, , shortcuts_cur)
case nav_state of {
&null : next
"Okay" : load_pattern()
}
nav_state := &null
WAttrib(nav_window, "canvas=hidden")
}
where process_file() is a procedure that does something with the
file.
Note that the value of nav_state determines what needs to be done. It is
null when the navigator has not been used since the last event. If
the navigator is dismissed with "Cancel" instead of "Okay", nothing
needs to be done except hide the navigator window and set the nav_state
to null.
Coupled with this is a procedure (or more than one) that makes the
navigator window visible, as in
procedure open_cb()
WAttrib(nav_window, "canvas=normal")
...
return
end
If there is more than one use of the navigator, the callbacks that
enable it can set process_file to the appropriate companion procedure.