source: source/class/pf/Application.js @ 99:ca0f0b38a1d9

Last change on this file since 99:ca0f0b38a1d9 was 99:ca0f0b38a1d9, checked in by fnevgeny, 16 years ago

updateEntityValue() was called twice. Other fixes.

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