source: source/class/pf/Application.js @ 151:b39582aa9a81

Last change on this file since 151:b39582aa9a81 was 151:b39582aa9a81, checked in by fnevgeny, 15 years ago

Final touches on alignments.

File size: 79.4 KB
Line 
1/* ************************************************************************
2
3   Copyright: Weizmann Institute of Science
4
5   License: GPL
6
7   Authors: Evgeny Stambulchik
8
9************************************************************************ */
10
11/* ************************************************************************
12
13#asset(pf/image/*.png)
14#asset(pf/html/*.html)
15
16************************************************************************ */
17
18
19function changeN_e(ev)
20{
21    var e = ev.getTarget();
22    var N_e = e.getNumValue();
23   
24    if (isFinite(N_e) && this.plasma.e.setN(N_e)) {
25        this.updatePlasmaParameters();
26        this.updateGUI();
27    }
28}
29
30function changeT_e(ev)
31{
32    var e = ev.getTarget();
33    var T_e = e.getNumValue();
34   
35    if (isFinite(T_e)) {
36        this.plasma.e.setT(T_e);
37        this.plasma.i.setT(T_e);
38        this.plasma.r.setT(T_e);
39        this.updateGUI();
40    }
41}
42
43function changeZ_i(ev)
44{
45    var e = ev.getTarget();
46    var Z_i = parseInt(e.getValue());
47   
48    if (isFinite(Z_i)) {
49        this.plasma.i.setQ(Z_i);
50        this.updatePlasmaParameters();
51        this.updateGUI();
52    }
53}
54
55function changeT_i(ev)
56{
57    var e = ev.getTarget();
58    var T_i = e.getNumValue();
59   
60    if (isFinite(T_i)) {
61        this.plasma.i.setT(T_i);
62        this.plasma.r.setT(T_i);
63        this.updateGUI();
64    }
65}
66
67function changeZ_r(ev)
68{
69    var e = ev.getTarget();
70    var Z_r = parseInt(e.getValue());
71   
72    if (isFinite(Z_r)) {
73        this.plasma.r.setQ(Z_r);
74        this.updatePlasmaParameters();
75        this.updateGUI();
76    }
77}
78
79function changeP_r(ev)
80{
81    var e = ev.getTarget();
82    var P_r = parseInt(e.getValue())/100.0;
83   
84    if (isFinite(P_r)) {
85        this.plasma.P_r = P_r;
86        this.updatePlasmaParameters();
87        this.updateGUI();
88    }
89}
90
91function changeT_r(ev)
92{
93    var e = ev.getTarget();
94    var T_r = e.getNumValue();
95   
96    if (isFinite(T_r)) {
97        this.plasma.r.setT(T_r);
98        this.updateGUI();
99    }
100}
101
102function changeM_i(ev)
103{
104    var e = ev.getTarget();
105    var M_i = parseInt(e.getValue());
106   
107    if (isFinite(M_i)) {
108        this.plasma.i.setM(M_i);
109        this.updateGUI();
110    }
111}
112
113function changeM_r(ev)
114{
115    var e = ev.getTarget();
116    var M_r = parseInt(e.getValue());
117   
118    if (isFinite(M_r)) {
119        this.plasma.r.setM(M_r);
120        this.updateGUI();
121    }
122}
123
124function changeN_u(ev)
125{
126    var e = ev.getTarget();
127    var n_u = parseInt(e.getValue());
128   
129    this.plasma.n_u = n_u;
130    this.updateGUI();
131}
132
133function changeN_l(ev)
134{
135    var e = ev.getTarget();
136    var n_l = parseInt(e.getValue());
137   
138    this.plasma.n_l = n_l;
139    this.updateGUI();
140}
141
142function changeB(ev)
143{
144    var e = ev.getTarget();
145    var v = e.getNumValue();
146   
147    if (isFinite(v)) {
148        this.plasma.B = v;
149        this.updateGUI();
150    }
151}
152
153function viewMenuCB(ev)
154{
155    var explorer_is_seen;
156   
157    if (this.entity_tree.isSeeable()) {
158        explorer_is_seen = true;
159    } else {
160        explorer_is_seen = false;
161    }
162   
163    this.showSectionsButton.setEnabled(explorer_is_seen);
164    this.showSpeciesButton.setEnabled(explorer_is_seen);
165    this.redrawButton.setEnabled(this.canvas.isSeeable());
166
167    if (this.prefs.autoLoadWiki) {
168        this.loadWikiButton.setEnabled(false);
169    } else {
170        var tree = this.entity_tree;
171        var leaf = getSingleTreeSelectedItem(tree);
172        if (leaf && leaf.classname == "qx.ui.tree.TreeFile" && explorer_is_seen) {
173            this.loadWikiButton.setEnabled(true);
174        } else {
175            this.loadWikiButton.setEnabled(false);
176        }
177    }
178}
179
180function editMenuCB(ev)
181{
182    var explorer_is_seen;
183   
184    if (this.entity_tree.isSeeable()) {
185        explorer_is_seen = true;
186    } else {
187        explorer_is_seen = false;
188    }
189
190    var tree = this.entity_tree;
191    var leaf = getSingleTreeSelectedItem(tree);
192
193    if (leaf && leaf.classname == "qx.ui.tree.TreeFile" && explorer_is_seen) {
194        if (this.isFavorite(leaf)) {
195            this.editMenuButtonAddToFav.setEnabled(false);
196            this.editMenuButtonRemFromFav.setEnabled(true);
197        } else {
198            this.editMenuButtonAddToFav.setEnabled(true);
199            this.editMenuButtonRemFromFav.setEnabled(false);
200        }
201    } else {
202        this.editMenuButtonAddToFav.setEnabled(false);
203        this.editMenuButtonRemFromFav.setEnabled(false);
204    }
205}
206
207function getSingleTreeSelectedItem(tree)
208{
209    var sels = tree.getSelection();
210    if (sels && sels.length == 1) {
211        return sels[0];
212    } else {
213        return null;
214    }
215}
216
217function treeMenuCB(ev)
218{
219    if (ev.getButton() == "right") {
220        var menu = this.treeMenu;
221
222        if (menu.isSeeable()) {
223            menu.hide();
224        } else {
225            var w = ev.getTarget();
226            var leaf = null;
227            if (w.classname == "qx.ui.tree.TreeFile") {
228                leaf = w;
229            } else
230            if (w.getLayoutParent().classname == "qx.ui.tree.TreeFile") {
231                leaf = w.getLayoutParent();
232            }
233           
234            if (leaf) {
235                if (this.isFavorite(leaf)) {
236                    this.treeMenuButtonAddToFav.setEnabled(false);
237                    this.treeMenuButtonRemFromFav.setEnabled(true);
238                } else {
239                    this.treeMenuButtonAddToFav.setEnabled(true);
240                    this.treeMenuButtonRemFromFav.setEnabled(false);
241                }
242            } else {
243                this.treeMenuButtonAddToFav.setEnabled(false);
244                this.treeMenuButtonRemFromFav.setEnabled(false);
245            }
246           
247            // position & show the menu
248            menu.placeToMouse(ev);
249            menu.show();
250        };
251
252        // ev.stopPropagation();
253    }
254}
255
256function showFundamentalCB(ev)
257{
258    this.showFundamental = !this.showFundamental;
259    this.rePopulateTree();
260}
261
262function showSpectroscopyCB(ev)
263{
264    this.showSpectroscopy = !this.showSpectroscopy;
265    this.rePopulateTree();
266}
267
268function showWavesCB(ev)
269{
270    this.showWaves = !this.showWaves;
271    this.rePopulateTree();
272}
273
274function showCollisionsCB(ev)
275{
276    this.showCollisions = !this.showCollisions;
277    this.rePopulateTree();
278}
279
280function showElectronsCB(ev)
281{
282    this.showElectrons = !this.showElectrons;
283    this.rePopulateTree();
284}
285
286function showIonsCB(ev)
287{
288    this.showIons = !this.showIons;
289    this.rePopulateTree();
290}
291
292function showRadiatorsCB(ev)
293{
294    this.showRadiators = !this.showRadiators;
295    this.rePopulateTree();
296}
297
298function addToFavCB(ev)
299{
300    var tree = this.entity_tree;
301    var leaf = getSingleTreeSelectedItem(tree);
302
303    if (!leaf) {
304        return;
305    }
306
307    leaf.setTextColor("red");
308
309    // Add to the list of favorites
310    var fav = new Array;
311    fav.entity  = leaf.getUserData("entity");
312    fav.species = leaf.getUserData("species");
313    fav.color   = this.nextColor();
314    this.favorites.push(fav);
315   
316    // Switch the dimension selector ...
317    this.gui_compare_dim.selectByValue(fav.entity.dimension);
318    // ... and update the list of favorites
319    this.updateFavoritesListView();
320    this.updateLegendListView();
321}
322
323function removeFromFavCB(ev)
324{
325    var tree = this.entity_tree;
326    var leaf = getSingleTreeSelectedItem(tree);
327
328    if (!leaf) {
329        return;
330    }
331    leaf.setTextColor("black");
332
333    var entity  = leaf.getUserData("entity");
334    var species = leaf.getUserData("species");
335
336    // Remove from the list of favorites
337    for (var k = 0; k < this.favorites.length; k++) {
338        var fav = this.favorites[k];
339        if (fav.entity  == entity && fav.species == species) {
340            this.favorites.splice(k, 1);
341            break;
342        }
343    }
344
345    // Switch the dimension selector ...
346    this.gui_compare_dim.selectByValue(entity.dimension);
347    // ... and update the list of favorites
348    this.updateFavoritesListView();
349    this.updateLegendListView();
350}
351
352function clickTreeCB(ev)
353{
354    var tree = ev.getTarget();
355    var e = getSingleTreeSelectedItem(tree);
356    if (e) {
357        var entity = e.getUserData("entity");
358       
359        if (entity) {
360            this.gui_entity_units.update(entity.dimension,
361                this.prefs.units[entity.dimension]);
362        } else {
363            this.gui_entity_units.update(null, null);
364        }
365       
366        this.updateEntityValue();
367    }
368}
369
370function changeUnitsCB(ev)
371{
372    this.updateEntityValue();
373}
374
375/**
376 * The application
377 */
378qx.Class.define("pf.Application",
379{
380    extend : qx.application.Standalone,
381
382    /*
383    *****************************************************************************
384       MEMBERS
385    *****************************************************************************
386    */
387
388    members :
389    {
390        showFundamental  : true,
391        showSpectroscopy : true,
392        showWaves        : true,
393        showCollisions   : true,
394
395        showElectrons  : true,
396        showIons       : true,
397        showRadiators  : true,
398       
399        plasma : null,
400
401        updatePlasmaParameters : function()
402        {
403            return this.plasma.updateParameters();
404        },
405       
406        updateGUI : function()
407        {
408            if (this.prefs.currentConfigName) {
409                this.gui_configName.setLabel(this.prefs.currentConfigName);
410            }
411           
412            this.gui_N_e.setNumValue(this.plasma.e.getN());
413            this.gui_T_e.setNumValue(this.plasma.e.getT());
414           
415            this.gui_N_i.setNumValue(this.plasma.i.getN());
416            this.gui_T_i.setNumValue(this.plasma.i.getT());
417            this.gui_Z_i.setValue(this.plasma.i.getQ());
418            this.gui_M_i.setValue(this.plasma.i.getM());
419
420            this.gui_P_r.setValue(100*this.plasma.P_r);
421           
422            this.gui_N_r.setNumValue(this.plasma.r.getN());
423            this.gui_T_r.setNumValue(this.plasma.r.getT());
424            this.gui_Z_r.setValue(this.plasma.r.getQ());
425            this.gui_Zcore.setValue((this.plasma.r.getQ() + 1) + '');
426            this.gui_M_r.setValue(this.plasma.r.getM());
427           
428            this.gui_B.setNumValue(this.plasma.B);
429           
430            this.gui_n_u.setValue(this.plasma.n_u);
431            this.gui_n_l.setValue(this.plasma.n_l);
432           
433            // Update the currently selected entity
434            this.updateEntityValue();
435           
436            // Update the list of favorites
437            this.updateFavoritesListView();
438            this.updateLegendListView();
439        },
440       
441
442        getEntityFullName : function (entity, species)
443        {
444            var name = entity.name;
445            if (entity.nspecies == 1) {
446                var prepos = entity.prepos;
447                if (!prepos) {
448                    prepos = "of";
449                }
450                name += " " + prepos + " ";
451                switch (species.id) {
452                case "e":
453                    name += "electrons";
454                    break;
455                case "i":
456                    name += "ions";
457                    break;
458                case "r":
459                    name += "radiators";
460                    break;
461                }
462            }
463           
464            return name;
465        },
466       
467        evaluateEntityValue : function(entity, species)
468        {
469            var formula;
470            if (entity.nspecies == 1) {
471                var species_str = "this.plasma." + species.id;
472                formula = entity.formula.replace(/\%s1/g, species_str);
473            } else {
474                formula = entity.formula;
475            }
476            var v = eval(formula);
477           
478            return v;
479        },
480       
481        updateEntityValue : function()
482        {
483            var tree = this.entity_tree;
484            var leaf = getSingleTreeSelectedItem(tree);
485           
486            if (!leaf) {
487                return;
488            }
489           
490            var entity  = leaf.getUserData("entity");
491            var species = leaf.getUserData("species");
492           
493            var name, section, value;
494            if (entity) {
495                var v     = this.evaluateEntityValue(entity, species);
496                var scale = this.gui_entity_units.getSelectedValue();
497               
498                name    = this.getEntityFullName(entity, species);
499                section = entity.section;
500                value   = v*scale
501            } else {
502                name    = null;
503                section = null;
504                value   = 0;
505            }
506           
507            this.gui_entity_name.setValue(name);
508
509            this.gui_entity_section.setValue(section);
510
511            if (isFinite(value)) {
512                this.gui_entity_value.setNumValue(value);
513            } else {
514                this.gui_entity_value.setValue("");
515            }
516           
517            if (this.prefs.autoLoadWiki) {
518                this.showWikiPage(entity);
519            } else {
520                this.showWikiPage(null);
521            }
522        },
523
524        isFavorite : function(leaf)
525        {
526            var entity  = leaf.getUserData("entity");
527            var species = leaf.getUserData("species");
528
529            for (var k = 0; k < this.favorites.length; k++) {
530                var fav = this.favorites[k];
531                if (fav.entity  == entity && fav.species == species) {
532                    return true;
533                    break;
534                }
535            }
536           
537            return false;
538        },
539
540        populateTree : function()
541        {
542            var i, n = plasma_entities.length;
543            var sa = new Array;
544            if (this.showElectrons) {
545                sa.push(this.plasma.e)
546            }
547            if (this.showIons) {
548                sa.push(this.plasma.i)
549            }
550            if (this.showRadiators) {
551                sa.push(this.plasma.r)
552            }
553           
554            for (var i = 0; i < n; i++) {
555                var entity = plasma_entities[i];
556               
557                if (entity.section == "fundamental" &&
558                    this.showFundamental != true) {
559                    continue;
560                }
561                if (entity.section == "spectroscopy" &&
562                    this.showSpectroscopy != true) {
563                    continue;
564                }
565                if (entity.section == "waves" &&
566                    this.showWaves != true) {
567                    continue;
568                }
569                if (entity.section == "collisions" &&
570                    this.showCollisions != true) {
571                    continue;
572                }
573               
574                var folder;
575                switch (entity.dimension) {
576                case "frequency":
577                    folder = this.gui_folder_freq;
578                    break;
579                case "length":
580                    folder = this.gui_folder_length;
581                    break;
582                case "velocity":
583                    folder = this.gui_folder_vel;
584                    break;
585                case "energy":
586                    folder = this.gui_folder_energy;
587                    break;
588                case "pressure":
589                    folder = this.gui_folder_pressure;
590                    break;
591                case "area":
592                    folder = this.gui_folder_area;
593                    break;
594                case "power_density":
595                    folder = this.gui_folder_power_density;
596                    break;
597                case "spectral_power_density":
598                    folder = this.gui_folder_spectral_power_density;
599                    break;
600                case "none":
601                    folder = this.gui_folder_none;
602                    break;
603                default:
604                    folder = this.gui_folder_misc;
605                    break;
606                }
607               
608                var leaf;
609               
610                switch (entity.nspecies) {
611                case 1:
612                    for (var j = 0; j < sa.length; j++) {
613                        var s = sa[j];
614                        var icon = "pf/image/" + s.id + "_small.png";
615
616                        leaf = new qx.ui.tree.TreeFile(entity.name);
617                        leaf.setIcon(icon);
618                        leaf.addListener("contextmenu", treeMenuCB, this);
619                        leaf.setUserData("entity", entity);
620                        leaf.setUserData("species", s);
621                       
622                        if (this.isFavorite(leaf)) {
623                            leaf.setTextColor("red");
624                        }
625
626                        folder.add(leaf);
627                    }
628                    break;
629                default:
630                    leaf = new qx.ui.tree.TreeFile(entity.name);
631                    leaf.setIcon("pf/image/all_small.png");
632                    leaf.addListener("contextmenu", treeMenuCB, this);
633                    leaf.setUserData("entity", entity);
634
635                    if (this.isFavorite(leaf)) {
636                        leaf.setTextColor("red");
637                    }
638                   
639                    folder.add(leaf);
640                    break;
641                }
642            }
643        }, 
644
645        cleanTree : function()
646        {
647            this.gui_folder_freq.removeAll();
648           
649            this.gui_folder_length.removeAll();
650           
651            this.gui_folder_vel.removeAll();
652           
653            this.gui_folder_none.removeAll();
654           
655            this.gui_folder_energy.removeAll();
656           
657            this.gui_folder_pressure.removeAll();
658           
659            this.gui_folder_area.removeAll();
660           
661            this.gui_folder_power_density.removeAll();
662
663            this.gui_folder_spectral_power_density.removeAll();
664           
665            this.gui_folder_misc.removeAll();
666        },
667
668        rePopulateTree : function()
669        {
670            this.cleanTree();
671           
672            this.populateTree();
673        },
674
675
676        updateFavoritesListView : function()
677        {
678            var lv = this.favoritesListView;
679            var tm = lv.getTableModel();
680           
681            var dimension = this.gui_compare_dim.getSelectedValue();
682           
683            var scale = this.gui_compare_units.getSelectedValue();
684           
685            var rowData = new Array();
686           
687            for (var i = 0; i < this.favorites.length; i++) {
688                var fav = this.favorites[i];
689                var entity = fav.entity;
690               
691                if (entity.dimension != dimension) {
692                    continue;
693                }
694               
695                var species = fav.species;
696
697                var icon;
698                if (species) {
699                    icon = "pf/image/" + species.id + "_small.png";
700                } else {
701                    icon = "pf/image/all_small.png";
702                }
703                var name = this.getEntityFullName(entity, species);
704                var value = scale*this.evaluateEntityValue(entity, species);
705
706                rowData.push([icon, name, entity.section,
707                    pf.util.Format.numPrint(value)]);
708            }
709           
710            tm.setData(rowData, false);
711            var sidx = tm.getSortColumnIndex();
712            tm.sortByColumn(sidx, tm.isSortAscending());
713           
714            lv.updateContent();
715            // lv.updateSort();
716            // lv.update();
717        },
718
719        updateLegendListView : function()
720        {
721            var lv = this.legendListView;
722            var tm = lv.getTableModel();
723
724            var rowData = new Array();
725           
726            var dimension = this.gui_compare_dim.getSelectedValue();
727           
728            for (var i = 0; i < this.favorites.length; i++) {
729                var fav = this.favorites[i];
730                var entity = fav.entity;
731               
732                if (entity.dimension != dimension) {
733                    continue;
734                }
735               
736                var species = fav.species;
737
738                var icon;
739                if (species) {
740                    icon = "pf/image/" + species.id + "_small.png";
741                } else {
742                    icon = "pf/image/all_small.png";
743                }
744                var name  = this.getEntityFullName(entity, species);
745                var color = fav.color;
746
747                rowData.push({"icon": icon, "name": name, "color": color,
748                    "favorite": fav});
749            }
750           
751            tm.setDataAsMapArray(rowData);
752            // lv.updateContent();
753        },
754
755
756        renderTabPage : function(label, icon, checked)
757        {
758            var page_id;
759           
760            page_id = new qx.ui.tabview.Page(label, icon);
761            this.tabview.add(page_id, {height: "100%"});
762
763            if (checked) {
764                this.tabview.setSelection(page_id);
765            }
766           
767            return page_id;
768        },
769
770        renderParametersTab : function()
771        {
772            var fr, gl, rc, rc1, rc2;
773           
774            var page_id = this.renderTabPage("Parameters",
775                "pf/image/tab-parameters.png", true);
776            page_id.setLayout(new qx.ui.layout.VBox(1));
777
778            fr = new qx.ui.groupbox.GroupBox("Configuration name",
779                "pf/image/info.png");
780            fr.setLayout(new qx.ui.layout.VBox());
781
782            this.gui_configName =
783                new qx.ui.basic.Atom(this.prefs.currentConfigName);
784            this.gui_configName.setRich(true)
785            fr.add(this.gui_configName);
786            page_id.add(fr);
787           
788
789            rc = new qx.ui.container.Composite(new qx.ui.layout.HBox(1));
790            page_id.add(rc);
791           
792            rc1 = new qx.ui.container.Composite(new qx.ui.layout.VBox(2));
793            rc.add(rc1, {flex : 1});
794           
795            rc2 = new qx.ui.container.Composite(new qx.ui.layout.VBox(2));
796            rc.add(rc2, {flex : 1});
797           
798           
799            fr = new qx.ui.groupbox.GroupBox("Electrons",
800                "pf/image/e_small.png");
801            fr.setLayout(new qx.ui.layout.VBox());
802
803            rc1.add(fr);
804
805            var layout = new qx.ui.layout.Grid(4, 6);
806            layout.setColumnWidth(0, 80);
807            layout.setColumnFlex(1, 1);
808            gl = new qx.ui.container.Composite(layout);
809
810            fr.add(gl);
811
812            var l, e;
813
814            // N_e
815            l = new qx.ui.basic.Label("N<sub>e</sub> (cm<sup>-3</sup>):");
816            l.setRich(true);
817            gl.add(l, {row: 0, column: 0});
818            e = new pf.ui.TextField(this.plasma.e.getN());
819            gl.add(e, {row: 0, column: 1});
820            e.addListener("changeValue", changeN_e, this);
821            this.gui_N_e = e;
822
823            // T_e
824            l = new qx.ui.basic.Label("T<sub>e</sub> (eV):");
825            l.setRich(true);
826            gl.add(l, {row: 1, column: 0});
827            e = new pf.ui.TextField(this.plasma.e.getT());
828            gl.add(e, {row: 1, column: 1});
829            e.addListener("changeValue", changeT_e, this);
830            this.gui_T_e = e;
831           
832            fr = new qx.ui.groupbox.GroupBox("Ions",
833                "pf/image/i_small.png");
834            fr.setLayout(new qx.ui.layout.VBox());
835
836            rc1.add(fr);
837
838            layout = new qx.ui.layout.Grid(4, 6);
839            layout.setColumnWidth(0, 80);
840            layout.setColumnFlex(1, 1);
841            gl = new qx.ui.container.Composite(layout);
842
843            fr.add(gl);
844
845            // Z_i
846            l = new qx.ui.basic.Label("Z<sub>i</sub>:");
847            l.setRich(true);
848            gl.add(l, {row: 0, column: 0});
849            e = new qx.ui.form.Spinner(1, this.plasma.i.getQ(), 100);
850            gl.add(e, {row: 0, column: 1});
851            e.addListener("changeValue", changeZ_i, this);
852            this.gui_Z_i = e;
853           
854            // M_i
855            l = new qx.ui.basic.Label("M<sub>i</sub>:");
856            l.setRich(true);
857            gl.add(l, {row: 1, column: 0});
858            e = new qx.ui.form.Spinner(1, this.plasma.i.getM(), 200);
859            gl.add(e, {row: 1, column: 1});
860            e.addListener("changeValue", changeM_i, this);
861            this.gui_M_i = e;
862           
863            // T_i
864            l = new qx.ui.basic.Label("T<sub>i</sub> (eV):");
865            l.setRich(true);
866            gl.add(l, {row: 2, column: 0});
867            e = new pf.ui.TextField(this.plasma.i.getT());
868            gl.add(e, {row: 2, column: 1});
869            e.addListener("changeValue", changeT_i, this);
870            this.gui_T_i = e;
871
872            // N_i
873            l = new qx.ui.basic.Label("N<sub>i</sub> (cm<sup>-3</sup>):");
874            l.setRich(true);
875            gl.add(l, {row: 3, column: 0});
876            e = new pf.ui.TextField(this.plasma.i.getN());
877            gl.add(e, {row: 3, column: 1});
878            e.setReadOnly(true);
879            this.gui_N_i = e;
880           
881            fr = new qx.ui.groupbox.GroupBox("Radiators",
882                "pf/image/r_small.png");
883            fr.setLayout(new qx.ui.layout.VBox());
884
885            rc2.add(fr);
886
887            layout = new qx.ui.layout.Grid(4, 6);
888            layout.setColumnWidth(0, 80);
889            layout.setColumnFlex(1, 1);
890            gl = new qx.ui.container.Composite(layout);
891
892            fr.add(gl);
893
894            // Z_r
895            l = new qx.ui.basic.Label("Z<sub>r</sub>:");
896            l.setRich(true);
897            gl.add(l, {row: 0, column: 0});
898            e = new qx.ui.form.Spinner(0, this.plasma.r.getQ(), 100);
899            gl.add(e, {row: 0, column: 1});
900            e.addListener("changeValue", changeZ_r, this);
901            this.gui_Z_r = e;
902
903            // M_r
904            l = new qx.ui.basic.Label("M<sub>r</sub>:");
905            l.setRich(true);
906            gl.add(l, {row: 1, column: 0});
907            e = new qx.ui.form.Spinner(1, this.plasma.r.getM(), 200);
908            gl.add(e, {row: 1, column: 1});
909            e.addListener("changeValue", changeM_r, this);
910            this.gui_M_r = e;
911
912            // T_r
913            l = new qx.ui.basic.Label("T<sub>r</sub> (eV):");
914            l.setRich(true);
915            gl.add(l, {row: 2, column: 0});
916            e = new pf.ui.TextField(this.plasma.r.getT());
917            gl.add(e, {row: 2, column: 1});
918            e.addListener("changeValue", changeT_r, this);
919            this.gui_T_r = e;
920
921            // P_r
922            l = new qx.ui.basic.Label("P<sub>r</sub> (%):");
923            l.setRich(true);
924            gl.add(l, {row: 3, column: 0});
925            e = new qx.ui.form.Spinner(0, 100*this.plasma.P_r, 100);
926            gl.add(e, {row: 3, column: 1});
927            e.addListener("changeValue", changeP_r, this);
928            this.gui_P_r = e;
929
930            // N_r
931            l = new qx.ui.basic.Label("N<sub>r</sub> (cm<sup>-3</sup>):");
932            l.setRich(true);
933            gl.add(l, {row: 4, column: 0});
934            e = new pf.ui.TextField(this.plasma.r.getN());
935            e.setReadOnly(true);
936            gl.add(e, {row: 4, column: 1});
937            this.gui_N_r = e;
938
939
940            fr = new qx.ui.groupbox.GroupBox("Fields",
941                "pf/image/field_small.png");
942            fr.setLayout(new qx.ui.layout.VBox());
943
944            rc1.add(fr);
945
946            layout = new qx.ui.layout.Grid(4, 6);
947            layout.setColumnWidth(0, 80);
948            layout.setColumnFlex(1, 1);
949            gl = new qx.ui.container.Composite(layout);
950
951            fr.add(gl);
952
953
954            l = new qx.ui.basic.Label("B (T):");
955            l.setRich(true);
956            gl.add(l, {row: 0, column: 0});
957            e = new pf.ui.TextField(this.plasma.B);
958            gl.add(e, {row: 0, column: 1});
959            e.addListener("changeValue", changeB, this);
960            this.gui_B = e;
961
962            // Atomic system frame
963            fr = new qx.ui.groupbox.GroupBox("Atomic system",
964                "pf/image/all_small.png");
965            fr.setLayout(new qx.ui.layout.VBox());
966
967            rc2.add(fr);
968
969            layout = new qx.ui.layout.Grid(4, 6);
970            layout.setColumnWidth(0, 80);
971            layout.setColumnFlex(1, 1);
972            gl = new qx.ui.container.Composite(layout);
973
974            fr.add(gl);
975
976            l = new qx.ui.basic.Label("Z<sub>core</sub>:");
977            l.setRich(true);
978            gl.add(l, {row: 0, column: 0});
979            e = new qx.ui.form.TextField((this.plasma.r.getQ() + 1) + '');
980            e.setReadOnly(true);
981            gl.add(e, {row: 0, column: 1});
982            this.gui_Zcore = e;
983
984            l = new qx.ui.basic.Label("n<sub>u</sub>:");
985            l.setRich(true);
986            gl.add(l, {row: 1, column: 0});
987            e = new qx.ui.form.Spinner(2, this.plasma.n_u, 1000);
988            gl.add(e, {row: 1, column: 1});
989            e.addListener("changeValue", changeN_u, this);
990            this.gui_n_u = e;
991
992            l = new qx.ui.basic.Label("n<sub>l</sub>:");
993            l.setRich(true);
994            gl.add(l, {row: 2, column: 0});
995            e = new qx.ui.form.Spinner(1, this.plasma.n_l, 1000);
996            gl.add(e, {row: 2, column: 1});
997            e.addListener("changeValue", changeN_l, this);
998            this.gui_n_l = e;
999        },
1000
1001        renderExplorerTab : function()
1002        {
1003            var page_id = this.renderTabPage("Explorer",
1004                "pf/image/tab-explorer.png", false);
1005            page_id.setLayout(new qx.ui.layout.VBox);
1006
1007            var sp = new qx.ui.splitpane.Pane("horizontal");
1008            page_id.add(sp, {height: "100%"});
1009           
1010            // Create container with fixed dimensions for the left:
1011            var left_pane = new qx.ui.container.Composite(new qx.ui.layout.Grow).set({
1012              width: 250,
1013              decorator : "main"
1014            });
1015
1016            // Create container for the right:
1017            var right_pane = new qx.ui.container.Composite(new qx.ui.layout.VBox(4)).set({
1018              padding : 4,
1019              decorator : "main"
1020            });
1021
1022            sp.add(left_pane,  0, {flex: 1});
1023            sp.add(right_pane, 1, {flex: 2});
1024
1025           
1026            var tree = new qx.ui.tree.Tree("Browser");
1027            left_pane.add(tree);
1028           
1029            this.entity_tree = tree;
1030           
1031            var folder;
1032           
1033            var root = new qx.ui.tree.TreeFolder("Root");
1034            root.setOpen(true);
1035            tree.setRoot(root);
1036            tree.setHideRoot(true);
1037            tree.setRootOpenClose(true);
1038            tree.setOpenMode("none");
1039
1040            tree.addListener("changeSelection", clickTreeCB, this);
1041           
1042            folder = new qx.ui.tree.TreeFolder("Dimensionless");
1043            root.add(folder);
1044            this.gui_folder_none = folder;
1045
1046            folder = new qx.ui.tree.TreeFolder("Length");
1047            root.add(folder);
1048            this.gui_folder_length = folder;
1049           
1050            folder = new qx.ui.tree.TreeFolder("Frequency");
1051            root.add(folder);
1052            this.gui_folder_freq = folder;
1053
1054            folder = new qx.ui.tree.TreeFolder("Velocity");
1055            root.add(folder);
1056            this.gui_folder_vel = folder;
1057           
1058            folder = new qx.ui.tree.TreeFolder("Area");
1059            root.add(folder);
1060            this.gui_folder_area = folder;
1061
1062            folder = new qx.ui.tree.TreeFolder("Energy");
1063            root.add(folder);
1064            this.gui_folder_energy = folder;
1065
1066            folder = new qx.ui.tree.TreeFolder("Pressure");
1067            root.add(folder);
1068            this.gui_folder_pressure = folder;
1069
1070            folder = new qx.ui.tree.TreeFolder("Power density");
1071            root.add(folder);
1072            this.gui_folder_power_density = folder;
1073
1074            folder = new qx.ui.tree.TreeFolder("Power spectral density");
1075            root.add(folder);
1076            this.gui_folder_spectral_power_density = folder;
1077
1078            folder = new qx.ui.tree.TreeFolder("Miscellaneous");
1079            root.add(folder);
1080            this.gui_folder_misc = folder;
1081
1082           
1083
1084            this.populateTree();
1085
1086            // Build context-sensitive popup menu
1087            this.treeMenu = new qx.ui.menu.Menu;
1088            var button;
1089           
1090            button = new qx.ui.menu.Button("Add to Favorites",
1091                "pf/image/favorite-add.png");
1092            button.addListener("execute", addToFavCB, this);
1093            this.treeMenu.add(button);
1094            this.treeMenuButtonAddToFav = button;
1095            button = new qx.ui.menu.Button("Remove from Favorites",
1096                "pf/image/favorite-delete.png");
1097            button.addListener("execute", removeFromFavCB, this);
1098            this.treeMenu.add(button);
1099            this.treeMenuButtonRemFromFav = button;
1100           
1101            this.doc.add(this.treeMenu);
1102
1103
1104            var layout = new qx.ui.layout.Grid(4, 6);
1105            layout.setColumnFlex(0, 3);
1106            layout.setColumnFlex(1, 12);
1107            layout.setColumnFlex(2, 4);
1108            layout.setColumnMinWidth(0,  50);
1109            layout.setColumnMaxWidth(2, 150);
1110            var gl = new qx.ui.container.Composite(layout);
1111           
1112            var l, e;
1113           
1114
1115            l = new qx.ui.basic.Label("Name:");
1116            gl.add(l, {row: 0, column: 0});
1117            e = new qx.ui.form.TextField();
1118            e.setReadOnly(true);
1119            this.gui_entity_name = e;
1120            gl.add(e, {row: 0, column: 1, colSpan: 2});
1121
1122            l = new qx.ui.basic.Label("Value:");
1123            gl.add(l, {row: 1, column: 0});
1124            e = new pf.ui.TextField("");
1125            e.setReadOnly(true);
1126            gl.add(e, {row: 1, column: 1});
1127            this.gui_entity_value = e;
1128
1129            e = new pf.UnitSelector();
1130            e.addListener("changeSelection", changeUnitsCB, this);
1131            gl.add(e, {row: 1, column: 2});
1132            this.gui_entity_units = e;
1133
1134            l = new qx.ui.basic.Label("Section:");
1135            gl.add(l, {row: 2, column: 0});
1136            e = new qx.ui.form.TextField();
1137            e.setReadOnly(true);
1138            this.gui_entity_section = e;
1139            gl.add(e, {row: 2, column: 1, colSpan: 2});
1140
1141            right_pane.add(gl, {flex: 1});
1142           
1143            var frame = new qx.ui.embed.Iframe();
1144           
1145            right_pane.add(frame, {flex : 3 });
1146           
1147            this.gui_wiki = frame;
1148        },
1149       
1150        renderCompareTab : function()
1151        {
1152            var page_id = this.renderTabPage("Compare",
1153                "pf/image/tab-compare.png");
1154            page_id.setLayout(new qx.ui.layout.VBox(1));
1155           
1156            var bl = new qx.ui.container.Composite(new qx.ui.layout.VBox(10));
1157            page_id.add(bl, {height: "100%"});
1158           
1159            var rc = new qx.ui.container.Composite(new qx.ui.layout.HBox(10));
1160            bl.add(rc);
1161
1162            var l, e;
1163            l = new qx.ui.basic.Label("Dimension:");
1164            rc.add(l);
1165            e = new pf.ui.SelectBox;
1166            e.addItem("None", "none");
1167            e.addItem("Length", "length");
1168            e.addItem("Frequency", "frequency");
1169            e.addItem("Velocity", "velocity");
1170            e.addItem("Area", "area");
1171            e.addItem("Energy", "energy");
1172            e.addItem("Pressure", "pressure");
1173            e.addItem("Power density", "power_density");
1174            e.addItem("Power spectral density", "spectral_power_density");
1175            e.addItem("Electric field", "efield");
1176            e.addListener("changeSelection", function(ev) {
1177                    var dimension = this.gui_compare_dim.getSelectedValue();
1178                    this.gui_compare_units.update(dimension,
1179                        this.prefs.units[dimension]);
1180                    this.updateFavoritesListView();
1181                    this.updateLegendListView();
1182                }, this);
1183            rc.add(e);
1184            this.gui_compare_dim = e;
1185           
1186            l = new qx.ui.basic.Label("Units:");
1187            rc.add(l);
1188            e = new pf.UnitSelector();
1189            e.update("none");
1190            e.addListener("changeSelection", function(ev) {
1191                    this.updateFavoritesListView();
1192                }, this);
1193            rc.add(e);
1194            this.gui_compare_units = e;
1195
1196            // table model
1197            var tm = new qx.ui.table.model.Simple();
1198            tm.setColumns([ "", "Name", "Section", "Value" ]);
1199           
1200            tm.setColumnEditable(0, false);
1201            tm.setColumnEditable(1, false);
1202            tm.setColumnEditable(2, false);
1203            tm.setColumnEditable(3, false);
1204           
1205            tm.setColumnSortable(0, false);
1206           
1207            tm.setSortMethods(3, function(row1, row2) {
1208                var obj1 = parseFloat(row1[arguments.callee.columnIndex]);
1209                var obj2 = parseFloat(row2[arguments.callee.columnIndex]);
1210                return (obj1 > obj2) ? 1 : ((obj1 == obj2) ? 0 : -1);
1211            });
1212           
1213            // table list
1214            var lv = new qx.ui.table.Table(tm);
1215
1216            lv.setStatusBarVisible(false);
1217            lv.setShowCellFocusIndicator(false);
1218            lv.setColumnVisibilityButtonVisible(false);
1219           
1220            lv.setColumnWidth(0,  24);
1221            lv.setColumnWidth(1, 300);
1222            lv.setColumnWidth(2, 120);
1223           
1224            var renderer = new qx.ui.table.cellrenderer.Image(16, 16);
1225            lv.getTableColumnModel().setDataCellRenderer(0, renderer);
1226
1227            bl.add(lv, {flex: 1});
1228           
1229            this.favoritesListView = lv;
1230        },
1231       
1232        drawAll : function(ev)
1233        {
1234            var canvas = this.canvas;
1235           
1236            canvas.setPrintable(true);
1237           
1238            var pname = this.guiParameter.getSelectedValue();
1239            var vmin = this.guiMinParam.getNumValue();
1240            var vmax = this.guiMaxParam.getNumValue();
1241            var npoints = this.guiParamPoints.getValue();
1242           
1243            if (npoints < 2 || !pname) {
1244                return;
1245            }
1246
1247            var dimension = this.gui_compare_dim.getSelectedValue();
1248            var scale = this.gui_compare_units.getSelectedValue();
1249
1250            var par0;
1251            var label;
1252            switch (pname) {
1253            case "N_e":
1254                par0 = this.plasma.e.getN();
1255                label = "N<sub>e</sub> (cm<sup>-3</sup>)"
1256                break;
1257            case "T":
1258                par0 = this.plasma.e.getT();
1259                label = "T (eV)"
1260                break;
1261            case "T_e":
1262                par0 = this.plasma.e.getT();
1263                label = "T<sub>e</sub> (eV)"
1264                break;
1265            case "T_i":
1266                par0 = this.plasma.i.getT();
1267                label = "T<sub>i</sub> (eV)"
1268                break;
1269            case "T_r":
1270                par0 = this.plasma.r.getT();
1271                label = "T<sub>r</sub> (eV)"
1272                break;
1273            case "T_i,r":
1274                par0 = this.plasma.i.getT();
1275                label = "T<sub>i,r</sub> (eV)"
1276                break;
1277            case "B":
1278                par0 = this.plasma.B;
1279                label = "B (T)"
1280                break;
1281            default:
1282                return;
1283            }
1284           
1285            var xdata = new Array;
1286            for (var j = 0; j < npoints; j++) {
1287                var x = par0*(vmin + (vmax - vmin)*j/(npoints - 1));
1288                xdata.push(x);
1289            }
1290                       
1291            var wxmin = xdata[0];
1292            var wxmax = xdata[xdata.length - 1];
1293
1294            var wymin = 0;
1295            var wymax = 0;
1296
1297            var sets = new Array;
1298            var first = true;
1299            for (var i = 0; i < this.favorites.length; i++) {
1300                var fav = this.favorites[i];
1301                var entity = fav.entity;
1302               
1303                if (entity.dimension != dimension) {
1304                    continue;
1305                }
1306               
1307                var species = fav.species;
1308                var vname = this.getEntityFullName(entity, species);
1309
1310                var set   = new Array;
1311                var ydata = new Array;
1312                for (var j = 0; j < npoints; j++) {
1313                    var par = xdata[j];
1314
1315                    switch (pname) {
1316                    case "N_e":
1317                        this.plasma.e.setN(par);
1318                        this.updatePlasmaParameters();
1319                        break;
1320                    case "T_e":
1321                        this.plasma.e.setT(par);
1322                        break;
1323                    case "T_i":
1324                        this.plasma.i.setT(par);
1325                        break;
1326                    case "T_r":
1327                        this.plasma.r.setT(par);
1328                        break;
1329                    case "T_i,r":
1330                        this.plasma.i.setT(par);
1331                        this.plasma.r.setT(par);
1332                        break;
1333                    case "T":
1334                        this.plasma.e.setT(par);
1335                        this.plasma.i.setT(par);
1336                        this.plasma.r.setT(par);
1337                        break;
1338                    case "B":
1339                        this.plasma.B = par;
1340                        break;
1341                    }
1342                   
1343                    var value = scale*this.evaluateEntityValue(entity, species);
1344                   
1345                    if (first) {
1346                        wymin = value;
1347                        wymax = value;
1348                        first = false;
1349                    } else {
1350                        if (value < wymin) {
1351                            wymin = value;
1352                        }
1353                        if (value > wymax) {
1354                            wymax = value;
1355                        }
1356                    }
1357                   
1358                    ydata.push(value);
1359                }
1360                set.x = xdata;
1361                set.y = ydata;
1362                set.legend = vname;
1363                set.color = fav.color;
1364                sets.push(set);
1365            }
1366           
1367            // Restore parameter
1368            switch (pname) {
1369            case "N_e":
1370                this.plasma.e.setN(par0);
1371                this.updatePlasmaParameters();
1372                break;
1373            case "T_e":
1374                this.plasma.e.setT(par0);
1375                break;
1376            case "T_i":
1377                this.plasma.i.setT(par0);
1378                break;
1379            case "T_r":
1380                this.plasma.r.setT(par0);
1381                break;
1382            case "T_i,r":
1383                this.plasma.i.setT(par0);
1384                this.plasma.r.setT(par0);
1385                break;
1386            case "T":
1387                this.plasma.e.setT(par0);
1388                this.plasma.i.setT(par0);
1389                this.plasma.r.setT(par0);
1390                break;
1391            case "B":
1392                this.plasma.B = par0;
1393                break;
1394            }
1395           
1396            canvas.clear();
1397           
1398            canvas.setViewportCoordinates(0.15, 0.1, 0.9, 0.9);
1399            var dwx = Math.abs(wxmax - wxmin);
1400            if (dwx == 0) {
1401                dwx = wxmax;
1402            }
1403            var dwy = Math.abs(wymax - wymin);
1404            if (dwy == 0) {
1405                wymin = 0.0;
1406                if (wymax == 0) {
1407                    wymax = 1.0;
1408                } else {
1409                    wymax *= 2;
1410                }
1411            }
1412            var wymin_r =
1413                wymin < 0 ? (wymin - 0.05*dwy) : Math.max(0, wymin - 0.05*dwy);
1414            var wxmin_r =
1415                wxmin < 0 ? (wxmin - 0.05*dwx) : Math.max(0, wxmin - 0.05*dwx);
1416            canvas.setWorldCoordinates(wxmin_r, wymin_r,
1417                wxmax + 0.05*dwx, wymax + 0.05*dwy);
1418           
1419            // Draw frame
1420            canvas.drawFrame("black");
1421
1422            // Mark initial value of the varied parameter
1423            canvas.setColor("#c0c0c0");
1424            canvas.drawPolyLineW(new Array(par0, par0),
1425                new Array(wymin, wymax));
1426           
1427            // Draw title
1428            canvas.drawTitle(this.prefs.currentConfigName, "black");
1429           
1430            // Draw axis ticks
1431            canvas.drawTicks("x", "blue");
1432            canvas.drawTicks("y", "blue");
1433
1434            // Draw axis labels
1435            canvas.drawLabel("x", label, "black");
1436           
1437            // Draw sets
1438            for (var i = 0; i < sets.length; i++) {
1439                var set = sets[i];
1440                canvas.setColor(set.color);
1441                canvas.drawPolyLineW(set.x, set.y);
1442               
1443                delete set;
1444            }
1445           
1446            delete sets;
1447           
1448            canvas.paint();
1449        },
1450
1451        showWikiPage : function(entity)
1452        {
1453            var url = "about:blank";
1454            if (entity && entity.wikiLink) {
1455                url = "http://en.wikipedia.org/w/index.php?title=" +
1456                      entity.wikiLink + "&printable=yes";
1457            }
1458           
1459            this.gui_wiki.setSource(url);
1460        },
1461       
1462        loadWikiCB : function(ev)
1463        {
1464            var tree = this.entity_tree;
1465            var leaf = getSingleTreeSelectedItem(tree);
1466           
1467            if (!leaf) {
1468                return;
1469            }
1470           
1471            var entity = leaf.getUserData("entity");
1472           
1473            this.showWikiPage(entity);
1474        },
1475       
1476        drawCB : function(ev)
1477        {
1478            this.drawAll();
1479        },
1480       
1481        renderPlotTab : function()
1482        {
1483            var page_id = this.renderTabPage("Plot",
1484                "pf/image/tab-plot.png");
1485            page_id.setLayout(new qx.ui.layout.VBox);
1486
1487            var sp = new qx.ui.splitpane.Pane("horizontal");
1488            page_id.add(sp, {height: "100%"});
1489                       
1490            var left_pane = new qx.ui.container.Composite(new qx.ui.layout.Grow).set({
1491              decorator : "main"
1492            });
1493            var right_pane = new qx.ui.container.Composite(new qx.ui.layout.VBox(4)).set({
1494              padding : 4,
1495              decorator : "main"
1496            });
1497
1498            sp.add(left_pane,  2);
1499            sp.add(right_pane, 1);
1500           
1501            var canvas = new pf.ui.canvas.Plotter();
1502            left_pane.add(canvas);
1503            this.canvas = canvas;
1504
1505            var layout = new qx.ui.layout.Grid(4, 6);
1506            layout.setColumnWidth(0, 100);
1507            layout.setColumnFlex(1, 1);
1508            var gl = new qx.ui.container.Composite(layout);
1509
1510            var l, e;
1511
1512            var btn = new qx.ui.form.Button("Redraw", "pf/image/tab-plot.png");
1513            btn.addListener("execute", this.drawCB, this);
1514            gl.add(btn, {row: 0, column: 0});
1515
1516            l = new qx.ui.basic.Label("Parameter to vary:");
1517            e = new pf.ui.SelectBox;
1518            e.addItem("N_e",   "N_e");
1519            e.addItem("T",     "T");
1520            e.addItem("T_e",   "T_e");
1521            e.addItem("T_i",   "T_i");
1522            e.addItem("T_r",   "T_r");
1523            e.addItem("T_i,r", "T_i,r");
1524            e.addItem("B",     "B");
1525            e.selectByValue("N_e");
1526            this.guiParameter = e;
1527            gl.add(l, {row: 1, column: 0});
1528            gl.add(e, {row: 1, column: 1});
1529
1530            l = new qx.ui.basic.Label("Minimum scale:");
1531            e = new pf.ui.TextField(0.5);
1532            this.guiMinParam = e;
1533            gl.add(l, {row: 2, column: 0});
1534            gl.add(e, {row: 2, column: 1});
1535
1536            l = new qx.ui.basic.Label("Maximum scale:");
1537            e = new pf.ui.TextField(2.0);
1538            this.guiMaxParam = e;
1539            gl.add(l, {row: 3, column: 0});
1540            gl.add(e, {row: 3, column: 1});
1541
1542            l = new qx.ui.basic.Label("Number of points:");
1543            e = new qx.ui.form.Spinner(2, 20, 100);
1544            this.guiParamPoints = e;
1545            gl.add(l, {row: 4, column: 0});
1546            gl.add(e, {row: 4, column: 1});
1547
1548            right_pane.add(gl);
1549
1550
1551
1552            var tm = new qx.ui.table.model.Simple();
1553            tm.setColumns(["", "Name", "Color", ""],
1554                          ["icon", "name", "color", "favorite"]);
1555           
1556            tm.setColumnEditable(0, false);
1557            tm.setColumnEditable(1, false);
1558            tm.setColumnEditable(2, false);
1559           
1560            tm.setColumnSortable(1, false);
1561           
1562            // table list
1563            var lv = new qx.ui.table.Table(tm);
1564
1565            var cm = lv.getTableColumnModel();
1566            cm.setColumnVisible(3, false);
1567           
1568            lv.setStatusBarVisible(false);
1569            lv.setShowCellFocusIndicator(false);
1570            lv.setColumnVisibilityButtonVisible(false);
1571           
1572            lv.setColumnWidth(0,  24);
1573            lv.setColumnWidth(1, 185);
1574            lv.setColumnWidth(2,  55);
1575           
1576            var renderer = new qx.ui.table.cellrenderer.Image(16, 16);
1577            lv.getTableColumnModel().setDataCellRenderer(0, renderer);
1578
1579            right_pane.add(lv, {flex: 1});
1580            this.legendListView = lv;
1581           
1582            var sm = lv.getSelectionModel();
1583           
1584            lv.addListener("dblclick", function(ev) {
1585                    ev.stopPropagation();
1586
1587                    if (sm.isSelectionEmpty()) {
1588                        return;
1589                    }
1590                   
1591                    var index = sm.getLeadSelectionIndex();
1592                    var item = tm.getRowDataAsMap(index);
1593
1594                    var favorite = item.favorite;
1595                    if (!favorite) {
1596                        return;
1597                    }
1598                    cpop.setUserData("favorite", null); // avoid loop call
1599                    cpop.setValue(favorite.color);
1600                    cpop.setUserData("favorite", favorite);
1601                   
1602                    cpop.placeToMouse(ev);
1603                    cpop.open();
1604                });
1605
1606            var cpop = new pf.ui.ColorPopup(this.colorMap);
1607            cpop.exclude();
1608
1609            this.doc.add(cpop);
1610
1611            cpop.addListener("changeValue", function(ev) {
1612                    var color = ev.getData();
1613                    var cpop = ev.getTarget();
1614                    var favorite = cpop.getUserData("favorite");
1615                    if (!favorite || !color) {
1616                        return;
1617                    }
1618                    favorite.color = color;
1619                    this.updateLegendListView();
1620                    this.drawAll();
1621                }, this);
1622        },
1623
1624
1625        aboutCB : function(ev)
1626        {
1627            this.aboutWindow.open();
1628        },
1629       
1630        prefsCB : function(ev)
1631        {
1632            this.prefsWindow.open();
1633        },
1634       
1635        updateSaveLoadList : function()
1636        {
1637            var lv = this.saveLoadConfigList;
1638            var tm = lv.getTableModel();
1639           
1640            var configPtrs = this.prefs.configPtrs;
1641           
1642            var rowData = new Array();
1643
1644            var i;
1645            var d = new Date();
1646            var df = new qx.util.format.DateFormat("yyyy-MM-dd HH:mm:ss");
1647           
1648            for (i = 0; i < configPtrs.length; i++) {
1649                var configPtr = configPtrs[i];
1650
1651                d.setTime(configPtr.time);
1652
1653                rowData.push([configPtr.name, df.format(d)]);
1654            }
1655           
1656            tm.setData(rowData, false);
1657            var sidx = tm.getSortColumnIndex();
1658            tm.sortByColumn(sidx, tm.isSortAscending());
1659           
1660            lv.updateContent();
1661        },
1662       
1663        saveAsCB : function(ev)
1664        {
1665            var w = this.saveLoadWindow;
1666           
1667            this.updateSaveLoadList();
1668            this.saveLoadTextField.setValue(null);
1669            this.saveLoadTextField.setReadOnly(false);
1670           
1671            w.setCaption("Save configuration")
1672            w.setIcon("pf/image/save.png");
1673            w.setUserData("type", "save");
1674           
1675            w.open();
1676        },
1677       
1678        saveConfigCB : function(ev)
1679        {
1680            if (this.prefs.currentConfigName &&
1681                this.prefs.currentConfigName != "Untitled") {
1682                if (this.saveConfig(this.prefs.currentConfigName) != true) {
1683                    alert("Save failed!");
1684                }
1685            } else {
1686                this.saveAsCB(ev);
1687            }
1688        },
1689       
1690        openCB : function(ev)
1691        {
1692            var w = this.saveLoadWindow;
1693           
1694            this.updateSaveLoadList();
1695            this.saveLoadTextField.setValue(null);
1696            this.saveLoadTextField.setReadOnly(true);
1697           
1698            w.setCaption("Open configuration")
1699            w.setIcon("pf/image/open.png");
1700            w.setUserData("type", "open");
1701           
1702            w.open();
1703        },
1704       
1705        buildMenu : function()
1706        {
1707            var menubar = this.menubar;
1708           
1709            var submenu, btn, q;
1710
1711            submenu = new qx.ui.menu.Menu;
1712            this.doc.add(submenu);
1713            q = new qx.ui.core.Command("Ctrl+O");
1714            q.addListener("execute", this.openCB, this);
1715            btn = new qx.ui.menu.Button("Open...", "pf/image/open.png", q);
1716            submenu.add(btn);
1717            q = new qx.ui.core.Command("Ctrl+S");
1718            q.addListener("execute", this.saveConfigCB, this);
1719            btn = new qx.ui.menu.Button("Save", "pf/image/save.png", q);
1720            submenu.add(btn);
1721            btn = new qx.ui.menu.Button("Save as...", "pf/image/save.png");
1722            btn.addListener("execute", this.saveAsCB, this);
1723            submenu.add(btn);
1724            submenu.add(new qx.ui.menu.Separator);
1725            q = new qx.ui.core.Command("Ctrl+P");
1726            q.addListener("execute", function(ev) {
1727                window.print();
1728            });
1729            btn = new qx.ui.menu.Button("Print...", "pf/image/print.png", q);
1730            submenu.add(btn);
1731            submenu.add(new qx.ui.menu.Separator);
1732            q = new qx.ui.core.Command("Ctrl+R");
1733            q.addListener("execute", function(ev) {
1734                    if (!this.prefs.warnOnExit ||
1735                        confirm("Restart Plasma Formulary?")) {
1736                        this.intendedExit = true;
1737                        location.reload(true);
1738                    }
1739                }, this);
1740            btn = new qx.ui.menu.Button("Restart", "pf/image/reset.png", q);
1741            submenu.add(btn);
1742            submenu.add(new qx.ui.menu.Separator);
1743            q = new qx.ui.core.Command("Ctrl+Q");
1744            q.addListener("execute", function(ev) {
1745                    if (!this.prefs.warnOnExit ||
1746                        confirm("Quit Plasma Formulary?")) {
1747                        this.intendedExit = true;
1748                        window.close();
1749                    }
1750                }, this);
1751            btn = new qx.ui.menu.Button("Quit", "pf/image/exit.png", q);
1752            submenu.add(btn);
1753               
1754            btn = new qx.ui.menubar.Button("File", null, submenu);
1755            menubar.add(btn);
1756
1757
1758            submenu = new qx.ui.menu.Menu;
1759            submenu.addListener("appear", editMenuCB, this);
1760            this.doc.add(submenu);
1761            btn = new qx.ui.menu.Button("Add to Favorites",
1762                "pf/image/favorite-add.png");
1763            btn.addListener("execute", addToFavCB, this);
1764            this.editMenuButtonAddToFav = btn;
1765            submenu.add(btn);
1766            btn = new qx.ui.menu.Button("Remove from Favorites",
1767                "pf/image/favorite-delete.png");
1768            btn.addListener("execute", removeFromFavCB, this);
1769            this.editMenuButtonRemFromFav = btn;
1770            submenu.add(btn);
1771            submenu.add(new qx.ui.menu.Separator);
1772            btn = new qx.ui.menu.Button("Preferences",
1773                "pf/image/preferences.png");
1774            btn.addListener("execute", this.prefsCB, this);
1775            submenu.add(btn);
1776
1777            btn = new qx.ui.menubar.Button("Edit", null, submenu);
1778            menubar.add(btn);
1779
1780
1781            submenu = new qx.ui.menu.Menu;
1782            submenu.addListener("appear", viewMenuCB, this);
1783
1784            var subMenu1 = new qx.ui.menu.Menu;
1785            btn = new qx.ui.menu.CheckBox("Fundamental");
1786            btn.setValue(this.showFundamental);
1787            btn.addListener("execute", showFundamentalCB, this);
1788            subMenu1.add(btn);
1789            btn = new qx.ui.menu.CheckBox("Spectroscopy");
1790            btn.setValue(this.showSpectroscopy);
1791            btn.addListener("execute", showSpectroscopyCB, this);
1792            subMenu1.add(btn);
1793            btn = new qx.ui.menu.CheckBox("Waves");
1794            btn.setValue(this.showWaves);
1795            btn.addListener("execute", showWavesCB, this);
1796            subMenu1.add(btn);
1797            btn = new qx.ui.menu.CheckBox("Collisions");
1798            btn.setValue(this.showCollisions);
1799            btn.addListener("execute", showCollisionsCB, this);
1800            subMenu1.add(btn);
1801            this.showSectionsButton = new qx.ui.menu.Button("Show Sections",
1802                null, null, subMenu1);
1803            submenu.add(this.showSectionsButton);
1804           
1805            submenu.add(new qx.ui.menu.Separator);
1806
1807            var subMenu2 = new qx.ui.menu.Menu;
1808            btn = new qx.ui.menu.CheckBox("Electrons");
1809            btn.setValue(this.showElectrons);
1810            btn.addListener("execute", showElectronsCB, this);
1811            subMenu2.add(btn);
1812            btn = new qx.ui.menu.CheckBox("Ions");
1813            btn.setValue(this.showIons);
1814            btn.addListener("execute", showIonsCB, this);
1815            subMenu2.add(btn);
1816            btn = new qx.ui.menu.CheckBox("Radiators");
1817            btn.setValue(this.showRadiators);
1818            btn.addListener("execute", showRadiatorsCB, this);
1819            subMenu2.add(btn);
1820            this.showSpeciesButton = new qx.ui.menu.Button("Show Species",
1821                null, null, subMenu2);
1822            submenu.add(this.showSpeciesButton);
1823           
1824            submenu.add(new qx.ui.menu.Separator);
1825            q = new qx.ui.core.Command("Ctrl+W");
1826            q.addListener("execute", this.loadWikiCB, this);
1827            btn = new qx.ui.menu.Button("Load Wikipedia Article",
1828                "pf/image/wikipedia.png", q);
1829            submenu.add(btn);
1830            this.loadWikiButton = btn;
1831            this.doc.add(submenu);
1832            this.doc.add(subMenu1);
1833            this.doc.add(subMenu2);
1834
1835            submenu.add(new qx.ui.menu.Separator);
1836            q = new qx.ui.core.Command("Ctrl+L");
1837            q.addListener("execute", this.drawCB, this);
1838            btn = new qx.ui.menu.Button("Redraw Plot",
1839                "pf/image/tab-plot.png", q);
1840            submenu.add(btn);
1841            this.redrawButton = btn;
1842           
1843           
1844            btn = new qx.ui.menubar.Button("View", null, submenu);
1845            menubar.add(btn);
1846
1847
1848            var nvOptions = {
1849                width: 800,
1850                height: 600,
1851                scrollbars : true,
1852                resizable : true,
1853                menubar : false,
1854                status : false
1855            };
1856            submenu = new qx.ui.menu.Menu;
1857            this.doc.add(submenu);
1858            q = new qx.ui.core.Command("F1");
1859            q.addListener("execute", function(ev) {
1860                alert("Help system not implemented yet");
1861            });
1862            btn = new qx.ui.menu.Button("Help Contents",
1863                "pf/image/help.png", q);
1864            submenu.add(btn);
1865            btn = new qx.ui.menu.Button("NRL Plasma Formulary",
1866                "pf/image/nrl.png");
1867            btn.addListener("execute", function (ev) {
1868                    var url = "http://wwwppd.nrl.navy.mil/nrlformulary/";
1869                    var w = qx.bom.Window.open(url, null, nvOptions);
1870                }, this);
1871            submenu.add(btn);
1872            btn = new qx.ui.menu.Button("Plasma at Wikipedia",
1873                "pf/image/wikipedia.png");
1874            btn.addListener("execute", function (ev) {
1875                    var url = "http://en.wikipedia.org/wiki/Plasma_%28physics%29";
1876                    var w = qx.bom.Window.open(url, null, nvOptions);
1877                }, this);
1878            submenu.add(btn);
1879            submenu.add(new qx.ui.menu.Separator);
1880            btn = new qx.ui.menu.Button("License Terms",
1881                "pf/image/gnu.png");
1882            btn.addListener("execute", function (ev) {
1883                    var url = "resource/pf/html/GPL.html";
1884                    var w = qx.bom.Window.open(url, null, nvOptions);
1885                }, this);
1886            submenu.add(btn);
1887            btn = new qx.ui.menu.Button("About...",
1888                "pf/image/about.png");
1889            btn.addListener("execute", this.aboutCB, this);
1890            submenu.add(btn);
1891
1892            btn = new qx.ui.menubar.Button("Help", null, submenu);
1893            menubar.add(btn);
1894        },
1895       
1896        nextColor : function()
1897        {
1898            var color = this.colorMap[this.ncolor];
1899            this.ncolor++;
1900            if (this.ncolor == this.colorMap.length) {
1901                this.ncolor = 0;
1902            }
1903           
1904            return color;
1905        },
1906
1907        getWindowDimensions : function()
1908        {
1909            var dims = new Object;
1910           
1911            dims.w = qx.bom.Element.Dimension.getWidth(this.win);
1912            dims.h = qx.bom.Element.Dimension.getHeight(this.win);
1913           
1914            return dims;
1915        },
1916
1917        savePreferences : function()
1918        {
1919            if (this.prefs) {
1920                var prefstr = qx.util.Json.stringify(this.prefs);
1921                qx.bom.Cookie.set("pf_prefs", prefstr, 3650);
1922            }
1923        },
1924       
1925        loadPreferences : function()
1926        {
1927            var prefstr = qx.bom.Cookie.get("pf_prefs");
1928           
1929            if (prefstr) {
1930                this.prefs = qx.util.Json.parse(prefstr);
1931            }
1932           
1933            if (!this.prefs) {
1934                this.prefs = new Object;
1935            }
1936 
1937            if (undefined === this.prefs.rememberWindowSize) {
1938                this.prefs.rememberWindowSize = false;
1939            }
1940
1941            if (undefined === this.prefs.autoLoadWiki) {
1942                this.prefs.autoLoadWiki = true;
1943            }
1944           
1945            if (undefined === this.prefs.warnOnExit) {
1946                this.prefs.warnOnExit = true;
1947            }
1948           
1949            if (!this.prefs.units) {
1950                this.prefs.units = new Object;
1951            }
1952           
1953            if (!this.prefs.currentConfigName) {
1954                this.prefs.currentConfigName = "Untitled";
1955            }
1956           
1957            if (!this.prefs.configPtrs) {
1958                this.prefs.configPtrs = new Array;
1959            }
1960        },
1961       
1962        getConfig : function(name)
1963        {
1964            if (!name) {
1965                return null;
1966            }
1967
1968            var configPtrs = this.prefs.configPtrs;
1969           
1970            var i, configPtr = null;
1971            for (i = 0; i < configPtrs.length; i++) {
1972                if (configPtrs[i].name == name) {
1973                    configPtr = configPtrs[i];
1974                    return configPtr;
1975                    break;
1976                }
1977            }
1978           
1979            return null;
1980        },
1981       
1982        saveConfig : function(name)
1983        {
1984            if (!name) {
1985                return false;
1986            }
1987
1988            var configPtr = this.getConfig(name);
1989           
1990            var d = new Date();
1991            var time = d.getTime();
1992           
1993            if (!configPtr) {
1994                configPtr = new Object;
1995                configPtr.name = name;
1996                configPtr.hash = time;
1997                this.prefs.configPtrs.push(configPtr);
1998            }
1999           
2000            configPtr.time = time;
2001           
2002            var cookie_name = "pf_config_" + configPtr.hash;
2003           
2004            var config = new Object;
2005           
2006            config.N_e = this.plasma.e.getN();
2007
2008            config.T_e = this.plasma.e.getT();
2009            config.T_i = this.plasma.i.getT();
2010            config.T_r = this.plasma.r.getT();
2011
2012            config.M_i = this.plasma.i.getM();
2013            config.M_r = this.plasma.r.getM();
2014           
2015            config.Q_i = this.plasma.i.getQ();
2016            config.Q_r = this.plasma.r.getQ();
2017
2018            config.P_r = this.plasma.P_r;
2019
2020            config.B   = this.plasma.B  ;
2021
2022            config.n_u = this.plasma.n_u;
2023            config.n_l = this.plasma.n_l;
2024           
2025            var configstr = qx.util.Json.stringify(config);
2026            qx.bom.Cookie.set(cookie_name, configstr, 3650);
2027           
2028            this.prefs.currentConfigName = name;
2029           
2030            return true;
2031        },
2032       
2033        loadConfig : function(name)
2034        {
2035            var configPtr = this.getConfig(name);
2036            if (!configPtr) {
2037                return false;
2038            }
2039
2040            var cookie_name = "pf_config_" + configPtr.hash;
2041
2042            var configstr = qx.bom.Cookie.get(cookie_name);
2043            if (!configstr) {
2044                // Cookie was deleted???
2045                qx.lang.Array.remove(this.prefs.configPtrs, configPtr);
2046                return false;
2047            }
2048
2049            var config = qx.util.Json.parse(configstr);
2050           
2051            if (config) {
2052                this.plasma.e.setN(config.N_e);
2053
2054                this.plasma.e.setT(config.T_e);
2055                this.plasma.i.setT(config.T_i);
2056                this.plasma.r.setT(config.T_r);
2057
2058                this.plasma.i.setM(config.M_i);
2059                this.plasma.r.setM(config.M_r);
2060
2061                this.plasma.i.setQ(config.Q_i);
2062                this.plasma.r.setQ(config.Q_r);
2063
2064                this.plasma.P_r = config.P_r;
2065
2066                this.plasma.B   = config.B  ;
2067
2068                this.plasma.n_u = config.n_u;
2069                this.plasma.n_l = config.n_l;
2070
2071                this.prefs.currentConfigName = name;
2072
2073                return true;
2074            } else {
2075                return false;
2076            }
2077        },
2078       
2079        removeConfig : function(name)
2080        {
2081            var configPtr = this.getConfig(name);
2082            if (configPtr) {
2083                qx.lang.Array.remove(this.prefs.configPtrs, configPtr);
2084                var cookie_name = "pf_config_" + configPtr.hash;
2085                qx.bom.Cookie.del(cookie_name);
2086            }
2087        },
2088       
2089        renameConfig : function(oldname, newname)
2090        {
2091            var configPtr = this.getConfig(oldname);
2092            if (configPtr) {
2093                configPtr.name = newname;
2094            }
2095        },
2096       
2097        createSaveLoadDialog : function()
2098        {
2099            var w, rc1, e, btn;
2100            // "Save as..." dialog
2101            w = new qx.ui.window.Window();
2102            w.setLayout(new qx.ui.layout.VBox(10));
2103            w.setContentPadding(1);
2104            w.setModal(true);
2105            w.setShowMinimize(false);
2106            w.setShowMaximize(false);
2107
2108            w.addListener("keypress", function(ev) {
2109                    if (ev.getKeyIdentifier() == "Escape") {
2110                        w.close()
2111                    }
2112                });
2113               
2114            this.doc.add(w, {left: 200, top: 100});
2115            this.saveLoadWindow = w;
2116
2117            var tb = new qx.ui.toolbar.ToolBar();
2118            var tbpart = new qx.ui.toolbar.Part();
2119            var btn_delete = new qx.ui.toolbar.Button("Delete",
2120                "pf/image/delete.png");
2121            var btn_rename = new qx.ui.toolbar.Button("Rename",
2122                "pf/image/rename.png");
2123            btn_delete.setEnabled(false);
2124            btn_rename.setEnabled(false);
2125            tbpart.add(btn_delete);
2126            tbpart.add(btn_rename);
2127            tb.add(tbpart);
2128            w.add(tb);
2129
2130            // table model
2131            var tm = new qx.ui.table.model.Simple();
2132            tm.setColumns([ "Configuration", "Last Modified" ]);
2133           
2134            tm.setColumnEditable(0, false);
2135            tm.setColumnEditable(1, false);
2136           
2137            // table list
2138            var lv = new qx.ui.table.Table(tm);
2139            lv.set({
2140                height: 250
2141            });
2142
2143            lv.setStatusBarVisible(false);
2144            lv.setShowCellFocusIndicator(false);
2145            lv.setColumnVisibilityButtonVisible(false);
2146           
2147            lv.setColumnWidth(0, 250);
2148            lv.setColumnWidth(1, 150);
2149           
2150            var renderer = new qx.ui.table.cellrenderer.Html();
2151            lv.getTableColumnModel().setDataCellRenderer(0, renderer);
2152           
2153            this.saveLoadConfigList = lv;
2154            w.add(lv);
2155
2156            var sm = lv.getSelectionModel();
2157            sm.setSelectionMode(qx.ui.table.selection.Model.SINGLE_SELECTION);
2158
2159            btn_delete.addListener("execute", function(ev) {
2160                    if (!sm.isSelectionEmpty() &&
2161                        confirm("Delete \"" + rowData[0] + "\"?")) {
2162                        var index = sm.getLeadSelectionIndex();
2163                        var rowData = tm.getRowData(index);
2164                        this.removeConfig(rowData[0]);
2165                        this.updateSaveLoadList();
2166                    }
2167                }, this);
2168
2169            btn_rename.addListener("execute", function(ev) {
2170                    if (!sm.isSelectionEmpty()) {
2171                        var index = sm.getLeadSelectionIndex();
2172                        var rowData = tm.getRowData(index);
2173                        var name = rowData[0];
2174                        var newname = prompt("Rename \"" + name + "\" to", name);
2175                        if (newname && newname != name) {
2176                            this.renameConfig(name, newname);
2177                            this.updateSaveLoadList();
2178                            if (name == this.prefs.currentConfigName) {
2179                                this.prefs.currentConfigName = newname;
2180                                this.gui_configName.setLabel(newname);
2181                            }
2182                            this.saveLoadTextField.setValue(newname);
2183                        }
2184                    }
2185                }, this);
2186
2187            e = new qx.ui.form.TextField();
2188            w.add(e);
2189            this.saveLoadTextField = e;
2190           
2191            sm.addListener("changeSelection", function(ev) {
2192                    if (sm.isSelectionEmpty()) {
2193                        e.setValue(null);
2194                        btn_delete.setEnabled(false);
2195                        btn_rename.setEnabled(false);
2196                    } else {
2197                        var index = sm.getLeadSelectionIndex();
2198                        var rowData = tm.getRowData(index);
2199                        e.setValue(rowData[0]);
2200                        btn_rename.setEnabled(true);
2201                        btn_delete.setEnabled(true);
2202                    }
2203                });
2204           
2205            var layout = new qx.ui.layout.HBox(1);
2206            layout.setAlignX("right");
2207            rc1 = new qx.ui.container.Composite(layout);
2208            w.add(rc1);
2209
2210            btn = new qx.ui.form.Button("Cancel",
2211                "pf/image/cancel.png");
2212            btn.addListener("execute", function(ev) {
2213                    this.saveLoadWindow.close();
2214                }, this);
2215            rc1.add(btn);
2216
2217            btn = new qx.ui.form.Button("OK",
2218                "pf/image/ok.png");
2219            btn.addListener("execute", function(ev) {
2220                    var cfgname = this.saveLoadTextField.getValue(); 
2221                    if (!cfgname) {
2222                        alert("Please enter a name!");
2223                    } else {
2224                        var type = w.getUserData("type");
2225                        if (type == "save") {
2226                            if (this.saveConfig(cfgname) == true) {
2227                                this.saveLoadWindow.close();
2228                                if (this.prefs.currentConfigName) {
2229                                    this.gui_configName.setLabel(this.prefs.currentConfigName);
2230                                }
2231                            } else {
2232                                alert("Save failed!");
2233                            }
2234                        } else {
2235                            if (this.loadConfig(cfgname) == true) {
2236                                this.updatePlasmaParameters();
2237                                this.updateGUI();
2238                                this.saveLoadWindow.close();
2239                            } else {
2240                                alert("Load failed!");
2241                            }
2242                        }
2243                    }
2244                }, this);
2245            rc1.add(btn);
2246
2247            e.setLiveUpdate(true);
2248            e.addListener("changeValue", function(ev) {
2249                    var name = this.getValue();
2250                    btn.setEnabled(null != name && name.length != 0);
2251                });
2252        },
2253
2254        createPrefsDialog : function()
2255        {
2256            var w;
2257            // "Preferences..." dialog
2258            w = new qx.ui.window.Window("Preferences",
2259                "pf/image/preferences.png");
2260            w.setLayout(new qx.ui.layout.VBox(10));
2261
2262            w.setModal(true);
2263            w.setShowMinimize(false);
2264            w.setShowMaximize(false);
2265
2266            w.addListener("keypress", function(ev) {
2267                    if (ev.getKeyIdentifier() == "Escape") {
2268                        w.close()
2269                    }
2270                });
2271           
2272            var fr1, fr2, rc, l, e;
2273           
2274            fr1 = new qx.ui.groupbox.GroupBox("Default units");
2275            fr1.setLayout(new qx.ui.layout.VBox());
2276            w.add(fr1);
2277           
2278            rc = new qx.ui.container.Composite(new qx.ui.layout.HBox(10));
2279            fr1.add(rc);
2280
2281            l = new qx.ui.basic.Label("Dimension:");
2282            e = new pf.ui.SelectBox;
2283            e.addItem("Length", "length");
2284            e.addItem("Frequency", "frequency");
2285            e.addItem("Velocity", "velocity");
2286            e.addItem("Energy", "energy");
2287            e.addItem("Pressure", "pressure");
2288            e.addItem("Area", "area");
2289            e.addItem("Power density", "power_density");
2290            e.addItem("Power spectral density", "spectral_power_density");
2291            e.addItem("Electric field", "efield");
2292            e.addListener("changeSelection", function(ev) {
2293                    var dimension = ev.getTarget().getSelectedValue();
2294                    this.gui_prefs_units.update(dimension,
2295                        this.prefs.units[dimension]);
2296                }, this);
2297            rc.add(l);
2298            rc.add(e);
2299            this.gui_prefs_dim = e;
2300
2301            l = new qx.ui.basic.Label("Units:");
2302            e = new pf.UnitSelector();
2303            e.addListener("changeSelection", function(ev) {
2304                    var dimension = this.gui_prefs_dim.getSelectedValue();
2305                    var units = ev.getTarget().getSelectedValue();
2306                    this.prefs.units[dimension] = units;
2307                }, this);
2308            rc.add(l);
2309            rc.add(e);
2310            e.update("length");
2311            this.gui_prefs_units = e;
2312
2313            fr2 = new qx.ui.groupbox.GroupBox("Interface");
2314            fr2.setLayout(new qx.ui.layout.VBox());
2315            w.add(fr2);
2316
2317            rc = new qx.ui.container.Composite(new qx.ui.layout.VBox(10));
2318            fr2.add(rc);
2319
2320            e = new qx.ui.form.CheckBox("Load Wikipedia articles automatically");
2321            e.setValue(this.prefs.autoLoadWiki);
2322            e.addListener("changeValue", function(ev) {
2323                this.prefs.autoLoadWiki = ev.getTarget().getValue();
2324            }, this);
2325            rc.add(e);
2326
2327            e = new qx.ui.form.CheckBox("Remember window dimensions on exit");
2328            e.setValue(this.prefs.rememberWindowSize);
2329            e.addListener("changeValue", function(ev) {
2330                this.prefs.rememberWindowSize = ev.getTarget().getValue();
2331            }, this);
2332            rc.add(e);
2333
2334            e = new qx.ui.form.CheckBox("Warn on exit or restart");
2335            e.setValue(this.prefs.warnOnExit);
2336            e.addListener("changeValue", function(ev) {
2337                this.prefs.warnOnExit = ev.getTarget().getValue();
2338            }, this);
2339            rc.add(e);
2340           
2341            this.doc.add(w, {left: 200, top: 100});
2342            this.prefsWindow = w;
2343        },
2344
2345        /**
2346         * TODOC
2347         *
2348         * @type member
2349         * @param e {Event} TODOC
2350         * @return {void}
2351         */
2352        main : function(e)
2353        {
2354            this.base(arguments);
2355
2356            // Enable logging in debug variant
2357            if (qx.core.Variant.isSet("qx.debug", "on"))
2358            {
2359                // support native logging capabilities, e.g. Firebug
2360                qx.log.appender.Native;
2361                // support additional cross-browser console. (Press F7)
2362                qx.log.appender.Console;
2363            }
2364           
2365            this.doc = this.getRoot();
2366            // this.win = this.doc.getWindow();
2367           
2368            // Load prefs
2369            this.loadPreferences();
2370           
2371            this.plasma = new pf.Plasma();
2372           
2373            // Load config from the previous session
2374            if (this.prefs.currentConfigName) {
2375                this.loadConfig(this.prefs.currentConfigName);
2376            }
2377           
2378            if (this.updatePlasmaParameters() != true) {
2379                this.error("Error updating plasma parameters!");
2380            }
2381           
2382            // Favorites
2383            this.favorites = new Array;
2384           
2385            this.colorMap = new Array("red", "blue", "green", "orange",
2386                "brown", "olive", "teal", "magenta", "gray", "black");
2387            this.ncolor = 0;
2388
2389            // Top-level container
2390            var layout = new qx.ui.layout.VBox;
2391            this.bl_top = new qx.ui.container.Composite(layout);
2392
2393            this.doc.add(this.bl_top, {width :'100%', height: "100%"});
2394
2395            // The menubar
2396            this.menubar = new qx.ui.menubar.MenuBar;
2397            this.bl_top.add(this.menubar);
2398           
2399            // The menu items
2400            this.buildMenu();
2401           
2402            this.tabview = new qx.ui.tabview.TabView;
2403            this.tabview.setContentPadding(6);
2404           
2405            this.bl_top.add(this.tabview, {flex: 1});
2406            // The "Parameters" tab
2407            this.renderParametersTab();
2408           
2409            // The "Explorer" tab
2410            this.renderExplorerTab();
2411           
2412            // The "Compare" tab
2413            this.renderCompareTab();
2414           
2415            // The "Plot" tab
2416            this.renderPlotTab();
2417           
2418            // "Preferences" dialog
2419            this.createPrefsDialog();
2420
2421            // "Save as" dialog
2422            this.createSaveLoadDialog();
2423
2424            // "About..." dialog
2425            var w = new qx.ui.window.Window("About Plasma Formulary",
2426                "pf/image/about.png");
2427            w.setLayout(new qx.ui.layout.VBox(10));
2428            w.setModal(true);
2429            w.setShowMinimize(false);
2430            w.setShowMaximize(false);
2431
2432            w.addListener("keypress", function(ev) {
2433                    if (ev.getKeyIdentifier() == "Escape") {
2434                        w.close()
2435                    }
2436                });
2437           
2438            var version = qx.core.Version;
2439            if (!version) {
2440                version = '1.0';
2441            }
2442            var str = 'Plasma Formulary Interactive.<br/>'    +
2443                      '$Revision$.'                    +
2444                      '<p>Written by Evgeny Stambulchik.</p>' +
2445                      '<p>GUI built with the Qooxdoo-'        + 
2446                      version + ' toolkit.<br/>'              + 
2447                      'Using Walter Zorn jsGraphics for drawing.</p>';
2448
2449            var a = new qx.ui.basic.Atom(str);
2450            a.setRich(true);
2451            w.add(a);
2452
2453            this.doc.add(w, {left: 200, top: 100});
2454            this.aboutWindow = w;
2455           
2456            if (this.prefs.rememberWindowSize && this.prefs.dims) {
2457                self.resizeTo(this.prefs.dims.w, this.prefs.dims.h)
2458            }
2459
2460            // Handle resize events
2461            // this.doc.addListener("windowresize", function(e) {
2462            //     if (this.prefs.rememberWindowSize) {
2463            //         this.prefs.dims = this.getWindowDimensions();
2464            //     }
2465            //     this.drawAll();
2466            // }, this);
2467        },
2468   
2469
2470        /**
2471         * TODOC
2472         *
2473         * @type member
2474         * @param e {Event} TODOC
2475         * @return {void}
2476         */
2477        close : function(e)
2478        {
2479            // Save preferences
2480            this.savePreferences();
2481
2482            this.base(arguments);
2483           
2484            // Prompt user
2485            if (this.prefs.warnOnExit && !this.intendedExit) {
2486                return "This will end your Plasma Formulary session.";
2487            }
2488        }
2489    }
2490});
Note: See TracBrowser for help on using the repository browser.