From 095d3b27e3e190ab35a2e5bce63e3b4ccf87ce34 Mon Sep 17 00:00:00 2001 From: joye Date: Mon, 14 Apr 2014 19:24:28 +0000 Subject: *** empty log message *** --- configure | 1 - configure.in | 1 - src/bltGrAxis.h | 4 - src/bltGrAxisOp.C | 293 ++++++++++++++++++++++++++++++++++++++++++++++++++++- src/bltGrAxisOp.h | 21 +--- src/bltGrXAxisOp.C | 20 +++- src/bltGraph.C | 3 +- 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; iiname(), 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?...",}, -- cgit v0.12