]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Evergreen/staff_client/chrome/content/evergreen/main/app_shell.js
Put simple closures on the app_shell window
[working/Evergreen.git] / Evergreen / staff_client / chrome / content / evergreen / main / app_shell.js
1 sdump('D_TRACE','Loading app_shell.js\n');
2
3 function app_shell_init(p) {
4         dump("TESTING: app_shell.js: " + mw.G['main_test_variable'] + '\n');
5
6         p.w.close_tab = function (t1,t2) { return close_tab(p.d,t1,t2); };
7         p.w.delete_tab_contents = function (panel) { return delete_tab_contents(panel); };
8         p.w.find_free_tab = function (tabs) { return find_free_tab(tabs); };
9         p.w.new_tab = function () { return new_tab(p.d,p.tabbox); };
10         p.w.replace_tab = function (label,chrome,params) { return replace_tab(p.d,p.tabbox,label,chrome,params); };
11         
12         p.w.replace_tab('Tab','chrome://evergreen/content/main/about.xul');
13 }
14
15 function close_tab( d, t1, t2 ) {
16         // t1 = tabbox or tab, if t1 = tabbox, t2 = tab index, otherwise close current tab
17         sdump('D_TAB',arg_dump(arguments,{1:true,2:true}));
18         if (typeof(t1)!='object')
19                 t1 = d.getElementById(t1);
20         if (typeof(t1)!='object')
21                 throw('Could not find tab or tabbox. d = ' + d + ' tabbox = ' + t1 + '\n');
22         try {
23                 var tabbox;
24
25                 if (t1.tagName == 'tabbox')
26                         tabbox = t1;
27                 else
28                         tabbox = t1.parentNode.parentNode;
29
30                 var idx = tabbox.selectedIndex;
31                 if (t2)
32                         idx = t2;
33
34                 sdump('D_TAB','tabbox.selectedIndex = ' + tabbox.selectedIndex + '\n');
35                 var tabs = tabbox.firstChild; 
36                 var panels = tabbox.lastChild;
37
38                 if (idx == 0) {
39                         try {
40                                 tabs.advanceSelectedTab(+1);
41                         } catch(E) {
42                                 dump('failed tabs.advanceSelectedTab(+1):'+js2JSON(E) + '\n');
43                                 try {
44                                         tabs.advanceSelectedTab(-1);
45                                 } catch(E) {
46                                         dump('failed again tabs.advanceSelectedTab(-1):'+js2JSON(E) + '\n');
47                                 }
48                         }
49                 } else {
50                         try {
51                                 tabs.advanceSelectedTab(-1);
52                         } catch(E) {
53                                 dump('failed tabs.advanceSelectedTab(-1):'+js2JSON(E) + '\n');
54                                 try {
55                                         tabs.advanceSelectedTab(+1);
56                                 } catch(E) {
57                                         dump('failed again tabs.advanceSelectedTab(+1):'+js2JSON(E) + '\n');
58                                 }
59                         }
60
61                 }
62                 
63                 sdump('D_TAB','\tnew tabbox.selectedIndex = ' + tabbox.selectedIndex + '\n');
64
65                 tabs.childNodes[ idx ].hidden = true;
66                 delete_tab_contents( panels.childNodes[ idx ] );
67                 sdump('D_TAB','tabs.childNodes[ ' + idx + ' ].hidden = true;\n');
68
69                 // Make sure we keep at least one tab open.
70                 var tab_flag = true;
71                 for (var i = 0; i < tabs.childNodes.length; i++) {
72                         var tab = tabs.childNodes[i];
73                         if (!tab.hidden)
74                                 tab_flag = false;
75                 }
76                 if (tab_flag)
77                         new_tab(d,tabbox);
78
79         } catch(E) {
80                 dump(E+'\n');
81                 throw(E);
82         }
83 }
84
85 function delete_tab_contents( panel ) {
86         sdump('D_TAB',arg_dump(arguments,{0:'.tagName'}));
87         try {
88                 while (panel.lastChild) { panel.removeChild(panel.lastChild); }
89         } catch(E) {
90                 dump(js2JSON(E)+'\n');
91         }
92 }
93
94 function find_free_tab(tabs) {
95         var last_not_hidden = -1;
96         for (var i = 0; i<tabs.childNodes.length; i++) {
97                 var tab = tabs.childNodes[i];
98                 if (!tab.hidden)
99                         last_not_hidden = i;
100         }
101         if (last_not_hidden == tabs.childNodes.length - 1)
102                 last_not_hidden = -1;
103         // If the one next to last_not_hidden is hidden, we want it.
104         // Basically, we fill in tabs after existing tabs for as 
105         // long as possible.
106         var idx = last_not_hidden + 1;
107         var candidate = tabs.childNodes[ idx ];
108         if (candidate.hidden)
109                 return idx;
110         // Alright, find the first hidden then
111         for (var i = 0; i<tabs.childNodes.length; i++) {
112                 var tab = tabs.childNodes[i];
113                 if (tab.hidden)
114                         return i;
115         }
116         return -1;
117 }
118
119 function new_tab( d, tabbox ) {
120         sdump('D_TAB',arg_dump(arguments));
121         if (typeof(tabbox)!='object')
122                 tabbox = d.getElementById(tabbox);
123         if (typeof(tabbox)!='object')
124                 throw('Could not find tabbox. d = ' + d + ' tabbox = ' + tabbox + '\n');
125         var tabs = tabbox.firstChild;
126         var panels = tabbox.lastChild;
127         var tc = find_free_tab(tabs);
128         sdump('D_TAB','find_free_tab returned ' + tc + '\n');
129         if (tc == -1) { return; } // let's only have up to 10 tabs
130         var tab = tabs.childNodes[ tc ];
131                 tab.setAttribute('label','Tab ' + (tc + 1) );
132                 tab.hidden = false;
133         try {
134                 tabs.selectedIndex = tc;
135                 replace_tab(d,tabbox,'Tab','chrome://evergreen/content/main/about.xul');
136         } catch(E) {
137                 dump('+++++++++++++++++++++++++++++' + E + ' : ' + js2JSON(E)+'\n');
138         }
139 }
140
141 function replace_tab( d, tabbox, label, chrome, params ) {
142         sdump('D_TAB',arg_dump(arguments,{2:true,3:true,4:true}));
143         if (typeof(tabbox)!='object')
144                 tabbox = d.getElementById(tabbox);
145         if (typeof(tabbox)!='object')
146                 throw('Could not find tabbox. d = ' + d + ' tabbox = ' + tabbox + '\n');
147         var tabs = tabbox.firstChild;
148         var panels = tabbox.lastChild;
149         try {
150                 var idx = tabs.selectedIndex;
151                 
152                 delete_tab_contents(panels.childNodes[ idx ]);
153                 tabs.childNodes[ idx ].hidden = false;
154                 tabs.childNodes[ idx].setAttribute('label',label + ' ' + (idx+1));
155
156                 var frame = d.createElement('iframe');
157                 frame.setAttribute('id','frame_'+idx);
158                 frame.setAttribute('flex','1');
159                 frame.setAttribute('src',chrome);
160                 panels.childNodes[ idx ].appendChild(frame);
161                 sdump('D_TAB','Created frame : ' + frame.id + ' for index : ' + idx + ' with src=' + frame.getAttribute('src') + '\n');
162                 //frame.contentWindow.parentWindow = parentWindow;
163                 //frame.contentWindow.tabWindow = this;
164                 //dump('replace_tab.tabWindow = ' + this + '\n');
165                 frame.contentWindow.mw = mw;
166                 //frame.contentWindow.am_i_a_top_level_tab = true;
167                 if (params) {
168                         frame.contentWindow.params = params;
169                 }
170                 return frame.contentWindow;
171         } catch(E) {
172                 dump(js2JSON(E)+'\n');
173         }
174         //debug_tabs(d,tabbox);
175 }