⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 feed-subscriptions.js

📁 现在很火的邮件客户端软件thunderbird的源码
💻 JS
📖 第 1 页 / 共 3 页
字号:
      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 + -