diff options
Diffstat (limited to 'src/TextSrc.c')
-rw-r--r-- | src/TextSrc.c | 676 |
1 files changed, 676 insertions, 0 deletions
diff --git a/src/TextSrc.c b/src/TextSrc.c new file mode 100644 index 0000000..d954954 --- /dev/null +++ b/src/TextSrc.c @@ -0,0 +1,676 @@ +/* $XConsortium: TextSrc.c,v 1.15 94/04/17 20:13:14 kaleb Exp $ */ +/* + +Copyright (c) 1989, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + +*/ + +/* + * Author: Chris Peterson, MIT X Consortium. + * Much code taken from X11R3 String and Disk Sources. + */ + +/* + * TextSrc.c - TextSrc object. (For use with the text widget). + * + */ + +#include "Xaw3dP.h" +#include <X11/IntrinsicP.h> +#include <X11/StringDefs.h> +#include <X11/Xutil.h> +#include <X11/Xaw3d/XawInit.h> +#include <X11/Xaw3d/TextSrcP.h> +#include <X11/Xmu/Atoms.h> +#include <X11/Xmu/CharSet.h> +#ifdef XAW_INTERNATIONALIZATION +#include "XawI18n.h" +#endif +#include <stdio.h> +#include <ctype.h> + +/**************************************************************** + * + * Full class record constant + * + ****************************************************************/ + +/* Private Data */ + +#define offset(field) XtOffsetOf(TextSrcRec, textSrc.field) +static XtResource resources[] = { + {XtNeditType, XtCEditType, XtREditMode, sizeof(XawTextEditType), + offset(edit_mode), XtRString, "read"}, +}; + +static void ClassInitialize(), ClassPartInitialize(), SetSelection(); +static void CvtStringToEditMode(); +static Boolean ConvertSelection(); +static XawTextPosition Search(), Scan(), Read(); +static int Replace(); + +#define SuperClass (&objectClassRec) +TextSrcClassRec textSrcClassRec = { + { +/* core_class fields */ + /* superclass */ (WidgetClass) SuperClass, + /* class_name */ "TextSrc", + /* widget_size */ sizeof(TextSrcRec), + /* class_initialize */ ClassInitialize, + /* class_part_initialize */ ClassPartInitialize, + /* class_inited */ FALSE, + /* initialize */ NULL, + /* initialize_hook */ NULL, + /* realize */ NULL, + /* actions */ NULL, + /* num_actions */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* compress_motion */ FALSE, + /* compress_exposure */ FALSE, + /* compress_enterleave */ FALSE, + /* visible_interest */ FALSE, + /* destroy */ NULL, + /* resize */ NULL, + /* expose */ NULL, + /* set_values */ NULL, + /* set_values_hook */ NULL, + /* set_values_almost */ NULL, + /* get_values_hook */ NULL, + /* accept_focus */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* tm_table */ NULL, + /* query_geometry */ NULL, + /* display_accelerator */ NULL, + /* extension */ NULL, + }, +/* textSrc_class fields */ + { + /* Read */ Read, + /* Replace */ Replace, + /* Scan */ Scan, + /* Search */ Search, + /* SetSelection */ SetSelection, + /* ConvertSelection */ ConvertSelection + } +}; + +WidgetClass textSrcObjectClass = (WidgetClass)&textSrcClassRec; + +static void +ClassInitialize () +{ + XawInitializeWidgetSet (); + XtAddConverter(XtRString, XtREditMode, CvtStringToEditMode, NULL, 0); +} + + +static void +ClassPartInitialize(wc) +WidgetClass wc; +{ + TextSrcObjectClass t_src, superC; + + t_src = (TextSrcObjectClass) wc; + superC = (TextSrcObjectClass) t_src->object_class.superclass; + +/* + * We don't need to check for null super since we'll get to TextSrc + * eventually. + */ + if (t_src->textSrc_class.Read == XtInheritRead) + t_src->textSrc_class.Read = superC->textSrc_class.Read; + + if (t_src->textSrc_class.Replace == XtInheritReplace) + t_src->textSrc_class.Replace = superC->textSrc_class.Replace; + + if (t_src->textSrc_class.Scan == XtInheritScan) + t_src->textSrc_class.Scan = superC->textSrc_class.Scan; + + if (t_src->textSrc_class.Search == XtInheritSearch) + t_src->textSrc_class.Search = superC->textSrc_class.Search; + + if (t_src->textSrc_class.SetSelection == XtInheritSetSelection) + t_src->textSrc_class.SetSelection = superC->textSrc_class.SetSelection; + + if (t_src->textSrc_class.ConvertSelection == XtInheritConvertSelection) + t_src->textSrc_class.ConvertSelection = + superC->textSrc_class.ConvertSelection; +} + +/************************************************************ + * + * Class specific methods. + * + ************************************************************/ + +/* Function Name: Read + * Description: This function reads the source. + * Arguments: w - the TextSrc Object. + * pos - position of the text to retreive. + * RETURNED text - text block that will contain returned text. + * length - maximum number of characters to read. + * Returns: The number of characters read into the buffer. + */ + +/* ARGSUSED */ +static XawTextPosition +Read(w, pos, text, length) +Widget w; +XawTextPosition pos; +XawTextBlock *text; +int length; +{ + XtAppError(XtWidgetToApplicationContext(w), + "TextSrc Object: No read function is defined."); + + return( (XawTextPosition) 0 ); /* for gcc -Wall and lint */ +} + +/* Function Name: Replace. + * Description: Replaces a block of text with new text. + * Arguments: src - the Text Source Object. + * startPos, endPos - ends of text that will be removed. + * text - new text to be inserted into buffer at startPos. + * Returns: XawEditError. + */ + +/*ARGSUSED*/ +static int +Replace (w, startPos, endPos, text) +Widget w; +XawTextPosition startPos, endPos; +XawTextBlock *text; +{ + return(XawEditError); +} + +/* Function Name: Scan + * Description: Scans the text source for the number and type + * of item specified. + * Arguments: w - the TextSrc Object. + * position - the position to start scanning. + * type - type of thing to scan for. + * dir - direction to scan. + * count - which occurance if this thing to search for. + * include - whether or not to include the character found in + * the position that is returned. + * Returns: EXITS WITH AN ERROR MESSAGE. + * + */ + +/* ARGSUSED */ +static +XawTextPosition +Scan (w, position, type, dir, count, include) +Widget w; +XawTextPosition position; +XawTextScanType type; +XawTextScanDirection dir; +int count; +Boolean include; +{ + XtAppError(XtWidgetToApplicationContext(w), + "TextSrc Object: No SCAN function is defined."); + + return( (XawTextPosition) 0 ); /* for gcc -Wall and lint */ +} + +/* Function Name: Search + * Description: Searchs the text source for the text block passed + * Arguments: w - the TextSource Object. + * position - the position to start scanning. + * dir - direction to scan. + * text - the text block to search for. + * Returns: XawTextSearchError. + */ + +/* ARGSUSED */ +static XawTextPosition +Search(w, position, dir, text) +Widget w; +XawTextPosition position; +XawTextScanDirection dir; +XawTextBlock * text; +{ + return(XawTextSearchError); +} + +/* Function Name: ConvertSelection + * Description: Dummy selection converter. + * Arguments: w - the TextSrc object. + * selection - the current selection atom. + * target - the current target atom. + * type - the type to conver the selection to. + * RETURNED value, length - the return value that has been converted. + * RETURNED format - the format of the returned value. + * Returns: TRUE if the selection has been converted. + * + */ + +/* ARGSUSED */ +static Boolean +ConvertSelection(w, selection, target, type, value, length, format) +Widget w; +Atom * selection, * target, * type; +XtPointer * value; +unsigned long * length; +int * format; +{ + return(FALSE); +} + +/* Function Name: SetSelection + * Description: allows special setting of the selection. + * Arguments: w - the TextSrc object. + * left, right - bounds of the selection. + * selection - the selection atom. + * Returns: none + */ + +/* ARGSUSED */ +static void +SetSelection(w, left, right, selection) +Widget w; +XawTextPosition left, right; +Atom selection; +{ + /* This space intentionally left blank. */ +} + + +/* ARGSUSED */ +static void +CvtStringToEditMode(args, num_args, fromVal, toVal) +XrmValuePtr args; /* unused */ +Cardinal *num_args; /* unused */ +XrmValuePtr fromVal; +XrmValuePtr toVal; +{ + static XawTextEditType editType; + static XrmQuark QRead, QAppend, QEdit; + XrmQuark q; + char lowerName[40]; + static Boolean inited = FALSE; + + if ( !inited ) { + QRead = XrmPermStringToQuark(XtEtextRead); + QAppend = XrmPermStringToQuark(XtEtextAppend); + QEdit = XrmPermStringToQuark(XtEtextEdit); + inited = TRUE; + } + + if (strlen ((char*) fromVal->addr) < sizeof lowerName) { + XmuCopyISOLatin1Lowered (lowerName, (char *)fromVal->addr); + q = XrmStringToQuark(lowerName); + + if (q == QRead) editType = XawtextRead; + else if (q == QAppend) editType = XawtextAppend; + else if (q == QEdit) editType = XawtextEdit; + else { + toVal->size = 0; + toVal->addr = NULL; + return; + } + toVal->size = sizeof editType; + toVal->addr = (XPointer) &editType; + return; + } + toVal->size = 0; + toVal->addr = NULL; +} + + + +/************************************************************ + * + * Public Functions. + * + ************************************************************/ + +/* Function Name: XawTextSourceRead + * Description: This function reads the source. + * Arguments: w - the TextSrc Object. + * pos - position of the text to retreive. + * RETURNED text - text block that will contain returned text. + * length - maximum number of characters to read. + * Returns: The number of characters read into the buffer. + */ + +XawTextPosition +#if NeedFunctionPrototypes +XawTextSourceRead(Widget w, XawTextPosition pos, XawTextBlock *text, + int length) +#else +XawTextSourceRead(w, pos, text, length) +Widget w; +XawTextPosition pos; +XawTextBlock *text; +int length; +#endif +{ + TextSrcObjectClass class = (TextSrcObjectClass) w->core.widget_class; + + if ( !XtIsSubclass( w, textSrcObjectClass ) ) + XtErrorMsg("bad argument", "textSource", "XawError", + "XawTextSourceRead's 1st parameter must be subclass of asciiSrc.", + NULL, NULL); + + return((*class->textSrc_class.Read)(w, pos, text, length)); +} + +/* Function Name: XawTextSourceReplace. + * Description: Replaces a block of text with new text. + * Arguments: src - the Text Source Object. + * startPos, endPos - ends of text that will be removed. + * text - new text to be inserted into buffer at startPos. + * Returns: XawEditError or XawEditDone. + */ + +/*ARGSUSED*/ +int +#if NeedFunctionPrototypes +XawTextSourceReplace (Widget w, XawTextPosition startPos, + XawTextPosition endPos, XawTextBlock *text) +#else +XawTextSourceReplace (w, startPos, endPos, text) +Widget w; +XawTextPosition startPos, endPos; +XawTextBlock *text; +#endif +{ + TextSrcObjectClass class = (TextSrcObjectClass) w->core.widget_class; + + if ( !XtIsSubclass( w, textSrcObjectClass ) ) + XtErrorMsg("bad argument", "textSource", "XawError", + "XawTextSourceReplace's 1st parameter must be subclass of asciiSrc.", + NULL, NULL); + + return((*class->textSrc_class.Replace)(w, startPos, endPos, text)); +} + +/* Function Name: XawTextSourceScan + * Description: Scans the text source for the number and type + * of item specified. + * Arguments: w - the TextSrc Object. + * position - the position to start scanning. + * type - type of thing to scan for. + * dir - direction to scan. + * count - which occurance if this thing to search for. + * include - whether or not to include the character found in + * the position that is returned. + * Returns: The position of the text. + * + */ + +XawTextPosition +#if NeedFunctionPrototypes +XawTextSourceScan(Widget w, XawTextPosition position, +#if NeedWidePrototypes + int type, int dir, +#else + XawTextScanType type, XawTextScanDirection dir, +#endif + int count, +#if NeedWidePrototypes + int include) +#else + Boolean include) +#endif +#else +XawTextSourceScan(w, position, type, dir, count, include) +Widget w; +XawTextPosition position; +XawTextScanType type; +XawTextScanDirection dir; +int count; +Boolean include; +#endif +{ + TextSrcObjectClass class = (TextSrcObjectClass) w->core.widget_class; + + if ( !XtIsSubclass( w, textSrcObjectClass ) ) + XtErrorMsg("bad argument", "textSource", "XawError", + "XawTextSourceScan's 1st parameter must be subclass of asciiSrc.", + NULL, NULL); + + return((*class->textSrc_class.Scan)(w, position, type, dir, count, include)); +} + +/* Function Name: XawTextSourceSearch + * Description: Searchs the text source for the text block passed + * Arguments: w - the TextSource Object. + * position - the position to start scanning. + * dir - direction to scan. + * text - the text block to search for. + * Returns: The position of the text we are searching for or + * XawTextSearchError. + */ + +XawTextPosition +#if NeedFunctionPrototypes +XawTextSourceSearch(Widget w, XawTextPosition position, +#if NeedWidePrototypes + int dir, +#else + XawTextScanDirection dir, +#endif + XawTextBlock *text) +#else +XawTextSourceSearch(w, position, dir, text) +Widget w; +XawTextPosition position; +XawTextScanDirection dir; +XawTextBlock * text; +#endif +{ + TextSrcObjectClass class = (TextSrcObjectClass) w->core.widget_class; + + if ( !XtIsSubclass( w, textSrcObjectClass ) ) + XtErrorMsg("bad argument", "textSource", "XawError", + "XawTextSourceSearch's 1st parameter must be subclass of asciiSrc.", + NULL, NULL); + + return((*class->textSrc_class.Search)(w, position, dir, text)); +} + +/* Function Name: XawTextSourceConvertSelection + * Description: Dummy selection converter. + * Arguments: w - the TextSrc object. + * selection - the current selection atom. + * target - the current target atom. + * type - the type to conver the selection to. + * RETURNED value, length - the return value that has been converted. + * RETURNED format - the format of the returned value. + * Returns: TRUE if the selection has been converted. + * + */ + +Boolean +#if NeedFunctionPrototypes +XawTextSourceConvertSelection(Widget w, Atom *selection, Atom *target, + Atom *type, XtPointer *value, + unsigned long *length, int *format) +#else +XawTextSourceConvertSelection(w, selection, + target, type, value, length, format) +Widget w; +Atom * selection, * target, * type; +XtPointer * value; +unsigned long * length; +int * format; +#endif +{ + TextSrcObjectClass class = (TextSrcObjectClass) w->core.widget_class; + + if ( !XtIsSubclass( w, textSrcObjectClass ) ) + XtErrorMsg("bad argument", "textSource", "XawError", + "XawTextSourceConvertSelectionXawTextSourceConvertSelection's 1st parameter must be subclass of asciiSrc.", + NULL, NULL); + + return((*class->textSrc_class.ConvertSelection)(w, selection, target, type, + value, length, format)); +} + +/* Function Name: XawTextSourceSetSelection + * Description: allows special setting of the selection. + * Arguments: w - the TextSrc object. + * left, right - bounds of the selection. + * selection - the selection atom. + * Returns: none + */ + +void +#if NeedFunctionPrototypes +XawTextSourceSetSelection(Widget w, XawTextPosition left, + XawTextPosition right, Atom selection) +#else +XawTextSourceSetSelection(w, left, right, selection) +Widget w; +XawTextPosition left, right; +Atom selection; +#endif +{ + TextSrcObjectClass class = (TextSrcObjectClass) w->core.widget_class; + + if ( !XtIsSubclass( w, textSrcObjectClass ) ) + XtErrorMsg("bad argument", "textSource", "XawError", + "'s 1st parameter must be subclass of asciiSrc.", + NULL, NULL); + + (*class->textSrc_class.SetSelection)(w, left, right, selection); +} + +/******************************************************************** + * + * External Functions for Multi Text. + * + ********************************************************************/ + +/* + * TextFormat(): + * returns the format of text: FMT8BIT or FMTWIDE. + * + */ +XrmQuark +#if NeedFunctionPrototypes +_XawTextFormat(TextWidget tw) +#else +_XawTextFormat(tw) + TextWidget tw; +#endif +{ + return (((TextSrcObject)(tw->text.source))->textSrc.text_format); +} + + +#ifdef XAW_INTERNATIONALIZATION +/* _XawTextWCToMB(): + * convert the wchar string to external encoding. + * The caller is responsible for freeing both the source and ret string. + * + * wstr - source wchar string. + * len_in_out - lengh of string. + * As In, length of source wchar string, measured in wchar. + * As Out, length of returned string. + */ + + +char * +_XawTextWCToMB( d, wstr, len_in_out ) + Display* d; + wchar_t* wstr; + int* len_in_out; + +{ + XTextProperty textprop; + if (XwcTextListToTextProperty(d, (wchar_t**)&wstr, 1, + XTextStyle, &textprop) < Success) { + XtWarningMsg("convertError", "textSource", "XawError", + "Non-character code(s) in buffer.", NULL, NULL); + *len_in_out = 0; + return( NULL ); + } + *len_in_out = textprop.nitems; + return((char *)textprop.value); +} + + +/* _XawTextMBToWC(): + * convert the string to internal processing codeset WC. + * The caller is responsible for freeing both the source and ret string. + * + * str - source string. + * len_in_out - lengh of string. + * As In, it is length of source string. + * As Out, it is length of returned string, measured in wchar. + */ + +wchar_t* _XawTextMBToWC( d, str, len_in_out ) +Display *d; +char *str; +int *len_in_out; +{ + if (*len_in_out == 0) { + return(NULL); + } else { + XTextProperty textprop; + char *buf; + wchar_t **wlist, *wstr; + int count; + buf = XtMalloc(*len_in_out + 1); + if (!buf) { + XtErrorMsg("convertError", "multiSourceCreate", "XawError", + "No Memory", NULL, NULL); + *len_in_out = 0; + return (NULL); /* The above function doesn't really return. */ + } + strncpy(buf, str, *len_in_out); + *(buf + *len_in_out) = '\0'; + if (XmbTextListToTextProperty(d, &buf, 1, XTextStyle, &textprop) + != Success) { + XtWarningMsg("convertError", "textSource", "XawError", + "No Memory, or Locale not supported.", NULL, NULL); + XtFree(buf); + *len_in_out = 0; + return (NULL); + } + XtFree(buf); + if (XwcTextPropertyToTextList(d, &textprop, + (wchar_t***)&wlist, &count) != Success) { + XtWarningMsg("convertError", "multiSourceCreate", "XawError", + "Non-character code(s) in source.", NULL, NULL); + *len_in_out = 0; + return (NULL); + } + wstr = wlist[0]; + *len_in_out = wcslen(wstr); + XFree((char**)wlist); /* this is evil */ + return(wstr); + } +} +#endif + |