/*******************************************************************************
* Copyright (c) 2012 Martin Reiterer.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* Contributors:
* Martin Reiterer - initial API and implementation
* Christian Behon - Refactor
******************************************************************************/
package org.eclipselabs.e4.tapiji.translator.ui.widget.dnd;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.dnd.ByteArrayTransfer;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.TransferData;
import org.eclipselabs.e4.tapiji.logger.Log;
import org.eclipselabs.e4.tapiji.translator.model.Term;
public final class TermTransfer extends ByteArrayTransfer {
private static final String TERM = "term";
private static final int TYPEID = registerType(TERM);
private static final String TAG = TermTransfer.class.getSimpleName();
private TermTransfer() {
super();
}
private static class TermTransferHolder {
private static final TermTransfer INSTANCE = new TermTransfer();
}
public static TermTransfer getInstance() {
return TermTransferHolder.INSTANCE;
}
@Override
public void javaToNative(final Object object, final TransferData transferData) {
if (!checkType(object) || !isSupportedType(transferData)) {
DND.error(DND.ERROR_INVALID_DATA);
}
final Term[] terms = (Term[]) object;
try (ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream oOut = new ObjectOutputStream(out);) {
for (final Term term2 : terms) {
oOut.writeObject(term2);
}
final byte[] buffer = out.toByteArray();
super.javaToNative(buffer, transferData);
} catch (final IOException exception) {
Log.e(TAG, exception);
}
}
@Override
public Object nativeToJava(final TransferData transferData) {
if (isSupportedType(transferData)) {
final byte[] buffer = getBytesFrom(transferData);
if (null != buffer) {
final List<Term> terms = new ArrayList<Term>();
try (ByteArrayInputStream in = new ByteArrayInputStream(buffer); ObjectInputStream readIn = new ObjectInputStream(in);) {
terms.add((Term) readIn.readObject());
} catch (final Exception exception) {
Log.e(TAG, exception);
return null;
}
return terms.toArray(new Term[terms.size()]);
}
}
return null;
}
private byte[] getBytesFrom(final TransferData transferData) {
return (byte[]) super.nativeToJava(transferData);
}
@Override
protected String[] getTypeNames() {
return new String[] {TERM};
}
@Override
protected int[] getTypeIds() {
return new int[] {TYPEID};
}
boolean checkType(final Object object) {
if ((object == null) || !(object instanceof Term[]) || (((Term[]) object).length == 0)) {
return false;
}
final Term[] myTypes = (Term[]) object;
for (final Term myType : myTypes) {
if (myType == null) {
return false;
}
}
return true;
}
@Override
protected boolean validate(final Object object) {
return checkType(object);
}
}