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