File: mdialog.c

package info (click to toggle)
scilab 2.2-4
  • links: PTS
  • area: non-free
  • in suites: hamm
  • size: 31,472 kB
  • ctags: 21,963
  • sloc: fortran: 110,983; ansic: 89,717; makefile: 3,016; sh: 1,892; csh: 150; cpp: 101
file content (204 lines) | stat: -rw-r--r-- 5,242 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#include "scilab_d.h"

extern void ShellFormCreate();

static char **str;
static void mDialogWindow();

/* Interface with Scilab */

void C2F(xmdial)(label,ptrlab,nlab,value,ptrv,desc,ptrdesc,nv,res,ptrres,ierr)
     int *label,*ptrlab,*nlab,*value,*ptrv,*desc,*ptrdesc,*nv,*res,*ptrres,*ierr;
{
  int i,nr,nv1,ni;
  char **description,**valueinit,*labels;
  /** int  maxchars= *ierr; Il faudrait utiliser maxchars **/
  *ierr=0;
  /* conversion of scilab characters into strings */
  ScilabMStr2C(label,nlab,ptrlab,&labels,ierr);
  if ( *ierr == 1) return;
  ScilabMStr2CM(desc,nv,ptrdesc,&description,ierr);
  if ( *ierr == 1) return;
  ScilabMStr2CM(value,nv,ptrv,&valueinit,ierr);
  if ( *ierr == 1) return;
  str=(char **) MALLOC( (*nv+1)*sizeof(char *));
  if ( str == ( char **) 0)  {      *ierr = 1; return;}
  nv1= *nv;
  mDialogWindow(labels,description,valueinit,nv);
  FREE(labels);
  for (i=0;i< nv1;i++) FREE(valueinit[i]); FREE(valueinit);
  for (i=0;i< nv1;i++) FREE(description[i]); FREE(description);
  if (*nv!=0)
    {
      int job=0;
      nr=0;
      ptrres[0]=1;
      for (i=1;i<*nv+1;i++) {
	ni=strlen(str[i-1]);
	ptrres[nr+1]=ptrres[nr]+ni;
	nr=nr+1;
	F2C(cvstr)(&ni,res,str[i-1],&job,(long int) 0);
	res+=ni;
	FREE(str[i-1]);
      }
      FREE(str);
    }
}

/* X Window Part */

static Widget  *dialoglist;
extern int ok_Flag_sci;

static XtCallbackProc
mDialogOk(w,nv,callData)
     Widget w;
     caddr_t callData;
     int nv;
{ int ind,i,ns;
  Arg args[2];
  Cardinal iargs;
  String str1,p;
  for (i=0;i<nv;i++) {
    iargs=0;
    XtSetArg(args[iargs], XtNstring, &str1); iargs++ ;
    XtGetValues(dialoglist[i],args,iargs);
    ns=strlen(str1);
    p=(char *) MALLOC((ns+1)*sizeof(char));
    if (p == 0) { Scistring("Malloc : No more place");return;}
    strcpy(p,str1);
    ind = ns - 1 ;
    if (p[ind] == '\n' ) p[ind] = '\0' ;
    str[i]=p;
  }
  FREE(dialoglist);
  ok_Flag_sci = 1;
}

static XtCallbackProc 
mDialogCancel(w,nv,callData)
     Widget w;
     caddr_t callData;
     int  nv;
{ 
  mDialogOk(w,nv,callData);
  ok_Flag_sci = -1;
}

static void 
mDialogWindow(labels,description,valueinit,nv)
     char **description, **valueinit;
     char *labels;
     int *nv;
{
  Arg args[10];
  Cardinal iargs = 0;
  Dimension maxh1,maxw1,maxw2,maxh2,w1,w2,h1,h2;
  int i,mxdesc,mxini,siz;
  Widget shell,label,kform; 
  Widget lviewport, dviewport,dform1,dform,ok,cancel,cform;
  static Display *dpy = (Display *) NULL;

  /* Top shell with a form inside */

  ShellFormCreate("mdialogShell",&shell,&dform,&dpy);

  /* Create a Viewport+Label and resize it */

  ViewpLabelCreate(dform,&label,&lviewport,labels);

  iargs=0;
  dviewport = XtCreateManagedWidget("dViewport",viewportWidgetClass,
				      dform, args, iargs);
  iargs=0;
  dform1 = XtCreateManagedWidget("form",formWidgetClass,
				      dviewport, args, iargs);

  /* Allocate an array of Widgets */
  dialoglist=(Widget *)MALLOC( (*nv)*sizeof(Widget));
  if ( dialoglist == (Widget *) NULL) 
    {
      Scistring("Malloc : No more place");
      /** Warning : ierr is not realy used up to now 	ierr=1; **/
      return;
    }
  
  /* Compute common sizes for ascii and labels  */

  mxdesc=5;
  mxini=5;
  for (i=0 ; i<*nv ; i++) 
    {
      siz=strlen(description[i]);mxdesc=Max(siz,mxdesc);
      siz=strlen(valueinit[i]);  mxini=Max(siz,mxini);
    }
  mxini=Min(mxini+10,60);

  /* Widgets creation */
  kform = (Widget)0;
  for (i=0 ; i<*nv ; i++) 
      {
	iargs=0;
	XtSetArg(args[iargs], XtNfromVert,kform);iargs++;
	kform=XtCreateManagedWidget("kForm",formWidgetClass,dform1,
				      args,iargs);
	iargs=0;
	label=XtCreateManagedWidget("kLabel",labelWidgetClass,kform,
				    args,iargs);
	iargs=0;
	XtSetArg(args[iargs], XtNfromHoriz ,label) ; iargs++;
	dialoglist[i]=XtCreateManagedWidget("kAscii",asciiTextWidgetClass,
					    kform,args,iargs);
	if (i==0) 
	  {
	    /* chaque label sera mis a (w1,h1) 
	       et chaque ascii sera mis a (w2,h2) 
	       on regarde aussi la taille global prise par 
	       un label+un ascii de 60 caracteres pour limiter ensuite 
	       la fenetre globale
	       */
	    LabelSize(label,mxdesc+1,1,&w1,&h1);
	    AsciiSize(dialoglist[0],mxini,1,&w2,&h2);
	    h1=Max(h1,h2);
	    LabelSize(label,60,1,&maxw1,&maxh1);
	    AsciiSize(dialoglist[0],60,1,&maxw2,&maxh2);
	    maxw1=Max(maxw1,maxw2);
	    maxh1=Max(maxh1,maxh2);
	  }
	SetLabel(label,description[i],w1,h1);
	SetAscii(dialoglist[i],valueinit[i],w2,h1);
      }

  /* Buttons */
  iargs=0;
  cform = XtCreateManagedWidget("cform",formWidgetClass,dform,args,iargs);
  
  ButtonCreate(cform,&ok,(XtCallbackProc)mDialogOk,(XtPointer) *nv,"Ok","ok");
  ButtonCreate(cform,&cancel,(XtCallbackProc)mDialogCancel,(XtPointer) *nv,"Cancel","cancel");

  XtMyLoop(shell,dpy);
  if (ok_Flag_sci == -1) *nv=0;
}

/* A test function */

TestmDialogWindow()
{
  int nv;
  static String labels = "LaBel";
  static String description[] = {
    "first list entry",
    "second list entry",
    "third list entry",
    "fourth list entry",
    NULL
    };
  static String valueinit[] = {
    "1","2","3","4",
    NULL
    };
  nv=4;
  str=(char **) MALLOC( (nv+1)*sizeof(char *));
  mDialogWindow(labels,description,valueinit,&nv);
}