static int motTextSetSelectionPosAttrib(Ihandle* ih, const char* value) { int start=0, end=0; if (!value || iupStrEqualNoCase(value, "NONE")) { XmTextClearSelection(ih->handle, CurrentTime); return 0; } if (iupStrEqualNoCase(value, "ALL")) { XmTextSetSelection(ih->handle, (XmTextPosition)0, (XmTextPosition)XmTextGetLastPosition(ih->handle), CurrentTime); return 0; } if (iupStrToIntInt(value, &start, &end, ':')!=2) return 0; if(start<0 || end<0) return 0; /* end is inside the selection, in IUP is outside */ end--; XmTextSetSelection(ih->handle, (XmTextPosition)start, (XmTextPosition)end, CurrentTime); return 0; }
static int motTextSetSelectionAttrib(Ihandle* ih, const char* value) { int start=1, end=1; if (!value || iupStrEqualNoCase(value, "NONE")) { XmTextClearSelection(ih->handle, CurrentTime); return 0; } if (iupStrEqualNoCase(value, "ALL")) { XmTextSetSelection(ih->handle, (XmTextPosition)0, (XmTextPosition)XmTextGetLastPosition(ih->handle), CurrentTime); return 0; } if (ih->data->is_multiline) { int lin_start=1, col_start=1, lin_end=1, col_end=1; char *str; if (sscanf(value, "%d,%d:%d,%d", &lin_start, &col_start, &lin_end, &col_end)!=4) return 0; if (lin_start<1 || col_start<1 || lin_end<1 || col_end<1) return 0; str = XmTextGetString(ih->handle); start = motTextSetLinColToPosition(str, lin_start, col_start); end = motTextSetLinColToPosition(str, lin_end, col_end); XtFree(str); } else { if (iupStrToIntInt(value, &start, &end, ':')!=2) return 0; if(start<1 || end<1) return 0; start--; /* IUP starts at 1 */ end--; } /* end is inside the selection, in IUP is outside */ end--; XmTextSetSelection(ih->handle, (XmTextPosition)start, (XmTextPosition)end, CurrentTime); return 0; }
void WGeMotif::change_value_cb( void *ge_ctx, void *value_object, char *text) { Arg args[1]; WGeMotif *ge = (WGeMotif *)ge_ctx; if ( ge->value_input_open) { XtUnmanageChild( ge->value_dialog); ge->value_input_open = 0; return; } XtManageChild( ge->value_dialog); message( ge, ' ', ""); XtCallAcceptFocus( ge->value_input, CurrentTime); // XtSetKeyboardFocus( ge->toplevel, ge->value_input); XtSetArg(args[0],XmNvalue, text); XtSetValues( ge->value_input, args, 1); XmTextSetCursorPosition( ge->value_input, strlen(text)); XmTextSetSelection( ge->value_input, 0, strlen(text), CurrentTime); ge->value_input_open = 1; ge->current_value_object = value_object; }
void AttrMotif::change_value() { int sts; Widget text_w; int multiline; char* value; int size; if (input_open) { XtUnmanageChild(cmd_input); set_prompt(""); input_open = 0; return; } sts = ((AttrNav*)attrnav)->check_attr_value(&multiline, &size, &value); if (EVEN(sts)) { if (sts == GE__NOATTRSEL) message('E', "No attribute is selected"); else message('E', "Attribute can't be modified"); return; } if (multiline) { text_w = cmd_scrolledinput; XtManageChild(text_w); XtManageChild(cmd_scrolled_ok); XtManageChild(cmd_scrolled_ca); } else { text_w = cmd_input; XtManageChild(text_w); } message(' ', ""); flow_SetInputFocus(text_w); // XtSetKeyboardFocus( toplevel, text_w); // XtCallAcceptFocus( text_w, CurrentTime); if (value) { XmTextSetString(text_w, value); if (!multiline) { XmTextSetInsertionPosition(text_w, strlen(value)); XmTextSetSelection(text_w, 0, strlen(value), CurrentTime); } } else { XmTextSetString(cmd_input, (char*)""); } // i = 0; // XtSetArg(args[i],XmNeditMode, XmMULTI_LINE_EDIT); i++; // XtSetValues( text_w, args, i); set_prompt("value >"); input_open = 1; }
void clear_listener(void) { if ((listener_text) && /* this can be called even when there is no listener */ (XmTextGetCursorPosition(listener_text) > 1)) { dont_check_motion = true; XmTextSetSelection(listener_text, 1, XmTextGetCursorPosition(listener_text), CurrentTime); XmTextRemove(listener_text); dont_check_motion = false; } }
void RXmTextSetSelection(message_t message) { Widget w; XmTextPosition first,last; Time t; toolkit_read_value(message,&w,XtRWidget); toolkit_read_value(message,&first,XtRInt); toolkit_read_value(message,&last,XtRInt); t = XtLastTimestampProcessed(display); XmTextSetSelection(w,first,last,t); }
void listener_delete_text(int new_end) { int old_end; old_end = XmTextGetLastPosition(listener_text); if (old_end > new_end) { dont_check_motion = true; XmTextSetSelection(listener_text, new_end, old_end, CurrentTime); XmTextRemove(listener_text); dont_check_motion = false; } }
int main(int argc, char *argv[]) { int i, n; Arg args[10]; XtAppContext app; Widget toplevel, rowcol, textf, text; XmString str_months[12]; setlocale(LC_ALL, ""); //建立顶级窗口 toplevel = XtVaAppInitialize(&app, "Edit", NULL, 0, &argc, argv, NULL, NULL); //建立rowcolumn 布局 n = 0; XtSetArg(args[n], XmNpacking, XmPACK_TIGHT); n++; rowcol = XmCreateRowColumn(toplevel, "rowcol", args, n); XtManageChild(rowcol); //建立输入条 n = 0; XtSetArg(args[n], XmNvalue, "输入条"); n++; textf = XmCreateTextField(rowcol, "textf", args, n); XtManageChild(textf); //建立文本区 n = 0; XtSetArg(args[n], XmNrows, 10); n++; XtSetArg(args[n], XmNcolumns, 40); n++; XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; XtSetArg(args[n], XmNwordWrap, True); n++; XtSetArg(args[n], XmNvalue, "输入区域\n请测试"); n++; text = XmCreateScrolledText(rowcol, "text", args, n); XtManageChild(text); //显示窗口 XtRealizeWidget(toplevel); //edit XmTextSetInsertionPosition(text, 3); XmTextInsert(text, 5, "测试插入"); XmTextSetSelection(text, 5, 8, CurrentTime); XmTextCopy(text, CurrentTime); XmTextSetInsertionPosition(text, 1); XmTextPaste(text); //进入事件循环 XtAppMainLoop(app); }
static void B1_release(Widget w, XEvent *event, char **str, Cardinal *num) { XmTextPosition pos; XButtonEvent *ev = (XButtonEvent *)event; pos = XmTextXYToPos(w, (Position)(ev->x), (Position)(ev->y)); XmTextSetCursorPosition(w, pos); if (down_pos != pos) { XmTextSetHighlight(w, down_pos, pos, XmHIGHLIGHT_SELECTED); if (listener_selection) {XtFree(listener_selection); listener_selection = NULL;} XmTextSetSelection(w, down_pos, pos, CurrentTime); listener_selection = XmTextGetSelection(w); } }
static void Kill_line(Widget w, XEvent *ev, char **str, Cardinal *num) { /* C-k with storage of killed text */ XmTextPosition curpos, loc; Boolean found; curpos = XmTextGetCursorPosition(w); found = XmTextFindString(w, curpos, "\n", XmTEXT_FORWARD, &loc); if (!found) loc = XmTextGetLastPosition(w); if (loc > curpos) { if (listener_selection) {XtFree(listener_selection); listener_selection = NULL;} XmTextSetSelection(w, curpos, loc, CurrentTime); listener_selection = XmTextGetSelection(w); /* xm manual p329 sez storage is allocated here */ XmTextCut(w, CurrentTime); } }
static void motTextKeyPressEvent(Widget w, Ihandle *ih, XKeyEvent *evt, Boolean *cont) { Widget spinbox; *cont = True; iupmotKeyPressEvent(w, ih, (XEvent*)evt, cont); if (*cont == False) return; if (evt->state & ControlMask && !(state & Mod1Mask || state & Mod5Mask)) /* Ctrl but NOT Alt */ { KeySym motcode = iupmotKeycodeToKeysym(evt); if (motcode == XK_c || motcode == XK_x || motcode == XK_v || motcode == XK_a) { ih->data->disable_callbacks = -1; /* let callbacks be processed in motTextSetClipboardAttrib */ if (motcode == XK_c) motTextSetClipboardAttrib(ih, "COPY"); else if (motcode == XK_x) motTextSetClipboardAttrib(ih, "CUT"); else if (motcode == XK_v) motTextSetClipboardAttrib(ih, "PASTE"); else if (motcode == XK_a) XmTextSetSelection(ih->handle, 0, XmTextGetLastPosition(ih->handle), CurrentTime); ih->data->disable_callbacks = 0; *cont = False; return; } } spinbox = (Widget)iupAttribGet(ih, "_IUP_EXTRAPARENT"); if (spinbox && XmIsSpinBox(spinbox)) { KeySym motcode = iupmotKeycodeToKeysym(evt); if (motcode == XK_Left || motcode == XK_Right) { /* avoid spin increment using Left/Right arrows, but must manually handle the new cursor position */ XmTextPosition caret_pos = XmTextGetInsertionPosition(ih->handle); XmTextSetInsertionPosition(ih->handle, (motcode == XK_Left)? caret_pos-1: caret_pos+1); *cont = False; } } }
void CEdit:: SetSel(int nStartChar, int nEndChar, BOOL bNoScroll) { // Set the current selection. if (_xd_textwidget != NULL) { XtVaSetValues(_xd_textwidget, XmNautoShowCursorPosition, !bNoScroll, NULL); XmTextPosition len = XmTextGetLastPosition(_xd_textwidget); if (nEndChar > len) nEndChar = (int)len ; if (XmIsText(_xd_textwidget)) XmTextSetSelection(_xd_textwidget, nStartChar, nEndChar, XtLastTimestampProcessed(XtDisplay(_xd_textwidget))); else if (XmIsTextField(_xd_textwidget)) XmTextFieldSetSelection(_xd_textwidget, nStartChar, nEndChar, XtLastTimestampProcessed(XtDisplay(_xd_textwidget))); } }
void ui_field_select_string( Widget field, BOOL assign_focus ) { STRING valuestr = NULL; valuestr = ui_field_get_string(field); if (XtIsSubclass(field, xmTextFieldWidgetClass)) XmTextFieldSetSelection(field, 0, strlen(valuestr), CurrentTime); else if (XtIsSubclass(field, xmTextWidgetClass)) XmTextSetSelection(field, 0, strlen(valuestr), CurrentTime); if (assign_focus) XmProcessTraversal(field, XmTRAVERSE_CURRENT); util_free(valuestr); }
static void motTextKeyPressEvent(Widget w, Ihandle *ih, XKeyEvent *evt, Boolean *cont) { Widget spinbox; *cont = True; iupmotKeyPressEvent(w, ih, (XEvent*)evt, cont); if (*cont == False) return; if (evt->state & ControlMask) /* Ctrl */ { KeySym motcode = XKeycodeToKeysym(iupmot_display, evt->keycode, 0); if (motcode == XK_c) motTextSetClipboardAttrib(ih, "COPY"); else if (motcode == XK_x) motTextSetClipboardAttrib(ih, "CUT"); else if (motcode == XK_v) motTextSetClipboardAttrib(ih, "PASTE"); else if (motcode == XK_a) XmTextSetSelection(ih->handle, 0, XmTextGetLastPosition(ih->handle), CurrentTime); } spinbox = (Widget)iupAttribGet(ih, "_IUP_EXTRAPARENT"); if (spinbox && XmIsSpinBox(spinbox)) { KeySym motcode = XKeycodeToKeysym(iupmot_display, evt->keycode, 0); if (motcode == XK_Left || motcode == XK_Right) { /* avoid spin increment using Left/Right arrows, but must manually handle the new cursor position */ XmTextPosition caret_pos = XmTextGetInsertionPosition(ih->handle); XmTextSetInsertionPosition(ih->handle, (motcode == XK_Left)? caret_pos-1: caret_pos+1); *cont = False; } } }
void wxTextEntry::SetSelection(long from, long to) { XmTextSetSelection(GetText(), from, GetMotifPos(to), CurrentTime); }