source: tags/arb_5.5/RNA3D/RNA3D_Interface.cxx

Last change on this file was 5995, checked in by baderk, 15 years ago

Fixed popdown params.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 26.9 KB
Line 
1#include "RNA3D_GlobalHeader.hxx"
2
3#include <GL/aw_window_ogl.hxx>
4#include <aw_window_Xm_interface.hxx>
5
6#include "RNA3D_Global.hxx"
7#include "RNA3D_Graphics.hxx"
8#include "RNA3D_OpenGLEngine.hxx"
9#include "RNA3D_Interface.hxx"
10#include "RNA3D_OpenGLGraphics.hxx"
11#include "RNA3D_StructureData.hxx"
12
13#include <string>
14#include <iostream>
15
16#include <X11/keysym.h>
17
18#include <aw_preset.hxx>
19#include <aw_awars.hxx>
20
21
22using namespace std;
23
24static AW_window_menu_modes_opengl *awm;
25static XtAppContext                 appContext;
26static XtWorkProcId                 workId   = 0;
27static GLboolean                    Spinning = GL_FALSE;
28
29//========= SpinMolecule(XtPointer ...) : The Actual WorkProc Routine ============//
30// => Sets the Rotation speed to 0.05 : default speed in Rotation Mode.
31// => Calls RefreshOpenGLDisplay() : to calculate new rotate matrix
32//    and then, redraws the entire scene.
33// => Returns False : so that the work proc remains registered and
34//    the animation will continue.
35//===============================================================================//
36
37Boolean SpinMolecule(XtPointer /*clientData*/) {
38    RNA3D->ROTATION_SPEED = 0.05;
39    RefreshOpenGLDisplay();
40    return false; /* leave work proc active */
41}
42
43//========== RotateMoleculeStateChanged(void)==================================//
44// => if Spinning, removes the WorkProc routine and sets Spinning & bAutoRotate to false.
45// => if not, adds the WorkProc routine [SpinMolecule()] and sets Spinning & bAutoRotate to true.
46// bAutoRotate is used in recalculation of Rotation Matrix
47// in RenderOpenGLScene() ==> defined in RNA3D_OpenGLEngine.cxx.
48//===============================================================================//
49
50static void RotateMoleculeStateChanged(void) {
51
52    if(Spinning) {
53        XtRemoveWorkProc(workId);
54        Spinning = GL_FALSE;
55        RNA3D->bAutoRotate = false;
56    } else {
57        workId = XtAppAddWorkProc(appContext, SpinMolecule, NULL);
58        Spinning = GL_TRUE;
59        RNA3D->bAutoRotate = true;
60    }
61}
62
63//============ RotateMoleculeStateChanged_cb(AW_root *awr)===========================//
64// Callback bound to Rotatation Awar (AWAR_3D_MOL_ROTATE)
65// Is called when the
66// 1. Rotation Awar is changed.
67// 2. Also when the Spacebar is pressed in KeyBoardEventHandler().
68//===============================================================================//
69
70static void RotateMoleculeStateChanged_cb(AW_root *awr) {
71    MapDisplayParameters(awr);
72    RotateMoleculeStateChanged();
73    RefreshOpenGLDisplay();
74}
75
76void ResizeOpenGLWindow( Widget /* w*/, XtPointer /*client_data*/, XEvent *event, char* /*x*/ ) {
77    XConfigureEvent *evt;
78    evt = (XConfigureEvent*) event;
79
80    if ( RNA3D->OpenGLEngineState == NOT_CREATED ) {
81        return;
82    }
83
84    ReshapeOpenGLWindow( (GLint) evt->width, (GLint) evt->height );
85
86    RefreshOpenGLDisplay();
87}
88
89void KeyReleaseEventHandler(Widget /* w*/, XtPointer /*client_data*/, XEvent */*event*/, char* /*x*/ )  {
90    RefreshOpenGLDisplay();
91}
92
93void KeyPressEventHandler(Widget /* w*/, XtPointer /*client_data*/, XEvent *event, char* /*x*/ )  {
94    XKeyEvent *evt;
95    evt = (XKeyEvent*) event;
96
97    char   buffer[1];
98    KeySym keysym;
99    int    count;
100
101    // Converting keycode to keysym
102    count = XLookupString((XKeyEvent *) event, buffer, 1, &keysym, NULL);
103
104    switch(keysym) {
105        case XK_space:
106            RNA3D->iRotateMolecule = !RNA3D->iRotateMolecule;
107            RNA3D->root->awar(AWAR_3D_MOL_ROTATE)->write_int(RNA3D->iRotateMolecule);
108            break;
109        case XK_Escape:
110            RNA3D->bDisplayComments = !RNA3D->bDisplayComments;
111            break;
112        case XK_Tab:
113            RNA3D->bDisplayMask = !RNA3D->bDisplayMask;
114            break;
115        case XK_Up:
116            RNA3D->Center.y -= 0.1;
117            break;
118        case XK_Down:
119            RNA3D->Center.y += 0.1;
120            break;
121        case XK_Left:
122            RNA3D->Center.x -= 0.1;
123            break;
124        case XK_Right:
125            RNA3D->Center.x += 0.1;
126            break;
127    }
128
129    RefreshOpenGLDisplay();
130}
131
132void ButtonReleaseEventHandler(Widget /* w*/, XtPointer /*client_data*/, XEvent *event, char* /*x*/ ) {
133    XButtonEvent *xr;
134    xr = (XButtonEvent*) event;
135
136    switch(xr->button)
137    {
138        case LEFT_BUTTON:
139            RNA3D->bRotateMolecule = false;
140            break;
141
142        case MIDDLE_BUTTON:
143            break;
144
145        case RIGHT_BUTTON:
146            break;
147    }
148
149    RefreshOpenGLDisplay();
150}
151
152void ButtonPressEventHandler( Widget /* w*/, XtPointer /*client_data*/, XEvent *event, char* /*x*/ ){
153
154    XButtonEvent *xp;
155    xp = (XButtonEvent*) event;
156
157    switch(xp->button)
158    {
159        case LEFT_BUTTON:
160            RNA3D->bRotateMolecule = true;
161            RNA3D->saved_x = xp->x;
162            RNA3D->saved_y = xp->y;
163            break;
164
165        case MIDDLE_BUTTON:
166            RNA3D->gl_Canvas->set_mode(AWT_MODE_NONE);
167            break;
168
169        case RIGHT_BUTTON:
170            break;
171
172        case WHEEL_UP:
173            RNA3D->scale += ZOOM_FACTOR;
174            break;
175
176        case WHEEL_DOWN:
177            RNA3D->scale -= ZOOM_FACTOR;
178            break;
179    }
180
181    RefreshOpenGLDisplay();
182}
183
184void MouseMoveEventHandler(Widget /* w*/, XtPointer /*client_data*/, XEvent *event, char* /*x*/ ) {
185
186    XMotionEvent *xp;
187    xp = (XMotionEvent*) event;
188
189    if (!RNA3D->bAutoRotate) {
190        RNA3D->ROTATION_SPEED = 0.5;
191    }
192
193    if(RNA3D->bRotateMolecule) {
194        // ComputeRotationXY : computes new rotation X and Y based on the mouse movement
195        ComputeRotationXY(xp->x, xp->y);
196    }
197
198    RefreshOpenGLDisplay();
199}
200
201void ExposeOpenGLWindow( Widget  w, XtPointer /*client_data*/, XEvent *event, char* /*x*/ ) {
202    static bool ok = false;
203
204    if ( RNA3D->OpenGLEngineState == NOT_CREATED ) {
205        // extern GBDATA* OpenGL_gb_main;
206        // OpenGL_gb_main = gb_main;
207
208        InitializeOpenGLWindow( w );
209
210        XExposeEvent *evt;
211        evt = (XExposeEvent*) event;
212
213        try {
214            InitializeOpenGLEngine( (GLint) evt->height, (GLint) evt->height );
215            ReshapeOpenGLWindow( (GLint) evt->width, (GLint) evt->height );
216            ok =  true;
217        }
218        catch (string& err) {
219            //errors catched here should close the RNA3D window again (or prevent it from opening)
220            aw_message(GBS_global_string("Error in RNA3D: %s", err.c_str()));
221            awm->hide();
222        }
223    }
224
225    if (ok) RefreshOpenGLDisplay();
226}
227
228void RefreshOpenGLDisplay() {
229
230    if ( RNA3D->OpenGLEngineState == CREATED ) {
231        RenderOpenGLScene(RNA3D->glw);
232    }
233}
234
235static void RefreshCanvas(AW_root *awr) {
236    MapDisplayParameters(awr);
237    RefreshOpenGLDisplay();
238}
239
240static void SyncronizeColorsWithEditor(AW_window *aww) {
241    // overwrites color settings with those from EDIT4
242
243    AW_copy_GCs(aww->get_root(), "ARB_EDIT4", "RNA3D", false,
244                "User1",   "User2",   "Probe",
245                "Primerl", "Primerr", "Primerg",
246                "Sigl",    "Sigr",    "Sigg",
247                "RANGE_0", "RANGE_1", "RANGE_2",
248                "RANGE_3", "RANGE_4", "RANGE_5",
249                "RANGE_6", "RANGE_7", "RANGE_8",
250                "RANGE_9",
251                NULL);
252}
253
254static void Change3DMolecule_CB(AW_root *awr) {
255    cout<<"Rendering new 3D molecule.... please wait..."<<endl;
256
257    RNA3D->cStructure->LSU_molID = awr->awar(AWAR_3D_23S_RRNA_MOL)->read_int();
258
259    RNA3D->cStructure->DeleteOldMoleculeData();        // Deleting the old molecule data
260    RNA3D->cStructure->ReadCoOrdinateFile();           // Reading Structure information
261    RNA3D->cStructure->GetSecondaryStructureInfo();    // Getting Secondary Structure Information
262    RNA3D->cStructure->Combine2Dand3DstructureInfo();  // Combining Secondary Structure data with 3D Coordinates
263    RNA3D->cStructure->GenerateDisplayLists();         // Generating Display Lists for Rendering
264
265    // recaluculate the mapping information
266    awr->awar(AWAR_SPECIES_NAME)->touch();
267
268    // recaluculate helix numbering
269    awr->awar(AWAR_3D_HELIX_FROM)->touch();
270
271    // render new structure in OpenGL window
272    RefreshCanvas(awr);
273}
274
275static void Change3DMolecule(AW_window *aww, long int molID) {
276    // changes the displayed 3D structure in the case of 23S rRNA
277    aww->get_root()->awar(AWAR_3D_23S_RRNA_MOL)->write_int(molID);
278}
279
280static void DisplayMoleculeMask(AW_root */*awr */){
281    RNA3D->bDisplayMask = !RNA3D->bDisplayMask;
282    RefreshOpenGLDisplay();
283}
284
285
286/*---------------------------- Creating WINDOWS ------------------------------ */
287static void AddCallBacks(AW_root *awr) {
288    // adding callbacks to the awars to refresh the display if received any changes
289
290    // General Molecule Display  Section
291    awr->awar(AWAR_3D_MOL_BACKBONE)->add_callback(RefreshCanvas);
292    awr->awar(AWAR_3D_MOL_COLORIZE)->add_callback(RefreshCanvas);
293    awr->awar(AWAR_3D_MOL_SIZE)->add_callback(RefreshCanvas);
294    awr->awar(AWAR_3D_MOL_DISP_POS)->add_callback(RefreshCanvas);
295    awr->awar(AWAR_3D_MOL_ROTATE)->add_callback(RotateMoleculeStateChanged_cb);
296    awr->awar(AWAR_3D_MOL_POS_INTERVAL)->add_callback(DisplayPostionsIntervalChanged_CB);
297    awr->awar(AWAR_3D_CURSOR_POSITION)->add_callback(RefreshCanvas);
298    awr->awar(AWAR_CURSOR_POSITION)->add_callback(CursorPositionChanged_CB);
299
300    // Display Base Section
301    awr->awar(AWAR_3D_DISPLAY_BASES)->add_callback(RefreshCanvas);
302    awr->awar(AWAR_3D_DISPLAY_SIZE)->add_callback(RefreshCanvas);
303    awr->awar(AWAR_3D_BASES_MODE)->add_callback(RefreshCanvas);
304    awr->awar(AWAR_3D_BASES_HELIX)->add_callback(RefreshCanvas);
305    awr->awar(AWAR_3D_BASES_UNPAIRED_HELIX)->add_callback(RefreshCanvas);
306    awr->awar(AWAR_3D_BASES_NON_HELIX)->add_callback(RefreshCanvas);
307    awr->awar(AWAR_3D_SHAPES_HELIX)->add_callback(RefreshCanvas);
308    awr->awar(AWAR_3D_SHAPES_UNPAIRED_HELIX)->add_callback(RefreshCanvas);
309    awr->awar(AWAR_3D_SHAPES_NON_HELIX)->add_callback(RefreshCanvas);
310
311    // Display Helix Section
312    awr->awar(AWAR_3D_DISPLAY_HELIX)->add_callback(RefreshCanvas);
313    awr->awar(AWAR_3D_HELIX_BACKBONE)->add_callback(RefreshCanvas);
314    awr->awar(AWAR_3D_HELIX_MIDPOINT)->add_callback(RefreshCanvas);
315    awr->awar(AWAR_3D_HELIX_FROM)->add_callback(DisplayHelixNrsChanged_CB);
316    awr->awar(AWAR_3D_HELIX_TO)->add_callback(DisplayHelixNrsChanged_CB);
317    awr->awar(AWAR_3D_HELIX_NUMBER)->add_callback(RefreshCanvas);
318    awr->awar(AWAR_3D_HELIX_SIZE)->add_callback(RefreshCanvas);
319    awr->awar(AWAR_3D_DISPLAY_TERTIARY_INTRACTIONS)->add_callback(RefreshCanvas);
320
321    // Mapping Sequence Data Section
322    awr->awar(AWAR_SPECIES_NAME)->add_callback(MapSelectedSpeciesChanged_CB);
323    awr->awar(AWAR_3D_MAP_ENABLE)->add_callback(RefreshCanvas);
324
325    awr->awar(AWAR_3D_MAP_SAI)->add_callback(RefreshCanvas);
326    awr->awar(AWAR_SAI_GLOBAL)->add_callback(MapSaiToEcoliTemplateChanged_CB);
327    awr->awar(AWAR_3D_MAP_SEARCH_STRINGS)->add_callback(RefreshCanvas);
328
329    awr->awar(AWAR_3D_MAP_SPECIES)->add_callback(RefreshCanvas);
330    awr->awar(AWAR_3D_MAP_SPECIES_DISP_BASE)->add_callback(RefreshCanvas);
331    awr->awar(AWAR_3D_MAP_SPECIES_DISP_POS)->add_callback(RefreshCanvas);
332    awr->awar(AWAR_3D_MAP_SPECIES_DISP_DELETIONS)->add_callback(RefreshCanvas);
333    awr->awar(AWAR_3D_MAP_SPECIES_DISP_MISSING)->add_callback(RefreshCanvas);
334    awr->awar(AWAR_3D_MAP_SPECIES_DISP_INSERTIONS)->add_callback(RefreshCanvas);
335    awr->awar(AWAR_3D_MAP_SPECIES_DISP_INSERTIONS_INFO)->add_callback(RefreshCanvas);
336
337    awr->awar(AWAR_3D_DISPLAY_MASK)->add_callback(DisplayMoleculeMask);
338    awr->awar(AWAR_3D_23S_RRNA_MOL)->add_callback(Change3DMolecule_CB);
339}
340
341static void RefreshMappingDisplay(AW_window */*aw */) {
342    // Refreshes the SAI Display if and when ...
343    // 1.Changes made to SAI related settings in EDIT4 and not updated automatically
344    // 2.Colors related to SAI Display changed in RNA3D Application
345    MapSaiToEcoliTemplateChanged_CB(RNA3D->root);
346
347    // Refreshes the Search Strings Display if
348    // Colors related to Search Strings changed in RNA3D Application
349    // and not updated automatically
350    MapSearchStringsToEcoliTemplateChanged_CB(RNA3D->root);
351
352    // Resetting the Molecule Transformations
353    // 1.Reset the Molecule view to Center of the viewer (default view).
354    // 2.Zoom the Molecule to fit to window (default zoom).
355    RNA3D->Center = Vector3(0.0, 0.0, 0.0);
356    RNA3D->scale = 0.01;
357
358    RefreshCanvas(RNA3D->root);
359}
360
361static AW_window *CreateDisplayBases_window(AW_root *aw_root) {
362    static AW_window_simple *aws = 0;
363    if (aws) return (AW_window *)aws;
364
365    aws = new AW_window_simple;
366
367    aws->init( aw_root, "DISPLAY_BASES", "RNA3D : Display BASES");
368    aws->load_xfig("RNA3D_DisplayBases.fig");
369
370    aws->callback( AW_POPUP_HELP,(AW_CL)"rna3d_dispBases.hlp");
371    aws->at("help");
372    aws->button_length(0);
373    aws->create_button("HELP","#help.xpm");
374
375    aws->at("close");
376    aws->callback((AW_CB0)AW_POPDOWN);
377    aws->button_length(0);
378    aws->create_button("CLOSE","#closeText.xpm");
379
380    {  // Display Bases Section
381        aws->at("dispBases");
382        aws->create_toggle(AWAR_3D_DISPLAY_BASES);
383
384        aws->at("helix");
385        aws->create_toggle(AWAR_3D_BASES_HELIX);
386        aws->at("unpairHelix");
387        aws->create_toggle(AWAR_3D_BASES_UNPAIRED_HELIX);
388        aws->at("nonHelix");
389        aws->create_toggle(AWAR_3D_BASES_NON_HELIX);
390
391        aws->at("shapesSize");
392        aws->create_input_field(AWAR_3D_DISPLAY_SIZE, 5);
393
394        aws->at("basesMode");
395        aws->create_toggle_field(AWAR_3D_BASES_MODE,0);
396        aws->insert_toggle("CHARACTERS", "C", 0);
397        aws->insert_toggle("SHAPES", "S", 1);
398        aws->update_toggle_field();
399
400        aws->at("spHelix");
401        aws->create_toggle_field(AWAR_3D_SHAPES_HELIX,1);
402        aws->insert_toggle("#circle.bitmap",    "C", 0);
403        aws->insert_toggle("#diamond.bitmap",   "D", 1);
404        aws->insert_toggle("#polygon.bitmap",   "P", 2);
405        aws->insert_toggle("#star.bitmap",      "S", 3);
406        aws->insert_toggle("#rectangle.bitmap", "R", 4);
407        aws->update_toggle_field();
408
409        aws->at("spUnpairedHelix");
410        aws->create_toggle_field(AWAR_3D_SHAPES_UNPAIRED_HELIX,1);
411        aws->insert_toggle("#circle.bitmap",    "C", 0);
412        aws->insert_toggle("#diamond.bitmap",   "D", 1);
413        aws->insert_toggle("#polygon.bitmap",   "P", 2);
414        aws->insert_toggle("#star.bitmap",      "S", 3);
415        aws->insert_toggle("#rectangle.bitmap", "R", 4);
416        aws->update_toggle_field();
417
418        aws->at("spNonHelix");
419        aws->create_toggle_field(AWAR_3D_SHAPES_NON_HELIX,1);
420        aws->insert_toggle("#circle.bitmap",    "C", 0);
421        aws->insert_toggle("#diamond.bitmap",   "D", 1);
422        aws->insert_toggle("#polygon.bitmap",   "P", 2);
423        aws->insert_toggle("#star.bitmap",      "S", 3);
424        aws->insert_toggle("#rectangle.bitmap", "R", 4);
425        aws->update_toggle_field();
426    }
427
428    aws->show();
429
430    return (AW_window *)aws;
431}
432
433static AW_window *CreateDisplayHelices_window(AW_root *aw_root) {
434    static AW_window_simple *aws = 0;
435    if (aws) return (AW_window *)aws;
436
437    aws = new AW_window_simple;
438
439    aws->init( aw_root, "DISPLAY_HELICES", "RNA3D : Display HELICES");
440    aws->load_xfig("RNA3D_DisplayHelices.fig");
441
442    aws->callback( AW_POPUP_HELP,(AW_CL)"rna3d_dispHelices.hlp");
443    aws->at("help");
444    aws->button_length(0);
445    aws->create_button("HELP","#help.xpm");
446
447    aws->at("close");
448    aws->callback((AW_CB0)AW_POPDOWN);
449    aws->button_length(0);
450    aws->create_button("CLOSE","#closeText.xpm");
451
452    {  // Display Helices Section
453        aws->at("dispHelix");
454        aws->create_toggle(AWAR_3D_DISPLAY_HELIX);
455
456        aws->at("backbone");
457        aws->create_toggle(AWAR_3D_HELIX_BACKBONE);
458        aws->at("midHelix");
459        aws->create_toggle(AWAR_3D_HELIX_MIDPOINT);
460        aws->at("helixNr");
461        aws->create_toggle(AWAR_3D_HELIX_NUMBER);
462        aws->at("from");
463        aws->create_input_field(AWAR_3D_HELIX_FROM, 5);
464        aws->at("to");
465        aws->create_input_field(AWAR_3D_HELIX_TO, 5);
466        aws->at("helixSize");
467        aws->create_input_field(AWAR_3D_HELIX_SIZE, 5);
468        {
469            const char *helixRange;
470            Structure3D *s;
471#if defined(DEVEL_RALF)
472#warning s is not initialized here
473#endif // DEVEL_RALF
474            int rnaType = s->FindTypeOfRNA();
475
476            switch (rnaType) {
477                case LSU_23S: helixRange = "[1-101]"; break;
478                case SSU_16S: helixRange = "[1-50]";  break;
479                case LSU_5S:  helixRange = "[1-5]";   break;
480            }
481            aws->at("rangeLabel");
482            aws->create_autosize_button(0,helixRange);
483        }
484
485        aws->at("dispTI");
486        aws->create_toggle(AWAR_3D_DISPLAY_TERTIARY_INTRACTIONS);
487    }
488    aws->show();
489    return (AW_window *)aws;
490}
491
492static AW_window *CreateDisplayOptions_window(AW_root *aw_root) {
493    static AW_window_simple *aws = 0;
494    if (aws) return (AW_window *)aws;
495
496    aws = new AW_window_simple;
497
498    aws->init( aw_root, "GENERAL_DISPLAY", "RNA3D : General Display ");
499    aws->load_xfig("RNA3D_DisplayOptions.fig");
500
501    aws->callback( AW_POPUP_HELP,(AW_CL)"rna3d_dispMolecule.hlp");
502    aws->at("help");
503    aws->button_length(0);
504    aws->create_button("HELP","#help.xpm");
505
506    aws->at("close");
507    aws->callback((AW_CB0)AW_POPDOWN);
508    aws->button_length(0);
509    aws->create_button("CLOSE","#closeText.xpm");
510
511    {  // Display Molecule Section
512        aws->at("backbone");
513        aws->create_toggle(AWAR_3D_MOL_BACKBONE);
514        aws->at("color");
515        aws->create_toggle(AWAR_3D_MOL_COLORIZE);
516        aws->at("dispPos");
517        aws->create_toggle(AWAR_3D_MOL_DISP_POS);
518        aws->at("rot");
519        aws->create_toggle(AWAR_3D_MOL_ROTATE);
520        aws->at("pos");
521        aws->create_input_field(AWAR_3D_MOL_POS_INTERVAL, 2);
522        aws->at("molSize");
523        aws->create_input_field(AWAR_3D_MOL_SIZE, 5);
524        aws->at("cp");
525        aws->create_toggle(AWAR_3D_CURSOR_POSITION);
526    }
527    aws->show();
528    return (AW_window *)aws;
529}
530
531
532static AW_window *CreateMapSequenceData_window(AW_root *aw_root) {
533    static AW_window_simple *aws = 0;
534    if (aws) return (AW_window *)aws;
535
536    aws = new AW_window_simple;
537
538    aws->init( aw_root, "MAP_SPECIES", "RNA3D : Map Sequence Data ");
539    aws->load_xfig("RNA3D_SeqMapping.fig");
540
541    aws->callback( AW_POPUP_HELP,(AW_CL)"rna3d_mapSeqData.hlp");
542    aws->at("help");
543    aws->button_length(0);
544    aws->create_button("HELP","#help.xpm");
545
546    aws->at("close");
547    aws->callback((AW_CB0)AW_POPDOWN);
548    aws->button_length(0);
549    aws->create_button("CLOSE","#closeText.xpm");
550
551    aws->callback(SyncronizeColorsWithEditor);
552    aws->at("sync");
553    aws->button_length(35);
554    aws->create_button("SYNC","SYNCHRONIZE COLORS WITH EDITOR");
555
556    {  // Display Map Current Species Section
557        aws->at("en");
558        aws->create_toggle(AWAR_3D_MAP_ENABLE);
559
560        aws->at("src");
561        aws->create_toggle(AWAR_3D_MAP_SEARCH_STRINGS);
562
563        aws->at("sai");
564        aws->create_toggle(AWAR_3D_MAP_SAI);
565
566        aws->callback(RefreshMappingDisplay);
567        aws->at("ref");
568        aws->button_length(0);
569        aws->create_button("REFRESH","#refresh.xpm");
570
571        aws->at("sp");
572        aws->create_toggle(AWAR_3D_MAP_SPECIES);
573        aws->at("base");
574        aws->create_toggle(AWAR_3D_MAP_SPECIES_DISP_BASE);
575        aws->at("pos");
576        aws->create_toggle(AWAR_3D_MAP_SPECIES_DISP_POS);
577        aws->at("del");
578        aws->create_toggle(AWAR_3D_MAP_SPECIES_DISP_DELETIONS);
579        aws->at("mis");
580        aws->create_toggle(AWAR_3D_MAP_SPECIES_DISP_MISSING);
581        aws->at("ins");
582        aws->create_toggle(AWAR_3D_MAP_SPECIES_DISP_INSERTIONS);
583        aws->at("bs");
584        aws->create_toggle(AWAR_3D_MAP_SPECIES_DISP_INSERTIONS_INFO);
585    }
586    aws->show();
587    return (AW_window *)aws;
588}
589
590static AW_window *CreateChangeMolecule_window(AW_root *aw_root) {
591    static AW_window_simple *aws = 0;
592    if (aws) return (AW_window *)aws;
593
594    aws = new AW_window_simple;
595
596    aws->init( aw_root, "CHANGE_MOLECULE", "RNA3D : Change 3D Molecule");
597    aws->load_xfig("RNA3D_ChangeMolecule.fig");
598
599    aws->callback( AW_POPUP_HELP,(AW_CL)"rna3d_changeMolecule.hlp");
600    aws->at("help");
601    aws->button_length(0);
602    aws->create_button("HELP","#help.xpm");
603
604    aws->at("close");
605    aws->callback((AW_CB0)AW_POPDOWN);
606    aws->button_length(0);
607    aws->create_button("CLOSE","#closeText.xpm");
608
609    aws->callback(Change3DMolecule,1);
610    aws->at("1pnu");
611    aws->button_length(73);
612    aws->create_button(0,"1PNU: 8.7 A^ Vila-Sanjurjo et al. Proc.Nat.Acad.Sci.(2003) 100, 8682.");
613
614    aws->callback(Change3DMolecule,2);
615    aws->at("1vor");
616    aws->button_length(73);
617    aws->create_button(0,"1VOR: 11.5 A^ Vila-Sanjurjo et al. Nat.Struct.Mol.Biol.(2004) 11, 1054.");
618
619    aws->callback(Change3DMolecule,3);
620    aws->at("1c2w");
621    aws->button_length(73);
622    aws->create_button(0,"1C2W: 7.5 A^ Mueller et al. J.Mol.Biol.(2000) 298, 35-59.", 0, "white");
623
624    aws->show();
625    return (AW_window *)aws;
626}
627
628static AW_window *CreateHelp_window(AW_root *aw_root) {
629    static AW_window_simple *aws = 0;
630    if (aws) return (AW_window *)aws;
631
632    aws = new AW_window_simple;
633
634    aws->init( aw_root, "HELP", "RNA3D : Display Options & Shortcuts");
635    aws->load_xfig("RNA3D_Help.fig");
636
637    aws->button_length(0);
638
639    aws->callback( AW_POPUP_HELP,(AW_CL)"rna3d_general.hlp");
640    aws->at("help");
641    aws->create_button("HELP","#help.xpm");
642
643    aws->at("close");
644    aws->callback((AW_CB0)AW_POPDOWN);
645    aws->create_button("CLOSE","#closeText.xpm");
646
647    aws->at("reload");
648    aws->create_button("reload","#refresh.xpm");
649    aws->at("color");
650    aws->create_button("colors", "#colors.xpm");
651    aws->at("base");
652    aws->create_button("displayBases", "#bases.xpm");
653    aws->at("helix");
654    aws->create_button("displayHelix", "#helix.xpm");
655    aws->at("mol");
656    aws->create_button("displayMolecule", "#molText.xpm");
657    aws->at("map");
658    aws->create_button("mapSpecies", "#mapping.xpm");
659    aws->at("check");
660    aws->create_button("check", "#check.xpm");
661    aws->at("uncheck");
662    aws->create_button("uncheck", "#uncheck.xpm");
663    aws->at("mask");
664    aws->create_button("mask", "#mask.xpm");
665    aws->at("unmask");
666    aws->create_button("unmask", "#unmask.xpm");
667    aws->at("exit");
668    aws->create_button("exit", "#quit.xpm");
669
670    aws->show();
671    return (AW_window *)aws;
672}
673
674AW_window *CreateRNA3DMainWindow(AW_root *awr){
675    // Main Window - Canvas on which the actual painting is done
676    extern GBDATA *GLOBAL_gb_main;
677    GB_transaction dummy(GLOBAL_gb_main);
678
679    awr->awar_int(AWAR_3D_SAI_SELECTED, 0, AW_ROOT_DEFAULT);
680
681    RNA3D_init_global_data();
682
683    awm = new AW_window_menu_modes_opengl();
684    awm->init(awr,"RNA3D", "RNA3D: 3D Structure of Ribosomal RNA", WINDOW_WIDTH, WINDOW_HEIGHT);
685
686    AW_gc_manager   aw_gc_manager;
687    RNA3D_Graphics *rna3DGraphics = new RNA3D_Graphics(awr,GLOBAL_gb_main);
688
689    Structure3D::gb_main = GLOBAL_gb_main;
690
691    RNA3D->gl_Canvas = new AWT_canvas(Structure3D::gb_main,awm, rna3DGraphics, aw_gc_manager,AWAR_SPECIES_NAME);
692
693    RNA3D->gl_Canvas->recalc_size();
694    RNA3D->gl_Canvas->refresh();
695    RNA3D->gl_Canvas->set_mode(AWT_MODE_NONE);
696
697    awm->create_menu("File", "F", 0,  AWM_ALL );
698    {
699        Structure3D *s;
700        int rnaType = s->FindTypeOfRNA();
701        if (rnaType == LSU_23S)
702            awm->insert_menu_topic( "changeMolecule", "Change Molecule", "M","rna3d_changeMolecule.hlp", AWM_ALL, AW_POPUP, (AW_CL)CreateChangeMolecule_window, 0);
703    }
704    awm->insert_menu_topic( "close", "Close", "C","quit.hlp", AWM_ALL, (AW_CB)AW_POPDOWN, 0, 0);
705
706    {
707        awm->at(1,2);
708        awm->auto_space(2,0);
709        awm->shadow_width(1);
710
711        int cur_x, cur_y, start_x, first_line_y, second_line_y;
712        awm->get_at_position( &start_x,&first_line_y);
713        awm->button_length(0);
714        awm->callback( (AW_CB0)AW_POPDOWN );
715        awm->create_button("Quit", "#quit.xpm");
716
717        awm->get_at_position( &cur_x,&cur_y );
718        awm->callback(RefreshMappingDisplay);
719        awm->button_length(0);
720        awm->create_button("REFRESH","#refresh.xpm");
721
722        awm->get_at_position( &cur_x,&cur_y );
723        awm->button_length(0);
724        awm->create_toggle(AWAR_3D_DISPLAY_MASK, "#unmask.xpm", "#mask.xpm");
725
726        awm->get_at_position( &cur_x,&cur_y );
727        awm->callback(AW_POPUP,(AW_CL)AW_create_gc_window,(AW_CL)aw_gc_manager);
728        awm->button_length(0);
729        awm->create_button("setColors", "#colors.xpm");
730
731        awm->get_at_position( &cur_x,&cur_y );
732        awm->callback(AW_POPUP,(AW_CL)CreateDisplayBases_window,(AW_CL)0);
733        awm->button_length(0);
734        awm->create_button("displayBases", "#basesText.xpm");
735
736        awm->get_at_position( &cur_x,&cur_y );
737        awm->at(cur_x-10, cur_y);
738        awm->create_toggle(AWAR_3D_DISPLAY_BASES, "#uncheck.xpm", "#check.xpm");
739
740        awm->get_at_position( &cur_x,&cur_y );
741        awm->callback(AW_POPUP,(AW_CL)CreateDisplayHelices_window,(AW_CL)0);
742        awm->button_length(0);
743        awm->create_button("displayHelix", "#helixText.xpm");
744
745        awm->get_at_position( &cur_x,&cur_y );
746        awm->at(cur_x-10, cur_y);
747        awm->create_toggle(AWAR_3D_DISPLAY_HELIX, "#uncheck.xpm", "#check.xpm");
748
749        awm->get_at_position( &cur_x,&cur_y );
750        awm->callback(AW_POPUP,(AW_CL)CreateDisplayOptions_window,(AW_CL)0);
751        awm->button_length(0);
752        awm->create_button("displayMolecule", "#molText.xpm");
753
754        awm->get_at_position( &cur_x,&cur_y );
755        awm->callback(AW_POPUP,(AW_CL)CreateMapSequenceData_window,(AW_CL)0);
756        awm->button_length(0);
757        awm->create_button("mapSpecies", "#mapping.xpm");
758
759        awm->get_at_position( &cur_x,&cur_y );
760        awm->at(cur_x-10, cur_y);
761        awm->create_toggle(AWAR_3D_MAP_ENABLE, "#uncheck.xpm", "#check.xpm");
762
763        awm->get_at_position( &cur_x,&cur_y );
764        awm->callback(AW_POPUP,(AW_CL)CreateHelp_window,(AW_CL)0);
765        awm->button_length(0);
766        awm->create_button("help", "#helpText.xpm");
767
768        awm->at_newline();
769        awm->get_at_position( &cur_x,&second_line_y);
770        awm->create_autosize_button(0," Spacebar = auto rotate mode on/off | Mouse Left Button + Move = Rotates Molecule | Mouse Wheel = Zoom in/out");
771    }
772
773    AddCallBacks(awr);
774    RNA3D->root = awr;
775
776    appContext = AW_get_XtAppContext(awr);
777
778    RNA3D->OpenGLEngineState = NOT_CREATED;
779
780    /** Add event handlers */
781
782    Widget middle_area_widget = AW_get_AreaWidget(RNA3D->gl_Canvas->aww, AW_MIDDLE_AREA);
783
784    XtAddEventHandler(middle_area_widget, StructureNotifyMask, 0, ResizeOpenGLWindow,        (XtPointer)0);
785    XtAddEventHandler(middle_area_widget, ExposureMask,        0, ExposeOpenGLWindow,        (XtPointer)0);
786    XtAddEventHandler(middle_area_widget, KeyPressMask,        0, KeyPressEventHandler,      (XtPointer)0);
787    XtAddEventHandler(middle_area_widget, KeyReleaseMask,      0, KeyReleaseEventHandler,    (XtPointer)0);
788    XtAddEventHandler(middle_area_widget, ButtonPressMask,     0, ButtonPressEventHandler,   (XtPointer)0);
789    XtAddEventHandler(middle_area_widget, ButtonReleaseMask,   0, ButtonReleaseEventHandler, (XtPointer)0);
790    XtAddEventHandler(middle_area_widget, PointerMotionMask,   0, MouseMoveEventHandler,     (XtPointer)0);
791
792#ifdef DEBUG
793    cout<<"RNA3D: OpenGL Window created!"<<endl;
794#endif
795
796    return awm;
797}
Note: See TracBrowser for help on using the repository browser.