001: /*******************************************************************************
002: * Copyright (c) 2005, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.internal.intro.universal;
011:
012: import java.io.ByteArrayInputStream;
013: import java.io.ByteArrayOutputStream;
014: import java.io.DataInputStream;
015: import java.io.DataOutputStream;
016: import java.io.IOException;
017:
018: import org.eclipse.swt.dnd.ByteArrayTransfer;
019: import org.eclipse.swt.dnd.DND;
020: import org.eclipse.swt.dnd.TransferData;
021:
022: public class ExtensionDataTransfer extends ByteArrayTransfer {
023:
024: private static final String MYTYPENAME = "ExtensionData"; //$NON-NLS-1$
025: private static final int MYTYPEID = registerType(MYTYPENAME);
026: private static ExtensionDataTransfer _instance = new ExtensionDataTransfer();
027:
028: public static ExtensionDataTransfer getInstance() {
029: return _instance;
030: }
031:
032: protected String[] getTypeNames() {
033: return new String[] { MYTYPENAME };
034: }
035:
036: protected int[] getTypeIds() {
037: return new int[] { MYTYPEID };
038: }
039:
040: public void javaToNative(Object object, TransferData transferData) {
041: if (!checkMyType(object) || !isSupportedType(transferData)) {
042: DND.error(DND.ERROR_INVALID_DATA);
043: }
044: BaseData[] myTypes = (BaseData[]) object;
045: try {
046: // write data to a byte array and then ask super to convert to pMedium
047: ByteArrayOutputStream out = new ByteArrayOutputStream();
048: DataOutputStream writeOut = new DataOutputStream(out);
049: for (int i = 0, length = myTypes.length; i < length; i++) {
050: BaseData bd = myTypes[i];
051: boolean separator = bd instanceof SeparatorData;
052: writeOut.writeBoolean(separator);
053: byte[] buffer = bd.getId().getBytes();
054: writeOut.writeInt(bd.getId().length());
055: writeOut.write(buffer);
056: if (bd instanceof ExtensionData) {
057: ExtensionData ed = (ExtensionData) bd;
058: writeOut.writeInt(ed.getName().length());
059: buffer = ed.getName().getBytes();
060: writeOut.write(buffer);
061: writeOut.writeInt(ed.getImportance());
062: }
063: }
064: byte[] buffer = out.toByteArray();
065: writeOut.close();
066: super .javaToNative(buffer, transferData);
067: } catch (IOException e) {
068: }
069: }
070:
071: public Object nativeToJava(TransferData transferData) {
072: if (isSupportedType(transferData)) {
073: byte[] buffer = (byte[]) super .nativeToJava(transferData);
074: if (buffer == null)
075: return null;
076:
077: BaseData[] myData = new BaseData[0];
078: try {
079: ByteArrayInputStream in = new ByteArrayInputStream(
080: buffer);
081: DataInputStream readIn = new DataInputStream(in);
082: while (readIn.available() > 4) {
083: boolean separator;
084: int importance = 0;
085: String id;
086: String name = null;
087: separator = readIn.readBoolean();
088: int size = readIn.readInt();
089: byte[] buff = new byte[size];
090: readIn.read(buff);
091: id = new String(buff);
092: if (!separator) {
093: size = readIn.readInt();
094: buff = new byte[size];
095: readIn.read(buff);
096: name = new String(buff);
097: importance = readIn.readInt();
098: }
099:
100: BaseData[] newMyData = new BaseData[myData.length + 1];
101: System.arraycopy(myData, 0, newMyData, 0,
102: myData.length);
103: if (separator)
104: newMyData[myData.length] = new SeparatorData(id);
105: else
106: newMyData[myData.length] = new ExtensionData(
107: id, name, importance);
108: myData = newMyData;
109: }
110: readIn.close();
111: } catch (IOException ex) {
112: return null;
113: }
114: return myData;
115: }
116:
117: return null;
118: }
119:
120: boolean checkMyType(Object object) {
121: if (object == null || !(object instanceof BaseData[])
122: || ((BaseData[]) object).length == 0) {
123: return false;
124: }
125: BaseData[] myTypes = (BaseData[]) object;
126: for (int i = 0; i < myTypes.length; i++) {
127: if (myTypes[i] == null || myTypes[i].getId() == null
128: || myTypes[i] instanceof ExtensionData
129: && ((ExtensionData) myTypes[i]).getName() == null)
130: return false;
131: }
132: return true;
133: }
134:
135: protected boolean validate(Object object) {
136: return checkMyType(object);
137: }
138: }
|