|
|
1.1 ! root 1: /* ! 2: * tkText.h -- ! 3: * ! 4: * Declarations shared among the files that implement text ! 5: * widgets. ! 6: * ! 7: * Copyright 1992 Regents of the University of California. ! 8: * Permission to use, copy, modify, and distribute this ! 9: * software and its documentation for any purpose and without ! 10: * fee is hereby granted, provided that the above copyright ! 11: * notice appear in all copies. The University of California ! 12: * makes no representations about the suitability of this ! 13: * software for any purpose. It is provided "as is" without ! 14: * express or implied warranty. ! 15: * ! 16: * $Header: /user6/ouster/wish/RCS/tkText.h,v 1.13 92/07/31 13:43:26 ouster Exp $ SPRITE (Berkeley) ! 17: */ ! 18: ! 19: #ifndef _TKTEXT ! 20: #define _TKTEXT ! 21: ! 22: #ifndef _TK ! 23: #include "tk.h" ! 24: #endif ! 25: ! 26: /* ! 27: * Opaque types for structures whose guts are only needed by a single ! 28: * file: ! 29: */ ! 30: ! 31: typedef struct TkTextBTree *TkTextBTree; ! 32: ! 33: /* ! 34: * The data structure below defines a single line of text (from newline ! 35: * to newline, not necessarily what appears on one line of the screen). ! 36: */ ! 37: ! 38: typedef struct TkTextLine { ! 39: struct Node *parentPtr; /* Pointer to parent node containing ! 40: * line. */ ! 41: struct TkTextLine *nextPtr; /* Next in linked list of lines with ! 42: * same parent node in B-tree. NULL ! 43: * means end of list. */ ! 44: struct TkAnnotation *annotPtr; /* First in list of annotations for ! 45: * this line. */ ! 46: int numBytes; /* Number of bytes in line, including ! 47: * newline but not terminating NULL. */ ! 48: char bytes[4]; /* Contents of line, null-terminated. ! 49: * The actual length of the array will ! 50: * be as large as needed to hold the ! 51: * line. THIS MUST BE THE LAST FIELD ! 52: * OF THE STRUCT. */ ! 53: } TkTextLine; ! 54: ! 55: /* ! 56: * The structures below are used to describe annotations to the text ! 57: * (such as marks and embedded windows). Annotations are placed at ! 58: * a given place in the text and then float to keep their position ! 59: * as text is inserted and deleted. Each actual annotation ! 60: * contains a standard set of fields, plus a type-specific set of ! 61: * fields. The types are as follows: ! 62: * ! 63: * TK_ANNOT_TOGGLE - Marks the beginning or end of a range of ! 64: * characters that have a given tag. ! 65: * TK_ANNOT_MARK - Holds information about a given "mark" (see ! 66: * user doc. for information on marks). ! 67: * TK_ANNOT_WINDOW - Holds information on a window embedded in the ! 68: * text. Not implemented yet. ! 69: */ ! 70: ! 71: typedef enum {TK_ANNOT_TOGGLE, TK_ANNOT_MARK, TK_ANNOT_WINDOW} TkAnnotType; ! 72: ! 73: typedef struct TkAnnotation { ! 74: TkAnnotType type; /* Type of annotation. */ ! 75: TkTextLine *linePtr; /* Pointer to line structure ! 76: * containing this annotation. */ ! 77: int ch; /* Index of character that annotation ! 78: * is attached to (annotation is ! 79: * considered to be just before this ! 80: * character). */ ! 81: struct TkAnnotation *nextPtr; /* Next in list of annotations for ! 82: * same line of text, or NULL if ! 83: * end of list. */ ! 84: union { /* Type-specific information. */ ! 85: struct TkTextTag *tagPtr; /* Type == TK_ANNOT_TOGGLE. */ ! 86: Tcl_HashEntry *hPtr; /* Type == TK_ANNOT_MARK. */ ! 87: } info; ! 88: } TkAnnotation; ! 89: ! 90: /* ! 91: * One data structure of the following type is used for each tag that ! 92: * is currently being used in a text widget. These structures are kept ! 93: * in textPtr->tagTable and referred to in other structures, like ! 94: * TkTagToggles. ! 95: */ ! 96: ! 97: typedef struct TkTextTag { ! 98: char *name; /* Name of this tag. This field is actually ! 99: * a pointer to the key from the entry in ! 100: * textPtr->tagTable, so it needn't be freed ! 101: * explicitly. */ ! 102: int priority; /* Priority of this tag within widget. 0 ! 103: * means lowest priority. Exactly one tag ! 104: * has each integer value between 0 and ! 105: * numTags-1. */ ! 106: ! 107: /* ! 108: * Information for displaying text with this tag. The information ! 109: * belows acts as an override on information specified by lower-priority ! 110: * tags. If no value is specified, then the next-lower-priority tag ! 111: * on the text determins the value. The text widget itself provides ! 112: * defaults if no tag specifies an override. ! 113: */ ! 114: ! 115: Tk_3DBorder border; /* Used for drawing background. NULL means ! 116: * no value specified here. */ ! 117: int borderWidth; /* Width of 3-D border for background. */ ! 118: int relief; /* 3-D relief for background. */ ! 119: Pixmap bgStipple; /* Stipple bitmap for background. None ! 120: * means no value specified here. */ ! 121: XColor *fgColor; /* Foreground color for text. NULL means ! 122: * no value specified here. */ ! 123: XFontStruct *fontPtr; /* Font for displaying text. NULL means ! 124: * no value specified here. */ ! 125: Pixmap fgStipple; /* Stipple bitmap for text and other ! 126: * foreground stuff. None means no value ! 127: * specified here.*/ ! 128: int underline; /* Non-zero means draw underline underneath ! 129: * text. */ ! 130: } TkTextTag; ! 131: ! 132: /* ! 133: * The macro below determines whether or not a particular tag affects ! 134: * the way information is displayed on the screen. It's used, for ! 135: * example, to determine when to redisplay in response to tag changes. ! 136: */ ! 137: ! 138: #define TK_TAG_AFFECTS_DISPLAY(tagPtr) \ ! 139: (((tagPtr)->border != NULL) || ((tagPtr)->bgStipple != None) \ ! 140: || ((tagPtr)->fgColor != NULL) || ((tagPtr)->fontPtr != NULL) \ ! 141: || ((tagPtr)->fgStipple != None) || ((tagPtr)->underline)) ! 142: ! 143: /* ! 144: * The data structure below is used for searching a B-tree for transitions ! 145: * on a single tag (or for all tag transitions). No code outside of ! 146: * tkTextBTree.c should ever modify any of the fields in these structures, ! 147: * but it's OK to use them for read-only information. ! 148: */ ! 149: ! 150: typedef struct TkTextSearch { ! 151: TkTextBTree tree; /* Tree being searched. */ ! 152: int line1, ch1; /* Position of last tag returned ! 153: * by TkBTreeNextTag. */ ! 154: int line2, ch2; /* Stop search after all tags at this ! 155: * character position have been ! 156: * processed. */ ! 157: TkTextTag *tagPtr; /* Tag to search for (or tag found, if ! 158: * allTags is non-zero). */ ! 159: int allTags; /* Non-zero means ignore tag check: ! 160: * search for transitions on all ! 161: * tags. */ ! 162: TkTextLine *linePtr; /* Line currently being searched. NULL ! 163: * means search is over. */ ! 164: TkAnnotation *annotPtr; /* Pointer to next annotation to ! 165: * consider. NULL means no annotations ! 166: * left in current line; must go on ! 167: * to next line. */ ! 168: } TkTextSearch; ! 169: ! 170: /* ! 171: * A data structure of the following type is kept for each text widget that ! 172: * currently exists for this process: ! 173: */ ! 174: ! 175: typedef struct TkText { ! 176: Tk_Window tkwin; /* Window that embodies the text. NULL ! 177: * means that the window has been destroyed ! 178: * but the data structures haven't yet been ! 179: * cleaned up.*/ ! 180: Tcl_Interp *interp; /* Interpreter associated with widget. Used ! 181: * to delete widget command. */ ! 182: TkTextBTree tree; /* B-tree representation of text and tags for ! 183: * widget. */ ! 184: Tcl_HashTable tagTable; /* Hash table that maps from tag names to ! 185: * pointers to TkTextTag structures. */ ! 186: int numTags; /* Number of tags currently defined for ! 187: * widget; needed to keep track of ! 188: * priorities. */ ! 189: Tcl_HashTable markTable; /* Hash table that maps from mark names to ! 190: * pointer to TkAnnotation structures of ! 191: * type TK_ANNOT_MARK. */ ! 192: Tk_Uid state; /* Normal or disabled. Text is read-only ! 193: * when disabled. */ ! 194: ! 195: /* ! 196: * Default information for displaying (may be overridden by tags ! 197: * applied to ranges of characters). ! 198: */ ! 199: ! 200: Tk_3DBorder border; /* Structure used to draw 3-D border and ! 201: * default background. */ ! 202: int borderWidth; /* Width of 3-D border to draw around entire ! 203: * widget. */ ! 204: int padX, padY; /* Padding between text and window border. */ ! 205: int relief; /* 3-d effect for border around entire ! 206: * widget: TK_RELIEF_RAISED etc. */ ! 207: Cursor cursor; /* Current cursor for window, or None. */ ! 208: XColor *fgColor; /* Default foreground color for text. */ ! 209: XFontStruct *fontPtr; /* Default font for displaying text. */ ! 210: ! 211: /* ! 212: * Additional information used for displaying: ! 213: */ ! 214: ! 215: Tk_Uid wrapMode; /* How to handle wrap-around. Must be ! 216: * tkTextCharUid, tkTextNoneUid, or ! 217: * tkTextWordUid. */ ! 218: int width, height; /* Desired dimensions for window, measured ! 219: * in characters. */ ! 220: int setGrid; /* Non-zero means pass gridding information ! 221: * to window manager. */ ! 222: int prevWidth, prevHeight; /* Last known dimensions of window; used to ! 223: * detect changes in size. */ ! 224: TkTextLine *topLinePtr; /* Text line that is supposed to be displayed ! 225: * at top of the window: set only by ! 226: * tkTextDisp.c. */ ! 227: struct DInfo *dInfoPtr; /* Additional information maintained by ! 228: * tkTextDisp.c. */ ! 229: Tk_TimerToken updateTimerToken; /* Added by Don to optimize rapid ! 230: * updates. */ ! 231: ! 232: /* ! 233: * Information related to selection. ! 234: */ ! 235: ! 236: TkTextTag *selTagPtr; /* Pointer to "sel" tag. Used to tell when ! 237: * a new selection has been made. */ ! 238: Tk_3DBorder selBorder; /* Border and background for selected ! 239: * characters. This is a copy of information ! 240: * in *cursorTagPtr, so it shouldn't be ! 241: * explicitly freed. */ ! 242: int selBorderWidth; /* Width of border around selection. */ ! 243: XColor *selFgColorPtr; /* Foreground color for selected text. ! 244: * This is a copy of information in ! 245: * *cursorTagPtr, so it shouldn't be ! 246: * explicitly freed. */ ! 247: int exportSelection; /* Non-zero means tie "sel" tag to X ! 248: * selection. */ ! 249: int selLine, selCh; /* Used during multi-pass selection retrievals. ! 250: * These identify the next character to be ! 251: * returned from the selection. */ ! 252: int selOffset; /* Offset in selection corresponding to ! 253: * selLine and selCh. -1 means neither ! 254: * this information nor selLine or selCh ! 255: * is of any use. */ ! 256: ! 257: /* ! 258: * Information related to insertion cursor: ! 259: */ ! 260: ! 261: TkAnnotation *insertAnnotPtr; ! 262: /* Always points to annotation for "insert" ! 263: * mark. */ ! 264: Tk_3DBorder insertBorder; /* Used to draw vertical bar for insertion ! 265: * cursor. */ ! 266: int insertWidth; /* Total width of insert cursor. */ ! 267: int insertBorderWidth; /* Width of 3-D border around insert cursor. */ ! 268: int insertOnTime; /* Number of milliseconds cursor should spend ! 269: * in "on" state for each blink. */ ! 270: int insertOffTime; /* Number of milliseconds cursor should spend ! 271: * in "off" state for each blink. */ ! 272: Tk_TimerToken insertBlinkHandler; ! 273: /* Timer handler used to blink cursor on and ! 274: * off. */ ! 275: ! 276: /* ! 277: * Information used for event bindings associated with tags: ! 278: */ ! 279: ! 280: Tk_BindingTable bindingTable; ! 281: /* Table of all bindings currently defined ! 282: * for this widget. NULL means that no ! 283: * bindings exist, so the table hasn't been ! 284: * created. Each "object" used for this ! 285: * table is the address of a tag. */ ! 286: TkAnnotation *currentAnnotPtr; ! 287: /* Pointer to annotation for "current" mark, ! 288: * or NULL if none. */ ! 289: XEvent pickEvent; /* The event from which the current character ! 290: * was chosen. Must be saved so that we ! 291: * can repick after insertions and deletions. */ ! 292: ! 293: /* ! 294: * Miscellaneous additional information: ! 295: */ ! 296: ! 297: char *yScrollCmd; /* Prefix of command to issue to update ! 298: * vertical scrollbar when view changes. */ ! 299: int scanMarkLine; /* Line that was at the top of the window ! 300: * when the scan started. */ ! 301: int scanMarkY; /* Y-position of mouse at time scan started. */ ! 302: int flags; /* Miscellaneous flags; see below for ! 303: * definitions. */ ! 304: } TkText; ! 305: ! 306: /* ! 307: * Flag values for TkText records: ! 308: * ! 309: * GOT_SELECTION: Non-zero means we've already claimed the ! 310: * selection. ! 311: * INSERT_ON: Non-zero means insertion cursor should be ! 312: * displayed on screen. ! 313: * GOT_FOCUS: Non-zero means this window has the input ! 314: * focus. ! 315: * BUTTON_DOWN: 1 means that a mouse button is currently ! 316: * down; this is used to implement grabs ! 317: * for the duration of button presses. ! 318: * IN_CURRENT: 1 means that an EnterNotify event has been ! 319: * delivered to the current character with ! 320: * no matching LeaveNotify event yet. ! 321: */ ! 322: ! 323: #define GOT_SELECTION 1 ! 324: #define INSERT_ON 2 ! 325: #define GOT_FOCUS 4 ! 326: #define BUTTON_DOWN 8 ! 327: #define IN_CURRENT 0x10 ! 328: ! 329: /* ! 330: * The constant below is used to specify a line when what is really ! 331: * wanted is the entire text. For now, just use a very big number. ! 332: */ ! 333: ! 334: #define TK_END_OF_TEXT 1000000 ! 335: ! 336: /* ! 337: * Declarations for variables shared among the text-related files: ! 338: */ ! 339: ! 340: extern int tkBTreeDebug; ! 341: extern Tk_Uid tkTextCharUid; ! 342: extern Tk_Uid tkTextDisabledUid; ! 343: extern Tk_Uid tkTextNoneUid; ! 344: extern Tk_Uid tkTextNormalUid; ! 345: extern Tk_Uid tkTextWordUid; ! 346: ! 347: /* ! 348: * Declarations for procedures that are used by the text-related files ! 349: * but shouldn't be used anywhere else in Tk (or by Tk clients): ! 350: */ ! 351: ! 352: extern void TkBTreeAddAnnotation _ANSI_ARGS_(( ! 353: TkAnnotation *annotPtr)); ! 354: extern int TkBTreeCharTagged _ANSI_ARGS_((TkTextLine *linePtr, ! 355: int index, TkTextTag *tagPtr)); ! 356: extern void TkBTreeCheck _ANSI_ARGS_((TkTextBTree tree)); ! 357: extern TkTextBTree TkBTreeCreate _ANSI_ARGS_((void)); ! 358: extern void TkBTreeDestroy _ANSI_ARGS_((TkTextBTree tree)); ! 359: extern void TkBTreeDeleteChars _ANSI_ARGS_((TkTextBTree tree, ! 360: TkTextLine *line1Ptr, int ch1, ! 361: TkTextLine *line2Ptr, int ch2)); ! 362: extern TkTextLine * TkBTreeFindLine _ANSI_ARGS_((TkTextBTree tree, ! 363: int line)); ! 364: extern TkTextTag ** TkBTreeGetTags _ANSI_ARGS_((TkTextBTree tree, ! 365: TkTextLine *linePtr, int ch, int *numTagsPtr)); ! 366: extern void TkBTreeInsertChars _ANSI_ARGS_((TkTextBTree tree, ! 367: TkTextLine *linePtr, int ch, char *string)); ! 368: extern int TkBTreeLineIndex _ANSI_ARGS_((TkTextLine *linePtr)); ! 369: extern TkTextLine * TkBTreeNextLine _ANSI_ARGS_((TkTextLine *linePtr)); ! 370: extern int TkBTreeNextTag _ANSI_ARGS_((TkTextSearch *searchPtr)); ! 371: extern int TkBTreeNumLines _ANSI_ARGS_((TkTextBTree tree)); ! 372: extern void TkBTreeRemoveAnnotation _ANSI_ARGS_(( ! 373: TkAnnotation *annotPtr)); ! 374: extern void TkBTreeStartSearch _ANSI_ARGS_((TkTextBTree tree, ! 375: int line1, int ch1, int line2, int ch2, ! 376: TkTextTag *tagPtr, TkTextSearch *searchPtr)); ! 377: extern void TkBTreeTag _ANSI_ARGS_((TkTextBTree tree, int line1, ! 378: int ch1, int line2, int ch2, TkTextTag *tagPtr, ! 379: int add)); ! 380: extern void TkTextBindProc _ANSI_ARGS_((ClientData clientData, ! 381: XEvent *eventPtr)); ! 382: extern TkTextLine * TkTextCharAtLoc _ANSI_ARGS_((TkText *textPtr, ! 383: int x, int y, int *chPtr)); ! 384: extern void TkTextCreateDInfo _ANSI_ARGS_((TkText *textPtr)); ! 385: extern TkTextTag * TkTextCreateTag _ANSI_ARGS_((TkText *textPtr, ! 386: char *tagName)); ! 387: extern void TkTextFreeDInfo _ANSI_ARGS_((TkText *textPtr)); ! 388: extern void TkTextFreeTag _ANSI_ARGS_((TkTextTag *tagPtr)); ! 389: extern int TkTextGetIndex _ANSI_ARGS_((Tcl_Interp *interp, ! 390: TkText *textPtr, char *string, int *lineIndexPtr, ! 391: int *chPtr)); ! 392: extern void TkTextLinesChanged _ANSI_ARGS_((TkText *textPtr, ! 393: int first, int last)); ! 394: extern void TkTextLostSelection _ANSI_ARGS_(( ! 395: ClientData clientData)); ! 396: extern void TkTextPickCurrent _ANSI_ARGS_((TkText *textPtr, ! 397: XEvent *eventPtr)); ! 398: extern void TkTextPrintIndex _ANSI_ARGS_((int line, int ch, ! 399: char *string)); ! 400: extern TkTextLine * TkTextRoundIndex _ANSI_ARGS_((TkText *textPtr, ! 401: int *lineIndexPtr, int *chPtr)); ! 402: extern void TkTextRedrawRegion _ANSI_ARGS_((TkText *textPtr, ! 403: int x, int y, int width, int height)); ! 404: extern void TkTextRedrawTag _ANSI_ARGS_((TkText *textPtr, ! 405: int line1, int ch1, int line2, int ch2, ! 406: TkTextTag *tagPtr, int withTag)); ! 407: extern void TkTextRelayoutWindow _ANSI_ARGS_((TkText *textPtr)); ! 408: extern TkAnnotation * TkTextSetMark _ANSI_ARGS_((TkText *textPtr, char *name, ! 409: int line, int ch)); ! 410: extern void TkTextSetView _ANSI_ARGS_((TkText *textPtr, ! 411: int line, int pickPlace)); ! 412: extern int TkTextTagCmd _ANSI_ARGS_((TkText *textPtr, ! 413: Tcl_Interp *interp, int argc, char **argv)); ! 414: extern void TkTextUnpickCurrent _ANSI_ARGS_((TkText *textPtr)); ! 415: ! 416: #endif /* _TKTEXT */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.