source: tags/old_import_filter/RNA3D/RNA3D_Interface.cxx

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