home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / mozil06.zip / bin / chrome / messenger.jar / content / messenger / addressbook / abDragDrop.js < prev    next >
Text File  |  2001-02-14  |  7KB  |  232 lines

  1. /* -*- Mode: Java; tab-width: 8; 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. function debugDump(msg)
  24. {
  25.   // uncomment for noise
  26.    dump(msg+"\n");
  27. }
  28.  
  29. function GetDragService()
  30. {
  31.     var dragService = Components.classes["@mozilla.org/widget/dragservice;1"].getService();
  32.     if (dragService) 
  33.         dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
  34.  
  35.     return dragService;
  36. }
  37.  
  38. function GetRDFService()
  39. {
  40.     var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
  41.     if (rdf)   
  42.         rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
  43.  
  44.     return rdf;
  45. }
  46.  
  47. function DragOverTree(event)
  48. {
  49.     var validFlavor = false;
  50.     var dragSession = null;
  51.     var retVal = true;
  52.  
  53.     var dragService = GetDragService();
  54.     if ( !dragService )    return(false);
  55.  
  56.     dragSession = dragService.getCurrentSession();
  57.     if ( !dragSession )    return(false);
  58.  
  59.     if ( dragSession.isDataFlavorSupported("text/nsabcard") )    validFlavor = true;
  60.     //XXX other flavors here...
  61.  
  62.     // touch the attribute on the rowgroup to trigger the repaint with the drop feedback.
  63.     if ( validFlavor )
  64.     {
  65.         //XXX this is really slow and likes to refresh N times per second.
  66.         var treeItem = event.target.parentNode.parentNode;
  67.         treeItem.setAttribute ( "dd-triggerrepaint", 0 );
  68.         dragSession.canDrop = true;
  69.         // necessary??
  70.         retVal = false; // do not propagate message
  71.     }
  72.     return(retVal);
  73. }
  74.  
  75. function BeginDragResultTree(event)
  76. {
  77.     debugDump("BeginDragResultTree\n");
  78.  
  79.     //XXX we rely on a capturer to already have determined which item the mouse was over
  80.     //XXX and have set an attribute.
  81.     
  82.     // if the click is on the tree proper, ignore it. We only care about clicks on items.
  83.  
  84.     if (event.target.localName != "treecell" &&
  85.         event.target.localName != "treeitem")
  86.         return false;
  87.  
  88.     var tree = resultsTree;
  89.     if ( event.target == tree )
  90.         return(true);                    // continue propagating the event
  91.     
  92.     var childWithDatabase = tree;
  93.     if ( ! childWithDatabase )
  94.         return(false);
  95.  
  96.     var database = childWithDatabase.database;
  97.     var rdf = GetRDFService();
  98.     if ((!rdf) || (!database))    { debugDump("CAN'T GET DATABASE\n"); return(false); }
  99.                 
  100.     var dragStarted = false;
  101.  
  102.     var dragService = GetDragService();
  103.     if ( !dragService )    return(false);
  104.  
  105.     var transArray = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
  106.     if ( !transArray ) return(false); 
  107.  
  108.     var selArray = tree.selectedItems;
  109.     var count = selArray.length;
  110.     debugDump("selArray.length = " + count + "\n");
  111.     for ( var i = 0; i < count; ++i )
  112.     {
  113.         var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
  114.         if ( !trans )        return(false);
  115.  
  116.         var genTextData = Components.classes["@mozilla.org/supports-wstring;1"].createInstance(Components.interfaces.nsISupportsWString);
  117.         if (!genTextData)    return(false);
  118.  
  119.         trans.addDataFlavor("text/nsabcard");
  120.         
  121.         // get id (url) 
  122.         var id = selArray[i].getAttribute("id");
  123.         genTextData.data = id;
  124.         debugDump("    ID #" + i + " = " + id + "\n");
  125.  
  126.         trans.setTransferData ( "text/nsabcard", genTextData, id.length * 2 );  // doublebyte byte data
  127.  
  128.         // put it into the transferable as an |nsISupports|
  129.         var genTrans = trans.QueryInterface(Components.interfaces.nsISupports);
  130.         transArray.AppendElement(genTrans);
  131.     }
  132.  
  133.     var nsIDragService = Components.interfaces.nsIDragService;
  134.     dragService.invokeDragSession ( event.target, transArray, null, nsIDragService.DRAGDROP_ACTION_COPY + 
  135.         nsIDragService.DRAGDROP_ACTION_MOVE );
  136.     dragStarted = true;
  137.  
  138.     return(!dragStarted);  // don't propagate the event if a drag has begun
  139. }
  140.  
  141. function DropOnDirectoryTree(event)
  142. {
  143.     debugDump("DropOnTree\n");
  144.  
  145.     if (event.target.localName != "treecell" &&
  146.         event.target.localName != "treeitem")
  147.         return false;
  148.  
  149.     var RDF = GetRDFService();
  150.     if (!RDF) return(false);
  151.  
  152.     var treeRoot = dirTree;
  153.     if (!treeRoot)    return(false);
  154.     var treeDatabase = treeRoot.database;
  155.     if (!treeDatabase)    return(false);
  156.  
  157.     // target is the <treecell>, and "id" is on the <treeitem> two levels above
  158.     var treeItem = event.target.parentNode.parentNode;
  159.     if (!treeItem)    return(false);
  160.  
  161.     // drop action is always "on" not "before" or "after"
  162.     // get drop hint attributes
  163.     var dropBefore = treeItem.getAttribute("dd-droplocation");
  164.     var dropOn = treeItem.getAttribute("dd-dropon");
  165.  
  166.     var dropAction;
  167.     if (dropOn == "true") 
  168.         dropAction = "on";
  169.     else
  170.         return(false);
  171.  
  172.     var targetID = treeItem.getAttribute("id");
  173.     if (!targetID)    return(false);
  174.  
  175.     debugDump("***targetID = " + targetID + "\n");
  176.  
  177.     var dragService = GetDragService();
  178.     if ( !dragService )    return(false);
  179.     
  180.     var dragSession = dragService.getCurrentSession();
  181.     if ( !dragSession )    return(false);
  182.  
  183.     var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
  184.     if ( !trans ) return(false);
  185.     trans.addDataFlavor("text/nsabcard");
  186.  
  187.     for ( var i = 0; i < dragSession.numDropItems; ++i )
  188.     {
  189.         dragSession.getData ( trans, i );
  190.         dataObj = new Object();
  191.         bestFlavor = new Object();
  192.         len = new Object();
  193.         trans.getAnyTransferData ( bestFlavor, dataObj, len );
  194.         if ( dataObj )    dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsWString);
  195.         if ( !dataObj )    continue;
  196.  
  197.         // pull the URL out of the data object
  198.         var sourceID = dataObj.data.substring(0, len.value);
  199.         if (!sourceID)    continue;
  200.  
  201.         debugDump("    Node #" + i + ": drop '" + sourceID + "' " + dropAction + " '" + targetID + "'");
  202.         debugDump("\n");
  203.  
  204.         sourceNode = RDF.GetResource(sourceID, true);
  205.         if (!sourceNode)
  206.             continue;
  207.         
  208.         var targetNode = RDF.GetResource(targetID, true);
  209.         if (!targetNode) 
  210.             continue;
  211.  
  212.         // Prevent dropping of a node before, after, or on itself
  213.         if (sourceNode == targetNode)    continue;
  214.  
  215.         if (sourceID.substring(0,targetID.length) != targetID)
  216.         {
  217.             var cardResource = rdf.GetResource(sourceID);
  218.             var card = cardResource.QueryInterface(Components.interfaces.nsIAbCard);
  219.             if (card.isMailList == false)
  220.                 card.dropCardToDatabase(targetID);
  221.         }
  222.     }
  223.  
  224.     return(false);
  225. }
  226.  
  227. function DropOnResultTree(event)
  228. {
  229.     debugDump("DropOnResultTree\n");
  230.     return false;
  231. }
  232.