/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.meta.action.impl.handlers;
import java.util.*;
import org.eclipse.core.resources.*;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.part.ResourceTransfer;
import org.jboss.tools.common.model.*;
import org.jboss.tools.common.model.util.ModelFeatureFactory;
import org.jboss.tools.common.meta.action.impl.AbstractHandler;
public class CopyHandler extends AbstractHandler {
static Transfer modelTransfer;
static {
modelTransfer = (Transfer)ModelFeatureFactory.getInstance().createFeatureInstance("org.jboss.tools.common.model.ui.dnd.ModelTransfer"); //$NON-NLS-1$
}
public CopyHandler() {}
public void executeHandler(XModelObject object, Properties p) throws XModelException {
object.getModel().getModelBuffer().clear();
object.getModel().getModelBuffer().addSource(object);
if(p == null || !XModelObjectConstants.TRUE.equals(p.getProperty("isDrag"))) { //$NON-NLS-1$
setClipboard(object.getModel());
}
}
public boolean getSignificantFlag(XModelObject object) {
return false;
}
public boolean isEnabled(XModelObject object) {
return (object != null);
}
public void executeHandler(XModelObject object, XModelObject[] objects, java.util.Properties p) throws XModelException {
if(!isEnabled(object, objects)) return;
XModelBuffer buffer = object.getModel().getModelBuffer();
buffer.clear();
for (int i = 0; i < objects.length; i++) buffer.addSource(objects[i]);
if(p == null || !XModelObjectConstants.TRUE.equals(p.getProperty("isDrag"))) { //$NON-NLS-1$
setClipboard(object.getModel());
}
}
public void setDefaultData(XModelObject object) {}
void setClipboard(XModel model) {
XModelBuffer buffer = model.getModelBuffer();
List<IResource> resources = new ArrayList<IResource>();
List<String> files = new ArrayList<String>();
StringBuffer texts = new StringBuffer();
List<String> paths = new ArrayList<String>();
for (int i = 0; i < buffer.getSize(); i++) {
XModelObject o = buffer.source(i);
IResource resource = (IResource)o.getAdapter(IResource.class);
if(resource instanceof IFile || resource instanceof IContainer) {
resources.add(resource);
}
if(texts.length() > 0) texts.append(' ');
texts.append(o.getPresentationString());
if(resource instanceof IFile) {
files.add(resource.getLocation().toOSString());
}
paths.add("" + o.getPath()); //$NON-NLS-1$
}
Clipboard c = new Clipboard(Display.getCurrent());
List<Object> dataList = new ArrayList<Object>();
dataList.add(resources.toArray(new IResource[0]));
if(files.size() > 0) dataList.add(files.toArray(new String[0]));
dataList.add(texts.toString());
dataList.add(paths.toArray(new String[0]));
Object[] data = dataList.toArray(new Object[0]);
Transfer[] t = (files.size() > 0)
? new Transfer[]{ResourceTransfer.getInstance(), FileTransfer.getInstance(), TextTransfer.getInstance(), modelTransfer}
: new Transfer[]{ResourceTransfer.getInstance(), TextTransfer.getInstance(), modelTransfer};
c.setContents(data, t);
}
}