void XmCommandError(Widget w, XmString error) { if (Com_Error(w)) { DEBUGOUT(_LtDebug(__FILE__, w, "Error Condition detected")); XmListDeletePos(SB_List(w), 0); } XmListAddItemUnselected(SB_List(w), error, 0); Com_Error(w) = True; }
static void initialize(Widget request, Widget new_w, ArgList args, Cardinal *num_args) { DEBUGOUT(_LtDebug(__FILE__, new_w, "Initialize\n")); if (Com_PromptString(new_w) == (XmString)XmUNSPECIFIED) { XmString xms; xms = XmStringCreateLocalized(">"); XtVaSetValues( SB_SelectionLabel(new_w), XmNlabelString, xms, NULL); XmStringFree(xms); Com_PromptString(new_w) = NULL; } #if 0 /* rws 2 Oct 1998 These are just re-named SelectionBox resources so SelectionBox will take care of them. */ if (Com_PromptString(new_w) == (XmString)XmUNSPECIFIED) { Com_PromptString(new_w) = XmStringCreateLocalized(">"); } else if (Com_PromptString(new_w) != NULL) { Com_PromptString(new_w) = XmStringCopy(Com_PromptString(new_w)); } if (Com_Command(new_w) == (XmString)XmUNSPECIFIED) { Com_Command(new_w) = XmStringCreateLocalized(">"); } else if (Com_Command(new_w) != NULL) { Com_Command(new_w) = XmStringCopy(Com_Command(new_w)); } #endif XtAddCallback(SB_Text(new_w), XmNactivateCallback, _XmCommandCallback, C_ACT); XtAddCallback(SB_List(new_w), XmNsingleSelectionCallback, _XmCommandCallback, C_LIST_SELECT); XtAddCallback(SB_List(new_w), XmNdefaultActionCallback, _XmCommandCallback, C_LIST_DOUBLE); Com_Error(new_w) = False; }
static void _XmCommandGetVisibleItemCount(Widget w, int offset, XtArgVal *value) { int count = 0; DEBUGOUT(_LtDebug(__FILE__, w, "_XmCommandGetVisibleItemCount\n")); XtVaGetValues(SB_List(w), XmNvisibleItemCount, &count, NULL); *value = (XtArgVal)count; }
static void _XmCommandGetHistoryItems(Widget w, int offset, XtArgVal *value) { XmStringTable table = NULL; DEBUGOUT(_LtDebug(__FILE__, w, "_XmCommandGetHistoryItems\n")); XtVaGetValues(SB_List(w), XmNitems, &table, NULL); *value = (XtArgVal)table; }
Widget XmCommandGetChild(Widget w, unsigned char child) { switch (child) { case XmDIALOG_COMMAND_TEXT: return SB_Text(w); case XmDIALOG_HISTORY_LIST: return SB_List(w); case XmDIALOG_PROMPT_LABEL: return SB_SelectionLabel(w); } return NULL; }
/*ARGSUSED*/ static Boolean SetValues( Widget ow, Widget rw, /* unused */ Widget nw, ArgList args, /* unused */ Cardinal *num_args ) /* unused */ { XmCommandWidget old = (XmCommandWidget) ow ; XmCommandWidget new_w = (XmCommandWidget) nw ; int max; Arg argv[5] ; Cardinal argc ; /****************/ /* mustMatch does not apply to command... (it is always false) */ if (new_w->selection_box.must_match != False) { new_w->selection_box.must_match = False; XmeWarning( (Widget) new_w, WARNING5); } if (new_w->selection_box.dialog_type != XmDIALOG_COMMAND) { new_w->selection_box.dialog_type = XmDIALOG_COMMAND; XmeWarning( (Widget) new_w, WARNING1); } /* check for and change max history items (remove items if needed) */ if (new_w->command.history_max_items < 1) { new_w->command.history_max_items = old->command.history_max_items; XmeWarning( (Widget) new_w, WARNING6); } if (new_w->command.history_max_items < old->command.history_max_items) { argc = 0 ; XtSetArg( argv[argc], XmNitemCount, &max) ; ++argc ; XtGetValues( SB_List( new_w), argv, argc) ; while (max > new_w->command.history_max_items) { XmListDeletePos (new_w->selection_box.list, 1); if (new_w->selection_box.list_selected_item_position > 0) new_w->selection_box.list_selected_item_position--; max--; } } if (old->command.error) { XmString new_xms, old_xms; int new_count = new_w->selection_box.list_item_count; int old_count = old->selection_box.list_item_count; if (new_count > 2 && old_count > 2) { XmString new_blank, old_blank, new_error, old_error; new_error = new_w->selection_box.list_items[new_count-1]; old_error = old->selection_box.list_items[new_count-1]; new_blank = new_w->selection_box.list_items[new_count-2]; old_blank = old->selection_box.list_items[new_count-2]; if (XmStringCompare(new_error, old_error) && XmStringCompare(new_blank, old_blank)) { new_w->command.error = FALSE; #if 0 XmListDeletePos(SB_List(old), 0); /* Delete error message.*/ XmListDeletePos(SB_List(old), 0) ; /* Delete blank line.*/ old->command.error = FALSE ; #endif } } else new_w->command.error = FALSE; } /* require redisplay */ return(True); }
/*ARGSUSED*/ void _XmCommandReturn( Widget wid, XEvent *event, String *params, /* unused */ Cardinal *numParams ) /* unused */ { XmCommandWidget w = (XmCommandWidget) wid ; XmCommandCallbackStruct cb; XmString tmpXmString; String tmpString; Arg argv[5] ; Cardinal argc ; int count ; /****************/ /* if an error has been sent to the history list, remove it now */ if (w->command.error) { XmListDeletePos (w->selection_box.list, 0); /* delete error msg */ XmListDeletePos (w->selection_box.list, 0); /* delete blank line */ w->command.error = FALSE; XmListSetBottomPos (w->selection_box.list, 0); } /* update the history: - get text, check null/empty */ /* - create XmString from text */ /* - increment local list count */ /* - add to history list */ /* - delete first element if too */ /* many items (maxItemCount) */ /* - position list to end */ /* - reset selection list ptr */ /* - reset command to "" */ tmpString = XmTextFieldGetString (w->selection_box.text); if ((tmpString == NULL) || (strcmp(tmpString, "") == 0)) { if (tmpString) XtFree(tmpString); return; } argc = 0 ; XtSetArg( argv[argc], XmNitemCount, &count) ; ++argc ; XtGetValues( SB_List( w), argv, argc) ; /* if already at max items, remove first item in list */ if (count >= w->command.history_max_items) { XmListDeletePos (w->selection_box.list, 1); if (w->selection_box.list_selected_item_position > 0) w->selection_box.list_selected_item_position--; } tmpXmString = XmStringGenerate(tmpString, XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, NULL); XmListAddItemUnselected (w->selection_box.list, tmpXmString, 0); XmListSetBottomPos (w->selection_box.list, 0); XmTextFieldSetString (w->selection_box.text, ""); /* call the users command entered callback */ cb.reason = XmCR_COMMAND_ENTERED; cb.event = event; cb.value = tmpXmString; cb.length = XmStringLength (tmpXmString); XtCallCallbackList ((Widget) w, w->command.callback, &cb); XmStringFree (tmpXmString); XtFree (tmpString); return ; }
/*ARGSUSED*/ static void ListCallback( Widget w, /* unused */ XtPointer client_data, XtPointer call_data ) { XmListCallbackStruct * listCB = (XmListCallbackStruct *) call_data ; XmCommandCallbackStruct cmdCB ; XmCommandWidget cmdWid = (XmCommandWidget) client_data ; char * text_value ; Arg argv[5] ; Cardinal argc ; int count ; XmString tmpXmString ; /*********** reset is not used ************ Boolean reset = FALSE ; ****************/ argc = 0 ; XtSetArg( argv[argc], XmNitemCount, &count) ; ++argc ; XtGetValues( SB_List( cmdWid), argv, argc) ; if( !count ) { return ; } if( cmdWid->command.error ) { if( (listCB->item_position == (count - 1)) || ( (listCB->item_position == count) && (listCB->reason != XmCR_DEFAULT_ACTION)) ) { /* Selection or default action on the blank line, or selection on * error message. Restore previous selection and return. */ XmListDeselectPos( SB_List( cmdWid), listCB->item_position) ; if( cmdWid->selection_box.list_selected_item_position ) { XmListSelectPos( SB_List( cmdWid), cmdWid->selection_box.list_selected_item_position, FALSE) ; } return ; } XmListDeletePos( SB_List( cmdWid), 0) ; /* Delete error message.*/ XmListDeletePos( SB_List( cmdWid), 0) ; /* Delete blank line.*/ cmdWid->command.error = FALSE ; if( count <= 2 ) { /* List only contained error message and blank line. */ cmdWid->selection_box.list_selected_item_position = 0 ; return ; } count -= 2 ; if( (listCB->item_position > count) && (listCB->reason == XmCR_DEFAULT_ACTION) ) { /* Default action on the error message line. Restore previous * selection, clear text area, and return. */ if( cmdWid->selection_box.list_selected_item_position ) { XmListSelectPos( SB_List( cmdWid), cmdWid->selection_box.list_selected_item_position, FALSE) ; } XmTextFieldSetString( cmdWid->selection_box.text, "") ; return ; } } if( listCB->reason == XmCR_DEFAULT_ACTION ) { /* If we are already at max items, remove first item. */ if( count >= cmdWid->command.history_max_items ) { XmListDeletePos( cmdWid->selection_box.list, 1) ; if( cmdWid->selection_box.list_selected_item_position > 0 ) { cmdWid->selection_box.list_selected_item_position-- ; } } tmpXmString = XmStringCopy( listCB->item) ; XmListAddItemUnselected( cmdWid->selection_box.list, tmpXmString, 0) ; XmListSetBottomPos( cmdWid->selection_box.list, 0) ; XmTextFieldSetString( cmdWid->selection_box.text, "") ; /* Call the users command entered callback. */ cmdCB.reason = XmCR_COMMAND_ENTERED ; cmdCB.event = NULL ; cmdCB.value = tmpXmString ; cmdCB.length = XmStringLength( tmpXmString) ; XtCallCallbackList( (Widget) cmdWid, cmdWid->command.callback, &cmdCB) ; XmStringFree( tmpXmString) ; } else /* listCB->reason is BROWSE_SELECT or SINGLE_SELECT */ { /* Update the text widget to relect the latest list selection. */ cmdWid->selection_box.list_selected_item_position = listCB->item_position ; if((text_value = _XmStringGetTextConcat( listCB->item)) != NULL) { XmTextFieldSetString( SB_Text( cmdWid), text_value) ; XmTextFieldSetInsertionPosition( SB_Text( cmdWid), XmTextFieldGetLastPosition( SB_Text( cmdWid))) ; XtFree( text_value) ; } } return ; }
/*ARGSUSED*/ static void Initialize( Widget rw, /* unused */ Widget nw, ArgList args, /* unused */ Cardinal *num_args ) /* unused */ { XmCommandWidget new_w = (XmCommandWidget) nw ; int max; Arg argv[5] ; Cardinal argc ; /****************/ /* Here we have now to take care of XmUNSPECIFIED (CR 4856). */ if (new_w->selection_box.selection_label_string == (XmString) XmUNSPECIFIED) { XmString local_xmstring ; local_xmstring = XmStringCreate(">", XmFONTLIST_DEFAULT_TAG); argc = 0 ; XtSetArg( argv[argc], XmNlabelString, local_xmstring) ; ++argc ; XtSetValues( SB_SelectionLabel( new_w), argv, argc) ; XmStringFree(local_xmstring); new_w->selection_box.selection_label_string = NULL ; } /* mustMatch does not apply to command... (it is always false) */ if (new_w->selection_box.must_match != False) { new_w->selection_box.must_match = False; XmeWarning( (Widget) new_w, WARNING5); } /* check for and change max history items (remove items if needed) */ if (new_w->command.history_max_items < 1) { new_w->command.history_max_items = 100; XmeWarning( (Widget) new_w, WARNING6); } argc = 0 ; XtSetArg( argv[argc], XmNitemCount, &max) ; ++argc ; XtGetValues( SB_List( new_w), argv, argc) ; if (new_w->command.history_max_items < max) { while (max > new_w->command.history_max_items) { XmListDeletePos (new_w->selection_box.list, 1); if (new_w->selection_box.list_selected_item_position > 0) new_w->selection_box.list_selected_item_position--; max--; } } if (new_w->selection_box.dialog_type != XmDIALOG_COMMAND) { new_w->selection_box.dialog_type = XmDIALOG_COMMAND ; XmeWarning( (Widget) new_w, WARNING1); } XtAddCallback (new_w->selection_box.text, XmNvalueChangedCallback, CommandCallback, (XtPointer) new_w); new_w->command.error = FALSE; return ; }
static void _XmCommandCallback(Widget w, XtPointer client, XtPointer call) { XmCommandCallbackStruct cbs; XmAnyCallbackStruct *p = (XmAnyCallbackStruct *)call; XmListCallbackStruct *l = (XmListCallbackStruct *) call; XmCommandWidget cw = (XmCommandWidget)XtParent(w); char *t; if (client != C_ACT) cw = (XmCommandWidget)XtParent(XtParent(w)); DEBUGOUT(_LtDebug(__FILE__, (Widget)cw, "_XmCommandCallback [%s]\n", (client == C_ACT) ? "TextField Activate" : "List Selection")); /* * In the cases of TextField Activate and List DefaultAction, we need to * call a callback ourselves. * In the List SingleSelect case, just make the list item show up in * TextField. */ if (client == C_ACT) { cbs.reason = XmCR_COMMAND_ENTERED; cbs.event = p->event; t = XmTextFieldGetString(w); cbs.value = XmStringCreateSimple(t); cbs.length = (t == NULL) ? 0 : strlen(t); XtFree(t); XtCallCallbackList((Widget)cw, cw->command.callback, &cbs); } if (client == C_LIST_SELECT) { if (!XmStringGetLtoR(l->item, XmFONTLIST_DEFAULT_TAG, &t)) { return; } XmTextFieldSetString(SB_Text(cw), t); cbs.value = XmStringCreateSimple(t); XtFree(t); return; } if (client == C_LIST_DOUBLE) { cbs.reason = XmCR_COMMAND_ENTERED; cbs.event = l->event; cbs.value = l->item; cbs.length = XmStringLength(l->item); XtCallCallbackList((Widget)cw, cw->command.callback, &cbs); } /* If we have an error condition, remove it */ if (Com_Error(cw)) { Com_Error(cw) = False; XmListDeletePos(SB_List(cw), 0); } /* We need to blindly insert now. */ XmListAddItemUnselected(SB_List(cw), cbs.value, 0); /* 0 is at the end */ /* * If #items in list is larger than HistoryMaxItems, remove the first * This code will actually delete more than just the first item, in case * some sick programmer decides to manually cram more items in the list * than XmNhistoryMaxItems allows */ if (List_ItemCount(SB_List(cw)) > Com_HistoryMaxItems(cw)) { DEBUGOUT(_LtDebug(__FILE__, (Widget)cw, "_XmCommandCallback: List too long; removing %d items" " from list\n", List_ItemCount(SB_List(cw)) - Com_HistoryMaxItems(cw))); XmListDeleteItemsPos(SB_List(cw), List_ItemCount(SB_List(cw)) - Com_HistoryMaxItems(cw), 1); } if (client != C_LIST_DOUBLE) /* FIX ME - I think this is right ! */ { XmStringFree(cbs.value); } /* Clear the text field */ XmTextFieldSetString(SB_Text(cw), ""); }