The definitions for the methods given in Chapter 5 must be redefined so as to take an instance of <frame> as an argument, rather than an instance of <gadget>. This change results in these new definitions:
define method open-file
(frame :: <task-frame>) => ()
let task-list = frame-task-list(frame);
let filename
= choose-file(frame: frame,
default: task-list.task-list-filename,
direction: #"input");
if (filename)
let task-list = load-task-list(filename);
if (task-list)
frame.frame-task-list := task-list;
refresh-task-frame(frame)
else
notify-user(format-to-string("Failed to open file %s", filename),
owner: frame)
end
end
end method open-file;
define method save-file
(frame :: <task-frame>) => ()
let task-list = frame-task-list(frame);
if (task-list.task-list-modified?)
save-as-file(frame, filename: task-list.task-list-filename)
end
end method save-file;
define method save-as-file
(frame :: <task-frame>, #key filename) => ()
let task-list = frame-task-list(frame);
let filename
= filename
| choose-file(frame: frame,
default: task-list.task-list-filename,
direction: #"output");
if (filename)
if (save-task-list(task-list, filename: filename))
frame.frame-task-list := task-list;
refresh-task-frame(frame)
else
notify-user(format-to-string
("Failed to save file %s", filename),
owner: frame)
end
end
end method save-as-file;
define method frame-add-task (frame :: <task-frame>) => ()
let task-list = frame-task-list(frame);
let (name, priority) = prompt-for-task(owner: frame);
if (name & priority)
let new-task = make(<task>, name: name, priority: priority);
add-task(task-list, new-task);
refresh-task-frame(frame);
frame-selected-task(frame) := new-task
end
end method frame-add-task;
define method frame-remove-task (frame :: <task-frame>) => ()
let task = frame-selected-task(frame);
let task-list = frame-task-list(frame);
if (notify-user(format-to-string
("Really remove task %s", task.task-name),
owner: frame, style: #"question"))
frame-selected-task(frame) := #f;
remove-task(task-list, task);
refresh-task-frame(frame)
end
end method frame-remove-task;
define method note-task-selection-change
(frame :: <task-frame>) => ()
let task = frame-selected-task(frame);
if (task)
frame.priority-box.gadget-value := task.task-priority;
end;
command-enabled?(frame-remove-task, frame) := task ~= #f;
end method note-task-selection-change;
For details about note-task-selection-change, see Section 5.3.3.3 on page 67. See Section A.2, "A task list manager using command tables" for the complete source code for the Task List 2 project.