?? subscribe.js
字號:
var gSubscribeTree = null;var gSearchTree;var okCallback = null;var gChangeTable = {};var gServerURI = null;var gSubscribableServer = null;var gStatusBar = null;var gNameField = null;var gNameFieldLabel = null;var gFolderDelimiter = ".";var gStatusFeedback = new nsMsgStatusFeedback;var gTimelineEnabled = false;var gMessengerBundle = null;var gSubscribeDeck = null;var gSearchView = null;var gSearchTreeBoxObject = null;// the rdf servicevar RDF = Components.classes['@mozilla.org/rdf/rdf-service;1'].getService(Components.interfaces.nsIRDFService);var subscribeDS = RDF.GetDataSource("rdf:subscribe");// get the "subscribed" atomvar atomService = Components.classes["@mozilla.org/atom-service;1"].getService().QueryInterface(Components.interfaces.nsIAtomService);var gSubscribedAtom = atomService.getAtom("subscribed").QueryInterface(Components.interfaces.nsISupports);var gSubscribeBundle;function goDoCommand(){}function Stop(){ //dump("Stop()\n") if (gSubscribableServer) { gSubscribableServer.stopPopulating(msgWindow); }}function SetServerTypeSpecificTextValues(){ if (!gServerURI) return; var serverType = GetMsgFolderFromUri(gServerURI, true).server.type; // set the server specific ui elements var stringName = "foldersheaderfor-" + serverType; var stringval = gSubscribeBundle.getString(stringName); var element = document.getElementById("subscribeFolderLabel"); element.setAttribute('value',stringval); //set the delimiter try { gFolderDelimiter = gSubscribableServer.delimiter; } catch (ex) { //dump(ex + "\n"); gFolderDelimiter = "."; }}function onServerClick(event){ var item = event.target; gServerURI = item.id; //dump("gServerURI="+gServerURI+"\n"); SetUpTree(false); SetServerTypeSpecificTextValues();}function SetUpServerMenu(){ //dump("SetUpServerMenu()\n"); var serverMenu = document.getElementById("serverMenu"); var menuitems = serverMenu.getElementsByAttribute("id", gServerURI); try { //dump("gServerURI="+gServerURI+"\n"); //dump("menuitems="+menuitems+"\n"); //dump("menuitems[0]="+menuitems[0]+"\n"); //dump("serverMenu="+serverMenu+"\n"); serverMenu.selectedItem = menuitems[0]; } catch (ex) { //dump("failed to set the selected server: " + ex + "\n"); } SetServerTypeSpecificTextValues();}var MySubscribeListener = { OnDonePopulating: function() { gStatusFeedback._stopMeteors(); // only re-root the tree, if it is null. // otherwise, we are in here because we are populating // a part of the tree var refValue = gSubscribeTree.getAttribute('ref'); if (!refValue) { //dump("root subscribe tree at: "+ gServerURI +"\n"); gSubscribeTree.database.AddDataSource(subscribeDS); gSubscribeTree.setAttribute('ref',gServerURI); } }};function SetUpTree(forceToServer){ //dump("SetUpTree()\n"); gStatusBar = document.getElementById('statusbar-icon'); if (!gServerURI) return; var folder = GetMsgFolderFromUri(gServerURI, true); var server = folder.server; try { CleanUpSearchView(); gSubscribableServer = server.QueryInterface(Components.interfaces.nsISubscribableServer); gSubscribeTree.setAttribute('ref',null); // enable (or disable) the search related UI EnableSearchUI(); // clear out the text field when switching server gNameField.value = ""; // since there is no text, switch to the non-search view... SwitchToNormalView(); gSubscribeTree.database.RemoveDataSource(subscribeDS); gSubscribableServer.subscribeListener = MySubscribeListener; gStatusFeedback._startMeteors(); gStatusFeedback.showStatusString(gSubscribeBundle.getString("pleaseWaitString")); gSubscribableServer.startPopulating(msgWindow, forceToServer); } catch (ex) { //dump("failed to populate subscribe ds: " + ex + "\n"); }}function SubscribeOnUnload(){ try { CleanUpSearchView(); gSubscribeTree.database.RemoveDataSource(subscribeDS); } catch (ex) { dump("failed to remove the subscribe ds: " + ex + "\n"); }}function EnableSearchUI(){ if (gSubscribableServer.supportsSubscribeSearch) { gNameField.removeAttribute('disabled'); gNameFieldLabel.removeAttribute('disabled'); } else { gNameField.setAttribute('disabled',true); gNameFieldLabel.setAttribute('disabled',true); }}function SubscribeOnLoad(){ //dump("SubscribeOnLoad()\n"); gSubscribeBundle = document.getElementById("bundle_subscribe"); gMessengerBundle = document.getElementById("bundle_messenger"); gSubscribeTree = document.getElementById("subscribeTree"); gSearchTree = document.getElementById("searchTree"); gSearchTreeBoxObject = document.getElementById("searchTree").treeBoxObject; gNameField = document.getElementById("namefield"); gNameFieldLabel = document.getElementById("namefieldlabel"); gSubscribeDeck = document.getElementById("subscribedeck"); msgWindow = Components.classes[msgWindowContractID].createInstance(Components.interfaces.nsIMsgWindow); msgWindow.statusFeedback = gStatusFeedback; msgWindow.SetDOMWindow(window); msgWindow.rootDocShell.allowAuth = true; // look in arguments[0] for parameters if (window.arguments && window.arguments[0]) { if ( window.arguments[0].okCallback ) { top.okCallback = window.arguments[0].okCallback; } } gServerURI = null; if (window.arguments[0].preselectedURI) { var uri = window.arguments[0].preselectedURI; //dump("subscribe: got a uri," + uri + "\n"); var folder = GetMsgFolderFromUri(uri, true); //dump("folder="+folder+"\n"); try { CleanUpSearchView(); gSubscribableServer = folder.server.QueryInterface(Components.interfaces.nsISubscribableServer); // enable (or disable) the search related UI EnableSearchUI(); gServerURI = folder.server.serverURI; } catch (ex) { CleanUpSearchView(); gSubscribableServer = null; gServerURI = null; } } if (!gServerURI) { //dump("subscribe: no uri\n"); //dump("xxx todo: use the default news server. right now, I'm just using the first server\n"); var serverMenu = document.getElementById("serverMenu"); var menuitems = serverMenu.getElementsByTagName("menuitem"); if (menuitems.length > 1) { gServerURI = menuitems[1].id; } else { //dump("xxx todo none of your servers are subscribable\n"); //dump("xxx todo fix this by disabling subscribe if no subscribable server or, add a CREATE SERVER button, like in 4.x\n"); return; } } SetUpServerMenu(); SetUpTree(false); gNameField.focus();}function subscribeOK(){ //dump("in subscribeOK()\n") if (top.okCallback) { top.okCallback(top.gChangeTable); } Stop(); if (gSubscribableServer) { gSubscribableServer.subscribeCleanup(); } return true;}function subscribeCancel(){ Stop(); if (gSubscribableServer) { gSubscribableServer.subscribeCleanup(); } return true;}function SetState(name,state){ var changed = gSubscribableServer.setState(name, state); if (changed) StateChanged(name,state);}function changeTableRecord(server, name, state) { this.server = server; this.name = name; this.state = state;}function StateChanged(name,state){ if (gServerURI in gChangeTable) { if (name in gChangeTable[gServerURI]) { var oldValue = gChangeTable[gServerURI][name]; if (oldValue != state) delete gChangeTable[gServerURI][name]; } else { gChangeTable[gServerURI][name] = state; } else { gChangeTable[gServerURI] = {}; gChangeTable[gServerURI][name] = state; }}function InSearchMode(){ // search is the second card in the deck return (gSubscribeDeck.getAttribute("selectedIndex") == "1");}function SearchOnClick(event){ // we only care about button 0 (left click) events if (event.button != 0 || event.originalTarget.localName != "treechildren") return; var row = {}, col = {}, childElt = {}; gSearchTreeBoxObject.getCellAt(event.clientX, event.clientY, row, col, childElt); if (row.value == -1 || row.value > gSearchView.rowCount-1) return; if (col.value.id == "subscribedColumn2") { if (event.detail != 2) { // single clicked on the check box // (in the "subscribedColumn2" column) reverse state // if double click, do nothing ReverseStateFromRow(row.value); } } else if (event.detail == 2) { // double clicked on a row, reverse state ReverseStateFromRow(row.value); } // invalidate the row InvalidateSearchTreeRow(row.value);}function ReverseStateFromRow(row){ // to determine if the row is subscribed or not, // we get the properties for the "subscribedColumn2" cell in the row // and look for the "subscribed" property // if the "subscribed" atom is in the list of properties // we are subscribed var properties = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray); var col = gSearchTree.columns["subscribedColumn2"]; gSearchView.getCellProperties(row, col, properties); var isSubscribed = (properties.GetIndexOf(gSubscribedAtom) != -1); SetStateFromRow(row, !isSubscribed);}function SetStateFromRow(row, state){ var col = gSearchTree.columns["nameColumn2"]; var name = gSearchView.getCellText(row, col); SetState(name, state);}function SetSubscribeState(state){ try { // we need to iterate over the tree selection, and set the state for // all rows in the selection var inSearchMode = InSearchMode(); var view = inSearchMode ? gSearchView : gSubscribeTree.view; var colId = inSearchMode ? "nameColumn2" : "nameColumn"; var sel = view.selection; for (var i = 0; i < sel.getRangeCount(); ++i) { var start = {}, end = {}; sel.getRangeAt(i, start, end); for (var k = start.value; k <= end.value; ++k) { if (inSearchMode) SetStateFromRow(k, state); else { var rowRes = gSubscribeTree.builderView.getResourceAtIndex(k); var name = GetRDFProperty(rowRes, "Name"); SetState(name, state); } } } if (inSearchMode) { // force a repaint InvalidateSearchTree(); } } catch (ex) { dump("SetSubscribedState failed: " + ex + "\n"); }}function ReverseStateFromNode(row){ var rowRes = gSubscribeTree.builderView.getResourceAtIndex(row); var isSubscribed = GetRDFProperty(rowRes, "Subscribed"); var name = GetRDFProperty(rowRes, "Name"); SetState(name, isSubscribed != "true");}function GetRDFProperty(aRes, aProp){ var propRes = RDF.GetResource("http://home.netscape.com/NC-rdf#"+aProp); var valueRes = gSubscribeTree.database.GetTarget(aRes, propRes, true); return valueRes ? valueRes.QueryInterface(Components.interfaces.nsIRDFLiteral).Value : null;}function SubscribeOnClick(event){ // we only care about button 0 (left click) events if (event.button != 0 || event.originalTarget.localName != "treechildren") return; var row = {}, col = {}, obj = {}; gSubscribeTree.treeBoxObject.getCellAt(event.clientX, event.clientY, row, col, obj); if (row.value == -1 || row.value > (gSubscribeTree.view.rowCount - 1)) return; if (event.detail == 2) { // only toggle subscribed state when double clicking something // that isn't a container if (!gSubscribeTree.view.isContainer(row.value)) { ReverseStateFromNode(row.value); return; } } else if (event.detail == 1) { if (obj.value == "twisty") { if (gSubscribeTree.view.isContainerOpen(row.value)) { var uri = gSubscribeTree.builderView.getResourceAtIndex(row.value).Value; gStatusFeedback._startMeteors(); gStatusFeedback.showStatusString(gSubscribeBundle.getString("pleaseWaitString")); gSubscribableServer.startPopulatingWithUri(msgWindow, true /* force to server */, uri); } } else { // if the user single clicks on the subscribe check box, we handle it here if (col.value.id == "subscribedColumn") ReverseStateFromNode(row.value); } }}function Refresh(){ // clear out the textfield's entry on call of Refresh() gNameField.value = ""; // force it to talk to the server SetUpTree(true);}function InvalidateSearchTreeRow(row){ gSearchTreeBoxObject.invalidateRow(row);}function InvalidateSearchTree(){ gSearchTreeBoxObject.invalidate();}function SwitchToNormalView(){ // the first card in the deck is the "normal" view gSubscribeDeck.setAttribute("selectedIndex","0");}function SwitchToSearchView(){ // the second card in the deck is the "search" view gSubscribeDeck.setAttribute("selectedIndex","1");}function Search(){ var searchValue = gNameField.value; if (searchValue.length && gSubscribableServer.supportsSubscribeSearch) { SwitchToSearchView(); gSubscribableServer.setSearchValue(searchValue); if (!gSearchView && gSubscribableServer) { gSearchView = gSubscribableServer.QueryInterface(Components.interfaces.nsITreeView); gSearchView.selection = null; gSearchTreeBoxObject.view = gSearchView; } } else { SwitchToNormalView(); }}function CleanUpSearchView(){ if (gSearchView) { gSearchView.selection = null; gSearchView = null; }}function onSearchTreeKeyPress(event){ // for now, only do something on space key if (event.charCode != KeyEvent.DOM_VK_SPACE) return; var treeSelection = gSearchView.selection; for (var i=0;i<treeSelection.getRangeCount();i++) { var start = {}, end = {}; treeSelection.getRangeAt(i,start,end); for (var k=start.value;k<=end.value;k++) ReverseStateFromRow(k); // force a repaint InvalidateSearchTree(); }}function onSubscribeTreeKeyPress(event){ // for now, only do something on space key if (event.charCode != KeyEvent.DOM_VK_SPACE) return; var treeSelection = gSubscribeTree.view.selection; for (var i=0;i<treeSelection.getRangeCount();i++) { var start = {}, end = {}; treeSelection.getRangeAt(i,start,end); for (var k=start.value;k<=end.value;k++) ReverseStateFromNode(k); }}function doHelpButton() { openHelp("mail-subscribe");}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -