| /******************************************************************************* |
| * 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; |
| } |
| } |
| |