/* Do not remove the headers from this file! see /USAGE for more info. */
/*
** Annotation menu For the Lima mudlib.
** Rust @ Lima Bean Dec 3, 1995.
**
** Todo: This relies on the fact that 2 people aren't editing the same
** annotation at once. If you view one that got removed while you were
** on the view annotation menu, you're hosed. Need to add some locking
** code, even though this shouldn't be a problem often.
**
*/
#include <menu.h>
#include <classes.h>
#include <edit.h>
inherit MENUS;
inherit CLASS_ANNOTATION;
MENU toplevel;
MENU view_annotations;
MENU rm_annotations;
MENU_ITEM quit_item;
MENU_ITEM goto_main_menu_item;
MENU_ITEM seperator;
private nosave object annotation_target;
private nosave class annotation new_annotation;
private void remove_annotation();
private void rcv_can_ed(string y_or_n)
{
switch(lower_case(y_or_n))
{
case "y":
case "yes":
new_annotation->read_only = 0;
break;
case "n":
case "no":
new_annotation->read_only = 1;
break;
default:
get_input_then_call ((: rcv_can_ed :), "yes or no? ");
return;
}
ANNOTATION_D->add_annotation(annotation_target, new_annotation);
write("**Annotation added**\n\n");
goto_menu_silently(toplevel);
}
private void end_edit(string array annotation)
{
new_annotation->text = implode(annotation,"\n");
get_input_then_call((: rcv_can_ed :), "Allow anyone to remove this "
"annotation? ");
}
private void rcv_title(string title)
{
new_annotation->title = title;
new(EDIT_OB, EDIT_TEXT, 0, (: end_edit :));
}
private void add_annotation()
{
new_annotation = new(class annotation);
new_annotation->author = this_body()->query_userid();
get_input_then_call((: rcv_title :), "Subject: ");
}
private void rm_it(int a)
{
if(ANNOTATION_D->remove_annotation(annotation_target,a) != 1)
{
write("**You don't have permission to remove that annotation.**\n");
}
else
{
write("**Removed.**\n");
}
remove_annotation();
}
private void remove_annotation()
{
class annotation array ann;
class annotation a;
ann = ANNOTATION_D->retrieve_annotations(annotation_target);
if(!ann)
{
write("**No Annotations to remove.**\n\n");
return;
}
rm_annotations = new_menu("Remove Annotations");
for(int i = 0; i < sizeof(ann); i++)
{
a = ann[i];
add_menu_item (rm_annotations, new_menu_item(
sprintf("%-30s (%s on %s)",a->title,capitalize(a->author),
a->date), (:rm_it($(i)):)));
}
add_menu_item(rm_annotations, goto_main_menu_item);
add_menu_item(rm_annotations, quit_item);
goto_menu_silently(rm_annotations);
}
private void done_seeing_it()
{
write("\n\n");
}
private void see_it(int index)
{
class annotation a;
string output;
a = (ANNOTATION_D->retrieve_annotations(annotation_target)[index]);
if(!a)
{
write("**No annotations to view.**\n");
return;
}
output = sprintf("Title: %s\nAuthor: %s\n Date: %s\n"
"=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n%s\n",
a->title, capitalize(a->author), a->date, a->text);
more (output, 0, (:done_seeing_it:));
}
private void see_annotations()
{
class annotation array ann;
class annotation a;
ann = ANNOTATION_D->retrieve_annotations(annotation_target);
if(!ann)
{
write("**No Annotations to view.**\n\n");
return;
}
view_annotations = new_menu("View Annotations -- Which to view?");
for(int i = 0; i < sizeof(ann); i++)
{
a = ann[i];
add_menu_item (view_annotations,
new_menu_item(
sprintf("%-30s (%s on %s)",a->title,
capitalize(a->author),a->date),
(:see_it($(i)):)));
}
add_menu_item(view_annotations, goto_main_menu_item);
add_menu_item(view_annotations, quit_item);
goto_menu_silently(view_annotations);
}
void create(object o)
{
annotation_target = o;
toplevel = new_menu(mud_name()+" Annotation Menu");
quit_item = new_menu_item("Quit", (:quit_menu_application:), "q");
goto_main_menu_item =new_menu_item("Return to main menu",
toplevel, "m");
seperator =
new_seperator("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
// Add items to the toplevel (main) menu.
add_menu_item (toplevel, new_menu_item("Add annotation", (:add_annotation:),
"a"));
add_menu_item (toplevel, new_menu_item("View annotations",
(:see_annotations:), "v"));
add_menu_item (toplevel, new_menu_item("Remove an annotation",
(:remove_annotation:), "r"));
add_menu_item (toplevel, quit_item);
allow_empty_selection(toplevel);
set_no_match_function(toplevel,(:quit_if_cr:));
}
void start_menu()
{
init_menu_application(toplevel);
}