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 }