|
|
/*******************************************************************************
* Copyright (c) 2010 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ui.synchronize.actions;
import java.io.*;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.team.internal.ui.TeamUIMessages;
import org.eclipse.team.internal.ui.TeamUIPlugin;
import org.eclipse.team.internal.ui.synchronize.patch.ApplyPatchOperation;
import org.eclipse.ui.*;
import org.eclipse.ui.actions.SelectionListenerAction;
public class PasteAction extends SelectionListenerAction {
private final static String ID = TeamUIPlugin.PLUGIN_ID
+ ".synchronize.action.paste"; //$NON-NLS-1$
private Shell fShell;
private Clipboard fClipboard;
public PasteAction(IWorkbenchPart part) {
super(TeamUIMessages.PasteAction_1);
final ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
setActionDefinitionId(IWorkbenchCommandConstants.EDIT_PASTE);
setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
setDisabledImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED));
fShell = part.getSite().getShell();
Assert.isNotNull(fShell);
fClipboard = new Clipboard(fShell.getDisplay());
setToolTipText(TeamUIMessages.PasteAction_2);
setId(ID);
}
@Override
public void run() {
IStorage patchStorage = getPatchStorage();
if (patchStorage != null) {
IResource resource = null;
IResource[] resources = (IResource[]) getSelectedResources()
.toArray(new IResource[0]);
if (resources.length > 0) {
resource = resources[0];
}
// XXX: This will be fixed in 3.7, see
// https://bugs.eclipse.org/309803
ApplyPatchOperation operation = new ApplyPatchOperation(null,
patchStorage, resource, new CompareConfiguration()) {
@Override
protected boolean isApplyPatchInSynchronizeView() {
// ignore the preference, apply in the sync view
return true;
};
};
operation.openWizard();
} else {
MessageDialog.openError(fShell, TeamUIMessages.PasteAction_3,
TeamUIMessages.PasteAction_4);
}
}
private IStorage getPatchStorage() {
final String text = getClipboardText();
if (text == null)
return null;
IStorage storage = new IEncodedStorage() {
@Override
public Object getAdapter(Class adapter) {
return null;
}
@Override
public boolean isReadOnly() {
return false;
}
@Override
public String getName() {
return null;
}
@Override
public IPath getFullPath() {
return null;
}
@Override
public InputStream getContents() throws CoreException {
try {
return new ByteArrayInputStream(text.getBytes(getCharset()));
} catch (UnsupportedEncodingException e) {
throw new CoreException(new Status(IStatus.ERROR,
TeamUIPlugin.ID, IStatus.ERROR, e.getMessage(), e));
}
}
@Override
public String getCharset() throws CoreException {
return "UTF-8"; //$NON-NLS-1$
}
};
try {
if (ApplyPatchOperation.isPatch(storage)) {
return storage;
}
} catch (CoreException e) {
// ignore
}
return null;
}
private String getClipboardText() {
Transfer transfer = TextTransfer.getInstance();
if (isAvailable(transfer, fClipboard.getAvailableTypes())) {
return (String) getContents(fClipboard, transfer, fShell);
}
return null;
}
private static boolean isAvailable(Transfer transfer,
TransferData[] availableDataTypes) {
for (int i = 0; i < availableDataTypes.length; i++) {
if (transfer.isSupportedType(availableDataTypes[i]))
return true;
}
return false;
}
private static Object getContents(final Clipboard clipboard,
final Transfer transfer, Shell shell) {
// see bug 33028 for explanation why we need this
final Object[] result = new Object[1];
shell.getDisplay().syncExec(new Runnable() {
@Override
public void run() {
result[0] = clipboard.getContents(transfer);
}
});
return result[0];
}
public void dispose() {
fClipboard.dispose();
}
}
|