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