summaryrefslogtreecommitdiffstats
path: root/generic/tkTreeMarquee.c
diff options
context:
space:
mode:
authortreectrl <treectrl>2002-12-17 05:04:00 (GMT)
committertreectrl <treectrl>2002-12-17 05:04:00 (GMT)
commit51219bf94e57870b142db498f63180828d6990d9 (patch)
tree2aaef21ae17c7dc8591f1fdf095fb4fbeeef8197 /generic/tkTreeMarquee.c
downloadtktreectrl-51219bf94e57870b142db498f63180828d6990d9.zip
tktreectrl-51219bf94e57870b142db498f63180828d6990d9.tar.gz
tktreectrl-51219bf94e57870b142db498f63180828d6990d9.tar.bz2
Initial revision
Diffstat (limited to 'generic/tkTreeMarquee.c')
-rw-r--r--generic/tkTreeMarquee.c364
1 files changed, 364 insertions, 0 deletions
diff --git a/generic/tkTreeMarquee.c b/generic/tkTreeMarquee.c
new file mode 100644
index 0000000..2e2b7ad
--- /dev/null
+++ b/generic/tkTreeMarquee.c
@@ -0,0 +1,364 @@
+#include "tkTreeCtrl.h"
+
+typedef struct Marquee Marquee;
+
+struct Marquee
+{
+ TreeCtrl *tree;
+ int visible;
+ int x1, y1, x2, y2;
+ int onScreen;
+ int sx, sy;
+};
+
+static Tk_OptionSpec optionSpecs[] = {
+ {TK_OPTION_BOOLEAN, "-visible", (char *) NULL, (char *) NULL,
+ "0", -1, Tk_Offset(Marquee, visible),
+ 0, (ClientData) NULL, 0},
+ {TK_OPTION_END, (char *) NULL, (char *) NULL, (char *) NULL,
+ (char *) NULL, 0, -1, 0, 0, 0}
+};
+
+static Tk_OptionTable optionTable = NULL;
+
+int TreeMarquee_Init(TreeCtrl *tree)
+{
+ Marquee *marquee;
+
+ if (optionTable == NULL)
+ optionTable = Tk_CreateOptionTable(tree->interp, optionSpecs);
+
+ marquee = (Marquee *) ckalloc(sizeof(Marquee));
+ memset(marquee, '\0', sizeof(Marquee));
+ marquee->tree = tree;
+ if (Tk_InitOptions(tree->interp, (char *) marquee, optionTable,
+ tree->tkwin) != TCL_OK)
+ {
+ WFREE(marquee, Marquee);
+ return TCL_ERROR;
+ }
+ tree->marquee = (TreeMarquee) marquee;
+ return TCL_OK;
+}
+
+void TreeMarquee_Free(TreeMarquee marquee_)
+{
+ Marquee *marquee = (Marquee *) marquee_;
+
+ Tk_FreeConfigOptions((char *) marquee, optionTable,
+ marquee->tree->tkwin);
+ WFREE(marquee, Marquee);
+}
+
+void TreeMarquee_Display(TreeMarquee marquee_)
+{
+ Marquee *marquee = (Marquee *) marquee_;
+ TreeCtrl *tree = marquee->tree;
+
+ if (!marquee->onScreen && marquee->visible)
+ {
+ marquee->sx = 0 - tree->xOrigin;
+ marquee->sy = 0 - tree->yOrigin;
+ TreeMarquee_Draw(marquee_, Tk_WindowId(tree->tkwin), marquee->sx, marquee->sy);
+ marquee->onScreen = TRUE;
+ }
+}
+
+void TreeMarquee_Undisplay(TreeMarquee marquee_)
+{
+ Marquee *marquee = (Marquee *) marquee_;
+ TreeCtrl *tree = marquee->tree;
+
+ if (marquee->onScreen)
+ {
+ TreeMarquee_Draw(marquee_, Tk_WindowId(tree->tkwin), marquee->sx, marquee->sy);
+ marquee->onScreen = FALSE;
+ }
+}
+
+void TreeMarquee_Draw(TreeMarquee marquee_, Drawable drawable, int x1, int y1)
+{
+ Marquee *marquee = (Marquee *) marquee_;
+ TreeCtrl *tree = marquee->tree;
+ int x, y, w, h;
+ DotState dotState;
+
+/* if (!marquee->visible)
+ return; */
+
+ x = MIN(marquee->x1, marquee->x2);
+ w = abs(marquee->x1 - marquee->x2) + 1;
+ y = MIN(marquee->y1, marquee->y2);
+ h = abs(marquee->y1 - marquee->y2) + 1;
+
+ DotRect_Setup(tree, drawable, &dotState);
+ DotRect_Draw(&dotState, x1 + x, y1 + y, w, h);
+ DotRect_Restore(&dotState);
+}
+
+static int Marquee_Config(Marquee *marquee, int objc, Tcl_Obj *CONST objv[])
+{
+ TreeCtrl *tree = marquee->tree;
+ Tk_SavedOptions savedOptions;
+ int mask, result;
+
+ result = Tk_SetOptions(tree->interp, (char *) marquee, optionTable,
+ objc, objv, tree->tkwin, &savedOptions, &mask);
+ if (result != TCL_OK)
+ {
+ Tk_RestoreSavedOptions(&savedOptions);
+ return TCL_ERROR;
+ }
+ Tk_FreeSavedOptions(&savedOptions);
+
+/* Marquee_Redraw(marquee); */
+
+ return TCL_OK;
+}
+
+int TreeMarqueeCmd(ClientData clientData, Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[])
+{
+ TreeCtrl *tree = (TreeCtrl *) clientData;
+ Marquee *marquee = (Marquee *) tree->marquee;
+ static CONST char *commandNames[] = { "anchor", "cget", "configure",
+ "coords", "corner", "identify", "visible", (char *) NULL };
+ enum { COMMAND_ANCHOR, COMMAND_CGET, COMMAND_CONFIGURE, COMMAND_COORDS,
+ COMMAND_CORNER, COMMAND_IDENTIFY, COMMAND_VISIBLE };
+ int index;
+
+ if (objc < 3)
+ {
+ Tcl_WrongNumArgs(interp, 2, objv, "command ?arg arg...?");
+ return TCL_ERROR;
+ }
+
+ if (Tcl_GetIndexFromObj(interp, objv[2], commandNames, "command", 0,
+ &index) != TCL_OK)
+ {
+ return TCL_ERROR;
+ }
+
+ switch (index)
+ {
+ /* T marquee anchor ?x y?*/
+ case COMMAND_ANCHOR:
+ {
+ int x, y;
+
+ if (objc != 3 && objc != 5)
+ {
+ Tcl_WrongNumArgs(interp, 3, objv, "?x y?");
+ return TCL_ERROR;
+ }
+ if (objc == 3)
+ {
+ FormatResult(interp, "%d %d", marquee->x1, marquee->y1);
+ break;
+ }
+ if (Tcl_GetIntFromObj(interp, objv[3], &x) != TCL_OK)
+ return TCL_ERROR;
+ if (Tcl_GetIntFromObj(interp, objv[4], &y) != TCL_OK)
+ return TCL_ERROR;
+ if ((x == marquee->x1) && (y == marquee->y1))
+ break;
+ TreeMarquee_Undisplay(tree->marquee);
+ marquee->x1 = x;
+ marquee->y1 = y;
+ TreeMarquee_Display(tree->marquee);
+ break;
+ }
+
+ /* T marquee cget option */
+ case COMMAND_CGET:
+ {
+ Tcl_Obj *resultObjPtr;
+
+ if (objc != 4)
+ {
+ Tcl_WrongNumArgs(interp, 3, objv, "option");
+ return TCL_ERROR;
+ }
+ resultObjPtr = Tk_GetOptionValue(interp, (char *) marquee,
+ optionTable, objv[3], tree->tkwin);
+ if (resultObjPtr == NULL)
+ return TCL_ERROR;
+ Tcl_SetObjResult(interp, resultObjPtr);
+ break;
+ }
+
+ /* T marquee configure ?option? ?value? ?option value ...? */
+ case COMMAND_CONFIGURE:
+ {
+ Tcl_Obj *resultObjPtr;
+
+ if (objc < 3)
+ {
+ Tcl_WrongNumArgs(interp, 3, objv, "?option? ?value?");
+ return TCL_ERROR;
+ }
+ if (objc <= 4)
+ {
+ resultObjPtr = Tk_GetOptionInfo(interp, (char *) marquee,
+ optionTable,
+ (objc == 3) ? (Tcl_Obj *) NULL : objv[3],
+ tree->tkwin);
+ if (resultObjPtr == NULL)
+ return TCL_ERROR;
+ Tcl_SetObjResult(interp, resultObjPtr);
+ break;
+ }
+ return Marquee_Config(marquee, objc - 3, objv + 3);
+ }
+
+ /* T marquee coords ?x y x y? */
+ case COMMAND_COORDS:
+ {
+ int x1, y1, x2, y2;
+
+ if (objc != 3 && objc != 7)
+ {
+ Tcl_WrongNumArgs(interp, 3, objv, "?x y x y?");
+ return TCL_ERROR;
+ }
+ if (objc == 3)
+ {
+ FormatResult(interp, "%d %d %d %d", marquee->x1, marquee->y1,
+ marquee->x2, marquee->y2);
+ break;
+ }
+ if (Tcl_GetIntFromObj(interp, objv[3], &x1) != TCL_OK)
+ return TCL_ERROR;
+ if (Tcl_GetIntFromObj(interp, objv[4], &y1) != TCL_OK)
+ return TCL_ERROR;
+ if (Tcl_GetIntFromObj(interp, objv[5], &x2) != TCL_OK)
+ return TCL_ERROR;
+ if (Tcl_GetIntFromObj(interp, objv[6], &y2) != TCL_OK)
+ return TCL_ERROR;
+ if (x1 == marquee->x1 && y1 == marquee->y1 &&
+ x2 == marquee->x2 && y2 == marquee->y2)
+ break;
+ TreeMarquee_Undisplay(tree->marquee);
+ marquee->x1 = x1;
+ marquee->y1 = y1;
+ marquee->x2 = x2;
+ marquee->y2 = y2;
+ TreeMarquee_Display(tree->marquee);
+ break;
+ }
+
+ /* T marquee corner ?x y?*/
+ case COMMAND_CORNER:
+ {
+ int x, y;
+
+ if (objc != 3 && objc != 5)
+ {
+ Tcl_WrongNumArgs(interp, 3, objv, "?x y?");
+ return TCL_ERROR;
+ }
+ if (objc == 3)
+ {
+ FormatResult(interp, "%d %d", marquee->x2, marquee->y2);
+ break;
+ }
+ if (Tcl_GetIntFromObj(interp, objv[3], &x) != TCL_OK)
+ return TCL_ERROR;
+ if (Tcl_GetIntFromObj(interp, objv[4], &y) != TCL_OK)
+ return TCL_ERROR;
+ if (x == marquee->x2 && y == marquee->y2)
+ break;
+ TreeMarquee_Undisplay(tree->marquee);
+ marquee->x2 = x;
+ marquee->y2 = y;
+ TreeMarquee_Display(tree->marquee);
+ break;
+ }
+
+ /* T marquee identify */
+ case COMMAND_IDENTIFY:
+ {
+ int x1, y1, x2, y2, n = 0;
+ int totalWidth = Tree_TotalWidth(tree);
+ int totalHeight = Tree_TotalHeight(tree);
+ TreeItem *items;
+ Tcl_Obj *listObj;
+
+ if (objc != 3)
+ {
+ Tcl_WrongNumArgs(interp, 3, objv, (char *) NULL);
+ return TCL_ERROR;
+ }
+
+ x1 = MIN(marquee->x1, marquee->x2);
+ x2 = MAX(marquee->x1, marquee->x2);
+ y1 = MIN(marquee->y1, marquee->y2);
+ y2 = MAX(marquee->y1, marquee->y2);
+
+ if (x2 <= 0)
+ break;
+ if (x1 >= totalWidth)
+ break;
+
+ if (y2 <= 0)
+ break;
+ if (y1 >= totalHeight)
+ break;
+
+ if (x1 < 0)
+ x1 = 0;
+ if (x2 > totalWidth)
+ x2 = totalWidth;
+
+ if (y1 < 0)
+ y1 = 0;
+ if (y2 > totalHeight)
+ y2 = totalHeight;
+
+ items = Tree_ItemsInArea(tree, x1, y1, x2, y2);
+ if (items == NULL)
+ break;
+
+ listObj = Tcl_NewListObj(0, NULL);
+ while (items[n] != NULL)
+ {
+ Tcl_Obj *subListObj = Tcl_NewListObj(0, NULL);
+ Tcl_ListObjAppendElement(interp, subListObj,
+ TreeItem_ToObj(tree, items[n]));
+ TreeItem_Identify2(tree, items[n], x1, y1, x2, y2, subListObj);
+ Tcl_ListObjAppendElement(interp, listObj, subListObj);
+ n++;
+ }
+ ckfree((char *) items);
+ Tcl_SetObjResult(interp, listObj);
+ break;
+ }
+
+ /* T marquee visible ?boolean? */
+ case COMMAND_VISIBLE:
+ {
+ int visible;
+
+ if (objc != 3 && objc != 4)
+ {
+ Tcl_WrongNumArgs(interp, 3, objv, "?boolean?");
+ return TCL_ERROR;
+ }
+ if (objc == 4)
+ {
+ if (Tcl_GetBooleanFromObj(interp, objv[3], &visible) != TCL_OK)
+ return TCL_ERROR;
+ if (visible != marquee->visible)
+ {
+ marquee->visible = visible;
+ TreeMarquee_Undisplay(tree->marquee);
+ TreeMarquee_Display(tree->marquee);
+ }
+ }
+ Tcl_SetObjResult(interp, Tcl_NewBooleanObj(marquee->visible));
+ break;
+ }
+ }
+
+ return TCL_OK;
+}