#include "xcddraw.h" #include #include #include #include #include #include #include "sel.xbm" #include "cv.xbm" #include "av.xbm" #include "rv.xbm" #include "tv.xbm" #include "ev.xbm" #include "pv.xbm" #include "re.xbm" #include "oe.xbm" #include "ae.xbm" #include "ie.xbm" #include "pe.xbm" #include "pie.xbm" #include "trash.xbm" #include "logo.icon" #include GC gc; GC choices_gc; GC button_gc; GC zoom_gc; GC xorgc; GC reversed_class_gc; GC reversed_label_gc; GC reversed_p_v_gc; GC reversed_up_v_gc; GC p_v_gc; GC up_v_gc; GC par_p_v_gc; GC par_up_v_gc; GC class_gc; GC label_gc; char *cur_file_name = NULL; Widget xcddraw_filelabel; int update_flag = 0; GC re_gc; GC oe_gc; GC ae_bgc; GC ae_fgc; GC ie_bgc; GC ie_fgc; GC pe_gc; GC pie_gc; GC xor_class_gc; GC xor_label_gc; GC xor_p_v_gc; GC xor_up_v_gc; GC xor_par_p_v_gc; GC xor_par_up_v_gc; GC xor_re_gc; GC xor_oe_gc; GC xor_ae_bgc; GC xor_ae_fgc; GC xor_ie_bgc; GC xor_ie_fgc; GC xor_pe_gc; GC xor_pie_gc; GC trash_gc; XFontStruct *class_font; XFontStruct *label_font; Arg wargs[10]; char message[2048]; Widget xcddraw_filelabelcontent = 0; Widget xcddraw_helplabel = 0; Widget draw_vsb,draw_hsb; Widget draw_framework; Widget zoom_view_dialog = NULL; Widget zoom_view_draw_area = NULL; Widget message_text; Widget toplevel; XtAppContext app; int dialog_done = 0; Widget draw_area; Widget cddraw_framework; int draw_area_width = 840; /* 3600; */ int draw_area_height = 640; /* 4300; */ int zoom_view_width, zoom_view_height; int pix_hoffset = 0; int pix_voffset = 0; int view_width = 0; int view_height = 0; int sw_hoffset = 0; int sw_voffset = 0; drawing_choices_t drawing_choices; extern void finishInfo(Widget w,int *done,XmSelectionBoxCallbackStruct *cbs); extern void cancelInfo(Widget w,int *done,XmSelectionBoxCallbackStruct *cbs); void check_update_flag() { if (update_flag == 0) { XmString xmstr = XmStringCreateSimple("-*-File: "); XtVaSetValues(xcddraw_filelabel,XmNlabelString ,xmstr,NULL); XmStringFree(xmstr); update_flag = 1; } } int panic() { if (update_flag == 0) return 0; extern void create_prompt(char *m,int *doit); int doit = 0; create_prompt("Discard all the changes?",&doit); return !doit; } void top_exit() { exit(0); } Widget GetTopShell(Widget w) { while (w && !XtIsWMShell(w)) w = XtParent(w); return w; } void zoomviewDestroy(Widget w, XtPointer, XtPointer) { zoom_view_draw_area = NULL; XtUnmanageChild(zoom_view_dialog); } Pixmap create_pixmap( Widget w, GC xgc, unsigned char bits[], int width, int height ) { Pixmap bitmap,pix; bitmap = XCreateBitmapFromData(XtDisplay(w), RootWindowOfScreen(XtScreen(w)), (char*)bits,width,height); pix = XCreatePixmap(XtDisplay(w), RootWindowOfScreen(XtScreen(w)), width,height, DefaultDepthOfScreen(XtScreen(w))); XCopyPlane(XtDisplay(w), bitmap, pix, xgc, 0, 0, width, height, 0,0,1); XFreePixmap(XtDisplay(w), bitmap); return pix; } void redraw() { XClearWindow(XtDisplay(draw_area), XtWindow(draw_area)); XClearArea(XtDisplay(draw_area), XtWindow(draw_area), 0, 0, 0, 0, True); } void scrolled( Widget scrollbar, int orientation, /* XmVERTICAL or XmHORIZONTAL */ XmScrollBarCallbackStruct *cbs ) { if (orientation == XmVERTICAL) { pix_voffset = cbs->value; } else { pix_hoffset = cbs->value; } XClearArea(XtDisplay(draw_area), XtWindow(draw_area), 0, 0, 0, 0, True); create_zoom_view(NULL,NULL,NULL); } void move_zoom_view(int x,int y) { double a,b,c,d; a = x; b = y; c = zoom_view_width; d = zoom_view_height; pix_hoffset = (int) ((a/c) * draw_area_width); pix_voffset = (int) ((b/d) * draw_area_height); if (draw_area_width - pix_hoffset < view_width) pix_hoffset = draw_area_width - view_width; if (draw_area_height - pix_voffset < view_height) pix_voffset = draw_area_height - view_height; if ((int)view_height >= draw_area_height) { pix_voffset = 0; sw_voffset = (view_height - draw_area_height)/2; } XtVaSetValues(draw_vsb, XmNsliderSize, max(view_height, 1), XmNvalue, pix_voffset, XmNpageIncrement, max(view_height-1, 1), NULL); if ((int)view_width >= draw_area_width) { pix_hoffset = 0; sw_hoffset = (view_width - draw_area_width)/2; } XtVaSetValues(draw_hsb, XmNsliderSize, max(view_width, 1), XmNvalue, pix_hoffset, XmNpageIncrement, max(view_width-1, 1), NULL); redraw(); create_zoom_view(NULL,NULL,NULL); /* if exits, nothing done */ } void press_zoom_view(Widget w, int *pressed,XEvent* e) { if (e->xbutton.button != Button2) return; *pressed = !(*pressed); move_zoom_view(e->xbutton.x,e->xbutton.y); } void track_zoom_view(Widget w, int *pressed,XEvent* e) { if (!(*pressed)) return; move_zoom_view(e->xbutton.x,e->xbutton.y); } void print_help(Widget w,char* data,XEvent* e) { XmString xmstr = XmStringCreate(data, XmSTRING_DEFAULT_CHARSET); XtSetArg(wargs[0],XmNlabelString ,xmstr); XtSetArg(wargs[1],XmNwidth ,1024); XtSetValues(xcddraw_helplabel,wargs,2); XFree(xmstr); } void create_zoom_view(Widget, XtPointer,XtPointer) { Widget form; static int zoom_view_button_control = 0; int n; if (zoom_view_draw_area == NULL) { /* create zoom view */ /* create zoom view */ zoom_view_dialog = XtCreatePopupShell ( "Zoom", applicationShellWidgetClass, toplevel, NULL, 0 ); form = XtCreateManagedWidget("Zoom_View_Form", xmFormWidgetClass, zoom_view_dialog,NULL,0); n = 0; Widget zlabel = XtCreateManagedWidget( "Zoom Out View",xmLabelGadgetClass,form,wargs,n); Widget zoom_frame = XmCreateFrame(form,"Draw_Frame", NULL,0); XtManageChild(zoom_frame); zoom_view_draw_area = XtVaCreateManagedWidget("Zomm_View_Draw_Area", xmDrawingAreaWidgetClass, zoom_frame, XmNunitType, XmPIXELS, XmNwidth , 600, XmNheight , 100, NULL); XtAddEventHandler(zoom_view_draw_area, EnterWindowMask, FALSE, (XtEventHandler)print_help, "Zoom out view. Use middle button to move the view port around."); XtAddEventHandler(zoom_view_draw_area, LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); n = 0; Widget mlabel = XtCreateManagedWidget( "Messages",xmLabelGadgetClass,form,wargs,n); n = 0; Widget mwin = XtCreateManagedWidget ("Message_Window", xmScrolledWindowWidgetClass, form, wargs,n); n = 0; XtSetArg(wargs[n], XmNwidth, 600); n++; XtSetArg(wargs[n], XmNheight,200); n++; XtSetArg(wargs[n],XmNeditMode , XmMULTI_LINE_EDIT); n++; XtSetArg(wargs[n],XmNeditable,FALSE); n++; message_text = XmCreateScrolledText(mwin,"Message_Content",wargs,n); XtManageChild(message_text); XtVaSetValues(zlabel, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtVaSetValues(zoom_frame, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, zlabel, XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtVaSetValues(mlabel, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, zoom_frame, XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtVaSetValues( mwin, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, mlabel, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtAddCallback(zoom_view_draw_area, XmNexposeCallback, (XtCallbackProc)create_zoom_view, NULL); XtAddCallback(zoom_view_draw_area, XmNresizeCallback, (XtCallbackProc)create_zoom_view, NULL); XtManageChild(zoom_view_dialog); XtPopup(XtParent(zoom_view_dialog), XtGrabNone); XtRealizeWidget(zoom_view_dialog); XtManageChild(zoom_view_dialog); XMoveWindow(XtDisplay(zoom_view_dialog), XtWindow(zoom_view_dialog), 15,25); XGrabButton(XtDisplay(zoom_view_draw_area), Button2, AnyModifier, XtWindow(zoom_view_draw_area), TRUE, ButtonPressMask | ButtonMotionMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask, GrabModeAsync, GrabModeAsync, XtWindow(zoom_view_draw_area), XCreateFontCursor(XtDisplay(zoom_view_draw_area),XC_fleur)); XtAddEventHandler(zoom_view_draw_area, ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask, FALSE, (XtEventHandler)press_zoom_view, (XtPointer)&zoom_view_button_control); XtAddEventHandler(zoom_view_draw_area, Button2MotionMask | EnterWindowMask | LeaveWindowMask, FALSE,(XtEventHandler)track_zoom_view, (XtPointer)&zoom_view_button_control); } draw_zoom_view(); } void draw_zoom_view() { int x,y,height,width; double a,b,c,d,r; /* zoom view */ if (XtIsRealized(zoom_view_draw_area)) { XClearArea(XtDisplay(zoom_view_draw_area), XtWindow(zoom_view_draw_area), 0, 0, 0, 0, False); } if (zoom_view_draw_area) { Dimension tx,ty; XtVaGetValues(zoom_view_draw_area, XmNwidth, &tx, XmNheight, &ty, NULL); zoom_view_width = tx; zoom_view_height = ty; a = zoom_view_width; b = zoom_view_height; c = draw_area_width; d = draw_area_height; r = a/c; x = (int)(pix_hoffset * r); width = (int)(view_width * r); r = b/d; y = (int)(pix_voffset * r); height = (int)(view_height * r); XDrawRectangle(XtDisplay(zoom_view_draw_area), XtWindow(zoom_view_draw_area), zoom_gc, x,y,width,height); /* draw page borders */ int i = 720; int j = 540; r = b/d; while (i < draw_area_height) { XDrawLine(XtDisplay(zoom_view_draw_area), XtWindow(zoom_view_draw_area), pe_gc, 0, (int)i*r, zoom_view_width, (int)i*r); i = i + 720; } r = a/c; while (j < draw_area_width) { XDrawLine(XtDisplay(zoom_view_draw_area),XtWindow(zoom_view_draw_area),pe_gc, (int)j*r, 0, (int)j*r, zoom_view_height); j = j + 540; } } } void redisplay( Widget w, pixmap_data *data, XmDrawingAreaCallbackStruct *call_data ) { int widget_width, widget_height; int n; Dimension tx,ty; XtVaGetValues(w, XmNwidth, &tx, XmNheight, &ty, NULL); widget_width = tx; widget_height = ty; XCopyArea(XtDisplay(w), data->pix, XtWindow(w), data->gc, 0, 0, data->width, data->height, 0,0); } void expose_resize( Widget w, XtPointer unused, XmDrawingAreaCallbackStruct *cbs ) { int new_width, new_height, oldw, oldh; Widget clipWin; if (cbs->reason == XmCR_EXPOSE) { XClearWindow(XtDisplay(draw_area), XtWindow(draw_area)); XClearArea(XtDisplay(draw_area), XtWindow(draw_area), 0, 0, 0, 0, False); /* draw page borders */ int i = 720; int j = 540; while (i < draw_area_height) { if (i - pix_voffset > 0 && i - pix_voffset < view_height) { XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), pe_gc, 0, i - pix_voffset, view_width, i - pix_voffset); } i = i + 720; } while (j < draw_area_width) { if (j - pix_hoffset > 0 && j - pix_hoffset < view_width) { XDrawLine(XtDisplay(draw_area), XtWindow(draw_area), pe_gc, j - pix_hoffset, 0, j - pix_hoffset, view_height); } j = j + 540; } vertex_store->draw(); consedge_store->draw(); repedge_store->draw(); altedge_store->draw(); inhedge_store->draw(); paredge_store->draw(); parinstedge_store->draw(); if (selected_object) { selected_object->draw_select(); } if (drawing_edge) drawing_edge->xor_draw(); if (drawing_vertex) drawing_vertex->xor_draw(); return; } oldw = view_width; oldh = view_height; { Dimension tx,ty; XtVaGetValues(draw_area, XmNwidth, &tx, XmNheight, &ty, NULL); view_width = tx; view_height = ty; } new_width = view_width; new_height = view_height; if ((int)new_height >= draw_area_height) { pix_voffset = 0; sw_voffset = (view_height - draw_area_height)/2; new_height = draw_area_height; } else { pix_voffset = min(pix_voffset, (draw_area_height - new_height) ); sw_voffset = 0; } XtVaSetValues(draw_vsb, XmNsliderSize, max(new_height, 1), XmNvalue, pix_voffset, XmNpageIncrement, max(new_height-1, 1), NULL); /* identical to vertical case above */ if ((int)new_width >= draw_area_width) { pix_hoffset = 0; sw_hoffset = (view_width - draw_area_width)/2; new_width = draw_area_width; } else { pix_hoffset = min(pix_hoffset, (draw_area_width - new_width)); sw_hoffset = 0; } XtVaSetValues(draw_hsb, XmNsliderSize, max(new_width, 1), XmNvalue, pix_hoffset, XmNpageIncrement, max(new_width-1, 1), NULL); if (XtIsRealized(draw_area)) { XClearArea(XtDisplay(draw_area), XtWindow(draw_area), 0, 0, 0, 0, True); static trick = 1; if (trick) create_zoom_view(NULL,NULL,NULL); /* if exits, nothing done */ trick = 1; } } void resize( Widget w, caddr_t data, XmDrawingAreaCallbackStruct *call_data ) { if (XtIsRealized(w)) { XClearArea(XtDisplay(w), XtWindow(w), 0, 0, 0, 0, TRUE); } } void select_drawing_choices( Widget w, control_data *cntl_data, XEvent *event ) { XGCValues values; int n; int i; static Cursor pencil_cur = NULL; if (pencil_cur == NULL) pencil_cur = XCreateFontCursor(XtDisplay(draw_area),XC_pencil); static Cursor sel_cur = NULL; if (sel_cur == NULL) sel_cur = XCreateFontCursor(XtDisplay(draw_area),XC_hand2); static Cursor box_cur = NULL; if (box_cur == NULL) box_cur = XCreateFontCursor(XtDisplay(draw_area),XC_dotbox); static Cursor del_cur = NULL; if (del_cur == NULL) del_cur = XCreateFontCursor(XtDisplay(draw_area),XC_pirate); if (event->type != ButtonPress) return; if (cntl_data->d_choices->sel) { cntl_data->d_choices->sel = 0; i = 0; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,sel_bits,sel_width, sel_height); } if (cntl_data->d_choices->cv) { cntl_data->d_choices->cv = 0; i = 1; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,cv_bits,cv_width, cv_height); } else if (cntl_data->d_choices->av) { cntl_data->d_choices->av = 0; i = 2; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,av_bits,av_width, av_height); } else if (cntl_data->d_choices->rv) { cntl_data->d_choices->rv = 0; i = 3; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,rv_bits,rv_width, rv_height); } else if (cntl_data->d_choices->tv) { cntl_data->d_choices->tv = 0; i = 4; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,tv_bits,tv_width, tv_height); } else if (cntl_data->d_choices->ev) { cntl_data->d_choices->ev = 0; i = 5; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,ev_bits,ev_width, ev_height); } else if (cntl_data->d_choices->pv) { cntl_data->d_choices->pv = 0; i = 6; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,pv_bits,pv_width, pv_height); } else if (cntl_data->d_choices->re) { cntl_data->d_choices->re = 0; i = 7; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,re_bits,re_width, re_height); } else if (cntl_data->d_choices->oe) { cntl_data->d_choices->oe = 0; i = 8; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,oe_bits,oe_width, oe_height); } else if (cntl_data->d_choices->ae) { cntl_data->d_choices->ae = 0; i = 9; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,ae_bits,ae_width, ae_height); } else if (cntl_data->d_choices->ie) { cntl_data->d_choices->ie = 0; i = 10; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,ie_bits,ie_width, ie_height); } else if (cntl_data->d_choices->pe) { cntl_data->d_choices->pe = 0; i = 11; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,pe_bits,pe_width, pe_height); } else if (cntl_data->d_choices->pie) { cntl_data->d_choices->pie = 0; i = 12; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,pie_bits,pie_width, pie_height); } else if (cntl_data->d_choices->trash) { cntl_data->d_choices->trash = 0; i = 13; cntl_data->all_p_data[i].pix = create_pixmap(cntl_data->choices[i], choices_gc,trash_bits,trash_width, trash_height); } cntl_data->all_p_data[i].gc = choices_gc; XCopyArea(XtDisplay( cntl_data->choices[i]), cntl_data->all_p_data[i].pix, XtWindow(cntl_data->choices[i]), choices_gc, 0, 0, cntl_data->all_p_data[i].width, cntl_data->all_p_data[i].height, 0,0); *cntl_data->cur_value = 1; n = 0; XtSetArg(wargs[n], XtNforeground, &values.background); n++; XtSetArg(wargs[n], XtNbackground, &values.foreground); n++; XtGetValues(w, wargs,n); cntl_data->p_data->gc = XtGetGC(w, GCForeground | GCBackground, &values); if (cntl_data->d_choices->sel) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),sel_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,sel_bits,sel_width, sel_height); } else if (cntl_data->d_choices->cv) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),box_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,cv_bits,cv_width, cv_height); } else if (cntl_data->d_choices->av) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),box_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,av_bits,av_width, av_height); } else if (cntl_data->d_choices->rv) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),box_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,rv_bits,rv_width, rv_height); } else if (cntl_data->d_choices->tv) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),box_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,tv_bits,tv_width, tv_height); } else if (cntl_data->d_choices->ev) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),box_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,ev_bits,ev_width, ev_height); } else if (cntl_data->d_choices->pv) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),box_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,pv_bits,pv_width, pv_height); } else if (cntl_data->d_choices->re) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),pencil_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,re_bits,re_width, re_height); } else if (cntl_data->d_choices->oe) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),pencil_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,oe_bits,oe_width, oe_height); } else if (cntl_data->d_choices->ae) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),pencil_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,ae_bits,ae_width, ae_height); } else if (cntl_data->d_choices->ie) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),pencil_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,ie_bits,ie_width, ie_height); } else if (cntl_data->d_choices->pe) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),pencil_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,pe_bits,pe_width, pe_height); } else if (cntl_data->d_choices->pie) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),pencil_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,pie_bits,pie_width, pie_height); } else if (cntl_data->d_choices->trash) { XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area),del_cur); cntl_data->p_data->pix = create_pixmap(w,cntl_data->p_data->gc,trash_bits,trash_width, trash_height); } XCopyArea(XtDisplay(w), cntl_data->p_data->pix, XtWindow(w), cntl_data->p_data->gc, 0, 0, cntl_data->p_data->width, cntl_data->p_data->height, 0,0); XFlush(XtDisplay(w)); } void cddrawQuitCallback( Widget w, Widget topshell, XtPointer call_data ) { if (panic()) return; XtCloseDisplay(XtDisplay(w)); exit(0); } void freeStoreCallback( Widget w, Widget flabel, XtPointer callData ) { void freeStore(); if (panic()) return; if (cur_file_name) free(cur_file_name); cur_file_name = NULL; freeStore(); XmString xmstr = XmStringCreateSimple(" "); XtVaSetValues(flabel,XmNwidth , 1024,XmNlabelString ,xmstr,NULL); XmStringFree(xmstr); xmstr = XmStringCreateSimple(" File: "); XtVaSetValues(xcddraw_filelabel,XmNlabelString ,xmstr,NULL); XmStringFree(xmstr); update_flag = 0; redraw(); } void cdSaveFileCallback( Widget w, Widget *wp, XtPointer callData ) { char *filename = NULL; char *cont; FILE *fp; XmFileSelectionBoxCallbackStruct *cb = (XmFileSelectionBoxCallbackStruct *) callData; XmString xmstr = cb->value; int status = 0; if ( xmstr ) { status = XmStringGetLtoR ( xmstr,XmSTRING_DEFAULT_CHARSET,&filename ); } extern void create_prompt(char *m,int *doit); fp = fopen(filename,"r"); if (fp) { int doit = 0; create_prompt("File exists. Overwrite it?",&doit); fclose(fp); if (doit == 0) { XtDestroyWidget (w); XtDestroyWidget ( wp[0] ); delete wp; return; } } fp = fopen(filename,"w"); if (fp == NULL) { sprintf(message, "Save: Cannot open file %s.\n",filename); xm_print_message(message); XBell(XtDisplay(draw_area),0); XtDestroyWidget (w); XtDestroyWidget ( wp[0] ); delete wp; return; } free(filename); cont = XmTextGetString(wp[1]); fwrite((void*)cont,strlen(cont),1,fp); fclose(fp); free(cont); XtDestroyWidget ( w ); XtDestroyWidget ( wp[0] ); delete wp; } void cddrawReadFileCallback( Widget w, Widget file_label, XtPointer callData ) { char *filename = NULL; char *cont; XmFileSelectionBoxCallbackStruct *cb = (XmFileSelectionBoxCallbackStruct *) callData; XmString xmstr = cb->value; int status = 0; if ( xmstr ) { status = XmStringGetLtoR ( xmstr,XmSTRING_DEFAULT_CHARSET,&filename ); FILE *fp; fp = fopen(filename,"r"); if (fp) { int readPS(FILE*); void freeStore(); freeStore(); readPS(fp); fclose(fp); redraw(); XmString xmstr = XmStringCreateSimple(filename); XtVaSetValues(file_label,XmNwidth , 1024,XmNlabelString ,xmstr,NULL); XmStringFree(xmstr); cur_file_name = filename; xmstr = XmStringCreateSimple(" File: "); XtVaSetValues(xcddraw_filelabel,XmNlabelString ,xmstr,NULL); XmStringFree(xmstr); update_flag = 0; } else { char m[1024]; sprintf(m,"Open: unable to open file %s",filename); xm_print_message(m); XBell(XtDisplay(draw_area),0); free(filename); } } XtDestroyWidget ( w ); } void changePicSizeCallback( Widget w, XtPointer client_data, XtPointer callData ) { Widget dialog; int n; char buf[256]; n = 0; XtSetArg(wargs[n], XmNautoUnmanage, False); n++; XtSetArg(wargs[n], XmNdialogStyle, XmDIALOG_APPLICATION_MODAL); n++; dialog = XmCreatePromptDialog(draw_area,"Picture Size", wargs,n); Widget form = XtCreateManagedWidget("Form",xmFormWidgetClass,dialog,NULL,0); n = 0; Widget wlabel= XtCreateManagedWidget( "Width: ",xmLabelGadgetClass,form,wargs,n); Widget wtext = XtCreateManagedWidget("Width",xmTextWidgetClass,form,NULL,0); sprintf(buf,"%d", draw_area_width); XmTextSetString(wtext,buf); n = 0; Widget hlabel= XtCreateManagedWidget( "Height: ",xmLabelGadgetClass,form,wargs,n); Widget htext = XtCreateManagedWidget("Height",xmTextWidgetClass,form,NULL,0); sprintf(buf,"%d", draw_area_height); XmTextSetString(htext,buf); XtVaSetValues(wlabel, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, NULL); XtVaSetValues(wtext, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, wlabel, XmNrightAttachment, XmATTACH_FORM, NULL); XtVaSetValues(hlabel, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, wlabel, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, NULL); XtVaSetValues(htext, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, wtext, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, hlabel, XmNrightAttachment, XmATTACH_FORM, NULL); XtUnmanageChild( XmSelectionBoxGetChild(dialog,XmDIALOG_VALUE_TEXT)); XtUnmanageChild( XmSelectionBoxGetChild(dialog,XmDIALOG_SELECTION_LABEL)); XmString xmstr = XmStringCreateSimple("Apply"); XtVaSetValues(dialog, XmNokLabelString, xmstr, NULL); /* cheating */ XmStringFree(xmstr); xmstr = XmStringCreateSimple("Done"); XtVaSetValues(dialog, XmNcancelLabelString,xmstr, NULL); XmStringFree(xmstr); xmstr = XmStringCreateSimple("Cancel"); XtVaSetValues(dialog, XmNhelpLabelString, xmstr, NULL); XmStringFree(xmstr); int done = 0; XtAddCallback(dialog, XmNcancelCallback, (XtCallbackProc)finishInfo,(XtPointer)&done); XtAddCallback(dialog, XmNhelpCallback, (XtCallbackProc)cancelInfo,(XtPointer)&done); XtManageChild(dialog); XtPopup(XtParent(dialog), XtGrabExclusive); dialog_done = 0; while ( dialog_done == 0 || XtAppPending(app)) XtAppProcessEvent(app, XtIMAll); if (done) { char *t = XmTextGetString(wtext); if (strlen(t)) { int ti = atoi(t); draw_area_width = (ti > view_width) ? ti : view_width; } t = XmTextGetString(htext); if (strlen(t)) { int ti = atoi(t); draw_area_height = (ti > view_height) ? ti : view_height; } XtVaSetValues(draw_vsb, XmNmaximum, draw_area_height, XmNsliderSize, min(view_height , draw_area_height), NULL); XtVaSetValues(draw_hsb, XmNmaximum, draw_area_width, XmNsliderSize, min(view_width , draw_area_width), NULL); move_zoom_view(0,0); } XtDestroyWidget(dialog); } void cancelCallback( Widget w, XtPointer client_data, XtPointer callData ) { XtDestroyWidget ( w ); } void cancelSaveCDCallback( Widget w, Widget *wp, XtPointer callData ) { XtDestroyWidget ( w ); delete wp; } void cdSaveasFRCallback( Widget w, char** filename, XtPointer callData ) { XmFileSelectionBoxCallbackStruct *cb = (XmFileSelectionBoxCallbackStruct *) callData; XmString xmstr = cb->value; int status = 0; if ( xmstr ) { status = XmStringGetLtoR (xmstr,XmSTRING_DEFAULT_CHARSET,filename ); } dialog_done = 1; } extern void save(char*,double); void cdSaveasPSCallback( Widget w, Widget file_label, XtPointer call_data ) { Widget dialog; char *fn = NULL; int n; n = 0; XtSetArg(wargs[n], XmNautoUnmanage, False); n++; XtSetArg(wargs[n], XmNdialogStyle, XmDIALOG_APPLICATION_MODAL); n++; dialog = XmCreateFileSelectionDialog (w,"File_Open_Dialog",wargs,n); int unused; XtAddCallback (dialog,XmNokCallback,(XtCallbackProc)cdSaveasFRCallback,(XtPointer)&fn); XtAddCallback (dialog,XmNcancelCallback,(XtCallbackProc)cancelInfo,(XtPointer)&unused); XtManageChild(dialog); XtPopup(XtParent(dialog), XtGrabExclusive); dialog_done = 0; while ( dialog_done == 0 || XtAppPending(app)) XtAppProcessEvent(app, XtIMAll); if (fn) { extern void create_prompt(char *m,int *doit); FILE *fp = fopen(fn,"r"); if (fp) { int doit = 0; create_prompt("File exists. Overwrite it?",&doit); fclose(fp); if (doit == 0) { XtDestroyWidget(dialog); } } fp = fopen(fn,"w"); if (fp == NULL) { sprintf(message, "Save: Cannot open file %s.\n",fn); xm_print_message(message); XBell(XtDisplay(draw_area),0); XtDestroyWidget(dialog); return; } if (cur_file_name) { free(cur_file_name); cur_file_name = NULL; } cur_file_name = fn; save(fn,0.5); XmString xmstr = XmStringCreateSimple(cur_file_name); XtVaSetValues(file_label,XmNwidth , 1024,XmNlabelString ,xmstr,NULL); XmStringFree(xmstr); xmstr = XmStringCreateSimple(" File: "); XtVaSetValues(xcddraw_filelabel,XmNlabelString ,xmstr,NULL); XmStringFree(xmstr); update_flag = 0; } XtDestroyWidget(dialog); } void cdSavePSCallback( Widget w, Widget file_label, XtPointer call_data ) { if (cur_file_name == NULL) cdSaveasPSCallback(w,file_label,call_data); else { FILE *fp = fopen(cur_file_name,"w"); if (fp == NULL) { sprintf(message, "Save: Cannot open file %s.\n",cur_file_name); xm_print_message(message); XBell(XtDisplay(draw_area),0); return; } save(cur_file_name,0.5); XmString xmstr = XmStringCreateSimple(" File: "); XtVaSetValues(xcddraw_filelabel,XmNlabelString ,xmstr,NULL); XmStringFree(xmstr); update_flag = 0; } } void cddrawFileOpenCallback( Widget w, Widget file_label, XtPointer call_data ) { Widget fileD; if (panic()) return; fileD = XmCreateFileSelectionDialog ( w,"File_Open_Dialog",NULL, 0 ); XtAddCallback (fileD,XmNokCallback, (XtCallbackProc)cddrawReadFileCallback,(XtPointer)file_label); XtAddCallback (fileD,XmNcancelCallback,(XtCallbackProc)cancelCallback,NULL); XtManageChild ( fileD ); } void saveCDCB( Widget w, Widget cdtext, XtPointer call_data ) { Widget fileD; Widget *wp = new Widget[2]; wp[0] = w; wp[1] = cdtext; fileD = XmCreateFileSelectionDialog ( w,"File_Open_Dialog",NULL, 0 ); XtAddCallback (fileD,XmNokCallback, (XtCallbackProc)cdSaveFileCallback,(XtPointer)wp); XtAddCallback (fileD,XmNcancelCallback,(XtCallbackProc)cancelSaveCDCallback,(XtPointer)wp); XtManageChild ( fileD ); } void cancelCDCB( Widget w, XtPointer unused, XtPointer call_data ) { XtDestroyWidget(w); } extern void cdPrintCallback(Widget w,XtPointer unused,XtPointer call_data); void cdGentCallback( Widget w, XtPointer unused, XtPointer call_data ) { char fname[256]; tmpnam(fname); Widget dialog; int n; FILE *fp = fopen(fname,"w"); if (fp==NULL) { sprintf(message, "Generate Cd: unable to open %s.\n",fname); xm_print_message(message); XBell(XtDisplay(draw_area),0); return; } vertex_store->genCd(fp); fclose(fp); n = 0; XtSetArg(wargs[n], XmNautoUnmanage, False); n++; dialog = XmCreatePromptDialog(draw_area,"Cd Preview", wargs,n); Widget form = XtCreateManagedWidget("Form",xmFormWidgetClass,dialog,NULL,0); n = 0; Widget cwin = XmCreateFrame(form,"Comment_Frame",NULL,0); XtManageChild(cwin); n = 0; XtSetArg(wargs[n], XmNwidth, 600); n++; XtSetArg(wargs[n], XmNheight,500); n++; XtSetArg(wargs[n],XmNeditMode , XmMULTI_LINE_EDIT); n++; XtSetArg(wargs[n], XmNscrollingPolicy, XmAUTOMATIC); n++; Widget cdtext = XmCreateScrolledText(cwin,"CD_Content",wargs,n); XtManageChild(cdtext); int status = 0; struct stat statInfo; if ((fp = fopen(fname,"r")) == NULL) { sprintf(message, "Generate Cd: unable to open %s.\n",fname); xm_print_message(message); XBell(XtDisplay(draw_area),0); XtDestroyWidget(dialog); return; } if (stat(fname,&statInfo) == 0 ) { char * cont = (char*)malloc(statInfo.st_size+1); fread((void*)cont,statInfo.st_size,1,fp); cont[statInfo.st_size] = '\0'; XmTextSetString(cdtext,cont); free(cont); } fclose ( fp ); XtUnmanageChild( XmSelectionBoxGetChild(dialog,XmDIALOG_VALUE_TEXT)); XtUnmanageChild( XmSelectionBoxGetChild(dialog,XmDIALOG_SELECTION_LABEL)); XmString xmstr = XmStringCreateSimple("Save"); XtVaSetValues(dialog, XmNokLabelString, xmstr, NULL); XmStringFree(xmstr); xmstr = XmStringCreateSimple("Quit"); XtVaSetValues(dialog, XmNcancelLabelString,xmstr, NULL); XmStringFree(xmstr); xmstr = XmStringCreateSimple("Help"); XtVaSetValues(dialog, XmNhelpLabelString, xmstr, NULL); XmStringFree(xmstr); XtAddCallback(dialog, XmNokCallback, (XtCallbackProc)saveCDCB,(XtPointer)cdtext); XtAddCallback(dialog, XmNcancelCallback, (XtCallbackProc)cancelCDCB,(XtPointer)NULL); XtManageChild(dialog); XtPopup(XtParent(dialog), XtGrabNone); unlink(fname); } void initCddrawMenu( Widget parent, Widget topshell ) { Widget filetopic,edittopic,optiontopic,searchtopic,helptopic; Widget filechoices[10], editchoices[6],options[5],searchchoices[5]; Widget filepane,editpane,optionpane,searchpane,helppane; int n; /* File */ filepane = XmCreatePulldownMenu(parent,"File_Pane",NULL,0); XtSetArg(wargs[0], XmNsubMenuId, filepane); filetopic = XmCreateCascadeButton(parent, "File_Topic", wargs,1); XtManageChild(filetopic); n = 0; filechoices[0] = XmCreatePushButton(filepane, "File_New", NULL,0); filechoices[1] = XmCreatePushButton(filepane, "File_Open", NULL,0); filechoices[2] = XmCreatePushButton(filepane, "File_Save", NULL,0); filechoices[3] = XmCreatePushButton(filepane, "File_SaveAs", NULL,0); filechoices[4] = XmCreateSeparator (filepane, "File_Sepl", NULL,0); filechoices[5] = XmCreatePushButton(filepane, "File_Print", NULL,0); filechoices[6] = XmCreatePushButton(filepane, "File_CdGen", NULL,0); filechoices[7] = XmCreateSeparator (filepane, "File_Sepl", NULL,0); filechoices[8] = XmCreatePushButton(filepane, "File_Exit", NULL,0); XtManageChildren(filechoices,9); XtAddCallback (filechoices[0], XmNactivateCallback, (XtCallbackProc)freeStoreCallback, (XtPointer)xcddraw_filelabelcontent); XtAddCallback (filechoices[1], XmNactivateCallback, (XtCallbackProc)cddrawFileOpenCallback, (XtPointer)xcddraw_filelabelcontent); XtAddCallback (filechoices[2], XmNactivateCallback, (XtCallbackProc)cdSavePSCallback, (XtPointer)xcddraw_filelabelcontent); XtAddCallback (filechoices[3], XmNactivateCallback, (XtCallbackProc)cdSaveasPSCallback, (XtPointer)xcddraw_filelabelcontent); XtAddCallback (filechoices[5], XmNactivateCallback, (XtCallbackProc)cdPrintCallback, (XtPointer)NULL); XtAddCallback (filechoices[6], XmNactivateCallback, (XtCallbackProc)cdGentCallback, (XtPointer)NULL); XtAddCallback (filechoices[8], XmNactivateCallback, (XtCallbackProc)cddrawQuitCallback, (XtPointer)topshell); /* edit */ editpane = XmCreatePulldownMenu(parent,"Edit_Pane",NULL,0); XtSetArg(wargs[0], XmNsubMenuId, editpane); edittopic = XmCreateCascadeButton(parent, "Edit", wargs,1); XtManageChild(edittopic); n = 0; editchoices[0] = XmCreatePushButton(editpane, "Reorder Vertices", NULL,0); XtManageChildren(editchoices,1); void reorderCallback(Widget w,XtPointer, XtPointer); XtAddCallback (editchoices[0],XmNactivateCallback, (XtCallbackProc)reorderCallback,NULL); /* options */ optionpane = XmCreatePulldownMenu(parent,"Option_Pane",NULL,0); XtSetArg(wargs[0], XmNsubMenuId, optionpane); optiontopic = XmCreateCascadeButton(parent, "Option", wargs,1); XtManageChild(optiontopic); n = 0; options[0] = XmCreatePushButton(optionpane, "Picture Size", NULL,0); options[1] = XmCreatePushButton(optionpane, "Crop", NULL,0); XtManageChildren(options,2); XtAddCallback (options[0], XmNactivateCallback, (XtCallbackProc)changePicSizeCallback, (XtPointer)NULL); /* search */ searchpane = XmCreatePulldownMenu(parent,"Search_Pane",NULL,0); XtSetArg(wargs[0], XmNsubMenuId, searchpane); searchtopic = XmCreateCascadeButton(parent, "Search", wargs,1); XtManageChild(searchtopic); n = 0; searchchoices[0] = XmCreatePushButton(searchpane, "Search Vertices", NULL,0); searchchoices[1] = XmCreatePushButton(searchpane, "Search Edges", NULL,0); XtManageChildren(searchchoices,2); /* Help */ helptopic = XmCreateCascadeButton(parent,"Help_Topic",NULL,0); XtManageChild(helptopic); XtSetArg(wargs[0], XmNmenuHelpWidget, helptopic); XtSetValues(parent,wargs,1); } void set_color( Widget w, String color ) { Display *dpy = XtDisplay(w); Colormap cmap = DefaultColormapOfScreen(XtScreen(w)); XColor col, unused; if (!XAllocNamedColor(dpy, cmap, color, &col, &unused)) { char buf[32]; sprintf(buf, "Can't alloc %s", color); XtWarning(buf); return; } XSetForeground(dpy, gc, col.pixel); } void xcddraw_help( Widget w, XEvent *e, char *p[], int *n ) { char help_line[1024]; XmString xmstr; int i; printf("sdfdsfdsf\n"); if(*n==0) return; strcpy(help_line,p[0]); for(i=1; i < *n; i++) { strcat(help_line," "); strcat(help_line,p[i]); } printf("%s\n",help_line); xmstr = XmStringCreate(help_line, XmSTRING_DEFAULT_CHARSET); XtSetArg(wargs[0],XmNlabelString ,xmstr); XtSetArg(wargs[1],XmNwidth ,1024); XtSetValues(xcddraw_helplabel,wargs,2); XFree(xmstr); } void xcddraw_label( Widget w, XEvent *e, char *p[], int *n ) { } XtActionsRec actiontbl[] = { {"xcddraw-label", (XtActionProc)xcddraw_label}, {"xcddraw-help", (XtActionProc)xcddraw_help}, {"xcddraw-help", (XtActionProc)xcddraw_help}, }; int main( #ifdef OLD_MOTIF unsigned int argc, #else int argc, #endif char *argv[], char **envp ) { static Widget cddraw_commands[15]; Widget cddraw_command, cddraw_frames[15], cddraw_commandframe; Widget draw_frame; Widget label_form; Widget helplabel,topform, menubar, helpsepl; XGCValues values,gcv; static pixmap_data data[15]; static control_data cntl_data[15]; int i,m,n; graphics_data g_data; /* signal(SIGTERM, (SIG_TYP)top_exit); */ toplevel = XtAppInitialize(&app, "xcddraw", NULL,0,&argc,argv,NULL,NULL,0); // XtParseTranslationTable(mytrans); Pixmap d_icon = XCreateBitmapFromData(XtDisplay(toplevel), RootWindowOfScreen(XtScreen(toplevel)), demetericon_bits,demetericon_width,demetericon_height); n = 0; XtSetArg(wargs[n], XmNiconPixmap, d_icon); n++; XtSetValues(toplevel,wargs,n); XFlush(XtDisplay(toplevel)); topform = XmCreateForm(toplevel,"Cddraw_Top_Form",NULL,0); XtManageChild(topform); gcv.foreground = WhitePixelOfScreen(XtScreen(topform)); gc = XCreateGC(XtDisplay(topform), RootWindowOfScreen(XtScreen(topform)), GCForeground, &gcv); /* show the automatic help messages */ XtSetArg(wargs[0],XmNwidth , 1024); xcddraw_helplabel = helplabel = XmCreateLabel(topform, " ",wargs,1); XtManageChild(helplabel); helpsepl = XmCreateSeparator (topform, "Help_Sepl", NULL,0); XtManageChild(helpsepl); label_form = XmCreateForm(topform,"Label_Form",NULL,0); XtManageChild(label_form); /* file label */ xcddraw_filelabel = XmCreateLabel(label_form," File: ",NULL,0); XtManageChild(xcddraw_filelabel); XtSetArg(wargs[0],XmNwidth , 1024); XtSetArg(wargs[1],XmNalignment , XmALIGNMENT_BEGINNING); xcddraw_filelabelcontent = XmCreateLabel(label_form,"Current_File_Name",wargs,2); XtManageChild(xcddraw_filelabelcontent); XtVaSetValues( xcddraw_filelabel, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, NULL); XtVaSetValues ( xcddraw_filelabelcontent, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, xcddraw_filelabel, XmNrightAttachment, XmATTACH_FORM, NULL); /* menu */ menubar = XmCreateMenuBar (topform,"Menu_Bar",NULL,0); XtManageChild(menubar); initCddrawMenu(menubar,toplevel); /* selections and drawing area */ draw_frame = XmCreateFrame(topform,"Draw_Frame", NULL,0); XtManageChild(draw_frame); n = 0; XtSetArg(wargs[n],XmNresizeWidth , FALSE); n++; XtSetArg(wargs[n],XmNresizeHeight , FALSE); n++; cddraw_framework = XtCreateManagedWidget("Cddraw_Form", xmFormWidgetClass, draw_frame,wargs,n); /* selections */ drawing_choices.sel = 1; drawing_choices.cv = 0; drawing_choices.av = 0; drawing_choices.rv = 0; drawing_choices.ev = 0; drawing_choices.pv = 0; drawing_choices.re = 0; drawing_choices.oe = 0; drawing_choices.ae = 0; drawing_choices.ie = 0; drawing_choices.pe = 0; /* hold buttons */ cddraw_commandframe = XmCreateFrame(cddraw_framework, "Cddraw_Command_Frame", NULL,0); XtManageChild(cddraw_commandframe); cddraw_command = XtCreateManagedWidget("Cddraw__Command", xmFormWidgetClass, cddraw_commandframe,NULL,0); XtVaSetValues( cddraw_commandframe, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, NULL); XtVaSetValues ( menubar,XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtVaSetValues ( helplabel , XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, menubar, XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtVaSetValues ( helpsepl , XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, helplabel, XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtVaSetValues (label_form, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, helpsepl, XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtVaSetValues ( draw_frame, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, label_form, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); /* drawing form */ draw_framework = XtVaCreateManagedWidget("Draw_Scrolled_Window", xmScrolledWindowWidgetClass, cddraw_framework, XmNwidth, 300, XmNscrollingPolicy, XmAPPLICATION_DEFINED, XmNvisualPolicy, XmVARIABLE, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, cddraw_commandframe, XmNrightAttachment, XmATTACH_FORM,NULL); n = 0; XtSetArg(wargs[n], XtNforeground, &values.foreground); n++; XtSetArg(wargs[n], XtNbackground, &values.background); n++; XtGetValues(draw_framework, wargs,n); choices_gc = XtGetGC(draw_framework, GCForeground | GCBackground, &values); draw_area = XtVaCreateManagedWidget("Draw_Area", xmDrawingAreaWidgetClass, draw_framework, XmNunitType, XmPIXELS, /* Xm1000TH_INCHES */ XmNwidth , 300, XmNheight , 100, NULL); /* convert drawing area back to pixels to get its width and height */ XtVaSetValues(draw_area, XmNunitType, XmPIXELS, NULL); set_color(draw_area,"White"); n = 0; XtSetArg(wargs[n], XtNforeground, &g_data.foreground); n++; XtSetArg(wargs[n], XtNbackground, &g_data.background); n++; XtGetValues(draw_area, wargs,n); /* GC Settings */ /* Zoom GC */ values.foreground = g_data.foreground; values.background = g_data.background; values.line_style = LineSolid; values.fill_style = FillSolid; values.line_width = 1; values.join_style = JoinRound; zoom_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth, &values); /* draw unparameterized vertex */ values.foreground = g_data.foreground; values.background = g_data.background; values.line_style = LineSolid; values.fill_style = FillSolid; values.line_width = 3; p_v_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_p_v_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCFunction, &values); values.foreground = g_data.foreground; values.background = g_data.background; values.line_width = 1; up_v_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_up_v_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCFunction, &values); values.foreground = g_data.background; values.background = g_data.foreground; values.line_width = 3; reversed_p_v_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth, &values); values.line_width = 1; reversed_up_v_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth, &values); /* draw parameterized vertex */ values.foreground = g_data.foreground; values.background = g_data.background; values.line_style = LineOnOffDash; values.fill_style = FillSolid; values.dash_offset = 2; values.dashes = 4; values.line_width = 3; par_p_v_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCDashList | GCDashOffset, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_par_p_v_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCDashList | GCDashOffset | GCFunction, &values); values.foreground = g_data.foreground; values.background = g_data.background; values.line_width = 1; par_up_v_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCDashList | GCDashOffset, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_par_up_v_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCDashList | GCDashOffset | GCFunction, &values); /* draw required construction repetition edge edge */ values.foreground = g_data.foreground; values.background = g_data.background; values.line_style = LineSolid; values.fill_style = FillSolid; values.line_width = 3; re_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_re_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCFunction, &values); /* draw optional construction repetition edge */ values.foreground = g_data.foreground; values.background = g_data.background; values.line_style = LineOnOffDash; values.fill_style = FillSolid; values.dash_offset = 2; values.dashes = 4; values.line_width = 3; oe_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCDashList | GCDashOffset, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_oe_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCDashList | GCDashOffset | GCFunction, &values); /* draw alternation edge back */ values.foreground = g_data.foreground; values.background = g_data.background; values.line_style = LineSolid; values.fill_style = FillSolid; values.line_width = 5; ae_bgc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_ae_bgc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCFunction, &values); /* draw alternation edge front */ values.foreground = g_data.background; values.background = g_data.foreground; values.line_style = LineSolid; values.fill_style = FillSolid; values.line_width = 3; ae_fgc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_ae_fgc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCFunction, &values); /* draw parameter edge */ values.foreground = g_data.foreground; values.background = g_data.background; values.line_style = LineSolid; values.fill_style = FillSolid; values.line_width = 1; pe_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_pe_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCFunction, &values); /* draw inheritance edge back */ values.foreground = g_data.foreground; values.background = g_data.background; values.line_style = LineOnOffDash; values.fill_style = FillSolid; values.line_width = 5; ie_bgc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCDashList | GCDashOffset, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_ie_bgc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCFunction, &values); /* draw inheritance edge front */ values.foreground = g_data.background; values.background = g_data.foreground; values.line_style = LineSolid; values.fill_style = FillSolid; values.line_width = 3; ie_fgc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_ie_fgc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCFunction, &values); /* draw parameter instantiation ege */ values.foreground = g_data.foreground; values.background = g_data.background; values.line_style = LineSolid; values.fill_style = FillSolid; values.line_width = 5; pie_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_pie_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCJoinStyle | GCFillStyle | GCLineStyle | GCLineWidth | GCFunction, &values); /* name fonts */ class_font = XLoadQueryFont(XtDisplay(draw_area), "*times-bold-r*140*"); label_font = XLoadQueryFont(XtDisplay(draw_area), "*courier-medium-r*120*"); if (label_font == NULL) { fprintf(stderr,"%s: couldn't load fonts.\n",argv[0]); label_font = XLoadQueryFont(XtDisplay(draw_area), "fixed"); } if (class_font == NULL) class_font = label_font; values.foreground = g_data.foreground; values.background = g_data.background; values.font = class_font->fid; class_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCFillStyle | GCFont, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_class_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCFillStyle | GCFont | GCFunction, &values); values.foreground = g_data.background; values.background = g_data.foreground; values.font = class_font->fid; reversed_class_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCFillStyle | GCFont, &values); values.foreground = g_data.foreground; values.background = g_data.background; values.font = label_font->fid; label_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCFillStyle | GCFont, &values); values.foreground = values.foreground ^ values.background; values.function = GXxor; xor_label_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCFillStyle | GCFont | GCFunction, &values); values.foreground = g_data.background; values.background = g_data.foreground; values.font = label_font->fid; reversed_label_gc = XtGetGC(draw_area, GCForeground | GCBackground | GCFillStyle | GCFont, &values); n = 0; XtSetArg(wargs[n], XtNforeground, &values.foreground); n++; XtSetArg(wargs[n], XtNbackground, &values.background); n++; XtGetValues(draw_area, wargs,n); values.foreground = values.foreground ^ values.background; values.line_style = LineOnOffDash; values.line_width = 1; values.function = GXxor; xorgc = XtGetGC(draw_area, GCForeground | GCBackground | GCLineStyle | GCFunction | GCLineWidth , &values); g_data.xorgc = xorgc; g_data.next_pos = 0; g_data.choice = &drawing_choices; g_data.last_action = NONE; { Dimension tx,ty; XtVaGetValues(draw_area, XmNwidth, &tx, XmNheight, &ty, NULL); view_width = tx; view_height = ty; } draw_vsb = XtVaCreateManagedWidget("draw_vsb", xmScrollBarWidgetClass, draw_framework, XmNorientation, XmVERTICAL, XmNmaximum, draw_area_height, XmNsliderSize, min(view_height , draw_area_height), NULL); draw_hsb = XtVaCreateManagedWidget("draw_hsb", xmScrollBarWidgetClass, draw_framework, XmNorientation, XmHORIZONTAL, XmNmaximum, draw_area_width, XmNsliderSize, min(view_width , draw_area_width), NULL); if (view_height > draw_area_height) sw_voffset = (view_height - draw_area_height)/2; if (view_width > draw_area_width) sw_hoffset = (view_width - draw_area_width)/2; XmScrolledWindowSetAreas(draw_framework, draw_hsb, draw_vsb, draw_area); XtAddCallback(draw_area, XmNexposeCallback, (XtCallbackProc)expose_resize, NULL); XtAddCallback(draw_area, XmNresizeCallback, (XtCallbackProc)expose_resize, NULL); XtAddEventHandler(draw_area, ButtonPressMask, FALSE, (XtEventHandler)press_draw, (XtPointer)&g_data); XtAddEventHandler(draw_area, Button1MotionMask | PointerMotionMask , FALSE, (XtEventHandler)track_draw, (XtPointer)&g_data); XtAddEventHandler(draw_area, Button2MotionMask, FALSE, (XtEventHandler)move_objects, (XtPointer)&g_data); XtAddEventHandler(draw_area, ButtonReleaseMask, FALSE, (XtEventHandler)release_draw, (XtPointer)&g_data); XtAddEventHandler(draw_area, EnterWindowMask, FALSE, (XtEventHandler)print_help, "Press left button to start or select objects, middle button to finish drawing or move objects, and right button for info"); XtAddEventHandler(draw_area, LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); XtAddCallback(draw_vsb, XmNvalueChangedCallback, (XtCallbackProc)scrolled, (XtPointer)XmVERTICAL); XtAddCallback(draw_hsb, XmNvalueChangedCallback, (XtCallbackProc)scrolled, (XtPointer)XmHORIZONTAL); XtAddCallback(draw_vsb, XmNdragCallback, (XtCallbackProc)scrolled, (XtPointer)XmVERTICAL); XtAddCallback(draw_hsb, XmNdragCallback, (XtCallbackProc)scrolled, (XtPointer)XmHORIZONTAL); /* choices */ /* revert */ m = 0; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames1", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_SelectDB",NULL,0); XtManageChild(cddraw_commands[m]); n = 0; XtSetArg(wargs[n], XtNforeground, &values.background); n++; XtSetArg(wargs[n], XtNbackground, &values.foreground); n++; XtGetValues(cddraw_commands[m], wargs,n); button_gc = XtGetGC(draw_area, GCForeground | GCBackground, &values); data[m].gc = button_gc; data[m].width = sel_width; data[m].height = sel_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc,sel_bits,sel_width, sel_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback, (XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback, (XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.sel; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Select objects. Use left button to select, middle button to move, and right button for info."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); m++; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames2", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, cddraw_frames[m-1], XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_ConsVDB",NULL,0); XtManageChild(cddraw_commands[m]); n = 0; XtSetArg(wargs[n], XtNforeground, &values.foreground); n++; XtSetArg(wargs[n], XtNbackground, &values.background); n++; XtGetValues(cddraw_commands[m], wargs,n); data[m].gc = XtGetGC(cddraw_commands[m], GCForeground | GCBackground, &values); data[m].width = cv_width; data[m].height = cv_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc,cv_bits,cv_width, cv_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback, (XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback, (XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.cv; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Draw construction vertices. Use left button to create, middle button to enter names, and right buton to cancel."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); m++; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames3", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, cddraw_frames[m-1], XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_AltVDB",NULL,0); XtManageChild(cddraw_commands[m]); data[m].gc = choices_gc; data[m].width = av_width; data[m].height = av_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc,av_bits,av_width, av_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback, (XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback, (XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.av; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Draw alternation vertices. Use left button to create, middle button to enter names, and right buton to cancel."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); m++; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames4", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, cddraw_frames[m-1], XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_RepVDB",NULL,0); XtManageChild(cddraw_commands[m]); data[m].gc = choices_gc; data[m].width = rv_width; data[m].height = rv_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc,rv_bits,rv_width, rv_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback, (XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback, (XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.rv; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Draw repetition vertices. Use left button to create, middle button to enter names, and right buton to cancel."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); m++; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames5", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, cddraw_frames[m-1], XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_TermVDB",NULL,0); XtManageChild(cddraw_commands[m]); data[m].gc = choices_gc; data[m].width = tv_width; data[m].height = tv_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc,tv_bits,tv_width, tv_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback, (XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback, (XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.tv; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Draw terminal vertices. Use left button to create, middle button to enter names, and right buton to cancel."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); m++; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, cddraw_frames[m-1], XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_ExternVDB",NULL,0); XtManageChild(cddraw_commands[m]); data[m].gc = choices_gc; data[m].width = ev_width; data[m].height = ev_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc,ev_bits,ev_width, ev_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback,(XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback,(XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.ev; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Draw external vertices. Use left button to create, middle button to enter names, and right buton to cancel."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); m++; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, cddraw_frames[m-1], XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_ParamVDB",NULL,0); XtManageChild(cddraw_commands[m]); data[m].gc = choices_gc; data[m].width = pv_width; data[m].height = pv_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc, pv_bits,pv_width, pv_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback,(XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback,(XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.pv; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Draw parameter vertices. Use left button to create, middle button to enter names, and right buton to cancel."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); m++; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames6", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, cddraw_frames[m-1], XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_RConsEDB",NULL,0); XtManageChild(cddraw_commands[m]); data[m].gc = choices_gc; data[m].width = re_width; data[m].height = re_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc,re_bits,re_width, re_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback,(XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback,(XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.re; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Draw required construction/repetition edges. Use left button to create, middle button to finish, and right buton to cancel."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); m++; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames7", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, cddraw_frames[m-1], XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_OConsEDB",NULL,0); XtManageChild(cddraw_commands[m]); data[m].gc = choices_gc; data[m].width = oe_width; data[m].height = oe_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc,oe_bits,oe_width, oe_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback, (XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback, (XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.oe; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Draw optional construction/repetition edges. Use left button to create, middle button to enter names, and right buton to cancel."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); m++; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames8", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, cddraw_frames[m-1], XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_AltEDB",NULL,0); XtManageChild(cddraw_commands[m]); data[m].gc = choices_gc; data[m].width = ae_width; data[m].height = ae_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc,ae_bits,ae_width, ae_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback, (XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback, (XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.ae; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Draw alternation edges. Use left button to create, middle button to enter names, and right buton to cancel."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); m++; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames8", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, cddraw_frames[m-1], XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_INHEDB",NULL,0); XtManageChild(cddraw_commands[m]); data[m].gc = choices_gc; data[m].width = ie_width; data[m].height = ie_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc,ie_bits,ie_width, ie_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback, (XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback, (XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.ie; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Draw inheritance edges. Use left button to create, middle button to enter names, and right buton to cancel."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); m++; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames8", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, cddraw_frames[m-1], XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_ParEDB",NULL,0); XtManageChild(cddraw_commands[m]); data[m].gc = choices_gc; data[m].width = pe_width; data[m].height = pe_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc,pe_bits,pe_width, pe_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback, (XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback, (XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.pe; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Draw parameter edges. Use left button to create, middle button to enter names, and right buton to cancel."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); m++; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames8", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, cddraw_frames[m-1], XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_ParInstEDB",NULL,0); XtManageChild(cddraw_commands[m]); data[m].gc = choices_gc; data[m].width = pie_width; data[m].height = pie_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc, pie_bits,pie_width, pie_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback, (XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback, (XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.pie; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Draw instantiation edges from parameterized vertices. Use left button to create, middle button to enter names, and right buton to cancel."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); m++; cddraw_frames[m] = XmCreateFrame(cddraw_command, "Cddraw_Command_Frames8", NULL,0); XtVaSetValues (cddraw_frames[m], XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, cddraw_frames[m-1], XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(cddraw_frames[m]); cddraw_commands[m] =XmCreateDrawingArea(cddraw_frames[m],"Cddraw_TrashDB",NULL,0); XtManageChild(cddraw_commands[m]); data[m].gc = choices_gc; data[m].width = trash_width; data[m].height = trash_height; data[m].pix = create_pixmap(cddraw_commands[m],data[m].gc, trash_bits,trash_width, trash_height); n = 0; XtSetArg(wargs[n], XtNwidth, data[m].width); n++; XtSetArg(wargs[n], XtNheight, data[m].height); n++; XtSetValues(cddraw_commands[m], wargs,n); XtSetValues(cddraw_frames[m], wargs,n); XtAddCallback(cddraw_commands[m], XmNexposeCallback, (XtCallbackProc)redisplay, (XtPointer)&data[m]); XtAddCallback(cddraw_commands[m], XmNresizeCallback, (XtCallbackProc)resize, (XtPointer)&data[m]); cntl_data[m].all_p_data = data; cntl_data[m].choices = cddraw_commands; cntl_data[m].d_choices = &drawing_choices; cntl_data[m].cur_value = &drawing_choices.trash; cntl_data[m].p_data = &data[m]; XtAddEventHandler(cddraw_commands[m], EnterWindowMask, FALSE, (XtEventHandler)print_help, "Delete objects. Use left button to select and delete."); XtAddEventHandler(cddraw_commands[m], LeaveWindowMask, FALSE, (XtEventHandler)print_help, " "); for (i = 0; i <= m; i++) XtAddEventHandler(cddraw_commands[i], ButtonPressMask, FALSE, (XtEventHandler)select_drawing_choices,(XtPointer)&cntl_data[i]); XtAppAddActions(app,actiontbl,XtNumber(actiontbl)); XtRealizeWidget ( toplevel ); XDefineCursor(XtDisplay(draw_area), XtWindow(draw_area), XCreateFontCursor(XtDisplay(draw_area),XC_hand2)); for (i = 0; i <= m; i++) XDefineCursor(XtDisplay(cddraw_commands[i]), XtWindow(cddraw_commands[i]), XCreateFontCursor(XtDisplay(cddraw_commands[i]),XC_question_arrow)); create_zoom_view(NULL,NULL,NULL); /* if exits, nothing done */ XGrabButton(XtDisplay(draw_area), Button1, AnyModifier, XtWindow(draw_area), TRUE, ButtonMotionMask | ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask, GrabModeAsync, GrabModeAsync, XtWindow(draw_area), XCreateFontCursor(XtDisplay(draw_area),XC_hand1)); XGrabButton(XtDisplay(draw_area), Button2, AnyModifier, XtWindow(draw_area), TRUE, ButtonMotionMask | ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask, GrabModeAsync, GrabModeAsync, XtWindow(draw_area), XCreateFontCursor(XtDisplay(draw_area),XC_fleur)); XRaiseWindow(XtDisplay(draw_area),XtWindow(draw_area)); XtAppMainLoop(app); } void xm_print_message(char *m) { int n = strlen(m); static XmTextPosition position; position = XmTextGetInsertionPosition(message_text); XmTextInsert (message_text,position,m); position = XmTextGetInsertionPosition(message_text); XmTextSetCursorPosition(message_text,position); XmTextSetInsertionPosition(message_text,position+n); }