package org.eclipse.php.internal.ui.compare; import org.eclipse.compare.CompareConfiguration; import org.eclipse.compare.ISharedDocumentAdapter; import org.eclipse.compare.contentmergeviewer.TextMergeViewer; import org.eclipse.compare.structuremergeviewer.ICompareInput; import org.eclipse.core.runtime.Adapters; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentPartitioner; import org.eclipse.jface.text.TextViewer; import org.eclipse.jface.text.source.CompositeRuler; import org.eclipse.jface.text.source.IAnnotationModel; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.php.internal.core.documentModel.parser.PHPSourceParser; import org.eclipse.php.internal.core.documentModel.partitioner.PHPStructuredTextPartitioner; import org.eclipse.php.internal.ui.editor.configuration.PHPStructuredTextViewerConfiguration; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.wst.sse.core.internal.document.StructuredDocumentFactory; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning; import org.eclipse.wst.sse.core.internal.text.JobSafeStructuredDocument; import org.eclipse.wst.sse.ui.internal.StructuredTextViewer; public class PHPTextMergeViewer extends TextMergeViewer { private boolean useBasic = true; public PHPTextMergeViewer(Composite parent, CompareConfiguration configuration) { super(parent, configuration); } @Override public void setInput(Object input) { if (input instanceof ICompareInput) { ICompareInput compareInput = (ICompareInput) input; ISharedDocumentAdapter sda = Adapters.adapt(compareInput.getLeft(), ISharedDocumentAdapter.class); if (sda != null) { this.useBasic = sda.getDocumentKey(compareInput.getLeft()) == null; } } super.setInput(input); } @Override protected void configureTextViewer(TextViewer textViewer) { if (textViewer instanceof StructuredTextViewer) { ((StructuredTextViewer) textViewer).configure(new PHPStructuredTextViewerConfiguration()); } } @Override protected String getDocumentPartitioning() { if (useBasic) { return super.getDocumentPartitioning(); } return IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING; } @Override public IDocumentPartitioner getDocumentPartitioner() { if (useBasic) { return super.getDocumentPartitioner(); } return new PHPStructuredTextPartitioner(); } @Override protected void setupDocument(final IDocument document) { super.setupDocument(createStructuredDocument(document)); } @Override public String getTitle() { return Messages.PHPTextMergeViewer_Viewer_Title; } @Override protected SourceViewer createSourceViewer(Composite parent, int textOrientation) { if (useBasic) { return super.createSourceViewer(parent, textOrientation); } return new StructuredTextViewer(parent, new CompositeRuler(), null, false, textOrientation | SWT.H_SCROLL | SWT.V_SCROLL) { @Override public void setDocument(IDocument document, IAnnotationModel annotationModel, int modelRangeOffset, int modelRangeLength) { super.setDocument(createStructuredDocument(document), annotationModel, modelRangeOffset, modelRangeLength); } }; } /* * This method is workaround to use SSE viewer to compare files */ private IDocument createStructuredDocument(IDocument document) { if (useBasic) { return document; } IStructuredDocument newDoc = null; if (document instanceof IStructuredDocument) { newDoc = (IStructuredDocument) document; } else if (document != null) { newDoc = StructuredDocumentFactory.getNewStructuredDocumentInstance(new PHPSourceParser()); newDoc.set(document.get()); IDocumentPartitioner partitioner = getDocumentPartitioner(); if (partitioner != null) { if (newDoc instanceof JobSafeStructuredDocument) { ((JobSafeStructuredDocument) newDoc).setDocumentPartitioner( "org.eclipse.wst.sse.core.default_structured_text_partitioning", //$NON-NLS-1$ partitioner); } else { newDoc.setDocumentPartitioner(partitioner); } partitioner.connect(newDoc); } } return newDoc; } }