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