source: tags/arb_5.3/PGT/selection_dialog.cxx

Last change on this file was 3979, checked in by baderk, 18 years ago

The previous cleanup (mem-leaks removal) has gone too far and resulted in
segfaults. This patch at least removes the segfaults (the mem-leaks still
exist and will be removed later).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 16.4 KB
Line 
1// Copyright (c) 2004 - 2005 Kai Bader <baderk@in.tum.de>
2//
3// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
6// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
7// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
8// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
9
10// CVS REVISION TAG  --  $Revision: 3979 $
11
12
13#include "arb_interface.hxx"
14#include "selection_dialog.hxx"
15
16
17bool selectionDialog::m_opened= false;
18
19
20/****************************************************************************
21*  SELECTION DIALOG - CONSTRUCTOR
22****************************************************************************/
23selectionDialog::selectionDialog(MDialog *d, int type)
24    : MDialog(d)
25{
26    if(m_opened)
27    {
28//         this->~selectionDialog();
29        return;
30    }
31    else m_opened= true;
32
33    // DEFAULT VALUES
34    m_hasSpeciesCallback= false;
35    m_hasExperimentCallback= false;
36    m_hasProteomeCallback= false;
37    m_ignoreProteomeCallback= false;
38    m_species= NULL;
39    m_experiment= NULL;
40    m_proteome= NULL;
41    m_type= type;
42
43    // CREATE SHELL FOR THIS DIALOG
44    createShell("");
45
46    // CALL CREATE WINDOW FUNCTION
47    createWindow();
48
49    // SET WINDOW WIDTH
50    XtVaSetValues(m_shell,
51        XmNwidth, 300,
52        XmNheight, 500,
53        NULL);
54
55    // REALIZE WINDOW
56    realizeShell();
57
58    // SET WINDOW LABEL
59    switch(m_type)
60    {
61        case SELECTION_DIALOG_READ:
62            setDialogTitle("PGT - Select Source");
63            break;
64        case SELECTION_DIALOG_WRITE:
65            setDialogTitle("PGT - New Destination");
66            break;
67        case SELECTION_DIALOG_RW:
68        default:
69            setDialogTitle("PGT - Selection");
70            break;
71    }
72
73    // DESELECT ALL WINDOW BUTTONS EXCEPT CLOSE AND MOVE
74    XtVaSetValues(m_shell, XmNmwmFunctions, MWM_FUNC_MOVE | MWM_FUNC_CLOSE, NULL);
75
76    getSpeciesList(m_speciesList, true);
77}
78
79
80/****************************************************************************
81*  SELECTION DIALOG - DESTRUCTOR
82****************************************************************************/
83selectionDialog::~selectionDialog()
84{
85    if(m_species) free(m_species);
86    if(m_experiment) free(m_experiment);
87    if(m_proteome) free(m_proteome);
88
89    closeDialog();
90}
91
92
93/****************************************************************************
94*  MAIN DIALOG - CREATE WINDOW
95****************************************************************************/
96void selectionDialog::createWindow()
97{
98    // CREATE TOP LEVEL WIDGET
99    m_top= XtVaCreateManagedWidget("top",
100        xmFormWidgetClass, m_shell,
101        XmNorientation, XmVERTICAL,
102        XmNmarginHeight, 0,
103        XmNmarginWidth, 0,
104        NULL);
105
106    // CREATE A SIMPLE LABEL
107    Widget label1= XtVaCreateManagedWidget("label",
108        xmLabelWidgetClass, m_top,
109        XmNlabelString, CreateDlgString("Select Species:"),
110        XmNheight, 30,
111        XmNalignment, XmALIGNMENT_CENTER,
112        XmNtopAttachment, XmATTACH_FORM,
113        XmNleftAttachment, XmATTACH_FORM,
114        XmNrightAttachment, XmATTACH_FORM,
115        NULL);
116
117    // CREATE SPECIES LIST WIDGET
118    m_speciesList= XmCreateScrolledList(m_top, const_cast<char*>("speciesList"), NULL, 0);
119    XtVaSetValues(m_speciesList,
120        XmNallowResize, true,
121        XmNvisibleItemCount, 5,
122        // XmNselectionPolicy, XmSINGLE_SELECT,
123        NULL);
124    XtVaSetValues(XtParent(m_speciesList),
125        XmNtopAttachment, XmATTACH_WIDGET,
126        XmNtopWidget, label1,
127        XmNleftAttachment, XmATTACH_FORM,
128        XmNrightAttachment, XmATTACH_FORM,
129        NULL);
130    XtManageChild(m_speciesList);
131    XtAddCallback(m_speciesList, XmNbrowseSelectionCallback, staticSpeciesCallback, this);
132
133    // CREATE A SIMPLE LABEL
134    Widget label2= XtVaCreateManagedWidget("label",
135        xmLabelWidgetClass, m_top,
136        XmNlabelString, CreateDlgString("Select Experiment:"),
137        // XmNheight, 30,
138        XmNalignment, XmALIGNMENT_CENTER,
139        XmNtopAttachment, XmATTACH_WIDGET,
140        XmNtopWidget, m_speciesList,
141        XmNleftAttachment, XmATTACH_FORM,
142        XmNrightAttachment, XmATTACH_FORM,
143        NULL);
144
145    // CREATE EXPERIMENT LIST WIDGET
146    m_experimentList= XmCreateScrolledList(m_top, const_cast<char*>("experimentList"), NULL, 0);
147    XtVaSetValues(m_experimentList,
148        XmNallowResize, true,
149        XmNvisibleItemCount, 5,
150        // XmNselectionPolicy, XmSINGLE_SELECT,
151        NULL);
152    XtVaSetValues(XtParent(m_experimentList),
153        XmNtopAttachment, XmATTACH_WIDGET,
154        XmNtopWidget, label2,
155        XmNleftAttachment, XmATTACH_FORM,
156        XmNrightAttachment, XmATTACH_FORM,
157        NULL);
158    XtManageChild(m_experimentList);
159    XtAddCallback(m_experimentList, XmNbrowseSelectionCallback, staticExperimentCallback, this);
160
161    // CREATE A SIMPLE LABEL
162    Widget label3= XtVaCreateManagedWidget("label",
163        xmLabelWidgetClass, m_top,
164        XmNlabelString, CreateDlgString("Select Proteome:"),
165        // XmNheight, 30,
166        XmNalignment, XmALIGNMENT_CENTER,
167        XmNtopAttachment, XmATTACH_WIDGET,
168        XmNtopWidget, m_experimentList,
169        XmNleftAttachment, XmATTACH_FORM,
170        XmNrightAttachment, XmATTACH_FORM,
171        NULL);
172
173    // CREATE PROTEOME LIST WIDGET
174    m_proteomeList= XmCreateScrolledList(m_top, const_cast<char*>("proteomeList"), NULL, 0);
175    XtVaSetValues(m_proteomeList,
176        XmNallowResize, true,
177        XmNvisibleItemCount, 5,
178        // XmNselectionPolicy, XmSINGLE_SELECT,
179        NULL);
180    XtVaSetValues(XtParent(m_proteomeList),
181        XmNtopAttachment, XmATTACH_WIDGET,
182        XmNtopWidget, label3,
183        XmNleftAttachment, XmATTACH_FORM,
184        XmNrightAttachment, XmATTACH_FORM,
185        NULL);
186    XtManageChild(m_proteomeList);
187    XtAddCallback(m_proteomeList, XmNbrowseSelectionCallback, staticProteomeListCallback, this);
188
189    // CREATE A SIMPLE LABEL
190    Widget label01= XtVaCreateManagedWidget("label",
191        xmLabelWidgetClass, m_top,
192        XmNlabelString, CreateDlgString("Enter a new proteome name here:"),
193        XmNheight, 30,
194        // XmNalignment, XmALIGNMENT_BEGINNING,
195        XmNalignment, XmALIGNMENT_CENTER,
196        XmNtopAttachment, XmATTACH_WIDGET,
197        XmNtopWidget, m_proteomeList,
198        XmNleftAttachment, XmATTACH_FORM,
199        XmNrightAttachment, XmATTACH_FORM,
200        NULL);
201
202    // CREATE NEW PROTEOME TEXT FIELD
203    m_proteomeText= XtVaCreateManagedWidget("proteomeTextField",
204        xmTextWidgetClass, m_top,
205        // XmNheight, 30,
206        XmNtopAttachment, XmATTACH_WIDGET,
207        XmNtopWidget, label01,
208        XmNleftAttachment, XmATTACH_FORM,
209        XmNrightAttachment, XmATTACH_FORM,
210        NULL);
211
212    if(m_type == SELECTION_DIALOG_WRITE || m_type == SELECTION_DIALOG_RW)
213    {
214        // ADD CALLBACK ONLY IF WE ARE A WRITEABLE TYPE
215        XtAddCallback(m_proteomeText, XmNvalueChangedCallback, staticProteomeTextCallback, this);
216    }
217    else
218    {
219        // OTHERWISE DEACTIVATE EDIT FUNCTIONS
220        XtVaSetValues(m_proteomeText,
221            XmNeditable, false,
222            NULL);
223
224        // AND CHANGE LABEL TEXT
225        XtVaSetValues(label01,
226            XmNlabelString, CreateDlgString("---"),
227            NULL);
228    }
229
230    m_warning_label= XtVaCreateManagedWidget("label",
231        xmLabelWidgetClass, m_top,
232        XmNlabelString, CreateDlgString(""),
233        // XmNheight, 30,
234        XmNalignment, XmALIGNMENT_CENTER,
235        XmNtopAttachment, XmATTACH_WIDGET,
236        XmNtopWidget, m_proteomeText,
237        XmNleftAttachment, XmATTACH_FORM,
238        XmNrightAttachment, XmATTACH_FORM,
239        NULL);
240
241    Widget exitButton= XtVaCreateManagedWidget("exitButton",
242        xmPushButtonWidgetClass, m_top,
243        XmNlabelString, CreateDlgString("Close"),
244        XmNwidth, 100,
245        XmNheight, 30,
246        XmNrightAttachment, XmATTACH_FORM,
247        XmNbottomAttachment, XmATTACH_FORM,
248        // XmNtopAttachment, XmATTACH_WIDGET,
249        // XmNtopWidget, m_proteomeText,
250        NULL);
251    XtAddCallback(exitButton, XmNactivateCallback, staticExitButtonCallback, this);
252}
253
254
255/****************************************************************************
256*  CALLBACK - EXIT BUTTON CALLBACK
257*  !!! CAUTION: THIS IS A WRAPPER FUNCTION !!!
258****************************************************************************/
259void staticExitButtonCallback(Widget widget, XtPointer clientData, XtPointer callData)
260{
261    // GET POINTER OF THE ORIGINAL CALLER
262    selectionDialog *sD= (selectionDialog *)clientData;
263
264    // CALL CLASS MEMBER FUNCTION
265    sD->exitButtonCallback(widget, callData);
266}
267
268
269/****************************************************************************
270*  CALLBACK - EXIT BUTTON CALLBACK
271****************************************************************************/
272void selectionDialog::exitButtonCallback(Widget, XtPointer)
273{
274    m_opened= false;
275    this->closeDialog();
276}
277
278
279/****************************************************************************
280*  CALLBACK - SPECIES CALLBACK
281*  !!! CAUTION: THIS IS A WRAPPER FUNCTION !!!
282****************************************************************************/
283void staticSpeciesCallback(Widget widget, XtPointer clientData, XtPointer callData)
284{
285    // GET POINTER OF THE ORIGINAL CALLER
286    selectionDialog *sD= (selectionDialog *)clientData;
287
288    // CALL CLASS MEMBER FUNCTION
289    sD->speciesCallback(widget, callData);
290}
291
292
293/****************************************************************************
294*  CALLBACK - SPECIES CALLBACK
295****************************************************************************/
296void selectionDialog::speciesCallback(Widget, XtPointer callData)
297{
298    // GET CALLBACK DATA
299    XmListCallbackStruct *cbs= (XmListCallbackStruct *)callData;
300    XmStringGetLtoR(cbs->item, XmFONTLIST_DEFAULT_TAG, &m_species);
301
302    // FILL EXPERIMENT LIST
303    getExperimentList(m_experimentList, m_species, true);
304
305    // CLEAR PROTEOME ENTRIES
306    XmListDeleteAllItems(m_proteomeList);
307    XtVaSetValues(m_proteomeText, XmNvalue, "", NULL);
308
309    // TRIGGER ENTRY CHANGED CALLBACK
310    triggerSpeciesChange();
311}
312
313
314/****************************************************************************
315*  CALLBACK - EXPERIMENT CALLBACK
316*  !!! CAUTION: THIS IS A WRAPPER FUNCTION !!!
317****************************************************************************/
318void staticExperimentCallback(Widget widget, XtPointer clientData, XtPointer callData)
319{
320    // GET POINTER OF THE ORIGINAL CALLER
321    selectionDialog *sD= (selectionDialog *)clientData;
322
323    // CALL CLASS MEMBER FUNCTION
324    sD->experimentCallback(widget, callData);
325}
326
327
328/****************************************************************************
329*  CALLBACK - EXPERIMENT CALLBACK
330****************************************************************************/
331void selectionDialog::experimentCallback(Widget, XtPointer callData)
332{
333    // GET CALLBACK DATA
334    XmListCallbackStruct *cbs= (XmListCallbackStruct *)callData;
335    XmStringGetLtoR(cbs->item, XmFONTLIST_DEFAULT_TAG, &m_experiment);
336
337    // FILL PROTEOME LIST
338    getProteomeList(m_proteomeList, m_species, m_experiment, true);
339
340    // CLEAR PROTEOME TEXT FIELD
341    XtVaSetValues(m_proteomeText, XmNvalue, "", NULL);
342
343    // TRIGGER ENTRY CHANGED CALLBACK
344    triggerExperimentChange();
345}
346
347
348/****************************************************************************
349*  CALLBACK - PROTEOME LIST CALLBACK
350*  !!! CAUTION: THIS IS A WRAPPER FUNCTION !!!
351****************************************************************************/
352void staticProteomeListCallback(Widget widget, XtPointer clientData, XtPointer callData)
353{
354    // GET POINTER OF THE ORIGINAL CALLER
355    selectionDialog *sD= (selectionDialog *)clientData;
356
357    // CALL CLASS MEMBER FUNCTION
358    sD->proteomeListCallback(widget, callData);
359}
360
361
362/****************************************************************************
363*  CALLBACK - PROTEOME LIST CALLBACK
364****************************************************************************/
365void selectionDialog::proteomeListCallback(Widget, XtPointer callData)
366{
367    // GET CALLBACK DATA
368    XmListCallbackStruct *cbs= (XmListCallbackStruct *)callData;
369    XmStringGetLtoR(cbs->item, XmFONTLIST_DEFAULT_TAG, &m_proteome);
370
371    // SET TEXT FIELD ENTRY
372    XtVaSetValues(m_proteomeText, XmNvalue, m_proteome, NULL);
373
374    // TEXT FIELD TEXT -> M_PROTEOME
375    m_proteome= XmTextGetString(m_proteomeText);
376
377    // TRIGGER ENTRY CHANGED CALLBACK
378    triggerProteomeChange();
379}
380
381
382/****************************************************************************
383*  CALLBACK - PROTEOME TEXT CALLBACK
384*  !!! CAUTION: THIS IS A WRAPPER FUNCTION !!!
385****************************************************************************/
386void staticProteomeTextCallback(Widget widget, XtPointer clientData, XtPointer callData)
387{
388    // GET POINTER OF THE ORIGINAL CALLER
389    selectionDialog *sD= (selectionDialog *)clientData;
390
391    // CALL CLASS MEMBER FUNCTION
392    sD->proteomeTextCallback(widget, callData);
393}
394
395
396/****************************************************************************
397*  CALLBACK - PROTEOME TEXT CALLBACK
398****************************************************************************/
399void selectionDialog::proteomeTextCallback(Widget, XtPointer)
400{
401    if(m_ignoreProteomeCallback) return;
402
403    // TEXT FIELD TEXT -> M_PROTEOME
404    char *proteome= XmTextGetString(m_proteomeText);
405
406    // DISABLE CALLBACK (OTHERWISE A INFINITE LOOP WOULD OCCUR)
407    m_ignoreProteomeCallback= true;
408
409    // FIX PROTEOME TEXT FOR ARB
410    m_proteome= GBS_string_2_key(proteome);
411
412    // IF THE STRING DIFFERS - THROW WARNING
413    if(strlen(m_proteome) < 3)
414    {
415        XtVaSetValues(m_warning_label,
416            XmNlabelString, CreateDlgString("WARNING - NAME IS TOO SHORT"),
417            NULL);
418    }
419    else if(strcmp(m_proteome, proteome))
420    {
421        XtVaSetValues(m_warning_label,
422            XmNlabelString, CreateDlgString("WARNING - CONTAINS ILLEGAL CHARACTER(S)"),
423            NULL);
424    }
425    else
426    {
427        XtVaSetValues(m_warning_label,
428            XmNlabelString, CreateDlgString(""),
429            NULL);
430    }
431
432    // ENABLE CALLBACK
433    m_ignoreProteomeCallback= false;
434
435    // TRIGGER ENTRY CHANGED CALLBACK
436    triggerProteomeChange();
437}
438
439
440/****************************************************************************
441*  SET SPECIES DATA CHANGED CALLBACK
442****************************************************************************/
443void selectionDialog::setSpeciesCallback(XtCallbackProc callback)
444{
445    m_speciesCallback= callback;
446    m_hasSpeciesCallback= true;
447}
448
449
450/****************************************************************************
451*  TRIGGER SPECIES DATA CHANGED CALLBACK
452****************************************************************************/
453void selectionDialog::triggerSpeciesChange()
454{
455    if(m_hasSpeciesCallback)
456        m_speciesCallback(m_parent_widget, (XtPointer)m_parent_dialog, (XtPointer)&m_species);
457}
458
459
460/****************************************************************************
461*  SET EXPERIMENT DATA CHANGED CALLBACK
462****************************************************************************/
463void selectionDialog::setExperimentCallback(XtCallbackProc callback)
464{
465    m_experimentCallback= callback;
466    m_hasExperimentCallback= true;
467}
468
469
470/****************************************************************************
471*  TRIGGER EXPERIMENT DATA CHANGED CALLBACK
472****************************************************************************/
473void selectionDialog::triggerExperimentChange()
474{
475    if(m_hasExperimentCallback)
476        m_experimentCallback(m_parent_widget, (XtPointer)m_parent_dialog, (XtPointer)&m_experiment);
477}
478
479
480/****************************************************************************
481*  SET PROTEOME DATA CHANGED CALLBACK
482****************************************************************************/
483void selectionDialog::setProteomeCallback(XtCallbackProc callback)
484{
485    m_proteomeCallback= callback;
486    m_hasProteomeCallback= true;
487}
488
489
490/****************************************************************************
491*  TRIGGER PROTEOME DATA CHANGED CALLBACK
492****************************************************************************/
493void selectionDialog::triggerProteomeChange()
494{
495    // TEXT FIELD TEXT -> M_PROTEOME
496    char *proteome= XmTextGetString(m_proteomeText);
497
498    // FIX PROTEOME TEXT FOR ARB
499    m_proteome= GBS_string_2_key(proteome);
500
501    if(m_hasProteomeCallback)
502        m_proteomeCallback(m_parent_widget, (XtPointer)m_parent_dialog, (XtPointer)&m_proteome);
503}
Note: See TracBrowser for help on using the repository browser.