Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: com/memoire/dnd/DndTarget.java


1   /**
2    * @modification $Date: 2002/12/16 18:56:25 $
3    * @statut       unstable
4    * @file         DndTarget.java
5    * @version      0.36
6    * @author       Guillaume Desnoix
7    * @email        guillaume@desnoix.com
8    * @license      GNU General Public License 2 (GPL2)
9    * @copyright    1998-2001 Guillaume Desnoix
10   */
11  
12  package com.memoire.dnd;
13  
14  import java.awt.*;
15  import java.awt.event.*;
16  import java.io.*;
17  import java.util.*;
18  import javax.swing.*;
19  import com.memoire.dnd.*;
20  
21  public class DndTarget
22    implements Serializable
23  {
24    private   Hashtable transfers_;
25    private   Hashtable managers_;
26    protected String    text_;
27    protected Class[]   classes_;
28  
29    public DndTarget()
30    {
31      this(null);
32    }
33  
34    public DndTarget(String _text)
35    {
36      classes_  =new Class[0];
37      transfers_=new Hashtable(5);
38      managers_ =new Hashtable(5);
39      text_     =_text;
40    } 
41  
42    public final DndTarget accept
43      (Class           _class,
44       DndTransferData _transfer,
45       DndManageData   _manager)
46    {
47      if(_class.isArray())
48        throw new IllegalArgumentException
49    (_class+" is an array");
50  
51      int   l=classes_.length;
52      Class test=null;
53      
54      for(int i=0;i<l;i++)
55        if(classes_[i].isAssignableFrom(_class)) 
56    { test=classes_[i]; break; }
57  
58      if(test==_class)
59        throw new IllegalArgumentException
60    (_class+" was previously added");
61      
62      if(test!=null)
63        throw new IllegalArgumentException
64    (_class+" is already managed by "+test);
65      
66      Class[] r=new Class[l+1];
67      System.arraycopy(classes_,0,r,0,l);
68      r[l]=_class;
69      classes_=r;
70      transfers_.put(_class,_transfer);
71      managers_ .put(_class,_manager);
72      
73      return this;
74    }
75  
76    public void add(JComponent _comp)
77    {
78      if(_comp instanceof JRootPane)
79        throw new RuntimeException
80    ("Don't add a RootPane (add the ContentPane instead)");
81      
82      if(_comp.getClientProperty("DND_TARGET")==null)
83        _comp.putClientProperty("DND_TARGET",this);
84      else
85        throw new RuntimeException
86    ("Already a Dnd Target");
87    }
88  
89    protected Class getAcceptedClass(Object[] _data)
90    {
91      if(_data==null)
92      {
93        System.err.println("Error: _data is null");
94        return null;
95      }
96      
97      Class r=null;
98      
99      loop:
100     for(int i=0;i<classes_.length;i++)
101       for(int j=0;j<_data.length;j++)
102       {
103   if(_data[j]==null) continue;
104   if(classes_[i].isAssignableFrom(getCommonClass(_data[j])))
105     { r=classes_[i]; break loop; }
106       }
107       
108     return r;
109   }
110 
111   protected Object getAcceptedObject(Object[] _data)
112   {
113     if(_data==null)
114     {
115       System.err.println("Error: _data is null");
116       return null;
117     }
118     
119     Object r=null;
120 
121     loop:
122     for(int i=0;i<classes_.length;i++)
123       for(int j=0;j<_data.length;j++)
124       {
125   if(_data[j]==null) continue;
126   if(classes_[i].isAssignableFrom(getCommonClass(_data[j])))
127     { r=_data[j]; break loop; }
128       }
129       
130     return r;
131   }
132 
133   public static final Class getCommonClass(Object _data)
134   {
135     Class r=_data.getClass();
136       
137     if(r.isArray())
138     {
139       Object[] o=(Object[])_data;
140       if(o.length==0)
141   r=r.getComponentType();
142       else
143       {
144   r=null;
145   for(int i=0;i<o.length;i++)
146   {
147     if(o[i]==null) continue;
148     if(r==null)
149       r=o[i].getClass();
150     else
151     while(!r.isAssignableFrom(o[i].getClass()))
152       r=r.getSuperclass();
153   }
154       }
155     
156       //System.err.println("SUPER="+r);
157     }
158       
159     return r;
160   }
161 
162   public boolean isAcceptable(Object[] _data)
163   {
164     return getAcceptedClass(_data)!=null;
165   }
166 
167   public String getText(Object[] _data)
168   {
169     return text_;
170   }
171 
172   public void drop(Object[] _data, JComponent _comp, Point _loc)
173   {
174     Class clazz=getAcceptedClass(_data);
175 
176     //System.err.println("CLAZZ="+clazz);
177     DndTransferData t=(DndTransferData)transfers_.get(clazz);
178 
179     Object o=t.transfer(clazz,getAcceptedObject(_data));
180     //System.err.println("O="+o);
181       
182     if(o!=null)
183     {
184       DndManageData m=(DndManageData)managers_.get(clazz);
185       m.manage(o,_comp,_loc);
186     }
187   }
188 }