Un petit exemple de drag & drop entre un navigateur (source URL) et une application SWING.
D'abord la classe qui gère le type de contenu URL
package net.karmaLab.thema.ui.dnd;
import java.util.logging.Logger;
import net.karmaLab.traces.Traces;
import org.eclipse.swt.dnd.ByteArrayTransfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.internal.gtk.OS;
public class URLTransfer
extends ByteArrayTransfer
{
private static URLTransfer _instance
= new URLTransfer
();
private static final String[] TYPE_NAMES
= { "COMPOUND_TEXT",
"UTF8_STRING",
"TEXT",
"text/plain",
"text/html" };
private static final int[] TYPE_IDS
= registerTypes
(TYPE_NAMES
);
/** static class logger. */
private static Logger logger
= Traces.
LOGGER(URLTransfer.
class);
public static URLTransfer getInstance
() {
return _instance
;
}
/**
* @param typeNames
* @return
*/
private static int[] registerTypes
(String[] typeNames
) {
int[] ids
= new int[typeNames.
length];
for (int i
= 0; i
< typeNames.
length; i
++) {
ids
[i
] = registerType
(typeNames
[i
]);
}
return ids
;
}
@Override
protected int[] getTypeIds
() {
return TYPE_IDS
;
}
@Override
protected String[] getTypeNames
() {
return TYPE_NAMES
;
}
/**
* @param transferData
* @return
*/
private String hex
(TransferData transferData
) {
return Integer.
toHexString(transferData.
type);
}
@Override
public boolean isSupportedType
(TransferData transferData
) {
boolean res
= super.
isSupportedType(transferData
);
String match
= "none";
for (int i
= 0; i
< TYPE_IDS.
length; i
++) {
if (TYPE_IDS
[i
] == transferData.
type) {
match
= TYPE_NAMES
[i
];
}
}
logger.
config("Is Supporteed:" + hex
(transferData
) + "[" + match
+ ":" + res
+ "]");
return res
;
}
@Override
public void javaToNative
(Object object, TransferData transferData
) {
System.
out.
println("javaToNative called");
}
@Override
public Object nativeToJava
(TransferData transferData
) {
if (!isSupportedType
(transferData
) || transferData.
pValue == 0) {
return null;
}
int size
= transferData.
format * transferData.
length / 8;
if (size
== 0) {
return null;
}
byte[] buffer
= new byte[size
];
OS.
memmove(buffer, transferData.
pValue, size
);
return new String(buffer,
0, buffer.
length - 1).
trim();
}
}
Utilisation :
private final class DropItemAdapter
extends DropTargetAdapter
{
@Override
public void dragOver
(DropTargetEvent event
) {
// try {
// if (getURIHandleres((TreeItem) event.item, new URI((String) event.data)).size() == 0) {
// System.out.println((String) event.data);
// }
// }
// catch (URISyntaxException e) {
// e.printStackTrace();
// }
}
@Override
public void drop
(final DropTargetEvent event
) {
Menu popUpMenu
= null;
try {
popUpMenu
= buildNewItemMenu
((TreeItem
) event.
item,
new URI
((String) event.
data));
}
catch (URISyntaxException e
) {
e.
printStackTrace();
}
popUpMenu.
setVisible(true);
}
}
DropTarget dt
= new DropTarget(tree, DND.
DROP_DEFAULT | DND.
DROP_COPY | DND.
DROP_LINK | DND.
DROP_MOVE);
dt.
setTransfer(new Transfer
[] { URLTransfer.
getInstance() });
dt.
addDropListener(new DropItemAdapter
());
Poster un nouveau commentaire