1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2  * filename: xvifi.c                                                       *
3  *                                                                         *
4  * UTIL C-source: Medical Image Conversion Utility                         *
5  *                                                                         *
6  * purpose      : edit FILEINFO structure                                  *
7  *                                                                         *
8  * project      : (X)MedCon by Erik Nolf                                   *
9  *                                                                         *
10  * Functions    : XMdcEditFileInfoCallbackApply - Apply FILEINFO changes   *
11  *                XMdcEditFileInfo()            - Edit FILEINFO struct     *
12  *                                                                         *
13  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
14 /*
15  */
16 
17 /*
18    Copyright (C) 1997-2021 by Erik Nolf
19 
20    This program is free software; you can redistribute it and/or modify it
21    under the terms of the GNU General Public License as published by the
22    Free Software Foundation; either version 2, or (at your option) any later
23    version.
24 
25    This program is distributed in the hope that it will be useful, but
26    WITHOUT ANY WARRANTY; without even the implied warranty of
27    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
28    Public License for more details.
29 
30    You should have received a copy of the GNU General Public License along
31    with this program; if not, write to the Free Software Foundation, Inc.,
32    59 Place - Suite 330, Boston, MA 02111-1307, USA.  */
33 
34 /****************************************************************************
35                               H E A D E R S
36 ****************************************************************************/
37 
38 #include "m-depend.h"
39 
40 #include <stdio.h>
41 #ifdef HAVE_STDLIB_H
42 #include <stdlib.h>
43 #endif
44 #ifdef HAVE_STRING_H
45 #include <string.h>
46 #endif
47 #ifdef HAVE_STRINGS_H
48 #ifndef _WIN32
49 #include <strings.h>
50 #endif
51 #endif
52 
53 #include "xmedcon.h"
54 
55 /****************************************************************************
56                               D E F I N E S
57 ****************************************************************************/
58 
59 
60 /****************************************************************************
61                             F U N C T I O N S
62 ****************************************************************************/
63 
XMdcEditFileInfoCallbackApply(GtkWidget * widget,gpointer data)64 void XMdcEditFileInfoCallbackApply(GtkWidget *widget, gpointer data)
65 {
66 
67   IMG_DATA *id;
68   DYNAMIC_DATA *dd;
69   const char *entry;
70   char *msg;
71   float pixel_size, slice_width, slice_spacing, frame_duration;
72   Uint32 i, planes, frames, gates, beds, windows, number;
73 
74   if (XMdcNoFileOpened()) return;
75 
76   /* Orientation */
77   for (i=0; i < MDC_MAX_ORIENT; i++) {
78      if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.PatSliceOrient[i]))) {
79        my.fi->pat_slice_orient = (Int8)i; break;
80      }
81   }
82 
83   strcpy(my.fi->pat_pos,MdcGetStrPatPos(my.fi->pat_slice_orient));
84   strcpy(my.fi->pat_orient,MdcGetStrPatOrient(my.fi->pat_slice_orient));
85 
86   /* Sizes/Time */
87   entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.PixelSize));
88   pixel_size = (float)atof(entry);
89 
90   entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.SliceWidth));
91   slice_width = (float)atof(entry);
92 
93   entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.SliceSpacing));
94   slice_spacing = (float)atof(entry);
95 
96   entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.FrameDuration));
97   frame_duration = (float)atof(entry);
98 
99   /* Dimensions */
100   entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.NrDimPlanes));
101   planes = (Uint32)atoi(entry);
102 
103   entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.NrDimFrames));
104   frames = (Uint32)atoi(entry);
105 
106   entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.NrDimGates));
107   gates = (Uint32)atoi(entry);
108 
109   entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.NrDimBeds));
110   beds = (Uint32)atoi(entry);
111 
112   entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.NrDimWindows));
113   windows = (Uint32)atoi(entry);
114 
115   number = planes * frames * gates * beds * windows;
116   if (number == my.fi->number) {
117     my.fi->dim[3] = planes;
118     my.fi->dim[4] = frames;
119     my.fi->dim[5] = gates;
120     my.fi->dim[6] = beds;
121     my.fi->dim[7] = windows;
122   }else{
123     XMdcDisplayWarn("Incorrect dimensions not applied");
124   }
125 
126   /* set proper dim[0] */
127   for (i=7; i>=3; i--) {
128      if (my.fi->dim[i] > 1) {
129        my.fi->dim[0] = (Int16) i;
130        i=1; /* last found, so leave */
131      }
132   }
133 
134 
135   /* Study Parameters */
136   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.Reconstructed))) {
137     my.fi->reconstructed = MDC_YES;
138   }else{
139     my.fi->reconstructed = MDC_NO;
140   }
141 
142   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.Planar))) {
143     my.fi->planar = MDC_YES;
144   }else{
145     my.fi->planar = MDC_NO;
146   }
147 
148   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.ModalityNM))) {
149     sEditFI.CurModality = M_NM;
150   }else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.ModalityPT))) {
151     sEditFI.CurModality = M_PT;
152   }else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.ModalityCT))) {
153     sEditFI.CurModality = M_CT;
154   }else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.ModalityMR))) {
155     sEditFI.CurModality = M_MR;
156   }
157 
158   for (i=0; i < MDC_MAX_ACQUISITIONS; i++) {
159      if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.AcquisitionType[i]))) {
160        my.fi->acquisition_type = (Int16) i; break;
161      }
162   }
163 
164   /* reset other data structs */
165   msg = MdcResetODs(my.fi);
166   if (msg != NULL) {
167     XMdcDisplayFatalErr(MDC_BAD_CODE,msg);
168     return;
169   }
170 
171   /* fill in FI struct */
172 
173   my.fi->modality = sEditFI.CurModality;
174 
175   if (my.fi->pixdim[0] < 4) my.fi->pixdim[0] = 4; /* at least */
176   my.fi->pixdim[1] = pixel_size;
177   my.fi->pixdim[2] = pixel_size;
178   my.fi->pixdim[3] = slice_width;
179   my.fi->pixdim[4] = frame_duration;
180 
181   /* fill in IMG_DATA structs */
182   for (i=0; i<my.fi->number; i++) {
183      id = &my.fi->image[i];
184 
185      id->pixel_xsize = pixel_size;
186      id->pixel_ysize = pixel_size;
187      id->slice_width = slice_width;
188      id->slice_spacing = slice_spacing;
189 
190      MdcFillImgPos(my.fi,i,i%my.fi->dim[3],0.0);
191      MdcFillImgOrient(my.fi,i);
192   }
193 
194   /* fill DYNAMIC_DATA structs */
195   for (i=0; i<my.fi->dynnr; i++) {
196      dd = &my.fi->dyndata[i];
197 
198      dd->nr_of_slices = my.fi->dim[3];
199      dd->time_frame_duration = frame_duration;
200   }
201 
202   /* some final completions */
203   msg = MdcImagesPixelFiddle(my.fi);
204   if (msg != NULL) {
205     XMdcDisplayFatalErr(MDC_BAD_CODE,msg);
206     return;
207   }
208 
209   /* reframe images */
210   XMdcProgressBar(MDC_PROGRESS_BEGIN,0.,"Reframe images:");
211 
212   XMdcViewerHide();
213   XMdcViewerEnableAutoShrink();
214   XMdcViewerReset();
215   XMdcDisplayImages();
216 
217   XMdcProgressBar(MDC_PROGRESS_END,0.,NULL);
218 
219   XMDC_FILE_TYPE = XMDC_EDITFI;
220 
221 }
222 
XMdcEditFileInfo(void)223 void XMdcEditFileInfo(void)
224 {
225    GtkWidget *window=NULL;
226    GtkWidget *box1;
227    GtkWidget *box2;
228    GtkWidget *box3;
229    GtkWidget *box4;
230    GtkWidget *frame;
231    GtkWidget *top, *left, *right;
232    GtkWidget *label;
233    GtkWidget *table;
234    GtkWidget *tablabel;
235    GtkWidget *entry;
236    GtkWidget *button;
237    GtkWidget *separator;
238    GtkWidget *notebook;
239    GSList *group;
240    EditFileInfoStruct *vifi = &sEditFI;
241    int i;
242 
243    if (XMdcNoFileOpened()) return;
244 
245    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
246 
247    g_signal_connect(GTK_OBJECT(window),"destroy",
248                       G_CALLBACK(gtk_widget_destroy),NULL);
249 
250    gtk_window_set_title(GTK_WINDOW(window),"Edit FileInfo");
251    gtk_container_set_border_width(GTK_CONTAINER(window),0);
252 
253    box1 = gtk_vbox_new(FALSE,5);
254    gtk_container_add(GTK_CONTAINER(window),box1);
255    gtk_container_set_border_width(GTK_CONTAINER(box1),5);
256    gtk_widget_show(box1);
257 
258    label=gtk_label_new("* any changes can seriously damage study integrity *");
259    gtk_misc_set_alignment(GTK_MISC(label),0.5,0.5);
260    gtk_box_pack_start(GTK_BOX(box1),label,TRUE,TRUE,0);
261    gtk_widget_show(label);
262 
263    notebook = gtk_notebook_new();
264    gtk_container_add(GTK_CONTAINER(box1),notebook);
265    gtk_container_set_border_width(GTK_CONTAINER(notebook), 10);
266    gtk_widget_show(notebook);
267 
268    /* tab page Patient Slice Orientation */
269    box2 = gtk_hbox_new(FALSE, 10);
270    gtk_widget_show(box2);
271 
272    tablabel = gtk_label_new("Orientation");
273    gtk_widget_show(tablabel);
274    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), box2, tablabel);
275 
276    box3 = gtk_vbox_new(FALSE,5);
277    gtk_container_add(GTK_CONTAINER(box2),box3);
278    gtk_container_set_border_width(GTK_CONTAINER(box3),5);
279    gtk_widget_show(box3);
280 
281    table = gtk_table_new(2,2,FALSE);
282    gtk_container_add(GTK_CONTAINER(box3),table);
283    gtk_widget_show(table);
284 
285    top = gtk_vbox_new(FALSE,5);
286    gtk_table_attach_defaults(GTK_TABLE(table),top,0,1,0,1);
287    gtk_widget_show(top);
288 
289    left = gtk_vbox_new(FALSE,5);
290    gtk_table_attach_defaults(GTK_TABLE(table),left,0,1,1,2);
291    gtk_widget_show(left);
292 
293    right = gtk_vbox_new(FALSE,5);
294    gtk_table_attach_defaults(GTK_TABLE(table),right,1,2,1,2);
295    gtk_widget_show(right);
296 
297 
298    button = NULL; group = NULL;
299    for (i=0; i < MDC_MAX_ORIENT; i++) {
300 
301       if (i == 0) {
302         button = gtk_radio_button_new_with_label(NULL,MdcGetStrPatSlOrient(i));
303       }else{
304         group  = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
305         button = gtk_radio_button_new_with_label(group,MdcGetStrPatSlOrient(i));
306       }
307 
308       if (i == 0) {
309         /* unknown singled on top */
310         gtk_box_pack_start(GTK_BOX(top),button,TRUE,TRUE,0);
311       }else if (i <= MDC_MAX_ORIENT/2) {
312         /* all supine left */
313         gtk_box_pack_start(GTK_BOX(left),button,TRUE,TRUE,0);
314       }else{
315         /* all prone right */
316         gtk_box_pack_start(GTK_BOX(right),button,TRUE,TRUE,0);
317       }
318 
319       if (my.fi->pat_slice_orient == i) {
320         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
321       }else{
322         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
323       }
324       gtk_widget_show(button);
325 
326       vifi->PatSliceOrient[i] = button;
327    }
328 
329    /* tab page Sizes */
330    box2 = gtk_vbox_new(FALSE, 10);
331    gtk_widget_show(box2);
332 
333    tablabel = gtk_label_new("Sizes / Time");
334    gtk_widget_show(tablabel);
335    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), box2, tablabel);
336 
337    label = gtk_label_new("Note: Following entries require float values\n\
338        Examples: 10.0  1.0e+1");
339 
340    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_LEFT);
341    gtk_widget_set_name (label, "FixedLabel");
342    gtk_box_pack_start(GTK_BOX(box2),label,TRUE,TRUE,5);
343    gtk_widget_show(label);
344 
345    box3 = gtk_vbox_new(FALSE,5);
346    gtk_container_add(GTK_CONTAINER(box2),box3);
347    gtk_container_set_border_width(GTK_CONTAINER(box3),5);
348    gtk_widget_show(box3);
349 
350    table = gtk_table_new(4,3, FALSE);
351    gtk_container_add(GTK_CONTAINER(box3),table);
352    gtk_widget_show(table);
353 
354    label = gtk_label_new("Pixel Size");
355    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
356    gtk_widget_set_name(label, "FixedLabel");
357    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
358    gtk_widget_show(label);
359 
360    entry = gtk_entry_new();
361    gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
362    sprintf(mdcbufr,"%e",my.fi->image[0].pixel_xsize);
363    gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
364    gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
365    gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,0,1);
366    gtk_widget_show(entry);
367    vifi->PixelSize = entry;
368 
369    label = gtk_label_new("[mm]");
370    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
371    gtk_widget_set_name(label, "FixedLabel");
372    gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,0,1);
373    gtk_widget_show(label);
374 
375    label = gtk_label_new("Slice Width");
376    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
377    gtk_widget_set_name(label, "FixedLabel");
378    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);
379    gtk_widget_show(label);
380 
381    entry = gtk_entry_new();
382    gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
383    sprintf(mdcbufr,"%e",my.fi->image[0].slice_width);
384    gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
385    gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
386    gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,1,2);
387    gtk_widget_show(entry);
388    vifi->SliceWidth = entry;
389 
390    label = gtk_label_new("[mm]");
391    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
392    gtk_widget_set_name(label, "FixedLabel");
393    gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,1,2);
394    gtk_widget_show(label);
395 
396    label = gtk_label_new("Slice Separation");
397    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
398    gtk_widget_set_name(label, "FixedLabel");
399    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,2,3);
400    gtk_widget_show(label);
401 
402    entry = gtk_entry_new();
403    gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
404    sprintf(mdcbufr,"%e",my.fi->image[0].slice_spacing);
405    gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
406    gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
407    gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,2,3);
408    gtk_widget_show(entry);
409    vifi->SliceSpacing = entry;
410 
411    label = gtk_label_new("[mm]");
412    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
413    gtk_widget_set_name(label, "FixedLabel");
414    gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,2,3);
415    gtk_widget_show(label);
416 
417    label = gtk_label_new("Frame Duration");
418    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
419    gtk_widget_set_name(label, "FixedLabel");
420    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,3,4);
421    gtk_widget_show(label);
422 
423    entry = gtk_entry_new();
424    gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
425    if ((my.fi->dynnr > 0) && (my.fi->dyndata != NULL)) {
426      sprintf(mdcbufr,"%e",my.fi->dyndata[0].time_frame_duration);
427    }else{
428      sprintf(mdcbufr,"%e",0.);
429    }
430 
431    gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
432    gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
433    gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,3,4);
434    gtk_widget_show(entry);
435    vifi->FrameDuration = entry;
436 
437    label = gtk_label_new("[ms]");
438    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
439    gtk_widget_set_name(label, "FixedLabel");
440    gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,3,4);
441    gtk_widget_show(label);
442 
443    /* tab page Dimensions */
444    box2 = gtk_vbox_new(FALSE, 10);
445    gtk_widget_show(box2);
446 
447    tablabel = gtk_label_new("Dimensions");
448    gtk_widget_show(tablabel);
449    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), box2, tablabel);
450 
451    sprintf(mdcbufr,"Note: Each entry must be a 1-based integer and the\n\
452   product of dim[]-values = total number of images (%u)",my.fi->number);
453    label = gtk_label_new(mdcbufr);
454    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_LEFT);
455    gtk_widget_set_name (label, "FixedLabel");
456    gtk_box_pack_start(GTK_BOX(box2),label,TRUE,TRUE,5);
457    gtk_widget_show(label);
458 
459    box3 = gtk_vbox_new(FALSE,5);
460    gtk_container_add(GTK_CONTAINER(box2),box3);
461    gtk_container_set_border_width(GTK_CONTAINER(box3),5);
462    gtk_widget_show(box3);
463 
464    table = gtk_table_new(5,3, FALSE);
465    gtk_container_add(GTK_CONTAINER(box3),table);
466    gtk_widget_show(table);
467 
468    label = gtk_label_new("dim[3] = ");
469    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
470    gtk_widget_set_name(label, "FixedLabel");
471    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
472    gtk_widget_show(label);
473 
474    entry = gtk_entry_new();
475    gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
476    sprintf(mdcbufr,"%u",my.fi->dim[3]);
477    gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
478    gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
479    gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,0,1);
480    gtk_widget_show(entry);
481    vifi->NrDimPlanes = entry;
482 
483    label = gtk_label_new("(planes | (time) slices)");
484    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
485    gtk_widget_set_name(label, "FixedLabel");
486    gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,0,1);
487    gtk_widget_show(label);
488 
489    label = gtk_label_new("dim[4] = ");
490    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
491    gtk_widget_set_name(label, "FixedLabel");
492    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);
493    gtk_widget_show(label);
494 
495    entry = gtk_entry_new();
496    gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
497    sprintf(mdcbufr,"%u",my.fi->dim[4]);
498    gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
499    gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
500    gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,1,2);
501    gtk_widget_show(entry);
502    vifi->NrDimFrames = entry;
503 
504    label = gtk_label_new(" (frames | time slots | phases)");
505    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
506    gtk_widget_set_name(label, "FixedLabel");
507    gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,1,2);
508    gtk_widget_show(label);
509 
510    label = gtk_label_new("dim[5] = ");
511    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
512    gtk_widget_set_name(label, "FixedLabel");
513    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,2,3);
514    gtk_widget_show(label);
515 
516    entry = gtk_entry_new();
517    gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
518    sprintf(mdcbufr,"%u",my.fi->dim[5]);
519    gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
520    gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
521    gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,2,3);
522    gtk_widget_show(entry);
523    vifi->NrDimGates = entry;
524 
525    label = gtk_label_new("(gates | R-R intervals)");
526    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
527    gtk_widget_set_name(label, "FixedLabel");
528    gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,2,3);
529    gtk_widget_show(label);
530 
531    label = gtk_label_new("dim[6] = ");
532    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
533    gtk_widget_set_name(label, "FixedLabel");
534    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,3,4);
535    gtk_widget_show(label);
536 
537    entry = gtk_entry_new();
538    gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
539    sprintf(mdcbufr,"%u",my.fi->dim[6]);
540    gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
541    gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
542    gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,3,4);
543    gtk_widget_show(entry);
544    vifi->NrDimBeds = entry;
545 
546    label = gtk_label_new("(beds | detector heads)");
547    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
548    gtk_widget_set_name(label, "FixedLabel");
549    gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,3,4);
550    gtk_widget_show(label);
551 
552    label = gtk_label_new("dim[7] = ");
553    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
554    gtk_widget_set_name(label, "FixedLabel");
555    gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,4,5);
556    gtk_widget_show(label);
557 
558    entry = gtk_entry_new();
559    gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
560    sprintf(mdcbufr,"%u",my.fi->dim[7]);
561    gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
562    gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
563    gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,4,5);
564    gtk_widget_show(entry);
565    vifi->NrDimWindows = entry;
566 
567    label = gtk_label_new("(energy windows)");
568    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
569    gtk_widget_set_name(label, "FixedLabel");
570    gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,4,5);
571    gtk_widget_show(label);
572 
573    /* tab page Study Parameters */
574    box2 = gtk_vbox_new(FALSE, 10);
575    gtk_widget_show(box2);
576 
577    tablabel = gtk_label_new("Study Parameters");
578    gtk_widget_show(tablabel);
579    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), box2, tablabel);
580 
581    box3 = gtk_hbox_new(FALSE,5);
582    gtk_container_add(GTK_CONTAINER(box2),box3);
583    gtk_container_set_border_width(GTK_CONTAINER(box3),5);
584    gtk_widget_show(box3);
585 
586    frame = gtk_frame_new("Reconstructed");
587    gtk_container_add(GTK_CONTAINER(box3),frame);
588    gtk_container_set_border_width(GTK_CONTAINER(frame),5);
589    gtk_widget_show(frame);
590 
591    box4 = gtk_hbox_new(FALSE,5);
592    gtk_container_add(GTK_CONTAINER(frame),box4);
593    gtk_container_set_border_width(GTK_CONTAINER(box4),0);
594    gtk_widget_show(box4);
595 
596    button = gtk_radio_button_new_with_label(NULL,"Yes");
597    gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
598    /* MARK: only save the Yes option */
599    if (my.fi->reconstructed == MDC_YES)
600      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
601    gtk_widget_show(button);
602    vifi->Reconstructed = button;
603 
604    group  = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
605    button = gtk_radio_button_new_with_label(group,"No");
606    gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
607    if (my.fi->reconstructed == MDC_NO)
608      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
609    gtk_widget_show(button); /* MARK: no need to preserve, only two supported */
610 
611    frame = gtk_frame_new("Planar");
612    gtk_container_add(GTK_CONTAINER(box3),frame);
613    gtk_container_set_border_width(GTK_CONTAINER(frame),5);
614    gtk_widget_show(frame);
615 
616    box4 = gtk_hbox_new(FALSE,5);
617    gtk_container_add(GTK_CONTAINER(frame),box4);
618    gtk_container_set_border_width(GTK_CONTAINER(box4),0);
619    gtk_widget_show(box4);
620 
621    button = gtk_radio_button_new_with_label(NULL,"Yes");
622    gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
623    /* MARK: only save the Yes option */
624    if (my.fi->planar == MDC_YES)
625      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
626    gtk_widget_show(button);
627    vifi->Planar = button;
628 
629    group  = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
630    button = gtk_radio_button_new_with_label(group,"No");
631    gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
632    if (my.fi->planar == MDC_NO)
633      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
634    gtk_widget_show(button); /* MARK: no need to preserve, only two supported */
635 
636    box3 = gtk_hbox_new(FALSE,5);
637    gtk_container_add(GTK_CONTAINER(box2),box3);
638    gtk_container_set_border_width(GTK_CONTAINER(box3),5);
639    gtk_widget_show(box3);
640 
641    frame = gtk_frame_new("Acquisition Type");
642    gtk_container_add(GTK_CONTAINER(box3),frame);
643    gtk_container_set_border_width(GTK_CONTAINER(frame),5);
644    gtk_widget_show(frame);
645 
646    box4 = gtk_vbox_new(FALSE,5);
647    gtk_container_add(GTK_CONTAINER(frame),box4);
648    gtk_container_set_border_width(GTK_CONTAINER(box4),0);
649    gtk_widget_show(box4);
650 
651    for (i=0; i < MDC_MAX_ACQUISITIONS; i++) {
652       if (i == 0) {
653         button = gtk_radio_button_new_with_label(NULL,MdcGetStrAcquisition(i));
654       }else{
655         group  = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
656         button = gtk_radio_button_new_with_label(group,MdcGetStrAcquisition(i));      }
657 
658       gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
659       if (my.fi->acquisition_type == i) {
660         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
661       }else{
662         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
663       }
664       gtk_widget_show(button);
665 
666       vifi->AcquisitionType[i] = button;
667    }
668 
669    frame = gtk_frame_new("Modality");
670    gtk_container_add(GTK_CONTAINER(box3),frame);
671    gtk_container_set_border_width(GTK_CONTAINER(frame),5);
672    gtk_widget_show(frame);
673 
674    box4 = gtk_vbox_new(FALSE,5);
675    gtk_container_add(GTK_CONTAINER(frame),box4);
676    gtk_container_set_border_width(GTK_CONTAINER(box4),0);
677    gtk_widget_show(box4);
678 
679    vifi->CurModality = my.fi->modality;
680 
681    button = gtk_radio_button_new_with_label(NULL,"NM");
682    gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
683    /*if (vifi->CurModality == M_NM) {
684      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
685    }*/
686    gtk_widget_show(button);
687    vifi->ModalityNM = button;
688 
689    group  = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
690    button = gtk_radio_button_new_with_label(group,"PT");
691    gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
692    /*if (vifi->CurModality == M_PT) {
693      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
694    }*/
695    gtk_widget_show(button);
696    vifi->ModalityPT = button;
697 
698    group  = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
699    button = gtk_radio_button_new_with_label(group,"CT");
700    gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
701    /*if (vifi->CurModality == M_CT) {
702      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
703    }*/
704    gtk_widget_show(button);
705    vifi->ModalityCT = button;
706 
707    group  = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
708    button = gtk_radio_button_new_with_label(group,"MR");
709    gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
710    /*if (vifi->CurModality == M_MR) {
711      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
712    }*/
713    gtk_widget_show(button);
714    vifi->ModalityMR = button;
715 
716    group  = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
717    button = gtk_radio_button_new_with_label(group,"keep current");
718    gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
719    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
720    gtk_widget_show(button);
721    vifi->ModalityCurrent = button;
722 
723    /* create horizontal separator */
724    separator = gtk_hseparator_new();
725    gtk_box_pack_start(GTK_BOX(box1),separator,FALSE,FALSE,0);
726    gtk_widget_show(separator);
727 
728    /* create bottom buttons */
729    box2 = gtk_hbox_new(FALSE,0);
730    gtk_box_pack_start(GTK_BOX(box1),box2,TRUE,TRUE,2);
731    gtk_widget_show(box2);
732 
733    button = gtk_button_new_with_label("Apply");
734    gtk_box_pack_start(GTK_BOX(box2),button,TRUE,TRUE,2);
735    g_signal_connect_swapped(GTK_OBJECT(button), "clicked",
736                       G_CALLBACK(gtk_widget_hide), GTK_OBJECT(window));
737    g_signal_connect(GTK_OBJECT(button),"clicked",
738                       G_CALLBACK(XMdcEditFileInfoCallbackApply), NULL);
739    g_signal_connect_swapped(GTK_OBJECT(button),"clicked",
740                       G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(window));
741    gtk_widget_show(button);
742 
743    button = gtk_button_new_with_label("Cancel");
744    gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 2);
745    g_signal_connect_swapped(GTK_OBJECT (button), "clicked",
746                       G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(window));
747    gtk_widget_show(button);
748 
749    XMdcShowWidget(window);
750 }
751