1 /******************************************************************************* 2 * Copyright (c) 2005, 2015 IBM Corporation and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * IBM Corporation - initial API and implementation 13 *******************************************************************************/ 14 package org.eclipse.pde.internal.ui.compare; 15 16 import java.util.ArrayList; 17 import java.util.Iterator; 18 import org.eclipse.compare.CompareConfiguration; 19 import org.eclipse.compare.contentmergeviewer.TextMergeViewer; 20 import org.eclipse.jface.resource.JFaceResources; 21 import org.eclipse.jface.text.IDocumentPartitioner; 22 import org.eclipse.jface.text.TextViewer; 23 import org.eclipse.jface.text.rules.FastPartitioner; 24 import org.eclipse.jface.text.source.SourceViewer; 25 import org.eclipse.jface.util.IPropertyChangeListener; 26 import org.eclipse.pde.internal.ui.PDEPlugin; 27 import org.eclipse.pde.internal.ui.PDEUIMessages; 28 import org.eclipse.pde.internal.ui.editor.context.XMLDocumentSetupParticpant; 29 import org.eclipse.pde.internal.ui.editor.text.*; 30 import org.eclipse.swt.SWT; 31 import org.eclipse.swt.events.DisposeEvent; 32 import org.eclipse.swt.graphics.Font; 33 import org.eclipse.swt.widgets.Composite; 34 35 public class PluginContentMergeViewer extends TextMergeViewer { 36 37 private IColorManager fColorManager; 38 private ArrayList<IPropertyChangeListener> fPropertyChangedListeners; 39 PluginContentMergeViewer(Composite parent, CompareConfiguration config)40 public PluginContentMergeViewer(Composite parent, CompareConfiguration config) { 41 super(parent, SWT.LEFT_TO_RIGHT, config); 42 } 43 44 @Override configureTextViewer(final TextViewer textViewer)45 protected void configureTextViewer(final TextViewer textViewer) { 46 if (textViewer instanceof SourceViewer) { 47 if (fColorManager == null) 48 fColorManager = ColorManager.getDefault(); 49 final XMLConfiguration configuration = new XMLConfiguration(fColorManager); 50 textViewer.getControl().addDisposeListener(e -> configuration.dispose()); 51 IPropertyChangeListener propertyChangedListener = event -> { 52 // the configuration will test if the properties affect the presentation also, 53 // but checking it here allows us to prevent the viewer from being invalidated 54 // and saves some unnecessary work 55 if (configuration.affectsColorPresentation(event) || configuration.affectsTextPresentation(event)) { 56 configuration.adaptToPreferenceChange(event); 57 textViewer.invalidateTextPresentation(); 58 } 59 }; 60 PDEPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(propertyChangedListener); 61 62 if (fPropertyChangedListeners == null) 63 fPropertyChangedListeners = new ArrayList<>(3); 64 fPropertyChangedListeners.add(propertyChangedListener); 65 ((SourceViewer) textViewer).configure(configuration); 66 Font font = JFaceResources.getFont(PluginContentMergeViewer.class.getName()); 67 if (font != null) 68 ((SourceViewer) textViewer).getTextWidget().setFont(font); 69 } 70 } 71 72 @Override getDocumentPartitioner()73 protected IDocumentPartitioner getDocumentPartitioner() { 74 return new FastPartitioner(new XMLPartitionScanner(), XMLPartitionScanner.PARTITIONS); 75 } 76 77 @Override getDocumentPartitioning()78 protected String getDocumentPartitioning() { 79 return XMLDocumentSetupParticpant.XML_PARTITIONING; 80 } 81 82 @Override getTitle()83 public String getTitle() { 84 return PDEUIMessages.PluginContentMergeViewer_title; 85 } 86 87 @Override handleDispose(DisposeEvent event)88 protected void handleDispose(DisposeEvent event) { 89 super.handleDispose(event); 90 if (fColorManager != null) 91 fColorManager.dispose(); 92 if (fPropertyChangedListeners != null) { 93 Iterator<IPropertyChangeListener> iter = fPropertyChangedListeners.iterator(); 94 while (iter.hasNext()) 95 PDEPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(iter.next()); 96 fPropertyChangedListeners = null; 97 } 98 } 99 } 100