/* * tkText.h -- * * Declarations shared among the files that implement text * widgets. * * Copyright (c) 1992-1993 The Regents of the University of California. * All rights reserved. * * Permission is hereby granted, without written agreement and without * license or royalty fees, to use, copy, modify, and distribute this * software and its documentation for any purpose, provided that the * above copyright notice and the following two paragraphs appear in * all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * $Header: /user6/ouster/wish/RCS/tkText.h,v 1.16 93/11/01 15:05:32 ouster Exp $ SPRITE (Berkeley) */ #ifndef _TKTEXT #define _TKTEXT #ifndef _TK #include "tk.h" #endif /* * Opaque types for structures whose guts are only needed by a single * file: */ typedef struct TkTextBTree *TkTextBTree; /* * The data structure below defines a single line of text (from newline * to newline, not necessarily what appears on one line of the screen). */ typedef struct TkTextLine { struct Node *parentPtr; /* Pointer to parent node containing * line. */ struct TkTextLine *nextPtr; /* Next in linked list of lines with * same parent node in B-tree. NULL * means end of list. */ struct TkAnnotation *annotPtr; /* First in list of annotations for * this line. */ int numBytes; /* Number of bytes in line, including * newline but not terminating NULL. */ char bytes[4]; /* Contents of line, null-terminated. * The actual length of the array will * be as large as needed to hold the * line. THIS MUST BE THE LAST FIELD * OF THE STRUCT. */ } TkTextLine; /* * The structures below are used to describe annotations to the text * (such as marks and embedded windows). Annotations are placed at * a given place in the text and then float to keep their position * as text is inserted and deleted. Each actual annotation * contains a standard set of fields, plus a type-specific set of * fields. The types are as follows: * * TK_ANNOT_TOGGLE - Marks the beginning or end of a range of * characters that have a given tag. * TK_ANNOT_MARK - Holds information about a given "mark" (see * user doc. for information on marks). * TK_ANNOT_WINDOW - Holds information on a window embedded in the * text. Not implemented yet. */ typedef enum {TK_ANNOT_TOGGLE, TK_ANNOT_MARK, TK_ANNOT_WINDOW} TkAnnotType; typedef struct TkAnnotation { TkAnnotType type; /* Type of annotation. */ TkTextLine *linePtr; /* Pointer to line structure * containing this annotation. */ int ch; /* Index of character that annotation * is attached to (annotation is * considered to be just before this * character). */ struct TkAnnotation *nextPtr; /* Next in list of annotations for * same line of text, or NULL if * end of list. */ union { /* Type-specific information. */ struct TkTextTag *tagPtr; /* Type == TK_ANNOT_TOGGLE. */ Tcl_HashEntry *hPtr; /* Type == TK_ANNOT_MARK. */ } info; } TkAnnotation; /* * One data structure of the following type is used for each tag that * is currently being used in a text widget. These structures are kept * in textPtr->tagTable and referred to in other structures, like * TkTagToggles. */ typedef struct TkTextTag { char *name; /* Name of this tag. This field is actually * a pointer to the key from the entry in * textPtr->tagTable, so it needn't be freed * explicitly. */ int priority; /* Priority of this tag within widget. 0 * means lowest priority. Exactly one tag * has each integer value between 0 and * numTags-1. */ /* * Information for displaying text with this tag. The information * belows acts as an override on information specified by lower-priority * tags. If no value is specified, then the next-lower-priority tag * on the text determins the value. The text widget itself provides * defaults if no tag specifies an override. */ Tk_3DBorder border; /* Used for drawing background. NULL means * no value specified here. */ int borderWidth; /* Width of 3-D border for background. */ int relief; /* 3-D relief for background. */ Pixmap bgStipple; /* Stipple bitmap for background. None * means no value specified here. */ XColor *fgColor; /* Foreground color for text. NULL means * no value specified here. */ XFontStruct *fontPtr; /* Font for displaying text. NULL means * no value specified here. */ Pixmap fgStipple; /* Stipple bitmap for text and other * foreground stuff. None means no value * specified here.*/ int underline; /* Non-zero means draw underline underneath * text. */ } TkTextTag; /* * The macro below determines whether or not a particular tag affects * the way information is displayed on the screen. It's used, for * example, to determine when to redisplay in response to tag changes. */ #define TK_TAG_AFFECTS_DISPLAY(tagPtr) \ (((tagPtr)->border != NULL) || ((tagPtr)->bgStipple != None) \ || ((tagPtr)->fgColor != NULL) || ((tagPtr)->fontPtr != NULL) \ || ((tagPtr)->fgStipple != None) || ((tagPtr)->underline)) /* * The data structure below is used for searching a B-tree for transitions * on a single tag (or for all tag transitions). No code outside of * tkTextBTree.c should ever modify any of the fields in these structures, * but it's OK to use them for read-only information. */ typedef struct TkTextSearch { TkTextBTree tree; /* Tree being searched. */ int line1, ch1; /* Position of last tag returned * by TkBTreeNextTag. */ int line2, ch2; /* Stop search after all tags at this * character position have been * processed. */ TkTextTag *tagPtr; /* Tag to search for (or tag found, if * allTags is non-zero). */ int allTags; /* Non-zero means ignore tag check: * search for transitions on all * tags. */ TkTextLine *linePtr; /* Line currently being searched. NULL * means search is over. */ TkAnnotation *annotPtr; /* Pointer to next annotation to * consider. NULL means no annotations * left in current line; must go on * to next line. */ } TkTextSearch; /* * A data structure of the following type is kept for each text widget that * currently exists for this process: */ typedef struct TkText { Tk_Window tkwin; /* Window that embodies the text. NULL * means that the window has been destroyed * but the data structures haven't yet been * cleaned up.*/ Display *display; /* Display for widget. Needed, among other * things, to allow resources to be freed * even after tkwin has gone away. */ Tcl_Interp *interp; /* Interpreter associated with widget. Used * to delete widget command. */ TkTextBTree tree; /* B-tree representation of text and tags for * widget. */ Tcl_HashTable tagTable; /* Hash table that maps from tag names to * pointers to TkTextTag structures. */ int numTags; /* Number of tags currently defined for * widget; needed to keep track of * priorities. */ Tcl_HashTable markTable; /* Hash table that maps from mark names to * pointer to TkAnnotation structures of * type TK_ANNOT_MARK. */ Tk_Uid state; /* Normal or disabled. Text is read-only * when disabled. */ /* * Default information for displaying (may be overridden by tags * applied to ranges of characters). */ Tk_3DBorder border; /* Structure used to draw 3-D border and * default background. */ int borderWidth; /* Width of 3-D border to draw around entire * widget. */ int padX, padY; /* Padding between text and window border. */ int relief; /* 3-d effect for border around entire * widget: TK_RELIEF_RAISED etc. */ Cursor cursor; /* Current cursor for window, or None. */ XColor *fgColor; /* Default foreground color for text. */ XFontStruct *fontPtr; /* Default font for displaying text. */ /* * Additional information used for displaying: */ Tk_Uid wrapMode; /* How to handle wrap-around. Must be * tkTextCharUid, tkTextNoneUid, or * tkTextWordUid. */ int width, height; /* Desired dimensions for window, measured * in characters. */ int setGrid; /* Non-zero means pass gridding information * to window manager. */ int prevWidth, prevHeight; /* Last known dimensions of window; used to * detect changes in size. */ TkTextLine *topLinePtr; /* Text line that is supposed to be displayed * at top of the window: set only by * tkTextDisp.c. */ struct DInfo *dInfoPtr; /* Additional information maintained by * tkTextDisp.c. */ /* * Information related to selection. */ TkTextTag *selTagPtr; /* Pointer to "sel" tag. Used to tell when * a new selection has been made. */ Tk_3DBorder selBorder; /* Border and background for selected * characters. This is a copy of information * in *cursorTagPtr, so it shouldn't be * explicitly freed. */ int selBorderWidth; /* Width of border around selection. */ XColor *selFgColorPtr; /* Foreground color for selected text. * This is a copy of information in * *cursorTagPtr, so it shouldn't be * explicitly freed. */ int exportSelection; /* Non-zero means tie "sel" tag to X * selection. */ int selLine, selCh; /* Used during multi-pass selection retrievals. * These identify the next character to be * returned from the selection. */ int selOffset; /* Offset in selection corresponding to * selLine and selCh. -1 means neither * this information nor selLine or selCh * is of any use. */ /* * Information related to insertion cursor: */ TkAnnotation *insertAnnotPtr; /* Always points to annotation for "insert" * mark. */ Tk_3DBorder insertBorder; /* Used to draw vertical bar for insertion * cursor. */ int insertWidth; /* Total width of insert cursor. */ int insertBorderWidth; /* Width of 3-D border around insert cursor. */ int insertOnTime; /* Number of milliseconds cursor should spend * in "on" state for each blink. */ int insertOffTime; /* Number of milliseconds cursor should spend * in "off" state for each blink. */ Tk_TimerToken insertBlinkHandler; /* Timer handler used to blink cursor on and * off. */ /* * Information used for event bindings associated with tags: */ Tk_BindingTable bindingTable; /* Table of all bindings currently defined * for this widget. NULL means that no * bindings exist, so the table hasn't been * created. Each "object" used for this * table is the address of a tag. */ TkAnnotation *currentAnnotPtr; /* Pointer to annotation for "current" mark, * or NULL if none. */ XEvent pickEvent; /* The event from which the current character * was chosen. Must be saved so that we * can repick after insertions and deletions. */ /* * Miscellaneous additional information: */ char *yScrollCmd; /* Prefix of command to issue to update * vertical scrollbar when view changes. */ int scanMarkLine; /* Line that was at the top of the window * when the scan started. */ int scanMarkY; /* Y-position of mouse at time scan started. */ int flags; /* Miscellaneous flags; see below for * definitions. */ } TkText; /* * Flag values for TkText records: * * GOT_SELECTION: Non-zero means we've already claimed the * selection. * INSERT_ON: Non-zero means insertion cursor should be * displayed on screen. * GOT_FOCUS: Non-zero means this window has the input * focus. * BUTTON_DOWN: 1 means that a mouse button is currently * down; this is used to implement grabs * for the duration of button presses. * IN_CURRENT: 1 means that an EnterNotify event has been * delivered to the current character with * no matching LeaveNotify event yet. * UPDATE_SCROLLBARS: Non-zero means scrollbar(s) should be updated * during next redisplay operation. */ #define GOT_SELECTION 1 #define INSERT_ON 2 #define GOT_FOCUS 4 #define BUTTON_DOWN 8 #define IN_CURRENT 0x10 #define UPDATE_SCROLLBARS 0x20 /* * The constant below is used to specify a line when what is really * wanted is the entire text. For now, just use a very big number. */ #define TK_END_OF_TEXT 1000000 /* * Declarations for variables shared among the text-related files: */ extern int tkBTreeDebug; extern Tk_Uid tkTextCharUid; extern Tk_Uid tkTextDisabledUid; extern Tk_Uid tkTextNoneUid; extern Tk_Uid tkTextNormalUid; extern Tk_Uid tkTextWordUid; /* * Declarations for procedures that are used by the text-related files * but shouldn't be used anywhere else in Tk (or by Tk clients): */ extern void TkBTreeAddAnnotation _ANSI_ARGS_(( TkAnnotation *annotPtr)); extern int TkBTreeCharTagged _ANSI_ARGS_((TkTextLine *linePtr, int index, TkTextTag *tagPtr)); extern void TkBTreeCheck _ANSI_ARGS_((TkTextBTree tree)); extern TkTextBTree TkBTreeCreate _ANSI_ARGS_((void)); extern void TkBTreeDestroy _ANSI_ARGS_((TkTextBTree tree)); extern void TkBTreeDeleteChars _ANSI_ARGS_((TkTextBTree tree, TkTextLine *line1Ptr, int ch1, TkTextLine *line2Ptr, int ch2)); extern TkTextLine * TkBTreeFindLine _ANSI_ARGS_((TkTextBTree tree, int line)); extern TkTextTag ** TkBTreeGetTags _ANSI_ARGS_((TkTextBTree tree, TkTextLine *linePtr, int ch, int *numTagsPtr)); extern void TkBTreeInsertChars _ANSI_ARGS_((TkTextBTree tree, TkTextLine *linePtr, int ch, char *string)); extern int TkBTreeLineIndex _ANSI_ARGS_((TkTextLine *linePtr)); extern TkTextLine * TkBTreeNextLine _ANSI_ARGS_((TkTextLine *linePtr)); extern int TkBTreeNextTag _ANSI_ARGS_((TkTextSearch *searchPtr)); extern int TkBTreeNumLines _ANSI_ARGS_((TkTextBTree tree)); extern void TkBTreeRemoveAnnotation _ANSI_ARGS_(( TkAnnotation *annotPtr)); extern void TkBTreeStartSearch _ANSI_ARGS_((TkTextBTree tree, int line1, int ch1, int line2, int ch2, TkTextTag *tagPtr, TkTextSearch *searchPtr)); extern void TkBTreeTag _ANSI_ARGS_((TkTextBTree tree, int line1, int ch1, int line2, int ch2, TkTextTag *tagPtr, int add)); extern void TkTextBindProc _ANSI_ARGS_((ClientData clientData, XEvent *eventPtr)); extern TkTextLine * TkTextCharAtLoc _ANSI_ARGS_((TkText *textPtr, int x, int y, int *chPtr)); extern void TkTextCreateDInfo _ANSI_ARGS_((TkText *textPtr)); extern TkTextTag * TkTextCreateTag _ANSI_ARGS_((TkText *textPtr, char *tagName)); extern void TkTextFreeDInfo _ANSI_ARGS_((TkText *textPtr)); extern void TkTextFreeTag _ANSI_ARGS_((TkText *textPtr, TkTextTag *tagPtr)); extern int TkTextGetIndex _ANSI_ARGS_((Tcl_Interp *interp, TkText *textPtr, char *string, int *lineIndexPtr, int *chPtr)); extern void TkTextLinesChanged _ANSI_ARGS_((TkText *textPtr, int first, int last)); extern void TkTextLostSelection _ANSI_ARGS_(( ClientData clientData)); extern void TkTextPickCurrent _ANSI_ARGS_((TkText *textPtr, XEvent *eventPtr)); extern void TkTextPrintIndex _ANSI_ARGS_((int line, int ch, char *string)); extern TkTextLine * TkTextRoundIndex _ANSI_ARGS_((TkText *textPtr, int *lineIndexPtr, int *chPtr)); extern void TkTextRedrawRegion _ANSI_ARGS_((TkText *textPtr, int x, int y, int width, int height)); extern void TkTextRedrawTag _ANSI_ARGS_((TkText *textPtr, int line1, int ch1, int line2, int ch2, TkTextTag *tagPtr, int withTag)); extern void TkTextRelayoutWindow _ANSI_ARGS_((TkText *textPtr)); extern TkAnnotation * TkTextSetMark _ANSI_ARGS_((TkText *textPtr, char *name, int line, int ch)); extern void TkTextSetView _ANSI_ARGS_((TkText *textPtr, int line, int pickPlace)); extern int TkTextTagCmd _ANSI_ARGS_((TkText *textPtr, Tcl_Interp *interp, int argc, char **argv)); extern void TkTextUnpickCurrent _ANSI_ARGS_((TkText *textPtr)); #endif /* _TKTEXT */