source: source/class/pf/Application.js @ 103:8662f632b66a

Last change on this file since 103:8662f632b66a was 103:8662f632b66a, checked in by fnevgeny, 16 years ago

Added "collisions" and "waves" sections.

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