home *** CD-ROM | disk | FTP | other *** search
/ SVM Mac 58 / CD-ROM N°58.iso / navigateurs / Netscape Folder / chrome / navigator / content / default / navigatorDD.js < prev    next >
Encoding:
JavaScript  |  2000-04-19  |  14.9 KB  |  409 lines  |  [TEXT/MOSS]

  1. /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public
  4.  * License Version 1.1 (the "License"); you may not use this file
  5.  * except in compliance with the License. You may obtain a copy of
  6.  * the License at http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the License is distributed on an "AS
  9.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10.  * implied. See the License for the specific language governing
  11.  * rights and limitations under the License.
  12.  *
  13.  * The Original Code is mozilla.org code.
  14.  *
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation.  Portions created by Netscape are
  17.  * Copyright (C) 1998 Netscape Communications Corporation. All
  18.  * Rights Reserved.
  19.  *
  20.  * Contributor(s): 
  21.  */
  22.  
  23. //
  24. // Determine if d&d is on or not, off by default for beta but we want mozilla
  25. // folks to be able to turn it on if they so desire.
  26. //
  27. var gDragDropEnabled = false;
  28. var pref = null;
  29. try {
  30.   pref = Components.classes['component://netscape/preferences'];
  31.   pref = pref.getService();
  32.   pref = pref.QueryInterface(Components.interfaces.nsIPref);
  33. }
  34. catch (ex) {
  35.   dump("failed to get prefs service!\n");
  36.   pref = null;
  37. }
  38.  
  39. try {
  40.   gDragDropEnabled = pref.GetBoolPref("xpfe.dragdrop.enable");
  41. }
  42. catch (ex) {
  43.   dump("assuming d&d is off for Navigator\n");
  44. }  
  45.  
  46.  
  47. function GeneralDrag ( event )
  48. {
  49.   if ( !gDragDropEnabled )
  50.     return;
  51.  
  52.   dump("****** DRAG MADE IT TO TOPLEVEL WINDOW ********\n");
  53. }
  54.  
  55.   
  56. function BeginDragPersonalToolbar ( event )
  57. {
  58.   if ( !gDragDropEnabled )
  59.     return;
  60.  
  61.   //XXX we rely on a capturer to already have determined which item the mouse was over
  62.   //XXX and have set an attribute.
  63.   
  64.   // if the click is on the toolbar proper, ignore it. We only care about clicks on
  65.   // items.
  66.   var toolbar = document.getElementById("PersonalToolbar");
  67.   if ( event.target == toolbar )
  68.     return true;  // continue propagating the event
  69.   
  70.   // since the database is not on the toolbar, but on the innermost box, we need to 
  71.   // make sure we can find it before we go any further. If we can't find it, we're
  72.   // up the creek, but don't keep propagating the event.
  73.   var childWithDatabase = document.getElementById("innermostBox");
  74.   if ( ! childWithDatabase ) {
  75.     event.preventBubble();
  76.     return;
  77.   }
  78.  
  79.   // pinkerton
  80.   // right now, the issue of d&d and these popup menus is really wacky, so i'm punting
  81.   // until I have time to fix it and we can come up with a good UI gesture (bug 19588). In
  82.   // the meantime, if the target is a container, don't initiate the drag.
  83.   var container = event.target.getAttribute("container");
  84.   if ( container == "true" )
  85.     return;
  86.   
  87.   var dragStarted = false;
  88.   var dragService =
  89.     Components.classes["component://netscape/widget/dragservice"].getService(Components.interfaces.nsIDragService);
  90.   if ( dragService ) {
  91.     var trans = 
  92.       Components.classes["component://netscape/widget/transferable"].createInstance(Components.interfaces.nsITransferable);
  93.     if ( trans ) {
  94.       trans.addDataFlavor("moz/toolbaritem");
  95.       var genData = 
  96.         Components.classes["component://netscape/supports-wstring"].createInstance(Components.interfaces.nsISupportsWString);
  97.       trans.addDataFlavor("text/unicode");
  98.       var genTextData = 
  99.         Components.classes["component://netscape/supports-wstring"].createInstance(Components.interfaces.nsISupportsWString);      
  100.       if ( genData && genTextData ) {
  101.       
  102.               var id = event.target.getAttribute("id");
  103.               genData.data = id;
  104.               genTextData.data = id;
  105.                   
  106.               dump("ID: " + id + "\n");
  107.  
  108.               var database = childWithDatabase.database;
  109.               var rdf = 
  110.                 Components.classes["component://netscape/rdf/rdf-service"].getService(Components.interfaces.nsIRDFService);
  111.               if ((!rdf) || (!database))  return(false);
  112.  
  113.               // make sure its a bookmark, bookmark separator, or bookmark folder
  114.               var src = rdf.GetResource(id, true);
  115.               var prop = rdf.GetResource("http://www.w3.org/1999/02/22-rdf-syntax-ns#type", true);
  116.               var target = database.GetTarget(src, prop, true);
  117. /*
  118. pinkerton
  119. this doesn't work anymore (target is null), not sure why.
  120.   if (target) target = target.QueryInterface(Components.interfaces.nsIRDFResource);
  121.   if (target) target = target.Value;
  122.   if ((!target) || (target == "")) {dump("BAD\n"); return(false);}
  123.  
  124.   dump("Type: '" + target + "'\n");
  125.  
  126.   if ((target != "http://home.netscape.com/NC-rdf#BookmarkSeparator") &&
  127.      (target != "http://home.netscape.com/NC-rdf#Bookmark") &&
  128.      (target != "http://home.netscape.com/NC-rdf#Folder"))  return(false);
  129. */
  130.  
  131.           trans.setTransferData ( "moz/toolbaritem", genData, id.length*2 );  // double byte data (len*2)
  132.           trans.setTransferData ( "text/unicode", genTextData, id.length*2 );  // double byte data
  133.           var transArray = 
  134.             Components.classes["component://netscape/supports-array"].createInstance(Components.interfaces.nsISupportsArray);
  135.           if ( transArray ) {
  136.             // put it into the transferable as an |nsISupports|
  137.             var genTrans = trans.QueryInterface(Components.interfaces.nsISupports);
  138.             transArray.AppendElement(genTrans);
  139.             var nsIDragService = Components.interfaces.nsIDragService;
  140.             dragService.invokeDragSession ( transArray, null, nsIDragService.DRAGDROP_ACTION_COPY + 
  141.                                                 nsIDragService.DRAGDROP_ACTION_MOVE );
  142.             dragStarted = true;
  143.           }
  144.       } // if data object
  145.     } // if transferable
  146.   } // if drag service
  147.  
  148.   if ( dragStarted )               // don't propagate the event if a drag has begun
  149.     event.preventBubble();
  150.   
  151.   return true;
  152.   
  153. } // BeginDragPersonalToolbar
  154.  
  155.  
  156. function DropPersonalToolbar ( event )
  157.   if ( !gDragDropEnabled )
  158.     return;
  159.   
  160.   var dropAccepted = false;
  161.   
  162.   var dragService =
  163.     Components.classes["component://netscape/widget/dragservice"].getService(Components.interfaces.nsIDragService);
  164.   if ( dragService ) {
  165.     var dragSession = dragService.getCurrentSession();
  166.     if ( dragSession ) {
  167.       var trans =
  168.         Components.classes["component://netscape/widget/transferable"].createInstance(Components.interfaces.nsITransferable);
  169.       if ( trans ) {
  170.  
  171.         // get references to various services/resources once up-front
  172.         var personalToolbarRes = null;
  173.         
  174.         var rdf = 
  175.           Components.classes["component://netscape/rdf/rdf-service"].getService(Components.interfaces.nsIRDFService);
  176.         if (rdf)
  177.           personalToolbarRes = rdf.GetResource("NC:PersonalToolbarFolder");
  178.  
  179.         var rdfc = 
  180.           Components.classes["component://netscape/rdf/container"].getService(Components.interfaces.nsIRDFContainer);
  181.         if ( !rdfc ) return false;
  182.         
  183.         trans.addDataFlavor("moz/toolbaritem");
  184.         for ( var i = 0; i < dragSession.numDropItems; ++i ) {
  185.           dragSession.getData ( trans, i );
  186.           var dataObj = new Object();
  187.           var bestFlavor = new Object();
  188.           var len = new Object();
  189.           trans.getAnyTransferData ( bestFlavor, dataObj, len );
  190.           if ( dataObj ) dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsWString);
  191.           if ( dataObj ) {
  192.           
  193.             // remember len is in bytes, not chars
  194.             var id = dataObj.data.substring(0, len.value / 2);
  195.             dump("ID: '" + id + "'\n");
  196.             
  197.             var objectRes = rdf.GetResource(id, true);
  198.  
  199.             dragSession.canDrop = true;
  200.             dropAccepted = true;
  201.                 
  202.             var boxWithDatabase = document.getElementById("innermostBox");
  203.             var database = boxWithDatabase.database;
  204.             if (database && rdf && rdfc && personalToolbarRes && objectRes)
  205.             {
  206.               
  207.               rdfc.Init(database, personalToolbarRes);
  208.  
  209.               // Note: RDF Sequences are one-based, not zero-based
  210.  
  211.               // XXX figure out the REAL index to insert at;
  212.               // for the moment, insert it as the first element (pos=1)
  213.               var newIndex = 1;
  214.  
  215.               var currentIndex = rdfc.IndexOf(objectRes);
  216.               if (currentIndex > 0)
  217.               {
  218.                 dump("Element '" + id + "' was at position # " + currentIndex + "\n");
  219.                 rdfc.RemoveElement(objectRes, true);
  220.                 dump("Element '" + id + "' removed from position # " + currentIndex + "\n");
  221.               }
  222.               rdfc.InsertElementAt(objectRes, newIndex, true);
  223.               dump("Element '" + id + "' re-inserted at new position # " + newIndex + ".\n");
  224.             }
  225.  
  226.           } 
  227.             
  228.         } // foreach drag item
  229.     
  230.       } // if transferable
  231.     } // if dragsession
  232.   } // if dragservice
  233.   
  234.   if ( dropAccepted )               // don't propagate the event if we did the drop
  235.     event.preventBubble();
  236.  
  237. } // DropPersonalToolbar
  238.  
  239.  
  240. function DragOverPersonalToolbar ( event )
  241. {
  242.   if ( !gDragDropEnabled )
  243.     return;
  244.   
  245.   var validFlavor = false;
  246.   var dragSession = null;
  247.  
  248.   var dragService = 
  249.     Components.classes["component://netscape/widget/dragservice"].getService(Components.interfaces.nsIDragService);
  250.   if ( dragService ) {
  251.     dragSession = dragService.getCurrentSession();
  252.     if ( dragSession ) {
  253.       if ( dragSession.isDataFlavorSupported("moz/toolbaritem") )
  254.         validFlavor = true;
  255.       else if ( dragSession.isDataFlavorSupported("text/unicode") )
  256.         validFlavor = true;
  257.       //XXX other flavors here...
  258.  
  259.       // touch the attribute to trigger the repaint with the drop feedback.
  260.       if ( validFlavor ) {
  261.         //XXX this is really slow and likes to refresh N times per second.
  262.         var toolbar = document.getElementById("PersonalToolbar");
  263.         toolbar.setAttribute ( "dd-triggerrepaint", 0 );
  264.         dragSession.canDrop = true;
  265.         event.preventBubble();
  266.       }
  267.     }
  268.   }
  269.  
  270. } // DragOverPersonalToolbar
  271.  
  272.  
  273. //
  274. // DragOverContentArea
  275. //
  276. // An example of how to handle drag-over. Looks for any of a handful of flavors and
  277. // if it finds them it marks the dragSession that the drop is allowed.
  278. //
  279. function DragOverContentArea ( event )
  280. {
  281.   var validFlavor = false;
  282.   var dragSession = null;
  283.  
  284.   var dragService = 
  285.     Components.classes["component://netscape/widget/dragservice"].getService(Components.interfaces.nsIDragService);
  286.   if ( dragService ) {
  287.     dragSession = dragService.getCurrentSession();
  288.     if ( dragSession ) {
  289.       if ( dragSession.isDataFlavorSupported("moz/toolbaritem") )
  290.         validFlavor = true;
  291.       else if ( dragSession.isDataFlavorSupported("text/unicode") )
  292.         validFlavor = true;
  293.       //XXX other flavors here...such as files from the desktop?
  294.       
  295.       if ( validFlavor ) {
  296.         // XXX do some drag feedback here, set a style maybe???
  297.         
  298.         dragSession.canDrop = true;
  299.         event.preventBubble();
  300.       }
  301.     }
  302.   }
  303. } // DragOverContentArea
  304.  
  305.  
  306. //
  307. // DropOnContentArea
  308. //
  309. // An example of how to handle a drop. Basically looks for the text flavor, extracts it,
  310. // shoves it into the url bar, and loads the given URL. No checking is done to make sure
  311. // this is a url ;)
  312. //
  313. function DropOnContentArea ( event )
  314.   var dropAccepted = false;
  315.   
  316.   var dragService = 
  317.     Components.classes["component://netscape/widget/dragservice"].getService(Components.interfaces.nsIDragService);
  318.   if ( dragService ) {
  319.     var dragSession = dragService.getCurrentSession();
  320.     if ( dragSession ) {
  321.       var trans = 
  322.         Components.classes["component://netscape/widget/transferable"].createInstance(Components.interfaces.nsITransferable);
  323.       if ( trans ) {
  324.         trans.addDataFlavor("text/unicode");
  325.         for ( var i = 0; i < dragSession.numDropItems; ++i ) {
  326.           var id = "";
  327.           dragSession.getData ( trans, i );
  328.           var dataObj = new Object();
  329.           var bestFlavor = new Object();
  330.           var len = new Object();
  331.           trans.getAnyTransferData ( bestFlavor, dataObj, len );
  332.           if ( bestFlavor.value == "text/unicode" ) {
  333.             if ( dataObj ) dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsWString);
  334.             if ( dataObj ) {            
  335.               // pull the URL out of the data object, two byte data
  336.               var id = dataObj.data.substring(0, len.value / 2);
  337.               dump("ID: '" + id + "'\n");
  338.             }
  339.           }
  340.           
  341.           // stuff it into the url field and go, baby, go!
  342.           var urlBar = document.getElementById ( "urlbar" );
  343.           urlBar.value = id;
  344.           BrowserLoadURL();
  345.             
  346.           event.preventBubble();
  347.         } // foreach drag item
  348.       }
  349.     }
  350.   }
  351. } // DropOnContentArea
  352.  
  353.  
  354. //
  355. // DragProxyIcon
  356. //
  357. // Called when the user is starting a drag from the proxy icon next to the URL bar. Basically
  358. // just gets the url from the url bar and places the data (as plain text) in the drag service.
  359. //
  360. // This is by no means the final implementation, just another example of what you can do with
  361. // JS. Much still left to do here.
  362. // 
  363. function DragProxyIcon ( event )
  364. {
  365.   var dragStarted = false;
  366.   var dragService = 
  367.     Components.classes["component://netscape/widget/dragservice"].getService(Components.interfaces.nsIDragService);
  368.   if ( dragService ) {
  369.     var trans = 
  370.       Components.classes["component://netscape/widget/transferable"].createInstance(Components.interfaces.nsITransferable);
  371.     if ( trans ) {
  372.       trans.addDataFlavor("text/unicode");
  373.       var genTextData =
  374.         Components.classes["component://netscape/supports-wstring"].createInstance(Components.interfaces.nsISupportsWString);
  375.       if ( genTextData ) {
  376.       
  377.         // pull the url out of the url bar
  378.         var urlBar = document.getElementById ( "urlbar" );
  379.         if ( !urlBar )
  380.           return;            
  381.         var id = urlBar.value
  382.         genTextData.data = id;
  383.       
  384.         dump("ID: " + id + "\n");
  385.  
  386.         trans.setTransferData ( "text/unicode", genTextData, id.length * 2 );  // double byte data
  387.         var transArray = 
  388.           Components.classes["component://netscape/supports-array"].createInstance(Components.interfaces.nsISupportsArray);
  389.         if ( transArray ) {
  390.           // put it into the transferable as an |nsISupports|
  391.           var genTrans = trans.QueryInterface(Components.interfaces.nsISupports);
  392.           transArray.AppendElement(genTrans);
  393.           var nsIDragService = Components.interfaces.nsIDragService;
  394.           dragService.invokeDragSession ( transArray, null, nsIDragService.DRAGDROP_ACTION_COPY + 
  395.                                               nsIDragService.DRAGDROP_ACTION_MOVE );
  396.           dragStarted = true;
  397.         }
  398.       } // if data object
  399.     } // if transferable
  400.   } // if drag service
  401.  
  402.   if ( dragStarted )               // don't propagate the event if a drag has begun
  403.     event.preventBubble();
  404.   
  405. } // DragProxyIcon
  406.  
  407.