⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 textfield.c

📁 NIST Net – A Linux-based Network Emulation Tool, It is a raw IP packet filter with many controllable
💻 C
📖 第 1 页 / 共 4 页
字号:
	  if (end <= w->text.HighlightEnd)	    clip = end;	  else	    clip = w->text.HighlightEnd;	  DrawText(w, start, clip, True);	  start = clip;	}	else {	  DrawText(w, start, end, False);	  start = end;	}      }    }  }}static voidDrawTextReposition(TextFieldWidget w){  int xsrc, xdest, width, start, end;  Widget aw = (Widget) w;  if (!w->text.Echo)    return;  if (w->text.XOffset < w->text.OldXOffset) {    xsrc = w->text.OldXOffset - w->text.XOffset;    xdest = 0;    width = w->text.ViewWidth - xsrc + 1;    /* Need to redraw some characters at the end. */    end = TextPixelToPos(w, w->text.Margin + w->text.ViewWidth);    start = TextPixelToPos(w, w->text.Margin + w->text.ViewWidth - xsrc);  }  else if (w->text.XOffset > w->text.OldXOffset) {    xsrc = 0;    xdest = w->text.XOffset - w->text.OldXOffset;    width = w->text.ViewWidth - xdest + 1;    /* Need to redraw some characters at the beginning. */    start = TextPixelToPos(w, w->text.Margin);    end = TextPixelToPos(w, w->text.Margin + xdest);  }  else    return;  if (width > 0) {#ifdef DEBUG_TF    printf("Reposition: xoff=%d old=%d src=%d dest=%d width=%d refresh %d-%d\n",      w->text.XOffset, w->text.OldXOffset, xsrc, xdest, width, start, end);#endif    if (XtIsRealized(aw))      XCopyArea(XtDisplay(w), XtWindow(w), XtWindow(w),        w->text.drawGC,        w->text.Margin + xsrc, 0,        (unsigned int) width, (unsigned int) w->core.height,        w->text.Margin + xdest, 0);    DrawTextRange(w, start, end);  }  w->text.OldXOffset = w->text.XOffset;}static voidDrawTextWithCopyArea(TextFieldWidget w){  int x, insert_width;  int xsrc, xdest, width;  Widget aw = (Widget) w;  if (!w->text.Echo)    return;  x = w->text.XOffset;  insert_width = FontTextWidth(w->text.font, &w->text.Text[w->text.FastInsertCursorStart], w->text.FastInsertTextLen);  if (PositionCursor(w)) {    /*     *  if the text is scrolled, then:     * 1.  the cursor is at the end     * 2.  the copy will move to the left.     */    xsrc = 0;    width = w->text.OldCursorX + x;    xdest = w->text.ViewWidth - (x + w->text.OldCursorX) - insert_width;    if (XtIsRealized(aw))      XCopyArea(XtDisplay(w), XtWindow(w), XtWindow(w),        w->text.drawGC,        w->text.Margin + xsrc, 0,        (unsigned int) width, (unsigned int) w->core.height,        w->text.Margin + xdest, 0);#ifdef DEBUG_TF    printf("DrawInsert: x=%d xsrc=%d xdest=%d width=%d\n", x, xsrc, xdest, width);#endif  }  else {    /*     * the text hasn't been scrolled, so:     * 1.  the text left of the cursor won't change     * 2.  the stuff after the cursor will be moved right.     */    xsrc = FontTextWidth(w->text.font, w->text.Text, w->text.FastInsertCursorStart) + x;    width = w->text.ViewWidth - xsrc;    xdest = xsrc + insert_width;    if (XtIsRealized(aw))      XCopyArea(XtDisplay(w), XtWindow(w), XtWindow(w),        w->text.drawGC,        w->text.Margin + xsrc, 0,        (unsigned int) width, (unsigned int) w->core.height,        w->text.Margin + xdest, 0);#ifdef DEBUG_TF    printf("DrawInsert: x=%d xsrc=%d xdest=%d width=%d\n", x, xsrc, xdest, width);#endif  }  DrawTextRange(w, w->text.FastInsertCursorStart,    w->text.FastInsertCursorStart + w->text.FastInsertTextLen);  if (w->text.TextMaxLen > 0) {    /*     * This is pretty much a hack:     * clear everything to end of window if this is a     * fixed length TextField     */    xsrc = w->text.XOffset + w->text.TextWidth;    width = w->text.ViewWidth - xsrc;    /*    printf("DrawInsert: TextWidth=%d Old=%d\n", w->text.TextWidth, w->text.OldTextWidth); */    if (XtIsRealized(aw))      XClearArea(XtDisplay(w), XtWindow(w),        w->text.Margin + xsrc, 0,        (unsigned int) width, w->core.height, False);  }  else if (w->text.TextWidth < w->text.OldTextWidth) {    if (XtIsRealized(aw))      XClearArea(XtDisplay(w), XtWindow(w),        w->text.Margin + w->text.XOffset + w->text.TextWidth, 0,        w->text.OldTextWidth - w->text.TextWidth + 1,        w->core.height, False);  }  w->text.OldTextWidth = w->text.TextWidth;  w->text.OldXOffset = w->text.XOffset;}static voidDrawAllText(TextFieldWidget w){  Widget aw = (Widget) w;  if (!w->text.Echo)    return;  DrawTextRange(w, 0, w->text.TextLen);  if (w->text.TextWidth < w->text.OldTextWidth) {    if (XtIsRealized(aw))      XClearArea(XtDisplay(w), XtWindow(w),        w->text.Margin + w->text.XOffset + w->text.TextWidth, 0,        w->text.OldTextWidth - w->text.TextWidth + 1,        w->core.height, False);  }  w->text.OldTextWidth = w->text.TextWidth;  w->text.OldXOffset = w->text.XOffset;  w->text.OldHighlightStart = w->text.HighlightStart;  w->text.OldHighlightEnd = w->text.HighlightEnd;}/* Draw an I-beam cursor */static voidDrawIBeamCursor(TextFieldWidget w, int x, GC gc){  Widget aw = (Widget) w;  if (!XtIsRealized(aw))	return;  XDrawLine(XtDisplay(w), XtWindow(w), gc,    x, w->text.YOffset - FontAscent(w->text.font) - 1,    x, w->text.YOffset + FontDescent(w->text.font) + 1);  XDrawLine(XtDisplay(w), XtWindow(w), gc,    x - 2, w->text.YOffset - FontAscent(w->text.font) - 1,    x + 2, w->text.YOffset - FontAscent(w->text.font) - 1);  XDrawLine(XtDisplay(w), XtWindow(w), gc,    x - 2, w->text.YOffset + FontDescent(w->text.font) + 1,    x + 2, w->text.YOffset + FontDescent(w->text.font) + 1);}static voidDrawCursor(TextFieldWidget w){  int x;  GC gc;  if (w->text.DisplayCursor) {    x = FontTextWidth(w->text.font, w->text.Text, w->text.CursorPos);    w->text.OldCursorPos = w->text.CursorPos;    w->text.OldCursorX = x;    x += w->text.Margin + w->text.XOffset;    gc = w->text.cursorGC;    DrawIBeamCursor(w, x, gc);  }}static voidEraseCursor(TextFieldWidget w){  int x;  if (w->text.DisplayCursor && w->text.OldCursorX >= 0) {    x = w->text.OldCursorX + w->text.Margin + w->text.XOffset;    DrawIBeamCursor(w, x, w->text.eraseGC);    /* Little hack to fix up the character that might have been affected by     * erasing the old cursor.     */    if (w->text.OldCursorPos < w->text.TextLen)      DrawTextRange(w, w->text.OldCursorPos, w->text.OldCursorPos + 1);  }}static voidClearHighlight(TextFieldWidget w){  if (!w->text.Echo)    return;  if (w->text.HighlightStart >= 0) {    EraseCursor(w);    DrawText(w, w->text.HighlightStart, w->text.HighlightEnd, False);    DrawCursor(w);    w->text.HighlightStart = w->text.HighlightEnd = -1;  }  w->text.OldHighlightStart = w->text.OldHighlightEnd = -1;}static voidDrawHighlight(TextFieldWidget w){  if (!w->text.Echo)    return;  if (w->text.OldHighlightStart < 0) {    DrawText(w, w->text.HighlightStart, w->text.HighlightEnd,      True);  }  else {    DrawText(w, w->text.HighlightStart, w->text.OldHighlightStart,      (w->text.HighlightStart < w->text.OldHighlightStart));    DrawText(w, w->text.HighlightEnd, w->text.OldHighlightEnd,      (w->text.HighlightEnd > w->text.OldHighlightEnd));  }  w->text.OldHighlightStart = w->text.HighlightStart;  w->text.OldHighlightEnd = w->text.HighlightEnd;}/* * Special redraw function after a text insertion */static voidDrawInsert(TextFieldWidget w){  /*  EraseCursor must be called before this */  DrawTextWithCopyArea(w);  DrawCursor(w);}/* * Redraw the entire widget, but don't scroll the window much */static voidDraw(TextFieldWidget w){  EraseCursor(w);  PositionCursor(w);  DrawAllText(w);  DrawCursor(w);}/* * Like Draw(), but has different rules about scrolling the window to * place the cursor in a good place */static voidMassiveChangeDraw(TextFieldWidget w){  EraseCursor(w);  MassiveCursorAdjust(w);  DrawAllText(w);  DrawCursor(w);}/* * Motif-like TextField public functions * * Note that this set of functions is only a subset of the functions available * in the real Motif XmTextField. */BooleanTextFieldGetEditable(Widget aw){  TextFieldWidget w = (TextFieldWidget) aw;  if (!XtIsTextField(aw))    return 0;  return w->text.Editable;}intTextFieldGetInsertionPosition(Widget aw){  TextFieldWidget w = (TextFieldWidget) aw;  if (!XtIsTextField(aw))    return 0;  return w->text.CursorPos;}char *TextFieldGetString(Widget aw){  TextFieldWidget w = (TextFieldWidget) aw;  char *ret;  if (!XtIsTextField(aw)) {    ret = XtMalloc(1);    *ret = '\0';    return ret;  }  ret = XtMalloc(w->text.TextLen + 1);  strncpy(ret, w->text.Text, w->text.TextLen);  ret[w->text.TextLen] = '\0';  return ret;}voidTextFieldInsert(Widget aw, int pos, char *str){  TextFieldWidget w = (TextFieldWidget) aw;  int len;  if (!XtIsTextField(aw))    return;  if (str && ((len = strlen(str)) > 0) && pos >= 0 && pos <= w->text.TextLen) {    w->text.HighlightStart = w->text.HighlightEnd = pos;    TextInsert(w, str, len);    MassiveChangeDraw(w);  }}voidTextFieldReplace(Widget aw, int first, int last, char *str){  TextFieldWidget w = (TextFieldWidget) aw;  int len;  if (!XtIsTextField(aw))    return;  if (str) {    len = strlen(str);    if (last > w->text.TextLen)      last = w->text.TextLen;    if (first <= last) {      w->text.HighlightStart = first;      w->text.HighlightEnd = last;      TextDeleteHighlighted(w);      TextInsert(w, str, len);      MassiveChangeDraw(w);    }  }}voidTextFieldSetEditable(Widget aw, Boolean editable){  TextFieldWidget w = (TextFieldWidget) aw;  if (!XtIsTextField(aw))    return;  w->text.Editable = editable;}voidTextFieldSetInsertionPosition(Widget aw, int pos){  TextFieldWidget w = (TextFieldWidget) aw;  if (!XtIsTextField(aw))    return;  if (pos >= 0 && pos <= w->text.TextLen) {    w->text.CursorPos = pos;    MassiveChangeDraw(w);  }}/* ARGSUSED */voidTextFieldSetSelection(Widget aw, int start, int end, Time time){  TextFieldWidget w = (TextFieldWidget) aw;  if (!XtIsTextField(aw))    return;  if (end < start) {    int temp;    temp = start;    start = end;    end = temp;  }  if (start < 0)    start = 0;  if (end > w->text.TextLen)    end = w->text.TextLen;  w->text.HighlightStart = start;  w->text.HighlightEnd = w->text.CursorPos = end;  MassiveChangeDraw(w);}voidTextFieldSetString(Widget aw, char *str){  TextFieldWidget w = (TextFieldWidget) aw;  int len;  if (!XtIsTextField(aw))    return;  if (str) {    len = strlen(str);    w->text.HighlightStart = 0;    w->text.HighlightEnd = w->text.TextLen;    TextDeleteHighlighted(w);    TextInsert(w, str, len);    MassiveChangeDraw(w);  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -