/*********************************************************** * AOP Calendar file * ************************************************************ * Description: * * * * Created by: avrami tzur * * At: Wed Oct 21 12:02:51 1992 * ***********************************************************/ /* INCLUDES */ # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include /* for printing error messages */ # include # include /* for stat() ** needs types.h ***/ # include # include # include # include "AOPcalendar.h" # include "structures.h" typedef struct day_user_data_struct *user_dataP; struct day_user_data_struct { int wday ; int year; int month; int day; int app_counter; dayAppP app_array; Widget list_window; int app_num; }; /* DECLARATIONS */ void main(int argc, char **argv); static void initWindow(int argc, char **argv); static void createMainWindow(Widget parent); static void refreshScreen(int year, int month, int day); static void refreshCalInfo(time_t time_value); static Widget appointmentEditor(Widget parent, char *title, user_dataP user_data); static void refreshAppEditor(Widget form, user_dataP user_data); static void refreshAppList(user_dataP user_data); static Widget usersList(Widget parent, char *title); static void loadUsersList(Widget list); static char **loadUsersFile(int *counter); static void errorPopUp(Widget perant, char *message); static int intToTime(int clock24, char *clock12); static int timeToInt(char *time_s, int am_pm); static int emptyString(char *buffer); static void clearAppEditor(Widget form); static int verifiedAppData(struct dayApp *app_rec, WidgetList children, user_dataP user_data); static void getFileInput(XtPointer client_data, int *fid,XtInputId *id); void send_to_agent(term_ptr agent_term, term_ptr term); static void handle_interpreter_term(term_ptr term); /* Callback functions */ static void nextWeekCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data); static void prevWeekCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data); static void daysCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data); static void appListCB(Widget w, XtPointer client_data, XmListCallbackStruct *call_data); static void appEditorCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data); static void destroyCB(Widget w, XtPointer client_data, XmAnyCallbackStruct *call_data); static void partiCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data); static void usersListCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data); static int verifiedScheduleData(struct dayApp *app_rec, WidgetList children, user_dataP user_data); void delete_appointment(term_ptr term); void insert_appointment(term_ptr term); void enquire_appointment(term_ptr term); extern int errno; int input_pipe, output_pipe; static Widget top_level; static Widget days_labels[7], days_desc[7], week_label; static XtAppContext app_context; static struct _calendar_date { int month; int day; int year; } calendar_date; static char *month_table[] = {"Janurary", "Feburary", "March", "April", "May", "June","July","August", "September","October","November","December"}; static char *days_table[] = {"Mon","Tue","Wed","Thu","Fri","Sat","Sun"}; static struct day_user_data_struct day_user_data[7]; static time_t current_monday; term_ptr default_scheduler; /*********************************************************** * Calendar interpreter interface functions * ************************************************************ * Description: * * * * Created by: Avrami Tzur * * At: Tue Nov 17 13:12:40 1992 * ***********************************************************/ /* INCLUDES */ /* DECLARATIONS */ void userInsertAppointment(int year, int month, int day, dayAppP day_rec); void userDeleteAppointment(int year, int month, int day, dayAppP day_rec); void userScheduleAppointment(int year, int month, int day, dayAppP day_rec); int apiInsertAppointment(int year, int month, int day, dayAppP day_rec); int apiDeleteAppointment(int year, int month, int day, dayAppP day_rec); dayAppP apiGetDateAppointments(int year, int month, int day, int *counter); dayAppP apiGetAppointment(int year, int month, int day, int start); /* ============================================================ | apiInsertAppointment() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Tue Nov 17 15:42:39 1992 | |==========================================================| */ int apiInsertAppointment(int year, int month, int day, dayAppP day_rec) { int ret; /* Insert to the database. */ if((ret = apiDbInsertAppointment(day_rec, year, month, day)) == CAL_OK) { /* Refresh the screen. */ refreshScreen(year, month, day); } return(ret); } /* ============================================================ | apiDeleteAppointment() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Tue Nov 17 15:46:38 1992 | |==========================================================| */ int apiDeleteAppointment(int year, int month, int day, dayAppP day_rec) { int ret; /* Insert to the database. */ if((ret = apiDbDeleteAppointment(year, month, day, day_rec->start)) == CAL_OK) { /* Refresh the screen. */ refreshScreen(year, month, day); } return(ret); } /* /* ============================================================ | apiGetDateAppointments() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Tue Nov 17 15:49:49 1992 | |==========================================================| */ dayAppP apiGetDateAppointments(int year, int month, int day, int *counter) { return(apiDbGetDateAppointments(year, month, day, counter)); } /* ============================================================ | apiGetAppointment() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Tue Nov 17 15:51:35 1992 | |==========================================================| */ dayAppP apiGetAppointment(int year, int month, int day, int start) { return(apiDbGetAppointment(year, month, day, start)); } /* ============================================================ | main() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: avrami tzur | | At: Wed Oct 21 12:03:07 1992 | |==========================================================| */ void main(int argc, char **argv) { /* Called from interpreter */ /* Initilize the pipes. */ input_pipe = atoi(argv[1]); fcntl(input_pipe, F_SETFL, O_NDELAY); output_pipe = atoi(argv[2]); /* Initilize the database engein. */ apiDbInitilizeDb(NULL); initWindow(argc,argv); XtAppMainLoop(app_context); } /* ============================================================ | initWindow() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: avrami tzur | | At: Wed Oct 21 12:05:27 1992 | |==========================================================| */ static void initWindow(int argc, char **argv) { Arg args[20]; int counter; /* Set the geometry. */ counter = 0; XtSetArg(args[counter],XmNgeometry, "-100-100");counter++; XtSetArg(args[counter],XmNtitle, " AOP calendar ");counter++; top_level = XtAppInitialize(&app_context, "Main",NULL,0, &argc, argv, NULL,args,counter); /* Register the pipe . */ /* Add the pipe as an input event for the window loop. */ XtAppAddInput(app_context, input_pipe, XtInputReadMask, getFileInput, NULL); /* Create the calendar main window. */ createMainWindow(top_level); /* Initilize the calendar info */ refreshCalInfo(time(NULL)); /* Activate window manager */ XtRealizeWidget(top_level); } /* ============================================================ | refreshScreen() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Tue Nov 17 15:56:54 1992 | |==========================================================| */ static void refreshScreen(int year, int month, int day) { int i; /* Am I displing this day currently? */ i=0; while(i<7) { if((day_user_data[i].year == year)&&(day_user_data[i].month == month)&& (day_user_data[i].day == day)) break; else i++; } if(i<7) { /* Need to refresh. */ /* Refresh the main screen. */ refreshCalInfo(current_monday); /* Do I need to refresh the editor? */ if(day_user_data[i].list_window != NULL) { /* Clear the editor */ clearAppEditor(XtParent(XtParent(day_user_data[i].list_window))); /* Refreash the editor */ refreshAppList(&(day_user_data[i])); } } } /* ============================================================ | refreshCalInfo() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Wed Nov 4 10:36:42 1992 | |==========================================================| */ static void refreshCalInfo(time_t time_value) { struct tm *tmp; time_t temp; char buffer[50]; int day_of_month; Arg args[20]; int counter,i; XmString xm_string; /* Get the time structure */ tmp = localtime(&time_value); /* Get the Monday time. 86400 - number of seconds per day */ current_monday = time_value - 86400 *((tmp->tm_wday+6)%7); tmp = localtime(¤t_monday); /* Set the week label */ sprintf(buffer,"Week starting Monday, %s %d %d", month_table[tmp->tm_mon],tmp->tm_mday,tmp->tm_year+1900); xm_string = XmStringCreateLtoR(buffer, XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter],XmNlabelString,xm_string); counter++; XtSetValues(week_label, args,counter ); free(xm_string); temp = current_monday; tmp = localtime(&temp); /* Set the days description */ for(i=0;i<7;i++) { sprintf(buffer,"%s %d", days_table[i],tmp->tm_mday); xm_string = XmStringCreateLtoR(buffer, XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter],XmNlabelString,xm_string); counter++; XtSetValues(days_desc[i], args,counter ); free(xm_string); /* Advance one day. */ temp += 86400; tmp = localtime(&temp); } /* Load the day labels from the database. */ temp = current_monday; tmp = localtime(&temp); /* Set the days description */ for(i=0;i<7;i++) { dayAppP app_array; int app_counter, j; char *text_string; char time_s[6]; int am_pm; /* Free previous appointment array. */ if(day_user_data[i].app_array != 0) free(day_user_data[i].app_array); /* Store the date info. */ day_user_data[i].year = tmp->tm_year; day_user_data[i].month = tmp->tm_mon+1; day_user_data[i].day = tmp->tm_mday; /* Get the date appointments. */ app_array = apiDbGetDateAppointments(tmp->tm_year, tmp->tm_mon+1, tmp->tm_mday,&app_counter); /* Store the appointment array. */ day_user_data[i].app_array = app_array; day_user_data[i].app_counter = app_counter; /* Allocate the text_string */ if(app_counter > 0) { text_string = (char *)malloc(50*app_counter); text_string[0] = '\0'; /* Perpare the string. */ for(j=0; j 0) free(text_string); temp += 86400; tmp = localtime(&temp); } } #define DAY_B_WIDTH 200 #define DAY_B_HEIGHT 100 /* ============================================================ | createMainWindow() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: avrami tzur | | At: Wed Oct 21 12:19:02 1992 | |==========================================================| */ static void createMainWindow(Widget parent) { Widget form, next_month, prev_month, next_week, prev_week, sep,sep2; Arg args[20]; int counter,i; XmString xm_string; XtPointer point; /* Initilize the user data array. */ for(i=0;i<7;i++) { day_user_data[i].wday = i; day_user_data[i].year = 0; day_user_data[i].month = 0; day_user_data[i].day = 0; day_user_data[i].app_counter = 0; day_user_data[i].app_array = NULL; day_user_data[i].list_window = NULL; day_user_data[i].app_num = -2; } /* Create the form widget. */ counter = 0; XtSetArg(args[counter], XmNnoResize,True);counter++; form = XmCreateForm(parent,"Calendar Menager",args,counter); /* Create the previus week bottun */ xm_string = XmStringCreateLtoR("Previus", XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNwidth, 60);counter++; XtSetArg(args[counter], XmNheight, 30);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; prev_week = XmCreatePushButton(form,"controlB",args,counter); free(xm_string); XtAddCallback(prev_week, XmNactivateCallback,(XtCallbackProc) prevWeekCB,NULL); XtManageChild(prev_week); /* Create the next week bottun */ xm_string = XmStringCreateLtoR("Next", XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNwidth, 60);counter++; XtSetArg(args[counter], XmNheight, 30);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; next_week = XmCreatePushButton(form,"controlB",args,counter); free(xm_string); XtAddCallback(next_week, XmNactivateCallback,(XtCallbackProc) nextWeekCB, NULL); XtManageChild(next_week); /* Create the week label */ counter = 0; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNrecomputeSize, FALSE);counter++; XtSetArg(args[counter], XmNheight, 30);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,prev_week);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNrightWidget,next_week);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; week_label = XmCreateLabelGadget(form,"",args,counter); XtManageChild(week_label); /* Create the seperator widget */ counter = 0; XtSetArg(args[counter], XmNseparatorType, XmDOUBLE_LINE);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,prev_week);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; sep2 = XmCreateSeparator(form,"separator",args,counter); XtManageChild(sep2); /* Create the day description */ /* First row */ for(i =0; i<4;i++) { counter = 0; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNwidth, DAY_B_WIDTH);counter++; XtSetArg(args[counter], XmNheight, 40);counter++; XtSetArg(args[counter], XmNrecomputeSize, FALSE);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,sep2);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; if(i==0) { /* First one */ XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; } else { XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,days_desc[i-1]);counter++; } XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; if(i==3) { /* Last one */ XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; } else { XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; } days_desc[i] = XmCreateLabel(form,"controlB",args,counter); XtManageChild(days_desc[i]); } /* Create the day labels */ for(i =0; i<4;i++) { counter = 0; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_BEGINNING);counter++; XtSetArg(args[counter], XmNuserData, (XtPointer)&(day_user_data[i]));counter++; XtSetArg(args[counter], XmNmarginTop, 0);counter++; XtSetArg(args[counter], XmNheight, DAY_B_HEIGHT);counter++; XtSetArg(args[counter], XmNwidth, DAY_B_WIDTH);counter++; XtSetArg(args[counter], XmNrecomputeSize, FALSE);counter++; XtSetArg(args[counter], XmNtopAttachment, XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget, days_desc[i]);counter++; XtSetArg(args[counter], XmNtopOffset, 0);counter++; if(i==0) { /* First one */ XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; } else { XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,days_labels[i-1]);counter++; } XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; if(i==3) { /* Last one */ XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; } else { XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; } days_labels[i] = XmCreatePushButton(form,"buttonP",args,counter); XtAddCallback(days_labels[i], XmNactivateCallback,(XtCallbackProc)daysCB, NULL); XtManageChild(days_labels[i]); } /* Second row. */ for(i=6; i>3;i--) { counter = 0; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNwidth, DAY_B_WIDTH);counter++; XtSetArg(args[counter], XmNheight, 40);counter++; XtSetArg(args[counter], XmNrecomputeSize, FALSE);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,days_labels[i-3]);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; if(i==6) { /* Last one */ XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; } else { XtSetArg(args[counter], XmNrightAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNrightWidget,days_desc[i+1]);counter++; } days_desc[i] = XmCreateLabel(form,"controlB",args,counter); XtManageChild(days_desc[i]); } /* Create the day labels */ for(i =6; i>3;i--) { counter = 0; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_BEGINNING);counter++; XtSetArg(args[counter], XmNuserData, (XtPointer)&(day_user_data[i]));counter++; XtSetArg(args[counter], XmNmarginTop, 0);counter++; XtSetArg(args[counter], XmNheight, DAY_B_HEIGHT);counter++; XtSetArg(args[counter], XmNwidth, DAY_B_WIDTH);counter++; XtSetArg(args[counter], XmNrecomputeSize, FALSE);counter++; XtSetArg(args[counter], XmNtopAttachment, XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget, days_desc[i]);counter++; XtSetArg(args[counter], XmNtopOffset, 0);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset, 10);counter++; if(i==6) { /* Last one */ XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; } else { XtSetArg(args[counter], XmNrightAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNrightWidget,days_labels[i+1]);counter++; } days_labels[i] = XmCreatePushButton(form,"buttonP",args,counter); XtAddCallback(days_labels[i], XmNactivateCallback,(XtCallbackProc)daysCB, NULL); XtManageChild(days_labels[i]); } XtManageChild(form); } #define EDIT_APP_LIST_T 0 #define EDIT_APP_LIST 1 #define EDIT_APP_SEP 2 #define EDIT_APP_TITLE_L 3 #define EDIT_APP_TITLE_T 4 #define EDIT_APP_START_L 5 #define EDIT_APP_START_T 6 #define EDIT_APP_START_AP 7 #define EDIT_APP_END_L 8 #define EDIT_APP_END_T 9 #define EDIT_APP_END_AP 10 #define EDIT_APP_WHAT_L 11 #define EDIT_APP_WHAT_T 12 #define EDIT_APP_PARTI_L 13 #define EDIT_APP_ADD_PARTI 14 #define EDIT_APP_PARTI_B 15 #define EDIT_APP_DEL_PARTI 16 #define EDIT_APP_INSERT_B 17 #define EDIT_APP_DELETE_B 18 #define EDIT_APP_SCHEDULE_B 19 #define EDIT_APP_CLEAR_B 20 #define EDIT_APP_CANCEL_B 21 #define EDIT_APP_CHILDREN_NUM 22 /* ============================================================ | appointmentEditor() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Fri Nov 6 17:44:14 1992 | |==========================================================| */ static Widget appointmentEditor(Widget parent, char *title, user_dataP user_data) { Widget form, title_l, title_t, start_l, start_t, start_ap; Widget end_l, end_t, end_ap, what_l, what_t; Widget insert_b, delete_b, change_b, schedule_b, clear_b, cancel_b; Widget temp_w, app_l_b, app_l_t, sep; Widget parti_l, parti_b, add_parti_b, del_parti_b; Arg args[20]; int counter,i; XmString xm_string; XtCallbackRec callbacks[] = { {NULL,NULL}, {NULL,NULL}, }; /* Create the form widget. */ callbacks[0].callback = (XtCallbackProc)destroyCB; xm_string = XmStringCreateLtoR(title, XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter], XmNnoResize,True);counter++; XtSetArg(args[counter], XmNdialogTitle,xm_string);counter++; XtSetArg(args[counter], XmNdialogStyle,XmDIALOG_FULL_APPLICATION_MODAL);counter++; XtSetArg(args[counter], XmNautoUnmanage,False);counter++; XtSetArg(args[counter], XmNuserData, (XtPointer)user_data);counter++; /*XtSetArg(args[counter], XmNdestroyCallback, callbacks);counter++;*/ form = XmCreateFormDialog(parent,"",args,counter); free(xm_string); /* Create the appointment list lable */ counter = 0; xm_string = XmStringCreateLtoR("Appointments", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; app_l_t = XmCreateLabelGadget(form,"",args,counter); free(xm_string); XtManageChild(app_l_t); /* Create the list widget */ counter = 0; XtSetArg(args[counter], XmNselectionPolicy,XmSINGLE_SELECT);counter++; XtSetArg(args[counter], XmNscrollBarDisplayPolicy,XmSTATIC);counter++; /*XtSetArg(args[counter], XmNwidth,400);counter++;*/ XtSetArg(args[counter], XmNvisibleItemCount,7);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,app_l_t);counter++; XtSetArg(args[counter], XmNtopOffset,2);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset,10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset,10);counter++; app_l_b= XmCreateScrolledList(form,"list",args,counter); XtAddCallback(app_l_b, XmNsingleSelectionCallback,(XtCallbackProc) appListCB,NULL); XtManageChild(app_l_b); /* Create the seperator widget */ counter = 0; XtSetArg(args[counter], XmNseparatorType, XmDOUBLE_LINE);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget, XtParent(app_l_b));counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; sep = XmCreateSeparator(form,"separator",args,counter); XtManageChild(sep); /* Create the title label */ counter = 0; xm_string = XmStringCreateLtoR("Title", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget, sep);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; title_l = XmCreateLabelGadget(form,"",args,counter); free(xm_string); XtManageChild(title_l); /* Create the meeting title input filed */ counter = 0; XtSetArg(args[counter], XmNcolumns,40);counter++; XtSetArg(args[counter], XmNmaxLength,40);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget, title_l);counter++; XtSetArg(args[counter], XmNtopOffset,2);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; title_t= XmCreateTextField(form,"",args,counter); XtManageChild(title_t); /* Create the start label */ counter = 0; xm_string = XmStringCreateLtoR("Start time", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,sep);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget, title_t);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; start_l = XmCreateLabelGadget(form,"",args,counter); free(xm_string); XtManageChild(start_l); /* Create the start input time filed */ counter = 0; XtSetArg(args[counter], XmNcolumns,5);counter++; XtSetArg(args[counter], XmNmaxLength,5);counter++; XtSetArg(args[counter], XmNcursorPositionVisible, False);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,start_l);counter++; XtSetArg(args[counter], XmNtopOffset,2);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_OPPOSITE_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,start_l);counter++; XtSetArg(args[counter], XmNleftOffset, 0);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; start_t = XmCreateTextField(form,"",args,counter); XtManageChild(start_t); /* Create the start am/pm toggle buttons */ counter = 0; XtSetArg(args[counter], XmNpacking, XmPACK_COLUMN);counter++; XtSetArg(args[counter], XmNorientation, XmHORIZONTAL);counter++; XtSetArg(args[counter], XmNradioBehavior, True);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget, start_l);counter++; XtSetArg(args[counter], XmNtopOffset,2);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,start_t);counter++; XtSetArg(args[counter], XmNleftOffset, 2);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; start_ap = XmCreateSimpleRadioBox(form,"",args,counter); /* Create the buttons. */ counter = 0; XtSetArg(args[counter], XmNset, True);counter++; temp_w = XmCreateToggleButton(start_ap,"AM",args,counter ); XtManageChild(temp_w); temp_w = XmCreateToggleButton(start_ap,"PM",NULL,0); XtManageChild(temp_w); XtManageChild(start_ap); /* Create the end label */ counter = 0; xm_string = XmStringCreateLtoR("End time", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,sep);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,start_ap);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; end_l = XmCreateLabelGadget(form,"",args,counter); free(xm_string); XtManageChild(end_l); /* Create the end input time filed */ counter = 0; XtSetArg(args[counter], XmNcolumns,5);counter++; XtSetArg(args[counter], XmNmaxLength,5);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,end_l);counter++; XtSetArg(args[counter], XmNtopOffset,2);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_OPPOSITE_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,end_l);counter++; XtSetArg(args[counter], XmNleftOffset, 0);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; end_t = XmCreateTextField(form,"",args,counter); XtManageChild(end_t); /* Create the end am/pm toggle buttons */ counter = 0; XtSetArg(args[counter], XmNpacking, XmPACK_COLUMN);counter++; XtSetArg(args[counter], XmNorientation, XmHORIZONTAL);counter++; XtSetArg(args[counter], XmNradioBehavior, True);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,end_l);counter++; XtSetArg(args[counter], XmNtopOffset,2);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,end_t);counter++; XtSetArg(args[counter], XmNleftOffset, 0);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; end_ap = XmCreateSimpleRadioBox(form,"",args,counter); /* Create the buttons. */ counter = 0; XtSetArg(args[counter], XmNset, True);counter++; temp_w = XmCreateToggleButton(end_ap,"AM",args,counter ); XtManageChild(temp_w); temp_w = XmCreateToggleButton(end_ap,"PM",NULL,0); XtManageChild(temp_w); XtManageChild(end_ap); /* Create the what label */ counter = 0; xm_string = XmStringCreateLtoR("Memo", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget, title_t);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; what_l = XmCreateLabelGadget(form,"",args,counter); free(xm_string); XtManageChild(what_l); /* Create the what input text */ counter = 0; XtSetArg(args[counter], XmNcolumns,60);counter++; XtSetArg(args[counter], XmNwordWrap, True);counter++; XtSetArg(args[counter], XmNeditMode, XmMULTI_LINE_EDIT);counter++; XtSetArg(args[counter], XmNrows, 5);counter++; XtSetArg(args[counter], XmNmaxLength, 300);counter++; XtSetArg(args[counter], XmNscrollHorizontal, False);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,what_l);counter++; XtSetArg(args[counter], XmNtopOffset,2);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; what_t = XmCreateScrolledText(form,"",args,counter); XtManageChild(what_t); /* Cretate the participants label. */ counter = 0; xm_string = XmStringCreateLtoR("Participants", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,what_t);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; parti_l = XmCreateLabelGadget(form,"",args,counter); free(xm_string); XtManageChild(parti_l); /* Create the add participants button */ counter = 0; xm_string = XmStringCreateLtoR("Add..", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNwidth, 50);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,parti_l);counter++; XtSetArg(args[counter], XmNtopOffset,2);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; add_parti_b = XmCreatePushButton(form,"",args,counter); free(xm_string); XtAddCallback(add_parti_b, XmNactivateCallback,(XtCallbackProc) partiCB, (XtPointer) EDIT_APP_ADD_PARTI ); XtManageChild(add_parti_b); /* Create the participants list widget */ counter = 0; XtSetArg(args[counter], XmNselectionPolicy,XmMULTIPLE_SELECT);counter++; XtSetArg(args[counter], XmNscrollBarDisplayPolicy,XmSTATIC);counter++; XtSetArg(args[counter], XmNvisibleItemCount,4);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_OPPOSITE_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,add_parti_b);counter++; XtSetArg(args[counter], XmNtopOffset,0);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset,10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNrightWidget, add_parti_b);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; parti_b = XmCreateScrolledList(form,"list",args,counter); XtManageChild(parti_b); /* Create the delete participants button */ counter = 0; xm_string = XmStringCreateLtoR("Delete", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNwidth, 50);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_OPPOSITE_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,add_parti_b);counter++; XtSetArg(args[counter], XmNleftOffset,0);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_OPPOSITE_WIDGET);counter++; XtSetArg(args[counter], XmNbottomWidget,parti_b);counter++; XtSetArg(args[counter], XmNbottomOffset,0);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; del_parti_b = XmCreatePushButton(form,"",args,counter); free(xm_string); XtAddCallback(del_parti_b, XmNactivateCallback,(XtCallbackProc) partiCB, (XtPointer) EDIT_APP_DEL_PARTI ); XtManageChild(del_parti_b); /* Create the insert button */ counter = 0; xm_string = XmStringCreateLtoR("Insert", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNwidth, 50);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,parti_b);counter++; XtSetArg(args[counter], XmNtopOffset,20);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_OPPOSITE_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,parti_b);counter++; XtSetArg(args[counter], XmNleftOffset, 0);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset, 10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; insert_b = XmCreatePushButton(form,"",args,counter); free(xm_string); XtAddCallback(insert_b, XmNactivateCallback,(XtCallbackProc) appEditorCB, (XtPointer)NULL); XtManageChild(insert_b); /* Create the delete button */ counter = 0; xm_string = XmStringCreateLtoR("Delete", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNwidth, 50);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,parti_b);counter++; XtSetArg(args[counter], XmNtopOffset,20);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,insert_b);counter++; XtSetArg(args[counter], XmNleftOffset, 40);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset, 10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; delete_b = XmCreatePushButton(form,"",args,counter); free(xm_string); XtAddCallback(delete_b, XmNactivateCallback,(XtCallbackProc) appEditorCB, (XtPointer)NULL); XtManageChild(delete_b); /* Create the schedule button */ counter = 0; xm_string = XmStringCreateLtoR("schedule", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNwidth, 50);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,parti_b);counter++; XtSetArg(args[counter], XmNtopOffset,20);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,delete_b);counter++; XtSetArg(args[counter], XmNleftOffset, 40);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset, 10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; schedule_b = XmCreatePushButton(form,"",args,counter); free(xm_string); XtAddCallback(schedule_b, XmNactivateCallback, (XtCallbackProc) appEditorCB, (XtPointer)NULL); XtManageChild(schedule_b); /* Create the clear button */ counter = 0; xm_string = XmStringCreateLtoR("Clear", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNwidth, 50);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,parti_b);counter++; XtSetArg(args[counter], XmNtopOffset,20);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,schedule_b);counter++; XtSetArg(args[counter], XmNleftOffset, 40);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset, 10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; clear_b = XmCreatePushButton(form,"",args,counter); free(xm_string); XtAddCallback(clear_b, XmNactivateCallback,(XtCallbackProc) appEditorCB, (XtPointer)NULL); XtManageChild(clear_b); /* Create the cancel button */ counter = 0; xm_string = XmStringCreateLtoR("Cancel", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNwidth, 50);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,parti_b);counter++; XtSetArg(args[counter], XmNtopOffset,20);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,clear_b);counter++; XtSetArg(args[counter], XmNleftOffset, 40);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset, 10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; cancel_b = XmCreatePushButton(form,"",args,counter); free(xm_string); XtAddCallback(cancel_b, XmNactivateCallback,(XtCallbackProc) appEditorCB, (XtPointer)NULL); XtManageChild(cancel_b); /* Set the initila focus. */ #ifndef SYSV counter = 0; XtSetArg(args[counter], XmNinitialFocus, title_t);counter++; XtSetValues(form, args,counter ); #endif return(app_l_b); } /* ============================================================ | refreshAppEditor() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Tue Nov 10 18:05:50 1992 | |==========================================================| */ static void refreshAppEditor(Widget form, user_dataP user_data) { Arg args[20]; int counter, i; XmString xm_string; WidgetList children, scroll_window, row_col, parti_l; char buffer[10]; dayAppP app = (user_data->app_array) + user_data->app_num; char time_s[6]; int am_pm_s; char time_e[6]; int am_pm_e; /* Get the form childrens. */ XtVaGetValues(form,XmNchildren, &children, NULL); /* Set the title. */ XmTextFieldSetString(children[EDIT_APP_TITLE_T], app->title); /* Set the start time field. */ am_pm_s = intToTime(app->start, time_s); XmTextFieldSetString(children[EDIT_APP_START_T],time_s); /* Set the start am/pm */ XtVaGetValues(children[EDIT_APP_START_AP],XmNchildren, &row_col, NULL); XmToggleButtonSetState(row_col[am_pm_s], True, True); /* Set the end time field. */ am_pm_e = intToTime(app->end, time_e); XmTextFieldSetString(children[EDIT_APP_END_T], time_e); /* Set the end am/pm */ XtVaGetValues(children[EDIT_APP_END_AP],XmNchildren, &row_col, NULL); XmToggleButtonSetState(row_col[am_pm_e], True, True); /* Set the info field. (Remmember it is a scrolled window) */ XtVaGetValues(children[EDIT_APP_WHAT_T],XmNchildren, &scroll_window, NULL); XmTextSetString(scroll_window[1],app->info); /* Set the participants list. */ XtVaGetValues(children[EDIT_APP_PARTI_B],XmNchildren, &parti_l, NULL); XmListDeleteAllItems(parti_l[1]); for(i=0; iparticipants_count; i++) { xm_string = XmStringCreateLtoR(app->participants[i].alias, XmSTRING_DEFAULT_CHARSET); XmListAddItem(parti_l[1], xm_string, 0); free(xm_string); } } /* ============================================================ | refreshAppList() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Wed Nov 11 16:03:58 1992 | |==========================================================| */ static void refreshAppList(user_dataP user_data) { char buffer[60]; dayAppP app_array; int app_counter; int i; XmString *xm_list; char time_s[6]; int am_pm_s; char time_e[6]; int am_pm_e; /* Remove all the items. */ XmListDeleteAllItems(user_data->list_window); if(user_data->app_array != NULL) { app_array = user_data->app_array; app_counter = user_data->app_counter; } else { app_array = NULL; app_counter = 0; } /* Allocate the memory. */ xm_list = (XmString *)malloc(sizeof(XmString)*app_counter); for(i=0;ilist_window, xm_list,app_counter,1); /* Free the string. */ for(i=0;iapp_num = -1; } #define USERS_LIST_LIST 0 #define USERS_LIST_SELECT_B 1 #define USERS_LIST_INSERT_B 2 #define USERS_LIST_DELETE_B 3 #define USERS_LIST_CANCEL_B 4 /* ============================================================ | usersList() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Sun Nov 15 16:29:08 1992 | |==========================================================| */ static Widget usersList(Widget parent, char *title) { Widget form, users_l, ok_b, cancel_b, insert_b, delete_b; Arg args[20]; int counter,i; XmString xm_string; XtCallbackRec callbacks[] = { {NULL,NULL}, {NULL,NULL}, }; /* Create the form widget. */ xm_string = XmStringCreateLtoR(title, XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter], XmNnoResize,True);counter++; XtSetArg(args[counter], XmNdialogTitle,xm_string);counter++; XtSetArg(args[counter], XmNdialogStyle,XmDIALOG_FULL_APPLICATION_MODAL);counter++; XtSetArg(args[counter], XmNautoUnmanage,False);counter++; form = XmCreateFormDialog(parent,"",args,counter); free(xm_string); /* Create the list widget */ counter = 0; XtSetArg(args[counter], XmNselectionPolicy,XmMULTIPLE_SELECT);counter++; XtSetArg(args[counter], XmNscrollBarDisplayPolicy,XmSTATIC);counter++; XtSetArg(args[counter], XmNwidth,400);counter++; XtSetArg(args[counter], XmNvisibleItemCount,10);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset,10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset,10);counter++; users_l = XmCreateScrolledList(form,"list",args,counter); XtManageChild(users_l); callbacks[0].callback = (XtCallbackProc)usersListCB; /* Create the ok button */ counter = 0; xm_string = XmStringCreateLtoR("Select", XmSTRING_DEFAULT_CHARSET); callbacks[0].closure = (XtPointer) USERS_LIST_SELECT_B; XtSetArg(args[counter], XmNactivateCallback, callbacks);counter++; XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNwidth, 50);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,users_l);counter++; XtSetArg(args[counter], XmNtopOffset,20);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_OPPOSITE_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,users_l);counter++; XtSetArg(args[counter], XmNleftOffset, 0);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset, 10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; ok_b = XmCreatePushButton(form,"",args,counter); free(xm_string); XtManageChild(ok_b); /* Create the insert button */ counter = 0; xm_string = XmStringCreateLtoR("Insert", XmSTRING_DEFAULT_CHARSET); callbacks[0].closure = (XtPointer) USERS_LIST_INSERT_B; XtSetArg(args[counter], XmNactivateCallback, callbacks);counter++; XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNwidth, 50);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,users_l);counter++; XtSetArg(args[counter], XmNtopOffset,20);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,ok_b);counter++; XtSetArg(args[counter], XmNleftOffset, 40);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset, 10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; insert_b = XmCreatePushButton(form,"",args,counter); free(xm_string); XtManageChild(insert_b); /* Create the delete button */ counter = 0; xm_string = XmStringCreateLtoR("Delete", XmSTRING_DEFAULT_CHARSET); callbacks[0].closure = (XtPointer) USERS_LIST_DELETE_B; XtSetArg(args[counter], XmNactivateCallback, callbacks);counter++; XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNwidth, 50);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,users_l);counter++; XtSetArg(args[counter], XmNtopOffset,20);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,insert_b);counter++; XtSetArg(args[counter], XmNleftOffset, 20);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset, 10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; delete_b = XmCreatePushButton(form,"",args,counter); free(xm_string); XtManageChild(delete_b); /* Create the cancel button */ counter = 0; xm_string = XmStringCreateLtoR("Cancel", XmSTRING_DEFAULT_CHARSET); callbacks[0].closure = (XtPointer) USERS_LIST_CANCEL_B; XtSetArg(args[counter], XmNactivateCallback, callbacks);counter++; XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_CENTER);counter++; XtSetArg(args[counter], XmNwidth, 50);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,users_l);counter++; XtSetArg(args[counter], XmNtopOffset,20);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNleftWidget,delete_b);counter++; XtSetArg(args[counter], XmNleftOffset, 40);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset, 10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; cancel_b = XmCreatePushButton(form,"",args,counter); free(xm_string); XtManageChild(cancel_b); return(users_l); } static char **users; static int user_counter; /* ============================================================ | loadUsersList() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Sun Nov 15 16:52:16 1992 | |==========================================================| */ static void loadUsersList(Widget list) { XmString *xm_string; int i; if(users == NULL) { /* Load the users from the file. */ users = loadUsersFile(&user_counter); } if(user_counter > 0) { xm_string = (XmString *)malloc(sizeof(XmString)*user_counter); for(i=0; i 0) { /* Rewind the file */ rewind(fp); /* Allocate memory for list */ ret = (char **)malloc(sizeof(char *)*(*counter)); for(i=0; i<*counter; i++) { ret[i] = (char *)malloc(40); fscanf(fp,"%s%s%s",ret[i],user,machine); } } /* Close the file. */ fclose(fp); return(ret); } /* ============================================================ | CAllback functions() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Mon Oct 26 12:38:22 1992 | |==========================================================| */ static void nextWeekCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data) { refreshCalInfo(current_monday + 86400*7); } static void prevWeekCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data) { refreshCalInfo(current_monday - 86400*7); } static void daysCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data) { char buffer[50]; struct tm *tmp; time_t temp; user_dataP user_data; XtPointer temp_p; /* Get the user data pointer. */ XtVaGetValues(w, XmNuserData, &temp_p, NULL); user_data = (user_dataP)temp_p; if(user_data->list_window == NULL) { /* Get the tm structure for this date. */ temp = current_monday + 86400*(user_data->wday); tmp = localtime(&temp); /* Create the list window title. */ sprintf(buffer, " %s, %s %d ", days_table[user_data->wday], month_table[tmp->tm_mon], tmp->tm_mday); /* Create the window */ user_data->list_window = appointmentEditor(top_level, buffer, user_data); refreshAppList(user_data); XtManageChild(XtParent(XtParent(user_data->list_window))); } else { /* There is list on the screen. Fucose it*/ } } static void destroyCB(Widget w, XtPointer client_data, XmAnyCallbackStruct *call_data) { user_dataP user_data; XtVaGetValues(w, XmNuserData, (XtPointer *)&user_data, NULL); user_data->list_window = NULL; user_data->app_num = -1; } static void appEditorCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data) { Widget form = XtParent(w); WidgetList children, temp,app_list; XmString xm_string; char *buffer; user_dataP user_data; int i; /* Ok or cancel ? */ XtVaGetValues(form,XmNchildren, &children, XmNuserData, (XtPointer *)&user_data, NULL); /* Find which button was pressed. */ for(i=0; i< EDIT_APP_CHILDREN_NUM; ) { if(children[i] == w) break; else i++; } switch (i) { case EDIT_APP_CANCEL_B : { XtDestroyWidget(form); user_data->list_window = NULL; user_data->app_num = -1; break; } case EDIT_APP_INSERT_B: { struct dayApp app_rec; if(verifiedAppData(&app_rec, children, user_data)) { userInsertAppointment(user_data->year, user_data->month, user_data->day, &app_rec); } break; } case EDIT_APP_SCHEDULE_B:{ /* organize a new meeting */ struct dayApp app_rec; if(verifiedScheduleData(&app_rec, children, user_data)) { userScheduleAppointment(user_data->year, user_data->month, user_data->day, &app_rec); } } break; case EDIT_APP_DELETE_B: { if(user_data->app_num < 0) { errorPopUp(top_level,"Select an item from the list and then press 'Delete'"); } else { dayAppP app = (user_data->app_array) + user_data->app_num; userDeleteAppointment(user_data->year, user_data->month, user_data->day,app); } break; } case EDIT_APP_CLEAR_B: { clearAppEditor(form); break; } } } static void partiCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data) { int button = (int)client_data; Widget form = XtParent(w); WidgetList children, temp; XmString xm_string; int i; /* Get form's children list and user data */ XtVaGetValues(form,XmNchildren, &children, NULL); /* Get the participants list widget. */ XtVaGetValues(children[EDIT_APP_PARTI_B],XmNchildren, &temp, NULL); switch (button) { case EDIT_APP_ADD_PARTI : { Widget list = usersList(temp[1], " Users List "); loadUsersList(list); XtManageChild(XtParent(XtParent(list))); break; } case EDIT_APP_DEL_PARTI : { int *position_list, position_count; if(XmListGetSelectedPos(temp[1],&position_list, &position_count)) if(position_count == 0) { errorPopUp(top_level,"Selecte participants to delete and then press Delete"); } else { #ifndef SYSV XmListDeletePositions(temp[1],position_list, position_count); #else for(i=position_count-1; i>=0; i--) { XmListDeletePos(temp[1], position_list[i]); } #endif } break; } } } static void usersListCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data) { int button = (int)client_data; Widget form = XtParent(w); WidgetList children, temp; int i; /* Get form's children list and user data */ XtVaGetValues(form,XmNchildren, &children, NULL); /* Get the participants list widget. */ XtVaGetValues(children[USERS_LIST_LIST],XmNchildren, &temp, NULL); switch (button) { case USERS_LIST_SELECT_B : { int *position_list, position_count; Widget parent_list = XtParent(XtParent(form)); XmString *xm_string; if (XmListGetSelectedPos(temp[1],&position_list, &position_count)) if(position_count == 0) { errorPopUp(top_level,"Selecte participants and then press Selete"); } else { xm_string = (XmString *)malloc(sizeof(XmString)*position_count); for(i=0; i=0; i--) { XmListDeletePos(temp[1], position_list[i]); } #endif } break; } case USERS_LIST_CANCEL_B : { XtDestroyWidget(form); break; } } } static void appListCB(Widget w, XtPointer client_data, XmListCallbackStruct *call_data) { Widget form = XtParent(XtParent(w)); user_dataP user_data; /* Get user data. */ XtVaGetValues(form, XmNuserData, (XtPointer *)&user_data, NULL); /* Update appointment */ user_data->app_num = call_data->item_position - 1; refreshAppEditor(form, user_data); } /* ============================================================ | clearAppEditor() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Thu Nov 12 20:40:46 1992 | |==========================================================| */ static void clearAppEditor(Widget form) { WidgetList children, temp; Arg args[20]; int counter; user_dataP user_data; XtVaGetValues(form,XmNchildren, &children, XmNuserData, (XtPointer *)&user_data, NULL); /* Clear selected items */ XmListDeselectAllItems(user_data->list_window); user_data->app_num = -1; /* Set the title. */ XmTextFieldSetString(children[EDIT_APP_TITLE_T],""); /* Set the start time field. */ XmTextFieldSetString(children[EDIT_APP_START_T],""); /* Set the start am/pm */ XtVaGetValues(children[EDIT_APP_START_AP],XmNchildren, &temp, NULL); XmToggleButtonSetState(temp[0], True, True); /* Set the end time field. */ XmTextFieldSetString(children[EDIT_APP_END_T], ""); /* Set the end am/pm */ XtVaGetValues(children[EDIT_APP_END_AP],XmNchildren, &temp, NULL); XmToggleButtonSetState(temp[0], True, True); /* Set the info field. (Remmember it is a scrolled window) */ XtVaGetValues(children[EDIT_APP_WHAT_T],XmNchildren, &temp, NULL); XmTextSetString(temp[1],""); /* Clear the participants list */ XtVaGetValues(children[EDIT_APP_PARTI_B],XmNchildren, &temp, NULL); XmListDeleteAllItems(temp[1]); #ifndef SYSV /* Set the initial focus. */ counter = 0; XtSetArg(args[counter], XmNinitialFocus, children[EDIT_APP_TITLE_T]); counter++; XtSetValues(form, args,counter); #endif } /* ============================================================ | verifiedAppData() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Thu Nov 12 17:17:09 1992 | |==========================================================| */ static int verifiedAppData(struct dayApp *app_rec, WidgetList children, user_dataP user_data) { WidgetList temp; XmString xm_string; char *buffer; int am_pm, i; int *position_list, position_count; Widget form = XtParent(children[EDIT_APP_TITLE_T]); XmString *xm_string_list; int item_count; /* Get the title. */ buffer = XmTextFieldGetString(children[EDIT_APP_TITLE_T]); if(emptyString(buffer)) { errorPopUp(top_level,"You must enter title"); XtFree(buffer); return(0); } strcpy(app_rec->title, buffer); XtFree(buffer); /* Get the start time. (Am/Pm)*/ XtVaGetValues(children[EDIT_APP_START_AP],XmNchildren, &temp, NULL); am_pm = (XmToggleButtonGetState(temp[0]))? 0 : 1; buffer = XmTextFieldGetString(children[EDIT_APP_START_T]); if((app_rec->start = timeToInt(buffer, am_pm)) == -1) { errorPopUp(top_level ,"Illegel start time"); XtFree(buffer); return(0); } XtFree(buffer); XtVaGetValues(children[EDIT_APP_START_AP],XmNchildren, &temp, NULL); am_pm = (XmToggleButtonGetState(temp[0]))? 0 : 1; /* Get the end time. (Am/Pm)*/ XtVaGetValues(children[EDIT_APP_END_AP],XmNchildren, &temp, NULL); am_pm = (XmToggleButtonGetState(temp[0]))? 0 : 1; buffer = XmTextFieldGetString(children[EDIT_APP_END_T]); if((app_rec->end = timeToInt(buffer, am_pm)) == -1) { errorPopUp(top_level ,"Illegel end time"); XtFree(buffer); return(0); } XtFree(buffer); if(app_rec->start >= app_rec->end) { errorPopUp(top_level,"Appointment start time nust be before end time"); XtFree(buffer); return(0); } /* Get the info text */ XtVaGetValues(children[EDIT_APP_WHAT_T],XmNchildren, &temp, NULL); buffer = XmTextGetString(temp[1]); strcpy(app_rec->info, buffer); XtFree(buffer); /* Get the participants list. */ XtVaGetValues(children[EDIT_APP_PARTI_B],XmNchildren, &temp, NULL); /* Get the items */ XtVaGetValues(temp[1],XmNitems, &xm_string_list, XmNitemCount, &item_count,NULL); app_rec->participants_count = item_count; for(i=0; iparticipants)[i].alias, buffer); XtFree(buffer); } return(1); } static int verifiedScheduleData(struct dayApp *app_rec, WidgetList children, user_dataP user_data) { WidgetList temp; XmString xm_string; char *buffer; int am_pm, i; int *position_list, position_count; Widget form = XtParent(children[EDIT_APP_TITLE_T]); XmString *xm_string_list; int item_count; /* Get the title. */ buffer = XmTextFieldGetString(children[EDIT_APP_TITLE_T]); if(emptyString(buffer)) { errorPopUp(top_level,"You must enter title"); XtFree(buffer); return(0); } strcpy(app_rec->title, buffer); XtFree(buffer); app_rec->start=0; app_rec->end=0; /* Get the info text */ XtVaGetValues(children[EDIT_APP_WHAT_T],XmNchildren, &temp, NULL); buffer = XmTextGetString(temp[1]); strcpy(app_rec->info, buffer); XtFree(buffer); /* Get the participants list. */ XtVaGetValues(children[EDIT_APP_PARTI_B],XmNchildren, &temp, NULL); /* Get the items */ XtVaGetValues(temp[1],XmNitems, &xm_string_list, XmNitemCount, &item_count,NULL); app_rec->participants_count = item_count; for(i=0; iparticipants)[i].alias, buffer); XtFree(buffer); } if (i<1){ errorPopUp(top_level,"Number of participants must be at least one"); return 0; } return(1); } /* ============================================================ | errorPopUp() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Fri Nov 6 14:52:56 1992 | |==========================================================| */ static void errorPopUp(Widget parent, char *message) { Widget error; Arg args[20]; int counter,i; XmString xm_string1,xm_string2 ; xm_string1 = XmStringCreateLtoR(message, XmSTRING_DEFAULT_CHARSET); xm_string2 = XmStringCreateLtoR(" Error Dialog ", XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter], XmNdialogTitle,xm_string2);counter++; XtSetArg(args[counter], XmNdialogStyle,XmDIALOG_FULL_APPLICATION_MODAL);counter++; XtSetArg(args[counter], XmNmessageString ,xm_string1);counter++; XtSetArg(args[counter], XmNnoResize,True);counter++; error = XmCreateErrorDialog(parent," Error Dialog ",args,counter); XtManageChild(error); free(xm_string1);free(xm_string2); } /* ============================================================ | intToTime() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Wed Nov 11 13:21:27 1992 | |==========================================================| */ static int intToTime(int clock24, char *clock12) { int ret = (clock24 >= 1200); int temp; if(clock24 >= 1300 ) clock24 -= 1200; if(clock24 < 100) clock24 += 1200; /* Translate the number into string. */ temp = clock24 / 1000; *(clock12++) = temp + '0'; clock24 -= temp*1000; temp = clock24 / 100; *(clock12++) = temp + '0'; clock24 -= temp*100; *(clock12++) = ':'; temp = clock24 / 10; *(clock12++) = temp + '0'; clock24 -= temp*10; *(clock12++) = clock24 + '0'; *clock12 = '\0'; return(ret); } /* ============================================================ | timeToInt() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Wed Nov 11 14:37:55 1992 | |==========================================================| */ static int timeToInt(char *time_s, int am_pm) { int ret; int hour=0; int min=0; int i,j; int len = strlen(time_s); /* Seperate the hours and minutes. */ i = 0; while((i 12) || (hour == 0)) return(-1); while((i= len) return (-1); while((i 59) || (i < len)) return(-1); } ret = hour*100+min; if(am_pm) { if(ret < 1200) ret += 1200; } else { if(ret >= 1200) ret -= 1200; } return(ret); } /* ============================================================ | emptyString() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | | Created by: Avrami Tzur | | At: Wed Nov 11 15:48:12 1992 | |==========================================================| */ static int emptyString(char *buffer) { int len = strlen(buffer); int i=0; while(i= len); } /* ============================================================ | getFileInput() | |----------------------------------------------------------| |==========================================================| */ static void getFileInput(XtPointer client_data, int *fid,XtInputId *id) { term_ptr read_pipe(int pipe_id); term_ptr i_term=read_pipe(*fid); handle_interpreter_term(i_term); } /* the structure of the terms transmitted from the interpreter to the window system is as follows: where agent is the agent id, and term is the message transmitted by the agent. the structure of the term is exactly as it appears in the agent program e.g. x_window(inform,Message,Reference). */ static void handle_interpreter_term(term_ptr term) { /* all term handlers eventually garbage-collect the term (on the relevant call-back, if appropritate). So the term should not be used after the call to handle_interpreter_term */ int message_type=term->argument_array[1]->functor; switch(message_type) { case INSERT:insert_appointment(term); break; case DELETE:delete_appointment(term); break; case ENQUIRE:enquire_appointment(term); break; case SCHEDULER: default_scheduler=term->argument_array[1]->argument_array[0]; break; } } /* messages from the window system to the interpreter have the following format: where agent is the identifier for the agent to whom the message is being sent, and term is exactly the same as the term that occurs as the content in the assimilate message */ /* ============================================================ | send_to_agent() | |----------------------------------------------------------| | Params : 1) an integer representing an agent | | 2) a term | | Desc : creates a tuple and sends it down the pipe to the agent. |==========================================================| */ void send_to_agent(term_ptr agent_term, term_ptr term) { term_ptr *args=maketermarray(2); term_ptr send_term=maketerm(TUPLE,0,2,NULL,args); args[0]=agent_term; args[1]=term; write_pipe(output_pipe,send_term); free(args); free(send_term); }