Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureCreator.java')
-rw-r--r--bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureCreator.java433
1 files changed, 0 insertions, 433 deletions
diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureCreator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureCreator.java
deleted file mode 100644
index 799afba98..000000000
--- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureCreator.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2009 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.structuremergeviewer;
-
-import java.io.UnsupportedEncodingException;
-
-import org.eclipse.compare.CompareUI;
-import org.eclipse.compare.IEditableContent;
-import org.eclipse.compare.IEncodedStreamContentAccessor;
-import org.eclipse.compare.ISharedDocumentAdapter;
-import org.eclipse.compare.IStreamContentAccessor;
-import org.eclipse.compare.ITypedElement;
-import org.eclipse.compare.SharedDocumentAdapter;
-import org.eclipse.compare.contentmergeviewer.IDocumentRange;
-import org.eclipse.compare.internal.CompareUIPlugin;
-import org.eclipse.compare.internal.Utilities;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentExtension3;
-import org.eclipse.jface.text.IDocumentPartitioner;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.services.IDisposable;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-
-/**
- * An {@link IStructureCreator2} that attempts to use an {@link IDocumentProvider}
- * to obtain a shared document for an {@link ITypedElement}.
- * <p>
- * Clients may subclass this class.
- * </p>
- *
- * @since 3.3
- */
-public abstract class StructureCreator implements IStructureCreator2 {
-
- /* (non-Javadoc)
- * @see org.eclipse.compare.structuremergeviewer.IStructureCreator#getStructure(java.lang.Object)
- */
- public IStructureComparator getStructure(Object input) {
- String contents= null;
- IDocument doc= CompareUI.getDocument(input);
- if (doc == null) {
- if (input instanceof IStreamContentAccessor) {
- IStreamContentAccessor sca= (IStreamContentAccessor) input;
- try {
- contents= Utilities.readString(sca);
- } catch (CoreException e) {
- // return null indicates the error.
- CompareUIPlugin.log(e);
- return null;
- }
- }
-
- if (contents == null) {
- // Node has no contents
- return null;
- }
-
- doc= new Document(contents);
- setupDocument(doc);
- }
-
- try {
- return createStructureComparator(input, doc, null, null);
- } catch (CoreException e) {
- CompareUIPlugin.log(e);
- return null;
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.compare.structuremergeviewer.IStructureCreator2#createStructure(java.lang.Object, org.eclipse.core.runtime.IProgressMonitor)
- */
- public IStructureComparator createStructure(final Object element, final IProgressMonitor monitor) throws CoreException {
- final IStructureComparator[] result = new IStructureComparator[] { null };
- Runnable runnable = new Runnable() {
- public void run() {
- try {
- result[0]= internalCreateStructure(element, monitor);
- } catch (OperationCanceledException ex) {
- return;
- }
- }
- };
- Utilities.runInUIThread(runnable);
- return result[0];
- }
-
- /*
- * We need to create the structure in the UI thread since IDocument requires this
- */
- private IStructureComparator internalCreateStructure(Object element,
- IProgressMonitor monitor) {
- final ISharedDocumentAdapter sda = SharedDocumentAdapterWrapper.getAdapter(element);
- if (sda != null) {
- final IEditorInput input = sda.getDocumentKey(element);
- if (input != null) {
- final IDocumentProvider provider = SharedDocumentAdapter.getDocumentProvider(input);
- if (provider != null) {
- try {
- sda.connect(provider, input);
- IDocument document = provider.getDocument(input);
- setupDocument(document);
- return createStructureComparator(element, document, wrapSharedDocumentAdapter(sda, element, document), monitor);
- } catch (CoreException e) {
- // Connection to the document provider failed.
- // Log and fall through to use simple structure
- CompareUIPlugin.log(e);
- }
- }
- }
- }
- return getStructure(element);
- }
-
- /**
- * Create an {@link IStructureComparator} for the given element using the
- * contents available in the given document. If the provided
- * {@link ISharedDocumentAdapter} is not <code>null</code> then the
- * {@link IStructureComparator} returned by this method must implement the
- * {@link IDisposable} interface and disconnect from the adapter when the
- * comparator is disposed. The {@link StructureDiffViewer} class will call
- * dispose if the {@link IStructureComparator} also implements
- * {@link IDisposable}. Other clients must do the same.
- * <p>
- * It should be noted that the provided {@link ISharedDocumentAdapter}
- * will provide the key associated with the given element when
- * {@link ISharedDocumentAdapter#getDocumentKey(Object)} is called
- * for any {@link IDocumentRange} node whose document matches the
- * provided document. Thus, this adapter should also be returned
- * by the structure comparator and its children when they are adapted
- * to an {@link ISharedDocumentAdapter}.
- * @param element the element
- * @param document the document that has the contents for the element
- * @param sharedDocumentAdapter the shared document adapter from which the
- * document was obtained or <code>null</code> if the document
- * is not shared.
- * @param monitor a progress monitor or <code>null</code> if progress is not required
- *
- * @return a structure comparator
- * @throws CoreException
- */
- protected abstract IStructureComparator createStructureComparator(
- final Object element, IDocument document,
- final ISharedDocumentAdapter sharedDocumentAdapter,
- IProgressMonitor monitor) throws CoreException;
-
- /**
- * Setup the newly created document as appropriate. Any document partitioners
- * should be added to a custom slot using the {@link IDocumentExtension3} interface
- * in case the document is shared via a file buffer.
- * @param document a document
- */
- protected void setupDocument(IDocument document) {
- String partitioning = getDocumentPartitioning();
- if (partitioning == null || !(document instanceof IDocumentExtension3)) {
- if (document.getDocumentPartitioner() == null) {
- IDocumentPartitioner partitioner= getDocumentPartitioner();
- if (partitioner != null) {
- document.setDocumentPartitioner(partitioner);
- partitioner.connect(document);
- }
- }
- } else {
- IDocumentExtension3 ex3 = (IDocumentExtension3) document;
- if (ex3.getDocumentPartitioner(partitioning) == null) {
- IDocumentPartitioner partitioner= getDocumentPartitioner();
- if (partitioner != null) {
- ex3.setDocumentPartitioner(partitioning, partitioner);
- partitioner.connect(document);
- }
- }
- }
- }
-
- /**
- * Return the partitioner to be associated with the document or
- * <code>null</code> is partitioning is not needed or if the subclass
- * overrode {@link #setupDocument(IDocument)} directly.
- * @return a partitioner
- */
- protected IDocumentPartitioner getDocumentPartitioner() {
- return null;
- }
-
- /**
- * Return the partitioning to which the partitioner returned from
- * {@link #getDocumentPartitioner()} is to be associated. Return <code>null</code>
- * only if partitioning is not needed or if the subclass
- * overrode {@link #setupDocument(IDocument)} directly.
- * @see IDocumentExtension3
- * @return a partitioning
- */
- protected String getDocumentPartitioning() {
- return null;
- }
-
- /**
- * Default implementation of save that extracts the contents from
- * the document of an {@link IDocumentRange} and sets it on the
- * input. If the input is an {@link IEncodedStreamContentAccessor},
- * the charset of the input is used to extract the contents from the
- * document. If the input adapts to {@link ISharedDocumentAdapter} and
- * the document of the {@link IDocumentRange} matches that of the
- * input, then the save is issued through the shared document adapter.
- * @see org.eclipse.compare.structuremergeviewer.IStructureCreator#save(org.eclipse.compare.structuremergeviewer.IStructureComparator, java.lang.Object)
- */
- public void save(IStructureComparator node, Object input) {
- if (node instanceof IDocumentRange && input instanceof IEditableContent) {
- IDocument document= ((IDocumentRange)node).getDocument();
- // First check to see if we have a shared document
- final ISharedDocumentAdapter sda = SharedDocumentAdapterWrapper.getAdapter(input);
- if (sda != null) {
- IEditorInput key = sda.getDocumentKey(input);
- if (key != null) {
- IDocumentProvider provider = SharedDocumentAdapter.getDocumentProvider(key);
- if (provider != null) {
- IDocument providerDoc = provider.getDocument(key);
- // We have to make sure that the document we are saving is the same as the shared document
- if (providerDoc != null && providerDoc == document) {
- if (save(provider, document, input, sda, key))
- return;
- }
- }
- }
- }
- IEditableContent bca= (IEditableContent) input;
- String contents= document.get();
- String encoding= null;
- if (input instanceof IEncodedStreamContentAccessor) {
- try {
- encoding= ((IEncodedStreamContentAccessor)input).getCharset();
- } catch (CoreException e1) {
- // ignore
- }
- }
- if (encoding == null)
- encoding= ResourcesPlugin.getEncoding();
- byte[] bytes;
- try {
- bytes= contents.getBytes(encoding);
- } catch (UnsupportedEncodingException e) {
- bytes= contents.getBytes();
- }
- bca.setContent(bytes);
- }
- }
-
- private boolean save(final IDocumentProvider provider, final IDocument document,
- final Object input, final ISharedDocumentAdapter sda, final IEditorInput key) {
- try {
- sda.flushDocument(provider, key, document, false);
- return true;
- } catch (CoreException e) {
- CompareUIPlugin.log(e);
- }
- return false;
- }
-
- /**
- * Create an {@link ISharedDocumentAdapter} that will provide the document key for the given input
- * object for any {@link DocumentRangeNode} instances whose document is the same as the
- * provided document.
- * @param input the input element
- * @param document the document associated with the input element
- * @return a shared document adapter that provides the proper document key for document range nodes
- */
- private final ISharedDocumentAdapter wrapSharedDocumentAdapter(ISharedDocumentAdapter elementAdapter, final Object input, final IDocument document) {
- // We need to wrap the adapter so that the proper document key gets returned
- return new SharedDocumentAdapterWrapper(elementAdapter) {
- public IEditorInput getDocumentKey(Object element) {
- if (hasSameDocument(element)) {
- return super.getDocumentKey(input);
- }
- return super.getDocumentKey(element);
- }
- private boolean hasSameDocument(Object element) {
- if (element instanceof DocumentRangeNode) {
- DocumentRangeNode drn = (DocumentRangeNode) element;
- return drn.getDocument() == document;
- }
- return false;
- }
- };
- }
-
- /**
- * Default implementation of {@link #createElement(Object, Object, IProgressMonitor)}
- * that uses {@link #getPath(Object, Object)} to determine the
- * path for the element, {@link #createStructure(Object, IProgressMonitor)} to create the structure
- * and {@link #findElement(IStructureComparator, String[])} to find the
- * element in the structure. Subclasses may override.
- * @param element the element
- * @param input the containing input
- * @param monitor a progress monitor
- * @return the sub-structure element in the input for the given element
- * @throws CoreException if a parse error occurred
- */
- public ITypedElement createElement(Object element, Object input, IProgressMonitor monitor)
- throws CoreException {
- String[] path= getPath(element, input);
- if (path == null) {
- // TODO: Temporary code until subclasses are updated
- IStructureComparator locate = locate(element, input);
- if (locate instanceof ITypedElement) {
- return (ITypedElement)locate;
- }
- return null;
- }
-
- // Build the structure
- IStructureComparator structure= createStructure(input, monitor);
- if (structure == null) // we couldn't parse the structure
- return null; // so we can't find anything
-
- // find the path in the tree
- return findElement(structure, path);
- }
-
- /**
- * Default implementation of {@link #locate(Object, Object)} that
- * uses {@link #getPath(Object, Object)} to determine the
- * path for the element, {@link #getStructure(Object)} to create the structure
- * and {@link #findElement(IStructureComparator, String[])} to find the
- * element in the structure. Subclasses may override.
- * @param element the element
- * @param input the containing input
- * @return the sub-structure element in the input for the given element
- */
- public IStructureComparator locate(Object element, Object input) {
- String[] path= getPath(element, input);
- if (path == null)
- return null;
- // Build the structure
- IStructureComparator structure= getStructure(input);
- if (structure == null) // we couldn't parse the structure
- return null; // so we can't find anything
-
- // find the path in the tree
- return (IStructureComparator)findElement(structure, path);
- }
-
- /**
- * Find the element at the given path in the given structure.
- * This method is invoked from the {@link #createElement(Object, Object, IProgressMonitor)}
- * and {@link #locate(Object, Object)} methods to find the element for
- * the given path.
- * @param structure the structure
- * @param path the path of an element in the structure
- * @return the element at the given path in the structure or <code>null</code>
- */
- protected ITypedElement findElement(IStructureComparator structure, String[] path) {
- return (ITypedElement)find(structure, path, 0);
- }
-
- /**
- * Recursively extracts the given path from the tree.
- */
- private IStructureComparator find(IStructureComparator tree, String[] path, int index) {
- if (tree != null) {
- Object[] children= tree.getChildren();
- if (children != null) {
- for (int i= 0; i < children.length; i++) {
- IStructureComparator child= (IStructureComparator) children[i];
- if (child instanceof ITypedElement && child instanceof DocumentRangeNode) {
- String n1= null;
- if (child instanceof DocumentRangeNode)
- n1= ((DocumentRangeNode)child).getId();
- if (n1 == null)
- n1= ((ITypedElement)child).getName();
- String n2= path[index];
- if (n1.equals(n2)) {
- if (index == path.length-1)
- return child;
- IStructureComparator result= find(child, path, index+1);
- if (result != null)
- return result;
- }
- }
- }
- }
- }
- return null;
- }
-
- /**
- * Return the path of the element in the structure of it's containing input
- * or <code>null</code> if the element is not contained in the input. This method is
- * invoked from {@link #createElement(Object, Object, IProgressMonitor)} and
- * {@link #locate(Object, Object)} methods to determine
- * the path to be passed to {@link #findElement(IStructureComparator, String[])}.
- * By default, <code>null</code> is returned. Subclasses may override.
- * @param element the element
- * @param input the input
- * @return the path of the element in the structure of it's containing input
- * or <code>null</code>
- */
- protected String[] getPath(Object element, Object input) {
- return null;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.compare.structuremergeviewer.IStructureCreator2#destroy(java.lang.Object)
- */
- public void destroy(Object object) {
- IDisposable disposable = getDisposable(object);
- if (disposable != null)
- disposable.dispose();
- }
-
- private IDisposable getDisposable(Object object) {
- if (object instanceof IDisposable) {
- return (IDisposable) object;
- }
- if (object instanceof DocumentRangeNode) {
- DocumentRangeNode node = (DocumentRangeNode) object;
- return getDisposable(node.getParentNode());
- }
- return null;
- }
-}

Back to the top