From e4521220d9623f9e00ff1a5f1497665c956b1387 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adri=C3=A1n=20Medra=C3=B1o=20Calvo?=
 <adrian@medranocalvo.com>
Date: Fri, 28 Jul 2017 11:54:54 +0200
Subject: Add -tickformat axis option, rename -command option to
 -tickformatcommand

---
 doc/graph.html        | 42 +++++++++++++++++++++++++-----------------
 doc/graph.n           | 38 +++++++++++++++++++++++---------------
 generic/tkbltGrAxis.C | 22 +++++++++++++++-------
 generic/tkbltGrAxis.h |  4 +++-
 4 files changed, 66 insertions(+), 40 deletions(-)

diff --git a/doc/graph.html b/doc/graph.html
index 412c817..70f1e6f 100644
--- a/doc/graph.html
+++ b/doc/graph.html
@@ -438,23 +438,6 @@
                      Sets the color of the axis and tick labels.  The  default
                      is black.
 
-              <B>-command</B> <I>prefix</I>
-                     Specifies a Tcl command to be invoked when formatting the
-                     axis tick labels. <I>Prefix</I> is a string containing the  name
-                     of  a Tcl proc and any extra arguments for the procedure.
-                     This command is invoked for each major tick on the  axis.
-                     Two additional arguments are passed to the procedure: the
-                     pathname of the widget and the current the numeric  value
-                     of  the  tick.   The procedure returns the formatted tick
-                     label.  If "" is returned, no label will appear  next  to
-                     the  tick.  You can get the standard tick labels again by
-                     setting <I>prefix</I> to "".  The default is "".
-
-                     Please note that this  procedure  is  invoked  while  the
-                     graph  is  redrawn.  You may query configuration options.
-                     But  do  not  them,  because  this  can  have  unexpected
-                     results.
-
               <B>-descending</B> <I>boolean</I>
                      Indicates whether the values along the axis are monotoni-
                      cally increasing or decreasing.  If <I>boolean</I> is true,  the
@@ -542,6 +525,31 @@
                      Specifies the font for axis tick labels. The  default  is
                      *-Courier-Bold-R-Normal-*-100-*.
 
+              <B>-tickformat</B> <I>formatStr</I>
+                     Specifies a printf-like description to format teh axis
+                     tick labels.  You can get the standard tick labels again by
+                     setting <I>formatStr</I> to "".  The default is "".
+
+              <B>-tickformatcommand</B>, <B>-command</B> <I>prefix</I>
+                     Specifies a Tcl command to be invoked when formatting the
+                     axis tick labels. <I>Prefix</I> is a string containing the  name
+                     of  a Tcl proc and any extra arguments for the procedure.
+                     This command is invoked for each major tick on the  axis.
+                     Two additional arguments are passed to the procedure: the
+                     pathname of the widget and the current the numeric  value
+                     of  the  tick.   The procedure returns the formatted tick
+                     label.  If "" is returned, no label will appear  next  to
+                     the  tick.  You can get the standard tick labels again by
+                     setting <I>prefix</I> to "".  The default is "".
+
+                     The numeric value for the tick might change when using the
+                     <B>-logscale</B> and <B>-tickformat</B> options.
+
+                     Please note that this  procedure  is  invoked  while  the
+                     graph  is  redrawn.  You may query configuration options.
+                     But  do  not  them,  because  this  can  have  unexpected
+                     results.
+
               <B>-ticklength</B> <I>pixels</I>
                      Sets the length of major and minor ticks (minor ticks are
                      half the length of major ticks). If <I>pixels</I> is  less  than
diff --git a/doc/graph.n b/doc/graph.n
index 72df726..fbbbb9b 100644
--- a/doc/graph.n
+++ b/doc/graph.n
@@ -686,21 +686,6 @@ the element is always the first tag in the list.  The default value is
 Sets the color of the axis and tick labels.
 The default is \f(CWblack\fR.
 .TP
-\fB\-command \fIprefix\fR
-Specifies a Tcl command to be invoked when formatting the axis tick
-labels. \fIPrefix\fR is a string containing the name of a Tcl proc and
-any extra arguments for the procedure.  This command is invoked for each
-major tick on the axis.  Two additional arguments are passed to the
-procedure: the pathname of the widget and the current the numeric
-value of the tick.  The procedure returns the formatted tick label.  If
-\f(CW""\fR is returned, no label will appear next to the tick.  You can
-get the standard tick labels again by setting \fIprefix\fR to
-\f(CW""\fR.  The default is \f(CW""\fR.
-.sp 1
-Please note that this procedure is invoked while the graph is redrawn.
-You may query configuration options.  But do not them, because this
-can have unexpected results.
-.TP
 \fB\-descending \fIboolean\fR 
 Indicates whether the values along the axis are monotonically increasing or
 decreasing.  If \fIboolean\fR is true, the axis values will be
@@ -810,6 +795,29 @@ displayed.  The default is \f(CW2\fR.
 Specifies the font for axis tick labels. The default is
 \f(CW*-Courier-Bold-R-Normal-*-100-*\fR.
 .TP
+\fB\-tickformat\fR \fIformatStr\fR
+Specifies a printf-like description to format teh axis
+tick labels.  You can get the standard tick labels again by
+setting \fIformatStr\fR to \f(CW""\fR.  The default is \f(CW""\fR.
+.TP
+\fB\-tickformatcommand\fR, \fB\-command \fIprefix\fR
+Specifies a Tcl command to be invoked when formatting the axis tick
+labels. \fIPrefix\fR is a string containing the name of a Tcl proc and
+any extra arguments for the procedure.  This command is invoked for each
+major tick on the axis.  Two additional arguments are passed to the
+procedure: the pathname of the widget and the current the numeric
+value of the tick.  The procedure returns the formatted tick label.  If
+\f(CW""\fR is returned, no label will appear next to the tick.  You can
+get the standard tick labels again by setting \fIprefix\fR to
+\f(CW""\fR.  The default is \f(CW""\fR.
+.sp 1
+The numeric value for the tick might change when using the
+\fB\-logscale\fR and \fB\-tickformat\fR options.
+.sp 1
+Please note that this procedure is invoked while the graph is redrawn.
+You may query configuration options.  But do not them, because this
+can have unexpected results.
+.TP
 \fB\-ticklength \fIpixels\fR
 Sets the length of major and minor ticks (minor ticks are half the
 length of major ticks). If \fIpixels\fR is less than zero, the axis
diff --git a/generic/tkbltGrAxis.C b/generic/tkbltGrAxis.C
index a9cb879..bac6316 100644
--- a/generic/tkbltGrAxis.C
+++ b/generic/tkbltGrAxis.C
@@ -84,8 +84,8 @@ static Tk_OptionSpec optionSpecs[] = {
   {TK_OPTION_COLOR, "-color", "color", "Color",
    STD_NORMAL_FOREGROUND, -1, Tk_Offset(AxisOptions, tickColor), 
    0, NULL, CACHE},
-  {TK_OPTION_STRING, "-command", "command", "Command",
-   NULL, -1, Tk_Offset(AxisOptions, formatCmd), TK_OPTION_NULL_OK, NULL, 0},
+  {TK_OPTION_SYNONYM, "-command", NULL, NULL,
+   NULL, 0, -1, 0, (ClientData)"-tickformatcommand", 0},
   {TK_OPTION_BOOLEAN, "-descending", "descending", "Descending",
    "no", -1, Tk_Offset(AxisOptions, descending), 0, NULL, RESET},
   {TK_OPTION_BOOLEAN, "-exterior", "exterior", "exterior",
@@ -179,6 +179,10 @@ static Tk_OptionSpec optionSpecs[] = {
    "8", -1, Tk_Offset(AxisOptions, tickLength), 0, NULL, LAYOUT},
   {TK_OPTION_INT, "-tickdefault", "tickDefault", "TickDefault",
    "4", -1, Tk_Offset(AxisOptions, reqNumMajorTicks), 0, NULL, RESET},
+  {TK_OPTION_STRING, "-tickformat", "tickFormat", "TickFormat",
+   NULL, -1, Tk_Offset(AxisOptions, tickFormat), TK_OPTION_NULL_OK, NULL, 0},
+  {TK_OPTION_STRING, "-tickformatcommand", "tickformatcommand", "TickFormatCommand",
+   NULL, -1, Tk_Offset(AxisOptions, tickFormatCmd), TK_OPTION_NULL_OK, NULL, 0},
   {TK_OPTION_STRING, "-title", "title", "Title",
    NULL, -1, Tk_Offset(AxisOptions, title), TK_OPTION_NULL_OK, NULL, LAYOUT},
   {TK_OPTION_BOOLEAN, "-titlealternate", "titleAlternate", "TitleAlternate",
@@ -1032,12 +1036,16 @@ TickLabel* Axis::makeLabel(double value)
   AxisOptions* ops = (AxisOptions*)ops_;
 
   char string[TICK_LABEL_SIZE + 1];
-  if (ops->logScale)
+
+  if (ops->tickFormat && *ops->tickFormat) {
+    snprintf(string, TICK_LABEL_SIZE, ops->tickFormat, value);
+  } else if (ops->logScale) {
     snprintf(string, TICK_LABEL_SIZE, "1E%d", int(value));
-  else
-    snprintf(string, TICK_LABEL_SIZE, "%.*G", 15, value);
+  } else {
+    snprintf(string, TICK_LABEL_SIZE, "%.15G", value);
+  }
 
-  if (ops->formatCmd) {
+  if (ops->tickFormatCmd) {
     Tcl_Interp* interp = graphPtr_->interp_;
     Tk_Window tkwin = graphPtr_->tkwin_;
 
@@ -1045,7 +1053,7 @@ TickLabel* Axis::makeLabel(double value)
     // name of the widget and the default tick label as arguments when
     // invoking it. Copy and save the new label from interp->result.
     Tcl_ResetResult(interp);
-    if (Tcl_VarEval(interp, ops->formatCmd, " ", Tk_PathName(tkwin),
+    if (Tcl_VarEval(interp, ops->tickFormatCmd, " ", Tk_PathName(tkwin),
 		    " ", string, NULL) != TCL_OK) {
       Tcl_BackgroundError(interp);
     }
diff --git a/generic/tkbltGrAxis.h b/generic/tkbltGrAxis.h
index 90a1165..d459e8c 100644
--- a/generic/tkbltGrAxis.h
+++ b/generic/tkbltGrAxis.h
@@ -114,7 +114,7 @@ namespace Blt {
     int showTicks;
 
     double windowSize;
-    const char *formatCmd;
+    const char *tickFormatCmd;
     int descending;
     int labelOffset;
     TextStyleOptions limitsTextStyle;
@@ -153,6 +153,8 @@ namespace Blt {
     Tk_Font tickFont;
     Tk_Font titleFont;
     XColor* titleColor;
+
+    const char *tickFormat;
   } AxisOptions;
 
   class Axis {
-- 
cgit v0.12