
org.eclipse.compare.internal.EditionAction Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.eclipse.compare Show documentation
Show all versions of org.eclipse.compare Show documentation
This is org.eclipse.compare jar used by Scout SDK
The newest version!
/*******************************************************************************
* Copyright (c) 2000, 2011 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.compare.internal;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ResourceBundle;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.graphics.Image;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.ui.*;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.compare.*;
import org.eclipse.compare.ITypedElement;
import org.eclipse.compare.IStreamContentAccessor;
public class EditionAction extends BaseCompareAction {
/**
* Implements the IStreamContentAccessor and ITypedElement protocols
* for a Document.
*/
class DocumentBufferNode implements ITypedElement, IEncodedStreamContentAccessor {
private static final String UTF_16= "UTF-16"; //$NON-NLS-1$
private IDocument fDocument;
private IFile fFile;
DocumentBufferNode(IDocument document, IFile file) {
fDocument= document;
fFile= file;
}
public String getName() {
return fFile.getName();
}
public String getType() {
return fFile.getFileExtension();
}
public Image getImage() {
return null;
}
public InputStream getContents() {
return new ByteArrayInputStream(Utilities.getBytes(fDocument.get(), UTF_16));
}
public String getCharset() {
return UTF_16;
}
}
private String fBundleName;
private boolean fReplaceMode;
protected boolean fPrevious= false;
protected String fHelpContextId;
EditionAction(boolean replaceMode, String bundleName) {
fReplaceMode= replaceMode;
fBundleName= bundleName;
}
protected boolean isEnabled(ISelection selection) {
return Utilities.getFiles(selection).length == 1; // we don't support multiple selection for now
}
protected void run(ISelection selection) {
IFile[] files= Utilities.getFiles(selection);
for (int i= 0; i < files.length; i++)
doFromHistory(files[i]);
}
private void doFromHistory(final IFile file) {
ResourceBundle bundle= ResourceBundle.getBundle(fBundleName);
String title= Utilities.getString(bundle, "title"); //$NON-NLS-1$
Shell parentShell= CompareUIPlugin.getShell();
IFileState states[]= null;
try {
states= file.getHistory(null);
} catch (CoreException ex) {
MessageDialog.openError(parentShell, title, ex.getMessage());
return;
}
if (states == null || states.length <= 0) {
String msg= Utilities.getString(bundle, "noLocalHistoryError"); //$NON-NLS-1$
MessageDialog.openInformation(parentShell, title, msg);
return;
}
ITypedElement base= new ResourceNode(file);
IDocument document= getDocument(file);
ITypedElement target= base;
if (document != null)
target= new DocumentBufferNode(document, file);
ITypedElement[] editions= new ITypedElement[states.length+1];
editions[0]= base;
for (int i= 0; i < states.length; i++)
editions[i+1]= new HistoryItem(base, states[i]);
EditionSelectionDialog d= new EditionSelectionDialog(parentShell, bundle);
d.setEditionTitleArgument(file.getName());
d.setEditionTitleImage(CompareUIPlugin.getImage(file));
//d.setHideIdenticalEntries(false);
if (fHelpContextId != null)
d.setHelpContextId(fHelpContextId);
if (fReplaceMode) {
ITypedElement ti= null;
if (fPrevious)
ti= d.selectPreviousEdition(target, editions, null);
else
ti= d.selectEdition(target, editions, null);
if (ti instanceof IStreamContentAccessor) {
IStreamContentAccessor sa= (IStreamContentAccessor)ti;
if (Utilities.validateResource(file, parentShell, title)) {
try {
if (document != null)
updateDocument(document, sa);
else
updateWorkspace(bundle, parentShell, sa, file);
} catch (InterruptedException x) {
// Do nothing. Operation has been canceled by user.
} catch (InvocationTargetException x) {
String reason= x.getTargetException().getMessage();
MessageDialog.openError(parentShell, title, Utilities.getFormattedString(bundle, "replaceError", reason)); //$NON-NLS-1$
}
}
}
} else {
d.setCompareMode(true);
d.selectEdition(target, editions, null);
}
}
private void updateWorkspace(final ResourceBundle bundle, Shell shell,
final IStreamContentAccessor sa, final IFile file)
throws InvocationTargetException, InterruptedException {
WorkspaceModifyOperation operation= new WorkspaceModifyOperation() {
public void execute(IProgressMonitor pm) throws InvocationTargetException {
try {
String taskName= Utilities.getString(bundle, "taskName"); //$NON-NLS-1$
pm.beginTask(taskName, IProgressMonitor.UNKNOWN);
file.setContents(sa.getContents(), false, true, pm);
} catch (CoreException e) {
throw new InvocationTargetException(e);
} finally {
pm.done();
}
}
};
ProgressMonitorDialog pmdialog= new ProgressMonitorDialog(shell);
pmdialog.run(false, true, operation);
}
private void updateDocument(IDocument document, IStreamContentAccessor sa) throws InvocationTargetException {
try {
String text= Utilities.readString(sa);
document.replace(0, document.getLength(), text);
} catch (CoreException e) {
throw new InvocationTargetException(e);
} catch (BadLocationException e) {
throw new InvocationTargetException(e);
}
}
private IDocument getDocument(IFile file) {
IWorkbench wb= PlatformUI.getWorkbench();
if (wb == null)
return null;
IWorkbenchWindow[] ws= wb.getWorkbenchWindows();
if (ws == null)
return null;
FileEditorInput test= new FileEditorInput(file);
for (int i= 0; i < ws.length; i++) {
IWorkbenchWindow w= ws[i];
IWorkbenchPage[] wps= w.getPages();
if (wps != null) {
for (int j= 0; j < wps.length; j++) {
IWorkbenchPage wp= wps[j];
IEditorPart ep= wp.findEditor(test);
if (ep instanceof ITextEditor) {
ITextEditor te= (ITextEditor) ep;
IDocumentProvider dp= te.getDocumentProvider();
if (dp != null) {
IDocument doc= dp.getDocument(ep);
if (doc != null)
return doc;
}
}
}
}
}
return null;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy