?? textfield.c
字號:
changed = True ; } else if (w->text.CursorPos > 0) { ClearHighlight(w); TextDelete(w, w->text.CursorPos - 1, 1); w->text.CursorPos--; Draw(w); changed = True ; } if( changed && w->text.valueChangedCallback ) textfieldCallbacks(w, w->text.valueChangedCallback, TF_VALUE_CHANGED, event, w->text.Text);}/* ARGSUSED */static voidSelectStart(Widget aw, XEvent * event, String * params, Cardinal * num_params){ TextFieldWidget w = (TextFieldWidget) aw; if (!w->text.AllowSelection) return; w->text.CursorPos = TextPixelToPos(w, event->xbutton.x); w->text.HighlightPivotStart = w->text.HighlightPivotEnd = w->text.CursorPos; if (w->text.HighlightStart >= 0) { ClearHighlight(w); } else { EraseCursor(w); DrawCursor(w); }}/* ARGSUSED */static voidExtendStart(Widget aw, XEvent * event, String * params, Cardinal * num_params){ TextFieldWidget w = (TextFieldWidget) aw; int pos; if (!w->text.AllowSelection) return; pos = TextPixelToPos(w, event->xbutton.x); EraseCursor(w); if (w->text.HighlightStart < 0) { w->text.HighlightStart = w->text.HighlightEnd = w->text.HighlightPivotStart = w->text.HighlightPivotEnd = w->text.CursorPos; } else { w->text.HighlightPivotStart = w->text.HighlightStart; w->text.HighlightPivotEnd = w->text.HighlightEnd; } if (pos < w->text.HighlightStart) { w->text.HighlightStart = pos; } else { w->text.HighlightEnd = pos; } w->text.CursorPos = pos;#ifdef DEBUG_TF printf("ExtendStart: %d - %d\n", w->text.HighlightStart, w->text.HighlightEnd);#endif DrawHighlight(w); DrawCursor(w);}static voidExtendHighlight(TextFieldWidget w){ int x, pos; if (!w->text.AllowSelection) return; x = w->text.timer_x; pos = TextPixelToPos(w, x); if (x < (int) w->text.Margin) { pos = TextPixelToPos(w, (int) 0); if (pos > 0) pos--; else if (pos == w->text.CursorPos) return; } else if (x > (int) (w->text.Margin + w->text.ViewWidth)) { pos = TextPixelToPos(w, (int) (w->text.Margin + w->text.ViewWidth)); if (pos < w->text.TextLen) pos++; else if (pos == w->text.CursorPos) return; } if (pos == w->text.CursorPos) return; EraseCursor(w); if (pos <= w->text.HighlightPivotStart) { w->text.HighlightStart = pos; w->text.HighlightEnd = w->text.HighlightPivotEnd; } else { w->text.HighlightStart = w->text.HighlightPivotStart; w->text.HighlightEnd = pos; } w->text.CursorPos = pos;#ifdef DEBUG_TF printf("Highlighting: x=%d pos=%d %d - %d\n", x, pos, w->text.HighlightStart, w->text.HighlightEnd);#endif if (PositionCursor(w)) DrawTextReposition(w); DrawHighlight(w); DrawCursor(w);}static voidExtendTimer(XtPointer client_data, XtIntervalId * idp){ TextFieldWidget w = (TextFieldWidget) client_data; ExtendHighlight(w); w->text.timer_id = XtAppAddTimeOut( XtWidgetToApplicationContext((Widget) w), (unsigned long) w->text.highlight_time, ExtendTimer, (XtPointer) w);}/* ARGSUSED */static voidExtendAdjust(Widget aw, XEvent * event, String * params, Cardinal * num_params){ TextFieldWidget w = (TextFieldWidget) aw; if (!w->text.AllowSelection) return; w->text.timer_x = event->xbutton.x; if (event->xbutton.x < w->text.Margin || event->xbutton.x > w->text.Margin + w->text.ViewWidth) { if (w->text.timer_id) ExtendHighlight(w); else ExtendTimer((XtPointer) w, (XtIntervalId) 0); } else { if (w->text.timer_id) { XtRemoveTimeOut(w->text.timer_id); w->text.timer_id = (XtIntervalId) 0; } ExtendHighlight(w); }}/* ARGSUSED */static BooleanConvertSelection(Widget aw, Atom * selection, Atom * target, Atom * type, XtPointer * value, unsigned long *length, int *format){ TextFieldWidget w = (TextFieldWidget) aw; XSelectionRequestEvent *req = XtGetSelectionRequest(aw, *selection, NULL); if (*target == XA_TARGETS(XtDisplay(aw))) { Atom *targetP, *std_targets; unsigned long std_length; XmuConvertStandardSelection(aw, req->time, selection, target, type, (XPointer *) & std_targets, &std_length, format); *value = XtMalloc((unsigned) sizeof(Atom) * (std_length + 1)); targetP = *(Atom **) value; *length = std_length + 1; *targetP++ = XA_STRING; memmove((char *) targetP, (char *) std_targets, sizeof(Atom) * std_length); XtFree((char *) std_targets); *type = XA_ATOM; *format = sizeof(Atom) * 8; return True; } else if (*target == XA_STRING) { *length = (long) w->text.SelectionLen; *value = w->text.SelectionText; *type = XA_STRING; *format = 8; return True; } return False;}/* ARGSUSED */static voidLoseSelection(Widget aw, Atom * selection){ TextFieldWidget w = (TextFieldWidget) aw; ClearHighlight(w); if( *selection == XA_PRIMARY && w->text.losePrimaryCallback ) { TextFieldReturnStruct ret; ret.reason = TF_LOSE_PRIMARY ; ret.event = NULL ; ret.string = w->text.Text; XtCallCallbackList(aw, w->text.losePrimaryCallback, &ret); }}/* ARGSUSED */static voidExtendEnd(Widget aw, XEvent * event, String * params, Cardinal * num_params){ TextFieldWidget w = (TextFieldWidget) aw; int len; if (!w->text.AllowSelection) return; if (w->text.timer_id) { XtRemoveTimeOut(w->text.timer_id); w->text.timer_id = (XtIntervalId) 0; } len = w->text.HighlightEnd - w->text.HighlightStart; if (len > 0) { w->text.SelectionLen = len; if (w->text.SelectionText) XtFree(w->text.SelectionText); w->text.SelectionText = XtMalloc(len); strncpy(w->text.SelectionText, &w->text.Text[w->text.HighlightStart], len); XtOwnSelection(aw, XA_PRIMARY, event->xbutton.time, ConvertSelection, LoseSelection, NULL); XChangeProperty(XtDisplay(aw), DefaultRootWindow(XtDisplay(aw)), XA_CUT_BUFFER0, XA_STRING, 8, PropModeReplace, (unsigned char *) w->text.SelectionText, len); if( w->text.gainPrimaryCallback != NULL ) { TextFieldReturnStruct ret; ret.reason = TF_GAIN_PRIMARY ; ret.event = event; ret.string = w->text.Text; XtCallCallbackList(aw, w->text.gainPrimaryCallback, &ret); } }}/* ARGSUSED */static voidRequestSelection(Widget aw, XtPointer client, Atom * selection, Atom * type, XtPointer value, unsigned long *length, int *format){ TextFieldWidget w = (TextFieldWidget) aw; if ((value == NULL) || (*length == 0)) {#ifdef DEBUG_TF printf("RequestSelection: no selection\n");#endif } else { int savex; ClearHighlight(w); savex = w->text.OldCursorX; w->text.CursorPos = (int) client;#ifdef DEBUG_TF printf("RequestSelection: inserting %s length=%d at pos: %d\n", (char *) value, (int) (*length), w->text.CursorPos);#endif TextInsert(w, (char *) value, (int) (*length)); w->text.OldCursorX = savex; Draw(w); }}/* ARGSUSED */static voidInsertSelection(Widget aw, XEvent * event, String * params, Cardinal * num_params){ TextFieldWidget w = (TextFieldWidget) aw; int pos; if (!w->text.AllowSelection) return; pos = TextPixelToPos(w, event->xbutton.x);#ifdef DEBUG_TF printf("InsertSelection: event at pos: %d\n", pos);#endif XtGetSelectionValue(aw, XA_PRIMARY, XA_STRING, RequestSelection, (XtPointer) pos, event->xbutton.time);}/* * TextField private drawing functions */static BooleanPositionCursor(TextFieldWidget w){ int x, start, end; Boolean moved; moved = False; if (w->text.CursorPos < 0) w->text.CursorPos = 0; else if (w->text.CursorPos > w->text.TextLen) w->text.CursorPos = w->text.TextLen; x = FontTextWidth(w->text.font, w->text.Text, w->text.CursorPos); start = -w->text.XOffset; end = start + w->text.ViewWidth; if (x < start) { w->text.XOffset = -x; moved = True; } else if (x > end) { w->text.XOffset = w->text.ViewWidth - x; moved = True; } return moved;}static BooleanMassiveCursorAdjust(TextFieldWidget w){ int start, end, last; Boolean moved; moved = False; end = FontTextWidth(w->text.font, w->text.Text, w->text.CursorPos); if (w->text.HighlightStart >= 0) start = FontTextWidth(w->text.font, w->text.Text, w->text.HighlightStart); else start = end; if (end < w->text.ViewWidth) { if (w->text.XOffset < 0) { w->text.XOffset = 0; moved = True; } } else if (start >= w->text.XOffset && end < w->text.XOffset + w->text.ViewWidth) return moved; else { last = FontTextWidth(w->text.font, w->text.Text, w->text.TextLen); if (start - end > w->text.ViewWidth) { if (last - end > w->text.ViewWidth) w->text.XOffset = w->text.ViewWidth - last; else w->text.XOffset = w->text.ViewWidth - end; } else if (end > w->text.ViewWidth) w->text.XOffset = w->text.ViewWidth - end; else w->text.XOffset = 0; moved = True; } return moved;}/* * Actually draw a range of text onto the widget */static voidDrawText(TextFieldWidget w, int start, int end, Boolean highlight){ int x; GC gc; Widget aw = (Widget) w; if (!w->text.Echo) return; if (w->text.TextLen > 0) { if (start < 0) return; else if (end < start) { int temp; temp = start; start = end; end = temp; } if (end <= w->text.TextLen) { x = w->text.Margin + w->text.XOffset + FontTextWidth(w->text.font, w->text.Text, start); if (highlight) gc = w->text.highlightGC; else gc = w->text.drawGC; if (XtIsRealized(aw)) XDrawImageString(XtDisplay(w), XtWindow(w), gc, x, w->text.YOffset, &w->text.Text[start], end - start); } }}static voidDrawTextRange(TextFieldWidget w, int start, int end){ if (!w->text.Echo) return; if (w->text.TextLen > 0) { if (start < 0) return; else if (end < start) { int temp; temp = start; start = end; end = temp; }/* If there is no highlighting, or the refresh area doesn't cross the *//* the highlight borders, just redraw it. */ if (w->text.HighlightStart < 0 || start >= w->text.HighlightEnd || end <= w->text.HighlightStart) { DrawText(w, start, end, False); }/* OK, the refresh area crosses one or both highlight borders. */ else { int clip; while (start < end) { if (start < w->text.HighlightStart) { if (end <= w->text.HighlightStart) clip = end; else clip = w->text.HighlightStart; DrawText(w, start, clip, False); start = clip; } else if (start < w->text.HighlightEnd) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -