aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/cdk.patch
diff options
context:
space:
mode:
authorGravatar mitchell <70453897+667e-11@users.noreply.github.com>2013-06-14 09:52:48 -0400
committerGravatar mitchell <70453897+667e-11@users.noreply.github.com>2013-06-14 09:52:48 -0400
commitbd287b5413e970e98d6b80c82d81cbeafdd6d756 (patch)
treefed68e0522f5f087c13ca086c4bfbd1f020e6c75 /src/cdk.patch
parent8f39176328e6e8610a338d014c1893fbd7edf2c0 (diff)
New makefile rules for preparing build environments on various platforms.
Diffstat (limited to 'src/cdk.patch')
-rw-r--r--src/cdk.patch6649
1 files changed, 6649 insertions, 0 deletions
diff --git a/src/cdk.patch b/src/cdk.patch
new file mode 100644
index 00000000..d9ae6242
--- /dev/null
+++ b/src/cdk.patch
@@ -0,0 +1,6649 @@
+diff -r fbcff989cc14 cdk.c
+--- a/cdk.c Thu Jun 13 12:05:08 2013 -0400
++++ b/cdk.c Thu Jun 13 12:10:44 2013 -0400
+@@ -1263,7 +1263,7 @@
+ * less than the provided word. At this point we will set the index
+ * to the current position. If 'ret' is greater than 0, then the
+ * current word is alphabetically greater than the given word. We
+- * should return with index, which might contain the last best match.
++ * should return with index, which might contain the last best match.
+ * If they are equal, then we've found it.
+ */
+ if (ret < 0)
+@@ -1335,7 +1335,7 @@
+ for (x = pathLen - 1; x != 0; --x)
+ {
+ /* Find the last '/' in the pathname. */
+- if (pathname[x] == '/')
++ if (pathname[x] == '/' || pathname[x] == '\\')
+ {
+ strcpy (base, pathname + x + 1);
+ break;
+@@ -1362,7 +1362,7 @@
+ && (pathLen = strlen (pathname)) != 0)
+ {
+ x = pathLen;
+- while ((dir[x] != '/') && (x > 0))
++ while ((dir[x] != '/' && dir[x] != '\\') && (x > 0))
+ {
+ dir[x--] = '\0';
+ }
+diff -r fbcff989cc14 cdk.h
+--- a/cdk.h Thu Jun 13 12:05:08 2013 -0400
++++ b/cdk.h Thu Jun 13 12:10:44 2013 -0400
+@@ -226,6 +226,10 @@
+ */
+ typedef enum {vEARLY_EXIT, vESCAPE_HIT, vNORMAL, vNEVER_ACTIVATED, vERROR} EExitType;
+
++#if _WIN32
++#define boolean CDKboolean
++#endif
++
+ /*
+ * This defines a boolean type.
+ */
+@@ -300,7 +304,7 @@
+ #include <itemlist.h>
+ #include <label.h>
+ #include <marquee.h>
+-#include <matrix.h>
++//#include <matrix.h>
+ #include <mentry.h>
+ #include <menu.h>
+ #include <radio.h>
+@@ -308,21 +312,21 @@
+ #include <selection.h>
+ #include <swindow.h>
+ #include <template.h>
+-#include <viewer.h>
++//#include <viewer.h>
+ #include <traverse.h>
+ #include <button.h>
+
+ /*
+ * Generated headers:
+ */
+-#include <dscale.h>
+-#include <fscale.h>
+-#include <scale.h>
+-#include <uscale.h>
+-
+-#include <fslider.h>
+-#include <slider.h>
+-#include <uslider.h>
++//#include <dscale.h>
++//#include <fscale.h>
++//#include <scale.h>
++//#include <uscale.h>
++//
++//#include <fslider.h>
++//#include <slider.h>
++//#include <uslider.h>
+
+ /*
+ * Low-level object drawing
+diff -r fbcff989cc14 cdk_config.h
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ b/cdk_config.h Thu Jun 13 12:10:44 2013 -0400
+@@ -0,0 +1,67 @@
++/* include/cdk_config.h. Generated automatically by configure. */
++/*
++ * $Id: config.hin,v 1.2 2000/01/17 14:48:19 tom Exp $
++ */
++
++#ifndef CDK_CONFIG_H
++#define CDK_CONFIG_H 1
++
++
++#define CC_HAS_PROTOS 1
++#define CDK_CONST /*nothing*/
++#define CDK_CSTRING CDK_CONST char *
++#define CDK_CSTRING2 CDK_CONST char * CDK_CONST *
++#define CDK_PATCHDATE 20120323
++#define CDK_VERSION "5.0"
++#define HAVE_DIRENT_H 1
++#define HAVE_GETBEGX 1
++#define HAVE_GETBEGY 1
++#define HAVE_GETCWD 1
++#define HAVE_GETLOGIN 1
++#define HAVE_GETMAXX 1
++#define HAVE_GETMAXY 1
++#define HAVE_GETOPT_H 1
++#define HAVE_GETOPT_HEADER 1
++#if !_WIN32
++#define HAVE_GRP_H 1
++#endif
++#define HAVE_INTTYPES_H 1
++#define HAVE_LIMITS_H 1
++#if !_WIN32
++#define HAVE_LSTAT 1
++#endif
++#define HAVE_MEMORY_H 1
++#define HAVE_MKTIME 1
++//#define HAVE_NCURSES_H 1
++#if !_WIN32
++#define HAVE_PWD_H 1
++#endif
++#define HAVE_SETLOCALE 1
++#define HAVE_SLEEP 1
++#define HAVE_START_COLOR 1
++#define HAVE_STDINT_H 1
++#define HAVE_STDLIB_H 1
++#define HAVE_STRDUP 1
++#define HAVE_STRERROR 1
++#define HAVE_STRINGS_H 1
++#define HAVE_STRING_H 1
++#define HAVE_SYS_STAT_H 1
++#define HAVE_SYS_TYPES_H 1
++#define HAVE_TERM_H 1
++#define HAVE_TYPE_CHTYPE 1
++#define HAVE_UNCTRL_H 1
++#define HAVE_UNISTD_H 1
++#define MIXEDCASE_FILENAMES 1
++//#define NCURSES 1
++#define NCURSES_OPAQUE 0
++#define PACKAGE "cdk"
++#define STDC_HEADERS 1
++#define SYSTEM_NAME "linux-gnu"
++#define TYPE_CHTYPE_IS_SCALAR 1
++#define setbegyx(win,y,x) ((win)->_begy = (y), (win)->_begx = (x), OK)
++
++#if !defined(HAVE_LSTAT) && !defined(lstat)
++#define lstat(f,b) stat(f,b)
++#endif
++
++#endif /* CDK_CONFIG_H */
+diff -r fbcff989cc14 cdk_util.h
+--- a/cdk_util.h Thu Jun 13 12:05:08 2013 -0400
++++ b/cdk_util.h Thu Jun 13 12:10:44 2013 -0400
+@@ -53,6 +53,10 @@
+ * SUCH DAMAGE.
+ */
+
++#if _WIN32
++#define Beep CDKBeep
++#endif
++
+ /*
+ * This beeps at the user. The standard curses beep() does not
+ * flush the stream, so it will only beep until a force is made.
+diff -r fbcff989cc14 cdk_version.h
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ b/cdk_version.h Thu Jun 13 12:10:44 2013 -0400
+@@ -0,0 +1,56 @@
++/*
++ * $Id: cdk_version.hin,v 1.2 2012/03/20 22:10:36 tom Exp $
++ */
++
++#ifndef CDK_VERSION_H
++#define CDK_VERSION_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*
++ * Copyright 2002,2012 Thomas E. Dickey
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ * must display the following acknowledgment:
++ * This product includes software developed by Thomas E. Dickey
++ * and contributors.
++ * 4. Neither the name of Thomas E. Dickey, nor the names of contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THOMAS E. DICKEY AND CONTRIBUTORS ``AS IS''
++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THOMAS E. DICKEY OR CONTRIBUTORS BE
++ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
++ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
++ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
++ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
++ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
++ * POSSIBILITY OF SUCH DAMAGE.
++ */
++#define CDK_VERSION_MAJOR "5"
++#define CDK_VERSION_MINOR "0"
++#define CDK_VERSION_PATCH "20120323"
++
++/*
++ * Runtime to return the same version information.
++ */
++const char *CDKVersion (void);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* CDK_VERSION_H */
+diff -r fbcff989cc14 fselect.c
+--- a/fselect.c Thu Jun 13 12:05:08 2013 -0400
++++ b/fselect.c Thu Jun 13 12:10:44 2013 -0400
+@@ -1104,7 +1104,7 @@
+
+ static char *make_pathname (const char *directory, const char *filename)
+ {
+- size_t need = strlen (filename) + 2;
++ size_t need = strlen (filename) + 3;
+ bool root = (strcmp (directory, "/") == 0);
+ char *result;
+
+@@ -1316,6 +1316,7 @@
+ */
+ void deleteFileCB (EObjectType objectType GCC_UNUSED, void *object, void *clientData)
+ {
++#if 0
+ CDKSCROLL *fscroll = (CDKSCROLL *)object;
+ CDKFSELECT *fselect = (CDKFSELECT *)clientData;
+ const char *buttons[] =
+@@ -1374,6 +1375,7 @@
+
+ /* Redraw the file selector. */
+ drawCDKFselect (fselect, ObjOf (fselect)->box);
++#endif
+ }
+
+ /*
+diff -r fbcff989cc14 gen-scale.c
+--- a/gen-scale.c Thu Jun 13 12:05:08 2013 -0400
++++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+@@ -1,817 +0,0 @@
+-#include <cdk_int.h>
+-
+-/*
+- * $Author: tom $
+- * $Date: 2012/03/20 21:46:08 $
+- * $Revision: 1.23 $
+- */
+-
+-/*
+- * Declare file local prototypes.
+- */
+-static void drawCDK<MIXED>Field (CDK<UPPER> * widget);
+-
+-DeclareCDKObjects (<UPPER>, <MIXED>, setCdk, <DTYPE>);
+-
+-/*
+- * This function creates a widget.
+- */
+-CDK<UPPER> *newCDK<MIXED> (CDKSCREEN *cdkscreen,
+- int xplace,
+- int yplace,
+- const char *title,
+- const char *label,
+- chtype fieldAttr,
+- int fieldWidth,
+- <CTYPE> start,
+- <CTYPE> low,
+- <CTYPE> high,
+- <CTYPE> inc,
+- <CTYPE> fastInc,
+-#if <FLOAT>
+- int digits,
+-#endif <FLOAT>
+- boolean Box,
+- boolean shadow)
+-{
+- /* *INDENT-EQLS* */
+- CDK<UPPER> *widget = 0;
+- int parentWidth = getmaxx (cdkscreen->window);
+- int parentHeight = getmaxy (cdkscreen->window);
+- int boxHeight;
+- int boxWidth;
+- int horizontalAdjust, oldWidth;
+- int xpos = xplace;
+- int ypos = yplace;
+- int x, junk;
+- /* *INDENT-OFF* */
+- static const struct { int from; int to; } bindings[] = {
+- { 'u', KEY_UP },
+- { 'U', KEY_PPAGE },
+- { CDK_BACKCHAR, KEY_PPAGE },
+- { CDK_FORCHAR, KEY_NPAGE },
+- { 'g', KEY_HOME },
+- { '^', KEY_HOME },
+- { 'G', KEY_END },
+- { '$', KEY_END },
+- };
+- /* *INDENT-ON* */
+-
+-
+- if ((widget = newCDKObject (CDK<UPPER>, &my_funcs)) == 0)
+- return (0);
+-
+- setCDK<MIXED>Box (widget, Box);
+-
+- boxHeight = (BorderOf (widget) * 2) + 1;
+- boxWidth = fieldWidth + 2 * BorderOf (widget);
+-
+- /* Set some basic values of the widget's data field. */
+- widget->label = 0;
+- widget->labelLen = 0;
+- widget->labelWin = 0;
+-
+- /*
+- * If the fieldWidth is a negative value, the fieldWidth will
+- * be COLS-fieldWidth, otherwise, the fieldWidth will be the
+- * given width.
+- */
+- fieldWidth = setWidgetDimension (parentWidth, fieldWidth, 0);
+- boxWidth = fieldWidth + 2 * BorderOf (widget);
+-
+- /* Translate the label char *pointer to a chtype pointer. */
+- if (label != 0)
+- {
+- widget->label = char2Chtype (label, &widget->labelLen, &junk);
+- boxWidth = widget->labelLen + fieldWidth + 2;
+- }
+-
+- oldWidth = boxWidth;
+- boxWidth = setCdkTitle (ObjOf (widget), title, boxWidth);
+- horizontalAdjust = (boxWidth - oldWidth) / 2;
+-
+- boxHeight += TitleLinesOf (widget);
+-
+- /*
+- * Make sure we didn't extend beyond the dimensions of the window.
+- */
+- boxWidth = (boxWidth > parentWidth ? parentWidth : boxWidth);
+- boxHeight = (boxHeight > parentHeight ? parentHeight : boxHeight);
+- fieldWidth = (fieldWidth > (boxWidth - widget->labelLen - 2 * BorderOf (widget))
+- ? (boxWidth - widget->labelLen - 2 * BorderOf (widget))
+- : fieldWidth);
+-
+- /* Rejustify the x and y positions if we need to. */
+- alignxy (cdkscreen->window, &xpos, &ypos, boxWidth, boxHeight);
+-
+- /* Make the widget's window. */
+- widget->win = newwin (boxHeight, boxWidth, ypos, xpos);
+-
+- /* Is the main window null??? */
+- if (widget->win == 0)
+- {
+- destroyCDKObject (widget);
+- return (0);
+- }
+-
+- /* Create the widget's label window. */
+- if (widget->label != 0)
+- {
+- widget->labelWin = subwin (widget->win,
+- 1, widget->labelLen,
+- ypos + TitleLinesOf (widget) + BorderOf (widget),
+- xpos + horizontalAdjust + BorderOf (widget));
+- if (widget->labelWin == 0)
+- {
+- destroyCDKObject (widget);
+- return (0);
+- }
+- }
+-
+- /* Create the widget's data field window. */
+- widget->fieldWin = subwin (widget->win,
+- 1, fieldWidth,
+- (ypos + TitleLinesOf (widget) + BorderOf (widget)),
+- (xpos
+- + widget->labelLen
+- + horizontalAdjust
+- + BorderOf (widget)));
+- if (widget->fieldWin == 0)
+- {
+- destroyCDKObject (widget);
+- return (0);
+- }
+- keypad (widget->fieldWin, TRUE);
+- keypad (widget->win, TRUE);
+-
+- /* *INDENT-EQLS* Create the widget's data field. */
+- ScreenOf (widget) = cdkscreen;
+- widget->parent = cdkscreen->window;
+- widget->shadowWin = 0;
+- widget->boxWidth = boxWidth;
+- widget->boxHeight = boxHeight;
+- widget->fieldWidth = fieldWidth;
+- widget->fieldAttr = (chtype)fieldAttr;
+- widget->current = low;
+- widget->low = low;
+- widget->high = high;
+- widget->current = start;
+- widget->inc = inc;
+- widget->fastinc = fastInc;
+-#if <FLOAT>
+- widget->digits = digits;
+-#endif <FLOAT>
+- initExitType (widget);
+- ObjOf (widget)->acceptsFocus = TRUE;
+- ObjOf (widget)->inputWindow = widget->win;
+- widget->shadow = shadow;
+-
+- /* Do we want a shadow??? */
+- if (shadow)
+- {
+- widget->shadowWin = newwin (boxHeight, boxWidth, ypos + 1, xpos + 1);
+- if (widget->shadowWin == 0)
+- {
+- destroyCDKObject (widget);
+- return (0);
+- }
+- }
+-
+- /* Setup the key bindings. */
+- for (x = 0; x < (int)SIZEOF (bindings); ++x)
+- bindCDKObject (v<UPPER>,
+- widget,
+- (chtype) bindings[x].from,
+- getcCDKBind,
+- (void *)(long)bindings[x].to);
+-
+- registerCDKObject (cdkscreen, v<UPPER>, widget);
+-
+- return (widget);
+-}
+-
+-/*
+- * This allows the person to use the widget's data field.
+- */
+-<CTYPE> activateCDK<MIXED> (CDK<UPPER> * widget, chtype *actions)
+-{
+- <CTYPE> ret;
+-
+- /* Draw the widget. */
+- drawCDK<MIXED> (widget, ObjOf (widget)->box);
+-
+- if (actions == 0)
+- {
+- chtype input = 0;
+- boolean functionKey;
+-
+- for (;;)
+- {
+- input = (chtype) getchCDKObject (ObjOf (widget), &functionKey);
+-
+- /* Inject the character into the widget. */
+- ret = (<CTYPE>) injectCDK<MIXED> (widget, input);
+- if (widget->exitType != vEARLY_EXIT)
+- {
+- return ret;
+- }
+- }
+- }
+- else
+- {
+- int length = chlen (actions);
+- int x = 0;
+-
+- /* Inject each character one at a time. */
+- for (x = 0; x < length; x++)
+- {
+- ret = (<CTYPE>) injectCDK<MIXED> (widget, actions[x]);
+- if (widget->exitType != vEARLY_EXIT)
+- {
+- return ret;
+- }
+- }
+- }
+-
+- /* Set the exit type and return. */
+- setExitType (widget, 0);
+- return unknown<DTYPE>;
+-}
+-
+-/*
+- * Check if the value lies outside the low/high range. If so, force it in.
+- */
+-static void limitCurrentValue (CDK<UPPER> * widget)
+-{
+- if (widget->current < widget->low)
+- {
+- widget->current = widget->low;
+- Beep ();
+- }
+- else if (widget->current > widget->high)
+- {
+- widget->current = widget->high;
+- Beep ();
+- }
+-}
+-
+-/*
+- * Move the cursor to the given edit-position.
+- */
+-static int moveToEditPosition (CDK<UPPER> * widget, int newPosition)
+-{
+- return wmove (widget->fieldWin, 0, widget->fieldWidth - newPosition - 1);
+-}
+-
+-/*
+- * Check if the cursor is on a valid edit-position. This must be one of
+- * the non-blank cells in the field.
+- */
+-static int validEditPosition (CDK<UPPER> * widget, int newPosition)
+-{
+- chtype ch;
+- if (newPosition <= 0 || newPosition >= widget->fieldWidth)
+- return FALSE;
+- if (moveToEditPosition (widget, newPosition) == ERR)
+- return FALSE;
+- ch = winch (widget->fieldWin);
+- if (CharOf (ch) != ' ')
+- return TRUE;
+- if (newPosition > 1)
+- {
+- /* don't use recursion - only one level is wanted */
+- if (moveToEditPosition (widget, newPosition - 1) == ERR)
+- return FALSE;
+- ch = winch (widget->fieldWin);
+- return CharOf (ch) != ' ';
+- }
+- return FALSE;
+-}
+-
+-/*
+- * Set the edit position. Normally the cursor is one cell to the right of
+- * the editable field. Moving it left, over the field allows the user to
+- * modify cells by typing in replacement characters for the field's value.
+- */
+-static void setEditPosition (CDK<UPPER> * widget, int newPosition)
+-{
+- if (newPosition < 0)
+- {
+- Beep ();
+- }
+- else if (newPosition == 0)
+- {
+- widget->fieldEdit = newPosition;
+- }
+- else if (validEditPosition (widget, newPosition))
+- {
+- widget->fieldEdit = newPosition;
+- }
+- else
+- {
+- Beep ();
+- }
+-}
+-
+-/*
+- * Remove the character from the string at the given column, if it is blank.
+- * Returns true if a change was made.
+- */
+-static bool removeChar (char *string, int col)
+-{
+- bool result = FALSE;
+-
+- if ((col >= 0) && (string[col] != ' '))
+- {
+- while (string[col] != '\0')
+- {
+- string[col] = string[col + 1];
+- ++col;
+- }
+- result = TRUE;
+- }
+- return result;
+-}
+-
+-/*
+- * Perform an editing function for the field.
+- */
+-static bool performEdit (CDK<UPPER> * widget, chtype input)
+-{
+- bool result = FALSE;
+- bool modify = TRUE;
+- int base = 0;
+- int need = widget->fieldWidth;
+- char *temp = (char *)malloc ((size_t) need + 2);
+- char test;
+- int col = need - widget->fieldEdit - 1;
+-#if <FLOAT>
+- double value;
+-#define SCANF_FMT "%lg%c"
+-#endif <FLOAT>
+-#if <INT>
+- <CTYPE> value;
+-#define SCANF_FMT "%<PRINT>%c"
+-#endif <INT>
+-
+- if (temp != 0)
+- {
+- wmove (widget->fieldWin, 0, base);
+- winnstr (widget->fieldWin, temp, need);
+- strcpy (temp + need, " ");
+- if (isChar (input)) /* replace the char at the cursor */
+- {
+- temp[col] = (char) (input);
+- }
+- else if (input == KEY_BACKSPACE) /* delete the char before the cursor */
+- {
+- modify = removeChar (temp, col - 1);
+- }
+- else if (input == KEY_DC) /* delete the char at the cursor */
+- {
+- modify = removeChar (temp, col);
+- }
+- else
+- {
+- modify = FALSE;
+- }
+- if (modify
+- && sscanf (temp, SCANF_FMT, &value, &test) == 2
+- && test == ' '
+- && value >= widget->low
+- && value <= widget->high)
+- {
+- setCDK<MIXED>Value (widget, (<CTYPE>) value);
+- result = TRUE;
+- }
+- free (temp);
+- }
+- return result;
+-}
+-
+-#define Decrement(value,by) if (value - by < value) value -= by
+-#define Increment(value,by) if (value + by > value) value += by
+-
+-/*
+- * This function injects a single character into the widget.
+- */
+-static int _injectCDK<MIXED> (CDKOBJS *object, chtype input)
+-{
+- CDK<UPPER> *widget = (CDK<UPPER> *) object;
+- int ppReturn = 1;
+- <CTYPE> ret = unknown<DTYPE>;
+- bool complete = FALSE;
+-
+- /* Set the exit type. */
+- setExitType (widget, 0);
+-
+- /* Draw the field. */
+- drawCDK<MIXED>Field (widget);
+-
+- /* Check if there is a pre-process function to be called. */
+- if (PreProcessFuncOf (widget) != 0)
+- {
+- /* Call the pre-process function. */
+- ppReturn = PreProcessFuncOf (widget) (v<UPPER>,
+- widget,
+- PreProcessDataOf (widget),
+- input);
+- }
+-
+- /* Should we continue? */
+- if (ppReturn != 0)
+- {
+- /* Check for a key binding. */
+- if (checkCDKObjectBind (v<UPPER>, widget, input) != 0)
+- {
+- checkEarlyExit (widget);
+- complete = TRUE;
+- }
+- else
+- {
+- switch (input)
+- {
+- case KEY_LEFT:
+- setEditPosition (widget, widget->fieldEdit + 1);
+- break;
+-
+- case KEY_RIGHT:
+- setEditPosition (widget, widget->fieldEdit - 1);
+- break;
+-
+- case KEY_DOWN:
+- Decrement (widget->current, widget->inc);
+- break;
+-
+- case KEY_UP:
+- Increment (widget->current, widget->inc);
+- break;
+-
+- case KEY_PPAGE:
+- Increment (widget->current, widget->fastinc);
+- break;
+-
+- case KEY_NPAGE:
+- Decrement (widget->current, widget->fastinc);
+- break;
+-
+- case KEY_HOME:
+- widget->current = widget->low;
+- break;
+-
+- case KEY_END:
+- widget->current = widget->high;
+- break;
+-
+- case KEY_TAB:
+- case KEY_ENTER:
+- setExitType (widget, input);
+- ret = (widget->current);
+- complete = TRUE;
+- break;
+-
+- case KEY_ESC:
+- setExitType (widget, input);
+- complete = TRUE;
+- break;
+-
+- case KEY_ERROR:
+- setExitType (widget, input);
+- complete = TRUE;
+- break;
+-
+- case CDK_REFRESH:
+- eraseCDKScreen (ScreenOf (widget));
+- refreshCDKScreen (ScreenOf (widget));
+- break;
+-
+- default:
+- if (widget->fieldEdit)
+- {
+- if (!performEdit (widget, input))
+- Beep ();
+- }
+- else
+- {
+- /*
+- * The cursor is not within the editable text. Interpret
+- * input as commands.
+- */
+- switch (input)
+- {
+- case 'd':
+- case '-':
+- return _injectCDK<MIXED> (object, KEY_DOWN);
+- case '+':
+- return _injectCDK<MIXED> (object, KEY_UP);
+- case 'D':
+- return _injectCDK<MIXED> (object, KEY_NPAGE);
+- case '0':
+- return _injectCDK<MIXED> (object, KEY_HOME);
+- default:
+- Beep ();
+- break;
+- }
+- }
+- break;
+- }
+- }
+- limitCurrentValue (widget);
+-
+- /* Should we call a post-process? */
+- if (!complete && (PostProcessFuncOf (widget) != 0))
+- {
+- PostProcessFuncOf (widget) (v<UPPER>,
+- widget,
+- PostProcessDataOf (widget),
+- input);
+- }
+- }
+-
+- if (!complete)
+- {
+- drawCDK<MIXED>Field (widget);
+- setExitType (widget, 0);
+- }
+-
+- ResultOf (widget).value<DTYPE> = ret;
+- return (ret != unknown<DTYPE>);
+-}
+-
+-/*
+- * This moves the widget's data field to the given location.
+- */
+-static void _moveCDK<MIXED> (CDKOBJS *object,
+- int xplace,
+- int yplace,
+- boolean relative,
+- boolean refresh_flag)
+-{
+- CDK<UPPER> *widget = (CDK<UPPER> *) object;
+- int currentX = getbegx (widget->win);
+- int currentY = getbegy (widget->win);
+- int xpos = xplace;
+- int ypos = yplace;
+- int xdiff = 0;
+- int ydiff = 0;
+-
+- /*
+- * If this is a relative move, then we will adjust where we want
+- * to move to.
+- */
+- if (relative)
+- {
+- xpos = getbegx (widget->win) + xplace;
+- ypos = getbegy (widget->win) + yplace;
+- }
+-
+- /* Adjust the window if we need to. */
+- alignxy (WindowOf (widget), &xpos, &ypos, widget->boxWidth, widget->boxHeight);
+-
+- /* Get the difference. */
+- xdiff = currentX - xpos;
+- ydiff = currentY - ypos;
+-
+- /* Move the window to the new location. */
+- moveCursesWindow (widget->win, -xdiff, -ydiff);
+- moveCursesWindow (widget->labelWin, -xdiff, -ydiff);
+- moveCursesWindow (widget->fieldWin, -xdiff, -ydiff);
+- moveCursesWindow (widget->shadowWin, -xdiff, -ydiff);
+-
+- /* Touch the windows so they 'move'. */
+- refreshCDKWindow (WindowOf (widget));
+-
+- /* Redraw the window, if they asked for it. */
+- if (refresh_flag)
+- {
+- drawCDK<MIXED> (widget, ObjOf (widget)->box);
+- }
+-}
+-
+-/*
+- * This function draws the widget.
+- */
+-static void _drawCDK<MIXED> (CDKOBJS *object, boolean Box)
+-{
+- CDK<UPPER> *widget = (CDK<UPPER> *) object;
+-
+- /* Draw the shadow. */
+- if (widget->shadowWin != 0)
+- {
+- drawShadow (widget->shadowWin);
+- }
+-
+- /* Box the widget if asked. */
+- if (Box)
+- {
+- drawObjBox (widget->win, ObjOf (widget));
+- }
+-
+- drawCdkTitle (widget->win, object);
+-
+- /* Draw the label. */
+- if (widget->labelWin != 0)
+- {
+- writeChtype (widget->labelWin, 0, 0,
+- widget->label,
+- HORIZONTAL, 0,
+- widget->labelLen);
+- wrefresh (widget->labelWin);
+- }
+- wrefresh (widget->win);
+-
+- /* Draw the field window. */
+- drawCDK<MIXED>Field (widget);
+-}
+-
+-/*
+- * This draws the widget.
+- */
+-static void drawCDK<MIXED>Field (CDK<UPPER> * widget)
+-{
+- char temp[256];
+-
+- werase (widget->fieldWin);
+-
+- /* Draw the value in the field. */
+-#if <FLOAT>
+- {
+- char format[256];
+- int digits = MINIMUM (widget->digits, 30);
+- sprintf (format, "%%.%i<PRINT>", digits);
+- sprintf (temp, format, widget->current);
+- }
+-#endif <FLOAT>
+-#if <INT>
+- sprintf (temp, "%<PRINT>", widget->current);
+-#endif <INT>
+- writeCharAttrib (widget->fieldWin,
+- widget->fieldWidth - (int)strlen (temp) - 1,
+- 0,
+- temp,
+- widget->fieldAttr,
+- HORIZONTAL,
+- 0,
+- (int)strlen (temp));
+-
+- moveToEditPosition (widget, widget->fieldEdit);
+- wrefresh (widget->fieldWin);
+-}
+-
+-/*
+- * This sets the background attribute of the widget.
+- */
+-static void _setBKattr<MIXED> (CDKOBJS *object, chtype attrib)
+-{
+- if (object != 0)
+- {
+- CDK<UPPER> *widget = (CDK<UPPER> *) object;
+-
+- wbkgd (widget->win, attrib);
+- wbkgd (widget->fieldWin, attrib);
+- if (widget->labelWin != 0)
+- {
+- wbkgd (widget->labelWin, attrib);
+- }
+- }
+-}
+-
+-/*
+- * This function destroys the widget.
+- */
+-static void _destroyCDK<MIXED> (CDKOBJS *object)
+-{
+- if (object != 0)
+- {
+- CDK<UPPER> *widget = (CDK<UPPER> *) object;
+-
+- cleanCdkTitle (object);
+- freeChtype (widget->label);
+-
+- /* Clean up the windows. */
+- deleteCursesWindow (widget->fieldWin);
+- deleteCursesWindow (widget->labelWin);
+- deleteCursesWindow (widget->shadowWin);
+- deleteCursesWindow (widget->win);
+-
+- /* Clean the key bindings. */
+- cleanCDKObjectBindings (v<UPPER>, widget);
+-
+- /* Unregister this object. */
+- unregisterCDKObject (v<UPPER>, widget);
+- }
+-}
+-
+-/*
+- * This function erases the widget from the screen.
+- */
+-static void _eraseCDK<MIXED> (CDKOBJS *object)
+-{
+- if (validCDKObject (object))
+- {
+- CDK<UPPER> *widget = (CDK<UPPER> *) object;
+-
+- eraseCursesWindow (widget->labelWin);
+- eraseCursesWindow (widget->fieldWin);
+- eraseCursesWindow (widget->win);
+- eraseCursesWindow (widget->shadowWin);
+- }
+-}
+-
+-/*
+- * This function sets the low/high/current values of the widget.
+- */
+-void setCDK<MIXED> (CDK<UPPER> * widget, <CTYPE> low, <CTYPE> high, <CTYPE> value, boolean Box)
+-{
+- setCDK<MIXED>LowHigh (widget, low, high);
+- setCDK<MIXED>Value (widget, value);
+- setCDK<MIXED>Box (widget, Box);
+-}
+-
+-/*
+- * This sets the digits.
+- */
+-#if <FLOAT>
+-void setCDK<MIXED>Digits (CDK<UPPER> * widget, int digits)
+-{
+- widget->digits = MAXIMUM (0, digits);
+-}
+-
+-int getCDK<MIXED>Digits (CDK<UPPER> * widget)
+-{
+- return widget->digits;
+-}
+-#endif <FLOAT>
+-
+-/*
+- * This sets the widget's value.
+- */
+-void setCDK<MIXED>Value (CDK<UPPER> * widget, <CTYPE> value)
+-{
+- widget->current = value;
+- limitCurrentValue (widget);
+-}
+-<CTYPE> getCDK<MIXED>Value (CDK<UPPER> * widget)
+-{
+- return widget->current;
+-}
+-
+-/*
+- * This function sets the low/high values of the widget.
+- */
+-void setCDK<MIXED>LowHigh (CDK<UPPER> * widget, <CTYPE> low, <CTYPE> high)
+-{
+- /* Make sure the values aren't out of bounds. */
+- if (low <= high)
+- {
+- widget->low = low;
+- widget->high = high;
+- }
+- else if (low > high)
+- {
+- widget->low = high;
+- widget->high = low;
+- }
+-
+- /* Make sure the user hasn't done something silly. */
+- limitCurrentValue (widget);
+-}
+-<CTYPE> getCDK<MIXED>LowValue (CDK<UPPER> * widget)
+-{
+- return widget->low;
+-}
+-<CTYPE> getCDK<MIXED>HighValue (CDK<UPPER> * widget)
+-{
+- return widget->high;
+-}
+-
+-/*
+- * This sets the widget's box attribute.
+- */
+-void setCDK<MIXED>Box (CDK<UPPER> * widget, boolean Box)
+-{
+- ObjOf (widget)->box = Box;
+- ObjOf (widget)->borderSize = Box ? 1 : 0;
+-}
+-boolean getCDK<MIXED>Box (CDK<UPPER> * widget)
+-{
+- return ObjOf (widget)->box;
+-}
+-
+-static void _focusCDK<MIXED> (CDKOBJS *object)
+-{
+- CDK<UPPER> *widget = (CDK<UPPER> *) object;
+-
+- drawCDK<MIXED> (widget, ObjOf (widget)->box);
+-}
+-
+-static void _unfocusCDK<MIXED> (CDKOBJS *object)
+-{
+- CDK<UPPER> *widget = (CDK<UPPER> *) object;
+-
+- drawCDK<MIXED> (widget, ObjOf (widget)->box);
+-}
+-
+-dummyRefreshData (<MIXED>)
+-
+-dummySaveData (<MIXED>)
+diff -r fbcff989cc14 gen-scale.h
+--- a/gen-scale.h Thu Jun 13 12:05:08 2013 -0400
++++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+@@ -1,233 +0,0 @@
+-/*
+- * $Id: gen-scale.h,v 1.8 2012/03/20 21:59:39 tom Exp $
+- */
+-
+-#ifndef CDKINCLUDES
+-#ifndef CDK<UPPER>_H
+-#define CDK<UPPER>_H 1
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-#ifndef CDK_H
+-#define CDKINCLUDES
+-#include <cdk.h>
+-#undef CDKINCLUDES
+-#include <binding.h>
+-#include <cdkscreen.h>
+-#include <cdk_objs.h>
+-#endif
+-
+-/*
+- * Copyright 2004,2012 Thomas E. Dickey
+- * All rights reserved.
+- *
+- * Redistribution and use in source and binary forms, with or without
+- * modification, are permitted provided that the following conditions
+- * are met:
+- * 1. Redistributions of source code must retain the above copyright
+- * notice, this list of conditions and the following disclaimer.
+- * 2. Redistributions in binary form must reproduce the above copyright
+- * notice, this list of conditions and the following disclaimer in the
+- * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgment:
+- * This product includes software developed by Thomas Dickey
+- * and contributors.
+- * 4. Neither the name of Thomas Dickey, nor the names of contributors
+- * may be used to endorse or promote products derived from this software
+- * without specific prior written permission.
+- *
+- * THIS SOFTWARE IS PROVIDED BY THOMAS DICKEY AND CONTRIBUTORS ``AS IS'' AND
+- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+- * ARE DISCLAIMED. IN NO EVENT SHALL THOMAS DICKEY OR CONTRIBUTORS BE LIABLE
+- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+- * SUCH DAMAGE.
+- */
+-
+-/*
+- * Define the CDK widget <MIXED> structure.
+- */
+-struct S<MIXED> {
+- CDKOBJS obj;
+- WINDOW * parent;
+- WINDOW * win;
+- WINDOW * shadowWin;
+- WINDOW * fieldWin;
+- WINDOW * labelWin;
+- int titleAdj;
+- chtype * label;
+- int labelLen;
+- int boxHeight;
+- int boxWidth;
+- int fieldWidth;
+- int fieldEdit; /* offset from right-margin of field */
+- chtype fieldAttr;
+- <CTYPE> low;
+- <CTYPE> high;
+- <CTYPE> inc;
+- <CTYPE> fastinc;
+- <CTYPE> current;
+-#if <FLOAT>
+- int digits;
+-#endif <FLOAT>
+- EExitType exitType;
+- boolean shadow;
+-};
+-typedef struct S<MIXED> CDK<UPPER>;
+-
+-/*
+- * This creates a new pointer to a CDK <CTYPE>-<MIXED> widget.
+- */
+-CDK<UPPER> *newCDK<MIXED> (
+- CDKSCREEN * /* cdkscreen */,
+- int /* xpos */,
+- int /* ypos */,
+- const char * /* title */,
+- const char * /* label */,
+- chtype /* fieldAttr */,
+- int /* fieldWidth */,
+- <CTYPE> /* start */,
+- <CTYPE> /* low */,
+- <CTYPE> /* high */,
+- <CTYPE> /* inc */,
+- <CTYPE> /* fastInc */,
+-#if <FLOAT>
+- int /* digits */,
+-#endif <FLOAT>
+- boolean /* Box */,
+- boolean /* shadow */);
+-
+-/*
+- * This activates the widget.
+- */
+-<CTYPE> activateCDK<MIXED> (
+- CDK<UPPER> * /* widget */,
+- chtype * /* actions */);
+-
+-/*
+- * This injects a single character into the widget.
+- */
+-#define injectCDK<MIXED>(obj,input) injectCDKObject(obj,input,<DTYPE>)
+-
+-/*
+- * This sets various attributes of the widget.
+- */
+-void setCDK<MIXED> (
+- CDK<UPPER> * /* widget */,
+- <CTYPE> /* low */,
+- <CTYPE> /* high */,
+- <CTYPE> /* value */,
+- boolean /* Box */);
+-
+-/*
+- * These set/get the low and high values.
+- */
+-void setCDK<MIXED>LowHigh (
+- CDK<UPPER> * /* widget */,
+- <CTYPE> /* low */,
+- <CTYPE> /* high */);
+-
+-<CTYPE> getCDK<MIXED>LowValue (
+- CDK<UPPER> * /* widget */);
+-
+-<CTYPE> getCDK<MIXED>HighValue (
+- CDK<UPPER> * /* widget */);
+-
+-/*
+- * These set/get the digits.
+- */
+-#if <FLOAT>
+-void setCDK<MIXED>Digits (
+- CDK<UPPER> * /* widget */,
+- int /* digits */);
+-
+-int getCDK<MIXED>Digits (
+- CDK<UPPER> * /* widget */);
+-#endif <FLOAT>
+-
+-/*
+- * These set/get the current value.
+- */
+-void setCDK<MIXED>Value (
+- CDK<UPPER> * /* widget */,
+- <CTYPE> /* value */);
+-
+-<CTYPE> getCDK<MIXED>Value (
+- CDK<UPPER> * /* widget */);
+-
+-/*
+- * This sets the box attribute of the widget.
+- */
+-void setCDK<MIXED>Box (
+- CDK<UPPER> * /* widget */,
+- boolean /* Box */);
+-
+-boolean getCDK<MIXED>Box (
+- CDK<UPPER> * /* widget */);
+-
+-/*
+- * These set the drawing characters of the widget.
+- */
+-#define setCDK<MIXED>ULChar(w,c) setULCharOf(w,c)
+-#define setCDK<MIXED>URChar(w,c) setURCharOf(w,c)
+-#define setCDK<MIXED>LLChar(w,c) setLLCharOf(w,c)
+-#define setCDK<MIXED>LRChar(w,c) setLRCharOf(w,c)
+-#define setCDK<MIXED>VerticalChar(w,c) setVTCharOf(w,c)
+-#define setCDK<MIXED>HorizontalChar(w,c) setHZCharOf(w,c)
+-#define setCDK<MIXED>BoxAttribute(w,c) setBXAttrOf(w,c)
+-
+-/*
+- * This sets the background color of the widget.
+- */
+-#define setCDK<MIXED>BackgroundColor(w,c) setCDKObjectBackgroundColor(ObjOf(w),c)
+-
+-/*
+- * This sets the background attribute of the widget.
+- */
+-#define setCDK<MIXED>BackgroundAttrib(w,c) setBKAttrOf(w,c)
+-
+-/*
+- * This draws the widget on the screen.
+- */
+-#define drawCDK<MIXED>(obj,Box) drawCDKObject(obj,Box)
+-
+-/*
+- * This erases the widget from the screen.
+- */
+-#define eraseCDK<MIXED>(obj) eraseCDKObject(obj)
+-
+-/*
+- * This moves the widget to the given location on the screen.
+- */
+-#define moveCDK<MIXED>(obj,xpos,ypos,relative,refresh) moveCDKObject(obj,xpos,ypos,relative,refresh)
+-
+-/*
+- * This allows the user to interactively position the widget on the screen.
+- */
+-#define positionCDK<MIXED>(widget) positionCDKObject(ObjOf(widget),widget->win)
+-
+-/*
+- * This destroys the widget and associated memory.
+- */
+-#define destroyCDK<MIXED>(obj) destroyCDKObject(obj)
+-
+-/*
+- * These set the pre/post process callback functions.
+- */
+-#define setCDK<MIXED>PreProcess(w,f,d) setCDKObjectPreProcess(ObjOf(w),f,d)
+-#define setCDK<MIXED>PostProcess(w,f,d) setCDKObjectPostProcess(ObjOf(w),f,d)
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-
+-#endif /* CDK<UPPER>_H */
+-#endif /* CDKINCLUDES */
+diff -r fbcff989cc14 gen-slider.c
+--- a/gen-slider.c Thu Jun 13 12:05:08 2013 -0400
++++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+@@ -1,871 +0,0 @@
+-#include <cdk_int.h>
+-
+-/*
+- * $Author: tom $
+- * $Date: 2012/03/20 21:46:36 $
+- * $Revision: 1.24 $
+- */
+-
+-/*
+- * Declare file local prototypes.
+- */
+-static void drawCDK<MIXED>Field (CDK<UPPER> *widget);
+-static int formattedSize (CDK<UPPER> *widget, <CTYPE> value);
+-
+-DeclareCDKObjects (<UPPER>, <MIXED>, setCdk, <DTYPE>);
+-
+-/*
+- * This function creates a widget.
+- */
+-CDK<UPPER> *newCDK<MIXED> (CDKSCREEN *cdkscreen,
+- int xplace,
+- int yplace,
+- const char *title,
+- const char *label,
+- chtype filler,
+- int fieldWidth,
+- <CTYPE> start,
+- <CTYPE> low,
+- <CTYPE> high,
+- <CTYPE> inc,
+- <CTYPE> fastInc,
+-#if <FLOAT>
+- int digits,
+-#endif <FLOAT>
+- boolean Box,
+- boolean shadow)
+-{
+- /* *INDENT-EQLS* */
+- CDK<UPPER> *widget = 0;
+- int parentWidth = getmaxx (cdkscreen->window);
+- int parentHeight = getmaxy (cdkscreen->window);
+- int boxHeight;
+- int boxWidth = 0;
+- int horizontalAdjust, oldWidth;
+- int xpos = xplace;
+- int ypos = yplace;
+- int highValueLen;
+- int x, junk;
+- /* *INDENT-OFF* */
+- static const struct { int from; int to; } bindings[] = {
+- { 'u', KEY_UP },
+- { 'U', KEY_PPAGE },
+- { CDK_BACKCHAR, KEY_PPAGE },
+- { CDK_FORCHAR, KEY_NPAGE },
+- { 'g', KEY_HOME },
+- { '^', KEY_HOME },
+- { 'G', KEY_END },
+- { '$', KEY_END },
+- };
+- /* *INDENT-ON* */
+-
+-
+- if ((widget = newCDKObject (CDK<UPPER>, &my_funcs)) == 0)
+- return (0);
+-
+- setCDK<MIXED>Box (widget, Box);
+- boxHeight = (BorderOf (widget) * 2) + 1;
+-
+- /* *INDENT-EQLS* Set some basic values of the widget's data field. */
+- widget->label = 0;
+- widget->labelLen = 0;
+- widget->labelWin = 0;
+-#if <FLOAT>
+- widget->digits = digits;
+-#endif <FLOAT>
+- highValueLen = formattedSize (widget, high);
+-
+- /*
+- * If the fieldWidth is a negative value, the fieldWidth will
+- * be COLS-fieldWidth, otherwise, the fieldWidth will be the
+- * given width.
+- */
+- fieldWidth = setWidgetDimension (parentWidth, fieldWidth, 0);
+-
+- /* Translate the label char *pointer to a chtype pointer. */
+- if (label != 0)
+- {
+- widget->label = char2Chtype (label, &widget->labelLen, &junk);
+- boxWidth = widget->labelLen + fieldWidth + highValueLen + 2 * BorderOf (widget);
+- }
+- else
+- {
+- boxWidth = fieldWidth + highValueLen + 2 * BorderOf (widget);
+- }
+-
+- oldWidth = boxWidth;
+- boxWidth = setCdkTitle (ObjOf (widget), title, boxWidth);
+- horizontalAdjust = (boxWidth - oldWidth) / 2;
+-
+- boxHeight += TitleLinesOf (widget);
+-
+- /*
+- * Make sure we didn't extend beyond the dimensions of the window.
+- */
+- boxWidth = (boxWidth > parentWidth ? parentWidth : boxWidth);
+- boxHeight = (boxHeight > parentHeight ? parentHeight : boxHeight);
+- fieldWidth = (fieldWidth > (boxWidth - widget->labelLen - highValueLen - 1)
+- ? (boxWidth - widget->labelLen - highValueLen - 1)
+- : fieldWidth);
+-
+- /* Rejustify the x and y positions if we need to. */
+- alignxy (cdkscreen->window, &xpos, &ypos, boxWidth, boxHeight);
+-
+- /* Make the widget's window. */
+- widget->win = newwin (boxHeight, boxWidth, ypos, xpos);
+-
+- /* Is the main window null??? */
+- if (widget->win == 0)
+- {
+- destroyCDKObject (widget);
+- return (0);
+- }
+-
+- /* Create the widget's label window. */
+- if (widget->label != 0)
+- {
+- widget->labelWin = subwin (widget->win,
+- 1, widget->labelLen,
+- ypos + TitleLinesOf (widget) + BorderOf (widget),
+- xpos + horizontalAdjust + BorderOf (widget));
+- if (widget->labelWin == 0)
+- {
+- destroyCDKObject (widget);
+- return (0);
+- }
+- }
+-
+- /* Create the widget's data field window. */
+- widget->fieldWin = subwin (widget->win,
+- 1, fieldWidth + highValueLen - 1,
+- (ypos + TitleLinesOf (widget) + BorderOf (widget)),
+- (xpos
+- + widget->labelLen
+- + horizontalAdjust
+- + BorderOf (widget)));
+- if (widget->fieldWin == 0)
+- {
+- destroyCDKObject (widget);
+- return (0);
+- }
+- keypad (widget->fieldWin, TRUE);
+- keypad (widget->win, TRUE);
+-
+- /* *INDENT-EQLS* Create the widget's data field. */
+- ScreenOf (widget) = cdkscreen;
+- widget->parent = cdkscreen->window;
+- widget->shadowWin = 0;
+- widget->boxWidth = boxWidth;
+- widget->boxHeight = boxHeight;
+- widget->fieldWidth = fieldWidth - 1;
+- widget->filler = filler;
+- widget->low = low;
+- widget->high = high;
+- widget->current = start;
+- widget->inc = inc;
+- widget->fastinc = fastInc;
+- initExitType (widget);
+- ObjOf (widget)->acceptsFocus = TRUE;
+- ObjOf (widget)->inputWindow = widget->win;
+- widget->shadow = shadow;
+-
+- /* Set the start value. */
+- if (start < low)
+- {
+- widget->current = low;
+- }
+-
+- /* Do we want a shadow??? */
+- if (shadow)
+- {
+- widget->shadowWin = newwin (boxHeight, boxWidth, ypos + 1, xpos + 1);
+- if (widget->shadowWin == 0)
+- {
+- destroyCDKObject (widget);
+- return (0);
+- }
+- }
+-
+- /* Setup the key bindings. */
+- for (x = 0; x < (int)SIZEOF (bindings); ++x)
+- bindCDKObject (v<UPPER>,
+- widget,
+- (chtype) bindings[x].from,
+- getcCDKBind,
+- (void *)(long)bindings[x].to);
+-
+- registerCDKObject (cdkscreen, v<UPPER>, widget);
+-
+- return (widget);
+-}
+-
+-/*
+- * This allows the person to use the widget's data field.
+- */
+-<CTYPE> activateCDK<MIXED> (CDK<UPPER> *widget, chtype *actions)
+-{
+- <CTYPE> ret;
+-
+- /* Draw the widget. */
+- drawCDK<MIXED> (widget, ObjOf (widget)->box);
+-
+- if (actions == 0)
+- {
+- chtype input = 0;
+- boolean functionKey;
+-
+- for (;;)
+- {
+- input = (chtype) getchCDKObject (ObjOf (widget), &functionKey);
+-
+- /* Inject the character into the widget. */
+- ret = (<CTYPE>) injectCDK<MIXED> (widget, input);
+- if (widget->exitType != vEARLY_EXIT)
+- {
+- return ret;
+- }
+- }
+- }
+- else
+- {
+- int length = chlen (actions);
+- int x = 0;
+-
+- /* Inject each character one at a time. */
+- for (x = 0; x < length; x++)
+- {
+- ret = (<CTYPE>) injectCDK<MIXED> (widget, actions[x]);
+- if (widget->exitType != vEARLY_EXIT)
+- {
+- return ret;
+- }
+- }
+- }
+-
+- /* Set the exit type and return. */
+- setExitType (widget, 0);
+- return unknown<DTYPE>;
+-}
+-
+-/*
+- * Check if the value lies outside the low/high range. If so, force it in.
+- */
+-static void limitCurrentValue (CDK<UPPER> *widget)
+-{
+- if (widget->current < widget->low)
+- {
+- widget->current = widget->low;
+- Beep ();
+- }
+- else if (widget->current > widget->high)
+- {
+- widget->current = widget->high;
+- Beep ();
+- }
+-}
+-
+-/*
+- * Move the cursor to the given edit-position.
+- */
+-static int moveToEditPosition (CDK<UPPER> *widget, int newPosition)
+-{
+- return wmove (widget->fieldWin,
+- 0,
+- widget->fieldWidth +
+- formattedSize (widget, widget->current) -
+- newPosition);
+-}
+-
+-/*
+- * Check if the cursor is on a valid edit-position. This must be one of
+- * the non-blank cells in the field.
+- */
+-static int validEditPosition (CDK<UPPER> *widget, int newPosition)
+-{
+- chtype ch;
+- if (newPosition <= 0 || newPosition >= widget->fieldWidth)
+- return FALSE;
+- if (moveToEditPosition (widget, newPosition) == ERR)
+- return FALSE;
+- ch = winch (widget->fieldWin);
+- if (CharOf (ch) != ' ')
+- return TRUE;
+- if (newPosition > 1)
+- {
+- /* don't use recursion - only one level is wanted */
+- if (moveToEditPosition (widget, newPosition - 1) == ERR)
+- return FALSE;
+- ch = winch (widget->fieldWin);
+- return CharOf (ch) != ' ';
+- }
+- return FALSE;
+-}
+-
+-/*
+- * Set the edit position. Normally the cursor is one cell to the right of
+- * the editable field. Moving it left, over the field allows the user to
+- * modify cells by typing in replacement characters for the field's value.
+- */
+-static void setEditPosition (CDK<UPPER> *widget, int newPosition)
+-{
+- if (newPosition < 0)
+- {
+- Beep ();
+- }
+- else if (newPosition == 0)
+- {
+- widget->fieldEdit = newPosition;
+- }
+- else if (validEditPosition (widget, newPosition))
+- {
+- widget->fieldEdit = newPosition;
+- }
+- else
+- {
+- Beep ();
+- }
+-}
+-
+-/*
+- * Remove the character from the string at the given column, if it is blank.
+- * Returns true if a change was made.
+- */
+-static bool removeChar (char *string, int col)
+-{
+- bool result = FALSE;
+-
+- if ((col >= 0) && (string[col] != ' '))
+- {
+- while (string[col] != '\0')
+- {
+- string[col] = string[col + 1];
+- ++col;
+- }
+- result = TRUE;
+- }
+- return result;
+-}
+-
+-/*
+- * Perform an editing function for the field.
+- */
+-static bool performEdit (CDK<UPPER> *widget, chtype input)
+-{
+- bool result = FALSE;
+- bool modify = TRUE;
+- int base = widget->fieldWidth;
+- int need = formattedSize (widget, widget->current);
+- char *temp = (char *)malloc ((size_t) need + 5);
+- char *data = temp;
+- char test;
+- int col = need - widget->fieldEdit;
+-#if <FLOAT>
+- double value;
+-#define SCANF_FMT "%lg%c"
+-#endif <FLOAT>
+-#if <INT>
+- <CTYPE> value;
+-#define SCANF_FMT "%<PRINT>%c"
+-#endif <INT>
+-
+- if (temp != 0)
+- {
+- int adj = (col < 0) ? (-col) : 0;
+- if (adj)
+- {
+- memset (temp, ' ', (size_t) adj);
+- temp += adj;
+- }
+- wmove (widget->fieldWin, 0, base);
+- winnstr (widget->fieldWin, temp, need);
+- strcpy (temp + need, " ");
+- if (isChar (input)) /* replace the char at the cursor */
+- {
+- temp[col] = (char) (input);
+- }
+- else if (input == KEY_BACKSPACE) /* delete the char before the cursor */
+- {
+- modify = removeChar (temp, col - 1);
+- }
+- else if (input == KEY_DC) /* delete the char at the cursor */
+- {
+- modify = removeChar (temp, col);
+- }
+- else
+- {
+- modify = FALSE;
+- }
+- if (modify
+- && sscanf (temp, SCANF_FMT, &value, &test) == 2
+- && test == ' '
+- && value >= widget->low
+- && value <= widget->high)
+- {
+- setCDK<MIXED>Value (widget, (<CTYPE>) value);
+- result = TRUE;
+- }
+- free (data);
+- }
+- return result;
+-}
+-
+-#define Decrement(value,by) if (value - by < value) value -= by
+-#define Increment(value,by) if (value + by > value) value += by
+-
+-/*
+- * This function injects a single character into the widget.
+- */
+-static int _injectCDK<MIXED> (CDKOBJS *object, chtype input)
+-{
+- CDK<UPPER> *widget = (CDK<UPPER> *)object;
+- int ppReturn = 1;
+- <CTYPE> ret = unknown<DTYPE>;
+- bool complete = FALSE;
+-
+- /* Set the exit type. */
+- setExitType (widget, 0);
+-
+- /* Draw the field. */
+- drawCDK<MIXED>Field (widget);
+-
+- /* Check if there is a pre-process function to be called. */
+- if (PreProcessFuncOf (widget) != 0)
+- {
+- /* Call the pre-process function. */
+- ppReturn = PreProcessFuncOf (widget) (v<UPPER>,
+- widget,
+- PreProcessDataOf (widget),
+- input);
+- }
+-
+- /* Should we continue? */
+- if (ppReturn != 0)
+- {
+- /* Check for a key binding. */
+- if (checkCDKObjectBind (v<UPPER>, widget, input) != 0)
+- {
+- checkEarlyExit (widget);
+- complete = TRUE;
+- }
+- else
+- {
+- switch (input)
+- {
+- case KEY_LEFT:
+- setEditPosition (widget, widget->fieldEdit + 1);
+- break;
+-
+- case KEY_RIGHT:
+- setEditPosition (widget, widget->fieldEdit - 1);
+- break;
+-
+- case KEY_DOWN:
+- Decrement (widget->current, widget->inc);
+- break;
+-
+- case KEY_UP:
+- Increment (widget->current, widget->inc);
+- break;
+-
+- case KEY_PPAGE:
+- Increment (widget->current, widget->fastinc);
+- break;
+-
+- case KEY_NPAGE:
+- Decrement (widget->current, widget->fastinc);
+- break;
+-
+- case KEY_HOME:
+- widget->current = widget->low;
+- break;
+-
+- case KEY_END:
+- widget->current = widget->high;
+- break;
+-
+- case KEY_TAB:
+- case KEY_ENTER:
+- setExitType (widget, input);
+- ret = (widget->current);
+- complete = TRUE;
+- break;
+-
+- case KEY_ESC:
+- setExitType (widget, input);
+- complete = TRUE;
+- break;
+-
+- case KEY_ERROR:
+- setExitType (widget, input);
+- complete = TRUE;
+- break;
+-
+- case CDK_REFRESH:
+- eraseCDKScreen (ScreenOf (widget));
+- refreshCDKScreen (ScreenOf (widget));
+- break;
+-
+- default:
+- if (widget->fieldEdit)
+- {
+- if (!performEdit (widget, input))
+- Beep ();
+- }
+- else
+- {
+- /*
+- * The cursor is not within the editable text. Interpret
+- * input as commands.
+- */
+- switch (input)
+- {
+- case 'd':
+- case '-':
+- return _injectCDK<MIXED> (object, KEY_DOWN);
+- case '+':
+- return _injectCDK<MIXED> (object, KEY_UP);
+- case 'D':
+- return _injectCDK<MIXED> (object, KEY_NPAGE);
+- case '0':
+- return _injectCDK<MIXED> (object, KEY_HOME);
+- default:
+- Beep ();
+- break;
+- }
+- }
+- break;
+- }
+- }
+- limitCurrentValue (widget);
+-
+- /* Should we call a post-process? */
+- if (!complete && (PostProcessFuncOf (widget) != 0))
+- {
+- PostProcessFuncOf (widget) (v<UPPER>,
+- widget,
+- PostProcessDataOf (widget),
+- input);
+- }
+- }
+-
+- if (!complete)
+- {
+- drawCDK<MIXED>Field (widget);
+- setExitType (widget, 0);
+- }
+-
+- ResultOf (widget).value<DTYPE> = ret;
+- return (ret != unknown<DTYPE>);
+-}
+-
+-/*
+- * This moves the widget's data field to the given location.
+- */
+-static void _moveCDK<MIXED> (CDKOBJS *object,
+- int xplace,
+- int yplace,
+- boolean relative,
+- boolean refresh_flag)
+-{
+- /* *INDENT-EQLS* */
+- CDK<UPPER> *widget = (CDK<UPPER> *)object;
+- int currentX = getbegx (widget->win);
+- int currentY = getbegy (widget->win);
+- int xpos = xplace;
+- int ypos = yplace;
+- int xdiff = 0;
+- int ydiff = 0;
+-
+- /*
+- * If this is a relative move, then we will adjust where we want
+- * to move to.
+- */
+- if (relative)
+- {
+- xpos = getbegx (widget->win) + xplace;
+- ypos = getbegy (widget->win) + yplace;
+- }
+-
+- /* Adjust the window if we need to. */
+- alignxy (WindowOf (widget), &xpos, &ypos, widget->boxWidth, widget->boxHeight);
+-
+- /* Get the difference. */
+- xdiff = currentX - xpos;
+- ydiff = currentY - ypos;
+-
+- /* Move the window to the new location. */
+- moveCursesWindow (widget->win, -xdiff, -ydiff);
+- moveCursesWindow (widget->labelWin, -xdiff, -ydiff);
+- moveCursesWindow (widget->fieldWin, -xdiff, -ydiff);
+- moveCursesWindow (widget->shadowWin, -xdiff, -ydiff);
+-
+- /* Touch the windows so they 'move'. */
+- refreshCDKWindow (WindowOf (widget));
+-
+- /* Redraw the window, if they asked for it. */
+- if (refresh_flag)
+- {
+- drawCDK<MIXED> (widget, ObjOf (widget)->box);
+- }
+-}
+-
+-/*
+- * This function draws the widget.
+- */
+-static void _drawCDK<MIXED> (CDKOBJS *object, boolean Box)
+-{
+- CDK<UPPER> *widget = (CDK<UPPER> *)object;
+-
+- /* Draw the shadow. */
+- if (widget->shadowWin != 0)
+- {
+- drawShadow (widget->shadowWin);
+- }
+-
+- /* Box the widget if asked. */
+- if (Box)
+- {
+- drawObjBox (widget->win, ObjOf (widget));
+- }
+-
+- drawCdkTitle (widget->win, object);
+-
+- /* Draw the label. */
+- if (widget->labelWin != 0)
+- {
+- writeChtype (widget->labelWin, 0, 0,
+- widget->label,
+- HORIZONTAL, 0,
+- widget->labelLen);
+- wrefresh (widget->labelWin);
+- }
+- wrefresh (widget->win);
+-
+- /* Draw the field window. */
+- drawCDK<MIXED>Field (widget);
+-}
+-
+-/*
+- * This draws the widget.
+- */
+-static void drawCDK<MIXED>Field (CDK<UPPER> *widget)
+-{
+- int fillerCharacters, x;
+- char temp[256];
+- double step = ((double)widget->fieldWidth
+- / (double)(widget->high - widget->low));
+-
+- /* Determine how many filler characters need to be drawn. */
+- fillerCharacters = (int)((widget->current - widget->low) * step);
+-
+- werase (widget->fieldWin);
+-
+- /* Add the character to the window. */
+- for (x = 0; x < fillerCharacters; x++)
+- {
+- mvwaddch (widget->fieldWin, 0, x, widget->filler);
+- }
+-
+- /* Draw the value in the field. */
+-#if <FLOAT>
+- {
+- char format[256];
+- int digits = MINIMUM (widget->digits, 30);
+- sprintf (format, "%%.%i<PRINT>", digits);
+- sprintf (temp, format, widget->current);
+- }
+-#endif <FLOAT>
+-#if <INT>
+- sprintf (temp, "%<PRINT>", widget->current);
+-#endif <INT>
+- writeCharAttrib (widget->fieldWin,
+- widget->fieldWidth,
+- 0,
+- temp,
+- A_NORMAL,
+- HORIZONTAL,
+- 0,
+- (int)strlen (temp));
+-
+- moveToEditPosition (widget, widget->fieldEdit);
+- wrefresh (widget->fieldWin);
+-}
+-
+-/*
+- * This sets the background attribute of the widget.
+- */
+-static void _setBKattr<MIXED> (CDKOBJS *object, chtype attrib)
+-{
+- if (object != 0)
+- {
+- CDK<UPPER> *widget = (CDK<UPPER> *)object;
+-
+- /* Set the widgets background attribute. */
+- wbkgd (widget->win, attrib);
+- wbkgd (widget->fieldWin, attrib);
+- if (widget->labelWin != 0)
+- {
+- wbkgd (widget->labelWin, attrib);
+- }
+- }
+-}
+-
+-/*
+- * This function destroys the widget.
+- */
+-static void _destroyCDK<MIXED> (CDKOBJS *object)
+-{
+- if (object != 0)
+- {
+- CDK<UPPER> *widget = (CDK<UPPER> *)object;
+-
+- cleanCdkTitle (object);
+- freeChtype (widget->label);
+-
+- /* Clean up the windows. */
+- deleteCursesWindow (widget->fieldWin);
+- deleteCursesWindow (widget->labelWin);
+- deleteCursesWindow (widget->shadowWin);
+- deleteCursesWindow (widget->win);
+-
+- /* Clean the key bindings. */
+- cleanCDKObjectBindings (v<UPPER>, widget);
+-
+- /* Unregister this object. */
+- unregisterCDKObject (v<UPPER>, widget);
+- }
+-}
+-
+-/*
+- * This function erases the widget from the screen.
+- */
+-static void _eraseCDK<MIXED> (CDKOBJS *object)
+-{
+- if (validCDKObject (object))
+- {
+- CDK<UPPER> *widget = (CDK<UPPER> *)object;
+-
+- eraseCursesWindow (widget->labelWin);
+- eraseCursesWindow (widget->fieldWin);
+- eraseCursesWindow (widget->win);
+- eraseCursesWindow (widget->shadowWin);
+- }
+-}
+-
+-static int formattedSize (CDK<UPPER> *widget, <CTYPE> value)
+-{
+- char temp[256];
+-#if <FLOAT>
+- char format[256];
+- int digits = MINIMUM (widget->digits, 30);
+- sprintf (format, "%%.%i<PRINT>", digits);
+- sprintf (temp, format, value);
+-#endif <FLOAT>
+-#if <INT>
+- (void)widget;
+- sprintf (temp, "%<PRINT>", value);
+-#endif <INT>
+- return (int) strlen (temp);
+-}
+-
+-/*
+- * This function sets the low/high/current values of the widget.
+- */
+-void setCDK<MIXED> (CDK<UPPER> *widget,
+- <CTYPE> low,
+- <CTYPE> high,
+- <CTYPE> value,
+- boolean Box)
+-{
+- setCDK<MIXED>LowHigh (widget, low, high);
+- setCDK<MIXED>Value (widget, value);
+- setCDK<MIXED>Box (widget, Box);
+-}
+-
+-/*
+- * This sets the digits.
+- */
+-#if <FLOAT>
+-void setCDK<MIXED>Digits (CDK<UPPER> *widget, int digits)
+-{
+- widget->digits = MAXIMUM (0, digits);
+-}
+-
+-int getCDK<MIXED>Digits (CDK<UPPER> *widget)
+-{
+- return widget->digits;
+-}
+-#endif <FLOAT>
+-
+-/*
+- * This sets the widget's value.
+- */
+-void setCDK<MIXED>Value (CDK<UPPER> *widget, <CTYPE> value)
+-{
+- widget->current = value;
+- limitCurrentValue (widget);
+-}
+-<CTYPE> getCDK<MIXED>Value (CDK<UPPER> *widget)
+-{
+- return widget->current;
+-}
+-
+-/*
+- * This function sets the low/high values of the widget.
+- */
+-void setCDK<MIXED>LowHigh (CDK<UPPER> *widget, <CTYPE> low, <CTYPE> high)
+-{
+- /* Make sure the values aren't out of bounds. */
+- if (low <= high)
+- {
+- widget->low = low;
+- widget->high = high;
+- }
+- else if (low > high)
+- {
+- widget->low = high;
+- widget->high = low;
+- }
+-
+- /* Make sure the user hasn't done something silly. */
+- limitCurrentValue (widget);
+-}
+-<CTYPE> getCDK<MIXED>LowValue (CDK<UPPER> *widget)
+-{
+- return widget->low;
+-}
+-<CTYPE> getCDK<MIXED>HighValue (CDK<UPPER> *widget)
+-{
+- return widget->high;
+-}
+-
+-/*
+- * This sets the widget's box attribute.
+- */
+-void setCDK<MIXED>Box (CDK<UPPER> *widget, boolean Box)
+-{
+- ObjOf (widget)->box = Box;
+- ObjOf (widget)->borderSize = Box ? 1 : 0;
+-}
+-boolean getCDK<MIXED>Box (CDK<UPPER> *widget)
+-{
+- return ObjOf (widget)->box;
+-}
+-
+-static void _focusCDK<MIXED> (CDKOBJS *object)
+-{
+- CDK<UPPER> *widget = (CDK<UPPER> *)object;
+-
+- drawCDK<MIXED> (widget, ObjOf (widget)->box);
+-}
+-
+-static void _unfocusCDK<MIXED> (CDKOBJS *object)
+-{
+- CDK<UPPER> *widget = (CDK<UPPER> *)object;
+-
+- drawCDK<MIXED> (widget, ObjOf (widget)->box);
+-}
+-
+-dummyRefreshData (<MIXED>)
+-
+-dummySaveData (<MIXED>)
+diff -r fbcff989cc14 gen-slider.h
+--- a/gen-slider.h Thu Jun 13 12:05:08 2013 -0400
++++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+@@ -1,233 +0,0 @@
+-/*
+- * $Id: gen-slider.h,v 1.8 2012/03/20 21:59:30 tom Exp $
+- */
+-
+-#ifndef CDKINCLUDES
+-#ifndef CDK<UPPER>_H
+-#define CDK<UPPER>_H 1
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-#ifndef CDK_H
+-#define CDKINCLUDES
+-#include <cdk.h>
+-#undef CDKINCLUDES
+-#include <binding.h>
+-#include <cdkscreen.h>
+-#include <cdk_objs.h>
+-#endif
+-
+-/*
+- * Copyright 2004,2012 Thomas E. Dickey
+- * All rights reserved.
+- *
+- * Redistribution and use in source and binary forms, with or without
+- * modification, are permitted provided that the following conditions
+- * are met:
+- * 1. Redistributions of source code must retain the above copyright
+- * notice, this list of conditions and the following disclaimer.
+- * 2. Redistributions in binary form must reproduce the above copyright
+- * notice, this list of conditions and the following disclaimer in the
+- * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgment:
+- * This product includes software developed by Thomas Dickey
+- * and contributors.
+- * 4. Neither the name of Thomas Dickey, nor the names of contributors
+- * may be used to endorse or promote products derived from this software
+- * without specific prior written permission.
+- *
+- * THIS SOFTWARE IS PROVIDED BY THOMAS DICKEY AND CONTRIBUTORS ``AS IS'' AND
+- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+- * ARE DISCLAIMED. IN NO EVENT SHALL THOMAS DICKEY OR CONTRIBUTORS BE LIABLE
+- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+- * SUCH DAMAGE.
+- */
+-
+-/*
+- * Define the CDK widget <MIXED> structure.
+- */
+-struct S<MIXED> {
+- CDKOBJS obj;
+- WINDOW * parent;
+- WINDOW * win;
+- WINDOW * shadowWin;
+- WINDOW * fieldWin;
+- WINDOW * labelWin;
+- int titleAdj;
+- chtype * label;
+- int labelLen;
+- int boxHeight;
+- int boxWidth;
+- int fieldWidth;
+- int fieldEdit; /* offset from right-margin of field */
+- chtype filler;
+- <CTYPE> low;
+- <CTYPE> high;
+- <CTYPE> inc;
+- <CTYPE> fastinc;
+- <CTYPE> current;
+-#if <FLOAT>
+- int digits;
+-#endif <FLOAT>
+- EExitType exitType;
+- boolean shadow;
+-};
+-typedef struct S<MIXED> CDK<UPPER>;
+-
+-/*
+- * This creates a new pointer to a CDK <CTYPE>-<MIXED> widget.
+- */
+-CDK<UPPER> *newCDK<MIXED> (
+- CDKSCREEN * /* cdkscreen */,
+- int /* xpos */,
+- int /* ypos */,
+- const char * /* title */,
+- const char * /* label */,
+- chtype /* fieldAttr */,
+- int /* fieldWidth */,
+- <CTYPE> /* start */,
+- <CTYPE> /* low */,
+- <CTYPE> /* high */,
+- <CTYPE> /* inc */,
+- <CTYPE> /* fastInc */,
+-#if <FLOAT>
+- int /* digits */,
+-#endif <FLOAT>
+- boolean /* Box */,
+- boolean /* shadow */);
+-
+-/*
+- * This activates the widget.
+- */
+-<CTYPE> activateCDK<MIXED> (
+- CDK<UPPER> * /* widget */,
+- chtype * /* actions */);
+-
+-/*
+- * This injects a single character into the widget.
+- */
+-#define injectCDK<MIXED>(obj,input) injectCDKObject(obj,input,<DTYPE>)
+-
+-/*
+- * This sets various attributes of the widget.
+- */
+-void setCDK<MIXED> (
+- CDK<UPPER> * /* widget */,
+- <CTYPE> /* low */,
+- <CTYPE> /* high */,
+- <CTYPE> /* value */,
+- boolean /* Box */);
+-
+-/*
+- * These set/get the low and high values.
+- */
+-void setCDK<MIXED>LowHigh (
+- CDK<UPPER> * /* widget */,
+- <CTYPE> /* low */,
+- <CTYPE> /* high */);
+-
+-<CTYPE> getCDK<MIXED>LowValue (
+- CDK<UPPER> * /* widget */);
+-
+-<CTYPE> getCDK<MIXED>HighValue (
+- CDK<UPPER> * /* widget */);
+-
+-/*
+- * These set/get the digits.
+- */
+-#if <FLOAT>
+-void setCDK<MIXED>Digits (
+- CDK<UPPER> * /* widget */,
+- int /* digits */);
+-
+-int getCDK<MIXED>Digits (
+- CDK<UPPER> * /* widget */);
+-#endif <FLOAT>
+-
+-/*
+- * These set/get the current value.
+- */
+-void setCDK<MIXED>Value (
+- CDK<UPPER> * /* widget */,
+- <CTYPE> /* value */);
+-
+-<CTYPE> getCDK<MIXED>Value (
+- CDK<UPPER> * /* widget */);
+-
+-/*
+- * This sets the box attribute of the widget.
+- */
+-void setCDK<MIXED>Box (
+- CDK<UPPER> * /* widget */,
+- boolean /* Box */);
+-
+-boolean getCDK<MIXED>Box (
+- CDK<UPPER> * /* widget */);
+-
+-/*
+- * These set the drawing characters of the widget.
+- */
+-#define setCDK<MIXED>ULChar(w,c) setULCharOf(w,c)
+-#define setCDK<MIXED>URChar(w,c) setURCharOf(w,c)
+-#define setCDK<MIXED>LLChar(w,c) setLLCharOf(w,c)
+-#define setCDK<MIXED>LRChar(w,c) setLRCharOf(w,c)
+-#define setCDK<MIXED>VerticalChar(w,c) setVTCharOf(w,c)
+-#define setCDK<MIXED>HorizontalChar(w,c) setHZCharOf(w,c)
+-#define setCDK<MIXED>BoxAttribute(w,c) setBXAttrOf(w,c)
+-
+-/*
+- * This sets the background color of the widget.
+- */
+-#define setCDK<MIXED>BackgroundColor(w,c) setCDKObjectBackgroundColor(ObjOf(w),c)
+-
+-/*
+- * This sets the background attribute of the widget.
+- */
+-#define setCDK<MIXED>BackgroundAttrib(w,c) setBKAttrOf(w,c)
+-
+-/*
+- * This draws the widget on the screen.
+- */
+-#define drawCDK<MIXED>(obj,Box) drawCDKObject(obj,Box)
+-
+-/*
+- * This erases the widget from the screen.
+- */
+-#define eraseCDK<MIXED>(obj) eraseCDKObject(obj)
+-
+-/*
+- * This moves the widget to the given location on the screen.
+- */
+-#define moveCDK<MIXED>(obj,xpos,ypos,relative,refresh) moveCDKObject(obj,xpos,ypos,relative,refresh)
+-
+-/*
+- * This allows the user to interactively position the widget on the screen.
+- */
+-#define positionCDK<MIXED>(widget) positionCDKObject(ObjOf(widget),widget->win)
+-
+-/*
+- * This destroys the widget and associated memory.
+- */
+-#define destroyCDK<MIXED>(obj) destroyCDKObject(obj)
+-
+-/*
+- * These set the pre/post process callback functions.
+- */
+-#define setCDK<MIXED>PreProcess(w,f,d) setCDKObjectPreProcess(ObjOf(w),f,d)
+-#define setCDK<MIXED>PostProcess(w,f,d) setCDKObjectPostProcess(ObjOf(w),f,d)
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-
+-#endif /* CDK<UPPER>_H */
+-#endif /* CDKINCLUDES */
+diff -r fbcff989cc14 matrix.c
+--- a/matrix.c Thu Jun 13 12:05:08 2013 -0400
++++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+@@ -1,1863 +0,0 @@
+-#include <cdk_int.h>
+-
+-/*
+- * $Author: tom $
+- * $Date: 2012/03/22 00:43:33 $
+- * $Revision: 1.192 $
+- */
+-
+-/*
+- * Declare file local prototypes.
+- */
+-static void highlightCDKMatrixCell (CDKMATRIX *matrix);
+-static void CDKMatrixCallBack (CDKMATRIX *matrix, chtype input);
+-static void drawCDKMatrixCell (CDKMATRIX *matrix,
+- int srow, int scol,
+- int vrow, int vcol,
+- chtype attr, boolean Box);
+-static void drawCurCDKMatrixCell (CDKMATRIX *matrix);
+-static void drawEachCDKMatrixCell (CDKMATRIX *matrix);
+-static void drawEachColTitle (CDKMATRIX *matrix);
+-static void drawEachRowTitle (CDKMATRIX *matrix);
+-static void drawOldCDKMatrixCell (CDKMATRIX *matrix);
+-static void redrawTitles (CDKMATRIX *matrix, int row, int col);
+-
+-#define emptyString(s) ((s) == 0 || *(s) == '\0')
+-
+-#define CurMatrixCell(matrix) \
+- MATRIX_CELL (matrix, matrix->crow, matrix->ccol)
+-
+-#define CurMatrixInfo(matrix) \
+- MATRIX_INFO (matrix, \
+- matrix->trow + matrix->crow - 1, \
+- matrix->lcol + matrix->ccol - 1)
+-
+-DeclareCDKObjects (MATRIX, Matrix, setCdk, Int);
+-
+-/*
+- * This function creates the matrix widget.
+- */
+-CDKMATRIX *newCDKMatrix (CDKSCREEN *cdkscreen,
+- int xplace,
+- int yplace,
+- int rows,
+- int cols,
+- int vrows,
+- int vcols,
+- const char *title,
+- CDK_CSTRING2 rowtitles,
+- CDK_CSTRING2 coltitles,
+- int *colwidths,
+- int *colvalues,
+- int rspace,
+- int cspace,
+- chtype filler,
+- int dominant,
+- boolean Box,
+- boolean boxCell,
+- boolean shadow)
+-{
+- /* *INDENT-EQLS* */
+- CDKMATRIX *matrix = 0;
+- int parentWidth = getmaxx (cdkscreen->window);
+- int parentHeight = getmaxy (cdkscreen->window);
+- int boxHeight = 0;
+- int boxWidth = 0;
+- int xpos = xplace;
+- int ypos = yplace;
+- int maxWidth;
+- int maxRowTitleWidth = 0;
+- int rowSpace = MAXIMUM (0, rspace);
+- int colSpace = MAXIMUM (0, cspace);
+- int begx = 0;
+- int begy = 0;
+- int cellWidth = 0;
+- char **temp = 0;
+- int x, y;
+- int borderw = 0;
+- bool have_rowtitles = FALSE;
+- bool have_coltitles = FALSE;
+- /* *INDENT-OFF* */
+- static const struct { int from; int to; } bindings[] = {
+- { CDK_FORCHAR, KEY_NPAGE },
+- { CDK_BACKCHAR, KEY_PPAGE },
+- };
+- /* *INDENT-ON* */
+-
+-
+-
+- if ((matrix = newCDKObject (CDKMATRIX, &my_funcs)) == 0)
+- {
+- return (0);
+- }
+-
+- setCDKMatrixBox (matrix, Box);
+- borderw = (ObjOf (matrix)->box) ? 1 : 0;
+-
+- /* Make sure that the number of rows/cols/vrows/vcols is not zero. */
+- if (rows <= 0 || cols <= 0 || vrows <= 0 || vcols <= 0)
+- {
+- destroyCDKObject (matrix);
+- return (0);
+- }
+-#if NEW_CDKMATRIX
+- matrix->cell = typeCallocN (WINDOW *, (rows + 1) * (cols + 1));
+- matrix->info = typeCallocN (char *, (rows + 1) * (cols + 1));
+-#endif
+-
+- /*
+- * Make sure the number of virtual cells is not larger than
+- * the physical size.
+- */
+- vrows = (vrows > rows ? rows : vrows);
+- vcols = (vcols > cols ? cols : vcols);
+-
+- /* Set these early, since they are used in matrix index computations */
+- /* *INDENT-EQLS* */
+- matrix->rows = rows;
+- matrix->cols = cols;
+- /* columns */
+- matrix->colwidths = typeCallocN (int, cols + 1);
+- matrix->colvalues = typeCallocN (int, cols + 1);
+- matrix->coltitle = typeCallocN (chtype *, cols + 1);
+- matrix->coltitleLen = typeCallocN (int, cols + 1);
+- matrix->coltitlePos = typeCallocN (int, cols + 1);
+- /* titles */
+- matrix->rowtitle = typeCallocN (chtype *, rows + 1);
+- matrix->rowtitleLen = typeCallocN (int, rows + 1);
+- matrix->rowtitlePos = typeCallocN (int, rows + 1);
+-
+- /*
+- * Count the number of lines in the title (see setCdkTitle).
+- */
+- temp = CDKsplitString (title, '\n');
+- TitleLinesOf (matrix) = (int)CDKcountStrings ((CDK_CSTRING2) temp);
+- CDKfreeStrings (temp);
+-
+- /* Determine the height of the box. */
+- if (vrows == 1)
+- {
+- boxHeight = 6 + TitleLinesOf (matrix);
+- }
+- else
+- {
+- if (rowSpace == 0)
+- {
+- boxHeight = (6 + TitleLinesOf (matrix) +
+- ((vrows - 1) * 2));
+- }
+- else
+- {
+- boxHeight = (3 + TitleLinesOf (matrix) +
+- (vrows * 3) + ((vrows - 1) * (rowSpace - 1)));
+- }
+- }
+-
+- /* Determine the maximum row title width */
+- for (x = 1; x <= rows; x++)
+- {
+- if (rowtitles && !emptyString (rowtitles[x])) /*VR */
+- have_rowtitles = TRUE;
+- matrix->rowtitle[x] = char2Chtype (rowtitles ? rowtitles[x] : 0, /*VR */
+- &matrix->rowtitleLen[x],
+- &matrix->rowtitlePos[x]);
+- maxRowTitleWidth = MAXIMUM (maxRowTitleWidth, matrix->rowtitleLen[x]);
+- }
+-
+- if (have_rowtitles)
+- {
+- matrix->maxrt = maxRowTitleWidth + 2;
+-
+- /* We need to rejustify the row title cell info. */
+- for (x = 1; x <= rows; x++)
+- {
+- matrix->rowtitlePos[x] = justifyString (matrix->maxrt,
+- matrix->rowtitleLen[x],
+- matrix->rowtitlePos[x]);
+- }
+- }
+- else
+- {
+- matrix->maxrt = 0;
+- }
+-
+- /* Determine the width of the matrix. */
+- maxWidth = 2 + matrix->maxrt;
+- for (x = 1; x <= vcols; x++)
+- {
+- maxWidth += colwidths[x] + 2 + colSpace;
+- }
+- maxWidth -= (colSpace - 1);
+- boxWidth = MAXIMUM (maxWidth, boxWidth);
+-
+- boxWidth = setCdkTitle (ObjOf (matrix), title, boxWidth);
+-
+- /*
+- * Make sure the dimensions of the window didn't
+- * extend beyond the dimensions of the parent window.
+- */
+- boxWidth = (boxWidth > parentWidth ? parentWidth : boxWidth);
+- boxHeight = (boxHeight > parentHeight ? parentHeight : boxHeight);
+-
+- /* Rejustify the x and y positions if we need to. */
+- alignxy (cdkscreen->window, &xpos, &ypos, boxWidth, boxHeight);
+-
+- /* Make the pop-up window. */
+- matrix->win = newwin (boxHeight, boxWidth, ypos, xpos);
+-
+- if (matrix->win == 0)
+- {
+- destroyCDKObject (matrix);
+- return (0);
+- }
+-
+- /* Make the subwindows in the pop-up. */
+- begx = xpos;
+- begy = ypos + borderw + TitleLinesOf (matrix);
+-
+- /* Make the 'empty' 0x0 cell. */
+- MATRIX_CELL (matrix, 0, 0) = subwin (matrix->win, 3, matrix->maxrt, begy, begx);
+- begx += matrix->maxrt + 1;
+-
+- /* Copy the titles into the structure. */
+- for (x = 1; x <= cols; x++)
+- {
+- if (coltitles && !emptyString (coltitles[x])) /*VR */
+- have_coltitles = TRUE;
+- matrix->coltitle[x] = char2Chtype (coltitles ? coltitles[x] : 0, /*VR */
+- &matrix->coltitleLen[x],
+- &matrix->coltitlePos[x]);
+- matrix->coltitlePos[x] = (BorderOf (matrix) +
+- justifyString (colwidths[x],
+- matrix->coltitleLen[x],
+- matrix->coltitlePos[x]));
+- matrix->colwidths[x] = colwidths[x];
+- }
+-
+- if (have_coltitles)
+- {
+- /* Make the column titles. */
+- for (x = 1; x <= vcols; x++)
+- {
+- cellWidth = colwidths[x] + 3;
+- MATRIX_CELL (matrix, 0, x) = subwin (matrix->win,
+- borderw,
+- cellWidth,
+- begy,
+- begx);
+-
+- if (MATRIX_CELL (matrix, 0, x) == 0)
+- {
+- destroyCDKObject (matrix);
+- return (0);
+- }
+- begx += cellWidth + colSpace - 1;
+- }
+- begy++;
+- }
+-
+- /* Make the main cell body */
+- for (x = 1; x <= vrows; x++)
+- {
+- if (have_rowtitles)
+- {
+- /* Make the row titles */
+- MATRIX_CELL (matrix, x, 0) = subwin (matrix->win,
+- 3, matrix->maxrt,
+- begy, xpos + borderw);
+-
+- if (MATRIX_CELL (matrix, x, 0) == 0)
+- {
+- destroyCDKObject (matrix);
+- return (0);
+- }
+- }
+-
+- /* Set the start of the x position. */
+- begx = xpos + matrix->maxrt + borderw;
+-
+- /* Make the cells */
+- for (y = 1; y <= vcols; y++)
+- {
+- cellWidth = colwidths[y] + 3;
+- MATRIX_CELL (matrix, x, y) = subwin (matrix->win,
+- 3, cellWidth,
+- begy, begx);
+-
+- if (MATRIX_CELL (matrix, x, y) == 0)
+- {
+- destroyCDKObject (matrix);
+- return (0);
+- }
+- begx += cellWidth + colSpace - 1;
+- keypad (MATRIX_CELL (matrix, x, y), TRUE);
+- }
+- begy += rowSpace + 2;
+- }
+- keypad (matrix->win, TRUE);
+-
+- /* *INDENT-EQLS* Keep the rest of the info. */
+- ScreenOf (matrix) = cdkscreen;
+- ObjOf (matrix)->acceptsFocus = TRUE;
+- ObjOf (matrix)->inputWindow = matrix->win;
+- matrix->parent = cdkscreen->window;
+- matrix->vrows = vrows;
+- matrix->vcols = vcols;
+- matrix->boxWidth = boxWidth;
+- matrix->boxHeight = boxHeight;
+- matrix->rowSpace = rowSpace;
+- matrix->colSpace = colSpace;
+- matrix->filler = filler;
+- matrix->dominant = dominant;
+- matrix->row = 1;
+- matrix->col = 1;
+- matrix->crow = 1;
+- matrix->ccol = 1;
+- matrix->trow = 1;
+- matrix->lcol = 1;
+- matrix->oldcrow = 1;
+- matrix->oldccol = 1;
+- matrix->oldvrow = 1;
+- matrix->oldvcol = 1;
+- initExitType (matrix);
+- matrix->boxCell = boxCell;
+- matrix->shadow = shadow;
+- matrix->highlight = A_REVERSE;
+- matrix->callbackfn = CDKMatrixCallBack;
+-
+- /* Make room for the cell information. */
+- for (x = 1; x <= rows; x++)
+- {
+- for (y = 1; y <= cols; y++)
+- {
+- MATRIX_INFO (matrix, x, y) = typeCallocN (char, (colwidths[y] + 1));
+- matrix->colvalues[y] = colvalues[y];
+- matrix->colwidths[y] = colwidths[y];
+- }
+- }
+-
+- /* Do we want a shadow??? */
+- if (shadow)
+- {
+- matrix->shadowWin = newwin (boxHeight, boxWidth, ypos + 1, xpos + 1);
+- }
+-
+- /* Setup the key bindings. */
+- for (x = 0; x < (int)SIZEOF (bindings); ++x)
+- bindCDKObject (vMATRIX, matrix,
+- (chtype)bindings[x].from,
+- getcCDKBind,
+- (void *)(long)bindings[x].to);
+-
+- /* Register this baby. */
+- registerCDKObject (cdkscreen, vMATRIX, matrix);
+-
+- /* Return the matrix pointer */
+- return (matrix);
+-}
+-
+-/*
+- * This activates the matrix.
+- */
+-int activateCDKMatrix (CDKMATRIX *matrix, chtype *actions)
+-{
+- int ret;
+-
+- /* Draw the matrix */
+- drawCDKMatrix (matrix, ObjOf (matrix)->box);
+-
+- if (actions == 0)
+- {
+- chtype input = 0;
+- boolean functionKey;
+-
+- for (;;)
+- {
+- ObjOf (matrix)->inputWindow = CurMatrixCell (matrix);
+- keypad (ObjOf (matrix)->inputWindow, TRUE);
+- input = (chtype)getchCDKObject (ObjOf (matrix), &functionKey);
+-
+- /* Inject the character into the widget. */
+- ret = injectCDKMatrix (matrix, input);
+- if (matrix->exitType != vEARLY_EXIT)
+- {
+- return ret;
+- }
+- }
+- }
+- else
+- {
+- int length = chlen (actions);
+- int x = 0;
+-
+- /* Inject each character one at a time. */
+- for (x = 0; x < length; x++)
+- {
+- ret = injectCDKMatrix (matrix, actions[x]);
+- if (matrix->exitType != vEARLY_EXIT)
+- {
+- return ret;
+- }
+- }
+- }
+-
+- /* Set the exit type and exit. */
+- setExitType (matrix, 0);
+- return -1;
+-}
+-
+-/*
+- * This injects a single character into the matrix widget.
+- */
+-static int _injectCDKMatrix (CDKOBJS *object, chtype input)
+-{
+- /* *INDENT-EQLS* */
+- CDKMATRIX *widget = (CDKMATRIX *)object;
+- int refreshCells = FALSE;
+- int movedCell = FALSE;
+- int charcount = (int)strlen (MATRIX_INFO (widget, widget->row, widget->col));
+- int ppReturn = 1;
+- int infolen;
+- int ret = unknownInt;
+- bool complete = FALSE;
+-
+- /* Set the exit type. */
+- setExitType (widget, 0);
+-
+- /* Move the cursor to the correct position within the cell. */
+- if (widget->colwidths[widget->ccol] == 1)
+- {
+- wmove (CurMatrixCell (widget), 1, 1);
+- }
+- else
+- {
+- wmove (CurMatrixCell (widget),
+- 1,
+- (int)strlen (MATRIX_INFO (widget, widget->row, widget->col)) + 1);
+- }
+-
+- /* Put the focus on the current cell */
+- attrbox (CurMatrixCell (widget),
+- ACS_ULCORNER, ACS_URCORNER,
+- ACS_LLCORNER, ACS_LRCORNER,
+- ACS_HLINE, ACS_VLINE,
+- A_BOLD);
+- wrefresh (CurMatrixCell (widget));
+- highlightCDKMatrixCell (widget);
+-
+- /* Check if there is a pre-process function to be called. */
+- if (PreProcessFuncOf (widget) != 0)
+- {
+- /* Call the pre-process function. */
+- ppReturn = PreProcessFuncOf (widget) (vMATRIX,
+- widget,
+- PreProcessDataOf (widget),
+- input);
+- }
+-
+- /* Should we continue? */
+- if (ppReturn != 0)
+- {
+- /* Check the key bindings. */
+- if (checkCDKObjectBind (vMATRIX, widget, input) != 0)
+- {
+- checkEarlyExit (widget);
+- complete = TRUE;
+- }
+- else
+- {
+- switch (input)
+- {
+- case CDK_TRANSPOSE:
+- break;
+-
+- case KEY_HOME:
+- break;
+-
+- case KEY_END:
+- break;
+-
+- case KEY_BACKSPACE:
+- case KEY_DC:
+- if (widget->colvalues[widget->col] == vVIEWONLY || charcount <= 0)
+- {
+- Beep ();
+- }
+- else
+- {
+- charcount--;
+- mvwdelch (CurMatrixCell (widget), 1, charcount + 1);
+- mvwinsch (CurMatrixCell (widget), 1, charcount + 1, widget->filler);
+- wrefresh (CurMatrixCell (widget));
+- MATRIX_INFO (widget, widget->row, widget->col)[charcount] = '\0';
+- }
+- break;
+-
+- case KEY_RIGHT:
+- case KEY_TAB:
+- if (widget->ccol != widget->vcols)
+- {
+- /* We are moving to the right... */
+- widget->col++;
+- widget->ccol++;
+- movedCell = TRUE;
+- }
+- else
+- {
+- /* We have to shift the columns to the right. */
+- if (widget->col != widget->cols)
+- {
+- widget->lcol++;
+- widget->col++;
+-
+- /* Redraw the column titles. */
+- if (widget->rows > widget->vrows)
+- {
+- redrawTitles (widget, FALSE, TRUE);
+- }
+- refreshCells = TRUE;
+- movedCell = TRUE;
+- }
+- else
+- {
+- /* We are at the far right column, we need */
+- /* shift down one row, if we can. */
+- if (widget->row == widget->rows)
+- {
+- Beep ();
+- }
+- else
+- {
+- /* Set up the columns info. */
+- widget->col = 1;
+- widget->lcol = 1;
+- widget->ccol = 1;
+-
+- /* Shift the rows... */
+- if (widget->crow != widget->vrows)
+- {
+- widget->row++;
+- widget->crow++;
+- }
+- else
+- {
+- widget->row++;
+- widget->trow++;
+- }
+- redrawTitles (widget, TRUE, TRUE);
+- refreshCells = TRUE;
+- movedCell = TRUE;
+- }
+- }
+- }
+- break;
+-
+- case KEY_LEFT:
+- case KEY_BTAB:
+- if (widget->ccol != 1)
+- {
+- /* We are moving to the left... */
+- widget->col--;
+- widget->ccol--;
+- movedCell = TRUE;
+- }
+- else
+- {
+- /* Are we at the far left??? */
+- if (widget->lcol != 1)
+- {
+- widget->lcol--;
+- widget->col--;
+-
+- /* Redraw the column titles. */
+- if (widget->cols > widget->vcols)
+- {
+- redrawTitles (widget, FALSE, TRUE);
+- }
+- refreshCells = TRUE;
+- movedCell = TRUE;
+- }
+- else
+- {
+- /* Shift up one line if we can... */
+- if (widget->row == 1)
+- {
+- Beep ();
+- }
+- else
+- {
+- /* Set up the columns info. */
+- widget->col = widget->cols;
+- widget->lcol = widget->cols - widget->vcols + 1;
+- widget->ccol = widget->vcols;
+-
+- /* Shift the rows... */
+- if (widget->crow != 1)
+- {
+- widget->row--;
+- widget->crow--;
+- }
+- else
+- {
+- widget->row--;
+- widget->trow--;
+- }
+- redrawTitles (widget, TRUE, TRUE);
+- refreshCells = TRUE;
+- movedCell = TRUE;
+- }
+- }
+- }
+- break;
+-
+- case KEY_UP:
+- if (widget->crow != 1)
+- {
+- widget->row--;
+- widget->crow--;
+- movedCell = TRUE;
+- }
+- else
+- {
+- if (widget->trow != 1)
+- {
+- widget->trow--;
+- widget->row--;
+-
+- /* Redraw the row titles. */
+- if (widget->rows > widget->vrows)
+- {
+- redrawTitles (widget, TRUE, FALSE);
+- }
+- refreshCells = TRUE;
+- movedCell = TRUE;
+- }
+- else
+- {
+- Beep ();
+- }
+- }
+- break;
+-
+- case KEY_DOWN:
+- if (widget->crow != widget->vrows)
+- {
+- widget->row++;
+- widget->crow++;
+- movedCell = TRUE;
+- }
+- else
+- {
+- if ((widget->trow + widget->vrows - 1) != widget->rows)
+- {
+- widget->trow++;
+- widget->row++;
+-
+- /* Redraw the titles. */
+- if (widget->rows > widget->vrows)
+- {
+- redrawTitles (widget, TRUE, FALSE);
+- }
+- refreshCells = TRUE;
+- movedCell = TRUE;
+- }
+- else
+- {
+- Beep ();
+- }
+- }
+- break;
+-
+- case KEY_NPAGE:
+- if (widget->rows > widget->vrows)
+- {
+- if ((widget->trow + ((widget->vrows - 1) * 2)) <= widget->rows)
+- {
+- widget->trow += widget->vrows - 1;
+- widget->row += widget->vrows - 1;
+- redrawTitles (widget, TRUE, FALSE);
+- refreshCells = TRUE;
+- movedCell = TRUE;
+- }
+- else
+- {
+- Beep ();
+- }
+- }
+- else
+- {
+- Beep ();
+- }
+- break;
+-
+- case KEY_PPAGE:
+- if (widget->rows > widget->vrows)
+- {
+- if ((widget->trow - ((widget->vrows - 1) * 2)) >= 1)
+- {
+- widget->trow -= widget->vrows - 1;
+- widget->row -= widget->vrows - 1;
+- redrawTitles (widget, TRUE, FALSE);
+- refreshCells = TRUE;
+- movedCell = TRUE;
+- }
+- else
+- {
+- Beep ();
+- }
+- }
+- else
+- {
+- Beep ();
+- }
+- break;
+-
+- case CTRL ('G'):
+- jumpToCell (widget, -1, -1);
+- drawCDKMatrix (widget, ObjOf (widget)->box);
+- break;
+-
+- case CDK_PASTE:
+- if (GPasteBuffer == 0 ||
+- (int)strlen (GPasteBuffer) > widget->colwidths[widget->ccol])
+- {
+- Beep ();
+- }
+- else
+- {
+- strcpy (CurMatrixInfo (widget), GPasteBuffer);
+- drawCurCDKMatrixCell (widget);
+- }
+- break;
+-
+- case CDK_COPY:
+- freeChar (GPasteBuffer);
+- GPasteBuffer = copyChar (CurMatrixInfo (widget));
+- break;
+-
+- case CDK_CUT:
+- freeChar (GPasteBuffer);
+- GPasteBuffer = copyChar (CurMatrixInfo (widget));
+- cleanCDKMatrixCell (widget,
+- widget->trow + widget->crow - 1,
+- widget->lcol + widget->ccol - 1);
+- drawCurCDKMatrixCell (widget);
+- break;
+-
+- case CDK_ERASE:
+- cleanCDKMatrixCell (widget,
+- widget->trow + widget->crow - 1,
+- widget->lcol + widget->ccol - 1);
+- drawCurCDKMatrixCell (widget);
+- break;
+-
+- case KEY_ENTER:
+- if (!widget->boxCell)
+- {
+- attrbox (MATRIX_CELL (widget, widget->oldcrow, widget->oldccol),
+- ' ', ' ',
+- ' ', ' ',
+- ' ', ' ',
+- A_NORMAL);
+- }
+- else
+- {
+- drawOldCDKMatrixCell (widget);
+- }
+- wrefresh (CurMatrixCell (widget));
+- setExitType (widget, input);
+- ret = 1;
+- complete = TRUE;
+- break;
+-
+- case KEY_ERROR:
+- setExitType (widget, input);
+- complete = TRUE;
+- break;
+-
+- case KEY_ESC:
+- if (!widget->boxCell)
+- {
+- attrbox (MATRIX_CELL (widget, widget->oldcrow, widget->oldccol),
+- ' ', ' ',
+- ' ', ' ',
+- ' ', ' ',
+- A_NORMAL);
+- }
+- else
+- {
+- drawOldCDKMatrixCell (widget);
+- }
+- wrefresh (CurMatrixCell (widget));
+- setExitType (widget, input);
+- complete = TRUE;
+- break;
+-
+- case CDK_REFRESH:
+- eraseCDKScreen (ScreenOf (widget));
+- refreshCDKScreen (ScreenOf (widget));
+- break;
+-
+- default:
+- (widget->callbackfn) (widget, input);
+- break;
+- }
+- }
+-
+- if (!complete)
+- {
+- /* Did we change cells? */
+- if (movedCell)
+- {
+- /* un-highlight the old box */
+- if (!widget->boxCell)
+- {
+- attrbox (MATRIX_CELL (widget, widget->oldcrow, widget->oldccol),
+- ' ', ' ',
+- ' ', ' ',
+- ' ', ' ',
+- A_NORMAL);
+- }
+- else
+- {
+- drawOldCDKMatrixCell (widget);
+- }
+- wrefresh (MATRIX_CELL (widget, widget->oldcrow, widget->oldccol));
+-
+- /* Highlight the new cell. */
+- attrbox (CurMatrixCell (widget),
+- ACS_ULCORNER, ACS_URCORNER,
+- ACS_LLCORNER, ACS_LRCORNER,
+- ACS_HLINE, ACS_VLINE,
+- A_BOLD);
+- wrefresh (CurMatrixCell (widget));
+- highlightCDKMatrixCell (widget);
+- }
+-
+- /* Redraw each cell. */
+- if (refreshCells)
+- {
+- drawEachCDKMatrixCell (widget);
+-
+- /* Highlight the current cell. */
+- attrbox (CurMatrixCell (widget),
+- ACS_ULCORNER, ACS_URCORNER,
+- ACS_LLCORNER, ACS_LRCORNER,
+- ACS_HLINE, ACS_VLINE,
+- A_BOLD);
+- wrefresh (CurMatrixCell (widget));
+- highlightCDKMatrixCell (widget);
+- }
+-
+- /* Move to the correct position in the cell. */
+- if (refreshCells || movedCell)
+- {
+- if (widget->colwidths[widget->ccol] == 1)
+- {
+- wmove (CurMatrixCell (widget), 1, 1);
+- }
+- else
+- {
+- infolen = (int)strlen (CurMatrixInfo (widget));
+- wmove (CurMatrixCell (widget), 1, infolen + 1);
+- }
+- wrefresh (CurMatrixCell (widget));
+- }
+-
+- /* Should we call a post-process? */
+- if (PostProcessFuncOf (widget) != 0)
+- {
+- PostProcessFuncOf (widget) (vMATRIX,
+- widget,
+- PostProcessDataOf (widget),
+- input);
+- }
+- }
+- }
+-
+- if (!complete)
+- {
+- /* Set the variables we need. */
+- widget->oldcrow = widget->crow;
+- widget->oldccol = widget->ccol;
+- widget->oldvrow = widget->row;
+- widget->oldvcol = widget->col;
+-
+- /* Set the exit type and exit. */
+- setExitType (widget, 0);
+- }
+-
+- ResultOf (widget).valueInt = ret;
+- return (ret != unknownInt);
+-}
+-
+-/*
+- * This allows the programmer to define their own key mappings.
+- */
+-static void CDKMatrixCallBack (CDKMATRIX *matrix, chtype input)
+-{
+- EDisplayType disptype = (EDisplayType) matrix->colvalues[matrix->col];
+- int plainchar = filterByDisplayType (disptype, input);
+- int charcount = (int)strlen (MATRIX_INFO (matrix, matrix->row, matrix->col));
+-
+- if (plainchar == ERR)
+- {
+- Beep ();
+- }
+- else if (charcount == matrix->colwidths[matrix->col])
+- {
+- Beep ();
+- }
+- else
+- {
+- /* Update the screen. */
+- wmove (CurMatrixCell (matrix),
+- 1,
+- (int)strlen (MATRIX_INFO (matrix, matrix->row, matrix->col)) + 1);
+- waddch (CurMatrixCell (matrix),
+- (chtype)((isHiddenDisplayType (disptype))
+- ? (int)matrix->filler
+- : plainchar));
+- wrefresh (CurMatrixCell (matrix));
+-
+- /* Update the character pointer. */
+- MATRIX_INFO (matrix, matrix->row, matrix->col)[charcount++] = (char)plainchar;
+- MATRIX_INFO (matrix, matrix->row, matrix->col)[charcount] = '\0';
+- }
+-}
+-
+-/*
+- * Highlight the new field.
+- */
+-static void highlightCDKMatrixCell (CDKMATRIX *matrix)
+-{
+- /* *INDENT-EQLS* */
+- EDisplayType disptype = (EDisplayType) matrix->colvalues[matrix->col];
+- chtype highlight = matrix->highlight;
+- int x = 0;
+- int infolen = (int)strlen (MATRIX_INFO (matrix, matrix->row, matrix->col));
+-
+- /*
+- * Given the dominance of the colors/attributes, we need to set the
+- * current cell attribute.
+- */
+- if (matrix->dominant == ROW)
+- {
+- highlight = matrix->rowtitle[matrix->crow][0] & A_ATTRIBUTES;
+- }
+- else if (matrix->dominant == COL)
+- {
+- highlight = matrix->coltitle[matrix->ccol][0] & A_ATTRIBUTES;
+- }
+-
+- /* If the column is only one char. */
+- for (x = 1; x <= matrix->colwidths[matrix->ccol]; x++)
+- {
+- chtype ch = (((x <= infolen) && !isHiddenDisplayType (disptype))
+- ? CharOf (MATRIX_INFO (matrix,
+- matrix->row,
+- matrix->col)[x - 1])
+- : matrix->filler);
+-
+- mvwaddch (CurMatrixCell (matrix), 1, x, ch | highlight);
+- }
+- wmove (CurMatrixCell (matrix), 1, infolen + 1);
+- wrefresh (CurMatrixCell (matrix));
+-}
+-
+-/*
+- * This moves the matrix field to the given location.
+- */
+-static void _moveCDKMatrix (CDKOBJS *object,
+- int xplace,
+- int yplace,
+- boolean relative,
+- boolean refresh_flag)
+-{
+- /* *INDENT-EQLS* */
+- CDKMATRIX *matrix = (CDKMATRIX *)object;
+- int currentX = getbegx (matrix->win);
+- int currentY = getbegy (matrix->win);
+- int xpos = xplace;
+- int ypos = yplace;
+- int xdiff = 0;
+- int ydiff = 0;
+- int x, y;
+-
+- /*
+- * If this is a relative move, then we will adjust where we want
+- * to move to.
+- */
+- if (relative)
+- {
+- xpos = getbegx (matrix->win) + xplace;
+- ypos = getbegy (matrix->win) + yplace;
+- }
+-
+- /* Adjust the window if we need to. */
+- alignxy (WindowOf (matrix), &xpos, &ypos, matrix->boxWidth, matrix->boxHeight);
+-
+- /* Get the difference. */
+- xdiff = currentX - xpos;
+- ydiff = currentY - ypos;
+-
+- /* Move the window to the new location. */
+- moveCursesWindow (matrix->win, -xdiff, -ydiff);
+-
+- for (x = 0; x <= matrix->vrows; x++)
+- {
+- for (y = 0; y <= matrix->vcols; y++)
+- {
+- moveCursesWindow (MATRIX_CELL (matrix, x, y), -xdiff, -ydiff);
+- }
+- }
+-
+- moveCursesWindow (matrix->shadowWin, -xdiff, -ydiff);
+-
+- /* Touch the windows so they 'move'. */
+- refreshCDKWindow (WindowOf (matrix));
+-
+- /* Redraw the window, if they asked for it. */
+- if (refresh_flag)
+- {
+- drawCDKMatrix (matrix, ObjOf (matrix)->box);
+- }
+-}
+-
+-/*
+- * This draws a cell within a matrix.
+- */
+-static void drawCDKMatrixCell (CDKMATRIX *matrix,
+- int row,
+- int col,
+- int vrow,
+- int vcol,
+- chtype attr,
+- boolean Box)
+-{
+- /* *INDENT-EQLS* */
+- WINDOW *cell = MATRIX_CELL (matrix, row, col);
+- EDisplayType disptype = (EDisplayType) matrix->colvalues[matrix->col];
+- chtype highlight = matrix->filler & A_ATTRIBUTES;
+- int rows = matrix->vrows;
+- int cols = matrix->vcols;
+- int infolen = (int)strlen (MATRIX_INFO (matrix, vrow, vcol));
+- int x;
+-
+- /*
+- * Given the dominance of the colors/attributes, we need to set the
+- * current cell attribute.
+- */
+- if (matrix->dominant == ROW)
+- {
+- highlight = matrix->rowtitle[row][0] & A_ATTRIBUTES;
+- }
+- else if (matrix->dominant == COL)
+- {
+- highlight = matrix->coltitle[col][0] & A_ATTRIBUTES;
+- }
+-
+- /* Draw in the cell info. */
+- for (x = 1; x <= matrix->colwidths[col]; x++)
+- {
+- chtype ch = (((x <= infolen) && !isHiddenDisplayType (disptype))
+- ? (CharOf (MATRIX_INFO (matrix, vrow, vcol)[x - 1]) | highlight)
+- : matrix->filler);
+-
+- mvwaddch (cell, 1, x, ch | highlight);
+- }
+- wmove (cell, 1, infolen + 1);
+- wrefresh (cell);
+-
+- /* Only draw the box iff the user asked for a box. */
+- if (!Box)
+- {
+- return;
+- }
+-
+- /*
+- * If the value of the column spacing is greater than 0 then these
+- * are independent boxes.
+- */
+- if (matrix->colSpace != 0 && matrix->rowSpace != 0)
+- {
+- attrbox (cell,
+- ACS_ULCORNER, ACS_URCORNER,
+- ACS_LLCORNER, ACS_LRCORNER,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- return;
+- }
+- if (matrix->colSpace != 0 && matrix->rowSpace == 0)
+- {
+- if (row == 1)
+- {
+- attrbox (cell,
+- ACS_ULCORNER, ACS_URCORNER,
+- ACS_LTEE, ACS_RTEE,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- return;
+- }
+- else if (row > 1 && row < rows)
+- {
+- attrbox (cell,
+- ACS_LTEE, ACS_RTEE,
+- ACS_LTEE, ACS_RTEE,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- return;
+- }
+- else if (row == rows)
+- {
+- attrbox (cell,
+- ACS_LTEE, ACS_RTEE,
+- ACS_LLCORNER, ACS_LRCORNER,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- return;
+- }
+- }
+- if (matrix->colSpace == 0 && matrix->rowSpace != 0)
+- {
+- if (col == 1)
+- {
+- attrbox (cell,
+- ACS_ULCORNER, ACS_TTEE,
+- ACS_LLCORNER, ACS_BTEE,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- return;
+- }
+- else if (col > 1 && col < cols)
+- {
+- attrbox (cell,
+- ACS_TTEE, ACS_TTEE,
+- ACS_BTEE, ACS_BTEE,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- return;
+- }
+- else if (col == cols)
+- {
+- attrbox (cell,
+- ACS_TTEE, ACS_URCORNER,
+- ACS_BTEE, ACS_LRCORNER,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- return;
+- }
+- }
+-
+- /* Start drawing the matrix. */
+- if (row == 1)
+- {
+- if (col == 1)
+- {
+- /* Draw the top left corner */
+- attrbox (cell,
+- ACS_ULCORNER, ACS_TTEE,
+- ACS_LTEE, ACS_PLUS,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- }
+- else if (col > 1 && col < cols)
+- {
+- /* Draw the top middle box */
+- attrbox (cell,
+- ACS_TTEE, ACS_TTEE,
+- ACS_PLUS, ACS_PLUS,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- }
+- else if (col == cols)
+- {
+- /* Draw the top right corner */
+- attrbox (cell,
+- ACS_TTEE, ACS_URCORNER,
+- ACS_PLUS, ACS_RTEE,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- }
+- }
+- else if (row > 1 && row < rows)
+- {
+- if (col == 1)
+- {
+- /* Draw the middle left box */
+- attrbox (cell,
+- ACS_LTEE, ACS_PLUS,
+- ACS_LTEE, ACS_PLUS,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- }
+- else if (col > 1 && col < cols)
+- {
+- /* Draw the middle box */
+- attrbox (cell,
+- ACS_PLUS, ACS_PLUS,
+- ACS_PLUS, ACS_PLUS,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- }
+- else if (col == cols)
+- {
+- /* Draw the middle right box */
+- attrbox (cell,
+- ACS_PLUS, ACS_RTEE,
+- ACS_PLUS, ACS_RTEE,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- }
+- }
+- else if (row == rows)
+- {
+- if (col == 1)
+- {
+- /* Draw the bottom left corner */
+- attrbox (cell,
+- ACS_LTEE, ACS_PLUS,
+- ACS_LLCORNER, ACS_BTEE,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- }
+- else if (col > 1 && col < cols)
+- {
+- /* Draw the bottom middle box */
+- attrbox (cell,
+- ACS_PLUS, ACS_PLUS,
+- ACS_BTEE, ACS_BTEE,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- }
+- else if (col == cols)
+- {
+- /* Draw the bottom right corner */
+- attrbox (cell,
+- ACS_PLUS, ACS_RTEE,
+- ACS_BTEE, ACS_LRCORNER,
+- ACS_HLINE, ACS_VLINE,
+- attr);
+- }
+- }
+-
+- /* Highlight the current cell. */
+- attrbox (CurMatrixCell (matrix),
+- ACS_ULCORNER, ACS_URCORNER,
+- ACS_LLCORNER, ACS_LRCORNER,
+- ACS_HLINE, ACS_VLINE,
+- A_BOLD);
+- wrefresh (CurMatrixCell (matrix));
+- highlightCDKMatrixCell (matrix);
+-}
+-
+-static void drawEachColTitle (CDKMATRIX *matrix)
+-{
+- int x;
+-
+- for (x = 1; x <= matrix->vcols; x++)
+- {
+- if (MATRIX_CELL (matrix, 0, x))
+- {
+- werase (MATRIX_CELL (matrix, 0, x)); /*VR */
+- writeChtype (MATRIX_CELL (matrix, 0, x),
+- matrix->coltitlePos[matrix->lcol + x - 1], 0,
+- matrix->coltitle[matrix->lcol + x - 1],
+- HORIZONTAL,
+- 0, matrix->coltitleLen[matrix->lcol + x - 1]);
+- wrefresh (MATRIX_CELL (matrix, 0, x));
+- }
+- }
+-}
+-
+-static void drawEachRowTitle (CDKMATRIX *matrix)
+-{
+- int x;
+-
+- for (x = 1; x <= matrix->vrows; x++)
+- {
+- if (MATRIX_CELL (matrix, x, 0))
+- {
+- werase (MATRIX_CELL (matrix, x, 0));
+- writeChtype (MATRIX_CELL (matrix, x, 0),
+- matrix->rowtitlePos[matrix->trow + x - 1], 1,
+- matrix->rowtitle[matrix->trow + x - 1],
+- HORIZONTAL,
+- 0, matrix->rowtitleLen[matrix->trow + x - 1]);
+- wrefresh (MATRIX_CELL (matrix, x, 0));
+- }
+- }
+-}
+-
+-static void drawEachCDKMatrixCell (CDKMATRIX *matrix)
+-{
+- int y, x;
+-
+- /* Fill in the cells. */
+- for (x = 1; x <= matrix->vrows; x++)
+- {
+- for (y = 1; y <= matrix->vcols; y++)
+- {
+- drawCDKMatrixCell (matrix, x, y,
+- matrix->trow + x - 1,
+- matrix->lcol + y - 1,
+- A_NORMAL,
+- matrix->boxCell);
+- }
+- }
+-}
+-
+-static void drawCurCDKMatrixCell (CDKMATRIX *matrix)
+-{
+- drawCDKMatrixCell (matrix,
+- matrix->crow,
+- matrix->ccol,
+- matrix->row,
+- matrix->col,
+- A_NORMAL,
+- matrix->boxCell);
+-}
+-
+-static void drawOldCDKMatrixCell (CDKMATRIX *matrix)
+-{
+- drawCDKMatrixCell (matrix,
+- matrix->oldcrow,
+- matrix->oldccol,
+- matrix->oldvrow,
+- matrix->oldvcol,
+- A_NORMAL,
+- matrix->boxCell);
+-}
+-
+-/*
+- * This function draws the matrix widget.
+- */
+-static void _drawCDKMatrix (CDKOBJS *object, boolean Box)
+-{
+- CDKMATRIX *matrix = (CDKMATRIX *)object;
+-
+- /* Did we ask for a shadow??? */
+- if (matrix->shadowWin != 0)
+- {
+- drawShadow (matrix->shadowWin);
+- }
+-
+- /* Should we box the matrix??? */
+- if (Box)
+- {
+- drawObjBox (matrix->win, ObjOf (matrix));
+- }
+-
+- drawCdkTitle (matrix->win, object);
+-
+- wrefresh (matrix->win);
+-
+- drawEachColTitle (matrix);
+- drawEachRowTitle (matrix);
+- drawEachCDKMatrixCell (matrix);
+-
+- /* Highlight the current cell. */
+- attrbox (CurMatrixCell (matrix),
+- ACS_ULCORNER, ACS_URCORNER,
+- ACS_LLCORNER, ACS_LRCORNER,
+- ACS_HLINE, ACS_VLINE,
+- A_BOLD);
+- wrefresh (CurMatrixCell (matrix));
+- highlightCDKMatrixCell (matrix);
+-}
+-
+-/*
+- * This function destroys the matrix widget.
+- */
+-static void _destroyCDKMatrix (CDKOBJS *object)
+-{
+- if (object != 0)
+- {
+- CDKMATRIX *matrix = (CDKMATRIX *)object;
+- int x = 0;
+- int y = 0;
+-
+- cleanCdkTitle (object);
+-
+- /* Clear out the col titles. */
+- for (x = 1; x <= matrix->cols; x++)
+- {
+- freeChtype (matrix->coltitle[x]);
+- }
+-
+- /* Clear out the row titles. */
+- for (x = 1; x <= matrix->rows; x++)
+- {
+- freeChtype (matrix->rowtitle[x]);
+- }
+-
+- /* Clear out the matrix cells. */
+- for (x = 1; x <= matrix->rows; x++)
+- {
+- for (y = 1; y <= matrix->cols; y++)
+- {
+- freeChar (MATRIX_INFO (matrix, x, y));
+- }
+- }
+-
+- /* Clear the matrix windows. */
+- deleteCursesWindow (MATRIX_CELL (matrix, 0, 0));
+- for (x = 1; x <= matrix->vrows; x++)
+- {
+- deleteCursesWindow (MATRIX_CELL (matrix, x, 0));
+- }
+- for (x = 1; x <= matrix->vcols; x++)
+- {
+- deleteCursesWindow (MATRIX_CELL (matrix, 0, x));
+- }
+- for (x = 1; x <= matrix->vrows; x++)
+- {
+- for (y = 1; y <= matrix->vcols; y++)
+- {
+- deleteCursesWindow (MATRIX_CELL (matrix, x, y));
+- }
+- }
+-
+-#if NEW_CDKMATRIX
+- freeChecked (matrix->cell);
+- freeChecked (matrix->info);
+-#endif
+-
+- freeChecked (matrix->colwidths);
+- freeChecked (matrix->colvalues);
+-
+- freeChecked (matrix->coltitle);
+- freeChecked (matrix->coltitleLen);
+- freeChecked (matrix->coltitlePos);
+-
+- freeChecked (matrix->rowtitle);
+- freeChecked (matrix->rowtitleLen);
+- freeChecked (matrix->rowtitlePos);
+-
+- deleteCursesWindow (matrix->shadowWin);
+- deleteCursesWindow (matrix->win);
+-
+- /* Clean the key bindings. */
+- cleanCDKObjectBindings (vMATRIX, matrix);
+-
+- /* Unregister this object. */
+- unregisterCDKObject (vMATRIX, matrix);
+- }
+-}
+-
+-/*
+- * This function erases the matrix widget from the screen.
+- */
+-static void _eraseCDKMatrix (CDKOBJS *object)
+-{
+- if (validCDKObject (object))
+- {
+- CDKMATRIX *matrix = (CDKMATRIX *)object;
+- int x = 0;
+- int y = 0;
+-
+- /* Clear the matrix cells. */
+- eraseCursesWindow (MATRIX_CELL (matrix, 0, 0));
+- for (x = 1; x <= matrix->vrows; x++)
+- {
+- eraseCursesWindow (MATRIX_CELL (matrix, x, 0));
+- }
+- for (x = 1; x <= matrix->vcols; x++)
+- {
+- eraseCursesWindow (MATRIX_CELL (matrix, 0, x));
+- }
+- for (x = 1; x <= matrix->vrows; x++)
+- {
+- for (y = 1; y <= matrix->vcols; y++)
+- {
+- eraseCursesWindow (MATRIX_CELL (matrix, x, y));
+- }
+- }
+- eraseCursesWindow (matrix->shadowWin);
+- eraseCursesWindow (matrix->win);
+- }
+-}
+-
+-/*
+- * Set the callback-function.
+- */
+-void setCDKMatrixCB (CDKMATRIX *widget, MATRIXCB callback)
+-{
+- widget->callbackfn = callback;
+-}
+-
+-/*
+- * This function sets the values of the matrix widget.
+- */
+-void setCDKMatrixCells (CDKMATRIX *matrix,
+- CDK_CSTRING2 info,
+- int rows,
+- int maxcols,
+- int *subSize)
+-{
+- int x = 0;
+- int y = 0;
+-
+- if (rows > matrix->rows)
+- rows = matrix->rows;
+-
+- /* Copy in the new info. */
+- for (x = 1; x <= rows; x++)
+- {
+- for (y = 1; y <= matrix->cols; y++)
+- {
+- if (x <= rows && y <= subSize[x])
+- {
+- const char *source = info[(x * maxcols) + y];
+-
+- /* Copy in the new information. */
+- if (source != 0)
+- {
+- char *target = MATRIX_INFO (matrix, x, y);
+-
+- if (target == 0) /* this should not happen... */
+- {
+- target = typeCallocN (char, matrix->colwidths[y] + 1);
+- MATRIX_INFO (matrix, x, y) = target;
+- }
+- strncpy (MATRIX_INFO (matrix, x, y),
+- source,
+- (size_t) matrix->colwidths[y]);
+- }
+- }
+- else
+- cleanCDKMatrixCell (matrix, x, y);
+- }
+- }
+-}
+-
+-/*
+- * This sets the widget's box attribute.
+- */
+-void setCDKMatrixBox (CDKMATRIX *matrix, boolean Box)
+-{
+- ObjOf (matrix)->box = Box;
+- ObjOf (matrix)->borderSize = Box ? 1 : 0;
+-}
+-boolean getCDKMatrixBox (CDKMATRIX *matrix)
+-{
+- return ObjOf (matrix)->box;
+-}
+-
+-/*
+- * This cleans out the information cells in the matrix widget.
+- */
+-void cleanCDKMatrix (CDKMATRIX *matrix)
+-{
+- int x = 0;
+- int y = 0;
+-
+- for (x = 1; x <= matrix->rows; x++)
+- {
+- for (y = 1; y <= matrix->cols; y++)
+- {
+- cleanCDKMatrixCell (matrix, x, y);
+- }
+- }
+-}
+-
+-/*
+- * This cleans one cell in the matrix widget.
+- */
+-void cleanCDKMatrixCell (CDKMATRIX *matrix, int row, int col)
+-{
+- if (row > 0 && row <= matrix->rows &&
+- col > 0 && col <= matrix->cols)
+- cleanChar (MATRIX_INFO (matrix, row, col), matrix->colwidths[col], '\0');
+-}
+-
+-/*
+- * This allows us to hyper-warp to a cell.
+- */
+-int jumpToCell (CDKMATRIX *matrix, int row, int col)
+-{
+- CDKSCALE *scale = 0;
+- int newRow = row;
+- int newCol = col;
+-
+- /*
+- * Only create the row scale if needed.
+- */
+- if ((row == -1) || (row > matrix->rows))
+- {
+- /* Create the row scale widget. */
+- scale = newCDKScale (ScreenOf (matrix),
+- CENTER, CENTER,
+- "<C>Jump to which row.",
+- "</5/B>Row: ", A_NORMAL, 5,
+- 1, 1, matrix->rows, 1, 1, TRUE, FALSE);
+-
+- /* Activate the scale and get the row. */
+- newRow = activateCDKScale (scale, 0);
+- destroyCDKScale (scale);
+- }
+-
+- /*
+- * Only create the column scale if needed.
+- */
+- if ((col == -1) || (col > matrix->cols))
+- {
+- /* Create the column scale widget. */
+- scale = newCDKScale (ScreenOf (matrix),
+- CENTER, CENTER,
+- "<C>Jump to which column",
+- "</5/B>Col: ", A_NORMAL, 5,
+- 1, 1, matrix->cols, 1, 1, TRUE, FALSE);
+-
+- /* Activate the scale and get the column. */
+- newCol = activateCDKScale (scale, 0);
+- destroyCDKScale (scale);
+- }
+-
+- /* Hyper-warp.... */
+- if (newRow != matrix->row || newCol != matrix->col)
+- {
+- return (moveToCDKMatrixCell (matrix, newRow, newCol));
+- }
+- else
+- {
+- return 1;
+- }
+-}
+-
+-/*
+- * This allows us to move to a given cell.
+- */
+-int moveToCDKMatrixCell (CDKMATRIX *matrix, int newrow, int newcol)
+-{
+- int rowShift = newrow - matrix->row;
+- int colShift = newcol - matrix->col;
+-
+- /* Make sure we arent asking to move out of the matrix. */
+- if (newrow > matrix->rows ||
+- newcol > matrix->cols ||
+- newrow <= 0 ||
+- newcol <= 0)
+- {
+- return 0;
+- }
+-
+- /* Did we move up/down???? */
+- if (rowShift > 0)
+- {
+- /* We are moving down. */
+- if (matrix->vrows == matrix->cols)
+- {
+- matrix->trow = 1;
+- matrix->crow = newrow;
+- matrix->row = newrow;
+- }
+- else
+- {
+- if ((rowShift + matrix->vrows) < matrix->rows)
+- {
+- /* Just shift down by rowShift... */
+- matrix->trow += rowShift;
+- matrix->crow = 1;
+- matrix->row += rowShift;
+- }
+- else
+- {
+- /* We need to munge with the values... */
+- matrix->trow = matrix->rows - matrix->vrows + 1;
+- matrix->crow = ((rowShift + matrix->vrows) - matrix->rows) + 1;
+- matrix->row = newrow;
+- }
+- }
+- }
+- else if (rowShift < 0)
+- {
+- /* We are moving up. */
+- if (matrix->vrows == matrix->rows)
+- {
+- matrix->trow = 1;
+- matrix->row = newrow;
+- matrix->crow = newrow;
+- }
+- else
+- {
+- if ((rowShift + matrix->vrows) > 1)
+- {
+- /* Just shift up by rowShift... */
+- matrix->trow += rowShift;
+- matrix->row += rowShift;
+- matrix->crow = 1;
+- }
+- else
+- {
+- /* We need to munge with the values... */
+- matrix->trow = 1;
+- matrix->crow = 1;
+- matrix->row = 1;
+- }
+- }
+- }
+-
+- /* Did we move left/right ???? */
+- if (colShift > 0)
+- {
+- /* We are moving right. */
+- if (matrix->vcols == matrix->cols)
+- {
+- matrix->lcol = 1;
+- matrix->ccol = newcol;
+- matrix->col = newcol;
+- }
+- else
+- {
+- if ((colShift + matrix->vcols) < matrix->cols)
+- {
+- matrix->lcol += colShift;
+- matrix->ccol = 1;
+- matrix->col += colShift;
+- }
+- else
+- {
+- /* We need to munge with the values... */
+- matrix->lcol = matrix->cols - matrix->vcols + 1;
+- matrix->ccol = ((colShift + matrix->vcols) - matrix->cols) + 1;
+- matrix->col = newcol;
+- }
+- }
+- }
+- else if (colShift < 0)
+- {
+- /* We are moving left. */
+- if (matrix->vcols == matrix->cols)
+- {
+- matrix->lcol = 1;
+- matrix->col = newcol;
+- matrix->ccol = newcol;
+- }
+- else
+- {
+- if ((colShift + matrix->vcols) > 1)
+- {
+- /* Just shift left by colShift... */
+- matrix->lcol += colShift;
+- matrix->col += colShift;
+- matrix->ccol = 1;
+- }
+- else
+- {
+- matrix->lcol = 1;
+- matrix->col = 1;
+- matrix->ccol = 1;
+- }
+- }
+- }
+-
+- /* Keep the 'old' values around for redrawing sake. */
+- matrix->oldcrow = matrix->crow;
+- matrix->oldccol = matrix->ccol;
+- matrix->oldvrow = matrix->row;
+- matrix->oldvcol = matrix->col;
+-
+- /* Lets ... */
+- return 1;
+-}
+-
+-/*
+- * This redraws the titles indicated...
+- */
+-static void redrawTitles (CDKMATRIX *matrix, int rowTitles, int colTitles)
+-{
+- /* Redraw the row titles. */
+- if (rowTitles)
+- {
+- drawEachRowTitle (matrix);
+- }
+-
+- /* Redraw the column titles. */
+- if (colTitles)
+- {
+- drawEachColTitle (matrix);
+- }
+-}
+-
+-/*
+- * This sets the value of a matrix cell.
+- */
+-int setCDKMatrixCell (CDKMATRIX *matrix, int row, int col, const char *value)
+-{
+- /* Make sure the row/col combination is within the matrix. */
+- if (row > matrix->rows || col > matrix->cols || row <= 0 || col <= 0)
+- {
+- return -1;
+- }
+-
+- cleanCDKMatrixCell (matrix, row, col);
+- strncpy (MATRIX_INFO (matrix, row, col),
+- value,
+- (size_t) matrix->colwidths[col]);
+- return 1;
+-}
+-
+-/*
+- * This gets the value of a matrix cell.
+- */
+-char *getCDKMatrixCell (CDKMATRIX *matrix, int row, int col)
+-{
+- /* Make sure the row/col combination is within the matrix. */
+- if (row > matrix->rows || col > matrix->cols || row <= 0 || col <= 0)
+- {
+- return 0;
+- }
+- return MATRIX_INFO (matrix, row, col);
+-}
+-
+-/*
+- * This returns the current row/col cell.
+- */
+-int getCDKMatrixCol (CDKMATRIX *matrix)
+-{
+- return matrix->col;
+-}
+-int getCDKMatrixRow (CDKMATRIX *matrix)
+-{
+- return matrix->row;
+-}
+-
+-/*
+- * This sets the background attribute of the widget.
+- */
+-static void _setBKattrMatrix (CDKOBJS *object, chtype attrib)
+-{
+- if (object != 0)
+- {
+- CDKMATRIX *widget = (CDKMATRIX *)object;
+- int x, y;
+-
+- wbkgd (widget->win, attrib);
+- for (x = 0; x <= widget->vrows; x++)
+- {
+- for (y = 0; y <= widget->vcols; y++)
+- {
+- wbkgd (MATRIX_CELL (widget, x, y), attrib);
+- }
+- }
+- }
+-}
+-
+-static void _focusCDKMatrix (CDKOBJS *object)
+-{
+- CDKMATRIX *widget = (CDKMATRIX *)object;
+-
+- drawCDKMatrix (widget, ObjOf (widget)->box);
+-}
+-
+-static void _unfocusCDKMatrix (CDKOBJS *object)
+-{
+- CDKMATRIX *widget = (CDKMATRIX *)object;
+-
+- drawCDKMatrix (widget, ObjOf (widget)->box);
+-}
+-
+-dummyRefreshData (Matrix)
+-
+-dummySaveData (Matrix)
+diff -r fbcff989cc14 selection.c
+--- a/selection.c Thu Jun 13 12:05:08 2013 -0400
++++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+@@ -1,1005 +0,0 @@
+-#include <cdk_int.h>
+-
+-/*
+- * $Author: tom $
+- * $Date: 2012/03/21 21:01:23 $
+- * $Revision: 1.151 $
+- */
+-
+-/*
+- * Declare file local prototypes.
+- */
+-static int createList (CDKSELECTION *selection, CDK_CSTRING2 list, int listSize);
+-static void drawCDKSelectionList (CDKSELECTION *selection, boolean Box);
+-static void setViewSize (CDKSELECTION *scrollp, int listSize);
+-static int maxViewSize (CDKSELECTION *scrollp);
+-
+-/* Determine how many characters we can shift to the right */
+-/* before all the items have been scrolled off the screen. */
+-#define AvailableWidth(w) ((w)->boxWidth - 2*BorderOf(w) - (w)->maxchoicelen)
+-#define updateViewWidth(w, widest) \
+- (w)->maxLeftChar = (((w)->boxWidth > widest) \
+- ? 0 \
+- : (widest - AvailableWidth(w)))
+-#define WidestItem(w) ((w)->maxLeftChar + AvailableWidth(w))
+-
+-#define SCREENPOS(w,n) (w)->itemPos[n] - (w)->leftChar + scrollbarAdj /* + BorderOf(w) */
+-
+-DeclareCDKObjects (SELECTION, Selection, setCdk, Int);
+-
+-/*
+- * This function creates a selection widget.
+- */
+-CDKSELECTION *newCDKSelection (CDKSCREEN *cdkscreen,
+- int xplace,
+- int yplace,
+- int splace,
+- int height,
+- int width,
+- const char *title,
+- CDK_CSTRING2 list,
+- int listSize,
+- CDK_CSTRING2 choices,
+- int choiceCount,
+- chtype highlight,
+- boolean Box,
+- boolean shadow)
+-{
+- /* *INDENT-EQLS* */
+- CDKSELECTION *selection = 0;
+- int widestItem = -1;
+- int parentWidth = getmaxx (cdkscreen->window);
+- int parentHeight = getmaxy (cdkscreen->window);
+- int boxWidth = width;
+- int boxHeight = height;
+- int xpos = xplace;
+- int ypos = yplace;
+- int j = 0;
+- int junk2;
+- /* *INDENT-OFF* */
+- static const struct { int from; int to; } bindings[] = {
+- { CDK_BACKCHAR, KEY_PPAGE },
+- { CDK_FORCHAR, KEY_NPAGE },
+- { 'g', KEY_HOME },
+- { '1', KEY_HOME },
+- { 'G', KEY_END },
+- { '<', KEY_HOME },
+- { '>', KEY_END },
+- };
+- /* *INDENT-ON* */
+-
+- if (choiceCount <= 0
+- || (selection = newCDKObject (CDKSELECTION, &my_funcs)) == 0
+- || (selection->choice = typeCallocN (chtype *, choiceCount + 1)) == 0
+- || (selection->choicelen = typeCallocN (int, choiceCount + 1)) == 0)
+- {
+- destroyCDKObject (selection);
+- return (0);
+- }
+-
+- setCDKSelectionBox (selection, Box);
+-
+- /*
+- * If the height is a negative value, the height will
+- * be ROWS-height, otherwise, the height will be the
+- * given height.
+- */
+- boxHeight = setWidgetDimension (parentHeight, height, 0);
+-
+- /*
+- * If the width is a negative value, the width will
+- * be COLS-width, otherwise, the width will be the
+- * given width.
+- */
+- boxWidth = setWidgetDimension (parentWidth, width, 0);
+-
+- boxWidth = setCdkTitle (ObjOf (selection), title, boxWidth);
+-
+- /* Set the box height. */
+- if (TitleLinesOf (selection) > boxHeight)
+- {
+- boxHeight = TitleLinesOf (selection)
+- + MINIMUM (listSize, 8)
+- + 2 * BorderOf (selection);
+- }
+-
+- selection->maxchoicelen = 0;
+-
+- /* Adjust the box width if there is a scroll bar. */
+- if (splace == LEFT || splace == RIGHT)
+- {
+- boxWidth++;
+- selection->scrollbar = TRUE;
+- }
+- else
+- {
+- selection->scrollbar = FALSE;
+- }
+-
+- /*
+- * Make sure we didn't extend beyond the dimensions of the window.
+- */
+- selection->boxWidth = (boxWidth > parentWidth ? parentWidth : boxWidth);
+- selection->boxHeight = (boxHeight > parentHeight ? parentHeight : boxHeight);
+-
+- setViewSize (selection, listSize);
+-
+- /* Rejustify the x and y positions if we need to. */
+- alignxy (cdkscreen->window, &xpos, &ypos, selection->boxWidth, selection->boxHeight);
+-
+- /* Make the selection window */
+- selection->win = newwin (selection->boxHeight, selection->boxWidth, ypos, xpos);
+-
+- /* Is the window null?? */
+- if (selection->win == 0)
+- {
+- destroyCDKObject (selection);
+- return (0);
+- }
+-
+- /* Turn the keypad on for this window. */
+- keypad (selection->win, TRUE);
+-
+- /* Create the scrollbar window. */
+- if (splace == RIGHT)
+- {
+- selection->scrollbarWin = subwin (selection->win,
+- maxViewSize (selection), 1,
+- SCREEN_YPOS (selection, ypos),
+- (xpos
+- + selection->boxWidth
+- - BorderOf (selection)
+- - 1));
+- }
+- else if (splace == LEFT)
+- {
+- selection->scrollbarWin = subwin (selection->win,
+- maxViewSize (selection), 1,
+- SCREEN_YPOS (selection, ypos),
+- SCREEN_XPOS (selection, xpos));
+- }
+- else
+- {
+- selection->scrollbarWin = 0;
+- }
+-
+- /* *INDENT-EQLS* Set the rest of the variables */
+- ScreenOf (selection) = cdkscreen;
+- selection->parent = cdkscreen->window;
+- selection->scrollbarPlacement = splace;
+- selection->maxLeftChar = 0;
+- selection->leftChar = 0;
+- selection->highlight = highlight;
+- selection->choiceCount = choiceCount;
+- initExitType (selection);
+- ObjOf (selection)->acceptsFocus = TRUE;
+- ObjOf (selection)->inputWindow = selection->win;
+- selection->shadow = shadow;
+-
+- setCDKSelectionCurrent (selection, 0);
+-
+- /* Each choice has to be converted from char * to chtype * */
+- for (j = 0; j < choiceCount; j++)
+- {
+- selection->choice[j] = char2Chtype (choices[j],
+- &selection->choicelen[j],
+- &junk2);
+- selection->maxchoicelen = MAXIMUM (selection->maxchoicelen,
+- selection->choicelen[j]);
+- }
+-
+- /* Each item in the needs to be converted to chtype * */
+- widestItem = createList (selection, list, listSize);
+- if (widestItem > 0)
+- {
+- updateViewWidth (selection, widestItem);
+- }
+- else if (listSize)
+- {
+- destroyCDKObject (selection);
+- return (0);
+- }
+-
+- /* Do we need to create a shadow. */
+- if (shadow)
+- {
+- selection->shadowWin = newwin (boxHeight, boxWidth, ypos + 1, xpos + 1);
+- }
+-
+- /* Setup the key bindings. */
+- for (j = 0; j < (int)SIZEOF (bindings); ++j)
+- bindCDKObject (vSELECTION,
+- selection,
+- (chtype)bindings[j].from,
+- getcCDKBind,
+- (void *)(long)bindings[j].to);
+-
+- /* Register this baby. */
+- registerCDKObject (cdkscreen, vSELECTION, selection);
+-
+- /* Return the selection list */
+- return (selection);
+-}
+-
+-/*
+- * Put the cursor on the currently-selected item.
+- */
+-static void fixCursorPosition (CDKSELECTION *selection)
+-{
+- int scrollbarAdj = (selection->scrollbarPlacement == LEFT) ? 1 : 0;
+- int ypos = SCREEN_YPOS (selection, selection->currentItem - selection->currentTop);
+- int xpos = SCREEN_XPOS (selection, 0) + scrollbarAdj;
+-
+- wmove (InputWindowOf (selection), ypos, xpos);
+- wrefresh (InputWindowOf (selection));
+-}
+-
+-/*
+- * This actually manages the selection widget...
+- */
+-int activateCDKSelection (CDKSELECTION *selection, chtype *actions)
+-{
+- /* Draw the selection list */
+- drawCDKSelection (selection, ObjOf (selection)->box);
+-
+- if (actions == 0)
+- {
+- chtype input;
+- boolean functionKey;
+- int ret;
+-
+- for (;;)
+- {
+- fixCursorPosition (selection);
+- input = (chtype)getchCDKObject (ObjOf (selection), &functionKey);
+-
+- /* Inject the character into the widget. */
+- ret = injectCDKSelection (selection, input);
+- if (selection->exitType != vEARLY_EXIT)
+- {
+- return ret;
+- }
+- }
+- }
+- else
+- {
+- int length = chlen (actions);
+- int j = 0;
+- int ret;
+-
+- /* Inject each character one at a time. */
+- for (j = 0; j < length; j++)
+- {
+- ret = injectCDKSelection (selection, actions[j]);
+- if (selection->exitType != vEARLY_EXIT)
+- {
+- return ret;
+- }
+- }
+- }
+-
+- /* Set the exit type and return. */
+- setExitType (selection, 0);
+- return 0;
+-}
+-
+-/*
+- * This injects a single character into the widget.
+- */
+-static int _injectCDKSelection (CDKOBJS *object, chtype input)
+-{
+- CDKSELECTION *widget = (CDKSELECTION *)object;
+- int ppReturn = 1;
+- int ret = unknownInt;
+- bool complete = FALSE;
+-
+- /* Set the exit type. */
+- setExitType (widget, 0);
+-
+- /* Draw the widget list */
+- drawCDKSelectionList (widget, ObjOf (widget)->box);
+-
+- /* Check if there is a pre-process function to be called. */
+- if (PreProcessFuncOf (widget) != 0)
+- {
+- /* Call the pre-process function. */
+- ppReturn = PreProcessFuncOf (widget) (vSELECTION,
+- widget,
+- PreProcessDataOf (widget),
+- input);
+- }
+-
+- /* Should we continue? */
+- if (ppReturn != 0)
+- {
+- /* Check for a predefined binding. */
+- if (checkCDKObjectBind (vSELECTION, widget, input) != 0)
+- {
+- checkEarlyExit (widget);
+- complete = TRUE;
+- }
+- else
+- {
+- switch (input)
+- {
+- case KEY_UP:
+- scroller_KEY_UP (widget);
+- break;
+-
+- case KEY_DOWN:
+- scroller_KEY_DOWN (widget);
+- break;
+-
+- case KEY_RIGHT:
+- scroller_KEY_RIGHT (widget);
+- break;
+-
+- case KEY_LEFT:
+- scroller_KEY_LEFT (widget);
+- break;
+-
+- case KEY_PPAGE:
+- scroller_KEY_PPAGE (widget);
+- break;
+-
+- case KEY_NPAGE:
+- scroller_KEY_NPAGE (widget);
+- break;
+-
+- case KEY_HOME:
+- scroller_KEY_HOME (widget);
+- break;
+-
+- case KEY_END:
+- scroller_KEY_END (widget);
+- break;
+-
+- case '$':
+- widget->leftChar = widget->maxLeftChar;
+- break;
+-
+- case '|':
+- widget->leftChar = 0;
+- break;
+-
+- case SPACE:
+- if (widget->mode[widget->currentItem] == 0)
+- {
+- if (widget->selections[widget->currentItem]
+- == (widget->choiceCount - 1))
+- {
+- widget->selections[widget->currentItem] = 0;
+- }
+- else
+- {
+- widget->selections[widget->currentItem]++;
+- }
+- }
+- else
+- {
+- Beep ();
+- }
+- break;
+-
+- case KEY_ESC:
+- setExitType (widget, input);
+- complete = TRUE;
+- break;
+-
+- case KEY_ERROR:
+- setExitType (widget, input);
+- complete = TRUE;
+- break;
+-
+- case KEY_TAB:
+- case KEY_ENTER:
+- setExitType (widget, input);
+- ret = 1;
+- complete = TRUE;
+- break;
+-
+- case CDK_REFRESH:
+- eraseCDKScreen (ScreenOf (widget));
+- refreshCDKScreen (ScreenOf (widget));
+- break;
+-
+- default:
+- break;
+- }
+- }
+-
+- /* Should we call a post-process? */
+- if (!complete && (PostProcessFuncOf (widget) != 0))
+- {
+- PostProcessFuncOf (widget) (vSELECTION,
+- widget,
+- PostProcessDataOf (widget),
+- input);
+- }
+- }
+-
+- if (!complete)
+- {
+- drawCDKSelectionList (widget, ObjOf (widget)->box);
+- setExitType (widget, 0);
+- }
+-
+- ResultOf (widget).valueInt = ret;
+- fixCursorPosition (widget);
+- return (ret != unknownInt);
+-}
+-
+-/*
+- * This moves the selection field to the given location.
+- */
+-static void _moveCDKSelection (CDKOBJS *object,
+- int xplace,
+- int yplace,
+- boolean relative,
+- boolean refresh_flag)
+-{
+- CDKSELECTION *selection = (CDKSELECTION *)object;
+- /* *INDENT-EQLS* */
+- int currentX = getbegx (selection->win);
+- int currentY = getbegy (selection->win);
+- int xpos = xplace;
+- int ypos = yplace;
+- int xdiff = 0;
+- int ydiff = 0;
+-
+- /*
+- * If this is a relative move, then we will adjust where we want
+- * to move to.
+- */
+- if (relative)
+- {
+- xpos = getbegx (selection->win) + xplace;
+- ypos = getbegy (selection->win) + yplace;
+- }
+-
+- /* Adjust the window if we need to. */
+- alignxy (WindowOf (selection), &xpos, &ypos, selection->boxWidth, selection->boxHeight);
+-
+- /* Get the difference. */
+- xdiff = currentX - xpos;
+- ydiff = currentY - ypos;
+-
+- /* Move the window to the new location. */
+- moveCursesWindow (selection->win, -xdiff, -ydiff);
+- moveCursesWindow (selection->scrollbarWin, -xdiff, -ydiff);
+- moveCursesWindow (selection->shadowWin, -xdiff, -ydiff);
+-
+- /* Touch the windows so they 'move'. */
+- refreshCDKWindow (WindowOf (selection));
+-
+- /* Redraw the window, if they asked for it. */
+- if (refresh_flag)
+- {
+- drawCDKSelection (selection, ObjOf (selection)->box);
+- }
+-}
+-
+-/*
+- * This function draws the selection list.
+- */
+-static void _drawCDKSelection (CDKOBJS *object, boolean Box)
+-{
+- CDKSELECTION *selection = (CDKSELECTION *)object;
+-
+- /* Draw in the shadow if we need to. */
+- if (selection->shadowWin != 0)
+- {
+- drawShadow (selection->shadowWin);
+- }
+-
+- drawCdkTitle (selection->win, object);
+-
+- /* Redraw the list */
+- drawCDKSelectionList (selection, Box);
+-}
+-
+-static int maxViewSize (CDKSELECTION *widget)
+-{
+- return scroller_MaxViewSize (widget);
+-}
+-
+-/*
+- * Set variables that depend upon the list-size.
+- */
+-static void setViewSize (CDKSELECTION *widget, int listSize)
+-{
+- scroller_SetViewSize (widget, listSize);
+-}
+-
+-/*
+- * This function draws the selection list window.
+- */
+-static void drawCDKSelectionList (CDKSELECTION *selection, boolean Box GCC_UNUSED)
+-{
+- /* *INDENT-EQLS* */
+- int scrollbarAdj = (selection->scrollbarPlacement == LEFT) ? 1 : 0;
+- int screenPos = 0;
+- int xpos, ypos;
+- int j;
+- int selItem = -1;
+-
+- /* If there is to be a highlight, assign it now */
+- if (ObjOf (selection)->hasFocus)
+- selItem = selection->currentItem;
+-
+- /* draw the list... */
+- for (j = 0;
+- j < selection->viewSize
+- && (j + selection->currentTop) < selection->listSize;
+- j++)
+- {
+- int k = j + selection->currentTop;
+- if (k < selection->listSize)
+- {
+- screenPos = SCREENPOS (selection, k);
+- ypos = SCREEN_YPOS (selection, j);
+- xpos = SCREEN_XPOS (selection, 0);
+-
+- /* Draw the empty line. */
+- writeBlanks (selection->win,
+- xpos,
+- ypos,
+- HORIZONTAL, 0,
+- getmaxx (selection->win));
+-
+- /* Draw the selection item. */
+- writeChtypeAttrib (selection->win,
+- (screenPos >= 0) ? screenPos : 1,
+- ypos,
+- selection->item[k],
+- ((k == selItem)
+- ? selection->highlight
+- : A_NORMAL),
+- HORIZONTAL,
+- (screenPos >= 0) ? 0 : (1 - screenPos),
+- selection->itemLen[k]);
+-
+- /* Draw the choice value. */
+- writeChtype (selection->win,
+- xpos + scrollbarAdj,
+- ypos,
+- selection->choice[selection->selections[k]],
+- HORIZONTAL,
+- 0,
+- selection->choicelen[selection->selections[k]]);
+- }
+- }
+-
+- /* Determine where the toggle is supposed to be. */
+- if (selection->scrollbar)
+- {
+- selection->togglePos = floorCDK (selection->currentItem * (double)selection->step);
+- selection->togglePos = MINIMUM (selection->togglePos,
+- (getmaxy (selection->scrollbarWin) - 1));
+-
+- mvwvline (selection->scrollbarWin, 0, 0, ACS_CKBOARD, getmaxy (selection->scrollbarWin));
+- mvwvline (selection->scrollbarWin,
+- selection->togglePos,
+- 0,
+- ' ' | A_REVERSE, selection->toggleSize);
+- }
+-
+- /* Box it if needed */
+- if (ObjOf (selection)->box)
+- {
+- drawObjBox (selection->win, ObjOf (selection));
+- }
+-
+- fixCursorPosition (selection);
+-}
+-
+-/*
+- * This sets the background attribute of the widget.
+- */
+-static void _setBKattrSelection (CDKOBJS *object, chtype attrib)
+-{
+- if (object != 0)
+- {
+- CDKSELECTION *widget = (CDKSELECTION *)object;
+-
+- wbkgd (widget->win, attrib);
+- if (widget->scrollbarWin != 0)
+- {
+- wbkgd (widget->scrollbarWin, attrib);
+- }
+- }
+-}
+-
+-static void destroyInfo (CDKSELECTION *widget)
+-{
+- CDKfreeChtypes (widget->item);
+- widget->item = 0;
+-
+- freeAndNull (widget->itemPos);
+- freeAndNull (widget->itemLen);
+- freeAndNull (widget->selections);
+- freeAndNull (widget->mode);
+-}
+-
+-/*
+- * This function destroys the selection list.
+- */
+-static void _destroyCDKSelection (CDKOBJS *object)
+-{
+- if (object != 0)
+- {
+- CDKSELECTION *selection = (CDKSELECTION *)object;
+-
+- cleanCdkTitle (object);
+- CDKfreeChtypes (selection->choice);
+- freeChecked (selection->choicelen);
+- destroyInfo (selection);
+-
+- /* Clean up the windows. */
+- deleteCursesWindow (selection->scrollbarWin);
+- deleteCursesWindow (selection->shadowWin);
+- deleteCursesWindow (selection->win);
+-
+- /* Clean the key bindings. */
+- cleanCDKObjectBindings (vSELECTION, selection);
+-
+- /* Unregister this object. */
+- unregisterCDKObject (vSELECTION, selection);
+- }
+-}
+-
+-/*
+- * This function erases the selection list from the screen.
+- */
+-static void _eraseCDKSelection (CDKOBJS *object)
+-{
+- if (validCDKObject (object))
+- {
+- CDKSELECTION *selection = (CDKSELECTION *)object;
+-
+- eraseCursesWindow (selection->win);
+- eraseCursesWindow (selection->shadowWin);
+- }
+-}
+-
+-/*
+- * This function sets a couple of the selection list attributes.
+- */
+-void setCDKSelection (CDKSELECTION *selection,
+- chtype highlight,
+- int *choices,
+- boolean Box)
+-{
+- setCDKSelectionChoices (selection, choices);
+- setCDKSelectionHighlight (selection, highlight);
+- setCDKSelectionBox (selection, Box);
+-}
+-
+-/*
+- * This sets the selection list items.
+- */
+-void setCDKSelectionItems (CDKSELECTION *selection, CDK_CSTRING2 list, int listSize)
+-{
+- int widestItem = -1;
+- int j = 0;
+-
+- widestItem = createList (selection, list, listSize);
+- if (widestItem <= 0)
+- return;
+-
+- /* Clean up the display. */
+- for (j = 0; j < selection->viewSize; j++)
+- {
+- writeBlanks (selection->win,
+- SCREEN_XPOS (selection, 0),
+- SCREEN_YPOS (selection, j),
+- HORIZONTAL, 0, getmaxx (selection->win));
+- }
+-
+- setViewSize (selection, listSize);
+- setCDKSelectionCurrent (selection, 0);
+-
+- updateViewWidth (selection, widestItem);
+-}
+-int getCDKSelectionItems (CDKSELECTION *selection, char **list)
+-{
+- int j;
+-
+- if (list != 0)
+- {
+- for (j = 0; j < selection->listSize; j++)
+- {
+- list[j] = chtype2Char (selection->item[j]);
+- }
+- }
+- return selection->listSize;
+-}
+-
+-/*
+- *
+- */
+-void setCDKSelectionTitle (CDKSELECTION *selection, const char *title)
+-{
+- /* Make sure the title isn't null. */
+- if (title == 0)
+- {
+- return;
+- }
+-
+- (void)setCdkTitle (ObjOf (selection), title, -(selection->boxWidth + 1));
+-
+- setViewSize (selection, selection->listSize);
+-}
+-char *getCDKSelectionTitle (CDKSELECTION *selection GCC_UNUSED)
+-{
+- return chtype2Char (*TitleOf (selection));
+-}
+-
+-/*
+- * This sets the highlight bar.
+- */
+-void setCDKSelectionHighlight (CDKSELECTION *selection, chtype highlight)
+-{
+- selection->highlight = highlight;
+-}
+-chtype getCDKSelectionHighlight (CDKSELECTION *selection)
+-{
+- return selection->highlight;
+-}
+-
+-/*
+- * This sets the default choices for the selection list.
+- */
+-void setCDKSelectionChoices (CDKSELECTION *selection, int *choices)
+-{
+- int j;
+-
+- /* Set the choice values in the selection list. */
+- for (j = 0; j < selection->listSize; j++)
+- {
+- if (choices[j] < 0)
+- {
+- selection->selections[j] = 0;
+- }
+- else if (choices[j] > selection->choiceCount)
+- {
+- selection->selections[j] = selection->choiceCount - 1;
+- }
+- else
+- {
+- selection->selections[j] = choices[j];
+- }
+- }
+-}
+-int *getCDKSelectionChoices (CDKSELECTION *selection)
+-{
+- return selection->selections;
+-}
+-
+-/*
+- * This sets a single item's choice value.
+- */
+-void setCDKSelectionChoice (CDKSELECTION *selection, int Index, int choice)
+-{
+- int correctChoice = choice;
+- int correctIndex = Index;
+-
+- /* Verify that the choice value is in range. */
+- if (choice < 0)
+- {
+- correctChoice = 0;
+- }
+- else if (choice > selection->choiceCount)
+- {
+- correctChoice = selection->choiceCount - 1;
+- }
+-
+- /* Make sure the index isn't out of range. */
+- if (Index < 0)
+- {
+- Index = 0;
+- }
+- else if (Index > selection->listSize)
+- {
+- Index = selection->listSize - 1;
+- }
+-
+- /* Set the choice value. */
+- selection->selections[correctIndex] = correctChoice;
+-}
+-int getCDKSelectionChoice (CDKSELECTION *selection, int Index)
+-{
+- /* Make sure the index isn't out of range. */
+- if (Index < 0)
+- {
+- return selection->selections[0];
+- }
+- else if (Index > selection->listSize)
+- {
+- return selection->selections[selection->listSize - 1];
+- }
+- else
+- {
+- return selection->selections[Index];
+- }
+-}
+-
+-/*
+- * This sets the modes of the items in the selection list. Currently
+- * there are only two: editable=0 and read-only=1
+- */
+-void setCDKSelectionModes (CDKSELECTION *selection, int *modes)
+-{
+- int j;
+-
+- /* Make sure the widget pointer is not null. */
+- if (selection == 0)
+- {
+- return;
+- }
+-
+- /* Set the modes. */
+- for (j = 0; j < selection->listSize; j++)
+- {
+- selection->mode[j] = modes[j];
+- }
+-}
+-int *getCDKSelectionModes (CDKSELECTION *selection)
+-{
+- return selection->mode;
+-}
+-
+-/*
+- * This sets a single mode of an item in the selection list.
+- */
+-void setCDKSelectionMode (CDKSELECTION *selection, int Index, int mode)
+-{
+- /* Make sure the widget pointer is not null. */
+- if (selection == 0)
+- {
+- return;
+- }
+-
+- /* Make sure the index isn't out of range. */
+- if (Index < 0)
+- {
+- selection->mode[0] = mode;
+- }
+- else if (Index > selection->listSize)
+- {
+- selection->mode[selection->listSize - 1] = mode;
+- }
+- else
+- {
+- selection->mode[Index] = mode;
+- }
+-}
+-int getCDKSelectionMode (CDKSELECTION *selection, int Index)
+-{
+- /* Make sure the index isn't out of range. */
+- if (Index < 0)
+- {
+- return selection->mode[0];
+- }
+- else if (Index > selection->listSize)
+- {
+- return selection->mode[selection->listSize - 1];
+- }
+- else
+- {
+- return selection->mode[Index];
+- }
+-}
+-
+-/*
+- * This sets the box attribute of the widget.
+- */
+-void setCDKSelectionBox (CDKSELECTION *selection, boolean Box)
+-{
+- ObjOf (selection)->box = Box;
+- ObjOf (selection)->borderSize = Box ? 1 : 0;
+-}
+-boolean getCDKSelectionBox (CDKSELECTION *selection)
+-{
+- return ObjOf (selection)->box;
+-}
+-
+-/*
+- * set/get the current item index
+- */
+-void setCDKSelectionCurrent (CDKSELECTION *selection, int item)
+-{
+- scroller_SetPosition (selection, item);
+-}
+-
+-int getCDKSelectionCurrent (CDKSELECTION *selection)
+-{
+- return selection->currentItem;
+-}
+-
+-/*
+- * methods for generic type methods
+- */
+-static void _focusCDKSelection (CDKOBJS *object)
+-{
+- CDKSELECTION *selection = (CDKSELECTION *)object;
+-
+- drawCDKSelectionList (selection, ObjOf (selection)->box);
+-}
+-
+-static void _unfocusCDKSelection (CDKOBJS *object)
+-{
+- CDKSELECTION *selection = (CDKSELECTION *)object;
+-
+- drawCDKSelectionList (selection, ObjOf (selection)->box);
+-}
+-
+-static int createList (CDKSELECTION *selection, CDK_CSTRING2 list, int listSize)
+-{
+- int status = 0;
+- int widestItem = 0;
+- int j;
+-
+- if (listSize >= 0)
+- {
+- /* *INDENT-EQLS* */
+- chtype **newList = typeCallocN (chtype *, listSize + 1);
+- int *newLen = typeCallocN (int, listSize + 1);
+- int *newPos = typeCallocN (int, listSize + 1);
+- int *newSel = typeCallocN (int, listSize + 1);
+- int *newMode = typeCallocN (int, listSize + 1);
+-
+- if (newList != 0
+- && newLen != 0
+- && newPos != 0
+- && newSel != 0
+- && newMode != 0)
+- {
+- int boxWidth = AvailableWidth (selection);
+- int adjust = selection->maxchoicelen + BorderOf (selection);
+-
+- status = 1;
+- for (j = 0; j < listSize; j++)
+- {
+- newList[j] = char2Chtype (list[j], &newLen[j], &newPos[j]);
+- if (newList[j] == 0)
+- {
+- status = 0;
+- break;
+- }
+- newPos[j] = justifyString (boxWidth, newLen[j], newPos[j]) + adjust;
+- widestItem = MAXIMUM (widestItem, newLen[j]);
+- }
+-
+- if (status)
+- {
+- destroyInfo (selection);
+-
+- /* *INDENT-EQLS* */
+- selection->item = newList;
+- selection->itemPos = newPos;
+- selection->itemLen = newLen;
+- selection->selections = newSel;
+- selection->mode = newMode;
+- }
+- else
+- {
+- CDKfreeChtypes (newList);
+- freeChecked (newPos);
+- freeChecked (newLen);
+- freeChecked (newSel);
+- freeChecked (newMode);
+- }
+- }
+- }
+- else
+- {
+- destroyInfo (selection);
+- }
+-
+- return status ? widestItem : 0;
+-}
+-
+-dummyRefreshData (Selection)
+-
+-dummySaveData (Selection)
+diff -r fbcff989cc14 view_info.c
+--- a/view_info.c Thu Jun 13 12:05:08 2013 -0400
++++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+@@ -1,45 +0,0 @@
+-#include <cdk_int.h>
+-
+-/*
+- * $Author: tom $
+- * $Date: 2012/03/22 00:39:09 $
+- * $Revision: 1.2 $
+- */
+-
+-/*
+- * This allows the user to view information.
+- */
+-int viewInfo (CDKSCREEN *screen,
+- const char *title,
+- CDK_CSTRING2 info,
+- int count,
+- CDK_CSTRING2 buttons,
+- int buttonCount,
+- boolean interpret)
+-{
+- /* *INDENT-EQLS* * */
+- CDKVIEWER *viewer = 0;
+- int selected = -1;
+-
+- /* Create the file viewer to view the file selected. */
+- viewer = newCDKViewer (screen, CENTER, CENTER, -6, -16,
+- buttons, buttonCount,
+- A_REVERSE, TRUE, TRUE);
+-
+- /* Set up the viewer title, and the contents to the widget. */
+- setCDKViewer (viewer, title, info, count, A_REVERSE, interpret, TRUE, TRUE);
+-
+- /* Activate the viewer widget. */
+- selected = activateCDKViewer (viewer, 0);
+-
+- /* Make sure they exited normally. */
+- if (viewer->exitType != vNORMAL)
+- {
+- destroyCDKViewer (viewer);
+- return (-1);
+- }
+-
+- /* Clean up and return the button index selected. */
+- destroyCDKViewer (viewer);
+- return selected;
+-}
+diff -r fbcff989cc14 viewer.c
+--- a/viewer.c Thu Jun 13 12:05:08 2013 -0400
++++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+@@ -1,1293 +0,0 @@
+-#include <cdk_int.h>
+-
+-/*
+- * $Author: tom $
+- * $Date: 2012/03/22 00:43:33 $
+- * $Revision: 1.162 $
+- */
+-
+-/*
+- * Declare some local definitions.
+- */
+-#define DOWN 0
+-#define UP 1
+-
+-/*
+- * Declare file local prototypes.
+- */
+-static int createList (CDKVIEWER *swindow, int listSize);
+-static int searchForWord (CDKVIEWER *viewer, char *pattern, int direction);
+-static int jumpToLine (CDKVIEWER *viewer);
+-static void popUpLabel (CDKVIEWER *viewer, CDK_CSTRING2 mesg);
+-static void getAndStorePattern (CDKSCREEN *screen);
+-static void drawCDKViewerButtons (CDKVIEWER *viewer);
+-static void drawCDKViewerInfo (CDKVIEWER *viewer);
+-
+-/*
+- * Declare file local variables.
+- */
+-static char *SearchPattern = 0;
+-static int SearchDirection = DOWN;
+-
+-DeclareCDKObjects (VIEWER, Viewer, setCdk, Unknown);
+-
+-/*
+- * This function creates a new viewer object.
+- */
+-CDKVIEWER *newCDKViewer (CDKSCREEN *cdkscreen,
+- int xplace,
+- int yplace,
+- int height,
+- int width,
+- CDK_CSTRING2 buttons,
+- int buttonCount,
+- chtype buttonHighlight,
+- boolean Box,
+- boolean shadow)
+-{
+- /* *INDENT-EQLS* */
+- CDKVIEWER *viewer = 0;
+- int parentWidth = getmaxx (cdkscreen->window);
+- int parentHeight = getmaxy (cdkscreen->window);
+- int boxWidth = width;
+- int boxHeight = height;
+- int xpos = xplace;
+- int ypos = yplace;
+- int buttonWidth = 0;
+- int buttonAdj = 0;
+- int buttonPos = 1;
+- int x = 0;
+- /* *INDENT-OFF* */
+- static const struct { int from; int to; } bindings[] = {
+- { CDK_BACKCHAR, KEY_PPAGE },
+- { 'b', KEY_PPAGE },
+- { 'B', KEY_PPAGE },
+- { CDK_FORCHAR, KEY_NPAGE },
+- { SPACE, KEY_NPAGE },
+- { 'f', KEY_NPAGE },
+- { 'F', KEY_NPAGE },
+- { '|', KEY_HOME },
+- { '$', KEY_END },
+- };
+- /* *INDENT-ON* */
+-
+- if ((viewer = newCDKObject (CDKVIEWER, &my_funcs)) == 0)
+- return (0);
+-
+- setCDKViewerBox (viewer, Box);
+-
+- boxHeight = setWidgetDimension (parentHeight, height, 0);
+- boxWidth = setWidgetDimension (parentWidth, width, 0);
+-
+- /* Rejustify the x and y positions if we need to. */
+- alignxy (cdkscreen->window, &xpos, &ypos, boxWidth, boxHeight);
+-
+- /* Make the viewer window. */
+- viewer->win = newwin (boxHeight, boxWidth, ypos, xpos);
+- if (viewer->win == 0)
+- {
+- destroyCDKObject (viewer);
+- return (0);
+- }
+-
+- /* Turn the keypad on for the viewer. */
+- keypad (viewer->win, TRUE);
+-
+- /* Create the buttons. */
+- viewer->buttonCount = buttonCount;
+- if (buttonCount > 0)
+- {
+- if ((viewer->button = typeCallocN (chtype *, buttonCount + 1)) == 0
+- || (viewer->buttonLen = typeCallocN (int, buttonCount + 1)) == 0
+- || (viewer->buttonPos = typeCallocN (int, buttonCount + 1)) == 0)
+- {
+- destroyCDKObject (viewer);
+- return (0);
+- }
+- for (x = 0; x < buttonCount; x++)
+- {
+- viewer->button[x] = char2Chtype (buttons[x], &viewer->buttonLen[x], &buttonAdj);
+- buttonWidth += viewer->buttonLen[x] + 1;
+- }
+- buttonAdj = (int)((boxWidth - buttonWidth) / (buttonCount + 1));
+- buttonPos = 1 + buttonAdj;
+- for (x = 0; x < buttonCount; x++)
+- {
+- viewer->buttonPos[x] = buttonPos;
+- buttonPos += buttonAdj + viewer->buttonLen[x];
+- }
+- }
+-
+- /* *INDENT-EQLS* Set the rest of the variables */
+- ScreenOf (viewer) = cdkscreen;
+- viewer->parent = cdkscreen->window;
+- viewer->shadowWin = 0;
+- viewer->buttonHighlight = buttonHighlight;
+- viewer->boxHeight = boxHeight;
+- viewer->boxWidth = boxWidth - 2;
+- viewer->viewSize = height - 2;
+- ObjOf (viewer)->inputWindow = viewer->win;
+- initExitType (viewer);
+- viewer->shadow = shadow;
+- viewer->currentButton = 0;
+- viewer->currentTop = 0;
+- viewer->length = 0;
+- viewer->leftChar = 0;
+- viewer->maxLeftChar = 0;
+- viewer->maxTopLine = 0;
+- viewer->characters = 0;
+- viewer->listSize = -1;
+- viewer->showLineInfo = 1;
+- viewer->exitType = vEARLY_EXIT;
+-
+- /* Do we need to create a shadow??? */
+- if (shadow)
+- {
+- viewer->shadowWin = newwin (boxHeight, boxWidth + 1, ypos + 1, xpos + 1);
+- if (viewer->shadowWin == 0)
+- {
+- destroyCDKObject (viewer);
+- return (0);
+- }
+- }
+-
+- /* Setup the key bindings. */
+- for (x = 0; x < (int)SIZEOF (bindings); ++x)
+- bindCDKObject (vVIEWER,
+- viewer,
+- (chtype)bindings[x].from,
+- getcCDKBind,
+- (void *)(long)bindings[x].to);
+-
+- registerCDKObject (cdkscreen, vVIEWER, viewer);
+-
+- return (viewer);
+-}
+-
+-/*
+- * This function sets various attributes of the widget.
+- */
+-int setCDKViewer (CDKVIEWER *viewer,
+- const char *title,
+- CDK_CSTRING2 list,
+- int listSize,
+- chtype buttonHighlight,
+- boolean attrInterp,
+- boolean showLineInfo,
+- boolean Box)
+-{
+- setCDKViewerTitle (viewer, title);
+- setCDKViewerHighlight (viewer, buttonHighlight);
+- setCDKViewerInfoLine (viewer, showLineInfo);
+- setCDKViewerBox (viewer, Box);
+- return setCDKViewerInfo (viewer, list, listSize, attrInterp);
+-}
+-
+-/*
+- * This sets the title of the viewer. (A null title is allowed.
+- * It just means that the viewer will not have a title when drawn.)
+- */
+-void setCDKViewerTitle (CDKVIEWER *viewer, const char *title)
+-{
+- (void)setCdkTitle (ObjOf (viewer), title, -(viewer->boxWidth + 1));
+- viewer->titleAdj = TitleLinesOf (viewer);
+-
+- /* Need to set viewer->viewSize. */
+- viewer->viewSize = viewer->boxHeight - (TitleLinesOf (viewer) + 1) - 2;
+-}
+-chtype **getCDKViewerTitle (CDKVIEWER *viewer)
+-{
+- return TitleOf (viewer);
+-}
+-
+-static void setupLine (CDKVIEWER *viewer, boolean interpret, const char *list, int x)
+-{
+- /* Did they ask for attribute interpretation? */
+- if (interpret)
+- {
+- viewer->list[x] = char2Chtype (list, &viewer->listLen[x],
+- &viewer->listPos[x]);
+- viewer->listPos[x] = justifyString (viewer->boxWidth,
+- viewer->listLen[x],
+- viewer->listPos[x]);
+- }
+- else
+- {
+- int len = (int)strlen (list);
+- int pass;
+- int y;
+- chtype *t = 0;
+-
+- /*
+- * We must convert tabs and other nonprinting characters. The curses
+- * library normally does this, but we are bypassing it by writing
+- * chtype's directly.
+- */
+- for (pass = 0; pass < 2; ++pass)
+- {
+- len = 0;
+- for (y = 0; list[y] != '\0'; ++y)
+- {
+- if (list[y] == '\t')
+- {
+- do
+- {
+- if (pass)
+- t[len] = ' ';
+- ++len;
+- }
+- while (len & 7);
+- }
+- else if (isprint (CharOf (list[y])))
+- {
+- if (pass)
+- t[len] = CharOf (list[y]);
+- ++len;
+- }
+- else
+- {
+- const char *s = unctrl ((chtype)list[y]);
+- while (*s != 0)
+- {
+- if (pass)
+- t[len] = CharOf (*s);
+- ++len;
+- ++s;
+- }
+- }
+- }
+- if (!pass)
+- {
+- viewer->list[x] = t = typeCallocN (chtype, len + 3);
+- if (t == 0)
+- {
+- len = 0;
+- break;
+- }
+- }
+- }
+- viewer->listLen[x] = len;
+- viewer->listPos[x] = 0;
+- }
+- viewer->widestLine = MAXIMUM (viewer->widestLine, viewer->listLen[x]);
+-}
+-
+-static void freeLine (CDKVIEWER *viewer, int x)
+-{
+- if (x < viewer->listSize)
+- {
+- freeChtype (viewer->list[x]);
+- viewer->list[x] = 0;
+- }
+-}
+-
+-/*
+- * This function sets the contents of the viewer.
+- */
+-int setCDKViewerInfo (CDKVIEWER *viewer, CDK_CSTRING2 list, int listSize, boolean interpret)
+-{
+- /* *INDENT-EQLS* */
+- char filename[CDK_PATHMAX + 2];
+- int currentLine = 0;
+- int x = 0;
+- int viewerSize = listSize;
+-
+- /*
+- * If the list-size is negative, count the length of the null-terminated
+- * list of strings.
+- */
+- if (listSize < 0)
+- {
+- listSize = (int)CDKcountStrings (list);
+- }
+-
+- /* compute the size of the resulting display */
+- viewerSize = listSize;
+- if (list != 0 && interpret)
+- {
+- for (x = 0; x < listSize; ++x)
+- {
+- if (list[x] == 0)
+- {
+- viewerSize = x; /* oops - caller gave the wrong length */
+- break;
+- }
+- if (checkForLink (list[x], filename) == 1)
+- {
+- char **fileContents = 0;
+- int fileLen = CDKreadFile (filename, &fileContents);
+-
+- if (fileLen >= 0)
+- viewerSize += (fileLen - 1);
+- CDKfreeStrings (fileContents);
+- }
+- }
+- }
+-
+- /* Clean out the old viewer info. (if there is any) */
+- viewer->inProgress = TRUE;
+- cleanCDKViewer (viewer);
+- createList (viewer, viewerSize);
+-
+- /* Keep some semi-permanent info. */
+- viewer->interpret = interpret;
+-
+- /* Copy the information given. */
+- for (x = currentLine = 0; x < listSize && currentLine < viewerSize; x++)
+- {
+- if (list[x] == 0)
+- {
+- viewer->list[currentLine] = 0;
+- viewer->listLen[currentLine] = 0;
+- viewer->listPos[currentLine] = 0;
+- currentLine++;
+- }
+- else
+- {
+- /* Check if we have a file link in this line. */
+- if (checkForLink (list[x], filename) == 1)
+- {
+- /* We have a link, open the file. */
+- char **fileContents = 0;
+- int fileLen = 0;
+- int fileLine = 0;
+-
+- /* Open the file and put it into the viewer. */
+- fileLen = CDKreadFile (filename, &fileContents);
+- if (fileLen == -1)
+- {
+-#ifdef HAVE_START_COLOR
+-#define FOPEN_FMT "<C></16>Link Failed: Could not open the file %s"
+-#else
+-#define FOPEN_FMT "<C></K>Link Failed: Could not open the file %s"
+-#endif
+- char *temp = (char *)malloc (80 + strlen (filename));
+- sprintf (temp, FOPEN_FMT, filename);
+- setupLine (viewer, TRUE, temp, currentLine++);
+- free (temp);
+- }
+- else
+- {
+- /* For each line read, copy it into the viewer. */
+- fileLen = MINIMUM (fileLen, (viewerSize - currentLine));
+- for (fileLine = 0; fileLine < fileLen; fileLine++)
+- {
+- if (currentLine >= viewerSize)
+- break;
+- setupLine (viewer, FALSE, fileContents[fileLine], currentLine);
+- viewer->characters += viewer->listLen[currentLine];
+- currentLine++;
+- }
+- CDKfreeStrings (fileContents);
+- }
+- }
+- else if (currentLine < viewerSize)
+- {
+- setupLine (viewer, viewer->interpret, list[x], currentLine);
+- viewer->characters += viewer->listLen[currentLine];
+- currentLine++;
+- }
+- }
+- }
+-
+- /*
+- * Determine how many characters we can shift to the right
+- * before all the items have been viewer off the screen.
+- */
+- if (viewer->widestLine > viewer->boxWidth)
+- {
+- viewer->maxLeftChar = (viewer->widestLine - viewer->boxWidth) + 1;
+- }
+- else
+- {
+- viewer->maxLeftChar = 0;
+- }
+-
+- /* Set up the needed vars for the viewer list. */
+- viewer->inProgress = FALSE;
+- viewer->listSize = viewerSize;
+- if (viewer->listSize <= viewer->viewSize)
+- {
+- viewer->maxTopLine = 0;
+- }
+- else
+- {
+- viewer->maxTopLine = viewer->listSize - 1;
+- }
+- return viewer->listSize;
+-}
+-chtype **getCDKViewerInfo (CDKVIEWER *viewer, int *size)
+-{
+- (*size) = viewer->listSize;
+- return viewer->list;
+-}
+-
+-/*
+- * This function sets the highlight type of the buttons.
+- */
+-void setCDKViewerHighlight (CDKVIEWER *viewer, chtype buttonHighlight)
+-{
+- viewer->buttonHighlight = buttonHighlight;
+-}
+-chtype getCDKViewerHighlight (CDKVIEWER *viewer)
+-{
+- return viewer->buttonHighlight;
+-}
+-
+-/*
+- * This sets whether or not you want to set the viewer info line.
+- */
+-void setCDKViewerInfoLine (CDKVIEWER *viewer, boolean showLineInfo)
+-{
+- viewer->showLineInfo = showLineInfo;
+-}
+-boolean getCDKViewerInfoLine (CDKVIEWER *viewer)
+-{
+- return viewer->showLineInfo;
+-}
+-
+-/*
+- * This sets the widgets box attribute.
+- */
+-void setCDKViewerBox (CDKVIEWER *viewer, boolean Box)
+-{
+- ObjOf (viewer)->box = Box;
+- ObjOf (viewer)->borderSize = Box ? 1 : 0;
+-}
+-boolean getCDKViewerBox (CDKVIEWER *viewer)
+-{
+- return ObjOf (viewer)->box;
+-}
+-
+-/*
+- * This removes all the lines inside the scrolling window.
+- */
+-void cleanCDKViewer (CDKVIEWER *viewer)
+-{
+- int x;
+-
+- /* Clean up the memory used ... */
+- for (x = 0; x < viewer->listSize; x++)
+- {
+- freeLine (viewer, x);
+- }
+-
+- /* *INDENT-EQLS* Reset some variables. */
+- viewer->listSize = 0;
+- viewer->maxLeftChar = 0;
+- viewer->widestLine = 0;
+- viewer->currentTop = 0;
+- viewer->maxTopLine = 0;
+-
+- /* Redraw the window. */
+- drawCDKViewer (viewer, ObjOf (viewer)->box);
+-}
+-
+-static void PatternNotFound (CDKVIEWER *viewer, char *pattern)
+-{
+- CDK_CSTRING tempInfo[2];
+- char *temp = (char *)malloc (80 + strlen (pattern));
+- tempInfo[0] = temp;
+- tempInfo[1] = 0;
+- sprintf (temp, "</U/5>Pattern '%s' not found.<!U!5>", pattern);
+- popUpLabel (viewer, tempInfo);
+- free (temp);
+-}
+-
+-/*
+- * This function actually controls the viewer...
+- */
+-int activateCDKViewer (CDKVIEWER *widget, chtype *actions GCC_UNUSED)
+-{
+- char *fileInfo[10];
+- CDK_CSTRING tempInfo[2];
+- char temp[500];
+- chtype input;
+- boolean functionKey;
+- int x, REFRESH;
+-
+- /* Create the information about the file stats. */
+- sprintf (temp, "</5> </U>File Statistics<!U> <!5>");
+- fileInfo[0] = copyChar (temp);
+- sprintf (temp, "</5> <!5>");
+- fileInfo[1] = copyChar (temp);
+- sprintf (temp, "</5/R>Character Count:<!R> %-4ld <!5>", widget->characters);
+- fileInfo[2] = copyChar (temp);
+- sprintf (temp, "</5/R>Line Count :<!R> %-4d <!5>", widget->listSize);
+- fileInfo[3] = copyChar (temp);
+- sprintf (temp, "</5> <!5>");
+- fileInfo[4] = copyChar (temp);
+- sprintf (temp, "<C></5>Press Any Key To Continue.<!5>");
+- fileInfo[5] = copyChar (temp);
+- fileInfo[6] = 0;
+-
+- tempInfo[0] = temp;
+- tempInfo[1] = 0;
+-
+- /* Set the current button. */
+- widget->currentButton = 0;
+-
+- /* Draw the widget list. */
+- drawCDKViewer (widget, ObjOf (widget)->box);
+-
+- /* Do this until KEY_ENTER is hit. */
+- for (;;)
+- {
+- /* Reset the refresh flag. */
+- REFRESH = FALSE;
+-
+- input = (chtype)getchCDKObject (ObjOf (widget), &functionKey);
+- if (!checkCDKObjectBind (vVIEWER, widget, input))
+- {
+- switch (input)
+- {
+- case KEY_TAB:
+- if (widget->buttonCount > 1)
+- {
+- if (widget->currentButton == (widget->buttonCount - 1))
+- {
+- widget->currentButton = 0;
+- }
+- else
+- {
+- widget->currentButton++;
+- }
+-
+- /* Redraw the buttons. */
+- drawCDKViewerButtons (widget);
+- }
+- break;
+-
+- case CDK_PREV:
+- if (widget->buttonCount > 1)
+- {
+- if (widget->currentButton == 0)
+- {
+- widget->currentButton = widget->buttonCount - 1;
+- }
+- else
+- {
+- widget->currentButton--;
+- }
+-
+- /* Redraw the buttons. */
+- drawCDKViewerButtons (widget);
+- }
+- break;
+-
+- case KEY_UP:
+- if (widget->currentTop > 0)
+- {
+- widget->currentTop--;
+- REFRESH = TRUE;
+- }
+- else
+- {
+- Beep ();
+- }
+- break;
+-
+- case KEY_DOWN:
+- if (widget->currentTop < widget->maxTopLine)
+- {
+- widget->currentTop++;
+- REFRESH = TRUE;
+- }
+- else
+- {
+- Beep ();
+- }
+- break;
+-
+- case KEY_RIGHT:
+- if (widget->leftChar < widget->maxLeftChar)
+- {
+- widget->leftChar++;
+- REFRESH = TRUE;
+- }
+- else
+- {
+- Beep ();
+- }
+- break;
+-
+- case KEY_LEFT:
+- if (widget->leftChar > 0)
+- {
+- widget->leftChar--;
+- REFRESH = TRUE;
+- }
+- else
+- {
+- Beep ();
+- }
+- break;
+-
+- case KEY_PPAGE:
+- if (widget->currentTop > 0)
+- {
+- if ((widget->currentTop - (widget->viewSize - 1)) > 0)
+- {
+- widget->currentTop = (widget->currentTop
+- - (widget->viewSize - 1));
+- }
+- else
+- {
+- widget->currentTop = 0;
+- }
+- REFRESH = TRUE;
+- }
+- else
+- {
+- Beep ();
+- }
+- break;
+-
+- case KEY_NPAGE:
+- if (widget->currentTop < widget->maxTopLine)
+- {
+- if ((widget->currentTop + widget->viewSize) < widget->maxTopLine)
+- {
+- widget->currentTop = widget->currentTop +
+- (widget->viewSize
+- - 1);
+- }
+- else
+- {
+- widget->currentTop = widget->maxTopLine;
+- }
+- REFRESH = TRUE;
+- }
+- else
+- {
+- Beep ();
+- }
+- break;
+-
+- case KEY_HOME:
+- widget->leftChar = 0;
+- REFRESH = TRUE;
+- break;
+-
+- case KEY_END:
+- widget->leftChar = widget->maxLeftChar;
+- REFRESH = TRUE;
+- break;
+-
+- case 'g':
+- case '1':
+- case '<':
+- widget->currentTop = 0;
+- REFRESH = TRUE;
+- break;
+-
+- case 'G':
+- case '>':
+- widget->currentTop = widget->maxTopLine;
+- REFRESH = TRUE;
+- break;
+-
+- case 'L':
+- x = (int)((widget->listSize + widget->currentTop) / 2);
+- if (x < widget->maxTopLine)
+- {
+- widget->currentTop = x;
+- REFRESH = TRUE;
+- }
+- else
+- {
+- Beep ();
+- }
+- break;
+-
+- case 'l':
+- x = (int)(widget->currentTop / 2);
+- if (x >= 0)
+- {
+- widget->currentTop = x;
+- REFRESH = TRUE;
+- }
+- else
+- {
+- Beep ();
+- }
+- break;
+-
+- case '?':
+- SearchDirection = UP;
+- getAndStorePattern (ScreenOf (widget));
+- if (!searchForWord (widget, SearchPattern, SearchDirection))
+- {
+- PatternNotFound (widget, SearchPattern);
+- }
+- REFRESH = TRUE;
+- break;
+-
+- case '/':
+- SearchDirection = DOWN;
+- getAndStorePattern (ScreenOf (widget));
+- if (!searchForWord (widget, SearchPattern, SearchDirection))
+- {
+- PatternNotFound (widget, SearchPattern);
+- }
+- REFRESH = TRUE;
+- break;
+-
+- case 'N':
+- case 'n':
+- if (SearchPattern == 0)
+- {
+- sprintf (temp, "</5>There is no pattern in the buffer.<!5>");
+- popUpLabel (widget, tempInfo);
+- }
+- else if (!searchForWord (widget,
+- SearchPattern,
+- ((input == 'n')
+- ? SearchDirection
+- : !SearchDirection)))
+- {
+- PatternNotFound (widget, SearchPattern);
+- }
+- REFRESH = TRUE;
+- break;
+-
+- case ':':
+- widget->currentTop = jumpToLine (widget);
+- REFRESH = TRUE;
+- break;
+-
+- case 'i':
+- case 's':
+- case 'S':
+- popUpLabel (widget, (CDK_CSTRING2) fileInfo);
+- REFRESH = TRUE;
+- break;
+-
+- case KEY_ESC:
+- freeCharList (fileInfo, 6);
+- setExitType (widget, input);
+- return -1;
+-
+- case KEY_ERROR:
+- freeCharList (fileInfo, 6);
+- setExitType (widget, input);
+- return -1;
+-
+- case KEY_ENTER:
+- freeCharList (fileInfo, 6);
+- setExitType (widget, input);
+- return widget->currentButton;
+-
+- case CDK_REFRESH:
+- eraseCDKScreen (ScreenOf (widget));
+- refreshCDKScreen (ScreenOf (widget));
+- break;
+-
+- default:
+- Beep ();
+- break;
+- }
+- }
+-
+- /* Do we need to redraw the screen??? */
+- if (REFRESH)
+- {
+- drawCDKViewerInfo (widget);
+- }
+- }
+-}
+-
+-/*
+- * This searches the document looking for the given word.
+- */
+-static void getAndStorePattern (CDKSCREEN *screen)
+-{
+- /* *INDENT-EQLS* */
+- CDKENTRY *getPattern = 0;
+- const char *temp = 0;
+- char *list = 0;
+-
+- /* Check the direction. */
+- if (SearchDirection == UP)
+- {
+- temp = "</5>Search Up : <!5>";
+- }
+- else
+- {
+- temp = "</5>Search Down: <!5>";
+- }
+-
+- /* Pop up the entry field. */
+- getPattern = newCDKEntry (screen, CENTER, CENTER,
+- 0, temp,
+- COLOR_PAIR (5) | A_BOLD,
+- '.' | COLOR_PAIR (5) | A_BOLD,
+- vMIXED, 10, 0, 256, TRUE, FALSE);
+-
+- /* Is there an old search pattern? */
+- if (SearchPattern != 0)
+- {
+- setCDKEntry (getPattern, SearchPattern, getPattern->min,
+- getPattern->max, ObjOf (getPattern)->box);
+- }
+- freeChar (SearchPattern);
+-
+- /* Activate this baby. */
+- list = activateCDKEntry (getPattern, 0);
+-
+- /* Save the list. */
+- if ((list != 0) || (strlen (list) != 0))
+- {
+- SearchPattern = copyChar (list);
+- }
+-
+- /* Clean up. */
+- destroyCDKEntry (getPattern);
+-}
+-
+-/*
+- * This searches for a line containing the word and realigns the value on the
+- * screen.
+- */
+-static int searchForWord (CDKVIEWER *viewer, char *pattern, int direction)
+-{
+- int x, y, pos, len, plen;
+- int found = 0;
+-
+- /* If the pattern is empty then return. */
+- if (pattern != 0 && (plen = (int)strlen (pattern)) != 0)
+- {
+- if (direction == DOWN)
+- {
+- /* Start looking from 'here' down. */
+- for (x = viewer->currentTop + 1; !found && (x < viewer->listSize);
+- x++)
+- {
+- len = chlen (viewer->list[x]);
+- for (y = pos = 0; y < len; y++)
+- {
+- int plainChar = CharOf (viewer->list[x][y]);
+-
+- if (CharOf (pattern[pos]) != plainChar)
+- {
+- y -= pos;
+- pos = 0;
+- }
+- else if (++pos == plen)
+- {
+- viewer->currentTop = (x < viewer->maxTopLine ? x : viewer->maxTopLine);
+- viewer->leftChar = (y < viewer->boxWidth ? 0 : viewer->maxLeftChar);
+- found = 1;
+- break;
+- }
+-
+- }
+- }
+- }
+- else
+- {
+- /* Start looking from 'here' up. */
+- for (x = viewer->currentTop - 1; !found && (x >= 0); x--)
+- {
+- len = chlen (viewer->list[x]);
+- for (y = pos = 0; y < len; y++)
+- {
+- int plainChar = CharOf (viewer->list[x][y]);
+-
+- if (CharOf (pattern[pos]) != plainChar)
+- {
+- y -= pos;
+- pos = 0;
+- }
+- else if (++pos == plen)
+- {
+- viewer->currentTop = x;
+- viewer->leftChar = (y < viewer->boxWidth ? 0 : viewer->maxLeftChar);
+- found = 1;
+- break;
+- }
+-
+- }
+- }
+- }
+- }
+- return (found);
+-}
+-
+-/*
+- * This allows us to 'jump' to a given line in the file.
+- */
+-static int jumpToLine (CDKVIEWER *viewer)
+-{
+- /* *INDENT-EQLS* */
+- int line = 0;
+- CDKSCALE *newline = newCDKScale (ScreenOf (viewer), CENTER, CENTER,
+- "<C>Jump To Line", "</5>Line :", A_BOLD,
+- intlen (viewer->listSize) + 1,
+- viewer->currentTop + 1,
+- 0, viewer->maxTopLine + 1,
+- 1, 10, TRUE, TRUE);
+-
+- line = activateCDKScale (newline, 0);
+- destroyCDKScale (newline);
+- return ((line - 1));
+-}
+-
+-/*
+- * This pops a little message up on the screen.
+- */
+-static void popUpLabel (CDKVIEWER *viewer, CDK_CSTRING2 mesg)
+-{
+- CDKLABEL *label;
+- boolean functionKey;
+-
+- /* Set up variables. */
+- label = newCDKLabel (ScreenOf (viewer), CENTER, CENTER,
+- (CDK_CSTRING2) mesg,
+- (int)CDKcountStrings (mesg),
+- TRUE, FALSE);
+-
+- /* Draw the label and wait. */
+- drawCDKLabel (label, TRUE);
+- getchCDKObject (ObjOf (label), &functionKey);
+-
+- /* Clean up. */
+- destroyCDKLabel (label);
+-}
+-
+-/*
+- * This moves the viewer field to the given location.
+- */
+-static void _moveCDKViewer (CDKOBJS *object, int xplace, int yplace, boolean
+- relative, boolean refresh_flag)
+-{
+- /* *INDENT-EQLS* */
+- CDKVIEWER *viewer = (CDKVIEWER *)object;
+- int currentX = getbegx (viewer->win);
+- int currentY = getbegy (viewer->win);
+- int xpos = xplace;
+- int ypos = yplace;
+- int xdiff = 0;
+- int ydiff = 0;
+-
+- /*
+- * If this is a relative move, then we will adjust where we want
+- * to move to.
+- */
+- if (relative)
+- {
+- xpos = getbegx (viewer->win) + xplace;
+- ypos = getbegy (viewer->win) + yplace;
+- }
+-
+- /* Adjust the window if we need to. */
+- alignxy (WindowOf (viewer), &xpos, &ypos, viewer->boxWidth, viewer->boxHeight);
+-
+- /* Get the difference. */
+- xdiff = currentX - xpos;
+- ydiff = currentY - ypos;
+-
+- /* Move the window to the new location. */
+- moveCursesWindow (viewer->win, -xdiff, -ydiff);
+- moveCursesWindow (viewer->shadowWin, -xdiff, -ydiff);
+-
+- /* Touch the windows so they 'move'. */
+- refreshCDKWindow (WindowOf (viewer));
+-
+- /* Redraw the window, if they asked for it. */
+- if (refresh_flag)
+- {
+- drawCDKViewer (viewer, ObjOf (viewer)->box);
+- }
+-}
+-
+-/*
+- * This function draws the viewer widget.
+- */
+-static void _drawCDKViewer (CDKOBJS *object, boolean Box)
+-{
+- CDKVIEWER *viewer = (CDKVIEWER *)object;
+-
+- /* Do we need to draw in the shadow??? */
+- if (viewer->shadowWin != 0)
+- {
+- drawShadow (viewer->shadowWin);
+- }
+-
+- /* Box it if it was asked for. */
+- if (Box)
+- {
+- drawObjBox (viewer->win, ObjOf (viewer));
+- wrefresh (viewer->win);
+- }
+-
+- /* Draw the info in the viewer. */
+- drawCDKViewerInfo (viewer);
+-}
+-
+-/*
+- * This redraws the viewer buttons.
+- */
+-static void drawCDKViewerButtons (CDKVIEWER *viewer)
+-{
+- chtype character;
+- int x;
+-
+- /* No buttons, no drawing. */
+- if (viewer->buttonCount == 0)
+- {
+- return;
+- }
+-
+- /* Redraw the buttons. */
+- for (x = 0; x < viewer->buttonCount; x++)
+- {
+- writeChtype (viewer->win,
+- viewer->buttonPos[x],
+- viewer->boxHeight - 2,
+- viewer->button[x],
+- HORIZONTAL,
+- 0,
+- viewer->buttonLen[x]);
+- }
+-
+- /* Highlight the current button. */
+- for (x = 0; x < viewer->buttonLen[viewer->currentButton]; x++)
+- {
+- /* Strip the character of any extra attributes. */
+- character = CharOf (viewer->button[viewer->currentButton][x]);
+-
+- /* Add the character into the window. */
+- mvwaddch (viewer->win,
+- viewer->boxHeight - 2,
+- viewer->buttonPos[viewer->currentButton] + x,
+- character | viewer->buttonHighlight);
+- }
+-
+- /* Refresh the window. */
+- wrefresh (viewer->win);
+-}
+-
+-/*
+- * This sets the background attribute of the widget.
+- */
+-static void _setBKattrViewer (CDKOBJS *object, chtype attrib)
+-{
+- if (object != 0)
+- {
+- CDKVIEWER *widget = (CDKVIEWER *)object;
+-
+- wbkgd (widget->win, attrib);
+- }
+-}
+-
+-/*
+- * Free any storage associated with the info-list.
+- */
+-static void destroyInfo (CDKVIEWER *viewer)
+-{
+- CDKfreeChtypes (viewer->list);
+- freeChecked (viewer->listPos);
+- freeChecked (viewer->listLen);
+-
+- viewer->list = 0;
+- viewer->listPos = 0;
+- viewer->listLen = 0;
+-}
+-
+-/*
+- * This function destroys the viewer widget.
+- */
+-static void _destroyCDKViewer (CDKOBJS *object)
+-{
+- if (object != 0)
+- {
+- CDKVIEWER *viewer = (CDKVIEWER *)object;
+-
+- destroyInfo (viewer);
+-
+- cleanCdkTitle (object);
+- CDKfreeChtypes (viewer->button);
+- freeChecked (viewer->buttonLen);
+- freeChecked (viewer->buttonPos);
+-
+- /* Clean up the windows. */
+- deleteCursesWindow (viewer->shadowWin);
+- deleteCursesWindow (viewer->win);
+-
+- /* Clean the key bindings. */
+- cleanCDKObjectBindings (vVIEWER, viewer);
+-
+- /* Unregister this object. */
+- unregisterCDKObject (vVIEWER, viewer);
+- }
+-}
+-
+-/*
+- * This function erases the viewer widget from the screen.
+- */
+-static void _eraseCDKViewer (CDKOBJS *object)
+-{
+- if (validCDKObject (object))
+- {
+- CDKVIEWER *viewer = (CDKVIEWER *)object;
+-
+- eraseCursesWindow (viewer->win);
+- eraseCursesWindow (viewer->shadowWin);
+- }
+-}
+-
+-/*
+- * This draws the viewer info lines.
+- */
+-static void drawCDKViewerInfo (CDKVIEWER *viewer)
+-{
+- int listAdjust = 0;
+- int lastLine = 0;
+- char temp[256];
+- int x;
+-
+- /* Clear the window. */
+- werase (viewer->win);
+-
+- drawCdkTitle (viewer->win, ObjOf (viewer));
+-
+- /* Draw in the current line at the top. */
+- if (viewer->showLineInfo == TRUE)
+- {
+- /* Set up the info line and draw it. */
+- if (viewer->inProgress)
+- {
+- strcpy (temp, "processing...");
+- }
+- else if (viewer->listSize != 0)
+- {
+- sprintf (temp, "%d/%d %2.0f%%",
+- (viewer->currentTop + 1),
+- viewer->listSize,
+- ((float)(viewer->currentTop + 1)
+- / (float)viewer->listSize) * 100);
+- }
+- else
+- {
+- sprintf (temp, "%d/%d %2.0f%%", 0, 0, 0.0);
+- }
+-
+- /*
+- * The listAdjust variable tells us if we have to shift down one line
+- * because the person asked for the line X of Y line at the top of the
+- * screen. We only want to set this to 1 if they asked for the info line
+- * and there is no title, or if the two items overlap.
+- */
+- if (TitleLinesOf (viewer) == 0
+- || TitlePosOf (viewer)[0] < ((int)strlen (temp) + 2))
+- {
+- listAdjust = 1;
+- }
+- writeChar (viewer->win, 1, (listAdjust ? TitleLinesOf (viewer) : 0) + 1,
+- temp, HORIZONTAL, 0, (int)strlen (temp));
+- }
+-
+- /* Determine the last line to draw. */
+- lastLine = ((viewer->listSize <= viewer->viewSize)
+- ? viewer->listSize
+- : viewer->viewSize);
+- lastLine -= listAdjust;
+-
+- /* Redraw the list. */
+- for (x = 0; x < lastLine; x++)
+- {
+- if (viewer->currentTop + x < viewer->listSize)
+- {
+- int screenPos = viewer->listPos[viewer->currentTop + x] + 1 - viewer->leftChar;
+-
+- writeChtype (viewer->win,
+- ((screenPos >= 0)
+- ? screenPos
+- : 1),
+- x + TitleLinesOf (viewer) + listAdjust + 1,
+- viewer->list[x + viewer->currentTop],
+- HORIZONTAL,
+- ((screenPos >= 0)
+- ? 0
+- : (viewer->leftChar
+- - viewer->listPos[viewer->currentTop + x])),
+- viewer->listLen[x + viewer->currentTop]);
+- }
+- }
+-
+- /* Box it if we have to. */
+- if (ObjOf (viewer)->box)
+- {
+- drawObjBox (viewer->win, ObjOf (viewer));
+- wrefresh (viewer->win);
+- }
+-
+- /* Draw the separation line. */
+- if (viewer->buttonCount > 0)
+- {
+- chtype boxattr = BXAttrOf (viewer);
+-
+- for (x = 1; x <= viewer->boxWidth; x++)
+- {
+- mvwaddch (viewer->win, viewer->boxHeight - 3, x,
+- HZCharOf (viewer) | boxattr);
+- }
+- mvwaddch (viewer->win, viewer->boxHeight - 3, 0,
+- ACS_LTEE | boxattr);
+- mvwaddch (viewer->win, viewer->boxHeight - 3,
+- getmaxx (viewer->win) - 1,
+- ACS_RTEE | boxattr);
+- }
+-
+- /* Draw the buttons. This will call refresh on the viewer win. */
+- drawCDKViewerButtons (viewer);
+-}
+-
+-/*
+- * The listSize may be negative, to assign no definite limit.
+- */
+-static int createList (CDKVIEWER *swindow, int listSize)
+-{
+- int status = 0;
+-
+- if (listSize >= 0)
+- {
+- chtype **newList = typeCallocN (chtype *, listSize + 1);
+- int *newPos = typeCallocN (int, listSize + 1);
+- int *newLen = typeCallocN (int, listSize + 1);
+-
+- if (newList != 0
+- && newPos != 0
+- && newLen != 0)
+- {
+- status = 1;
+- destroyInfo (swindow);
+-
+- swindow->list = newList;
+- swindow->listPos = newPos;
+- swindow->listLen = newLen;
+- }
+- if (!status)
+- {
+- CDKfreeChtypes (newList);
+- freeChecked (newPos);
+- freeChecked (newLen);
+- }
+- }
+- else
+- {
+- destroyInfo (swindow);
+- }
+- return status;
+-}
+-
+-dummyInject (Viewer)
+-
+-dummyFocus (Viewer)
+-
+-dummyUnfocus (Viewer)
+-
+-dummyRefreshData (Viewer)
+-
+-dummySaveData (Viewer)