Source for java.awt.dnd.DragSourceContext

   1: /* DragSourceContext.java --
   2:    Copyright (C) 2002 Free Software Foundation
   3: 
   4: This file is part of GNU Classpath.
   5: 
   6: GNU Classpath is free software; you can redistribute it and/or modify
   7: it under the terms of the GNU General Public License as published by
   8: the Free Software Foundation; either version 2, or (at your option)
   9: any later version.
  10: 
  11: GNU Classpath is distributed in the hope that it will be useful, but
  12: WITHOUT ANY WARRANTY; without even the implied warranty of
  13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14: General Public License for more details.
  15: 
  16: You should have received a copy of the GNU General Public License
  17: along with GNU Classpath; see the file COPYING.  If not, write to the
  18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  19: 02110-1301 USA.
  20: 
  21: Linking this library statically or dynamically with other modules is
  22: making a combined work based on this library.  Thus, the terms and
  23: conditions of the GNU General Public License cover the whole
  24: combination.
  25: 
  26: As a special exception, the copyright holders of this library give you
  27: permission to link this library with independent modules to produce an
  28: executable, regardless of the license terms of these independent
  29: modules, and to copy and distribute the resulting executable under
  30: terms of your choice, provided that you also meet, for each linked
  31: independent module, the terms and conditions of the license of that
  32: module.  An independent module is a module which is not derived from
  33: or based on this library.  If you modify this library, you may extend
  34: this exception to your version of the library, but you are not
  35: obligated to do so.  If you do not wish to do so, delete this
  36: exception statement from your version. */
  37: 
  38: 
  39: package java.awt.dnd;
  40: 
  41: import java.awt.Component;
  42: import java.awt.Cursor;
  43: import java.awt.Image;
  44: import java.awt.Point;
  45: import java.awt.datatransfer.Transferable;
  46: import java.awt.dnd.peer.DragSourceContextPeer;
  47: import java.io.Serializable;
  48: import java.util.TooManyListenersException;
  49: 
  50: /**
  51:  * @since 1.2
  52:  */
  53: public class DragSourceContext
  54:   implements DragSourceListener, DragSourceMotionListener, Serializable
  55: {
  56:   /**
  57:    * Compatible with JDK 1.2+
  58:    */
  59:   static final long serialVersionUID = -115407898692194719L;
  60: 
  61:   protected static final int DEFAULT = 0;
  62:   protected static final int ENTER = 1;
  63:   protected static final int OVER = 2;
  64:   protected static final int CHANGED = 3;
  65: 
  66:   private DragSourceContextPeer peer;
  67:   private Cursor cursor;
  68:   private Transferable transferable;
  69:   private DragGestureEvent trigger;
  70:   private DragSourceListener dragSourceListener;
  71:   private boolean useCustomCursor;
  72:   private int sourceActions;
  73:   private Image image;
  74:   private Point offset;
  75: 
  76:   /**
  77:    * Initializes a drag source context.
  78:    *
  79:    * @exception IllegalArgumentException If Component or DragSource of trigger
  80:    * are null, the drag action for the trigger event is DnDConstants.ACTION_NONE
  81:    * or if the source actions for the DragGestureRecognizer associated with the
  82:    * trigger event are equal to DnDConstants.ACTION_NONE.
  83:    * @exception NullPointerException If peer, trans or trigger is null or if the
  84:    * image is not null but the offset is.
  85:    */
  86:   public DragSourceContext (DragSourceContextPeer peer,
  87:                             DragGestureEvent trigger, Cursor cursor,
  88:                             Image image, Point offset, Transferable trans,
  89:                             DragSourceListener dsl)
  90:   {
  91:     if (peer == null
  92:         || trigger == null || trans == null
  93:         || (image != null && offset == null))
  94:       throw new NullPointerException ();
  95: 
  96:     if (trigger.getComponent () == null
  97:         || trigger.getDragSource () == null
  98:         || trigger.getDragAction () == DnDConstants.ACTION_NONE
  99:         || trigger.getSourceAsDragGestureRecognizer ()
 100:               .getSourceActions () == DnDConstants.ACTION_NONE)
 101:       throw new IllegalArgumentException ();
 102: 
 103:     this.peer = peer;
 104:     this.trigger = trigger;
 105:     this.cursor = cursor;
 106:     this.image = image;
 107:     this.offset = offset;
 108:     this.transferable = trans;
 109:     this.dragSourceListener = dsl;
 110:     this.sourceActions = trigger.getSourceAsDragGestureRecognizer().getSourceActions();
 111: 
 112:     setCursor(cursor);
 113:     updateCurrentCursor(trigger.getDragAction(), sourceActions, DEFAULT);
 114:   }
 115: 
 116:   /**
 117:    * Returns the DragSource object associated with the
 118:    * DragGestureEvent.
 119:    *
 120:    * @return the DragSource associated with the trigger.
 121:    */
 122:   public DragSource getDragSource()
 123:   {
 124:     return trigger.getDragSource ();
 125:   }
 126: 
 127:   /**
 128:    * Returns the component associated with this.
 129:    *
 130:    * @return the component associated with the trigger.
 131:    */
 132:   public Component getComponent()
 133:   {
 134:     return trigger.getComponent ();
 135:   }
 136: 
 137:   /**
 138:    * Gets the trigger associated with this.
 139:    *
 140:    * @return the trigger.
 141:    */
 142:   public DragGestureEvent getTrigger()
 143:   {
 144:     return trigger;
 145:   }
 146: 
 147:   /**
 148:    * Returns the source actions for the DragGestureRecognizer.
 149:    *
 150:    * @return the source actions for DragGestureRecognizer.
 151:    */
 152:   public int getSourceActions()
 153:   {
 154:     if (sourceActions == 0)
 155:       sourceActions = trigger.getSourceAsDragGestureRecognizer().getSourceActions();
 156:     return sourceActions;
 157:   }
 158: 
 159:   /**
 160:    * Sets the cursor for this drag operation to the specified cursor.
 161:    *
 162:    * @param cursor c - the Cursor to use, or null to use the default drag
 163:    *          cursor.
 164:    */
 165:   public void setCursor(Cursor cursor)
 166:   {
 167:     if (cursor == null)
 168:       useCustomCursor = false;
 169:     else
 170:       useCustomCursor = true;
 171:     this.cursor = cursor;
 172:     peer.setCursor(cursor);
 173:   }
 174: 
 175:   /**
 176:    * Returns the current cursor or null if the default
 177:    * drag cursor is used.
 178:    *
 179:    * @return the current cursor or null.
 180:    */
 181:   public Cursor getCursor()
 182:   {
 183:     return cursor;
 184:   }
 185: 
 186:   /**
 187:    * Adds a <code>DragSourceListener</code>.
 188:    *
 189:    * @exception TooManyListenersException If a <code>DragSourceListener</code>
 190:    * has already been added.
 191:    */
 192:   public void addDragSourceListener (DragSourceListener dsl)
 193:     throws TooManyListenersException
 194:   {
 195:     if (dragSourceListener != null)
 196:       throw new TooManyListenersException ();
 197: 
 198:     dragSourceListener = dsl;
 199:   }
 200: 
 201:   public void removeDragSourceListener (DragSourceListener dsl)
 202:   {
 203:     if (dragSourceListener == dsl)
 204:       dragSourceListener = null;
 205:   }
 206: 
 207:   /**
 208:    * This function tells the peer that the DataFlavors have been modified.
 209:    */
 210:   public void transferablesFlavorsChanged()
 211:   {
 212:     peer.transferablesFlavorsChanged();
 213:   }
 214: 
 215:   /**
 216:    * Calls dragEnter on the listeners registered with this
 217:    * and with the DragSource.
 218:    *
 219:    * @param e - the DragSourceDragEvent
 220:    */
 221:   public void dragEnter(DragSourceDragEvent e)
 222:   {
 223:     if (dragSourceListener != null)
 224:       dragSourceListener.dragEnter(e);
 225: 
 226:     DragSource ds = getDragSource();
 227:     DragSourceListener[] dsl = ds.getDragSourceListeners();
 228:     for (int i = 0; i < dsl.length; i++)
 229:       dsl[i].dragEnter(e);
 230: 
 231:     updateCurrentCursor(e.getDropAction(), e.getTargetActions(), ENTER);
 232:   }
 233: 
 234:   /**
 235:    * Calls dragOver on the listeners registered with this
 236:    * and with the DragSource.
 237:    *
 238:    * @param e - the DragSourceDragEvent
 239:    */
 240:   public void dragOver(DragSourceDragEvent e)
 241:   {
 242:     if (dragSourceListener != null)
 243:       dragSourceListener.dragOver(e);
 244: 
 245:     DragSource ds = getDragSource();
 246:     DragSourceListener[] dsl = ds.getDragSourceListeners();
 247:     for (int i = 0; i < dsl.length; i++)
 248:       dsl[i].dragOver(e);
 249: 
 250:     updateCurrentCursor(e.getDropAction(), e.getTargetActions(), OVER);
 251:   }
 252: 
 253:   /**
 254:    * Calls dragExit on the listeners registered with this
 255:    * and with the DragSource.
 256:    *
 257:    * @param e - the DragSourceEvent
 258:    */
 259:   public void dragExit(DragSourceEvent e)
 260:   {
 261:     if (dragSourceListener != null)
 262:       dragSourceListener.dragExit(e);
 263: 
 264:     DragSource ds = getDragSource();
 265:     DragSourceListener[] dsl = ds.getDragSourceListeners();
 266:     for (int i = 0; i < dsl.length; i++)
 267:       dsl[i].dragExit(e);
 268: 
 269:     updateCurrentCursor(DnDConstants.ACTION_NONE, DnDConstants.ACTION_NONE,
 270:                         DEFAULT);
 271:   }
 272: 
 273:   /**
 274:    * Calls dropActionChanged on the listeners registered with this
 275:    * and with the DragSource.
 276:    *
 277:    * @param e - the DragSourceDragEvent
 278:    */
 279:   public void dropActionChanged(DragSourceDragEvent e)
 280:   {
 281:     if (dragSourceListener != null)
 282:       dragSourceListener.dropActionChanged(e);
 283: 
 284:     DragSource ds = getDragSource();
 285:     DragSourceListener[] dsl = ds.getDragSourceListeners();
 286:     for (int i = 0; i < dsl.length; i++)
 287:       dsl[i].dropActionChanged(e);
 288: 
 289:     updateCurrentCursor(e.getDropAction(), e.getTargetActions(), CHANGED);
 290:   }
 291: 
 292:   /**
 293:    * Calls dragDropEnd on the listeners registered with this
 294:    * and with the DragSource.
 295:    *
 296:    * @param e - the DragSourceDropEvent
 297:    */
 298:   public void dragDropEnd(DragSourceDropEvent e)
 299:   {
 300:     if (dragSourceListener != null)
 301:       dragSourceListener.dragDropEnd(e);
 302: 
 303:     DragSource ds = getDragSource();
 304:     DragSourceListener[] dsl = ds.getDragSourceListeners();
 305:     for (int i = 0; i < dsl.length; i++)
 306:       dsl[i].dragDropEnd(e);
 307:   }
 308: 
 309:   /**
 310:    * Calls dragMouseMoved on the listeners registered with the DragSource.
 311:    *
 312:    * @param e - the DragSourceDragEvent
 313:    */
 314:   public void dragMouseMoved(DragSourceDragEvent e)
 315:   {
 316:     DragSource ds = getDragSource();
 317:     DragSourceMotionListener[] dsml = ds.getDragSourceMotionListeners();
 318:     for (int i = 0; i < dsml.length; i++)
 319:       dsml[i].dragMouseMoved(e);
 320:   }
 321: 
 322:   /**
 323:    * Returns the Transferable set with this object.
 324:    *
 325:    * @return the transferable.
 326:    */
 327:   public Transferable getTransferable()
 328:   {
 329:     return transferable;
 330:   }
 331: 
 332:   /**
 333:    * This function sets the drag cursor for the specified operation, actions and
 334:    * status if the default drag cursor is active. Otherwise, the cursor is not
 335:    * updated in any way.
 336:    *
 337:    * @param dropOp - the current operation.
 338:    * @param targetAct - the supported actions.
 339:    * @param status - the status of the cursor (constant).
 340:    */
 341:   protected void updateCurrentCursor(int dropOp, int targetAct, int status)
 342:   {
 343:     if (! useCustomCursor)
 344:       {
 345:         Cursor newCursor = null;
 346:         switch (status)
 347:           {
 348:           default:
 349:             targetAct = DnDConstants.ACTION_NONE;
 350:           case ENTER:
 351:           case CHANGED:
 352:           case OVER:
 353:             int action = dropOp & targetAct;
 354:             if (action == DnDConstants.ACTION_NONE)
 355:               {
 356:                 if ((dropOp & DnDConstants.ACTION_LINK) != 0)
 357:                   newCursor = DragSource.DefaultLinkNoDrop;
 358:                 else if ((dropOp & DnDConstants.ACTION_MOVE) != 0)
 359:                   newCursor = DragSource.DefaultMoveNoDrop;
 360:                 else
 361:                   newCursor = DragSource.DefaultCopyNoDrop;
 362:               }
 363:             else
 364:               {
 365:                 if ((dropOp & DnDConstants.ACTION_LINK) != 0)
 366:                   newCursor = DragSource.DefaultLinkDrop;
 367:                 else if ((dropOp & DnDConstants.ACTION_MOVE) != 0)
 368:                   newCursor = DragSource.DefaultMoveDrop;
 369:                 else
 370:                   newCursor = DragSource.DefaultCopyDrop;
 371:               }
 372:           }
 373: 
 374:         if (cursor == null || ! cursor.equals(newCursor))
 375:           {
 376:             cursor = newCursor;
 377:             DragSourceContextPeer p = peer;
 378:             if (p != null)
 379:               p.setCursor(cursor);
 380:           }
 381:       }
 382:   }
 383: } // class DragSourceContext