OSDN Git Service

Please enter the commit message for your changes. Lines starting
[eos/base.git] / util / src / TclTk / blt2.5 / generic / bltTable.h
diff --git a/util/src/TclTk/blt2.5/generic/bltTable.h b/util/src/TclTk/blt2.5/generic/bltTable.h
new file mode 100644 (file)
index 0000000..edb22f7
--- /dev/null
@@ -0,0 +1,390 @@
+/*
+ * bltTable.h --
+ *
+ *     This module implements a table-based geometry manager
+ *     for the BLT toolkit.
+ *
+ * Copyright 1993-1998 Lucent Technologies, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and
+ * its documentation for any purpose and without fee is hereby
+ * granted, provided that the above copyright notice appear in all
+ * copies and that both that the copyright notice and warranty
+ * disclaimer appear in supporting documentation, and that the names
+ * of Lucent Technologies any of their entities not be used in
+ * advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission.
+ *
+ * Lucent Technologies disclaims all warranties with regard to this
+ * software, including all implied warranties of merchantability and
+ * fitness.  In no event shall Lucent Technologies be liable for any
+ * special, indirect or consequential damages or any damages
+ * whatsoever resulting from loss of use, data or profits, whether in
+ * an action of contract, negligence or other tortuous action, arising
+ * out of or in connection with the use or performance of this
+ * software.
+ *
+ *     The table geometry manager was created by George Howlett.
+ */
+
+#ifndef _BLT_TABLE_H
+#define _BLT_TABLE_H
+
+#include "bltChain.h"
+#include "bltHash.h"
+#include "bltList.h"
+
+typedef struct {
+    Blt_HashTable tableTable;  /* Hash table of table structures keyed by 
+                                * the address of the reference Tk window */
+} TableInterpData;
+
+
+typedef struct EditorStruct Editor;
+typedef void (EditorDrawProc) _ANSI_ARGS_((Editor *editor));
+typedef void (EditorDestroyProc) _ANSI_ARGS_((DestroyData destroyData));
+
+struct EditorStruct {
+    int gridLineWidth;
+    int buttonHeight;
+    int entryPad;
+    int minSize;               /* Minimum size to allow any partition */
+
+    EditorDrawProc *drawProc;
+    EditorDestroyProc *destroyProc;
+};
+
+#define nRows          rowInfo.chainPtr->nLinks
+#define nColumns       columnInfo.chainPtr->nLinks
+
+/*
+ * Limits --
+ *
+ *     Defines the bounding of a size (width or height) in the table.
+ *     It may be related to the partition, entry, or table size.  The
+ *     widget pointers are used to associate sizes with the requested
+ *     size of other widgets.
+ */
+
+typedef struct {
+    int flags;                 /* Flags indicate whether using default
+                                * values for limits or not. See flags
+                                * below. */
+    int max, min;              /* Values for respective limits. */
+    int nom;                   /* Nominal starting value. */
+    Tk_Window wMax, wMin;      /* If non-NULL, represents widgets whose
+                                * requested sizes will be set as limits. */
+    Tk_Window wNom;            /* If non-NULL represents widget whose
+                                * requested size will be the nominal
+                                * size. */
+} Limits;
+
+#define LIMITS_SET_BIT 1
+#define LIMITS_SET_MIN  (LIMITS_SET_BIT<<0)
+#define LIMITS_SET_MAX  (LIMITS_SET_BIT<<1)
+#define LIMITS_SET_NOM  (LIMITS_SET_BIT<<2)
+
+#define LIMITS_MIN     0       /* Default minimum limit  */
+#define LIMITS_MAX     SHRT_MAX/* Default maximum limit */
+#define LIMITS_NOM     -1000   /* Default nomimal value.  Indicates if a
+                                * partition has received any space yet */
+
+typedef int (LimitsProc) _ANSI_ARGS_((int value, Limits *limitsPtr));
+
+/*
+ * Resize --
+ *
+ *     These flags indicate in what ways each partition in a table
+ *     can be resized from its default dimensions.  The normal size of
+ *     a row/column is the minimum amount of space needed to hold the
+ *     widgets that span it.  The table may then be stretched or
+ *     shrunk depending if the container is larger or smaller than
+ *     the table. This can occur if 1) the user resizes the toplevel
+ *     widget, or 2) the container is in turn packed into a larger
+ *     widget and the "fill" option is set.
+ *
+ *       RESIZE_NONE     - No resizing from normal size.
+ *       RESIZE_EXPAND   - Do not allow the size to decrease.
+ *                         The size may increase however.
+ *        RESIZE_SHRINK   - Do not allow the size to increase.
+ *                         The size may decrease however.
+ *       RESIZE_BOTH     - Allow the size to increase or
+ *                         decrease from the normal size.
+ *       RESIZE_VIRGIN   - Special case of the resize flag.  Used to
+ *                         indicate the initial state of the flag.
+ *                         Empty rows/columns are treated differently
+ *                         if this row/column is set.
+ */
+
+#define RESIZE_NONE    0
+#define RESIZE_EXPAND  (1<<0)
+#define RESIZE_SHRINK  (1<<1)
+#define RESIZE_BOTH    (RESIZE_EXPAND | RESIZE_SHRINK)
+#define RESIZE_VIRGIN  (1<<2)
+
+/*
+ * Control --
+ */
+#define CONTROL_NORMAL 1.0     /* Consider the widget when
+                                * calculating the row heights and
+                                * column widths.  */
+#define CONTROL_NONE   0.0     /* Ignore the widget.  The height and
+                                * width of the rows/columns spanned
+                                * by this widget will not affected by
+                                * the size of the widget.
+                                */
+#define CONTROL_FULL   -1.0    /* Consider only this widget when
+                                * determining the column widths
+                                * and row heights of the partitions
+                                * it spans. */
+#define EXCL_PAD       0
+#define INCL_PAD       1
+
+typedef struct TableStruct Table;
+typedef struct RowColumnStruct RowColumn;
+
+/*
+ * Entry --
+ *
+ *     An entry holds a widget and describes how the widget should
+ *     appear in a range of cells.
+ *      1. padding.
+ *      2. how many rows/columns the entry spans.
+ *      3. size bounds for the widget.
+ *
+ *     Several entries may start at the same cell in
+ *     the table, but a entry can hold only one widget.
+ */
+
+typedef struct  {
+    Tk_Window tkwin;           /* Widget to be managed. */
+
+    Table *tablePtr;           /* Table managing this widget */
+
+    int borderWidth;           /* The external border width of
+                                * the widget. This is needed to check if
+                                * Tk_Changes(tkwin)->border_width changes.
+                                */
+
+    int manageWhenNeeded;      /* If non-zero, allow joint custody of
+                                * the widget.  This is for cases
+                                * where the same widget may be shared
+                                * between two different tables
+                                * (e.g. same graph on two different
+                                * notebook pages).  Claim the widget
+                                * only when the table is
+                                * mapped. Don't destroy the entry if
+                                * the table loses custody of the
+                                * widget. */
+
+    Limits reqWidth, reqHeight;        /* Bounds for width and height requests
+                                * made by the widget. */
+    struct PositionInfo {
+       RowColumn *rcPtr;       /* Row or column where this entry starts. */
+
+       int span;               /* Number of rows or columns spanned. */
+       double control;         /* Weight of widget in the row or column. */
+
+       Blt_ChainLink *linkPtr; /* Link to widget in the chain of spans */
+
+       Blt_Chain *chainPtr;    /* Pointer to the chain of spans. */
+    } row, column;
+
+    Tk_Anchor anchor;          /* Anchor type: indicates how the
+                                * widget is positioned if extra space
+                                * is available in the entry */
+
+    Blt_Pad padX;              /* Extra padding placed left and right of the
+                                * widget. */
+    Blt_Pad padY;              /* Extra padding placed above and below the
+                                * widget */
+
+    int ipadX, ipadY;          /* Extra padding added to the interior of
+                                * the widget (i.e. adds to the requested
+                                * size of the widget) */
+
+    int fill;                  /* Indicates how the widget should
+                                * fill the span of cells it occupies. */
+
+    int x, y;                  /* Origin of widget wrt container. */
+
+    Blt_ChainLink *linkPtr;    /* Pointer into list of entries. */
+
+    Blt_HashEntry *hashPtr;    /* Pointer into table of entries. */
+
+} Entry;
+
+/*
+ * RowColumn --
+ *
+ *     Creates a definable space (row or column) in the table. It may
+ *     have both requested minimum or maximum values which constrain
+ *     the size of it.
+ */
+
+struct RowColumnStruct {
+    int index;                 /* Index of row or column */
+
+    int size;                  /* Current size of the partition. This size
+                                * is bounded by minSize and maxSize. */
+
+    /*
+     * nomSize and size perform similar duties.  I need to keep track
+     * of the amount of space allocated to the partition (using size).
+     * But at the same time, I need to indicate that space can be
+     * parcelled out to this partition.  If a nominal size was set for
+     * this partition, I don't want to add space.
+     */
+
+    int nomSize;               /* The nominal size (neither expanded
+                                * nor shrunk) of the partition based
+                                * upon the requested sizes of the
+                                * widgets spanning this partition. */
+
+    int minSize, maxSize;      /* Size constraints on the partition */
+
+    int offset;                        /* Offset of the partition (in pixels)
+                                * from the origin of the container. */
+
+    int minSpan;               /* Minimum spanning widget in
+                                * partition. Used for bookkeeping
+                                * when growing a span of partitions
+                                * */
+
+    double weight;             /* Weight of row or column */
+
+    Entry *control;            /* Pointer to the entry that is
+                                * determining the size of this
+                                * partition.  This is used to know
+                                * when a partition is occupied. */
+
+    int resize;                        /* Indicates if the partition should
+                                * shrink or expand from its nominal
+                                * size. */
+
+    Blt_Pad pad;               /* Pads the partition beyond its nominal
+                                * size */
+
+    Limits reqSize;            /* Requested bounds for the size of
+                                * the partition. The partition will
+                                * not expand or shrink beyond these
+                                * limits, regardless of how it was
+                                * specified (max widget size).  This
+                                * includes any extra padding which
+                                * may be specified. */
+
+    int maxSpan;               /* Maximum spanning widget to consider
+                                * when growing a span of partitions.
+                                * A value of zero indicates that all
+                                * spans should be considered. */
+
+    int count;
+
+    Blt_ChainLink *linkPtr;
+
+};
+
+#define DEF_TBL_RESIZE "both"
+#define DEF_TBL_PAD    "0"
+#define DEF_TBL_MAXSPAN        "0"
+
+
+/*
+ * This is the default number of elements in the statically
+ * pre-allocated column and row arrays.  This number should reflect a
+ * useful number of row and columns, which fit most applications.
+ */
+#define DEF_ARRAY_SIZE 32
+
+typedef Entry *(EntrySearchProc) _ANSI_ARGS_((Table *tablePtr, 
+       Tk_Window tkwin));
+
+/*
+ * PartitionInfo --
+ *
+ *     Manages the rows or columns of the table.  Contains
+ *     a chain of partitions (representing the individiual
+ *     rows or columns).
+ *
+ */
+typedef struct PartitionInfo {
+    char *type;                        /* String identifying the type of
+                                * partition: "row" or "column". */
+    Blt_Chain *chainPtr;
+    Blt_List list;             /* Linked list of bins of widgets
+                                * keyed by increasing span. */
+    Tk_ConfigSpec *configSpecs;
+    int reqLength;
+    int ePad;                  /* Extra padding for row/column
+                                * needed to display editor marks */
+} PartitionInfo;
+
+/*
+ * Table structure
+ */
+struct TableStruct {
+    int flags;                 /* See the flags definitions below. */
+    Tk_Window tkwin;           /* The container widget into which
+                                * other widgets are arranged. */
+    Tcl_Interp *interp;                /* Interpreter associated with all
+                                * widgets */
+
+    Blt_Chain *chainPtr;       /* Chain of entries in the table. */
+
+    Blt_HashTable entryTable;  /* Table of entries.  Serves as a
+                                * directory to look up entries from
+                                * widget their names. */
+    Blt_Pad padX, padY;
+
+    int propagate;             /* If non-zero, the table will make a
+                                * geometry request on behalf of the
+                                * container widget. */
+
+    int eTablePad, eEntryPad;
+
+    PartitionInfo columnInfo;
+    PartitionInfo rowInfo;     /* Manages row and column partitions */
+
+    Dim2D container;           /* Last known dimenion of the container. */
+    Dim2D normal;              /* Normal dimensions of the table */
+    Limits reqWidth, reqHeight;        /* Constraints on the table's normal
+                                * width and height */
+    Editor *editPtr;           /* If non-NULL, indicates that the
+                                * table is currently being edited */
+    Tcl_IdleProc *arrangeProc;
+    EntrySearchProc *findEntryProc;
+    Blt_HashEntry *hashPtr;    /* Used to delete the table from its
+                                * hashtable. */
+    Blt_HashTable *tablePtr;
+};
+
+/*
+ * Table flags definitions
+ */
+#define ARRANGE_PENDING (1<<0) /* A call to ArrangeTable is
+                                * pending. This flag allows multiple
+                                * layout changes to be requested
+                                * before the table is actually
+                                * reconfigured. */
+#define REQUEST_LAYOUT         (1<<1)  /* Get the requested sizes of the
+                                * widgets before expanding/shrinking
+                                * the size of the container.  It's
+                                * necessary to recompute the layout
+                                * every time a partition or entry is
+                                * added, reconfigured, or deleted,
+                                * but not when the container is
+                                * resized. */
+#define NON_PARENT     (1<<2)  /* The table is managing widgets that
+                                * arern't children of the container.
+                                * This requires that they are
+                                * manually moved when the container
+                                * is moved (a definite performance
+                                * hit). */
+/*
+ * Forward declarations
+ */
+
+extern int Blt_GetTable _ANSI_ARGS_((TableInterpData *dataPtr, 
+       Tcl_Interp *interp, char *pathName, Table **tablePtrPtr));
+
+#endif /* _BLT_TABLE_H */