static void make_generic_slider(QSP_ARG_DECL Screen_Obj *sop) { Arg al[16]; int ac = 0; Widget bb; char buf[4]; sop->so_frame = generic_frame(curr_panel->po_panel_obj, sop, XmSHADOW_IN); /* create a bulletin board to hold the slider */ strcpy(buf,"bb"); // elim compiler warning bb=XmCreateBulletinBoard(sop->so_frame,buf,NULL,0); XtManageChild(bb); /* set slider parameters */ XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++; XtSetArg(al[ac], XmNshowValue, TRUE); ac++; XtSetArg(al[ac], XmNminimum, sop->so_min); ac++; XtSetArg(al[ac], XmNmaximum, sop->so_max); ac++; XtSetArg(al[ac], XmNvalue, sop->so_val); ac++; XtSetArg(al[ac], XmNprocessingDirection, XmMAX_ON_RIGHT); ac++; XtSetArg(al[ac], XmNdecimalPoints, 0); ac++; XtSetArg(al[ac], XmNscaleMultiple, 1); ac++; XtSetArg(al[ac], XmNscaleHeight, 15); ac++; XtSetArg(al[ac], XmNscaleWidth, 300); ac++; /* create slider */ sop->so_obj = XmCreateScale(bb, (char *)sop->so_name, al, ac); /* arrange for slider to become visible */ XtManageChild(sop->so_obj); SET_SOB_HEIGHT(sop,SLIDER_HEIGHT); // BUG where does this value come from? }
void make_edit_box(QSP_ARG_DECL Screen_Obj *sop) { #ifdef HAVE_MOTIF Arg al[8]; int ac = 0; sop->so_frame = generic_frame(curr_panel->po_panel_obj, sop, XmSHADOW_IN); XtSetArg(al[ac], XmNeditable, TRUE); ac++; XtSetArg(al[ac], XmNrecomputeSize, FALSE); ac++; XtSetArg(al[ac], XmNwidth, PO_WIDTH(curr_panel)-30 ); ac++; /* BUG do something sensible about the height... */ //XtSetArg(al[ac], XmNheight, PO_HEIGHT(curr_panel)-30 ); ac++; #define EDIT_BOX_HEIGHT 100 // height of editable area? #define EDIT_BOX_EXTRA 30 // add for total height - this value is guessed!? XtSetArg(al[ac], XmNheight, EDIT_BOX_HEIGHT); ac++; XtSetArg(al[ac], XmNscrollHorizontal, FALSE); ac++; XtSetArg(al[ac], XmNwordWrap, TRUE); ac++; //sop->so_obj = XmCreateTextField(sop->so_frame, (char *)sop->so_name, al, ac); sop->so_obj = XmCreateScrolledText(sop->so_frame, (char *)sop->so_name, al, ac); XtAddCallback(sop->so_obj, XmNvalueChangedCallback, text_func, NULL); XtAddCallback(sop->so_obj, XmNlosingFocusCallback, text_func2, NULL); XtManageChild(sop->so_obj); /* this works for a TextField, but not ScrolledText!? */ //XmTextFieldSetString(sop->so_obj, (char *)sop->so_content_text ); /* this works! */ XmTextSetString(sop->so_obj, (char *)sop->so_content_text ); SET_SOB_HEIGHT(sop,EDIT_BOX_HEIGHT+EDIT_BOX_EXTRA); #endif /* HAVE_MOTIF */ }
static void mk_text_input_line(QSP_ARG_DECL int so_code) { Screen_Obj *to; const char *s; to = get_parts("text"); // sets name and action s = nameof("default value"); if( to == NULL ) return; SET_SOB_CONTENT(to, save_possibly_empty_str(s)); SET_SOB_TYPE(to, so_code); #ifdef BUILD_FOR_IOS get_device_dims(to); // sets width, height, and font size #else SET_SOB_WIDTH(to, PO_WIDTH(curr_panel)-2*SIDE_GAP ); #endif // BUILD_FOR_IOS // height is set for console output... SET_SOB_HEIGHT(to, MESSAGE_HEIGHT); /* * OLD COMMENT: * we used to put this after addition to panel list, * because setting initial value causes a callback * (true for motif!!) * * Why did we stop doing that??? * We put it back for now, to prevent the warning... * * Note that most of the other functions add it to the * panel list after the widget proper has been created... * * for iOS, add_to_panel must follow the widget creation, * because that is where addSubview is called... */ #ifdef BUILD_FOR_OBJC make_text_field(QSP_ARG to); //fprintf(stderr,"adding text field to panel...\n"); add_to_panel(curr_panel,to); #else // ! BUILD_FOR_OBJC // the callback that occurs is a "value changed" callback... // Is that because the widget creation routine // sets an initial value? add_to_panel(curr_panel,to); make_text_field(QSP_ARG to); #endif // ! BUILD_FOR_OBJC #ifdef BUILD_FOR_IOS install_initial_text(to); // set the placeholder value here... #endif /* BUILD_FOR_IOS */ #ifdef BUILD_FOR_MACOS INC_PO_CURR_Y(curr_panel, SOB_HEIGHT(to) + GAP_HEIGHT ); #else // ! BUILD_FOR_MACOS // Why add an extra 10??? BUG? INC_PO_CURR_Y(curr_panel, MESSAGE_HEIGHT + GAP_HEIGHT + 10 ); #endif // ! BUILD_FOR_MACOS } // mk_text_input_line
void get_device_dims(Screen_Obj *sop) { SET_SOB_WIDTH(sop,300); SET_SOB_HEIGHT(sop,50); SET_SOB_FONT_SIZE(sop, 15); }
void make_picker(QSP_ARG_DECL Screen_Obj *sop) { #ifdef HAVE_MOTIF int j; Arg al[20]; int ac = 0; Screen_Obj *b_sop; /* button ptr */ char buf[6]; int n; const char **stringlist; if( SOB_N_CYLINDERS(sop) != 1 ){ sprintf(ERROR_STRING,"picker %s needs %d components, but we're only implementing 1!?", SOB_NAME(sop),SOB_N_CYLINDERS(sop)); WARN(ERROR_STRING); } n= SOB_N_SELECTORS_AT_IDX(sop,/*component*/ 0 ); sop->so_frame = generic_frame(curr_panel->po_panel_obj, sop, XmSHADOW_IN); XtSetArg(al[ac], XmNentryClass, xmToggleButtonWidgetClass); ac++; strcpy(buf,"name"); sop->so_obj = XmCreateRadioBox(sop->so_frame, buf, al, ac); XtManageChild(sop->so_obj); #ifdef CAUTIOUS if( sop->so_children != NO_LIST ){ sprintf(ERROR_STRING,"CAUTIOUS: Picker %s already has a child list!?",SOB_NAME(sop)); ERROR1(ERROR_STRING); } #endif /* CAUTIOUS */ SET_SOB_CHILDREN(sop,new_list()); stringlist = SOB_SELECTORS_AT_IDX(sop,0); // The choices are created as screen_objs, we // need to create a special context for them so that we // can have the same choices in multiple pickers and choosers // The context name should be the concatenation of the current // scrnobj context, and the name of this widget... push_widget_context(QSP_ARG sop); for(j=0; j<n; j++) { b_sop = simple_object(QSP_ARG stringlist[j]); if( b_sop==NO_SCREEN_OBJ ) return; b_sop->so_action_text = savestr(stringlist[j]); b_sop->so_parent = sop; b_sop->so_flags |= SOT_MENU_ITEM; /* The choices need to be part of the panel list (so we can find them * with find_object), but also on the parent list, so we can find them * through it... */ addHead(curr_panel->po_children,mk_node(b_sop)); addTail(sop->so_children,mk_node(b_sop)); b_sop->so_obj = XtCreateManagedWidget( b_sop->so_name, /* widget name */ xmToggleButtonWidgetClass, /* widget class */ sop->so_obj, /* parent widget */ NULL, 0); fix_names(QSP_ARG b_sop,sop); /* client data */ XtAddCallback(b_sop->so_obj, XmNvalueChangedCallback, chooser_func, NULL); XtManageChild(b_sop->so_obj); } pop_scrnobj_context(SINGLE_QSP_ARG); SET_SOB_HEIGHT(sop, CHOOSER_HEIGHT + CHOOSER_ITEM_HEIGHT*n ); #endif /* HAVE_MOTIF */ }
void make_chooser(QSP_ARG_DECL Screen_Obj *sop, int n, const char **stringlist) { #ifdef HAVE_MOTIF int j; Arg al[20]; int ac = 0; Screen_Obj *b_sop; /* button ptr */ char buf[6]; sop->so_frame = generic_frame(curr_panel->po_panel_obj, sop, XmSHADOW_IN); XtSetArg(al[ac], XmNentryClass, xmToggleButtonWidgetClass); ac++; strcpy(buf,"name"); sop->so_obj = XmCreateRadioBox(sop->so_frame, buf, al, ac); XtManageChild(sop->so_obj); #ifdef CAUTIOUS if( sop->so_children != NO_LIST ){ sprintf(ERROR_STRING,"CAUTIOUS: Chooser %s already has a child list!?",SOB_NAME(sop)); ERROR1(ERROR_STRING); } #endif /* CAUTIOUS */ SET_SOB_CHILDREN(sop,new_list()); push_widget_context(QSP_ARG sop); for(j=0; j<n; j++) { b_sop = simple_object(QSP_ARG stringlist[j]); if( b_sop==NO_SCREEN_OBJ ) return; b_sop->so_action_text = savestr(stringlist[j]); b_sop->so_parent = sop; b_sop->so_flags |= SOT_MENU_ITEM; /* The choices need to be part of the panel list (so we can find them * with find_object), but also on the parent list, so we can find them * through it... */ addHead(curr_panel->po_children,mk_node(b_sop)); addTail(sop->so_children,mk_node(b_sop)); b_sop->so_obj = XtCreateManagedWidget( b_sop->so_name, /* widget name */ xmToggleButtonWidgetClass, /* widget class */ sop->so_obj, /* parent widget */ NULL, 0); fix_names(QSP_ARG b_sop,sop); /* client data */ XtAddCallback(b_sop->so_obj, XmNvalueChangedCallback, chooser_func, NULL); XtManageChild(b_sop->so_obj); } pop_scrnobj_context(SINGLE_QSP_ARG); #endif /* HAVE_MOTIF */ SET_SOB_HEIGHT(sop, CHOOSER_HEIGHT + CHOOSER_ITEM_HEIGHT*n ); }