summaryrefslogtreecommitdiff
path: root/tix/generic/tixHLInd.c
diff options
context:
space:
mode:
Diffstat (limited to 'tix/generic/tixHLInd.c')
-rw-r--r--tix/generic/tixHLInd.c278
1 files changed, 278 insertions, 0 deletions
diff --git a/tix/generic/tixHLInd.c b/tix/generic/tixHLInd.c
new file mode 100644
index 00000000000..80509e13eea
--- /dev/null
+++ b/tix/generic/tixHLInd.c
@@ -0,0 +1,278 @@
+/*
+ * tixHLInd.c ---
+ *
+ * Implements indicators inside tixHList widgets
+ *
+ * Copyright (c) 1994-1995 Ioi Kim Lam. All rights reserved.
+ *
+ * See the file "license.terms" for information on usage and redistribution
+ * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ *
+ */
+
+#include <tixPort.h>
+#include <tixInt.h>
+#include <tixHList.h>
+
+static TIX_DECLARE_SUBCMD(Tix_HLIndCreate);
+static TIX_DECLARE_SUBCMD(Tix_HLIndConfig);
+static TIX_DECLARE_SUBCMD(Tix_HLIndCGet);
+static TIX_DECLARE_SUBCMD(Tix_HLIndDelete);
+static TIX_DECLARE_SUBCMD(Tix_HLIndExists);
+static TIX_DECLARE_SUBCMD(Tix_HLIndSize);
+
+
+/*----------------------------------------------------------------------
+ * "indicator" sub command
+ *----------------------------------------------------------------------
+ */
+int
+Tix_HLIndicator(clientData, interp, argc, argv)
+ ClientData clientData;
+ Tcl_Interp *interp; /* Current interpreter. */
+ int argc; /* Number of arguments. */
+ char **argv; /* Argument strings. */
+{
+ static Tix_SubCmdInfo subCmdInfo[] = {
+ {TIX_DEFAULT_LEN, "cget", 2, 2, Tix_HLIndCGet,
+ "entryPath option"},
+ {TIX_DEFAULT_LEN, "configure", 1, TIX_VAR_ARGS, Tix_HLIndConfig,
+ "entryPath ?option? ?value ...?"},
+ {TIX_DEFAULT_LEN, "create", 1, TIX_VAR_ARGS, Tix_HLIndCreate,
+ "entryPath ?option value ...?"},
+ {TIX_DEFAULT_LEN, "delete", 1, 1, Tix_HLIndDelete,
+ "entryPath"},
+ {TIX_DEFAULT_LEN, "exists", 1, 1, Tix_HLIndExists,
+ "entryPath"},
+ {TIX_DEFAULT_LEN, "size", 1, 1, Tix_HLIndSize,
+ "entryPath"},
+ };
+ static Tix_CmdInfo cmdInfo = {
+ Tix_ArraySize(subCmdInfo), 1, TIX_VAR_ARGS, "?option? ?arg ...?",
+ };
+
+ return Tix_HandleSubCmds(&cmdInfo, subCmdInfo, clientData,
+ interp, argc+1, argv-1);
+}
+
+/*----------------------------------------------------------------------
+ * "indicator cget" sub command
+ *----------------------------------------------------------------------
+ */
+static int
+Tix_HLIndCGet(clientData, interp, argc, argv)
+ ClientData clientData;
+ Tcl_Interp *interp; /* Current interpreter. */
+ int argc; /* Number of arguments. */
+ char **argv; /* Argument strings. */
+{
+ WidgetPtr wPtr = (WidgetPtr) clientData;
+ HListElement * chPtr;
+
+ if ((chPtr = Tix_HLFindElement(interp, wPtr, argv[0])) == NULL) {
+ return TCL_ERROR;
+ }
+ if (chPtr->indicator == NULL) {
+ Tcl_AppendResult(interp, "entry \"", argv[0],
+ "\" does not have an indicator", (char*)NULL);
+ return TCL_ERROR;
+ }
+ return Tk_ConfigureValue(interp, wPtr->dispData.tkwin,
+ chPtr->indicator->base.diTypePtr->itemConfigSpecs,
+ (char *)chPtr->indicator, argv[1], 0);
+}
+
+/*----------------------------------------------------------------------
+ * "indicator configure" sub command
+ *----------------------------------------------------------------------
+ */
+static int
+Tix_HLIndConfig(clientData, interp, argc, argv)
+ ClientData clientData;
+ Tcl_Interp *interp; /* Current interpreter. */
+ int argc; /* Number of arguments. */
+ char **argv; /* Argument strings. */
+{
+ WidgetPtr wPtr = (WidgetPtr) clientData;
+ HListElement * chPtr;
+
+ if ((chPtr = Tix_HLFindElement(interp, wPtr, argv[0])) == NULL) {
+ return TCL_ERROR;
+ }
+ if (chPtr->indicator == NULL) {
+ Tcl_AppendResult(interp, "entry \"", argv[0],
+ "\" does not have an indicator", (char*)NULL);
+ return TCL_ERROR;
+ }
+ if (argc == 1) {
+ return Tk_ConfigureInfo(interp, wPtr->dispData.tkwin,
+ chPtr->indicator->base.diTypePtr->itemConfigSpecs,
+ (char *)chPtr->indicator, NULL, 0);
+ } else if (argc == 2) {
+ return Tk_ConfigureInfo(interp, wPtr->dispData.tkwin,
+ chPtr->indicator->base.diTypePtr->itemConfigSpecs,
+ (char *)chPtr->indicator, argv[1], 0);
+ } else {
+ Tix_HLMarkElementDirty(wPtr, chPtr);
+ Tix_HLResizeWhenIdle(wPtr);
+
+ return Tix_DItemConfigure(chPtr->indicator,
+ argc-1, argv+1, TK_CONFIG_ARGV_ONLY);
+ }
+}
+
+/*----------------------------------------------------------------------
+ * "indicator create" sub command
+ *----------------------------------------------------------------------
+ */
+static int
+Tix_HLIndCreate(clientData, interp, argc, argv)
+ ClientData clientData;
+ Tcl_Interp *interp; /* Current interpreter. */
+ int argc; /* Number of arguments. */
+ char **argv; /* Argument strings. */
+{
+ WidgetPtr wPtr = (WidgetPtr) clientData;
+ HListElement * chPtr;
+ int i;
+ size_t len;
+ Tix_DItem * iPtr;
+ char * ditemType = NULL;
+
+ if ((chPtr = Tix_HLFindElement(interp, wPtr, argv[0])) == NULL) {
+ return TCL_ERROR;
+ }
+ if ((argc %2) == 0) {
+ Tcl_AppendResult(interp, "value for \"", argv[argc-1],
+ "\" missing", NULL);
+ return TCL_ERROR;
+ }
+ for (i=1; i<argc; i+=2) {
+ len = strlen(argv[i]);
+ if (strncmp(argv[i], "-itemtype", len) == 0) {
+ ditemType = argv[i+1];
+ }
+ }
+ if (ditemType == NULL) {
+ ditemType = wPtr->diTypePtr->name;
+ }
+
+ iPtr = Tix_DItemCreate(&wPtr->dispData, ditemType);
+ if (iPtr == NULL) {
+ return TCL_ERROR;
+ }
+ if (Tix_DItemType(iPtr) == TIX_DITEM_WINDOW) {
+ wPtr->needToRaise = 1;
+ }
+
+ iPtr->base.clientData = (ClientData)chPtr;
+ if (Tix_DItemConfigure(iPtr, argc-1, argv+1, 0) != TCL_OK) {
+ return TCL_ERROR;
+ }
+
+ if (chPtr->indicator != NULL) {
+ if (Tix_DItemType(chPtr->indicator) == TIX_DITEM_WINDOW) {
+ Tix_WindowItemListRemove(&wPtr->mappedWindows,
+ chPtr->indicator);
+ }
+ Tix_DItemFree(chPtr->indicator);
+ }
+ chPtr->indicator = iPtr;
+ Tix_HLMarkElementDirty(wPtr, chPtr);
+ Tix_HLResizeWhenIdle(wPtr);
+
+ return TCL_OK;
+}
+/*----------------------------------------------------------------------
+ * "indicator delete" sub command
+ *----------------------------------------------------------------------
+ */
+static int
+Tix_HLIndDelete(clientData, interp, argc, argv)
+ ClientData clientData;
+ Tcl_Interp *interp; /* Current interpreter. */
+ int argc; /* Number of arguments. */
+ char **argv; /* Argument strings. */
+{
+ WidgetPtr wPtr = (WidgetPtr) clientData;
+ HListElement * chPtr;
+
+ if ((chPtr = Tix_HLFindElement(interp, wPtr, argv[0])) == NULL) {
+ return TCL_ERROR;
+ }
+ if (chPtr->indicator == NULL) {
+ Tcl_AppendResult(interp, "entry \"", argv[0],
+ "\" does not have an indicator", (char*)NULL);
+ return TCL_ERROR;
+ }
+
+ if (Tix_DItemType(chPtr->indicator) == TIX_DITEM_WINDOW) {
+ Tix_WindowItemListRemove(&wPtr->mappedWindows,
+ chPtr->indicator);
+ }
+
+ /* Free the item and leave a blank! */
+
+ Tix_DItemFree(chPtr->indicator);
+ chPtr->indicator = NULL;
+
+ Tix_HLMarkElementDirty(wPtr, chPtr);
+ Tix_HLResizeWhenIdle(wPtr);
+
+ return TCL_OK;
+}
+/*----------------------------------------------------------------------
+ * "indicator exists" sub command
+ *----------------------------------------------------------------------
+ */
+static int
+Tix_HLIndExists(clientData, interp, argc, argv)
+ ClientData clientData;
+ Tcl_Interp *interp; /* Current interpreter. */
+ int argc; /* Number of arguments. */
+ char **argv; /* Argument strings. */
+{
+ WidgetPtr wPtr = (WidgetPtr) clientData;
+ HListElement * chPtr;
+
+ if ((chPtr = Tix_HLFindElement(interp, wPtr, argv[0])) == NULL) {
+ return TCL_ERROR;
+ }
+ if (chPtr->indicator == NULL) {
+ Tcl_AppendResult(interp, "0", NULL);
+ } else {
+ Tcl_AppendResult(interp, "1", NULL);
+ }
+
+ return TCL_OK;
+}
+
+/*----------------------------------------------------------------------
+ * "indicator size" sub command
+ *----------------------------------------------------------------------
+ */
+static int
+Tix_HLIndSize(clientData, interp, argc, argv)
+ ClientData clientData;
+ Tcl_Interp *interp; /* Current interpreter. */
+ int argc; /* Number of arguments. */
+ char **argv; /* Argument strings. */
+{
+ WidgetPtr wPtr = (WidgetPtr) clientData;
+ HListElement * chPtr;
+ char buff[100];
+
+ if ((chPtr = Tix_HLFindElement(interp, wPtr, argv[0])) == NULL) {
+ return TCL_ERROR;
+ }
+ if (chPtr->indicator == NULL) {
+ Tcl_AppendResult(interp, "entry \"", argv[0],
+ "\" does not have an indicator", (char*)NULL);
+ return TCL_ERROR;
+ }
+ sprintf(buff, "%d %d",
+ Tix_DItemWidth(chPtr->indicator),
+ Tix_DItemHeight(chPtr->indicator));
+ Tcl_AppendResult(interp, buff, NULL);
+ return TCL_OK;
+}