pretend to create/delete tabs by unhiding/hiding them
authorphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 28 Jun 2005 02:13:29 +0000 (02:13 +0000)
committerphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 28 Jun 2005 02:13:29 +0000 (02:13 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@937 dcc99617-32d9-48b4-a31d-7c20da2025e4

Evergreen/staff_client/chrome/content/evergreen/main/app_shell.js
Evergreen/staff_client/chrome/content/evergreen/main/app_shell_overlay.xul

index e28c478..73fe029 100644 (file)
 sdump('D_TRACE','Loading app_shell.js\n');
 
-var tab_count = [ false, false, false, false, false, false, false, false, false, false ];
-
-function debug_tabs( d, tabbox ) {
-       if (typeof(tabbox)!='object')
-               tabbox = d.getElementById(tabbox);
-       if (typeof(tabbox)!='object')
-               throw('Could not find tabbox. d = ' + d + ' tabbox = ' + tabbox + '\n');
-       var tabs = tabbox.firstChild; 
-       var panels = tabbox.lastChild;
-       sdump('D_TAB', d.id + '\t' + tabbox.id + '\n');
-       sdump('D_TAB','\ttabs.childNodes.length = ' + tabs.childNodes.length + '\n');
-       for (var i = 0; i < tabs.childNodes.length; i++) {
-               var tab = tabs.childNodes[i];
-               sdump('D_TAB','\t\t#' + i + '  tab = ' + tab.tagName + ' : ' + tab.id + '\n' );
-               if (tab.childNodes) {
-                       sdump('D_TAB','\t\t\ttab.childNodes.length = ' + tab.childNodes.length + '\n');
-                       for (var j = 0; j < tab.childNodes.length; j++) {
-                               var child = tab.childNodes[j];
-                               sdump('D_TAB','\t\t\t#' + j + ' ' + child.tagName + ' : ' + child.id + '\n');
-                       }
-               }
-       }
-
-       sdump('D_TAB','\tpanels.childNodes.length = ' + panels.childNodes.length + '\n');
-       for (var i = 0; i < panels.childNodes.length; i++) {
-               var panel = panels.childNodes[i];
-               sdump('D_TAB','\t\t#' + i + '  panel = ' + panel.tagName + ' : ' + panel.id + '\n' );
-               if (panel.childNodes) {
-                       sdump('D_TAB','\t\t\tpanel.childNodes.length = ' + panel.childNodes.length + '\n');
-                       for (var j = 0; j < panel.childNodes.length; j++) {
-                               var child = panel.childNodes[j];
-                               sdump('D_TAB','\t\t\t#' + j + ' ' + child.tagName + ' : ' + child.id + '\n');
-                       }
-               }
-       }
-       sdump('D_TAB',
-               'tabbox.selectedIndex = ' + tabbox.selectedIndex +
-               ' .selectedTab = ' + tabbox.selectedTab.id +
-               ' .selectedPanel = ' + tabbox.selectedPanel.id + '\n');
-       sdump('D_TAB',
-               'tabs.selectedIndex = ' + tabs.selectedIndex + 
-               ' .selectedItem = ' + tabs.selectedItem.id + '\n');
-       sdump('D_TAB',
-               'panels.selectedIndex = ' + panels.selectedIndex + 
-               ' .selectedPanel.id = ' + panels.selectedPanel.id + '\n');
-
-}
-
 function app_shell_init(params) {
        dump("TESTING: app_shell.js: " + mw.G['main_test_variable'] + '\n');
        replace_tab(params.d,'main_tabbox','Tab','chrome://evergreen/content/main/about.xul');
        mw.G.sound.beep();
 }
 
-function close_tab( d, tabbox ) {
-       sdump('D_TAB','calling close_tab( ' + d.id + ',' + tabbox + ');\n');
-       if (typeof(tabbox)!='object')
-               tabbox = d.getElementById(tabbox);
-       if (typeof(tabbox)!='object')
-               throw('Could not find tabbox. d = ' + d + ' tabbox = ' + tabbox + '\n');
+function close_tab( d, t1, t2 ) {
+       // t1 = tabbox or tab, if t1 = tabbox, t2 = tab index, otherwise close current tab
+       sdump('D_TAB',arg_dump(arguments,{1:true,2:true}));
+       if (typeof(t1)!='object')
+               t1 = d.getElementById(t1);
+       if (typeof(t1)!='object')
+               throw('Could not find tab or tabbox. d = ' + d + ' tabbox = ' + t1 + '\n');
        try {
+               var tabbox;
+
+               if (t1.tagName == 'tabbox')
+                       tabbox = t1;
+               else
+                       tabbox = t1.parentNode.parentNode;
+
                var idx = tabbox.selectedIndex;
+               if (t2)
+                       idx = t2;
+
+               sdump('D_TAB','tabbox.selectedIndex = ' + tabbox.selectedIndex + '\n');
                var tabs = tabbox.firstChild; 
                var panels = tabbox.lastChild;
 
-               if (idx == 0)
-                       tabs.advanceSelectedTab(+1);
-               else
-                       tabs.advanceSelectedTab(-1);
-
-               if (tabs.childNodes.length > 1 ) {
-                       tabs.removeItemAt( idx );
-                       panels.removeChild( panels.childNodes[ idx ] );
+               if (idx == 0) {
+                       try {
+                               tabs.advanceSelectedTab(+1);
+                       } catch(E) {
+                               dump('failed tabs.advanceSelectedTab(+1):'+js2JSON(E) + '\n');
+                               try {
+                                       tabs.advanceSelectedTab(-1);
+                               } catch(E) {
+                                       dump('failed again tabs.advanceSelectedTab(-1):'+js2JSON(E) + '\n');
+                               }
+                       }
                } else {
-                       replace_tab(d,tabbox,'Tab','chrome://evergreen/content/main/about.xul');
+                       try {
+                               tabs.advanceSelectedTab(-1);
+                       } catch(E) {
+                               dump('failed tabs.advanceSelectedTab(-1):'+js2JSON(E) + '\n');
+                               try {
+                                       tabs.advanceSelectedTab(+1);
+                               } catch(E) {
+                                       dump('failed again tabs.advanceSelectedTab(+1):'+js2JSON(E) + '\n');
+                               }
+                       }
+
+               }
+               
+               sdump('D_TAB','\tnew tabbox.selectedIndex = ' + tabbox.selectedIndex + '\n');
+
+               tabs.childNodes[ idx ].hidden = true;
+               delete_tab_contents( panels.childNodes[ idx ] );
+               sdump('D_TAB','tabs.childNodes[ ' + idx + ' ].hidden = true;\n');
+
+               // Make sure we keep at least one tab open.
+               var tab_flag = true;
+               for (var i = 0; i < tabs.childNodes.length; i++) {
+                       var tab = tabs.childNodes[i];
+                       if (!tab.hidden)
+                               tab_flag = false;
                }
+               if (tab_flag)
+                       new_tab(d,tabbox);
 
        } catch(E) {
                dump(E+'\n');
                throw(E);
        }
-       debug_tabs(d,tabbox);
 }
 
-function delete_tab_contents( tab, panel ) {
-       sdump('D_TAB','calling delete_tab_contents( ' + tab.id + ',' + panel.id + ');\n');
+function delete_tab_contents( panel ) {
+       sdump('D_TAB',arg_dump(arguments));
        try {
-               if (tab.childNodes)
-                       sdump('D_TAB','before: tab.childNodes.length = ' + tab.childNodes.length + '\n');
-               if (panel.childNodes)
-                       sdump('D_TAB','before: panel.childNodes.length = ' + panel.childNodes.length + '\n');
-               while (tab.lastChild) { tab.removeChild(tab.lastChild); }
                while (panel.lastChild) { panel.removeChild(panel.lastChild); }
-               if (tab.childNodes)
-                       sdump('D_TAB','after: tab.childNodes.length = ' + tab.childNodes.length + '\n');
-               if (panel.childNodes)
-                       sdump('D_TAB','after: panel.childNodes.length = ' + panel.childNodes.length + '\n');
        } catch(E) {
                dump(js2JSON(E)+'\n');
        }
 }
 
-function first_free_tab_count() {
-       for (var i = 0; i<10; i++) {
-               if (! tab_count[i]) {
-                       tab_count[i] = true;
+function find_free_tab(tabs) {
+       var last_not_hidden = -1;
+       for (var i = 0; i<tabs.childNodes.length; i++) {
+               var tab = tabs.childNodes[i];
+               if (!tab.hidden)
+                       last_not_hidden = i;
+       }
+       if (last_not_hidden == tabs.childNodes.length - 1)
+               last_not_hidden = -1;
+       // If the one next to last_not_hidden is hidden, we want it.
+       // Basically, we fill in tabs after existing tabs for as 
+       // long as possible.
+       var idx = last_not_hidden + 1;
+       var candidate = tabs.childNodes[ idx ];
+       if (candidate.hidden)
+               return idx;
+       // Alright, find the first hidden then
+       for (var i = 0; i<tabs.childNodes.length; i++) {
+               var tab = tabs.childNodes[i];
+               if (tab.hidden)
                        return i;
-               }
        }
        return -1;
 }
 
 function new_tab( d, tabbox ) {
-       sdump('D_TAB','calling new_tab( ' + d.id + ',' + tabbox + ');\n');
+       sdump('D_TAB',arg_dump(arguments));
        if (typeof(tabbox)!='object')
                tabbox = d.getElementById(tabbox);
        if (typeof(tabbox)!='object')
                throw('Could not find tabbox. d = ' + d + ' tabbox = ' + tabbox + '\n');
        var tabs = tabbox.firstChild;
        var panels = tabbox.lastChild;
-       var tc = first_free_tab_count();
+       var tc = find_free_tab(tabs);
+       sdump('D_TAB','find_free_tab returned ' + tc + '\n');
        if (tc == -1) { return; } // let's only have up to 10 tabs
-       var panel = d.createElement('tabpanel');
-               panel.setAttribute('flex','1');
-               panel.setAttribute('id','panel'+tc);
-       panels.appendChild(panel);
-       sdump('D_TAB','Created a tabpanel: ' + panel.id + '\n');
-
-       var tab = d.createElement('tab');
-               tab.setAttribute('id','tab' + tc );
-               tab.setAttribute('label','Tab ' + tc );
-               tab.setAttribute('count',tc);
-               tab.setAttribute('accesskey',tc);
-               tab.setAttribute('linkedpanel','panel'+tc);
-       tabs.appendChild(tab);
-       sdump('D_TAB','Created a tab: ' + tab.id + '\n');
+       var tab = tabs.childNodes[ tc ];
+               tab.setAttribute('label','Tab ' + (tc + 1) );
+               tab.hidden = false;
        try {
-               /*
-               tabbox.selectedIndex = tc;
                tabs.selectedIndex = tc;
-               */
-               tabs.selectedTab = tab;
-               //tabbox.selectedIndex = tabs.childNodes.length - 1;
-               //tabs.selectedIndex = tabs.childNodes.length - 1;
                replace_tab(d,tabbox,'Tab','chrome://evergreen/content/main/about.xul');
        } catch(E) {
                dump('+++++++++++++++++++++++++++++' + E + ' : ' + js2JSON(E)+'\n');
        }
-       debug_tabs(d,tabbox);
 }
 
 function replace_tab( d, tabbox, label, chrome, params ) {
-       sdump('D_TAB','calling replace_tab( ' + d.id + ',' + tabbox + ');\n');
+       sdump('D_TAB',arg_dump(arguments,{'3':true}));
        if (typeof(tabbox)!='object')
                tabbox = d.getElementById(tabbox);
        if (typeof(tabbox)!='object')
                throw('Could not find tabbox. d = ' + d + ' tabbox = ' + tabbox + '\n');
        var tabs = tabbox.firstChild;
        var panels = tabbox.lastChild;
-       if (tabs.childNodes.length == 0) { new_tab(d,tabbox); }
        try {
-               var tab = tabs.selectedItem;
-               var panel = tabbox.selectedPanel;
-               delete_tab_contents(tab,panel);
-
-               tab.setAttribute('label',label + ' ' + tab.getAttribute('count') );
+               var idx = tabs.selectedIndex;
+               
+               delete_tab_contents(panels.childNodes[ idx ]);
+               tabs.childNodes[ idx ].hidden = false;
 
                var frame = d.createElement('iframe');
-               frame.setAttribute('id','frame'+tab.getAttribute('count'));
+               frame.setAttribute('id','frame_'+idx);
                frame.setAttribute('flex','1');
-               //frame.setAttribute('style','overflow: scroll; min-height: 500px; min-width: 500px;');
                frame.setAttribute('src',chrome);
-               panel.appendChild(frame);
-               sdump('D_TAB','Created frame : ' + frame.id + ' for tab : ' + tab.id + ' and panel : ' + panel.id + '\n');
+               panels.childNodes[ idx ].appendChild(frame);
+               sdump('D_TAB','Created frame : ' + frame.id + ' for index : ' + idx + '\n');
                //frame.contentWindow.parentWindow = parentWindow;
                //frame.contentWindow.tabWindow = this;
                //dump('replace_tab.tabWindow = ' + this + '\n');
@@ -186,5 +164,5 @@ function replace_tab( d, tabbox, label, chrome, params ) {
        } catch(E) {
                dump(js2JSON(E)+'\n');
        }
-       debug_tabs(d,tabbox);
+       //debug_tabs(d,tabbox);
 }
index ad36755..3f35dfa 100644 (file)
 <box id="AppShell_main" flex="1" orient="vertical">
        <toolbox id="main_toolbox"/>
        <tabbox id="main_tabbox" flex="1" eventnode="window" handleCtrlTab="true">
-               <tabs id="main_tabs" closebutton="true"/>
-               <tabpanels id="main_panels" flex="1"/>
+               <tabs id="main_tabs" closebutton="true">
+                       <tab id="tab_1" accesskey="1" label="Tab 1" />
+                       <tab id="tab_2" accesskey="2" label="Tab 2" hidden="true" />
+                       <tab id="tab_3" accesskey="3" label="Tab 3" hidden="true" />
+                       <tab id="tab_4" accesskey="4" label="Tab 4" hidden="true" />
+                       <tab id="tab_5" accesskey="5" label="Tab 5" hidden="true" />
+                       <tab id="tab_6" accesskey="6" label="Tab 6" hidden="true" />
+                       <tab id="tab_7" accesskey="7" label="Tab 7" hidden="true" />
+                       <tab id="tab_8" accesskey="8" label="Tab 8" hidden="true" />
+                       <tab id="tab_9" accesskey="9" label="Tab 9" hidden="true" />
+               </tabs>
+               <tabpanels id="main_panels" flex="1">
+                       <tabpanel id="panel_1"><label value="panel_1"/></tabpanel>
+                       <tabpanel id="panel_2"><label value="panel_2"/></tabpanel>
+                       <tabpanel id="panel_3"><label value="panel_3"/></tabpanel>
+                       <tabpanel id="panel_4"><label value="panel_4"/></tabpanel>
+                       <tabpanel id="panel_5"><label value="panel_5"/></tabpanel>
+                       <tabpanel id="panel_6"><label value="panel_6"/></tabpanel>
+                       <tabpanel id="panel_7"><label value="panel_7"/></tabpanel>
+                       <tabpanel id="panel_8"><label value="panel_8"/></tabpanel>
+                       <tabpanel id="panel_9"><label value="panel_9"/></tabpanel>
+               </tabpanels>
        </tabbox>
        <toolbox id="entity_toolbox"/>
 </box>
 </menu>
 
 <!-- Accelerator Keys (Accessor Keys are in DTD's) -->
-<keyset id="evergreen_keys">
+<keyset id="AppShell_keys">
        <key id="file-new-key" modifiers="accel" key="N" command="cmd_new_window"/>
        <key id="file-new-tab-key" modifiers="accel" key="T" command="cmd_new_tab"/>
        <key id="file-open-key" modifiers="accel" key="O" command=""/>