#include "xcddraw.h" #include #include #include #include void ParameterAssignmentStore::update_fillin( setargs_struct *setargs_inst) { if (assignments) assignments->update_fillin(setargs_inst); } void ParameterAssignmentList::update_fillin( setargs_struct *setargs_inst) { elm->update_fillin(setargs_inst); if (next) next->update_fillin(setargs_inst); } void ParameterAssignment::update_fillin( setargs_struct *setargs_inst) { if (flag == READWRITE) { char *filltext = XmTextGetString(this->get_w()); if (strlen(filltext) > 0) { if (this->get_actual_val() && strlen(this->get_actual_val())) { if (strcmp(filltext,this->get_actual_val())!=0) { this->set_actual_val(filltext); *setargs_inst->changed = 1; check_update_flag(); } } else { this->set_actual_val(filltext); *setargs_inst->changed = 1; check_update_flag(); } } } } void setparsCallback(Widget w, setargs_struct *setargs_inst,XmSelectionBoxCallbackStruct *cbs) { dialog_done = 1; setargs_inst->store->update_fillin(setargs_inst); XtDestroyWidget(w); } void cancelparsCallback(Widget w,setargs_struct *setargs_inst,XmSelectionBoxCallbackStruct *cbs) { dialog_done = 1; *setargs_inst->changed = 0; XtDestroyWidget(w); } void ParameterAssignmentStore::createToggleButtons( Widget rb,Widget lr) { if (assignments) assignments->createToggleButtons(rb,lr); } void ParameterAssignmentList::createToggleButtons( Widget rb, Widget lr) { elm->createToggleButtons(rb,lr); if (next) next->createToggleButtons(rb,lr); } void ParameterAssignment::createToggleButtons( Widget rb,Widget lr) { this->set_w(NULL); formaledge->createToggleButtons(rb,lr,flag,this,actual_val); } void ParameterEdge::createToggleButtons( Widget rb,Widget lr,rwflag_t flag,ParameterAssignment *a,char *av) { this->get_to_vertex()->createToggleButtons(rb,lr,flag,a,av); } void VertexObject::createToggleButtons( Widget rb,Widget lr,rwflag_t flag,ParameterAssignment *a,char *av) { this->get_name()->createToggleButtons(rb,lr,flag,a,av); } void TextObject::createToggleButtons( Widget rb,Widget lr,rwflag_t flag,ParameterAssignment *a,char *av) { int n; Widget form = XtCreateManagedWidget("Form",xmFormWidgetClass,rb,NULL,0); n = 0; Widget tb = XtCreateManagedWidget(this->get_val(),xmLabelGadgetClass,form, wargs,n); n = 0; XtSetArg(wargs[n],XmNcolumns,600); n++; XtSetArg(wargs[n],XmNeditable,FALSE); n++; Widget fillin = XtCreateManagedWidget("Actual_Arg", xmTextWidgetClass,form,wargs,n); if (av) XmTextSetString(fillin,av); a->set_w(fillin); a->set_tb(tb); if (flag == READONLY) XtVaSetValues(fillin,XmNeditable,FALSE,NULL); else XtVaSetValues(fillin,XmNeditable,TRUE,NULL); XtVaSetValues(tb, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, NULL); XtVaSetValues(fillin, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, tb, XmNrightAttachment, XmATTACH_FORM, NULL); } extern Widget GetTopShell(Widget w); void assign_actual_pars(int &changed,ParameterAssignmentStore* tmpstore,VertexObject *sv) { Widget dialog; int n; static setargs_struct setargs_inst; setargs_inst.store = tmpstore; setargs_inst.changed = &changed; XUngrabPointer(XtDisplay(draw_area),0); n = 0; XtSetArg(wargs[n], XmNautoUnmanage, False); n++; XtSetArg(wargs[n], XmNdialogStyle, XmDIALOG_APPLICATION_MODAL); n++; dialog = XmCreatePromptDialog(draw_area,"Prompt", wargs,n); n = 0; XtSetArg(wargs[n], XmNscrollingPolicy, XmAUTOMATIC); n++; Widget sw = XtCreateManagedWidget("Scrolled_Window", xmScrolledWindowWidgetClass,dialog,wargs,n); n = 0; XtSetArg(wargs[n], XmNwidth, 400); n++; XtSetArg(wargs[n], XmNheight,500); n++; Widget subform = XtCreateManagedWidget("Form", xmFormWidgetClass,sw,wargs,n); n = 0; XtSetArg(wargs[n], XmNradioAlwaysOne, True); n++; XtSetArg(wargs[n], XmNwidth, 400); n++; XtSetArg(wargs[n], XmNheight,600); n++; Widget radio_box = XtVaCreateManagedWidget( "radiobox",xmRowColumnWidgetClass, subform,NULL); Widget label_rows = XtVaCreateManagedWidget( "rowcolumn",xmRowColumnWidgetClass, subform,NULL); tmpstore->createToggleButtons(radio_box,label_rows); XtVaSetValues( radio_box, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, NULL); XtVaSetValues( label_rows, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, radio_box, 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); XtAddCallback(dialog, XmNcancelCallback, (XtCallbackProc)setparsCallback,(XtPointer)&setargs_inst); XtAddCallback(dialog, XmNhelpCallback, (XtCallbackProc)cancelparsCallback,(XtPointer)&setargs_inst); XtManageChild(dialog); XtPopup(XtParent(dialog), XtGrabExclusive); dialog_done = 0; while ( dialog_done == 0 || XtAppPending(app)) XtAppProcessEvent(app, XtIMAll); } void ParameterInstEdge::doubleClickPopup() { Widget dialog; int n; static setargs_struct setargs_inst; int changed; setargs_inst.store = this->get_from_vertex()->get_parassignstore(); setargs_inst.changed = &changed; XUngrabPointer(XtDisplay(draw_area),0); n = 0; XtSetArg(wargs[n], XmNautoUnmanage, False); n++; XtSetArg(wargs[n], XmNdialogStyle, XmDIALOG_APPLICATION_MODAL); n++; dialog = XmCreatePromptDialog(draw_area,"Edge_Info", wargs,n); n = 0; Widget form = XtCreateManagedWidget("Form",xmFormWidgetClass,dialog,wargs,n); n = 0; Widget elabel = XtCreateManagedWidget( "Template Instantiation Edge",xmLabelGadgetClass,form,wargs,n); n = 0; XtSetArg(wargs[n], XmNwidth, 400); n++; XtSetArg(wargs[n], XmNheight,500); n++; XtSetArg(wargs[n], XmNscrollingPolicy, XmAUTOMATIC); n++; Widget sw = XtCreateManagedWidget("Scrolled_Window", xmScrolledWindowWidgetClass,form,wargs,n); XtVaSetValues(elabel, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtVaSetValues(sw, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, elabel, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); n = 0; XtSetArg(wargs[n], XmNwidth, 400); n++; XtSetArg(wargs[n], XmNheight,400); n++; Widget subform = XtCreateManagedWidget("Form", xmFormWidgetClass,sw,wargs,n); n = 0; XtSetArg(wargs[n], XmNwidth, 400); n++; XtSetArg(wargs[n], XmNheight,600); n++; XtSetArg(wargs[n], XmNradioAlwaysOne, True); n++; Widget radio_box = XtVaCreateManagedWidget( "radiobox",xmRowColumnWidgetClass, subform,NULL); Widget label_rows = XtVaCreateManagedWidget( "rowcolumn",xmRowColumnWidgetClass, subform,NULL); this->get_from_vertex()->get_parassignstore() ->createToggleButtons(radio_box,label_rows); this->get_from_vertex()->get_incoming_parinstedge_store()-> disableFields(this->get_from_vertex()->get_parassignstore()); XtManageChild(radio_box); XtVaSetValues( radio_box, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, NULL); XtVaSetValues( label_rows, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, radio_box, 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); XtAddCallback(dialog, XmNcancelCallback, (XtCallbackProc)setparsCallback,(XtPointer)&setargs_inst); XtAddCallback(dialog, XmNhelpCallback, (XtCallbackProc)cancelparsCallback,(XtPointer)&setargs_inst); XtManageChild(dialog); XtPopup(XtParent(dialog), XtGrabExclusive); dialog_done = 0; while ( dialog_done == 0 || XtAppPending(app)) XtAppProcessEvent(app, XtIMAll); /*go up to propagate the change */ if (changed) this->get_from_vertex()->get_incoming_parinstedge_store()-> propagateChanges(this->get_from_vertex()->get_parassignstore()); } void ObjectStore::disableFields(ParameterAssignmentStore *tstore) { if (objects) objects->disableFields(tstore); } void GraphicsObjectList::disableFields(ParameterAssignmentStore *tstore) { elm->disableFields(tstore); if (next) next->disableFields(tstore); } void ParameterInstEdge::disableFields(ParameterAssignmentStore *tstore) { this->get_from_vertex()->disableEachField(tstore); } void VertexObject::disableEachField(ParameterAssignmentStore *tstore) { this->get_parassignstore()->disableEachField(tstore); this->get_incoming_parinstedge_store()->disableFields(tstore); } void ParameterAssignmentStore::disableEachField(ParameterAssignmentStore *tstore) { if (assignments) assignments->disableEachField(tstore->get_assignments()); } void ParameterAssignmentList::disableEachField(ParameterAssignmentList *ta) { elm->disableEachField(ta->get_elm()); if (next) next->disableEachField(ta->get_next()); } void ParameterAssignment::disableEachField(ParameterAssignment *a) { if (this->get_flag() == READWRITE) { if (this->get_actual_val() && strlen(this->get_actual_val())) { XtVaSetValues(a->get_w(),XmNeditable,FALSE,NULL); } } } /* propagateChanges */ void ObjectStore::propagateChanges(ParameterAssignmentStore *tstore) { if (objects) objects->propagateChanges(tstore); } void GraphicsObjectList::propagateChanges(ParameterAssignmentStore *tstore) { elm->propagateChanges(tstore); if (next) next->propagateChanges(tstore); } void ParameterInstEdge::propagateChanges(ParameterAssignmentStore *tstore) { this->get_from_vertex()->propagateEachChange(tstore); } void VertexObject::propagateEachChange(ParameterAssignmentStore *tstore) { this->get_parassignstore()->propagateEachChange(tstore); this->get_incoming_parinstedge_store()->propagateChanges(tstore); } void ParameterAssignmentStore::propagateEachChange(ParameterAssignmentStore *tstore) { if (assignments) assignments->propagateEachChange(tstore->get_assignments()); } void ParameterAssignmentList::propagateEachChange(ParameterAssignmentList *ta) { elm->propagateEachChange(ta->get_elm()); if (next) next->propagateEachChange(ta->get_next()); } void ParameterAssignment::propagateEachChange(ParameterAssignment *a) { char *t = a->get_actual_val(); int l; if (t && (l = strlen(t))) { free(this->get_actual_val()); char *s = (char*)malloc(l+1); strcpy(s,t); this->set_actual_val(s); check_update_flag(); } }