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

  1. /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  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. var ctrlKeydown = false;
  24.  
  25. function debugDump(msg)
  26. {
  27.   // uncomment for noise
  28.   // dump(msg+"\n");
  29. }
  30.  
  31. function GetDragService()
  32. {
  33.     var dragService = Components.classes["@mozilla.org/widget/dragservice;1"].getService();
  34.     if (dragService) 
  35.         dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
  36.  
  37.     return dragService;
  38. }
  39.  
  40. function GetRDFService()
  41. {
  42.     var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService();
  43.     if (rdf)   
  44.         rdf = rdf.QueryInterface(Components.interfaces.nsIRDFService);
  45.  
  46.     return rdf;
  47. }
  48.  
  49. function DragOverTree(event)
  50. {
  51.   if (event.target.localName != "treecell" &&
  52.        event.target.localName != "treeitem") {        
  53.     event.preventBubble();
  54.     return;
  55.   }
  56.  
  57.     var validFlavor = false;
  58.     var dragSession = null;
  59.  
  60.     var dragService = GetDragService();
  61.     if ( !dragService )    return(false);
  62.  
  63.     dragSession = dragService.getCurrentSession();
  64.     if ( !dragSession )    return(false);
  65.  
  66.     if ( dragSession.isDataFlavorSupported("text/nsmessage") )    validFlavor = true;
  67.     //XXX other flavors here...
  68.  
  69.     // touch the attribute on the treeItem to trigger the repaint with the drop feedback
  70.     // (recall that it is two levels above the target, which is a treeCell).
  71.     if ( validFlavor )
  72.     {
  73.         //XXX this is really slow and likes to refresh N times per second.
  74.         event.target.parentNode.parentNode.setAttribute ( "dd-triggerrepaint", 0 );
  75.         dragSession.canDrop = true;
  76.         event.preventBubble();  // do not propagate message
  77.     }
  78.  
  79. }
  80.  
  81. function BeginDragFolderTree(event)
  82. {
  83.     debugDump("BeginDragFolderTree\n");
  84.     if (event.target.localName != "treecell" &&
  85.         event.target.localName != "treeitem")
  86.         return false;
  87.     return(false);
  88. }
  89.  
  90. function BeginDragThreadTree(event)
  91. {
  92.     debugDump("BeginDragThreadTree\n");
  93.     if (event.target.localName != "treecell" &&
  94.         event.target.localName != "treeitem")
  95.         return false;
  96.  
  97.     //XXX we rely on a capturer to already have determined which item the mouse was over
  98.     //XXX and have set an attribute.
  99.     
  100.     // if the click is on the tree proper, ignore it. We only care about clicks on items.
  101.  
  102.     var tree = GetThreadTree();
  103.     if ( event.target == tree )
  104.         return(true);                    // continue propagating the event
  105.     
  106.     var childWithDatabase = tree;
  107.     if ( ! childWithDatabase )
  108.         return(false);
  109.  
  110.     var database = childWithDatabase.database;
  111.     var rdf = GetRDFService();
  112.     if ((!rdf) || (!database))    { debugDump("CAN'T GET DATABASE\n"); return(false); }
  113.     
  114.     if (event.ctrlKey)
  115.         ctrlKeydown = true;
  116.     else
  117.         ctrlKeydown = false;
  118.                     
  119.     var dragStarted = false;
  120.  
  121.     var dragService = GetDragService();
  122.     if ( !dragService )    return(false);
  123.  
  124.     var transArray = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
  125.     if ( !transArray ) return(false); 
  126.  
  127.     var selArray = tree.selectedItems;
  128.     var count = selArray.length;
  129.     debugDump("selArray.length = " + count + "\n");
  130.     for ( var i = 0; i < count; ++i )
  131.     {
  132.         var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
  133.         if ( !trans )        return(false);
  134.  
  135.         var genTextData = Components.classes["@mozilla.org/supports-wstring;1"].createInstance(Components.interfaces.nsISupportsWString);
  136.         if (!genTextData)    return(false);
  137.  
  138.         trans.addDataFlavor("text/nsmessage");
  139.         
  140.         // get id (url) 
  141.         var id = selArray[i].getAttribute("id");
  142.         genTextData.data = id;
  143.         debugDump("    ID #" + i + " = " + id + "\n");
  144.  
  145.         trans.setTransferData ( "text/nsmessage", genTextData, id.length * 2 );  // doublebyte byte data
  146.  
  147.         // put it into the transferable as an |nsISupports|
  148.         var genTrans = trans.QueryInterface(Components.interfaces.nsISupports);
  149.         transArray.AppendElement(genTrans);
  150.     }
  151.  
  152.     var nsIDragService = Components.interfaces.nsIDragService;
  153.     dragService.invokeDragSession ( event.target, transArray, null, nsIDragService.DRAGDROP_ACTION_COPY + 
  154.         nsIDragService.DRAGDROP_ACTION_MOVE );
  155.     dragStarted = true;
  156.  
  157.     return(!dragStarted);  // don't propagate the event if a drag has begun
  158. }
  159.  
  160. function DropOnFolderTree(event)
  161. {
  162.     debugDump("DropOnTree\n");
  163.     var RDF = GetRDFService();
  164.     if (!RDF) return(false);
  165.  
  166.     var treeRoot = GetFolderTree();
  167.     if (!treeRoot)    return(false);
  168.     var treeDatabase = treeRoot.database;
  169.     if (!treeDatabase)    return(false);
  170.  
  171.     // target is the <treecell>, and "id" is on the <treeitem> two levels above
  172.     var treeItem = event.target.parentNode.parentNode;
  173.     if (!treeItem)    return(false);
  174.  
  175.     if (event.ctrlKey)
  176.         ctrlKeydown = true;
  177.     else
  178.         ctrlKeydown = false;
  179.     // drop action is always "on" not "before" or "after"
  180.     // get drop hint attributes
  181.     var dropBefore = treeItem.getAttribute("dd-droplocation");
  182.     var dropOn = treeItem.getAttribute("dd-dropon");
  183.  
  184.     var dropAction;
  185.     if (dropOn == "true") 
  186.         dropAction = "on";
  187.     else
  188.         return(false);
  189.  
  190.     var targetID = treeItem.getAttribute("id");
  191.     if (!targetID)    return(false);
  192.  
  193.     debugDump("***targetID = " + targetID + "\n");
  194.  
  195.     //make sure target is a folder
  196.     var isServer = treeItem.getAttribute("IsServer");
  197.     if (isServer == "true")
  198.     {
  199.         debugDump("***isServer == true\n");
  200.         return(false);
  201.     }
  202.     var canFileMessages = treeItem.getAttribute("CanFileMessages");
  203.     if (canFileMessages != "true")
  204.     {
  205.         debugDump("***canFileMessages == false\n");
  206.         return(false);
  207.     }
  208.  
  209.     var dragService = GetDragService();
  210.     if ( !dragService )    return(false);
  211.     
  212.     var dragSession = dragService.getCurrentSession();
  213.     if ( !dragSession )    return(false);
  214.  
  215.     var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
  216.     if ( !trans ) return(false);
  217.     trans.addDataFlavor("text/nsmessage");
  218.  
  219.     var isNews = false;
  220.     var messageList = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
  221.  
  222.     for ( var i = 0; i < dragSession.numDropItems; ++i )
  223.     {
  224.         dragSession.getData ( trans, i );
  225.         dataObj = new Object();
  226.         bestFlavor = new Object();
  227.         len = new Object();
  228.         trans.getAnyTransferData ( bestFlavor, dataObj, len );
  229.         if ( dataObj )    dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsWString);
  230.         if ( !dataObj )    continue;
  231.  
  232.         // pull the URL out of the data object
  233.         var sourceID = dataObj.data.substring(0, len.value);
  234.         if (!sourceID)    continue;
  235.  
  236.         debugDump("    Node #" + i + ": drop '" + sourceID + "' " + dropAction + " '" + targetID + "'");
  237.         debugDump("\n");
  238.  
  239.         sourceNode = RDF.GetResource(sourceID, true);
  240.         if (!sourceNode)
  241.             continue;
  242.         
  243.         // Prevent dropping of a node before, after, or on itself
  244.         if (sourceNode == targetNode)    continue;
  245.  
  246.         messageList.AppendElement(sourceNode);
  247.     }
  248.  
  249.     if (sourceID.substring(0,6) == "news:/")
  250.         isNews = true;
  251.  
  252.     var targetNode = RDF.GetResource(targetID, true);
  253.     if (!targetNode)    return(false);
  254.       var targetfolder = targetNode.QueryInterface(Components.interfaces.nsIMsgFolder);
  255.     var targetServer = targetfolder.server;
  256.  
  257.     var message = sourceNode.QueryInterface(Components.interfaces.nsIMessage);
  258.     var folder = message.msgFolder;
  259.     var sourceRescource = folder.QueryInterface(Components.interfaces.nsIRDFResource);
  260.       var sourcefolder = sourceRescource.QueryInterface(Components.interfaces.nsIMsgFolder);
  261.     var sourceServer = sourcefolder.server;
  262.  
  263.     if (targetServer == sourceServer)
  264.     {
  265.         if (isNews)
  266.         {
  267.             try
  268.             {
  269.             messenger.CopyMessages(treeDatabase,
  270.                                    sourceRescource,
  271.                                    targetNode, messageList, false);
  272.             }
  273.             catch(e)
  274.             {
  275.             dump ( "Exception : CopyMessages \n");
  276.             }
  277.         }
  278.         else
  279.         {
  280.             //temperary for single mail window, not working when supporting multiple mail windows
  281.             if (!ctrlKeydown)
  282.             {
  283.                 messageTree = GetThreadTree();
  284.                 var nextMessage = GetNextMessageAfterDelete(messageTree.selectedItems);
  285.                 if(nextMessage)
  286.                     gNextMessageAfterDelete = nextMessage.getAttribute('id');
  287.                 else
  288.                     gNextMessageAfterDelete = null;
  289.             }
  290.                         try {
  291.             messenger.CopyMessages(treeDatabase,
  292.                                        sourceRescource,
  293.                                        targetNode, messageList, !ctrlKeydown);
  294.                            }
  295.                            catch(e)
  296.                            {
  297.                               gNextMessageAfterDelete = null;
  298.                               dump ( "Exception : CopyMessages \n");
  299.                            }
  300.         }
  301.     }
  302.     else
  303.     {
  304.         if (!ctrlKeydown)
  305.         {
  306.             messageTree = GetThreadTree();
  307.             var nextMessage = GetNextMessageAfterDelete(messageTree.selectedItems);
  308.             if(nextMessage)
  309.                 gNextMessageAfterDelete = nextMessage.getAttribute('id');
  310.             else
  311.                 gNextMessageAfterDelete = null;
  312.         }
  313.                 try {
  314.         messenger.CopyMessages(treeDatabase,
  315.                                sourceRescource,
  316.                                targetNode, messageList, !ctrlKeydown);
  317.                 }
  318.                  catch(e)
  319.                  { 
  320.                    gNextMessageAfterDelete = null;
  321.                    dump ( "Exception : CopyMessages \n");
  322.                  }
  323.     }
  324.  
  325.     return(false);
  326. }
  327.  
  328. function DropOnThreadTree(event)
  329. {
  330.     debugDump("DropOnThreadTree\n");
  331.     if (event.target.localName != "treecell" &&
  332.         event.target.localName != "treeitem")
  333.         return false;
  334.     
  335.     return false;
  336. }
  337.  
  338.