home *** CD-ROM | disk | FTP | other *** search
- /* --------------------------------------------------------------------------
- * Copyright 1992 by Forschungszentrum Informatik (FZI)
- *
- * You can use and distribute this software under the terms of the licence
- * you should have received along with this program.
- * If not or if you want additional information, write to
- * Forschungszentrum Informatik, "STONE", Haid-und-Neu-Strasse 10-14,
- * D-7500 Karlsruhe 1, Germany.
- * --------------------------------------------------------------------------
- */
- // **************************************************************************
- // Module dir_main Juergen Uhl (ju)
- //
- // **************************************************************************
- // SOS directory browser
- // **************************************************************************
-
- #include <sys/file.h> // avoid warning for flock
- #include <libc.h>
- #include <stdio.h>
-
- #include "sys.h"
- #include "smg.h"
- #include "sos.h"
-
- #include "dir_err.h"
- #include "dir_use.h"
-
- #define XTFUNCPROTO
-
- #include <X11/IntrinsicP.h>
- #include <X11/Shell.h>
- extern "C" {
- #include <X11/Xaw/List.h>
- #include <X11/Xaw/Form.h>
- #include <X11/Xaw/Command.h>
- #include <X11/Xaw/Label.h>
- #include <X11/Xaw/Text.h>
- #define ASCII_STRING
- #include <X11/Xaw/AsciiText.h>
- #include <X11/Xaw/Viewport.h>
- }
- #include <X11/StringDefs.h>
- #include <X11/cursorfont.h>
-
- #undef TRUE
- #undef FALSE
-
- // ************************ Types and Objects *************************
-
- const int default_distance = 4;
- Pixel red_pxl, green_pxl, blue_pxl;
-
- struct object_menu
- { sos_Object o;
- Widget w;
- sos_Bool is_open;
- char *path;
- int nr_comps;
- sos_Directory parent;
- sos_String name;
- sos_String *names;
- char **sl;
-
- object_menu(){}
- ~object_menu();
- };
-
- static int object_nr = 1;
-
- struct object_menu_item {sos_String name; char *s;};
- static struct omi_list
- { object_menu_item *omi;
- int nr_items;
-
- omi_list () {nr_items = 0;}
-
- void clear();
- void insert (sos_String name, char *s);
- void print (char *s);
- void print (smg_String &s);
- void make_object_menu (object_menu *om);
-
- } omis;
-
- enum ocmd_cmds {ocmd_DIRECTORY, ocmd_NEW, ocmd_DELETE,
- ocmd_MOVE, ocmd_REMOVE,
- ocmd_QUIT, ocmd_CLOSE};
- static char *ocmd_menu_items [8] =
- {"Directory", "new", "delete",
- "move", "remove", "quit", "close"};
- static Widget ocmd_menu;
- static object_menu *ocmd_current_menu;
- static ocmd_cmds ocmd_cmd;
-
- static class displayed_object_list
- { displayed_object_list *next;
- object_menu *om;
- Widget w;
- public:
- int number;
-
- displayed_object_list () {number = 0;}
-
- void insert (object_menu *om, Widget w);
- void remove (object_menu *om);
- Widget widget (sos_Object o);
- object_menu* menu (sos_Object o);
- } displayed_objects;
-
- struct position
- { int x, y;
- static position root ();
- static position at_widget (Widget w);
- static position next_to (Widget w);
- };
-
- static const int nr_menues = 1;
- static Widget menu_header[nr_menues];
- static Widget menu_list[nr_menues];
- enum hdr_cmds {hdr_FILE};
- static char* menu_header_items [nr_menues] = {"File"};
- enum file_cmds {file_ROOT, file_QUIT};
- static char* menu_list_items [nr_menues] [3] =
- { {"root", "quit"}
- };
- static int open_menu = nr_menues;
-
- const int ac_max = 30;
- Arg al[ac_max];
- int ac;
-
- Widget app_form_wdgt, form_wdgt;
-
- static struct
- { Widget main, txt;
- } txt_menu_wdgts;
-
- const int txt_length = 256;
- char txt_string [txt_length+1];
-
- Widget info_line_wdgt;
- const int info_length = 80;
- char info_string [info_length+1];
-
- // *********************** Global Functions ***************************
-
- static void draw_frame (Display *disp, Window win, GC dragGC,
- int win_x, int win_y,
- Dimension width, Dimension height);
- static void query_pointer (Display *disp, Window win,
- int &win_x, int &win_y,
- int xoffs, int yoffs);
- static void drag_object (Widget w,
- caddr_t client_data,
- XEvent *event);
-
- static char* elem_path (char *parent_path, sos_String name);
-
- static void object_callback (Widget w,
- caddr_t client_data,
- caddr_t call_data);
- static void ocmd_callback (Widget w,
- caddr_t client_data,
- caddr_t call_data);
-
- static void display_elements (sos_Directory d);
- static void display_object_menu (sos_Object o,
- sos_Directory parent,
- sos_String name,
- char *path,
- position pos);
- static void redisplay_object_menu (object_menu *om, sos_Bool moved = FALSE);
- static void delete_object_menu (object_menu *om);
-
- static void menu_list_callback (Widget w,
- caddr_t client_data,
- caddr_t call_data);
- static void menu_header_callback (Widget w,
- caddr_t client_data,
- caddr_t call_data);
-
- static void txt_cancel_callback (Widget w,
- caddr_t client_data,
- caddr_t call_data);
- static void txt_do_callback (Widget w,
- caddr_t client_data,
- caddr_t call_data);
- static void display_txt_menu();
-
- static void display_root();
- static void display_info (err_msg msg);
-
- static void install_header_menues ();
- static void install_ocmd_menu ();
- static void install_dialogues ();
-
- // ********************** SetValue Arguments **************************
-
- void inline inc_ac()
- { if (ac >= ac_max)
- { fprintf (stderr, "argument overflow\n");
- exit (1);
- }
- ac++;
- }
-
- // *************************** Dragging *******************************
-
- void draw_frame (Display *disp, Window win, GC dragGC,
- int win_x, int win_y,
- Dimension width, Dimension height)
- { XDrawRectangle (disp, win, dragGC, win_x, win_y, width, height);
- }
-
- void inline query_pointer (Display *disp, Window win,
- int &win_x, int &win_y,
- int xoffs, int yoffs)
- { Window rootwin, childwin;
- int root_x, root_y;
- unsigned int mask;
-
- XQueryPointer (disp, win,
- &rootwin, &childwin,
- &root_x, &root_y,
- &win_x, &win_y, &mask);
- win_x -= xoffs; if (win_x < 0) win_x = 0;
- win_y -= yoffs; if (win_y < 0) win_y = 0;
- }
-
- void drag_object (Widget w, caddr_t, XEvent *event)
- { XEvent ev;
- Widget parent = XtParent (w);
- Display *disp = XtDisplay (parent);
- Window win = XtWindow (parent);
- GC dragGC;
- Dimension width, height, borderwidth;
- int win_x, win_y;
- int xoffs, yoffs;
- static int initGC = TRUE;
-
-
- if (event->xbutton.button != 2) return;
-
- // GC beim ersten Aufruf initialisieren
- if (initGC == TRUE)
- {
- dragGC = XCreateGC (disp, win, 0, NULL);
- XSetForeground (disp, dragGC, BlackPixel (disp, 0));
- XSetSubwindowMode (disp, dragGC, IncludeInferiors);
- XSetFunction (disp, dragGC, GXxor);
- }
-
- ac=0;
- XtSetArg (al[ac], XtNwidth, &width); inc_ac();
- XtSetArg (al[ac], XtNheight, &height); inc_ac();
- XtSetArg (al[ac], XtNborderWidth, &borderwidth); inc_ac();
- XtGetValues (w, al, ac);
-
- xoffs = event->xbutton.x + borderwidth;
- yoffs = event->xbutton.y + borderwidth;
-
- query_pointer (disp, win, win_x, win_y, xoffs, yoffs);
- draw_frame (disp, win, dragGC, win_x, win_y, width, height);
-
- XChangeActivePointerGrab (disp,
- (unsigned int) (ButtonReleaseMask |
- ButtonMotionMask |
- OwnerGrabButtonMask),
- XCreateFontCursor (disp, XC_fleur),
- CurrentTime);
- while (TRUE)
- { XtNextEvent (&ev);
- switch (ev.type)
- { case MotionNotify:
- draw_frame (disp, win, dragGC, win_x, win_y, width, height);
- query_pointer (disp, win, win_x, win_y, xoffs, yoffs);
- draw_frame (disp, win, dragGC, win_x, win_y, width, height);
- break;
- case ButtonRelease:
- if (ev.xbutton.button == 2)
- { draw_frame (disp, win, dragGC, win_x, win_y, width, height);
- query_pointer (disp, win, win_x, win_y, xoffs, yoffs);
-
- XtMoveWidget (w, win_x, win_y);
- XRaiseWindow (XtDisplay (w), XtWindow (w));
- ac=0;
- XtSetArg (al[ac], XtNhorizDistance, win_x); inc_ac();
- XtSetArg (al[ac], XtNvertDistance, win_y); inc_ac();
- XtSetValues (w, al, ac);
- XtUnmanageChild (w);
- XtManageChild (w);
- return;
- }
- break;
- }
- }
- }
-
- // ****************************** Paths ********************************
-
- char *elem_path (char *parent_path, sos_String name)
- { char *path = new char [strlen (parent_path) + name.get_length() + 2];
- char *s = name.make_Cstring();
- strcpy (path, parent_path);
- if (strlen (parent_path) > 1) strcat (path, "/");
- strcat (path, s);
- delete s;
- return path;
- }
-
- // ************************* Object Menues ****************************
-
- object_menu::~object_menu()
- { for (int i=0; i<nr_comps; i++)
- delete sl[i];
- delete path;
- delete names;
- delete sl;
- }
-
- void omi_list::clear ()
- { omi = 0;
- nr_items = 0;
- }
-
- void omi_list::insert (sos_String name, char *s)
- { if (nr_items % 10 == 0)
- { object_menu_item *new_omi = new object_menu_item [nr_items+10];
- for (int i=0; i<nr_items; i++)
- new_omi[i] = omi[i];
- delete omi;
- omi = new_omi;
- }
- omi [nr_items].s = new char [strlen(s)+1];
- strcpy (omi [nr_items].s, s);
- omi [nr_items].name = name;
- nr_items++;
- }
-
- void omi_list::print (char *s)
- { char *new_str = new char [strlen (s) + strlen (omi [nr_items-1].s) + 1];
- strcpy (new_str, omi [nr_items-1].s);
- strcat (new_str, s);
- delete omi [nr_items-1].s;
- omi [nr_items-1].s = new_str;
- }
-
- void omi_list::print (smg_String &s)
- { print (s.make_Cstring(SMG_BORROW));
- }
-
- static int compare_omi (void *c1, void *c2)
- { return strcmp (((object_menu_item*)c1)->s, ((object_menu_item*)c2)->s);
- }
-
- void omi_list::make_object_menu (object_menu *om)
- { qsort (&omi[1], nr_items-1, sizeof(object_menu_item), compare_omi);
- char **sl = new char* [nr_items];
- sos_String *names = new sos_String [nr_items];
- om->nr_comps = nr_items;
- om->sl = sl;
- om->names = names;
- for (int i=0; i<nr_items; i++)
- { sl[i] = omi[i].s;
- names[i] = omi[i].name;
- }
- }
-
- void object_callback (Widget w, caddr_t client_data, caddr_t call_data)
- { int i = ((XawListReturnStruct*) call_data)->list_index;
- object_menu *om = (object_menu*) client_data;
-
- XawListUnhighlight (w);
-
- if (i == 0)
- { position pos = position::at_widget (w);
- XawListHighlight (ocmd_menu, 0);
- XtMoveWidget (ocmd_menu, pos.x, pos.y);
- XtMapWidget (ocmd_menu);
- XRaiseWindow (XtDisplay (ocmd_menu), XtWindow (ocmd_menu));
- XtAddGrab (ocmd_menu, TRUE, FALSE);
- ocmd_current_menu = om;
- }
- else
- { sos_Directory dir = sos_Object_Directory::make (om->o);
- char *path = elem_path (om->path, om->names[i]);
- display_object_menu
- (dir [om->names[i]], dir, om->names[i], path, position::next_to (w));
- }
- }
-
- // ********************** Object Command Menu *************************
-
- void new_directory (object_menu *om)
- { sos_String name = smg_String (txt_string).make_String (TEMP_CONTAINER);
- sos_Container new_cnt = sos_Container::create();
- sos_Directory new_dir = sos_Object_Directory::create (new_cnt, name);
- new_cnt.close();
- sos_Directory this_dir = sos_Object_Directory::make (om->o);
- sos_Container this_ct = this_dir.container();
- this_ct.open (WRITING, WAITING);
- this_dir.insert (name, new_dir);
- this_ct.close ();
-
- Widget this_w = om->w;
- char *path = elem_path (om->path, name);
- display_object_menu
- (new_dir, this_dir, name, path, position::next_to (this_w));
- redisplay_object_menu (om);
- }
-
- sos_Bool move_elem (object_menu *om)
- { sos_Bool error = FALSE;
- sos_String dest_str =
- smg_String (txt_string).make_String (TEMP_CONTAINER);
- sos_Object dest_o = sos_Object_Directory::lookup (dest_str);
- if (dest_o == NO_OBJECT OR NOT dest_o.is_some (sos_Object_Directory_type))
- { display_info ("destination directory does not exist");
- error = TRUE;
- }
- else
- { sos_Directory dest_dir = sos_Object_Directory::make (dest_o);
- om->parent = dest_dir;
- char *path = elem_path (txt_string, om->name);
- delete om->path;
- om->path = path;
- sos_Container cnt = dest_dir.container();
- cnt.open (WRITING, WAITING);
- dest_dir.insert (om->name, om->o);
- cnt.close ();
- cnt = om->parent.container();
- cnt.open (WRITING, WAITING);
- om->parent.remove (om->name);
- cnt.close ();
- redisplay_object_menu (displayed_objects.menu (om->parent));
- redisplay_object_menu (displayed_objects.menu (dest_dir));
- redisplay_object_menu (om, TRUE);
- }
- return error;
- }
-
- void remove_elem (object_menu *om)
- { sos_Container parent_cnt = om->parent.container();
- parent_cnt.open (WRITING, WAITING);
- om->parent.remove (om->name);
- parent_cnt.close ();
- redisplay_object_menu (displayed_objects.menu (om->parent));
- delete_object_menu (om);
- }
-
- void ocmd_callback (Widget, caddr_t, caddr_t call_data)
- { ocmd_cmd = ocmd_cmds (((XawListReturnStruct*) call_data)->list_index);
- object_menu *om = ocmd_current_menu;
-
- XtRemoveGrab (ocmd_menu);
- XtUnmapWidget (ocmd_menu);
-
- sos_Object o, parent;
-
- switch (ocmd_cmd)
- { case ocmd_DIRECTORY:
- break;
- case ocmd_NEW:
- o = om->o;
- if (NOT o.is_some (sos_Object_Directory_type))
- display_info ("no directory");
- else
- display_txt_menu();
- break;
- case ocmd_DELETE:
- o = om->o;
- parent = om->parent;
- if (NOT o.is_some (sos_Object_Directory_type))
- display_info ("no directory");
- else if (parent == NO_OBJECT)
- display_info ("root directory must not be deleted");
- else
- { remove_elem (om);
- sos_Container cnt = o.container();
- cnt.open (WRITING, WAITING);
- o.destroy();
- cnt.close ();
- }
- break;
- case ocmd_MOVE:
- parent = om->parent;
- if (parent == NO_OBJECT)
- display_info ("root directory must not be moved");
- else
- display_txt_menu();
- break;
- case ocmd_REMOVE:
- parent = om->parent;
- if (parent == NO_OBJECT)
- display_info ("root directory must not be removed");
- else
- remove_elem (om);
- break;
- case ocmd_QUIT:
- delete_object_menu (om);
- break;
- case ocmd_CLOSE:
- XtUnmapWidget (om->w);
- om->is_open = FALSE;
- break;
- default:
- break;
- }
- }
-
- // ************************* Dumped Objects ***************************
-
- void displayed_object_list::insert (object_menu *om, Widget w)
- { displayed_object_list *ol = new displayed_object_list;
- ol->next = next;
- ol->om = om;
- ol->w = w;
- next = ol;
- number++;
- }
-
- void displayed_object_list::remove (object_menu *om)
- { for (displayed_object_list *ol = this; ol->next; ol=ol->next)
- if (ol->next->om == om)
- { displayed_object_list *od = ol->next;
- ol->next = ol->next->next;
- XtDestroyWidget (od->w);
- delete od;
- delete om;
- return;
- }
- }
-
- Widget displayed_object_list::widget (sos_Object o)
- { for (displayed_object_list *ol = next; ol; ol=ol->next)
- if (ol->om->o == o)
- return ol->w;
- return NULL;
- }
-
- object_menu* displayed_object_list::menu (sos_Object o)
- { for (displayed_object_list *ol = next; ol; ol=ol->next)
- if (ol->om->o == o)
- return ol->om;
- return 0;
- }
-
- // ************************ Widget Positions **************************
-
- position position::root ()
- { position result;
- result.x = default_distance;
- result.y = default_distance;
- return result;
- }
-
- position position::at_widget (Widget w)
- { ac=0;
- position result;
- int width;
-
- XtSetArg (al[ac], XtNhorizDistance, &result.x); inc_ac();
- XtSetArg (al[ac], XtNvertDistance, &result.y); inc_ac();
- XtSetArg (al[ac], XtNwidth, &width); inc_ac();
- XtGetValues (w, al, ac);
- return result;
- }
-
- position position::next_to (Widget w)
- { ac=0;
- position result;
- Dimension width;
-
- XtSetArg (al[ac], XtNhorizDistance, &result.x); inc_ac();
- XtSetArg (al[ac], XtNvertDistance, &result.y); inc_ac();
- XtSetArg (al[ac], XtNwidth, &width); inc_ac();
- XtGetValues (w, al, ac);
- result.x += width + default_distance;
- return result;
- }
-
- // ******************* Display Object Components **********************
-
- void display_elements (sos_Directory d)
- { agg_iterate_association (d, sos_String name, sos_Object elem)
- { omis.insert (name, "");
- omis.print (name.make_Cstring());
- omis.print (" (");
- omis.print (elem.type().get_name().make_Cstring());
- omis.print (")");
- }
- agg_iterate_association_end (d, name, elem);
- }
-
- void redisplay_object_menu (object_menu *om, sos_Bool moved /* = FALSE */)
- { if (om != 0)
- { char *path = strdup (om->path);
- sos_Object om_o = om->o;
- sos_Directory om_parent = om->parent;
- sos_String om_name = om->name;
- Widget om_w = om->w;
- sos_Bool om_is_open = om->is_open;
- displayed_objects.remove (om);
- display_object_menu
- (om_o, om_parent, om_name,
- path, position::at_widget (om_w));
- if (NOT om_is_open)
- { om = displayed_objects.menu (om_o);
- XtUnmapWidget (om->w);
- om->is_open = FALSE;
- }
-
- if (moved AND om_o.is_some (sos_Object_Directory_type))
- { sos_Directory dir = sos_Object_Directory::make (om_o);
- agg_iterate_association (dir, sos_String name, sos_Object elem)
- { om = displayed_objects.menu (elem);
- if (om != 0)
- { om->path = elem_path (path, name);
- redisplay_object_menu (om, TRUE);
- }
- }
- agg_iterate_association_end (dir, name, elem);
- }
- }
- }
-
- void delete_object_menu (object_menu *om)
- { if (om != 0)
- { sos_Object om_o = om->o;
- displayed_objects.remove (om);
- if (om_o.is_some (sos_Object_Directory_type))
- { sos_Directory dir = sos_Object_Directory::make (om_o);
- agg_iterate_association (dir, sos_String name, sos_Object elem)
- { delete_object_menu (displayed_objects.menu (elem));
- }
- agg_iterate_association_end (dir, name, elem);
- }
- }
- }
-
- void display_object_menu (sos_Object o,
- sos_Directory parent,
- sos_String name,
- char *path,
- position pos)
- { if (o == NO_OBJECT) return;
-
- // determine new window position
-
- object_menu *om = displayed_objects.menu (o);
- if (om) // object is already displayed
- { Widget wo = displayed_objects.widget (o);
- XtMoveWidget (wo, pos.x, pos.y);
- XRaiseWindow (XtDisplay (wo), XtWindow (wo));
- ac=0;
- XtSetArg (al[ac], XtNhorizDistance, pos.x); inc_ac();
- XtSetArg (al[ac], XtNvertDistance, pos.y); inc_ac();
- XtSetValues (wo, al, ac);
- XtUnmanageChild (wo);
- XtManageChild (wo);
- }
- else // construct new object widget
- { omis.clear();
-
- omis.insert (sos_String::make (NO_OBJECT), path);
- if (o.is_some (sos_Object_Directory_type))
- display_elements (sos_Object_Directory::make (o));
- else
- { omis.print (" (");
- omis.print (o.type().get_name().make_Cstring());
- omis.print (")");
- }
-
- object_menu *om = new object_menu;
- om->o = o;
- om->is_open = TRUE;
- om->name = name;
- om->parent = parent;
- om->path = path;
- omis.make_object_menu (om);
-
- ac=0;
- XtSetArg (al[ac], XtNnumberStrings, omis.nr_items); inc_ac();
- XtSetArg (al[ac], XtNlist, om->sl); inc_ac();
- XtSetArg (al[ac], XtNverticalList, TRUE); inc_ac();
- XtSetArg (al[ac], XtNforceColumns, TRUE); inc_ac();
- XtSetArg (al[ac], XtNdefaultColumns, 1); inc_ac();
-
- XtSetArg (al[ac], XtNtop, XtChainTop); inc_ac();
- XtSetArg (al[ac], XtNbottom, XtChainTop); inc_ac();
- XtSetArg (al[ac], XtNleft, XtChainLeft); inc_ac();
- XtSetArg (al[ac], XtNright, XtChainLeft); inc_ac();
-
- XtSetArg (al[ac], XtNhorizDistance, pos.x); inc_ac();
- XtSetArg (al[ac], XtNvertDistance, pos.y); inc_ac();
-
- XtSetArg (al[ac], XtNborderWidth, 2); inc_ac();
- XtSetArg (al[ac], XtNborderColor, red_pxl); inc_ac();
- XtSetArg (al[ac], XtNforeground, blue_pxl); inc_ac();
-
- char name [20];
- sprintf (name, "o%d", object_nr);
- object_nr++;
-
- om->w = XtCreateManagedWidget
- (name, listWidgetClass, form_wdgt, al, ac);
- XtAddCallback (om->w, XtNcallback,
- (XtCallbackProc) object_callback, (caddr_t) om);
- XtAddEventHandler (om->w, ButtonPressMask, FALSE,
- (XtEventHandler) drag_object, NULL);
-
- XRaiseWindow (XtDisplay (om->w), XtWindow (om->w));
- displayed_objects.insert (om, om->w);
- }
- }
-
- // **************************** Menues ********************************
-
- void menu_list_callback (Widget w, caddr_t client_data, caddr_t call_data)
- { XawListReturnStruct *l = (XawListReturnStruct*) call_data;
- hdr_cmds hdr_cmd = hdr_cmds (client_data);
-
- XawListUnhighlight (w);
-
- XtRemoveGrab (menu_header[0]);
- open_menu = nr_menues;
- XtUnmapWidget (w);
-
- switch (hdr_cmd)
- { case hdr_FILE:
- file_cmds file_cmd = file_cmds (l->list_index);
- switch (file_cmd)
- { case file_ROOT:
- display_root();
- break;
- case file_QUIT:
- exit (0);
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
- }
-
- void menu_header_callback (Widget, caddr_t client_data, caddr_t)
- { int i = (int) client_data;
- Widget lw = menu_list[i];
-
- if (i == open_menu)
- { XtRemoveGrab (menu_header[0]);
- open_menu = nr_menues;
- XtUnmapWidget (lw);
- }
- else
- { if (open_menu < nr_menues)
- { XtRemoveGrab (menu_list[open_menu]);
- XtUnmapWidget (menu_list[open_menu]);
- }
- else
- { for (int j=0; j<nr_menues; j++)
- XtAddGrab (menu_header[j], FALSE, FALSE);
- }
- open_menu = i;
- XtMapWidget (lw);
- XRaiseWindow (XtDisplay (lw), XtWindow (lw));
- XtAddGrab (lw, FALSE, FALSE);
- }
- }
-
- void install_header_menues ()
- { char name[20];
- Widget w;
-
- for (int i=0; i<nr_menues; i++)
- { if (i==0) w = NULL;
- else w = menu_header[i-1];
-
- ac=0;
- XtSetArg (al[ac], XtNborderWidth, 0); inc_ac();
- XtSetArg (al[ac], XtNlabel, menu_header_items[i]); inc_ac();
- XtSetArg (al[ac], XtNfromHoriz, w); inc_ac();
- XtSetArg (al[ac], XtNhorizDistance, 0); inc_ac();
- XtSetArg (al[ac], XtNvertDistance, 0); inc_ac();
- XtSetArg (al[ac], XtNtop, XtChainTop); inc_ac();
- XtSetArg (al[ac], XtNbottom, XtChainTop); inc_ac();
- XtSetArg (al[ac], XtNleft, XtChainLeft); inc_ac();
- XtSetArg (al[ac], XtNright, XtChainLeft); inc_ac();
-
- XtSetArg (al[ac], XtNforeground, red_pxl); inc_ac();
-
- sprintf (name, "menu_label%d", i);
- menu_header[i] = XtCreateManagedWidget
- (name, commandWidgetClass, app_form_wdgt, al, ac);
- XtAddCallback (menu_header[i], XtNcallback,
- (XtCallbackProc) menu_header_callback, (caddr_t) i);
-
- ac=0;
- XtSetArg (al[ac], XtNlist, menu_list_items[i]); inc_ac();
- XtSetArg (al[ac], XtNverticalList, TRUE); inc_ac();
- XtSetArg (al[ac], XtNforceColumns, TRUE); inc_ac();
- XtSetArg (al[ac], XtNdefaultColumns, 1); inc_ac();
- XtSetArg (al[ac], XtNmappedWhenManaged, FALSE); inc_ac();
- XtSetArg (al[ac], XtNfromHoriz, w); inc_ac();
- XtSetArg (al[ac], XtNfromVert, menu_header[i]); inc_ac();
- XtSetArg (al[ac], XtNhorizDistance, 0); inc_ac();
- XtSetArg (al[ac], XtNvertDistance, 0); inc_ac();
- XtSetArg (al[ac], XtNtop, XtChainTop); inc_ac();
- XtSetArg (al[ac], XtNbottom, XtChainTop); inc_ac();
- XtSetArg (al[ac], XtNleft, XtChainLeft); inc_ac();
- XtSetArg (al[ac], XtNright, XtChainLeft); inc_ac();
-
- XtSetArg (al[ac], XtNborderWidth, 2); inc_ac();
- XtSetArg (al[ac], XtNborderColor, red_pxl); inc_ac();
- XtSetArg (al[ac], XtNforeground, green_pxl); inc_ac();
-
- sprintf (name, "menu_list%d", i);
- menu_list[i] = XtCreateManagedWidget
- (name, listWidgetClass, app_form_wdgt, al, ac);
- XtAddCallback (menu_list[i], XtNcallback,
- (XtCallbackProc) menu_list_callback, (caddr_t) i);
- }
- }
-
- static void install_ocmd_menu ()
- { ac=0;
- XtSetArg (al[ac], XtNlist, ocmd_menu_items); inc_ac();
- XtSetArg (al[ac], XtNverticalList, TRUE); inc_ac();
- XtSetArg (al[ac], XtNforceColumns, TRUE); inc_ac();
- XtSetArg (al[ac], XtNdefaultColumns, 1); inc_ac();
- XtSetArg (al[ac], XtNmappedWhenManaged, FALSE); inc_ac();
- XtSetArg (al[ac], XtNtop, XtChainTop); inc_ac();
- XtSetArg (al[ac], XtNbottom, XtChainTop); inc_ac();
- XtSetArg (al[ac], XtNleft, XtChainLeft); inc_ac();
- XtSetArg (al[ac], XtNright, XtChainLeft); inc_ac();
- ocmd_menu = XtCreateManagedWidget
- ("ocmd", listWidgetClass, form_wdgt, al, ac);
- XtAddCallback (ocmd_menu, XtNcallback,
- (XtCallbackProc) ocmd_callback, NULL);
- }
-
- // ************************** Dialogues *******************************
-
- void txt_cancel_callback (Widget, caddr_t, caddr_t)
- { XtRemoveGrab (txt_menu_wdgts.main);
- XtUnmapWidget (txt_menu_wdgts.main);
- }
-
- void txt_do_callback (Widget, caddr_t, caddr_t)
- { object_menu *om = ocmd_current_menu;
- sos_Bool error = FALSE;
-
- err_block
- { switch (ocmd_cmd)
- { case ocmd_NEW:
- new_directory (om);
- break;
- case ocmd_MOVE:
- error = move_elem (om);
- break;
- default:
- break;
- }
- }
- err_exception
- { display_info(err_last_raised());
- error = TRUE;
- }
- err_block_end
-
- if (NOT error)
- { XtRemoveGrab (txt_menu_wdgts.main);
- XtUnmapWidget (txt_menu_wdgts.main);
- }
- }
-
- void display_txt_menu()
- { XawTextBlock tb;
- tb.firstPos = 0;
- tb.length = 0;
- tb.ptr = 0;
- tb.format = FMT8BIT;
- XawTextReplace (txt_menu_wdgts.txt, 0, strlen (txt_string), &tb);
-
- XtMapWidget (txt_menu_wdgts.main);
- XRaiseWindow (XtDisplay (txt_menu_wdgts.main),
- XtWindow (txt_menu_wdgts.main));
-
- XtAddGrab (txt_menu_wdgts.main, TRUE, FALSE);
- }
-
- void install_dialogues ()
- { Widget cancel_but, do_but, name_lab;
-
- // ******************* txt dialogue *************************
-
- ac=0;
- XtSetArg (al[ac], XtNvertDistance, 30); inc_ac();
- XtSetArg (al[ac], XtNhorizDistance, 30); inc_ac();
- XtSetArg (al[ac], XtNtop, XtChainTop); inc_ac();
- XtSetArg (al[ac], XtNbottom, XtChainTop); inc_ac();
- XtSetArg (al[ac], XtNleft, XtChainLeft); inc_ac();
- XtSetArg (al[ac], XtNright, XtChainLeft); inc_ac();
- XtSetArg (al[ac], XtNmappedWhenManaged, FALSE); inc_ac();
- txt_menu_wdgts.main = XtCreateManagedWidget
- ("txt.main", formWidgetClass, form_wdgt, al, ac);
- XtAddEventHandler (txt_menu_wdgts.main, ButtonPressMask, FALSE,
- (XtEventHandler) drag_object, NULL);
-
- ac=0;
- XtSetArg (al[ac], XtNlabel, "name"); inc_ac();
- XtSetArg (al[ac], XtNborderWidth, 0); inc_ac();
- name_lab = XtCreateManagedWidget
- ("txt.name_lab", labelWidgetClass, txt_menu_wdgts.main, al, ac);
-
- ac=0;
- XtSetArg (al[ac], XtNlength, txt_length); inc_ac();
- XtSetArg (al[ac], XtNstring, txt_string); inc_ac();
- XtSetArg (al[ac], XtNwidth, 200); inc_ac();
- XtSetArg (al[ac], XtNfromHoriz, name_lab); inc_ac();
- XtSetArg (al[ac], XtNeditType, XawtextEdit); inc_ac();
- XtSetArg (al[ac], XtNscrollHorizontal, TRUE); inc_ac();
- XtSetArg (al[ac], XtNheight, 30); inc_ac();
- txt_menu_wdgts.txt = XtCreateManagedWidget
- ("txt.txt", asciiStringWidgetClass, txt_menu_wdgts.main, al, ac);
- XawTextEnableRedisplay (txt_menu_wdgts.txt);
-
- ac=0;
- XtSetArg (al[ac], XtNlabel, " do "); inc_ac();
- XtSetArg (al[ac], XtNfromVert, txt_menu_wdgts.txt); inc_ac();
- do_but = XtCreateManagedWidget
- ("txt.do", commandWidgetClass, txt_menu_wdgts.main, al, ac);
- XtAddCallback (do_but, XtNcallback,
- (XtCallbackProc) txt_do_callback, NULL);
-
- ac=0;
- XtSetArg (al[ac], XtNlabel, "cancel"); inc_ac();
- XtSetArg (al[ac], XtNfromVert, txt_menu_wdgts.txt); inc_ac();
- XtSetArg (al[ac], XtNfromHoriz, do_but); inc_ac();
- XtSetArg (al[ac], XtNhorizDistance, 20); inc_ac();
- cancel_but = XtCreateManagedWidget
- ("txt.cancel", commandWidgetClass, txt_menu_wdgts.main, al, ac);
- XtAddCallback (cancel_but, XtNcallback,
- (XtCallbackProc) txt_cancel_callback, NULL);
-
- }
-
- void display_root()
- { display_object_menu
- (sos_Object_Directory::root(),
- sos_Object_Directory::make (NO_OBJECT),
- sos_String::make (NO_OBJECT),
- strdup ("/"),
- position::root());
- }
-
- void display_info (err_msg msg)
- { strncpy (info_string, msg, info_length);
- info_string [info_length] = 0;
- ac=0;
- XtSetArg (al[ac], XtNlabel, info_string); inc_ac();
- XtSetValues (info_line_wdgt, al, ac);
- }
-
- // ***************************** Main *********************************
-
- main (int argc, char *argv[])
- { Widget app_shell;
- Widget app_view;
-
- sos_init (argc, argv);
-
- app_shell = XtInitialize ("main", "Dir", NULL, 0, (Cardinal*) &argc, argv);
-
- Display *disp = XtDisplay (app_shell);
- Colormap cmap = DefaultColormap (disp, 0);
- XColor color, exact;
- XAllocNamedColor (disp, cmap, "red", &color, &exact);
- red_pxl = color.pixel;
- XAllocNamedColor (disp, cmap, "forest green", &color, &exact);
- green_pxl = color.pixel;
- XAllocNamedColor (disp, cmap, "blue", &color, &exact);
- blue_pxl = color.pixel;
-
- ac=0;
- XtSetArg (al[ac], XtNdefaultDistance, 0); inc_ac();
- app_form_wdgt = XtCreateManagedWidget
- ("app_form", formWidgetClass, app_shell, al, ac);
-
- install_header_menues ();
-
- ac=0;
- XtSetArg (al[ac], XtNforceBars, TRUE); inc_ac();
- XtSetArg (al[ac], XtNallowHoriz, TRUE); inc_ac();
- XtSetArg (al[ac], XtNallowVert, TRUE); inc_ac();
- XtSetArg (al[ac], XtNuseBottom, TRUE); inc_ac();
- XtSetArg (al[ac], XtNuseRight, TRUE); inc_ac();
- XtSetArg (al[ac], XtNheight, 500); inc_ac();
- XtSetArg (al[ac], XtNwidth, 800); inc_ac();
- XtSetArg (al[ac], XtNfromVert, menu_header[0]); inc_ac();
- XtSetArg (al[ac], XtNtop, XtChainTop); inc_ac();
- XtSetArg (al[ac], XtNbottom, XtChainBottom); inc_ac();
- XtSetArg (al[ac], XtNleft, XtChainLeft); inc_ac();
- XtSetArg (al[ac], XtNright, XtChainRight); inc_ac();
- app_view = XtCreateManagedWidget
- ("app_view", viewportWidgetClass, app_form_wdgt, al, ac);
-
- ac=0;
- XtSetArg (al[ac], XtNdefaultDistance, default_distance); inc_ac();
- form_wdgt = XtCreateManagedWidget
- ("form", formWidgetClass, app_view, al, ac);
-
- install_dialogues ();
- install_ocmd_menu ();
-
- strcpy (info_string, "");
- ac=0;
- XtSetArg (al[ac], XtNlabel, info_string); inc_ac();
- XtSetArg (al[ac], XtNborderWidth, 0); inc_ac();
- XtSetArg (al[ac], XtNwidth, 800); inc_ac();
- XtSetArg (al[ac], XtNjustify, XtJustifyLeft); inc_ac();
- XtSetArg (al[ac], XtNfromVert, app_view); inc_ac();
- XtSetArg (al[ac], XtNtop, XtChainTop); inc_ac();
- XtSetArg (al[ac], XtNbottom, XtChainBottom); inc_ac();
- XtSetArg (al[ac], XtNleft, XtChainLeft); inc_ac();
- XtSetArg (al[ac], XtNright, XtChainRight); inc_ac();
- info_line_wdgt = XtCreateManagedWidget
- ("info_line", labelWidgetClass, app_form_wdgt, al, ac);
-
- XtRealizeWidget (app_shell);
-
- display_root();
-
- XtMainLoop ();
-
- exit (0);
- }
-