SWT - Drag & Drop
Le 10 septembre 2008, à 8:56 par Ulhume...

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());

Commentaires

Poster un nouveau commentaire

Le contenu de ce champ est gardé secret et ne sera pas montré publiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Textual smileys will be replaced with graphical ones.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.

Plus d'informations sur les options de formatage

Connexion utilisateur
Les derniers bavardages...