net.sf.nmedit.patchmodifier.mutator.VariationTransferHandler.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.nmedit.patchmodifier.mutator.VariationTransferHandler.java

Source

/* Copyright (C) 2006-2007 Julien Pauty
 * 
 * This file is part of Nomad.
 * 
 * Nomad is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * Nomad is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Nomad; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
package net.sf.nmedit.patchmodifier.mutator;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.Vector;

import javax.swing.JComponent;
import javax.swing.TransferHandler;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class VariationTransferHandler extends TransferHandler {

    private static final Log log = LogFactory.getLog(VariationTransferHandler.class);

    private static final long serialVersionUID = -7388283079611345524L;

    public static final DataFlavor variationFlavor = new DataFlavor(VariationTransferData.class, "variation");

    public VariationTransferHandler() {
        //        serialArrayListFlavor = new DataFlavor(ArrayList.class,
        //                                              "ArrayList");
    }

    public boolean importData(JComponent c, Transferable t) {
        //System.out.println("import data");
        Variation target;
        Vector<Integer> data = null;

        if (!canImport(c, t.getTransferDataFlavors())) {
            return false;
        }

        try {
            target = (Variation) c;

            if (t.isDataFlavorSupported(variationFlavor)) {
                data = ((VariationTransferData) t.getTransferData(variationFlavor)).getVariationData();
            } else {
                return false;
            }
        } catch (UnsupportedFlavorException ufe) {
            if (log.isErrorEnabled()) {
                log.error("importData: unsupported data flavor", ufe);
            }
            return false;
        } catch (IOException ioe) {
            if (log.isErrorEnabled()) {
                log.error("importData: I/O exception", ioe);
            }
            return false;
        }

        target.getState().updateValues(new Vector<Integer>(data));

        c.repaint();
        return true;
    }

    protected void exportDone(JComponent c, Transferable data, int action) {

        if ((action == MOVE)) {
            c.repaint();
        }
    }

    public boolean canImport(JComponent c, DataFlavor[] flavors) {
        for (DataFlavor candidate : flavors)
            if (variationFlavor.equals(candidate))
                return true;
        return false;
    }

    //
    @Override
    protected Transferable createTransferable(JComponent c) {

        if (c instanceof Variation) {
            Variation source = (Variation) c;
            VariationState s = source.getState();
            if (s != null)
                return new VariationTransferable(source.getState().getValues());
            else
                return null;
        }
        return null;
    }

    @Override
    public int getSourceActions(JComponent c) {
        return TransferHandler.COPY_OR_MOVE;
    }

    //
    //    public int getSourceActions(JComponent c) {
    //        return COPY_OR_MOVE;
    //    }
    //
    public final class VariationTransferData {
        private Vector<Integer> data;

        public VariationTransferData(Vector<Integer> data) {
            this.data = data;
        }

        public Vector<Integer> getVariationData() {
            return data;
        }

    }

    public class VariationTransferable implements Transferable {
        VariationTransferData data;

        public VariationTransferable(Vector<Integer> data) {
            this.data = new VariationTransferData(data);
        }

        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
            if (!isDataFlavorSupported(flavor)) {
                throw new UnsupportedFlavorException(flavor);
            }
            return data;
        }

        public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[] { variationFlavor };
        }

        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return variationFlavor.equals(flavor);
        }
    }
}