?? feed-subscriptions.js
字號:
while (!done) { var folder = folderEnumerator.currentItem().QueryInterface(Components.interfaces.nsIMsgFolder); folderObject.children.push(this.makeFolderObject(folder, aCurrentLevel + 1)); try { folderEnumerator.next(); } catch (ex) { done = true; } } } var feeds = this.getFeedsInFolder(aFolder); for (feed in feeds) { // Special case, if a folder only has a single feed associated with it, then just use the feed // in the view and don't show the folder at all. // if (feedUrlArray.length <= 2 && !aFolder.hasSubFolders) // Note: split always adds an empty element to the array...// this.mFeedContainers[aCurrentLength] = this.makeFeedObject(feed, aCurrentLevel);// else // now add any feed urls for the folder folderObject.children.push(this.makeFeedObject(feeds[feed], aCurrentLevel + 1)); } return folderObject; }, getFeedsInFolder: function (aFolder) { var feeds = new Array(); try { var msgdb = aFolder.QueryInterface(Components.interfaces.nsIMsgFolder).getMsgDatabase(null); var folderInfo = msgdb.dBFolderInfo; var feedurls = folderInfo.getCharPtrProperty("feedUrl"); var feedUrlArray = feedurls.split("|"); for (url in feedUrlArray) { if (!feedUrlArray[url]) continue; var feedResource = rdf.GetResource(feedUrlArray[url]); var feed = new Feed(feedResource, this.mRSSServer); feeds.push(feed); } } catch(ex) {} return feeds; }, makeFeedObject: function (aFeed, aLevel) { // look inside the data source for the feed properties var feed = { children : [], name : aFeed.title, url : aFeed.url, level : aLevel, open : false, container : false }; return feed; }, loadSubscriptions: function () { // put together an array of folders var numFolders = 0; this.mFeedContainers = []; if (this.mRSSServer.rootFolder.hasSubFolders) { var folderEnumerator = this.mRSSServer.rootFolder.GetSubFolders(); var done = false; while (!done) { var folder = folderEnumerator.currentItem().QueryInterface(Components.interfaces.nsIMsgFolder); if (folder && !folder.getFlag(MSG_FOLDER_FLAG_TRASH)) { this.mFeedContainers.push(this.makeFolderObject(folder, 0)); numFolders++; } try { folderEnumerator.next(); } catch (ex) { done = true; } } } this.mView.mRowCount = numFolders; gFeedSubscriptionsWindow.mTree.focus(); }, updateFeedData: function (aItem) { var ids = ['nameLabel', 'nameValue', 'locationLabel', 'locationValue']; if (aItem && !aItem.container) { // set the feed location and title info document.getElementById('nameValue').value = aItem.name; document.getElementById('locationValue').value = aItem.url; } else { var noneSelected = this.mBundle.getString("subscribe-noFeedSelected"); document.getElementById('nameValue').value = noneSelected; document.getElementById('locationValue').value = ""; } for (i = 0; i < ids.length; ++i) document.getElementById(ids[i]).disabled = !aItem || aItem.container; }, onKeyPress: function(aEvent) { if (aEvent.keyCode == aEvent.DOM_VK_ENTER || aEvent.keyCode == aEvent.DOM_VK_RETURN) { var seln = this.mTree.view.selection; item = this.mView.getItemAtIndex(seln.currentIndex); if (item && !item.container) this.editFeed(); } }, onSelect: function () { var properties, item; var seln = this.mTree.view.selection; item = this.mView.getItemAtIndex(seln.currentIndex); this.updateFeedData(item); document.getElementById("removeFeed").disabled = !item || item.container; document.getElementById("editFeed").disabled = !item || item.container; }, removeFeed: function () { var seln = this.mView.selection; if (seln.count != 1) return; var itemToRemove = this.mView.getItemAtIndex(seln.currentIndex); if (!itemToRemove) return; // ask the user if he really wants to unsubscribe from the feed var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(IPS); var abortRemoval = promptService.confirmEx(window, this.mBundle.getString('subsribe-confirmFeedDeletionTitle'), this.mBundle.getFormattedString('subsribe-confirmFeedDeletion', [itemToRemove.name], 1), (IPS.BUTTON_TITLE_YES * IPS.BUTTON_POS_0) + (IPS.BUTTON_TITLE_NO * IPS.BUTTON_POS_1), null, null, null, null, { }); if (abortRemoval) return; var resource = rdf.GetResource(itemToRemove.url); var feed = new Feed(resource); var ds = getSubscriptionsDS(this.mRSSServer); if (feed && ds) { // remove the feed from the subscriptions ds var feeds = getSubscriptionsList(this.mRSSServer); var index = feeds.IndexOf(resource); if (index != kRowIndexUndefined) feeds.RemoveElementAt(index, false); // remove the feed property string from the folder data base var currentFolder = ds.GetTarget(resource, FZ_DESTFOLDER, true); if (currentFolder) { var currentFolderURI = currentFolder.QueryInterface(Components.interfaces.nsIRDFResource).Value; currentFolder = rdf.GetResource(currentFolderURI).QueryInterface(Components.interfaces.nsIMsgFolder); var feedUrl = ds.GetTarget(resource, DC_IDENTIFIER, true); ds.Unassert(resource, DC_IDENTIFIER, feedUrl, true); feedUrl = feedUrl ? feedUrl.QueryInterface(Components.interfaces.nsIRDFLiteral).Value : ""; updateFolderFeedUrl(currentFolder, feedUrl, true); // remove the old url } // Remove all assertions about the feed from the subscriptions database. removeAssertions(ds, resource); ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush(); // flush any changes // Remove all assertions about items in the feed from the items database. var itemds = getItemsDS(this.mRSSServer); feed.invalidateItems(); feed.removeInvalidItems(); itemds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush(); // flush any changes } // Now that we have removed the feed from the datasource, it is time to update our // view layer. Start by removing the child from its parent folder object this.mView.removeItemAtIndex(seln.currentIndex); // If we don't have any more subscriptions pointing into // this folder, then I think we should offer to delete it... // Cheat and look at the feed url property to see if anyone else is still using the feed... // you could also accomplish this by looking at some properties in the data source...// var msgdb = currentFolder.QueryInterface(Components.interfaces.nsIMsgFolder).getMsgDatabase(null);// var folderInfo = msgdb.dBFolderInfo;// var oldFeedUrl = folderInfo.getCharPtrProperty("feedUrl");// if (!oldFeedUrl) // no more feeds pointing to the folder?// {// try {// var openerResource = this.mRSSServer.rootMsgFolder.QueryInterface(Components.interfaces.nsIRDFResource);// var folderResource = currentFolder.QueryInterface(Components.interfaces.nsIRDFResource);// window.opener.messenger.DeleteFolders(window.opener.GetFolderDatasource(), openerResource, folderResource);// } catch (e) { }// } }, // aRootFolderURI --> optional argument. The folder to initially create the new feed under. addFeed: function(aFeedLocation, aRootFolderURI) { var userAddedFeed = false; var defaultQuickMode = this.mRSSServer.getBoolAttribute('quickMode'); var feedProperties = { feedName: "", feedLocation: aFeedLocation, serverURI: this.mRSSServer.serverURI, serverPrettyName: this.mRSSServer.prettyName, folderURI: aRootFolderURI, quickMode: this.mRSSServer.getBoolAttribute('quickMode'), newFeed: true, result: userAddedFeed}; feedProperties = openFeedEditor(feedProperties); // if the user hit cancel, exit without doing anything if (!feedProperties.result) return; if (!feedProperties.feedLocation) return; // before we go any further, make sure the user is not already subscribed to this feed. if (feedAlreadyExists(feedProperties.feedLocation, this.mRSSServer)) { var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(IPS); promptService.alert(window, null, this.mBundle.getString("subscribe-feedAlreadySubscribed")); return; } var feed = this.storeFeed(feedProperties); if(!feed) return; // Now validate and start downloadng the feed.... updateStatusItem('statusText', document.getElementById("bundle_newsblog").getString('subscribe-validating')); updateStatusItem('progressMeter', 0); document.getElementById('addFeed').setAttribute('disabled', 'true'); feed.download(true, this.mFeedDownloadCallback); }, // helper routine used by addFeed and importOPMLFile storeFeed: function(feedProperties) { var itemResource = rdf.GetResource(feedProperties.feedLocation); feed = new Feed(itemResource, this.mRSSServer); // if the user specified a specific folder to add the feed too, then set it here if (feedProperties.folderURI) { var folderResource = rdf.GetResource(feedProperties.folderURI); if (folderResource) { var folder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder); if (folder && !folder.isServer) feed.folder = folder; } } feed.quickMode = feedProperties.quickMode; return feed; }, editFeed: function() { var seln = this.mView.selection; if (seln.count != 1) return; var itemToEdit = this.mView.getItemAtIndex(seln.currentIndex); if (!itemToEdit || itemToEdit.container) return; var resource = rdf.GetResource(itemToEdit.url); var feed = new Feed(resource, this.mRSSServer); var ds = getSubscriptionsDS(this.mRSSServer); var currentFolder = ds.GetTarget(resource, FZ_DESTFOLDER, true); var currentFolderURI = currentFolder.QueryInterface(Components.interfaces.nsIRDFResource).Value; var userModifiedFeed = false; var feedProperties = { feedLocation: itemToEdit.url, serverURI: this.mRSSServer.serverURI, serverPrettyName: this.mRSSServer.prettyName, folderURI: currentFolderURI, quickMode: feed.quickMode, newFeed: false, result: userModifiedFeed}; feedProperties = openFeedEditor(feedProperties); if (!feedProperties.result) // did the user cancel? return; // check to see if the quickMode value changed if (feed.quickMode != feedProperties.quickMode) feed.quickMode = feedProperties.quickMode; // did the user change the folder URI for storing the feed? if (feedProperties.folderURI && feedProperties.folderURI != currentFolderURI) { // we need to find the index of the new parent folder... var newParentIndex = kRowIndexUndefined; for (index = 0; index < this.mView.rowCount; index++) { var item = this.mView.getItemAtIndex(index); if (item && item.container && item.url == feedProperties.folderURI) { newParentIndex = index; break; } } if (newParentIndex != kRowIndexUndefined) this.moveFeed(seln.currentIndex, newParentIndex) } ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush(); // flush any changes }, // moves the feed located at aOldFeedIndex to a child of aNewParentIndex moveFeed: function(aOldFeedIndex, aNewParentIndex) { // if the new parent is the same as the current parent, then do nothing if (this.mView.getParentIndex(aOldFeedIndex) == aNewParentIndex) return; var currentItem = this.mView.getItemAtIndex(aOldFeedIndex); var currentParentItem = this.mView.getItemAtIndex(this.mView.getParentIndex(aOldFeedIndex)); var currentParentResource = rdf.GetResource(currentParentItem.url); var newParentItem = this.mView.getItemAtIndex(aNewParentIndex); var newParentResource = rdf.GetResource(newParentItem.url); var ds = getSubscriptionsDS(this.mRSSServer); var resource = rdf.GetResource(currentItem.url); var currentFolder = currentParentResource.QueryInterface(Components.interfaces.nsIMsgFolder); // unassert the older URI, add an assertion for the new parent URI...
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -