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