1 /********************************************************************
2 This file is part of the abs 0.907 distribution. abs is a spreadsheet
3 with graphical user interface.
4
5 Copyright (C) 1998-2001 Andr� Bertin (Andre.Bertin@ping.be)
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version if in the same spirit as version 2.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21 Concact: abs@pi.be
22 http://home.pi.be/bertin/abs.shtml
23
24 *********************************************************************/
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 #include "param.h"
52 #include "memory.h"
53 #include "gr_interf.h"
54 #include <stdio.h>
55
56 Arg w_args[50];
57 int w_n;
58
59
60 int
w_arg(String Name,XtArgVal Value)61 w_arg (String Name, XtArgVal Value)
62 {
63 XtSetArg (w_args[w_n], Name, Value);
64 w_n++;
65 return w_n;
66 }
67
68 int
w_set(Widget w)69 w_set (Widget w)
70 {
71 XtSetValues (w, w_args, w_n);
72 return w_n;
73 }
74
75 int
w_rel(Widget w,int x,int y)76 w_rel (Widget w, int x, int y)
77 {
78 XtSetArg (w_args[w_n], XtNfromHoriz, w);
79 w_n++;
80 XtSetArg (w_args[w_n], XtNfromVert, w);
81 w_n++;
82 XtSetArg (w_args[w_n], XtNhorizDistance, x);
83 w_n++;
84 XtSetArg (w_args[w_n], XtNvertDistance, y);
85 w_n++;
86 return w_n;
87 }
88
89 int
w_relh(Widget w,int x)90 w_relh (Widget w, int x)
91 {
92 XtSetArg (w_args[w_n], XtNfromHoriz, w);
93 w_n++;
94 XtSetArg (w_args[w_n], XtNhorizDistance, x);
95 w_n++;
96 return w_n;
97 }
98
99 int
w_relv(Widget w,int y)100 w_relv (Widget w, int y)
101 {
102 XtSetArg (w_args[w_n], XtNfromVert, w);
103 w_n++;
104 XtSetArg (w_args[w_n], XtNvertDistance, y);
105 w_n++;
106 return w_n;
107 }
108
109
110 int
w_dim(int x,int y)111 w_dim (int x, int y)
112 {
113 XtSetArg (w_args[w_n], XtNwidth, x);
114 w_n++;
115 XtSetArg (w_args[w_n], XtNheight, y);
116 w_n++;
117 return w_n;
118 }
119
120 int
w_bord(int l)121 w_bord (int l)
122 {
123 XtSetArg (w_args[w_n], XtNborderWidth, l);
124 w_n++;
125 return w_n;
126 }
127
128 int
w_inbord(int l)129 w_inbord (int l)
130 {
131 XtSetArg (w_args[w_n], XtNinternalBorderWidth, l);
132 w_n++;
133 return w_n;
134 }
135
136 int
w_noresize()137 w_noresize ()
138 {
139 XtSetArg (w_args[w_n], XtNleft, XtChainLeft);
140 w_n++;
141 XtSetArg (w_args[w_n], XtNright, XtChainLeft);
142 w_n++;
143 XtSetArg (w_args[w_n], XtNtop, XtChainTop);
144 w_n++;
145 XtSetArg (w_args[w_n], XtNbottom, XtChainTop);
146 w_n++;
147
148 return w_n;
149 }
150
151 int
w_novresize()152 w_novresize ()
153 {
154 XtSetArg (w_args[w_n], XtNtop, XtChainTop);
155 w_n++;
156 XtSetArg (w_args[w_n], XtNbottom, XtChainTop);
157 w_n++;
158
159 return w_n;
160 }
161
162 int
w_novresizebot()163 w_novresizebot ()
164 {
165 XtSetArg (w_args[w_n], XtNtop, XtChainBottom);
166 w_n++;
167 XtSetArg (w_args[w_n], XtNbottom, XtChainBottom);
168 w_n++;
169
170 return w_n;
171 }
172
173
174 int
w_nohresize()175 w_nohresize ()
176 {
177 XtSetArg (w_args[w_n], XtNleft, XtChainLeft);
178 w_n++;
179 XtSetArg (w_args[w_n], XtNright, XtChainLeft);
180 w_n++;
181
182 return w_n;
183 }
184
185 int
w_vresize()186 w_vresize ()
187 {
188 XtSetArg (w_args[w_n], XtNtop, XtChainTop);
189 w_n++;
190 XtSetArg (w_args[w_n], XtNbottom, XtChainBottom);
191 w_n++;
192
193 return w_n;
194 }
195
196 int
w_hresize()197 w_hresize ()
198 {
199 XtSetArg (w_args[w_n], XtNleft, XtChainLeft);
200 w_n++;
201 XtSetArg (w_args[w_n], XtNright, XtChainRight);
202 w_n++;
203
204 return w_n;
205 }
206
207 int
w_bONw()208 w_bONw ()
209 {
210 XtSetArg (w_args[w_n], XtNbackground, abswhite);
211 w_n++;
212 XtSetArg (w_args[w_n], XtNforeground, absblack);
213 w_n++;
214 return w_n;
215 }
216
217
218
219
220 Widget
CreateLabel(Widget base,char * label,int x,int y,int w,int h)221 CreateLabel (Widget base, char *label, int x, int y, int w, int h)
222 {
223
224 w_n = 0;
225 w_dim (w, h);
226 w_rel (NULL, x, y);
227 XtSetArg (w_args[w_n], XtNborderWidth, 0);
228 w_n++;
229 XtSetArg (w_args[w_n], XtNlabel, label);
230 w_n++;
231 XtSetArg (w_args[w_n], XtNjustify, XtJustifyLeft);
232 w_n++;
233 return XtCreateManagedWidget
234 (label, labelWidgetClass, base, w_args, w_n);
235 }
236
237 Widget
CreateText(Widget base,char * label,int x,int y,int w,int h)238 CreateText (Widget base, char *label, int x, int y, int w, int h)
239 {
240 w_n = 0;
241 w_dim (w, h);
242 w_rel (NULL, x, y);
243 XtSetArg (w_args[w_n], XtNborderWidth, 0);
244 w_n++;
245 XtSetArg (w_args[w_n], XtNjustify, XtJustifyLeft);
246 w_n++;
247 XtSetArg (w_args[w_n], XtNeditType, XawtextEdit);
248 w_n++;
249 XtSetArg (w_args[w_n], XtNscrollVertical, XawtextScrollWhenNeeded);
250 w_n++;
251 XtSetArg (w_args[w_n], XtNscrollHorizontal, XawtextScrollWhenNeeded);
252 w_n++;
253 return XtCreateManagedWidget
254 (label, asciiTextWidgetClass, base, w_args, w_n);
255 }
256
257 void
TextPrintf(Widget w,char * str)258 TextPrintf (Widget w, char *str)
259 {
260 w_n = 0;
261 XtSetArg (w_args[w_n], XtNstring, str);
262 w_n++;
263 XtSetArg (w_args[w_n], XtNeditType, XawtextRead);
264 w_n++;
265 XtSetValues (w, w_args, w_n);
266
267 XawTextDisplayCaret (w, False);
268
269 XawTextSetInsertionPoint (w, 0);
270 }
271
272
273
274 static char alltextTranslations[] = "\
275 <Key>Home: beginning-of-line() \n\
276 <Key>End: end-of-line() \n\
277 <Key>Right: forward-character() \n\
278 <Key>Left: backward-character() \n\
279 <Key>Down: next-line() \n\
280 <Key>Up: previous-line() \n\
281 <Key>BackSpace: delete-previous-character() \n\
282 <Key>Delete: delete-next-character() \n\
283 <Key>Linefeed: newline-and-indent() \n\
284 <Key>Return: newline() \n\
285 <Key>: insert-char() \n\
286 <FocusIn>: focus-in() \n\
287 <FocusOut>: focus-out() \n\
288 <Btn1Down>: select-start() \n\
289 <Btn1Motion>: extend-adjust() \n\
290 <Btn1Up>: extend-end(PRIMARY, CUT_BUFFER0) \n\
291 <Btn2Down>: insert-selection(PRIMARY, CUT_BUFFER0) \n\
292 <Btn3Down>: extend-start() \n\
293 <Btn3Motion>: extend-adjust() \n\
294 <Btn3Up>: extend-end(PRIMARY, CUT_BUFFER0) \n\
295 ";
296
297 Widget
CreateEntry(Widget base,char * label,int x,int y,int w,int h,char * val)298 CreateEntry (Widget base, char *label, int x, int y, int w, int h, char *val)
299 {
300 Widget ret;
301 XtTranslations trans_table = XtParseTranslationTable (alltextTranslations);
302 w_n = 0;
303 w_dim (w, h);
304 w_rel (NULL, x, y);
305 XtSetArg (w_args[w_n], XtNborderWidth, 0);
306 w_n++;
307 XtSetArg (w_args[w_n], XtNlabel, label);
308 w_n++;
309 XtSetArg (w_args[w_n], XtNjustify, XtJustifyLeft);
310 w_n++;
311 XtSetArg (w_args[w_n], XtNstring, val);
312 w_n++;
313 XtSetArg (w_args[w_n], XtNinsertPosition, 1);
314 w_n++;
315 XtSetArg (w_args[w_n], XtNeditType, XawtextEdit);
316 w_n++;
317 XtSetArg (w_args[w_n], XtNtranslations, trans_table);
318 w_n++;
319 w_bONw ();
320
321 ret = XtCreateManagedWidget
322 (label, asciiTextWidgetClass, base, w_args, w_n);
323 return ret;
324 }
325
326 int
EntrySetEditable(Widget w,int yes)327 EntrySetEditable (Widget w, int yes)
328 {
329 w_n = 0;
330 if (yes)
331 {
332 XtSetArg (w_args[w_n], XtNeditType, XawtextEdit);
333 w_n++;
334 XawTextDisplayCaret (w, True);
335 }
336 else
337 {
338 XtSetArg (w_args[w_n], XtNeditType, XawtextRead);
339 w_n++;
340 XawTextDisplayCaret (w, False);
341 }
342 w_set (w);
343 return 0;
344 }
345
346 int
EntrySetInsertionPosition(Widget w,int pos)347 EntrySetInsertionPosition (Widget w, int pos)
348 {
349 w_n = 0;
350 XtSetArg (w_args[w_n], XtNinsertPosition, pos);
351 w_set (w);
352 return 0;
353 }
354
355
356 int
SetEntryString(Widget w,char * buf)357 SetEntryString (Widget w, char *buf)
358 {
359 w_n = 0;
360 XtSetArg (w_args[w_n], XtNstring, buf);
361 w_n++;
362 XtSetValues (w, w_args, w_n);
363 return 0;
364 }
365
366 char *
GetEntryString(Widget w)367 GetEntryString (Widget w)
368 {
369 char *buf;
370
371 w_n = 0;
372 XtSetArg (w_args[w_n], XtNstring, &buf);
373 w_n++;
374 XtGetValues (w, w_args, w_n);
375
376 return buf;
377 }
378
379
380 int
SetEntryVal(Widget w,double val)381 SetEntryVal (Widget w, double val)
382 {
383 char buf[256];
384 sprintf (buf, "%g", val);
385 w_n = 0;
386 XtSetArg (w_args[w_n], XtNstring, buf);
387 w_n++;
388 XtSetValues (w, w_args, w_n);
389 return 0;
390 }
391
392 double
GetEntryVal(Widget w)393 GetEntryVal (Widget w)
394 {
395 char *buf;
396 double val;
397
398 w_n = 0;
399 XtSetArg (w_args[w_n], XtNstring, &buf);
400 w_n++;
401 XtGetValues (w, w_args, w_n);
402
403 sscanf (buf, "%lf", &val);
404
405 return val;
406 }
407
408
409
410 int
insertstring(Widget w,char * str)411 insertstring (Widget w, char *str)
412 {
413 XawTextBlock text;
414 long p = XawTextGetInsertionPoint (w);
415 text.firstPos = 0;
416 text.length = strlen (str);
417 text.ptr = str;
418 XawTextReplace (w, p, p, &text);
419 XawTextSetInsertionPoint (w, p + text.length);
420
421
422 return 0;
423 }
424
425 int
moveinsertionpoint(Widget w,int delta)426 moveinsertionpoint (Widget w, int delta)
427 {
428 int len;
429 XawTextPosition p;
430 char *str = GetEntryString (w);
431 if (str == NULL)
432 return -1;
433 len = strlen (str);
434 p = XawTextGetInsertionPoint (w);
435 if (p + delta >= len && p + delta < 0)
436 return -2;
437
438 XawTextSetInsertionPoint (w, p + delta);
439 return 0;
440 }
441
442 int
EntryDelChr(Widget t)443 EntryDelChr (Widget t)
444 {
445 long p;
446 int l, i;
447 char *str;
448 char *tmp;
449
450 str = GetEntryString (t);
451 if (str == NULL)
452 return -1;
453
454 l = strlen (str);
455 if (l <= 0)
456 return -2;
457 tmp = (char *) absmalloc (sizeof (char) * l + 1, "EntryString_delete:tmp");
458 strcpy (tmp, str);
459
460 p = XawTextGetInsertionPoint (t);
461 if (p == l)
462 return -3;
463
464 for (i = p; i < l - 1; i++)
465 tmp[i] = tmp[i + 1];
466 tmp[l - 1] = '\0';
467
468 SetEntryString (t, tmp);
469 XawTextSetInsertionPoint (t, p);
470
471 return 0;
472 }
473
474 int
EntryBackChr(Widget t)475 EntryBackChr (Widget t)
476 {
477 long p;
478 int l, i;
479 char *str;
480 char *tmp;
481
482 str = GetEntryString (t);
483 if (str == NULL)
484 return -1;
485
486 l = strlen (str);
487 if (l <= 0)
488 return -2;
489 tmp = (char *) absmalloc (sizeof (char) * l + 1, "EntryString_delete:tmp");
490 strcpy (tmp, str);
491
492 p = XawTextGetInsertionPoint (t);
493 if (p <= 0)
494 return -3;
495
496 for (i = p - 1; i < l - 1; i++)
497 tmp[i] = tmp[i + 1];
498 tmp[l - 1] = '\0';
499
500 SetEntryString (t, tmp);
501 XawTextSetInsertionPoint (t, p - 1);
502
503 return 0;
504 }
505
506
507
508
509
510
511 void
shadow(Widget widget,XtPointer pointer,XEvent * event,Boolean * ctd)512 shadow (Widget widget, XtPointer pointer, XEvent * event, Boolean * ctd)
513 {
514 int n;
515 Dimension h, w;
516 Widget wi;
517 Arg args[2];
518 wi = (Widget) pointer;
519
520 n = 0;
521 XtSetArg (args[n], XtNheight, &h);
522 n++;
523 XtSetArg (args[n], XtNwidth, &w);
524 n++;
525 XtGetValues (wi, args, n);
526 w--;
527 h--;
528 desactivate_zoom ();
529 drawline (XtDisplay (wi), XtWindow (wi), 0, 0, 0, w, 0, 0, 0);
530 drawline (XtDisplay (wi), XtWindow (wi), 3, w, 0, w, h, 0, 0);
531 drawline (XtDisplay (wi), XtWindow (wi), 3, w, h, 0, h, 0, 0);
532 drawline (XtDisplay (wi), XtWindow (wi), 0, 0, h, 0, 0, 0, 0);
533 reactivate_zoom ();
534
535 }
536
537 void
shadow2(Widget widget,XtPointer pointer,XEvent * event,Boolean * ctd)538 shadow2 (Widget widget, XtPointer pointer, XEvent * event, Boolean * ctd)
539 {
540 int n;
541 Dimension h, w;
542 Widget wi;
543 Arg args[2];
544 wi = (Widget) pointer;
545
546 n = 0;
547 XtSetArg (args[n], XtNheight, &h);
548 n++;
549 XtSetArg (args[n], XtNwidth, &w);
550 n++;
551 XtGetValues (wi, args, n);
552 w--;
553 h--;
554 desactivate_zoom ();
555 drawline (XtDisplay (wi), XtWindow (wi), 3, 0, 0, w, 0, 0, 0);
556 drawline (XtDisplay (wi), XtWindow (wi), 0, w, 0, w, h, 0, 0);
557 drawline (XtDisplay (wi), XtWindow (wi), 0, w, h, 0, h, 0, 0);
558 drawline (XtDisplay (wi), XtWindow (wi), 3, 0, h, 0, 0, 0, 0);
559 reactivate_zoom ();
560
561 }
562
563 void
shadow3(Widget widget,XtPointer pointer,XEvent * event,Boolean * ctd)564 shadow3 (Widget widget, XtPointer pointer, XEvent * event, Boolean * ctd)
565 {
566 int n;
567 Dimension h, w;
568 Position x, y;
569 Widget wi, parent;
570 Arg args[4];
571 wi = (Widget) pointer;
572 parent = XtParent (wi);
573 n = 0;
574 XtSetArg (args[n], XtNx, &x);
575 n++;
576 XtSetArg (args[n], XtNy, &y);
577 n++;
578 XtSetArg (args[n], XtNheight, &h);
579 n++;
580 XtSetArg (args[n], XtNwidth, &w);
581 n++;
582 XtGetValues (wi, args, n);
583 desactivate_zoom ();
584 drawline (XtDisplay (parent), XtWindow (parent), 3, x - 1, y - 1, x - 1, y + h + 1, 0, 0);
585 drawline (XtDisplay (parent), XtWindow (parent), 0, x - 1, y + h + 1, x + w + 1, y + h + 1, 0, 0);
586 drawline (XtDisplay (parent), XtWindow (parent), 0, x + w + 1, y + h + 1, x + w + 1, y - 1, 0, 0);
587 drawline (XtDisplay (parent), XtWindow (parent), 3, x + w + 1, y - 1, x - 1, y - 1, 0, 0);
588 reactivate_zoom ();
589 }
590
591 void
shadow4(Widget widget,XtPointer pointer,XEvent * event,Boolean * ctd)592 shadow4 (Widget widget, XtPointer pointer, XEvent * event, Boolean * ctd)
593 {
594 int n;
595 Dimension h, w;
596 Position x, y;
597 Widget wi, parent;
598 Arg args[4];
599 wi = (Widget) pointer;
600 parent = XtParent (wi);
601 n = 0;
602 XtSetArg (args[n], XtNx, &x);
603 n++;
604 XtSetArg (args[n], XtNy, &y);
605 n++;
606 XtSetArg (args[n], XtNheight, &h);
607 n++;
608 XtSetArg (args[n], XtNwidth, &w);
609 n++;
610 XtGetValues (wi, args, n);
611 desactivate_zoom ();
612 drawline (XtDisplay (parent), XtWindow (parent), 0, x - 1, y - 1, x - 1, y + h + 1, 0, 0);
613 drawline (XtDisplay (parent), XtWindow (parent), 3, x - 1, y + h + 1, x + w + 1, y + h + 1, 0, 0);
614 drawline (XtDisplay (parent), XtWindow (parent), 3, x + w + 1, y + h + 1, x + w + 1, y - 1, 0, 0);
615 drawline (XtDisplay (parent), XtWindow (parent), 0, x + w + 1, y - 1, x - 1, y - 1, 0, 0);
616 reactivate_zoom ();
617 }
618
619 void
shadow5(Widget widget,XtPointer pointer,XEvent * event,Boolean * ctd)620 shadow5 (Widget widget, XtPointer pointer, XEvent * event, Boolean * ctd)
621 {
622 int n;
623 Dimension h, w;
624 Position x, y;
625 Widget wi, parent;
626 Arg args[4];
627 wi = (Widget) pointer;
628 parent = XtParent (wi);
629 n = 0;
630 XtSetArg (args[n], XtNx, &x);
631 n++;
632 XtSetArg (args[n], XtNy, &y);
633 n++;
634 XtSetArg (args[n], XtNheight, &h);
635 n++;
636 XtSetArg (args[n], XtNwidth, &w);
637 n++;
638 XtGetValues (wi, args, n);
639 desactivate_zoom ();
640 drawline (XtDisplay (parent), XtWindow (parent), 0, x + 3, y + 3, x + 3, y + h - 3, 0, 0);
641 drawline (XtDisplay (parent), XtWindow (parent), 3, x + 3, y + 3, x + w - 3, y + 3, 0, 0);
642 drawline (XtDisplay (parent), XtWindow (parent), 0, x + w - 3, y + 3, x + 3, y + 3, 0, 0);
643 reactivate_zoom ();
644 }
645
646 void
shadow6(Widget widget,XtPointer pointer,XEvent * event,Boolean * ctd)647 shadow6 (Widget widget, XtPointer pointer, XEvent * event, Boolean * ctd)
648 {
649 int n;
650 Dimension h, w;
651 Position x, y;
652 Widget wi, parent;
653 Arg args[4];
654 wi = (Widget) pointer;
655 parent = XtParent (wi);
656 n = 0;
657 XtSetArg (args[n], XtNx, &x);
658 n++;
659 XtSetArg (args[n], XtNy, &y);
660 n++;
661 XtSetArg (args[n], XtNheight, &h);
662 n++;
663 XtSetArg (args[n], XtNwidth, &w);
664 n++;
665 XtGetValues (wi, args, n);
666 desactivate_zoom ();
667 drawline (XtDisplay (parent), XtWindow (parent), 3, x - 2, y - 2, x - 2, y + h + 2, 0, 0);
668 drawline (XtDisplay (parent), XtWindow (parent), 0, x - 2, y + h + 2, x + w + 1, y + h + 2, 0, 0);
669 drawline (XtDisplay (parent), XtWindow (parent), 0, x + w + 2, y + h + 2, x + w + 2, y - 2, 0, 0);
670 drawline (XtDisplay (parent), XtWindow (parent), 3, x + w + 2, y - 2, x - 2, y - 2, 0, 0);
671 reactivate_zoom ();
672 }
673
674
675
676 int
addshadow(Widget w,int type)677 addshadow (Widget w, int type)
678 {
679 switch (type)
680 {
681 case 1:
682 XtAddEventHandler (w,
683 ExposureMask,
684 FALSE,
685 shadow,
686 (caddr_t) w);
687
688
689 break;
690
691 case 2:
692 XtAddEventHandler (w,
693 ExposureMask,
694 FALSE,
695 shadow2,
696 (caddr_t) w);
697 break;
698 case 3:
699 XtAddEventHandler (w,
700
701 VisibilityChangeMask,
702 FALSE,
703 shadow3,
704 (caddr_t) w);
705 break;
706 case 4:
707 {
708 XtAddEventHandler (w,
709 ExposureMask,
710 FALSE,
711 shadow4,
712 (caddr_t) w);
713 }
714 break;
715 case 5:
716 XtAddEventHandler (w,
717 PointerMotionMask,
718 FALSE,
719 shadow5,
720 (caddr_t) w);
721 break;
722 case 6:
723 XtAddEventHandler (w,
724 VisibilityChangeMask,
725 TRUE,
726 shadow6,
727 (caddr_t) w);
728
729
730
731 break;
732
733 }
734 return 0;
735 }
736
737 static char scrollTranslations[] =
738 "<Btn1Down>: StartScroll(Continuous) MoveThumb() NotifyThumb() \n\
739 <Btn2Down>: StartScroll(Continuous) MoveThumb() NotifyThumb() \n\
740 <Btn3Down>: StartScroll(Continuous) MoveThumb() NotifyThumb() \n\
741 <Btn1Motion>: MoveThumb() NotifyThumb() \n\
742 <Btn2Motion>: MoveThumb() NotifyThumb() \n\
743 <Btn3Motion>: MoveThumb() NotifyThumb() \n\
744 <BtnUp>: NotifyScroll(Proportional) EndScroll()";
745
746
747 #include <X11/cursorfont.h>
748
749 int
modscroll(Widget w)750 modscroll (Widget w)
751 {
752 XtTranslations trans_table;
753
754 trans_table = XtParseTranslationTable (scrollTranslations);
755 XtOverrideTranslations (w, trans_table);
756
757 w_n = 0;
758 w_bONw ();
759 w_arg (XtNthumb, None);
760
761
762
763
764 w_set (w);
765 return 0;
766 }
767