source: source/class/pf/Application.js @ 31:c999f02e4838

Last change on this file since 31:c999f02e4838 was 31:c999f02e4838, checked in by fnevgeny, 17 years ago

Added plotting capabilities.

File size: 59.1 KB
Line 
1/* ************************************************************************
2
3   Copyright:
4
5   License:
6
7   Authors:
8
9************************************************************************ */
10
11/* ************************************************************************
12
13#resource(image:image)
14
15************************************************************************ */
16
17
18var plasma_entities = new Array(
19    {
20        name      : "Plasma frequency",
21        dimension : "frequency",
22        nspecies  : 1,
23        section   : "fundamental",
24        formula   : "%s1.getPlasmaFrequency()"
25    },
26    {
27        name      : "Gyrofrequency",
28        dimension : "frequency",
29        nspecies  : 1,
30        section   : "fundamental",
31        formula   : "%s1.getGyroFrequency(this.B)"
32    },
33
34    {
35        name      : "Debye length",
36        dimension : "length",
37        nspecies  : 1,
38        section   : "fundamental",
39        formula   : "%s1.getDebyeLength()"
40    },
41    {
42        name      : "Full Debye length",
43        dimension : "length",
44        nspecies  : 1,
45        section   : "fundamental",
46        formula   : "this.getFullDebyeLength(%s1)"
47    },
48    {
49        name      : "deBroglie length",
50        dimension : "length",
51        nspecies  : 1,
52        section   : "fundamental",
53        formula   : "%s1.getDeBroglieLength()"
54    },
55    {
56        name      : "Mean interparticle distance",
57        dimension : "length",
58        nspecies  : 1,
59        section   : "fundamental",
60        formula   : "%s1.getMeanDistance()"
61    },
62    {
63        name      : "Distance of minimal approach",
64        dimension : "length",
65        nspecies  : 1,
66        section   : "fundamental",
67        formula   : "%s1.getMinApproachDistance()"
68    },
69    {
70        name      : "Gyroradius",
71        dimension : "length",
72        nspecies  : 1,
73        section   : "fundamental",
74        formula   : "%s1.getGyroRadius(this.B)"
75    },
76    {
77        name      : "Inertial length",
78        dimension : "length",
79        nspecies  : 1,
80        section   : "fundamental",
81        formula   : "%s1.getInertialLength()"
82    },
83
84    {
85        name      : "Thermal velocity",
86        dimension : "velocity",
87        nspecies  : 1,
88        section   : "fundamental",
89        formula   : "%s1.getThermalVelocity()"
90    },
91    {
92        name      : "Alfven velocity",
93        dimension : "velocity",
94        nspecies  : 1,
95        section   : "fundamental",
96        formula   : "%s1.getAlfvenVelocity(this.B)"
97    },
98
99    {
100        name      : "Coupling parameter",
101        dimension : "none",
102        nspecies  : 1,
103        section   : "fundamental",
104        formula   : "%s1.getCoupling()"
105    },
106    {
107        name      : "Typical Debye screening",
108        dimension : "none",
109        nspecies  : 1,
110        section   : "spectroscopy",
111        formula   : "var r = %s1.getMeanDistance()/%s1.getDebyeLength(); \
112                     (1 + r)*Math.exp(-r)"
113    },
114
115    {
116        name      : "Transition energy",
117        dimension : "energy",
118        nspecies  : 0,
119        section   : "spectroscopy",
120        formula   : "this.getWavenumber()"
121    },
122    {
123        name      : "Natural linewidth",
124        dimension : "energy",
125        nspecies  : 0,
126        section   : "spectroscopy",
127        formula   : "this.getNaturalWidth()"
128    },
129    {
130        name      : "Doppler FWHM",
131        dimension : "energy",
132        nspecies  : 0,
133        section   : "spectroscopy",
134        formula   : "2*this.getDopplerHwhm()"
135    },
136    {
137        name      : "Zeeman splitting",
138        dimension : "energy",
139        nspecies  : 0,
140        section   : "spectroscopy",
141        formula   : "2*this.getZeemanSplitting()"
142    },
143    {
144        name      : "Stark FWHM",
145        dimension : "energy",
146        nspecies  : 0,
147        section   : "spectroscopy",
148        formula   : "2*this.getStarkHwhm()"
149    },
150    {
151        name      : "QS Stark FWHM",
152        dimension : "energy",
153        nspecies  : 1,
154        section   : "spectroscopy",
155        formula   : "2*this.getQsHwhm(%s1)"
156    },
157
158    {
159        name      : "Dynamic Stark range",
160        dimension : "energy",
161        nspecies  : 1,
162        section   : "spectroscopy",
163        formula   : "this.getMicrofieldFrequency(%s1)/3e10/(2*Math.PI)"
164    },
165
166    {
167        name      : "Minimal energy distance",
168        dimension : "energy",
169        nspecies  : 0,
170        section   : "spectroscopy",
171        formula   : "this.getMinEnergyDistance()"
172    },
173
174    {
175        name      : "Static/dynamic Stark ratio",
176        dimension : "none",
177        nspecies  : 1,
178        section   : "spectroscopy",
179        formula   : "this.getStarkRatio(%s1)"
180    },
181    {
182        name      : "Stark quasistaticity",
183        dimension : "none",
184        nspecies  : 1,
185        section   : "spectroscopy",
186        formula   : "this.getStarkQuasistaticity(%s1)"
187    },
188
189    {
190        name      : "Transition wavelength",
191        dimension : "length",
192        nspecies  : 0,
193        section   : "spectroscopy",
194        formula   : "1/this.getWavenumber()"
195    },
196
197    {
198        name      : "Transition frequency",
199        dimension : "frequency",
200        nspecies  : 0,
201        section   : "spectroscopy",
202        formula   : "3e10*this.getWavenumber()"
203    },
204
205    {
206        name      : "Holtsmark field",
207        dimension : "efield",
208        nspecies  : 1,
209        section   : "spectroscopy",
210        formula   : "%s1.getHoltsmarkField()"
211    },
212
213    {
214        name      : "Microfield frequency",
215        dimension : "frequency",
216        nspecies  : 1,
217        section   : "spectroscopy",
218        formula   : "this.getMicrofieldFrequency(%s1)"
219    }
220);
221
222
223function LymanA(n)
224{
225    if (n <= 1) {
226        return 0;
227    } else {
228        return 8e9*256/9*n*Math.pow((n - 1)/(n + 1), 2*n)/((n*n - 1)*(n*n - 1));
229    }
230}
231
232
233function NumPrint(v, prec)
234{
235    var s;
236   
237    if (!prec) {
238        prec = 3;
239    }
240   
241    if (v == 0.0) {
242        s = "0";
243    } else
244    if (!isFinite(v)) {
245        s = v;
246    } else
247    if (Math.abs(v) < 1.e6 && Math.abs(v) >= 0.1) {
248        s = sprintf("%." + prec.toString() + "f", v);
249    } else {
250        s = sprintf("%." + prec.toString() + "e", v);
251    }
252   
253    return s;
254}
255
256function changeN_e(ev)
257{
258    var e = ev.getTarget();
259    var N_e = e.getNumValue();
260   
261    if (isFinite(N_e) && this.e.setN(N_e)) {
262        this.updatePlasmaParameters();
263        this.updateGUI();
264    }
265}
266
267function changeT_e(ev)
268{
269    var e = ev.getTarget();
270    var T_e = e.getNumValue();
271   
272    if (isFinite(T_e)) {
273        this.e.setT(T_e);
274        this.i.setT(T_e);
275        this.r.setT(T_e);
276        this.updateGUI();
277    }
278}
279
280function changeZ_i(ev)
281{
282    var e = ev.getTarget();
283    var Z_i = parseInt(e.getValue());
284   
285    if (isFinite(Z_i)) {
286        this.i.setQ(Z_i);
287        this.updatePlasmaParameters();
288        this.updateGUI();
289    }
290}
291
292function changeT_i(ev)
293{
294    var e = ev.getTarget();
295    var T_i = e.getNumValue();
296   
297    if (isFinite(T_i)) {
298        this.i.setT(T_i);
299        this.r.setT(T_i);
300        this.updateGUI();
301    }
302}
303
304function changeZ_r(ev)
305{
306    var e = ev.getTarget();
307    var Z_r = parseInt(e.getValue());
308   
309    if (isFinite(Z_r)) {
310        this.r.setQ(Z_r);
311        this.updatePlasmaParameters();
312        this.updateGUI();
313    }
314}
315
316function changeP_r(ev)
317{
318    var e = ev.getTarget();
319    var P_r = parseInt(e.getValue())/100.0;
320   
321    if (isFinite(P_r)) {
322        this.P_r = P_r;
323        this.updatePlasmaParameters();
324        this.updateGUI();
325    }
326}
327
328function changeT_r(ev)
329{
330    var e = ev.getTarget();
331    var T_r = e.getNumValue();
332   
333    if (isFinite(T_r)) {
334        this.r.setT(T_r);
335        this.updateGUI();
336    }
337}
338
339function changeM_i(ev)
340{
341    var e = ev.getTarget();
342    var M_i = parseInt(e.getValue());
343   
344    if (isFinite(M_i)) {
345        this.i.setM(M_i);
346        this.updateGUI();
347    }
348}
349
350function changeM_r(ev)
351{
352    var e = ev.getTarget();
353    var M_r = parseInt(e.getValue());
354   
355    if (isFinite(M_r)) {
356        this.r.setM(M_r);
357        this.updateGUI();
358    }
359}
360
361function changeN_u(ev)
362{
363    var e = ev.getTarget();
364    var n_u = parseInt(e.getValue());
365   
366    this.n_u = n_u;
367    this.updateGUI();
368}
369
370function changeN_l(ev)
371{
372    var e = ev.getTarget();
373    var n_l = parseInt(e.getValue());
374   
375    this.n_l = n_l;
376    this.updateGUI();
377}
378
379function changeB(ev)
380{
381    var e = ev.getTarget();
382    var v = e.getNumValue();
383   
384    if (isFinite(v)) {
385        this.B = v;
386        this.updateGUI();
387    }
388}
389
390function viewMenuCB(ev)
391{
392    var explorer_is_seen;
393   
394    if (this.entity_tree.isSeeable()) {
395        explorer_is_seen = true;
396    } else {
397        explorer_is_seen = false;
398    }
399   
400    this.showSectionsButton.setEnabled(explorer_is_seen);
401    this.showSpeciesButton.setEnabled(explorer_is_seen);
402}
403
404function editMenuCB(ev)
405{
406    var explorer_is_seen;
407   
408    if (this.entity_tree.isSeeable()) {
409        explorer_is_seen = true;
410    } else {
411        explorer_is_seen = false;
412    }
413
414    var tree = this.entity_tree;
415    var leaf = tree.getSelectedElement();
416
417    if (leaf && explorer_is_seen) {
418        if (this.isFavorite(leaf)) {
419            this.editMenuButtonAddToFav.setEnabled(false);
420            this.editMenuButtonRemFromFav.setEnabled(true);
421        } else {
422            this.editMenuButtonAddToFav.setEnabled(true);
423            this.editMenuButtonRemFromFav.setEnabled(false);
424        }
425    } else {
426        this.editMenuButtonAddToFav.setEnabled(false);
427        this.editMenuButtonRemFromFav.setEnabled(false);
428    }
429}
430
431function treeMenuCB(ev)
432{
433    if (ev.getButton() == "right") {
434        var menu = this.treeMenu;
435
436        if (menu.isSeeable()) {
437            menu.hide();
438        } else {
439            var leaf = ev.getTarget();
440            var el = leaf.getElement();
441           
442            if (leaf.classname == "qx.ui.tree.TreeFile") {
443                if (this.isFavorite(leaf)) {
444                    this.treeMenuButtonAddToFav.setEnabled(false);
445                    this.treeMenuButtonRemFromFav.setEnabled(true);
446                } else {
447                    this.treeMenuButtonAddToFav.setEnabled(true);
448                    this.treeMenuButtonRemFromFav.setEnabled(false);
449                }
450            } else {
451                this.treeMenuButtonAddToFav.setEnabled(false);
452                this.treeMenuButtonRemFromFav.setEnabled(false);
453            }
454           
455            // position the menu
456            menu.setLeft(ev.getClientX());
457            menu.setTop(ev.getClientY());
458
459            menu.show();
460        };
461
462        ev.setPropagationStopped(true);
463    }
464}
465
466function showFundamentalCB(ev)
467{
468    this.showFundamental = !this.showFundamental;
469    this.rePopulateTree();
470}
471
472function showSpectroscopyCB(ev)
473{
474    this.showSpectroscopy = !this.showSpectroscopy;
475    this.rePopulateTree();
476}
477
478function showElectronsCB(ev)
479{
480    this.showElectrons = !this.showElectrons;
481    this.rePopulateTree();
482}
483
484function showIonsCB(ev)
485{
486    this.showIons = !this.showIons;
487    this.rePopulateTree();
488}
489
490function showRadiatorsCB(ev)
491{
492    this.showRadiators = !this.showRadiators;
493    this.rePopulateTree();
494}
495
496function addToFavCB(ev)
497{
498    var tree = this.entity_tree;
499    var leaf = tree.getSelectedElement();
500
501    if (!leaf) {
502        return;
503    }
504
505    leaf.setTextColor("red");
506
507    // Add to the list of favorites
508    var fav = new Array;
509    fav.entity  = leaf.getUserData("entity");
510    fav.species = leaf.getUserData("species");
511    this.favorites.push(fav);
512   
513    // Update the list of favorites
514    this.updateFavoritesListView();
515}
516
517function removeFromFavCB(ev)
518{
519    var tree = this.entity_tree;
520    var leaf = tree.getSelectedElement();
521
522    if (!leaf) {
523        return;
524    }
525    leaf.setTextColor("black");
526
527    var entity  = leaf.getUserData("entity");
528    var species = leaf.getUserData("species");
529
530    // Remove from the list of favorites
531    for (var k = 0; k < this.favorites.length; k++) {
532        var fav = this.favorites[k];
533        if (fav.entity  == entity && fav.species == species) {
534            this.favorites.splice(k, 1);
535            break;
536        }
537    }
538
539    // Update the list of favorites
540    this.updateFavoritesListView();
541}
542
543function clickEntityCB(ev)
544{
545    var e = ev.getTarget();
546    var entity = e.getUserData("entity");
547   
548    this.gui_entity_units.update(entity.dimension);
549   
550    this.updateEntityValue();
551}
552
553function changeUnitsCB(ev)
554{
555    this.updateEntityValue();
556}
557
558/**
559 * The application
560 */
561qx.Class.define("pf.Application",
562{
563    extend : qx.application.Gui,
564
565    /*
566    *****************************************************************************
567       MEMBERS
568    *****************************************************************************
569    */
570
571    members :
572    {
573        R0 : 0.5, // 0.3/0.7/1 ?
574       
575        showFundamental  : true,
576        showSpectroscopy : true,
577
578        showElectrons  : true,
579        showIons       : true,
580        showRadiators  : true,
581
582        checkPlasmaParameters : function()
583        {
584            if ((this.P_r < 0.0 || this.P_r > 1.0) ||
585                this.Z_i < 1 ||
586                this.P_r == 1.0 && this.Z_r == 0) {
587                return false;
588            } else {
589                return true;
590            }
591        },
592
593        updatePlasmaParameters : function()
594        {
595            // Safety measures
596            if (this.checkPlasmaParameters() != true) {
597                return false;
598            }
599           
600            var N_e = this.e.getN();
601            var N_i, N_r;
602           
603            if (this.P_r < 1.0) {
604                N_i = N_e*(1.0 - this.P_r)/
605                    (this.i.getQ()*(1.0 - this.P_r) + this.r.getQ()*this.P_r);
606               
607                N_r = N_i*this.P_r/(1.0 - this.P_r);
608            } else {
609                N_i = 0.0;
610                N_r = N_e/this.r.getQ();
611            }
612           
613            this.i.setN(N_i);
614            this.r.setN(N_r);
615           
616            return true;
617        },
618       
619        updateGUI : function()
620        {
621            this.gui_N_i.setNumValue(this.i.getN());
622            this.gui_N_r.setNumValue(this.r.getN());
623            this.gui_T_i.setNumValue(this.i.getT());
624            this.gui_T_r.setNumValue(this.r.getT());
625            this.gui_Zcore.setValue(this.r.getQ() + 1);
626           
627            // Update the currently selecte entity
628            this.updateEntityValue();
629           
630            // Update the list of favorites
631            this.updateFavoritesListView();
632        },
633       
634        getWavenumber : function()
635        {
636            var n_u = this.n_u;
637            var n_l = this.n_l;
638            var Z_core = this.r.getQ() + 1;
639           
640            return pf.base.Bohr.transitionEnergy(Z_core, n_u, n_l);
641        },
642       
643        getMinEnergyDistance : function()
644        {
645            var n;
646            if (this.n_u < this.n_l) {
647                n = this.n_l;
648            } else {
649                n = this.n_u;
650            }
651           
652            var Z_core = this.r.getQ() + 1;
653           
654            return pf.base.Bohr.transitionEnergy(Z_core, n + 1, n);
655        },
656       
657        getNaturalWidth : function()
658        {
659            var n_u = this.n_u;
660            var n_l = this.n_l;
661            var Z_core = this.r.getQ() + 1;
662           
663            return Math.pow(Z_core, 4)*
664                (LymanA(n_u) + LymanA(n_l))/3e10/(2*Math.PI);
665        },
666       
667        getDopplerHwhm : function()
668        {
669            var v   = this.r.getThermalVelocity();
670            var nu  = this.getWavenumber();
671           
672            return Math.sqrt(2*Math.log(2))*nu*v/3e10;
673        },
674       
675        getMicrofieldFrequency : function(s)
676        {
677            var r = s.getMeanDistance();
678            var v_r = this.r.getThermalVelocity();
679            var v_s = s.getThermalVelocity();
680            var v = Math.sqrt(v_r*v_r + v_s*v_s);
681           
682            return v/r;
683        },
684       
685        getFullDebyeLength : function(s)
686        {
687            var tmp = 0;
688            var m = s.getM();
689           
690            var sa = new Array(this.e, this.i, this.r);
691            for (var i = 0; i < 3; i++) {
692                var os = sa[i];
693                if (os.getM() <= m) {
694                    var ld = os.getDebyeLength();
695                    if (ld) {
696                        tmp += 1/(ld*ld);
697                    }
698                }
699               
700            }
701           
702            return 1/Math.sqrt(tmp);
703        },
704       
705        getPpiFactor : function(s)
706        {
707            var dl = this.getFullDebyeLength(s);
708            var r1 = s.getMeanDistance();
709            var r;
710            if (isFinite(dl) && isFinite(r1)) {
711                r = r1/dl;
712            } else {
713                r = 0;
714            }
715           
716            return (1 + r)*Math.exp(-r);
717            // return 1 - 0.6*r
718        },
719       
720        getRpiFactor : function(s)
721        {
722            var r1 = s.getMeanDistance();
723            var q_r = this.r.getQ();
724            var q_s = s.getQ();
725            if (q_r == 0 || q_s == 0) {
726                return 1;
727            }
728             
729            var r_m = s.getMinApproachDistance()*q_r/q_s;
730            return Math.exp(-r_m/r1);
731        },
732       
733        getQsHwhm : function(s)
734        {
735            var n_u = this.n_u;
736            var n_l = this.n_l;
737            var Z_core = this.r.getQ() + 1;
738            var ef = s.getHoltsmarkField();
739            var ppi = this.getPpiFactor(s);
740            var rpi = this.getRpiFactor(s);
741           
742            // 1.4385 is S_1 HWHM
743            return 1.4385*4.271417e-5*3/2*(n_u*n_u - n_l*n_l)/Z_core*ef*ppi*rpi;
744        },
745       
746        getStarkRatio : function(s)
747        {
748            var R;
749            var w_qs = this.getQsHwhm(s);
750            if (w_qs == 0) {
751                R = 0;
752            } else {
753                R = 2*w_qs/(this.getMicrofieldFrequency(s)/3e10/(2*Math.PI));
754            }
755           
756            return R;
757        },
758       
759        getStarkQuasistaticity : function(s)
760        {
761            var R = this.getStarkRatio(s);
762            return R/(R + this.R0);
763        },
764       
765        getStarkHwhm : function()
766        {
767            var w = 0;
768           
769            var sa = new Array(this.e, this.i, this.r);
770            for (var i = 0; i < 3; i++) {
771                var s = sa[i];
772                var qs = this.getQsHwhm(s);
773                var f  = this.getStarkQuasistaticity(s);
774
775                w += Math.pow(f*qs, 3/2);
776            }
777           
778            return Math.pow(w, 2/3);
779        },
780       
781        getZeemanSplitting : function()
782        {
783            return 0.466860*this.B;
784        },
785       
786        getEntityFullName : function (entity, species)
787        {
788            var name = entity.name;
789            if (entity.nspecies == 1) {
790                switch (species.id) {
791                case "e":
792                    name += " of electrons";
793                    break;
794                case "i":
795                    name += " of ions";
796                    break;
797                case "r":
798                    name += " of radiators";
799                    break;
800                }
801            }
802           
803            return name;
804        },
805       
806        evaluateEntityValue : function(entity, species)
807        {
808            var formula;
809            if (entity.nspecies == 1) {
810                var species_str = "this." + species.id;
811                formula = entity.formula.replace(/\%s1/g, species_str);
812            } else {
813                formula = entity.formula;
814            }
815            var v = eval(formula);
816           
817            return v;
818        },
819       
820        updateEntityValue : function()
821        {
822            var tree = this.entity_tree;
823            var leaf = tree.getSelectedElement();
824           
825            if (!leaf) {
826                return;
827            }
828           
829            var entity  = leaf.getUserData("entity");
830            var species = leaf.getUserData("species");
831           
832            var name = this.getEntityFullName(entity, species);
833            this.gui_entity_name.setValue(name);
834
835            this.gui_entity_section.setValue(entity.section);
836           
837            var v = this.evaluateEntityValue(entity, species);
838
839            var scale = this.gui_entity_units.getSelected().getValue();
840
841            this.gui_entity_value.setNumValue(v*scale);
842        },
843
844        isFavorite : function(leaf)
845        {
846            var entity  = leaf.getUserData("entity");
847            var species = leaf.getUserData("species");
848
849            for (var k = 0; k < this.favorites.length; k++) {
850                var fav = this.favorites[k];
851                if (fav.entity  == entity && fav.species == species) {
852                    return true;
853                    break;
854                }
855            }
856           
857            return false;
858        },
859
860        populateTree : function()
861        {
862            var i, n = plasma_entities.length;
863            var sa = new Array;
864            if (this.showElectrons) {
865                sa.push(this.e)
866            }
867            if (this.showIons) {
868                sa.push(this.i)
869            }
870            if (this.showRadiators) {
871                sa.push(this.r)
872            }
873           
874            for (var i = 0; i < n; i++) {
875                var entity = plasma_entities[i];
876               
877                if (entity.section == "fundamental" &&
878                    this.showFundamental != true) {
879                    continue;
880                }
881                if (entity.section == "spectroscopy" &&
882                    this.showSpectroscopy != true) {
883                    continue;
884                }
885               
886                var folder;
887                switch (entity.dimension) {
888                case "frequency":
889                    folder = this.gui_folder_freq;
890                    break;
891                case "length":
892                    folder = this.gui_folder_length;
893                    break;
894                case "velocity":
895                    folder = this.gui_folder_vel;
896                    break;
897                case "energy":
898                    folder = this.gui_folder_energy;
899                    break;
900                case "none":
901                    folder = this.gui_folder_none;
902                    break;
903                default:
904                    folder = this.gui_folder_misc;
905                    break;
906                }
907               
908                var leaf;
909               
910                switch (entity.nspecies) {
911                case 1:
912                    for (var j = 0; j < sa.length; j++) {
913                        var s = sa[j];
914                        var icon = "pf/image/" + s.id + "_small.png";
915
916                        leaf = new qx.ui.tree.TreeFile(entity.name, icon);
917                        leaf.addEventListener("changeSelected", clickEntityCB, this);
918                        leaf.addEventListener("contextmenu", treeMenuCB, this);
919                        leaf.setUserData("entity", entity);
920                        leaf.setUserData("species", s);
921                       
922                        if (this.isFavorite(leaf)) {
923                            leaf.setTextColor("red");
924                        }
925
926                        folder.add(leaf);
927                    }
928                    break;
929                default:
930                    leaf = new qx.ui.tree.TreeFile(entity.name,
931                        "pf/image/all_small.png");
932                    leaf.addEventListener("changeSelected", clickEntityCB, this);
933                    leaf.addEventListener("contextmenu", treeMenuCB, this);
934                    leaf.setUserData("entity", entity);
935
936                    if (this.isFavorite(leaf)) {
937                        leaf.setTextColor("red");
938                    }
939                   
940                    folder.add(leaf);
941                    break;
942                }
943            }
944        }, 
945
946        cleanTree : function()
947        {
948            this.gui_folder_freq.destroyContent();
949           
950            this.gui_folder_length.destroyContent();
951           
952            this.gui_folder_vel.destroyContent();
953           
954            this.gui_folder_none.destroyContent();
955           
956            this.gui_folder_energy.destroyContent();
957           
958            this.gui_folder_misc.destroyContent();
959        },
960
961        rePopulateTree : function()
962        {
963            // this.entity_tree.hide();
964
965            this.cleanTree();
966            this.populateTree();
967
968            this.gui_folder_freq.close();
969            this.gui_folder_length.close();
970            this.gui_folder_vel.close();
971            this.gui_folder_none.close();
972            this.gui_folder_energy.close();
973            this.gui_folder_misc.close();
974
975            // this.entity_tree.show();
976        },
977
978
979        updateFavoritesListView : function()
980        {
981            var lv = this.favoritesListView;
982            var rowData = lv.getData();
983            rowData.length = 0;
984           
985            var dimension = this.gui_compare_dim.getSelectedValue();
986           
987            var scale = this.gui_compare_units.getSelectedValue();
988           
989            for (var i = 0; i < this.favorites.length; i++) {
990                var fav = this.favorites[i];
991                var entity = fav.entity;
992               
993                if (entity.dimension != dimension) {
994                    continue;
995                }
996               
997                var species = fav.species;
998
999                var icon;
1000                if (species) {
1001                    icon = "pf/image/" + species.id + "_small.png";
1002                } else {
1003                    icon = "pf/image/all_small.png";
1004                }
1005                var name = this.getEntityFullName(entity, species);
1006                var value = scale*this.evaluateEntityValue(entity, species);
1007
1008                rowData.push({ s_icon   : {icon       : icon,
1009                                           iconWidth  : 16, 
1010                                           iconHeight : 16             },
1011                               name     : {text       : name           },
1012                               section  : {text       : entity.section },
1013                               value    : {text       : NumPrint(value)}
1014                             });
1015            }
1016           
1017            lv.updateSort();
1018            lv.update();
1019        },
1020
1021
1022        renderTabPage : function(label, icon, checked)
1023        {
1024            var tab_id, page_id;
1025           
1026            tab_id = new qx.ui.pageview.tabview.Button(label, icon);
1027            this.tabbar.add(tab_id);
1028            page_id = new qx.ui.pageview.tabview.Page(tab_id);
1029            page_id.setHeight("auto");
1030            page_id.setPadding(10, 10, 10, 10);
1031            page_id.setBackgroundColor("white");
1032            this.tabpane.add(page_id);
1033
1034            if (checked) {
1035                tab_id.setChecked(true);
1036            }
1037           
1038            return page_id;
1039        },
1040
1041        renderParametersTab : function()
1042        {
1043            var page_id = this.renderTabPage("Parameters",
1044                "pf/image/tab-parameters.png", true);
1045
1046            var fr, gl;
1047           
1048            fr = new qx.ui.groupbox.GroupBox("Electrons",
1049                "pf/image/e_small.png");
1050            fr.setDimension("auto", "auto");
1051            fr.setBackgroundColor("#eeeeff");
1052
1053            page_id.add(fr);
1054
1055            gl = new qx.ui.layout.GridLayout;
1056            gl.setVerticalSpacing(4);
1057            gl.setHorizontalSpacing(6);
1058            gl.setColumnCount(2);
1059            gl.setColumnWidth(0, 100);
1060            gl.setColumnWidth(1, 260);
1061            gl.setRowCount(2);
1062            gl.setRowHeight(0, 30);
1063            gl.setRowHeight(1, 30);
1064
1065            fr.add(gl);
1066
1067            var l, e;
1068
1069            // N_e
1070            l = new qx.ui.basic.Label("N<sub>e</sub> (cm<sup>-3</sup>):");
1071            gl.add(l, 0, 0);
1072            e = new pf.ui.TextField(this.e.getN());
1073            gl.add(e, 1, 0);
1074            // e.setLiveUpdate(true);
1075            e.addEventListener("changeValue", changeN_e, this);
1076
1077            // T_e
1078            l = new qx.ui.basic.Label("T<sub>e</sub> (eV):");
1079            gl.add(l, 0, 1);
1080            e = new pf.ui.TextField(this.e.getT());
1081            gl.add(e, 1, 1);
1082            e.addEventListener("changeValue", changeT_e, this);
1083            e.setLiveUpdate(true);
1084
1085
1086            fr = new qx.ui.groupbox.GroupBox("Ions",
1087                "pf/image/i_small.png");
1088            fr.setDimension("auto", "auto");
1089            fr.setBackgroundColor("#ffeeee");
1090
1091            page_id.add(fr);
1092            fr.setTop(100);
1093
1094            gl = new qx.ui.layout.GridLayout;
1095            gl.setVerticalSpacing(4);
1096            gl.setHorizontalSpacing(6);
1097            gl.setColumnCount(2);
1098            gl.setColumnWidth(0, 100);
1099            gl.setColumnWidth(1, 260);
1100            gl.setRowCount(4);
1101            gl.setRowHeight(0, 30);
1102            gl.setRowHeight(1, 30);
1103            gl.setRowHeight(2, 30);
1104            gl.setRowHeight(3, 30);
1105
1106            fr.add(gl);
1107
1108            // Z_i
1109            l = new qx.ui.basic.Label("Z<sub>i</sub>:");
1110            gl.add(l, 0, 0);
1111            e = new pf.ui.Spinner(1, this.i.getQ(), 100);
1112            gl.add(e, 1, 0);
1113           
1114            e.addEventListener("change", changeZ_i, this);
1115           
1116            // M_i
1117            l = new qx.ui.basic.Label("M<sub>i</sub>:");
1118            gl.add(l, 0, 1);
1119            e = new pf.ui.Spinner(1, this.i.getM(), 200);
1120            gl.add(e, 1, 1);
1121            e.addEventListener("change", changeM_i, this);
1122           
1123            // T_i
1124            l = new qx.ui.basic.Label("T<sub>i</sub> (eV):");
1125            gl.add(l, 0, 2);
1126            e = new pf.ui.TextField(this.i.getT());
1127            gl.add(e, 1, 2);
1128            e.addEventListener("changeValue", changeT_i, this);
1129            e.setLiveUpdate(true);
1130            this.gui_T_i = e;
1131
1132            // N_i
1133            l = new qx.ui.basic.Label("N<sub>i</sub> (cm<sup>-3</sup>):");
1134            gl.add(l, 0, 3);
1135            e = new pf.ui.TextField(this.i.getN());
1136            gl.add(e, 1, 3);
1137            e.setReadOnly(true);
1138            this.gui_N_i = e;
1139           
1140           
1141            fr = new qx.ui.groupbox.GroupBox("Radiators",
1142                "pf/image/r_small.png");
1143            fr.setDimension("auto", "auto");
1144            fr.setBackgroundColor("#eeffee");
1145
1146            page_id.add(fr);
1147            fr.setLeft(390);
1148
1149            gl = new qx.ui.layout.GridLayout;
1150            gl.setVerticalSpacing(4);
1151            gl.setHorizontalSpacing(6);
1152            gl.setColumnCount(2);
1153            gl.setColumnWidth(0, 100);
1154            gl.setColumnWidth(1, 260);
1155            gl.setRowCount(5);
1156            gl.setRowHeight(0, 30);
1157            gl.setRowHeight(1, 30);
1158            gl.setRowHeight(2, 30);
1159            gl.setRowHeight(3, 30);
1160            gl.setRowHeight(4, 30);
1161
1162            fr.add(gl);
1163
1164
1165            // Z_r
1166            l = new qx.ui.basic.Label("Z<sub>r</sub>:");
1167            gl.add(l, 0, 0);
1168            e = new pf.ui.Spinner(0, this.Z_r, 100);
1169            gl.add(e, 1, 0);
1170            e.addEventListener("change", changeZ_r, this);
1171
1172            // M_r
1173            l = new qx.ui.basic.Label("M<sub>r</sub>:");
1174            gl.add(l, 0, 1);
1175            e = new pf.ui.Spinner(1, this.r.getM(), 200);
1176            gl.add(e, 1, 1);
1177            e.addEventListener("change", changeM_r, this);
1178
1179            // T_r
1180            l = new qx.ui.basic.Label("T<sub>r</sub> (eV):");
1181            gl.add(l, 0, 2);
1182            e = new pf.ui.TextField(this.r.getT());
1183            gl.add(e, 1, 2);
1184            e.addEventListener("changeValue", changeT_r, this);
1185            this.gui_T_r = e;
1186
1187            // P_r
1188            l = new qx.ui.basic.Label("P<sub>r</sub> (%):");
1189            gl.add(l, 0, 3);
1190            e = new pf.ui.Spinner(0, this.P_r, 100);
1191            gl.add(e, 1, 3);
1192            e.addEventListener("change", changeP_r, this);
1193
1194            // N_r
1195            l = new qx.ui.basic.Label("N<sub>r</sub> (cm<sup>-3</sup>):");
1196            gl.add(l, 0, 4);
1197            e = new pf.ui.TextField(this.r.getN());
1198            e.setReadOnly(true);
1199            gl.add(e, 1, 4);
1200            this.gui_N_r = e;
1201
1202
1203            fr = new qx.ui.groupbox.GroupBox("Fields",
1204                "pf/image/field_small.png");
1205            fr.setDimension("auto", "auto");
1206            fr.setBackgroundColor("#ffffdd");
1207
1208            page_id.add(fr);
1209
1210            gl = new qx.ui.layout.GridLayout;
1211            gl.setVerticalSpacing(4);
1212            gl.setHorizontalSpacing(6);
1213            gl.setColumnCount(2);
1214            gl.setColumnWidth(0, 100);
1215            gl.setColumnWidth(1, 260);
1216            gl.setRowCount(1);
1217            gl.setRowHeight(0, 30);
1218
1219            fr.add(gl);
1220            fr.setTop(268);
1221
1222
1223            l = new qx.ui.basic.Label("B (T):");
1224            gl.add(l, 0, 0);
1225            e = new pf.ui.TextField(this.B);
1226            gl.add(e, 1, 0);
1227            // e.setLiveUpdate(true);
1228            e.addEventListener("changeValue", changeB, this);
1229
1230            // Atomic system frame
1231            fr = new qx.ui.groupbox.GroupBox("Atomic system",
1232                "pf/image/all_small.png");
1233            fr.setDimension("auto", "auto");
1234            fr.setBackgroundColor("#ffffdd");
1235
1236            page_id.add(fr);
1237
1238            gl = new qx.ui.layout.GridLayout;
1239            gl.setVerticalSpacing(4);
1240            gl.setHorizontalSpacing(6);
1241            gl.setColumnCount(2);
1242            gl.setColumnWidth(0, 100);
1243            gl.setColumnWidth(1, 260);
1244            gl.setRowCount(3);
1245            gl.setRowHeight(0, 30);
1246            gl.setRowHeight(1, 30);
1247            gl.setRowHeight(2, 30);
1248
1249            fr.add(gl);
1250            fr.setLeft(390);
1251            fr.setTop(202);
1252
1253            l = new qx.ui.basic.Label("Z<sub>core</sub>:");
1254            gl.add(l, 0, 0);
1255            e = new qx.ui.form.TextField(this.r.getQ() + 1);
1256            e.setReadOnly(true);
1257            gl.add(e, 1, 0);
1258            this.gui_Zcore = e;
1259
1260            l = new qx.ui.basic.Label("n<sub>u</sub>:");
1261            gl.add(l, 0, 1);
1262            e = new pf.ui.Spinner(2, this.n_u, 1000);
1263            gl.add(e, 1, 1);
1264            e.addEventListener("change", changeN_u, this);
1265
1266            l = new qx.ui.basic.Label("n<sub>l</sub>:");
1267            gl.add(l, 0, 2);
1268            e = new pf.ui.Spinner(1, this.n_l, 1000);
1269            gl.add(e, 1, 2);
1270            e.addEventListener("change", changeN_l, this);
1271        },
1272
1273        renderExplorerTab : function()
1274        {
1275            var page_id = this.renderTabPage("Explorer",
1276                "pf/image/tab-explorer.png");
1277           
1278            var sp = new qx.ui.splitpane.HorizontalSplitPane(300, "1*");
1279            sp.set(
1280            {
1281                height          : "100%",
1282                left            : 1,
1283                right           : 1,
1284                top             : 1,
1285                bottom          : 1,
1286                border          : "inset-thin",
1287                backgroundColor : "white",
1288                showKnob        : true
1289            });
1290            page_id.add(sp);
1291                       
1292            var left_pane  = sp.getLeftArea();
1293            left_pane.setPaddingRight(4);
1294            var right_pane = sp.getRightArea();
1295            right_pane.setPaddingLeft(4);
1296            var tree = new qx.ui.tree.Tree("Browser");
1297            tree.set(
1298            {
1299                border          : "inset-thin",
1300                overflow        : "scroll",
1301                height          : "100%",
1302                width           : "100%",
1303                paddingLeft     : 4,
1304                paddingTop      : 4
1305            });
1306            // tree.addEventListener("contextmenu", treeMenuCB, this);
1307            left_pane.add(tree);
1308           
1309            this.entity_tree = tree;
1310           
1311            var folder;
1312           
1313            folder = new qx.ui.tree.TreeFolder("Frequencies");
1314            folder.setAlwaysShowPlusMinusSymbol(true);
1315            tree.add(folder);
1316            this.gui_folder_freq = folder;
1317
1318            folder = new qx.ui.tree.TreeFolder("Lengths");
1319            folder.setAlwaysShowPlusMinusSymbol(true);
1320            tree.add(folder);
1321            this.gui_folder_length = folder;
1322           
1323            folder = new qx.ui.tree.TreeFolder("Velocities");
1324            folder.setAlwaysShowPlusMinusSymbol(true);
1325            tree.add(folder);
1326            this.gui_folder_vel = folder;
1327           
1328            folder = new qx.ui.tree.TreeFolder("Dimensionless");
1329            tree.add(folder);
1330            this.gui_folder_none = folder;
1331
1332            folder = new qx.ui.tree.TreeFolder("Energies");
1333            folder.setAlwaysShowPlusMinusSymbol(true);
1334            tree.add(folder);
1335            this.gui_folder_energy = folder;
1336
1337            folder = new qx.ui.tree.TreeFolder("Miscellaneous");
1338            folder.setAlwaysShowPlusMinusSymbol(true);
1339            tree.add(folder);
1340            this.gui_folder_misc = folder;
1341
1342            this.populateTree();
1343
1344            tree.setHideNode(true);
1345            tree.setRootOpenClose(true);
1346           
1347            // Build context-sensitive popup menu
1348            this.treeMenu = new qx.ui.menu.Menu;
1349            var button;
1350           
1351            button = new qx.ui.menu.Button("Add to Favorites",
1352                "pf/image/favorite-add.png");
1353            button.addEventListener("execute", addToFavCB, this);
1354            this.treeMenu.add(button);
1355            this.treeMenuButtonAddToFav = button;
1356            button = new qx.ui.menu.Button("Remove from Favorites",
1357                "pf/image/favorite-delete.png");
1358            button.addEventListener("execute", removeFromFavCB, this);
1359            this.treeMenu.add(button);
1360            this.treeMenuButtonRemFromFav = button;
1361           
1362            var doc = qx.ui.core.ClientDocument.getInstance();
1363            doc.add(this.treeMenu);
1364
1365
1366            var gl = new qx.ui.layout.GridLayout;
1367            gl.set(
1368            {
1369                left:   4,
1370                right:  4,
1371                top:    4
1372            });
1373           
1374            gl.setVerticalSpacing(4);
1375            gl.setHorizontalSpacing(6);
1376            gl.setColumnCount(3);
1377            gl.setColumnWidth(0, "15%");
1378            gl.setColumnWidth(1, "60%");
1379            gl.setColumnWidth(2, "20%");
1380            gl.setRowCount(3);
1381            gl.setRowHeight(0, 30);
1382            gl.setRowHeight(1, 30);
1383            gl.setRowHeight(2, 30);
1384
1385            var l, e;
1386
1387            l = new qx.ui.basic.Label("Name:");
1388            gl.add(l, 0, 0);
1389            e = new qx.ui.form.TextField();
1390            e.setReadOnly(true);
1391            this.gui_entity_name = e;
1392            gl.add(e, 1, 0);
1393
1394            l = new qx.ui.basic.Label("Value:");
1395            gl.add(l, 0, 1);
1396            e = new pf.ui.TextField("");
1397            e.setReadOnly(true);
1398            gl.add(e, 1, 1);
1399            this.gui_entity_value = e;
1400
1401            e = new pf.UnitSelector();
1402            e.addEventListener("changeSelected", changeUnitsCB, this);
1403            gl.add(e, 2, 1);
1404            this.gui_entity_units = e;
1405
1406            l = new qx.ui.basic.Label("Section:");
1407            gl.add(l, 0, 2);
1408            e = new qx.ui.form.TextField();
1409            e.setReadOnly(true);
1410            this.gui_entity_section = e;
1411            gl.add(e, 1, 2);
1412
1413            right_pane.add(gl);
1414        },
1415       
1416        renderCompareTab : function()
1417        {
1418            var page_id = this.renderTabPage("Compare",
1419                "pf/image/tab-compare.png");
1420           
1421            var bl = new qx.ui.layout.VerticalBoxLayout("vertical");
1422            bl.setWidth("100%");
1423            bl.setHeight("100%");
1424            bl.setSpacing(10);
1425            page_id.add(bl);
1426           
1427            var rc = new qx.ui.layout.HorizontalBoxLayout;
1428            rc.setWidth("100%");
1429            rc.setHeight("auto");
1430            rc.setSpacing(10);
1431            bl.add(rc);
1432
1433            var l, e;
1434            l = new qx.ui.basic.Label("Dimension:");
1435            e = new pf.ui.ComboBox;
1436            e.add(new qx.ui.form.ListItem("Frequency", null, "frequency"));
1437            e.add(new qx.ui.form.ListItem("Length", null, "length"));
1438            e.add(new qx.ui.form.ListItem("Velocity", null, "velocity"));
1439            e.add(new qx.ui.form.ListItem("Energy", null, "energy"));
1440            e.add(new qx.ui.form.ListItem("Electric field", null, "efield"));
1441            e.add(new qx.ui.form.ListItem("None", null, "none"));
1442            e.addEventListener("changeSelected", function(ev) {
1443                    var dimension = this.gui_compare_dim.getSelectedValue();
1444                    this.gui_compare_units.update(dimension);
1445                    this.updateFavoritesListView();
1446                }, this);
1447            rc.add(l, e);
1448            this.gui_compare_dim = e;
1449
1450            l = new qx.ui.basic.Label("Units:");
1451            e = new pf.UnitSelector;
1452            e.addEventListener("changeSelected", function(ev) {
1453                    this.updateFavoritesListView();
1454                }, this);
1455            rc.add(l, e);
1456            this.gui_compare_units = e;
1457
1458            var lc =
1459            {
1460                s_icon   : { label      : "",
1461                             width      : 24,
1462                             type       : "iconHtml",
1463                             align      : "center",                   
1464                             sortable   : false                         },
1465                name     : { label      : "Name",
1466                             width      : 300,
1467                             type       : "text",
1468                             align      : "left",
1469                             sortable   : true,
1470                             sortProp   : "text"                        },
1471                section  : { label      : "Section",
1472                             width      : 120,
1473                             type       : "text",
1474                             align      : "left",
1475                             sortable   : true,
1476                             sortProp   : "text"                        },
1477                value    : { label      : "Value",
1478                             width      : 120,
1479                             type       : "text",
1480                             align      : "right",
1481                             sortable   : true,
1482                             sortProp   : "text",
1483                             sortMethod : qx.util.Compare.byFloatString }
1484            };
1485
1486            var lv = new qx.ui.listview.ListView(new Array, lc);
1487
1488            lv.setWidth("100%");
1489            lv.setHeight(450);
1490            lv.setBackgroundColor("white");
1491            lv.setBorder("dark-shadow");
1492
1493            bl.add(lv);
1494           
1495            this.favoritesListView = lv;
1496        },
1497       
1498        drawCB : function(ev)
1499        {
1500            var canvas = this.canvas;
1501           
1502            var pname = this.guiParameter.getValue();
1503            var vmin = this.guiMinParam.getNumValue();
1504            var vmax = this.guiMaxParam.getNumValue();
1505            var npoints = this.guiParamPoints.getValue();
1506           
1507            if (npoints < 2 || !pname) {
1508                return;
1509            }
1510
1511            var dimension = this.gui_compare_dim.getSelectedValue();
1512            var scale = this.gui_compare_units.getSelectedValue();
1513
1514            var par0;
1515            switch (pname) {
1516            case "N_e":
1517                par0 = this.e.getN();
1518                break;
1519            case "T_e":
1520            case "T":
1521                par0 = this.e.getT();
1522                break;
1523            case "T_i":
1524                par0 = this.i.getT();
1525                break;
1526            case "B":
1527                par0 = this.B;
1528                break;
1529            default:
1530                return;
1531            }
1532           
1533            var xdata = new Array;
1534            for (var j = 0; j < npoints; j++) {
1535                var x = par0*(vmin + (vmax - vmin)*j/(npoints - 1));
1536                xdata.push(x);
1537            }
1538                       
1539            var wxmin = xdata[0];
1540            var wxmax = xdata[xdata.length - 1];
1541
1542            var wymin = 0;
1543            var wymax = 0;
1544
1545            var sets = new Array;
1546            var first = true;
1547            for (var i = 0; i < this.favorites.length; i++) {
1548                var fav = this.favorites[i];
1549                var entity = fav.entity;
1550               
1551                if (entity.dimension != dimension) {
1552                    continue;
1553                }
1554               
1555                var species = fav.species;
1556                var vname = this.getEntityFullName(entity, species);
1557
1558                var set   = new Array;
1559                var ydata = new Array;
1560                for (var j = 0; j < npoints; j++) {
1561                    var par = xdata[j];
1562
1563                    switch (pname) {
1564                    case "N_e":
1565                        this.e.setN(par);
1566                        this.updatePlasmaParameters();
1567                        break;
1568                    case "T_e":
1569                        this.e.setT(par);
1570                        break;
1571                    case "T_i":
1572                        this.i.setT(par);
1573                        break;
1574                    case "T":
1575                        this.e.setT(par);
1576                        this.i.setT(par);
1577                        this.r.setT(par);
1578                        break;
1579                    case "B":
1580                        this.B = par;
1581                        break;
1582                    }
1583                   
1584                    var value = scale*this.evaluateEntityValue(entity, species);
1585                   
1586                    if (first) {
1587                        wymin = value;
1588                        wymax = value;
1589                        first = false;
1590                    } else {
1591                        if (value < wymin) {
1592                            wymin = value;
1593                        }
1594                        if (value > wymax) {
1595                            wymax = value;
1596                        }
1597                    }
1598                   
1599                    ydata.push(value);
1600                }
1601                set.x = xdata;
1602                set.y = ydata;
1603                set.legend = vname;
1604                sets.push(set);
1605            }
1606           
1607            // Restore parameter
1608            switch (pname) {
1609            case "N_e":
1610                this.e.setN(par0);
1611                this.updatePlasmaParameters();
1612                break;
1613            case "T_e":
1614                this.e.setT(par0);
1615                break;
1616            case "T_i":
1617                this.i.setT(par0);
1618                break;
1619            case "T":
1620                this.e.setT(par0);
1621                this.i.setT(par0);
1622                this.r.setT(par0);
1623                break;
1624            case "B":
1625                this.B = par0;
1626                break;
1627            }
1628           
1629            canvas.clear();
1630           
1631            canvas.setViewportCoordinates(0.15, 0.1, 0.9, 0.9);
1632            dwx = Math.abs(wxmax - wxmin);
1633            if (dwx == 0) {
1634                dwx = wxmax;
1635            }
1636            dwy = Math.abs(wymax - wymin);
1637            if (dwy == 0) {
1638                wymin = 0.0;
1639                wymax = 1.0;
1640            }
1641            canvas.setWorldCoordinates(Math.max(0, wxmin - 0.05*dwx),
1642                Math.max(0, wymin - 0.05*dwy),
1643                wxmax + 0.05*dwx, wymax + 0.05*dwy);
1644           
1645            canvas.drawFrame("black");
1646            canvas.drawTicks("x", "blue");
1647            canvas.drawTicks("y", "blue");
1648           
1649            canvas.setColor("red");
1650            for (var i = 0; i < sets.length; i++) {
1651                var set = sets[i];
1652                canvas.drawPolyLineW(set.x, set.y);
1653               
1654                delete set;
1655            }
1656           
1657            delete sets;
1658           
1659            canvas.paint();
1660        },
1661       
1662        renderPlotTab : function()
1663        {
1664            var page_id = this.renderTabPage("Plot",
1665                "pf/image/tab-plot.png");
1666
1667            var sp = new qx.ui.splitpane.HorizontalSplitPane("1*", 300);
1668            sp.set(
1669            {
1670                height          : "100%",
1671                width           : "100%",
1672                left            : 1,
1673                right           : 1,
1674                top             : 1,
1675                bottom          : 1,
1676                border          : "inset-thin",
1677                showKnob        : true
1678            });
1679            page_id.add(sp);
1680                       
1681            var left_pane  = sp.getLeftArea();
1682            left_pane.setPaddingRight(4);
1683            var right_pane = sp.getRightArea();
1684            right_pane.setPaddingLeft(4);
1685
1686            var canvas = new pf.ui.canvas.Plotter();
1687            canvas.setBackgroundColor("white");
1688            canvas.setWidth("100%");
1689            canvas.setHeight("100%");
1690            left_pane.add(canvas);
1691            this.canvas = canvas;
1692
1693
1694            var gl = new qx.ui.layout.GridLayout;
1695            gl.set(
1696            {
1697                left:   4,
1698                right:  4,
1699                top:    4
1700            });
1701           
1702            gl.setVerticalSpacing(4);
1703            gl.setHorizontalSpacing(6);
1704            gl.setColumnCount(2);
1705            gl.setColumnWidth(0, 150);
1706            gl.setColumnWidth(1, 100);
1707            gl.setRowCount(5);
1708            gl.setRowHeight(0, 30);
1709            gl.setRowHeight(1, 30);
1710            gl.setRowHeight(2, 30);
1711            gl.setRowHeight(3, 30);
1712            gl.setRowHeight(4, 30);
1713            right_pane.add(gl);
1714
1715            var l, e;
1716
1717            var btn = new qx.ui.form.Button("Redraw");
1718            btn.addEventListener("execute", this.drawCB, this);
1719            btn.setTop(20);
1720            btn.setLeft(20);
1721            gl.add(btn, 0, 0);
1722
1723            l = new qx.ui.basic.Label("Parameter to vary:");
1724            e = new pf.ui.ComboBox;
1725            e.add(new qx.ui.form.ListItem("N_e", null, "N_e"));
1726            e.add(new qx.ui.form.ListItem("T",   null, "T"));
1727            e.add(new qx.ui.form.ListItem("T_e", null, "T_e"));
1728            e.add(new qx.ui.form.ListItem("T_i", null, "T_i"));
1729            e.add(new qx.ui.form.ListItem("B",   null, "B"));
1730            this.guiParameter = e;
1731            gl.add(l, 0, 1);
1732            gl.add(e, 1, 1);
1733
1734            l = new qx.ui.basic.Label("Minimum scale:");
1735            e = new pf.ui.TextField(0.3);
1736            this.guiMinParam = e;
1737            gl.add(l, 0, 2);
1738            gl.add(e, 1, 2);
1739
1740            l = new qx.ui.basic.Label("Maximum scale:");
1741            e = new pf.ui.TextField(3.0);
1742            this.guiMaxParam = e;
1743            gl.add(l, 0, 3);
1744            gl.add(e, 1, 3);
1745
1746            l = new qx.ui.basic.Label("Number of points:");
1747            e = new pf.ui.Spinner(2, 10, 100);
1748            this.guiParamPoints = e;
1749            gl.add(l, 0, 4);
1750            gl.add(e, 1, 4);
1751        },
1752
1753
1754        aboutCB : function(ev)
1755        {
1756            this.aboutWindow.open();
1757        },
1758       
1759        buildMenu : function()
1760        {
1761            var menubar = this.menubar;
1762            var doc = qx.ui.core.ClientDocument.getInstance();
1763           
1764            var submenu, btn;
1765
1766            var bg = "#efebec";
1767           
1768            submenu = new qx.ui.menu.Menu;
1769            submenu.setBackgroundColor(bg);
1770            doc.add(submenu);
1771            btn = new qx.ui.menu.Button("Open...", "pf/image/open.png");
1772            btn.addEventListener("execute", function (ev) {
1773                alert("Not implemented yet")}, this);
1774            submenu.add(btn);
1775            btn = new qx.ui.menu.Button("Save...", "pf/image/save.png");
1776            btn.addEventListener("execute", function (ev) {
1777                alert("Not implemented yet")}, this);
1778            submenu.add(btn);
1779            submenu.add(new qx.ui.menu.Separator);
1780            btn = new qx.ui.menu.Button("Exit", "pf/image/exit.png");
1781            btn.addEventListener("execute", function (ev) {
1782                window.close()}, this);
1783            submenu.add(btn);
1784               
1785            btn = new qx.ui.menubar.Button("File", submenu);
1786            btn.set({ paddingLeft : 7, paddingRight : 7 });
1787            menubar.add(btn);
1788
1789
1790            submenu = new qx.ui.menu.Menu;
1791            submenu.setBackgroundColor(bg);
1792            submenu.addEventListener("beforeAppear", editMenuCB, this);
1793            doc.add(submenu);
1794            btn = new qx.ui.menu.Button("Add to Favorites",
1795                "pf/image/favorite-add.png");
1796            btn.addEventListener("execute", addToFavCB, this);
1797            this.editMenuButtonAddToFav = btn;
1798            submenu.add(btn);
1799            btn = new qx.ui.menu.Button("Remove from Favorites",
1800                "pf/image/favorite-delete.png");
1801            btn.addEventListener("execute", removeFromFavCB, this);
1802            this.editMenuButtonRemFromFav = btn;
1803            submenu.add(btn);
1804            submenu.add(new qx.ui.menu.Separator);
1805            btn = new qx.ui.menu.Button("Preferences",
1806                "pf/image/preferences.png");
1807            btn.addEventListener("execute", function (ev) {
1808                alert("Not implemented yet")}, this);
1809            submenu.add(btn);
1810
1811            btn = new qx.ui.menubar.Button("Edit", submenu);
1812            btn.set({ paddingLeft : 7, paddingRight : 7 });
1813            menubar.add(btn);
1814
1815
1816            submenu = new qx.ui.menu.Menu;
1817            submenu.setBackgroundColor(bg);
1818            submenu.addEventListener("beforeAppear", viewMenuCB, this);
1819
1820            var subMenu1 = new qx.ui.menu.Menu;
1821            subMenu1.setBackgroundColor(bg);
1822            button = new qx.ui.menu.CheckBox("Fundamental",
1823                null, this.showFundamental);
1824            button.addEventListener("execute", showFundamentalCB, this);
1825            subMenu1.add(button);
1826            button = new qx.ui.menu.CheckBox("Spectroscopy",
1827                null, this.showSpectroscopy);
1828            button.addEventListener("execute", showSpectroscopyCB, this);
1829            subMenu1.add(button);
1830            this.showSectionsButton = new qx.ui.menu.Button("Show Sections",
1831                null, null, subMenu1);
1832            submenu.add(this.showSectionsButton);
1833           
1834            submenu.add(new qx.ui.menu.Separator);
1835
1836            var subMenu2 = new qx.ui.menu.Menu;
1837            subMenu2.setBackgroundColor(bg);
1838            button = new qx.ui.menu.CheckBox("Electrons",
1839                null, this.showElectrons)
1840            button.addEventListener("execute", showElectronsCB, this);
1841            subMenu2.add(button);
1842            button = new qx.ui.menu.CheckBox("Ions",
1843                null, this.showIons)
1844            button.addEventListener("execute", showIonsCB, this);
1845            subMenu2.add(button);
1846            button = new qx.ui.menu.CheckBox("Radiators",
1847                null, this.showRadiators)
1848            button.addEventListener("execute", showRadiatorsCB, this);
1849            subMenu2.add(button);
1850            this.showSpeciesButton = new qx.ui.menu.Button("Show Species",
1851                null, null, subMenu2);
1852            submenu.add(this.showSpeciesButton);
1853           
1854            doc.add(submenu, subMenu1, subMenu2);
1855
1856            btn = new qx.ui.menubar.Button("View", submenu);
1857            btn.set({ paddingLeft : 7, paddingRight : 7 });
1858            menubar.add(btn);
1859
1860
1861            submenu = new qx.ui.menu.Menu;
1862            submenu.setBackgroundColor(bg);
1863            doc.add(submenu);
1864            btn = new qx.ui.menu.Button("Help Contents",
1865                "pf/image/help.png");
1866            btn.addEventListener("execute", function (ev) {
1867                alert("Not implemented yet")}, this);
1868            submenu.add(btn);
1869            btn = new qx.ui.menu.Button("NRL Plasma Formulary",
1870                "pf/image/nrl.png");
1871            btn.addEventListener("execute", function (ev) {
1872                    var w = new qx.client.NativeWindow("http://wwwppd.nrl.navy.mil/nrlformulary/");
1873                    w.setDimension(800, 600);
1874                    w.open();
1875                }, this);
1876            submenu.add(btn);
1877            submenu.add(new qx.ui.menu.Separator);
1878            btn = new qx.ui.menu.Button("About Plasma Formulary",
1879                "pf/image/about.png");
1880            btn.addEventListener("execute", this.aboutCB, this);
1881            submenu.add(btn);
1882
1883            btn = new qx.ui.menubar.Button("Help", submenu);
1884            btn.set({ paddingLeft : 7, paddingRight : 7 });
1885            menubar.add(btn);
1886        },
1887
1888        /**
1889         * TODOC
1890         *
1891         * @type member
1892         * @param e {Event} TODOC
1893         * @return {void}
1894         */
1895        main : function(e)
1896        {
1897            this.base(arguments);
1898           
1899            // Define alias for custom resource path
1900            qx.io.Alias.getInstance().add("pf",
1901                qx.core.Setting.get("pf.resourceUri"));
1902
1903            this.doc = qx.ui.core.ClientDocument.getInstance();
1904           
1905            // Defaults
1906           
1907            this.r = new pf.base.Species("r", 1.0,           0, 0,    1.0, null);
1908            this.e = new pf.base.Species("e", (1.0/1836.2), -1, 1e16, 1.0, this.r);
1909            this.i = new pf.base.Species("i", 1.0,          +1, 1e16, 1.0, this.r);
1910           
1911            this.P_r = 0;
1912
1913            this.B   = 0;
1914           
1915            this.n_u = 2;
1916            this.n_l = 1;
1917           
1918            if (this.updatePlasmaParameters() != true) {
1919                alert("Error!");
1920            }
1921           
1922            // Favorites
1923            this.favorites = new Array;
1924
1925            // Top-level container
1926            this.bl_top = new qx.ui.layout.VerticalBoxLayout("vertical");
1927            this.bl_top.setWidth("100%");
1928            this.bl_top.setHeight("100%");
1929
1930            this.bl_top.addToDocument();
1931
1932            // The menubar
1933            this.menubar = new qx.ui.menubar.MenuBar;
1934            this.bl_top.add(this.menubar);
1935           
1936            // The menu items
1937            this.buildMenu();
1938           
1939            var tf1 = new qx.ui.pageview.tabview.TabView;
1940            tf1.set({ width : '100%', height : 'auto' });
1941
1942            this.bl_top.add(tf1);
1943
1944            this.tabbar  = tf1.getBar();
1945            this.tabpane = tf1.getPane();
1946            this.tabpane.setHeight('auto');
1947            this.tabpane.setPadding(0, 0, 0, 0);
1948
1949            // The "Parameters" tab
1950            this.renderParametersTab();
1951           
1952            // The "Explorer" tab
1953            this.renderExplorerTab();
1954           
1955            // The "Compare" tab
1956            this.renderCompareTab();
1957           
1958            // The "Plot" tab
1959            this.renderPlotTab();
1960
1961            // "About..." dialog
1962            var w = new qx.ui.window.Window("About Plasma Formulary",
1963                "pf/image/about.png");
1964            w.setSpace(200, "auto", 100, "auto");
1965            w.setModal(true);
1966            w.setShowMinimize(false);
1967            w.setShowMaximize(false);
1968           
1969            str = 'Plasma Formulary Interactive.<br/>'      +
1970                  '$Revision$.'                      +
1971                  '<p>Written by Evgeny Stambulchik.</p>'   +
1972                  '<p>Using the Qooxdoo-' + qx.core.Version + 
1973                  ' toolkit.</p>';
1974
1975            var a = new qx.ui.basic.Atom(str);
1976            a.set({ top: 4, left: 4 });
1977            w.add(a);
1978
1979            this.doc.add(w);
1980            this.aboutWindow = w;
1981           
1982
1983
1984        },
1985   
1986
1987        /**
1988         * TODOC
1989         *
1990         * @type member
1991         * @param e {Event} TODOC
1992         * @return {void}
1993         */
1994        close : function(e)
1995        {
1996            this.base(arguments);
1997
1998            // Prompt user
1999            // return "qooxdoo application: Do you really want to close the application?";
2000        },
2001
2002
2003       /**
2004        * TODOC
2005        *
2006        * @type member
2007        * @param e {Event} TODOC
2008        * @return {void}
2009        */
2010        terminate : function(e) {
2011            this.base(arguments);
2012        }
2013    },
2014
2015    /*
2016    *****************************************************************************
2017       SETTINGS
2018    *****************************************************************************
2019    */
2020
2021    settings : {
2022        "pf.resourceUri" : "./resource"
2023    }
2024});
Note: See TracBrowser for help on using the repository browser.
<