org.csstudio.sds.ui.internal.layers.LayerTransfer.java Source code

Java tutorial

Introduction

Here is the source code for org.csstudio.sds.ui.internal.layers.LayerTransfer.java

Source

/*
 * Copyright (c) 2008 Stiftung Deutsches Elektronen-Synchrotron,
 * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
 *
 * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
 * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
 * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
 * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
 * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
 * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
 * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
 * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
 * OR MODIFICATIONS.
 * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
 * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
 * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
 * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
 */
package org.csstudio.sds.ui.internal.layers;

import org.csstudio.sds.internal.model.Layer;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.util.Policy;
import org.eclipse.swt.dnd.ByteArrayTransfer;
import org.eclipse.swt.dnd.TransferData;

/**
 * Transfer handler for layers. Implements a pattern similar to
 * {@link LocalSelectionTransfer}.
 *
 * @author swende
 *
 */
final class LayerTransfer extends ByteArrayTransfer {

    /**
     * Type name.
     */
    private static final String TYPE_NAME = "sds.layertransfer";

    /**
     * Type identifier.
     */
    private static final int TYPE_ID = registerType(TYPE_NAME);

    /**
     * Singleton instance.
     */
    private static LayerTransfer _instance;

    /**
     * Currently selected layer.
     */
    private Layer _selectedLayer;

    /**
     * Private constructor (singleton pattern).
     */
    private LayerTransfer() {

    }

    /**
     * Returns the singleton instance.
     *
     * @return the singleton instance
     */
    public static LayerTransfer getInstance() {
        if (_instance == null) {
            _instance = new LayerTransfer();
        }
        return _instance;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected String[] getTypeNames() {
        return new String[] { TYPE_NAME };
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected int[] getTypeIds() {
        return new int[] { TYPE_ID };
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void javaToNative(final Object object, final TransferData transferData) {
        byte[] check = TYPE_NAME.getBytes();
        super.javaToNative(check, transferData);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Object nativeToJava(final TransferData transferData) {
        Object result = super.nativeToJava(transferData);
        if (isInvalidNativeType(result)) {
            Policy.getLog().log(new Status(IStatus.ERROR, Policy.JFACE, IStatus.ERROR,
                    JFaceResources.getString("LocalSelectionTransfer.errorMessage"), null)); //$NON-NLS-1$
        }
        return _selectedLayer;
    }

    /**
     * Tests whether native drop data matches this transfer type.
     *
     * @param result
     *            result of converting the native drop data to Java
     * @return true if the native drop data does not match this transfer type.
     *         false otherwise.
     */
    private boolean isInvalidNativeType(final Object result) {
        return !(result instanceof byte[]) || !TYPE_NAME.equals(new String((byte[]) result));
    }

    /**
     * Sets the transfer data for local use.
     *
     * @param selectedLayer
     *            the transfered layer
     */
    public void setSelectedLayer(final Layer selectedLayer) {
        _selectedLayer = selectedLayer;
    }
}