📄 tkcanvas.c
字号:
if (argc == 4) { tag = Tk_GetUid(argv[3]); } else { tag = Tk_GetUid(argv[2]); } for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { for (i = itemPtr->numTags-1; i >= 0; i--) { if (itemPtr->tagPtr[i] == tag) { itemPtr->tagPtr[i] = itemPtr->tagPtr[itemPtr->numTags-1]; itemPtr->numTags--; } } } } else if ((c == 'f') && (strncmp(argv[1], "find", length) == 0) && (length >= 2)) { if (argc < 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " find searchCommand ?arg arg ...?\"", (char *) NULL); goto error; } result = FindItems(interp, canvasPtr, argc-2, argv+2, (char *) NULL, argv[0]," find"); } else if ((c == 'f') && (strncmp(argv[1], "focus", length) == 0) && (length >= 2)) { if (argc > 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " focus ?tagOrId?\"", (char *) NULL); goto error; } itemPtr = canvasPtr->textInfo.focusItemPtr; if (argc == 2) { if (itemPtr != NULL) { sprintf(interp->result, "%d", itemPtr->id); } goto done; } if ((itemPtr != NULL) && (canvasPtr->textInfo.gotFocus)) { Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); } if (argv[2][0] == 0) { canvasPtr->textInfo.focusItemPtr = NULL; goto done; } for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { if (itemPtr->typePtr->icursorProc != NULL) { break; } } if (itemPtr == NULL) { goto done; } canvasPtr->textInfo.focusItemPtr = itemPtr; if (canvasPtr->textInfo.gotFocus) { Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); } } else if ((c == 'g') && (strncmp(argv[1], "gettags", length) == 0)) { if (argc != 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " gettags tagOrId\"", (char *) NULL); goto error; } itemPtr = StartTagSearch(canvasPtr, argv[2], &search); if (itemPtr != NULL) { int i; for (i = 0; i < itemPtr->numTags; i++) { Tcl_AppendElement(interp, (char *) itemPtr->tagPtr[i]); } } } else if ((c == 'i') && (strncmp(argv[1], "icursor", length) == 0) && (length >= 2)) { int index; if (argc != 4) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " icursor tagOrId index\"", (char *) NULL); goto error; } for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { if ((itemPtr->typePtr->indexProc == NULL) || (itemPtr->typePtr->icursorProc == NULL)) { goto done; } if ((*itemPtr->typePtr->indexProc)(interp, (Tk_Canvas) canvasPtr, itemPtr, argv[3], &index) != TCL_OK) { goto error; } (*itemPtr->typePtr->icursorProc)((Tk_Canvas) canvasPtr, itemPtr, index); if ((itemPtr == canvasPtr->textInfo.focusItemPtr) && (canvasPtr->textInfo.cursorOn)) { Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); } } } else if ((c == 'i') && (strncmp(argv[1], "index", length) == 0) && (length >= 3)) { int index; if (argc != 4) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " index tagOrId string\"", (char *) NULL); goto error; } for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { if (itemPtr->typePtr->indexProc != NULL) { break; } } if (itemPtr == NULL) { Tcl_AppendResult(interp, "can't find an indexable item \"", argv[2], "\"", (char *) NULL); goto error; } if ((*itemPtr->typePtr->indexProc)(interp, (Tk_Canvas) canvasPtr, itemPtr, argv[3], &index) != TCL_OK) { goto error; } sprintf(interp->result, "%d", index); } else if ((c == 'i') && (strncmp(argv[1], "insert", length) == 0) && (length >= 3)) { int beforeThis; if (argc != 5) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " insert tagOrId beforeThis string\"", (char *) NULL); goto error; } for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { if ((itemPtr->typePtr->indexProc == NULL) || (itemPtr->typePtr->insertProc == NULL)) { continue; } if ((*itemPtr->typePtr->indexProc)(interp, (Tk_Canvas) canvasPtr, itemPtr, argv[3], &beforeThis) != TCL_OK) { goto error; } /* * Redraw both item's old and new areas: it's possible * that an insertion could result in a new area either * larger or smaller than the old area. */ Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); (*itemPtr->typePtr->insertProc)((Tk_Canvas) canvasPtr, itemPtr, beforeThis, argv[4]); Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); } } else if ((c == 'i') && (strncmp(argv[1], "itemcget", length) == 0) && (length >= 6)) { if (argc != 4) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " itemcget tagOrId option\"", (char *) NULL); return TCL_ERROR; } itemPtr = StartTagSearch(canvasPtr, argv[2], &search); if (itemPtr != NULL) { result = Tk_ConfigureValue(canvasPtr->interp, canvasPtr->tkwin, itemPtr->typePtr->configSpecs, (char *) itemPtr, argv[3], 0); } } else if ((c == 'i') && (strncmp(argv[1], "itemconfigure", length) == 0) && (length >= 6)) { if (argc < 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " itemconfigure tagOrId ?option value ...?\"", (char *) NULL); goto error; } for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { if (argc == 3) { result = Tk_ConfigureInfo(canvasPtr->interp, canvasPtr->tkwin, itemPtr->typePtr->configSpecs, (char *) itemPtr, (char *) NULL, 0); } else if (argc == 4) { result = Tk_ConfigureInfo(canvasPtr->interp, canvasPtr->tkwin, itemPtr->typePtr->configSpecs, (char *) itemPtr, argv[3], 0); } else { Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); result = (*itemPtr->typePtr->configProc)(interp, (Tk_Canvas) canvasPtr, itemPtr, argc-3, argv+3, TK_CONFIG_ARGV_ONLY); Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); canvasPtr->flags |= REPICK_NEEDED; } if ((result != TCL_OK) || (argc < 5)) { break; } } } else if ((c == 'l') && (strncmp(argv[1], "lower", length) == 0)) { Tk_Item *prevPtr; if ((argc != 3) && (argc != 4)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " lower tagOrId ?belowThis?\"", (char *) NULL); goto error; } /* * First find the item just after which we'll insert the * named items. */ if (argc == 3) { prevPtr = NULL; } else { prevPtr = StartTagSearch(canvasPtr, argv[3], &search); if (prevPtr != NULL) { prevPtr = search.prevPtr; } else { Tcl_AppendResult(interp, "tag \"", argv[3], "\" doesn't match any items", (char *) NULL); goto error; } } RelinkItems(canvasPtr, argv[2], prevPtr); } else if ((c == 'm') && (strncmp(argv[1], "move", length) == 0)) { double xAmount, yAmount; if (argc != 5) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " move tagOrId xAmount yAmount\"", (char *) NULL); goto error; } if ((Tk_CanvasGetCoord(interp, (Tk_Canvas) canvasPtr, argv[3], &xAmount) != TCL_OK) || (Tk_CanvasGetCoord(interp, (Tk_Canvas) canvasPtr, argv[4], &yAmount) != TCL_OK)) { goto error; } for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); (void) (*itemPtr->typePtr->translateProc)((Tk_Canvas) canvasPtr, itemPtr, xAmount, yAmount); Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); canvasPtr->flags |= REPICK_NEEDED; } } else if ((c == 'p') && (strncmp(argv[1], "postscript", length) == 0)) { result = TkCanvPostscriptCmd(canvasPtr, interp, argc, argv); } else if ((c == 'r') && (strncmp(argv[1], "raise", length) == 0)) { Tk_Item *prevPtr; if ((argc != 3) && (argc != 4)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " raise tagOrId ?aboveThis?\"", (char *) NULL); goto error; } /* * First find the item just after which we'll insert the * named items. */ if (argc == 3) { prevPtr = canvasPtr->lastItemPtr; } else { prevPtr = NULL; for (itemPtr = StartTagSearch(canvasPtr, argv[3], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { prevPtr = itemPtr; } if (prevPtr == NULL) { Tcl_AppendResult(interp, "tagOrId \"", argv[3], "\" doesn't match any items", (char *) NULL); goto error; } } RelinkItems(canvasPtr, argv[2], prevPtr); } else if ((c == 's') && (strncmp(argv[1], "scale", length) == 0) && (length >= 3)) { double xOrigin, yOrigin, xScale, yScale; if (argc != 7) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " scale tagOrId xOrigin yOrigin xScale yScale\"", (char *) NULL); goto error; } if ((Tk_CanvasGetCoord(interp, (Tk_Canvas) canvasPtr, argv[3], &xOrigin) != TCL_OK) || (Tk_CanvasGetCoord(interp, (Tk_Canvas) canvasPtr, argv[4], &yOrigin) != TCL_OK) || (Tcl_GetDouble(interp, argv[5], &xScale) != TCL_OK) || (Tcl_GetDouble(interp, argv[6], &yScale) != TCL_OK)) { goto error; } if ((xScale == 0.0) || (yScale == 0.0)) { interp->result = "scale factor cannot be zero"; goto error; } for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); (void) (*itemPtr->typePtr->scaleProc)((Tk_Canvas) canvasPtr, itemPtr, xOrigin, yOrigin, xScale, yScale); Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); canvasPtr->flags |= REPICK_NEEDED; } } else if ((c == 's') && (strncmp(argv[1], "scan", length) == 0) && (length >= 3)) { int x, y; if (argc != 5) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " scan mark|dragto x y\"", (char *) NULL); goto error; } if ((Tcl_GetInt(interp, argv[3], &x) != TCL_OK) || (Tcl_GetInt(interp, argv[4], &y) != TCL_OK)){ goto error; } if ((argv[2][0] == 'm') && (strncmp(argv[2], "mark", strlen(argv[2])) == 0)) { canvasPtr->scanX = x; canvasPtr->scanXOrigin = canvasPtr->xOrigin; canvasPtr->scanY = y; canvasPtr->scanYOrigin = canvasPtr->yOrigin; } else if ((argv[2][0] == 'd') && (strncmp(argv[2], "dragto", strlen(argv[2])) == 0)) { int newXOrigin, newYOrigin, tmp; /* * Compute a new view origin for the canvas, amplifying the * mouse motion. */ tmp = canvasPtr->scanXOrigin - 10*(x - canvasPtr->scanX) - canvasPtr->scrollX1; newXOrigin = canvasPtr->scrollX1 + tmp; tmp = canvasPtr->scanYOrigin - 10*(y - canvasPtr->scanY) - canvasPtr->scrollY1; newYOrigin = canvasPtr->scrollY1 + tmp; CanvasSetOrigin(canvasPtr, newXOrigin, newYOrigin); } else { Tcl_AppendResult(interp, "bad scan option \"", argv[2], "\": must be mark or dragto", (char *) NULL); goto error; } } else if ((c == 's') && (strncmp(argv[1], "select", length) == 0) && (length >= 2)) { int index; if (argc < 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " select option ?tagOrId? ?arg?\"", (char *) NULL); goto error; } if (argc >= 4) { for (itemPtr = StartTagSearch(canvasPtr, argv[3], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { if ((itemPtr->typePtr->indexProc != NULL) && (itemPtr->typePtr->selectionProc != NULL)){ break; } } if (itemPtr == NULL) { Tcl_AppendResult(interp, "can't find an indexable and selectable item \"", argv[3], "\"", (char *) NULL); goto error; } } if (argc == 5) { if ((*itemPtr->typePtr->indexProc)(interp, (Tk_Canvas) canvasPtr, itemPtr, argv[4], &index) != TCL_OK) { goto error; } } length = strlen(argv[2]); c = argv[2][0]; if ((c == 'a') && (strncmp(argv[2], "adjust", length) == 0)) { if (argc != 5) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " select adjust tagOrId index\"", (char *) NULL); goto error; } if (canvasPtr->textInfo.selItemPtr == itemPtr) { if (index < (canvasPtr->textInfo.selectFirst + canvasPtr->textInfo.selectLast)/2) { canvasPtr->textInfo.selectAnchor = canvasPtr->textInfo.selectLast + 1; } else { canvasPtr->textInfo.selectAnchor =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -