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