1 /***********************************************************************/
2 /* Open Visualization Data Explorer */
3 /* (C) Copyright IBM Corp. 1989,1999 */
4 /* ALL RIGHTS RESERVED */
5 /* This code licensed under the */
6 /* "IBM PUBLIC LICENSE - Open Visualization Data Explorer" */
7 /***********************************************************************/
8
9 #include <dxconfig.h>
10 #include "../base/defines.h"
11
12
13 #include <X11/Xlib.h>
14 #include <X11/Xatom.h>
15
16 #include <X11/StringDefs.h>
17 #include <Xm/Xm.h>
18 #include <Xm/DialogS.h>
19 #include <Xm/List.h>
20 #include <Xm/Label.h>
21 #include <Xm/Form.h>
22 #include <Xm/Frame.h>
23 #include <Xm/PushB.h>
24 #include <Xm/SeparatoG.h>
25 #include <Xm/Separator.h>
26 #include <Xm/ScrolledW.h>
27 #include <Xm/BulletinB.h>
28
29 #include "Application.h"
30 #include "ColormapAddCtlDialog.h"
31 #include "ColormapEditor.h"
32 #include "ColormapNode.h"
33 #include "WarningDialogManager.h"
34
35 #include "../widgets/Stepper.h"
36 #include "../widgets/ColorMapEditor.h"
37
38 Boolean ColormapAddCtlDialog::ClassInitialized = FALSE;
39
40 String ColormapAddCtlDialog::DefaultResources[] = {
41 "*dialogTitle: Add Control Points",
42 "*addButton.labelString: Add",
43 "*closeButton.labelString: Close",
44 "*accelerators: #augment\n"
45 "<Key>Return: BulletinBoardReturn()",
46 NULL
47 };
48
ColormapAddCtlDialog(Widget parent,ColormapEditor * editor)49 ColormapAddCtlDialog::ColormapAddCtlDialog(Widget parent,
50 ColormapEditor* editor)
51 : Dialog("addControlPoints", parent)
52 {
53 this->editor = editor;
54
55 if (NOT ColormapAddCtlDialog::ClassInitialized)
56 {
57 ColormapAddCtlDialog::ClassInitialized = TRUE;
58 this->installDefaultResources(theApplication->getRootWidget());
59 }
60 }
61
~ColormapAddCtlDialog()62 ColormapAddCtlDialog::~ColormapAddCtlDialog()
63 {
64
65 }
66
67
68 //
69 // Install the default resources for this class.
70 //
installDefaultResources(Widget baseWidget)71 void ColormapAddCtlDialog::installDefaultResources(Widget baseWidget)
72 {
73 this->setDefaultResources(baseWidget,
74 ColormapAddCtlDialog::DefaultResources);
75 this->Dialog::installDefaultResources( baseWidget);
76 }
createDialog(Widget parent)77 Widget ColormapAddCtlDialog::createDialog(Widget parent)
78 {
79 Arg arg[10];
80 Widget sep;
81 double min = 0.0;
82 double max = 1.0;
83 double inc = 0.05;
84 double min_level = 0.0;
85 int n = 0;
86
87 XtSetArg(arg[n], XmNdialogStyle, XmDIALOG_MODELESS); n++;
88 XtSetArg(arg[n], XmNwidth, 450); n++;
89 XtSetArg(arg[n], XmNheight, 120); n++;
90 XtSetArg(arg[n], XmNresizePolicy, XmRESIZE_GROW); n++;
91 XtSetArg(arg[n], XmNautoUnmanage, False); n++;
92
93 Widget form = this->CreateMainForm(parent, this->name, arg, n);
94 #ifdef PASSDOUBLEVALUE
95 XtArgVal dx_l1, dx_l2, dx_l3, dx_l4;
96 #endif
97
98 this->levellabel =
99 XtVaCreateManagedWidget("dataValueLabel",
100 xmLabelWidgetClass, form,
101 XmNtopOffset, 10,
102 XmNleftOffset, 10,
103 XmNbottomOffset, 10,
104 XmNtopAttachment, XmATTACH_FORM,
105 XmNleftAttachment, XmATTACH_FORM,
106 XmNalignment, XmALIGNMENT_BEGINNING,
107 NULL);
108
109 this->levelstepper =
110 XtVaCreateManagedWidget("lStepper", xmStepperWidgetClass, form,
111 XmNtopOffset, 10,
112 XmNleftOffset, 10,
113 XmNrightOffset, 10,
114 XmNbottomOffset, 10,
115 XmNtopAttachment, XmATTACH_FORM,
116 XmNrightAttachment, XmATTACH_FORM,
117 XmNdataType, DOUBLE,
118 XmNdMinimum, DoubleVal(min, dx_l1),
119 XmNdMaximum, DoubleVal(max, dx_l2),
120 XmNdValueStep, DoubleVal(inc, dx_l3),
121 XmNdecimalPlaces, 5,
122 XmNdValue, DoubleVal(min_level, dx_l4),
123 XmNfixedNotation, False,
124 NULL);
125
126 // pin the labels to the steppers so that longer text isn't munged
127 // gresh560
128 XtVaSetValues (this->levellabel, XmNrightAttachment, XmATTACH_WIDGET,
129 XmNrightWidget, this->levelstepper, XmNrightOffset, 10, NULL);
130
131 this->valuelabel =
132 XtVaCreateManagedWidget("valueLabel",
133 xmLabelWidgetClass, form,
134 XmNtopOffset, 10,
135 XmNleftOffset, 10,
136 XmNbottomOffset, 10,
137 XmNtopAttachment, XmATTACH_WIDGET,
138 XmNtopWidget, this->levelstepper,
139 XmNleftAttachment, XmATTACH_FORM,
140 XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET,
141 XmNrightWidget, this->levellabel,
142 XmNalignment, XmALIGNMENT_BEGINNING,
143 NULL);
144
145 this->valuestepper =
146 XtVaCreateManagedWidget("vStepper", xmStepperWidgetClass, form,
147 XmNtopOffset, 10,
148 XmNleftOffset, 10,
149 XmNrightOffset, 10,
150 XmNbottomOffset, 10,
151 XmNtopAttachment, XmATTACH_WIDGET,
152 XmNtopWidget, this->levelstepper,
153 XmNrightAttachment, XmATTACH_FORM,
154 XmNdataType, DOUBLE,
155 XmNdMinimum, DoubleVal(min, dx_l1),
156 XmNdMaximum, DoubleVal(max, dx_l2),
157 XmNdValueStep, DoubleVal(inc, dx_l3),
158 XmNdecimalPlaces, 5,
159 XmNdValue, DoubleVal(min_level, dx_l4),
160 XmNfixedNotation, False,
161 NULL);
162
163
164 sep = XtVaCreateManagedWidget("sep:", xmSeparatorWidgetClass, form,
165 XmNtopOffset, 10,
166 XmNleftOffset, 2,
167 XmNrightOffset, 2,
168 XmNtopAttachment, XmATTACH_WIDGET,
169 XmNtopWidget, this->valuestepper,
170 XmNleftAttachment, XmATTACH_FORM,
171 XmNrightAttachment, XmATTACH_FORM,
172 NULL);
173
174 this->addbtn =
175 XtVaCreateManagedWidget("addButton",
176 xmPushButtonWidgetClass, form,
177 XmNwidth, 70,
178 XmNtopOffset, 10,
179 XmNleftOffset, 10,
180 XmNtopAttachment, XmATTACH_WIDGET,
181 XmNtopWidget, sep,
182 XmNtopOffset, 10,
183 XmNleftAttachment, XmATTACH_FORM,
184 XmNbottomAttachment, XmATTACH_FORM,
185 XmNbottomOffset, 10,
186 NULL);
187
188 this->cancel =
189 XtVaCreateManagedWidget("closeButton",
190 xmPushButtonWidgetClass, form,
191 XmNwidth, 70,
192 XmNtopOffset, 10,
193 XmNrightOffset, 10,
194 XmNtopAttachment, XmATTACH_WIDGET,
195 XmNtopWidget, sep,
196 XmNtopOffset, 10,
197 XmNrightAttachment, XmATTACH_FORM,
198 XmNbottomAttachment, XmATTACH_FORM,
199 XmNbottomOffset, 10,
200 NULL);
201
202 XtAddCallback(this->addbtn,
203 XmNactivateCallback,
204 (XtCallbackProc)ColormapAddCtlDialog_AddCB,
205 (XtPointer)this);
206
207 XtAddCallback(this->valuestepper,
208 XmNwarningCallback,
209 (XtCallbackProc)ColormapAddCtlDialog_ValueRangeCB,
210 (XtPointer)this);
211
212 XtAddCallback(this->levelstepper,
213 XmNwarningCallback,
214 (XtCallbackProc)ColormapAddCtlDialog_LevelRangeCB,
215 (XtPointer)this);
216
217
218 this->setStepper();
219 this->setFieldLabel(HUE);
220
221 return form;
222 }
223
setStepper()224 void ColormapAddCtlDialog::setStepper()
225 {
226 double step, min, max;
227 ColormapNode* node;
228 char str[100];
229
230 node = this->editor->getColormapNode();
231
232 max = node->getMaximumValue();
233 min = node->getMinimumValue();
234
235 step = (max - min)/100;
236
237 #ifdef PASSDOUBLEVALUE
238 XtArgVal dx_l1, dx_l2, dx_l3;
239 #endif
240
241 XtVaSetValues(this->levelstepper,
242 XmNdMinimum, DoubleVal(min, dx_l1),
243 XmNdMaximum, DoubleVal(max, dx_l2),
244 XmNdValueStep, DoubleVal(step, dx_l3),
245 NULL);
246
247 sprintf(str, "Data value(%g to %g):", min, max);
248 XmString xmstr = XmStringCreateSimple(str);
249 XtVaSetValues(this->levellabel, XmNlabelString, xmstr, NULL);
250 XmStringFree(xmstr);
251 }
252
setFieldLabel(int selected_area)253 void ColormapAddCtlDialog::setFieldLabel(int selected_area)
254 {
255 XmString xmstr = NULL;
256
257 switch(selected_area)
258 {
259 case HUE:
260 xmstr = XmStringCreateSimple("Hue value(0.0 to 1.0):");
261 break;
262 case SATURATION:
263 xmstr = XmStringCreateSimple("Saturation value(0.0 to 1.0):");
264 break;
265 case VALUE:
266 xmstr = XmStringCreateSimple("Value value(0.0 to 1.0):");
267 break;
268 case OPACITY:
269 xmstr = XmStringCreateSimple("Opacity value(0.0 to 1.0):");
270 break;
271 }
272 XtVaSetValues(this->valuelabel,
273 XmNlabelString, xmstr,
274 NULL);
275 XmStringFree(xmstr);
276 }
277
ColormapAddCtlDialog_AddCB(Widget widget,XtPointer clientData,XtPointer callData)278 extern "C" void ColormapAddCtlDialog_AddCB(Widget widget,
279 XtPointer clientData,
280 XtPointer callData)
281 {
282 double level;
283 double value;
284
285 ASSERT(widget);
286 ASSERT(callData);
287 ASSERT(clientData);
288 ColormapAddCtlDialog *data = (ColormapAddCtlDialog*) clientData;
289
290 XtVaGetValues(data->levelstepper, XmNdValue, &level, NULL);
291 XtVaGetValues(data->valuestepper, XmNdValue, &value, NULL);
292 CMEAddControlPoint(data->editor->getEditor(), level, value, True);
293 }
294
ColormapAddCtlDialog_ValueRangeCB(Widget widget,XtPointer clientData,XtPointer callData)295 extern "C" void ColormapAddCtlDialog_ValueRangeCB(Widget widget,
296 XtPointer clientData,
297 XtPointer callData)
298 {
299 ASSERT(widget);
300 ASSERT(clientData);
301
302 WarningMessage("Values must be in the range 0.0 to 1.0");
303 }
304
ColormapAddCtlDialog_LevelRangeCB(Widget widget,XtPointer clientData,XtPointer callData)305 extern "C" void ColormapAddCtlDialog_LevelRangeCB(Widget widget,
306 XtPointer clientData,
307 XtPointer callData)
308 {
309 ASSERT(widget);
310 ASSERT(clientData);
311 ColormapAddCtlDialog *dialog = (ColormapAddCtlDialog*) clientData;
312 ColormapNode* node;
313
314 node = dialog->editor->getColormapNode();
315
316 WarningMessage("Values must be in the range %g to %g",
317 node->getMinimumValue(), node->getMaximumValue());
318 }
319