summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjoye <joye>2014-04-14 19:24:28 (GMT)
committerjoye <joye>2014-04-14 19:24:28 (GMT)
commit095d3b27e3e190ab35a2e5bce63e3b4ccf87ce34 (patch)
treef306899cb72643ecfca5510fcdb3090dd527d16f
parent4489585e3840de453f599780ed523f08054c2db2 (diff)
downloadblt-095d3b27e3e190ab35a2e5bce63e3b4ccf87ce34.zip
blt-095d3b27e3e190ab35a2e5bce63e3b4ccf87ce34.tar.gz
blt-095d3b27e3e190ab35a2e5bce63e3b4ccf87ce34.tar.bz2
*** empty log message ***
-rwxr-xr-xconfigure1
-rwxr-xr-xconfigure.in1
-rw-r--r--src/bltGrAxis.h4
-rw-r--r--src/bltGrAxisOp.C293
-rw-r--r--src/bltGrAxisOp.h21
-rw-r--r--src/bltGrXAxisOp.C20
-rw-r--r--src/bltGraph.C3
7 files changed, 313 insertions, 30 deletions
diff --git a/configure b/configure
index 111eabc..f846303 100755
--- a/configure
+++ b/configure
@@ -5532,7 +5532,6 @@ done
bltGrAxis.C
bltGrAxisOp.C
bltGrAxisOption.C
- bltGrVAxisOp.C
bltGrXAxisOp.C
bltGrElemOp.C
bltGrElemOption.C
diff --git a/configure.in b/configure.in
index df19d2d..0432717 100755
--- a/configure.in
+++ b/configure.in
@@ -77,7 +77,6 @@ TEA_ADD_SOURCES([
bltGrAxis.C
bltGrAxisOp.C
bltGrAxisOption.C
- bltGrVAxisOp.C
bltGrXAxisOp.C
bltGrElemOp.C
bltGrElemOption.C
diff --git a/src/bltGrAxis.h b/src/bltGrAxis.h
index dfefa02..06471ef 100644
--- a/src/bltGrAxis.h
+++ b/src/bltGrAxis.h
@@ -101,8 +101,6 @@ typedef struct {
int hide;
int showTicks;
- // Fields specific to axes
-
double windowSize;
const char *formatCmd;
int descending;
@@ -129,8 +127,6 @@ typedef struct {
const char *title;
int titleAlternate;
- // The following fields are specific to logical axes
-
XColor* activeFgColor;
int activeRelief;
Tk_3DBorder normalBg;
diff --git a/src/bltGrAxisOp.C b/src/bltGrAxisOp.C
index 8e7bfea..ed9a78e 100644
--- a/src/bltGrAxisOp.C
+++ b/src/bltGrAxisOp.C
@@ -47,6 +47,8 @@ static int GetAxisScrollInfo(Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[],
double *offsetPtr, double windowSize,
double scrollUnits, double scale);
+static int AxisObjConfigure(Tcl_Interp* interp, Axis* axis,
+ int objc, Tcl_Obj* const objv[]);
static double Clamp(double x)
{
@@ -290,6 +292,295 @@ int AxisViewOp(Tcl_Interp* interp, Axis* axisPtr,
return TCL_OK;
}
+// Axis
+
+static int CreateAxis(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ char *string = Tcl_GetString(objv[3]);
+ if (string[0] == '-') {
+ Tcl_AppendResult(graphPtr->interp, "name of axis \"", string,
+ "\" can't start with a '-'", NULL);
+ return TCL_ERROR;
+ }
+
+ int isNew;
+ Tcl_HashEntry* hPtr =
+ Tcl_CreateHashEntry(&graphPtr->axes.table, string, &isNew);
+ if (!isNew) {
+ Tcl_AppendResult(graphPtr->interp, "axis \"", string,
+ "\" already exists in \"", Tcl_GetString(objv[0]),
+ "\"", NULL);
+ return TCL_ERROR;
+ }
+
+ Axis* axisPtr = new Axis(graphPtr, Tcl_GetString(objv[3]), MARGIN_NONE);
+ if (!axisPtr)
+ return TCL_ERROR;
+ axisPtr->hashPtr_ = hPtr;
+ Tcl_SetHashValue(hPtr, axisPtr);
+
+ if ((Tk_InitOptions(graphPtr->interp, (char*)axisPtr->ops(), axisPtr->optionTable(), graphPtr->tkwin) != TCL_OK) || (AxisObjConfigure(interp, axisPtr, objc-4, objv+4) != TCL_OK)) {
+ delete axisPtr;
+ return TCL_ERROR;
+ }
+
+ return TCL_OK;
+}
+
+static int CgetOp(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ Axis* axisPtr;
+ if (GetAxisFromObj(interp, graphPtr, objv[3], &axisPtr) != TCL_OK)
+ return TCL_ERROR;
+
+ return AxisCgetOp(interp, axisPtr, objc-1, objv+1);
+}
+
+static int ConfigureOp(Tcl_Interp* interp, Graph* graphPtr, int objc,
+ Tcl_Obj* const objv[])
+{
+ Axis* axisPtr;
+ if (GetAxisFromObj(interp, graphPtr, objv[3], &axisPtr) != TCL_OK)
+ return TCL_ERROR;
+
+ return AxisConfigureOp(interp, axisPtr, objc-1, objv+1);
+}
+
+static int ActivateOp(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ Axis* axisPtr;
+ if (GetAxisFromObj(interp, graphPtr, objv[3], &axisPtr) != TCL_OK)
+ return TCL_ERROR;
+
+ return AxisActivateOp(interp, axisPtr, objc, objv);
+}
+
+static int BindOp(Tcl_Interp* interp, Graph* graphPtr, int objc,
+ Tcl_Obj* const objv[])
+{
+ if (objc == 3) {
+ Tcl_Obj *listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **)NULL);
+ Tcl_HashSearch cursor;
+ for (Tcl_HashEntry *hPtr = Tcl_FirstHashEntry(&graphPtr->axes.tagTable, &cursor); hPtr != NULL; hPtr = Tcl_NextHashEntry(&cursor)) {
+ const char *tagName = (const char*)
+ Tcl_GetHashKey(&graphPtr->axes.tagTable, hPtr);
+ Tcl_Obj *objPtr = Tcl_NewStringObj(tagName, -1);
+ Tcl_ListObjAppendElement(interp, listObjPtr, objPtr);
+ }
+ Tcl_SetObjResult(interp, listObjPtr);
+ return TCL_OK;
+ }
+ else
+ return Blt_ConfigureBindingsFromObj(interp, graphPtr->bindTable, Blt_MakeAxisTag(graphPtr, Tcl_GetString(objv[3])), objc-4, objv+4);
+}
+
+static int CreateOp(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ if (CreateAxis(interp, graphPtr, objc, objv) != TCL_OK)
+ return TCL_ERROR;
+ Tcl_SetObjResult(interp, objv[3]);
+
+ return TCL_OK;
+}
+
+static int DeleteOp(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ if (objc<4)
+ return TCL_ERROR;
+
+ Axis* axisPtr;
+ if (GetAxisFromObj(interp, graphPtr, objv[3], &axisPtr) != TCL_OK) {
+ Tcl_AppendResult(interp, "can't find axis \"",
+ Tcl_GetString(objv[3]), "\" in \"",
+ Tk_PathName(graphPtr->tkwin), "\"", NULL);
+ return TCL_ERROR;
+ }
+
+ axisPtr->flags |= DELETE_PENDING;
+ if (axisPtr->refCount_ == 0) {
+ Tcl_EventuallyFree(axisPtr, FreeAxis);
+ Blt_EventuallyRedrawGraph(graphPtr);
+ }
+
+ return TCL_OK;
+}
+
+static int FocusOp(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ graphPtr->focusPtr = NULL;
+ if (objc == 4) {
+ Axis* axisPtr;
+ if (GetAxisFromObj(interp, graphPtr, objv[3], &axisPtr) != TCL_OK)
+ return TCL_ERROR;
+
+ AxisOptions* ops = (AxisOptions*)axisPtr->ops();
+ if (axisPtr && !ops->hide && axisPtr->use_)
+ graphPtr->focusPtr = axisPtr;
+ }
+
+ Blt_SetFocusItem(graphPtr->bindTable, graphPtr->focusPtr, NULL);
+
+ if (graphPtr->focusPtr)
+ Tcl_SetStringObj(Tcl_GetObjResult(interp), graphPtr->focusPtr->name(),-1);
+
+ return TCL_OK;
+}
+
+static int GetOp(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ Axis* axisPtr = (Axis*)Blt_GetCurrentItem(graphPtr->bindTable);
+
+ // Report only on axes
+ if ((axisPtr) &&
+ ((axisPtr->classId() == CID_AXIS_X) ||
+ (axisPtr->classId() == CID_AXIS_Y) ||
+ (axisPtr->classId() == CID_NONE))) {
+
+ char *string = Tcl_GetString(objv[3]);
+ if (!strcmp(string, "current"))
+ Tcl_SetStringObj(Tcl_GetObjResult(interp), axisPtr->name(),-1);
+ else if (!strcmp(string, "detail"))
+ Tcl_SetStringObj(Tcl_GetObjResult(interp), axisPtr->detail_, -1);
+ }
+
+ return TCL_OK;
+}
+
+static int InvTransformOp(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ Axis* axisPtr;
+ if (GetAxisFromObj(interp, graphPtr, objv[3], &axisPtr) != TCL_OK)
+ return TCL_ERROR;
+
+ return AxisInvTransformOp(interp, axisPtr, objc-1, objv+1);
+}
+
+static int LimitsOp(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ Axis* axisPtr;
+ if (GetAxisFromObj(interp, graphPtr, objv[3], &axisPtr) != TCL_OK)
+ return TCL_ERROR;
+
+ return AxisLimitsOp(interp, axisPtr, objc-1, objv+1);
+}
+
+static int MarginOp(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ Axis* axisPtr;
+ if (GetAxisFromObj(interp, graphPtr, objv[3], &axisPtr) != TCL_OK)
+ return TCL_ERROR;
+
+ return AxisMarginOp(interp, axisPtr, objc-1, objv+1);
+}
+
+static int NamesOp(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ Tcl_Obj *listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **)NULL);
+ if (objc == 3) {
+ Tcl_HashSearch cursor;
+ for (Tcl_HashEntry *hPtr = Tcl_FirstHashEntry(&graphPtr->axes.table, &cursor); hPtr; hPtr = Tcl_NextHashEntry(&cursor)) {
+ Axis* axisPtr = (Axis*)Tcl_GetHashValue(hPtr);
+ if (axisPtr->flags & DELETE_PENDING)
+ continue;
+
+ Tcl_ListObjAppendElement(interp, listObjPtr, Tcl_NewStringObj(axisPtr->name(), -1));
+ }
+ }
+ else {
+ Tcl_HashSearch cursor;
+ for (Tcl_HashEntry *hPtr = Tcl_FirstHashEntry(&graphPtr->axes.table, &cursor); hPtr; hPtr = Tcl_NextHashEntry(&cursor)) {
+ Axis* axisPtr = (Axis*)Tcl_GetHashValue(hPtr);
+ for (int ii=3; ii<objc; ii++) {
+ const char *pattern = (const char*)Tcl_GetString(objv[ii]);
+ if (Tcl_StringMatch(axisPtr->name(), pattern)) {
+ Tcl_ListObjAppendElement(interp, listObjPtr,
+ Tcl_NewStringObj(axisPtr->name(), -1));
+ break;
+ }
+ }
+ }
+ }
+ Tcl_SetObjResult(interp, listObjPtr);
+
+ return TCL_OK;
+}
+
+static int TransformOp(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ Axis* axisPtr;
+ if (GetAxisFromObj(interp, graphPtr, objv[3], &axisPtr) != TCL_OK)
+ return TCL_ERROR;
+
+ return AxisTransformOp(interp, axisPtr, objc-1, objv+1);
+}
+
+static int TypeOp(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ Axis* axisPtr;
+ if (GetAxisFromObj(interp, graphPtr, objv[3], &axisPtr) != TCL_OK)
+ return TCL_ERROR;
+
+ return AxisTypeOp(interp, axisPtr, objc-1, objv+1);
+}
+
+static int ViewOp(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[])
+{
+ Axis* axisPtr;
+ if (GetAxisFromObj(interp, graphPtr, objv[3], &axisPtr) != TCL_OK)
+ return TCL_ERROR;
+
+ return AxisViewOp(interp, axisPtr, objc-1, objv+1);
+}
+
+static Blt_OpSpec axisOps[] = {
+ {"activate", 1, (void*)ActivateOp, 4, 4, "axisName"},
+ {"bind", 1, (void*)BindOp, 3, 6, "axisName sequence command"},
+ {"cget", 2, (void*)CgetOp, 5, 5, "axisName option"},
+ {"configure", 2, (void*)ConfigureOp, 4, 0, "axisName ?axisName?... "
+ "?option value?..."},
+ {"create", 2, (void*)CreateOp, 4, 0, "axisName ?option value?..."},
+ {"deactivate", 3, (void*)ActivateOp, 4, 4, "axisName"},
+ {"delete", 3, (void*)DeleteOp, 3, 0, "?axisName?..."},
+ {"focus", 1, (void*)FocusOp, 3, 4, "?axisName?"},
+ {"get", 1, (void*)GetOp, 4, 4, "name"},
+ {"invtransform", 1, (void*)InvTransformOp, 5, 5, "axisName value"},
+ {"limits", 1, (void*)LimitsOp, 4, 4, "axisName"},
+ {"margin", 1, (void*)MarginOp, 4, 4, "axisName"},
+ {"names", 1, (void*)NamesOp, 3, 0, "?pattern?..."},
+ {"transform", 2, (void*)TransformOp, 5, 5, "axisName value"},
+ {"type", 2, (void*)TypeOp, 4, 4, "axisName"},
+ {"view", 1, (void*)ViewOp, 4, 7, "axisName ?moveto fract? "
+ "?scroll number what?"},
+};
+static int nAxisOps = sizeof(axisOps) / sizeof(Blt_OpSpec);
+
+typedef int (GraphAxisProc)(Tcl_Interp* interp, Graph* graphPtr,
+ int objc, Tcl_Obj* const objv[]);
+
+int Blt_AxisOp(Graph* graphPtr, Tcl_Interp* interp,
+ int objc, Tcl_Obj* const objv[])
+{
+ GraphAxisProc* proc = (GraphAxisProc*)Blt_GetOpFromObj(interp, nAxisOps, axisOps, BLT_OP_ARG2, objc, objv, 0);
+ if (!proc)
+ return TCL_ERROR;
+
+ return (*proc)(interp, graphPtr, objc, objv);
+}
+
// Support
void Blt_DestroyAxes(Graph* graphPtr)
@@ -309,7 +600,7 @@ void Blt_DestroyAxes(Graph* graphPtr)
Blt_Chain_Destroy(graphPtr->axes.displayList);
}
-int AxisObjConfigure(Tcl_Interp* interp, Axis* axisPtr,
+static int AxisObjConfigure(Tcl_Interp* interp, Axis* axisPtr,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = axisPtr->graphPtr_;
diff --git a/src/bltGrAxisOp.h b/src/bltGrAxisOp.h
index 65cfd82..01985ef 100644
--- a/src/bltGrAxisOp.h
+++ b/src/bltGrAxisOp.h
@@ -30,31 +30,12 @@
#ifndef __BltGrAxisOp_h__
#define __BltGrAxisOp_h__
-extern int AxisCgetOp(Tcl_Interp* interp, Axis* axisPtr,
- int objc, Tcl_Obj* const objv[]);
-extern int AxisConfigureOp(Tcl_Interp* interp, Axis* axisPtr,
- int objc, Tcl_Obj* const objv[]);
-extern int AxisActivateOp(Tcl_Interp* interp, Axis* axisPtr,
- int objc, Tcl_Obj* const objv[]);
-extern int AxisInvTransformOp(Tcl_Interp* interp, Axis* axisPtr,
- int objc, Tcl_Obj* const objv[]);
-extern int AxisLimitsOp(Tcl_Interp* interp, Axis* axisPtr,
- int objc, Tcl_Obj* const objv[]);
-extern int AxisMarginOp(Tcl_Interp* interp, Axis* axisPtr,
- int objc, Tcl_Obj* const objv[]);
-extern int AxisTransformOp(Tcl_Interp* interp, Axis* axisPtr,
- int objc, Tcl_Obj* const objv[]);
-extern int AxisTypeOp(Tcl_Interp* interp, Axis* axisPtr,
- int objc, Tcl_Obj* const objv[]);
-extern int AxisViewOp(Tcl_Interp* interp, Axis* axisPtr,
+extern int Blt_AxisOp(Graph* graphPtr, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[]);
extern Tcl_FreeProc FreeAxis;
-extern double AdjustViewport(double offset, double windowSize);
extern int GetAxisFromObj(Tcl_Interp* interp, Graph* graphPtr, Tcl_Obj *objPtr,
Axis **axisPtrPtr);
-extern int AxisObjConfigure(Tcl_Interp* interp, Axis* axis,
- int objc, Tcl_Obj* const objv[]);
extern void Blt_ResetAxes(Graph* graphPtr);
extern void Blt_MapAxes(Graph* graphPtr);
diff --git a/src/bltGrXAxisOp.C b/src/bltGrXAxisOp.C
index 4592292..4ec5d6c 100644
--- a/src/bltGrXAxisOp.C
+++ b/src/bltGrXAxisOp.C
@@ -35,9 +35,27 @@ extern "C" {
#include "bltGrAxis.h"
#include "bltGrAxisOp.h"
+extern int AxisCgetOp(Tcl_Interp* interp, Axis* axisPtr,
+ int objc, Tcl_Obj* const objv[]);
+extern int AxisConfigureOp(Tcl_Interp* interp, Axis* axisPtr,
+ int objc, Tcl_Obj* const objv[]);
+extern int AxisActivateOp(Tcl_Interp* interp, Axis* axisPtr,
+ int objc, Tcl_Obj* const objv[]);
+extern int AxisInvTransformOp(Tcl_Interp* interp, Axis* axisPtr,
+ int objc, Tcl_Obj* const objv[]);
+extern int AxisLimitsOp(Tcl_Interp* interp, Axis* axisPtr,
+ int objc, Tcl_Obj* const objv[]);
+extern int AxisMarginOp(Tcl_Interp* interp, Axis* axisPtr,
+ int objc, Tcl_Obj* const objv[]);
+extern int AxisTransformOp(Tcl_Interp* interp, Axis* axisPtr,
+ int objc, Tcl_Obj* const objv[]);
+extern int AxisTypeOp(Tcl_Interp* interp, Axis* axisPtr,
+ int objc, Tcl_Obj* const objv[]);
+extern int AxisViewOp(Tcl_Interp* interp, Axis* axisPtr,
+ int objc, Tcl_Obj* const objv[]);
+
static int lastMargin;
-// Default
int Blt_CreateAxes(Graph* graphPtr)
{
diff --git a/src/bltGraph.C b/src/bltGraph.C
index d1d8eb8..db2759c 100644
--- a/src/bltGraph.C
+++ b/src/bltGraph.C
@@ -40,7 +40,6 @@ extern "C" {
#include "bltGrAxis.h"
#include "bltGrAxisOp.h"
#include "bltGrXAxisOp.h"
-#include "bltGrVAxisOp.h"
#include "bltGrPen.h"
#include "bltGrPenOp.h"
#include "bltGrElem.h"
@@ -870,7 +869,7 @@ static int TransformOp(Graph* graphPtr, Tcl_Interp* interp, int objc,
static Blt_OpSpec graphOps[] =
{
- {"axis", 1, (void*)Blt_VAxisOp, 2, 0, "oper ?args?",},
+ {"axis", 1, (void*)Blt_AxisOp, 2, 0, "oper ?args?",},
{"bar", 2, (void*)BarOp, 2, 0, "oper ?args?",},
{"cget", 2, (void*)CgetOp, 3, 3, "option",},
{"configure", 2, (void*)ConfigureOp, 2, 0, "?option value?...",},