1 /*
2  * Author:      William Chia-Wei Cheng (bill.cheng@acm.org)
3  *
4  * Copyright (C) 2001-2009, William Chia-Wei Cheng.
5  *
6  * This file may be distributed under the terms of the Q Public License
7  * as defined by Trolltech AS of Norway and appearing in the file
8  * LICENSE.QPL included in the packaging of this file.
9  *
10  * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING
11  * THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
12  * PURPOSE.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
13  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
14  * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
15  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
16  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  *
18  * @(#)$Header: /mm2/home/cvs/bc-src/tgif/tdgtsedt.c,v 1.11 2011/05/16 16:22:00 william Exp $
19  */
20 
21 #define _INCLUDE_FROM_TDGTSEDT_C_
22 
23 #include "tgifdefs.h"
24 #include "patchlvl.h"
25 #include "tidget.h"
26 
27 #include "auxtext.e"
28 #include "choose.e"
29 #include "color.e"
30 #include "cursor.e"
31 #include "dialog.e"
32 #include "font.e"
33 #include "inmethod.e"
34 #include "menu.e"
35 #include "msg.e"
36 #include "raster.e"
37 #include "rect.e"
38 #include "setup.e"
39 #include "tdgtbase.e"
40 #include "tdgtsedt.e"
41 #include "text.e"
42 #include "tidget.e"
43 #include "util.e"
44 
45 static void RedrawTdgtSmplEdit ARGS_DECL((TidgetInfo *pti));
46 static int TdgtSmplEditEventHandler ARGS_DECL((TidgetInfo *pti, XEvent *input,
47                 TidgetInfo *handling_pti));
48 static int IsTdgtSmplEditEvent ARGS_DECL((TidgetInfo *pti, XEvent *input,
49                 TidgetInfo **ppti_handler_tidget_return));
50 static void DestroyTdgtSmplEdit ARGS_DECL((TidgetInfo *pti));
51 static void MapTdgtSmplEdit ARGS_DECL((TidgetInfo *pti));
52 static void TdgtSmplEditMoveResize ARGS_DECL((TidgetInfo *pti, int x, int y,
53                 int w, int h));
54 static int TdgtSmplEditSendCmd ARGS_DECL((TidgetInfo *pti, int cmd_type,
55                 int cmd_arg, void *pv_cmd_userdata));
56 
57 /* --------------------- Utility Functions --------------------- */
58 
59 /* --------------------- RedrawTdgtSmplEdit() --------------------- */
60 
61 #define RIGHT_GAP 2
62 
63 static
TdgtSmplEditBinarySearch(caption,len,max_w,font_ptr,pf_text_width_func)64 char *TdgtSmplEditBinarySearch(caption, len, max_w, font_ptr,
65       pf_text_width_func)
66    char *caption;
67    int len, max_w;
68    XFontStruct *font_ptr;
69    TidgetMsgTextWidthFunc *pf_text_width_func;
70 {
71    /*
72     * When &caption[too_long-1] is too long and &caption[too_long] is not
73     *         long enough, return &caption[too_long].
74     */
75    int prev_too_long=INVALID, too_long=0, too_short=len, found=FALSE;
76 
77    while (!found) {
78       int w=0;
79 
80       if (too_short < too_long) {
81 #ifdef _TGIF_DBG /* debug, do not translate */
82          sprintf(gszMsgBox, "Programing error in TdgtSmplEditBinarySearch()!\n");
83          MsgBox(gszMsgBox, TOOL_NAME, INFO_MB);
84 #endif /* _TGIF_DBG */
85       }
86       if (too_short-too_long <= 4) {
87          w = (pf_text_width_func)(font_ptr, &caption[too_long], len-too_long);
88          if (w > max_w) {
89             prev_too_long = too_long;
90             too_long++;
91          } else {
92             return (&caption[too_long]);
93          }
94       } else {
95          int mid=((too_long+too_short)>>1);
96 
97          w = (pf_text_width_func)(font_ptr, &caption[mid], len-mid);
98          if (w > max_w) {
99             too_long = mid;
100          } else {
101             too_short = mid;
102          }
103       }
104    }
105    return caption;
106 }
107 
108 static
TdgtSmplEditDrawCaption(pTdgtSmplEdit)109 void TdgtSmplEditDrawCaption(pTdgtSmplEdit)
110    TdgtSmplEdit *pTdgtSmplEdit;
111 {
112    int x=pTdgtSmplEdit->client_area.x, y=pTdgtSmplEdit->client_area.y, w=0;
113    int font_asc=0, client_area_w=pTdgtSmplEdit->client_area.w;
114    char *caption=TdgtSmplEditGetText(pTdgtSmplEdit), *psz_start=NULL;
115    XFontStruct *font_ptr=NULL;
116    TidgetDrawMsgStringFunc *pf_draw_string_func=NULL;
117    TidgetMsgTextWidthFunc *pf_text_width_func=NULL;
118 
119    if (caption == NULL) return;
120 
121    TidgetGetFontInfoGivenStyle(pTdgtSmplEdit->font_style, &font_ptr, NULL, NULL,
122          &font_asc, NULL);
123    y += font_asc;
124    switch (pTdgtSmplEdit->font_style) {
125    case STYLE_NR:
126       if (msgFontPtr != NULL) {
127          XSetFont(mainDisplay, gTidgetManager.gc, msgFontPtr->fid);
128       }
129       pf_draw_string_func = DrawMsgString;
130       pf_text_width_func = MsgTextWidth;
131       break;
132    case STYLE_BR:
133       if (boldMsgFontPtr != NULL) {
134          XSetFont(mainDisplay, gTidgetManager.gc, boldMsgFontPtr->fid);
135       }
136       pf_draw_string_func = DrawBoldMsgString;
137       pf_text_width_func = BoldMsgTextWidth;
138       break;
139    case STYLE_NI:
140       if (italicMsgFontPtr != NULL) {
141          XSetFont(mainDisplay, gTidgetManager.gc, italicMsgFontPtr->fid);
142       }
143       pf_draw_string_func = DrawItalicMsgString;
144       pf_text_width_func = ItalicMsgTextWidth;
145       break;
146    case STYLE_BI:
147       if (boldItalicMsgFontPtr != NULL) {
148          XSetFont(mainDisplay, gTidgetManager.gc, boldItalicMsgFontPtr->fid);
149       }
150       pf_draw_string_func = DrawBoldItalicMsgString;
151       pf_text_width_func = BoldItalicMsgTextWidth;
152       break;
153    }
154    w = (pf_text_width_func)(font_ptr, caption, strlen(caption));
155    if (w > client_area_w-RIGHT_GAP) {
156       psz_start = TdgtSmplEditBinarySearch(caption, strlen(caption),
157             client_area_w-RIGHT_GAP, font_ptr, pf_text_width_func);
158    } else {
159       psz_start = caption;
160    }
161    if (pTdgtSmplEdit->color_index == INVALID) {
162       XSetForeground(mainDisplay, gTidgetManager.gc, myFgPixel);
163    } else {
164       XSetForeground(mainDisplay, gTidgetManager.gc,
165             colorPixels[pTdgtSmplEdit->color_index]);
166    }
167    (pf_draw_string_func)(mainDisplay, pTdgtSmplEdit->pti->tci.win,
168          gTidgetManager.gc, x, y, psz_start, strlen(psz_start));
169 
170    if (TidgetIsFocus(pTdgtSmplEdit->pti)) {
171       x = (pf_text_width_func)(font_ptr, psz_start, strlen(psz_start)) +
172             pTdgtSmplEdit->client_area.x;
173       XSetForeground(mainDisplay, gTidgetManager.gc, myFgPixel);
174       XDrawLine(mainDisplay, pTdgtSmplEdit->pti->tci.win, gTidgetManager.gc,
175             x+1, pTdgtSmplEdit->client_area.y+1, x+1,
176             pTdgtSmplEdit->client_area.y+pTdgtSmplEdit->client_area.h-1);
177       TidgetDrawFocusRect(pTdgtSmplEdit->pti, &pTdgtSmplEdit->client_area);
178    }
179    TidgetManagerResetGC();
180 }
181 
182 static
RedrawTdgtSmplEdit(pti)183 void RedrawTdgtSmplEdit(pti)
184    TidgetInfo *pti;
185 {
186    TdgtSmplEdit *pTdgtSmplEdit=(TdgtSmplEdit*)(pti->tidget);
187 
188    XClearWindow(mainDisplay, pTdgtSmplEdit->pti->tci.win);
189 
190    if (threeDLook) {
191       struct BBRec bbox;
192 
193       SetBBRec(&bbox, 0, 0, pTdgtSmplEdit->pti->tci.win_info.w,
194             pTdgtSmplEdit->pti->tci.win_info.h);
195       switch (pTdgtSmplEdit->pti->tci.state) {
196       case TGBS_NORMAL: break;
197       default:
198          TgDrawThreeDButton(mainDisplay, pTdgtSmplEdit->pti->tci.win,
199                gTidgetManager.gc, &bbox, pTdgtSmplEdit->pti->tci.state,
200                2, FALSE);
201          TidgetManagerResetGC();
202          break;
203       }
204    } else {
205       /*
206        * XDrawRectangle(mainDisplay, pTdgtSmplEdit->pti->tci.win,
207        *         gTidgetManager.gc, 0, 0, pTdgtSmplEdit->pti->tci.win_info.w,
208        *         pTdgtSmplEdit->pti->tci.win_info.h);
209        */
210    }
211    TdgtSmplEditDrawCaption(pTdgtSmplEdit);
212 }
213 
214 /* --------------------- TdgtSmplEditEventHandler() --------------------- */
215 
216 static XComposeStatus c_stat;
217 
218 static
TdgtSmplEditEventHandler(pti,input,handling_pti)219 int TdgtSmplEditEventHandler(pti, input, handling_pti)
220    TidgetInfo *pti, *handling_pti;
221    XEvent *input;
222 {
223    TdgtSmplEdit *pTdgtSmplEdit=(TdgtSmplEdit*)(pti->tidget);
224 
225    if (pti != handling_pti) return FALSE;
226 
227    if (input->type == Expose) {
228       XEvent ev;
229 
230       RedrawTdgtSmplEdit(pTdgtSmplEdit->pti);
231       while (XCheckWindowEvent(mainDisplay, pTdgtSmplEdit->pti->tci.win,
232             ExposureMask, &ev)) ;
233    } else if (input->type == KeyPress) {
234       int has_ch=0;
235       char buf[80];
236       KeySym key_sym=(KeySym)0;
237       XKeyEvent *key_ev=(&(input->xkey));
238 
239       if (gnInputMethod != TGIM_NONE &&
240             /*
241              * Cannot call: InputMethodTypeMatched(canvasFontDoubleByte) &&
242              */
243             tgIMExpectLookupString(mainDisplay, pTdgtSmplEdit->pti->tci.win)) {
244          if (tgIMHandleLookupString(mainDisplay, pTdgtSmplEdit->pti->tci.win,
245                key_ev, buf, sizeof(buf), &key_sym, &has_ch)) {
246             if (has_ch > 0) buf[has_ch] = '\0';
247             has_ch = HandleDoubleByteUTF8Chars(buf, has_ch);
248          }
249          TranslateKeys(buf, &key_sym);
250       } else {
251          has_ch = XLookupString(key_ev, buf, sizeof(buf), &key_sym, &c_stat);
252          if (has_ch > 0) buf[has_ch] = '\0';
253          if (gnInputMethod != TGIM_NONE) {
254             char s1[80];
255 
256             *s1 = '\0';
257             if (tgIMTranslateKeyEvent(mainDisplay, mainWindow, key_ev, s1)) {
258                strcpy(buf, s1);
259                /* added by Ambrose Li <acli@mingpaoxpress.com> */
260                key_sym = (KeySym)0;
261             }
262             if (tgIMExpectClientMessage(mainDisplay, mainWindow)) {
263                /* input characters only come from ClientMessage */
264                return FALSE;
265             }
266          } else {
267             TranslateKeys(buf, &key_sym);
268          }
269       }
270       if (CharIsCRorLF(key_ev, buf, key_sym, &has_ch)) {
271          TidgetControlNotify(pTdgtSmplEdit->pti, TDGTNF_EDIT_ENTERED, 0, 0);
272          return TRUE;
273       } else if (CharIsBS(key_ev, buf, key_sym, &has_ch, FALSE)) {
274          TdgtSmplEditDelLastChar(pTdgtSmplEdit);
275          return TRUE;
276       } else if (key_sym>='\040' && key_sym<='\377') {
277          TdgtSmplEditAppendStr(pTdgtSmplEdit, buf, 1);
278          return TRUE;
279       }
280    } else if (input->type == ButtonPress) {
281       if (pTdgtSmplEdit->cursor_shown) {
282          /* already has focus, don't do anythingn */
283       } else {
284          TdgtBase *pTdgtBase=
285                (TdgtBase*)(pTdgtSmplEdit->pti->tci.parent_tidgetinfo->tidget);
286 
287          if (TidgetSendCmd(pTdgtBase->pti, TDGTCMD_CAN_HANDLE_FOCUS_CHANGE,
288                0, NULL)) {
289             TidgetSendCmd(pTdgtBase->pti, TDGTCMD_REMOVE_FOCUS, 0, NULL);
290          }
291          TdgtSmplEditSetFocus(pTdgtSmplEdit, TRUE);
292       }
293    }
294    return FALSE;
295 }
296 
297 /* --------------------- IsTdgtSmplEditEvent() --------------------- */
298 
299 static
IsTdgtSmplEditEvent(pti,input,ppti_handler_tidget_return)300 int IsTdgtSmplEditEvent(pti, input, ppti_handler_tidget_return)
301    TidgetInfo *pti, **ppti_handler_tidget_return;
302    XEvent *input;
303 {
304    TdgtSmplEdit *pTdgtSmplEdit=(TdgtSmplEdit*)(pti->tidget);
305 
306    if (input->xany.window == pTdgtSmplEdit->pti->tci.win) {
307       *ppti_handler_tidget_return = pti;
308       return TRUE;
309    }
310    return FALSE;
311 }
312 
313 /* --------------------- DestroyTdgtSmplEdit() --------------------- */
314 
315 static
DestroyTdgtSmplEdit(pti)316 void DestroyTdgtSmplEdit(pti)
317    TidgetInfo *pti;
318 {
319    TdgtSmplEdit *pTdgtSmplEdit=(TdgtSmplEdit*)(pti->tidget);
320 
321    TdgtSmplEditReset(pTdgtSmplEdit);
322 
323    free(pTdgtSmplEdit);
324 }
325 
326 /* --------------------- MapTdgtSmplEdit() --------------------- */
327 
328 static
MapTdgtSmplEdit(pti)329 void MapTdgtSmplEdit(pti)
330    TidgetInfo *pti;
331 {
332    TdgtSmplEdit *pTdgtSmplEdit=(TdgtSmplEdit*)(pti->tidget);
333 
334 #ifdef MAPBEFORESELECT
335    XMapWindow(mainDisplay, pTdgtSmplEdit->pti->tci.win);
336    XSelectInput(mainDisplay, pTdgtSmplEdit->pti->tci.win,
337          ButtonReleaseMask | ButtonPressMask | KeyPressMask | ExposureMask |
338          EnterWindowMask | LeaveWindowMask);
339 #else
340    XSelectInput(mainDisplay, pTdgtSmplEdit->pti->tci.win,
341          ButtonReleaseMask | ButtonPressMask | KeyPressMask | ExposureMask |
342          EnterWindowMask | LeaveWindowMask);
343    XMapWindow(mainDisplay, pTdgtSmplEdit->pti->tci.win);
344 #endif
345 }
346 
347 /* --------------------- TdgtSmplEditMoveResize() --------------------- */
348 
349 static
TdgtSmplEditMoveResize(pti,x,y,w,h)350 void TdgtSmplEditMoveResize(pti, x, y, w, h)
351    TidgetInfo *pti;
352    int x, y, w, h;
353 {
354    TdgtSmplEdit *pTdgtSmplEdit=(TdgtSmplEdit*)(pti->tidget);
355    int h_pad=pti->tci.h_pad, v_pad=pti->tci.v_pad;
356 
357    /* there should be no need to resize a button */
358    pTdgtSmplEdit->pti->tci.win_info.x = x;
359    pTdgtSmplEdit->pti->tci.win_info.y = y;
360    pTdgtSmplEdit->pti->tci.win_info.w = w;
361    pTdgtSmplEdit->pti->tci.win_info.h = h;
362    XMoveResizeWindow(mainDisplay, pTdgtSmplEdit->pti->tci.win, x, y, w, h);
363 
364    pTdgtSmplEdit->client_area.x = windowPadding + h_pad;
365    pTdgtSmplEdit->client_area.y = windowPadding + v_pad;
366    pTdgtSmplEdit->client_area.w = w-(windowPadding<<1)-(h_pad<<1);
367    pTdgtSmplEdit->client_area.h = h-(windowPadding<<1)-(v_pad<<1);
368 }
369 
370 /* --------------------- TdgtSmplEditSendCmd() --------------------- */
371 
372 static
TdgtSmplEditSendCmd(pti,cmd_type,cmd_arg,pv_cmd_userdata)373 int TdgtSmplEditSendCmd(pti, cmd_type, cmd_arg, pv_cmd_userdata)
374    TidgetInfo *pti;
375    int cmd_type, cmd_arg;
376    void *pv_cmd_userdata;
377 {
378    TdgtSmplEdit *pTdgtSmplEdit=(TdgtSmplEdit*)(pti->tidget);
379 
380    if (pTdgtSmplEdit != NULL) {
381    }
382    return FALSE;
383 }
384 
385 /* --------------------- TdgtSmplEditReset() --------------------- */
386 
TdgtSmplEditReset(pTdgtSmplEdit)387 void TdgtSmplEditReset(pTdgtSmplEdit)
388    TdgtSmplEdit *pTdgtSmplEdit;
389 {
390    FreeDynStrBuf(&(pTdgtSmplEdit->pti->tci.dyn_str));
391 }
392 
393 /* --------------------- CreateTdgtSmplEdit() --------------------- */
394 
395 static
TdgtSmplEditCalcHeight(font_style,pn_content_h)396 void TdgtSmplEditCalcHeight(font_style, pn_content_h)
397    int font_style, *pn_content_h;
398 {
399    int font_height=0;
400 
401    TidgetGetFontInfoGivenStyle(font_style, NULL, NULL, &font_height, NULL,
402          NULL);
403 
404    if (pn_content_h != NULL) *pn_content_h = font_height;
405 }
406 
CreateTdgtSmplEdit(parent_win,parent_tidgetinfo,ctl_id,x,y,content_w,h_pad,v_pad,caption,font_style,color_index)407 TdgtSmplEdit *CreateTdgtSmplEdit(parent_win, parent_tidgetinfo, ctl_id, x, y,
408       content_w, h_pad, v_pad, caption, font_style, color_index)
409    Window parent_win;
410    TidgetInfo *parent_tidgetinfo;
411    int ctl_id, x, y, content_w, h_pad, v_pad, font_style, color_index;
412    char *caption;
413 {
414    int w=0, h=0, content_h=0;
415    TdgtSmplEdit *pTdgtSmplEdit=NULL;
416 
417    TdgtSmplEditCalcHeight(font_style, &content_h);
418    w = content_w + (windowPadding<<1) + (h_pad<<1);
419    h = content_h + (windowPadding<<1) + (v_pad<<1);
420 
421    pTdgtSmplEdit = (TdgtSmplEdit*)malloc(sizeof(TdgtSmplEdit));
422    if (pTdgtSmplEdit == NULL) FailAllocMessage();
423    memset(pTdgtSmplEdit, 0, sizeof(TdgtSmplEdit));
424 
425    pTdgtSmplEdit->pti = NewTidgetInfo(parent_tidgetinfo, TIDGET_TYPE_SEDT,
426          pTdgtSmplEdit, ctl_id, NULL);
427    if ((pTdgtSmplEdit->pti->tci.win=XCreateSimpleWindow(mainDisplay, parent_win,
428          x, y, w, h, brdrW, myBorderPixel, myBgPixel)) == 0) {
429       FailToCreateWindowMessage("CreateTdgtSmplEdit()", NULL, TRUE);
430       return NULL;
431    }
432    XSelectInput(mainDisplay, pTdgtSmplEdit->pti->tci.win,
433          ButtonReleaseMask | ButtonPressMask | KeyPressMask | ExposureMask |
434          EnterWindowMask | LeaveWindowMask);
435    SetTidgetInfoBasic(pTdgtSmplEdit->pti, TIDGET_TYPE_SEDT, pTdgtSmplEdit,
436          parent_win, x, y, w, h, h_pad, v_pad, TGBS_LOWRED, caption);
437    TidgetSetCallbacks(pTdgtSmplEdit->pti,
438          RedrawTdgtSmplEdit, TdgtSmplEditEventHandler, IsTdgtSmplEditEvent,
439          DestroyTdgtSmplEdit, MapTdgtSmplEdit, TdgtSmplEditMoveResize,
440          TdgtSmplEditSendCmd);
441 
442    pTdgtSmplEdit->client_area.x = windowPadding + h_pad;
443    pTdgtSmplEdit->client_area.y = windowPadding + v_pad;
444    pTdgtSmplEdit->client_area.w = w-(windowPadding<<1)-(h_pad<<1);
445    pTdgtSmplEdit->client_area.h = h-(windowPadding<<1)-(v_pad<<1);
446 
447    pTdgtSmplEdit->font_style = font_style;
448    pTdgtSmplEdit->color_index = color_index;
449 
450    return pTdgtSmplEdit;
451 }
452 
453 /* --------------------- TdgtSmplEditSetText() --------------------- */
454 
TdgtSmplEditSetText(pTdgtSmplEdit,str)455 int TdgtSmplEditSetText(pTdgtSmplEdit, str)
456    TdgtSmplEdit *pTdgtSmplEdit;
457    char *str;
458 {
459    int len=strlen(str);
460 
461    if (len+1 == pTdgtSmplEdit->pti->tci.dyn_str.sz &&
462          strcmp(str, pTdgtSmplEdit->pti->tci.dyn_str.s) == 0) {
463       /* same string, no change */
464       return FALSE;
465    }
466    FreeDynStrBuf(&(pTdgtSmplEdit->pti->tci.dyn_str));
467 
468    if (str != NULL) {
469       DynStrSet(&(pTdgtSmplEdit->pti->tci.dyn_str), str);
470    }
471    RedrawTdgtSmplEdit(pTdgtSmplEdit->pti);
472 
473    return TRUE;
474 }
475 
476 /* --------------------- TdgtSmplEditGetText() --------------------- */
477 
TdgtSmplEditGetText(pTdgtSmplEdit)478 char *TdgtSmplEditGetText(pTdgtSmplEdit)
479    TdgtSmplEdit *pTdgtSmplEdit;
480 {
481    return pTdgtSmplEdit->pti->tci.dyn_str.s;
482 }
483 
484 /*--------------------- TdgtSmplEditGetTextFormatInfo() -------------------- */
485 
TdgtSmplEditGetTextFormatInfo(pTdgtSmplEdit,pTextFormatInfo)486 void TdgtSmplEditGetTextFormatInfo(pTdgtSmplEdit, pTextFormatInfo)
487    TdgtSmplEdit *pTdgtSmplEdit;
488    TextFormatInfo *pTextFormatInfo;
489 {
490    if (pTextFormatInfo != NULL) {
491       pTextFormatInfo->font_style = pTdgtSmplEdit->font_style;
492       pTextFormatInfo->color_index = pTdgtSmplEdit->color_index;
493       if (pTextFormatInfo->color_index == INVALID) {
494          *pTextFormatInfo->color_str = '\0';
495       } else {
496          UtilStrCpyN(pTextFormatInfo->color_str,
497                sizeof(pTextFormatInfo->color_str),
498                colorMenuItems[pTextFormatInfo->color_index]);
499       }
500    }
501 }
502 
503 /* --------------------- TdgtSmplEditSetColorIndex() --------------------- */
504 
TdgtSmplEditSetColorIndex(pTdgtSmplEdit,color_index)505 int TdgtSmplEditSetColorIndex(pTdgtSmplEdit, color_index)
506    TdgtSmplEdit *pTdgtSmplEdit;
507    int color_index;
508 {
509    int prev_color_index=pTdgtSmplEdit->color_index;
510 
511    if (prev_color_index != color_index) {
512       pTdgtSmplEdit->color_index = color_index;
513       RedrawTdgtSmplEdit(pTdgtSmplEdit->pti);
514    }
515    return prev_color_index;
516 }
517 
518 /* --------------------- TdgtSmplEditGetColorIndex() --------------------- */
519 
TdgtSmplEditGetColorIndex(pTdgtSmplEdit)520 int TdgtSmplEditGetColorIndex(pTdgtSmplEdit)
521    TdgtSmplEdit *pTdgtSmplEdit;
522 {
523    return pTdgtSmplEdit->color_index;
524 }
525 
526 /* --------------------- TdgtSmplEditSetFontStyle() --------------------- */
527 
TdgtSmplEditSetFontStyle(pTdgtSmplEdit,font_style)528 int TdgtSmplEditSetFontStyle(pTdgtSmplEdit, font_style)
529    TdgtSmplEdit *pTdgtSmplEdit;
530    int font_style;
531 {
532    int prev_font_style=pTdgtSmplEdit->font_style;
533 
534    if (prev_font_style != font_style) {
535       pTdgtSmplEdit->font_style = font_style;
536       RedrawTdgtSmplEdit(pTdgtSmplEdit->pti);
537    }
538    return prev_font_style;
539 }
540 
541 /* --------------------- TdgtSmplEditGetFontStyle() --------------------- */
542 
TdgtSmplEditGetFontStyle(pTdgtSmplEdit)543 int TdgtSmplEditGetFontStyle(pTdgtSmplEdit)
544    TdgtSmplEdit *pTdgtSmplEdit;
545 {
546    return pTdgtSmplEdit->font_style;
547 }
548 
549 /* --------------------- TdgtSmplEditAppendStr() --------------------- */
550 
TdgtSmplEditAppendStr(pTdgtSmplEdit,buf,len)551 int TdgtSmplEditAppendStr(pTdgtSmplEdit, buf, len)
552    TdgtSmplEdit *pTdgtSmplEdit;
553    char *buf;
554    int len;
555    /* return TRUE if something changed */
556 {
557    char *psz=NULL;
558 
559    if (len == 0 || *buf == '\0') return FALSE;
560 
561    /* Note: dyn_str.sz includes the '\0' */
562    psz = (char*)malloc(pTdgtSmplEdit->pti->tci.dyn_str.sz+len);
563 
564    if (psz == NULL) FailAllocMessage();
565    strcpy(psz, pTdgtSmplEdit->pti->tci.dyn_str.s);
566    strncpy(&psz[pTdgtSmplEdit->pti->tci.dyn_str.sz-1], buf, len);
567    psz[pTdgtSmplEdit->pti->tci.dyn_str.sz-1+len] = '\0';
568 
569    DynStrSet(&(pTdgtSmplEdit->pti->tci.dyn_str), psz);
570    free(psz);
571 
572    RedrawTdgtSmplEdit(pTdgtSmplEdit->pti);
573 
574    return TRUE;
575 }
576 
577 /* --------------------- TdgtSmplEditDelLastChar() --------------------- */
578 
TdgtSmplEditDelLastChar(pTdgtSmplEdit)579 int TdgtSmplEditDelLastChar(pTdgtSmplEdit)
580    TdgtSmplEdit *pTdgtSmplEdit;
581    /* return TRUE if something changed */
582 {
583    int len=pTdgtSmplEdit->pti->tci.dyn_str.sz-1;
584 
585    if (len <= 0) return FALSE;
586 
587    pTdgtSmplEdit->pti->tci.dyn_str.s[len-1] = '\0';
588    pTdgtSmplEdit->pti->tci.dyn_str.sz = len;
589 
590    RedrawTdgtSmplEdit(pTdgtSmplEdit->pti);
591 
592    return TRUE;
593 }
594 
595 /* --------------------- TdgtSmplEditSetFocus() --------------------- */
596 
597 static
TdgtSmplEditShowCursor(pTdgtSmplEdit,show)598 int TdgtSmplEditShowCursor(pTdgtSmplEdit, show)
599    TdgtSmplEdit *pTdgtSmplEdit;
600    int show;
601    /* return TRUE if changed */
602 {
603    if (pTdgtSmplEdit->cursor_shown != show) {
604       pTdgtSmplEdit->cursor_shown = show;
605       return TRUE;
606    }
607    return FALSE;
608 }
609 
TdgtSmplEditSetFocus(pTdgtSmplEdit,nSet)610 void TdgtSmplEditSetFocus(pTdgtSmplEdit, nSet)
611    TdgtSmplEdit *pTdgtSmplEdit;
612    int nSet;
613 {
614    if (TdgtSmplEditShowCursor(pTdgtSmplEdit, nSet)) {
615       if (nSet) {
616          TidgetSetHasFocus(TRUE);
617          TidgetSetFocusWindow(pTdgtSmplEdit->pti->tci.win);
618       } else {
619          TidgetSetHasFocus(FALSE);
620          TidgetSetFocusWindow(None);
621       }
622       RedrawTdgtSmplEdit(pTdgtSmplEdit->pti);
623    }
624 }
625 
626 /* --------------------- Init & Clean Up --------------------- */
627 
InitTdgtSmplEdit()628 int InitTdgtSmplEdit()
629 {
630    return TRUE;
631 }
632 
CleanUpTdgtSmplEdit()633 void CleanUpTdgtSmplEdit()
634 {
635 }
636 
637