1 /* $Id$ $Revision$ */
2 /* vim:set shiftwidth=4 ts=8: */
3 
4 /*************************************************************************
5  * Copyright (c) 2011 AT&T Intellectual Property
6  * All rights reserved. This program and the accompanying materials
7  * are made available under the terms of the Eclipse Public License v1.0
8  * which accompanies this distribution, and is available at
9  * http://www.eclipse.org/legal/epl-v10.html
10  *
11  * Contributors: See CVS logs. Details at http://www.graphviz.org/
12  *************************************************************************/
13 
14 /* Lefteris Koutsofios - AT&T Labs Research */
15 
16 #include "common.h"
17 #include "g.h"
18 #include "gcommon.h"
19 #include "mem.h"
20 
21 #define WTU widget->u.t
22 
GTcreatewidget(Gwidget_t * parent,Gwidget_t * widget,int attrn,Gwattr_t * attrp)23 int GTcreatewidget (
24     Gwidget_t *parent, Gwidget_t *widget, int attrn, Gwattr_t *attrp
25 ) {
26     PIXsize_t ps;
27     DWORD wflags;
28     char *s;
29     int ai;
30 
31     if (!parent) {
32         Gerr (POS, G_ERRNOPARENTWIDGET);
33         return -1;
34     }
35     wflags = WS_CHILDWINDOW;
36     WTU->func = NULL;
37     ps.x = ps.y = MINTWSIZE;
38     s = "";
39     for (ai = 0; ai < attrn; ai++) {
40         switch (attrp[ai].id) {
41         case G_ATTRSIZE:
42             GETSIZE (attrp[ai].u.s, ps, MINTWSIZE);
43             break;
44         case G_ATTRBORDERWIDTH:
45             wflags |= WS_BORDER;
46             break;
47         case G_ATTRTEXT:
48             s = attrp[ai].u.t;
49             break;
50         case G_ATTRAPPENDTEXT:
51             Gerr (POS, G_ERRCANNOTSETATTR1, "appendtext");
52             return -1;
53         case G_ATTRMODE:
54             if (
55                 strcmp ("oneline", attrp[ai].u.t) != 0 &&
56                 strcmp ("input", attrp[ai].u.t) != 0 &&
57                 strcmp ("output", attrp[ai].u.t) != 0
58             ) {
59                 Gerr (POS, G_ERRBADATTRVALUE, attrp[ai].u.t);
60                 return -1;
61             }
62             break;
63         case G_ATTRWINDOWID:
64             Gerr (POS, G_ERRCANNOTSETATTR1, "windowid");
65             return -1;
66         case G_ATTRNEWLINECB:
67             WTU->func = attrp[ai].u.func;
68             break;
69         case G_ATTRUSERDATA:
70             widget->udata = attrp[ai].u.u;
71             break;
72         default:
73             Gerr (POS, G_ERRBADATTRID, attrp[ai].id);
74             return -1;
75         }
76     }
77     Gadjustwrect (parent, &ps);
78     wflags |= (ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL);
79     if (ps.y > 40)
80         wflags |= (WS_HSCROLL | WS_VSCROLL);
81     if (!(widget->w = CreateWindow (
82         "EDIT", s, wflags, 0, 0, ps.x, ps.y,
83         parent->w, (HMENU) (widget - &Gwidgets[0]), hinstance, NULL
84     ))) {
85         Gerr (POS, G_ERRCANNOTCREATEWIDGET);
86         return -1;
87     }
88     ShowWindow (widget->w, SW_SHOW);
89     UpdateWindow (widget->w);
90     if (parent && parent->type == G_ARRAYWIDGET)
91         Gawinsertchild (parent, widget);
92     return 0;
93 }
94 
GTsetwidgetattr(Gwidget_t * widget,int attrn,Gwattr_t * attrp)95 int GTsetwidgetattr (Gwidget_t *widget, int attrn, Gwattr_t *attrp) {
96     Gwidget_t *parent;
97     PIXsize_t ps;
98     DWORD wflags1;
99     int ai;
100 
101     parent = (widget->pwi == -1) ? NULL : &Gwidgets[widget->pwi];
102     wflags1 = SWP_NOMOVE | SWP_NOZORDER;
103     for (ai = 0; ai < attrn; ai++) {
104         switch (attrp[ai].id) {
105         case G_ATTRSIZE:
106             GETSIZE (attrp[ai].u.s, ps, MINTWSIZE);
107             Gadjustwrect (parent, &ps);
108             SetWindowPos (widget->w, (HWND) NULL, 0, 0, ps.x, ps.y, wflags1);
109             break;
110         case G_ATTRBORDERWIDTH:
111             Gerr (POS, G_ERRCANNOTSETATTR2, "borderwidth");
112             return -1;
113         case G_ATTRTEXT:
114             Gnocallbacks = TRUE;
115             SendMessage (widget->w, WM_SETTEXT, 0, "");
116             SendMessage (widget->w, EM_SETSEL, -1, 32760);
117             SendMessage (widget->w, EM_REPLACESEL, 0, (LPARAM) attrp[ai].u.t);
118             SendMessage (widget->w, EM_SETSEL, -1, 32760);
119 #if 0
120             SendMessage (widget->w, EM_REPLACESEL, 0, (LPARAM) "\r\n");
121             SendMessage (widget->w, EM_SETSEL, -1, 32760);
122 #endif
123             Gnocallbacks = FALSE;
124             break;
125         case G_ATTRAPPENDTEXT:
126             Gnocallbacks = TRUE;
127             SendMessage (widget->w, EM_SETSEL, -1, 32760);
128             SendMessage (widget->w, EM_REPLACESEL, 0, (LPARAM) attrp[ai].u.t);
129             SendMessage (widget->w, EM_SETSEL, -1, 32760);
130             SendMessage (widget->w, EM_REPLACESEL, 0, (LPARAM) "\r\n");
131             SendMessage (widget->w, EM_SETSEL, -1, 32760);
132             Gnocallbacks = FALSE;
133             break;
134         case G_ATTRMODE:
135             if (
136                 strcmp ("oneline", attrp[ai].u.t) != 0 &&
137                 strcmp ("input", attrp[ai].u.t) != 0 &&
138                 strcmp ("output", attrp[ai].u.t) != 0
139             ) {
140                 Gerr (POS, G_ERRBADATTRVALUE, attrp[ai].u.t);
141                 return -1;
142             }
143             break;
144         case G_ATTRWINDOWID:
145             Gerr (POS, G_ERRCANNOTSETATTR2, "windowid");
146             return -1;
147         case G_ATTRUSERDATA:
148             widget->udata = attrp[ai].u.u;
149             break;
150         default:
151             Gerr (POS, G_ERRBADATTRID, attrp[ai].id);
152             return -1;
153         }
154     }
155     return 0;
156 }
157 
GTgetwidgetattr(Gwidget_t * widget,int attrn,Gwattr_t * attrp)158 int GTgetwidgetattr (Gwidget_t *widget, int attrn, Gwattr_t *attrp) {
159     RECT r;
160     int rtn, ai, i, j;
161 
162     for (ai = 0; ai < attrn; ai++) {
163         switch (attrp[ai].id) {
164         case G_ATTRSIZE:
165             GetWindowRect (widget->w, &r);
166             attrp[ai].u.s.x = r.right - r.left;
167             attrp[ai].u.s.y = r.bottom - r.top;
168             break;
169         case G_ATTRBORDERWIDTH:
170             Gerr (POS, G_ERRCANNOTGETATTR, "borderwidth");
171             return -1;
172         case G_ATTRTEXT:
173             if ((rtn = GetWindowTextLength (widget->w)) + 1 > Gbufn) {
174                 Gbufp = Marraygrow (Gbufp, (long) (rtn + 1) * BUFSIZE);
175                 Gbufn = rtn + 1;
176             }
177             GetWindowText (widget->w, &Gbufp[0], Gbufn - 1);
178             for (i = 0, j = 0; Gbufp[i]; i++)
179                 if (Gbufp[i] != '\r')
180                     Gbufp[j++] = Gbufp[i];
181             Gbufp[j++] = 0;
182             attrp[ai].u.t = &Gbufp[0];
183             break;
184         case G_ATTRAPPENDTEXT:
185             Gerr (POS, G_ERRCANNOTGETATTR, "appendtext");
186             return -1;
187         case G_ATTRMODE:
188             attrp[ai].u.t = "oneline";
189             break;
190         case G_ATTRWINDOWID:
191             sprintf (&Gbufp[0], "0x%lx", widget->w);
192             attrp[ai].u.t = &Gbufp[0];
193             break;
194         case G_ATTRNEWLINECB:
195             attrp[ai].u.func = WTU->func;
196             break;
197         case G_ATTRUSERDATA:
198             attrp[ai].u.u = widget->udata;
199             break;
200         default:
201             Gerr (POS, G_ERRBADATTRID, attrp[ai].id);
202             return -1;
203         }
204     }
205     return 0;
206 }
207 
GTdestroywidget(Gwidget_t * widget)208 int GTdestroywidget (Gwidget_t *widget) {
209     Gwidget_t *parent;
210 
211     parent = (widget->pwi == -1) ? NULL : &Gwidgets[widget->pwi];
212     if (parent && parent->type == G_ARRAYWIDGET)
213         Gawdeletechild (parent, widget);
214     DestroyWindow (widget->w);
215     return 0;
216 }
217