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

  1. /* -*- Mode: Java; tab-width: 4; 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.  * Original Author:
  21.  *   Ben Matthew Goodger <ben@netscape.com>
  22.  *
  23.  * Contributor(s): 
  24.  */
  25.  
  26. /**
  27.  * XXX - until load is supported in chrome, you also need to include 
  28.  *       these files:
  29.  *       chrome://global/content/nsJSSupportsUtils.js
  30.  *       chrome://global/content/nsJSComponentManager.js
  31.  *       chrome://global/content/nsTransferable.js
  32.  **/
  33.  
  34.  
  35.  
  36. /**
  37.  * nsDragAndDrop - a convenience wrapper for nsTransferable, nsITransferable
  38.  *                 and nsIDragService/nsIDragSession. 
  39.  *
  40.  * Use: map the handler functions to the 'ondraggesture', 'ondragover' and 
  41.  *      'ondragdrop' event handlers on your XML element, e.g.
  42.  *      <xmlelement ondraggesture="nsDragAndDrop.startDrag(event, observer);"
  43.  *                  ondragover="nsDragAndDrop.startDrag(event, observer);"
  44.  *                  ondragdrop="nsDragAndDrop.drop(event, observer);"/>
  45.  *
  46.  *      You need to create an observer js object with the following member
  47.  *      functions:
  48.  *        Object onDragStart (event)        // called when drag initiated, 
  49.  *                                          // returns flavour list with data
  50.  *                                          // to stuff into transferable
  51.  *        void onDragOver (Object flavour)  // called when element is dragged
  52.  *                                          // over, so that it can perform
  53.  *                                          // any drag-over feedback for provided
  54.  *                                          // flavour
  55.  *        void onDrop (Object data)         // formatted data object dropped.
  56.  *        Object getSupportedFlavours ()    // returns a flavour list so that
  57.  *                                          // nsTransferable can determine whether
  58.  *                                          // or not to accept drop.
  59.  **/ 
  60.  
  61. var nsDragAndDrop = {
  62.  
  63.   get mDragService()
  64.     {
  65.       return nsJSComponentManager.getService("@mozilla.org/widget/dragservice;1",
  66.                                              "nsIDragService");
  67.     },
  68.  
  69.   /**
  70.    * void startDrag (DOMEvent aEvent, Object aDragDropObserver) ;
  71.    *
  72.    * called when a drag on an element is started.
  73.    *
  74.    * @param DOMEvent aEvent
  75.    *        the DOM event fired by the drag init
  76.    * @param Object aDragDropObserver
  77.    *        javascript object of format described above that specifies
  78.    *        the way in which the element responds to drag events.
  79.    **/  
  80.   startDrag: function (aEvent, aDragDropObserver)
  81.     {
  82.       var flavourList = null;
  83.  
  84.       if (aDragDropObserver.onDragStart)
  85.         {
  86.           try 
  87.             {
  88.               flavourList = aDragDropObserver.onDragStart(aEvent);
  89.             }
  90.           catch (e)
  91.             {
  92.               return; // not a draggable item, bail!
  93.             }
  94.         }
  95.  
  96.       if (! flavourList || flavourList.length < 1)
  97.         return;
  98.  
  99.       var trans = nsTransferable.set(flavourList);
  100.       trans = trans ? trans.QueryInterface(Components.interfaces.nsISupports) : trans;
  101.       var transArray = nsJSSupportsUtils.createSupportsArray();
  102.       transArray.AppendElement(trans);
  103.       
  104.       var dragServiceIID = Components.interfaces.nsIDragService;
  105.       this.mDragService.invokeDragSession(aEvent.target, transArray, null, 
  106.                                           dragServiceIID.DRAGDROP_ACTION_COPY + dragServiceIID.DRAGDROP_ACTION_MOVE + dragServiceIID.DRAGDROP_ACTION_LINK);
  107.       aEvent.preventBubble();
  108.     },
  109.  
  110.   /** 
  111.    * void dragOver (DOMEvent aEvent, Object aDragDropObserver) ;
  112.    *
  113.    * called when a drag passes over this element
  114.    *
  115.    * @param DOMEvent aEvent
  116.    *        the DOM event fired by the drag init
  117.    * @param Object aDragDropObserver
  118.    *        javascript object of format described above that specifies
  119.    *        the way in which the element responds to drag events.
  120.    **/
  121.   dragOver: function (aEvent, aDragDropObserver)
  122.     { 
  123.       if (!this.mDragSession) 
  124.         this.mDragSession = this.mDragService.getCurrentSession();
  125.       if (this.mDragSession)
  126.         {
  127.           var flavourList = aDragDropObserver.getSupportedFlavours();
  128.           for (var flavour in flavourList)
  129.             {
  130.               if (this.mDragSession.isDataFlavorSupported(flavour))
  131.                 {
  132.                   this.mDragSession.canDrop = true;
  133.                   if (aDragDropObserver.onDragOver)
  134.                     aDragDropObserver.onDragOver(aEvent, flavour, this.mDragSession);
  135.                   aEvent.preventBubble();
  136.                   break;
  137.                 }
  138.             }
  139.         }
  140.     },
  141.  
  142.   mDragSession: null,
  143.  
  144.   /** 
  145.    * void drop (DOMEvent aEvent, Object aDragDropObserver) ;
  146.    *
  147.    * called when the user drops on the element
  148.    *
  149.    * @param DOMEvent aEvent
  150.    *        the DOM event fired by the drag init
  151.    * @param Object aDragDropObserver
  152.    *        javascript object of format described above that specifies
  153.    *        the way in which the element responds to drag events.
  154.    **/
  155.   drop: function (aEvent, aDragDropObserver)
  156.     {
  157.       if (!this.mDragSession) 
  158.         this.mDragSession = this.mDragService.getCurrentSession();
  159.       if (this.mDragSession)
  160.         {
  161.           var flavourList = aDragDropObserver.getSupportedFlavours();
  162.           var dragData = nsTransferable.get(flavourList, this.getDragData, true);
  163.           aEvent.preventBubble();
  164.           // hand over to the client to respond to dropped data
  165.           if (aDragDropObserver.onDrop) 
  166.             aDragDropObserver.onDrop(aEvent, dragData, this.mDragSession);
  167.         }
  168.     },
  169.  
  170.   dragExit: function (aEvent, aDragDropObserver)
  171.     {
  172.       if (aDragDropObserver.onDragExit)
  173.         aDragDropObserver.onDragExit(aEvent, this.mDragSession);
  174.     },  
  175.     
  176.   /** 
  177.    * nsISupportsArray getDragData (Object aFlavourList)
  178.    *
  179.    * Creates a nsISupportsArray of all droppable items for the given
  180.    * set of supported flavours.
  181.    * 
  182.    * @param Object aFlavourList
  183.    *        formatted flavour list.
  184.    **/  
  185.   getDragData: function (aFlavourList)
  186.     {
  187.       var supportsArray = nsJSSupportsUtils.createSupportsArray();
  188.       for (var i = 0; i < nsDragAndDrop.mDragSession.numDropItems; ++i)
  189.         {
  190.           var trans = nsTransferable.createTransferable();
  191.           for (var flavour in aFlavourList)
  192.             trans.addDataFlavor(flavour);
  193.           nsDragAndDrop.mDragSession.getData(trans, i);
  194.           supportsArray.AppendElement(trans);
  195.         }
  196.       return supportsArray;
  197.     }
  198.  
  199. };
  200.  
  201.