source: tags/arb-6.0/RNA3D/RNA3D_Interface.cxx

Last change on this file was 11464, checked in by westram, 10 years ago
  • un-dummy-fied transaction (renames only)
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 26.4 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(makeHelpCallback("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(makeHelpCallback("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
459            arb_assert(RNA3D->cStructure);
460            int rnaType = RNA3D->cStructure->FindTypeOfRNA();
461
462            switch (rnaType) {
463                case LSU_23S: helixRange = "[1-101]"; break;
464                case SSU_16S: helixRange = "[1-50]";  break;
465                case LSU_5S:  helixRange = "[1-5]";   break;
466            }
467            aws->at("rangeLabel");
468            aws->create_autosize_button(0, helixRange);
469        }
470
471        aws->at("dispTI");
472        aws->create_toggle(AWAR_3D_DISPLAY_TERTIARY_INTRACTIONS);
473    }
474    aws->show();
475    return (AW_window *)aws;
476}
477
478static AW_window *CreateDisplayOptions_window(AW_root *aw_root) {
479    static AW_window_simple *aws = 0;
480    if (aws) return (AW_window *)aws;
481
482    aws = new AW_window_simple;
483
484    aws->init(aw_root, "GENERAL_DISPLAY", "RNA3D : General Display ");
485    aws->load_xfig("RNA3D_DisplayOptions.fig");
486
487    aws->callback(makeHelpCallback("rna3d_dispMolecule.hlp"));
488    aws->at("help");
489    aws->button_length(0);
490    aws->create_button("HELP", "#help.xpm");
491
492    aws->at("close");
493    aws->callback((AW_CB0)AW_POPDOWN);
494    aws->button_length(0);
495    aws->create_button("CLOSE", "#closeText.xpm");
496
497    {  // Display Molecule Section
498        aws->at("backbone");
499        aws->create_toggle(AWAR_3D_MOL_BACKBONE);
500        aws->at("color");
501        aws->create_toggle(AWAR_3D_MOL_COLORIZE);
502        aws->at("dispPos");
503        aws->create_toggle(AWAR_3D_MOL_DISP_POS);
504        aws->at("rot");
505        aws->create_toggle(AWAR_3D_MOL_ROTATE);
506        aws->at("pos");
507        aws->create_input_field(AWAR_3D_MOL_POS_INTERVAL, 2);
508        aws->at("molSize");
509        aws->create_input_field(AWAR_3D_MOL_SIZE, 5);
510        aws->at("cp");
511        aws->create_toggle(AWAR_3D_CURSOR_POSITION);
512    }
513    aws->show();
514    return (AW_window *)aws;
515}
516
517
518static AW_window *CreateMapSequenceData_window(AW_root *aw_root) {
519    static AW_window_simple *aws = 0;
520    if (aws) return (AW_window *)aws;
521
522    aws = new AW_window_simple;
523
524    aws->init(aw_root, "MAP_SPECIES", "RNA3D : Map Sequence Data ");
525    aws->load_xfig("RNA3D_SeqMapping.fig");
526
527    aws->callback(makeHelpCallback("rna3d_mapSeqData.hlp"));
528    aws->at("help");
529    aws->button_length(0);
530    aws->create_button("HELP", "#help.xpm");
531
532    aws->at("close");
533    aws->callback((AW_CB0)AW_POPDOWN);
534    aws->button_length(0);
535    aws->create_button("CLOSE", "#closeText.xpm");
536
537    aws->callback(SynchronizeColorsWithEditor);
538    aws->at("sync");
539    aws->button_length(35);
540    aws->create_button("SYNC", "SYNCHRONIZE COLORS WITH EDITOR");
541
542    {  // Display Map Current Species Section
543        aws->at("en");
544        aws->create_toggle(AWAR_3D_MAP_ENABLE);
545
546        aws->at("src");
547        aws->create_toggle(AWAR_3D_MAP_SEARCH_STRINGS);
548
549        aws->at("sai");
550        aws->create_toggle(AWAR_3D_MAP_SAI);
551
552        aws->callback(RefreshMappingDisplay);
553        aws->at("ref");
554        aws->button_length(0);
555        aws->create_button("REFRESH", "#refresh.xpm");
556
557        aws->at("sp");
558        aws->create_toggle(AWAR_3D_MAP_SPECIES);
559        aws->at("base");
560        aws->create_toggle(AWAR_3D_MAP_SPECIES_DISP_BASE);
561        aws->at("pos");
562        aws->create_toggle(AWAR_3D_MAP_SPECIES_DISP_POS);
563        aws->at("del");
564        aws->create_toggle(AWAR_3D_MAP_SPECIES_DISP_DELETIONS);
565        aws->at("mis");
566        aws->create_toggle(AWAR_3D_MAP_SPECIES_DISP_MISSING);
567        aws->at("ins");
568        aws->create_toggle(AWAR_3D_MAP_SPECIES_DISP_INSERTIONS);
569        aws->at("bs");
570        aws->create_toggle(AWAR_3D_MAP_SPECIES_DISP_INSERTIONS_INFO);
571    }
572    aws->show();
573    return (AW_window *)aws;
574}
575
576static AW_window *CreateChangeMolecule_window(AW_root *aw_root) {
577    static AW_window_simple *aws = 0;
578    if (aws) return (AW_window *)aws;
579
580    aws = new AW_window_simple;
581
582    aws->init(aw_root, "CHANGE_MOLECULE", "RNA3D : Change 3D Molecule");
583    aws->load_xfig("RNA3D_ChangeMolecule.fig");
584
585    aws->callback(makeHelpCallback("rna3d_changeMolecule.hlp"));
586    aws->at("help");
587    aws->button_length(0);
588    aws->create_button("HELP", "#help.xpm");
589
590    aws->at("close");
591    aws->callback((AW_CB0)AW_POPDOWN);
592    aws->button_length(0);
593    aws->create_button("CLOSE", "#closeText.xpm");
594
595    aws->callback(Change3DMolecule, 1);
596    aws->at("1pnu");
597    aws->button_length(73);
598    aws->create_button(0, "1PNU: 8.7 A^ Vila-Sanjurjo et al. Proc.Nat.Acad.Sci.(2003) 100, 8682.");
599
600    aws->callback(Change3DMolecule, 2);
601    aws->at("1vor");
602    aws->button_length(73);
603    aws->create_button(0, "1VOR: 11.5 A^ Vila-Sanjurjo et al. Nat.Struct.Mol.Biol.(2004) 11, 1054.");
604
605    aws->callback(Change3DMolecule, 3);
606    aws->at("1c2w");
607    aws->button_length(73);
608    aws->create_button(0, "1C2W: 7.5 A^ Mueller et al. J.Mol.Biol.(2000) 298, 35-59.", 0, "white");
609
610    aws->show();
611    return (AW_window *)aws;
612}
613
614static AW_window *CreateHelp_window(AW_root *aw_root) {
615    static AW_window_simple *aws = 0;
616    if (aws) return (AW_window *)aws;
617
618    aws = new AW_window_simple;
619
620    aws->init(aw_root, "HELP", "RNA3D : Display Options & Shortcuts");
621    aws->load_xfig("RNA3D_Help.fig");
622
623    aws->button_length(0);
624
625    aws->callback(makeHelpCallback("rna3d_general.hlp"));
626    aws->at("help");
627    aws->create_button("HELP", "#help.xpm");
628
629    aws->at("close");
630    aws->callback((AW_CB0)AW_POPDOWN);
631    aws->create_button("CLOSE", "#closeText.xpm");
632
633    aws->at("reload");
634    aws->create_button("reload", "#refresh.xpm");
635    aws->at("color");
636    aws->create_button("colors", "#colors.xpm");
637    aws->at("base");
638    aws->create_button("displayBases", "#bases.xpm");
639    aws->at("helix");
640    aws->create_button("displayHelix", "#helix.xpm");
641    aws->at("mol");
642    aws->create_button("displayMolecule", "#molText.xpm");
643    aws->at("map");
644    aws->create_button("mapSpecies", "#mapping.xpm");
645    aws->at("check");
646    aws->create_button("check", "#check.xpm");
647    aws->at("uncheck");
648    aws->create_button("uncheck", "#uncheck.xpm");
649    aws->at("mask");
650    aws->create_button("mask", "#mask.xpm");
651    aws->at("unmask");
652    aws->create_button("unmask", "#unmask.xpm");
653    aws->at("exit");
654    aws->create_button("exit", "#quit.xpm");
655
656    aws->show();
657    return (AW_window *)aws;
658}
659
660AW_window *CreateRNA3DMainWindow(AW_root *awr, GBDATA *gb_main, ED4_plugin_host& host) {
661    // Main Window - Canvas on which the actual painting is done
662    GB_transaction ta(gb_main);
663
664    awr->awar_int(AWAR_3D_SAI_SELECTED, 0, AW_ROOT_DEFAULT);
665
666    RNA3D_init_global_data(host);
667
668    awm = new AW_window_menu_modes_opengl;
669    awm->init(awr, "RNA3D", "RNA3D: 3D Structure of Ribosomal RNA", WINDOW_WIDTH, WINDOW_HEIGHT);
670
671    RNA3D_Graphics *rna3DGraphics = new RNA3D_Graphics(awr, gb_main);
672
673    Structure3D::gb_main = gb_main;
674
675    RNA3D->gl_Canvas = new AWT_canvas(Structure3D::gb_main, awm, awm->get_window_id(), rna3DGraphics, AWAR_SPECIES_NAME);
676
677    RNA3D->gl_Canvas->recalc_size_and_refresh();
678    RNA3D->gl_Canvas->set_mode(AWT_MODE_NONE);
679
680    awm->create_menu("File", "F", AWM_ALL);
681    {
682        arb_assert(RNA3D->cStructure);
683        int rnaType = RNA3D->cStructure->FindTypeOfRNA();
684        if (rnaType == LSU_23S) {
685            awm->insert_menu_topic("changeMolecule", "Change Molecule", "M", "rna3d_changeMolecule.hlp", AWM_ALL, AW_POPUP, (AW_CL)CreateChangeMolecule_window, 0);
686        }
687    }
688    awm->insert_menu_topic("close", "Close", "C", "quit.hlp", AWM_ALL, (AW_CB)AW_POPDOWN, 0, 0);
689
690    {
691        awm->at(1, 2);
692        awm->auto_space(2, 0);
693        awm->shadow_width(1);
694
695        int cur_x, cur_y, start_x, first_line_y, second_line_y;
696        awm->get_at_position(&start_x, &first_line_y);
697        awm->button_length(0);
698        awm->callback((AW_CB0)AW_POPDOWN);
699        awm->create_button("Quit", "#quit.xpm");
700
701        awm->get_at_position(&cur_x, &cur_y);
702        awm->callback(RefreshMappingDisplay);
703        awm->button_length(0);
704        awm->create_button("REFRESH", "#refresh.xpm");
705
706        awm->get_at_position(&cur_x, &cur_y);
707        awm->button_length(0);
708        awm->create_toggle(AWAR_3D_DISPLAY_MASK, "#unmask.xpm", "#mask.xpm");
709
710        awm->get_at_position(&cur_x, &cur_y);
711        awm->callback(makeCreateWindowCallback(AW_create_gc_window, RNA3D->gl_Canvas->gc_manager));
712        awm->button_length(0);
713        awm->create_button("setColors", "#colors.xpm");
714
715        awm->get_at_position(&cur_x, &cur_y);
716        awm->callback(AW_POPUP, (AW_CL)CreateDisplayBases_window, (AW_CL)0);
717        awm->button_length(0);
718        awm->create_button("displayBases", "#basesText.xpm");
719
720        awm->get_at_position(&cur_x, &cur_y);
721        awm->at(cur_x-10, cur_y);
722        awm->create_toggle(AWAR_3D_DISPLAY_BASES, "#uncheck.xpm", "#check.xpm");
723
724        awm->get_at_position(&cur_x, &cur_y);
725        awm->callback(AW_POPUP, (AW_CL)CreateDisplayHelices_window, (AW_CL)0);
726        awm->button_length(0);
727        awm->create_button("displayHelix", "#helixText.xpm");
728
729        awm->get_at_position(&cur_x, &cur_y);
730        awm->at(cur_x-10, cur_y);
731        awm->create_toggle(AWAR_3D_DISPLAY_HELIX, "#uncheck.xpm", "#check.xpm");
732
733        awm->get_at_position(&cur_x, &cur_y);
734        awm->callback(AW_POPUP, (AW_CL)CreateDisplayOptions_window, (AW_CL)0);
735        awm->button_length(0);
736        awm->create_button("displayMolecule", "#molText.xpm");
737
738        awm->get_at_position(&cur_x, &cur_y);
739        awm->callback(AW_POPUP, (AW_CL)CreateMapSequenceData_window, (AW_CL)0);
740        awm->button_length(0);
741        awm->create_button("mapSpecies", "#mapping.xpm");
742
743        awm->get_at_position(&cur_x, &cur_y);
744        awm->at(cur_x-10, cur_y);
745        awm->create_toggle(AWAR_3D_MAP_ENABLE, "#uncheck.xpm", "#check.xpm");
746
747        awm->get_at_position(&cur_x, &cur_y);
748        awm->callback(AW_POPUP, (AW_CL)CreateHelp_window, (AW_CL)0);
749        awm->button_length(0);
750        awm->create_button("help", "#helpText.xpm");
751
752        awm->at_newline();
753        awm->get_at_position(&cur_x, &second_line_y);
754        awm->create_autosize_button(0, " Spacebar = auto rotate mode on/off | Mouse Left Button + Move = Rotates Molecule | Mouse Wheel = Zoom in/out");
755    }
756
757    AddCallBacks(awr);
758    RNA3D->root = awr;
759
760    appContext = AW_get_XtAppContext(awr);
761
762    RNA3D->OpenGLEngineState = NOT_CREATED;
763
764    // Add event handlers:
765    Widget middle_area_widget = AW_get_AreaWidget(RNA3D->gl_Canvas->aww, AW_MIDDLE_AREA);
766
767    XtAddEventHandler(middle_area_widget, StructureNotifyMask, 0, ResizeOpenGLWindow,        (XtPointer)0);
768    XtAddEventHandler(middle_area_widget, ExposureMask,        0, ExposeOpenGLWindow,        (XtPointer)0);
769    XtAddEventHandler(middle_area_widget, KeyPressMask,        0, KeyPressEventHandler,      (XtPointer)0);
770    XtAddEventHandler(middle_area_widget, KeyReleaseMask,      0, KeyReleaseEventHandler,    (XtPointer)0);
771    XtAddEventHandler(middle_area_widget, ButtonPressMask,     0, ButtonPressEventHandler,   (XtPointer)0);
772    XtAddEventHandler(middle_area_widget, ButtonReleaseMask,   0, ButtonReleaseEventHandler, (XtPointer)0);
773    XtAddEventHandler(middle_area_widget, PointerMotionMask,   0, MouseMoveEventHandler,     (XtPointer)0);
774
775#ifdef DEBUG
776    cout<<"RNA3D: OpenGL Window created!"<<endl;
777#endif
778
779    InitCallBacks(awr);
780   
781    return awm;
782}
Note: See TracBrowser for help on using the repository browser.