AsciiText.c revision 994689c1
1/* 2 3Copyright 1987, 1988, 1994, 1998 The Open Group 4 5Permission to use, copy, modify, distribute, and sell this software and its 6documentation for any purpose is hereby granted without fee, provided that 7the above copyright notice appear in all copies and that both that 8copyright notice and this permission notice appear in supporting 9documentation. 10 11The above copyright notice and this permission notice shall be included in 12all copies or substantial portions of the Software. 13 14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 18AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 19CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 21Except as contained in this notice, the name of The Open Group shall not be 22used in advertising or otherwise to promote the sale, use or other dealings 23in this Software without prior written authorization from The Open Group. 24 25 26Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts. 27 28 All Rights Reserved 29 30Permission to use, copy, modify, and distribute this software and its 31documentation for any purpose and without fee is hereby granted, 32provided that the above copyright notice appear in all copies and that 33both that copyright notice and this permission notice appear in 34supporting documentation, and that the name of Digital not be 35used in advertising or publicity pertaining to distribution of the 36software without specific, written prior permission. 37 38DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 39ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 40DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 41ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 42WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 43ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 44SOFTWARE. 45 46*/ 47 48/* 49 * AsciiText.c - Source code for AsciiText Widget 50 * 51 * This Widget is intended to be used as a simple front end to the 52 * text widget with an ascii source and ascii sink attached to it 53 * 54 * Date: June 29, 1989 55 * 56 * By: Chris D. Peterson 57 * MIT X Consortium 58 * kit@expo.lcs.mit.edu 59 */ 60 61#ifdef HAVE_CONFIG_H 62#include <config.h> 63#endif 64#include <stdio.h> 65#include <X11/IntrinsicP.h> 66#include <X11/StringDefs.h> 67#include <X11/Xaw/AsciiTextP.h> 68#include <X11/Xaw/AsciiSrcP.h> 69#include <X11/Xaw/AsciiSink.h> 70#include <X11/Xaw/Cardinals.h> 71#include <X11/Xaw/MultiSinkP.h> 72#include <X11/Xaw/MultiSrc.h> 73#include <X11/Xaw/XawImP.h> 74#include <X11/Xaw/XawInit.h> 75#include "Private.h" 76 77#define TAB_COUNT 32 78 79/* 80 * Class Methods 81 */ 82static void XawAsciiInitialize(Widget, Widget, ArgList, Cardinal*); 83static void XawAsciiDestroy(Widget); 84 85/* 86 * From TextSrc.c 87 */ 88void _XawSourceAddText(Widget, Widget); 89void _XawSourceRemoveText(Widget, Widget, Bool); 90 91#define Superclass (&textClassRec) 92AsciiTextClassRec asciiTextClassRec = { 93 /* core */ 94 { 95 (WidgetClass)Superclass, /* superclass */ 96 "Text", /* class_name */ 97 sizeof(AsciiRec), /* widget_size */ 98 XawInitializeWidgetSet, /* class_initialize */ 99 NULL, /* class_part_init */ 100 False, /* class_inited */ 101 XawAsciiInitialize, /* initialize */ 102 NULL, /* initialize_hook */ 103 XtInheritRealize, /* realize */ 104 NULL, /* actions */ 105 0, /* num_actions */ 106 NULL, /* resources */ 107 0, /* num_resource */ 108 NULLQUARK, /* xrm_class */ 109 True, /* compress_motion */ 110 XtExposeGraphicsExpose | /* compress_exposure */ 111 XtExposeNoExpose, 112 True, /* compress_enterleave */ 113 False, /* visible_interest */ 114 XawAsciiDestroy, /* destroy */ 115 XtInheritResize, /* resize */ 116 XtInheritExpose, /* expose */ 117 NULL, /* set_values */ 118 NULL, /* set_values_hook */ 119 XtInheritSetValuesAlmost, /* set_values_almost */ 120 NULL, /* get_values_hook */ 121 XtInheritAcceptFocus, /* accept_focus */ 122 XtVersion, /* version */ 123 NULL, /* callback_private */ 124 XtInheritTranslations, /* tm_table */ 125 XtInheritQueryGeometry, /* query_geometry */ 126 }, 127 /* simple */ 128 { 129 XtInheritChangeSensitive, /* change_sensitive */ 130 }, 131 /* text */ 132 { 133 NULL, /* extension */ 134 }, 135 /* ascii */ 136 { 137 NULL, /* extension */ 138 }, 139}; 140 141WidgetClass asciiTextWidgetClass = (WidgetClass)&asciiTextClassRec; 142 143#ifdef ASCII_STRING 144AsciiStringClassRec asciiStringClassRec = { 145 /* core */ 146 { 147 (WidgetClass)&asciiTextClassRec, /* superclass */ 148 "Text", /* class_name */ 149 sizeof(AsciiStringRec), /* widget_size */ 150 NULL, /* class_initialize */ 151 NULL, /* class_part_init */ 152 False, /* class_inited */ 153 NULL, /* initialize */ 154 NULL, /* initialize_hook */ 155 XtInheritRealize, /* realize */ 156 NULL, /* actions */ 157 0, /* num_actions */ 158 NULL, /* resources */ 159 0, /* num_resource */ 160 NULLQUARK, /* xrm_class */ 161 True, /* compress_motion */ 162 XtExposeGraphicsExpose | /* compress_exposure */ 163 XtExposeNoExpose, 164 True, /* compress_enterleave */ 165 False, /* visible_interest */ 166 NULL, /* destroy */ 167 XtInheritResize, /* resize */ 168 XtInheritExpose, /* expose */ 169 NULL, /* set_values */ 170 NULL, /* set_values_hook */ 171 XtInheritSetValuesAlmost, /* set_values_almost */ 172 NULL, /* get_values_hook */ 173 XtInheritAcceptFocus, /* accept_focus */ 174 XtVersion, /* version */ 175 NULL, /* callback_private */ 176 XtInheritTranslations, /* tm_table */ 177 XtInheritQueryGeometry, /* query_geometry */ 178 }, 179 /* simple */ 180 { 181 XtInheritChangeSensitive, /* change_sensitive */ 182 }, 183 /* text */ 184 { 185 NULL, /* extension */ 186 }, 187 /* ascii */ 188 { 189 NULL, /* extension */ 190 }, 191 /* string */ 192 { 193 NULL, /* extension */ 194 }, 195}; 196 197WidgetClass asciiStringWidgetClass = (WidgetClass)&asciiStringClassRec; 198#endif /* ASCII_STRING */ 199 200#ifdef ASCII_DISK 201AsciiDiskClassRec asciiDiskClassRec = { 202 /* core */ 203 { 204 (WidgetClass)&asciiTextClassRec, /* superclass */ 205 "Text", /* class_name */ 206 sizeof(AsciiDiskRec), /* widget_size */ 207 NULL, /* class_initialize */ 208 NULL, /* class_part_init */ 209 False, /* class_inited */ 210 NULL, /* initialize */ 211 NULL, /* initialize_hook */ 212 XtInheritRealize, /* realize */ 213 NULL, /* actions */ 214 0, /* num_actions */ 215 NULL, /* resources */ 216 0, /* num_resource */ 217 NULLQUARK, /* xrm_class */ 218 True, /* compress_motion */ 219 True, /* compress_exposure */ 220 XtExposeGraphicsExpose | /* compress_enterleave */ 221 XtExposeNoExpose, 222 False, /* visible_interest */ 223 NULL, /* destroy */ 224 XtInheritResize, /* resize */ 225 XtInheritExpose, /* expose */ 226 NULL, /* set_values */ 227 NULL, /* set_values_hook */ 228 XtInheritSetValuesAlmost, /* set_values_almost */ 229 NULL, /* get_values_hook */ 230 XtInheritAcceptFocus, /* accept_focus */ 231 XtVersion, /* version */ 232 NULL, /* callback_private */ 233 XtInheritTranslations, /* tm_table */ 234 XtInheritQueryGeometry, /* query_geometry */ 235 }, 236 /* simple */ 237 { 238 XtInheritChangeSensitive, /* change_sensitive */ 239 }, 240 /* text */ 241 { 242 NULL, /* extension */ 243 }, 244 /* ascii */ 245 { 246 NULL, /* extension */ 247 }, 248 /* disk */ 249 { 250 NULL, /* extension */ 251 }, 252}; 253 254WidgetClass asciiDiskWidgetClass = (WidgetClass)&asciiDiskClassRec; 255#endif /* ASCII_DISK */ 256 257/* 258 * Implementation 259 */ 260static void 261XawAsciiInitialize(Widget request, Widget cnew, 262 ArgList args, Cardinal *num_args) 263{ 264 AsciiWidget w = (AsciiWidget)cnew; 265 int i; 266 int tabs[TAB_COUNT], tab; 267 268 MultiSinkObject sink; 269 270 /* superclass Initialize can't set the following, 271 * as it didn't know the source or sink when it was called 272 */ 273 if (XtHeight(request) == DEFAULT_TEXT_HEIGHT) 274 XtHeight(cnew) = DEFAULT_TEXT_HEIGHT; 275 276 /* This is the main change for internationalization */ 277 if (w->simple.international == True) { /* The multi* are international */ 278 if (w->text.sink == NULL) 279 w->text.sink = XtCreateWidget("textSink", multiSinkObjectClass, 280 cnew, args, *num_args); 281 else if (!XtIsSubclass(w->text.sink, multiSinkObjectClass)) 282 XtError("Sink object is not a subclass of multiSink"); 283 284 if (w->text.source == NULL) 285 w->text.source = XtCreateWidget("textSource", multiSrcObjectClass, 286 cnew, args, *num_args); 287 else if (!XtIsSubclass(w->text.source, multiSrcObjectClass)) 288 XtError("Source object is not a subclass of multiSrc"); 289#ifndef OLDXAW 290 else 291 _XawSourceAddText(w->text.source, cnew); 292#endif 293 } 294 else { 295 if (w->text.sink == NULL) 296 w->text.sink = XtCreateWidget("textSink", asciiSinkObjectClass, 297 cnew, args, *num_args); 298 else if (!XtIsSubclass(w->text.source, asciiSinkObjectClass)) 299 XtError("Sink object is not a subclass of asciiSink"); 300 301 if (w->text.source == NULL) 302 w->text.source = XtCreateWidget("textSource", asciiSrcObjectClass, 303 cnew, args, *num_args); 304 else if (!XtIsSubclass(w->text.source, asciiSrcObjectClass)) 305 XtError("Source object is not a subclass of asciiSrc"); 306#ifndef OLDXAW 307 else 308 _XawSourceAddText(w->text.source, cnew); 309#endif 310 } 311 312 if (XtHeight(w) == DEFAULT_TEXT_HEIGHT) 313 XtHeight(w) = VMargins(w) + XawTextSinkMaxHeight(w->text.sink, 1); 314 315 for (i = 0, tab = 0; i < TAB_COUNT; i++) 316 tabs[i] = (tab += 8); 317 318 XawTextSinkSetTabs(w->text.sink, TAB_COUNT, tabs); 319 320 XawTextDisableRedisplay(cnew); 321 XawTextEnableRedisplay(cnew); 322 323 _XawImRegister(cnew); 324 325 /* If we are using a MultiSink we need to tell the input method stuff */ 326 if (w->simple.international == True) { 327 Arg list[4]; 328 Cardinal ac = 0; 329 330 sink = (MultiSinkObject)w->text.sink; 331 XtSetArg(list[ac], XtNfontSet, sink->multi_sink.fontset); ac++; 332 XtSetArg(list[ac], XtNinsertPosition, w->text.insertPos); ac++; 333 XtSetArg(list[ac], XtNforeground, sink->text_sink.foreground); ac++; 334 XtSetArg(list[ac], XtNbackground, sink->text_sink.background); ac++; 335 _XawImSetValues(cnew, list, ac); 336 } 337} 338 339static void 340XawAsciiDestroy(Widget w) 341{ 342 AsciiWidget ascii = (AsciiWidget)w; 343 344 _XawImUnregister(w); 345 346 if (w == XtParent(ascii->text.sink)) 347 XtDestroyWidget(ascii->text.sink); 348 349#ifdef OLDXAW 350 if (w == XtParent(ascii->text.source)) 351 XtDestroyWidget(ascii->text.source); 352#else 353 _XawSourceRemoveText(ascii->text.source, w, 354 ascii->text.source && 355 w == XtParent(ascii->text.source)); 356#endif 357} 358