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