home *** CD-ROM | disk | FTP | other *** search
/ Freelog 100 / FreelogNo100-NovembreDecembre2010.iso / Multimedia / Songbird / Songbird_1.8.0-1800_windows-i686-msvc8.exe / jsmodules / sbAddToLibrary.jsm < prev    next >
Text File  |  2010-08-30  |  9KB  |  323 lines

  1. /*
  2. //
  3. // BEGIN SONGBIRD GPL
  4. //
  5. // This file is part of the Songbird web player.
  6. //
  7. // Copyright(c) 2005-2009 POTI, Inc.
  8. // http://songbirdnest.com
  9. //
  10. // This file may be licensed under the terms of of the
  11. // GNU General Public License Version 2 (the "GPL").
  12. //
  13. // Software distributed under the License is distributed
  14. // on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
  15. // express or implied. See the GPL for the specific language
  16. // governing rights and limitations.
  17. //
  18. // You should have received a copy of the GPL along with this
  19. // program. If not, go to http://www.gnu.org/licenses/gpl.html
  20. // or write to the Free Software Foundation, Inc.,
  21. // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  22. //
  23. // END SONGBIRD GPL
  24. //
  25.  */
  26.  
  27. Components.utils.import("resource://app/jsmodules/sbProperties.jsm");
  28. Components.utils.import("resource://app/jsmodules/DropHelper.jsm");
  29. Components.utils.import("resource://app/jsmodules/sbLibraryUtils.jsm");
  30. Components.utils.import("resource://app/jsmodules/SBUtils.jsm");
  31.  
  32. const Ci = Components.interfaces;
  33. const Cc = Components.classes;
  34.  
  35. const SB_MEDIALISTDUPLICATEFILTER_CONTRACTID =
  36.   "@songbirdnest.com/Songbird/Library/medialistduplicatefilter;1";
  37.  
  38. const ADDTOLIBRARY_MENU_TYPE      = "menuitem";
  39. const ADDTOLIBRARY_MENU_ID        = "library_cmd_addtolibrary";
  40. const ADDTOLIBRARY_MENU_NAME      = "&command.addtolibrary";
  41. const ADDTOLIBRARY_MENU_TOOLTIP   = "&command.tooltip.addtolibrary";
  42. const ADDTOLIBRARY_MENU_KEY       = "&command.shortcut.key.addtolibrary";
  43. const ADDTOLIBRARY_MENU_KEYCODE   = "&command.shortcut.keycode.addtolibrary";
  44. const ADDTOLIBRARY_MENU_MODIFIERS = "&command.shortcut.modifiers.addtolibrary";
  45.  
  46.  
  47. const ADDTOLIBRARY_COMMAND_ID = "library_cmd_addtolibrary";
  48.  
  49. EXPORTED_SYMBOLS = [ "addToLibraryHelper",
  50.                      "SBPlaylistCommand_AddToLibrary" ];
  51.  
  52. // ----------------------------------------------------------------------------
  53. // The "Add to library" dynamic command object
  54. // ----------------------------------------------------------------------------
  55. var SBPlaylistCommand_AddToLibrary =
  56. {
  57.   context: {
  58.     playlist: null,
  59.     window: null
  60.   },
  61.  
  62.   addToLibrary: null,
  63.  
  64.   root_commands :
  65.   {
  66.     types: [ADDTOLIBRARY_MENU_TYPE],
  67.     ids: [ADDTOLIBRARY_MENU_ID],
  68.     names: [ADDTOLIBRARY_MENU_NAME],
  69.     tooltips: [ADDTOLIBRARY_MENU_TOOLTIP],
  70.     keys: [ADDTOLIBRARY_MENU_KEY],
  71.     keycodes: [ADDTOLIBRARY_MENU_KEYCODE],
  72.     enableds: [true],
  73.     modifiers: [ADDTOLIBRARY_MENU_MODIFIERS],
  74.     playlistCommands: [null]
  75.   },
  76.  
  77.   _getMenu: function(aSubMenu)
  78.   {
  79.     return this.root_commands;
  80.   },
  81.  
  82.   getVisible: function( aHost )
  83.   {
  84.     return true;
  85.   },
  86.  
  87.   getNumCommands: function( aSubMenu, aHost )
  88.   {
  89.     return this._getMenu(aSubMenu).ids.length;
  90.   },
  91.  
  92.   getCommandId: function( aSubMenu, aIndex, aHost )
  93.   {
  94.     return this._getMenu(aSubMenu).ids[ aIndex ] || "";
  95.   },
  96.  
  97.   getCommandType: function( aSubMenu, aIndex, aHost )
  98.   {
  99.     return this._getMenu(aSubMenu).types[ aIndex ] || "";
  100.   },
  101.  
  102.   getCommandText: function( aSubMenu, aIndex, aHost )
  103.   {
  104.     return this._getMenu(aSubMenu).names[ aIndex ] || "";
  105.   },
  106.  
  107.   getCommandFlex: function( aSubMenu, aIndex, aHost )
  108.   {
  109.     return ( this._getMenu(aSubMenu).types[ aIndex ] == "separator" ) ? 1 : 0;
  110.   },
  111.  
  112.   getCommandToolTipText: function( aSubMenu, aIndex, aHost )
  113.   {
  114.     return this._getMenu(aSubMenu).tooltips[ aIndex ] || "";
  115.   },
  116.  
  117.   getCommandValue: function( aSubMenu, aIndex, aHost )
  118.   {
  119.   },
  120.  
  121.   instantiateCustomCommand: function( aDocument, aId, aHost )
  122.   {
  123.     return null;
  124.   },
  125.  
  126.   refreshCustomCommand: function( aElement, aId, aHost )
  127.   {
  128.   },
  129.  
  130.   getCommandVisible: function( aSubMenu, aIndex, aHost )
  131.   {
  132.     return true;
  133.   },
  134.  
  135.   getCommandFlag: function( aSubmenu, aIndex, aHost )
  136.   {
  137.     return false;
  138.   },
  139.  
  140.   getCommandChoiceItem: function( aChoiceMenu, aHost )
  141.   {
  142.     return "";
  143.   },
  144.  
  145.   getCommandEnabled: function( aSubMenu, aIndex, aHost )
  146.   {
  147.     if (this.context.playlist.tree.currentIndex == -1) return false;
  148.     return this._getMenu(aSubMenu).enableds[ aIndex ];
  149.   },
  150.  
  151.   getCommandShortcutModifiers: function ( aSubMenu, aIndex, aHost )
  152.   {
  153.     return this._getMenu(aSubMenu).modifiers[ aIndex ] || "";
  154.   },
  155.  
  156.   getCommandShortcutKey: function ( aSubMenu, aIndex, aHost )
  157.   {
  158.     return this._getMenu(aSubMenu).keys[ aIndex ] || "";
  159.   },
  160.  
  161.   getCommandShortcutKeycode: function ( aSubMenu, aIndex, aHost )
  162.   {
  163.     return this._getMenu(aSubMenu).keycodes[ aIndex ] || "";
  164.   },
  165.  
  166.   getCommandShortcutLocal: function ( aSubMenu, aIndex, aHost )
  167.   {
  168.     return true;
  169.   },
  170.  
  171.   getCommandSubObject: function ( aSubMenu, aIndex, aHost )
  172.   {
  173.     return this._getMenu(aSubMenu).playlistCommands[ aIndex ] || null;
  174.   },
  175.  
  176.   onCommand: function( aSubMenu, aIndex, aHost, id, value )
  177.   {
  178.     this.addToLibrary.handleCommand(id, this.context);
  179.   },
  180.  
  181.   // The object registered with the sbIPlaylistCommandsManager interface acts
  182.   // as a template for instances bound to specific playlist elements
  183.  
  184.   dupObject: function (obj) {
  185.     var r = {};
  186.     for ( var i in obj )
  187.     {
  188.       r[ i ] = obj[ i ];
  189.     }
  190.     return r;
  191.   },
  192.  
  193.   duplicate: function()
  194.   {
  195.     var obj = this.dupObject(this);
  196.     obj.context = this.dupObject(this.context);
  197.     return obj;
  198.   },
  199.  
  200.   initCommands: function(aHost) {
  201.     this.addToLibrary = new addToLibraryHelper();
  202.     this.addToLibrary.init(this);
  203.   },
  204.  
  205.   shutdownCommands: function() {
  206.     if (!this.addToLibrary) {
  207.       dump("this.addToLibrary is null in SBPlaylistCommand_AddToLibrary ?!!\n");
  208.       return;
  209.     }
  210.  
  211.     this.addToLibrary.shutdown();
  212.     this.context = null;
  213.   },
  214.  
  215.   setContext: function( context )
  216.   {
  217.     var playlist = context.playlist;
  218.     var window = context.window;
  219.  
  220.     // Ah.  Sometimes, things are being secure.
  221.  
  222.     if ( playlist && playlist.wrappedJSObject )
  223.       playlist = playlist.wrappedJSObject;
  224.  
  225.     if ( window && window.wrappedJSObject )
  226.       window = window.wrappedJSObject;
  227.  
  228.     this.context.playlist = playlist;
  229.     this.context.window = window;
  230.   },
  231.  
  232.   QueryInterface : function(aIID)
  233.   {
  234.     if (!aIID.equals(Components.interfaces.sbIPlaylistCommands) &&
  235.         !aIID.equals(Components.interfaces.nsISupportsWeakReference) &&
  236.         !aIID.equals(Components.interfaces.nsISupports))
  237.     {
  238.       throw Components.results.NS_ERROR_NO_INTERFACE;
  239.     }
  240.  
  241.     return this;
  242.   }
  243. }; // SBPlaylistCommand_AddToLibrary declaration
  244.  
  245. function addToLibraryHelper() {}
  246. addToLibraryHelper.prototype = {
  247.   deviceManager: null,
  248.   libraryManager: null,
  249.  
  250.   init: function addToLibraryHelper_init(aCommands) {
  251.     this.libraryManager =
  252.       Cc["@songbirdnest.com/Songbird/library/Manager;1"]
  253.       .getService(Ci.sbILibraryManager);
  254.     this.deviceManager =
  255.       Cc["@songbirdnest.com/Songbird/DeviceManager;2"]
  256.       .getService(Ci.sbIDeviceManager2);
  257.   },
  258.  
  259.   shutdown: function addToLibraryHelper_shutdown() {
  260.     this.deviceManager = null;
  261.     this.libraryManager = null;
  262.   },
  263.  
  264.   // handle click on a device command item
  265.   handleCommand: function addToLibraryHelper_handleCommand(id, context) {
  266.     try {
  267.       if ( id == ADDTOLIBRARY_COMMAND_ID) {
  268.         var library = this.libraryManager.mainLibrary;
  269.         if (library) {
  270.           var oldLength = library.length;
  271.           var selection = context.playlist.mediaListView
  272.                                  .selection.selectedMediaItems;
  273.           // Create an enumerator that wraps the enumerator we were handed since
  274.           // the enumerator we get hands back sbIIndexedMediaItem, not just plain
  275.           // 'ol sbIMediaItems
  276.     
  277.           // Create a media item duplicate enumerator filter to count the number of
  278.           // duplicate items and to remove them from the enumerator if the target is
  279.           // a library.
  280.           let dupFilter = 
  281.             Cc[SB_MEDIALISTDUPLICATEFILTER_CONTRACTID]
  282.               .createInstance(Ci.sbIMediaListDuplicateFilter);
  283.           dupFilter.initialize(selection, 
  284.                                library, 
  285.                                true);
  286.               
  287.           // We also want to set the downloadStatusTarget property as we work.
  288.           var unwrapper = {
  289.             enumerator: dupFilter.QueryInterface(Ci.nsISimpleEnumerator),
  290.     
  291.             hasMoreElements : function() {
  292.               return this.enumerator.hasMoreElements();
  293.             },
  294.             getNext : function() {
  295.               var item = this.enumerator.getNext();
  296.               item.setProperty(SBProperties.downloadStatusTarget,
  297.                                item.library.guid + "," + item.guid);
  298.               return item;
  299.             },
  300.             QueryInterface : function(iid) {
  301.               if (iid.equals(Components.interfaces.nsISimpleEnumerator) ||
  302.                   iid.equals(Components.interfaces.nsISupports))
  303.                 return this;
  304.               throw Components.results.NS_NOINTERFACE;
  305.             }
  306.           }
  307.           library.addSome(unwrapper);
  308.         }
  309.         var added = library.length - oldLength;
  310.         DNDUtils.reportAddedTracks(
  311.                             dupFilter.mediaItemCount - dupFilter.duplicateCount,
  312.                             dupFilter.duplicateCount,
  313.                             0, 
  314.                             library.name);
  315.         return true;
  316.       }
  317.     } catch (e) {
  318.       Components.utils.reportError(e);
  319.     }
  320.     return false;
  321.   }
  322. };
  323.