tkText.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:36k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * tkText.h --
  3.  *
  4.  * Declarations shared among the files that implement text
  5.  * widgets.
  6.  *
  7.  * Copyright (c) 1992-1994 The Regents of the University of California.
  8.  * Copyright (c) 1994-1995 Sun Microsystems, Inc.
  9.  *
  10.  * See the file "license.terms" for information on usage and redistribution
  11.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12.  *
  13.  * RCS: @(#) $Id: tkText.h,v 1.13.2.1 2006/10/17 05:38:48 dgp Exp $
  14.  */
  15. #ifndef _TKTEXT
  16. #define _TKTEXT
  17. #ifndef _TK
  18. #include "tk.h"
  19. #endif
  20. #ifndef _TKUNDO
  21. #include "tkUndo.h"
  22. #endif
  23. #ifdef BUILD_tk
  24. # undef TCL_STORAGE_CLASS
  25. # define TCL_STORAGE_CLASS DLLEXPORT
  26. #endif
  27. /*
  28.  * Opaque types for structures whose guts are only needed by a single
  29.  * file:
  30.  */
  31. typedef struct TkTextBTree_ *TkTextBTree;
  32. /*
  33.  * The data structure below defines a single line of text (from newline
  34.  * to newline, not necessarily what appears on one line of the screen).
  35.  */
  36. typedef struct TkTextLine {
  37.     struct Node *parentPtr; /* Pointer to parent node containing
  38.  * line. */
  39.     struct TkTextLine *nextPtr; /* Next in linked list of lines with
  40.  * same parent node in B-tree.  NULL
  41.  * means end of list. */
  42.     struct TkTextSegment *segPtr; /* First in ordered list of segments
  43.  * that make up the line. */
  44. } TkTextLine;
  45. /*
  46.  * -----------------------------------------------------------------------
  47.  * Segments: each line is divided into one or more segments, where each
  48.  * segment is one of several things, such as a group of characters, a
  49.  * tag toggle, a mark, or an embedded widget.  Each segment starts with
  50.  * a standard header followed by a body that varies from type to type.
  51.  * -----------------------------------------------------------------------
  52.  */
  53. /*
  54.  * The data structure below defines the body of a segment that represents
  55.  * a tag toggle.  There is one of these structures at both the beginning
  56.  * and end of each tagged range.
  57.  */
  58. typedef struct TkTextToggle {
  59.     struct TkTextTag *tagPtr; /* Tag that starts or ends here. */
  60.     int inNodeCounts; /* 1 means this toggle has been
  61.  * accounted for in node toggle
  62.  * counts; 0 means it hasn't, yet. */
  63. } TkTextToggle;
  64. /*
  65.  * The data structure below defines line segments that represent
  66.  * marks.  There is one of these for each mark in the text.
  67.  */
  68. typedef struct TkTextMark {
  69.     struct TkText *textPtr; /* Overall information about text
  70.  * widget. */
  71.     TkTextLine *linePtr; /* Line structure that contains the
  72.  * segment. */
  73.     Tcl_HashEntry *hPtr; /* Pointer to hash table entry for mark
  74.  * (in textPtr->markTable). */
  75. } TkTextMark;
  76. /*
  77.  * A structure of the following type holds information for each window
  78.  * embedded in a text widget.  This information is only used by the
  79.  * file tkTextWind.c
  80.  */
  81. typedef struct TkTextEmbWindow {
  82.     struct TkText *textPtr; /* Information about the overall text
  83.  * widget. */
  84.     TkTextLine *linePtr; /* Line structure that contains this
  85.  * window. */
  86.     Tk_Window tkwin; /* Window for this segment.  NULL
  87.  * means that the window hasn't
  88.  * been created yet. */
  89.     char *create; /* Script to create window on-demand.
  90.  * NULL means no such script.
  91.  * Malloc-ed. */
  92.     int align; /* How to align window in vertical
  93.  * space.  See definitions in
  94.  * tkTextWind.c. */
  95.     int padX, padY; /* Padding to leave around each side
  96.  * of window, in pixels. */
  97.     int stretch; /* Should window stretch to fill
  98.  * vertical space of line (except for
  99.  * pady)?  0 or 1. */
  100.     int chunkCount; /* Number of display chunks that
  101.  * refer to this window. */
  102.     int displayed; /* Non-zero means that the window
  103.  * has been displayed on the screen
  104.  * recently. */
  105. } TkTextEmbWindow;
  106. /*
  107.  * A structure of the following type holds information for each image
  108.  * embedded in a text widget.  This information is only used by the
  109.  * file tkTextImage.c
  110.  */
  111. typedef struct TkTextEmbImage {
  112.     struct TkText *textPtr; /* Information about the overall text
  113.  * widget. */
  114.     TkTextLine *linePtr; /* Line structure that contains this
  115.  * image. */
  116.     char *imageString; /* Name of the image for this segment */
  117.     char *imageName; /* Name used by text widget to identify
  118.       * this image.  May be unique-ified */
  119.     char *name; /* Name used in the hash table.
  120.       * used by "image names" to identify
  121.       * this instance of the image */
  122.     Tk_Image image; /* Image for this segment.  NULL
  123.  * means that the image hasn't
  124.  * been created yet. */
  125.     int align; /* How to align image in vertical
  126.  * space.  See definitions in
  127.  * tkTextImage.c. */
  128.     int padX, padY; /* Padding to leave around each side
  129.  * of image, in pixels. */
  130.     int chunkCount; /* Number of display chunks that
  131.  * refer to this image. */
  132. } TkTextEmbImage;
  133. /*
  134.  * The data structure below defines line segments.
  135.  */
  136. typedef struct TkTextSegment {
  137.     struct Tk_SegType *typePtr; /* Pointer to record describing
  138.  * segment's type. */
  139.     struct TkTextSegment *nextPtr; /* Next in list of segments for this
  140.  * line, or NULL for end of list. */
  141.     int size; /* Size of this segment (# of bytes
  142.  * of index space it occupies). */
  143.     union {
  144. char chars[4]; /* Characters that make up character
  145.  * info.  Actual length varies to
  146.  * hold as many characters as needed.*/
  147. TkTextToggle toggle; /* Information about tag toggle. */
  148. TkTextMark mark; /* Information about mark. */
  149. TkTextEmbWindow ew; /* Information about embedded
  150.  * window. */
  151. TkTextEmbImage ei; /* Information about embedded
  152.  * image. */
  153.     } body;
  154. } TkTextSegment;
  155. /*
  156.  * Data structures of the type defined below are used during the
  157.  * execution of Tcl commands to keep track of various interesting
  158.  * places in a text.  An index is only valid up until the next
  159.  * modification to the character structure of the b-tree so they
  160.  * can't be retained across Tcl commands.  However, mods to marks
  161.  * or tags don't invalidate indices.
  162.  */
  163. typedef struct TkTextIndex {
  164.     TkTextBTree tree; /* Tree containing desired position. */
  165.     TkTextLine *linePtr; /* Pointer to line containing position
  166.  * of interest. */
  167.     int byteIndex; /* Index within line of desired
  168.  * character (0 means first one). */
  169. } TkTextIndex;
  170. /*
  171.  * Types for procedure pointers stored in TkTextDispChunk strutures:
  172.  */
  173. typedef struct TkTextDispChunk TkTextDispChunk;
  174. typedef void  Tk_ChunkDisplayProc _ANSI_ARGS_((
  175.     TkTextDispChunk *chunkPtr, int x, int y,
  176.     int height, int baseline, Display *display,
  177.     Drawable dst, int screenY));
  178. typedef void Tk_ChunkUndisplayProc _ANSI_ARGS_((
  179.     struct TkText *textPtr,
  180.     TkTextDispChunk *chunkPtr));
  181. typedef int Tk_ChunkMeasureProc _ANSI_ARGS_((
  182.     TkTextDispChunk *chunkPtr, int x));
  183. typedef void Tk_ChunkBboxProc _ANSI_ARGS_((
  184.     TkTextDispChunk *chunkPtr, int index, int y,
  185.     int lineHeight, int baseline, int *xPtr,
  186.     int *yPtr, int *widthPtr, int *heightPtr));
  187. /*
  188.  * The structure below represents a chunk of stuff that is displayed
  189.  * together on the screen.  This structure is allocated and freed by
  190.  * generic display code but most of its fields are filled in by
  191.  * segment-type-specific code.
  192.  */
  193. struct TkTextDispChunk {
  194.     /*
  195.      * The fields below are set by the type-independent code before
  196.      * calling the segment-type-specific layoutProc.  They should not
  197.      * be modified by segment-type-specific code.
  198.      */
  199.     int x; /* X position of chunk, in pixels.
  200.  * This position is measured from the
  201.  * left edge of the logical line,
  202.  * not from the left edge of the
  203.  * window (i.e. it doesn't change
  204.  * under horizontal scrolling). */
  205.     struct TkTextDispChunk *nextPtr; /* Next chunk in the display line
  206.  * or NULL for the end of the list. */
  207.     struct TextStyle *stylePtr; /* Display information, known only
  208.  * to tkTextDisp.c. */
  209.     /*
  210.      * The fields below are set by the layoutProc that creates the
  211.      * chunk.
  212.      */
  213.     Tk_ChunkDisplayProc *displayProc; /* Procedure to invoke to draw this
  214.  * chunk on the display or an
  215.  * off-screen pixmap. */
  216.     Tk_ChunkUndisplayProc *undisplayProc;
  217. /* Procedure to invoke when segment
  218.  * ceases to be displayed on screen
  219.  * anymore. */
  220.     Tk_ChunkMeasureProc *measureProc; /* Procedure to find character under
  221.  * a given x-location. */
  222.     Tk_ChunkBboxProc *bboxProc; /* Procedure to find bounding box
  223.  * of character in chunk. */
  224.     int numBytes; /* Number of bytes that will be
  225.  * displayed in the chunk. */
  226.     int minAscent; /* Minimum space above the baseline
  227.  * needed by this chunk. */
  228.     int minDescent; /* Minimum space below the baseline
  229.  * needed by this chunk. */
  230.     int minHeight; /* Minimum total line height needed
  231.  * by this chunk. */
  232.     int width; /* Width of this chunk, in pixels.
  233.  * Initially set by chunk-specific
  234.  * code, but may be increased to
  235.  * include tab or extra space at end
  236.  * of line. */
  237.     int breakIndex; /* Index within chunk of last
  238.  * acceptable position for a line
  239.  * (break just before this byte index).
  240.  * <= 0 means don't break during or
  241.  * immediately after this chunk. */
  242.     ClientData clientData; /* Additional information for use
  243.  * of displayProc and undisplayProc. */
  244. };
  245. /*
  246.  * One data structure of the following type is used for each tag in a
  247.  * text widget.  These structures are kept in textPtr->tagTable and
  248.  * referred to in other structures.
  249.  */
  250. typedef enum { TEXT_WRAPMODE_NULL, TEXT_WRAPMODE_NONE,
  251. TEXT_WRAPMODE_CHAR, TEXT_WRAPMODE_WORD
  252. } TkWrapMode;
  253. EXTERN Tk_CustomOption TkTextWrapModeOption;
  254. typedef struct TkTextTag {
  255.     char *name; /* Name of this tag.  This field is actually
  256.  * a pointer to the key from the entry in
  257.  * textPtr->tagTable, so it needn't be freed
  258.  * explicitly. */
  259.     int priority; /* Priority of this tag within widget.  0
  260.  * means lowest priority.  Exactly one tag
  261.  * has each integer value between 0 and
  262.  * numTags-1. */
  263.     struct Node *tagRootPtr; /* Pointer into the B-Tree at the lowest
  264.  * node that completely dominates the ranges
  265.  * of text occupied by the tag.  At this
  266.  * node there is no information about the
  267.  * tag.  One or more children of the node
  268.  * do contain information about the tag. */
  269.     int toggleCount; /* Total number of tag toggles */
  270.     /*
  271.      * Information for displaying text with this tag.  The information
  272.      * belows acts as an override on information specified by lower-priority
  273.      * tags.  If no value is specified, then the next-lower-priority tag
  274.      * on the text determins the value.  The text widget itself provides
  275.      * defaults if no tag specifies an override.
  276.      */
  277.     Tk_3DBorder border; /* Used for drawing background.  NULL means
  278.  * no value specified here. */
  279.     char *bdString; /* -borderwidth option string (malloc-ed).
  280.  * NULL means option not specified. */
  281.     int borderWidth; /* Width of 3-D border for background. */
  282.     char *reliefString; /* -relief option string (malloc-ed).
  283.  * NULL means option not specified. */
  284.     int relief; /* 3-D relief for background. */
  285.     Pixmap bgStipple; /* Stipple bitmap for background.  None
  286.  * means no value specified here. */
  287.     XColor *fgColor; /* Foreground color for text.  NULL means
  288.  * no value specified here. */
  289.     Tk_Font tkfont; /* Font for displaying text.  NULL means
  290.  * no value specified here. */
  291.     Pixmap fgStipple; /* Stipple bitmap for text and other
  292.  * foreground stuff.   None means no value
  293.  * specified here.*/
  294.     char *justifyString; /* -justify option string (malloc-ed).
  295.  * NULL means option not specified. */
  296.     Tk_Justify justify; /* How to justify text: TK_JUSTIFY_LEFT,
  297.  * TK_JUSTIFY_RIGHT, or TK_JUSTIFY_CENTER.
  298.  * Only valid if justifyString is non-NULL. */
  299.     char *lMargin1String; /* -lmargin1 option string (malloc-ed).
  300.  * NULL means option not specified. */
  301.     int lMargin1; /* Left margin for first display line of
  302.  * each text line, in pixels.  Only valid
  303.  * if lMargin1String is non-NULL. */
  304.     char *lMargin2String; /* -lmargin2 option string (malloc-ed).
  305.  * NULL means option not specified. */
  306.     int lMargin2; /* Left margin for second and later display
  307.  * lines of each text line, in pixels.  Only
  308.  * valid if lMargin2String is non-NULL. */
  309.     char *offsetString; /* -offset option string (malloc-ed).
  310.  * NULL means option not specified. */
  311.     int offset; /* Vertical offset of text's baseline from
  312.  * baseline of line.  Used for superscripts
  313.  * and subscripts.  Only valid if
  314.  * offsetString is non-NULL. */
  315.     char *overstrikeString; /* -overstrike option string (malloc-ed).
  316.  * NULL means option not specified. */
  317.     int overstrike; /* Non-zero means draw horizontal line through
  318.  * middle of text.  Only valid if
  319.  * overstrikeString is non-NULL. */
  320.     char *rMarginString; /* -rmargin option string (malloc-ed).
  321.  * NULL means option not specified. */
  322.     int rMargin; /* Right margin for text, in pixels.  Only
  323.  * valid if rMarginString is non-NULL. */
  324.     char *spacing1String; /* -spacing1 option string (malloc-ed).
  325.  * NULL means option not specified. */
  326.     int spacing1; /* Extra spacing above first display
  327.  * line for text line.  Only valid if
  328.  * spacing1String is non-NULL. */
  329.     char *spacing2String; /* -spacing2 option string (malloc-ed).
  330.  * NULL means option not specified. */
  331.     int spacing2; /* Extra spacing between display
  332.  * lines for the same text line.  Only valid
  333.  * if spacing2String is non-NULL. */
  334.     char *spacing3String; /* -spacing2 option string (malloc-ed).
  335.  * NULL means option not specified. */
  336.     int spacing3; /* Extra spacing below last display
  337.  * line for text line.  Only valid if
  338.  * spacing3String is non-NULL. */
  339.     char *tabString; /* -tabs option string (malloc-ed).
  340.  * NULL means option not specified. */
  341.     struct TkTextTabArray *tabArrayPtr;
  342. /* Info about tabs for tag (malloc-ed)
  343.  * or NULL.  Corresponds to tabString. */
  344.     char *underlineString; /* -underline option string (malloc-ed).
  345.  * NULL means option not specified. */
  346.     int underline; /* Non-zero means draw underline underneath
  347.  * text.  Only valid if underlineString is
  348.  * non-NULL. */
  349.     TkWrapMode wrapMode; /* How to handle wrap-around for this tag.
  350.  * Must be TEXT_WRAPMODE_CHAR,
  351.  * TEXT_WRAPMODE_NONE, TEXT_WRAPMODE_WORD,
  352.  * or TEXT_WRAPMODE_NULL to use wrapmode for
  353.  * whole widget. */
  354.     char *elideString; /* -elide option string (malloc-ed).
  355.  * NULL means option not specified. */
  356.     int elide; /* Non-zero means that data under this tag
  357.  * should not be displayed. */
  358.     int affectsDisplay; /* Non-zero means that this tag affects the
  359.  * way information is displayed on the screen
  360.  * (so need to redisplay if tag changes). */
  361. } TkTextTag;
  362. #define TK_TAG_AFFECTS_DISPLAY 0x1
  363. #define TK_TAG_UNDERLINE 0x2
  364. #define TK_TAG_JUSTIFY 0x4
  365. #define TK_TAG_OFFSET 0x10
  366. /*
  367.  * The data structure below is used for searching a B-tree for transitions
  368.  * on a single tag (or for all tag transitions).  No code outside of
  369.  * tkTextBTree.c should ever modify any of the fields in these structures,
  370.  * but it's OK to use them for read-only information.
  371.  */
  372. typedef struct TkTextSearch {
  373.     TkTextIndex curIndex; /* Position of last tag transition
  374.  * returned by TkBTreeNextTag, or
  375.  * index of start of segment
  376.  * containing starting position for
  377.  * search if TkBTreeNextTag hasn't
  378.  * been called yet, or same as
  379.  * stopIndex if search is over. */
  380.     TkTextSegment *segPtr; /* Actual tag segment returned by last
  381.  * call to TkBTreeNextTag, or NULL if
  382.  * TkBTreeNextTag hasn't returned
  383.  * anything yet. */
  384.     TkTextSegment *nextPtr; /* Where to resume search in next
  385.  * call to TkBTreeNextTag. */
  386.     TkTextSegment *lastPtr; /* Stop search before just before
  387.  * considering this segment. */
  388.     TkTextTag *tagPtr; /* Tag to search for (or tag found, if
  389.  * allTags is non-zero). */
  390.     int linesLeft; /* Lines left to search (including
  391.  * curIndex and stopIndex).  When
  392.  * this becomes <= 0 the search is
  393.  * over. */
  394.     int allTags; /* Non-zero means ignore tag check:
  395.  * search for transitions on all
  396.  * tags. */
  397. } TkTextSearch;
  398. /*
  399.  * The following data structure describes a single tab stop.
  400.  */
  401. typedef enum {LEFT, RIGHT, CENTER, NUMERIC} TkTextTabAlign;
  402. typedef struct TkTextTab {
  403.     int location; /* Offset in pixels of this tab stop
  404.  * from the left margin (lmargin2) of
  405.  * the text. */
  406.     TkTextTabAlign alignment; /* Where the tab stop appears relative
  407.  * to the text. */
  408. } TkTextTab;
  409. typedef struct TkTextTabArray {
  410.     int numTabs; /* Number of tab stops. */
  411.     TkTextTab tabs[1]; /* Array of tabs.  The actual size
  412.  * will be numTabs.  THIS FIELD MUST
  413.  * BE THE LAST IN THE STRUCTURE. */
  414. } TkTextTabArray;
  415. /* enum definining the edit modes of */
  416. typedef enum {
  417.     TK_TEXT_EDIT_INSERT, /* insert mode */
  418.     TK_TEXT_EDIT_DELETE, /* delete mode */
  419.     TK_TEXT_EDIT_OTHER    /* none of the above */
  420. } TkTextEditMode;
  421. /*
  422.  * A data structure of the following type is kept for each text widget that
  423.  * currently exists for this process:
  424.  */
  425. typedef struct TkText {
  426.     Tk_Window tkwin; /* Window that embodies the text.  NULL
  427.  * means that the window has been destroyed
  428.  * but the data structures haven't yet been
  429.  * cleaned up.*/
  430.     Display *display; /* Display for widget.  Needed, among other
  431.  * things, to allow resources to be freed
  432.  * even after tkwin has gone away. */
  433.     Tcl_Interp *interp; /* Interpreter associated with widget.  Used
  434.  * to delete widget command.  */
  435.     Tcl_Command widgetCmd; /* Token for text's widget command. */
  436.     TkTextBTree tree; /* B-tree representation of text and tags for
  437.  * widget. */
  438.     Tcl_HashTable tagTable; /* Hash table that maps from tag names to
  439.  * pointers to TkTextTag structures. */
  440.     int numTags; /* Number of tags currently defined for
  441.  * widget;  needed to keep track of
  442.  * priorities. */
  443.     Tcl_HashTable markTable; /* Hash table that maps from mark names to
  444.  * pointers to mark segments. */
  445.     Tcl_HashTable windowTable; /* Hash table that maps from window names
  446.  * to pointers to window segments.  If a
  447.  * window segment doesn't yet have an
  448.  * associated window, there is no entry for
  449.  * it here. */
  450.     Tcl_HashTable imageTable; /* Hash table that maps from image names
  451.  * to pointers to image segments.  If an
  452.  * image segment doesn't yet have an
  453.  * associated image, there is no entry for
  454.  * it here. */
  455.     int state; /* Either STATE_NORMAL or STATE_DISABLED. A
  456.  * text widget is read-only when disabled. */
  457.     /*
  458.      * Default information for displaying (may be overridden by tags
  459.      * applied to ranges of characters).
  460.      */
  461.     Tk_3DBorder border; /* Structure used to draw 3-D border and
  462.  * default background. */
  463.     int borderWidth; /* Width of 3-D border to draw around entire
  464.  * widget. */
  465.     int padX, padY; /* Padding between text and window border. */
  466.     int relief; /* 3-d effect for border around entire
  467.  * widget: TK_RELIEF_RAISED etc. */
  468.     int highlightWidth; /* Width in pixels of highlight to draw
  469.  * around widget when it has the focus.
  470.  * <= 0 means don't draw a highlight. */
  471.     XColor *highlightBgColorPtr;
  472. /* Color for drawing traversal highlight
  473.  * area when highlight is off. */
  474.     XColor *highlightColorPtr; /* Color for drawing traversal highlight. */
  475.     Tk_Cursor cursor; /* Current cursor for window, or None. */
  476.     XColor *fgColor; /* Default foreground color for text. */
  477.     Tk_Font tkfont; /* Default font for displaying text. */
  478.     int charWidth; /* Width of average character in default
  479.  * font. */
  480.     int spacing1; /* Default extra spacing above first display
  481.  * line for each text line. */
  482.     int spacing2; /* Default extra spacing between display lines
  483.  * for the same text line. */
  484.     int spacing3; /* Default extra spacing below last display
  485.  * line for each text line. */
  486.     char *tabOptionString; /* Value of -tabs option string (malloc'ed). */
  487.     TkTextTabArray *tabArrayPtr;
  488. /* Information about tab stops (malloc'ed).
  489.  * NULL means perform default tabbing
  490.  * behavior. */
  491.     /*
  492.      * Additional information used for displaying:
  493.      */
  494.     TkWrapMode wrapMode; /* How to handle wrap-around.  Must be
  495.  * TEXT_WRAPMODE_CHAR, TEXT_WRAPMODE_NONE, or
  496.  * TEXT_WRAPMODE_WORD. */
  497.     int width, height; /* Desired dimensions for window, measured
  498.  * in characters. */
  499.     int setGrid; /* Non-zero means pass gridding information
  500.  * to window manager. */
  501.     int prevWidth, prevHeight; /* Last known dimensions of window;  used to
  502.  * detect changes in size. */
  503.     TkTextIndex topIndex; /* Identifies first character in top display
  504.  * line of window. */
  505.     struct TextDInfo *dInfoPtr; /* Information maintained by tkTextDisp.c. */
  506.     /*
  507.      * Information related to selection.
  508.      */
  509.     TkTextTag *selTagPtr; /* Pointer to "sel" tag.  Used to tell when
  510.  * a new selection has been made. */
  511.     Tk_3DBorder selBorder; /* Border and background for selected
  512.  * characters.  This is a copy of information
  513.  * in *cursorTagPtr, so it shouldn't be
  514.  * explicitly freed. */
  515.     char *selBdString; /* Value of -selectborderwidth option, or NULL
  516.  * if not specified (malloc'ed). */
  517.     XColor *selFgColorPtr; /* Foreground color for selected text.
  518.  * This is a copy of information in
  519.  * *cursorTagPtr, so it shouldn't be
  520.  * explicitly freed. */
  521.     int exportSelection; /* Non-zero means tie "sel" tag to X
  522.  * selection. */
  523.     TkTextIndex selIndex; /* Used during multi-pass selection retrievals.
  524.  * This index identifies the next character
  525.  * to be returned from the selection. */
  526.     int abortSelections; /* Set to 1 whenever the text is modified
  527.  * in a way that interferes with selection
  528.  * retrieval:  used to abort incremental
  529.  * selection retrievals. */
  530.     int selOffset; /* Offset in selection corresponding to
  531.  * selLine and selCh.  -1 means neither
  532.  * this information nor selIndex is of any
  533.  * use. */
  534.     /*
  535.      * Information related to insertion cursor:
  536.      */
  537.     TkTextSegment *insertMarkPtr;
  538. /* Points to segment for "insert" mark. */
  539.     Tk_3DBorder insertBorder; /* Used to draw vertical bar for insertion
  540.  * cursor. */
  541.     int insertWidth; /* Total width of insert cursor. */
  542.     int insertBorderWidth; /* Width of 3-D border around insert cursor. */
  543.     int insertOnTime; /* Number of milliseconds cursor should spend
  544.  * in "on" state for each blink. */
  545.     int insertOffTime; /* Number of milliseconds cursor should spend
  546.  * in "off" state for each blink. */
  547.     Tcl_TimerToken insertBlinkHandler;
  548. /* Timer handler used to blink cursor on and
  549.  * off. */
  550.     /*
  551.      * Information used for event bindings associated with tags:
  552.      */
  553.     Tk_BindingTable bindingTable;
  554. /* Table of all bindings currently defined
  555.  * for this widget.  NULL means that no
  556.  * bindings exist, so the table hasn't been
  557.  * created.  Each "object" used for this
  558.  * table is the address of a tag. */
  559.     TkTextSegment *currentMarkPtr;
  560. /* Pointer to segment for "current" mark,
  561.  * or NULL if none. */
  562.     XEvent pickEvent; /* The event from which the current character
  563.  * was chosen. Must be saved so that we
  564.  * can repick after modifications to the
  565.  * text. */
  566.     int numCurTags; /* Number of tags associated with character
  567.  * at current mark. */
  568.     TkTextTag **curTagArrayPtr; /* Pointer to array of tags for current
  569.  * mark, or NULL if none. */
  570.     /*
  571.      * Miscellaneous additional information:
  572.      */
  573.     char *takeFocus; /* Value of -takeFocus option; not used in
  574.  * the C code, but used by keyboard traversal
  575.  * scripts.  Malloc'ed, but may be NULL. */
  576.     char *xScrollCmd; /* Prefix of command to issue to update
  577.  * horizontal scrollbar when view changes. */
  578.     char *yScrollCmd; /* Prefix of command to issue to update
  579.  * vertical scrollbar when view changes. */
  580.     int flags; /* Miscellaneous flags;  see below for
  581.  * definitions. */
  582.     /*
  583.      * Information related to the undo/redo functonality
  584.      */
  585.      
  586.     TkUndoRedoStack * undoStack; /* The undo/redo stack */
  587.     
  588.     int undo; /* non zero means the undo/redo behaviour is 
  589.  * enabled */
  590.     
  591.     int maxUndo; /* The maximum depth of the undo stack expressed
  592.              * as the maximum number of compound statements */
  593.     int autoSeparators; /* non zero means the separatorss will be 
  594.  * inserted automatically */
  595.     
  596.     int modifiedSet; /* Flag indicating that the 'dirtynesss' of
  597.  * the text widget has been expplicitly set.
  598.  */
  599.     int isDirty; /* Flag indicating the 'dirtynesss' of the text
  600.  * widget. If the flag is not zero, unsaved 
  601.  * modifications have been applied to the
  602.  * text widget */
  603.     int isDirtyIncrement; /* Amount with which the isDirty flag is
  604.  * incremented every edit action
  605.  */
  606.     TkTextEditMode lastEditMode; /* Keeps track of what the last edit mode was
  607.  */
  608. } TkText;
  609. /*
  610.  * Flag values for TkText records:
  611.  *
  612.  * GOT_SELECTION: Non-zero means we've already claimed the
  613.  * selection.
  614.  * INSERT_ON: Non-zero means insertion cursor should be
  615.  * displayed on screen.
  616.  * GOT_FOCUS: Non-zero means this window has the input
  617.  * focus.
  618.  * BUTTON_DOWN: 1 means that a mouse button is currently
  619.  * down;  this is used to implement grabs
  620.  * for the duration of button presses.
  621.  * UPDATE_SCROLLBARS: Non-zero means scrollbar(s) should be updated
  622.  * during next redisplay operation.
  623.  */
  624. #define GOT_SELECTION 1
  625. #define INSERT_ON 2
  626. #define GOT_FOCUS 4
  627. #define BUTTON_DOWN 8
  628. #define UPDATE_SCROLLBARS 0x10
  629. #define NEED_REPICK 0x20
  630. /*
  631.  * Records of the following type define segment types in terms of
  632.  * a collection of procedures that may be called to manipulate
  633.  * segments of that type.
  634.  */
  635. typedef TkTextSegment * Tk_SegSplitProc _ANSI_ARGS_((
  636.     struct TkTextSegment *segPtr, int index));
  637. typedef int Tk_SegDeleteProc _ANSI_ARGS_((
  638.     struct TkTextSegment *segPtr,
  639.     TkTextLine *linePtr, int treeGone));
  640. typedef TkTextSegment * Tk_SegCleanupProc _ANSI_ARGS_((
  641.     struct TkTextSegment *segPtr, TkTextLine *linePtr));
  642. typedef void Tk_SegLineChangeProc _ANSI_ARGS_((
  643.     struct TkTextSegment *segPtr, TkTextLine *linePtr));
  644. typedef int Tk_SegLayoutProc _ANSI_ARGS_((struct TkText *textPtr,
  645.     struct TkTextIndex *indexPtr, TkTextSegment *segPtr,
  646.     int offset, int maxX, int maxChars,
  647.     int noCharsYet, TkWrapMode wrapMode,
  648.     struct TkTextDispChunk *chunkPtr));
  649. typedef void Tk_SegCheckProc _ANSI_ARGS_((TkTextSegment *segPtr,
  650.     TkTextLine *linePtr));
  651. typedef struct Tk_SegType {
  652.     char *name; /* Name of this kind of segment. */
  653.     int leftGravity; /* If a segment has zero size (e.g. a
  654.  * mark or tag toggle), does it
  655.  * attach to character to its left
  656.  * or right?  1 means left, 0 means
  657.  * right. */
  658.     Tk_SegSplitProc *splitProc; /* Procedure to split large segment
  659.  * into two smaller ones. */
  660.     Tk_SegDeleteProc *deleteProc; /* Procedure to call to delete
  661.  * segment. */
  662.     Tk_SegCleanupProc *cleanupProc; /* After any change to a line, this
  663.  * procedure is invoked for all
  664.  * segments left in the line to
  665.  * perform any cleanup they wish
  666.  * (e.g. joining neighboring
  667.  * segments). */
  668.     Tk_SegLineChangeProc *lineChangeProc;
  669. /* Invoked when a segment is about
  670.  * to be moved from its current line
  671.  * to an earlier line because of
  672.  * a deletion.  The linePtr is that
  673.  * for the segment's old line.
  674.  * CleanupProc will be invoked after
  675.  * the deletion is finished. */
  676.     Tk_SegLayoutProc *layoutProc; /* Returns size information when
  677.  * figuring out what to display in
  678.  * window. */
  679.     Tk_SegCheckProc *checkProc; /* Called during consistency checks
  680.  * to check internal consistency of
  681.  * segment. */
  682. } Tk_SegType;
  683. /*
  684.  * The constant below is used to specify a line when what is really
  685.  * wanted is the entire text.  For now, just use a very big number.
  686.  */
  687. #define TK_END_OF_TEXT 1000000
  688. /*
  689.  * The following definition specifies the maximum number of characters
  690.  * needed in a string to hold a position specifier.
  691.  */
  692. #define TK_POS_CHARS 30
  693. /*
  694.  * Declarations for variables shared among the text-related files:
  695.  */
  696. EXTERN int tkBTreeDebug;
  697. EXTERN int tkTextDebug;
  698. EXTERN Tk_SegType tkTextCharType;
  699. EXTERN Tk_SegType tkTextLeftMarkType;
  700. EXTERN Tk_SegType tkTextRightMarkType;
  701. EXTERN Tk_SegType tkTextToggleOnType;
  702. EXTERN Tk_SegType tkTextToggleOffType;
  703. /*
  704.  * Declarations for procedures that are used by the text-related files
  705.  * but shouldn't be used anywhere else in Tk (or by Tk clients):
  706.  */
  707. EXTERN int TkBTreeCharTagged _ANSI_ARGS_((TkTextIndex *indexPtr,
  708.     TkTextTag *tagPtr));
  709. EXTERN void TkBTreeCheck _ANSI_ARGS_((TkTextBTree tree));
  710. EXTERN int TkBTreeCharsInLine _ANSI_ARGS_((TkTextLine *linePtr));
  711. EXTERN int TkBTreeBytesInLine _ANSI_ARGS_((TkTextLine *linePtr));
  712. EXTERN TkTextBTree TkBTreeCreate _ANSI_ARGS_((TkText *textPtr));
  713. EXTERN void TkBTreeDestroy _ANSI_ARGS_((TkTextBTree tree));
  714. EXTERN void TkBTreeDeleteChars _ANSI_ARGS_((TkTextIndex *index1Ptr,
  715.     TkTextIndex *index2Ptr));
  716. EXTERN TkTextLine * TkBTreeFindLine _ANSI_ARGS_((TkTextBTree tree,
  717.     int line));
  718. EXTERN TkTextTag ** TkBTreeGetTags _ANSI_ARGS_((TkTextIndex *indexPtr,
  719.     int *numTagsPtr));
  720. EXTERN void TkBTreeInsertChars _ANSI_ARGS_((TkTextIndex *indexPtr,
  721.     CONST char *string));
  722. EXTERN int TkBTreeLineIndex _ANSI_ARGS_((TkTextLine *linePtr));
  723. EXTERN void TkBTreeLinkSegment _ANSI_ARGS_((TkTextSegment *segPtr,
  724.     TkTextIndex *indexPtr));
  725. EXTERN TkTextLine * TkBTreeNextLine _ANSI_ARGS_((TkTextLine *linePtr));
  726. EXTERN int TkBTreeNextTag _ANSI_ARGS_((TkTextSearch *searchPtr));
  727. EXTERN int TkBTreeNumLines _ANSI_ARGS_((TkTextBTree tree));
  728. EXTERN TkTextLine * TkBTreePreviousLine _ANSI_ARGS_((TkTextLine *linePtr));
  729. EXTERN int TkBTreePrevTag _ANSI_ARGS_((TkTextSearch *searchPtr));
  730. EXTERN void TkBTreeStartSearch _ANSI_ARGS_((TkTextIndex *index1Ptr,
  731.     TkTextIndex *index2Ptr, TkTextTag *tagPtr,
  732.     TkTextSearch *searchPtr));
  733. EXTERN void TkBTreeStartSearchBack _ANSI_ARGS_((TkTextIndex *index1Ptr,
  734.     TkTextIndex *index2Ptr, TkTextTag *tagPtr,
  735.     TkTextSearch *searchPtr));
  736. EXTERN void TkBTreeTag _ANSI_ARGS_((TkTextIndex *index1Ptr,
  737.     TkTextIndex *index2Ptr, TkTextTag *tagPtr,
  738.     int add));
  739. EXTERN void TkBTreeUnlinkSegment _ANSI_ARGS_((TkTextBTree tree,
  740.     TkTextSegment *segPtr, TkTextLine *linePtr));
  741. EXTERN void TkTextBindProc _ANSI_ARGS_((ClientData clientData,
  742.     XEvent *eventPtr));
  743. EXTERN void TkTextChanged _ANSI_ARGS_((TkText *textPtr,
  744.     TkTextIndex *index1Ptr, TkTextIndex *index2Ptr));
  745. EXTERN int TkTextCharBbox _ANSI_ARGS_((TkText *textPtr,
  746.     TkTextIndex *indexPtr, int *xPtr, int *yPtr,
  747.     int *widthPtr, int *heightPtr));
  748. EXTERN int TkTextCharLayoutProc _ANSI_ARGS_((TkText *textPtr,
  749.     TkTextIndex *indexPtr, TkTextSegment *segPtr,
  750.     int offset, int maxX, int maxChars, int noBreakYet,
  751.     TkWrapMode wrapMode, TkTextDispChunk *chunkPtr));
  752. EXTERN void TkTextCreateDInfo _ANSI_ARGS_((TkText *textPtr));
  753. EXTERN int TkTextDLineInfo _ANSI_ARGS_((TkText *textPtr,
  754.     TkTextIndex *indexPtr, int *xPtr, int *yPtr,
  755.     int *widthPtr, int *heightPtr, int *basePtr));
  756. EXTERN TkTextTag * TkTextCreateTag _ANSI_ARGS_((TkText *textPtr,
  757.     CONST char *tagName));
  758. EXTERN void TkTextFreeDInfo _ANSI_ARGS_((TkText *textPtr));
  759. EXTERN void TkTextFreeTag _ANSI_ARGS_((TkText *textPtr,
  760.     TkTextTag *tagPtr));
  761. EXTERN int TkTextGetIndex _ANSI_ARGS_((Tcl_Interp *interp,
  762.     TkText *textPtr, CONST char *string,
  763.     TkTextIndex *indexPtr));
  764. EXTERN TkTextTabArray * TkTextGetTabs _ANSI_ARGS_((Tcl_Interp *interp,
  765.     Tk_Window tkwin, char *string));
  766. EXTERN void TkTextIndexBackBytes _ANSI_ARGS_((
  767.     CONST TkTextIndex *srcPtr, int count,
  768.     TkTextIndex *dstPtr));
  769. EXTERN void TkTextIndexBackChars _ANSI_ARGS_((
  770.     CONST TkTextIndex *srcPtr, int count,
  771.     TkTextIndex *dstPtr));
  772. EXTERN int TkTextIndexCmp _ANSI_ARGS_((
  773.     CONST TkTextIndex *index1Ptr,
  774.     CONST TkTextIndex *index2Ptr));
  775. EXTERN void TkTextIndexForwBytes _ANSI_ARGS_((
  776.     CONST TkTextIndex *srcPtr, int count,
  777.     TkTextIndex *dstPtr));
  778. EXTERN void TkTextIndexForwChars _ANSI_ARGS_((
  779.     CONST TkTextIndex *srcPtr, int count,
  780.     TkTextIndex *dstPtr));
  781. EXTERN TkTextSegment * TkTextIndexToSeg _ANSI_ARGS_((
  782.     CONST TkTextIndex *indexPtr, int *offsetPtr));
  783. EXTERN void TkTextInsertDisplayProc _ANSI_ARGS_((
  784.     TkTextDispChunk *chunkPtr, int x, int y, int height,
  785.     int baseline, Display *display, Drawable dst,
  786.     int screenY));
  787. EXTERN void TkTextLostSelection _ANSI_ARGS_((
  788.     ClientData clientData));
  789. EXTERN TkTextIndex * TkTextMakeCharIndex _ANSI_ARGS_((TkTextBTree tree,
  790.     int lineIndex, int charIndex,
  791.     TkTextIndex *indexPtr));
  792. EXTERN int TkTextIsElided _ANSI_ARGS_((TkText *textPtr,
  793.     TkTextIndex *indexPtr));
  794. EXTERN TkTextIndex * TkTextMakeByteIndex _ANSI_ARGS_((TkTextBTree tree,
  795.     int lineIndex, int byteIndex,
  796.     TkTextIndex *indexPtr));
  797. EXTERN int TkTextMarkCmd _ANSI_ARGS_((TkText *textPtr,
  798.     Tcl_Interp *interp, int argc, CONST char **argv));
  799. EXTERN int TkTextMarkNameToIndex _ANSI_ARGS_((TkText *textPtr,
  800.     CONST char *name, TkTextIndex *indexPtr));
  801. EXTERN void TkTextMarkSegToIndex _ANSI_ARGS_((TkText *textPtr,
  802.     TkTextSegment *markPtr, TkTextIndex *indexPtr));
  803. EXTERN void TkTextEventuallyRepick _ANSI_ARGS_((TkText *textPtr));
  804. EXTERN void TkTextPickCurrent _ANSI_ARGS_((TkText *textPtr,
  805.     XEvent *eventPtr));
  806. EXTERN void TkTextPixelIndex _ANSI_ARGS_((TkText *textPtr,
  807.     int x, int y, TkTextIndex *indexPtr));
  808. EXTERN void TkTextPrintIndex _ANSI_ARGS_((
  809.     CONST TkTextIndex *indexPtr, char *string));
  810. EXTERN void TkTextRedrawRegion _ANSI_ARGS_((TkText *textPtr,
  811.     int x, int y, int width, int height));
  812. EXTERN void TkTextRedrawTag _ANSI_ARGS_((TkText *textPtr,
  813.     TkTextIndex *index1Ptr, TkTextIndex *index2Ptr,
  814.     TkTextTag *tagPtr, int withTag));
  815. EXTERN void TkTextRelayoutWindow _ANSI_ARGS_((TkText *textPtr));
  816. EXTERN int TkTextScanCmd _ANSI_ARGS_((TkText *textPtr,
  817.     Tcl_Interp *interp, int argc, CONST char **argv));
  818. EXTERN int TkTextSeeCmd _ANSI_ARGS_((TkText *textPtr,
  819.     Tcl_Interp *interp, int argc, CONST char **argv));
  820. EXTERN int TkTextSegToOffset _ANSI_ARGS_((
  821.     CONST TkTextSegment *segPtr,
  822.     CONST TkTextLine *linePtr));
  823. EXTERN TkTextSegment * TkTextSetMark _ANSI_ARGS_((TkText *textPtr,
  824.     CONST char *name, TkTextIndex *indexPtr));
  825. EXTERN void TkTextSetYView _ANSI_ARGS_((TkText *textPtr,
  826.     TkTextIndex *indexPtr, int pickPlace));
  827. EXTERN int TkTextTagCmd _ANSI_ARGS_((TkText *textPtr,
  828.     Tcl_Interp *interp, int argc, CONST char **argv));
  829. EXTERN int TkTextImageCmd _ANSI_ARGS_((TkText *textPtr,
  830.     Tcl_Interp *interp, int argc, CONST char **argv));
  831. EXTERN int TkTextImageIndex _ANSI_ARGS_((TkText *textPtr,
  832.     CONST char *name, TkTextIndex *indexPtr));
  833. EXTERN int TkTextWindowCmd _ANSI_ARGS_((TkText *textPtr,
  834.     Tcl_Interp *interp, int argc, CONST char **argv));
  835. EXTERN int TkTextWindowIndex _ANSI_ARGS_((TkText *textPtr,
  836.     CONST char *name, TkTextIndex *indexPtr));
  837. EXTERN int TkTextXviewCmd _ANSI_ARGS_((TkText *textPtr,
  838.     Tcl_Interp *interp, int argc, CONST char **argv));
  839. EXTERN int TkTextYviewCmd _ANSI_ARGS_((TkText *textPtr,
  840.     Tcl_Interp *interp, int argc, CONST char **argv));
  841. # undef TCL_STORAGE_CLASS
  842. # define TCL_STORAGE_CLASS DLLIMPORT
  843. #endif /* _TKTEXT */